diff --git a/src/components/Collapsible.tsx b/src/components/Collapsible.tsx index 36bc979..1131713 100644 --- a/src/components/Collapsible.tsx +++ b/src/components/Collapsible.tsx @@ -10,10 +10,11 @@ type Props = { export function Collapsible(props: Props) { return ( - + {props.trigger} + {/* Content cannot have y padding b/c it breaks animation */} {props.children} diff --git a/src/components/editor/CodeEditor.tsx b/src/components/editor/CodeEditor.tsx index a76a37a..1b56b54 100644 --- a/src/components/editor/CodeEditor.tsx +++ b/src/components/editor/CodeEditor.tsx @@ -101,24 +101,37 @@ export function CodeEditor(props: Props) { } }); + const [showCode, setShowCode] = createSignal(false); + return (
-
- - +
+ + + + +
{props.error}
-
+
); } diff --git a/src/components/editor/QrEditor.tsx b/src/components/editor/QrEditor.tsx index 959a644..3e49b25 100644 --- a/src/components/editor/QrEditor.tsx +++ b/src/components/editor/QrEditor.tsx @@ -1,6 +1,6 @@ import Pencil from "lucide-solid/icons/pencil"; import Trash2 from "lucide-solid/icons/trash-2"; -import { For, Show, batch, createSignal, onMount } from "solid-js"; +import { For, Show, batch, createSignal, onMount, type JSX } from "solid-js"; import { createStore } from "solid-js/store"; import { Dynamic } from "solid-js/web"; import { @@ -70,15 +70,15 @@ export function Editor(props: Props) { onMount(async () => { const storedFuncKeys = localStorage.getItem(USER_FUNC_KEYS_KEY); - if (storedFuncKeys == null) return; + if (storedFuncKeys != null) { + const keys = storedFuncKeys.split(","); + for (const key of keys) { + const funcCode = localStorage.getItem(key); + if (funcCode == null) continue; - const keys = storedFuncKeys.split(","); - for (const key of keys) { - const funcCode = localStorage.getItem(key); - if (funcCode == null) continue; - - const thumb = localStorage.getItem(`${key}_thumb`) ?? FALLBACK_THUMB; - setUserFuncs(userFuncs.length, { key, thumb }); + const thumb = localStorage.getItem(`${key}_thumb`) ?? FALLBACK_THUMB; + setUserFuncs(userFuncs.length, { key, thumb }); + } } // @ts-expect-error adding keys below @@ -96,7 +96,6 @@ export function Editor(props: Props) { ); } const thumb = localStorage.getItem(`${key}_thumb`) ?? FALLBACK_THUMB; - console.log(key, thumb.length); thumbs[key as keyof typeof PRESET_MODULES] = thumb; } setPresetThumbs(thumbs); @@ -239,234 +238,257 @@ export function Editor(props: Props) { setUserFuncs(userFuncs.length, { key, thumb: FALLBACK_THUMB }); localStorage.setItem(USER_FUNC_KEYS_KEY, keys.join(",")); setRenderFuncKey(key); - userSetCode(code, false); + userSetCode(code, true); }; return (
setInputQr("text", s)} /> - + - -
-
Render function
-
- - {([key, preset]) => ( -
{ - setRenderFuncKey(key); - // @ts-expect-error assigning narrow to wider is ok b/c params validated - internalSetCode(preset); - }} - > -
+ +
+
+
+
Render function
+ +
+ } + onOpenAutoFocus={(e) => e.preventDefault()} + > + {(close) => { + const [rename, setRename] = createSignal(renderFuncKey()); + const [duplicate, setDuplicate] = createSignal(false); + + let ref: HTMLInputElement; + onMount(() => ref.focus()); + return ( + <> + duplicate() && setDuplicate(false)} + placeholder={renderFuncKey()} + /> +
+ + {rename()} already exists. + +
+ { + if (rename() === renderFuncKey()) return close(); + + const userFuncKeys = Object.values(userFuncs).map( + (func) => func.key + ); + + if ( + Object.keys(PRESET_MODULES).includes( + rename() + ) || + userFuncKeys.includes(rename()) + ) { + setDuplicate(true); + } else { + localStorage.removeItem(renderFuncKey()); + localStorage.setItem(rename(), code()); + setUserFuncs( + userFuncKeys.indexOf(renderFuncKey()), + "key", + rename() + ); + localStorage.setItem( + USER_FUNC_KEYS_KEY, + userFuncKeys.join(",") + ); + + setRenderFuncKey(rename()); + close(); + } + }} + > + Confirm + + + ); + }} +
+ } + > + {(close) => ( + <> +

+ Are you sure you want to delete this function? +

+
+ { + const userFuncKeys = Object.values(userFuncs).map( + (func) => func.key + ); + + setUserFuncs((funcs) => + funcs.filter( + (func) => func.key !== renderFuncKey() + ) + ); + localStorage.removeItem(renderFuncKey()); + + localStorage.setItem( + USER_FUNC_KEYS_KEY, + userFuncKeys.join(",") + ); + + setRenderFuncKey("Square"); + // @ts-expect-error renderSVG narrow to wider is fine b/c valid params + internalSetCode(PRESET_MODULES.Square); + + close(); + }} + > + Confirm + + Cancel +
+ + )} +
+
+
+
+
+ + {([key, preset]) => ( + { + setRenderFuncKey(key); + // @ts-expect-error assigning narrow to wider is ok b/c params validated + internalSetCode(preset); + }} + label={key} + active={renderFuncKey() === key} + > -
-
{key}
-
- )} - - - {(func) => ( -
{ - let storedCode = localStorage.getItem(func.key); - if (storedCode == null) { - storedCode = `Failed to load ${func.key}`; - } - setRenderFuncKey(func.key); - userSetCode(storedCode, false); - }} - > -
- -
-
{func.key}
-
- )} -
- {/* { - if (key === ADD_NEW_FUNC_KEY) { - createAndSelectFunc("render function", PRESET_FUNCS.Square); - } else { - let storedCode; - if (PRESET_FUNCS.hasOwnProperty(key)) { - storedCode = PRESET_FUNCS[key as keyof typeof PRESET_FUNCS]; - } else { - storedCode = localStorage.getItem(key); - if (storedCode == null) { - storedCode = `Failed to load ${key}`; - } - } - setRenderFuncKey(key); - trySetCode(storedCode); + + )} + + + {(func) => ( + { + let storedCode = localStorage.getItem(func.key); + if (storedCode == null) { + storedCode = `Failed to load ${func.key}`; + } + setRenderFuncKey(func.key); + userSetCode(storedCode, false); + }} + label={func.key} + active={renderFuncKey() === func.key} + > + + + )} + + + createAndSelectFunc("custom", PRESET_MODULES.Square.code) } - }} - /> */} - - } - onOpenAutoFocus={(e) => e.preventDefault()} + label="Create new" + active={false} > - {(close) => { - const [rename, setRename] = createSignal(renderFuncKey()); - const [duplicate, setDuplicate] = createSignal(false); - - let ref: HTMLInputElement; - onMount(() => ref.focus()); - return ( - <> - duplicate() && setDuplicate(false)} - placeholder={renderFuncKey()} - /> -
- - {rename()} already exists. - -
- { - if (rename() === renderFuncKey()) return close(); - - const userFuncKeys = Object.values(userFuncs).map( - (func) => func.key - ); - - if ( - Object.keys(PRESET_MODULES).includes(rename()) || - userFuncKeys.includes(rename()) - ) { - setDuplicate(true); - } else { - localStorage.removeItem(renderFuncKey()); - localStorage.setItem(rename(), code()); - setUserFuncs( - userFuncKeys.indexOf(renderFuncKey()), - "key", - rename() - ); - localStorage.setItem( - USER_FUNC_KEYS_KEY, - userFuncKeys.join(",") - ); - - setRenderFuncKey(rename()); - close(); - } - }} - > - Confirm - - - ); - }} -
- } - > - {(close) => ( + + + + +
+
+
+
+ + {([label, { type, ...props }]) => { + return ( <> -

- Are you sure you want to delete this function? -

-
- { - const userFuncKeys = Object.values(userFuncs).map( - (func) => func.key - ); - - setUserFuncs((funcs) => - funcs.filter((func) => func.key !== renderFuncKey()) - ); - localStorage.removeItem(renderFuncKey()); - - localStorage.setItem( - USER_FUNC_KEYS_KEY, - userFuncKeys.join(",") - ); - - setRenderFuncKey("Square"); - // @ts-expect-error renderSVG narrow to wider is fine b/c valid params - internalSetCode(PRESET_MODULES.Square); - - close(); - }} - > - Confirm - - Cancel +
+
{label}
+ {/* @ts-expect-error lose type b/c type and props destructured */} + setParams(label, v)} + />
- )} - - + ); + }} +
-
-
- - {([label, { type, ...props }]) => { - return ( - <> -
-
{label}
- {/* @ts-expect-error lose type b/c type and props destructured */} - setParams(label, v)} - /> -
- - ); + { + if (Object.keys(PRESET_MODULES).includes(renderFuncKey())) { + createAndSelectFunc(renderFuncKey(), code); + } else { + userSetCode(code, true); + } }} -
+ error={compileError()} + clearError={() => setCompileError(null)} + />
- { - if (Object.keys(PRESET_MODULES).includes(renderFuncKey())) { - createAndSelectFunc(renderFuncKey(), code); - } else { - userSetCode(code, true); - } - }} - error={compileError()} - clearError={() => setCompileError(null)} - />
); } + +type PreviewProps = { + label: string; + children: JSX.Element; + onClick: () => void; + active: boolean; +}; +function Preview(props: PreviewProps) { + return ( + + ); +} diff --git a/src/components/editor/Settings.tsx b/src/components/editor/Settings.tsx index 22d88a7..7883539 100644 --- a/src/components/editor/Settings.tsx +++ b/src/components/editor/Settings.tsx @@ -18,7 +18,7 @@ export function Settings() { const { inputQr, setInputQr } = useQrContext(); return ( -
+
Encoding mode