Skip to content

Commit 7a283bd

Browse files
committed
use serverside session handler and add retry logic for usecase loading
1 parent 22e7939 commit 7a283bd

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

app/[locale]/(user)/usecases/[useCaseSlug]/UsecaseDetailsClient.tsx

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { TypeDataset, TypeUseCase } from '@/gql/generated/graphql';
88
import { useQuery } from '@tanstack/react-query';
99
import { Card, Text } from 'opub-ui';
1010

11-
import { GraphQL } from '@/lib/api';
11+
import { GraphQLClient } from '@/lib/api';
1212
import { formatDate, generateJsonLd } from '@/lib/utils';
1313
import BreadCrumbs from '@/components/BreadCrumbs';
1414
import { Icons } from '@/components/icons';
@@ -144,11 +144,11 @@ const UseCaseDetailClient = () => {
144144
const {
145145
data: UseCaseDetails,
146146
isLoading,
147-
refetch,
147+
error,
148148
} = useQuery<{ useCase: TypeUseCase }>(
149149
[`fetch_UsecaseDetails_${params.useCaseSlug}`],
150150
() =>
151-
GraphQL(
151+
GraphQLClient(
152152
UseCasedetails,
153153
{},
154154
{
@@ -158,6 +158,13 @@ const UseCaseDetailClient = () => {
158158
{
159159
refetchOnMount: true,
160160
refetchOnReconnect: true,
161+
retry: (failureCount, error: any) => {
162+
// Don't retry on 401/403 errors
163+
if (error?.message?.includes('401') || error?.message?.includes('403')) {
164+
return false;
165+
}
166+
return failureCount < 3;
167+
},
161168
}
162169
);
163170
const datasets = UseCaseDetails?.useCase?.datasets || []; // Fallback to an empty array
@@ -195,6 +202,28 @@ const UseCaseDetailClient = () => {
195202
<div className=" flex justify-center p-10">
196203
<Loading />
197204
</div>
205+
) : error ? (
206+
<div className="container py-10">
207+
<div className="flex flex-col items-center justify-center gap-4">
208+
<Text variant="headingXl" color="critical">
209+
Error Loading Use Case
210+
</Text>
211+
<Text variant="bodyLg">
212+
{(error as any)?.message?.includes('401') || (error as any)?.message?.includes('403')
213+
? 'You do not have permission to view this use case. Please log in or contact the administrator.'
214+
: 'Failed to load use case details. Please try again later.'}
215+
</Text>
216+
</div>
217+
</div>
218+
) : !UseCaseDetails?.useCase ? (
219+
<div className="container py-10">
220+
<div className="flex flex-col items-center justify-center gap-4">
221+
<Text variant="headingXl">Use Case Not Found</Text>
222+
<Text variant="bodyLg">
223+
The requested use case could not be found.
224+
</Text>
225+
</div>
226+
</div>
198227
) : (
199228
<>
200229
<BreadCrumbs

lib/api.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { type TypedDocumentNode } from '@graphql-typed-document-node/core';
33
import { QueryClient } from '@tanstack/react-query';
44
import { request } from 'graphql-request';
55
import { getSession } from 'next-auth/react';
6+
import { getServerSession } from 'next-auth';
67

78
// create a wrapper function for graphql-request
89
// that will be used by react-query
@@ -11,6 +12,37 @@ export async function GraphQL<TResult, TVariables>(
1112
document: TypedDocumentNode<TResult, TVariables>,
1213
entityHeaders: Record<string, string> = {},
1314
...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]
15+
) {
16+
// Try to get session - this works for server-side calls
17+
let session;
18+
try {
19+
session = await getServerSession();
20+
} catch {
21+
// Fallback for client-side calls
22+
session = await getSession();
23+
}
24+
25+
const headers = {
26+
...(session ? { Authorization: `Bearer ${session?.access_token}` } : {}),
27+
...entityHeaders,
28+
};
29+
30+
const data = await request(
31+
`${process.env.NEXT_PUBLIC_BACKEND_GRAPHQL_URL}`,
32+
document,
33+
{
34+
...variables,
35+
},
36+
headers
37+
);
38+
return data;
39+
}
40+
41+
// Client-side specific GraphQL function for use with react-query
42+
export async function GraphQLClient<TResult, TVariables>(
43+
document: TypedDocumentNode<TResult, TVariables>,
44+
entityHeaders: Record<string, string> = {},
45+
...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]
1446
) {
1547
const session = await getSession();
1648

0 commit comments

Comments
 (0)