mirror of
https://github.com/aykhans/slash-e.git
synced 2025-07-04 12:26:19 +00:00
feat: add default visibility workspace setting
This commit is contained in:
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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")}
|
||||
|
Reference in New Issue
Block a user