All files / apps/reallocation/src/screens/ChooseReason hooks.ts

100% Statements 35/35
94.44% Branches 17/18
100% Functions 13/13
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88                  1x 22x 22x 22x   22x 22x   22x 22x     22x     22x   22x 10x 1x     9x     22x 10x 18x   10x     22x 3x 3x     22x 1x     22x   1x 1x         22x 14x       22x 2x 1x     1x 1x     22x                              
import { useCallback, useEffect, useMemo, useState } from 'react';
 
import {
  useReallocationActionsSelector,
  useReallocationStateSelector,
} from '../Reallocation/context';
 
import { canSubmitReason, quickReasonOptions } from './utils';
 
export const useChooseReason = () => {
  const form = useReallocationStateSelector(state => state.form);
  const isReasonInputOpen = useReallocationStateSelector(
    state => state.isReasonInputOpen,
  );
  const changeReason = useReallocationActionsSelector(
    actions => actions.changeReason,
  );
  const setReasonInputOpen = useReallocationActionsSelector(
    actions => actions.setReasonInputOpen,
  );
 
  const [quickReason, setQuickReason] = useState<string | null>(
    form.reason || null,
  );
  const [reasonInputValue, setReasonInputValue] = useState(form.reason || '');
 
  useEffect(() => {
    if (isReasonInputOpen) {
      return;
    }
 
    setReasonInputValue(form.reason || '');
  }, [form.reason, isReasonInputOpen]);
 
  useEffect(() => {
    const isQuickReason = quickReasonOptions.some(
      item => item.value === form.reason,
    );
    setQuickReason(isQuickReason ? form.reason || null : null);
  }, [form.reason]);
 
  const openReasonInput = useCallback(() => {
    setReasonInputOpen(true);
    setReasonInputValue(form.reason === quickReason ? '' : form.reason || '');
  }, [form.reason, quickReason, setReasonInputOpen]);
 
  const closeReasonInput = useCallback(() => {
    setReasonInputOpen(false);
  }, [setReasonInputOpen]);
 
  const handleChangeQuickReason = useCallback(
    (value: string) => {
      setQuickReason(value);
      changeReason(value);
    },
    [changeReason],
  );
 
  const canSubmitReasonInput = useMemo(
    () => canSubmitReason(reasonInputValue),
    [reasonInputValue],
  );
 
  const handleSubmitTextInput = useCallback(() => {
    if (!canSubmitReasonInput) {
      return;
    }
 
    changeReason(reasonInputValue.trim());
    closeReasonInput();
  }, [canSubmitReasonInput, changeReason, closeReasonInput, reasonInputValue]);
 
  return {
    state: {
      isOpenReasonInput: isReasonInputOpen,
      quickReason,
      reasonInputValue,
      canSubmitReasonInput,
    },
    actions: {
      setReasonInputValue,
      openReasonInput,
      handleChangeQuickReason,
      handleSubmitTextInput,
    },
  };
};