|
25 | 25 | import { userStore } from '$lib/stores' |
26 | 26 | import ToggleButtonGroup from '$lib/components/common/toggleButton-v2/ToggleButtonGroup.svelte' |
27 | 27 | import ToggleButton from '$lib/components/common/toggleButton-v2/ToggleButton.svelte' |
28 | | - import { hasRoleAccess, hasRoleAccessForPreview, type Role } from '$lib/tutorials/roleUtils' |
| 28 | + import { hasRoleAccess, hasRoleAccessForPreview, getUserEffectiveRole, type Role } from '$lib/tutorials/roleUtils' |
29 | 29 |
|
30 | | - // Role override for admins to preview what other roles see |
31 | | - // Only used when user is admin - defaults to 'admin' (their actual role) |
32 | | - let roleOverride: Role = $state('admin') |
| 30 | + // Get user's effective role (derived from userStore) |
| 31 | + const userEffectiveRole = $derived.by(() => { |
| 32 | + return getUserEffectiveRole($userStore) ?? 'admin' |
| 33 | + }) |
| 34 | + |
| 35 | + // State for the role selector (only used when user is admin) |
| 36 | + // Defaults to user's actual role |
| 37 | + let selectedPreviewRole: Role = $state('admin') |
| 38 | + |
| 39 | + // Initialize selectedPreviewRole to user's role when admin, reset when not admin |
| 40 | + $effect(() => { |
| 41 | + const user = $userStore |
| 42 | + if (user?.is_admin) { |
| 43 | + // Initialize to user's actual role if not already set to a valid role |
| 44 | + // This ensures it's always set to the user's role when they're admin |
| 45 | + selectedPreviewRole = userEffectiveRole |
| 46 | + } else { |
| 47 | + // Reset to 'admin' as default (though this shouldn't matter for non-admins) |
| 48 | + selectedPreviewRole = 'admin' |
| 49 | + } |
| 50 | + }) |
33 | 51 |
|
34 | 52 | // Debug: Log user role for troubleshooting |
35 | 53 | $effect(() => { |
|
38 | 56 | console.log('Tutorials page - User role:', { |
39 | 57 | is_admin: user.is_admin, |
40 | 58 | operator: user.operator, |
41 | | - effectiveRole: user.is_admin ? 'admin' : user.operator ? 'operator' : 'developer', |
42 | | - roleOverride: user.is_admin ? roleOverride : 'N/A (not admin)' |
| 59 | + effectiveRole: userEffectiveRole, |
| 60 | + selectedPreviewRole: selectedPreviewRole |
43 | 61 | }) |
44 | 62 | } |
45 | 63 | }) |
|
50 | 68 | */ |
51 | 69 | function checkAccess(roles?: Role[]): boolean { |
52 | 70 | 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) |
| 71 | + // Use preview function if admin has selected a different role to preview |
| 72 | + if (user?.is_admin && selectedPreviewRole !== userEffectiveRole) { |
| 73 | + return hasRoleAccessForPreview(selectedPreviewRole, roles) |
56 | 74 | } |
57 | 75 | return hasRoleAccess(user, roles) |
58 | 76 | } |
|
268 | 286 | <div class="flex items-center gap-2"> |
269 | 287 | <span class="text-xs text-secondary">View as an</span> |
270 | 288 | <ToggleButtonGroup |
271 | | - bind:selected={roleOverride} |
| 289 | + bind:selected={selectedPreviewRole} |
272 | 290 | onSelected={(v) => { |
273 | | - roleOverride = (v || 'admin') as typeof roleOverride |
| 291 | + selectedPreviewRole = (v || userEffectiveRole) as Role |
274 | 292 | }} |
275 | 293 | noWFull |
276 | 294 | > |
277 | 295 | {#snippet children({ item })} |
278 | 296 | <ToggleButton |
279 | | - value="admin" |
| 297 | + value={userEffectiveRole} |
280 | 298 | label="Admin (me)" |
281 | 299 | icon={Shield} |
282 | 300 | size="sm" |
|
0 commit comments