diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json
index a46dbe60e..515e4e71a 100644
--- a/apps/app-frontend/src/locales/en-US/index.json
+++ b/apps/app-frontend/src/locales/en-US/index.json
@@ -20,6 +20,9 @@
"app.settings.tabs.resource-management": {
"message": "Resource management"
},
+ "instance.filter.disabled": {
+ "message": "Disabled projects"
+ },
"instance.filter.updates-available": {
"message": "Updates available"
},
diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json
index 86fe0f97f..df10535bf 100644
--- a/apps/frontend/src/locales/en-US/index.json
+++ b/apps/frontend/src/locales/en-US/index.json
@@ -485,6 +485,81 @@
"project.versions.title": {
"message": "Versions"
},
+ "report.already-reported": {
+ "message": "You've already reported {title}"
+ },
+ "report.already-reported-description": {
+ "message": "You have an open report for this {item} already. You can add more details to your report if you have more information to add."
+ },
+ "report.back-to-item": {
+ "message": "Back to {item}"
+ },
+ "report.body.description": {
+ "message": "Include links and images if possible and relevant. Empty or insufficient reports will be closed and ignored."
+ },
+ "report.body.title": {
+ "message": "Please provide additional context about your report"
+ },
+ "report.checking": {
+ "message": "Checking {item}..."
+ },
+ "report.could-not-find": {
+ "message": "Could not find {item}"
+ },
+ "report.for.violation": {
+ "message": "Violation of Modrinth Rules or Terms of Use"
+ },
+ "report.for.violation.description": {
+ "message": "Examples include malicious, spam, offensive, deceptive, misleading, and illegal content."
+ },
+ "report.form-not-for": {
+ "message": "This form is not for:"
+ },
+ "report.go-to-report": {
+ "message": "Go to report"
+ },
+ "report.not-for.bug-reports": {
+ "message": "Bug reports"
+ },
+ "report.not-for.dmca": {
+ "message": "DMCA takedowns"
+ },
+ "report.not-for.dmca.description": {
+ "message": "See our Copyright Policy."
+ },
+ "report.note.copyright.1": {
+ "message": "Please note that you are *not* submitting a DMCA takedown request, but rather a report of reuploaded content."
+ },
+ "report.note.copyright.2": {
+ "message": "If you meant to file a DMCA takedown request (which is a legal action) instead, please see our Copyright Policy."
+ },
+ "report.note.malicious.1": {
+ "message": "Reports for malicious or deceptive content must include substantial evidence of the behavior, such as code samples."
+ },
+ "report.note.malicious.2": {
+ "message": "Summaries from Microsoft Defender, VirusTotal, or AI malware detection are not sufficient forms of evidence and will not be accepted."
+ },
+ "report.please-report": {
+ "message": "Please report:"
+ },
+ "report.question.content-id": {
+ "message": "What is the ID of the {item}?"
+ },
+ "report.question.content-type": {
+ "message": "What type of content are you reporting?"
+ },
+ "report.question.report-reason": {
+ "message": "Which of Modrinth's rules is this {item} violating?"
+ },
+ "report.report-content": {
+ "message": "Report content to moderators"
+ },
+ "report.report-item": {
+ "message": "Report {title} to moderators"
+ },
+ "report.submit": {
+ "message": "Submit report"
+ },
"revenue.transfers.total": {
"message": "You have withdrawn {amount} in total."
},
diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue
index a17cdae2d..8b79db4b4 100644
--- a/apps/frontend/src/pages/[type]/[id].vue
+++ b/apps/frontend/src/pages/[type]/[id].vue
@@ -631,7 +631,7 @@
auth.user ? reportProject(project.id) : navigateTo('/auth/sign-in'),
color: 'red',
hoverOnly: true,
- shown: !currentMember,
+ shown: !isMember,
},
{ id: 'copy-id', action: () => copyId() },
]"
@@ -1204,6 +1204,10 @@ const members = computed(() => {
return owner ? [owner, ...rest] : rest;
});
+const isMember = computed(
+ () => auth.value.user && allMembers.value.some((x) => x.user.id === auth.value.user.id),
+);
+
const currentMember = computed(() => {
let val = auth.value.user ? allMembers.value.find((x) => x.user.id === auth.value.user.id) : null;
diff --git a/apps/frontend/src/pages/report.vue b/apps/frontend/src/pages/report.vue
index 8c54c9d3d..e44a8a9cd 100644
--- a/apps/frontend/src/pages/report.vue
+++ b/apps/frontend/src/pages/report.vue
@@ -1,99 +1,256 @@
-
-
-
-
Submit a Report
-
-
- Modding should be safe for everyone, so we take abuse and malicious intent seriously
- at Modrinth. If you encounter content that violates our
- Terms of Service or our
- Rules, please report it to
- us here.
-
-
- This form is intended exclusively for reporting abuse or harmful content to Modrinth
- staff. For bugs related to specific projects, please use the project's designated
- Issues link or Discord channel.
-
-
- Your privacy is important to us; rest assured that your identifying information will
- be kept confidential.
-