Skip to content

Instantly share code, notes, and snippets.

@mharj
mharj / reduxHooks.ts
Created August 9, 2024 12:37
redux hooks?
import {useCallback, useState} from 'react';
import {Action, ActionCreator} from '@reduxjs/toolkit';
import {ThunkResult, useThunkDispatch} from '../redux/reducers';
export function useThunkAction<AC extends ActionCreator<ThunkResult<unknown>>, RT extends Awaited<ReturnType<ReturnType<AC>>>>(
actionCreator: AC,
): [(...args: Parameters<AC>) => Promise<RT>, boolean] {
const [isActionRunning, setRunning] = useState(false);
const dispatch = useThunkDispatch();
const action = useCallback(
@mharj
mharj / enum.ts
Created September 12, 2023 14:25
two way numeric enum setup
enum Demo {
Eka = 100,
Toka,
}
type DemoKey = keyof typeof Demo;
// for validations
const demoKeys = Object.values(Demo).filter((v) => isNaN(Number(v))) as [DemoKey];
const demoValues = Object.values(Demo).filter((v) => !isNaN(Number(v))) as [Demo];
@mharj
mharj / redux.ts
Created August 29, 2023 04:10
useThunkDispatch()
// export const useThunkDispatch = () => useDispatch<RootThunkDispatch>();
export function isPromise(action: unknown): action is Promise<unknown> {
return typeof action === 'object' && 'catch' in (action as Promise<unknown>) && typeof (action as Promise<unknown>).catch === 'function';
}
// hook action errors hook to component level and cause hook to throw component level error (=> to Error boundary)
export function useThunkDispatch(): RootThunkDispatch {
const dispatch = useDispatch<RootThunkDispatch>();
const [error, setError] = useState<unknown | undefined>(undefined);