Skip to content

Commit 6e6d87f

Browse files
committed
Legg til 'ignore' til syncmode
Skal ignorere context begge veier for den respektive verdien. Mest brukbar or apper som bruker dekoratøren men som ikke bryr seg om aktiv context.
1 parent f212850 commit 6e6d87f

File tree

7 files changed

+103
-16
lines changed

7 files changed

+103
-16
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ export interface DecoratorProps {
7070
enableHotkeys?: boolean | undefined; // Aktivere hurtigtaster
7171
fetchActiveEnhetOnMount?: boolean | undefined; // Om enhet er undefined fra container appen, og denne er satt til true, henter den sist aktiv enhet og bruker denne.
7272
fetchActiveUserOnMount?: boolean | undefined; // Om fnr er undefined fra container appen, og denne er satt til true for at den skal hente siste aktiv fnr.
73-
fnrSyncMode?: 'sync' | 'writeOnly'; // Modus til fnr state management. "sync" er default. "writeOnly" gjør at endringer aldri hentes men vil settes dersom det oppdateres lokalt i appen
74-
enhetSyncMode?: 'sync' | 'writeOnly'; // Samme som fnrSyncMode, men for enhet state.
73+
fnrSyncMode?: 'sync' | 'writeOnly' | 'ignore'; // Modus til fnr state management. "sync" er default. "writeOnly" gjør at endringer aldri hentes men vil settes dersom det oppdateres lokalt i appen. "ignore" verken henter fra context eller skriver til context ved oppdatert state lokalt.
74+
enhetSyncMode?: 'sync' | 'writeOnly' | 'ignore'; // Samme som fnrSyncMode, men for enhet state.
7575
onEnhetChanged: (enhetId?: string | null, enhet?: Enhet) => void; // Kalles når enheten endres
7676
onFnrChanged: (fnr?: string | null) => void; // Kalles når fnr enheten endres
7777
onLinkClick?: (link: { text: string; url: string }) => void; // Kan brukes for å legge til callbacks ved klikk på lenker i menyen. Merk at callbacken ikke kan awaites og man må selv håndtere at siden lukkes. Nyttig for å f.eks tracke navigasjon events i amplitude

packages/internarbeidsflate-decorator-v3/src/Decorator.tsx

+21-10
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,31 @@ import NewEnhetModal from './components/modals/NewEnhetModal';
88
import ErrorMessage from './components/ErrorMessageDisplay';
99
import { useOnOutsideClick } from './hooks/useOnOutsideClick';
1010
import { useAppState } from './states/AppState';
11-
import { DecoratorProps } from './types/AppProps';
11+
import { AppProps, DecoratorProps } from './types/AppProps';
1212

1313
const Decorator: React.FC<PropsWithChildren<DecoratorProps>> = (props) => {
1414
const memoizedProps = useMemo(
15-
() => ({
16-
...props,
17-
ignoreExternalFnr: props.fnrSyncMode === 'writeOnly',
18-
fetchActiveUserOnMount:
19-
props.fnrSyncMode !== 'writeOnly' && props.fetchActiveUserOnMount,
15+
() =>
16+
({
17+
...props,
18+
ignoreExternalFnr:
19+
props.fnrSyncMode === 'writeOnly' || props.fnrSyncMode === 'ignore',
20+
fetchActiveUserOnMount:
21+
props.fnrSyncMode !== 'writeOnly' &&
22+
props.fnrSyncMode !== 'ignore' &&
23+
props.fetchActiveUserOnMount,
2024

21-
ignoreExternalEnhet: props.enhetSyncMode === 'writeOnly',
22-
fetchActiveEnhetOnMount:
23-
props.enhetSyncMode !== 'writeOnly' && props.fetchActiveEnhetOnMount,
24-
}),
25+
ignoreExternalEnhet:
26+
props.enhetSyncMode === 'writeOnly' ||
27+
props.enhetSyncMode === 'ignore',
28+
fetchActiveEnhetOnMount:
29+
props.enhetSyncMode !== 'writeOnly' &&
30+
props.enhetSyncMode !== 'ignore' &&
31+
props.fetchActiveEnhetOnMount,
32+
33+
fnrWriteDisabled: props.fnrSyncMode === 'ignore',
34+
enhetWriteDisabled: props.enhetSyncMode === 'ignore',
35+
}) satisfies AppProps,
2536
[props],
2637
);
2738
useAppLogic(memoizedProps);

packages/internarbeidsflate-decorator-v3/src/__mocks__/mock-handlers.ts

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const getSuccessResponse = (
3737
type Context = { aktivEnhet: string | null; aktivBruker: string | null };
3838
let context: Context = { aktivEnhet: '0118', aktivBruker: '10108000398' };
3939

40+
export const getMockContext = () => context;
41+
4042
export const updateMockContext = (newContext: Partial<Context>) => {
4143
context = {
4244
...context,

packages/internarbeidsflate-decorator-v3/src/store/EnhetValueManager.ts

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export class EnhetValueManager extends ContextValueManager {
1515
#fnrValueManager: FnrValueManager;
1616
#propsUpdateHandler: PropsUpdateHandler;
1717
#onEnhetChanged?: (newEnhet?: string | null, enhetObject?: Enhet) => void;
18+
19+
#writeDisabled?: boolean;
1820
constructor(
1921
substateProps: SubstateHandlerProps,
2022
errorMessageManager: ErrorMessageManager,
@@ -31,9 +33,11 @@ export class EnhetValueManager extends ContextValueManager {
3133
enhet,
3234
onEnhetChanged,
3335
veileder,
36+
enhetWriteDisabled,
3437
}: StoreProps) => {
3538
this.#registerPropsHandler();
3639
this.#onEnhetChanged = onEnhetChanged;
40+
this.#writeDisabled = !!enhetWriteDisabled;
3741
if (enhet && enhet === this.state.enhet.value) {
3842
return;
3943
}
@@ -156,6 +160,11 @@ export class EnhetValueManager extends ContextValueManager {
156160
newEnhetId?: string,
157161
) => {
158162
this.#changeEnhetLocally(enheter, newEnhetId);
163+
164+
if (this.#writeDisabled) {
165+
return;
166+
}
167+
159168
return this.contextHolderApi.changeEnhet(newEnhetId);
160169
};
161170

packages/internarbeidsflate-decorator-v3/src/store/FnrValueManager.ts

+8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export class FnrValueManager extends ContextValueManager {
1414
#propsUpdateHandler: PropsUpdateHandler;
1515
#onFnrUpdated?: (fnr?: string | null) => void;
1616

17+
#writeDisabled?: boolean;
18+
1719
constructor(
1820
substateProps: SubstateHandlerProps,
1921
errorMessageMaanger: ErrorMessageManager,
@@ -30,8 +32,10 @@ export class FnrValueManager extends ContextValueManager {
3032
fnr,
3133
userKey,
3234
onFnrChanged,
35+
fnrWriteDisabled,
3336
}: StoreProps) => {
3437
this.#onFnrUpdated = onFnrChanged;
38+
this.#writeDisabled = !!fnrWriteDisabled;
3539
if (!veileder.ident) {
3640
this.changeFnrLocally();
3741
return;
@@ -90,6 +94,10 @@ export class FnrValueManager extends ContextValueManager {
9094
readonly changeFnrLocallyAndExternally = async (newFnr?: string) => {
9195
this.optimisticUpdate('fnr');
9296
this.changeFnrLocally(newFnr);
97+
if (this.#writeDisabled) {
98+
return;
99+
}
100+
93101
const res = await this.contextHolderApi.changeFnr(newFnr);
94102
if (res.error) {
95103
this.#errorMessageManager.addErrorMessage(

packages/internarbeidsflate-decorator-v3/src/store/__test__/StoreHandler.test.ts

+50-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { StoreHandler } from '../StoreHandler';
66
import { AppProps } from '../../types/AppProps';
77
import {
88
getHandlers,
9+
getMockContext,
910
mockMe,
1011
updateMockContext,
1112
} from '../../__mocks__/mock-handlers';
@@ -225,10 +226,58 @@ describe('StoreHandler test', () => {
225226
await awaitTimeout(10, 'For å la staten bli propagert');
226227

227228
expect(spy).toHaveBeenCalledTimes(2);
228-
expect(Object.values(storeHandler.state.errorMessages).length).toBe(0);
229229
expect(storeHandler.state.enhet.value).toBe('0219');
230230
});
231231

232+
it('skal ikke sende ny enhet til contxt-apiet hvis den får ny enhet og syncMode = ignore', async () => {
233+
const storeHandler = new StoreHandler();
234+
const spy = vi.spyOn(
235+
storeHandler.enhetValueManager,
236+
'changeEnhetLocallyAndExternally',
237+
);
238+
storeHandler.propsUpdateHandler.onPropsUpdated({
239+
enhet: '0118',
240+
enhetWriteDisabled: true,
241+
...defaultProps,
242+
});
243+
244+
await ws.connected;
245+
246+
expect(spy).toHaveBeenCalledOnce();
247+
248+
storeHandler.propsUpdateHandler.onPropsUpdated({
249+
enhet: '0219',
250+
enhetWriteDisabled: true,
251+
...defaultProps,
252+
});
253+
254+
await awaitTimeout(10, 'For å la staten bli propagert');
255+
256+
expect(spy).toHaveBeenCalledTimes(2);
257+
expect(storeHandler.state.enhet.value).toBe('0219');
258+
expect(getMockContext().aktivEnhet).toEqual('0118');
259+
});
260+
261+
it('skal ikke sende ny fnr til contxt-apiet hvis den får ny fnr og syncMode = ignore', async () => {
262+
const storeHandler = new StoreHandler();
263+
const spy = vi.spyOn(
264+
storeHandler.fnrValueManager,
265+
'changeFnrLocallyAndExternally',
266+
);
267+
268+
await storeHandler.propsUpdateHandler.onPropsUpdated({
269+
fnr: '07063000250',
270+
enhetWriteDisabled: true,
271+
...defaultProps,
272+
});
273+
274+
await awaitTimeout(10, 'For å la staten bli propagert');
275+
276+
expect(spy).toHaveBeenCalledOnce();
277+
expect(storeHandler.state.fnr.value).toBe('07063000250');
278+
expect(getMockContext().aktivBruker).toEqual('10108000398');
279+
});
280+
232281
it('skal hente fnr fra context apiet om `fetchActiveUserOnMount` er satt til true', async () => {
233282
const storeHandler = new StoreHandler();
234283

packages/internarbeidsflate-decorator-v3/src/types/AppProps.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@ interface DomainProps {
1818

1919
ignoreExternalFnr?: boolean;
2020
ignoreExternalEnhet?: boolean;
21+
enhetWriteDisabled?: boolean;
22+
fnrWriteDisabled?: boolean;
2123
}
2224

2325
export interface AppProps extends DomainProps, Omit<AppState, 'open'> {}
2426

2527
export interface DecoratorProps
26-
extends Omit<AppProps, 'ignoreExternalFnr' | 'ignoreExternalEnhet'> {
27-
fnrSyncMode?: 'writeOnly' | 'sync';
28-
enhetSyncMode?: 'writeOnly' | 'sync';
28+
extends Omit<
29+
AppProps,
30+
| 'ignoreExternalFnr'
31+
| 'ignoreExternalEnhet'
32+
| 'enhetWriteDisabled'
33+
| 'fnrWriteDisabled'
34+
> {
35+
fnrSyncMode?: 'writeOnly' | 'sync' | 'ignore';
36+
enhetSyncMode?: 'writeOnly' | 'sync' | 'ignore';
2937
}

0 commit comments

Comments
 (0)