feat: 完善模块引导与学习进度体验
统一引导提示的持久化控制,补充学习进度入口与模块资源,避免用户返回页面时重复触发提示。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
fc9633f371
commit
6f8252472f
114 files changed
+2758
-1798
No files matched your search
@@ -8,8 +8,13 @@ export const INTERVIEW_KEY = 3
|
||||
interface InterviewSavePayload {
|
||||
viewed?: Record<string, boolean>
|
||||
isGuideInterviewTask?: boolean
|
||||
isGuideInterviewReturn?: boolean
|
||||
isGuideInterviewStage2?: boolean
|
||||
isGuideInterviewStage3?: boolean
|
||||
isInterviewUnlock?: boolean
|
||||
InterviewUnlockProgress?: number
|
||||
interviewMenuVisible?: boolean
|
||||
guideShown?: Record<string, boolean>
|
||||
}
|
||||
|
||||
async function getYibanApi(): Promise<typeof import('@/utils/yiban') | null> {
|
||||
@@ -37,18 +42,32 @@ export const useInterviewStore = defineStore(
|
||||
|
||||
//Interview-任务取景框引导
|
||||
const isGuideInterviewTask = ref<boolean>(true)
|
||||
//Interview-思路提点完成回到首页的一次性引导
|
||||
const isGuideInterviewReturn = ref<boolean>(true)
|
||||
//Interview-中期拍摄阶段菜单一次性引导
|
||||
const isGuideInterviewStage2 = ref<boolean>(true)
|
||||
//Interview-后期剪辑阶段菜单一次性引导
|
||||
const isGuideInterviewStage3 = ref<boolean>(true)
|
||||
//Interview-是否解锁完成前置(观看视频)
|
||||
const isInterviewUnlock = ref<boolean>(false)
|
||||
//Interview-发现与记录解锁进度
|
||||
const InterviewUnlockProgress = ref<number>(0)
|
||||
//Interview-菜单 Overlay 是否可见
|
||||
const interviewMenuVisible = ref<boolean>(false)
|
||||
const guideShown = ref<Record<string, boolean>>({})
|
||||
|
||||
//Actions
|
||||
function saveInterviewStore(): void {
|
||||
const payload: InterviewSavePayload = {
|
||||
viewed: viewed.value,
|
||||
isGuideInterviewTask: isGuideInterviewTask.value,
|
||||
isGuideInterviewReturn: isGuideInterviewReturn.value,
|
||||
isGuideInterviewStage2: isGuideInterviewStage2.value,
|
||||
isGuideInterviewStage3: isGuideInterviewStage3.value,
|
||||
isInterviewUnlock: isInterviewUnlock.value,
|
||||
InterviewUnlockProgress: InterviewUnlockProgress.value
|
||||
InterviewUnlockProgress: InterviewUnlockProgress.value,
|
||||
interviewMenuVisible: interviewMenuVisible.value,
|
||||
guideShown: guideShown.value
|
||||
}
|
||||
|
||||
getYibanApi()
|
||||
@@ -69,8 +88,13 @@ export const useInterviewStore = defineStore(
|
||||
const data = JSON.parse(raw) as InterviewSavePayload
|
||||
viewed.value = data.viewed ?? {}
|
||||
isGuideInterviewTask.value = data.isGuideInterviewTask ?? true
|
||||
isGuideInterviewReturn.value = data.isGuideInterviewReturn ?? true
|
||||
isGuideInterviewStage2.value = data.isGuideInterviewStage2 ?? true
|
||||
isGuideInterviewStage3.value = data.isGuideInterviewStage3 ?? true
|
||||
isInterviewUnlock.value = data.isInterviewUnlock ?? false
|
||||
InterviewUnlockProgress.value = data.InterviewUnlockProgress ?? 0
|
||||
interviewMenuVisible.value = data.interviewMenuVisible ?? false
|
||||
guideShown.value = data.guideShown ?? {}
|
||||
} catch (error) {
|
||||
console.error('Failed to load Interview store', error)
|
||||
}
|
||||
@@ -112,6 +136,21 @@ export const useInterviewStore = defineStore(
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function setIsGuideInterviewReturn(value: boolean): void {
|
||||
isGuideInterviewReturn.value = value
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function setIsGuideInterviewStage2(value: boolean): void {
|
||||
isGuideInterviewStage2.value = value
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function setIsGuideInterviewStage3(value: boolean): void {
|
||||
isGuideInterviewStage3.value = value
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function setIsInterviewUnlock(value: boolean): void {
|
||||
isInterviewUnlock.value = value
|
||||
saveInterviewStore()
|
||||
@@ -123,11 +162,27 @@ export const useInterviewStore = defineStore(
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function setInterviewMenuVisible(value: boolean): void {
|
||||
interviewMenuVisible.value = value
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function markGuideShown(key: string): void {
|
||||
if (!key) return
|
||||
guideShown.value[key] = true
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
function resetInterviewState(): void {
|
||||
viewed.value = {}
|
||||
isGuideInterviewTask.value = true
|
||||
isGuideInterviewReturn.value = true
|
||||
isGuideInterviewStage2.value = true
|
||||
isGuideInterviewStage3.value = true
|
||||
isInterviewUnlock.value = false
|
||||
InterviewUnlockProgress.value = 0
|
||||
interviewMenuVisible.value = false
|
||||
guideShown.value = {}
|
||||
saveInterviewStore()
|
||||
}
|
||||
|
||||
@@ -135,8 +190,13 @@ export const useInterviewStore = defineStore(
|
||||
//State
|
||||
markViewed,
|
||||
setIsGuideInterviewTask,
|
||||
setIsGuideInterviewReturn,
|
||||
setIsGuideInterviewStage2,
|
||||
setIsGuideInterviewStage3,
|
||||
setIsInterviewUnlock,
|
||||
setInterviewUnlockProgress,
|
||||
setInterviewMenuVisible,
|
||||
markGuideShown,
|
||||
resetInterviewState,
|
||||
loadInterviewStore,
|
||||
saveInterviewStore,
|
||||
@@ -145,8 +205,13 @@ export const useInterviewStore = defineStore(
|
||||
progressPercent,
|
||||
viewed,
|
||||
isGuideInterviewTask,
|
||||
isGuideInterviewReturn,
|
||||
isGuideInterviewStage2,
|
||||
isGuideInterviewStage3,
|
||||
isInterviewUnlock,
|
||||
InterviewUnlockProgress
|
||||
InterviewUnlockProgress,
|
||||
interviewMenuVisible,
|
||||
guideShown
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user