diff --git a/apps/portal/src/components/offers/forms/OfferDetailsForm.tsx b/apps/portal/src/components/offers/forms/OfferDetailsForm.tsx index b654f89f..63a86366 100644 --- a/apps/portal/src/components/offers/forms/OfferDetailsForm.tsx +++ b/apps/portal/src/components/offers/forms/OfferDetailsForm.tsx @@ -1,14 +1,10 @@ import { useState } from 'react'; -import type { - FieldValues, - UseFieldArrayRemove, - UseFieldArrayReturn, -} from 'react-hook-form'; +import type { FieldValues, UseFieldArrayReturn } from 'react-hook-form'; import { useFormContext } from 'react-hook-form'; import { useFieldArray } from 'react-hook-form'; import { PlusIcon } from '@heroicons/react/20/solid'; import { TrashIcon } from '@heroicons/react/24/outline'; -import { Button } from '@tih/ui'; +import { Button, Dialog } from '@tih/ui'; import FormMonthYearPicker from './components/FormMonthYearPicker'; import FormSelect from './components/FormSelect'; @@ -26,17 +22,18 @@ import type { FullTimeOfferDetailsFormData, InternshipOfferDetailsFormData, } from '../types'; +import { JobTypeLabel } from '../types'; import { JobType } from '../types'; import { CURRENCY_OPTIONS } from '../../../utils/offers/currency/CurrencyEnum'; type FullTimeOfferDetailsFormProps = Readonly<{ index: number; - remove: UseFieldArrayRemove; + setDialogOpen: (isOpen: boolean) => void; }>; function FullTimeOfferDetailsForm({ index, - remove, + setDialogOpen, }: FullTimeOfferDetailsFormProps) { const { register, formState } = useFormContext<{ offers: Array; @@ -228,7 +225,7 @@ function FullTimeOfferDetailsForm({ icon={TrashIcon} label="Delete" variant="secondary" - onClick={() => remove(index)} + onClick={() => setDialogOpen(true)} /> )} @@ -236,53 +233,14 @@ function FullTimeOfferDetailsForm({ ); } -type OfferDetailsFormArrayProps = Readonly<{ - fieldArrayValues: UseFieldArrayReturn; - jobType: JobType; -}>; - -function OfferDetailsFormArray({ - fieldArrayValues, - jobType, -}: OfferDetailsFormArrayProps) { - const { append, remove, fields } = fieldArrayValues; - return ( -
- {fields.map((item, index) => - jobType === JobType.FullTime ? ( - - ) : ( - - ), - )} -
- ); -} - type InternshipOfferDetailsFormProps = Readonly<{ index: number; - remove: UseFieldArrayRemove; + setDialogOpen: (isOpen: boolean) => void; }>; function InternshipOfferDetailsForm({ index, - remove, + setDialogOpen, }: InternshipOfferDetailsFormProps) { const { register, formState } = useFormContext<{ offers: Array; @@ -409,7 +367,9 @@ function InternshipOfferDetailsForm({ icon={TrashIcon} label="Delete" variant="secondary" - onClick={() => remove(index)} + onClick={() => { + setDialogOpen(true); + }} /> )} @@ -417,20 +377,99 @@ function InternshipOfferDetailsForm({ ); } +type OfferDetailsFormArrayProps = Readonly<{ + fieldArrayValues: UseFieldArrayReturn; + jobType: JobType; +}>; + +function OfferDetailsFormArray({ + fieldArrayValues, + jobType, +}: OfferDetailsFormArrayProps) { + const { append, remove, fields } = fieldArrayValues; + const [isDialogOpen, setDialogOpen] = useState(false); + + return ( +
+ {fields.map((item, index) => { + return ( + <> + {jobType === JobType.FullTime ? ( + + ) : ( + + )} + { + remove(index); + setDialogOpen(false); + }} + /> + } + secondaryButton={ + + + ); + })} +
+ ); +} + export default function OfferDetailsForm() { const [jobType, setJobType] = useState(JobType.FullTime); + const [isDialogOpen, setDialogOpen] = useState(false); const { control, register } = useFormContext(); const fieldArrayValues = useFieldArray({ control, name: 'offers' }); - const changeJobType = (jobTypeChosen: JobType) => () => { - if (jobType === jobTypeChosen) { - return; + const toggleJobType = () => { + if (jobType === JobType.FullTime) { + setJobType(JobType.Internship); + } else { + setJobType(JobType.FullTime); } - - setJobType(jobTypeChosen); fieldArrayValues.remove(); }; + const switchJobTypeLabel = () => + jobType === JobType.FullTime + ? JobTypeLabel.INTERNSHIP + : JobTypeLabel.FULLTIME; + return (
@@ -440,20 +479,30 @@ export default function OfferDetailsForm() {
@@ -462,6 +511,32 @@ export default function OfferDetailsForm() { fieldArrayValues={fieldArrayValues} jobType={jobType} /> + { + toggleJobType(); + setDialogOpen(false); + }} + /> + } + secondaryButton={ +
); } diff --git a/apps/portal/src/components/offers/types.ts b/apps/portal/src/components/offers/types.ts index 4bbf44dd..3ddf56b4 100644 --- a/apps/portal/src/components/offers/types.ts +++ b/apps/portal/src/components/offers/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-shadow */ import type { MonthYear } from '~/components/shared/MonthYearPicker'; /* @@ -10,6 +9,11 @@ export enum JobType { Internship = 'INTERNSHIP', } +export const JobTypeLabel = { + FULLTIME: 'Full-time', + INTERNSHIP: 'Internship', +}; + export enum EducationBackgroundType { Bachelor = 'Bachelor', Diploma = 'Diploma',