@powerhousedao/codegen 4.1.0-dev.3 → 4.1.0-dev.30

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.
Files changed (98) hide show
  1. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts +14 -0
  2. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.d.ts.map +1 -0
  3. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js +12 -0
  4. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/index.js.map +1 -0
  5. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/resolvers.esm.t +17 -0
  6. package/dist/src/codegen/.hygen/templates/powerhouse/generate-custom-subgraph/schema.esm.t +16 -0
  7. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/object.esm.t +3 -3
  8. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/reducer.esm.t +3 -0
  9. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/types.esm.t +2 -2
  10. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model/utils.esm.t +2 -1
  11. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/customTest.esm.t +2 -2
  12. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/error.esm.t +6 -10
  13. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts +4 -0
  14. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.d.ts.map +1 -1
  15. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js +13 -1
  16. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/index.js.map +1 -1
  17. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/resolvers.esm.t +59 -50
  18. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-subgraph/schema.esm.t +3 -3
  19. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/CreateDocument.esm.t +45 -24
  20. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/DriveExplorer.esm.t +248 -181
  21. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/EditorContainer.esm.t +53 -72
  22. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderTree.esm.t +44 -26
  23. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/editor.esm.t +22 -58
  24. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts +16 -0
  25. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.d.ts.map +1 -0
  26. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.esm.t +2 -3
  27. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js +12 -0
  28. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/index.js.map +1 -0
  29. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts +2 -0
  30. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.d.ts.map +1 -1
  31. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.esm.t +1 -1
  32. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js +1 -0
  33. package/dist/src/codegen/.hygen/templates/powerhouse/generate-editor/index.js.map +1 -1
  34. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/factory.esm.t +2 -1
  35. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-analytics/lib.esm.t +7 -5
  36. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/factory.esm.t +3 -2
  37. package/dist/src/codegen/.hygen/templates/powerhouse/generate-processor-relationalDb/lib.esm.t +6 -5
  38. package/dist/src/codegen/.hygen/templates/powerhouse/generate-subgraph/index.esm.t +0 -32
  39. package/dist/src/codegen/graphql.d.ts +5 -1
  40. package/dist/src/codegen/graphql.d.ts.map +1 -1
  41. package/dist/src/codegen/graphql.js +28 -5
  42. package/dist/src/codegen/graphql.js.map +1 -1
  43. package/dist/src/codegen/hygen.d.ts +7 -4
  44. package/dist/src/codegen/hygen.d.ts.map +1 -1
  45. package/dist/src/codegen/hygen.js +50 -7
  46. package/dist/src/codegen/hygen.js.map +1 -1
  47. package/dist/src/codegen/index.d.ts +7 -6
  48. package/dist/src/codegen/index.d.ts.map +1 -1
  49. package/dist/src/codegen/index.js +82 -5
  50. package/dist/src/codegen/index.js.map +1 -1
  51. package/dist/src/ts-morph-generator/core/FileGenerator.d.ts +10 -0
  52. package/dist/src/ts-morph-generator/core/FileGenerator.d.ts.map +1 -0
  53. package/dist/src/ts-morph-generator/core/FileGenerator.js +9 -0
  54. package/dist/src/ts-morph-generator/core/FileGenerator.js.map +1 -0
  55. package/dist/src/ts-morph-generator/core/GenerationContext.d.ts +30 -0
  56. package/dist/src/ts-morph-generator/core/GenerationContext.d.ts.map +1 -0
  57. package/dist/src/ts-morph-generator/core/GenerationContext.js +2 -0
  58. package/dist/src/ts-morph-generator/core/GenerationContext.js.map +1 -0
  59. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts +19 -0
  60. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.d.ts.map +1 -0
  61. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js +114 -0
  62. package/dist/src/ts-morph-generator/core/TSMorphCodeGenerator.js.map +1 -0
  63. package/dist/src/ts-morph-generator/core/index.d.ts +4 -0
  64. package/dist/src/ts-morph-generator/core/index.d.ts.map +1 -0
  65. package/dist/src/ts-morph-generator/core/index.js +4 -0
  66. package/dist/src/ts-morph-generator/core/index.js.map +1 -0
  67. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts +12 -0
  68. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.d.ts.map +1 -0
  69. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js +140 -0
  70. package/dist/src/ts-morph-generator/file-generators/ReducerGenerator.js.map +1 -0
  71. package/dist/src/ts-morph-generator/file-generators/index.d.ts +2 -0
  72. package/dist/src/ts-morph-generator/file-generators/index.d.ts.map +1 -0
  73. package/dist/src/ts-morph-generator/file-generators/index.js +2 -0
  74. package/dist/src/ts-morph-generator/file-generators/index.js.map +1 -0
  75. package/dist/src/ts-morph-generator/index.d.ts +4 -0
  76. package/dist/src/ts-morph-generator/index.d.ts.map +1 -0
  77. package/dist/src/ts-morph-generator/index.js +4 -0
  78. package/dist/src/ts-morph-generator/index.js.map +1 -0
  79. package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts +13 -0
  80. package/dist/src/ts-morph-generator/utilities/DirectoryManager.d.ts.map +1 -0
  81. package/dist/src/ts-morph-generator/utilities/DirectoryManager.js +45 -0
  82. package/dist/src/ts-morph-generator/utilities/DirectoryManager.js.map +1 -0
  83. package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts +14 -0
  84. package/dist/src/ts-morph-generator/utilities/ImportManager.d.ts.map +1 -0
  85. package/dist/src/ts-morph-generator/utilities/ImportManager.js +40 -0
  86. package/dist/src/ts-morph-generator/utilities/ImportManager.js.map +1 -0
  87. package/dist/src/ts-morph-generator/utilities/index.d.ts +3 -0
  88. package/dist/src/ts-morph-generator/utilities/index.d.ts.map +1 -0
  89. package/dist/src/ts-morph-generator/utilities/index.js +3 -0
  90. package/dist/src/ts-morph-generator/utilities/index.js.map +1 -0
  91. package/dist/tsconfig.hygen.tsbuildinfo +1 -1
  92. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  93. package/package.json +14 -6
  94. package/dist/src/codegen/.hygen/templates/powerhouse/generate-document-model-module/customReducers.esm.t +0 -20
  95. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FileItemsGrid.esm.t +0 -44
  96. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/components/FolderItemsGrid.esm.t +0 -96
  97. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useSelectedFolderChildren.esm.t +0 -35
  98. package/dist/src/codegen/.hygen/templates/powerhouse/generate-drive-editor/hooks/useTransformedNodes.esm.t +0 -35
