feat(idaa): add PersistedState store for idaa_loc (not yet wired in)
Creates ae_idaa_stores__idaa_loc.svelte.ts — the Svelte 5 PersistedState replacement for the idaa_loc persisted() store in ae_idaa_stores.ts. Mirrors the exact shape of idaa_local_data_struct with full TypeScript interfaces (IdaaArchivesLoc, IdaaBbLoc, IdaaRecoveryMeetingsLoc, IdaaLocState). Drops __version, name, and title (not runtime state). Same localStorage key (ae_idaa_loc) — existing data loads cleanly. Not wired into consumers yet; pending review before migration. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
149
src/lib/stores/ae_idaa_stores__idaa_loc.svelte.ts
Normal file
149
src/lib/stores/ae_idaa_stores__idaa_loc.svelte.ts
Normal file
@@ -0,0 +1,149 @@
|
||||
import { PersistedState } from 'runed';
|
||||
|
||||
// ---- Types -------------------------------------------------------------------
|
||||
|
||||
interface IdaaArchivesLoc {
|
||||
enabled: string; // 'all' | 'disabled' | 'enabled'
|
||||
hidden: string; // 'all' | 'hidden' | 'not_hidden'
|
||||
limit: number;
|
||||
offset: number;
|
||||
edit_kv: Record<string, any>; // Tracks which archive objects are being edited.
|
||||
edit__archive_obj: any;
|
||||
edit__archive_content_obj: any;
|
||||
}
|
||||
|
||||
interface IdaaBbLoc {
|
||||
enabled: string; // 'all' | 'disabled' | 'enabled'
|
||||
hidden: string; // 'all' | 'hidden' | 'not_hidden'
|
||||
limit: number;
|
||||
offset: number;
|
||||
edit_kv: Record<string, any>; // Tracks which post objects are being edited.
|
||||
edit__post_obj: any;
|
||||
edit__post_comment_obj: any;
|
||||
show_list__post_obj_li: boolean;
|
||||
qry__enabled: string;
|
||||
qry__hidden: string;
|
||||
qry__limit: number;
|
||||
qry__offset: number;
|
||||
qry__order_by: string; // For the IDB index query
|
||||
qry__order_by_li: Record<string, string>; // For the SQL query
|
||||
}
|
||||
|
||||
interface IdaaRecoveryMeetingsLoc {
|
||||
edit_kv: Record<string, any>; // Tracks which meeting objects are being edited.
|
||||
edit__event_obj: any;
|
||||
qry__enabled: string;
|
||||
qry__hidden: string;
|
||||
qry__limit: number;
|
||||
qry__order_by: string; // For the IDB index query; name, updated_on/created_on
|
||||
qry__order_by_li: Record<string, string>; // For the SQL query
|
||||
qry__offset: number;
|
||||
qry__fulltext_str: string | null;
|
||||
qry__physical: string | null;
|
||||
qry__type: string | null;
|
||||
qry__virtual: string | null;
|
||||
// When true, only show meetings the member has starred. Favorites are stored
|
||||
// server-side in event.mod_meetings_json.favorite (array of Novi UUIDs), so
|
||||
// they persist across browsers without requiring a Novi API write capability.
|
||||
qry__favorites_only: boolean;
|
||||
// Collapse the "Meeting Info" data store panel. Persisted so preference survives reloads.
|
||||
ds_info_collapsed: boolean;
|
||||
}
|
||||
|
||||
export interface IdaaLocState {
|
||||
novi_uuid: string | null;
|
||||
novi_email: string | null;
|
||||
novi_full_name: string | null;
|
||||
// True after a successful Novi API verification (UUID confirmed to be a real Novi member).
|
||||
// False on load, on verification failure, or for non-Novi sign-in paths.
|
||||
novi_verified: boolean;
|
||||
// Timestamp (ms since epoch) when the last successful verification occurred.
|
||||
// Used to cache verification results and avoid repeated Novi API calls.
|
||||
novi_verified_ts: number | null;
|
||||
// Populated from $ae_loc.site_cfg_json at IDAA layout mount — not managed here.
|
||||
// See routes/idaa/(idaa)/+layout.svelte for the override logic.
|
||||
novi_admin_li: string[];
|
||||
novi_trusted_li: string[];
|
||||
novi_jitsi_mod_li: string[];
|
||||
|
||||
archives: IdaaArchivesLoc;
|
||||
bb: IdaaBbLoc;
|
||||
recovery_meetings: IdaaRecoveryMeetingsLoc;
|
||||
}
|
||||
|
||||
// ---- Defaults ----------------------------------------------------------------
|
||||
|
||||
export const idaa_loc_defaults: IdaaLocState = {
|
||||
novi_uuid: null,
|
||||
novi_email: null,
|
||||
novi_full_name: null,
|
||||
novi_verified: false,
|
||||
novi_verified_ts: null,
|
||||
novi_admin_li: [],
|
||||
novi_trusted_li: [],
|
||||
novi_jitsi_mod_li: [],
|
||||
|
||||
archives: {
|
||||
enabled: 'enabled',
|
||||
hidden: 'not_hidden',
|
||||
limit: 150,
|
||||
offset: 0,
|
||||
edit_kv: {},
|
||||
edit__archive_obj: null,
|
||||
edit__archive_content_obj: null
|
||||
},
|
||||
|
||||
bb: {
|
||||
enabled: 'enabled',
|
||||
hidden: 'not_hidden',
|
||||
limit: 50,
|
||||
offset: 0,
|
||||
edit_kv: {},
|
||||
edit__post_obj: null,
|
||||
edit__post_comment_obj: null,
|
||||
show_list__post_obj_li: true,
|
||||
qry__enabled: 'enabled',
|
||||
qry__hidden: 'not_hidden',
|
||||
qry__limit: 25,
|
||||
qry__offset: 0,
|
||||
qry__order_by: 'updated_on',
|
||||
qry__order_by_li: { updated_on: 'DESC', created_on: 'DESC' }
|
||||
},
|
||||
|
||||
recovery_meetings: {
|
||||
edit_kv: {},
|
||||
edit__event_obj: null,
|
||||
qry__enabled: 'enabled',
|
||||
qry__hidden: 'not_hidden',
|
||||
qry__limit: 100,
|
||||
qry__order_by: 'updated_on',
|
||||
qry__order_by_li: {
|
||||
priority: 'DESC',
|
||||
sort: 'DESC',
|
||||
updated_on: 'DESC',
|
||||
created_on: 'DESC',
|
||||
name: 'ASC'
|
||||
},
|
||||
qry__offset: 0,
|
||||
qry__fulltext_str: null,
|
||||
qry__physical: null,
|
||||
qry__type: null,
|
||||
qry__virtual: null,
|
||||
qry__favorites_only: false,
|
||||
ds_info_collapsed: false
|
||||
}
|
||||
};
|
||||
|
||||
// ---- Store -------------------------------------------------------------------
|
||||
|
||||
// Note: the top-level spread in deserialize ensures new top-level fields get
|
||||
// their defaults after a browser upgrade. Nested objects (archives, bb,
|
||||
// recovery_meetings) are replaced wholesale from localStorage — if a new field
|
||||
// is added to a nested object, it will not auto-populate until the user clears
|
||||
// their storage. This is the same trade-off as the events sub-stores.
|
||||
export const idaa_loc = new PersistedState('ae_idaa_loc', idaa_loc_defaults, {
|
||||
serializer: {
|
||||
serialize: JSON.stringify,
|
||||
deserialize: (raw: string) => ({ ...idaa_loc_defaults, ...JSON.parse(raw) })
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user