diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-10-05 16:44:05 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-05 16:44:05 -0700 |
commit | bd7db8af26bfbf94a80972671ca714a143bee28e (patch) | |
tree | cf022bddc4f6b164bea51aeb3c57479d72b73355 /src/lib/hooks/useFollowProfile.ts | |
parent | 19f8389fc777c7ff41466748f1238f4e0a4b0619 (diff) | |
download | voidsky-bd7db8af26bfbf94a80972671ca714a143bee28e.tar.zst |
Improve typeahead search with inclusion of followed users (temporary solution) (#1612)
* Update follows cache to maintain some user info * Prioritize follows in composer autocomplete * Clean up logic and add new autocomplete to search * Update follow hook
Diffstat (limited to 'src/lib/hooks/useFollowProfile.ts')
-rw-r--r-- | src/lib/hooks/useFollowProfile.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/lib/hooks/useFollowProfile.ts b/src/lib/hooks/useFollowProfile.ts new file mode 100644 index 000000000..6220daba8 --- /dev/null +++ b/src/lib/hooks/useFollowProfile.ts @@ -0,0 +1,54 @@ +import React from 'react' +import {AppBskyActorDefs} from '@atproto/api' +import {useStores} from 'state/index' +import {FollowState} from 'state/models/cache/my-follows' + +export function useFollowProfile(profile: AppBskyActorDefs.ProfileViewBasic) { + const store = useStores() + const state = store.me.follows.getFollowState(profile.did) + + return { + state, + following: state === FollowState.Following, + toggle: React.useCallback(async () => { + if (state === FollowState.Following) { + try { + await store.agent.deleteFollow( + store.me.follows.getFollowUri(profile.did), + ) + store.me.follows.removeFollow(profile.did) + return { + state: FollowState.NotFollowing, + following: false, + } + } catch (e: any) { + store.log.error('Failed to delete follow', e) + throw e + } + } else if (state === FollowState.NotFollowing) { + try { + const res = await store.agent.follow(profile.did) + store.me.follows.addFollow(profile.did, { + followRecordUri: res.uri, + did: profile.did, + handle: profile.handle, + displayName: profile.displayName, + avatar: profile.avatar, + }) + return { + state: FollowState.Following, + following: true, + } + } catch (e: any) { + store.log.error('Failed to create follow', e) + throw e + } + } + + return { + state: FollowState.Unknown, + following: false, + } + }, [store, profile, state]), + } +} |