feat: ui improvements

This commit is contained in:
AykutSarac 2023-12-24 22:19:12 +03:00
parent c609c59371
commit a5c87be832
No known key found for this signature in database
8 changed files with 68 additions and 45 deletions

View File

@ -157,7 +157,7 @@ export const DownloadModal: React.FC<ModalProps> = ({ opened, onClose }) => {
withPicker={false} withPicker={false}
fullWidth fullWidth
/> />
<Divider my="lg" /> <Divider my="xs" />
<Group justify="right"> <Group justify="right">
<Button leftSection={<FiCopy />} onClick={clipboardImage}> <Button leftSection={<FiCopy />} onClick={clipboardImage}>
Clipboard Clipboard

View File

@ -101,7 +101,7 @@ export const ImportModal: React.FC<ModalProps> = ({ opened, onClose }) => {
<StyledFileName>{jsonFile?.name ?? "None"}</StyledFileName> <StyledFileName>{jsonFile?.name ?? "None"}</StyledFileName>
</StyledUploadWrapper> </StyledUploadWrapper>
</Stack> </Stack>
<Divider py="xs" /> <Divider my="xs" />
<Group justify="right"> <Group justify="right">
<Button onClick={handleImportFile} disabled={!(jsonFile || url)}> <Button onClick={handleImportFile} disabled={!(jsonFile || url)}>
Import Import

View File

@ -1,5 +1,15 @@
import React from "react"; import React from "react";
import { Stack, Modal, Button, ModalProps, Text, Anchor, Group, TextInput } from "@mantine/core"; import {
Stack,
Modal,
Button,
ModalProps,
Text,
Anchor,
Group,
TextInput,
Divider,
} from "@mantine/core";
import { VscLinkExternal } from "react-icons/vsc"; import { VscLinkExternal } from "react-icons/vsc";
import useJsonQuery from "src/hooks/useJsonQuery"; import useJsonQuery from "src/hooks/useJsonQuery";
@ -28,6 +38,7 @@ export const JQModal: React.FC<ModalProps> = ({ opened, onClose }) => {
value={query} value={query}
onChange={e => setQuery(e.currentTarget.value)} onChange={e => setQuery(e.currentTarget.value)}
/> />
<Divider my="xs" />
<Group justify="right"> <Group justify="right">
<Button onClick={onApply}>Display on Graph</Button> <Button onClick={onApply}>Display on Graph</Button>
</Group> </Group>

View File

@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import { Stack, Modal, Button, ModalProps, Textarea } from "@mantine/core"; import { Modal, Button, ModalProps, Textarea, Divider } from "@mantine/core";
import { decode } from "jsonwebtoken"; import { decode } from "jsonwebtoken";
import useFile from "src/store/useFile"; import useFile from "src/store/useFile";
@ -18,22 +18,18 @@ export const JWTModal: React.FC<ModalProps> = ({ opened, onClose }) => {
return ( return (
<Modal title="Decode JSON Web Token" opened={opened} onClose={onClose} centered> <Modal title="Decode JSON Web Token" opened={opened} onClose={onClose} centered>
<Stack py="sm"> <Textarea
<Textarea placeholder="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikhlcm93YW5kIiwidXJsIjoiaHR0cHM6Ly9oZXJvd2FuZC5jb20iLCJpYXQiOjE1MTYyMzkwMjJ9.Tmm3Miq6KWCF_QRn3iERhhXThJzv4LQPKYwBhYUld88"
placeholder="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikhlcm93YW5kIiwidXJsIjoiaHR0cHM6Ly9oZXJvd2FuZC5jb20iLCJpYXQiOjE1MTYyMzkwMjJ9.Tmm3Miq6KWCF_QRn3iERhhXThJzv4LQPKYwBhYUld88" value={token}
value={token} onChange={e => setToken(e.target.value)}
onChange={e => setToken(e.target.value)} autosize
fz="sm" minRows={4}
fw={700} data-autofocus
minRows={8} />
data-autofocus <Divider my="xs" />
> <Button onClick={resolve} fullWidth>
Share Link Resolve
</Textarea> </Button>
<Button onClick={resolve} fullWidth>
Resolve
</Button>
</Stack>
</Modal> </Modal>
); );
}; };

View File

@ -1,8 +1,8 @@
import React from "react"; import React from "react";
import { Stack, Modal, Button, ModalProps, Text, Anchor, Group } from "@mantine/core"; import { Stack, Modal, Button, ModalProps, Text, Anchor, Group, Divider } from "@mantine/core";
import Editor from "@monaco-editor/react"; import Editor from "@monaco-editor/react";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { VscLock } from "react-icons/vsc"; import { VscLinkExternal, VscLock } from "react-icons/vsc";
import useConfig from "src/store/useConfig"; import useConfig from "src/store/useConfig";
import useFile from "src/store/useFile"; import useFile from "src/store/useFile";
import useModal from "src/store/useModal"; import useModal from "src/store/useModal";
@ -12,7 +12,25 @@ export const SchemaModal: React.FC<ModalProps> = ({ opened, onClose }) => {
const isPremium = useUser(state => state.premium); const isPremium = useUser(state => state.premium);
const showPremiumModal = useModal(state => state.setVisible("premium")); const showPremiumModal = useModal(state => state.setVisible("premium"));
const setJsonSchema = useFile(state => state.setJsonSchema); const setJsonSchema = useFile(state => state.setJsonSchema);
const [schema, setSchema] = React.useState(""); const [schema, setSchema] = React.useState(
JSON.stringify(
{
$schema: "http://json-schema.org/draft-04/schema#",
title: "Product",
description: "A product from Acme's catalog",
type: "object",
properties: {
id: {
description: "The unique identifier for a product",
type: "integer",
},
},
required: ["id"],
},
null,
2
)
);
const darkmodeEnabled = useConfig(state => (state.darkmodeEnabled ? "vs-dark" : "light")); const darkmodeEnabled = useConfig(state => (state.darkmodeEnabled ? "vs-dark" : "light"));
const onApply = () => { const onApply = () => {
@ -39,12 +57,10 @@ export const SchemaModal: React.FC<ModalProps> = ({ opened, onClose }) => {
return ( return (
<Modal title="JSON Schema" size="lg" opened={opened} onClose={onClose} centered> <Modal title="JSON Schema" size="lg" opened={opened} onClose={onClose} centered>
<Stack py="sm"> <Stack py="sm">
<Text fz="sm"> <Text fz="sm">Any validation failures are shown at the bottom toolbar of pane.</Text>
Any validation failures are shown at the bottom toolbar of pane.{" "} <Anchor fz="sm" target="_blank" href="https://niem.github.io/json/sample-schema/">
<Anchor target="_blank" href="https://json-schema.org/"> View Examples <VscLinkExternal />
What is a JSON Schema? </Anchor>
</Anchor>
</Text>
<Editor <Editor
value={schema ?? ""} value={schema ?? ""}
theme={darkmodeEnabled} theme={darkmodeEnabled}
@ -59,7 +75,8 @@ export const SchemaModal: React.FC<ModalProps> = ({ opened, onClose }) => {
}, },
}} }}
/> />
<Group justify="right"> <Divider my="xs" />
<Group p="0" justify="right">
<Button variant="outline" onClick={onClear} disabled={!schema}> <Button variant="outline" onClick={onClear} disabled={!schema}>
Clear Clear
</Button> </Button>

View File

@ -1,7 +1,6 @@
import React from "react"; import React from "react";
import Link from "next/link"; import Link from "next/link";
import { Menu, Avatar, Text } from "@mantine/core"; import { Menu, Avatar, Text } from "@mantine/core";
import { MdOutlineWorkspacePremium } from "react-icons/md";
import { VscSignIn, VscFeedback, VscSignOut } from "react-icons/vsc"; import { VscSignIn, VscFeedback, VscSignOut } from "react-icons/vsc";
import useModal from "src/store/useModal"; import useModal from "src/store/useModal";
import useUser from "src/store/useUser"; import useUser from "src/store/useUser";
@ -9,7 +8,6 @@ import * as Styles from "./styles";
export const AccountMenu = () => { export const AccountMenu = () => {
const user = useUser(state => state.user); const user = useUser(state => state.user);
const premium = useUser(state => state.premium);
const logout = useUser(state => state.logout); const logout = useUser(state => state.logout);
const setVisible = useModal(state => state.setVisible); const setVisible = useModal(state => state.setVisible);
@ -47,17 +45,6 @@ export const AccountMenu = () => {
</Menu.Item> </Menu.Item>
</Link> </Link>
)} )}
{!premium && (
<Menu.Item
leftSection={<MdOutlineWorkspacePremium color="red" />}
onClick={() => setVisible("premium")(true)}
closeMenuOnClick
>
<Text variant="gradient" fw="bold" gradient={{ from: "orange", to: "red" }} size="xs">
Get Premium
</Text>
</Menu.Item>
)}
{user && ( {user && (
<> <>
<Menu.Divider /> <Menu.Divider />

View File

@ -1,14 +1,16 @@
import React from "react"; import React from "react";
import { Flex, Group, Select } from "@mantine/core"; import { Flex, Group, Select, Text } from "@mantine/core";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
import { AiOutlineFullscreen } from "react-icons/ai"; import { AiOutlineFullscreen } from "react-icons/ai";
import { FiDownload } from "react-icons/fi"; import { FiDownload } from "react-icons/fi";
import { MdWorkspacePremium } from "react-icons/md";
import { SearchInput } from "src/components/SearchInput"; import { SearchInput } from "src/components/SearchInput";
import { FileFormat } from "src/enums/file.enum"; import { FileFormat } from "src/enums/file.enum";
import { JSONCrackLogo } from "src/layout/JsonCrackLogo"; import { JSONCrackLogo } from "src/layout/JsonCrackLogo";
import useFile from "src/store/useFile"; import useFile from "src/store/useFile";
import useJson from "src/store/useJson"; import useJson from "src/store/useJson";
import useModal from "src/store/useModal"; import useModal from "src/store/useModal";
import useUser from "src/store/useUser";
import { AccountMenu } from "./AccountMenu"; import { AccountMenu } from "./AccountMenu";
import { Logo } from "./Logo"; import { Logo } from "./Logo";
import { OptionsMenu } from "./OptionsMenu"; import { OptionsMenu } from "./OptionsMenu";
@ -34,6 +36,7 @@ export const Toolbar: React.FC<{ isWidget?: boolean }> = ({ isWidget = false })
const setFormat = useFile(state => state.setFormat); const setFormat = useFile(state => state.setFormat);
const format = useFile(state => state.format); const format = useFile(state => state.format);
const premium = useUser(state => state.premium);
const handleSave = () => { const handleSave = () => {
const a = document.createElement("a"); const a = document.createElement("a");
@ -86,6 +89,15 @@ export const Toolbar: React.FC<{ isWidget?: boolean }> = ({ isWidget = false })
</Group> </Group>
)} )}
<Group gap="xs" justify="right" w="100%" style={{ flexWrap: "nowrap" }}> <Group gap="xs" justify="right" w="100%" style={{ flexWrap: "nowrap" }}>
{!premium && (
<Styles.StyledToolElement onClick={() => setVisible("premium")(true)}>
<Text display="flex" c="teal" fz="xs" fw="bold" style={{ textAlign: "center", gap: 4 }}>
<MdWorkspacePremium size="18" />
Get Premium
</Text>
</Styles.StyledToolElement>
)}
<SearchInput /> <SearchInput />
{!isWidget && ( {!isWidget && (
<> <>

View File

@ -81,7 +81,7 @@ const ExternalMode = () => {
variant="light" variant="light"
color="red" color="red"
> >
Donate
</Button> </Button>
</Group> </Group>
</Modal> </Modal>