React hooks for Workspace-FS - Multi-project file system management
npm install @workspace-fs/reactReact hooks for Workspace-FS - Multi-project file system management



``bash`
npm install @workspace-fs/react @workspace-fs/coreor
yarn add @workspace-fs/react @workspace-fs/coreor
pnpm add @workspace-fs/react @workspace-fs/core
The WorkspaceProvider requires a pre-configured WorkspaceFileSystem instance. You are responsible for:
1. Creating the workspace instance
2. Initializing it with your providers
3. Passing it to the WorkspaceProvider
This gives you full control over the workspace configuration and lifecycle.
`tsx
import { WorkspaceProvider, useWorkspace, useActiveProject } from '@workspace-fs/react';
import { WorkspaceFileSystem } from '@workspace-fs/core';
import { memoryProvider } from '@firesystem/memory/provider';
import { indexedDBProvider } from '@firesystem/indexeddb/provider';
// Create your workspace instance
const workspace = new WorkspaceFileSystem();
// Register your providers first
workspace.registerProvider(memoryProvider);
workspace.registerProvider(indexedDBProvider);
// Then initialize
await workspace.initialize();
function App() {
return (
);
}
function Workspace() {
const { loadProject, setActiveProject } = useWorkspace();
const { project, fs } = useActiveProject();
const handleCreateProject = async () => {
const project = await loadProject({
id: project-${Date.now()},`
name: 'My Project',
source: { type: 'memory', config: {} }
});
await setActiveProject(project.id);
};
if (!fs) {
return ;
}
return (
{project?.name}
{/ Use fs to read/write files /}
);
}
- useWorkspace() - Main workspace managementuseProjects()
- - Reactive list of all projectsuseProject(id)
- - Access specific project by IDuseActiveProject()
- - Current active project with fs shortcutuseWorkspaceEvents(event, callback)
- - Listen to workspace events
- useProjectSelector(id, selector) - Select specific data from a projectuseProjectsSelector(selector)
- - Select data from projects listuseActiveProjectSelector(selector)
- - Select data from active project
`tsx`
function ProjectList() {
const { projects, activeProjectId } = useProjects();
return (
{projects.map(project => (
{project.name} ({project.source.type})
))}
);
}
`tsxFile ${path} saved in project ${projectId}
function FileWatcher() {
useWorkspaceEvents('project:file:written', ({ projectId, path }) => {
console.log();`
});
return null;
}
`tsx`
function ProjectName({ projectId }: { projectId: string }) {
// Only re-renders when name changes, not on any project update
const name = useProjectSelector(projectId, p => p?.name);
return {name};
}
`tsx
import { WorkspaceProvider, useWorkspace, useProjects } from '@workspace-fs/react';
import { WorkspaceFileSystem } from '@workspace-fs/core';
import { memoryProvider } from '@firesystem/memory/provider';
import { indexedDBProvider } from '@firesystem/indexeddb/provider';
// Create and configure workspace outside of React
const workspace = new WorkspaceFileSystem();
// Initialize before rendering
async function initApp() {
// Register providers
workspace.registerProvider(memoryProvider);
workspace.registerProvider(indexedDBProvider);
// Initialize workspace
await workspace.initialize();
// Now render your app
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
);
}
initApp();
`
The context provider that makes the workspace available to all child components.
`tsx`
interface WorkspaceProviderProps {
children: React.ReactNode;
workspace: WorkspaceFileSystem; // Required - your configured workspace instance
}
All hooks require the component to be wrapped in a WorkspaceProvider`.
MIT