Calendar v2 - Combined Calendar Feature
This commit is contained in:
@@ -2,22 +2,98 @@
|
||||
|
||||
require_once __DIR__ . '/db.php';
|
||||
|
||||
function defaultFamilySettings(): array {
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
function familyHubUsTimezoneIdentifiers(): array {
|
||||
$ids = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, 'US');
|
||||
if (is_array($ids) && $ids !== []) {
|
||||
sort($ids);
|
||||
return array_values($ids);
|
||||
}
|
||||
return [
|
||||
'Pacific/Honolulu',
|
||||
'America/Anchorage',
|
||||
'America/Los_Angeles',
|
||||
'America/Phoenix',
|
||||
'America/Denver',
|
||||
'America/Chicago',
|
||||
'America/New_York',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
function familySettingsDefaultsRaw(): array {
|
||||
return [
|
||||
'currency_symbol' => '★',
|
||||
'currency_name' => 'Stars',
|
||||
'currency_permanence' => 'permanent',
|
||||
'timezone' => 'UTC',
|
||||
'timezone' => 'America/New_York',
|
||||
'week_starts_on' => 0,
|
||||
'calendar_two_way_google' => false,
|
||||
'calendar_bill_days' => [],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $raw
|
||||
* @return list<array{dayOfMonth: int, title: string}>
|
||||
*/
|
||||
function normalizeCalendarBillDaysRaw($raw): array {
|
||||
if (!is_array($raw)) {
|
||||
return [];
|
||||
}
|
||||
$out = [];
|
||||
foreach ($raw as $row) {
|
||||
if (!is_array($row)) {
|
||||
continue;
|
||||
}
|
||||
$d = isset($row['dayOfMonth']) ? (int) $row['dayOfMonth'] : 0;
|
||||
$title = trim((string) ($row['title'] ?? ''));
|
||||
if ($d < 1 || $d > 31 || $title === '') {
|
||||
continue;
|
||||
}
|
||||
$out[] = ['dayOfMonth' => $d, 'title' => $title];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
function normalizeTimezoneToUs(string $tz, array $allowed): string {
|
||||
$tz = trim($tz);
|
||||
if ($tz !== '' && in_array($tz, $allowed, true)) {
|
||||
return $tz;
|
||||
}
|
||||
return 'America/New_York';
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply defaults and normalize timezone / calendar fields after merge with stored JSON.
|
||||
*
|
||||
* @param array<string, mixed> $s
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
function normalizeLoadedFamilySettings(array $s): array {
|
||||
$allowed = familyHubUsTimezoneIdentifiers();
|
||||
$s['timezone'] = normalizeTimezoneToUs((string) ($s['timezone'] ?? ''), $allowed);
|
||||
$v = $s['calendar_two_way_google'] ?? false;
|
||||
$s['calendar_two_way_google'] = $v === true || $v === 1 || $v === '1' || $v === 'true';
|
||||
$s['calendar_bill_days'] = normalizeCalendarBillDaysRaw($s['calendar_bill_days'] ?? []);
|
||||
return $s;
|
||||
}
|
||||
|
||||
function defaultFamilySettings(): array {
|
||||
return normalizeLoadedFamilySettings(familySettingsDefaultsRaw());
|
||||
}
|
||||
|
||||
function loadFamilySettings(): array {
|
||||
$raw = readJsonFile('family_settings.json');
|
||||
if (!is_array($raw)) {
|
||||
return defaultFamilySettings();
|
||||
$merged = familySettingsDefaultsRaw();
|
||||
if (is_array($raw)) {
|
||||
$merged = array_merge($merged, $raw);
|
||||
}
|
||||
return array_merge(defaultFamilySettings(), $raw);
|
||||
return normalizeLoadedFamilySettings($merged);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user