mirror of
https://github.com/stoatchat/for-legacy-web.git
synced 2026-03-06 17:11:55 +00:00
feat: add test emoji page
This commit is contained in:
@@ -99,7 +99,7 @@ export default function MemberList({
|
||||
)}
|
||||
{entry.type !== "no_offline" && (
|
||||
<>
|
||||
{" - "}
|
||||
{" – "}
|
||||
{entry.users.length}
|
||||
</>
|
||||
)}
|
||||
|
||||
61
src/components/settings/customisation/EmojiUploader.tsx
Normal file
61
src/components/settings/customisation/EmojiUploader.tsx
Normal 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("");
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
74
src/pages/settings/server/Emojis.tsx
Normal file
74
src/pages/settings/server/Emojis.tsx
Normal 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>
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user