Skip to content

Commit 8a53f78

Browse files
committed
fix: added api error fallbacks
1 parent 6f03d1e commit 8a53f78

7 files changed

Lines changed: 170 additions & 113 deletions

File tree

components/layout/forms/Form.tsx

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -114,33 +114,39 @@ export const Form: NextComponent<FormProps> = ({
114114
}
115115
);
116116

117-
new FormHandler().postApplication(
118-
type,
119-
answers,
120-
member,
121-
session?.user
122-
);
117+
try {
118+
new FormHandler().postApplication(
119+
type,
120+
answers,
121+
member,
122+
session?.user
123+
);
123124

124-
window.alert(
125-
"Thanks for submitting your application! You will be contacted once we review your application via our Discord server."
126-
);
125+
window.alert(
126+
"Thanks for submitting your application! You will be contacted once we review your application via our Discord server."
127+
);
127128

128-
localStorage.setItem(
129-
"application-cooldown",
130-
"true"
131-
);
132-
setTimeout(
133-
(): void =>
134-
localStorage.setItem(
135-
"application-cooldown",
136-
"false"
137-
),
138-
1000 * 60 * 60 * 24 * 7
139-
);
129+
localStorage.setItem(
130+
"application-cooldown",
131+
"true"
132+
);
133+
setTimeout(
134+
(): void =>
135+
localStorage.setItem(
136+
"application-cooldown",
137+
"false"
138+
),
139+
1000 * 60 * 60 * 24 * 7
140+
);
140141

141-
if (e.currentTarget) e.currentTarget.reset();
142+
if (e.currentTarget) e.currentTarget.reset();
142143

143-
router.push("/");
144+
router.push("/");
145+
} catch (err) {
146+
window.alert(
147+
"Something went wrong. Please try again later, and if this issue persists, contact a staff member in the Discord server."
148+
);
149+
}
144150
}}>
145151
<h2 className="text-2xl font-black tracking-tighter dark:text-mtxWhite">
146152
Submit your {type} application

