Persistance dans le cache du navigateur

This commit is contained in:
Cédric OLIVIER
2026-05-22 18:12:55 +02:00
parent 105cafe17f
commit e51a898686
+45 -5
View File
@@ -1,5 +1,7 @@
import { Injectable, signal } from '@angular/core'; import { Injectable, signal } from '@angular/core';
const ISSUES_STORAGE_KEY = 'bonsai.issues';
export type IssueStatus = 'draft' | 'todo' | 'done' | 'in-progress'; export type IssueStatus = 'draft' | 'todo' | 'done' | 'in-progress';
export type IssuePriority = 'Basse' | 'Moyenne' | 'Haute'; export type IssuePriority = 'Basse' | 'Moyenne' | 'Haute';
@@ -15,9 +17,7 @@ export type IssueEntity = {
progress: number; progress: number;
}; };
@Injectable({ providedIn: 'root' }) const DEFAULT_ISSUES: IssueEntity[] = [
export class IssuesStore {
private readonly data = signal<IssueEntity[]>([
{ {
id: 1, id: 1,
assignee: 'Marie', assignee: 'Marie',
@@ -51,7 +51,18 @@ export class IssuesStore {
status: 'done', status: 'done',
progress: 100, progress: 100,
}, },
]); ];
@Injectable({ providedIn: 'root' })
export class IssuesStore {
private readonly data = signal<IssueEntity[]>(DEFAULT_ISSUES);
constructor() {
const cachedIssues = this.readFromStorage();
if (cachedIssues) {
this.data.set(cachedIssues);
}
}
readonly issues = this.data.asReadonly(); readonly issues = this.data.asReadonly();
@@ -69,13 +80,42 @@ export class IssuesStore {
const existingIndex = issues.findIndex((current) => current.id === issue.id); const existingIndex = issues.findIndex((current) => current.id === issue.id);
if (existingIndex === -1) { if (existingIndex === -1) {
return [...issues, issue]; const created = [...issues, issue];
this.persistToStorage(created);
return created;
} }
const updated = [...issues]; const updated = [...issues];
updated[existingIndex] = issue; updated[existingIndex] = issue;
this.persistToStorage(updated);
return updated; return updated;
}); });
} }
private readFromStorage(): IssueEntity[] | null {
if (typeof window === 'undefined') {
return null;
}
const rawIssues = window.localStorage.getItem(ISSUES_STORAGE_KEY);
if (!rawIssues) {
return null;
}
try {
const parsed = JSON.parse(rawIssues);
return Array.isArray(parsed) ? (parsed as IssueEntity[]) : null;
} catch {
return null;
}
}
private persistToStorage(issues: IssueEntity[]): void {
if (typeof window === 'undefined') {
return;
}
window.localStorage.setItem(ISSUES_STORAGE_KEY, JSON.stringify(issues));
}
} }