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