feat(calendar): provider-aware settings and connect UI shell (#1395) - #1425
Draft
h4yfans wants to merge 1 commit into
Draft
feat(calendar): provider-aware settings and connect UI shell (#1395)#1425h4yfans wants to merge 1 commit into
h4yfans wants to merge 1 commit into
Conversation
|
React Doctor found 1 new issue in 1 file · 1 warning · score 84 / 100 (Needs work) · 1 fixed · vs 1 warning
Reviewed by React Doctor for commit |
h4yfans
force-pushed
the
h4yfans/calendar-provider-credentials-settings
branch
from
August 13, 2026 16:17
e5aeaf5 to
f7aeaa4
Compare
h4yfans
force-pushed
the
h4yfans/calendar-provider-ui-shell
branch
from
August 13, 2026 16:17
da8a305 to
2c46af1
Compare
h4yfans
force-pushed
the
h4yfans/calendar-provider-credentials-settings
branch
from
August 13, 2026 16:19
f7aeaa4 to
57ac489
Compare
h4yfans
force-pushed
the
h4yfans/calendar-provider-ui-shell
branch
from
August 13, 2026 16:19
2c46af1 to
b03870c
Compare
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
The Integrations page hardcoded its own calendar list, special-cased
`integration.id === 'google-calendar'`, and rendered a row whose every
affordance assumed Google's capabilities.
- Calendar providers now come from `calendar:list-providers`. Main is the only
place that knows which providers this build ships and what each can do, so
the static `integration-registry.ts` stops listing Google entirely.
- `GoogleCalendarIntegrationRow` becomes `CalendarProviderRow`, driven by
`provider.capabilities`:
- `!supportsWrite` hides the "push events to provider" toggle — the engine
refuses that write, so offering it would be a lie
- `!supportsMultiAccount` drops the account list and "Add account", keeping a
single connection with a working disconnect
- `!supportsPush` states the poll interval instead of claiming real-time sync
- Query keys are `['calendar', providerId, …]` throughout, so two providers can
never share a cache slot. Same for `useProviderCalendars`.
- `google-calendar-connect-dialog.tsx` becomes
`calendar-provider-connect-dialog.tsx`, taking `providerId` + `authFlow`.
`oauth2` is the existing loopback flow; `basic` and `url` are filled in by
the CalDAV and ICS UI issues. The Google-named module stays as a re-export so
the toolbar pill and the agent tray keep their import paths.
- A provider id this renderer does not recognise renders a labelled row rather
than a blank one — that is what an older UI sees when main ships a provider
first.
- i18n: `integrations.googleCalendar.*` is renamed to
`integrations.calendarProvider.*` across all 32 locales, translations
preserved; provider names and descriptions come from
`integrations.registry.*`, which gains ICS, CalDAV, Outlook and unknown
entries. Strings that named Google now interpolate `{provider}`.
Two visible label changes: "Reconnect Google" is now "Reconnect" (the row
header already names the provider), and the calendar row carries a one-line
cadence note. Everything else in the Google row is unchanged.
h4yfans
force-pushed
the
h4yfans/calendar-provider-credentials-settings
branch
from
August 13, 2026 16:45
57ac489 to
ccd6a4b
Compare
h4yfans
force-pushed
the
h4yfans/calendar-provider-ui-shell
branch
from
August 13, 2026 16:45
b03870c to
fc57c6f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1395. Phase 0 of the multi-provider calendar epic #1390.
What
The Integrations page kept its own hardcoded calendar list, special-cased
integration.id === 'google-calendar', and rendered a row whose every affordance assumed Google's capabilities.Providers come from main.
calendar:list-providersfeeds the list; the staticintegration-registry.tsstops listing Google altogether, because a second entry there would render a capability-blind duplicate next to the live row.GoogleCalendarIntegrationRow→CalendarProviderRow, driven byprovider.capabilities:!supportsWrite!supportsMultiAccount!supportsPushQuery keys are
['calendar', providerId, …]throughout — status, sources, settings and the calendar list — so two providers can never share a cache slot.useGoogleCalendarsbecomes a Google-bound view ofuseProviderCalendars.Connect dialog.
google-calendar-connect-dialog.tsx→calendar-provider-connect-dialog.tsx, takingproviderIdandauthFlow.oauth2is the existing loopback flow;basic(server URL + username + app password) is filled in by the CalDAV UI issue andurl(an ICS feed) by the ICS UI issue. The Google-named module stays as a re-export so the calendar toolbar pill and the agent composer's connected-tools tray keep their import paths.Unknown providers render. A provider id this renderer has never heard of gets a labelled row, not a blank one — that is exactly what an older UI sees when main ships a provider ahead of it.
i18n
integrations.googleCalendar.*is renamed tointegrations.calendarProvider.*across all 32 locales with every existing translation preserved (pushToGoogle→pushEventsinside it). Provider names and descriptions now come fromintegrations.registry.*, which gains ICS Subscription, CalDAV, Outlook / Microsoft 365 and an unknown-provider fallback. English strings that named Google interpolate{provider}.New markup uses logical Tailwind classes (
ms-*,end-*) per the RTL rule, and user-facing errors go throughextractErrorMessage.Two visible label changes
Called out because the acceptance criterion is "the Google row behaves identically from the user's point of view":
Behaviour — connect, reconnect, refresh, per-account disconnect, calendar selection, retry, both toggles, onboarding — is unchanged.
Verification
pnpm --filter @memry/desktop typecheck— greenpnpm --filter @memry/desktop i18n:check—ok: i18n check passedrendererproject — 609 files, 6973 passed / 6 skippedcalendar-provider-row.test.tsx(renamed fromgoogle-calendar-integration-row.test.tsx) keeps all 17 original tests and adds 7 capability-driven ones: the push toggle is hidden for a read-only provider but the agent-access gate stays; a write-capable provider still gets the toggle; a single-connection provider has no "Add account" but does have a disconnect; a poll-only provider advertises "every 5 minutes" plus the read-only notice while a push-capable one says "as they happen"; one row per provider main reports; and an unrecognised provider id renders a labelled row.That file was in the
tsconfig.test.web.jsonexclude backlog. Renaming it took it out of the list, so its pre-existing type errors were fixed rather than re-excluded — the backlog shrank by one and did not grow.Two other test files had their
window.api.calendarmocks repointed tolistProviderCalendars/retryCalendarSourceSync; assertions unchanged.Docs
MEMRY_DOCS_IMPACT_SKIP=1on push: Google remains the only provider, so nothing a user can reach changes except the two labels above. The user-facing multi-provider docs land with the first provider that actually ships (#1398).