Skip to content

Commit 54b05ee

Browse files
authored
Merge pull request #5292 from navikt/chore/arr-flate-api-client
Flytt egen api-client inn i arrangor-flate
2 parents 231bdf5 + 84c4d77 commit 54b05ee

29 files changed

+254
-117
lines changed

frontend/arrangor-flate/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules
2+
/api-client
23
/.cache
34
/build
45
.env

frontend/arrangor-flate/app/components/Header.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Link } from "react-router";
22
import css from "../root.module.css";
33
import { Arrangorvelger } from "./arrangorvelger/Arrangorvelger";
4-
import { Arrangor } from "@mr/api-client-v2";
4+
import { Arrangor } from "api-client";
55

66
interface Props {
77
arrangorer: Arrangor[];

frontend/arrangor-flate/app/components/arrangorvelger/Arrangorvelger.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Select } from "@navikt/ds-react";
22
import { useNavigate, useParams } from "react-router";
3-
import { Arrangor } from "@mr/api-client-v2";
3+
import { Arrangor } from "api-client";
44

55
interface Props {
66
arrangorer: Arrangor[];

frontend/arrangor-flate/app/components/tilsagn/TilsagnDetaljer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ArrangorflateTilsagn } from "@mr/api-client-v2";
1+
import { ArrangorflateTilsagn } from "api-client";
22
import { formaterNOK } from "@mr/frontend-common/utils/utils";
33
import { formaterPeriode } from "~/utils";
44
import { Definisjonsliste, Definition } from "../Definisjonsliste";

frontend/arrangor-flate/app/components/tilsagn/TilsagnStatusTag.tsx

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
TilsagnStatus,
3-
TilsagnStatusOgAarsaker,
4-
TilsagnTilAnnulleringAarsak,
5-
} from "@mr/api-client-v2";
1+
import { TilsagnStatus, TilsagnStatusOgAarsaker, TilsagnTilAnnulleringAarsak } from "api-client";
62
import { HelpText, List, Tag } from "@navikt/ds-react";
73

84
interface Props {

frontend/arrangor-flate/app/components/tilsagn/TilsagnTable.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ArrangorflateTilsagn, TilsagnType } from "@mr/api-client-v2";
1+
import { ArrangorflateTilsagn, TilsagnType } from "api-client";
22
import { Alert, Table } from "@navikt/ds-react";
33
import { formaterPeriode, useOrgnrFromUrl } from "~/utils";
44
import { internalNavigation } from "../../internal-navigation";

frontend/arrangor-flate/app/components/utbetaling/BeregningDetaljer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ArrFlateBeregning } from "@mr/api-client-v2";
1+
import { ArrFlateBeregning } from "api-client";
22
import { formaterNOK } from "@mr/frontend-common/utils/utils";
33
import { Definisjonsliste, Definition } from "../Definisjonsliste";
44

frontend/arrangor-flate/app/components/utbetaling/GenerelleDetaljer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ArrFlateUtbetaling } from "@mr/api-client-v2";
1+
import { ArrFlateUtbetaling } from "api-client";
22
import { Definisjonsliste } from "../Definisjonsliste";
33

44
interface Props {

frontend/arrangor-flate/app/components/utbetaling/UtbetalingDetaljer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Alert, Box, Heading } from "@navikt/ds-react";
22
import { Separator } from "~/components/Separator";
3-
import { ArrangorflateTilsagn, ArrFlateUtbetaling } from "@mr/api-client-v2";
3+
import { ArrangorflateTilsagn, ArrFlateUtbetaling } from "api-client";
44
import { TilsagnDetaljer } from "~/components/tilsagn/TilsagnDetaljer";
55
import { GenerelleDetaljer } from "~/components/utbetaling/GenerelleDetaljer";
66
import { formaterDato, formaterPeriode } from "~/utils";

frontend/arrangor-flate/app/components/utbetaling/UtbetalingTable.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import React, { ReactNode } from "react";
44
import { formaterDato, formaterPeriode, useOrgnrFromUrl } from "~/utils";
55
import { internalNavigation } from "~/internal-navigation";
66
import { LinkWithTabState } from "../LinkWithTabState";
7-
import { ArrFlateUtbetalingKompakt, ArrFlateUtbetalingStatus } from "@mr/api-client-v2";
7+
import { ArrFlateUtbetalingKompakt, ArrFlateUtbetalingStatus } from "api-client";
88

