feat: add default visibility workspace setting

This commit is contained in:
Steven
2024-02-19 21:11:09 +08:00
parent fafacc92eb
commit 4a6c6b4b2a
16 changed files with 373 additions and 227 deletions

View File

@ -5,6 +5,7 @@ import { toast } from "react-hot-toast";
import { useTranslation } from "react-i18next";
import useCollectionStore from "@/stores/v1/collection";
import useShortcutStore from "@/stores/v1/shortcut";
import useWorkspaceStore from "@/stores/v1/workspace";
import { Collection } from "@/types/proto/api/v1/collection_service";
import { Visibility } from "@/types/proto/api/v1/common";
import { Shortcut } from "@/types/proto/api/v1/shortcut_service";
@ -26,6 +27,7 @@ interface State {
const CreateCollectionDrawer: React.FC<Props> = (props: Props) => {
const { onClose, onConfirm, collectionId } = props;
const { t } = useTranslation();
const workspaceStore = useWorkspaceStore();
const collectionStore = useCollectionStore();
const shortcutList = useShortcutStore().getShortcutList();
const [state, setState] = useState<State>({
@ -49,6 +51,16 @@ const CreateCollectionDrawer: React.FC<Props> = (props: Props) => {
})
.filter((shortcut) => !selectedShortcuts.find((selectedShortcut) => selectedShortcut.id === shortcut.id));
useEffect(() => {
if (workspaceStore.setting.defaultVisibility !== Visibility.VISIBILITY_UNSPECIFIED) {
setPartialState({
collectionCreate: Object.assign(state.collectionCreate, {
visibility: workspaceStore.setting.defaultVisibility,
}),
});
}
}, []);
useEffect(() => {
(async () => {
if (collectionId) {

View File

@ -17,6 +17,7 @@ import { useEffect, useState } from "react";
import { toast } from "react-hot-toast";
import { useTranslation } from "react-i18next";
import useShortcutStore, { getShortcutUpdateMask } from "@/stores/v1/shortcut";
import useWorkspaceStore from "@/stores/v1/workspace";
import { Visibility } from "@/types/proto/api/v1/common";
import { Shortcut } from "@/types/proto/api/v1/shortcut_service";
import { convertVisibilityFromPb } from "@/utils/visibility";
@ -49,6 +50,7 @@ const CreateShortcutDrawer: React.FC<Props> = (props: Props) => {
}),
});
const shortcutStore = useShortcutStore();
const workspaceStore = useWorkspaceStore();
const [showOpenGraphMetadata, setShowOpenGraphMetadata] = useState<boolean>(false);
const shortcutList = shortcutStore.getShortcutList();
const [tag, setTag] = useState<string>("");
@ -57,6 +59,16 @@ const CreateShortcutDrawer: React.FC<Props> = (props: Props) => {
const loadingState = useLoading(!isCreating);
const requestState = useLoading(false);
useEffect(() => {
if (workspaceStore.setting.defaultVisibility !== Visibility.VISIBILITY_UNSPECIFIED) {
setPartialState({
shortcutCreate: Object.assign(state.shortcutCreate, {
visibility: workspaceStore.setting.defaultVisibility,
}),
});
}
}, []);
useEffect(() => {
if (shortcutId) {
const shortcut = shortcutStore.getShortcutById(shortcutId);

View File

@ -1,10 +1,11 @@
import { Button, Checkbox, Input, Textarea } from "@mui/joy";
import { Button, Checkbox, Input, Select, Textarea, Option } from "@mui/joy";
import { isEqual } from "lodash-es";
import { useRef, useState } from "react";
import toast from "react-hot-toast";
import { useTranslation } from "react-i18next";
import { workspaceServiceClient } from "@/grpcweb";
import useWorkspaceStore from "@/stores/v1/workspace";
import { Visibility } from "@/types/proto/api/v1/common";
import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_service";
const WorkspaceSection: React.FC = () => {
@ -35,6 +36,13 @@ const WorkspaceSection: React.FC = () => {
});
};
const handleDefaultVisibilityChange = async (value: Visibility) => {
setWorkspaceSetting({
...workspaceSetting,
defaultVisibility: value,
});
};
const handleSaveWorkspaceSetting = async () => {
const updateMask: string[] = [];
if (!isEqual(originalWorkspaceSetting.current.enableSignup, workspaceSetting.enableSignup)) {
@ -46,6 +54,9 @@ const WorkspaceSection: React.FC = () => {
if (!isEqual(originalWorkspaceSetting.current.customStyle, workspaceSetting.customStyle)) {
updateMask.push("custom_style");
}
if (!isEqual(originalWorkspaceSetting.current.defaultVisibility, workspaceSetting.defaultVisibility)) {
updateMask.push("default_visibility");
}
if (updateMask.length === 0) {
toast.error("No changes made");
return;
@ -59,6 +70,7 @@ const WorkspaceSection: React.FC = () => {
})
).setting as WorkspaceSetting;
setWorkspaceSetting(setting);
await workspaceStore.fetchWorkspaceSetting();
originalWorkspaceSetting.current = setting;
toast.success("Workspace setting saved successfully");
} catch (error: any) {
@ -97,6 +109,19 @@ const WorkspaceSection: React.FC = () => {
/>
<p className="mt-2 text-gray-500">{t("settings.workspace.enable-user-signup.description")}</p>
</div>
<div className="w-full flex flex-row justify-between items-center">
<div className="flex flex-row justify-start items-center gap-x-1">
<span className="dark:text-gray-400">{t("settings.workspace.default-visibility")}</span>
</div>
<Select
defaultValue={workspaceSetting.defaultVisibility || Visibility.PRIVATE}
onChange={(_, value) => handleDefaultVisibilityChange(value as Visibility)}
>
<Option value={Visibility.PRIVATE}>{t(`shortcut.visibility.private.self`)}</Option>
<Option value={Visibility.WORKSPACE}>{t(`shortcut.visibility.workspace.self`)}</Option>
<Option value={Visibility.PUBLIC}>{t(`shortcut.visibility.public.self`)}</Option>
</Select>
</div>
<div>
<Button variant="outlined" color="neutral" disabled={!allowSave} onClick={handleSaveWorkspaceSetting}>
{t("common.save")}