From c8f69a7eef60951c4e981b5eaff6c05b02dac957 Mon Sep 17 00:00:00 2001 From: rusconn Date: Thu, 1 Jun 2023 15:28:32 +0900 Subject: [PATCH] refactor: make some states grouped --- app/converters/json-yaml/page.tsx | 80 ++++++++++++++------------- app/encoders-decoders/base64/page.tsx | 37 +++++++------ app/encoders-decoders/html/page.tsx | 32 +++++++---- app/encoders-decoders/url/page.tsx | 32 +++++++---- 4 files changed, 101 insertions(+), 80 deletions(-) diff --git a/app/converters/json-yaml/page.tsx b/app/converters/json-yaml/page.tsx index 44f2632..90cb37d 100644 --- a/app/converters/json-yaml/page.tsx +++ b/app/converters/json-yaml/page.tsx @@ -31,50 +31,52 @@ const two = " "; const four = " "; export default function Page() { - const [indentation, setIndentation] = useState(two); - const [json, setJson] = useState('{\n "foo": "bar"\n}'); - const [yaml, setYaml] = useState("foo: bar"); + const [form, setForm] = useState({ + indentation: two, + json: '{\n "foo": "bar"\n}', + yaml: "foo: bar", + }); - const setJsonReactively = useCallback( - (text: string) => { - const parsed = safeJsonParse(text); + const setJsonReactively = useCallback((text: string) => { + const parsed = safeJsonParse(text); - setJson(text); - setYaml( - O.isNone(parsed) - ? "" - : YAML.stringify(parsed.value, { indent: indentation.length, simpleKeys: true }) - ); - }, - [indentation.length] - ); + setForm(prev => ({ + ...prev, + json: text, + yaml: O.isNone(parsed) + ? "" + : YAML.stringify(parsed.value, { indent: prev.indentation.length, simpleKeys: true }), + })); + }, []); - const setYamlReactively = useCallback( - (text: string) => { - const parsed = safeYamlParse(text, (_, v) => v, { merge: true }); + const setYamlReactively = useCallback((text: string) => { + const parsed = safeYamlParse(text, (_, v) => v, { merge: true }); - setYaml(text); - setJson(O.isNone(parsed) ? "" : JSON.stringify(parsed.value, null, indentation)); - }, - [indentation] - ); + setForm(prev => ({ + ...prev, + yaml: text, + json: O.isNone(parsed) ? "" : JSON.stringify(parsed.value, null, prev.indentation), + })); + }, []); const clearBoth = useCallback(() => { - setJson(""); - setYaml(""); + setForm(prev => ({ ...prev, json: "", yaml: "" })); }, []); const onIndentationChange: SelectProps["onValueChange"] = value => { - setIndentation(value); + const parsed = safeJsonParse(form.json); - const parsed = safeJsonParse(json); + const jsonYaml = O.isNone(parsed) + ? { json: "", yaml: "" } + : { + json: JSON.stringify(parsed.value, null, value), + yaml: YAML.stringify(parsed.value, { indent: value.length, simpleKeys: true }), + }; - if (O.isNone(parsed)) { - clearBoth(); - } else { - setJson(JSON.stringify(parsed.value, null, value)); - setYaml(YAML.stringify(parsed.value, { indent: value.length, simpleKeys: true })); - } + setForm({ + indentation: value, + ...jsonYaml, + }); }; const onJsonChange: EditorProps["onChange"] = value => setJsonReactively(value ?? ""); @@ -87,12 +89,12 @@ export default function Page() { icon={indentationIcon} title="Indentation" control={ - - + 2 spaces @@ -137,8 +139,8 @@ export default function Page() { [setYamlReactively] ); - const jsonCopyButton = ; - const yamlCopyButton = ; + const jsonCopyButton = ; + const yamlCopyButton = ; const clearButton = useMemo( () => , @@ -163,10 +165,10 @@ export default function Page() {
- + - +
diff --git a/app/encoders-decoders/base64/page.tsx b/app/encoders-decoders/base64/page.tsx index 2613516..bfa8a0a 100644 --- a/app/encoders-decoders/base64/page.tsx +++ b/app/encoders-decoders/base64/page.tsx @@ -14,29 +14,32 @@ import { PageRootSection } from "@/components/page-root-section"; import { PageSection } from "@/components/page-section"; export default function Page() { - const [decoded, setDecoded] = useState("😀😂🤣"); - const [encoded, setEncoded] = useState("8J+YgPCfmILwn6Sj"); + const [form, setForm] = useState({ + decoded: "😀😂🤣", + encoded: "8J+YgPCfmILwn6Sj", + }); const setDecodedReactively = useCallback((text: string) => { - setDecoded(text); - setEncoded(encode(text)); + setForm({ + decoded: text, + encoded: encode(text), + }); }, []); const setEncodedReactively = useCallback((text: string) => { - setEncoded(text); - const newDecoded = decode(text); - if (isValid(text) && !newDecoded.includes("�")) { - setDecoded(newDecoded); - } else { - setDecoded(""); - } + setForm({ + encoded: text, + decoded: isValid(text) && !newDecoded.includes("�") ? newDecoded : "", + }); }, []); const clearBoth = useCallback(() => { - setDecoded(""); - setEncoded(""); + setForm({ + decoded: "", + encoded: "", + }); }, []); const onDecodedChange: TextareaProps["onChange"] = ({ currentTarget: { value } }) => @@ -69,8 +72,8 @@ export default function Page() { [setEncodedReactively] ); - const decodedCopyButton = useMemo(() => , [decoded]); - const encodedCopyButton = useMemo(() => , [encoded]); + const decodedCopyButton = useMemo(() => , [form.decoded]); + const encodedCopyButton = useMemo(() => , [form.encoded]); const clearButton = useMemo( () => , @@ -88,10 +91,10 @@ export default function Page() { return ( -