refactor: memoize configuration on export

This commit is contained in:
rusconn
2023-06-24 14:35:28 +09:00
parent 822a8db8f9
commit f8bceb7a4c
6 changed files with 129 additions and 147 deletions

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useState } from "react";
import { toolGroups } from "@/config/tools"; import { toolGroups } from "@/config/tools";
import * as baselib from "@/lib/base"; import * as baselib from "@/lib/base";
@@ -58,8 +58,7 @@ export default function Page() {
const onOctChange: InputProps["onChange"] = ({ currentTarget: { value } }) => trySetOct(value); const onOctChange: InputProps["onChange"] = ({ currentTarget: { value } }) => trySetOct(value);
const onBinChange: InputProps["onChange"] = ({ currentTarget: { value } }) => trySetBin(value); const onBinChange: InputProps["onChange"] = ({ currentTarget: { value } }) => trySetBin(value);
const formatNumberConfig = useMemo( const formatNumberConfig = (
() => (
<Configuration <Configuration
icon={<icons.CaseSensitive size={24} />} icon={<icons.CaseSensitive size={24} />}
title="Format number" title="Format number"
@@ -73,10 +72,7 @@ export default function Page() {
/> />
} }
/> />
),
[format]
); );
const decPasteButton = <PasteButton onClipboardRead={trySetDec} />; const decPasteButton = <PasteButton onClipboardRead={trySetDec} />;
const hexPasteButton = <PasteButton onClipboardRead={trySetHex} />; const hexPasteButton = <PasteButton onClipboardRead={trySetHex} />;
const octPasteButton = <PasteButton onClipboardRead={trySetOct} />; const octPasteButton = <PasteButton onClipboardRead={trySetOct} />;

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useState } from "react";
import { toolGroups } from "@/config/tools"; import { toolGroups } from "@/config/tools";
import { safeJsonParse } from "@/lib/json"; import { safeJsonParse } from "@/lib/json";
@@ -41,8 +41,7 @@ export default function Page() {
const onJsonChange: EditorProps["onChange"] = value => setInput(value ?? ""); const onJsonChange: EditorProps["onChange"] = value => setInput(value ?? "");
const indentationConfig = useMemo( const indentationConfig = (
() => (
<Configuration <Configuration
icon={<icons.Space size={24} className="-translate-y-1.5" />} icon={<icons.Space size={24} className="-translate-y-1.5" />}
title="Indentation" title="Indentation"
@@ -63,8 +62,6 @@ export default function Page() {
</Select> </Select>
} }
/> />
),
[indentation]
); );
const inputPasteButton = <PasteButton onClipboardRead={setInput} />; const inputPasteButton = <PasteButton onClipboardRead={setInput} />;

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useState } from "react";
import createHash from "create-hash"; import createHash from "create-hash";
import { toolGroups } from "@/config/tools"; import { toolGroups } from "@/config/tools";
@@ -37,8 +37,7 @@ export default function Page() {
const onInputChange: TextareaProps["onChange"] = ({ currentTarget: { value } }) => const onInputChange: TextareaProps["onChange"] = ({ currentTarget: { value } }) =>
setInput(value); setInput(value);
const uppercaseConfig = useMemo( const uppercaseConfig = (
() => (
<Configuration <Configuration
icon={<icons.CaseSensitive size={24} />} icon={<icons.CaseSensitive size={24} />}
title="Uppercase" title="Uppercase"
@@ -52,8 +51,6 @@ export default function Page() {
/> />
} }
/> />
),
[uppercase]
); );
const inputPasteButton = <PasteButton onClipboardRead={setInput} />; const inputPasteButton = <PasteButton onClipboardRead={setInput} />;

View File

@@ -48,11 +48,11 @@ export default function Page() {
const clearUuids = useCallback(() => setUuids([]), []); const clearUuids = useCallback(() => setUuids([]), []);
const onUuidVersionChange: SelectProps["onValueChange"] = value => { const onUuidVersionChange: NonNullable<SelectProps["onValueChange"]> = useCallback(value => {
if (uuidVersions.is(value)) { if (uuidVersions.is(value)) {
setUuidVersion(value); setUuidVersion(value);
} }
}; }, []);
const onGeneratesChange: InputProps["onChange"] = ({ currentTarget: { value } }) => { const onGeneratesChange: InputProps["onChange"] = ({ currentTarget: { value } }) => {
const newGenerates = Number(value); const newGenerates = Number(value);
@@ -67,8 +67,7 @@ export default function Page() {
setUuids([...uuids, ...newUuids]); setUuids([...uuids, ...newUuids]);
}; };
const hyphensConfig = useMemo( const hyphensConfig = (
() => (
<Configuration <Configuration
icon={<icons.Minus size={24} />} icon={<icons.Minus size={24} />}
title="Hyphens" title="Hyphens"
@@ -82,12 +81,9 @@ export default function Page() {
/> />
} }
/> />
),
[hyphens]
); );
const uppercaseConfig = useMemo( const uppercaseConfig = (
() => (
<Configuration <Configuration
icon={<icons.CaseSensitive size={24} />} icon={<icons.CaseSensitive size={24} />}
title="Uppercase" title="Uppercase"
@@ -101,12 +97,9 @@ export default function Page() {
/> />
} }
/> />
),
[uppercase]
); );
const uuidVersionConfig = useMemo( const uuidVersionConfig = (
() => (
<Configuration <Configuration
icon={<icons.Settings2 size={24} />} icon={<icons.Settings2 size={24} />}
title="UUID version" title="UUID version"
@@ -126,8 +119,6 @@ export default function Page() {
</Select> </Select>
} }
/> />
),
[uuidVersion]
); );
const generatesInput = useMemo( const generatesInput = useMemo(

View File

@@ -1,6 +1,5 @@
"use client"; "use client";
import { useMemo } from "react";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import { singleTools } from "@/config/tools"; import { singleTools } from "@/config/tools";
@@ -20,8 +19,7 @@ import { PageSection } from "@/components/page-section";
export default function Page() { export default function Page() {
const { theme = "system", setTheme } = useTheme(); const { theme = "system", setTheme } = useTheme();
const appThemeConfig = useMemo( const appThemeConfig = (
() => (
<Configuration <Configuration
icon={<icons.Paintbrush size={24} />} icon={<icons.Paintbrush size={24} />}
title="App theme" title="App theme"
@@ -42,8 +40,6 @@ export default function Page() {
</Select> </Select>
} }
/> />
),
[setTheme, theme]
); );
return ( return (

View File

@@ -1,3 +1,6 @@
import { memo } from "react";
import equal from "react-fast-compare";
type Props = { type Props = {
icon: React.ReactNode; icon: React.ReactNode;
title: string; title: string;
@@ -5,7 +8,7 @@ type Props = {
control: React.ReactNode; control: React.ReactNode;
}; };
export function Configuration({ icon, title, description, control }: Props) { function RawConfiguration({ icon, title, description, control }: Props) {
return ( return (
<div className="flex h-16 items-center gap-6 rounded border bg-configuration px-4"> <div className="flex h-16 items-center gap-6 rounded border bg-configuration px-4">
{icon} {icon}
@@ -21,3 +24,5 @@ export function Configuration({ icon, title, description, control }: Props) {
</div> </div>
); );
} }
export const Configuration = memo(RawConfiguration, equal);