components/layout/navigation/Navigation.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,11 @@ export const Navigation: NextComponent = (): JSX.Element => {
357357
className="flex flex-row gap-x-2 items-center cursor-pointer dark:text-mtxWhite hover:text-indigo-500 dark:hover:text-indigo-500"
358358
onClick={(): void => toggleMenu(!menuVisible)}>
359359
<Image
360-
src={`https://cdn.discordapp.com/avatars/${member?.user?.id}/${member?.user?.avatar}.png?size=4096`}
360+
src={
361+
member && member.user
362+
? `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.png?size=4096`
363+
: "/avatars/placeholder.png"
364+
}
361365
alt="Profile picture"
362366
height={30}
363367
width={30}

lib/util/api.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,25 @@ import LRU from "lru-cache";
1414
* @param {string} endpoint The endpoint to fetch data from.
1515
* @returns
1616
*/
17-
export async function fetchData<T = any>(endpoint: string): Promise<T> {
18-
return (await (
19-
await fetch(endpoint, {
20-
headers: {
21-
Authorization: `Bot ${process.env.TOKEN}`
22-
}
17+
export async function fetchData<T = any>(
18+
endpoint: string
19+
): Promise<T | undefined> {
20+
let data: T | undefined = undefined;
21+
22+
await fetch(endpoint, {
23+
headers: {
24+
Authorization: `Bot ${process.env.TOKEN}`
25+
}
26+
})
27+
// @ts-ignore
28+
.then((res): Promise<T> => res.json())
29+
.then((res: T): void => {
30+
if ((res as any).message === "401: Unauthorized") data = undefined;
31+
else data = res;
2332
})
24-
).json()) as T;
33+
.catch((): void => (data = undefined));
34+
35+
return data;
2536
}
2637

2738
/**

lib/util/features.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,31 @@ import {
1313
* @param {Guild} data The guild data from the API.
1414
* @returns
1515
*/
16-
export const getFeatures = (data: Guild): Feature[] => {
16+
export const getFeatures = (data: Guild | null): Feature[] => {
1717
return [
1818
{
1919
icon: faUserFriends,
20-
title: `${data ? data["approximate_member_count"] : 2000} Members`,
20+
title: `${
21+
data && data["approximate_member_count"]
22+
? data["approximate_member_count"]
23+
: 2000
24+
} Members`,
2125
description:
2226
"A welcoming, interactive and engaging community environment with giveaways, events, self roles and much more.",
2327
color: "orange"
2428
},
2529
{
2630
icon: faSmile,
27-
title: `${data ? data["emojis"].length : 141} Emojis`,
31+
title: `${
32+
data && data["emojis"] ? data["emojis"].length : 141
33+
} Emojis`,
2834
description:
2935
"Stand out among the crowd with the wide variety of awesome, shiny emojis for you to use to express yourself!",
3036
color: "green"
3137
},
3238
{
3339
icon: faStarHalfStroke,
34-
title: `${data ? data.roles.length : 87} Roles`,
40+
title: `${data && data.roles ? data.roles.length : 87} Roles`,
3541
description:
3642
"Assign yourself some shiny new roles to let us know who you are, or simply assign yourself notification roles to be notified when important updates are announced.",
3743
color: "blue"
@@ -51,7 +57,9 @@ export const getFeatures = (data: Guild): Feature[] => {
5157
},
5258
{
5359
icon: faRocket,
54-
title: `Level ${data ? data["premium_tier"] : "2"} Boosted`,
60+
title: `Level ${
61+
data && data["premium_tier"] ? data["premium_tier"] : "2"
62+
} Boosted`,
5563
description: `Enjoy the Nitro perks of a level ${
5664
data ? data["premium_tier"] : "2"
5765
} boosted Discord server, including a wider range of emojis, better audio quality and enhanced streaming quality.`,

pages/about.tsx

Lines changed: 54 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import products from "../lib/data/products.json";
2424
import metadata from "../lib/data/meta.json";
2525

2626
interface AboutProps {
27-
events: GuildScheduledEvent[];
28-
staff: GuildMember[];
27+
events: GuildScheduledEvent[] | null;
28+
staff: GuildMember[] | null;
2929
}
3030

3131
const About: NextPage<AboutProps> = ({
@@ -254,7 +254,8 @@ const About: NextPage<AboutProps> = ({
254254
<FeatureContainer>
255255
{!staff || staff.length === 0 ? (
256256
<p className="dark:text-mtxWhite">
257-
No staff to show here.
257+
Unable to find staff members. Please try
258+
again later.
258259
</p>
259260
) : (
260261
staff.map(
@@ -290,7 +291,7 @@ const About: NextPage<AboutProps> = ({
290291
<FeatureContainer>
291292
{!events || events.length === 0 ? (
292293
<p className="dark:text-mtxWhite">
293-
No events to show here.
294+
No events are currently scheduled.
294295
</p>
295296
) : (
296297
events &&
@@ -310,59 +311,69 @@ const About: NextPage<AboutProps> = ({
310311
export async function getServerSideProps(): Promise<{
311312
props: AboutProps;
312313
}> {
313-
const events: GuildScheduledEvent[] = await fetchData<
314+
const events: GuildScheduledEvent[] | undefined = await fetchData<
314315
GuildScheduledEvent[]
315316
>(
316317
`https://discord.com/api/v${process.env.DISCORD_API_VERSION}/guilds/${process.env.SERVER_ID}/scheduled-events?with_user_count=true`
317318
);
318319
const staff: GuildMember[] = [];
319-
const guild: Guild = await fetchData<Guild>(
320+
const guild: Guild | undefined = await fetchData<Guild>(
320321
`https://discord.com/api/v${process.env.DISCORD_API_VERSION}/guilds/${process.env.STAFF_SERVER_ID}?with_counts=true`
321322
);
322-
const staffMembers: GuildMember[] = await fetchData<GuildMember[]>(
323+
const staffMembers: GuildMember[] | undefined = await fetchData<
324+
GuildMember[]
325+
>(
323326
`https://discord.com/api/v${process.env.DISCORD_API_VERSION}/guilds/${process.env.STAFF_SERVER_ID}/members?limit=1000`
324327
);
325328

326-
staffMembers
327-
.filter(
328-
(member: GuildMember): boolean =>
329-
!member.roles?.includes("933960562461782116") &&
330-
!member.roles?.includes("934972624449192006")
331-
)
332-
.forEach((member: GuildMember): void => {
333-
if (member.roles) {
334-
member.roles = member.roles
335-
?.filter(
336-
(role: string): boolean => !excludedRoles.includes(role)
337-
)
338-
.sort(
339-
(a: string, b: string): number =>
340-
(guild.roles?.find(
341-
(role: Role): boolean => role.id === b
342-
)?.position as number) -
343-
(guild?.roles?.find(
344-
(role: Role): boolean => role.id === a
345-
)?.position as number)
346-
);
347-
}
329+
console.log(staffMembers);
330+
331+
if (staffMembers && guild) {
332+
staffMembers
333+
.filter(
334+
(member: GuildMember): boolean =>
335+
!member.roles.includes("933960562461782116") &&
336+
!member.roles.includes("934972624449192006")
337+
)
338+
.forEach((member: GuildMember): void => {
339+
if (member.roles) {
340+
member.roles = member.roles
341+
.filter(
342+
(role: string): boolean =>
343+
!excludedRoles.includes(role)
344+
)
345+
.sort(
346+
(a: string, b: string): number =>
347+
(guild.roles.find(
348+
(role: Role): boolean => role.id === b
349+
)?.position as number) -
350+
(guild.roles.find(
351+
(role: Role): boolean => role.id === a
352+
)?.position as number)
353+
);
354+
}
348355

349-
staff.push(member);
350-
});
356+
staff.push(member);
357+
});
358+
}
351359

352360
return {
353361
props: {
354-
events,
355-
staff: staff.sort(
356-
(a: GuildMember, b: GuildMember): number =>
357-
(guild.roles?.find(
358-
(role: Role): boolean =>
359-
role.id === (b.roles as string[])[0]
360-
)?.position as number) -
361-
(guild.roles?.find(
362-
(role: Role): boolean =>
363-
role.id === (a.roles as string[])[0]
364-
)?.position as number)
365-
)
362+
events: events || null,
363+
staff:
364+
staff.length > 0 && guild
365+
? staff.sort(
366+
(a: GuildMember, b: GuildMember): number =>
367+
(guild.roles.find(
368+
(role: Role): boolean =>
369+
role.id === (b.roles as string[])[0]
370+
)?.position as number) -
371+
(guild.roles.find(
372+
(role: Role): boolean =>
373+
role.id === (a.roles as string[])[0]
374+
)?.position as number)
375+
)
376+
: null
366377
}
367378
};
368379
}

0 commit comments

Comments
 (0)