DEV Community

EliHood
EliHood

Posted on • Edited on

Roast my Next npm package....

So yeah.... i've had a problem with dispatching redux thunk actions within Next.

and... it would make sense for it be done the Next kinda way.

As Followed:

async function getData() {
  const res = await fetch('https://api.example.com/...')
  // The return value is *not* serialized
  // You can return Date, Map, Set, etc.

  if (!res.ok) {
    // This will activate the closest `error.js` Error Boundary
    throw new Error('Failed to fetch data')
  }

  return res.json()
}

export default async function Page() {
  const data = await getData()

  return <main></main>
}
Enter fullscreen mode Exit fullscreen mode

I made a package that will allow you to dispatch thunk actions within the Next getData callback.

Declare some thunk actions

import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
export const fetchContent = createAsyncThunk(
  "content/fetchContent",
  async () => {
    const res = await fetch("https://jsonplaceholder.typicode.com/photos");
    const data = await res.json();
    return data;
  },
);

Enter fullscreen mode Exit fullscreen mode

import createReduxFetch, add thunkActions as a second argument, pass your callbacks in that object.

import { fetchContent } from "./thunkActions";
import { createReduxFetch } from "next-redux-fetch";

export const store = createReduxFetch(
  { reducer: {}  }, // add whatever redux logic. 
  {
    thunkActions: { fetchContent },
  },
);

// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof store.getState>;
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof store.dispatch;
Enter fullscreen mode Exit fullscreen mode

Call as the following:

note: bootstrap.tsx is just a client wrapper.

"use client";

import dynamic from "next/dynamic";
import React from "react";

const Demo = dynamic(() => import("../../components/demo"), {
  ssr: false,
});

export default function Bootstrap({ data }: { data: Record<string, any> }) {
  return <Demo data={data} />;
}
Enter fullscreen mode Exit fullscreen mode

Then the following:

import { store } from "../../../redux/store/store";
import Bootstrap from "./bootstrap";

async function getData() {
  const res = await store.dispatch(store.thunkActions.fetchContent());
  return res;
}

export default async function Page() {
  const data = await getData();
  return <Bootstrap data={data} />;
}
Enter fullscreen mode Exit fullscreen mode

Voila ...

Image description

I'm curious to get some feedback. What would be useful to add , or improve. Roast it :)

I know i could handle error handling a bit better.

Package

https://www.npmjs.com/package/next-redux-fetch

Github

https://github.com/EliHood/next-redux-fetch

Top comments (0)