Skip to content

Instantly share code, notes, and snippets.

@KartikBazzad
Created November 20, 2022 17:33
Show Gist options
  • Save KartikBazzad/64e9eee60e79bef861a3b0cc4ab13706 to your computer and use it in GitHub Desktop.
Save KartikBazzad/64e9eee60e79bef861a3b0cc4ab13706 to your computer and use it in GitHub Desktop.
// store.ts
import {
configureStore,
AnyAction,
TypedStartListening,
TypedAddListener,
addListener,
} from "@reduxjs/toolkit";
import {
FLUSH,
PAUSE,
PERSIST,
persistStore,
PURGE,
REGISTER,
REHYDRATE,
persistReducer,
} from "redux-persist";
import { encryptTransform } from "redux-persist-transform-encrypt";
import storage from "./storage";
import combinedReducers from "./reducers";
import listenerMiddleware from "./middlewares";
export const rootReducer = (state: any, action: any) => {
if (action.type === "RESET_STATE_ACTION_TYPE") {
state = {} as RootState;
}
return combinedReducers(state, action);
};
const persistConfig = {
key: "root",
storage,
serialize: true,
version: 0,
transform: [
encryptTransform({
secretKey: "thisisreduxstatesecretKey",
onError: (err) => console.log(err),
}),
],
};
const persistedReducer = persistReducer<
ReturnType<typeof rootReducer>,
AnyAction
>(persistConfig, rootReducer);
const store = configureStore({
reducer: persistedReducer,
middleware: (gDM) =>
gDM({
serializableCheck: {
ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
},
}).concat(listenerMiddleware.middleware),
});
export const persistor = persistStore(store);
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export type AppStartListening = TypedStartListening<RootState, AppDispatch>;
export type AppAddListener = TypedAddListener<RootState, AppDispatch>;
export const addAppListener = addListener as TypedAddListener<
RootState,
AppDispatch
>;
export default store;
// Counter Slice
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
const initialState = { value: 0 };
const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
inc: (state) => ({ value: state.value + 1 }),
dec: (state) => ({ value: state.value - 1 }),
},
});
export const counterActions = counterSlice.actions;
export default counterSlice.reducer;
// hooks.ts
import { useDispatch, useSelector } from "react-redux";
import type { TypedUseSelectorHook } from "react-redux";
import type { RootState, AppDispatch } from "../store";
// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch: () => AppDispatch = useDispatch;
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
// loginPage.tsx
function LoginPage() {
const router = useRouter();
const activeContext = useAppSelector(getActiveContext);
const dispatch = useAppDispatch();
async function loginUser() {
try {
dispatch(authActions.signIn);
console.log("Hello");
} catch (error) {
console.log(error);
}
}
useEffect(() => {
if (activeContext.isLoggedIn && activeContext.currentUser) {
const redirectURL = router.query.redirectTo;
if (redirectURL && typeof redirectURL === "string") {
router.replace(redirectURL);
} else {
router.push("/");
}
}
}, [activeContext.currentUser, activeContext.isLoggedIn]);
return (
<div className="max-w-6xl flex flex-col gap-7 items-center justify-center rounded-3xl px-8 mx-4 h-[400px] bg-white w-full outline">
<Text className=" text-[#6fedd6] text-3xl" fw={800}>
Login and start creating Posts
</Text>
<button onClick={() => dispatch(counterActions.inc)}>Add</button>
<button onClick={() => dispatch(counterActions.dec)}>Sub</button>
<Button
onClick={loginUser}
leftIcon={
<Image
width={24}
height={24}
alt="Google"
src={"/assets/googleLogo.svg"}
/>
}
variant="outline"
size="lg"
>
Login with Google
</Button>
</div>
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment