personal web client for Bluesky
typescript solidjs bluesky atcute

fix: ensure ghost post deletion

mary.my.id 81d920fe 3c7293ee

verified
Changed files
+49 -9
src
components
+49 -9
src/components/timeline/delete-post-prompt.tsx
··· 1 - import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 1 + import { XRPCError } from '@atcute/client'; 2 + import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 3 import { useQueryClient } from '@mary/solid-query'; 3 4 4 5 import { updatePostShadow } from '~/api/cache/post-shadow'; 5 6 import { parseAtUri } from '~/api/types/at-uri'; 6 - import { deleteRecord } from '~/api/utils/records'; 7 7 8 8 import { useAgent } from '~/lib/states/agent'; 9 9 import { useSession } from '~/lib/states/session'; ··· 25 25 26 26 const onDelete = () => { 27 27 const uri = parseAtUri(post.uri); 28 - const promise = deleteRecord(rpc, { 29 - repo: currentAccount!.did, 30 - collection: 'app.bsky.feed.post', 31 - rkey: uri.rkey, 28 + 29 + const promise = rpc.call('com.atproto.repo.applyWrites', { 30 + data: { 31 + repo: currentAccount!.did, 32 + writes: [ 33 + { 34 + $type: 'com.atproto.repo.applyWrites#delete', 35 + collection: 'app.bsky.feed.post', 36 + rkey: uri.rkey, 37 + }, 38 + ], 39 + }, 32 40 }); 33 41 34 42 updatePostShadow(queryClient, post.uri, { deleted: true }); 35 43 36 - if (onPostDelete) { 37 - promise.then(onPostDelete); 38 - } 44 + promise.then( 45 + () => { 46 + onPostDelete?.(); 47 + }, 48 + async (err) => { 49 + if (err instanceof XRPCError && err.kind === 'InternalServerError') { 50 + await rpc.call('com.atproto.repo.putRecord', { 51 + data: { 52 + repo: currentAccount!.did, 53 + collection: 'app.bsky.feed.post', 54 + rkey: uri.rkey, 55 + validate: false, 56 + record: { 57 + $type: 'app.bsky.feed.post', 58 + text: '', 59 + createdAt: '1970-01-01T00:00:00.000Z', 60 + } satisfies AppBskyFeedPost.Record, 61 + }, 62 + }); 63 + 64 + await rpc.call('com.atproto.repo.deleteRecord', { 65 + data: { 66 + repo: currentAccount!.did, 67 + collection: 'app.bsky.feed.post', 68 + rkey: uri.rkey, 69 + }, 70 + }); 71 + 72 + onPostDelete?.(); 73 + return; 74 + } 75 + 76 + throw err; 77 + }, 78 + ); 39 79 }; 40 80 41 81 return (