/** * AddConnectionWizard * * Streamlined multi-step modal for adding a new connector. * Steps are connector-type-aware: * Base: Connector → Consent → Connect * Microsoft: Connector → Consent → Admin Consent (optional) → Connect * Infomaniak: Connector → Consent → PAT Input → (done) */ import React, { useState } from 'react'; import { Modal } from '../UiComponents/Modal/Modal'; import { FaGoogle, FaMicrosoft, FaTasks, FaCloud, FaCheck, FaArrowRight, FaShieldAlt } from 'react-icons/fa'; import styles from './AddConnectionWizard.module.css'; // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- export type ConnectorType = 'google' | 'msft' | 'clickup' | 'infomaniak'; type StepId = 'connector' | 'consent' | 'msftAdminConsent' | 'infomaniakPat' | 'connect'; interface WizardState { currentStep: StepId; connector: ConnectorType | null; knowledgeEnabled: boolean; infomaniakToken: string; adminConsentDone: boolean; } const CONNECTOR_LABELS: Record = { google: 'Google', msft: 'Microsoft 365', clickup: 'ClickUp', infomaniak: 'Infomaniak', }; const CONNECTOR_ICONS: Record = { google: , msft: , clickup: , infomaniak: , }; function _getSteps(connector: ConnectorType | null): StepId[] { if (connector === 'msft') return ['connector', 'consent', 'msftAdminConsent', 'connect']; if (connector === 'infomaniak') return ['connector', 'consent', 'infomaniakPat']; return ['connector', 'consent', 'connect']; } // --------------------------------------------------------------------------- // Props // --------------------------------------------------------------------------- interface AddConnectionWizardProps { open: boolean; onClose: () => void; onConnect: (type: ConnectorType, knowledgeEnabled: boolean) => Promise; onInfomaniakConnect?: (token: string, knowledgeEnabled: boolean) => Promise; onMsftAdminConsent?: () => void; isConnecting?: boolean; } // --------------------------------------------------------------------------- // Component // --------------------------------------------------------------------------- export const AddConnectionWizard: React.FC = ({ open, onClose, onConnect, onInfomaniakConnect, onMsftAdminConsent, isConnecting = false, }) => { const [state, setState] = useState({ currentStep: 'connector', connector: null, knowledgeEnabled: false, infomaniakToken: '', adminConsentDone: false, }); const reset = () => setState({ currentStep: 'connector', connector: null, knowledgeEnabled: false, infomaniakToken: '', adminConsentDone: false }); const handleClose = () => { reset(); onClose(); }; const steps = _getSteps(state.connector); const stepIndex = steps.indexOf(state.currentStep); const goNext = () => { const nextIdx = stepIndex + 1; if (nextIdx < steps.length) { setState(s => ({ ...s, currentStep: steps[nextIdx] })); } }; const goBack = () => { const prevIdx = stepIndex - 1; if (prevIdx >= 0) { setState(s => ({ ...s, currentStep: steps[prevIdx] })); } }; const selectConnector = (c: ConnectorType) => { setState(s => ({ ...s, connector: c, currentStep: 'consent' })); }; const setConsent = (enabled: boolean) => { setState(s => ({ ...s, knowledgeEnabled: enabled })); goNext(); }; const handleFinalConnect = async () => { if (!state.connector) return; if (state.connector === 'infomaniak' && onInfomaniakConnect) { await onInfomaniakConnect(state.infomaniakToken, state.knowledgeEnabled); } else { await onConnect(state.connector, state.knowledgeEnabled); } reset(); onClose(); }; return ( {/* Stepper */}
{steps.map((s, i) => (
i ? styles.stepDotDone : '', ].join(' ')} > {stepIndex > i ? : i + 1}
))}
{/* ---- Step: Connector ---- */} {state.currentStep === 'connector' && (

Anbieter wählen

Welchen Dienst möchtest du verbinden?

{(['google', 'msft', 'clickup', 'infomaniak'] as ConnectorType[]).map(type => ( ))}
)} {/* ---- Step: Consent ---- */} {state.currentStep === 'consent' && (

Wissensdatenbank

Möchtest du Inhalte aus dieser Verbindung in deine persönliche Wissensdatenbank aufnehmen, damit die KI beim Antworten auf Informationen aus {state.connector ? CONNECTOR_LABELS[state.connector] : 'diesem Dienst'} zurückgreifen kann?

Du kannst dies später jederzeit in der UDB pro Datenquelle steuern.

)} {/* ---- Step: MSFT Admin Consent ---- */} {state.currentStep === 'msftAdminConsent' && (

Organisations-Zustimmung (optional)

Falls du Mandant-Administrator bist, kannst du jetzt für deine ganze Organisation zustimmen. So müssen andere Benutzer nicht einzeln bestätigen.

Wenn du kein Admin bist oder dies später tun möchtest, überspringe diesen Schritt.

)} {/* ---- Step: Infomaniak PAT ---- */} {state.currentStep === 'infomaniakPat' && (

Infomaniak Personal Access Token

Erstelle einen Personal Access Token in deinem Infomaniak-Konto und füge ihn hier ein.

setState(s => ({ ...s, infomaniakToken: e.target.value }))} className={styles.patInput} autoFocus />
)} {/* ---- Step: Connect ---- */} {state.currentStep === 'connect' && (

Verbindung herstellen

Anbieter {state.connector && CONNECTOR_ICONS[state.connector]}  {state.connector ? CONNECTOR_LABELS[state.connector] : '—'}
Wissensdatenbank {state.knowledgeEnabled ? '✓ Aktiv' : '✗ Nicht aktiv'}
)}
); }; export default AddConnectionWizard;