99
interface Props {
1010
utbetalinger: ArrFlateUtbetalingKompakt[];

frontend/arrangor-flate/app/entry.server.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { createReadableStreamFromReadable } from "@react-router/node";
1515
import { isbot } from "isbot";
1616
import { renderToPipeableStream } from "react-dom/server";
1717
import { initializeMockServer } from "./mocks/node";
18-
import { client } from "@mr/api-client-v2";
18+
import { client } from "api-client";
1919
import logger from "../server/logger.js";
2020

2121
export const streamTimeout = 5000;

frontend/arrangor-flate/app/form/form-helpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FieldError } from "@mr/api-client-v2";
1+
import { FieldError } from "api-client";
22

33
export function getOrThrowError(formData: FormData, property: string) {
44
const data = formData.get(property);

frontend/arrangor-flate/app/mocks/arrangorflateMocks.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
TilsagnType,
88
ArrFlateUtbetalingStatus,
99
ArrFlateUtbetalingKompakt,
10-
} from "@mr/api-client-v2";
10+
} from "api-client";
1111
import { http, HttpResponse, PathParams } from "msw";
1212
import { v4 as uuid } from "uuid";
1313

frontend/arrangor-flate/app/root.tsx

+22-18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Arrangor, ArrangorflateService } from "@mr/api-client-v2";
1+
import { Arrangor, ArrangorflateService } from "api-client";
22
import { BodyShort, Box, Heading } from "@navikt/ds-react";
3-
import { LoaderFunction, redirect } from "react-router";
3+
import { LoaderFunction, useNavigate } from "react-router";
44
import {
55
isRouteErrorResponse,
66
Links,
@@ -13,22 +13,27 @@ import {
1313
useRouteError,
1414
} from "react-router";
1515
import parse from "html-react-parser";
16-
import { ReactNode } from "react";
16+
import { ReactNode, useEffect } from "react";
1717
import { Header } from "./components/Header";
1818
import css from "./root.module.css";
1919
import { Dekoratørfragmenter, hentSsrDekoratør } from "./services/dekoratør/dekorator.server";
2020
import useInjectDecoratorScript from "./services/dekoratør/useInjectScript";
2121
import "./tailwind.css";
2222
import { apiHeaders } from "./auth/auth.server";
23+
import { problemDetailResponse } from "./utils";
2324

2425
export const meta: MetaFunction = () => [{ title: "Utbetalinger" }];
2526

2627
export const loader: LoaderFunction = async ({ request }) => {
27-
const { data: arrangortilganger } =
28+
const { data: arrangortilganger, error } =
2829
await ArrangorflateService.getArrangorerInnloggetBrukerHarTilgangTil({
2930
headers: await apiHeaders(request),
3031
});
3132

33+
if (!arrangortilganger || error) {
34+
throw problemDetailResponse(error);
35+
}
36+
3237
return {
3338
dekorator: await hentSsrDekoratør(),
3439
arrangortilganger,
@@ -82,24 +87,29 @@ function Dokument({
8287
}
8388

8489
export const ErrorBoundary = () => {
90+
const navigate = useNavigate();
8591
const error = useRouteError();
8692

87-
if (isRouteErrorResponse(error)) {
88-
if (error.status === 401) {
89-
return redirectTilInnlogging();
90-
}
91-
if (error.status === 403) {
92-
return redirect(`ingen-tilgang`);
93+
useEffect(() => {
94+
if (isRouteErrorResponse(error)) {
95+
if (error.status === 401) {
96+
navigate(`/oauth2/login?redirect=${window.location.pathname}`);
97+
}
98+
if (error.status === 403) {
99+
navigate("/ingen-tilgang"); // Use navigate inside useEffect
100+
}
93101
}
102+
}, [error, navigate]);
94103

104+
if (isRouteErrorResponse(error)) {
95105
return (
96106
<Dokument arrangorer={[]}>
97107
<Heading spacing size="large" level="2">
98108
{error.status}
99109
</Heading>
100110
<Box background="bg-default" padding={"10"}>
101-
<BodyShort>Det skjedde en uventet feil</BodyShort>
102-
<BodyShort>{error.data.message}</BodyShort>
111+
<BodyShort>{error.data.title}</BodyShort>
112+
<BodyShort>{error.data.detail}</BodyShort>
103113
</Box>
104114
</Dokument>
105115
);
@@ -118,10 +128,4 @@ export const ErrorBoundary = () => {
118128
}
119129
};
120130

121-
const redirectTilInnlogging = () => {
122-
if (typeof window !== "undefined") {
123-
window.location.href = `/oauth2/login?redirect=${window.location.pathname}`;
124-
}
125-
};
126-
127131
export default App;

frontend/arrangor-flate/app/routes/$orgnr.tilsagn.$id.tsx

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { ArrangorflateService, ArrangorflateTilsagn } from "@mr/api-client-v2";
1+
import { ArrangorflateService, ArrangorflateTilsagn } from "api-client";
22
import { LoaderFunction } from "react-router";
33
import { useLoaderData } from "react-router";
44
import { Definisjonsliste } from "~/components/Definisjonsliste";
55
import { TilsagnDetaljer } from "~/components/tilsagn/TilsagnDetaljer";
66
import { PageHeader } from "../components/PageHeader";
77
import { internalNavigation } from "../internal-navigation";
8-
import { useOrgnrFromUrl } from "../utils";
8+
import { problemDetailResponse, useOrgnrFromUrl } from "../utils";
99
import { apiHeaders } from "~/auth/auth.server";
1010
import { TilsagnStatusTag } from "~/components/tilsagn/TilsagnStatusTag";
1111
import { tekster } from "../tekster";
@@ -18,11 +18,15 @@ export const loader: LoaderFunction = async ({ request, params }): Promise<Loade
1818
const { id } = params;
1919
if (!id) throw Error("Mangler id");
2020

21-
const { data: tilsagn } = await ArrangorflateService.getArrangorflateTilsagn({
21+
const { data: tilsagn, error } = await ArrangorflateService.getArrangorflateTilsagn({
2222
path: { id },
2323
headers: await apiHeaders(request),
2424
});
2525

26+
if (error || !tilsagn) {
27+
throw problemDetailResponse(error);
28+
}
29+
2630
return { tilsagn };
2731
};
2832

frontend/arrangor-flate/app/routes/$orgnr.utbetaling.$id.bekreft.tsx

+38-28
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
ArrangorflateTilsagn,
44
ArrFlateUtbetaling,
55
FieldError,
6-
} from "@mr/api-client-v2";
6+
} from "api-client";
77
import { Button, Checkbox, ErrorSummary, Heading, TextField, VStack } from "@navikt/ds-react";
88
import {
99
ActionFunction,
@@ -18,7 +18,7 @@ import { PageHeader } from "~/components/PageHeader";
1818
import { UtbetalingDetaljer } from "~/components/utbetaling/UtbetalingDetaljer";
1919
import { getOrError, getOrThrowError } from "~/form/form-helpers";
2020
import { internalNavigation } from "~/internal-navigation";
21-
import { useOrgnrFromUrl } from "~/utils";
21+
import { problemDetailResponse, useOrgnrFromUrl } from "~/utils";
2222
import { getCurrentTab } from "~/utils/currentTab";
2323
import { Separator } from "../components/Separator";
2424
import { apiHeaders } from "~/auth/auth.server";
@@ -38,18 +38,28 @@ export const loader: LoaderFunction = async ({
3838
params,
3939
}): Promise<BekreftUtbetalingData> => {
4040
const { id } = params;
41-
if (!id) throw Error("Mangler id");
42-
43-
const [{ data: utbetaling }, { data: tilsagn }] = await Promise.all([
44-
ArrangorflateService.getArrFlateUtbetaling({
45-
path: { id },
46-
headers: await apiHeaders(request),
47-
}),
48-
ArrangorflateService.getArrangorflateTilsagnTilUtbetaling({
49-
path: { id },
50-
headers: await apiHeaders(request),
51-
}),
52-
]);
41+
if (!id) {
42+
throw new Response("Mangler id", { status: 400 });
43+
}
44+
45+
const [{ data: utbetaling, error: utbetalingError }, { data: tilsagn, error: tilsagnError }] =
46+
await Promise.all([
47+
ArrangorflateService.getArrFlateUtbetaling({
48+
path: { id },
49+
headers: await apiHeaders(request),
50+
}),
51+
ArrangorflateService.getArrangorflateTilsagnTilUtbetaling({
52+
path: { id },
53+
headers: await apiHeaders(request),
54+
}),
55+
]);
56+
57+
if (utbetalingError || !utbetaling) {
58+
throw problemDetailResponse(utbetalingError);
59+
}
60+
if (tilsagnError || !tilsagn) {
61+
throw problemDetailResponse(tilsagnError);
62+
}
5363

5464
return { utbetaling, tilsagn };
5565
};
@@ -85,23 +95,23 @@ export const action: ActionFunction = async ({ request }) => {
8595
return validationErrors;
8696
}
8797

88-
try {
89-
await ArrangorflateService.godkjennUtbetaling({
90-
path: { id: utbetalingId },
91-
body: {
92-
digest: utbetalingDigest,
93-
betalingsinformasjon: {
94-
kontonummer: kontonummer.toString(),
95-
kid: kid,
96-
},
98+
const { error } = await ArrangorflateService.godkjennUtbetaling({
99+
path: { id: utbetalingId },
100+
body: {
101+
digest: utbetalingDigest,
102+
betalingsinformasjon: {
103+
kontonummer: kontonummer.toString(),
104+
kid: kid || null,
97105
},
98-
headers: await apiHeaders(request),
99-
});
100-
} catch (error) {
106+
},
107+
headers: await apiHeaders(request),
108+
});
109+
if (error) {
101110
if (isValidationError(error)) {
102111
return { errors: error.errors };
112+
} else {
113+
throw problemDetailResponse(error);
103114
}
104-
throw error;
105115
}
106116
return redirect(
107117
`${internalNavigation(orgnr).kvittering(utbetalingId)}?forside-tab=${currentTab}`,
@@ -168,7 +178,7 @@ export default function BekreftUtbetaling() {
168178
name="kid"
169179
error={data?.errors?.find((error) => error.pointer === "/kid")?.detail}
170180
className="border border-[#0214317D] rounded-md"
171-
defaultValue={utbetaling.betalingsinformasjon?.kid}
181+
defaultValue={utbetaling.betalingsinformasjon?.kid ?? ""}
172182
maxLength={25}
173183
/>
174184
</div>

frontend/arrangor-flate/app/routes/$orgnr.utbetaling.$id.beregning.tsx

+26-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
RelevanteForslag,
66
UtbetalingDeltakelse,
77
UtbetalingDeltakelsePerson,
8-
} from "@mr/api-client-v2";
8+
} from "api-client";
99
import { ExclamationmarkTriangleIcon } from "@navikt/aksel-icons";
1010
import {
1111
Alert,
@@ -28,7 +28,7 @@ import { PageHeader } from "~/components/PageHeader";
2828
import { GenerelleDetaljer } from "~/components/utbetaling/GenerelleDetaljer";
2929
import { internalNavigation } from "~/internal-navigation";
3030
import { hentMiljø, Miljø } from "~/services/miljø";
31-
import { formaterDato, useOrgnrFromUrl } from "~/utils";
31+
import { formaterDato, problemDetailResponse, useOrgnrFromUrl } from "~/utils";
3232
import { sortBy, SortBySelector, SortOrder } from "~/utils/sort-by";
3333
import { BeregningDetaljer } from "../components/utbetaling/BeregningDetaljer";
3434

@@ -41,20 +41,35 @@ type LoaderData = {
4141
relevanteForslag: RelevanteForslag[];
4242
deltakerlisteUrl: string;
4343
};
44+
4445
export const loader: LoaderFunction = async ({ request, params }): Promise<LoaderData> => {
4546
const deltakerlisteUrl = deltakerOversiktLenke(hentMiljø());
4647

4748
const { id } = params;
48-
if (!id) throw Error("Mangler id");
49+
if (!id) {
50+
throw new Response("Mangler id", { status: 400 });
51+
}
52+
53+
const [
54+
{ data: utbetaling, error: utbetalingError },
55+
{ data: relevanteForslag, error: relevanteForslagError },
56+
] = await Promise.all([
57+
ArrangorflateService.getArrFlateUtbetaling({
58+
path: { id },
59+
headers: await apiHeaders(request),
60+
}),
61+
ArrangorflateService.getRelevanteForslag({
62+
path: { id },
63+
headers: await apiHeaders(request),
64+
}),
65+
]);
4966

50-
const { data: utbetaling } = await ArrangorflateService.getArrFlateUtbetaling({
51-
path: { id },
52-
headers: await apiHeaders(request),
53-
});
54-
const { data: relevanteForslag } = await ArrangorflateService.getRelevanteForslag({
55-
path: { id },
56-
headers: await apiHeaders(request),
57-
});
67+
if (utbetalingError || !utbetaling) {
68+
throw problemDetailResponse(utbetalingError);
69+
}
70+
if (relevanteForslagError || !relevanteForslag) {
71+
throw problemDetailResponse(relevanteForslagError);
72+
}
5873

5974
return { utbetaling, deltakerlisteUrl, relevanteForslag };
6075
};

frontend/arrangor-flate/app/routes/$orgnr.utbetaling.$id.kvittering.lastned.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { LoaderFunction } from "react-router";
2-
import { ArrangorflateService } from "@mr/api-client-v2";
2+
import { ArrangorflateService } from "api-client";
33
import { apiHeaders } from "~/auth/auth.server";
44

55
export const loader: LoaderFunction = async ({ request, params }): Promise<Response> => {

0 commit comments

Comments
 (0)