Refactor app state management: replace globalStore.isStudent with isOrgStudent across multiple components for improved clarity and consistency. Update related logic to utilize isSelfPacedLikeCourse for self-paced course checks.

This commit is contained in:
Rotimi Best
2026-04-12 18:07:33 +01:00
parent 31cc45a277
commit 8ea0ab0a76
16 changed files with 57 additions and 64 deletions
@@ -13,7 +13,7 @@
import { Button } from '@cio/ui/base/button';
import { Chip } from '@cio/ui/custom/chip';
import { lessonApi, exerciseApi, courseApi, contentApi } from '$features/course/api';
import { globalStore } from '$lib/utils/store/app';
import { isOrgStudent } from '$lib/utils/store/app';
import formatDate from '$lib/utils/functions/formatDate';
import { t } from '$lib/utils/functions/translations';
import type { CourseContentItem } from '$features/course/utils/types';
@@ -25,6 +25,7 @@
import ContentRow from './content-row.svelte';
import ContentActions from './content-actions.svelte';
import { deleteContent, saveContent, toggleLock } from './content-action-helpers';
import { isSelfPacedLikeCourse } from '$features/course/utils/compliance-utils';
const flipDurationMs = 300;
@@ -43,9 +44,9 @@
let courseId = $derived(courseApi.course?.id || '');
const profileId = $derived($profile?.id || '');
const contentData = $derived(getCourseContent(courseApi.course));
const isStudentView = $derived($globalStore.isStudent === true);
const isStudentView = $derived($isOrgStudent === true);
const isLiveCourse = $derived(courseApi.course?.type === 'LIVE_CLASS');
const isSelfPacedCourse = $derived(courseApi.course?.type === 'SELF_PACED');
const isSelfPacedCourse = $derived(isSelfPacedLikeCourse(courseApi.course?.type));
const metaChipClass =
'inline-flex items-center gap-1 rounded-full bg-gray-100 px-2 py-1 text-[10px] text-gray-700 dark:bg-neutral-700 dark:text-gray-200';
@@ -6,7 +6,7 @@
import { CircleCheckIcon } from '$features/ui/icons';
import { Button } from '@cio/ui/base/button';
import * as Tooltip from '@cio/ui/base/tooltip';
import { globalStore } from '$lib/utils/store/app';
import { isOrgStudent } from '$lib/utils/store/app';
import { t } from '$lib/utils/functions/translations';
import { courseApi, lessonApi } from '$features/course/api';
import { getOrderedNavigableContent, getContentRoute } from '$features/course/utils/content';
@@ -64,7 +64,7 @@
const currentLessonItem = $derived(lessonId ? lessonItems.find((l) => l.id === lessonId) : null);
const isLessonLocked = $derived(
$globalStore.isStudent && currentLessonItem && !(currentLessonItem.isUnlocked ?? false)
$isOrgStudent && currentLessonItem && !(currentLessonItem.isUnlocked ?? false)
);
const isMarkCompleteDisabled = $derived(isMarkingComplete || isLessonLocked || isLessonComplete);
@@ -83,7 +83,7 @@
updateCourseContentCompletion(currentLessonId, isComplete);
const allComplete =
$globalStore.isStudent &&
$isOrgStudent &&
isComplete &&
navigableContentItems.length > 0 &&
navigableContentItems.every((item) => item.isComplete);
@@ -14,7 +14,7 @@
import { HoverableItem, AttachmentIcon } from '@cio/ui/custom/moving-icons';
import formatDate from '$lib/utils/functions/formatDate';
import { t } from '$lib/utils/functions/translations';
import { globalStore } from '$lib/utils/store/app';
import { isOrgStudent } from '$lib/utils/store/app';
import { contentApi, courseApi, exerciseApi, lessonApi } from '$features/course/api';
import { snackbar } from '$features/ui/snackbar/store';
import { profile } from '$lib/utils/store/user';
@@ -27,6 +27,7 @@
import ContentActions from './content-actions.svelte';
import SectionHeader from './section-header.svelte';
import { deleteContent, saveContent, toggleLock } from './content-action-helpers';
import { isSelfPacedLikeCourse } from '$features/course/utils/compliance-utils';
type CrudParam = {
sectionId?: string;
@@ -52,9 +53,9 @@
const courseId = $derived(courseApi.course?.id || '');
const profileId = $derived($profile?.id || '');
const contentData = $derived(getCourseContent(courseApi.course));
const isStudentView = $derived($globalStore.isStudent === true);
const isStudentView = $derived($isOrgStudent === true);
const isLiveCourse = $derived(courseApi.course?.type === 'LIVE_CLASS');
const isSelfPacedCourse = $derived(courseApi.course?.type === 'SELF_PACED');
const isSelfPacedCourse = $derived(isSelfPacedLikeCourse(courseApi.course?.type));
const metaChipClass =
'inline-flex items-center gap-1 rounded-full bg-gray-100 px-2 py-1 text-[10px] text-gray-700 dark:bg-neutral-700 dark:text-gray-200';
@@ -7,7 +7,7 @@
import { InputField } from '@cio/ui/custom/input-field';
import * as Page from '@cio/ui/base/page';
import MODES from '$lib/utils/constants/mode';
import { globalStore } from '$lib/utils/store/app';
import { isOrgStudent } from '$lib/utils/store/app';
import { t } from '$lib/utils/functions/translations';
import { RoleBasedSecurity } from '$features/ui';
import DeleteLessonConfirmation from '$features/course/components/lesson/delete-lesson-confirmation.svelte';
@@ -41,7 +41,7 @@
<div class="flex w-full items-center justify-between gap-2">
<div class="min-w-0 flex-1">
{#if mode === MODES.edit && !$globalStore.isStudent}
{#if mode === MODES.edit && !$isOrgStudent}
<RoleBasedSecurity allowedRoles={[1, 2]}>
<InputField
className="max-w-xl"
@@ -55,7 +55,7 @@
{/if}
</div>
{#if mode === MODES.edit && !$globalStore.isStudent}
{#if mode === MODES.edit && !$isOrgStudent}
<RoleBasedSecurity allowedRoles={[1, 2]}>
<div class="flex items-center gap-2">
<IconButton onclick={onToggleLock} aria-label={lockLabel} title={lockLabel}>