tRPCttRPC
Powered by
PeformP
tRPC•12mo ago•
1 reply
Peform

server side prefetch + optional client side refetch

Hello,

I'm looking for advice on a pattern for server-side prefetching with optional client-side refreshing in Next.js.

Current setup:
- Next.js app with tRPC
- A
getUserGuilds
getUserGuilds
procedure that accepts an optional
refetch
refetch
parameter
- When
refetch: true
refetch: true
, it fetches fresh data from Discord, otherwise uses cached data
- Server-side prefetch for initial load, need client sided optional refresh

Current solution:
I'm using two separate queries:
1. First query with no parameters matches server prefetch for initial load:
server prefetch:
  await api.discord.getUserGuilds.prefetch();
  await api.discord.getUserGuilds.prefetch();

   const { data: guilds } = api.discord.getUserGuilds.useQuery(undefined, { enabled: true });
   const { data: guilds } = api.discord.getUserGuilds.useQuery(undefined, { enabled: true });

2. Second query with
refetch: true
refetch: true
for manual refreshing:
   const { data: refetchedGuilds, refetch } = api.discord.getUserGuilds.useQuery(
     { refetch: true },
     { enabled: false }
   );
   const { data: refetchedGuilds, refetch } = api.discord.getUserGuilds.useQuery(
     { refetch: true },
     { enabled: false }
   );

3. Using separate useEffects to update UI state when either dataset changes
export const ServerList = () => {
    const { data: guilds } = api.discord.getUserGuilds.useQuery(undefined, {
        enabled: true,
    });
    const {
        data: refetchedGuilds,
        refetch:,
        isFetching,
    } = api.discord.getUserGuilds.useQuery({ refetch: true }, { enabled: false });
    const [filteredGuilds, setFilteredGuilds] = useState(guilds);
    const [search, setSearch] = useState('');

    useEffect(() => {
        setFilteredGuilds(
            guilds?.filter(
                ({ name, permissions }) => permissions & 0x20 && name.toLowerCase().includes(search.toLowerCase().trim()),
            ),
        );
    }, [search, guilds]);

    useEffect(() => {
        if (refetchedGuilds) {
            setFilteredGuilds(refetchedGuilds.filter(({ name, permissions }) => permissions & 0x20 && name.toLowerCase().includes(search.toLowerCase().trim())));
        }
    }, [refetchedGuilds]);
export const ServerList = () => {
    const { data: guilds } = api.discord.getUserGuilds.useQuery(undefined, {
        enabled: true,
    });
    const {
        data: refetchedGuilds,
        refetch:,
        isFetching,
    } = api.discord.getUserGuilds.useQuery({ refetch: true }, { enabled: false });
    const [filteredGuilds, setFilteredGuilds] = useState(guilds);
    const [search, setSearch] = useState('');

    useEffect(() => {
        setFilteredGuilds(
            guilds?.filter(
                ({ name, permissions }) => permissions & 0x20 && name.toLowerCase().includes(search.toLowerCase().trim()),
            ),
        );
    }, [search, guilds]);

    useEffect(() => {
        if (refetchedGuilds) {
            setFilteredGuilds(refetchedGuilds.filter(({ name, permissions }) => permissions & 0x20 && name.toLowerCase().includes(search.toLowerCase().trim())));
        }
    }, [refetchedGuilds]);
tRPCJoin
Move Fast & Break Nothing. End-to-end typesafe APIs made easy.
5,015Members
Resources

Similar Threads

Was this page helpful?
Recent Announcements

Similar Threads

Recommended way to prefetch client-side
pbeshPpbesh / ❓-help
4y ago
Using TRPC Server Caller in client side.
MonkeyStructMMonkeyStruct / ❓-help
2y ago