refactor: workspace setting store

pull/4400/head
Johnny 4 months ago
parent e27f6f0c52
commit 11b9c240e9

@ -13,7 +13,7 @@ const App = observer(() => {
const { mode, setMode } = useColorScheme(); const { mode, setMode } = useColorScheme();
const workspaceProfile = workspaceStore.state.profile; const workspaceProfile = workspaceStore.state.profile;
const userSetting = userStore.state.userSetting; const userSetting = userStore.state.userSetting;
const workspaceGeneralSetting = workspaceStore.generalSetting; const workspaceGeneralSetting = workspaceStore.state.generalSetting;
// Redirect to sign up page if no instance owner. // Redirect to sign up page if no instance owner.
useEffect(() => { useEffect(() => {

@ -1,8 +1,6 @@
import { Tooltip } from "@mui/joy"; import { Tooltip } from "@mui/joy";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useWorkspaceSettingStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { cn } from "@/utils"; import { cn } from "@/utils";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
@ -32,10 +30,7 @@ const getCellAdditionalStyles = (count: number, maxCount: number) => {
const ActivityCalendar = (props: Props) => { const ActivityCalendar = (props: Props) => {
const t = useTranslate(); const t = useTranslate();
const { month: monthStr, data, onClick } = props; const { month: monthStr, data, onClick } = props;
const workspaceSettingStore = useWorkspaceSettingStore(); const weekStartDayOffset = workspaceStore.state.generalSetting.weekStartDayOffset;
const weekStartDayOffset = (
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({})
).weekStartDayOffset;
const year = dayjs(monthStr).toDate().getFullYear(); const year = dayjs(monthStr).toDate().getFullYear();
const month = dayjs(monthStr).toDate().getMonth(); const month = dayjs(monthStr).toDate().getMonth();

@ -1,7 +1,7 @@
import { Link as MLink, Tooltip } from "@mui/joy"; import { Link as MLink, Tooltip } from "@mui/joy";
import { useState } from "react"; import { useState } from "react";
import { markdownServiceClient } from "@/grpcweb"; import { markdownServiceClient } from "@/grpcweb";
import { useWorkspaceSettingStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2";
import { LinkMetadata } from "@/types/proto/api/v1/markdown_service"; import { LinkMetadata } from "@/types/proto/api/v1/markdown_service";
import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -21,9 +21,8 @@ const getFaviconWithGoogleS2 = (url: string) => {
}; };
const Link: React.FC<Props> = ({ text, url }: Props) => { const Link: React.FC<Props> = ({ text, url }: Props) => {
const workspaceSettingStore = useWorkspaceSettingStore();
const workspaceMemoRelatedSetting = const workspaceMemoRelatedSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting || workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting ||
WorkspaceMemoRelatedSetting.fromPartial({}); WorkspaceMemoRelatedSetting.fromPartial({});
const [initialized, setInitialized] = useState<boolean>(false); const [initialized, setInitialized] = useState<boolean>(false);
const [showTooltip, setShowTooltip] = useState<boolean>(false); const [showTooltip, setShowTooltip] = useState<boolean>(false);

@ -14,8 +14,8 @@ import { TAB_SPACE_WIDTH } from "@/helpers/consts";
import { isValidUrl } from "@/helpers/utils"; import { isValidUrl } from "@/helpers/utils";
import useAsyncEffect from "@/hooks/useAsyncEffect"; import useAsyncEffect from "@/hooks/useAsyncEffect";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { useMemoStore, useResourceStore, useWorkspaceSettingStore } from "@/store/v1"; import { useMemoStore, useResourceStore } from "@/store/v1";
import { userStore } from "@/store/v2"; import { userStore, workspaceStore } from "@/store/v2";
import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service"; import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service";
import { Location, Memo, Visibility } from "@/types/proto/api/v1/memo_service"; import { Location, Memo, Visibility } from "@/types/proto/api/v1/memo_service";
import { Resource } from "@/types/proto/api/v1/resource_service"; import { Resource } from "@/types/proto/api/v1/resource_service";
@ -63,7 +63,6 @@ const MemoEditor = observer((props: Props) => {
const { className, cacheKey, memoName, parentMemoName, autoFocus, onConfirm, onCancel } = props; const { className, cacheKey, memoName, parentMemoName, autoFocus, onConfirm, onCancel } = props;
const t = useTranslate(); const t = useTranslate();
const { i18n } = useTranslation(); const { i18n } = useTranslation();
const workspaceSettingStore = useWorkspaceSettingStore();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const resourceStore = useResourceStore(); const resourceStore = useResourceStore();
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
@ -89,7 +88,7 @@ const MemoEditor = observer((props: Props) => {
) )
: state.relationList.filter((relation) => relation.type === MemoRelation_Type.REFERENCE); : state.relationList.filter((relation) => relation.type === MemoRelation_Type.REFERENCE);
const workspaceMemoRelatedSetting = const workspaceMemoRelatedSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting ||
WorkspaceMemoRelatedSetting.fromPartial({}); WorkspaceMemoRelatedSetting.fromPartial({});
useEffect(() => { useEffect(() => {

@ -5,7 +5,8 @@ import { Link, useLocation } from "react-router-dom";
import useAsyncEffect from "@/hooks/useAsyncEffect"; import useAsyncEffect from "@/hooks/useAsyncEffect";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import { useUserStore, useWorkspaceSettingStore, useMemoStore, useUserStatsStore } from "@/store/v1"; import { useUserStore, useMemoStore, useUserStatsStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service"; import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service";
import { Memo, Visibility } from "@/types/proto/api/v1/memo_service"; import { Memo, Visibility } from "@/types/proto/api/v1/memo_service";
@ -46,13 +47,12 @@ const MemoView: React.FC<Props> = (props: Props) => {
const userStore = useUserStore(); const userStore = useUserStore();
const user = useCurrentUser(); const user = useCurrentUser();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const workspaceSettingStore = useWorkspaceSettingStore();
const userStatsStore = useUserStatsStore(); const userStatsStore = useUserStatsStore();
const [showEditor, setShowEditor] = useState<boolean>(false); const [showEditor, setShowEditor] = useState<boolean>(false);
const [creator, setCreator] = useState(userStore.getUserByName(memo.creator)); const [creator, setCreator] = useState(userStore.getUserByName(memo.creator));
const memoContainerRef = useRef<HTMLDivElement>(null); const memoContainerRef = useRef<HTMLDivElement>(null);
const workspaceMemoRelatedSetting = const workspaceMemoRelatedSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting || workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting ||
WorkspaceMemoRelatedSetting.fromPartial({}); WorkspaceMemoRelatedSetting.fromPartial({});
const referencedMemos = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE); const referencedMemos = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE);
const commentAmount = memo.relations.filter( const commentAmount = memo.relations.filter(

@ -1,8 +1,6 @@
import useWindowScroll from "react-use/lib/useWindowScroll"; import useWindowScroll from "react-use/lib/useWindowScroll";
import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import useResponsiveWidth from "@/hooks/useResponsiveWidth";
import { useWorkspaceSettingStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { cn } from "@/utils"; import { cn } from "@/utils";
import NavigationDrawer from "./NavigationDrawer"; import NavigationDrawer from "./NavigationDrawer";
@ -15,9 +13,7 @@ const MobileHeader = (props: Props) => {
const { className, children } = props; const { className, children } = props;
const { sm } = useResponsiveWidth(); const { sm } = useResponsiveWidth();
const { y: offsetTop } = useWindowScroll(); const { y: offsetTop } = useWindowScroll();
const workspaceSettingStore = useWorkspaceSettingStore(); const workspaceGeneralSetting = workspaceStore.state.generalSetting;
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({});
return ( return (
<div <div

@ -4,7 +4,8 @@ import { useRef, useState } from "react";
import useClickAway from "react-use/lib/useClickAway"; import useClickAway from "react-use/lib/useClickAway";
import { memoServiceClient } from "@/grpcweb"; import { memoServiceClient } from "@/grpcweb";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { useMemoStore, useWorkspaceSettingStore } from "@/store/v1"; import { useMemoStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -19,11 +20,10 @@ const ReactionSelector = (props: Props) => {
const { memo, className } = props; const { memo, className } = props;
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const workspaceSettingStore = useWorkspaceSettingStore();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const workspaceMemoRelatedSetting = const workspaceMemoRelatedSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting ||
WorkspaceMemoRelatedSetting.fromPartial({}); WorkspaceMemoRelatedSetting.fromPartial({});
useClickAway(containerRef, () => { useClickAway(containerRef, () => {

@ -4,16 +4,16 @@ import { isEqual, uniq } from "lodash-es";
import { CheckIcon } from "lucide-react"; import { CheckIcon } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1"; import { workspaceSettingNamePrefix } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
const MemoRelatedSettings = () => { const MemoRelatedSettings = () => {
const t = useTranslate(); const t = useTranslate();
const workspaceSettingStore = useWorkspaceSettingStore();
const originalSetting = WorkspaceMemoRelatedSetting.fromPartial( const originalSetting = WorkspaceMemoRelatedSetting.fromPartial(
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {}, workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {},
); );
const [memoRelatedSetting, setMemoRelatedSetting] = useState<WorkspaceMemoRelatedSetting>(originalSetting); const [memoRelatedSetting, setMemoRelatedSetting] = useState<WorkspaceMemoRelatedSetting>(originalSetting);
const [editingReaction, setEditingReaction] = useState<string>(""); const [editingReaction, setEditingReaction] = useState<string>("");
@ -42,7 +42,7 @@ const MemoRelatedSettings = () => {
} }
try { try {
await workspaceSettingStore.setWorkspaceSetting({ await workspaceStore.upsertWorkspaceSetting({
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.MEMO_RELATED}`, name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.MEMO_RELATED}`,
memoRelatedSetting, memoRelatedSetting,
}); });

@ -5,7 +5,8 @@ import { HelpCircleIcon } from "lucide-react";
import React, { useMemo, useState } from "react"; import React, { useMemo, 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 { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1"; import { workspaceSettingNamePrefix } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { import {
WorkspaceStorageSetting, WorkspaceStorageSetting,
WorkspaceStorageSetting_S3Config, WorkspaceStorageSetting_S3Config,
@ -16,9 +17,8 @@ import { useTranslate } from "@/utils/i18n";
const StorageSection = () => { const StorageSection = () => {
const t = useTranslate(); const t = useTranslate();
const workspaceSettingStore = useWorkspaceSettingStore();
const [workspaceStorageSetting, setWorkspaceStorageSetting] = useState<WorkspaceStorageSetting>( const [workspaceStorageSetting, setWorkspaceStorageSetting] = useState<WorkspaceStorageSetting>(
WorkspaceStorageSetting.fromPartial(workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.STORAGE)?.storageSetting || {}), WorkspaceStorageSetting.fromPartial(workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.STORAGE)?.storageSetting || {}),
); );
const allowSaveStorageSetting = useMemo(() => { const allowSaveStorageSetting = useMemo(() => {
@ -27,7 +27,7 @@ const StorageSection = () => {
} }
const origin = WorkspaceStorageSetting.fromPartial( const origin = WorkspaceStorageSetting.fromPartial(
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.STORAGE)?.storageSetting || {}, workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.STORAGE)?.storageSetting || {},
); );
if (workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.LOCAL) { if (workspaceStorageSetting.storageType === WorkspaceStorageSetting_StorageType.LOCAL) {
if (workspaceStorageSetting.filepathTemplate.length === 0) { if (workspaceStorageSetting.filepathTemplate.length === 0) {
@ -45,7 +45,7 @@ const StorageSection = () => {
} }
} }
return !isEqual(origin, workspaceStorageSetting); return !isEqual(origin, workspaceStorageSetting);
}, [workspaceStorageSetting, workspaceSettingStore.getState()]); }, [workspaceStorageSetting, workspaceStore.state]);
const handleMaxUploadSizeChanged = async (event: React.FocusEvent<HTMLInputElement>) => { const handleMaxUploadSizeChanged = async (event: React.FocusEvent<HTMLInputElement>) => {
let num = parseInt(event.target.value); let num = parseInt(event.target.value);
@ -113,7 +113,7 @@ const StorageSection = () => {
}; };
const saveWorkspaceStorageSetting = async () => { const saveWorkspaceStorageSetting = async () => {
await workspaceSettingStore.setWorkspaceSetting({ await workspaceStore.upsertWorkspaceSetting({
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.STORAGE}`, name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.STORAGE}`,
storageSetting: workspaceStorageSetting, storageSetting: workspaceStorageSetting,
}); });

@ -6,7 +6,8 @@ import { useEffect, 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 { identityProviderServiceClient } from "@/grpcweb"; import { identityProviderServiceClient } from "@/grpcweb";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1"; import { workspaceSettingNamePrefix } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { IdentityProvider } from "@/types/proto/api/v1/idp_service"; import { IdentityProvider } from "@/types/proto/api/v1/idp_service";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -15,16 +16,15 @@ import showUpdateCustomizedProfileDialog from "../UpdateCustomizedProfileDialog"
const WorkspaceSection = () => { const WorkspaceSection = () => {
const t = useTranslate(); const t = useTranslate();
const workspaceSettingStore = useWorkspaceSettingStore();
const originalSetting = WorkspaceGeneralSetting.fromPartial( const originalSetting = WorkspaceGeneralSetting.fromPartial(
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)?.generalSetting || {}, workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)?.generalSetting || {},
); );
const [workspaceGeneralSetting, setWorkspaceGeneralSetting] = useState<WorkspaceGeneralSetting>(originalSetting); const [workspaceGeneralSetting, setWorkspaceGeneralSetting] = useState<WorkspaceGeneralSetting>(originalSetting);
const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]); const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]);
useEffect(() => { useEffect(() => {
setWorkspaceGeneralSetting(originalSetting); setWorkspaceGeneralSetting(originalSetting);
}, [workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)]); }, [workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)]);
const handleUpdateCustomizedProfileButtonClick = () => { const handleUpdateCustomizedProfileButtonClick = () => {
showUpdateCustomizedProfileDialog(); showUpdateCustomizedProfileDialog();
@ -41,7 +41,7 @@ const WorkspaceSection = () => {
const handleSaveGeneralSetting = async () => { const handleSaveGeneralSetting = async () => {
try { try {
await workspaceSettingStore.setWorkspaceSetting({ await workspaceStore.upsertWorkspaceSetting({
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`, name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`,
generalSetting: workspaceGeneralSetting, generalSetting: workspaceGeneralSetting,
}); });

@ -6,9 +6,9 @@ import { 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 { useUserStore, useWorkspaceSettingStore } from "@/store/v1"; import { useUserStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { User as UserPb } from "@/types/proto/api/v1/user_service"; import { User as UserPb } from "@/types/proto/api/v1/user_service";
import { WorkspaceGeneralSetting, WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
import { generateDialog } from "./Dialog"; import { generateDialog } from "./Dialog";
import UserAvatar from "./UserAvatar"; import UserAvatar from "./UserAvatar";
@ -34,9 +34,7 @@ const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
email: currentUser.email, email: currentUser.email,
description: currentUser.description, description: currentUser.description,
}); });
const workspaceSettingStore = useWorkspaceSettingStore(); const workspaceGeneralSetting = workspaceStore.state.generalSetting;
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)?.generalSetting || WorkspaceGeneralSetting.fromPartial({});
const handleCloseBtnClick = () => { const handleCloseBtnClick = () => {
destroy(); destroy();

@ -3,8 +3,9 @@ import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react"; import { XIcon } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1"; import { workspaceSettingNamePrefix } from "@/store/v1";
import { WorkspaceCustomProfile, WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { workspaceStore } from "@/store/v2";
import { WorkspaceCustomProfile } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
import AppearanceSelect from "./AppearanceSelect"; import AppearanceSelect from "./AppearanceSelect";
@ -15,10 +16,7 @@ type Props = DialogProps;
const UpdateCustomizedProfileDialog: React.FC<Props> = ({ destroy }: Props) => { const UpdateCustomizedProfileDialog: React.FC<Props> = ({ destroy }: Props) => {
const t = useTranslate(); const t = useTranslate();
const workspaceSettingStore = useWorkspaceSettingStore(); const workspaceGeneralSetting = workspaceStore.state.generalSetting;
const workspaceGeneralSetting = WorkspaceGeneralSetting.fromPartial(
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL)?.generalSetting || {},
);
const [customProfile, setCustomProfile] = useState<WorkspaceCustomProfile>( const [customProfile, setCustomProfile] = useState<WorkspaceCustomProfile>(
WorkspaceCustomProfile.fromPartial(workspaceGeneralSetting.customProfile || {}), WorkspaceCustomProfile.fromPartial(workspaceGeneralSetting.customProfile || {}),
); );
@ -83,7 +81,7 @@ const UpdateCustomizedProfileDialog: React.FC<Props> = ({ destroy }: Props) => {
} }
try { try {
await workspaceSettingStore.setWorkspaceSetting({ await workspaceStore.upsertWorkspaceSetting({
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`, name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`,
generalSetting: { generalSetting: {
...workspaceGeneralSetting, ...workspaceGeneralSetting,

@ -4,9 +4,7 @@ import { authServiceClient } from "@/grpcweb";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import { Routes } from "@/router"; import { Routes } from "@/router";
import { useWorkspaceSettingStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { cn } from "@/utils"; import { cn } from "@/utils";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
import UserAvatar from "./UserAvatar"; import UserAvatar from "./UserAvatar";
@ -20,9 +18,7 @@ const UserBanner = (props: Props) => {
const t = useTranslate(); const t = useTranslate();
const navigateTo = useNavigateTo(); const navigateTo = useNavigateTo();
const user = useCurrentUser(); const user = useCurrentUser();
const workspaceSettingStore = useWorkspaceSettingStore(); const workspaceGeneralSetting = workspaceStore.state.generalSetting;
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({});
const title = (user ? user.nickname || user.username : workspaceGeneralSetting.customProfile?.title) || "Memos"; const title = (user ? user.nickname || user.username : workspaceGeneralSetting.customProfile?.title) || "Memos";
const avatarUrl = (user ? user.avatarUrl : workspaceGeneralSetting.customProfile?.logoUrl) || "/full-logo.webp"; const avatarUrl = (user ? user.avatarUrl : workspaceGeneralSetting.customProfile?.logoUrl) || "/full-logo.webp";

@ -2,15 +2,10 @@ import { observer } from "mobx-react-lite";
import AppearanceSelect from "@/components/AppearanceSelect"; import AppearanceSelect from "@/components/AppearanceSelect";
import LocaleSelect from "@/components/LocaleSelect"; import LocaleSelect from "@/components/LocaleSelect";
import PasswordSignInForm from "@/components/PasswordSignInForm"; import PasswordSignInForm from "@/components/PasswordSignInForm";
import { useWorkspaceSettingStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2"; import { workspaceStore } from "@/store/v2";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
const AdminSignIn = observer(() => { const AdminSignIn = observer(() => {
const workspaceSettingStore = useWorkspaceSettingStore(); const workspaceGeneralSetting = workspaceStore.state.generalSetting;
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({});
const handleLocaleSelectChange = (locale: Locale) => { const handleLocaleSelectChange = (locale: Locale) => {
workspaceStore.state.setPartial({ locale }); workspaceStore.state.setPartial({ locale });

@ -11,7 +11,8 @@ import MobileHeader from "@/components/MobileHeader";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import useResponsiveWidth from "@/hooks/useResponsiveWidth";
import { memoNamePrefix, useMemoStore, useWorkspaceSettingStore } from "@/store/v1"; import { memoNamePrefix, useMemoStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2";
import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service"; import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
import { WorkspaceMemoRelatedSetting, WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceMemoRelatedSetting, WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -24,14 +25,13 @@ const MemoDetail = () => {
const params = useParams(); const params = useParams();
const navigateTo = useNavigateTo(); const navigateTo = useNavigateTo();
const { state: locationState } = useLocation(); const { state: locationState } = useLocation();
const workspaceSettingStore = useWorkspaceSettingStore();
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const uid = params.uid; const uid = params.uid;
const memoName = `${memoNamePrefix}${uid}`; const memoName = `${memoNamePrefix}${uid}`;
const memo = memoStore.getMemoByName(memoName); const memo = memoStore.getMemoByName(memoName);
const workspaceMemoRelatedSetting = WorkspaceMemoRelatedSetting.fromPartial( const workspaceMemoRelatedSetting = WorkspaceMemoRelatedSetting.fromPartial(
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {}, workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {},
); );
const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined); const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined);
const [showCommentEditor, setShowCommentEditor] = useState(false); const [showCommentEditor, setShowCommentEditor] = useState(false);

@ -13,7 +13,6 @@ import SectionMenuItem from "@/components/Settings/SectionMenuItem";
import StorageSection from "@/components/Settings/StorageSection"; import StorageSection from "@/components/Settings/StorageSection";
import WorkspaceSection from "@/components/Settings/WorkspaceSection"; import WorkspaceSection from "@/components/Settings/WorkspaceSection";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { useWorkspaceSettingStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2"; import { workspaceStore } from "@/store/v2";
import { User_Role } from "@/types/proto/api/v1/user_service"; import { User_Role } from "@/types/proto/api/v1/user_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -41,7 +40,6 @@ const Setting = observer(() => {
const t = useTranslate(); const t = useTranslate();
const location = useLocation(); const location = useLocation();
const user = useCurrentUser(); const user = useCurrentUser();
const workspaceSettingStore = useWorkspaceSettingStore();
const [state, setState] = useState<State>({ const [state, setState] = useState<State>({
selectedSection: "my-account", selectedSection: "my-account",
}); });
@ -74,7 +72,7 @@ const Setting = observer(() => {
// Initial fetch for workspace settings. // Initial fetch for workspace settings.
(async () => { (async () => {
[WorkspaceSettingKey.MEMO_RELATED, WorkspaceSettingKey.STORAGE].forEach(async (key) => { [WorkspaceSettingKey.MEMO_RELATED, WorkspaceSettingKey.STORAGE].forEach(async (key) => {
await workspaceSettingStore.fetchWorkspaceSetting(key); await workspaceStore.fetchWorkspaceSetting(key);
}); });
})(); })();
}, [isHost]); }, [isHost]);

@ -11,20 +11,16 @@ import { identityProviderServiceClient } from "@/grpcweb";
import { absolutifyLink } from "@/helpers/utils"; import { absolutifyLink } from "@/helpers/utils";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { Routes } from "@/router"; import { Routes } from "@/router";
import { extractIdentityProviderIdFromName, useWorkspaceSettingStore } from "@/store/v1"; import { extractIdentityProviderIdFromName } from "@/store/v1";
import { workspaceStore } from "@/store/v2"; import { workspaceStore } from "@/store/v2";
import { IdentityProvider, IdentityProvider_Type } from "@/types/proto/api/v1/idp_service"; import { IdentityProvider, IdentityProvider_Type } from "@/types/proto/api/v1/idp_service";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
const SignIn = observer(() => { const SignIn = observer(() => {
const t = useTranslate(); const t = useTranslate();
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
const workspaceSettingStore = useWorkspaceSettingStore();
const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]); const [identityProviderList, setIdentityProviderList] = useState<IdentityProvider[]>([]);
const workspaceGeneralSetting = const workspaceGeneralSetting = workspaceStore.state.generalSetting;
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({});
// Redirect to root page if already signed in. // Redirect to root page if already signed in.
useEffect(() => { useEffect(() => {

@ -10,22 +10,18 @@ import LocaleSelect from "@/components/LocaleSelect";
import { authServiceClient } from "@/grpcweb"; import { authServiceClient } from "@/grpcweb";
import useLoading from "@/hooks/useLoading"; import useLoading from "@/hooks/useLoading";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import { useUserStore, useWorkspaceSettingStore } from "@/store/v1"; import { useUserStore } from "@/store/v1";
import { workspaceStore } from "@/store/v2"; import { workspaceStore } from "@/store/v2";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
const SignUp = observer(() => { const SignUp = observer(() => {
const t = useTranslate(); const t = useTranslate();
const navigateTo = useNavigateTo(); const navigateTo = useNavigateTo();
const workspaceSettingStore = useWorkspaceSettingStore();
const userStore = useUserStore(); const userStore = useUserStore();
const actionBtnLoadingState = useLoading(false); const actionBtnLoadingState = useLoading(false);
const [username, setUsername] = useState(""); const [username, setUsername] = useState("");
const [password, setPassword] = useState(""); const [password, setPassword] = useState("");
const workspaceGeneralSetting = const workspaceGeneralSetting = workspaceStore.state.generalSetting;
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({});
const handleUsernameInputChanged = (e: React.ChangeEvent<HTMLInputElement>) => { const handleUsernameInputChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
const text = e.target.value as string; const text = e.target.value as string;

@ -2,6 +2,5 @@ export * from "./user";
export * from "./memo"; export * from "./memo";
export * from "./resourceName"; export * from "./resourceName";
export * from "./resource"; export * from "./resource";
export * from "./workspaceSetting";
export * from "./memoFilter"; export * from "./memoFilter";
export * from "./userStats"; export * from "./userStats";

@ -1,33 +0,0 @@
import { create } from "zustand";
import { combine } from "zustand/middleware";
import { workspaceSettingServiceClient } from "@/grpcweb";
import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { workspaceSettingNamePrefix } from "./resourceName";
interface State {
workspaceSettingByName: Record<string, WorkspaceSetting>;
}
const getDefaultState = (): State => ({
workspaceSettingByName: {},
});
export const useWorkspaceSettingStore = create(
combine(getDefaultState(), (set, get) => ({
getState: () => {
return get();
},
fetchWorkspaceSetting: async (key: WorkspaceSettingKey) => {
const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${workspaceSettingNamePrefix}${key}` });
set({ workspaceSettingByName: { ...get().workspaceSettingByName, [setting.name]: setting } });
},
getWorkspaceSettingByKey: (key: WorkspaceSettingKey): WorkspaceSetting => {
return get().workspaceSettingByName[`${workspaceSettingNamePrefix}${key}`] || WorkspaceSetting.fromPartial({});
},
setWorkspaceSetting: async (setting: WorkspaceSetting) => {
await workspaceSettingServiceClient.setWorkspaceSetting({ setting });
set({ workspaceSettingByName: { ...get().workspaceSettingByName, [setting.name]: setting } });
},
})),
);

@ -13,6 +13,13 @@ class LocalState {
profile: WorkspaceProfile = WorkspaceProfile.fromPartial({}); profile: WorkspaceProfile = WorkspaceProfile.fromPartial({});
settings: WorkspaceSetting[] = []; settings: WorkspaceSetting[] = [];
get generalSetting() {
return (
this.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`)?.generalSetting ||
WorkspaceGeneralSetting.fromPartial({})
);
}
constructor() { constructor() {
makeAutoObservable(this); makeAutoObservable(this);
} }
@ -35,10 +42,6 @@ class LocalState {
const workspaceStore = (() => { const workspaceStore = (() => {
const state = new LocalState(); const state = new LocalState();
const generalSetting =
state.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`)?.generalSetting ||
WorkspaceGeneralSetting.fromPartial({});
const fetchWorkspaceSetting = async (settingKey: WorkspaceSettingKey) => { const fetchWorkspaceSetting = async (settingKey: WorkspaceSettingKey) => {
const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${workspaceSettingNamePrefix}${settingKey}` }); const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${workspaceSettingNamePrefix}${settingKey}` });
state.setPartial({ state.setPartial({
@ -46,10 +49,24 @@ const workspaceStore = (() => {
}); });
}; };
const upsertWorkspaceSetting = async (setting: WorkspaceSetting) => {
await workspaceSettingServiceClient.setWorkspaceSetting({ setting });
state.setPartial({
settings: uniqBy([setting, ...state.settings], "name"),
});
};
const getWorkspaceSettingByKey = (settingKey: WorkspaceSettingKey) => {
return (
state.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${settingKey}`) || WorkspaceSetting.fromPartial({})
);
};
return { return {
state, state,
generalSetting,
fetchWorkspaceSetting, fetchWorkspaceSetting,
upsertWorkspaceSetting,
getWorkspaceSettingByKey,
}; };
})(); })();
@ -60,7 +77,7 @@ export const initialWorkspaceStore = async () => {
await workspaceStore.fetchWorkspaceSetting(key); await workspaceStore.fetchWorkspaceSetting(key);
} }
const workspaceGeneralSetting = workspaceStore.generalSetting; const workspaceGeneralSetting = workspaceStore.state.generalSetting;
workspaceStore.state.setPartial({ workspaceStore.state.setPartial({
locale: workspaceGeneralSetting.customProfile?.locale, locale: workspaceGeneralSetting.customProfile?.locale,
appearance: workspaceGeneralSetting.customProfile?.appearance, appearance: workspaceGeneralSetting.customProfile?.appearance,

Loading…
Cancel
Save