Retro Bulletin Board Systems on atproto. Web app and TUI. lazy mirror of alyraffauf/atbbs atbbs.xyz
forums python tui atproto bbs
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

web: move cache invalidation to the write side

+27 -33
+12
web/src/lib/writes.ts
··· 269 269 return resp; 270 270 } 271 271 272 + export async function deleteBan(rpc: Client, rkey: string) { 273 + const resp = await deleteRecord(rpc, BAN, rkey); 274 + invalidateAllBBSCaches(); 275 + return resp; 276 + } 277 + 278 + export async function deleteHide(rpc: Client, rkey: string) { 279 + const resp = await deleteRecord(rpc, HIDE, rkey); 280 + invalidateAllBBSCaches(); 281 + return resp; 282 + } 283 + 272 284 // --- Pins --- 273 285 274 286 export async function createPin(rpc: Client, did: string) {
+10 -23
web/src/pages/SysopModerate.tsx
··· 2 2 import { useSuspenseQuery, useMutation } from "@tanstack/react-query"; 3 3 import { useAuth } from "../lib/auth"; 4 4 import { resolveIdentity } from "../lib/atproto"; 5 - import { BAN, HIDE } from "../lib/lexicon"; 6 - import { invalidateAllBBSCaches } from "../lib/bbs"; 7 5 import { bbsQuery, sysopModerationQuery } from "../lib/queries"; 8 - import { queryClient } from "../lib/queryClient"; 9 6 import HandleInput from "../components/form/HandleInput"; 10 7 import { Button } from "../components/form/Form"; 11 8 import { usePageTitle } from "../hooks/usePageTitle"; 12 - import { createBan, createHide, deleteRecord } from "../lib/writes"; 9 + import { 10 + createBan, 11 + createHide, 12 + deleteBan, 13 + deleteHide, 14 + } from "../lib/writes"; 13 15 import { alertOnError } from "../lib/alerts"; 14 16 15 17 export default function SysopModerate() { ··· 24 26 sysopModerationQuery(user!.pdsUrl, user!.did), 25 27 ); 26 28 const { banRkeys, bannedHandles, hideRkeys, hidden } = moderation; 27 - 28 - function refreshModeration() { 29 - queryClient.invalidateQueries( 30 - sysopModerationQuery(user!.pdsUrl, user!.did), 31 - ); 32 - invalidateAllBBSCaches(); 33 - } 34 29 35 30 const banMutation = useMutation({ 36 31 mutationFn: async (identifier: string) => { ··· 39 34 if (!did.startsWith("did:")) did = (await resolveIdentity(did)).did; 40 35 await createBan(agent, did); 41 36 }, 42 - onSuccess: () => { 43 - setIdentifier(""); 44 - refreshModeration(); 45 - }, 37 + onSuccess: () => setIdentifier(""), 46 38 onError: alertOnError("ban"), 47 39 }); 48 40 49 41 const unbanMutation = useMutation({ 50 42 mutationFn: async (rkey: string) => { 51 43 if (!agent) throw new Error("Not signed in"); 52 - await deleteRecord(agent, BAN, rkey); 44 + await deleteBan(agent, rkey); 53 45 }, 54 - onSuccess: refreshModeration, 55 46 }); 56 47 57 48 const hideMutation = useMutation({ ··· 59 50 if (!agent) throw new Error("Not signed in"); 60 51 await createHide(agent, uri); 61 52 }, 62 - onSuccess: () => { 63 - setHideUri(""); 64 - refreshModeration(); 65 - }, 53 + onSuccess: () => setHideUri(""), 66 54 }); 67 55 68 56 const unhideMutation = useMutation({ 69 57 mutationFn: async (rkey: string) => { 70 58 if (!agent) throw new Error("Not signed in"); 71 - await deleteRecord(agent, HIDE, rkey); 59 + await deleteHide(agent, rkey); 72 60 }, 73 - onSuccess: refreshModeration, 74 61 }); 75 62 76 63 function ban() {
+5 -10
web/src/pages/Thread.tsx
··· 5 5 import { useBreadcrumb } from "../hooks/useBreadcrumb"; 6 6 import { usePageTitle } from "../hooks/usePageTitle"; 7 7 import { useThreadReplies } from "../hooks/useThreadReplies"; 8 - import { BAN, BOARD, HIDE, POST } from "../lib/lexicon"; 8 + import { BOARD, POST } from "../lib/lexicon"; 9 9 import { makeAtUri, nowIso, parseAtUri } from "../lib/util"; 10 10 import * as limits from "../lib/limits"; 11 11 import { 12 12 createBan, 13 13 createHide, 14 14 createPost, 15 + deleteBan, 16 + deleteHide, 15 17 deleteRecord, 16 18 uploadAttachments, 17 19 } from "../lib/writes"; ··· 31 33 removeRefAndReply, 32 34 setRefs, 33 35 } from "../lib/threadCache"; 34 - import { invalidateAllBBSCaches } from "../lib/bbs"; 35 36 import { alertOnError } from "../lib/alerts"; 36 37 import type { BacklinkRef } from "../lib/atproto"; 37 38 import type { BBS } from "../lib/bbs"; ··· 173 174 onError: alertOnError("delete"), 174 175 }); 175 176 176 - const moderationMutationDefaults = { onSuccess: invalidateAllBBSCaches }; 177 - 178 177 const banMutation = useMutation({ 179 - ...moderationMutationDefaults, 180 178 mutationFn: async (banDid: string) => { 181 179 if (!agent) throw new Error("Not signed in"); 182 180 await createBan(agent, banDid); ··· 184 182 }); 185 183 186 184 const unbanMutation = useMutation({ 187 - ...moderationMutationDefaults, 188 185 mutationFn: async (rkey: string) => { 189 186 if (!agent) throw new Error("Not signed in"); 190 - await deleteRecord(agent, BAN, rkey); 187 + await deleteBan(agent, rkey); 191 188 }, 192 189 }); 193 190 194 191 const hideMutation = useMutation({ 195 - ...moderationMutationDefaults, 196 192 mutationFn: async (uri: string) => { 197 193 if (!agent) throw new Error("Not signed in"); 198 194 await createHide(agent, uri); ··· 200 196 }); 201 197 202 198 const unhideMutation = useMutation({ 203 - ...moderationMutationDefaults, 204 199 mutationFn: async (rkey: string) => { 205 200 if (!agent) throw new Error("Not signed in"); 206 - await deleteRecord(agent, HIDE, rkey); 201 + await deleteHide(agent, rkey); 207 202 }, 208 203 }); 209 204