Error handling
Unanswered
Green Kingfisher posted this in #help-forum
Green KingfisherOP
This is a page.tsx where i am requesting from from an api. I want to show errors(eg authentication error, etc) using a toast. I need a solution that works in server component.
import { api } from '@/lib/api';
import PlayerFilters from './_components/player-filters';
import { PlayersTable } from './_components/players-table';
import { playerColumns } from './_components/player-columns';
import ClientLogger from '@/components/client-logger';
import { SearchedPlayerType } from '@/types';
import PaginationButtons from '@/components/pagination-buttons';
const getPlayers = async (searchParams: any) => {
try {
const url = `/player/search${
new URLSearchParams(searchParams).toString()
? '?' + new URLSearchParams(searchParams).toString()
: ''
}`;
const { data } = await api(url);
return data;
} catch (error: any) {
return error.response.data;
}
};
const PlayersPage = async ({ searchParams }: { searchParams: any }) => {
const searchedPlayers = await getPlayers(searchParams);
console.log(searchedPlayers);
const formattedPlayers = searchedPlayers.results?.map(
(player: SearchedPlayerType) => ({
name: player.player.player_name,
picture: player.player.picture,
nation: player.player.nation,
age: Math.floor(Number(player.player.age)).toString(),
club: player.club.squad,
season: player.season,
competitionName: player.competition_name,
position: player.player.position,
})
);
return (
<div className='py-20 space-y-8'>
<PlayerFilters />
<PlayersTable columns={playerColumns} data={formattedPlayers || []} />
<PaginationButtons
previous={searchedPlayers.previous}
next={searchedPlayers.next}
/>
<ClientLogger data={searchedPlayers} />
</div>
);
};
export default PlayersPage;4 Replies
@chisto https://ui.shadcn.com/docs/components/sonner
Green KingfisherOP
I dont think this works in server components...
I tried to do this:
page.tsx :
client-sonner.tsx:
The useEffect inside client-sonner.tsx prints hasError as true but the toast is not rendered.
page.tsx :
const PlayersPage = async ({ searchParams }: { searchParams: any }) => {
const { data, success, message } = await getPlayers(searchParams);
console.log(success, message);
const formattedPlayers = data?.results?.map((player: SearchedPlayerType) => ({
name: player.player.player_name,
picture: player.player.picture,
nation: player.player.nation,
age: Math.floor(Number(player.player.age)).toString(),
club: player.club.squad,
season: player.season,
competitionName: player.competition_name,
position: player.player.position,
}));
return (
<div className='py-20 space-y-8'>
<PlayerFilters />
<PlayersTable columns={playerColumns} data={formattedPlayers || []} />
<PaginationButtons previous={data?.previous} next={data?.next} />
<ClientLogger data={data} />
<ClientSonner hasError={!success} message={message} />
</div>
);
};
export default PlayersPage;client-sonner.tsx:
'use client';
import { useToast } from '@/hooks/use-toast';
import { useEffect } from 'react';
// import { toast } from 'sonner';
const ClientSonner = ({
hasError,
message,
errors,
}: {
hasError: boolean;
message: string;
errors?: any;
}) => {
const { toast } = useToast();
useEffect(() => {
if (hasError) {
console.log(hasError);
toast({
description: message,
variant: 'destructive',
});
}
}, [hasError, message, toast]);
console.log(errors);
return null;
};
export default ClientSonner;The useEffect inside client-sonner.tsx prints hasError as true but the toast is not rendered.
did you put the <Toaster /> in RootLayout?