-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNySykmeldingForm.tsx
156 lines (138 loc) · 6.76 KB
/
NySykmeldingForm.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
'use client'
import React, { ReactElement, useTransition } from 'react'
import { FormProvider, useForm } from 'react-hook-form'
import { logger } from '@navikt/next-logger'
import { Alert, BodyShort, Button, Heading } from '@navikt/ds-react'
import { DevTool } from '@hookform/devtools'
import { useMutation } from '@tanstack/react-query'
import { FloppydiskIcon, HandBandageIcon, PersonIcon, StethoscopeIcon, VitalsIcon } from '@navikt/aksel-icons'
import { useRouter } from 'next/navigation'
import { FormSection } from '@components/ui/form'
import NySykmeldingFormSummary from '@components/ny-sykmelding-form/aktivitet/form-summary/NySykmeldingFormSummary'
import { PractitionerSection } from '@components/ny-sykmelding-form/practitioner/PractitionerSection'
import { raise } from '@utils/ts'
import { useIsDataServiceInitialized, useDataService } from '../../data-fetcher/data-provider'
import { DataService } from '../../data-fetcher/data-service'
import AktivitetSection from './aktivitet/AktivitetSection'
import DiagnoseSection from './diagnose/DiagnoseSection'
import PasientSection from './pasient/PasientSection'
import { NySykmeldingOpprettProgressModal } from './NySykmeldingOpprettProgressModal'
import FormErrors, { useFormErrors } from './errors/FormErrors'
import { NySykmeldingFormValues } from './NySykmeldingFormValues'
function NySykmeldingForm(): ReactElement {
const [errorSectionRef, focusErrorSection] = useFormErrors()
const form = useForm<NySykmeldingFormValues>()
const dataService: DataService = useDataService()
const router = useRouter()
const [navigationPending, startTransition] = useTransition()
const opprettSykmelding = useMutation({
mutationKey: ['opprett-sykmelding'],
mutationFn: async (values: NySykmeldingFormValues) => {
logger.info('(Client) Submitting values,', values)
try {
const createResult = await dataService.mutation.sendSykmelding({
pasient: values.pasient ?? raise('Ingen pasient'),
aktivitet: {
type: values.aktivitet.type,
fom: values.aktivitet.fom ?? raise('Ingen fom'),
tom: values.aktivitet.tom ?? raise('Ingen tom'),
// @ts-expect-error TODO proper mapping
grad: values.aktivitet.grad,
},
diagnoser: {
hoved: {
system: values.diagnoser.hoved?.system ?? raise('Ingen system'),
code: values.diagnoser.hoved?.code ?? raise('Ingen code'),
},
},
})
startTransition(() => {
const target = `${dataService.mode === 'fhir' ? 'fhir' : 'ny'}/kvittering/${createResult.sykmeldingId}`
router.push(target)
})
return createResult
} catch (e) {
logger.error(`Sykmelding creation failed, errors`, { cause: e })
throw new Error(`Sykmelding creation failed`)
}
},
onSuccess: (data) => {
logger.info(`Sykmelding created successfully: ${data.sykmeldingId}`)
},
})
if (!useIsDataServiceInitialized()) {
return (
<div className="max-w-prose p-8">
<Alert variant="error">
<BodyShort spacing>Oppstart av applikasjon feilet.</BodyShort>
<div>Teknisk årsak: DataProvider ikke tilgjengelig</div>
</Alert>
</div>
)
}
return (
<>
<FormProvider {...form}>
<form
id="ny-sykmelding-form"
onSubmit={form.handleSubmit(
(values) => {
logger.info(`Form submit OK, values: ${JSON.stringify(values, null, 2)}`)
opprettSykmelding.mutate(values)
},
(errors) => {
logger.error(`Form submit failed, errors:`)
logger.info(errors)
focusErrorSection()
},
)}
className="flex flex-col gap-3 max-w-prose"
>
<FormSection title="Info om pasienten" icon={<PersonIcon />}>
<PasientSection />
</FormSection>
<FormSection title="Diagnose" icon={<HandBandageIcon />}>
<DiagnoseSection />
</FormSection>
<FormSection title="Aktivitet" icon={<VitalsIcon />}>
<AktivitetSection />
</FormSection>
<FormSection title="Sykmelder" icon={<StethoscopeIcon />}>
<PractitionerSection />
</FormSection>
<FormSection title="Oppsummering" icon={<FloppydiskIcon />}>
<NySykmeldingFormSummary />
<Heading level="3" size="small" spacing>
Ferdigstill sykmeldingen
</Heading>
<BodyShort spacing>
Du kan sende inn sykmeldingen til NAV, eller lagre den for å fortsette på et senere
tidspunkt.
</BodyShort>
<FormErrors ref={errorSectionRef} />
{opprettSykmelding.error && (
<Alert variant="error" className="mb-4">
<Heading level="3" size="medium">
Kunne ikke opprette sykmelding
</Heading>
<BodyShort spacing>En feil skjedde under oppretting av sykmelding.</BodyShort>
<BodyShort>Teknisk beskrivelse: {opprettSykmelding.error.message}</BodyShort>
</Alert>
)}
<div className="flex gap-3 justify-end">
<Button type="submit" formTarget="ny-sykmelding-form" loading={opprettSykmelding.isPending}>
Opprett sykmelding
</Button>
</div>
</FormSection>
</form>
<DevTool control={form.control} placement="bottom-left" />
</FormProvider>
<NySykmeldingOpprettProgressModal
isPending={opprettSykmelding.isPending}
isTransitioning={navigationPending}
/>
</>
)
}
export default NySykmeldingForm