-
-
Notifications
You must be signed in to change notification settings - Fork 340
Expand file tree
/
Copy pathClientAuth.tsx
More file actions
78 lines (65 loc) · 1.77 KB
/
ClientAuth.tsx
File metadata and controls
78 lines (65 loc) · 1.77 KB
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
import { ErrorComponent } from '@tanstack/react-router'
import React from 'react'
import { Spinner } from '~/components/Spinner'
import { SignInForm } from '~/routes/login'
import { useCurrentUserQuery } from '~/hooks/useCurrentUser'
import { hasCapability } from '~/db/types'
const baseClasses = 'p-4 flex flex-col items-center justify-center gap-4'
type UserQueryResult = ReturnType<typeof useCurrentUserQuery>
export function ClientAuth({
children,
}: {
children: React.ReactNode | ((userQuery: UserQueryResult) => React.ReactNode)
}) {
const userQuery = useCurrentUserQuery()
if (userQuery.isLoading) {
return (
<div className={baseClasses}>
<Spinner />
</div>
)
}
if (userQuery.isError) {
return (
<div className={baseClasses}>
<ErrorComponent error={userQuery.error} />
</div>
)
}
if (!userQuery.data) {
return (
<div className={baseClasses}>
You are not authorized to access this page.
<SignInForm />
</div>
)
}
return typeof children === 'function' ? children(userQuery) : children
}
export function ClientAdminAuth({ children }: { children: React.ReactNode }) {
const userQuery = useCurrentUserQuery()
if (userQuery.isLoading) {
return (
<div className={baseClasses}>
<Spinner />
</div>
)
}
if (userQuery.isError) {
return (
<div className={baseClasses}>
<ErrorComponent error={userQuery.error} />
</div>
)
}
const capabilities = userQuery.data?.capabilities || []
const canAdmin = hasCapability(capabilities, 'admin')
if (!canAdmin) {
return (
<div className={baseClasses}>
You do not have sufficient permissions to access this page.
</div>
)
}
return <>{children}</>
}