From aef7fdf6d5c6bc0db307d629336e4cf6582287c8 Mon Sep 17 00:00:00 2001 From: Matthew Meszaros Date: Tue, 30 Jun 2026 10:06:49 +0200 Subject: [PATCH] feat: claim template presence and suppress the page cursor layer while the email template editor is open --- web/src/app/app/templates/page.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/src/app/app/templates/page.tsx b/web/src/app/app/templates/page.tsx index e9aa836a..6a6ef3f4 100644 --- a/web/src/app/app/templates/page.tsx +++ b/web/src/app/app/templates/page.tsx @@ -45,6 +45,9 @@ import useDeleteTemplate from "@/lib/api/hooks/app/templates/useDeleteTemplate"; import useDuplicateTemplate from "@/lib/api/hooks/app/templates/useDuplicateTemplate"; import useReorderTemplates from "@/lib/api/hooks/app/templates/useReorderTemplates"; import { useConfirm } from "@/hooks/context/confirm"; +import { usePresenceResource } from "@/hooks/PresenceProvider"; +import { useSuppressGlobalCursors } from "@/components/app/presence/GlobalCursors"; +import ResourceViewers from "@/components/app/presence/ResourceViewers"; import type Template from "@/lib/api/models/app/templates/Template"; import type { AppError } from "@/lib/api/client/normalizeError"; import buildError from "@/lib/helper/buildError"; @@ -447,6 +450,11 @@ function TemplateEditor({ const update = useUpdateTemplate(); const confirm = useConfirm(); + const templateId = state?.mode === "edit" ? state.template.id : null; + usePresenceResource(templateId ? `template:${templateId}` : null, "editing"); + // While this full-screen editor is open it owns the pointer; silence the page cursor. + useSuppressGlobalCursors(!!state); + const [name, setName] = React.useState(""); const [subject, setSubject] = React.useState(""); const [bodyPlain, setBodyPlain] = React.useState(""); @@ -579,6 +587,10 @@ function TemplateEditor({
Template +