Skip to content

Commit

Permalink
Fixed Workspace Management
Browse files Browse the repository at this point in the history
  • Loading branch information
R1c4rdCo5t4 committed May 13, 2024
1 parent 2e4ed9d commit 6592390
Show file tree
Hide file tree
Showing 35 changed files with 287 additions and 420 deletions.
34 changes: 20 additions & 14 deletions code/client/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import Header from '@ui/components/header/Header';
import Workspace from '@ui/pages/workspace/Workspace';
import NotFound from '@ui/pages/notfound/NotFound';
import './App.scss';
import { ErrorProvider } from '@domain/error/ErrorContext';
import { ErrorProvider } from '@domain/error/hooks/ErrorContext.tsx';
import Sidebar from '@ui/components/sidebar/Sidebar';
import { WorkspaceProvider } from '@domain/workspace/WorkspaceContext';
import { WorkspaceProvider } from '@domain/workspaces/hooks/WorkspaceContext.tsx';
import Home from '@ui/pages/home/Home.tsx';

function App() {
Expand All @@ -25,18 +25,24 @@ function App() {
element={
<WorkspaceProvider>
<Routes>
<Route path="/" element={
<>
<Sidebar />
<Workspace />
</>
} />
<Route path="/:id" element={
<>
<Sidebar />
<Document />
</>
}/>
<Route
path="/"
element={
<>
<Sidebar />
<Workspace />
</>
}
/>
<Route
path="/:id"
element={
<>
<Sidebar />
<Document />
</>
}
/>
</Routes>
</WorkspaceProvider>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,16 @@ export default (editor: Editor, domainOperations: InputDomainOperations, onForma
/**
* Handles cursor selection
*/
function onSelectionChange() {
function onSelectionChange(blur = false) {
const { selection } = editor;
if (!selection) return;
if (!selection && !blur) return;
const styles = CustomEditor.getMarks(editor) as InlineStyle[];
domainOperations.updateSelection(selection, styles);
}

function onBlur() {
ReactEditor.deselect(editor);
onSelectionChange();
onSelectionChange(true);
}

return { onInput, onPaste, onCut, onSelectionChange, onShortcut, onBlur };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as React from 'react';
import { useState, createContext, useEffect } from 'react';
import ErrorComponent from '@ui/components/error/Error';
import ErrorComponent from '@ui/components/error/Error.tsx';

const ERROR_TIMEOUT = 5000;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useContext } from 'react';
import { ErrorContext } from '@domain/error/ErrorContext';
import { ErrorContext } from '@domain/error/hooks/ErrorContext.tsx';

const useError = () => useContext(ErrorContext);

Expand Down
53 changes: 53 additions & 0 deletions code/client/src/domain/resources/hooks/useResources.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { ResourceType, WorkspaceResource } from '@notespace/shared/src/workspace/types/resource.ts';
import useResourceService from '@/services/resource/useResourceService.ts';
import useSocketListeners from '@/services/communication/socket/useSocketListeners.ts';
import { useCommunication } from '@/services/communication/context/useCommunication.ts';
import { useState } from 'react';

function useResources() {
const service = useResourceService();
const [resources, setResources] = useState<WorkspaceResource[]>([]);
const { socket } = useCommunication();

function onCreateResource(resource: WorkspaceResource) {
setResources([...resources, resource]);
}

async function createResource(name: string, type: ResourceType) {
await service.createResource(name, type);
}

function onDeleteResource(id: string) {
setResources(resources.filter(resource => resource.id !== id));
}

async function deleteResource(id: string) {
await service.deleteResource(id);
}

function onUpdateResource(resource: Partial<WorkspaceResource>) {
setResources(resources.map(res => (res.id === resource.id ? { ...res, ...resource } : res)));
}

async function updateResource(id: string, newProps: Partial<WorkspaceResource>) {
await service.updateResource(id, newProps);
}

useSocketListeners(socket, {
createdResource: onCreateResource,
deletedResource: onDeleteResource,
updatedResource: onUpdateResource,
});

return {
resources,
setResources,
operations: {
createResource,
deleteResource,
updateResource,
},
};
}

export default useResources;
38 changes: 0 additions & 38 deletions code/client/src/domain/workspace/WorkspaceContext.tsx

This file was deleted.

75 changes: 0 additions & 75 deletions code/client/src/domain/workspace/tree/WorkspaceTree.ts

This file was deleted.

7 changes: 0 additions & 7 deletions code/client/src/domain/workspace/tree/useWorkspaceTree.ts

This file was deleted.

Empty file.
49 changes: 49 additions & 0 deletions code/client/src/domain/workspaces/hooks/WorkspaceContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import * as React from 'react';
import { useState, createContext, useEffect } from 'react';
import { Workspace, WorkspaceMetaData } from '@notespace/shared/src/workspace/types/workspace.ts';
import { useCommunication } from '@/services/communication/context/useCommunication.ts';
import useError from '@domain/error/hooks/useError.ts';
import { useParams } from 'react-router-dom';
import useWorkspaceService from '@/services/workspace/useWorkspaceService.ts';
import useResources from '@domain/resources/hooks/useResources.ts';
import { ResourceType, WorkspaceResource } from '@notespace/shared/src/workspace/types/resource.ts';

type ResourceOperationsType = {
createResource: (name: string, type: ResourceType) => Promise<void>;
deleteResource: (id: string) => Promise<void>;
updateResource: (id: string, newProps: Partial<WorkspaceResource>) => Promise<void>;
};

export type WorkspaceContextType = {
workspace?: WorkspaceMetaData;
resources?: WorkspaceResource[];
operations?: ResourceOperationsType;
};

export const WorkspaceContext = createContext<WorkspaceContextType>({});

export function WorkspaceProvider({ children }: { children: React.ReactNode }) {
const services = useWorkspaceService();
const [workspace, setWorkspace] = useState<WorkspaceMetaData | undefined>(undefined);
const { resources, setResources, operations } = useResources();
const { socket } = useCommunication();
const { publishError } = useError();
const { wid } = useParams();

useEffect(() => {
if (!wid) return;
async function fetchWorkspace() {
const { id, name, resources }: Workspace = await services.getWorkspace(wid!);
setWorkspace({ id, name });
console.log(resources);
setResources(resources);
}
socket.emit('joinWorkspace', wid);
fetchWorkspace().catch(publishError);
return () => {
socket.emit('leaveWorkspace');
};
}, [wid, socket, publishError, services, setResources]);

return <WorkspaceContext.Provider value={{ workspace, resources, operations }}>{children}</WorkspaceContext.Provider>;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useContext } from 'react';
import { WorkspaceContext } from '@domain/workspace/WorkspaceContext';
import { WorkspaceContext } from '@domain/workspaces/hooks/WorkspaceContext.tsx';

const useWorkspace = () => useContext(WorkspaceContext);

Expand Down
8 changes: 8 additions & 0 deletions code/client/src/domain/workspaces/hooks/useWorkspaceTree.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { useMemo } from 'react';
import { WorkspaceTree } from '@domain/workspaces/tree/WorkspaceTree.ts';

function useWorkspaceTree() {
return useMemo(() => new WorkspaceTree(), []);
}

export default useWorkspaceTree;
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,24 @@ function useWorkspaces() {
setWorkspaces([...workspaces, workspace]);
}

async function createWorkspace(values: { [key: string]: string }) {
if (!values.name) throw new Error('Workspace name is required');
// ... TODO: validate other fields
const { name, description, visibility, tags, members } = values;
const workspace: WorkspaceInputModel = { name, description, visibility, tags: [tags], members: [members] }; // TODO: fix later
await service.createWorkspace(workspace);
}

function onDeleteWorkspace(id: string) {
setWorkspaces(workspaces.filter(workspace => workspace.id !== id));
}

async function deleteWorkspace(id: string) {
await service.deleteWorkspace(id);
}

function onUpdateWorkspace(workspace: WorkspaceMetaData) {
setWorkspaces(workspaces.map(w => (w.id === workspace.id ? workspace : w)));
}

async function updateWorkspace(workspace: WorkspaceMetaData) {
await service.updateWorkspace(workspace.id, workspace);
async function createWorkspace(workspace: WorkspaceInputModel) {
return await service.createWorkspace(workspace);
}

async function deleteWorkspace(id: string) {
return await service.deleteWorkspace(id);
}

async function updateWorkspace(id: string, newProps: Partial<WorkspaceMetaData>) {
return await service.updateWorkspace(id, newProps);
}

useSocketListeners(socket, {
Expand Down
Loading

0 comments on commit 6592390

Please sign in to comment.