Jeff Emmett
69ce497aa8
feat(rschedule): complete native port of schedule-jeffemmett
...
Phases D-H of the rSchedule booking module:
- **Google Calendar sync** (`lib/gcal-sync.ts`): reuses rspace OAuth, syncs busy
times into config doc, creates booking events, deletes on cancel.
- **Admin UI** (`components/folk-schedule-admin.ts`): 6-tab passkey-gated dashboard
(overview, availability rules + overrides, bookings, invitations, gcal, settings).
Timezone-shift banner when browser tz diverges from host tz.
- **Emails** (`lib/emails.ts`, `lib/calendar-links.ts`): confirmation with
Google/Outlook/Yahoo add-to-calendar buttons + .ics attachment; cancellation
with 3 suggested slots from availability engine; 24h reminder.
- **Cron** (`lib/cron.ts`): in-process 5-min reminder sweep + 10-min gcal sweep
per connected space, started from onInit.
- **Invitations + timezone shift** (mod.ts, admin UI): PATCH
/api/invitations/:id accept/decline; POST /api/admin/timezone/shift with
optional booking relabel; invitations tab shows cross-space invites.
Full public booking flow (`components/folk-schedule-booking.ts`): month calendar,
date → slot drill, booking form, confirmation view, timezone picker.
EncryptID passkey gates admin routes via resolveCallerRole ≥ moderator.
Per-entity model: each space (and user-space) hosts its own bookable page;
bookings mirror into invitee spaces' :invitations docs so cross-space visibility
works without cross-space reads.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 18:19:10 -04:00