about summary refs log tree commit diff
path: root/src/components/moderation/ReportDialog/utils/parseReportSubject.ts
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2025-02-28 17:14:02 -0600
committerGitHub <noreply@github.com>2025-02-28 17:14:02 -0600
commit3be9dde92d64ec540a9097f369d64580fae75fa0 (patch)
tree49fa640a660af26a51ffa9b3aab2d1b169210048 /src/components/moderation/ReportDialog/utils/parseReportSubject.ts
parent96f4f6359add6a4f2a37df8f17cf3f2f59f0a2a6 (diff)
downloadvoidsky-3be9dde92d64ec540a9097f369d64580fae75fa0.tar.zst
New reporting flow (#7832)
* Add option to align web dialogs to top

* Add new wait util

* Pipe through feed view to feed components

* Reset unneeded change to main

* Copy over fresh report dialog based on old

* Hack in temp testing data

* Swap in new dialog in all cases but chat

* Cleanup

* Add load and initial error state

* Fill in states

* Add copyright link

* Handle single labeler case

* Comment out debug code

* Improve centering of type in circles

* Open details if Other is selected

* Remove debug code

* Tweak colors

* Bump SDK

* Tweak Admonition for better x-platform styles

* Add retry button

* Add close button

* Remove todo not covered in this PR

* Translate Retry
Diffstat (limited to 'src/components/moderation/ReportDialog/utils/parseReportSubject.ts')
-rw-r--r--src/components/moderation/ReportDialog/utils/parseReportSubject.ts91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/components/moderation/ReportDialog/utils/parseReportSubject.ts b/src/components/moderation/ReportDialog/utils/parseReportSubject.ts
new file mode 100644
index 000000000..b79e49695
--- /dev/null
+++ b/src/components/moderation/ReportDialog/utils/parseReportSubject.ts
@@ -0,0 +1,91 @@
+import {
+  AppBskyActorDefs,
+  AppBskyFeedDefs,
+  AppBskyFeedPost,
+  AppBskyGraphDefs,
+} from '@atproto/api'
+
+import {
+  ParsedReportSubject,
+  ReportSubject,
+} from '#/components/moderation/ReportDialog/types'
+import * as bsky from '#/types/bsky'
+
+export function parseReportSubject(
+  subject: ReportSubject,
+): ParsedReportSubject | undefined {
+  if (!subject) return
+
+  if ('convoId' in subject) {
+    return {
+      type: 'chatMessage',
+      ...subject,
+    }
+  }
+
+  if (
+    AppBskyActorDefs.isProfileViewBasic(subject) ||
+    AppBskyActorDefs.isProfileView(subject) ||
+    AppBskyActorDefs.isProfileViewDetailed(subject)
+  ) {
+    return {
+      type: 'account',
+      did: subject.did,
+      nsid: 'app.bsky.actor.profile',
+    }
+  } else if (AppBskyGraphDefs.isListView(subject)) {
+    return {
+      type: 'list',
+      uri: subject.uri,
+      cid: subject.cid,
+      nsid: 'app.bsky.graph.list',
+    }
+  } else if (AppBskyFeedDefs.isGeneratorView(subject)) {
+    return {
+      type: 'feed',
+      uri: subject.uri,
+      cid: subject.cid,
+      nsid: 'app.bsky.feed.generator',
+    }
+  } else if (AppBskyGraphDefs.isStarterPackView(subject)) {
+    return {
+      type: 'starterPack',
+      uri: subject.uri,
+      cid: subject.cid,
+      nsid: 'app.bsky.graph.starterPack',
+    }
+  } else if (AppBskyFeedDefs.isPostView(subject)) {
+    const record = subject.record
+    const embed = bsky.post.parseEmbed(subject.embed)
+    if (
+      bsky.dangerousIsType<AppBskyFeedPost.Record>(
+        record,
+        AppBskyFeedPost.isRecord,
+      )
+    ) {
+      return {
+        type: 'post',
+        uri: subject.uri,
+        cid: subject.cid,
+        nsid: 'app.bsky.feed.post',
+        attributes: {
+          reply: !!record.reply,
+          image:
+            embed.type === 'images' ||
+            (embed.type === 'post_with_media' && embed.media.type === 'images'),
+          video:
+            embed.type === 'video' ||
+            (embed.type === 'post_with_media' && embed.media.type === 'video'),
+          link:
+            embed.type === 'link' ||
+            (embed.type === 'post_with_media' && embed.media.type === 'link'),
+          quote:
+            embed.type === 'post' ||
+            (embed.type === 'post_with_media' &&
+              (embed.view.type === 'post' ||
+                embed.view.type === 'post_with_media')),
+        },
+      }
+    }
+  }
+}