@@ -3,231 +3,298 @@ to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/DriveExplorer.tsx
3
3
  unless_exists: true
4
4
  ---
5
5
  import {
6
- type BaseUiFileNode,
7
- type BaseUiFolderNode,
8
- type BaseUiNode,
9
- type UiFileNode,
10
- type UiFolderNode,
11
- type UiNode,
6
+ Breadcrumbs,
7
+ CreateDocumentModal,
8
+ FileItem,
9
+ FolderItem,
10
+ useBreadcrumbs,
12
11
  } from "@powerhousedao/design-system";
13
- import { useCallback, useState, useRef, useEffect } from "react";
14
- import type { FileNode, GetDocumentOptions, Node } from "document-drive";
15
- import { FileItemsGrid } from "./FileItemsGrid.js";
16
- import { FolderItemsGrid } from "./FolderItemsGrid.js";
17
- import { FolderTree } from "./FolderTree.js";
18
- import { useTransformedNodes } from "../hooks/useTransformedNodes.js";
19
- import { useSelectedFolderChildren } from "../hooks/useSelectedFolderChildren.js";
20
- import { EditorContainer } from "./EditorContainer.js";
12
+ import {
13
+ addDocument,
14
+ type DriveEditorProps,
15
+ getSyncStatusSync,
16
+ setSelectedNode,
17
+ useAllFolderNodes,
18
+ useDocumentModelModules,
19
+ useDriveContext,
20
+ useDriveSharingType,
21
+ useEditorModules,
22
+ useFileChildNodes,
23
+ useFolderChildNodes,
24
+ useSelectedDrive,
25
+ useSelectedFolder,
26
+ useSelectedNodePath,
27
+ useUserPermissions,
28
+ } from "@powerhousedao/reactor-browser";
21
29
  import type { DocumentModelModule } from "document-model";
