Files
grungnet/src/modals/EditTokenModal.tsx
T

124 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-07-02 15:54:54 +10:00
import { useState } from "react";
import { Button, Flex, Label, useThemeUI } from "theme-ui";
import SimpleBar from "simplebar-react";
import Modal from "../components/Modal";
import TokenSettings from "../components/token/TokenSettings";
import TokenPreview from "../components/token/TokenPreview";
import { isEmpty } from "../helpers/shared";
import useResponsiveLayout from "../hooks/useResponsiveLayout";
2021-07-13 08:59:28 +10:00
2021-07-09 16:22:35 +10:00
import { Token } from "../types/Token";
2021-07-13 08:59:28 +10:00
import { UpdateTokenEventHandler } from "../contexts/TokenDataContext";
2021-07-02 15:54:54 +10:00
type EditModalProps = {
isOpen: boolean;
onDone: () => void;
token: Token;
2021-07-13 08:59:28 +10:00
onUpdateToken: UpdateTokenEventHandler;
2021-06-02 17:49:31 +10:00
};
2021-07-02 15:54:54 +10:00
function EditTokenModal({
isOpen,
onDone,
token,
onUpdateToken,
}: EditModalProps) {
const { theme } = useThemeUI();
function handleClose() {
setTokenSettingChanges({});
onDone();
}
async function handleSave() {
await applyTokenChanges();
onDone();
}
2021-07-02 15:54:54 +10:00
const [tokenSettingChanges, setTokenSettingChanges] = useState<
Partial<Token>
>({});
2021-07-02 15:54:54 +10:00
function handleTokenSettingsChange(key: string, value: Pick<Token, any>) {
2021-06-02 17:49:31 +10:00
setTokenSettingChanges((prevChanges: any) => ({
...prevChanges,
[key]: value,
}));
}
async function applyTokenChanges() {
if (token && !isEmpty(tokenSettingChanges)) {
// Ensure size value is positive
let verifiedChanges = { ...tokenSettingChanges };
if ("defaultSize" in verifiedChanges) {
verifiedChanges.defaultSize = verifiedChanges.defaultSize || 1;
}
2021-05-20 12:22:07 +10:00
await onUpdateToken(token.id, verifiedChanges);
setTokenSettingChanges({});
}
}
const selectedTokenWithChanges = {
...token,
...tokenSettingChanges,
};
const layout = useResponsiveLayout();
if (!token) {
return null;
}
return (
<Modal
isOpen={isOpen}
onRequestClose={handleClose}
2020-10-09 16:18:52 +11:00
style={{
2021-07-02 15:54:54 +10:00
content: {
maxWidth: layout.modalSize,
width: "calc(100% - 16px)",
padding: 0,
display: "flex",
overflow: "hidden",
},
2020-10-09 16:18:52 +11:00
}}
>
<Flex
sx={{
flexDirection: "column",
width: "100%",
}}
>
<Label pt={2} pb={1} px={3}>
Edit token
</Label>
<SimpleBar
style={{
minHeight: 0,
padding: "16px",
2021-07-09 16:22:35 +10:00
backgroundColor: theme.colors?.muted as string,
margin: "0 8px",
2021-06-12 21:00:30 +10:00
height: "100%",
}}
>
<TokenPreview token={selectedTokenWithChanges} />
<TokenSettings
token={selectedTokenWithChanges}
onSettingsChange={handleTokenSettingsChange}
/>
</SimpleBar>
<Button m={3} onClick={handleSave}>
Save
</Button>
</Flex>
</Modal>
);
}
export default EditTokenModal;