Skip to content

Commit 84bee03

Browse files
authored
Feat/api errors (#25)
Improved API error handling About the `(wrapper)` folder: https://chatgpt.com/share/680440c1-c4f0-8008-88b3-b0c79cade7a2
1 parent 415901d commit 84bee03

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+349
-146
lines changed

.env.dist

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ NEXT_PUBLIC_API_REQUEST_TIMEOUT=10000
1515
NEXT_PUBLIC_CAS_SERVICE=https://etu.utt.fr/dummyurl
1616

1717
# The application id of the website of EtuUTT
18-
NEXT_PUBLIC_ETUUTT_WEB_APPLICATION_ID=
18+
NEXT_PUBLIC_ETUUTT_WEB_APPLICATION_ID=
19+
20+
# The number of seconds that the authorization token will be available
21+
NEXT_PUBLIC_AUTHORIZATION_TOKEN_EXPIRES_IN=3600*24*30

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"react": "^18.3.1",
2525
"react-i18next": "^14.1.2",
2626
"react-redux": "^9.1.0",
27+
"react-toastify": "^10.0.6",
2728
"redux": "^5.0.1",
2829
"redux-logger": "^3.0.6",
2930
"redux-thunk": "^3.1.0",

pnpm-lock.yaml

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/annals/fetchAnnals.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import { useEffect, useState } from 'react';
22
import { API, useAPI } from '@/api/api';
33
import { Annal } from '@/api/annals/annal.interface';
4+
import { useLoggedIn } from '@/module/session';
45

56
export default function useAnnals(
67
code: string,
7-
): [Annal[] | null, (index: number, exam: Annal) => void, (exam: Annal) => void] {
8-
const [annals, setAnnals] = useState<Annal[] | null>(null);
8+
): [Annal[] | null | undefined, (index: number, exam: Annal) => void, (exam: Annal) => void] {
9+
const [annals, setAnnals] = useState<Annal[] | null | undefined>(undefined);
910
const api = useAPI();
11+
const logged = useLoggedIn();
1012

1113
useEffect(() => {
12-
api.get<Annal[]>(`/ue/annals?ueCode=${code}`, { timeoutMillis: 15 * 1000 }).on('success', setAnnals);
14+
if (logged && !annals) {
15+
api.get<Annal[]>(`/ue/annals?ueCode=${code}`, { timeoutMillis: 15 * 1000 }).on('success', setAnnals);
16+
} else if (!logged) {
17+
setAnnals(null);
18+
}
1319
}, []);
1420

1521
return [
@@ -20,9 +26,5 @@ export default function useAnnals(
2026
}
2127

2228
export function openAnnalInNewTab(api: API, id: string) {
23-
api
24-
.get(`/ue/annals/${id}`, {
25-
isFile: true,
26-
})
27-
.on('success', (blob) => window.open(URL.createObjectURL(blob), '_blank'));
29+
api.getFile(`/ue/annals/${id}`).on('success', (blob) => window.open(URL.createObjectURL(blob), '_blank'));
2830
}

src/api/annals/fetchMetadata.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
import { useEffect, useState } from 'react';
22
import { useAPI } from '@/api/api';
33
import { AnnalMetadata, AnnalType } from '@/api/annals/annal.interface';
4+
import { useLoggedIn } from '@/module/session';
45

5-
export default function useAnnalMetadata(code: string): [types: AnnalType[] | null, semesters: string[] | null] {
6-
const [availableTypes, setAvailableTypes] = useState<AnnalType[] | null>(null);
7-
const [availableSemesters, setAvailableSemesters] = useState<string[] | null>(null);
6+
export default function useAnnalMetadata(
7+
code: string,
8+
): [types: AnnalType[] | null | undefined, semesters: string[] | null | undefined] {
9+
const [availableTypes, setAvailableTypes] = useState<AnnalType[] | null | undefined>(undefined);
10+
const [availableSemesters, setAvailableSemesters] = useState<string[] | null | undefined>(undefined);
811
const api = useAPI();
12+
const logged = useLoggedIn();
13+
914
useEffect(() => {
10-
api.get<AnnalMetadata>(`/ue/annals/metadata?ueCode=${code}`).on('success', (metadata) => {
11-
setAvailableTypes(metadata.types);
12-
setAvailableSemesters(metadata.semesters);
13-
});
15+
if (logged && (!availableTypes || !availableSemesters)) {
16+
api.get<AnnalMetadata>(`/ue/annals/metadata?ueCode=${code}`).on('success', (metadata) => {
17+
setAvailableTypes(metadata.types);
18+
setAvailableSemesters(metadata.semesters);
19+
});
20+
} else if (!logged) {
21+
setAvailableTypes(null);
22+
setAvailableSemesters(null);
23+
}
1424
}, []);
1525
return [availableTypes, availableSemesters];
1626
}

src/api/api.interface.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ export interface Pagination<T> {
33
itemsPerPage: number;
44
itemCount: number;
55
}
6+
7+
export interface ApiError {
8+
errorCode: number;
9+
error: string;
10+
}

0 commit comments

Comments
 (0)