"use client"; import type { ReactNode } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import useSWR from "swr"; // plane imports import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IProject, IUserLite, IWorkspace } from "@plane/types"; import { Loader, ToggleSwitch } from "@plane/ui"; // constants import { PROJECT_MEMBERS } from "@/constants/fetch-keys"; // hooks import { useProject } from "@/hooks/store/use-project"; import { useUserPermissions } from "@/hooks/store/user"; // local imports import { MemberSelect } from "./member-select"; const defaultValues: Partial = { project_lead: null, default_assignee: null, }; type TDefaultSettingItemProps = { title: string; description: string; children: ReactNode; }; const DefaultSettingItem: React.FC = ({ title, description, children }) => (

{title}

{description}

{children}
); type TProjectSettingsMemberDefaultsProps = { workspaceSlug: string; projectId: string; }; export const ProjectSettingsMemberDefaults: React.FC = observer((props) => { const { workspaceSlug, projectId } = props; // plane hooks const { t } = useTranslation(); // store hooks const { allowPermissions } = useUserPermissions(); const { currentProjectDetails, fetchProjectDetails, updateProject } = useProject(); // derived values const isAdmin = allowPermissions( [EUserPermissions.ADMIN], EUserPermissionsLevel.PROJECT, workspaceSlug, currentProjectDetails?.id ); // form info const { reset, control } = useForm({ defaultValues }); // fetching user members useSWR( workspaceSlug && projectId ? PROJECT_MEMBERS(projectId) : null, workspaceSlug && projectId ? () => fetchProjectDetails(workspaceSlug, projectId) : null ); useEffect(() => { if (!currentProjectDetails) return; reset({ ...currentProjectDetails, default_assignee: (currentProjectDetails.default_assignee as IUserLite)?.id ?? currentProjectDetails.default_assignee, project_lead: (currentProjectDetails.project_lead as IUserLite)?.id ?? currentProjectDetails.project_lead, workspace: (currentProjectDetails.workspace as IWorkspace).id, }); }, [currentProjectDetails, reset]); const submitChanges = async (formData: Partial) => { if (!workspaceSlug || !projectId) return; reset({ ...currentProjectDetails, default_assignee: (currentProjectDetails?.default_assignee as IUserLite)?.id ?? currentProjectDetails?.default_assignee, project_lead: (currentProjectDetails?.project_lead as IUserLite)?.id ?? currentProjectDetails?.project_lead, ...formData, }); await updateProject(workspaceSlug, projectId, { default_assignee: formData.default_assignee === "none" ? null : (formData.default_assignee ?? currentProjectDetails?.default_assignee), project_lead: formData.project_lead === "none" ? null : (formData.project_lead ?? currentProjectDetails?.project_lead), }) .then(() => { setToast({ title: `${t("success")}!`, type: TOAST_TYPE.SUCCESS, message: t("project_settings.general.toast.success"), }); }) .catch((err) => { console.error(err); }); }; const toggleGuestViewAllIssues = async (value: boolean) => { if (!workspaceSlug || !projectId) return; updateProject(workspaceSlug, projectId, { guest_view_all_features: value, }) .then(() => { setToast({ title: `${t("success")}!`, type: TOAST_TYPE.SUCCESS, message: t("project_settings.general.toast.success"), }); }) .catch((err) => { console.error(err); }); }; return (
{currentProjectDetails ? ( ( { submitChanges({ project_lead: val }); }} isDisabled={!isAdmin} /> )} /> ) : ( )} {currentProjectDetails ? ( ( { submitChanges({ default_assignee: val }); }} isDisabled={!isAdmin} /> )} /> ) : ( )} {currentProjectDetails && (
toggleGuestViewAllIssues(!currentProjectDetails?.guest_view_all_features)} disabled={!isAdmin} size="sm" />
)}
); });