diff --git a/src/features/menu/index.tsx b/src/features/menu/index.tsx index 66fb4a2..a8759ee 100644 --- a/src/features/menu/index.tsx +++ b/src/features/menu/index.tsx @@ -1,9 +1,9 @@ -import { Component, JSX, ParentComponent, children, createContext, createRenderEffect, createUniqueId, mergeProps, onCleanup, useContext } from "solid-js"; -import { isServer, ssr, useAssets } from "solid-js/web"; +import { Accessor, Component, For, JSX, ParentComponent, Setter, Show, children, createContext, createRenderEffect, createSignal, createUniqueId, mergeProps, onCleanup, useContext } from "solid-js"; +import { Portal, isServer, ssr, useAssets } from "solid-js/web"; export interface MenuContextType { - add(item: Item): number; - remove(index: number): void; + ref(): JSX.Element|undefined; + // setRef(ref: JSX.Element|undefined): void; }; export interface Item { @@ -15,35 +15,48 @@ export interface Item { const MenuContext = createContext(); -const initClientProvider = () => { - console.log(document.querySelector('[data-app-menu="root"]')); - console.log(document.querySelector('[data-app-menu="ssr-items"]')); +// const initClientProvider = (): MenuContextType => { +// const root = document.querySelector('[data-app-menu="root"]'); +// const items = JSON.parse(document.querySelector('[data-app-menu="ssr-items"]')?.textContent ?? '[]'); - return { - add(item: Item) { - return -1; - }, - remove(index: number) {}, - }; -}; +// console.log(items); -const initServerProvider = () => { - const items: Item[] = []; +// let _ref!: JSX.Element; - useAssets(() => ssr(`
${JSON.stringify(items)}
`) as any); +// // useAssets(() => ssr(``) as any); - return { - add(item: Item) { - return items.push(item); - }, - remove(index: number) {}, - }; -}; +// return { +// ref() { +// return _ref; +// }, +// setRef(ref: JSX.Element) { +// _ref = ref; +// }, +// }; +// }; -export const MenuProvider: ParentComponent = (props) => { - const ctx = isServer ? initServerProvider() : initClientProvider(); +// const initServerProvider = (): MenuContextType => { +// let _ref!: JSX.Element; - return {props.children}; +// // useAssets(() => ssr(``) as any); + +// return { +// ref() { +// return _ref; +// }, +// setRef(ref: JSX.Element) { +// _ref = ref; +// }, +// }; +// }; + +export const MenuProvider: ParentComponent<{ root?: JSX.Element }> = (props) => { + // const ctx = isServer ? initServerProvider() : initClientProvider(); + + // const [ ref, setRef ] = createSignal(); + // const ctx = {ref, setRef}; + + return props.root }}>{props.children}; } const useMenu = () => { @@ -56,7 +69,7 @@ const useMenu = () => { return context; } -export const MenuItem: ParentComponent<{ label: string }> = (props) => { +const Item: ParentComponent<{ label: string }> = (props) => { const childItems = children(() => props.children); return mergeProps(props, { @@ -66,48 +79,28 @@ export const MenuItem: ParentComponent<{ label: string }> = (props) => { }) as unknown as JSX.Element; } -export const Menu: ParentComponent<{}> = (props) => { +const Root: ParentComponent<{}> = (props) => { const menu = useMenu(); const items: { label: string, children?: { label: string }[] }[] = (isServer ? props.children : props.children?.map(c => c())) ?? []; - createRenderEffect(() => { - const indices = items.map(({ label, children }) => - menu.add({ - id: createUniqueId(), - label, - children: children?.map(({ label }) => ({ id: createUniqueId(), label })) - }) - ); + return + + {(item) => <> + - onCleanup(() => { - for(const index of indices){ - menu.remove(index); + +
+ + {(child) => {child.label}} + +
+
+ } - }); - }); - - return null; +
+
}; -export const MenuRoot: Component = () => { - const menu = useMenu(); - - return
- - // return - // {(item) => <> - // - - // - //
- // - // {(child) => {child.label}} - // - //
- //
- // - // } - //
; -}; \ No newline at end of file +export const Menu = { Root, Item } as const; \ No newline at end of file diff --git a/src/routes/(editor).tsx b/src/routes/(editor).tsx index f493b92..f59f1ed 100644 --- a/src/routes/(editor).tsx +++ b/src/routes/(editor).tsx @@ -1,17 +1,20 @@ import { Title } from "@solidjs/meta"; +import { JSX, createSignal } from "solid-js"; import { FilesProvider } from "~/features/file"; -import { MenuRoot, MenuProvider } from "~/features/menu"; +import { MenuProvider, Menu } from "~/features/menu"; export default function Editor(props) { - return -