chore: remove v1 prefix in store name

pull/2658/head^2
Steven 1 year ago
parent df3303dcd3
commit df5aeb6d88

@ -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,30 +1,34 @@
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: [],
fetchInboxes: async () => { });
const { inboxes } = await inboxServiceClient.listInboxes({});
set({ inboxes }); export const useInboxStore = create(
return inboxes; combine(getDefaultState(), (set, get) => ({
}, fetchInboxes: async () => {
updateInbox: async (inbox: Partial<Inbox>, updateMask: string[]) => { const { inboxes } = await inboxServiceClient.listInboxes({});
const { inbox: updatedInbox } = await inboxServiceClient.updateInbox({ set({ inboxes });
inbox, return inboxes;
updateMask, },
}); updateInbox: async (inbox: Partial<Inbox>, updateMask: string[]) => {
if (!updatedInbox) { const { inbox: updatedInbox } = await inboxServiceClient.updateInbox({
throw new Error("Inbox not found"); inbox,
} updateMask,
const inboxes = get().inboxes; });
set({ inboxes: inboxes.map((i) => (i.name === updatedInbox.name ? updatedInbox : i)) }); if (!updatedInbox) {
return updatedInbox; throw new Error("Inbox not found");
}, }
})); const inboxes = get().inboxes;
set({ inboxes: inboxes.map((i) => (i.name === updatedInbox.name ? updatedInbox : i)) });
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({});

Loading…
Cancel
Save