refactor: share modal save lifecycle
This commit is contained in:
parent
e6a1efc7f2
commit
7098e75ca3
1 changed files with 51 additions and 39 deletions
|
|
@ -9,6 +9,7 @@ import { Icon } from '../components/Icon';
|
||||||
import { Modal } from '../components/Modal';
|
import { Modal } from '../components/Modal';
|
||||||
import { ShowSecretKeyModal } from '../components/ShowSecretKeyModal';
|
import { ShowSecretKeyModal } from '../components/ShowSecretKeyModal';
|
||||||
import { formatDate, shortenNpub } from '../lib/format';
|
import { formatDate, shortenNpub } from '../lib/format';
|
||||||
|
import type { MetadataPublishReport } from '../lib/types';
|
||||||
import { useApp } from '../state/AppProvider';
|
import { useApp } from '../state/AppProvider';
|
||||||
|
|
||||||
interface ProfilesScreenProps {
|
interface ProfilesScreenProps {
|
||||||
|
|
@ -329,6 +330,29 @@ function nip05Problem(value: string): string | null {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function runModalSave(options: {
|
||||||
|
npub: string;
|
||||||
|
perform: () => Promise<MetadataPublishReport>;
|
||||||
|
successMessage: (report: MetadataPublishReport) => string;
|
||||||
|
onSaved: (message: string) => void;
|
||||||
|
onError: (message: string | null) => void;
|
||||||
|
onSavingChange: (npub: string | null) => void;
|
||||||
|
setSaving: (saving: boolean) => void;
|
||||||
|
}): Promise<void> {
|
||||||
|
options.onError(null);
|
||||||
|
options.setSaving(true);
|
||||||
|
options.onSavingChange(options.npub);
|
||||||
|
try {
|
||||||
|
const report = await options.perform();
|
||||||
|
options.onSaved(options.successMessage(report));
|
||||||
|
} catch (err) {
|
||||||
|
options.onError(err instanceof Error ? err.message : String(err));
|
||||||
|
} finally {
|
||||||
|
options.setSaving(false);
|
||||||
|
options.onSavingChange(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Nip05Modal({
|
function Nip05Modal({
|
||||||
target,
|
target,
|
||||||
onClose,
|
onClose,
|
||||||
|
|
@ -352,24 +376,20 @@ function Nip05Modal({
|
||||||
const canSave = changed && !problem;
|
const canSave = changed && !problem;
|
||||||
|
|
||||||
const save = async (next: string | null) => {
|
const save = async (next: string | null) => {
|
||||||
onError(null);
|
await runModalSave({
|
||||||
setSaving(true);
|
npub: target.npub,
|
||||||
onSavingChange(target.npub);
|
perform: () => setNip05(target.npub, next),
|
||||||
try {
|
successMessage: (report) =>
|
||||||
const report = await setNip05(target.npub, next);
|
|
||||||
onSaved(
|
|
||||||
report.failed.length === 0
|
report.failed.length === 0
|
||||||
? next
|
? next
|
||||||
? `NIP-05 "${next}" published to ${report.succeeded.length} relay(s). Remember it must also be served from your domain (see docs/NIP-05.md).`
|
? `NIP-05 "${next}" published to ${report.succeeded.length} relay(s). Remember it must also be served from your domain (see docs/NIP-05.md).`
|
||||||
: 'NIP-05 removed and the change published.'
|
: 'NIP-05 removed and the change published.'
|
||||||
: `NIP-05 saved for "${target.label}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
: `NIP-05 saved for "${target.label}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
||||||
);
|
onSaved,
|
||||||
} catch (err) {
|
onError,
|
||||||
onError(err instanceof Error ? err.message : String(err));
|
onSavingChange,
|
||||||
} finally {
|
setSaving,
|
||||||
setSaving(false);
|
});
|
||||||
onSavingChange(null);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -440,22 +460,18 @@ function RenameModal({
|
||||||
if (!canSave) {
|
if (!canSave) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
onError(null);
|
await runModalSave({
|
||||||
setSaving(true);
|
npub: target.npub,
|
||||||
onSavingChange(target.npub);
|
perform: () => renameProfile(target.npub, trimmed),
|
||||||
try {
|
successMessage: (report) =>
|
||||||
const report = await renameProfile(target.npub, trimmed);
|
|
||||||
onSaved(
|
|
||||||
report.failed.length === 0
|
report.failed.length === 0
|
||||||
? `Renamed to "${trimmed}" and published to ${report.succeeded.length} relay(s). It may take a minute to appear on other clients.`
|
? `Renamed to "${trimmed}" and published to ${report.succeeded.length} relay(s). It may take a minute to appear on other clients.`
|
||||||
: `Renamed to "${trimmed}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
: `Renamed to "${trimmed}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
||||||
);
|
onSaved,
|
||||||
} catch (err) {
|
onError,
|
||||||
onError(err instanceof Error ? err.message : String(err));
|
onSavingChange,
|
||||||
} finally {
|
setSaving,
|
||||||
setSaving(false);
|
});
|
||||||
onSavingChange(null);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -514,22 +530,18 @@ function PictureModal({
|
||||||
const [saving, setSaving] = useState(false);
|
const [saving, setSaving] = useState(false);
|
||||||
|
|
||||||
const save = async (nextUrl: string | null) => {
|
const save = async (nextUrl: string | null) => {
|
||||||
onError(null);
|
await runModalSave({
|
||||||
setSaving(true);
|
npub: target.npub,
|
||||||
onSavingChange(target.npub);
|
perform: () => setProfilePicture(target.npub, nextUrl),
|
||||||
try {
|
successMessage: (report) =>
|
||||||
const report = await setProfilePicture(target.npub, nextUrl);
|
|
||||||
onSaved(
|
|
||||||
report.failed.length === 0
|
report.failed.length === 0
|
||||||
? `Picture for "${target.label}" published to ${report.succeeded.length} relay(s).`
|
? `Picture for "${target.label}" published to ${report.succeeded.length} relay(s).`
|
||||||
: `Picture saved for "${target.label}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
: `Picture saved for "${target.label}", but ${report.failed.length} relay(s) did not accept it. Use "Publish name" to retry.`,
|
||||||
);
|
onSaved,
|
||||||
} catch (err) {
|
onError,
|
||||||
onError(err instanceof Error ? err.message : String(err));
|
onSavingChange,
|
||||||
} finally {
|
setSaving,
|
||||||
setSaving(false);
|
});
|
||||||
onSavingChange(null);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const onUpload = async () => {
|
const onUpload = async () => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue