aboutsummaryrefslogtreecommitdiff
path: root/packages/hooks/use-org-onboarding.ts
blob: e71eab8fadc852d3dccd7fb2e3dad344ce629924 (plain) (blame)
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,
	}
}