Skip to content

Commit 92fc323

Browse files
committed
feat(frontend): Restrict editable content to non-editor user
1 parent a77a7fa commit 92fc323

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

frontend/src/features/editor/views/CodeEditor.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
import { onCleanup } from "solid-js";
1+
import { observable, onCleanup } from "solid-js";
22
import { CodeMirror } from "@solid-codemirror/codemirror";
3+
import { Compartment, EditorState } from "@codemirror/state";
34

5+
import { projectAccess } from "@features/colab/stores";
46
import { getNodeByPath } from "@features/file-explorer/stores";
57
import { FileNodeKind } from "@features/file-explorer/types";
8+
import { AccessLevel } from "@features/ws/types";
69

710
import { rustExtensions, syncExtension, syncExtensionListener } from "../utils";
811
import { setEditingFiles, syncFiles } from "../stores";
@@ -16,6 +19,7 @@ export interface CodeEditorProps {
1619

1720
export function CodeEditor(props: CodeEditorProps) {
1821
const [file, _] = getNodeByPath(props.file);
22+
const readOnly = new Compartment();
1923

2024
if (file.kind == FileNodeKind.Folder) {
2125
throw new Error("Really?? Edit a folder?");
@@ -33,11 +37,20 @@ export function CodeEditor(props: CodeEditorProps) {
3337
value={syncFiles[props.file]}
3438
extensions={[
3539
...rustExtensions(styles),
40+
readOnly.of([]),
3641
syncExtension(file.data),
3742
]}
3843
onEditorMount={(editor) => {
3944
editor.setTabFocusMode(true);
4045
syncExtensionListener(editor, file.data.fullPath);
46+
47+
observable(projectAccess).subscribe((access) => {
48+
editor.dispatch({
49+
effects: readOnly.reconfigure(
50+
EditorState.readOnly.of(access !== AccessLevel.Editor),
51+
),
52+
});
53+
});
4154
}}
4255
/>
4356
);

frontend/src/features/file-explorer/views/FileExplorer.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { For, getOwner, Index, runWithOwner } from "solid-js";
1+
import { For } from "solid-js";
22

3+
import { projectAccess } from "@features/colab/stores";
34
import { ContextMenu } from "@features/context-menu/views";
45
import { openFile } from "@features/editor/services";
56
import { onWsMessage } from "@features/ws/services";
6-
import { ServerMessageKind } from "@features/ws/types";
7+
import { AccessLevel, ServerMessageKind } from "@features/ws/types";
78
import { FolderPlusIcon } from "@icons/FolderPlus";
89
import { FolderMinusIcon } from "@icons/FolderMinus";
910
import { BrandsRustIcon } from "@icons/BrandsRust";
@@ -21,6 +22,7 @@ function RenderFolder(props: { data: FolderNode }) {
2122
<details>
2223
<ContextMenu
2324
as="summary"
25+
useRightClick={projectAccess() === AccessLevel.Editor}
2426
options={{
2527
[props.data.name]: { disabled: true },
2628
"Add File": {},
@@ -47,6 +49,7 @@ function RenderFile(props: { data: FileNode }) {
4749
return (
4850
<ContextMenu
4951
as="li"
52+
useRightClick={projectAccess() === AccessLevel.Editor}
5053
class={styles.entry}
5154
options={{
5255
[props.data.filename]: { disabled: true },
@@ -83,6 +86,7 @@ export function FileExplorer() {
8386
return (
8487
<ContextMenu
8588
as="ul"
89+
useRightClick={projectAccess() === AccessLevel.Editor}
8690
class={styles.container}
8791
options={{
8892
"Add File": {

0 commit comments

Comments
 (0)