import { useEffect, useState } from "react"; import Image from "next/image"; import { useRouter } from "next/router"; import useSWR, { mutate } from "swr"; // react-hook-form import { Controller, useForm } from "react-hook-form"; // layouts import { ProjectAuthorizationWrapper } from "layouts/auth-layout"; // services import projectService from "services/project.service"; // components import { DeleteProjectModal, SettingsHeader } from "components/project"; import { ImagePickerPopover } from "components/core"; import EmojiIconPicker from "components/emoji-icon-picker"; // hooks import useToast from "hooks/use-toast"; // ui import { Input, TextArea, Loader, CustomSelect, SecondaryButton, DangerButton, } from "components/ui"; import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; // types import { IProject, IWorkspace } from "types"; import type { NextPage } from "next"; // fetch-keys import { PROJECTS_LIST, PROJECT_DETAILS } from "constants/fetch-keys"; // constants import { NETWORK_CHOICES } from "constants/project"; const defaultValues: Partial = { name: "", description: "", identifier: "", network: 0, }; const GeneralSettings: NextPage = () => { const [selectProject, setSelectedProject] = useState(null); const { setToastAlert } = useToast(); const router = useRouter(); const { workspaceSlug, projectId } = router.query; const { data: projectDetails } = useSWR( workspaceSlug && projectId ? PROJECT_DETAILS(projectId as string) : null, workspaceSlug && projectId ? () => projectService.getProject(workspaceSlug as string, projectId as string) : null ); const { register, handleSubmit, reset, watch, control, setValue, setError, formState: { errors, isSubmitting }, } = useForm({ defaultValues, }); useEffect(() => { if (projectDetails) reset({ ...projectDetails, default_assignee: projectDetails.default_assignee?.id, project_lead: projectDetails.project_lead?.id, workspace: (projectDetails.workspace as IWorkspace).id, }); }, [projectDetails, reset]); const updateProject = async (payload: Partial) => { if (!workspaceSlug || !projectDetails) return; await projectService .updateProject(workspaceSlug as string, projectDetails.id, payload) .then((res) => { mutate( PROJECT_DETAILS(projectDetails.id), (prevData) => ({ ...prevData, ...res }), false ); mutate(PROJECTS_LIST(workspaceSlug as string)); setToastAlert({ type: "success", title: "Success!", message: "Project updated successfully", }); }) .catch(() => { setToastAlert({ type: "error", title: "Error!", message: "Project could not be updated. Please try again.", }); }); }; const onSubmit = async (formData: IProject) => { if (!workspaceSlug || !projectDetails) return; const payload: Partial = { name: formData.name, network: formData.network, identifier: formData.identifier, description: formData.description, default_assignee: formData.default_assignee, project_lead: formData.project_lead, icon: formData.icon, cover_image: formData.cover_image, }; if (projectDetails.identifier !== formData.identifier) await projectService .checkProjectIdentifierAvailability(workspaceSlug as string, payload.identifier ?? "") .then(async (res) => { if (res.exists) setError("identifier", { message: "Identifier already exists" }); else await updateProject(payload); }); else await updateProject(payload); }; return ( } > setSelectedProject(null)} onSuccess={() => { router.push(`/${workspaceSlug}/projects`); }} />

Icon & Name

Select an icon and a name for your project.

{projectDetails ? ( ( )} /> ) : ( )} {projectDetails ? ( ) : ( )}

Description

Give a description to your project.

{projectDetails ? (