Files
kandev/apps/web/components/confirmation/use-saved-task-view-delete-confirmation.ts
T
João Salavisa 5ee5161166 feat(ui): confirm saved view deletion (#3461)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-09-07 16:14:58 +01:00

51 lines
1.5 KiB
TypeScript

"use client";
import { useEffect, useRef, useState } from "react";
export type SavedTaskViewDeleteTarget = {
id: string;
label: string;
};
export function useSavedTaskViewDeleteConfirmation<T extends HTMLElement = HTMLElement>(
availableTargets: ReadonlyArray<{ id: string }>,
) {
const [requestedTarget, setRequestedTarget] = useState<SavedTaskViewDeleteTarget | null>(null);
const anchorRef = useRef<T>(null);
const anchorIdRef = useRef<string | null>(null);
const anchorsRef = useRef(new Map<string, T>());
const target =
requestedTarget && availableTargets.some((item) => item.id === requestedTarget.id)
? requestedTarget
: null;
useEffect(() => {
if (requestedTarget && !target) setRequestedTarget(null);
}, [requestedTarget, target]);
function registerAnchor(id: string, element: T | null) {
if (element) {
anchorsRef.current.set(id, element);
if (anchorIdRef.current === id) anchorRef.current = element;
return;
}
anchorsRef.current.delete(id);
}
function request(targetToDelete: SavedTaskViewDeleteTarget) {
anchorIdRef.current = targetToDelete.id;
const registeredAnchor = anchorsRef.current.get(targetToDelete.id);
// Preserve a directly bound anchor when a surface does not register keyed anchors.
if (registeredAnchor) anchorRef.current = registeredAnchor;
setRequestedTarget(targetToDelete);
}
return {
target,
anchorRef,
close: () => setRequestedTarget(null),
registerAnchor,
request,
};
}