refactor(mail): focus profile editor on protocols
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { useEffect, useMemo, useState, type ReactNode } from "react";
|
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 { Pencil, Plus, Trash2 } from "lucide-react";
|
||||||
import type { ApiSettings } from "../../types";
|
import type { ApiSettings } from "../../types";
|
||||||
import {
|
import {
|
||||||
@@ -7,8 +7,6 @@ import {
|
|||||||
deactivateMailServerProfile,
|
deactivateMailServerProfile,
|
||||||
fetchMailSettingsDelta,
|
fetchMailSettingsDelta,
|
||||||
getMailProfilePolicy,
|
getMailProfilePolicy,
|
||||||
listImapFolders,
|
|
||||||
listMailProfileImapFolders,
|
|
||||||
mailProfilePatternKeys,
|
mailProfilePatternKeys,
|
||||||
mailProfilePolicyLimitKeys,
|
mailProfilePolicyLimitKeys,
|
||||||
updateMailProfilePolicy,
|
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;}) {
|
}: {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 [smtpTestResult, setSmtpTestResult] = useState<MailServerConnectionTestResult | null>(null);
|
||||||
const [imapTestResult, setImapTestResult] = useState<MailServerConnectionTestResult | null>(null);
|
const [imapTestResult, setImapTestResult] = useState<MailServerConnectionTestResult | null>(null);
|
||||||
const [folderResult, setFolderResult] = useState<MailServerFolderLookupResult | null>(null);
|
const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | null>(null);
|
||||||
const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | "folders" | null>(null);
|
|
||||||
|
|
||||||
const disabled = busy || !canWrite;
|
const disabled = busy || !canWrite;
|
||||||
const credentialDisabled = disabled || !canManageCredentials;
|
const credentialDisabled = disabled || !canManageCredentials;
|
||||||
@@ -826,7 +823,6 @@ function ProfileForm({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setSmtpTestResult(null);
|
setSmtpTestResult(null);
|
||||||
setImapTestResult(null);
|
setImapTestResult(null);
|
||||||
setFolderResult(null);
|
|
||||||
setMailActionState(null);
|
setMailActionState(null);
|
||||||
}, [editing, editTarget]);
|
}, [editing, editTarget]);
|
||||||
|
|
||||||
@@ -851,8 +847,6 @@ function ProfileForm({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function patchSmtpCredentials(patch: Partial<MailServerCredentialSettings>) {
|
function patchSmtpCredentials(patch: Partial<MailServerCredentialSettings>) {
|
||||||
setDraft({
|
setDraft({
|
||||||
...draft,
|
...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 (
|
return (
|
||||||
<div className="mail-profile-form">
|
<div className="mail-profile-form">
|
||||||
{showProfileFields &&
|
{showProfileFields &&
|
||||||
@@ -963,12 +936,8 @@ function ProfileForm({
|
|||||||
busyAction={mailActionState}
|
busyAction={mailActionState}
|
||||||
onTestSmtp={() => void runSmtpTest()}
|
onTestSmtp={() => void runSmtpTest()}
|
||||||
onTestImap={() => void runImapTest()}
|
onTestImap={() => void runImapTest()}
|
||||||
onLookupFolders={() => void runFolderLookup()}
|
|
||||||
smtpTestResult={smtpTestResult}
|
smtpTestResult={smtpTestResult}
|
||||||
imapTestResult={imapTestResult}
|
imapTestResult={imapTestResult}
|
||||||
folderLookupResult={folderResult}
|
|
||||||
onUseDetectedFolder={useDetectedSentFolder}
|
|
||||||
useDetectedFolderDisabled={disabled || !draftHasImap}
|
|
||||||
initialSection={initialSection}
|
initialSection={initialSection}
|
||||||
visibleSections={visibleSections}
|
visibleSections={visibleSections}
|
||||||
mode={settingsPanelMode} />
|
mode={settingsPanelMode} />
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export type MailProfileProtocol = "smtp" | "imap";
|
export type MailProfileProtocol = "smtp" | "imap";
|
||||||
export type MailProfileEditSection = MailProfileProtocol | "advanced";
|
export type MailProfileEditSection = MailProfileProtocol;
|
||||||
export type MailProfilePanelMode = "all" | "server" | "credentials";
|
export type MailProfilePanelMode = "all" | "server" | "credentials";
|
||||||
|
|
||||||
export type MailProfileEditTarget =
|
export type MailProfileEditTarget =
|
||||||
@@ -47,7 +47,7 @@ export function mailProfileEditTargetPanelMode(target: MailProfileEditTarget): M
|
|||||||
|
|
||||||
export function mailProfileEditTargetVisibleSections(target: MailProfileEditTarget): MailProfileEditSection[] {
|
export function mailProfileEditTargetVisibleSections(target: MailProfileEditTarget): MailProfileEditSection[] {
|
||||||
if (target.kind === "server" || target.kind === "credentials") return [target.protocol];
|
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 [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ assertEqual(mailProfileEditTargetInitialSection({ kind: "server", protocol: "ima
|
|||||||
assertEqual(mailProfileEditTargetPanelMode({ kind: "server", protocol: "smtp" }), "server");
|
assertEqual(mailProfileEditTargetPanelMode({ kind: "server", protocol: "smtp" }), "server");
|
||||||
assertEqual(mailProfileEditTargetPanelMode({ kind: "credentials", protocol: "imap" }), "credentials");
|
assertEqual(mailProfileEditTargetPanelMode({ kind: "credentials", protocol: "imap" }), "credentials");
|
||||||
assertEqual(mailProfileEditTargetPanelMode({ kind: "profile" }), null);
|
assertEqual(mailProfileEditTargetPanelMode({ kind: "profile" }), null);
|
||||||
|
assertDeepEqual(mailProfileEditTargetVisibleSections({ kind: "create" }), ["smtp", "imap"]);
|
||||||
assertDeepEqual(mailProfileEditTargetVisibleSections({ kind: "credentials", protocol: "imap" }), ["imap"]);
|
assertDeepEqual(mailProfileEditTargetVisibleSections({ kind: "credentials", protocol: "imap" }), ["imap"]);
|
||||||
assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "profile" }), true);
|
assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "profile" }), true);
|
||||||
assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "server", protocol: "smtp" }), false);
|
assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "server", protocol: "smtp" }), false);
|
||||||
assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "profile" }), false);
|
assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "profile" }), false);
|
||||||
assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "create" }), true);
|
assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "create" }), true);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user