Skip to content

Commit b2fdf62

Browse files
committed
Improve role system
1 parent 71ac2f7 commit b2fdf62

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

frontend/src/routes/(root)/(logged)/tutorials/+page.svelte

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,29 @@
2525
import { userStore } from '$lib/stores'
2626
import ToggleButtonGroup from '$lib/components/common/toggleButton-v2/ToggleButtonGroup.svelte'
2727
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'
2929
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+
})
3351
3452
// Debug: Log user role for troubleshooting
3553
$effect(() => {
@@ -38,8 +56,8 @@
3856
console.log('Tutorials page - User role:', {
3957
is_admin: user.is_admin,
4058
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
4361
})
4462
}
4563
})
@@ -50,9 +68,9 @@
5068
*/
5169
function checkAccess(roles?: Role[]): boolean {
5270
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)
5674
}
5775
return hasRoleAccess(user, roles)
5876
}
@@ -268,15 +286,15 @@
268286
<div class="flex items-center gap-2">
269287
<span class="text-xs text-secondary">View as an</span>
270288
<ToggleButtonGroup
271-
bind:selected={roleOverride}
289+
bind:selected={selectedPreviewRole}
272290
onSelected={(v) => {
273-
roleOverride = (v || 'admin') as typeof roleOverride
291+
selectedPreviewRole = (v || userEffectiveRole) as Role
274292
}}
275293
noWFull
276294
>
277295
{#snippet children({ item })}
278296
<ToggleButton
279-
value="admin"
297+
value={userEffectiveRole}
280298
label="Admin (me)"
281299
icon={Shield}
282300
size="sm"

0 commit comments

Comments
 (0)