package models import ( "fmt" "time" "github.com/bluesky-social/indigo/atproto/syntax" "tangled.org/core/api/tangled" ) type ReactionKind string const ( Like ReactionKind = "👍" Unlike ReactionKind = "👎" Laugh ReactionKind = "😆" Celebration ReactionKind = "🎉" Confused ReactionKind = "🫤" Heart ReactionKind = "❤️" Rocket ReactionKind = "🚀" Eyes ReactionKind = "👀" ) func (rk ReactionKind) String() string { return string(rk) } var OrderedReactionKinds = []ReactionKind{ Like, Unlike, Laugh, Celebration, Confused, Heart, Rocket, Eyes, } func ParseReactionKind(raw string) (ReactionKind, bool) { k, ok := (map[string]ReactionKind{ "👍": Like, "👎": Unlike, "😆": Laugh, "🎉": Celebration, "🫤": Confused, "❤️": Heart, "🚀": Rocket, "👀": Eyes, })[raw] return k, ok } type Reaction struct { ReactedByDid string ThreadAt syntax.ATURI Created time.Time Rkey string Kind ReactionKind } func (r *Reaction) AsRecord() tangled.FeedReaction { return tangled.FeedReaction{ Subject: r.ThreadAt.String(), Reaction: r.Kind.String(), CreatedAt: r.Created.Format(time.RFC3339), } } func ReactionFromRecord(did syntax.DID, rkey syntax.RecordKey, record tangled.FeedReaction) (Reaction, error) { subjectAt, err := syntax.ParseATURI(record.Subject) if err != nil { return Reaction{}, fmt.Errorf("subject should be valid at-uri: %w", err) } kind, ok := ParseReactionKind(record.Reaction) if !ok { return Reaction{}, fmt.Errorf("invalid reaction kind '%s'", record.Reaction) } created, err := time.Parse(time.RFC3339, record.CreatedAt) if err != nil { return Reaction{}, fmt.Errorf("invalid time format '%s'", record.CreatedAt) } return Reaction{ ReactedByDid: did.String(), Rkey: rkey.String(), ThreadAt: subjectAt, Kind: kind, Created: created, }, nil } type ReactionDisplayData struct { Count int Users []string }