Compare commits

..

2 Commits

Author SHA1 Message Date
chyoo 56db72a054 version up 2026-08-13 11:58:26 +09:00
chyoo e07b4fe359 fix default local platform and remote workspace paths 2026-08-13 11:57:25 +09:00
3 changed files with 11 additions and 8 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "lms", "name": "lms",
"version": "1.1.10", "version": "1.1.11",
"description": "Autonomy Studio LMS Electron app", "description": "Autonomy Studio LMS Electron app",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": { "author": {
+8 -2
View File
@@ -3927,6 +3927,7 @@ function LocalPcWorkspaceMockup({
export default function App(): React.JSX.Element { export default function App(): React.JSX.Element {
const restoredStudioSessionRef = useRef<StudioRuntimeSessionState | null>(readStudioRuntimeSessionState()) const restoredStudioSessionRef = useRef<StudioRuntimeSessionState | null>(readStudioRuntimeSessionState())
const previousWeekStateRef = useRef<Record<number, CurriculumWeek['state']>>({}) const previousWeekStateRef = useRef<Record<number, CurriculumWeek['state']>>({})
const curriculumLoadRequestRef = useRef(0)
const controlExpiryHandledRef = useRef<Set<string>>(new Set()) const controlExpiryHandledRef = useRef<Set<string>>(new Set())
const stopRunningWorkspaceModulesRef = useRef<(() => Promise<void>) | null>(null) const stopRunningWorkspaceModulesRef = useRef<(() => Promise<void>) | null>(null)
const getRunningWorkspaceModuleNamesRef = useRef<(() => string[]) | null>(null) const getRunningWorkspaceModuleNamesRef = useRef<(() => string[]) | null>(null)
@@ -4386,10 +4387,12 @@ export default function App(): React.JSX.Element {
const loadCurriculum = useCallback(async (): Promise<void> => { const loadCurriculum = useCallback(async (): Promise<void> => {
if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return
const requestId = ++curriculumLoadRequestRef.current
const curriculumLoadingStartedAt = Date.now() const curriculumLoadingStartedAt = Date.now()
setCurriculumLoading(true) setCurriculumLoading(true)
try { try {
const payload = await fetchCurriculum(fetchWithFreshAuth, selectedCourseId) const payload = await fetchCurriculum(fetchWithFreshAuth, selectedCourseId)
if (requestId !== curriculumLoadRequestRef.current) return
const nextWeeks = payload?.weeks ?? [] const nextWeeks = payload?.weeks ?? []
const serverActiveWeek = payload?.activeWeek ?? null const serverActiveWeek = payload?.activeWeek ?? null
const previousWeekStates = previousWeekStateRef.current const previousWeekStates = previousWeekStateRef.current
@@ -4407,7 +4410,7 @@ export default function App(): React.JSX.Element {
setCompletedCurriculumNotice(newlyCompletedWeek) setCompletedCurriculumNotice(newlyCompletedWeek)
} }
previousWeekStateRef.current = Object.fromEntries(nextWeeks.map((week) => [week.week, week.state])) previousWeekStateRef.current = Object.fromEntries(nextWeeks.map((week) => [week.week, week.state]))
setCourseKey(payload?.course?.id ?? payload?.course?.slug ?? 'default-course') setCourseKey(selectedCourseId)
setStudentGroup(payload?.studentGroup ?? null) setStudentGroup(payload?.studentGroup ?? null)
setCurriculumWeeks(nextWeeks) setCurriculumWeeks(nextWeeks)
setActiveLearningStep(payload?.activeLearningStep ?? null) setActiveLearningStep(payload?.activeLearningStep ?? null)
@@ -4425,6 +4428,7 @@ export default function App(): React.JSX.Element {
}) })
setSelectedWeekState(nextSelectedWeek) setSelectedWeekState(nextSelectedWeek)
} catch { } catch {
if (requestId !== curriculumLoadRequestRef.current) return
setCurriculumWeeks([]) setCurriculumWeeks([])
setCourseKey('default-course') setCourseKey('default-course')
setLearningStats([]) setLearningStats([])
@@ -4432,6 +4436,7 @@ export default function App(): React.JSX.Element {
setStudentGroup(null) setStudentGroup(null)
setSelectedWeekState(null) setSelectedWeekState(null)
} finally { } finally {
if (requestId !== curriculumLoadRequestRef.current) return
const remainingMs = Math.max(0, 500 - (Date.now() - curriculumLoadingStartedAt)) const remainingMs = Math.max(0, 500 - (Date.now() - curriculumLoadingStartedAt))
if (remainingMs) await new Promise<void>((resolve) => window.setTimeout(resolve, remainingMs)) if (remainingMs) await new Promise<void>((resolve) => window.setTimeout(resolve, remainingMs))
setCurriculumLoading(false) setCurriculumLoading(false)
@@ -4813,6 +4818,7 @@ export default function App(): React.JSX.Element {
return return
} }
if (selectedCourseStorageKey) window.localStorage.setItem(selectedCourseStorageKey, courseId) if (selectedCourseStorageKey) window.localStorage.setItem(selectedCourseStorageKey, courseId)
setCourseKey(courseId)
setSelectedCourseId(courseId) setSelectedCourseId(courseId)
setCourseSelectionVisible(false) setCourseSelectionVisible(false)
setLocalPcLayoutOpen(false) setLocalPcLayoutOpen(false)
@@ -5637,7 +5643,7 @@ export default function App(): React.JSX.Element {
{studioEntered && workspaceWeekState && workspacePlatform && ( {studioEntered && workspaceWeekState && workspacePlatform && (
<div className={localPcLayoutOpen ? 'h-full' : 'hidden h-full'}> <div className={localPcLayoutOpen ? 'h-full' : 'hidden h-full'}>
<LocalPcWorkspaceMockup <LocalPcWorkspaceMockup
key={workspacePlatform?.id ?? 'local-pc-workspace'} key={`${workspacePlatform?.id ?? 'local-pc-workspace'}:${courseKey}:${workspaceWeek.week}`}
onClose={() => { onClose={() => {
closeLocalPcWorkspace() closeLocalPcWorkspace()
setOuterView('curriculum') setOuterView('curriculum')
@@ -39,13 +39,10 @@ export function makeTeamWeekWorkspaceRoot(workspaceRoot: string, groupId: string
return `${normalizedRoot}/${suffix}` return `${normalizedRoot}/${suffix}`
} }
export function makePlatformWorkspaceRoot(workspaceRoot: string, studentSlug: string, courseKey: string, weekNumber: number, platformKey: string, teamGroupId?: string | null): string { export function makePlatformWorkspaceRoot(workspaceRoot: string, studentSlug: string, courseKey: string, weekNumber: number, _platformKey: string, teamGroupId?: string | null): string {
const normalizedRoot = (workspaceRoot || defaultStudioSourceSettings.workspaceRoot).replace(/\/+$/, '') const normalizedRoot = (workspaceRoot || defaultStudioSourceSettings.workspaceRoot).replace(/\/+$/, '')
if (teamGroupId) return makeTeamWeekWorkspaceRoot(normalizedRoot, teamGroupId, courseKey, weekNumber) if (teamGroupId) return makeTeamWeekWorkspaceRoot(normalizedRoot, teamGroupId, courseKey, weekNumber)
if (platformKey === 'futuredrive-local-pc') return makeWeekWorkspaceRoot(normalizedRoot, studentSlug, courseKey, weekNumber) return makeWeekWorkspaceRoot(normalizedRoot, studentSlug, courseKey, weekNumber)
const suffix = `${normalizeCoursePathSegment(courseKey)}/week-${weekNumber}`
if (normalizedRoot === suffix || normalizedRoot.endsWith(`/${suffix}`)) return normalizedRoot
return `${normalizedRoot}/${suffix}`
} }
export function normalizeStudioSourceSettings(settings?: Partial<StudioSourceSettings> | null): StudioSourceSettings { export function normalizeStudioSourceSettings(settings?: Partial<StudioSourceSettings> | null): StudioSourceSettings {