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

97.14% Statements 34/35
50% Branches 9/18
100% Functions 13/13
97.05% Lines 33/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 14x 14x 14x   14x 14x   14x 14x     14x     14x   14x 5x       5x     14x 5x 10x   5x     14x 1x 1x     14x 1x     14x   1x 1x         14x 7x       14x 2x 1x     1x 1x     14x                              
import { useCallback, useEffect, useMemo, useState } from 'react';
 
import {
  useReallocationV2ActionsSelector,
  useReallocationV2StateSelector,
} from '../ReallocationV2/context';
 
import { canSubmitReason, quickReasonOptions } from './utils';
 
export const useChooseReason = () => {
  const form = useReallocationV2StateSelector(state => state.form);
  const isReasonInputOpen = useReallocationV2StateSelector(
    state => state.isReasonInputOpen,
  );
  const changeReason = useReallocationV2ActionsSelector(
    actions => actions.changeReason,
  );
  const setReasonInputOpen = useReallocationV2ActionsSelector(
    actions => actions.setReasonInputOpen,
  );
 
  const [quickReason, setQuickReason] = useState<string | null>(
    form.reason || null,
  );
  const [reasonInputValue, setReasonInputValue] = useState(form.reason || '');
 
  useEffect(() => {
    Iif (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,
    },
  };
};