TZ-002: with no zone stored the API reads its clock in the host's local time, but the panel fell back to Home Assistant's zone and the admin app to the browser's, so dates could disagree near midnight. The API now names the zone it actually uses (api/host_zone.py: the stored zone, else the host's own IANA zone from TZ, /etc/localtime or /etc/timezone) and publishes it as the panel snapshot's `timezone` and the admin settings' read-only `effective_timezone`. Both cards and the admin app format in that one zone; Home Assistant's or the browser's zone applies only when none is published. TZ-003: snapshot_from_api_payload reads `timezone` with a "" default, so an integration upgraded ahead of its API keeps refreshing against the pre-change payload. Task 7e173881-fb99-426f-a2f0-2678439ffc39 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
/**
|
|
* Typed client for the admin household-settings routes
|
|
* (/api/v1/admin/settings).
|
|
*/
|
|
import { apiFetch } from "./client";
|
|
import { readJson } from "./definitions";
|
|
|
|
export interface HouseholdSettings {
|
|
horizon_days: number;
|
|
/** Local wall-clock "HH:MM", as are the other *_time fields. */
|
|
day_rollover_time: string;
|
|
notify_target: string;
|
|
morning_summary_time: string;
|
|
afternoon_reminder_time: string;
|
|
end_of_day_report_time: string;
|
|
morning_summary_enabled: boolean;
|
|
afternoon_reminder_enabled: boolean;
|
|
end_of_day_report_enabled: boolean;
|
|
celebration_enabled: boolean;
|
|
/** IANA zone name (e.g. "America/New_York"); "" means the API host's local time. */
|
|
timezone: string;
|
|
/**
|
|
* Read-only: the zone the API reads its clock in — `timezone`, or the API
|
|
* host's own zone when that is "" ("" only when the host's zone has no name).
|
|
*/
|
|
effective_timezone: string;
|
|
}
|
|
|
|
/** Only the supplied fields are updated; the API answers with all of them. */
|
|
export type SettingsChanges = Partial<Omit<HouseholdSettings, "effective_timezone">>;
|
|
|
|
export const SETTINGS_PATH = "/api/v1/admin/settings";
|
|
|
|
export async function fetchSettings(): Promise<HouseholdSettings> {
|
|
return readJson<HouseholdSettings>(await apiFetch(SETTINGS_PATH));
|
|
}
|
|
|
|
export async function updateSettings(changes: SettingsChanges): Promise<HouseholdSettings> {
|
|
return readJson<HouseholdSettings>(
|
|
await apiFetch(SETTINGS_PATH, {
|
|
method: "PATCH",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(changes),
|
|
}),
|
|
);
|
|
}
|