feat: add test emoji page

This commit is contained in:
Paul Makles
2022-07-07 17:33:33 +01:00
parent 13f107d2b9
commit d0b1a4b2f3
7 changed files with 205 additions and 32 deletions

View File

@@ -99,7 +99,7 @@ export default function MemberList({
)}
{entry.type !== "no_offline" && (
<>
{" - "}
{" "}
{entry.users.length}
</>
)}

View File

@@ -0,0 +1,61 @@
import { Server } from "revolt.js";
import { useState } from "preact/hooks";
import { Form } from "@revoltchat/ui";
import { FileUploader } from "../../../controllers/client/jsx/legacy/FileUploads";
interface Props {
server: Server;
}
export function EmojiUploader({ server }: Props) {
const [fileId, setFileId] = useState<string>();
return (
<>
<h3>Upload Emoji</h3>
<Form
schema={{
name: "text",
file: "custom",
}}
data={{
name: {
field: "Name",
palette: "secondary",
},
file: {
element: (
<FileUploader
style="icon"
width={100}
height={100}
fileType="emojis"
behaviour="upload"
previewAfterUpload
maxFileSize={500000}
remove={async () => void setFileId("")}
onUpload={async (id) => void setFileId(id)}
/>
),
},
}}
submitBtn={{
children: "Save",
palette: "secondary",
disabled: !fileId,
}}
onSubmit={async ({ name }) => {
await server.client.api.put(`/custom/emoji/${fileId}`, {
name,
parent: { type: "Server", id: server._id },
});
setFileId("");
}}
/>
</>
);
}

View File

@@ -17,7 +17,11 @@ import { takeError } from "../error";
type BehaviourType =
| { behaviour: "ask"; onChange: (file: File) => void }
| { behaviour: "upload"; onUpload: (id: string) => Promise<void> }
| {
behaviour: "upload";
onUpload: (id: string) => Promise<void>;
previewAfterUpload?: boolean;
}
| {
behaviour: "multi";
onChange: (files: File[]) => void;
@@ -48,7 +52,8 @@ type Props = BehaviourType &
| "icons"
| "avatars"
| "attachments"
| "banners";
| "banners"
| "emojis";
maxFileSize: number;
remove: () => Promise<void>;
};
@@ -114,6 +119,17 @@ export function FileUploader(props: Props) {
const client = useClient();
const [uploading, setUploading] = useState(false);
const [previewFile, setPreviewFile] = useState<File>(null!);
const [generatedPreviewURL, setGeneratedPreviewURL] = useState("");
useEffect(() => {
if (previewFile) {
const url: string = URL.createObjectURL(previewFile);
setGeneratedPreviewURL(url);
return () => URL.revokeObjectURL(url);
}
setGeneratedPreviewURL("");
}, [previewFile]);
function onClick() {
if (uploading) return;
@@ -136,6 +152,10 @@ export function FileUploader(props: Props) {
files[0],
),
);
if (props.previewAfterUpload) {
setPreviewFile(files[0]);
}
}
} catch (err) {
return modalController.push({
@@ -164,7 +184,11 @@ export function FileUploader(props: Props) {
} else {
onClick();
}
} else if (props.previewURL) {
} else if (props.previewURL || previewFile) {
if (previewFile) {
setPreviewFile(null!);
}
props.remove();
} else {
onClick();
@@ -266,7 +290,11 @@ export function FileUploader(props: Props) {
style={{
backgroundImage:
style === "icon"
? `url('${previewURL ?? defaultPreview}')`
? `url('${
generatedPreviewURL ??
previewURL ??
defaultPreview
}')`
: previewURL
? `linear-gradient( rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url('${previewURL}')`
: "none",
@@ -288,7 +316,7 @@ export function FileUploader(props: Props) {
<span onClick={removeOrUpload}>
{uploading ? (
<Text id="app.main.channel.uploading_file" />
) : props.previewURL ? (
) : props.previewURL || previewFile ? (
<Text id="app.settings.actions.remove" />
) : (
<Text id="app.settings.actions.upload" />

View File

@@ -6,6 +6,7 @@ import {
Envelope,
UserX,
Trash,
HappyBeaming,
} from "@styled-icons/boxicons-solid";
import { observer } from "mobx-react-lite";
import { Route, Switch, useHistory, useParams } from "react-router-dom";
@@ -22,6 +23,7 @@ import { modalController } from "../../controllers/modals/ModalController";
import { GenericSettings } from "./GenericSettings";
import { Bans } from "./server/Bans";
import { Categories } from "./server/Categories";
import { Emojis } from "./server/Emojis";
import { Invites } from "./server/Invites";
import { Members } from "./server/Members";
import { Overview } from "./server/Overview";
@@ -68,6 +70,14 @@ export default observer(() => {
title: <Text id="app.settings.server_pages.roles.title" />,
hideTitle: true,
},
{
category: (
<Text id="app.settings.server_pages.customisation.title" />
),
id: "emojis",
icon: <HappyBeaming size={20} />,
title: <Text id="app.settings.server_pages.emojis.title" />,
},
{
category: (
<Text id="app.settings.server_pages.management.title" />
@@ -116,6 +126,11 @@ export default observer(() => {
<Roles server={server} />
</RequiresOnline>
</Route>
<Route path="/server/:server/settings/emojis">
<RequiresOnline>
<Emojis server={server} />
</RequiresOnline>
</Route>
<Route>
<Overview server={server} />
</Route>

View File

@@ -0,0 +1,74 @@
import { observer } from "mobx-react-lite";
import { Server } from "revolt.js";
import styled from "styled-components";
import { Button, Column, Row, Stacked } from "@revoltchat/ui";
import UserShort from "../../../components/common/user/UserShort";
import { EmojiUploader } from "../../../components/settings/customisation/EmojiUploader";
import { modalController } from "../../../controllers/modals/ModalController";
interface Props {
server: Server;
}
const List = styled.div`
gap: 8px;
display: flex;
flex-wrap: wrap;
`;
const Emoji = styled(Column)`
padding: 8px;
border-radius: var(--border-radius);
background: var(--secondary-background);
`;
const Preview = styled.img`
width: 72px;
height: 72px;
object-fit: contain;
border-radius: var(--border-radius);
`;
const UserInfo = styled(Row)`
font-size: 12px;
svg {
width: 14px;
height: 14px;
}
`;
export const Emojis = observer(({ server }: Props) => {
const emoji = [...server.client.emojis.values()].filter(
(x) => x.parent.id === server._id,
);
return (
<Column>
<EmojiUploader server={server} />
<h3>Emojis {emoji.length}</h3>
<List>
{emoji.map((emoji) => (
<Emoji key={emoji._id} centred>
<Stacked>
<Preview src={emoji.imageURL} />
</Stacked>
<span>{`:${emoji.name}:`}</span>
<UserInfo centred>
<UserShort user={emoji.creator} />
</UserInfo>
<Button
palette="plain"
onClick={() =>
modalController.writeText(emoji._id)
}>
Copy ID
</Button>
</Emoji>
))}
</List>
</Column>
);
});