client/components/helpCentre/diagnosticInformation/UserBenefitsInformation.tsx (55 lines of code) (raw):
import { useEffect, useState } from 'react';
import { z } from 'zod';
import { fetchWithDefaultParameters } from '../../../utilities/fetch';
const userBenefitsSchema = z.object({
benefits: z.array(z.string()),
});
type UserBenefits = z.infer<typeof userBenefitsSchema>;
async function fetchUserBenefitsData(): Promise<UserBenefits | 'failed'> {
const response = await fetchWithDefaultParameters('/api/benefits/me');
if (response.ok) {
const json = await response.json();
return userBenefitsSchema.parse(json);
}
return 'failed';
}
export const UserBenefitsInformation = () => {
const [userBenefits, setUserBenefits] = useState<
UserBenefits | 'failed' | 'loading'
>('loading');
useEffect(() => {
fetchUserBenefitsData()
.then((userBenefitsData) => setUserBenefits(userBenefitsData))
.catch((e) => {
setUserBenefits('failed');
console.error(e);
});
}, []);
if (userBenefits === 'loading') {
return (
<>
<h3>Account Information</h3>
<p>Loading...</p>
</>
);
}
if (userBenefits === 'failed') {
return (
<>
<h3>User Benefits Information</h3>
<p>
User is not logged in / no user benefits information
available
</p>
</>
);
}
return (
<>
<h3>User Benefits Information:</h3>
<ul>
{userBenefits.benefits.map((benefit) => (
<li key={benefit}>{benefit}</li>
))}
</ul>
</>
);
};