This commit is contained in:
1 parent
578aafbf91
commit
b0ba4227ac
5 files changed
+426
-8
No files matched your search
@@ -6,6 +6,60 @@ import dayjs from 'dayjs';
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class UserInputService {
|
||||
private restoreDate(value: unknown): Date {
|
||||
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
||||
const date = new Date(`${value}T00:00:00`);
|
||||
if (dayjs(date).format('YYYY-MM-DD') === value) return date;
|
||||
}
|
||||
throw new Error('Unsupported saved balance date.');
|
||||
}
|
||||
|
||||
private getSavedValues(): VacDay[] | undefined {
|
||||
let stored: string | null = null;
|
||||
try {
|
||||
if (typeof localStorage === 'undefined') return;
|
||||
stored = localStorage.getItem('leaveBalances');
|
||||
if (stored === null) return;
|
||||
const saved: unknown = JSON.parse(stored);
|
||||
if (!Array.isArray(saved)) throw new Error('Saved leave balances must be a list.');
|
||||
return saved.map((value: unknown) => {
|
||||
if (typeof value !== 'object' || value === null)
|
||||
throw new Error('Unsupported saved balance record.');
|
||||
const { id, type, numberOfDays, availableDate, expiryDate } = value as Record<
|
||||
string,
|
||||
unknown
|
||||
>;
|
||||
if (
|
||||
typeof id !== 'string' ||
|
||||
typeof numberOfDays !== 'number' ||
|
||||
!Number.isFinite(numberOfDays) ||
|
||||
(type !== SelectableDayType.CP &&
|
||||
type !== SelectableDayType.RTT &&
|
||||
type !== SelectableDayType.OTHER)
|
||||
)
|
||||
throw new Error('Unsupported saved balance record.');
|
||||
return {
|
||||
id,
|
||||
type,
|
||||
numberOfDays,
|
||||
availableDate:
|
||||
availableDate === undefined ? undefined : this.restoreDate(availableDate),
|
||||
expiryDate: this.restoreDate(expiryDate),
|
||||
};
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn('Failed to restore leave balances from localStorage.', error);
|
||||
if (stored !== null) {
|
||||
try {
|
||||
localStorage.removeItem('leaveBalances');
|
||||
} catch {
|
||||
// Keep the random fallback usable when browser storage is unavailable.
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
private getRandomNumber(): number {
|
||||
return Math.floor(Math.random() * 11) + 10;
|
||||
}
|
||||
@@ -48,7 +102,9 @@ export class UserInputService {
|
||||
};
|
||||
}
|
||||
|
||||
readonly vacationNumberSignal = signal<VacDay[]>(this.getInitialValues());
|
||||
readonly vacationNumberSignal = signal<VacDay[]>(
|
||||
this.getSavedValues() ?? this.getInitialValues(),
|
||||
);
|
||||
readonly remainingVacationDaysSignal = signal<VacDay[]>([]);
|
||||
readonly computeTriggerSignal = signal(0);
|
||||
|
||||
|
||||
Reference in new issue
Block a user