import { useMemo } from 'react'; import { useNavigate, useParams } from 'react-router'; import { Puzzle, KeyRound, Globe, Wrench, CalendarDays } from 'lucide-react'; import type { LayoutNode, PanelComponents } from 'officerdev'; import { WorkspaceLayout } from 'officerdev'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { SettingsRoute, SettingsSidebar, SettingsContent, type SettingsSection } from '../SettingsPanel'; import { GoogleOAuthConfig } from './GoogleOAuthConfig'; // import { GoogleAccount } from './GoogleAccount'; // hidden — email uses IMAP app password now import { BrowserRelay } from './BrowserRelay'; import { ApifyConfig } from './ApifyConfig'; import { DavAppPasswords } from './DavAppPasswords'; import { ApiKeys } from './ApiKeys'; const BASE_PATH = '/settings/integrations'; const enterpriseSections: SettingsSection[] = [ { key: 'google-oauth', icon: KeyRound, title: 'Google OAuth', description: 'Client ID and secret for Google APIs', content: , }, { key: 'apify', icon: Wrench, title: 'Apify', description: 'API token for web scraping actors', content: , }, ]; const personalSections: SettingsSection[] = [ // Email account management left with the feature on 2026-08-18 (`plugins/email/`). A plugin contributes // panels, not settings sections, so it now lives inside the email workspace itself. // Google OAuth is left in place (code + DB) but hidden — email now uses an app password over IMAP, // so there's no reason to reconnect Google here. Re-enable this section to bring it back. // { // key: 'google-account', // icon: UserCircle, // title: 'Google Account', // description: 'Connect your Google account', // content: , // }, { key: 'dav-app-passwords', icon: CalendarDays, title: 'Calendar & Contacts sync', description: 'Per-device passwords for CalDAV/CardDAV clients', content: , }, { key: 'api-keys', icon: KeyRound, title: 'API keys', description: 'Per-app keys that sign in as you, revocable one at a time', content: , }, { key: 'browser-relay', icon: Globe, title: 'Browser Relay', description: 'Connect your Chrome browser', content: , }, ]; // The Enterprise/Personal tab is not a second thing to remember — it is a fact about which section is // open, so it is derived from the URL rather than kept in its own global. That also fixes the deep link: // with the tab held separately, `/settings/integrations/apify` would have arrived with the tab // still on Enterprise and the content pane showing "Select a section". const allSections = [...enterpriseSections, ...personalSections]; const tabForSection = (section: string | undefined) => personalSections.some((s) => s.key === section) ? 'personal' : 'enterprise'; const IntegrationsSidebar = () => { const { section } = useParams<{ section?: string }>(); const navigate = useNavigate(); const tab = tabForSection(section); const sections = tab === 'enterprise' ? enterpriseSections : personalSections; // Switching tab is a navigation, so it lands on that tab's first section rather than leaving the // content pane showing a section the sidebar no longer lists. const setTab = (next: string) => { const first = (next === 'enterprise' ? enterpriseSections : personalSections)[0]; if (first) navigate(`${BASE_PATH}/${first.key}`); }; return (
Integrations
Enterprise Personal
); }; // Both tabs' sections, because the URL alone says which one is open and the pane no longer has to agree // with the sidebar about the tab to find it. const IntegrationsContent = () => ; const layout: LayoutNode = { type: 'group', id: 'integrations-root', direction: 'horizontal', children: [ { node: { type: 'panel', id: 'integrations-left', appType: null }, size: 20 }, { node: { type: 'panel', id: 'integrations-right', appType: null }, size: 80 }, ], }; export const IntegrationsSettings = () => { const panelComponents: PanelComponents = useMemo( () => ({ 'integrations-left': IntegrationsSidebar, 'integrations-right': IntegrationsContent, }), [], ); return (
{}} components={panelComponents} />
); };