diff --git a/external/lang b/external/lang index b70b4f39..b40f8ce5 160000 --- a/external/lang +++ b/external/lang @@ -1 +1 @@ -Subproject commit b70b4f395caf4dc4911c5ccbf7188de198875173 +Subproject commit b40f8ce53831a590c0ffdd02f8da9fd35b7a3701 diff --git a/src/components/common/AgeGate.tsx b/src/components/common/AgeGate.tsx index 0dbb8f3e..324005bb 100644 --- a/src/components/common/AgeGate.tsx +++ b/src/components/common/AgeGate.tsx @@ -67,6 +67,7 @@ export default function AgeGate(props: Props) { return ( diff --git a/src/components/common/Emoji.tsx b/src/components/common/Emoji.tsx index f88577cf..05d68f72 100644 --- a/src/components/common/Emoji.tsx +++ b/src/components/common/Emoji.tsx @@ -55,6 +55,7 @@ export default function Emoji({ return ( {emoji}`; } diff --git a/src/components/common/messaging/bars/FilePreview.tsx b/src/components/common/messaging/bars/FilePreview.tsx index 1c4644a1..7d18dc3d 100644 --- a/src/components/common/messaging/bars/FilePreview.tsx +++ b/src/components/common/messaging/bars/FilePreview.tsx @@ -168,7 +168,7 @@ function FileEntry({ return ( = CAN_UPLOAD_AT_ONCE ? "fade" : ""}> - {file.name} + {file.name}
diff --git a/src/components/common/messaging/bars/TypingIndicator.tsx b/src/components/common/messaging/bars/TypingIndicator.tsx index e58a85b0..e319820f 100644 --- a/src/components/common/messaging/bars/TypingIndicator.tsx +++ b/src/components/common/messaging/bars/TypingIndicator.tsx @@ -97,6 +97,7 @@ export function TypingIndicator({ typing }: Props) {
{users.map((user) => ( {embed.icon_url && ( - {channelsArr.length === 0 && } + {channelsArr.length === 0 && ( + + )} {channelsArr.map((x) => { let user; if (x.channel_type === "DirectMessage") { diff --git a/src/components/navigation/right/MemberSidebar.tsx b/src/components/navigation/right/MemberSidebar.tsx index 0f70a03a..0044b4e3 100644 --- a/src/components/navigation/right/MemberSidebar.tsx +++ b/src/components/navigation/right/MemberSidebar.tsx @@ -144,7 +144,9 @@ export function GroupMemberSidebar({ } /> }> - {members.length === 0 && } + {members.length === 0 && ( + + )} {members.map( (user) => user && ( @@ -257,7 +259,9 @@ export function ServerMemberSidebar({ {users.length} }> - {users.length === 0 && } + {users.length === 0 && ( + + )} {users.map( (user) => user && ( diff --git a/src/context/intermediate/modals/Onboarding.tsx b/src/context/intermediate/modals/Onboarding.tsx index b5db4306..160f5212 100644 --- a/src/context/intermediate/modals/Onboarding.tsx +++ b/src/context/intermediate/modals/Onboarding.tsx @@ -40,7 +40,7 @@ export function OnboardingModal({ onClose, callback }: Props) {

- +

diff --git a/src/context/intermediate/popovers/ImageViewer.tsx b/src/context/intermediate/popovers/ImageViewer.tsx index 2bd056ee..b3f049e7 100644 --- a/src/context/intermediate/popovers/ImageViewer.tsx +++ b/src/context/intermediate/popovers/ImageViewer.tsx @@ -37,6 +37,7 @@ export function ImageViewer({ attachment, embed, onClose }: Props) { {attachment && ( <>
e.preventDefault()} + onContextMenu={(e) => e.preventDefault()} />

@@ -112,13 +113,14 @@ export function Component(props: Props) {

selected !== "dark" && setTheme({ preset: "dark" }) } - onContextMenu={e => e.preventDefault()} + onContextMenu={(e) => e.preventDefault()} />

@@ -202,7 +204,12 @@ export function Component(props: Props) { className={styles.button} onClick={() => setEmojiPack("mutant")} data-active={emojiPack === "mutant"}> - e.preventDefault()} /> + e.preventDefault()} + />

Mutant Remix{" "} @@ -219,7 +226,12 @@ export function Component(props: Props) { className={styles.button} onClick={() => setEmojiPack("twemoji")} data-active={emojiPack === "twemoji"}> - e.preventDefault()} /> + e.preventDefault()} + />

Twemoji

@@ -230,7 +242,12 @@ export function Component(props: Props) { className={styles.button} onClick={() => setEmojiPack("openmoji")} data-active={emojiPack === "openmoji"}> - e.preventDefault()} /> + e.preventDefault()} + />

Openmoji

@@ -239,7 +256,12 @@ export function Component(props: Props) { className={styles.button} onClick={() => setEmojiPack("noto")} data-active={emojiPack === "noto"}> - e.preventDefault()} /> + e.preventDefault()} + />

Noto Emoji

diff --git a/src/pages/settings/server/Bans.tsx b/src/pages/settings/server/Bans.tsx index af369d8e..6497bba6 100644 --- a/src/pages/settings/server/Bans.tsx +++ b/src/pages/settings/server/Bans.tsx @@ -1,10 +1,15 @@ -import { Servers } from "revolt.js/dist/api/objects"; +import { XCircle } from "@styled-icons/boxicons-regular"; +import { Servers, Users } from "revolt.js/dist/api/objects"; +import styles from "./Panes.module.scss"; +import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; -import Tip from "../../../components/ui/Tip"; +import UserIcon from "../../../components/common/user/UserIcon"; +import IconButton from "../../../components/ui/IconButton"; +import Preloader from "../../../components/ui/Preloader"; interface Props { server: Servers.Server; @@ -12,26 +17,71 @@ interface Props { export function Bans({ server }: Props) { const client = useContext(AppContext); - const [bans, setBans] = useState(undefined); + const [deleting, setDelete] = useState([]); + const [data, setData] = useState< + | { + users: Pick[]; + bans: Servers.Ban[]; + } + | undefined + >(undefined); useEffect(() => { - client.servers.fetchBans(server._id).then((bans) => setBans(bans)); + client.servers.fetchBans(server._id).then(setData as any); }, []); return ( -
- This section is under construction. - {bans?.map((x) => ( -
- {x._id.user}: {x.reason ?? "no reason"}{" "} - -
- ))} +
+
+ + + + + + + + + +
+ {typeof data === "undefined" && } + {data?.bans.map((x) => { + let user = data.users.find((y) => y._id === x._id.user); + + return ( +
-1}> + + + {user?.username} + +
+ {x.reason ?? ( + + )} +
+ { + setDelete([...deleting, x._id.user]); + + await client.servers.unbanUser( + server._id, + x._id.user, + ); + + setData({ + ...data, + bans: data.bans.filter( + (y) => y._id.user !== x._id.user, + ), + }); + }} + disabled={deleting.indexOf(x._id.user) > -1}> + + +
+ ); + })}
); } diff --git a/src/pages/settings/server/Invites.tsx b/src/pages/settings/server/Invites.tsx index fa69fbe8..594c1c58 100644 --- a/src/pages/settings/server/Invites.tsx +++ b/src/pages/settings/server/Invites.tsx @@ -37,12 +37,20 @@ export function Invites({ server }: Props) { }, []); return ( -
+
- Invite Code - Invitor - Channel - Revoke + + + + + + + + + + + +
{typeof invites === "undefined" && } {invites?.map((invite) => { diff --git a/src/pages/settings/server/Panes.module.scss b/src/pages/settings/server/Panes.module.scss index deb0d421..6837a838 100644 --- a/src/pages/settings/server/Panes.module.scss +++ b/src/pages/settings/server/Panes.module.scss @@ -17,21 +17,31 @@ } } -.invites { +.userList { gap: 8px; display: flex; flex-direction: column; .subtitle { + gap: 8px; display: flex; justify-content: space-between; font-size: 13px; text-transform: uppercase; color: var(--secondary-foreground); font-weight: 700; + + .reason { + text-align: center; + } } - .invite { + .reason { + flex: 2; + } + + .invite, + .ban { gap: 8px; padding: 10px; display: flex; @@ -39,8 +49,8 @@ flex-direction: row; background: var(--secondary-background); - code, - span { + span, + code { flex: 1; }