configuredSettings.set(setting, value)"
/>
+
+ configuredSettings.set(setting, value === undefined ? undefined : Number(value))
+ "
+ >
+
{{ setting.unit }}
+
+
diff --git a/apps/frontend/src/components/ui/moderation/settings/ModerationTechReview.vue b/apps/frontend/src/components/ui/moderation/settings/ModerationTechReview.vue
new file mode 100644
index 00000000000..dc428d54e33
--- /dev/null
+++ b/apps/frontend/src/components/ui/moderation/settings/ModerationTechReview.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/TechRevClassItem.vue b/apps/frontend/src/components/ui/moderation/tech-review/TechRevClassItem.vue
deleted file mode 100644
index 9432cc139b6..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/TechRevClassItem.vue
+++ /dev/null
@@ -1,362 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ truncatedPath }}
-
-
-
-
-
-
-
-
-
- Loading source...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{
- flag.issueType.replace(/_/g, ' ')
- }}
-
- {{ capitalizeString(flag.detail.severity) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source code not available or failed to decompile for this file.
-
-
-
-
-
-
-
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileActions.vue b/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileActions.vue
deleted file mode 100644
index de3c5d7e89c..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileActions.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ formatMessage(messages.slicer) }}
-
-
-
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileItem.vue b/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileItem.vue
deleted file mode 100644
index 51e7217d332..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFileItem.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- {{ fileSizeLabel }}
-
-
-
-
- {{ formatMessage(messages.manual) }}
-
-
- {{ formatMessage(messages.noFlags) }}
-
-
-
-
-
-
-
-
-
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFilesTab.vue b/apps/frontend/src/components/ui/moderation/tech-review/TechRevFilesTab.vue
deleted file mode 100644
index 6228ef2e9cc..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/TechRevFilesTab.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/TechRevThreadTab.vue b/apps/frontend/src/components/ui/moderation/tech-review/TechRevThreadTab.vue
deleted file mode 100644
index 18d95256794..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/TechRevThreadTab.vue
+++ /dev/null
@@ -1,416 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Set status
-
-
-
-
-
-
-
-
diff --git a/apps/frontend/src/components/ui/moderation/tech-review/use-tech-review-sources.ts b/apps/frontend/src/components/ui/moderation/tech-review/use-tech-review-sources.ts
deleted file mode 100644
index 223eaede567..00000000000
--- a/apps/frontend/src/components/ui/moderation/tech-review/use-tech-review-sources.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-import type { Labrinth } from '@modrinth/api-client'
-import { injectModrinthClient } from '@modrinth/ui'
-import { type MaybeRefOrGetter, reactive, toValue } from 'vue'
-
-const CACHE_TTL = 24 * 60 * 60 * 1000
-const CACHE_KEY_PREFIX = 'tech_review_source_'
-
-type CachedSource = {
- source: string
- timestamp: number
-}
-
-function getCachedSource(detailId: string): string | null {
- try {
- const cached = localStorage.getItem(`${CACHE_KEY_PREFIX}${detailId}`)
- if (!cached) return null
-
- const data: CachedSource = JSON.parse(cached)
- const now = Date.now()
-
- if (now - data.timestamp > CACHE_TTL) {
- localStorage.removeItem(`${CACHE_KEY_PREFIX}${detailId}`)
- return null
- }
-
- return data.source
- } catch {
- return null
- }
-}
-
-function setCachedSource(detailId: string, source: string): void {
- try {
- const data: CachedSource = {
- source,
- timestamp: Date.now(),
- }
- localStorage.setItem(`${CACHE_KEY_PREFIX}${detailId}`, JSON.stringify(data))
- } catch (error) {
- console.error('Failed to cache source:', error)
- }
-}
-
-function clearExpiredCache(): void {
- try {
- const now = Date.now()
- const keys = Object.keys(localStorage)
-
- for (const key of keys) {
- if (key.startsWith(CACHE_KEY_PREFIX)) {
- const cached = localStorage.getItem(key)
- if (cached) {
- const data: CachedSource = JSON.parse(cached)
- if (now - data.timestamp > CACHE_TTL) {
- localStorage.removeItem(key)
- }
- }
- }
- }
- } catch (error) {
- console.error('Failed to clear expired cache:', error)
- }
-}
-
-export function useTechReviewSources(
- issues: MaybeRefOrGetter
,
- includeHidden: MaybeRefOrGetter = false,
-) {
- const client = injectModrinthClient()
-
- if (import.meta.client) {
- clearExpiredCache()
- }
-
- const loadingIssues = reactive>(new Set())
- const decompiledSources = reactive