@powerhousedao/codegen 4.1.0-dev.19 → 4.1.0-dev.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,20 +2,32 @@
2
2
  to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/FolderTree.tsx"
3
3
  unless_exists: true
4
4
  ---
5
- import { useState } from 'react';
6
- import type { UiFolderNode } from "@powerhousedao/design-system";
5
+ import { useState } from "react";
6
+ import type { FolderNode } from "document-drive";
7
7
 
8
8
  interface FolderTreeProps {
9
- folders: UiFolderNode[];
9
+ folders: FolderNode[];
10
10
  selectedNodeId?: string;
11
- onSelectNode: (node: UiFolderNode) => void;
11
+ onSelectNode: (nodeId: string | undefined) => void;
12
12
  }
13
13
 
14
- export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTreeProps) {
15
- const [expandedFolders, setExpandedFolders] = useState<Set<string>>(new Set());
14
+ /**
15
+ * Hierarchical folder tree navigation component.
16
+ * Displays folders in a tree structure with expand/collapse functionality.
17
+ */
18
+ export function FolderTree({
19
+ folders,
20
+ selectedNodeId,
21
+ onSelectNode,
22
+ }: FolderTreeProps) {
23
+ // Track which folders are expanded
24
+ const [expandedFolders, setExpandedFolders] = useState<Set<string>>(
25
+ new Set(),
26
+ );
16
27
 
28
+ // Toggle folder expansion state
17
29
  const toggleFolder = (folderId: string) => {
18
- setExpandedFolders(prev => {
30
+ setExpandedFolders((prev) => {
19
31
  const next = new Set(prev);
20
32
  if (next.has(folderId)) {
21
33
  next.delete(folderId);
@@ -26,20 +38,22 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
26
38
  });
27
39
  };
28
40
 
29
- const renderFolder = (folder: UiFolderNode, level: number = 0) => {
30
- const hasChildren = folders.some(f => f.parentFolder === folder.id);
41
+ // Recursive function to render folder tree structure
42
+ const renderFolder = (folder: FolderNode, level: number = 0) => {
43
+ const hasChildren = folders.some((f) => f.parentFolder === folder.id);
31
44
  const isExpanded = expandedFolders.has(folder.id);
32
45
  const isSelected = selectedNodeId === folder.id;
33
46
 
34
47
  return (
35
48
  <div key={folder.id}>
36
49
  <div
37
- className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded ${
38
- isSelected ? 'bg-gray-100' : ''
50
+ className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded text-sm ${
51
+ isSelected ? "bg-blue-100 text-blue-800" : ""
39
52
  }`}
40
- style={{ paddingLeft: `${level * 16 + 8}px` }}
41
- onClick={() => onSelectNode(folder)}
53
+ style={{ paddingLeft: `${level * 16 + 8}px` }} // Customize indentation here
54
+ onClick={() => onSelectNode(folder.id)}
42
55
  >
56
+ {/* Expand/collapse button for folders with children */}
43
57
  {hasChildren && (
44
58
  <button
45
59
  className="w-4 h-4 mr-1 flex items-center justify-center"
@@ -48,16 +62,19 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
48
62
  toggleFolder(folder.id);
49
63
  }}
50
64
  >
51
- {isExpanded ? '' : ''}
65
+ {isExpanded ? "" : ""} {/* Customize expand icons here */}
52
66
  </button>
53
67
  )}
54
- <span className="text-sm">{folder.name}</span>
68
+ {!hasChildren && <div className="w-5 mr-1" />}
69
+ {/* Customize folder icon and styling here */}
70
+ <span>📁 {folder.name}</span>
55
71
  </div>
72
+ {/* Recursively render child folders when expanded */}
56
73
  {isExpanded && hasChildren && (
57
74
  <div>
58
75
  {folders
59
- .filter(f => f.parentFolder === folder.id)
60
- .map(child => renderFolder(child, level + 1))}
76
+ .filter((f) => f.parentFolder === folder.id)
77
+ .map((child) => renderFolder(child, level + 1))}
61
78
  </div>
62
79
  )}
63
80
  </div>
@@ -67,19 +84,20 @@ export function FolderTree({ folders, selectedNodeId, onSelectNode }: FolderTree
67
84
  return (
68
85
  <div className="space-y-1">
69
86
  {/* Root Directory Option */}
87
+ {/* Customize root folder appearance here */}
70
88
  <div
71
- className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded ${
72
- !selectedNodeId ? 'bg-gray-100' : ''
89
+ className={`flex items-center py-1 px-2 cursor-pointer hover:bg-gray-100 rounded text-sm ${
90
+ !selectedNodeId ? "bg-blue-100 text-blue-800" : ""
73
91
  }`}
74
- onClick={() => onSelectNode({ id: '', name: 'Root', kind: 'FOLDER' } as UiFolderNode)}
92
+ onClick={() => onSelectNode(undefined)}
75
93
  >
76
- <span className="text-sm font-medium">Root</span>
94
+ <span>🏠 Root</span>
77
95
  </div>
78
96
 
79
- {/* Folder Tree */}
97
+ {/* Render top-level folders (no parent) */}
80
98
  {folders
81
- .filter(folder => !folder.parentFolder)
82
- .map(folder => renderFolder(folder))}
99
+ .filter((folder) => !folder.parentFolder)
100
+ .map((folder) => renderFolder(folder))}
83
101
  </div>
84
102
  );
85
- }
103
+ }
@@ -3,71 +3,66 @@ to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/editor.tsx"
3
3
  unless_exists: true
4
4
  ---
5
5
  import { type DriveEditorProps } from "@powerhousedao/reactor-browser";
6
- import { AnalyticsProvider } from '@powerhousedao/reactor-browser/analytics/context';
7
- import { DriveContextProvider } from "@powerhousedao/reactor-browser/hooks/useDriveContext";
8
- import { type DocumentDriveDocument, addFolder, deleteNode, updateNode, generateNodesCopy, copyNode } from "document-drive";
6
+ import { AnalyticsProvider } from "@powerhousedao/reactor-browser/analytics/context";
7
+ import { DriveContextProvider, useDriveContext } from "@powerhousedao/reactor-browser/hooks/useDriveContext";
8
+ import { useInitializePHApp, useSetSelectedNode } from '@powerhousedao/state';
9
+ import { type DocumentDriveDocument, type FileNode } from "document-drive";
9
10
  import { WagmiContext } from "@powerhousedao/design-system";
10
11
  import { DriveExplorer } from "./components/DriveExplorer.js";
11
12
  import { useCallback } from "react";
12
- import { generateId } from "document-model";
13
13
 
14
14
  export type IProps = DriveEditorProps<DocumentDriveDocument>;
15
15
 
16
+ /**
17
+ * Base editor component that renders the drive explorer interface.
18
+ * Customize document opening behavior and drive-level actions here.
19
+ */
16
20
  export function BaseEditor(props: IProps) {
17
- const { dispatch, context } = props;
18
-
19
- const onAddFolder = useCallback((name: string, parentFolder?: string) => {
20
- dispatch(addFolder({
21
- id: generateId(),
22
- name,
23
- parentFolder,
24
- }));
25
- }, [dispatch]);
21
+ const { context, document } = props;
26
22
 
27
- const onDeleteNode = useCallback((nodeId: string) => {
28
- dispatch(deleteNode({ id: nodeId }));
29
- }, [dispatch]);
23
+ // Get drive operations from context
24
+ const {
25
+ onAddFolder,
26
+ onRenameNode,
27
+ onCopyNode,
28
+ showDeleteNodeModal,
29
+ } = useDriveContext();
30
30
 
31
- const renameNode = useCallback((nodeId: string, name: string) => {
32
- dispatch(updateNode({ id: nodeId, name }));
33
- }, [dispatch]);
31
+ const setSelectedNode = useSetSelectedNode();
34
32
 
35
- const onCopyNode = useCallback((nodeId: string, targetName: string, parentId?: string) => {
36
- const copyNodesInput = generateNodesCopy({
37
- srcId: nodeId,
38
- targetParentFolder: parentId,
39
- targetName,
40
- }, () => generateId(), props.document.state.global.nodes);
41
-
42
- const copyNodesAction = copyNodesInput.map(input => {
43
- return copyNode(input);
44
- });
45
-
46
- for (const copyNodeAction of copyNodesAction) {
47
- dispatch(copyNodeAction);
48
- }
49
- }, [dispatch, props.document.state.global.nodes]);
33
+ // Handle document opening - customize this to modify document open behavior
34
+ const onOpenDocument = useCallback(
35
+ (node: FileNode) => {
36
+ setSelectedNode(node.id);
37
+ },
38
+ [setSelectedNode],
39
+ );
50
40
 
51
41
  return (
52
- <div
53
- className="new-drive-explorer"
54
- style={{ height: "100%" }}
55
- >
42
+ <div className="new-drive-explorer" style={{ height: "100%" }}>
56
43
  <DriveExplorer
57
- driveId={props.document.header.id}
58
- nodes={props.document.state.global.nodes}
44
+ driveId={document.header.id}
59
45
  onAddFolder={onAddFolder}
60
- onDeleteNode={onDeleteNode}
61
- renameNode={renameNode}
46
+ onRenameNode={onRenameNode}
62
47
  onCopyNode={onCopyNode}
48
+ onOpenDocument={onOpenDocument}
49
+ showDeleteNodeModal={showDeleteNodeModal}
63
50
  context={context}
64
51
  />
65
52
  </div>
66
53
  );
67
54
  }
68
55
 
56
+ /**
57
+ * Main editor entry point with required providers.
58
+ * useInitializePHApp() is required for state management to work properly.
59
+ */
69
60
  export default function Editor(props: IProps) {
61
+ // Required: Initialize Powerhouse app state
62
+ useInitializePHApp();
63
+
70
64
  return (
65
+ // Required context providers for drive functionality
71
66
  <DriveContextProvider value={props.context}>
72
67
  <WagmiContext>
73
68
  <AnalyticsProvider databaseName={props.context.analyticsDatabaseName}>