69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { migrateProjectData, projectSchema, type Project } from '../types/project-model'
|
|
import { logger } from './logger'
|
|
|
|
export const PROJECT_IDS_STORAGE_KEY = 'ltx-project-ids'
|
|
export const PROJECT_STORAGE_KEY_PREFIX = 'ltx-project-'
|
|
|
|
export function getProjectStorageKey(projectId: string): string {
|
|
return `${PROJECT_STORAGE_KEY_PREFIX}${projectId}`
|
|
}
|
|
|
|
export function readProjectIds(): string[] {
|
|
try {
|
|
const stored = localStorage.getItem(PROJECT_IDS_STORAGE_KEY)
|
|
if (!stored) return []
|
|
|
|
const parsed = JSON.parse(stored)
|
|
if (!Array.isArray(parsed)) {
|
|
logger.error('Project ids payload is not an array')
|
|
return []
|
|
}
|
|
|
|
return parsed.filter((projectId): projectId is string => typeof projectId === 'string')
|
|
} catch (error) {
|
|
logger.error(`Failed to read project ids: ${error}`)
|
|
return []
|
|
}
|
|
}
|
|
|
|
export function writeProjectIds(projectIds: string[]): void {
|
|
localStorage.setItem(
|
|
PROJECT_IDS_STORAGE_KEY,
|
|
JSON.stringify(Array.from(new Set(projectIds))),
|
|
)
|
|
}
|
|
|
|
export function readProject(projectId: string): Project | null {
|
|
try {
|
|
const stored = localStorage.getItem(getProjectStorageKey(projectId))
|
|
if (!stored) return null
|
|
|
|
const { project, migrated } = migrateProjectData(JSON.parse(stored))
|
|
const normalizedProject = project.id === projectId
|
|
? project
|
|
: projectSchema.parse({ ...project, id: projectId })
|
|
|
|
if (migrated || normalizedProject.id !== project.id) {
|
|
writeProject(projectId, normalizedProject)
|
|
}
|
|
|
|
return normalizedProject
|
|
} catch (error) {
|
|
logger.error(`Failed to read project ${projectId}: ${error}`)
|
|
return null
|
|
}
|
|
}
|
|
|
|
export function writeProject(projectId: string, project: Project): Project {
|
|
const normalizedProject = projectSchema.parse({ ...project, id: projectId })
|
|
localStorage.setItem(
|
|
getProjectStorageKey(projectId),
|
|
JSON.stringify(normalizedProject),
|
|
)
|
|
return normalizedProject
|
|
}
|
|
|
|
export function deleteProjectEntry(projectId: string): void {
|
|
localStorage.removeItem(getProjectStorageKey(projectId))
|
|
}
|