import { Button, Divider, Option, Select, Textarea } from "@mui/joy"; import { head, 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"; import { FeatureType } from "@/stores/workspace"; import { Visibility } from "@/types/proto/api/v1/common"; import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_service"; import FeatureBadge from "../FeatureBadge"; import Icon from "../Icon"; import SSOSection from "./SSOSection"; const getDefaultVisibility = (visibility?: Visibility) => { if (!visibility || [Visibility.VISIBILITY_UNSPECIFIED, Visibility.UNRECOGNIZED].includes(visibility)) { // Default to workspace visibility. return Visibility.WORKSPACE; } return visibility; }; const convertFileToBase64 = (file: File) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result as string); reader.onerror = (error) => reject(error); }); const WorkspaceSection = () => { const { t } = useTranslation(); const workspaceStore = useWorkspaceStore(); const [workspaceSetting, setWorkspaceSetting] = useState(workspaceStore.setting); const originalWorkspaceSetting = useRef(workspaceStore.setting); const allowSave = !isEqual(originalWorkspaceSetting.current, workspaceSetting); const hasCustomBranding = workspaceStore.checkFeatureAvailable(FeatureType.CustomeBranding); const branding = hasCustomBranding && workspaceSetting.branding ? new TextDecoder().decode(workspaceSetting.branding) : ""; const onBrandingChange = async (event: React.ChangeEvent) => { const files: File[] = Array.from(event.target.files || []); const file = head(files); if (!file) { return; } const base64 = await convertFileToBase64(file); setWorkspaceSetting({ ...workspaceSetting, branding: new TextEncoder().encode(base64) }); }; const handleCustomStyleChange = async (value: string) => { setWorkspaceSetting({ ...workspaceSetting, customStyle: value, }); }; const handleDefaultVisibilityChange = async (value: Visibility) => { setWorkspaceSetting({ ...workspaceSetting, defaultVisibility: value, }); }; const handleSaveWorkspaceSetting = async () => { const updateMask: string[] = []; if (!isEqual(originalWorkspaceSetting.current.branding, workspaceSetting.branding)) { updateMask.push("branding"); } 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; } try { const setting = await workspaceServiceClient.updateWorkspaceSetting({ setting: workspaceSetting, updateMask: updateMask, }); setWorkspaceSetting(setting); await workspaceStore.fetchWorkspaceSetting(); originalWorkspaceSetting.current = setting; toast.success("Workspace setting saved successfully"); } catch (error: any) { toast.error(error.details); } }; return (

{t("settings.workspace.self")}

Custom branding

Recommand logo ratio: 1:1

{branding ? (
branding setWorkspaceSetting({ ...workspaceSetting, branding: new TextEncoder().encode("") })} />
) : ( )}

(Click to select file)

{t("settings.workspace.default-visibility")}

The default visibility of new shortcuts/collections.

{t("settings.workspace.custom-style")}