diff --git a/apps/frontend/nuxt.config.ts b/apps/frontend/nuxt.config.ts
index d496beff95..63821f000c 100644
--- a/apps/frontend/nuxt.config.ts
+++ b/apps/frontend/nuxt.config.ts
@@ -258,7 +258,6 @@ export default defineNuxtConfig({
},
},
modules: [
- '@pinia/nuxt',
'floating-vue/nuxt',
// Sentry causes rollup-plugin-inject errors in dev, only enable in production
...(isProduction() ? ['@sentry/nuxt/module'] : []),
diff --git a/apps/frontend/package.json b/apps/frontend/package.json
index 22012b479f..737cdc3ec8 100644
--- a/apps/frontend/package.json
+++ b/apps/frontend/package.json
@@ -46,7 +46,6 @@
"@modrinth/moderation": "workspace:*",
"@modrinth/ui": "workspace:*",
"@modrinth/utils": "workspace:*",
- "@pinia/nuxt": "^0.11.3",
"@sentry/nuxt": "^10.33.0",
"@tanstack/vue-query": "^5.90.7",
"@types/three": "^0.172.0",
@@ -69,8 +68,6 @@
"lru-cache": "^11.2.4",
"markdown-it": "14.1.0",
"pathe": "^1.1.2",
- "pinia": "^3.0.0",
- "pinia-plugin-persistedstate": "^4.4.1",
"prettier": "^3.6.2",
"qrcode.vue": "^3.4.0",
"semver": "^7.5.4",
diff --git a/apps/frontend/src/components/ui/moderation/ModerationReportCard.vue b/apps/frontend/src/components/ui/moderation/ModerationReportCard.vue
index ef77f3146f..6b2ab8da6d 100644
--- a/apps/frontend/src/components/ui/moderation/ModerationReportCard.vue
+++ b/apps/frontend/src/components/ui/moderation/ModerationReportCard.vue
@@ -273,7 +273,7 @@ async function closeReport(reply = false) {
closed: true,
},
})
- updateThread(props.report.thread)
+ await refreshReportCaches()
didCloseReport.value = true
} catch (err: any) {
addNotification({
@@ -292,7 +292,7 @@ async function reopenReport() {
closed: false,
},
})
- updateThread(props.report.thread)
+ await refreshReportCaches()
didCloseReport.value = false
} catch (err: any) {
addNotification({
@@ -309,6 +309,18 @@ const formatDateTime = useFormatDateTime({
dateStyle: 'long',
})
+async function refreshReportCaches() {
+ await Promise.allSettled([refreshThread(), refreshNuxtData('new-moderation-reports')])
+}
+
+async function refreshThread() {
+ const threadId = props.report.thread?.id ?? props.report.thread_id
+ if (!threadId) return
+
+ const thread = await useBaseFetch(`thread/${threadId}`)
+ updateThread(thread)
+}
+
function updateThread(newThread: any) {
if (props.report.thread) {
Object.assign(props.report.thread, newThread)
diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue
index 97e83c06ff..17a7f96f9e 100644
--- a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue
+++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue
@@ -435,6 +435,8 @@ async function batchMarkRemaining(verdict: 'safe' | 'unsafe') {
backToFileList()
}
}
+
+ emit('refetch')
} catch (error) {
console.error('Failed to batch update:', error)
addNotification({
@@ -534,6 +536,8 @@ async function updateDetailStatus(detailId: string, verdict: 'safe' | 'unsafe')
text: `This issue has been flagged as malicious.${otherText}`,
})
}
+
+ emit('refetch')
} catch (error) {
console.error('Failed to update detail status:', error)
addNotification({
diff --git a/apps/frontend/src/components/ui/moderation/checklist/ModerationChecklist.vue b/apps/frontend/src/components/ui/moderation/checklist/ModerationChecklist.vue
index 29e525a906..1b737d9e5c 100644
--- a/apps/frontend/src/components/ui/moderation/checklist/ModerationChecklist.vue
+++ b/apps/frontend/src/components/ui/moderation/checklist/ModerationChecklist.vue
@@ -79,13 +79,13 @@
@@ -112,13 +112,13 @@
@@ -131,9 +131,9 @@
You are done moderating this project!
-
+
There are
- {{ moderationStore.queueLength }} left.
+ {{ moderationQueue.queueLength }} left.
@@ -159,6 +159,7 @@
:disabled="false"
:heading-buttons="false"
:on-image-upload="onUploadHandler"
+ @input="persistGeneratedMessageState"
/>
@@ -331,10 +332,10 @@
class="mt-4 flex grow justify-between gap-2 border-0 border-t-[1px] border-solid border-surface-5 pt-4"
>
-
+
@@ -345,7 +346,7 @@