55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import React from 'react'
|
|
import {AppBskyActorDefs} from '@atproto/api'
|
|
import {useStores} from 'state/index'
|
|
import {FollowState} from 'state/models/cache/my-follows'
|
|
import {logger} from '#/logger'
|
|
|
|
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) {
|
|
logger.error('Failed to delete follow', {error: 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) {
|
|
logger.error('Failed to create follow', {error: e})
|
|
throw e
|
|
}
|
|
}
|
|
|
|
return {
|
|
state: FollowState.Unknown,
|
|
following: false,
|
|
}
|
|
}, [store, profile, state]),
|
|
}
|
|
}
|