mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: remove v1 prefix in store name
This commit is contained in:
@ -6,14 +6,14 @@ import storage from "./helpers/storage";
|
|||||||
import { getSystemColorScheme } from "./helpers/utils";
|
import { getSystemColorScheme } from "./helpers/utils";
|
||||||
import useNavigateTo from "./hooks/useNavigateTo";
|
import useNavigateTo from "./hooks/useNavigateTo";
|
||||||
import { useGlobalStore } from "./store/module";
|
import { useGlobalStore } from "./store/module";
|
||||||
import { useUserV1Store } from "./store/v1";
|
import { useUserStore } from "./store/v1";
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const { i18n } = useTranslation();
|
const { i18n } = useTranslation();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const { mode, setMode } = useColorScheme();
|
const { mode, setMode } = useColorScheme();
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const { appearance, locale, systemStatus } = globalStore.state;
|
const { appearance, locale, systemStatus } = globalStore.state;
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ const App = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const initialState = async () => {
|
const initialState = async () => {
|
||||||
try {
|
try {
|
||||||
await userV1Store.fetchCurrentUser();
|
await userStore.fetchCurrentUser();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { User } from "@/types/proto/api/v2/user_service";
|
import { User } from "@/types/proto/api/v2/user_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
@ -13,7 +13,7 @@ interface Props extends DialogProps {
|
|||||||
const ChangeMemberPasswordDialog: React.FC<Props> = (props: Props) => {
|
const ChangeMemberPasswordDialog: React.FC<Props> = (props: Props) => {
|
||||||
const { user, destroy } = props;
|
const { user, destroy } = props;
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [newPassword, setNewPassword] = useState("");
|
const [newPassword, setNewPassword] = useState("");
|
||||||
const [newPasswordAgain, setNewPasswordAgain] = useState("");
|
const [newPasswordAgain, setNewPasswordAgain] = useState("");
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ const ChangeMemberPasswordDialog: React.FC<Props> = (props: Props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await userV1Store.updateUser(
|
await userStore.updateUser(
|
||||||
{
|
{
|
||||||
name: user.name,
|
name: user.name,
|
||||||
password: newPassword,
|
password: newPassword,
|
||||||
|
@ -2,7 +2,7 @@ import { Button } from "@mui/joy";
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { getNormalizedTimeString, getUnixTime } from "@/helpers/datetime";
|
import { getNormalizedTimeString, getUnixTime } from "@/helpers/datetime";
|
||||||
import { useMemoV1Store } from "@/store/v1";
|
import { useMemoStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
@ -14,7 +14,7 @@ interface Props extends DialogProps {
|
|||||||
const ChangeMemoCreatedTsDialog: React.FC<Props> = (props: Props) => {
|
const ChangeMemoCreatedTsDialog: React.FC<Props> = (props: Props) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const { destroy, memoId } = props;
|
const { destroy, memoId } = props;
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const [createdAt, setCreatedAt] = useState("");
|
const [createdAt, setCreatedAt] = useState("");
|
||||||
const maxDatetimeValue = getNormalizedTimeString();
|
const maxDatetimeValue = getNormalizedTimeString();
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
|
|||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
@ -12,7 +12,7 @@ type Props = DialogProps;
|
|||||||
const ChangePasswordDialog: React.FC<Props> = ({ destroy }: Props) => {
|
const ChangePasswordDialog: React.FC<Props> = ({ destroy }: Props) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
const profile = globalStore.state.systemStatus.profile;
|
const profile = globalStore.state.systemStatus.profile;
|
||||||
const [newPassword, setNewPassword] = useState("");
|
const [newPassword, setNewPassword] = useState("");
|
||||||
@ -52,7 +52,7 @@ const ChangePasswordDialog: React.FC<Props> = ({ destroy }: Props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await userV1Store.updateUser(
|
await userStore.updateUser(
|
||||||
{
|
{
|
||||||
name: currentUser.name,
|
name: currentUser.name,
|
||||||
password: newPassword,
|
password: newPassword,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useMemoV1Store } from "@/store/v1";
|
import { useMemoStore } from "@/store/v1";
|
||||||
import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
||||||
import { Memo } from "@/types/proto/api/v2/memo_service";
|
import { Memo } from "@/types/proto/api/v2/memo_service";
|
||||||
import Icon from "../Icon";
|
import Icon from "../Icon";
|
||||||
@ -11,7 +11,7 @@ interface Props {
|
|||||||
|
|
||||||
const RelationListView = (props: Props) => {
|
const RelationListView = (props: Props) => {
|
||||||
const { relationList, setRelationList } = props;
|
const { relationList, setRelationList } = props;
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const [referencingMemoList, setReferencingMemoList] = useState<Memo[]>([]);
|
const [referencingMemoList, setReferencingMemoList] = useState<Memo[]>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -7,7 +7,7 @@ import useLocalStorage from "react-use/lib/useLocalStorage";
|
|||||||
import { memoServiceClient } from "@/grpcweb";
|
import { memoServiceClient } from "@/grpcweb";
|
||||||
import { TAB_SPACE_WIDTH, UNKNOWN_ID } from "@/helpers/consts";
|
import { TAB_SPACE_WIDTH, UNKNOWN_ID } from "@/helpers/consts";
|
||||||
import { useGlobalStore, useResourceStore } from "@/store/module";
|
import { useGlobalStore, useResourceStore } from "@/store/module";
|
||||||
import { useMemoV1Store, useUserV1Store } from "@/store/v1";
|
import { useMemoStore, useUserStore } from "@/store/v1";
|
||||||
import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
||||||
import { Visibility } from "@/types/proto/api/v2/memo_service";
|
import { Visibility } from "@/types/proto/api/v2/memo_service";
|
||||||
import { Resource } from "@/types/proto/api/v2/resource_service";
|
import { Resource } from "@/types/proto/api/v2/resource_service";
|
||||||
@ -49,8 +49,8 @@ const MemoEditor = (props: Props) => {
|
|||||||
const {
|
const {
|
||||||
state: { systemStatus },
|
state: { systemStatus },
|
||||||
} = useGlobalStore();
|
} = useGlobalStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const resourceStore = useResourceStore();
|
const resourceStore = useResourceStore();
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
memoVisibility: Visibility.PRIVATE,
|
memoVisibility: Visibility.PRIVATE,
|
||||||
@ -61,7 +61,7 @@ const MemoEditor = (props: Props) => {
|
|||||||
});
|
});
|
||||||
const [hasContent, setHasContent] = useState<boolean>(false);
|
const [hasContent, setHasContent] = useState<boolean>(false);
|
||||||
const editorRef = useRef<EditorRefActions>(null);
|
const editorRef = useRef<EditorRefActions>(null);
|
||||||
const userSetting = userV1Store.userSetting as UserSetting;
|
const userSetting = userStore.userSetting as UserSetting;
|
||||||
const referenceRelations = memoId
|
const referenceRelations = memoId
|
||||||
? state.relationList.filter(
|
? state.relationList.filter(
|
||||||
(relation) => relation.memoId === memoId && relation.relatedMemoId !== memoId && relation.type === MemoRelation_Type.REFERENCE
|
(relation) => relation.memoId === memoId && relation.relatedMemoId !== memoId && relation.type === MemoRelation_Type.REFERENCE
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Tooltip } from "@mui/joy";
|
import { Tooltip } from "@mui/joy";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { useMemoV1Store } from "@/store/v1";
|
import { useMemoStore } from "@/store/v1";
|
||||||
import { MemoRelation } from "@/types/proto/api/v2/memo_relation_service";
|
import { MemoRelation } from "@/types/proto/api/v2/memo_relation_service";
|
||||||
import { Memo } from "@/types/proto/api/v2/memo_service";
|
import { Memo } from "@/types/proto/api/v2/memo_service";
|
||||||
import Icon from "./Icon";
|
import Icon from "./Icon";
|
||||||
@ -13,7 +13,7 @@ interface Props {
|
|||||||
|
|
||||||
const MemoRelationListView = (props: Props) => {
|
const MemoRelationListView = (props: Props) => {
|
||||||
const { memo, relationList } = props;
|
const { memo, relationList } = props;
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const [referencingMemoList, setReferencingMemoList] = useState<Memo[]>([]);
|
const [referencingMemoList, setReferencingMemoList] = useState<Memo[]>([]);
|
||||||
const [referencedMemoList, setReferencedMemoList] = useState<Memo[]>([]);
|
const [referencedMemoList, setReferencedMemoList] = useState<Memo[]>([]);
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import { getRelativeTimeString, getTimeStampByDate } from "@/helpers/datetime";
|
|||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useFilterStore } from "@/store/module";
|
import { useFilterStore } from "@/store/module";
|
||||||
import { useUserV1Store, extractUsernameFromName, useMemoV1Store } from "@/store/v1";
|
import { useUserStore, extractUsernameFromName, useMemoStore } from "@/store/v1";
|
||||||
import { RowStatus } from "@/types/proto/api/v2/common";
|
import { RowStatus } from "@/types/proto/api/v2/common";
|
||||||
import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
||||||
import { Memo, Visibility } from "@/types/proto/api/v2/memo_service";
|
import { Memo, Visibility } from "@/types/proto/api/v2/memo_service";
|
||||||
@ -42,12 +42,12 @@ const MemoView: React.FC<Props> = (props: Props) => {
|
|||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const { i18n } = useTranslation();
|
const { i18n } = useTranslation();
|
||||||
const filterStore = useFilterStore();
|
const filterStore = useFilterStore();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const [shouldRender, setShouldRender] = useState<boolean>(lazyRendering ? false : true);
|
const [shouldRender, setShouldRender] = useState<boolean>(lazyRendering ? false : true);
|
||||||
const [displayTime, setDisplayTime] = useState<string>(getRelativeTimeString(getTimeStampByDate(memo.displayTime)));
|
const [displayTime, setDisplayTime] = useState<string>(getRelativeTimeString(getTimeStampByDate(memo.displayTime)));
|
||||||
const [creator, setCreator] = useState(userV1Store.getUserByUsername(extractUsernameFromName(memo.creator)));
|
const [creator, setCreator] = useState(userStore.getUserByUsername(extractUsernameFromName(memo.creator)));
|
||||||
const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined);
|
const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined);
|
||||||
const memoContainerRef = useRef<HTMLDivElement>(null);
|
const memoContainerRef = useRef<HTMLDivElement>(null);
|
||||||
const referenceRelations = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE);
|
const referenceRelations = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE);
|
||||||
@ -58,7 +58,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
|
|||||||
if (creator) return;
|
if (creator) return;
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const user = await userV1Store.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
const user = await userStore.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
||||||
setCreator(user);
|
setCreator(user);
|
||||||
})();
|
})();
|
||||||
}, [memo.creator]);
|
}, [memo.creator]);
|
||||||
|
@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react";
|
|||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { userServiceClient } from "@/grpcweb";
|
import { userServiceClient } from "@/grpcweb";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import { UserNamePrefix, extractUsernameFromName, useUserV1Store } from "@/store/v1";
|
import { UserNamePrefix, extractUsernameFromName, useUserStore } from "@/store/v1";
|
||||||
import { RowStatus } from "@/types/proto/api/v2/common";
|
import { RowStatus } from "@/types/proto/api/v2/common";
|
||||||
import { User, User_Role } from "@/types/proto/api/v2/user_service";
|
import { User, User_Role } from "@/types/proto/api/v2/user_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
@ -19,7 +19,7 @@ interface State {
|
|||||||
const MemberSection = () => {
|
const MemberSection = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
createUserUsername: "",
|
createUserUsername: "",
|
||||||
createUserPassword: "",
|
createUserPassword: "",
|
||||||
@ -31,7 +31,7 @@ const MemberSection = () => {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const fetchUserList = async () => {
|
const fetchUserList = async () => {
|
||||||
const users = await userV1Store.fetchUsers();
|
const users = await userStore.fetchUsers();
|
||||||
setUserList(users);
|
setUserList(users);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ const MemberSection = () => {
|
|||||||
style: "danger",
|
style: "danger",
|
||||||
dialogName: "delete-user-dialog",
|
dialogName: "delete-user-dialog",
|
||||||
onConfirm: async () => {
|
onConfirm: async () => {
|
||||||
await userV1Store.deleteUser(user.name);
|
await userStore.deleteUser(user.name);
|
||||||
fetchUserList();
|
fetchUserList();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -3,7 +3,7 @@ import { useState } from "react";
|
|||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { Visibility } from "@/types/proto/api/v2/memo_service";
|
import { Visibility } from "@/types/proto/api/v2/memo_service";
|
||||||
import { UserSetting } from "@/types/proto/api/v2/user_service";
|
import { UserSetting } from "@/types/proto/api/v2/user_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
@ -18,13 +18,13 @@ import "@/less/settings/preferences-section.less";
|
|||||||
const PreferencesSection = () => {
|
const PreferencesSection = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const { appearance, locale } = globalStore.state;
|
const { appearance, locale } = globalStore.state;
|
||||||
const setting = userV1Store.userSetting as UserSetting;
|
const setting = userStore.userSetting as UserSetting;
|
||||||
const [telegramUserId, setTelegramUserId] = useState<string>(setting.telegramUserId);
|
const [telegramUserId, setTelegramUserId] = useState<string>(setting.telegramUserId);
|
||||||
|
|
||||||
const handleLocaleSelectChange = async (locale: Locale) => {
|
const handleLocaleSelectChange = async (locale: Locale) => {
|
||||||
await userV1Store.updateUserSetting(
|
await userStore.updateUserSetting(
|
||||||
{
|
{
|
||||||
locale,
|
locale,
|
||||||
},
|
},
|
||||||
@ -34,7 +34,7 @@ const PreferencesSection = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleAppearanceSelectChange = async (appearance: Appearance) => {
|
const handleAppearanceSelectChange = async (appearance: Appearance) => {
|
||||||
await userV1Store.updateUserSetting(
|
await userStore.updateUserSetting(
|
||||||
{
|
{
|
||||||
appearance,
|
appearance,
|
||||||
},
|
},
|
||||||
@ -44,7 +44,7 @@ const PreferencesSection = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleDefaultMemoVisibilityChanged = async (value: string) => {
|
const handleDefaultMemoVisibilityChanged = async (value: string) => {
|
||||||
await userV1Store.updateUserSetting(
|
await userStore.updateUserSetting(
|
||||||
{
|
{
|
||||||
memoVisibility: value,
|
memoVisibility: value,
|
||||||
},
|
},
|
||||||
@ -54,7 +54,7 @@ const PreferencesSection = () => {
|
|||||||
|
|
||||||
const handleSaveTelegramUserId = async () => {
|
const handleSaveTelegramUserId = async () => {
|
||||||
try {
|
try {
|
||||||
await userV1Store.updateUserSetting(
|
await userStore.updateUserSetting(
|
||||||
{
|
{
|
||||||
telegramUserId: telegramUserId,
|
telegramUserId: telegramUserId,
|
||||||
},
|
},
|
||||||
|
@ -5,7 +5,7 @@ import { toast } from "react-hot-toast";
|
|||||||
import { getDateTimeString, getTimeString } from "@/helpers/datetime";
|
import { getDateTimeString, getTimeString } from "@/helpers/datetime";
|
||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import toImage from "@/labs/html2image";
|
import toImage from "@/labs/html2image";
|
||||||
import { useUserV1Store, extractUsernameFromName } from "@/store/v1";
|
import { useUserStore, extractUsernameFromName } from "@/store/v1";
|
||||||
import { Memo } from "@/types/proto/api/v2/memo_service";
|
import { Memo } from "@/types/proto/api/v2/memo_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
@ -22,15 +22,15 @@ interface Props extends DialogProps {
|
|||||||
const ShareMemoDialog: React.FC<Props> = (props: Props) => {
|
const ShareMemoDialog: React.FC<Props> = (props: Props) => {
|
||||||
const { memo, destroy } = props;
|
const { memo, destroy } = props;
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const downloadingImageState = useLoading(false);
|
const downloadingImageState = useLoading(false);
|
||||||
const loadingState = useLoading();
|
const loadingState = useLoading();
|
||||||
const memoElRef = useRef<HTMLDivElement>(null);
|
const memoElRef = useRef<HTMLDivElement>(null);
|
||||||
const user = userV1Store.getUserByUsername(extractUsernameFromName(memo.creator));
|
const user = userStore.getUserByUsername(extractUsernameFromName(memo.creator));
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
(async () => {
|
(async () => {
|
||||||
await userV1Store.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
await userStore.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
||||||
loadingState.setFinish();
|
loadingState.setFinish();
|
||||||
})();
|
})();
|
||||||
}, []);
|
}, []);
|
||||||
|
@ -3,7 +3,7 @@ import { useEffect, useState } from "react";
|
|||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { convertFileToBase64 } from "@/helpers/utils";
|
import { convertFileToBase64 } from "@/helpers/utils";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import { UserNamePrefix, useUserV1Store } from "@/store/v1";
|
import { UserNamePrefix, useUserStore } from "@/store/v1";
|
||||||
import { User as UserPb } from "@/types/proto/api/v2/user_service";
|
import { User as UserPb } from "@/types/proto/api/v2/user_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import { generateDialog } from "./Dialog";
|
import { generateDialog } from "./Dialog";
|
||||||
@ -22,7 +22,7 @@ interface State {
|
|||||||
const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
|
const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
avatarUrl: currentUser.avatarUrl,
|
avatarUrl: currentUser.avatarUrl,
|
||||||
username: currentUser.name.replace(UserNamePrefix, ""),
|
username: currentUser.name.replace(UserNamePrefix, ""),
|
||||||
@ -108,7 +108,7 @@ const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
|
|||||||
if (!isEqual(currentUser.email, state.email)) {
|
if (!isEqual(currentUser.email, state.email)) {
|
||||||
updateMask.push("email");
|
updateMask.push("email");
|
||||||
}
|
}
|
||||||
await userV1Store.updateUser(
|
await userStore.updateUser(
|
||||||
UserPb.fromPartial({
|
UserPb.fromPartial({
|
||||||
name: `${UserNamePrefix}${state.username}`,
|
name: `${UserNamePrefix}${state.username}`,
|
||||||
id: currentUser.id,
|
id: currentUser.id,
|
||||||
|
@ -6,7 +6,7 @@ import * as utils from "@/helpers/utils";
|
|||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import { useUserV1Store, extractUsernameFromName, useMemoV1Store } from "@/store/v1";
|
import { useUserStore, extractUsernameFromName, useMemoStore } from "@/store/v1";
|
||||||
import { useTranslate, Translations } from "@/utils/i18n";
|
import { useTranslate, Translations } from "@/utils/i18n";
|
||||||
import "@/less/usage-heat-map.less";
|
import "@/less/usage-heat-map.less";
|
||||||
|
|
||||||
@ -34,9 +34,9 @@ interface DailyUsageStat {
|
|||||||
const UsageHeatMap = () => {
|
const UsageHeatMap = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const todayTimeStamp = getDateStampByDate(Date.now());
|
const todayTimeStamp = getDateStampByDate(Date.now());
|
||||||
const weekDay = new Date(todayTimeStamp).getDay();
|
const weekDay = new Date(todayTimeStamp).getDay();
|
||||||
const weekFromMonday = ["zh-Hans", "ko"].includes(useGlobalStore().state.locale);
|
const weekFromMonday = ["zh-Hans", "ko"].includes(useGlobalStore().state.locale);
|
||||||
@ -49,10 +49,10 @@ const UsageHeatMap = () => {
|
|||||||
const [createdDays, setCreatedDays] = useState(0);
|
const [createdDays, setCreatedDays] = useState(0);
|
||||||
const [allStat, setAllStat] = useState<DailyUsageStat[]>(getInitialUsageStat(usedDaysAmount, beginDayTimestamp));
|
const [allStat, setAllStat] = useState<DailyUsageStat[]>(getInitialUsageStat(usedDaysAmount, beginDayTimestamp));
|
||||||
const containerElRef = useRef<HTMLDivElement>(null);
|
const containerElRef = useRef<HTMLDivElement>(null);
|
||||||
const memos = Array.from(memoStore.getState().memoById.values());
|
const memos = Object.values(memoStore.getState().memoMapById);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
userV1Store.getOrFetchUserByUsername(extractUsernameFromName(user.name)).then((user) => {
|
userStore.getOrFetchUserByUsername(extractUsernameFromName(user.name)).then((user) => {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { User } from "@/types/proto/api/v2/user_service";
|
import { User } from "@/types/proto/api/v2/user_service";
|
||||||
|
|
||||||
const useCurrentUser = () => {
|
const useCurrentUser = () => {
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
return userV1Store.currentUser as User;
|
return userStore.currentUser as User;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default useCurrentUser;
|
export default useCurrentUser;
|
||||||
|
@ -10,7 +10,7 @@ import { memoServiceClient } from "@/grpcweb";
|
|||||||
import { getDateTimeString } from "@/helpers/datetime";
|
import { getDateTimeString } from "@/helpers/datetime";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import { useMemoV1Store } from "@/store/v1";
|
import { useMemoStore } from "@/store/v1";
|
||||||
import { RowStatus } from "@/types/proto/api/v2/common";
|
import { RowStatus } from "@/types/proto/api/v2/common";
|
||||||
import { Memo } from "@/types/proto/api/v2/memo_service";
|
import { Memo } from "@/types/proto/api/v2/memo_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
@ -19,7 +19,7 @@ const Archived = () => {
|
|||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const loadingState = useLoading();
|
const loadingState = useLoading();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const [archivedMemos, setArchivedMemos] = useState<Memo[]>([]);
|
const [archivedMemos, setArchivedMemos] = useState<Memo[]>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -6,7 +6,7 @@ import Icon from "@/components/Icon";
|
|||||||
import * as api from "@/helpers/api";
|
import * as api from "@/helpers/api";
|
||||||
import { absolutifyLink } from "@/helpers/utils";
|
import { absolutifyLink } from "@/helpers/utils";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
@ -18,7 +18,7 @@ const AuthCallback = () => {
|
|||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
loading: true,
|
loading: true,
|
||||||
errorMessage: "",
|
errorMessage: "",
|
||||||
@ -40,7 +40,7 @@ const AuthCallback = () => {
|
|||||||
errorMessage: "",
|
errorMessage: "",
|
||||||
});
|
});
|
||||||
if (user) {
|
if (user) {
|
||||||
await userV1Store.fetchCurrentUser();
|
await userStore.fetchCurrentUser();
|
||||||
navigateTo("/");
|
navigateTo("/");
|
||||||
} else {
|
} else {
|
||||||
toast.error(t("message.login-failed"));
|
toast.error(t("message.login-failed"));
|
||||||
|
@ -7,14 +7,14 @@ import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts";
|
|||||||
import { getTimeStampByDate } from "@/helpers/datetime";
|
import { getTimeStampByDate } from "@/helpers/datetime";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import { useFilterStore } from "@/store/module";
|
import { useFilterStore } from "@/store/module";
|
||||||
import { useMemoList, useMemoV1Store } from "@/store/v1";
|
import { useMemoList, useMemoStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const Explore = () => {
|
const Explore = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const filterStore = useFilterStore();
|
const filterStore = useFilterStore();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const memoList = useMemoList();
|
const memoList = useMemoList();
|
||||||
const [isRequesting, setIsRequesting] = useState(true);
|
const [isRequesting, setIsRequesting] = useState(true);
|
||||||
const [isComplete, setIsComplete] = useState(false);
|
const [isComplete, setIsComplete] = useState(false);
|
||||||
|
@ -11,7 +11,7 @@ import { getTimeStampByDate } from "@/helpers/datetime";
|
|||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import useResponsiveWidth from "@/hooks/useResponsiveWidth";
|
import useResponsiveWidth from "@/hooks/useResponsiveWidth";
|
||||||
import { useFilterStore } from "@/store/module";
|
import { useFilterStore } from "@/store/module";
|
||||||
import { useMemoList, useMemoV1Store } from "@/store/v1";
|
import { useMemoList, useMemoStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
@ -19,7 +19,7 @@ const Home = () => {
|
|||||||
const { md } = useResponsiveWidth();
|
const { md } = useResponsiveWidth();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const filterStore = useFilterStore();
|
const filterStore = useFilterStore();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const memoList = useMemoList();
|
const memoList = useMemoList();
|
||||||
const [isRequesting, setIsRequesting] = useState(true);
|
const [isRequesting, setIsRequesting] = useState(true);
|
||||||
const [isComplete, setIsComplete] = useState(false);
|
const [isComplete, setIsComplete] = useState(false);
|
||||||
|
@ -18,7 +18,7 @@ import { UNKNOWN_ID } from "@/helpers/consts";
|
|||||||
import { getDateTimeString } from "@/helpers/datetime";
|
import { getDateTimeString } from "@/helpers/datetime";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useUserV1Store, useMemoV1Store, extractUsernameFromName } from "@/store/v1";
|
import { useUserStore, useMemoStore, extractUsernameFromName } from "@/store/v1";
|
||||||
import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
|
||||||
import { Memo, Visibility } from "@/types/proto/api/v2/memo_service";
|
import { Memo, Visibility } from "@/types/proto/api/v2/memo_service";
|
||||||
import { User } from "@/types/proto/api/v2/user_service";
|
import { User } from "@/types/proto/api/v2/user_service";
|
||||||
@ -30,8 +30,8 @@ const MemoDetail = () => {
|
|||||||
const params = useParams();
|
const params = useParams();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const [creator, setCreator] = useState<User>();
|
const [creator, setCreator] = useState<User>();
|
||||||
const memoId = Number(params.memoId);
|
const memoId = Number(params.memoId);
|
||||||
const memo = memoStore.getMemoById(memoId);
|
const memo = memoStore.getMemoById(memoId);
|
||||||
@ -48,7 +48,7 @@ const MemoDetail = () => {
|
|||||||
memoStore
|
memoStore
|
||||||
.getOrFetchMemoById(memoId)
|
.getOrFetchMemoById(memoId)
|
||||||
.then(async (memo) => {
|
.then(async (memo) => {
|
||||||
const user = await userV1Store.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
const user = await userStore.getOrFetchUserByUsername(extractUsernameFromName(memo.creator));
|
||||||
setCreator(user);
|
setCreator(user);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
@ -9,14 +9,14 @@ import { absolutifyLink } from "@/helpers/utils";
|
|||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const SignIn = () => {
|
const SignIn = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const actionBtnLoadingState = useLoading(false);
|
const actionBtnLoadingState = useLoading(false);
|
||||||
const { appearance, locale, systemStatus } = globalStore.state;
|
const { appearance, locale, systemStatus } = globalStore.state;
|
||||||
const mode = systemStatus.profile.mode;
|
const mode = systemStatus.profile.mode;
|
||||||
@ -77,7 +77,7 @@ const SignIn = () => {
|
|||||||
actionBtnLoadingState.setLoading();
|
actionBtnLoadingState.setLoading();
|
||||||
const { data: user } = await api.signin(username, password, remember);
|
const { data: user } = await api.signin(username, password, remember);
|
||||||
if (user) {
|
if (user) {
|
||||||
await userV1Store.fetchCurrentUser();
|
await userStore.fetchCurrentUser();
|
||||||
navigateTo("/");
|
navigateTo("/");
|
||||||
} else {
|
} else {
|
||||||
toast.error(t("message.login-failed"));
|
toast.error(t("message.login-failed"));
|
||||||
|
@ -8,14 +8,14 @@ import * as api from "@/helpers/api";
|
|||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import useNavigateTo from "@/hooks/useNavigateTo";
|
import useNavigateTo from "@/hooks/useNavigateTo";
|
||||||
import { useGlobalStore } from "@/store/module";
|
import { useGlobalStore } from "@/store/module";
|
||||||
import { useUserV1Store } from "@/store/v1";
|
import { useUserStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const SignUp = () => {
|
const SignUp = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const navigateTo = useNavigateTo();
|
const navigateTo = useNavigateTo();
|
||||||
const globalStore = useGlobalStore();
|
const globalStore = useGlobalStore();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const actionBtnLoadingState = useLoading(false);
|
const actionBtnLoadingState = useLoading(false);
|
||||||
const { appearance, locale, systemStatus } = globalStore.state;
|
const { appearance, locale, systemStatus } = globalStore.state;
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState("");
|
||||||
@ -57,7 +57,7 @@ const SignUp = () => {
|
|||||||
actionBtnLoadingState.setLoading();
|
actionBtnLoadingState.setLoading();
|
||||||
const { data: user } = await api.signup(username, password);
|
const { data: user } = await api.signup(username, password);
|
||||||
if (user) {
|
if (user) {
|
||||||
await userV1Store.fetchCurrentUser();
|
await userStore.fetchCurrentUser();
|
||||||
navigateTo("/");
|
navigateTo("/");
|
||||||
} else {
|
} else {
|
||||||
toast.error(t("message.signup-failed"));
|
toast.error(t("message.signup-failed"));
|
||||||
|
@ -11,14 +11,14 @@ import DatePicker from "@/components/kit/DatePicker";
|
|||||||
import { DAILY_TIMESTAMP } from "@/helpers/consts";
|
import { DAILY_TIMESTAMP } from "@/helpers/consts";
|
||||||
import { getDateStampByDate, getNormalizedDateString, getTimeStampByDate } from "@/helpers/datetime";
|
import { getDateStampByDate, getNormalizedDateString, getTimeStampByDate } from "@/helpers/datetime";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||||
import { useMemoList, useMemoV1Store } from "@/store/v1";
|
import { useMemoList, useMemoStore } from "@/store/v1";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const Timeline = () => {
|
const Timeline = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const [searchParams, setSearchParams] = useSearchParams();
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const user = useCurrentUser();
|
const user = useCurrentUser();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const memoList = useMemoList();
|
const memoList = useMemoList();
|
||||||
const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number;
|
const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number;
|
||||||
const [selectedDateStamp, setSelectedDateStamp] = useState<number>(
|
const [selectedDateStamp, setSelectedDateStamp] = useState<number>(
|
||||||
|
@ -9,18 +9,18 @@ import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts";
|
|||||||
import { getTimeStampByDate } from "@/helpers/datetime";
|
import { getTimeStampByDate } from "@/helpers/datetime";
|
||||||
import useLoading from "@/hooks/useLoading";
|
import useLoading from "@/hooks/useLoading";
|
||||||
import { useFilterStore } from "@/store/module";
|
import { useFilterStore } from "@/store/module";
|
||||||
import { useMemoList, useMemoV1Store, useUserV1Store } from "@/store/v1";
|
import { useMemoList, useMemoStore, useUserStore } from "@/store/v1";
|
||||||
import { User } from "@/types/proto/api/v2/user_service";
|
import { User } from "@/types/proto/api/v2/user_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
|
|
||||||
const UserProfile = () => {
|
const UserProfile = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const userV1Store = useUserV1Store();
|
const userStore = useUserStore();
|
||||||
const loadingState = useLoading();
|
const loadingState = useLoading();
|
||||||
const [user, setUser] = useState<User>();
|
const [user, setUser] = useState<User>();
|
||||||
const filterStore = useFilterStore();
|
const filterStore = useFilterStore();
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const memoList = useMemoList();
|
const memoList = useMemoList();
|
||||||
const [isRequesting, setIsRequesting] = useState(true);
|
const [isRequesting, setIsRequesting] = useState(true);
|
||||||
const [isComplete, setIsComplete] = useState(false);
|
const [isComplete, setIsComplete] = useState(false);
|
||||||
@ -35,7 +35,7 @@ const UserProfile = () => {
|
|||||||
throw new Error("username is required");
|
throw new Error("username is required");
|
||||||
}
|
}
|
||||||
|
|
||||||
userV1Store
|
userStore
|
||||||
.getOrFetchUserByUsername(username)
|
.getOrFetchUserByUsername(username)
|
||||||
.then((user) => {
|
.then((user) => {
|
||||||
setUser(user);
|
setUser(user);
|
||||||
|
@ -1,15 +1,18 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
|
import { combine } from "zustand/middleware";
|
||||||
import { inboxServiceClient } from "@/grpcweb";
|
import { inboxServiceClient } from "@/grpcweb";
|
||||||
import { Inbox } from "@/types/proto/api/v2/inbox_service";
|
import { Inbox } from "@/types/proto/api/v2/inbox_service";
|
||||||
|
|
||||||
interface InboxStore {
|
interface State {
|
||||||
inboxes: Inbox[];
|
inboxes: Inbox[];
|
||||||
fetchInboxes: () => Promise<Inbox[]>;
|
|
||||||
updateInbox: (inbox: Partial<Inbox>, updateMask: string[]) => Promise<Inbox>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useInboxStore = create<InboxStore>()((set, get) => ({
|
const getDefaultState = (): State => ({
|
||||||
inboxes: [],
|
inboxes: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useInboxStore = create(
|
||||||
|
combine(getDefaultState(), (set, get) => ({
|
||||||
fetchInboxes: async () => {
|
fetchInboxes: async () => {
|
||||||
const { inboxes } = await inboxServiceClient.listInboxes({});
|
const { inboxes } = await inboxServiceClient.listInboxes({});
|
||||||
set({ inboxes });
|
set({ inboxes });
|
||||||
@ -27,4 +30,5 @@ export const useInboxStore = create<InboxStore>()((set, get) => ({
|
|||||||
set({ inboxes: inboxes.map((i) => (i.name === updatedInbox.name ? updatedInbox : i)) });
|
set({ inboxes: inboxes.map((i) => (i.name === updatedInbox.name ? updatedInbox : i)) });
|
||||||
return updatedInbox;
|
return updatedInbox;
|
||||||
},
|
},
|
||||||
}));
|
}))
|
||||||
|
);
|
||||||
|
@ -1,29 +1,32 @@
|
|||||||
import { cloneDeep } from "lodash-es";
|
|
||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { combine } from "zustand/middleware";
|
import { combine } from "zustand/middleware";
|
||||||
import { memoServiceClient } from "@/grpcweb";
|
import { memoServiceClient } from "@/grpcweb";
|
||||||
import { CreateMemoRequest, ListMemosRequest, Memo } from "@/types/proto/api/v2/memo_service";
|
import { CreateMemoRequest, ListMemosRequest, Memo } from "@/types/proto/api/v2/memo_service";
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
memoById: Map<number, Memo>;
|
memoMapById: Record<number, Memo>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useMemoV1Store = create(
|
const getDefaultState = (): State => ({
|
||||||
combine({ memoById: new Map<number, Memo>() }, (set, get) => ({
|
memoMapById: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useMemoStore = create(
|
||||||
|
combine(getDefaultState(), (set, get) => ({
|
||||||
setState: (state: State) => set(state),
|
setState: (state: State) => set(state),
|
||||||
getState: () => get(),
|
getState: () => get(),
|
||||||
fetchMemos: async (request: Partial<ListMemosRequest>) => {
|
fetchMemos: async (request: Partial<ListMemosRequest>) => {
|
||||||
const { memos } = await memoServiceClient.listMemos(request);
|
const { memos } = await memoServiceClient.listMemos(request);
|
||||||
set((state) => {
|
const memoMap = get().memoMapById;
|
||||||
for (const memo of memos) {
|
for (const memo of memos) {
|
||||||
state.memoById.set(memo.id, memo);
|
memoMap[memo.id] = memo;
|
||||||
}
|
}
|
||||||
return cloneDeep(state);
|
set({ memoMapById: memoMap });
|
||||||
});
|
|
||||||
return memos;
|
return memos;
|
||||||
},
|
},
|
||||||
getOrFetchMemoById: async (id: number, options?: { skipCache?: boolean; skipStore?: boolean }) => {
|
getOrFetchMemoById: async (id: number, options?: { skipCache?: boolean; skipStore?: boolean }) => {
|
||||||
const memo = get().memoById.get(id);
|
const memoMap = get().memoMapById;
|
||||||
|
const memo = memoMap[id];
|
||||||
if (memo && !options?.skipCache) {
|
if (memo && !options?.skipCache) {
|
||||||
return memo;
|
return memo;
|
||||||
}
|
}
|
||||||
@ -36,15 +39,13 @@ export const useMemoV1Store = create(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!options?.skipStore) {
|
if (!options?.skipStore) {
|
||||||
set((state) => {
|
memoMap[id] = res.memo;
|
||||||
state.memoById.set(id, res.memo as Memo);
|
set({ memoMapById: memoMap });
|
||||||
return cloneDeep(state);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return res.memo;
|
return res.memo;
|
||||||
},
|
},
|
||||||
getMemoById: (id: number) => {
|
getMemoById: (id: number) => {
|
||||||
return get().memoById.get(id);
|
return get().memoMapById[id];
|
||||||
},
|
},
|
||||||
createMemo: async (request: CreateMemoRequest) => {
|
createMemo: async (request: CreateMemoRequest) => {
|
||||||
const { memo } = await memoServiceClient.createMemo(request);
|
const { memo } = await memoServiceClient.createMemo(request);
|
||||||
@ -52,10 +53,9 @@ export const useMemoV1Store = create(
|
|||||||
throw new Error("Memo not found");
|
throw new Error("Memo not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
set((state) => {
|
const memoMap = get().memoMapById;
|
||||||
state.memoById.set(memo.id, memo);
|
memoMap[memo.id] = memo;
|
||||||
return cloneDeep(state);
|
set({ memoMapById: memoMap });
|
||||||
});
|
|
||||||
return memo;
|
return memo;
|
||||||
},
|
},
|
||||||
updateMemo: async (update: Partial<Memo>, updateMask: string[]) => {
|
updateMemo: async (update: Partial<Memo>, updateMask: string[]) => {
|
||||||
@ -68,10 +68,9 @@ export const useMemoV1Store = create(
|
|||||||
throw new Error("Memo not found");
|
throw new Error("Memo not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
set((state) => {
|
const memoMap = get().memoMapById;
|
||||||
state.memoById.set(memo.id, memo);
|
memoMap[memo.id] = memo;
|
||||||
return cloneDeep(state);
|
set({ memoMapById: memoMap });
|
||||||
});
|
|
||||||
return memo;
|
return memo;
|
||||||
},
|
},
|
||||||
deleteMemo: async (id: number) => {
|
deleteMemo: async (id: number) => {
|
||||||
@ -79,24 +78,23 @@ export const useMemoV1Store = create(
|
|||||||
id: id,
|
id: id,
|
||||||
});
|
});
|
||||||
|
|
||||||
set((state) => {
|
const memoMap = get().memoMapById;
|
||||||
state.memoById.delete(id);
|
delete memoMap[id];
|
||||||
return cloneDeep(state);
|
set({ memoMapById: memoMap });
|
||||||
});
|
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
|
|
||||||
export const useMemoList = () => {
|
export const useMemoList = () => {
|
||||||
const memoStore = useMemoV1Store();
|
const memoStore = useMemoStore();
|
||||||
const memos = Array.from(memoStore.getState().memoById.values());
|
const memos = Object.values(memoStore.getState().memoMapById);
|
||||||
|
|
||||||
const reset = () => {
|
const reset = () => {
|
||||||
memoStore.setState({ memoById: new Map<number, Memo>() });
|
memoStore.setState({ memoMapById: {} });
|
||||||
};
|
};
|
||||||
|
|
||||||
const size = () => {
|
const size = () => {
|
||||||
return memoStore.getState().memoById.size;
|
return Object.keys(memoStore.getState().memoMapById).length;
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -27,7 +27,7 @@ const getDefaultUserSetting = () => {
|
|||||||
// Request cache is used to prevent multiple requests.
|
// Request cache is used to prevent multiple requests.
|
||||||
const requestCache = new Map<string, Promise<any>>();
|
const requestCache = new Map<string, Promise<any>>();
|
||||||
|
|
||||||
export const useUserV1Store = create(
|
export const useUserStore = create(
|
||||||
combine(getDefaultState(), (set, get) => ({
|
combine(getDefaultState(), (set, get) => ({
|
||||||
fetchUsers: async () => {
|
fetchUsers: async () => {
|
||||||
const { users } = await userServiceClient.listUsers({});
|
const { users } = await userServiceClient.listUsers({});
|
||||||
|
Reference in New Issue
Block a user