Shramkoweb/Portfolio

View on GitHub
components/post-reaction/use-feedback-reducer.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
92%
import { useReducer } from 'react';

import { Feedback } from '@/lib/types';

interface FeedbackState {
  feedback: Feedback;
}

const initialState = { feedback: Feedback.Blank };

function reducer(
  state: FeedbackState,
  action: { type: Feedback },
): FeedbackState {
  switch (action.type) {
    case Feedback.Helpful:
      return { feedback: Feedback.Helpful };
    case Feedback.Worthless:
      return { feedback: Feedback.Worthless };
    default:
      return { feedback: Feedback.Blank };
  }
}

const ActionCreator = {
  setFeedback: (feedback: Feedback) => ({
    type: feedback,
  }),
};

export const useFeedbackReducer = () => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return {
    state,
    actions: {
      worthless: () => dispatch(ActionCreator.setFeedback(Feedback.Worthless)),
      helpful: () => dispatch(ActionCreator.setFeedback(Feedback.Helpful)),
    },
  };
};