chore: improve moderation ux (#6035)

* feat: save project review queue filters

* reduce unnecessary network calls + prepr

* missed file

* ui tweaks

* add fucked up

* add label + prepr

* prepr

* update legacy badge labels

* globe

* fix margin

* be more reasonable

* pending state

* fix double review, prepr

* small badge text
This commit is contained in:
Prospector
2026-05-08 01:40:28 -07:00
committed by GitHub
parent 758ed818c8
commit 9c99518497
9 changed files with 475 additions and 233 deletions
+27 -48
View File
@@ -181,56 +181,35 @@ export async function enrichReportBatch(reports: Report[]): Promise<ExtendedRepo
}
// Doesn't need to be in @modrinth/moderation because it is specific to the frontend.
export interface ModerationOwnershipUser {
kind: 'user'
id: string
name: string
icon_url: string | null
}
export interface ModerationOwnershipOrganization {
kind: 'organization'
id: string
name: string
icon_url: string | null
}
export type ModerationOwnership = ModerationOwnershipUser | ModerationOwnershipOrganization
export interface ProjectWithOwnership {
ownership: ModerationOwnership
[key: string]: any
}
export interface ModerationProject {
project: any
owner: TeamMember | null
org: Organization | null
ownership: ModerationOwnership | null
}
export async function enrichProjectBatch(projects: any[]): Promise<ModerationProject[]> {
const teamIds = [...new Set(projects.map((p) => p.team_id).filter(Boolean))]
const orgIds = [...new Set(projects.map((p) => p.organization).filter(Boolean))]
const [teamsData, orgsData]: [TeamMember[][], Organization[]] = await Promise.all([
teamIds.length > 0
? fetchSegmented(teamIds, (ids) => `teams?ids=${asEncodedJsonArray(ids)}`)
: Promise.resolve([]),
orgIds.length > 0
? fetchSegmented(orgIds, (ids) => `organizations?ids=${asEncodedJsonArray(ids)}`, {
apiVersion: 3,
})
: Promise.resolve([]),
])
const cache = useModerationCache()
teamsData.forEach((team) => {
if (team.length > 0) cache.teams.value.set(team[0].team_id, team)
})
orgsData.forEach((org: Organization) => {
cache.orgs.value.set(org.id, org)
})
return projects.map((project) => {
let owner: TeamMember | null = null
let org: Organization | null = null
if (project.team_id) {
const teamMembers = cache.teams.value.get(project.team_id)
if (teamMembers) {
owner = teamMembers.find((member) => member.role === 'Owner') || null
}
}
if (project.organization) {
org = cache.orgs.value.get(project.organization) || null
}
return {
project,
owner,
org,
} as ModerationProject
})
export function toModerationProjects(projects: ProjectWithOwnership[]): ModerationProject[] {
return projects.map(({ ownership, ...project }) => ({
project,
ownership: ownership ?? null,
}))
}