Persistance dans le cache du navigateur
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import { Injectable, signal } from '@angular/core';
|
||||
|
||||
const ISSUES_STORAGE_KEY = 'bonsai.issues';
|
||||
|
||||
export type IssueStatus = 'draft' | 'todo' | 'done' | 'in-progress';
|
||||
export type IssuePriority = 'Basse' | 'Moyenne' | 'Haute';
|
||||
|
||||
@@ -15,9 +17,7 @@ export type IssueEntity = {
|
||||
progress: number;
|
||||
};
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class IssuesStore {
|
||||
private readonly data = signal<IssueEntity[]>([
|
||||
const DEFAULT_ISSUES: IssueEntity[] = [
|
||||
{
|
||||
id: 1,
|
||||
assignee: 'Marie',
|
||||
@@ -51,7 +51,18 @@ export class IssuesStore {
|
||||
status: 'done',
|
||||
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();
|
||||
|
||||
@@ -69,13 +80,42 @@ export class IssuesStore {
|
||||
const existingIndex = issues.findIndex((current) => current.id === issue.id);
|
||||
|
||||
if (existingIndex === -1) {
|
||||
return [...issues, issue];
|
||||
const created = [...issues, issue];
|
||||
this.persistToStorage(created);
|
||||
return created;
|
||||
}
|
||||
|
||||
const updated = [...issues];
|
||||
updated[existingIndex] = issue;
|
||||
this.persistToStorage(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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user