From b88bcd49fdea0955f2efc8f09a3614c188d22107 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:18:17 -0600 Subject: fix(app): code splitting for web load perf gains --- packages/ui/src/components/list.tsx | 5 +- packages/ui/src/components/markdown.tsx | 3 +- packages/ui/src/context/dialog.tsx | 109 +++++++++++++++------------- packages/ui/src/hooks/use-filtered-list.tsx | 6 +- 4 files changed, 70 insertions(+), 53 deletions(-) (limited to 'packages/ui/src') diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index b94405c81..60161f6dc 100644 --- a/packages/ui/src/components/list.tsx +++ b/packages/ui/src/components/list.tsx @@ -175,12 +175,13 @@ export function List(props: ListProps & { ref?: (ref: ListRef) => void }) fallback={
- {props.emptyMessage ?? "No results"} for "{filter()}" + {props.emptyMessage ?? (grouped.loading ? "Loading" : "No results")} for{" "} + "{filter()}"
} > - + {(group) => (
diff --git a/packages/ui/src/components/markdown.tsx b/packages/ui/src/components/markdown.tsx index 7615d1737..6e40b700a 100644 --- a/packages/ui/src/components/markdown.tsx +++ b/packages/ui/src/components/markdown.tsx @@ -15,6 +15,7 @@ export function Markdown( async (markdown) => { return marked.parse(markdown) }, + { initialValue: "" }, ) return (
) diff --git a/packages/ui/src/context/dialog.tsx b/packages/ui/src/context/dialog.tsx index f85eb48df..8e770750a 100644 --- a/packages/ui/src/context/dialog.tsx +++ b/packages/ui/src/context/dialog.tsx @@ -1,11 +1,11 @@ import { createContext, + createRoot, createSignal, getOwner, - Owner, - ParentProps, + type Owner, + type ParentProps, runWithOwner, - Show, useContext, type JSX, } from "solid-js" @@ -13,58 +13,66 @@ import { Dialog as Kobalte } from "@kobalte/core/dialog" type DialogElement = () => JSX.Element +type Active = { + id: string + node: JSX.Element + dispose: () => void + owner: Owner + onClose?: () => void +} + const Context = createContext>() function init() { - const [active, setActive] = createSignal< - | { - id: string - element: DialogElement - onClose?: () => void - owner: Owner - } - | undefined - >() + const [active, setActive] = createSignal() + + const close = () => { + const current = active() + if (!current) return + current.onClose?.() + current.dispose() + setActive(undefined) + } + + const show = (element: DialogElement, owner: Owner, onClose?: () => void) => { + close() - const result = { + const id = Math.random().toString(36).slice(2) + let dispose: (() => void) | undefined + + const node = runWithOwner(owner, () => + createRoot((d) => { + dispose = d + return ( + { + if (open) return + close() + }} + > + + + {element()} + + + ) + }), + ) + + if (!dispose) return + + setActive({ id, node, dispose, owner, onClose }) + } + + return { get active() { return active() }, - close() { - active()?.onClose?.() - setActive(undefined) - }, - show(element: DialogElement, owner: Owner, onClose?: () => void) { - active()?.onClose?.() - const id = Math.random().toString(36).slice(2) - setActive({ - id, - element: () => - runWithOwner(owner, () => ( - - { - if (!open) { - result.close() - } - }} - > - - - {element()} - - - - )), - onClose, - owner, - }) - }, + close, + show, } - - return result } export function DialogProvider(props: ParentProps) { @@ -72,7 +80,7 @@ export function DialogProvider(props: ParentProps) { return ( {props.children} -
{ctx.active?.element?.()}
+
{ctx.active?.node}
) } @@ -80,18 +88,21 @@ export function DialogProvider(props: ParentProps) { export function useDialog() { const ctx = useContext(Context) const owner = getOwner() + if (!owner) { throw new Error("useDialog must be used within a DialogProvider") } if (!ctx) { throw new Error("useDialog must be used within a DialogProvider") } + return { get active() { return ctx.active }, show(element: DialogElement, onClose?: () => void) { - ctx.show(element, owner, onClose) + const base = ctx.active?.owner ?? owner + ctx.show(element, base, onClose) }, close() { ctx.close() diff --git a/packages/ui/src/hooks/use-filtered-list.tsx b/packages/ui/src/hooks/use-filtered-list.tsx index 416f030ef..94099d786 100644 --- a/packages/ui/src/hooks/use-filtered-list.tsx +++ b/packages/ui/src/hooks/use-filtered-list.tsx @@ -18,6 +18,9 @@ export interface FilteredListProps { export function useFilteredList(props: FilteredListProps) { const [store, setStore] = createStore<{ filter: string }>({ filter: "" }) + type Group = { category: string; items: [T, ...T[]] } + const empty: Group[] = [] + const [grouped, { refetch }] = createResource( () => ({ filter: store.filter, @@ -42,11 +45,12 @@ export function useFilteredList(props: FilteredListProps) { ) return result }, + { initialValue: empty }, ) const flat = createMemo(() => { return pipe( - grouped() || [], + grouped.latest || [], flatMap((x) => x.items), ) }) -- cgit v1.2.3