|
23 | 23 | import { RefreshCw, CheckCheck, CheckCircle2, Circle, Shield, Code, UserCog } from 'lucide-svelte' |
24 | 24 | import { TUTORIALS_CONFIG, type TabId } from '$lib/tutorials/config' |
25 | 25 | import { userStore } from '$lib/stores' |
26 | | - import type { UserExt } from '$lib/stores' |
27 | 26 | import ToggleButtonGroup from '$lib/components/common/toggleButton-v2/ToggleButtonGroup.svelte' |
28 | 27 | import ToggleButton from '$lib/components/common/toggleButton-v2/ToggleButton.svelte' |
| 28 | + import { hasRoleAccess, hasRoleAccessForPreview, type Role } from '$lib/tutorials/roleUtils' |
29 | 29 |
|
30 | 30 | // Role override for admins to preview what other roles see |
31 | 31 | // Only used when user is admin - defaults to 'admin' (their actual role) |
32 | | - let roleOverride: 'admin' | 'developer' | 'operator' = $state('admin') |
33 | | -
|
34 | | - /** |
35 | | - * Check if a user has access based on a roles array. |
36 | | - */ |
37 | | - function hasRoleAccess( |
38 | | - user: UserExt | null | undefined, |
39 | | - roles?: ('admin' | 'developer' | 'operator')[] |
40 | | - ): boolean { |
41 | | - // No roles specified = available to everyone |
42 | | - if (!roles || roles.length === 0) return true |
43 | | - if (!user) return false |
44 | | -
|
45 | | - // Check if user has any of the required roles |
46 | | - return roles.some((role) => { |
47 | | - if (role === 'admin') return user.is_admin |
48 | | - if (role === 'operator') return user.operator || user.is_admin |
49 | | - if (role === 'developer') return !user.operator || user.is_admin |
50 | | - return false |
51 | | - }) |
52 | | - } |
| 32 | + let roleOverride: Role = $state('admin') |
53 | 33 |
|
54 | 34 | // Debug: Log user role for troubleshooting |
55 | 35 | $effect(() => { |
|
65 | 45 | }) |
66 | 46 |
|
67 | 47 | /** |
68 | | - * Check if a preview role has access based on a roles array. |
69 | | - * Used by admins to preview what other roles can see. |
| 48 | + * Check if the current user (or preview role) has access to a roles array. |
| 49 | + * Handles both normal access and admin preview mode. |
70 | 50 | */ |
71 | | - function hasRoleAccessForPreview( |
72 | | - previewRole: 'admin' | 'developer' | 'operator', |
73 | | - roles?: ('admin' | 'developer' | 'operator')[] |
74 | | - ): boolean { |
75 | | - // No roles specified = available to everyone |
76 | | - if (!roles || roles.length === 0) return true |
77 | | -
|
78 | | - // Check if preview role has any of the required roles |
79 | | - return roles.some((role) => { |
80 | | - if (role === 'admin') return previewRole === 'admin' |
81 | | - if (role === 'operator') return previewRole === 'operator' || previewRole === 'admin' |
82 | | - if (role === 'developer') return previewRole === 'developer' || previewRole === 'admin' |
83 | | - return false |
84 | | - }) |
| 51 | + function checkAccess(roles?: Role[]): boolean { |
| 52 | + const user = $userStore |
| 53 | + // Use preview function if admin has selected a role override |
| 54 | + if (user?.is_admin && roleOverride !== 'admin') { |
| 55 | + return hasRoleAccessForPreview(roleOverride, roles) |
| 56 | + } |
| 57 | + return hasRoleAccess(user, roles) |
85 | 58 | } |
86 | 59 |
|
87 | 60 | // Get active tabs only (filtered by active and roles) |
88 | 61 | const activeTabs = $derived.by(() => { |
89 | | - const user = $userStore |
90 | 62 | return Object.entries(TUTORIALS_CONFIG).filter(([, config]) => { |
91 | 63 | // Filter by active |
92 | 64 | if (config.active === false) return false |
93 | | - // Filter by roles - use preview function if admin has selected a role override |
94 | | - if (user?.is_admin && roleOverride !== 'admin') { |
95 | | - return hasRoleAccessForPreview(roleOverride, config.roles) |
96 | | - } |
97 | | - return hasRoleAccess(user, config.roles) |
| 65 | + // Filter by roles |
| 66 | + return checkAccess(config.roles) |
98 | 67 | }) as [TabId, typeof TUTORIALS_CONFIG[TabId]][] |
99 | 68 | }) |
100 | 69 |
|
|
119 | 88 | const visibleTutorials = $derived( |
120 | 89 | currentTabConfig.tutorials.filter((tutorial) => { |
121 | 90 | if (tutorial.active === false) return false |
122 | | - // Use preview function if admin has selected a role override |
123 | | - if ($userStore?.is_admin && roleOverride !== 'admin') { |
124 | | - return hasRoleAccessForPreview(roleOverride, tutorial.roles) |
125 | | - } |
126 | | - return hasRoleAccess($userStore, tutorial.roles) |
| 91 | + return checkAccess(tutorial.roles) |
127 | 92 | }) |
128 | 93 | ) |
129 | 94 |
|
|
238 | 203 | // Calculate progress for each tab |
239 | 204 | function getTabProgress(tabId: TabId) { |
240 | 205 | const tabConfig = TUTORIALS_CONFIG[tabId] |
241 | | - const user = $userStore |
242 | 206 | |
243 | 207 | // Get all tutorial indexes for this tab (filtered by role) |
244 | 208 | const indexes: number[] = [] |
245 | 209 | for (const tutorial of tabConfig.tutorials) { |
246 | 210 | if (tutorial.active === false || tutorial.index === undefined) continue |
247 | | - // Use preview function if admin has selected a role override |
248 | | - if (user?.is_admin && roleOverride !== 'admin') { |
249 | | - if (!hasRoleAccessForPreview(roleOverride, tutorial.roles)) continue |
250 | | - } else { |
251 | | - if (!hasRoleAccess(user, tutorial.roles)) continue |
252 | | - } |
| 211 | + if (!checkAccess(tutorial.roles)) continue |
253 | 212 | indexes.push(tutorial.index) |
254 | 213 | } |
255 | 214 | |
|
0 commit comments