Files
NetMesh/components/vault/useHostTreeInlineHostActions.ts

54 lines
1.5 KiB
TypeScript
Raw Normal View History

import { useCallback } from 'react';
import { hostTreeInlineGroupEditStore } from '../../application/state/hostTreeInlineGroupEditStore';
import { hostTreeInlineHostEditStore } from '../../application/state/hostTreeInlineHostEditStore';
import { applyHostLabelRename } from '../../domain/host';
import type { Host } from '../../types';
import { toast } from '../ui/toast';
type UseHostTreeInlineHostActionsParams = {
hosts: Host[];
onUpdateHosts: (hosts: Host[]) => void;
t: (key: string) => string;
};
export function useHostTreeInlineHostActions({
hosts,
onUpdateHosts,
t,
}: UseHostTreeInlineHostActionsParams) {
const startInlineRenameHost = useCallback((host: Host) => {
hostTreeInlineGroupEditStore.clear();
hostTreeInlineHostEditStore.startEdit({
hostId: host.id,
initialName: host.label,
});
}, []);
const cancelInlineHostEdit = useCallback(() => {
hostTreeInlineHostEditStore.clear();
}, []);
const commitInlineHostRename = useCallback((rawName: string) => {
const edit = hostTreeInlineHostEditStore.getEdit();
if (!edit) return;
const result = applyHostLabelRename(hosts, edit.hostId, rawName);
if (!result.ok) {
toast.error(t('vault.hosts.errors.nameRequired'));
return;
}
if (result.changed) {
onUpdateHosts(result.hosts);
}
hostTreeInlineHostEditStore.clear();
}, [hosts, onUpdateHosts, t]);
return {
startInlineRenameHost,
commitInlineHostRename,
cancelInlineHostEdit,
};
}