diff --git a/web/src/pages/BBS.tsx b/web/src/pages/BBS.tsx index 34fb5b0..d131246 100644 --- a/web/src/pages/BBS.tsx +++ b/web/src/pages/BBS.tsx @@ -1,5 +1,5 @@ import { useState, type SyntheticEvent } from "react"; -import { Link, useRouteLoaderData } from "react-router-dom"; +import { Link, useLocation, useRouteLoaderData } from "react-router-dom"; import { useAuth } from "../lib/auth"; import { useBreadcrumb } from "../hooks/useBreadcrumb"; import { createPost, uploadAttachments } from "../lib/writes"; @@ -29,6 +29,10 @@ import PostBody from "../components/post/PostBody"; export default function BBSPage() { const { handle, bbs, pinRkey } = useRouteLoaderData("bbs") as BBSLoaderData; const { user, agent } = useAuth(); + // Set when arriving here via a news delete; Constellation/Slingshot may + // still be returning the record, so filter it out for this one render. + const justDeletedRkey = (useLocation().state as { deletedNewsRkey?: string }) + ?.deletedNewsRkey; const [newsTitle, setNewsTitle] = useState(""); const [newsBody, setNewsBody] = useState(""); const [newsFiles, setNewsFiles] = useState([]); @@ -74,12 +78,13 @@ export default function BBSPage() { } } - // Merge pending news with loader data, deduplicating by rkey. + // Merge pending news with loader data, deduplicating by rkey and dropping + // anything just deleted from the News page. const loaderTids = new Set(bbs.news.map((n) => n.rkey)); const allNews = [ ...pendingNews.filter((n) => !loaderTids.has(n.rkey)), ...bbs.news, - ]; + ].filter((n) => n.rkey !== justDeletedRkey); const visibleNews = showAllNews ? allNews : allNews.slice(0, 3); return ( diff --git a/web/src/pages/News.tsx b/web/src/pages/News.tsx index 27e2149..aa53379 100644 --- a/web/src/pages/News.tsx +++ b/web/src/pages/News.tsx @@ -38,7 +38,7 @@ export default function NewsPage() { if (!confirm("Delete this news post?")) return; await deleteRecord(agent, POST, tid); invalidateBBSCache(); - navigate(`/bbs/${handle}`); + navigate(`/bbs/${handle}`, { state: { deletedNewsRkey: tid } }); } return (