Skip to content

Commit 402f9b9

Browse files
navelgenhavstein
andcommitted
🐛 Reset skjønnsfastsettingsskjema når man går ut av eller bytter person
Co-authored-by: Jakob Havstein Eriksen <[email protected]>
1 parent 47fa732 commit 402f9b9

File tree

6 files changed

+81
-35
lines changed

6 files changed

+81
-35
lines changed

src/app/person/[aktorId]/layout.tsx

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
'use client';
22

3+
import { createStore } from 'jotai/index';
34
import dynamic from 'next/dynamic';
4-
import React, { PropsWithChildren, ReactElement } from 'react';
5+
import { useParams } from 'next/navigation';
6+
import React, { PropsWithChildren, ReactElement, useState } from 'react';
57

68
import { useKeyboardShortcuts } from '@hooks/useKeyboardShortcuts';
79
import { useRefetchDriftsmeldinger } from '@hooks/useRefetchDriftsmeldinger';
@@ -18,6 +20,7 @@ import { InfovarselOmStans } from '@saksbilde/infovarselOmStans/InfovarselOmStan
1820
import { PersonHeader } from '@saksbilde/personHeader';
1921
import { Timeline } from '@saksbilde/timeline';
2022
import { Venstremeny } from '@saksbilde/venstremeny/Venstremeny';
23+
import { PersonStoreContext } from '@state/contexts/personStore';
2124

2225
import styles from './layout.module.css';
2326

@@ -27,26 +30,36 @@ const Historikk = dynamic(() => import('@saksbilde/historikk').then((mod) => mod
2730
});
2831

2932
export default function Layout({ children }: PropsWithChildren): ReactElement {
33+
const { aktorId } = useParams<{ aktorId?: string }>();
34+
3035
useRefreshPersonVedOpptegnelse();
3136
usePollEtterOpptegnelser();
3237
useVarselOmSakErTildeltAnnenSaksbehandler();
3338
useKeyboardShortcuts();
3439
useResetOpenedDocuments();
3540
useRefetchDriftsmeldinger();
3641

42+
return <AktorScopedLayout key={aktorId}>{children}</AktorScopedLayout>;
43+
}
44+
45+
const AktorScopedLayout = ({ children }: PropsWithChildren): ReactElement => {
46+
const [personStore] = useState(createStore());
47+
3748
return (
38-
<div className={styles.Saksbilde}>
39-
<InfovarselOmStans />
40-
<PersonHeader />
41-
<Timeline />
42-
<AmplitudeProvider>
43-
<VenterPåEndringProvider>
44-
<Venstremeny />
45-
<Saksbilde>{children}</Saksbilde>
46-
<Historikk />
47-
<EmojiTilbakemeldingMedPeriode />
48-
</VenterPåEndringProvider>
49-
</AmplitudeProvider>
50-
</div>
49+
<PersonStoreContext.Provider value={personStore}>
50+
<div className={styles.Saksbilde}>
51+
<InfovarselOmStans />
52+
<PersonHeader />
53+
<Timeline />
54+
<AmplitudeProvider>
55+
<VenterPåEndringProvider>
56+
<Venstremeny />
57+
<Saksbilde>{children}</Saksbilde>
58+
<Historikk />
59+
<EmojiTilbakemeldingMedPeriode />
60+
</VenterPåEndringProvider>
61+
</AmplitudeProvider>
62+
</div>
63+
</PersonStoreContext.Provider>
5164
);
52-
}
65+
};

src/routes/oversikt/Oversikt.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { BehandlingsstatistikkView } from '@oversikt/behandlingsstatistikk/Behan
1515
import { FiltermenySkeleton } from '@oversikt/filtermeny/Filtermeny';
1616
import { BehandletIdagTable } from '@oversikt/table/BehandletIdagTable';
1717
import { OppgaverTable } from '@oversikt/table/oppgaverTable/OppgaverTable';
18-
import { useResetSkjønnsfastsettelseFormState } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/skjønnsfastsettingForm/SkjønnsfastsettingForm';
1918
import { useOppgaveFeed } from '@state/oppgaver';
2019

