From d2b3d37724a999d4cc78c46157593267e29d184e Mon Sep 17 00:00:00 2001
From: tobi <31960611+tsmethurst@users.noreply.github.com>
Date: Tue, 18 Jun 2024 18:18:00 +0200
Subject: [feature/frontend] Reports frontend v2 (#3022)
* use apiutil + paging in admin processor+handlers
* we're making it happen
* fix little whoopsie
* styling for report list
* don't youuuu forget about meee don't don't don't don't
* last bits
* sanitize content before showing in report statuses
* update report docs
---
web/source/package.json | 2 +
web/source/settings/components/fake-profile.tsx | 52 ----
web/source/settings/components/fake-toot.tsx | 56 ----
web/source/settings/components/profile.tsx | 52 ++++
web/source/settings/components/status.tsx | 242 +++++++++++++++
web/source/settings/components/username.tsx | 2 +-
.../settings/lib/query/admin/reports/index.ts | 52 +++-
web/source/settings/lib/query/gts-api.ts | 2 +-
web/source/settings/lib/types/report.ts | 25 +-
web/source/settings/lib/types/status.ts | 83 +++++
web/source/settings/lib/util/index.ts | 43 +++
web/source/settings/style.css | 182 +++++------
.../settings/views/admin/emoji/local/detail.tsx | 6 +-
.../settings/views/admin/emoji/local/new-emoji.tsx | 6 +-
.../admin/http-header-permissions/overview.tsx | 2 +-
.../views/moderation/accounts/detail/index.tsx | 4 +-
.../views/moderation/accounts/detail/util.tsx | 43 ---
.../views/moderation/accounts/search/index.tsx | 2 +-
.../settings/views/moderation/reports/detail.tsx | 335 +++++++++++----------
.../settings/views/moderation/reports/overview.tsx | 97 ------
.../settings/views/moderation/reports/search.tsx | 252 ++++++++++++++++
web/source/settings/views/moderation/router.tsx | 5 +-
web/source/settings/views/user/profile.tsx | 2 +-
web/source/yarn.lock | 88 ++++++
24 files changed, 1089 insertions(+), 546 deletions(-)
delete mode 100644 web/source/settings/components/fake-profile.tsx
delete mode 100644 web/source/settings/components/fake-toot.tsx
create mode 100644 web/source/settings/components/profile.tsx
create mode 100644 web/source/settings/components/status.tsx
create mode 100644 web/source/settings/lib/types/status.ts
create mode 100644 web/source/settings/lib/util/index.ts
delete mode 100644 web/source/settings/views/moderation/accounts/detail/util.tsx
delete mode 100644 web/source/settings/views/moderation/reports/overview.tsx
create mode 100644 web/source/settings/views/moderation/reports/search.tsx
(limited to 'web/source')
diff --git a/web/source/package.json b/web/source/package.json
index e90176308..bce3546d2 100644
--- a/web/source/package.json
+++ b/web/source/package.json
@@ -33,6 +33,7 @@
"react-redux": "^8.1.3",
"redux": "^4.2.0",
"redux-persist": "^6.0.0",
+ "sanitize-html": "^2.13.0",
"skulk": "^0.0.8-fix",
"wouter": "^3.1.0"
},
@@ -49,6 +50,7 @@
"@types/parse-link-header": "^2.0.3",
"@types/psl": "^1.1.1",
"@types/react-dom": "^18.2.8",
+ "@types/sanitize-html": "^2.11.0",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"autoprefixer": "^10.4.19",
diff --git a/web/source/settings/components/fake-profile.tsx b/web/source/settings/components/fake-profile.tsx
deleted file mode 100644
index 4a5157378..000000000
--- a/web/source/settings/components/fake-profile.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- GoToSocial
- Copyright (C) GoToSocial Authors admin@gotosocial.org
- SPDX-License-Identifier: AGPL-3.0-or-later
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-import React from "react";
-
-export default function FakeProfile({ avatar, header, display_name, username, role }) {
- return ( // Keep in sync with web/template/profile.tmpl
-
- );
-}
diff --git a/web/source/settings/components/fake-toot.tsx b/web/source/settings/components/fake-toot.tsx
deleted file mode 100644
index ad0c387a4..000000000
--- a/web/source/settings/components/fake-toot.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- GoToSocial
- Copyright (C) GoToSocial Authors admin@gotosocial.org
- SPDX-License-Identifier: AGPL-3.0-or-later
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-import React from "react";
-import { useVerifyCredentialsQuery } from "../lib/query/oauth";
-
-export default function FakeToot({ children }) {
- const { data: account = {
- avatar: "/assets/default_avatars/GoToSocial_icon1.png",
- display_name: "",
- username: ""
- } } = useVerifyCredentialsQuery();
-
- return (
-
-
-
-
-
-
-
-
- );
-}
diff --git a/web/source/settings/components/profile.tsx b/web/source/settings/components/profile.tsx
new file mode 100644
index 000000000..4a5157378
--- /dev/null
+++ b/web/source/settings/components/profile.tsx
@@ -0,0 +1,52 @@
+/*
+ GoToSocial
+ Copyright (C) GoToSocial Authors admin@gotosocial.org
+ SPDX-License-Identifier: AGPL-3.0-or-later
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+import React from "react";
+
+export default function FakeProfile({ avatar, header, display_name, username, role }) {
+ return ( // Keep in sync with web/template/profile.tmpl
+
+ );
+}
diff --git a/web/source/settings/components/status.tsx b/web/source/settings/components/status.tsx
new file mode 100644
index 000000000..56b061d39
--- /dev/null
+++ b/web/source/settings/components/status.tsx
@@ -0,0 +1,242 @@
+/*
+ GoToSocial
+ Copyright (C) GoToSocial Authors admin@gotosocial.org
+ SPDX-License-Identifier: AGPL-3.0-or-later
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+import React from "react";
+import { useVerifyCredentialsQuery } from "../lib/query/oauth";
+import { MediaAttachment, Status as StatusType } from "../lib/types/status";
+import sanitize from "sanitize-html";
+
+export function FakeStatus({ children }) {
+ const { data: account = {
+ avatar: "/assets/default_avatars/GoToSocial_icon1.png",
+ display_name: "",
+ username: ""
+ } } = useVerifyCredentialsQuery();
+
+ return (
+
+
+
+
+
+
+ (open profile)
+
+
+
+ );
+}
+
+function StatusBody({ status }: { status: StatusType }) {
+ let content: string;
+ if (status.content.length === 0) {
+ content = "[no content set]";
+ } else {
+ // HTML has already been through
+ // the instance sanitizer by now,
+ // but do it again just in case.
+ content = sanitize(status.content);
+ }
+
+ return (
+