initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# Settings Persistence Pattern (ShopProQuote)
|
||||
|
||||
## Architecture
|
||||
|
||||
Settings live in two places:
|
||||
1. **localStorage** (`spq-settings` key) — always available, even without login
|
||||
2. **PocketBase** `settings` collection — per-user JSON field (`data` field), only when logged in
|
||||
|
||||
## Loading order (Settings.tsx init)
|
||||
|
||||
1. `loadLocalSettings()` → reads localStorage, spreads over DEFAULT_SETTINGS
|
||||
2. If logged in, fetch PB record → spread `{ ...DEFAULT_SETTINGS, ...data }` over the stored `data` JSON field
|
||||
3. `saveLocalSettings(merged)` — overwrites localStorage with PB data so next load uses it
|
||||
|
||||
## Saving
|
||||
|
||||
- `updateSetting(key, value)` — updates local state + immediately writes to localStorage
|
||||
- `saveAllSettings()` — saves to PocketBase (if logged in) + localStorage
|
||||
|
||||
## Type: ShopSettings (src/types.ts)
|
||||
|
||||
```typescript
|
||||
export interface ShopSettings {
|
||||
businessName: string;
|
||||
businessAddress: string;
|
||||
businessPhone: string;
|
||||
serviceAdvisor: string;
|
||||
taxRate: number;
|
||||
taxLabel: string;
|
||||
shopChargeRate: number;
|
||||
shopChargeExplanation: string;
|
||||
headerMessage: string;
|
||||
footerMessage: string;
|
||||
quoteFooterNote: string;
|
||||
|
||||
// PDF & Branding
|
||||
logoUrl?: string;
|
||||
showLogoOnPdf: boolean;
|
||||
quoteExpiryDays: number;
|
||||
quoteNumberPrefix: string;
|
||||
pdfAccentColor: string;
|
||||
|
||||
// Business Ops
|
||||
businessHours?: string;
|
||||
defaultLaborRate: number;
|
||||
paymentTerms: string;
|
||||
}
|
||||
```
|
||||
|
||||
## DEFAULT_SETTINGS lives in two places
|
||||
|
||||
Both MUST stay in sync:
|
||||
- `src/pages/Settings.tsx` (the settings UI uses this)
|
||||
- `src/pages/QuoteGenerator.tsx` (the PDF generator's `loadSettings()` fallback)
|
||||
|
||||
When adding a new setting: add to types.ts → add to both DEFAULT_SETTINGS → add UI field → add to pdf.ts usage.
|
||||
Reference in New Issue
Block a user