Added unsaved changes indicator for text editor
This commit is contained in:
parent
5f201a35ec
commit
cc113f15c8
1 changed files with 23 additions and 2 deletions
|
|
@ -8,20 +8,25 @@ import { HeaderMenu } from "../.common/HeaderMenu.jsx";
|
||||||
* @param {Object} props
|
* @param {Object} props
|
||||||
* @param {VirtualFile} props.file
|
* @param {VirtualFile} props.file
|
||||||
*/
|
*/
|
||||||
export function TextEditor({ file }) {
|
export function TextEditor({ file, setTitle }) {
|
||||||
const [currentFile, setCurrentFile] = useState(file);
|
const [currentFile, setCurrentFile] = useState(file);
|
||||||
const [content, setContent] = useState(file?.content);
|
const [content, setContent] = useState(file?.content);
|
||||||
|
const [unsavedChanges, setUnsavedChanges] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setContent(currentFile?.content ?? "");
|
setContent(currentFile?.content ?? "");
|
||||||
}, [currentFile]);
|
}, [currentFile]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setTitle(`${currentFile?.id ?? "Untitled"}${unsavedChanges ? "*" : ""} - Text Editor`);
|
||||||
|
}, [currentFile, setTitle, unsavedChanges]);
|
||||||
|
|
||||||
const newText = () => {
|
const newText = () => {
|
||||||
setCurrentFile(null);
|
setCurrentFile(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
const saveTextAs = () => {
|
const saveTextAs = () => {
|
||||||
|
setUnsavedChanges(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const saveText = () => {
|
const saveText = () => {
|
||||||
|
|
@ -29,13 +34,28 @@ export function TextEditor({ file }) {
|
||||||
return saveTextAs();
|
return saveTextAs();
|
||||||
|
|
||||||
currentFile.content = content;
|
currentFile.content = content;
|
||||||
|
setUnsavedChanges(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const onChange = (event) => {
|
const onChange = (event) => {
|
||||||
const value = event.target.value;
|
const value = event.target.value;
|
||||||
|
|
||||||
|
if (currentFile != null) {
|
||||||
|
setUnsavedChanges(currentFile.content !== value);
|
||||||
|
} else {
|
||||||
|
setUnsavedChanges(value !== "");
|
||||||
|
}
|
||||||
|
|
||||||
return setContent(value);
|
return setContent(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onKeyDown = (event) => {
|
||||||
|
if (event.key === "s" && event.ctrlKey) {
|
||||||
|
event.preventDefault();
|
||||||
|
saveText();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.Container}>
|
<div className={styles.Container}>
|
||||||
<HeaderMenu
|
<HeaderMenu
|
||||||
|
|
@ -47,6 +67,7 @@ export function TextEditor({ file }) {
|
||||||
className={styles.View}
|
className={styles.View}
|
||||||
value={content}
|
value={content}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
|
onKeyDown={onKeyDown}
|
||||||
spellCheck={false}
|
spellCheck={false}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
autoFocus
|
autoFocus
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue