refactor(mail): focus profile editor on protocols

This commit is contained in:
2026-07-20 20:06:42 +02:00
parent 764577dc23
commit 658c1e6d5d
3 changed files with 5 additions and 36 deletions

View File

@@ -1,5 +1,5 @@
import { useEffect, useMemo, useState, type ReactNode } from "react";
import { ConnectionTree, FieldLabel, LoadingFrame, MailServerSettingsPanel, PolicyLockedHint, PolicyPathHelp, PolicyRow, PolicySourcePath, PolicyTable, ToggleSwitch, hasMailImapSettings, mailImapSettingsPayload, mailServerSecurityOptions, mailSmtpSettingsPayload, mailTextOrNull, mailTransportCredentialsPayload, mergeDeltaRows, normalizeMailServerSecurity, normalizePolicySourcePathItems, useDeltaWatermarks, type ConnectionTreeColumn, type MailServerConnectionTestResult, type MailServerCredentialSettings, type MailServerFolderLookupResult, type MailServerImapSettings, type MailServerSmtpSettings, type NormalizedPolicySourcePathItem, type PolicySourcePathItem } from "@govoplan/core-webui";
import { ConnectionTree, FieldLabel, LoadingFrame, MailServerSettingsPanel, PolicyLockedHint, PolicyPathHelp, PolicyRow, PolicySourcePath, PolicyTable, ToggleSwitch, hasMailImapSettings, mailImapSettingsPayload, mailServerSecurityOptions, mailSmtpSettingsPayload, mailTextOrNull, mailTransportCredentialsPayload, mergeDeltaRows, normalizeMailServerSecurity, normalizePolicySourcePathItems, useDeltaWatermarks, type ConnectionTreeColumn, type MailServerConnectionTestResult, type MailServerCredentialSettings, type MailServerImapSettings, type MailServerSmtpSettings, type NormalizedPolicySourcePathItem, type PolicySourcePathItem } from "@govoplan/core-webui";
import { Pencil, Plus, Trash2 } from "lucide-react";
import type { ApiSettings } from "../../types";
import {
@@ -7,8 +7,6 @@ import {
deactivateMailServerProfile,
fetchMailSettingsDelta,
getMailProfilePolicy,
listImapFolders,
listMailProfileImapFolders,
mailProfilePatternKeys,
mailProfilePolicyLimitKeys,
updateMailProfilePolicy,
@@ -804,8 +802,7 @@ function ProfileForm({
}: {settings: ApiSettings;draft: ProfileDraft;setDraft: (draft: ProfileDraft) => void;editing: EditingProfile;busy: boolean;canWrite: boolean;canManageCredentials: boolean;effectivePolicy?: MailProfilePolicy | null;editTarget: MailProfileEditTarget;}) {
const [smtpTestResult, setSmtpTestResult] = useState<MailServerConnectionTestResult | null>(null);
const [imapTestResult, setImapTestResult] = useState<MailServerConnectionTestResult | null>(null);
const [folderResult, setFolderResult] = useState<MailServerFolderLookupResult | null>(null);
const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | "folders" | null>(null);
const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | null>(null);
const disabled = busy || !canWrite;
const credentialDisabled = disabled || !canManageCredentials;
@@ -826,7 +823,6 @@ function ProfileForm({
useEffect(() => {
setSmtpTestResult(null);
setImapTestResult(null);
setFolderResult(null);
setMailActionState(null);
}, [editing, editTarget]);
@@ -851,8 +847,6 @@ function ProfileForm({
});
}
function patchSmtpCredentials(patch: Partial<MailServerCredentialSettings>) {
setDraft({
...draft,
@@ -898,27 +892,6 @@ function ProfileForm({
}
}
async function runFolderLookup() {
if (!draftHasImap) return;
setMailActionState("folders");
setFolderResult(null);
try {
setFolderResult(useSavedImapTest && existingProfile ?
await listMailProfileImapFolders(settings, existingProfile.id) :
await listImapFolders(settings, rawImapPayload(draft, false)));
} catch (err) {
setFolderResult({ ok: false, message: errorMessage(err), folders: [] });
} finally {
setMailActionState(null);
}
}
function useDetectedSentFolder() {
const folder = folderResult?.detected_sent_folder;
if (!folder || disabled || !draftHasImap) return;
setDraft({ ...draft, imapSentFolder: folder });
}
return (
<div className="mail-profile-form">
{showProfileFields &&
@@ -963,12 +936,8 @@ function ProfileForm({
busyAction={mailActionState}
onTestSmtp={() => void runSmtpTest()}
onTestImap={() => void runImapTest()}
onLookupFolders={() => void runFolderLookup()}
smtpTestResult={smtpTestResult}
imapTestResult={imapTestResult}
folderLookupResult={folderResult}
onUseDetectedFolder={useDetectedSentFolder}
useDetectedFolderDisabled={disabled || !draftHasImap}
initialSection={initialSection}
visibleSections={visibleSections}
mode={settingsPanelMode} />

View File

@@ -1,5 +1,5 @@
export type MailProfileProtocol = "smtp" | "imap";
export type MailProfileEditSection = MailProfileProtocol | "advanced";
export type MailProfileEditSection = MailProfileProtocol;
export type MailProfilePanelMode = "all" | "server" | "credentials";
export type MailProfileEditTarget =
@@ -47,7 +47,7 @@ export function mailProfileEditTargetPanelMode(target: MailProfileEditTarget): M
export function mailProfileEditTargetVisibleSections(target: MailProfileEditTarget): MailProfileEditSection[] {
if (target.kind === "server" || target.kind === "credentials") return [target.protocol];
if (target.kind === "create") return ["smtp", "imap", "advanced"];
if (target.kind === "create") return ["smtp", "imap"];
return [];
}