56 lines
2.2 KiB
TypeScript
56 lines
2.2 KiB
TypeScript
import { readSettings, writeSettings } from './settings.js'
|
|
import { markAllToursSeen } from './users.js'
|
|
import { listClients } from './torrent-clients/index.js'
|
|
import { logger } from './logger.js'
|
|
|
|
export const ONBOARDING_STEPS = ['welcome', 'paths', 'client', 'import', 'media-server', 'catalog', 'recap'] as const
|
|
export type OnboardingStep = typeof ONBOARDING_STEPS[number]
|
|
|
|
export interface OnboardingState {
|
|
step : OnboardingStep | null
|
|
completedAt: string | null
|
|
}
|
|
|
|
export function isOnboardingStep(value: unknown): value is OnboardingStep {
|
|
return typeof value === 'string' && (ONBOARDING_STEPS as readonly string[]).includes(value)
|
|
}
|
|
|
|
export function readOnboarding(): OnboardingState {
|
|
const { onboardingStep, onboardingCompletedAt } = readSettings()
|
|
return { step: isOnboardingStep(onboardingStep) ? onboardingStep : null, completedAt: onboardingCompletedAt }
|
|
}
|
|
|
|
// Installation antérieure à l'assistant : déjà configurée → rien n'est imposé
|
|
export function migrateOnboarding(): boolean {
|
|
const settings = readSettings()
|
|
if (settings.onboardingCompletedAt || settings.onboardingStep) return false
|
|
if (!settings.mediaPath && listClients().length === 0) return false
|
|
|
|
const now = new Date().toISOString()
|
|
writeSettings({ onboardingCompletedAt: now })
|
|
markAllToursSeen(now)
|
|
logger.info('onboarding', 'Installation existante détectée — assistant marqué comme terminé')
|
|
return true
|
|
}
|
|
|
|
export function startOnboarding(): void {
|
|
if (readSettings().onboardingCompletedAt) return
|
|
writeSettings({ onboardingStep: 'welcome' })
|
|
}
|
|
|
|
export function advanceOnboarding(step?: OnboardingStep, complete = false): OnboardingState {
|
|
const current = readOnboarding()
|
|
const patch: { onboardingStep?: string; onboardingCompletedAt?: string } = {}
|
|
|
|
if (step && (!current.step || ONBOARDING_STEPS.indexOf(step) > ONBOARDING_STEPS.indexOf(current.step))) {
|
|
patch.onboardingStep = step
|
|
}
|
|
if (complete) {
|
|
patch.onboardingStep = 'recap'
|
|
patch.onboardingCompletedAt = new Date().toISOString()
|
|
logger.info('onboarding', 'Assistant de configuration terminé')
|
|
}
|
|
if (Object.keys(patch).length > 0) writeSettings(patch)
|
|
return readOnboarding()
|
|
}
|