Include follow-based suggestions in interstitial (#4889)

zio/stable
dan 2024-08-08 15:49:34 +01:00 committed by GitHub
parent f1031d100b
commit 2174feed44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 2 deletions

View File

@ -133,16 +133,26 @@ function useExperimentalSuggestedUsersQuery() {
const {currentAccount} = useSession() const {currentAccount} = useSession()
const userActionSnapshot = userActionHistory.useActionHistorySnapshot() const userActionSnapshot = userActionHistory.useActionHistorySnapshot()
const dids = React.useMemo(() => { const dids = React.useMemo(() => {
const {likes, follows, seen} = userActionSnapshot const {likes, follows, followSuggestions, seen} = userActionSnapshot
const likeDids = likes const likeDids = likes
.map(l => new AtUri(l)) .map(l => new AtUri(l))
.map(uri => uri.host) .map(uri => uri.host)
.filter(did => !follows.includes(did)) .filter(did => !follows.includes(did))
let suggestedDids: string[] = []
if (followSuggestions.length > 0) {
suggestedDids = [
// It's ok if these will pick the same item (weighed by its frequency)
followSuggestions[Math.floor(Math.random() * followSuggestions.length)],
followSuggestions[Math.floor(Math.random() * followSuggestions.length)],
followSuggestions[Math.floor(Math.random() * followSuggestions.length)],
followSuggestions[Math.floor(Math.random() * followSuggestions.length)],
]
}
const seenDids = seen const seenDids = seen
.sort(sortSeenPosts) .sort(sortSeenPosts)
.map(l => new AtUri(l.uri)) .map(l => new AtUri(l.uri))
.map(uri => uri.host) .map(uri => uri.host)
return [...new Set([...likeDids, ...seenDids])].filter( return [...new Set([...suggestedDids, ...likeDids, ...seenDids])].filter(
did => did !== currentAccount?.did, did => did !== currentAccount?.did,
) )
}, [userActionSnapshot, currentAccount]) }, [userActionSnapshot, currentAccount])

View File

@ -222,6 +222,7 @@ export function useProfileFollowMutationQueue(
logContext: LogEvents['profile:follow']['logContext'] & logContext: LogEvents['profile:follow']['logContext'] &
LogEvents['profile:unfollow']['logContext'], LogEvents['profile:unfollow']['logContext'],
) { ) {
const agent = useAgent()
const queryClient = useQueryClient() const queryClient = useQueryClient()
const did = profile.did const did = profile.did
const initialFollowingUri = profile.viewer?.following const initialFollowingUri = profile.viewer?.following
@ -253,6 +254,20 @@ export function useProfileFollowMutationQueue(
updateProfileShadow(queryClient, did, { updateProfileShadow(queryClient, did, {
followingUri: finalFollowingUri, followingUri: finalFollowingUri,
}) })
if (finalFollowingUri) {
agent.app.bsky.graph
.getSuggestedFollowsByActor({
actor: did,
})
.then(res => {
const dids = res.data.suggestions
.filter(a => !a.viewer?.following)
.map(a => a.did)
.slice(0, 8)
userActionHistory.followSuggestion(dids)
})
}
}, },
}) })

View File

@ -2,6 +2,7 @@ import React from 'react'
const LIKE_WINDOW = 100 const LIKE_WINDOW = 100
const FOLLOW_WINDOW = 100 const FOLLOW_WINDOW = 100
const FOLLOW_SUGGESTION_WINDOW = 100
const SEEN_WINDOW = 100 const SEEN_WINDOW = 100
export type SeenPost = { export type SeenPost = {
@ -22,6 +23,10 @@ export type UserActionHistory = {
* The last 100 DIDs the user has followed * The last 100 DIDs the user has followed
*/ */
follows: string[] follows: string[]
/*
* The last 100 DIDs of suggested follows based on last follows
*/
followSuggestions: string[]
/** /**
* The last 100 post URIs the user has seen from the Discover feed only * The last 100 post URIs the user has seen from the Discover feed only
*/ */
@ -31,6 +36,7 @@ export type UserActionHistory = {
const userActionHistory: UserActionHistory = { const userActionHistory: UserActionHistory = {
likes: [], likes: [],
follows: [], follows: [],
followSuggestions: [],
seen: [], seen: [],
} }
@ -58,6 +64,13 @@ export function follow(dids: string[]) {
.concat(dids) .concat(dids)
.slice(-FOLLOW_WINDOW) .slice(-FOLLOW_WINDOW)
} }
export function followSuggestion(dids: string[]) {
userActionHistory.followSuggestions = userActionHistory.followSuggestions
.concat(dids)
.slice(-FOLLOW_SUGGESTION_WINDOW)
}
export function unfollow(dids: string[]) { export function unfollow(dids: string[]) {
userActionHistory.follows = userActionHistory.follows.filter( userActionHistory.follows = userActionHistory.follows.filter(
uri => !dids.includes(uri), uri => !dids.includes(uri),