Skip to content

Commit ea7e8ab

Browse files
authored
Merge pull request #394 from navikt/better-callbacks
OnLinkClick og enhet objekt i onEnhetChanged
2 parents 8f63dd1 + 1095ad5 commit ea7e8ab

File tree

7 files changed

+68
-17
lines changed

7 files changed

+68
-17
lines changed

v3/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ export interface DecoratorProps {
6161
fetchActiveEnhetOnMount?: boolean | undefined; // Om enhet er undefined fra container appen, og denne er satt til true, henter den sist aktiv enhet og bruker denne.
6262
fetchActiveUserOnMount?: boolean | undefined; // Om fnr er undefined fra container appen, og denne er satt til true for at den skal hente siste aktiv fnr.
6363
onBeforeRequest?: (headers: HeadersInit) => HeadersInit | undefined; // Her kan headeren til alle nettverkskall bli modifisert før de blir kalt
64-
onEnhetChanged: (enhet?: string | null) => void; // Kalles når enheten endres
64+
onEnhetChanged: (enhet?: string | null, enhet?: Enhet) => void; // Kalles når enheten endres
6565
onFnrChanged: (fnr?: string | null) => void; // Kalles når fnr enheten endres
66+
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
6667
appName: string; // Navn på applikasjonen
6768
hotkeys?: Hotkey[]; // Konfigurasjon av hurtigtaster
6869
markup?: Markup; // Egen HTML

v3/bun.lockb

21.8 KB
Binary file not shown.

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

+13
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ import { useEffect } from 'react';
1313
import NewUserModal from './components/modals/NewUserModal';
1414
import NewEnhetModal from './components/modals/NewEnhetModal';
1515
import { useSyncStore } from './hooks/useSyncStore';
16+
import useGlobalHandlers from './store/GlobalHandlers';
1617

1718
const App: React.FC<AppProps> = (props: AppProps) => {
19+
const { onLinkClick } = props;
20+
1821
useSyncStore(props);
1922
useSyncAppState(props);
2023
useSyncHotkeys(props);
@@ -31,6 +34,16 @@ const App: React.FC<AppProps> = (props: AppProps) => {
3134
useAppState.setState({ open: false }),
3235
);
3336

37+
const setHandler = useGlobalHandlers((state) => state.setHandler);
38+
39+
useEffect(() => {
40+
if (onLinkClick) {
41+
setHandler('onLinkClick', (linkText, url) =>
42+
onLinkClick({ text: linkText, url }),
43+
);
44+
}
45+
}, [setHandler, onLinkClick]);
46+
3447
return (
3548
<>
3649
<div className="dekorator" data-theme="internarbeidsflatedecorator-theme">

v3/packages/internarbeidsflate-decorator-v3/src/components/Links/Links.tsx

+29-12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { Link } from '@navikt/ds-react';
2-
import React, { PropsWithChildren, useMemo } from 'react';
2+
import React, { useMemo } from 'react';
33
import { useAppState } from '../../states/AppState';
44
import { LinkSection, LinkSections, generateLinks } from './generateLinks';
55
import StoreHandler from '../../store/StoreHandler';
6+
import useGlobalHandlers from '../../store/GlobalHandlers';
67

78
const Links: React.FC = () => {
89
const { fnr, enhet } = StoreHandler.store((state) => ({
@@ -42,9 +43,12 @@ const Column: React.FC<{ linkSection: LinkSection }> = ({ linkSection }) => {
4243
{linkSection.links.map((link) => {
4344
const href = `${link.url}${link.subPath}`;
4445
return (
45-
<LinkComponent key={href} href={href} newPage={linkSection.newPage}>
46-
{link.title}
47-
</LinkComponent>
46+
<LinkComponent
47+
key={href}
48+
href={href}
49+
newPage={linkSection.newPage}
50+
linkText={link.title}
51+
/>
4852
);
4953
})}
5054
</ul>
@@ -62,28 +66,41 @@ const Row: React.FC<{ linkSection: LinkSection }> = ({ linkSection }) => {
6266
{linkSection.links.map((link) => {
6367
const href = `${link.url}${link.subPath}`;
6468
return (
65-
<LinkComponent key={href} href={href} newPage={linkSection.newPage}>
66-
{link.title}
67-
</LinkComponent>
69+
<LinkComponent
70+
key={href}
71+
href={href}
72+
newPage={linkSection.newPage}
73+
linkText={link.title}
74+
/>
6875
);
6976
})}
7077
</ul>
7178
</section>
7279
);
7380
};
7481

75-
const LinkComponent: React.FC<
76-
PropsWithChildren & { href: string; newPage?: boolean | undefined }
77-
> = ({ href, children, newPage = false }) => {
82+
const LinkComponent: React.FC<{
83+
href: string;
84+
newPage?: boolean | undefined;
85+
linkText: string;
86+
}> = ({ href, linkText, newPage = false }) => {
87+
const onLinkClick = useGlobalHandlers((state) => state.onLinkClick);
88+
89+
const onClick = () => {
90+
onLinkClick?.(linkText, href);
91+
};
92+
7893
return (
7994
<li className="dr-block dr-text-white dr-py-1">
8095
<Link
8196
href={href}
8297
rel="nooppener noreferrer"
8398
target={newPage ? '_blank' : '_self'}
8499
className="!dr-block !dr-text-white !dr-py-1 !dr-no-underline focus:!dr-outline-none focus:!dr-ring focus:!dr-ring-orange-400 focus:!dr-bg-transparent hover:!dr-text-orange-400 hover:before:!dr-w-2 hover:before:!dr-h-2 hover:before:!-dr-mr-2 hover:before:!dr-bg-orange-400 hover:before:!dr-rounded-full hover:before:!dr-inline-block hover:before:!-dr-left-4 hover:before:!dr-relative hover:before:!dr-mb-[2px] hover:visited:!dr-text-orange-400"
85-
children={children}
86-
/>
100+
onClick={onClick}
101+
>
102+
{linkText}
103+
</Link>
87104
</li>
88105
);
89106
};

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class EnhetValueManager extends ContextValueManager {
1414
#errorMessageManager: ErrorMessageManager;
1515
#fnrValueManager: FnrValueManager;
1616
#propsUpdateHandler: PropsUpdateHandler;
17-
#onEnhetChanged?: (newEnhet?: string | null) => void;
17+
#onEnhetChanged?: (newEnhet?: string | null, enhetObject?: Enhet) => void;
1818
constructor(
1919
substateProps: SubstateHandlerProps,
2020
errorMessageManager: ErrorMessageManager,
@@ -148,7 +148,7 @@ export class EnhetValueManager extends ContextValueManager {
148148

149149
const enhet = this.#updateEnhet(matchendeEnhet);
150150
this.setState({ enhet });
151-
if (this.#onEnhetChanged) this.#onEnhetChanged(newEnhetId);
151+
if (this.#onEnhetChanged) this.#onEnhetChanged(newEnhetId, matchendeEnhet);
152152
};
153153

154154
readonly changeEnhetLocallyAndExternally = async (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { create } from 'zustand';
2+
3+
type GlobalHandlers = {
4+
onLinkClick?: (linkText: string, url: string) => void;
5+
};
6+
7+
type Methods = {
8+
setHandler: <T extends keyof GlobalHandlers>(
9+
type: T,
10+
handler: GlobalHandlers[T],
11+
) => void;
12+
};
13+
14+
const useGlobalHandlers = create<GlobalHandlers & Methods>((set) => ({
15+
setHandler: (key, handler) => set(() => ({ [key]: handler })),
16+
}));
17+
18+
export default useGlobalHandlers;

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AppState } from '../states/AppState';
2+
import { Enhet } from './Enhet';
23

34
interface DomainProps {
45
enhet?: string | undefined;
@@ -9,8 +10,9 @@ interface DomainProps {
910
fetchActiveEnhetOnMount?: boolean | undefined;
1011
fetchActiveUserOnMount?: boolean | undefined;
1112
onBeforeRequest?: (headers: HeadersInit) => HeadersInit | undefined;
12-
onEnhetChanged: (enhet?: string | null) => void;
13+
onEnhetChanged: (enhet?: string | null, enhetObjekt?: Enhet) => void;
1314
onFnrChanged: (fnr?: string | null) => void;
15+
onLinkClick?: (link: { text: string; url: string }) => void;
1416
}
1517

16-
export interface AppProps extends DomainProps, Omit<AppState, 'open'> { }
18+
export interface AppProps extends DomainProps, Omit<AppState, 'open'> {}

0 commit comments

Comments
 (0)