2120
import { IngenOppgaver } from './IngenOppgaver';
@@ -49,7 +48,6 @@ export const Oversikt = (): ReactElement => {
4948
useKeyboardShortcuts();
5049
useFjernPersonFraApolloCache();
5150
useRefetchDriftsmeldinger();
52-
useResetSkjønnsfastsettelseFormState();
5351

5452
return (
5553
<main className={styles.Oversikt}>

src/routes/saksbilde/sykepengegrunnlag/skjønnsfastsetting/SkjønnsfastsettingSykepengegrunnlag.tsx

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import classNames from 'classnames';
2-
import { atom, useAtom } from 'jotai/index';
3-
import { atomFamily } from 'jotai/utils';
42
import React, { useEffect, useState } from 'react';
53

64
import { useSkjønnsfastsettelsesMaler } from '@external/sanity';
@@ -12,6 +10,7 @@ import {
1210
PersonFragment,
1311
Sykepengegrunnlagsgrense,
1412
} from '@io/graphql';
13+
import { useAtomEditingForPersonOgSkjæringstidspunkt } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/atoms';
1514
import {
1615
SkjønnsfastsettingForm,
1716
useAktiveArbeidsgivere,
@@ -24,8 +23,6 @@ import { SkjønnsfastsettingSammendrag } from './SkjønnsfastsettingSammendrag';
2423

2524
import styles from './SkjønnsfastsettingSykepengegrunnlag.module.css';
2625

27-
const editingFamily = atomFamily((_skjæringstidspunkt: string) => atom<boolean>(false));
28-
2926
interface SkjønnsfastsettingSykepengegrunnlagProps {
3027
person: PersonFragment;
3128
periode: BeregnetPeriodeFragment | GhostPeriodeFragment;
@@ -51,7 +48,7 @@ export const SkjønnsfastsettingSykepengegrunnlag = ({
5148
avviksprosent,
5249
organisasjonsnummer,
5350
}: SkjønnsfastsettingSykepengegrunnlagProps) => {
54-
const [editing, setEditing] = useAtom(editingFamily(periode.skjaeringstidspunkt));
51+
const [editing, setEditing] = useAtomEditingForPersonOgSkjæringstidspunkt(periode.skjaeringstidspunkt);
5552
const [endretSykepengegrunnlag, setEndretSykepengegrunnlag] = useState<Maybe<number>>(null);
5653
const aktiveArbeidsgivereMedOmregnetÅrsinntekt = useAktiveArbeidsgivere(person, periode, inntekter);
5754
const skalVise828andreLedd = avviksprosent > 25;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai/index';
2+
import { atomFamily } from 'jotai/utils';
3+
4+
import { Maybe } from '@io/graphql';
5+
import { SkjønnsfastsettingFormFields } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/skjønnsfastsettingForm/SkjønnsfastsettingForm';
6+
import { usePersonStore } from '@state/contexts/personStore';
7+
8+
const skjemaFamily = atomFamily((_skjæringstidspunkt: string) => atom<Maybe<SkjønnsfastsettingFormFields>>(null));
9+
10+
export const useAtomSkjemaForPersonOgSkjæringstidspunkt = (skjaeringstidspunkt: string) =>
11+
useAtom(skjemaFamily(skjaeringstidspunkt), {
12+
store: usePersonStore(),
13+
});
14+
15+
export const useAtomValueSkjemaForPersonOgSkjæringstidspunkt = (skjaeringstidspunkt: string) =>
16+
useAtomValue(skjemaFamily(skjaeringstidspunkt), {
17+
store: usePersonStore(),
18+
});
19+
20+
export const useSetAtomSkjemaForPersonOgSkjæringstidspunkt = (skjaeringstidspunkt: string) =>
21+
useSetAtom(skjemaFamily(skjaeringstidspunkt), { store: usePersonStore() });
22+
23+
const editingFamily = atomFamily((_skjæringstidspunkt: string) => atom<boolean>(false));
24+
25+
export const useAtomEditingForPersonOgSkjæringstidspunkt = (skjaeringstidspunkt: string) =>
26+
useAtom(editingFamily(skjaeringstidspunkt), {
27+
store: usePersonStore(),
28+
});

src/routes/saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/skjønnsfastsettingForm/SkjønnsfastsettingForm.tsx

+6-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { atom, useAtomValue, useSetAtom } from 'jotai/index';
2-
import { atomFamily } from 'jotai/utils';
31
import React, { ReactElement, useEffect, useRef } from 'react';
42
import { CustomElement, FieldErrors, FieldValues, FormProvider, useForm, useWatch } from 'react-hook-form';
53

@@ -18,6 +16,10 @@ import {
1816
Sykepengegrunnlagsgrense,
1917
Sykepengegrunnlagskjonnsfastsetting,
2018
} from '@io/graphql';
19+
import {
20+
useAtomValueSkjemaForPersonOgSkjæringstidspunkt,
21+
useSetAtomSkjemaForPersonOgSkjæringstidspunkt,
22+
} from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/atoms';
2123
import { SkjønnsfastsettingBegrunnelse } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/SkjønnsfastsettingBegrunnelse';
2224
import { SkjønnsfastsettingType } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/SkjønnsfastsettingType';
2325
import { SkjønnsfastsettingÅrsak } from '@saksbilde/sykepengegrunnlag/skjønnsfastsetting/form/SkjønnsfastsettingÅrsak';
@@ -33,15 +35,6 @@ import { skjønnsfastsettingFormToDto } from './skjønnsfastsettingFormToDto';
3335

3436
import styles from './SkjønnsfastsettingForm.module.css';
3537

36-
const skjemaFamily = atomFamily((_skjæringstidspunkt: string) => atom<Maybe<SkjønnsfastsettingFormFields>>(null));
37-
38-
export const useResetSkjønnsfastsettelseFormState = () => {
39-
useEffect(() => {
40-
skjemaFamily.setShouldRemove(() => true);
41-
skjemaFamily.setShouldRemove(null);
42-
}, []);
43-
};
44-
4538
export const useAktiveArbeidsgivere = (
4639
person: PersonFragment,
4740
period: BeregnetPeriodeFragment | GhostPeriodeFragment,
@@ -68,7 +61,7 @@ function useFormDefaults(
6861
aktiveArbeidsgivereInntekter: Arbeidsgiverinntekt[],
6962
forrigeSkjønnsfastsettelse: Sykepengegrunnlagskjonnsfastsetting | null,
7063
): SkjønnsfastsettingFormFields {
71-
const skjønnsfastsettelseFormState = useAtomValue(skjemaFamily(period.skjaeringstidspunkt));
64+
const skjønnsfastsettelseFormState = useAtomValueSkjemaForPersonOgSkjæringstidspunkt(period.skjaeringstidspunkt);
7265
if (skjønnsfastsettelseFormState) {
7366
return skjønnsfastsettelseFormState;
7467
} else {
@@ -184,7 +177,7 @@ export const SkjønnsfastsettingForm = ({
184177
const watchedFormFields = watch();
185178
const prevFormFields = useRef(watchedFormFields);
186179

187-
const setFormFields = useSetAtom(skjemaFamily(periode.skjaeringstidspunkt));
180+
const setFormFields = useSetAtomSkjemaForPersonOgSkjæringstidspunkt(periode.skjaeringstidspunkt);
188181
useEffect(() => {
189182
if (JSON.stringify(prevFormFields.current) !== JSON.stringify(watchedFormFields)) {
190183
setFormFields(watchedFormFields);

src/state/contexts/personStore.tsx

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { createStore } from 'jotai/index';
2+
import { createContext, useContext } from 'react';
3+
4+
import { Maybe } from '@io/graphql';
5+
6+
type JotaiStore = ReturnType<typeof createStore>;
7+
export const PersonStoreContext = createContext<Maybe<JotaiStore>>(null);
8+
9+
export const usePersonStore = (): JotaiStore => {
10+
const context = useContext(PersonStoreContext);
11+
if (!context)
12+
throw new Error(
13+
'Mangler PersonStoreContext - antageligvis brukes usePersonStore()' +
14+
' et sted som ikke ligger under PersonStoreContext.Provider i komponenttreet',
15+
);
16+
return context;
17+
};

0 commit comments

Comments
 (0)