mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
feat: add content cache for memo editor
This commit is contained in:
@ -2,6 +2,7 @@ import { isNumber, last, uniq } from "lodash-es";
|
|||||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useLocalStorage } from "react-use";
|
||||||
import { upsertMemoResource } from "@/helpers/api";
|
import { upsertMemoResource } from "@/helpers/api";
|
||||||
import { TAB_SPACE_WIDTH, UNKNOWN_ID } from "@/helpers/consts";
|
import { TAB_SPACE_WIDTH, UNKNOWN_ID } from "@/helpers/consts";
|
||||||
import { clearContentQueryParam } from "@/helpers/utils";
|
import { clearContentQueryParam } from "@/helpers/utils";
|
||||||
@ -39,6 +40,7 @@ const MemoEditor = (props: Props) => {
|
|||||||
const { className, memoId, onConfirm } = props;
|
const { className, memoId, onConfirm } = props;
|
||||||
const { i18n } = useTranslation();
|
const { i18n } = useTranslation();
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
|
const [contentCache, setContentCache] = useLocalStorage<string>(`memo-editor-${props.memoId || "0"}`, "");
|
||||||
const {
|
const {
|
||||||
state: { systemStatus },
|
state: { systemStatus },
|
||||||
} = useGlobalStore();
|
} = useGlobalStore();
|
||||||
@ -61,6 +63,10 @@ const MemoEditor = (props: Props) => {
|
|||||||
const user = userStore.state.user as User;
|
const user = userStore.state.user as User;
|
||||||
const setting = user.setting;
|
const setting = user.setting;
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
editorRef.current?.setContent(contentCache || "");
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let visibility = setting.memoVisibility;
|
let visibility = setting.memoVisibility;
|
||||||
if (systemStatus.disablePublicMemos && visibility === "PUBLIC") {
|
if (systemStatus.disablePublicMemos && visibility === "PUBLIC") {
|
||||||
@ -83,7 +89,9 @@ const MemoEditor = (props: Props) => {
|
|||||||
resourceList: memo.resourceList,
|
resourceList: memo.resourceList,
|
||||||
relationList: memo.relationList,
|
relationList: memo.relationList,
|
||||||
}));
|
}));
|
||||||
editorRef.current?.setContent(memo.content ?? "");
|
if (!contentCache) {
|
||||||
|
editorRef.current?.setContent(memo.content ?? "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -242,6 +250,7 @@ const MemoEditor = (props: Props) => {
|
|||||||
|
|
||||||
const handleContentChange = (content: string) => {
|
const handleContentChange = (content: string) => {
|
||||||
setHasContent(content !== "");
|
setHasContent(content !== "");
|
||||||
|
setContentCache(content);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSaveBtnClick = async () => {
|
const handleSaveBtnClick = async () => {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
import { useLocalStorage } from "react-use";
|
||||||
import { compare } from "semver";
|
import { compare } from "semver";
|
||||||
import * as api from "@/helpers/api";
|
import * as api from "@/helpers/api";
|
||||||
import storage from "@/helpers/storage";
|
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
|
|
||||||
@ -12,6 +12,7 @@ interface State {
|
|||||||
|
|
||||||
const UpgradeVersionView: React.FC = () => {
|
const UpgradeVersionView: React.FC = () => {
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
|
const [skippedVersion, setSkippedVersion] = useLocalStorage<string>("skipped_version", "0.0.0");
|
||||||
const profile = globalStore.state.systemStatus.profile;
|
const profile = globalStore.state.systemStatus.profile;
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
latestVersion: "",
|
latestVersion: "",
|
||||||
@ -20,7 +21,6 @@ const UpgradeVersionView: React.FC = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
api.getRepoLatestTag().then((latestTag) => {
|
api.getRepoLatestTag().then((latestTag) => {
|
||||||
const { skippedVersion } = storage.get(["skippedVersion"]);
|
|
||||||
const latestVersion = latestTag.slice(1) || "0.0.0";
|
const latestVersion = latestTag.slice(1) || "0.0.0";
|
||||||
const currentVersion = profile.version;
|
const currentVersion = profile.version;
|
||||||
const skipped = skippedVersion ? skippedVersion === latestVersion : false;
|
const skipped = skippedVersion ? skippedVersion === latestVersion : false;
|
||||||
@ -32,7 +32,7 @@ const UpgradeVersionView: React.FC = () => {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const onSkip = () => {
|
const onSkip = () => {
|
||||||
storage.set({ skippedVersion: state.latestVersion });
|
setSkippedVersion(state.latestVersion);
|
||||||
setState((s) => ({
|
setState((s) => ({
|
||||||
...s,
|
...s,
|
||||||
show: false,
|
show: false,
|
||||||
|
@ -2,18 +2,12 @@
|
|||||||
* Define storage data type
|
* Define storage data type
|
||||||
*/
|
*/
|
||||||
interface StorageData {
|
interface StorageData {
|
||||||
// Editor content cache
|
|
||||||
editorContentCache: string;
|
|
||||||
// Editing memo id cache
|
|
||||||
editingMemoIdCache: MemoId;
|
|
||||||
// locale
|
// locale
|
||||||
locale: Locale;
|
locale: Locale;
|
||||||
// appearance
|
// appearance
|
||||||
appearance: Appearance;
|
appearance: Appearance;
|
||||||
// local setting
|
// local setting
|
||||||
localSetting: LocalSetting;
|
localSetting: LocalSetting;
|
||||||
// skipped version
|
|
||||||
skippedVersion: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type StorageKey = keyof StorageData;
|
type StorageKey = keyof StorageData;
|
||||||
|
Reference in New Issue
Block a user