Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions apps/docs/app/trees-dev/_components/ReactClientRendered.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
'use client';

import type { FileTreeOptions, FileTreeStateConfig } from '@pierre/trees';
import type { FileTreeStateConfig } from '@pierre/trees';
import { FileTree as FileTreeReact } from '@pierre/trees/react';

import {
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

/**
* React FileTree - Client-Side Rendered
* No prerendered HTML, renders entirely on client
Expand All @@ -12,14 +17,20 @@ export function ReactClientRendered({
initialFiles,
stateConfig,
}: {
options: Omit<FileTreeOptions, 'initialFiles'>;
options: Omit<TreesDevFileTreeOptions, 'initialFiles'>;
initialFiles?: string[];
stateConfig?: FileTreeStateConfig;
}) {
const runtimeOptions = toRuntimeFileTreeOptions({
...options,
initialFiles: initialFiles ?? [],
});
const { model, ...reactOptions } = runtimeOptions;

return (
<FileTreeReact
options={options}
initialFiles={initialFiles}
model={model}
options={reactOptions}
initialExpandedItems={stateConfig?.initialExpandedItems}
initialSelectedItems={stateConfig?.initialSelectedItems}
onSelection={stateConfig?.onSelection}
Expand Down
19 changes: 15 additions & 4 deletions apps/docs/app/trees-dev/_components/ReactServerRendered.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
'use client';

import type { FileTreeOptions, FileTreeStateConfig } from '@pierre/trees';
import type { FileTreeStateConfig } from '@pierre/trees';
import { FileTree as FileTreeReact } from '@pierre/trees/react';

import {
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

/**
* React FileTree - Server-Side Rendered
* Uses prerendered HTML for SSR, hydrates on client
Expand All @@ -13,15 +18,21 @@ export function ReactServerRendered({
stateConfig,
prerenderedHTML,
}: {
options: Omit<FileTreeOptions, 'initialFiles'>;
options: Omit<TreesDevFileTreeOptions, 'initialFiles'>;
initialFiles?: string[];
stateConfig?: FileTreeStateConfig;
prerenderedHTML: string;
}) {
const runtimeOptions = toRuntimeFileTreeOptions({
...options,
initialFiles: initialFiles ?? [],
});
const { model, ...reactOptions } = runtimeOptions;

return (
<FileTreeReact
options={options}
initialFiles={initialFiles}
model={model}
options={reactOptions}
prerenderedHTML={prerenderedHTML}
initialExpandedItems={stateConfig?.initialExpandedItems}
initialSelectedItems={stateConfig?.initialSelectedItems}
Expand Down
16 changes: 11 additions & 5 deletions apps/docs/app/trees-dev/_components/TreesDevSettingsProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,20 @@ import {
FILE_TREE_COOKIE_VERSION,
FILE_TREE_COOKIE_VERSION_NAME,
} from '../cookies';
import { sharedDemoFileTreeOptions } from '../demo-data';
import {
sharedDemoFileTreeOptions,
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

interface TreesDevSettingsContextValue {
flattenEmptyDirectories: boolean;
useLazyDataLoader: boolean;
setFlattenEmptyDirectories: (val: boolean) => void;
setUseLazyDataLoader: (val: boolean) => void;
handleResetControls: () => void;
fileTreeOptions: FileTreeOptions;
reactOptions: Omit<FileTreeOptions, 'initialFiles'>;
fileTreeOptions: TreesDevFileTreeOptions;
reactOptions: Omit<FileTreeOptions, 'model'>;
reactFiles: string[] | undefined;
}

Expand Down Expand Up @@ -102,7 +106,7 @@ export function TreesDevSettingsProvider({
}${cookieSuffix}`;
}, [cookieMaxAge, flattenEmptyDirectories, useLazyDataLoader]);

const fileTreeOptions = useMemo<FileTreeOptions>(
const fileTreeOptions = useMemo<TreesDevFileTreeOptions>(
() => ({
...sharedDemoFileTreeOptions,
flattenEmptyDirectories,
Expand All @@ -111,7 +115,9 @@ export function TreesDevSettingsProvider({
[flattenEmptyDirectories, useLazyDataLoader]
);

const { initialFiles: reactFiles, ...reactOptions } = fileTreeOptions;
const reactFiles = fileTreeOptions.initialFiles;
const runtimeReactOptions = toRuntimeFileTreeOptions(fileTreeOptions);
const { model: _reactModel, ...reactOptions } = runtimeReactOptions;

const value = useMemo<TreesDevSettingsContextValue>(
() => ({
Expand Down
14 changes: 11 additions & 3 deletions apps/docs/app/trees-dev/_components/VanillaClientRendered.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
'use client';

import { FileTree } from '@pierre/trees';
import type { FileTreeOptions, FileTreeStateConfig } from '@pierre/trees';
import type { FileTreeStateConfig } from '@pierre/trees';
import { useCallback, useRef } from 'react';

import {
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

/**
* Vanilla FileTree - Client-Side Rendered
* Uses ref callback to create and render FileTree instance on client mount
Expand All @@ -12,7 +17,7 @@ export function VanillaClientRendered({
options,
stateConfig,
}: {
options: FileTreeOptions;
options: TreesDevFileTreeOptions;
stateConfig?: FileTreeStateConfig;
}) {
const instanceRef = useRef<FileTree | null>(null);
Expand All @@ -29,7 +34,10 @@ export function VanillaClientRendered({
node.innerHTML = '';
}

const fileTree = new FileTree(options, stateConfig);
const fileTree = new FileTree(
toRuntimeFileTreeOptions(options),
stateConfig
);
fileTree.render({ containerWrapper: node });
instanceRef.current = fileTree;

Expand Down
14 changes: 11 additions & 3 deletions apps/docs/app/trees-dev/_components/VanillaServerRendered.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
'use client';

import { FileTree } from '@pierre/trees';
import type { FileTreeOptions, FileTreeStateConfig } from '@pierre/trees';
import type { FileTreeStateConfig } from '@pierre/trees';
import '@pierre/trees/web-components';
import { useCallback, useRef } from 'react';

import {
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

/**
* Vanilla FileTree - Server-Side Rendered
* Uses declarative shadow DOM to prerender HTML, then hydrates with FileTree instance.
Expand All @@ -16,7 +21,7 @@ export function VanillaServerRendered({
stateConfig,
containerHtml,
}: {
options: FileTreeOptions;
options: TreesDevFileTreeOptions;
stateConfig?: FileTreeStateConfig;
containerHtml: string;
}) {
Expand Down Expand Up @@ -46,7 +51,10 @@ export function VanillaServerRendered({
}
}

const fileTree = new FileTree(options, stateConfig);
const fileTree = new FileTree(
toRuntimeFileTreeOptions(options),
stateConfig
);

if (!hasHydratedRef.current) {
// Initial mount - hydrate the prerendered HTML
Expand Down
48 changes: 37 additions & 11 deletions apps/docs/app/trees-dev/context-menu/ContextMenuDemoClient.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';

import { CONTEXT_MENU_SLOT_NAME, FileTree } from '@pierre/trees';
import type { FileTreeOptions, FileTreeStateConfig } from '@pierre/trees';
import type { FileTreeStateConfig } from '@pierre/trees';
import { FileTree as FileTreeReact } from '@pierre/trees/react';
import '@pierre/trees/web-components';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
Expand All @@ -16,7 +16,11 @@ import {
TreeDemoContextMenu,
} from '../_components/TreeDemoContextMenu';
import { useTreesDevSettings } from '../_components/TreesDevSettingsProvider';
import { sharedDemoStateConfig } from '../demo-data';
import {
sharedDemoStateConfig,
toRuntimeFileTreeOptions,
type TreesDevFileTreeOptions,
} from '../demo-data';

interface ContextMenuDemoClientProps {
preloadedContextMenuFileTreeHtml: string;
Expand Down Expand Up @@ -64,7 +68,7 @@ function VanillaSSRContextMenu({
stateConfig,
containerHtml,
}: {
options: FileTreeOptions;
options: TreesDevFileTreeOptions;
stateConfig?: FileTreeStateConfig;
containerHtml: string;
}) {
Expand Down Expand Up @@ -106,17 +110,18 @@ function VanillaSSRContextMenu({
};

const fileTree = new FileTree(
{
toRuntimeFileTreeOptions({
...options,
initialFiles: filesRef.current,
renaming: renamingOptions,
},
}),
{
...stateConfig,
onFilesChange: (nextFiles) => {
onFilesChange: (changeSet, context) => {
const nextFiles = context.getFiles();
filesRef.current = nextFiles;
setFiles(nextFiles);
stateConfig?.onFilesChange?.(nextFiles);
stateConfig?.onFilesChange?.(changeSet, context);
},
onContextMenuOpen: (item, context) => {
renderVanillaContextMenuSlot({
Expand Down Expand Up @@ -172,7 +177,7 @@ function ReactSSRContextMenu({
stateConfig,
prerenderedHTML,
}: {
options: Omit<FileTreeOptions, 'initialFiles'>;
options: Omit<TreesDevFileTreeOptions, 'initialFiles'>;
initialFiles?: string[];
stateConfig?: FileTreeStateConfig;
prerenderedHTML: string;
Expand All @@ -183,11 +188,32 @@ function ReactSSRContextMenu({
[]
);

const runtimeOptions = useMemo(
() =>
toRuntimeFileTreeOptions({
...options,
initialFiles: files,
renaming: renamingOptions,
}),
[files, options, renamingOptions]
);
const { model, ...reactTreeOptions } = runtimeOptions;

const handleFilesChange = useCallback(
(
_changeSet: import('@pierre/trees').FileTreeChangeSet,
context: import('@pierre/trees').FileTreeChangeContext
) => {
setFiles(context.getFiles());
},
[]
);

return (
<FileTreeReact
options={{ ...options, renaming: renamingOptions }}
files={files}
onFilesChange={setFiles}
model={model}
options={reactTreeOptions}
onFilesChange={handleFilesChange}
prerenderedHTML={prerenderedHTML}
initialExpandedItems={stateConfig?.initialExpandedItems}
onSelection={stateConfig?.onSelection}
Expand Down
19 changes: 13 additions & 6 deletions apps/docs/app/trees-dev/context-menu/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { preloadFileTree } from '@pierre/trees/ssr';

import { readSettingsCookies } from '../_components/readSettingsCookies';
import { sharedDemoFileTreeOptions, sharedDemoStateConfig } from '../demo-data';
import {
sharedDemoFileTreeOptions,
sharedDemoStateConfig,
toRuntimeFileTreeOptions,
} from '../demo-data';
import { ContextMenuDemoClient } from './ContextMenuDemoClient';

export default async function ContextMenuPage() {
Expand All @@ -14,11 +18,14 @@ export default async function ContextMenuPage() {
};

const noop = () => {};
const contextMenuSsr = preloadFileTree(fileTreeOptions, {
...sharedDemoStateConfig,
onContextMenuOpen: noop,
onContextMenuClose: noop,
});
const contextMenuSsr = preloadFileTree(
toRuntimeFileTreeOptions(fileTreeOptions),
{
...sharedDemoStateConfig,
onContextMenuOpen: noop,
onContextMenuClose: noop,
}
);

return (
<ContextMenuDemoClient
Expand Down
Loading
Loading