forked from mirrors/pronouns.cc
feat: add report button to profiles
This commit is contained in:
parent
a0bc39bcba
commit
f02e64fca7
4 changed files with 73 additions and 1 deletions
|
@ -14,7 +14,7 @@ type Report struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
UserID xid.ID `json:"user_id"`
|
UserID xid.ID `json:"user_id"`
|
||||||
UserName string `json:"user_name"`
|
UserName string `json:"user_name"`
|
||||||
MemberID *xid.ID `json:"member_id"`
|
MemberID xid.ID `json:"member_id"`
|
||||||
MemberName *string `json:"member_name"`
|
MemberName *string `json:"member_name"`
|
||||||
Reason string `json:"reason"`
|
Reason string `json:"reason"`
|
||||||
ReporterID xid.ID `json:"reporter_id"`
|
ReporterID xid.ID `json:"reporter_id"`
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
import ErrorAlert from "$lib/components/ErrorAlert.svelte";
|
import ErrorAlert from "$lib/components/ErrorAlert.svelte";
|
||||||
import { goto } from "$app/navigation";
|
import { goto } from "$app/navigation";
|
||||||
import renderMarkdown from "$lib/api/markdown";
|
import renderMarkdown from "$lib/api/markdown";
|
||||||
|
import ReportButton from "./ReportButton.svelte";
|
||||||
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
|
@ -149,6 +150,11 @@
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
{#if $userStore && $userStore.id !== data.id}
|
||||||
|
<div class="row">
|
||||||
|
<ReportButton subject="user" reportUrl="/users/{data.id}/reports" />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
{#if data.members.length > 0 || ($userStore && $userStore.id === data.id)}
|
{#if data.members.length > 0 || ($userStore && $userStore.id === data.id)}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
|
60
frontend/src/routes/@[username]/ReportButton.svelte
Normal file
60
frontend/src/routes/@[username]/ReportButton.svelte
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import type { APIError } from "$lib/api/entities";
|
||||||
|
import { apiFetchClient } from "$lib/api/fetch";
|
||||||
|
import ErrorAlert from "$lib/components/ErrorAlert.svelte";
|
||||||
|
import { addToast } from "$lib/toast";
|
||||||
|
import { Button, FormGroup, Icon, Modal, ModalBody, ModalFooter } from "sveltestrap";
|
||||||
|
|
||||||
|
export let subject: string;
|
||||||
|
export let reportUrl: string;
|
||||||
|
|
||||||
|
const MAX_REASON_LENGTH = 2000;
|
||||||
|
let reason = "";
|
||||||
|
|
||||||
|
let error: APIError | null = null;
|
||||||
|
|
||||||
|
let isOpen = false;
|
||||||
|
const toggle = () => (isOpen = !isOpen);
|
||||||
|
|
||||||
|
const doReport = async () => {
|
||||||
|
try {
|
||||||
|
await apiFetchClient<any>(reportUrl, "POST", { reason: reason });
|
||||||
|
error = null;
|
||||||
|
addToast({ header: "Sent report", body: "Successfully sent report!" });
|
||||||
|
toggle();
|
||||||
|
} catch (e) {
|
||||||
|
error = e as APIError;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<Button color="danger" outline on:click={toggle}
|
||||||
|
><Icon name="exclamation-triangle-fill" /> Report {subject}</Button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Modal header="Report {subject}" {isOpen} {toggle}>
|
||||||
|
<ModalBody>
|
||||||
|
{#if error}
|
||||||
|
<ErrorAlert {error} />
|
||||||
|
{/if}
|
||||||
|
<FormGroup floating label="Reason" class="mt-2">
|
||||||
|
<textarea style="min-height: 100px;" class="form-control" bind:value={reason} />
|
||||||
|
</FormGroup>
|
||||||
|
<p class="text-muted mt-3">
|
||||||
|
<Icon name="info-circle-fill" aria-hidden /> Please only report {subject}s for violating the
|
||||||
|
<a class="text-reset" href="/page/terms" target="_blank" rel="noopener noreferrer"
|
||||||
|
>terms of service</a
|
||||||
|
>.
|
||||||
|
</p>
|
||||||
|
</ModalBody>
|
||||||
|
<ModalFooter>
|
||||||
|
<Button
|
||||||
|
color="danger"
|
||||||
|
disabled={!reason || reason.length > MAX_REASON_LENGTH}
|
||||||
|
on:click={doReport}>Report</Button
|
||||||
|
>
|
||||||
|
<Button color="secondary" on:click={toggle}>Cancel</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</Modal>
|
|
@ -10,6 +10,7 @@
|
||||||
import { PUBLIC_BASE_URL } from "$env/static/public";
|
import { PUBLIC_BASE_URL } from "$env/static/public";
|
||||||
import { userStore } from "$lib/store";
|
import { userStore } from "$lib/store";
|
||||||
import renderMarkdown from "$lib/api/markdown";
|
import renderMarkdown from "$lib/api/markdown";
|
||||||
|
import ReportButton from "../ReportButton.svelte";
|
||||||
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
|
@ -86,6 +87,11 @@
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
{#if $userStore && $userStore.id !== data.user.id}
|
||||||
|
<div class="row">
|
||||||
|
<ReportButton subject="member" reportUrl="/members/{data.id}/reports" />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue