forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import React from 'react'
2
3const LIKE_WINDOW = 100
4const FOLLOW_WINDOW = 100
5const FOLLOW_SUGGESTION_WINDOW = 100
6const SEEN_WINDOW = 100
7
8export type SeenPost = {
9 uri: string
10 likeCount: number
11 repostCount: number
12 replyCount: number
13 isFollowedBy: boolean
14 feedContext: string | undefined
15}
16
17export type UserActionHistory = {
18 /**
19 * The last 100 post URIs the user has liked
20 */
21 likes: string[]
22 /**
23 * The last 100 DIDs the user has followed
24 */
25 follows: string[]
26 /*
27 * The last 100 DIDs of suggested follows based on last follows
28 */
29 followSuggestions: string[]
30 /**
31 * The last 100 post URIs the user has seen from the Discover feed only
32 */
33 seen: SeenPost[]
34}
35
36const userActionHistory: UserActionHistory = {
37 likes: [],
38 follows: [],
39 followSuggestions: [],
40 seen: [],
41}
42
43export function getActionHistory() {
44 return userActionHistory
45}
46
47export function useActionHistorySnapshot() {
48 return React.useState(() => getActionHistory())[0]
49}
50
51export function like(postUris: string[]) {
52 userActionHistory.likes = userActionHistory.likes
53 .concat(postUris)
54 .slice(-LIKE_WINDOW)
55}
56export function unlike(postUris: string[]) {
57 userActionHistory.likes = userActionHistory.likes.filter(
58 uri => !postUris.includes(uri),
59 )
60}
61
62export function follow(dids: string[]) {
63 userActionHistory.follows = userActionHistory.follows
64 .concat(dids)
65 .slice(-FOLLOW_WINDOW)
66}
67
68export function followSuggestion(dids: string[]) {
69 userActionHistory.followSuggestions = userActionHistory.followSuggestions
70 .concat(dids)
71 .slice(-FOLLOW_SUGGESTION_WINDOW)
72}
73
74export function unfollow(dids: string[]) {
75 userActionHistory.follows = userActionHistory.follows.filter(
76 uri => !dids.includes(uri),
77 )
78}
79
80export function seen(posts: SeenPost[]) {
81 userActionHistory.seen = userActionHistory.seen
82 .concat(posts)
83 .slice(-SEEN_WINDOW)
84}