forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {useMemo} from 'react'
2
3import {usePreferencesQuery} from '#/state/queries/preferences'
4import {useCurrentAccountProfile} from '#/state/queries/useCurrentAccountProfile'
5import {useSession} from '#/state/session'
6import type * as bsky from '#/types/bsky'
7
8export type FullVerificationState = {
9 profile: {
10 role: 'default' | 'verifier'
11 isVerified: boolean
12 wasVerified: boolean
13 isViewer: boolean
14 showBadge: boolean
15 }
16 viewer:
17 | {
18 role: 'default'
19 isVerified: boolean
20 }
21 | {
22 role: 'verifier'
23 isVerified: boolean
24 hasIssuedVerification: boolean
25 }
26}
27
28export function useFullVerificationState({
29 profile,
30}: {
31 profile: bsky.profile.AnyProfileView
32}): FullVerificationState {
33 const {currentAccount} = useSession()
34 const currentAccountProfile = useCurrentAccountProfile()
35 const profileState = useSimpleVerificationState({profile})
36 const viewerState = useSimpleVerificationState({
37 profile: currentAccountProfile,
38 })
39
40 return useMemo(() => {
41 const verifications = profile.verification?.verifications || []
42 const wasVerified =
43 profileState.role === 'default' &&
44 !profileState.isVerified &&
45 verifications.length > 0
46 const hasIssuedVerification = Boolean(
47 viewerState &&
48 viewerState.role === 'verifier' &&
49 profileState.role === 'default' &&
50 verifications.find(v => v.issuer === currentAccount?.did),
51 )
52
53 return {
54 profile: {
55 ...profileState,
56 wasVerified,
57 isViewer: profile.did === currentAccount?.did,
58 showBadge: profileState.showBadge,
59 },
60 viewer:
61 viewerState.role === 'verifier'
62 ? {
63 role: 'verifier',
64 isVerified: viewerState.isVerified,
65 hasIssuedVerification,
66 }
67 : {
68 role: 'default',
69 isVerified: viewerState.isVerified,
70 },
71 }
72 }, [profile, currentAccount, profileState, viewerState])
73}
74
75export type SimpleVerificationState = {
76 role: 'default' | 'verifier'
77 isVerified: boolean
78 showBadge: boolean
79}
80
81export function useSimpleVerificationState({
82 profile,
83}: {
84 profile?: bsky.profile.AnyProfileView
85}): SimpleVerificationState {
86 const preferences = usePreferencesQuery()
87 const prefs = useMemo(
88 () => preferences.data?.verificationPrefs || {hideBadges: false},
89 [preferences.data?.verificationPrefs],
90 )
91 return useMemo(() => {
92 if (!profile || !profile.verification) {
93 return {
94 role: 'default',
95 isVerified: false,
96 showBadge: false,
97 }
98 }
99
100 const {verifiedStatus, trustedVerifierStatus} = profile.verification
101 const isVerifiedUser = ['valid', 'invalid'].includes(verifiedStatus)
102 const isVerifierUser = ['valid', 'invalid'].includes(trustedVerifierStatus)
103 const isVerified =
104 (isVerifiedUser && verifiedStatus === 'valid') ||
105 (isVerifierUser && trustedVerifierStatus === 'valid')
106
107 return {
108 role: isVerifierUser ? 'verifier' : 'default',
109 isVerified,
110 showBadge: prefs.hideBadges ? false : isVerified,
111 }
112 }, [profile, prefs])
113}