add report page
This commit is contained in:
@ -1,3 +1,3 @@
|
||||
<div class="flex justify-center items-center w-full">
|
||||
<div class="flex justify-center w-full">
|
||||
<slot />
|
||||
</div>
|
||||
|
5
src/routes/report/+page.svelte
Normal file
5
src/routes/report/+page.svelte
Normal file
@ -0,0 +1,5 @@
|
||||
<div class="h-screen flex justify-center items-center">
|
||||
<h1 class="text-4xl">
|
||||
Reports können nur ingame mittels des <code>/report</code> Befehls erstellt werden
|
||||
</h1>
|
||||
</div>
|
32
src/routes/report/+server.ts
Normal file
32
src/routes/report/+server.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import type { RequestHandler } from '@sveltejs/kit';
|
||||
import { Report, User } from '$lib/server/database';
|
||||
import * as crypto from 'crypto';
|
||||
|
||||
export const POST = (async ({ request, url }) => {
|
||||
const data: { reporter: string; reported: string; reason: string } = await request.json();
|
||||
|
||||
if (data.reporter == undefined || data.reported == undefined || data.reason == undefined)
|
||||
return new Response(null, { status: 400 });
|
||||
|
||||
const reporter = await User.findOne({ where: { uuid: data.reporter } });
|
||||
const reported = await User.findOne({ where: { uuid: data.reported } });
|
||||
|
||||
if (reporter == null || reported == null) return new Response(null, { status: 400 });
|
||||
|
||||
const report = await Report.create({
|
||||
subject: data.reason,
|
||||
body: null,
|
||||
draft: true,
|
||||
url_id: crypto.randomBytes(18).toString('hex'),
|
||||
completed: false,
|
||||
reporter_user_id: reporter.id,
|
||||
reported_user_id: reported.id
|
||||
});
|
||||
|
||||
return new Response(
|
||||
JSON.stringify({ url: `${url.toString().replace(/\/$/, '')}/${report.url_id}` }),
|
||||
{
|
||||
status: 201
|
||||
}
|
||||
);
|
||||
}) satisfies RequestHandler;
|
3
src/routes/report/[...url_id]/+layout.svelte
Normal file
3
src/routes/report/[...url_id]/+layout.svelte
Normal file
@ -0,0 +1,3 @@
|
||||
<div class="flex justify-center items-center w-full min-h-screen h-full">
|
||||
<slot />
|
||||
</div>
|
28
src/routes/report/[...url_id]/+page.server.ts
Normal file
28
src/routes/report/[...url_id]/+page.server.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import type { PageServerLoad } from './$types';
|
||||
import { Report, User } from '$lib/server/database';
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
import { env } from '$env/dynamic/public';
|
||||
|
||||
export const load: PageServerLoad = async ({ params }) => {
|
||||
const report = await Report.findOne({
|
||||
where: { url_id: params.url_id },
|
||||
include: [
|
||||
{ model: User, as: 'reporter' },
|
||||
{ model: User, as: 'reported' }
|
||||
]
|
||||
});
|
||||
|
||||
if (report == null) throw redirect(302, `${env.PUBLIC_BASE_PATH}/`);
|
||||
|
||||
return {
|
||||
draft: report.draft,
|
||||
completed: report.completed,
|
||||
reason: report.subject,
|
||||
reporter: {
|
||||
name: report.reporter.username
|
||||
},
|
||||
reported: {
|
||||
name: report.reported.username
|
||||
}
|
||||
};
|
||||
};
|
32
src/routes/report/[...url_id]/+page.svelte
Normal file
32
src/routes/report/[...url_id]/+page.svelte
Normal file
@ -0,0 +1,32 @@
|
||||
<script lang="ts">
|
||||
import { fly } from 'svelte/transition';
|
||||
import type { PageData } from './$types';
|
||||
import ReportDraft from './ReportDraft.svelte';
|
||||
import ReportCompleted from './ReportCompleted.svelte';
|
||||
import ReportSubmitted from './ReportSubmitted.svelte';
|
||||
|
||||
export let data: PageData;
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<!-- just in case... -->
|
||||
<meta name="robots" content="noindex" />
|
||||
</svelte:head>
|
||||
|
||||
<div class="absolute top-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg">
|
||||
{#if data.draft}
|
||||
<div class="col-[1] row-[1]" transition:fly={{ x: -200, duration: 300 }}>
|
||||
<ReportDraft
|
||||
reason={data.reason}
|
||||
reportedName={data.reported.name}
|
||||
on:submit={() => (data.draft = false)}
|
||||
/>
|
||||
</div>
|
||||
{:else if data.completed}
|
||||
<ReportCompleted />
|
||||
{:else}
|
||||
<div class="col-[1] row-[1]" transition:fly={{ x: 200, duration: 300 }}>
|
||||
<ReportSubmitted />
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
13
src/routes/report/[...url_id]/+server.ts
Normal file
13
src/routes/report/[...url_id]/+server.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import type { RequestHandler } from '@sveltejs/kit';
|
||||
import { Report } from '$lib/server/database';
|
||||
|
||||
export const POST = (async ({ params }) => {
|
||||
const report = await Report.findOne({ where: { url_id: params.url_id } });
|
||||
|
||||
if (report == null) return new Response(null, { status: 400 });
|
||||
|
||||
report.draft = false;
|
||||
await report.save();
|
||||
|
||||
return new Response(null, { status: 200 });
|
||||
}) satisfies RequestHandler;
|
3
src/routes/report/[...url_id]/ReportCompleted.svelte
Normal file
3
src/routes/report/[...url_id]/ReportCompleted.svelte
Normal file
@ -0,0 +1,3 @@
|
||||
<div>
|
||||
<h2 class="text-xl text-center">Dieser Report wurde von einem Admin bearbeitet</h2>
|
||||
</div>
|
67
src/routes/report/[...url_id]/ReportDraft.svelte
Normal file
67
src/routes/report/[...url_id]/ReportDraft.svelte
Normal file
@ -0,0 +1,67 @@
|
||||
<script lang="ts">
|
||||
import Textarea from '$lib/components/Input/Textarea.svelte';
|
||||
import Input from '$lib/components/Input/Input.svelte';
|
||||
import { env } from '$env/dynamic/public';
|
||||
import { page } from '$app/stores';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
export let reportedName: string;
|
||||
export let reason: string;
|
||||
|
||||
async function submitReport() {
|
||||
await fetch(`${env.PUBLIC_BASE_PATH}/report/${$page.params.url_id}`, {
|
||||
method: 'POST'
|
||||
});
|
||||
}
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
|
||||
let submitModal: HTMLDialogElement;
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<h2 class="text-3xl text-center">Report für <code>{reportedName}</code></h2>
|
||||
<form on:submit|preventDefault={() => submitModal.show()}>
|
||||
<div class="space-y-4 my-4">
|
||||
<div>
|
||||
<Input type="text" value={reason} required={true} pickyWidth={false}>
|
||||
<span slot="label">Report Grund</span>
|
||||
</Input>
|
||||
</div>
|
||||
<div>
|
||||
<Textarea required={true} rows={4} label="Details über den Report Grund" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<Input type="submit" value="Reporten" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<dialog class="modal" bind:this={submitModal}>
|
||||
<form method="dialog" class="modal-box">
|
||||
<button class="btn btn-sm btn-circle btn-ghost absolute right-2 top-2">✕</button>
|
||||
<div>
|
||||
<h3 class="font-roboto font-medium text-xl">Report abschicken?</h3>
|
||||
<div class="my-4">
|
||||
<p>
|
||||
Nach dem Abschicken des Reports wird sich ein Moderator schnellstmöglich darum kümmern.
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex flex-row space-x-1">
|
||||
<Input
|
||||
type="submit"
|
||||
value="Abschicken"
|
||||
on:click={async () => {
|
||||
await submitReport();
|
||||
dispatch('submit');
|
||||
}}
|
||||
/>
|
||||
<Input type="submit" value="Abbrechen" />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<form method="dialog" class="modal-backdrop bg-[rgba(0,0,0,.3)]">
|
||||
<button>close</button>
|
||||
</form>
|
||||
</dialog>
|
6
src/routes/report/[...url_id]/ReportSubmitted.svelte
Normal file
6
src/routes/report/[...url_id]/ReportSubmitted.svelte
Normal file
@ -0,0 +1,6 @@
|
||||
<div>
|
||||
<h2 class="text-2xl text-center">Report abgeschickt</h2>
|
||||
<p class="mt-4">
|
||||
Dein Report wurde abgeschickt und wird so schnell wie möglich von einem Admin bearbeitet.
|
||||
</p>
|
||||
</div>
|
Reference in New Issue
Block a user