22
- import { CreateDocumentModal } from "@powerhousedao/design-system";
23
- import { CreateDocument } from "./CreateDocument.js";
24
- import { type DriveEditorContext, useDriveContext } from "@powerhousedao/reactor-browser";
25
-
26
- interface DriveExplorerProps {
27
- driveId: string;
28
- nodes: Node[];
29
- onAddFolder: (name: string, parentFolder?: string) => void;
30
- onDeleteNode: (nodeId: string) => void;
31
- renameNode: (nodeId: string, name: string) => void;
32
- onCopyNode: (nodeId: string, targetName: string, parentId?: string) => void;
33
- context: DriveEditorContext;
34
- }
30
+ import { useCallback, useRef, useState } from "react";
31
+ import { CreateDocument } from "./CreateDocument.jsx";
32
+ import { EditorContainer } from "./EditorContainer.jsx";
33
+ import { FolderTree } from "./FolderTree.jsx";
35
34
 
36
- export function DriveExplorer({
37
- driveId,
38
- nodes,
39
- onDeleteNode,
40
- renameNode,
41
- onAddFolder,
42
- onCopyNode,
43
- context,
44
- }: DriveExplorerProps) {
45
- const { getDocumentRevision } = context;
46
-
47
- const [selectedNodeId, setSelectedNodeId] = useState<string | undefined>();
35
+ /**
36
+ * Main drive explorer component with sidebar navigation and content area.
37
+ * Layout: Left sidebar (folder tree) + Right content area (files/folders + document editor)
38
+ */
39
+ export function DriveExplorer(props: DriveEditorProps) {
40
+ // === DOCUMENT EDITOR STATE ===
41
+ // Customize document opening/closing behavior here
48
42
  const [activeDocumentId, setActiveDocumentId] = useState<
49
43
  string | undefined
50
44
  >();
51
45
  const [openModal, setOpenModal] = useState(false);
52
46
  const selectedDocumentModel = useRef<DocumentModelModule | null>(null);
53
- const { addDocument, documentModels } = useDriveContext();
47
+ const editorModules = useEditorModules();
48
+ // === DRIVE CONTEXT HOOKS ===
49
+ // Core drive operations and document models
50
+ const {
51
+ onAddFile,
52
+ onAddFolder,
53
+ onCopyNode,
54
+ onDuplicateNode,
55
+ onMoveNode,
56
+ onRenameNode,
57
+ showDeleteNodeModal,
58
+ } = useDriveContext();
54
59
 
55
- // Dummy functions to satisfy component types
56
- const dummyDuplicateNode = useCallback((node: BaseUiNode) => {
57
- console.log("Duplicate node:", node);
58
- }, []);
60
+ const { isAllowedToCreateDocuments } = useUserPermissions();
61
+ // === STATE MANAGEMENT HOOKS ===
62
+ // Core state hooks for drive navigation
63
+ const [selectedDrive] = useSelectedDrive(); // Currently selected drive
64
+ const selectedFolder = useSelectedFolder(); // Currently selected folder
65
+ const selectedNodePath = useSelectedNodePath();
66
+ const sharingType = useDriveSharingType(selectedDrive?.header.id);
59
67
 
60
- const dummyAddFile = useCallback(
61
- async (file: File, parentNode: BaseUiNode | null) => {
62
- console.log("Add file:", file, parentNode);
63
- },
64
- []
65
- );
68
+ // === NAVIGATION SETUP ===
69
+ // Breadcrumbs for folder navigation
70
+ const { breadcrumbs, onBreadcrumbSelected } = useBreadcrumbs({
71
+ selectedNodePath,
72
+ setSelectedNode,
73
+ });
66
74
 
67
- const dummyMoveNode = useCallback(
68
- async (uiNode: BaseUiNode, targetNode: BaseUiNode) => {
69
- console.log("Move node:", uiNode, targetNode);
70
- },
71
- []
72
- );
75
+ const folderChildren = useFolderChildNodes();
76
+ const fileChildren = useFileChildNodes();
77
+
78
+ // All folders for the sidebar tree view
79
+ const allFolders = useAllFolderNodes();
73
80
 
74
- const handleNodeSelect = useCallback((node: BaseUiFolderNode) => {
75
- console.log("Selected node:", node);
76
- setSelectedNodeId(node.id);
77
- }, []);
81
+ // === EVENT HANDLERS ===
78
82
 
79
- const handleFileSelect = useCallback((node: BaseUiFileNode) => {
80
- setActiveDocumentId(node.id);
81
- }, []);
83
+ // Handle folder creation with optional name parameter
84
+ const handleCreateFolder = useCallback(
85
+ async (folderName?: string) => {
86
+ let name: string | undefined = folderName;
82
87
 
83
- const handleEditorClose = useCallback(() => {
84
- setActiveDocumentId(undefined);
85
- }, []);
88
+ // If no name provided, prompt for it (for manual folder creation)
89
+ if (!name) {
90
+ const promptResult = prompt("Enter folder name:");
91
+ name = promptResult || undefined;
92
+ }
86
93
 
94
+ if (name?.trim()) {
95
+ try {
96
+ await onAddFolder(name.trim(), selectedFolder);
97
+ } catch (error) {
98
+ console.error("Failed to create folder:", error);
99
+ }
100
+ }
101
+ },
102
+ [onAddFolder, selectedFolder],
103
+ );
104
+
105
+ // Handle document creation from modal
87
106
  const onCreateDocument = useCallback(
88
107
  async (fileName: string) => {
89
108
  setOpenModal(false);
90
109
 
91
110
  const documentModel = selectedDocumentModel.current;
92
- if (!documentModel) return;
111
+ if (!documentModel || !selectedDrive?.header.id) return;
93
112
 
94
- const node = await addDocument(
95
- driveId,
96
- fileName,
97
- documentModel.documentModel.id,
98
- selectedNodeId,
99
- );
113
+ try {
114
+ const node = await addDocument(
115
+ selectedDrive.header.id,
116
+ fileName,
117
+ documentModel.documentModel.id,
118
+ selectedFolder?.id,
119
+ undefined,
120
+ editorModules?.find((e) =>
121
+ e.documentTypes.includes(documentModel.documentModel.id),
122
+ )?.id,
123
+ );
100
124
 
101
- selectedDocumentModel.current = null;
102
- setActiveDocumentId(node.id);
103
- },
104
- [addDocument, driveId, selectedNodeId]
105
- );
106
-
107
- const onSelectDocumentModel = useCallback(
108
- (documentModel: DocumentModelModule) => {
109
- selectedDocumentModel.current = documentModel;
110
- setOpenModal(true);
111
- },
112
- []
113
- );
125
+ selectedDocumentModel.current = null;
114
126
 
115
- const onGetDocumentRevision = useCallback(
116
- (options?: GetDocumentOptions) => {
117
- if (!activeDocumentId) return;
118
- return getDocumentRevision?.(activeDocumentId, options);
127
+ if (node) {
128
+ // Customize: Auto-open created document by uncommenting below
129
+ // setActiveDocumentId(node.id);
130
+ }
131
+ } catch (error) {
132
+ console.error("Failed to create document:", error);
133
+ }
119
134
  },
120
- [getDocumentRevision, activeDocumentId],
135
+ [addDocument, editorModules, selectedDrive?.header.id, selectedFolder?.id],
121
136
  );
122
137
 
123
- const filteredDocumentModels = documentModels;
124
-
125
- // Transform nodes using the custom hook
126
- const transformedNodes = useTransformedNodes(nodes, driveId);
127
-
128
- // Separate folders and files
129
- const folders = transformedNodes.filter(
130
- (node): node is UiFolderNode => node.kind === "FOLDER"
131
- );
132
- const files = transformedNodes.filter(
133
- (node): node is UiFileNode => node.kind === "FILE"
134
- );
135
-
136
- // Get children of selected folder using the custom hook
137
- const selectedFolderChildren = useSelectedFolderChildren(
138
- selectedNodeId,
139
- folders,
140
- files
141
- );
138
+ // === DOCUMENT EDITOR DATA ===
139
+ // Filter available document types here if needed
140
+ const documentModelModules = useDocumentModelModules();
142
141
 
143
- // Get the active document info from nodes
142
+ // Get active document and its editor components
144
143
  const activeDocument = activeDocumentId
145
- ? files.find((file) => file.id === activeDocumentId)
144
+ ? fileChildren.find((file) => file.id === activeDocumentId)
146
145
  : undefined;
147
146
 
148
147
  const documentModelModule = activeDocument
149
- ? context.getDocumentModelModule(activeDocument.documentType)
148
+ ? documentModelModules?.find(
149
+ (m) => m.documentModel.id === activeDocument.documentType,
150
+ )
150
151
  : null;
151
152
 
152
153
  const editorModule = activeDocument
153
- ? context.getEditor(activeDocument.documentType)
154
+ ? editorModules?.find((e) =>
155
+ e.documentTypes.includes(activeDocument.documentType),
156
+ )
154
157
  : null;
155
158
 
159
+ // === RENDER ===
156
160
  return (
157
161
  <div className="flex h-full">
158
- {/* Sidebar */}
159
- <div className="w-64 border-r border-gray-200 p-4 overflow-y-auto">
160
- <h2 className="text-lg font-semibold mb-4">Folders</h2>
161
- <FolderTree
162
- folders={folders}
163
- selectedNodeId={selectedNodeId}
164
- onSelectNode={handleNodeSelect}
165
- />
162
+ {/* === LEFT SIDEBAR: Folder Navigation === */}
163
+ {/* Customize sidebar width by changing w-64 */}
164
+ <div className="w-64 overflow-y-auto border-r border-gray-200 bg-white">
165
+ <div className="p-4">
166
+ {/* Customize sidebar title here */}
167
+ <h2 className="mb-4 text-lg font-semibold text-gray-700">
168
+ Drive Explorer
169
+ </h2>
170
+
171
+ {/* Folder tree navigation component */}
172
+ <FolderTree folders={allFolders} onSelectNode={setSelectedNode} />
173
+ </div>
166
174
  </div>
167
175
 
168
- {/* Main Content */}
169
- <div className="flex-1 p-4 overflow-y-auto">
176
+ {/* === RIGHT CONTENT AREA: Files/Folders or Document Editor === */}
177
+ <div className="flex-1 overflow-y-auto p-4">
178
+ {/* Conditional rendering: Document editor or folder contents */}
170
179
  {activeDocument && documentModelModule && editorModule ? (
171
- <EditorContainer
172
- context={{
173
- ...context,
174
- getDocumentRevision: onGetDocumentRevision,
175
- }}
176
- documentId={activeDocumentId!}
177
- documentType={activeDocument.documentType}
178
- driveId={driveId}
179
- onClose={handleEditorClose}
180
- title={activeDocument.name}
181
- documentModelModule={documentModelModule}
182
- editorModule={editorModule}
183
- />
180
+ // Document editor view
181
+ <EditorContainer handleClose={() => setActiveDocumentId(undefined)} />
184
182
  ) : (
185
- <>
186
- <h2 className="text-lg font-semibold mb-4">Contents</h2>
187
-
188
- {/* Folders Section */}
189
- <FolderItemsGrid
190
- folders={selectedFolderChildren.folders}
191
- onSelectNode={handleNodeSelect}
192
- onRenameNode={renameNode}
193
- onDuplicateNode={(uiNode) =>
194
- onCopyNode(
195
- uiNode.id,
196
- "Copy of " + uiNode.name,
197
- uiNode.parentFolder
198
- )
199
- }
200
- onDeleteNode={onDeleteNode}
201
- onAddFile={dummyAddFile}
202
- onCopyNode={async (uiNode, targetNode) =>
203
- onCopyNode(uiNode.id, "Copy of " + uiNode.name, targetNode.id)
204
- }
205
- onMoveNode={dummyMoveNode}
206
- isAllowedToCreateDocuments={true}
207
- onAddFolder={onAddFolder}
208
- parentFolderId={selectedNodeId}
209
- />
210
-
211
- {/* Files Section */}
212
- <FileItemsGrid
213
- files={selectedFolderChildren.files}
214
- onSelectNode={handleFileSelect}
215
- onRenameNode={renameNode}
216
- onDuplicateNode={dummyDuplicateNode}
217
- onDeleteNode={onDeleteNode}
218
- isAllowedToCreateDocuments={true}
219
- />
220
-
221
- {/* Create Document Section */}
222
- <CreateDocument
223
- createDocument={onSelectDocumentModel}
224
- documentModels={filteredDocumentModels}
225
- />
226
- </>
183
+ /* Folder contents view */
184
+ <div className="space-y-6">
185
+ {/* === HEADER SECTION === */}
186
+ <div className="space-y-3">
187
+ <div className="flex items-center justify-between">
188
+ {/* Folder title */}
189
+ <h2 className="text-lg font-semibold">
190
+ {selectedFolder
191
+ ? `Contents of "${selectedFolder.name}"`
192
+ : "Root Contents"}
193
+ </h2>
194
+ {/* Customize: Add more action buttons here */}
195
+ {isAllowedToCreateDocuments && (
196
+ <button
197
+ onClick={() => handleCreateFolder()}
198
+ className="rounded bg-blue-500 px-3 py-1 text-sm text-white hover:bg-blue-600"
199
+ >
200
+ + New Folder
201
+ </button>
202
+ )}
203
+ </div>
204
+
205
+ {/* Navigation breadcrumbs */}
206
+ {breadcrumbs.length > 1 && (
207
+ <div className="border-b border-gray-200 pb-3">
208
+ <Breadcrumbs
209
+ breadcrumbs={breadcrumbs}
210
+ createEnabled={isAllowedToCreateDocuments}
211
+ onCreate={handleCreateFolder}
212
+ onBreadcrumbSelected={onBreadcrumbSelected}
213
+ />
214
+ </div>
215
+ )}
216
+ </div>
217
+
218
+ {/* === FOLDERS SECTION === */}
219
+ {/* Customize grid layout by changing grid-cols-1 */}
220
+ {folderChildren.length > 0 && (
221
+ <div>
222
+ <h3 className="mb-2 text-sm font-medium text-gray-500">
223
+ 📁 Folders
224
+ </h3>
225
+ <div className="grid grid-cols-1 gap-2">
226
+ {folderChildren.map((folderNode) => (
227
+ <FolderItem
228
+ key={folderNode.id}
229
+ folderNode={folderNode}
230
+ isAllowedToCreateDocuments={isAllowedToCreateDocuments}
231
+ sharingType={sharingType || "LOCAL"}
232
+ getSyncStatusSync={getSyncStatusSync}
233
+ setSelectedNode={setSelectedNode}
234
+ onAddFile={onAddFile}
235
+ onCopyNode={onCopyNode}
236
+ onMoveNode={onMoveNode}
237
+ onRenameNode={onRenameNode}
238
+ onDuplicateNode={onDuplicateNode}
239
+ onAddFolder={onAddFolder}
240
+ onAddAndSelectNewFolder={handleCreateFolder}
241
+ showDeleteNodeModal={showDeleteNodeModal}
242
+ />
243
+ ))}
244
+ </div>
245
+ </div>
246
+ )}
247
+
248
+ {/* === FILES/DOCUMENTS SECTION === */}
249
+ {/* Customize grid layout by changing grid-cols-1 */}
250
+ {fileChildren.length > 0 && (
251
+ <div>
252
+ <h3 className="mb-2 text-sm font-medium text-gray-500">
253
+ 📄 Documents
254
+ </h3>
255
+ <div className="grid grid-cols-1 gap-2">
256
+ {fileChildren.map((fileNode) => (
257
+ <FileItem
258
+ key={fileNode.id}
259
+ fileNode={fileNode}
260
+ isAllowedToCreateDocuments={isAllowedToCreateDocuments}
261
+ sharingType={sharingType || "LOCAL"}
262
+ getSyncStatusSync={getSyncStatusSync}
263
+ setSelectedNode={setSelectedNode}
264
+ showDeleteNodeModal={showDeleteNodeModal}
265
+ onRenameNode={onRenameNode}
266
+ onDuplicateNode={onDuplicateNode}
267
+ onAddFile={onAddFile}
268
+ onCopyNode={onCopyNode}
269
+ onMoveNode={onMoveNode}
270
+ onAddFolder={onAddFolder}
271
+ onAddAndSelectNewFolder={handleCreateFolder}
272
+ />
273
+ ))}
274
+ </div>
275
+ </div>
276
+ )}
277
+
278
+ {/* === EMPTY STATE === */}
279
+ {/* Customize empty state message and styling here */}
280
+ {folderChildren.length === 0 && fileChildren.length === 0 && (
281
+ <div className="py-12 text-center text-gray-500">
282
+ <p className="text-lg">📁 This folder is empty</p>
283
+ <p className="mt-2 text-sm">
284
+ Create your first document or folder below
285
+ </p>
286
+ </div>
287
+ )}
288
+
289
+ {/* === DOCUMENT CREATION SECTION === */}
290
+ {/* Component for creating new documents */}
291
+ <CreateDocument />
292
+ </div>
227
293
  )}
228
294
  </div>
229
295
 
230
- {/* Create Document Modal */}
296
+ {/* === DOCUMENT CREATION MODAL === */}
297
+ {/* Modal for entering document name after selecting type */}
231
298
  <CreateDocumentModal
232
299
  onContinue={onCreateDocument}
233
300
  onOpenChange={(open) => setOpenModal(open)}
@@ -235,4 +302,4 @@ export function DriveExplorer({
235
302
  />
236
303
  </div>
237
304
  );
238
- }
305
+ }
@@ -2,117 +2,98 @@
2
2
  to: "<%= rootDir %>/<%= h.changeCase.param(name) %>/components/EditorContainer.tsx"
3
3
  unless_exists: true
4
4
  ---
5
+ import { getRevisionFromDate, useTimelineItems } from "@powerhousedao/common";
5
6
  import {
6
- useDriveContext,
7
- exportDocument,
8
- type User,
9
- type DriveEditorContext,
10
- } from "@powerhousedao/reactor-browser";
11
- import {
12
- type EditorContext,
13
- type DocumentModelModule,
14
- type EditorModule,
15
- type EditorProps,
16
- type PHDocument,
17
- } from "document-model";
18
- import {
7
+ DefaultEditorLoader,
19
8
  DocumentToolbar,
20
9
  RevisionHistory,
21
- DefaultEditorLoader,
22
10
  type TimelineItem,
23
11
  } from "@powerhousedao/design-system";
24
- import { useTimelineItems, getRevisionFromDate } from "@powerhousedao/common";
25
- import { useState, Suspense, type FC, useCallback } from "react";
26
-
27
- export interface EditorContainerProps {
28
- driveId: string;
29
- documentId: string;
30
- documentType: string;
31
- onClose: () => void;
32
- title: string;
33
- context: Omit<DriveEditorContext, "getDocumentRevision"> & Pick<EditorContext, "getDocumentRevision">;
34
- documentModelModule: DocumentModelModule<PHDocument>;
35
- editorModule: EditorModule;
36
- }
37
-
38
- export const EditorContainer: React.FC<EditorContainerProps> = (props) => {
39
- const {
40
- title,
41
- driveId,
42
- context,
43
- onClose,
44
- documentId,
45
- documentType,
46
- editorModule,
47
- documentModelModule,
48
- } = props;
12
+ import {
13
+ exportFile,
14
+ useEditorModuleById,
15
+ useSelectedDocument,
16
+ useSelectedDrive,
17
+ } from "@powerhousedao/reactor-browser";
18
+ import { error } from "console";
19
+ import { title } from "process";
20
+ import { Suspense, useCallback, useState } from "react";
49
21
 
50
- const [selectedTimelineItem, setSelectedTimelineItem] = useState<TimelineItem | null>(null);
22
+ /**
23
+ * Document editor container that wraps individual document editors.
24
+ * Handles document loading, toolbar, revision history, and dynamic editor loading.
25
+ * Customize toolbar actions and editor context here.
26
+ */
27
+ export const EditorContainer = (props: { handleClose: () => void }) => {
28
+ const { handleClose } = props;
29
+ // UI state for revision history and timeline
30
+ const [selectedTimelineItem, setSelectedTimelineItem] =
31
+ useState<TimelineItem | null>(null);
51
32
  const [showRevisionHistory, setShowRevisionHistory] = useState(false);
52
- const { useDocumentEditorProps } = useDriveContext();
53
-
54
- const user = context.user as User | undefined;
55
-
56
- const { dispatch, error, document } = useDocumentEditorProps({
57
- documentId,
58
- documentType,
59
- driveId,
60
- documentModelModule,
61
- user,
62
- });
63
-
33
+ const [selectedDocument, dispatch] = useSelectedDocument();
34
+ const [selectedDrive] = useSelectedDrive();
35
+ // Timeline data for revision history
64
36
  const timelineItems = useTimelineItems(
65
- documentId,
66
- document?.header.createdAtUtcIso,
67
- driveId,
37
+ selectedDocument?.header.id,
38
+ selectedDocument?.header.createdAtUtcIso,
39
+ selectedDrive?.header.id,
40
+ );
41
+ const editorModule = useEditorModuleById(
42
+ selectedDocument?.header.meta?.preferredEditor,
68
43
  );
69
44
 
45
+ // Document export functionality - customize export behavior here
70
46
  const onExport = useCallback(async () => {
71
- if (document) {
72
- const ext = documentModelModule.documentModel.extension;
73
- await exportDocument(document, title, ext);
47
+ if (selectedDocument) {
48
+ await exportFile(selectedDocument);
74
49
  }
75
- }, [document?.header.revision.global, document?.header.revision.local]);
50
+ }, [selectedDocument]);
76
51
 
52
+ // Loading state component
77
53
  const loadingContent = (
78
- <div className="flex-1 flex justify-center items-center h-full">
54
+ <div className="flex h-full flex-1 items-center justify-center">
79
55
  <DefaultEditorLoader />
80
56
  </div>
81
57
  );
82
58
 
83
- if (!document) return loadingContent;
59
+ if (!selectedDocument) return loadingContent;
84
60
 
85
- const EditorComponent = editorModule.Component as FC<EditorProps<PHDocument>>;
61
+ // Dynamically load the appropriate editor component for this document type
62
+ const EditorComponent = editorModule?.Component;
63
+ if (!EditorComponent) return loadingContent;
86
64
 
87
65
  return showRevisionHistory ? (
66
+ // Revision history view
88
67
  <RevisionHistory
89
- documentId={documentId}
90
- documentTitle={title}
91
- globalOperations={document.operations.global}
92
- key={documentId}
93
- localOperations={document.operations.local}
68
+ documentId={selectedDocument.header.id}
69
+ documentTitle={selectedDocument.header.name}
70
+ globalOperations={selectedDocument.operations.global}
71
+ key={selectedDocument.header.id}
72
+ localOperations={selectedDocument.operations.local}
94
73
  onClose={() => setShowRevisionHistory(false)}
95
74
  />
96
75
  ) : (
76
+ // Main editor view
97
77
  <Suspense fallback={loadingContent}>
78
+ {/* Document toolbar - customize available actions here */}
98
79
  <DocumentToolbar
99
- onClose={onClose}
80
+ onClose={handleClose}
100
81
  onExport={onExport}
101
82
  onShowRevisionHistory={() => setShowRevisionHistory(true)}
102
- onSwitchboardLinkClick={() => {}}
83
+ onSwitchboardLinkClick={() => {}} // Customize switchboard integration
103
84
  title={title}
104
85
  timelineButtonVisible={editorModule.config.timelineEnabled}
105
86
  timelineItems={timelineItems.data}
106
87
  onTimelineItemClick={setSelectedTimelineItem}
107
88
  />
89
+ {/* Dynamic editor component based on document type */}
108
90
  <EditorComponent
109
91
  context={{
110
- ...context,
111
92
  readMode: !!selectedTimelineItem,
112
93
  selectedTimelineRevision: getRevisionFromDate(
113
94
  selectedTimelineItem?.startDate,
114
95
  selectedTimelineItem?.endDate,
115
- document.operations.global,
96
+ selectedDocument.operations.global,
116
97
  ),
117
98
  }}
118
99
  dispatch={dispatch}
@@ -121,4 +102,4 @@ export const EditorContainer: React.FC<EditorContainerProps> = (props) => {
121
102
  />
122
103
  </Suspense>
123
104
  );
124
- };
105
+ };