95 lines
2.5 KiB
TypeScript
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 };
|
|
}
|