Skip to content

Commit

Permalink
Update API parsing to parse each ambassador individually
Browse files Browse the repository at this point in the history
  • Loading branch information
MattIPv4 committed Mar 8, 2025
1 parent 9dd1410 commit 2cd098c
Showing 1 changed file with 26 additions and 5 deletions.
31 changes: 26 additions & 5 deletions src/hooks/useAmbassadors.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,33 @@ const apiAmbassadorSchema = ambassadorSchema.extend({
}),
});

type Ambassador = z.infer<typeof apiAmbassadorSchema>;

// Use transform here so we parse each ambassador individually
const apiSchema = z.object({
v2: z.record(apiAmbassadorSchema),
v2: z
.record(
z
.object({})
.passthrough()
.transform((val) => {
const { data } = apiAmbassadorSchema.safeParse(val);
if (!data) console.error("Failed to parse ambassador", val);
return data;
}),
)
.transform((val) =>
typeSafeObjectFromEntries(
Object.entries(val).filter(
(entry): entry is [string, Ambassador] => !!entry[1],
),
),
)
.refine((val) => Object.keys(val).length > 0, {
message: "No ambassadors found",
}),
});

type Ambassador = z.infer<typeof apiAmbassadorSchema>;

const apiBaseUrl = process.env.REACT_APP_API_BASE_URL?.replace(/\/+$/, "");
if (!apiBaseUrl)
throw new Error("REACT_APP_API_BASE_URL environment variable is not set");
Expand All @@ -61,8 +82,8 @@ const fetchAmbassadors = async (): Promise<Record<string, Ambassador>> => {
`Failed to fetch ambassadors: ${response.status} ${response.statusText} ${await response.text()}`,
);

const data = await response.json();
return apiSchema.parse(data).v2;
const rawData = await response.json();
return apiSchema.parse(rawData).v2;
};

const fallbackAmbassadors: Record<string, Ambassador> =
Expand Down

0 comments on commit 2cd098c

Please sign in to comment.