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
|
"use client"
import { useCallback, useMemo } from "react"
import { useAuth } from "@lib/auth-context"
import { authClient } from "@lib/auth"
/**
* DB-backed onboarding completion hook for the new app flow.
* Uses consumer org `metadata.isOnboarded` instead of localStorage.
*
* TODO: remove this after the feature flag is removed
* This hook is for the new app flow only (feature-flagged `nova-alpha-access`).
* The old onboarding flow will continue to use `useOnboardingStorage` (localStorage).
*/
export function useOrgOnboarding() {
const { org, updateOrgMetadata } = useAuth()
const isOrgOnboarded = useMemo(() => {
if (!org) return null
return org.metadata?.isOnboarded === true
}, [org])
const markOrgOnboarded = useCallback(() => {
if (!org?.id) {
console.error("No organization context when marking as onboarded")
return
}
// Optimistic update: update in-memory state immediately
updateOrgMetadata({ isOnboarded: true })
authClient.organization
.update({
organizationId: org.id,
data: {
metadata: {
...org.metadata,
isOnboarded: true,
},
},
})
.catch((error) => {
console.error("Failed to mark organization as onboarded:", error)
updateOrgMetadata({ isOnboarded: false })
})
}, [org, updateOrgMetadata])
const resetOrgOnboarded = useCallback(() => {
if (!org?.id) {
console.error("No organization context when resetting onboarding")
return
}
// Optimistic update: update in-memory state immediately
updateOrgMetadata({ isOnboarded: false })
authClient.organization
.update({
organizationId: org.id,
data: {
metadata: {
...org.metadata,
isOnboarded: false,
},
},
})
.catch((error) => {
console.error("Failed to reset organization onboarding:", error)
updateOrgMetadata({ isOnboarded: true })
})
}, [org, updateOrgMetadata])
const shouldShowOnboarding = useCallback(() => {
if (isOrgOnboarded === null) return null // Still loading (org not ready)
return !isOrgOnboarded
}, [isOrgOnboarded])
return {
isOrgOnboarded,
markOrgOnboarded,
resetOrgOnboarded,
shouldShowOnboarding,
isLoading: org === null,
}
}
|