95 lines
2.5 KiB
TypeScript

import { useCallback, useState } from 'react';
import { apiFetch } from '../lib/api';
export type MailProvider =
| 'gmail'
| 'icloud'
| 'outlook'
| 'yahoo'
| 'gmx'
| 'other';
type ConnectBody = {
email: string;
password: string;
// Provider-Feld wird NICHT an das Backend gesendet — der Server erkennt
// den Provider automatisch via Email-Domain (detectImapProvider in connect.post.ts).
// Optionale Custom-IMAP-Felder für "other":
imapHost?: string;
imapPort?: number;
useTls?: boolean;
rejectUnauthorized?: boolean;
};
type ConnectResult = {
connected: boolean;
email: string;
provider: string;
custom: boolean;
};
export type UseMailConnectReturn = {
connect: (params: ConnectBody) => Promise<{ ok: boolean; error?: string }>;
connecting: boolean;
error: string | null;
/** Leitet aus der Email-Domain den Provider ab (rein client-seitig, zur UI-Hilfe). */
detectProvider: (email: string) => MailProvider;
};
const PROVIDER_DOMAIN_MAP: Record<string, MailProvider> = {
'gmail.com': 'gmail',
'googlemail.com': 'gmail',
'icloud.com': 'icloud',
'me.com': 'icloud',
'mac.com': 'icloud',
'outlook.com': 'outlook',
'hotmail.com': 'outlook',
'live.com': 'outlook',
'msn.com': 'outlook',
'yahoo.com': 'yahoo',
'yahoo.de': 'yahoo',
'yahoo.co.uk': 'yahoo',
'ymail.com': 'yahoo',
'gmx.de': 'gmx',
'gmx.net': 'gmx',
'gmx.at': 'gmx',
'gmx.ch': 'gmx',
'web.de': 'gmx',
};
export function detectProvider(email: string): MailProvider {
const domain = email.trim().toLowerCase().split('@')[1] ?? '';
return PROVIDER_DOMAIN_MAP[domain] ?? 'other';
}
/**
* Kapselt POST /api/mail/connect.
*
* Backend erwartet: { email, password, imapHost?, imapPort?, useTls?, rejectUnauthorized? }
* Provider-Detection passiert server-seitig — wir senden keinen provider-Key.
*/
export function useMailConnect(): UseMailConnectReturn {
const [connecting, setConnecting] = useState(false);
const [error, setError] = useState<string | null>(null);
const connect = useCallback(async (params: ConnectBody) => {
setConnecting(true);
setError(null);
try {
await apiFetch<ConnectResult>('/api/mail/connect', {
method: 'POST',
body: params,
});
return { ok: true };
} catch (e: any) {
const msg = e?.message ?? 'Verbindung fehlgeschlagen';
setError(msg);
return { ok: false, error: msg };
} finally {
setConnecting(false);
}
}, []);
return { connect, connecting, error, detectProvider };
}