From 1254d03eb6e9ed0cf7e2414d0d2381946cdb9162 Mon Sep 17 00:00:00 2001 From: Prozilla Date: Sat, 29 Jul 2023 17:40:47 +0200 Subject: [PATCH] Added text editor --- .../media/applications/icons/text-editor.svg | 57 +++++++++++++++++++ .../applications/.common/HeaderMenu.jsx | 36 ++++++++++++ .../.common/HeaderMenu.module.css | 6 ++ .../{templates => .templates}/WebView.jsx | 0 .../WebView.module.css | 0 .../file-explorer/FileExplorer.jsx | 3 + .../applications/text-editor/TextEditor.jsx | 56 ++++++++++++++++++ .../text-editor/TextEditor.module.css | 17 ++++++ src/components/utils/DropdownButton.jsx | 36 ++++++++++++ .../utils/DropdownButton.module.css | 44 ++++++++++++++ src/components/windows/Window.module.css | 4 +- src/features/applications/applications.js | 7 ++- src/features/windows/windows.js | 3 +- src/hooks/utils/outsideClick.js | 38 +++++++++++++ src/hooks/virtual-drive/VirtualRootContext.js | 8 ++- 15 files changed, 309 insertions(+), 6 deletions(-) create mode 100644 public/media/applications/icons/text-editor.svg create mode 100644 src/components/applications/.common/HeaderMenu.jsx create mode 100644 src/components/applications/.common/HeaderMenu.module.css rename src/components/applications/{templates => .templates}/WebView.jsx (100%) rename src/components/applications/{templates => .templates}/WebView.module.css (100%) create mode 100644 src/components/applications/text-editor/TextEditor.jsx create mode 100644 src/components/applications/text-editor/TextEditor.module.css create mode 100644 src/components/utils/DropdownButton.jsx create mode 100644 src/components/utils/DropdownButton.module.css create mode 100644 src/hooks/utils/outsideClick.js diff --git a/public/media/applications/icons/text-editor.svg b/public/media/applications/icons/text-editor.svg new file mode 100644 index 0000000..32946dd --- /dev/null +++ b/public/media/applications/icons/text-editor.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/applications/.common/HeaderMenu.jsx b/src/components/applications/.common/HeaderMenu.jsx new file mode 100644 index 0000000..ba9513a --- /dev/null +++ b/src/components/applications/.common/HeaderMenu.jsx @@ -0,0 +1,36 @@ +import { DropdownButton } from "../../utils/DropdownButton.jsx"; +import styles from "./HeaderMenu.module.css"; + +/** + * @param {Object} props + * @param {Function} props.onNew + * @param {Function} props.onOpen + * @param {Function} props.onSave + * @param {Function} props.onSaveAs + * @param {Function} props.onExit + */ +export function HeaderMenu({ onNew, onOpen, onSave, onSaveAs, onExit }) { + return ( +
+ { + onNew?.(); + }, + "Open": () => { + onOpen?.(); + }, + "Save": () => { + onSave?.(); + }, + "Save as": () => { + onSaveAs?.(); + }, + "Exit": () => { + onExit?.(); + }, + }}/> + + +
+ ); +} \ No newline at end of file diff --git a/src/components/applications/.common/HeaderMenu.module.css b/src/components/applications/.common/HeaderMenu.module.css new file mode 100644 index 0000000..237e095 --- /dev/null +++ b/src/components/applications/.common/HeaderMenu.module.css @@ -0,0 +1,6 @@ +.Container { + display: flex; + width: 100%; + height: 1.25rem; + background-color: var(--background-color-a); +} \ No newline at end of file diff --git a/src/components/applications/templates/WebView.jsx b/src/components/applications/.templates/WebView.jsx similarity index 100% rename from src/components/applications/templates/WebView.jsx rename to src/components/applications/.templates/WebView.jsx diff --git a/src/components/applications/templates/WebView.module.css b/src/components/applications/.templates/WebView.module.css similarity index 100% rename from src/components/applications/templates/WebView.module.css rename to src/components/applications/.templates/WebView.module.css diff --git a/src/components/applications/file-explorer/FileExplorer.jsx b/src/components/applications/file-explorer/FileExplorer.jsx index 8a2ef8e..2a4b8aa 100644 --- a/src/components/applications/file-explorer/FileExplorer.jsx +++ b/src/components/applications/file-explorer/FileExplorer.jsx @@ -18,6 +18,9 @@ function FilePreview({ file }) { case "png": preview = break; + case "txt": + preview = + break; default: preview = break; diff --git a/src/components/applications/text-editor/TextEditor.jsx b/src/components/applications/text-editor/TextEditor.jsx new file mode 100644 index 0000000..736cc0e --- /dev/null +++ b/src/components/applications/text-editor/TextEditor.jsx @@ -0,0 +1,56 @@ +import { useEffect, useState } from "react"; +// eslint-disable-next-line no-unused-vars +import { VirtualFile } from "../../../features/virtual-drive/virtual-file.js"; +import styles from "./TextEditor.module.css"; +import { HeaderMenu } from "../.common/HeaderMenu.jsx"; + +/** + * @param {Object} props + * @param {VirtualFile} props.file + */ +export function TextEditor({ file }) { + const [currentFile, setCurrentFile] = useState(file); + const [content, setContent] = useState(file?.content); + + useEffect(() => { + setContent(currentFile?.content ?? ""); + }, [currentFile]); + + const newText = () => { + setCurrentFile(null); + } + + const saveTextAs = () => { + + } + + const saveText = () => { + if (currentFile == null) + return saveTextAs(); + + currentFile.content = content; + } + + const onChange = (event) => { + const value = event.target.value; + return setContent(value); + }; + + return ( +
+ +