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

100% Statements 39/39
94.44% Branches 17/18
100% Functions 15/15
100% Lines 37/37

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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                          1x 18x 18x 18x   18x 18x   18x 18x   18x 18x     18x 18x       18x       18x 3x     18x 10x 2x 2x       18x 44x   10x     18x 3x   3x     18x   1x 1x         18x 13x       18x 2x 1x     1x 1x 1x                 18x                              
import { useCallback, useEffect, useMemo, useState } from 'react';
 
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
 
import {
  useTimeOffActionsSelector,
  useTimeOffStateSelector,
} from '../TimeOff/context';
import { TimeOffStackParamList, TimeOffStep } from '../TimeOff/types';
 
import { canSubmitReason, quickReasons } from './utils';
 
export const useChooseReason = () => {
  const form = useTimeOffStateSelector(state => state.form);
  const isReasonInputOpen = useTimeOffStateSelector(
    state => state.isReasonInputOpen,
  );
  const changeReason = useTimeOffActionsSelector(
    actions => actions.changeReason,
  );
  const setReasonInputOpen = useTimeOffActionsSelector(
    actions => actions.setReasonInputOpen,
  );
  const registerCloseReasonInput = useTimeOffActionsSelector(
    actions => actions.registerCloseReasonInput,
  );
  const navigation =
    useNavigation<NativeStackNavigationProp<TimeOffStackParamList>>();
  const [quickReason, setQuickReason] = useState<string | null>(
    form.note || null,
  );
 
  const [reasonInputValue, setReasonInputValue] = useState<string | null>(
    form.note || null,
  );
 
  const closeReasonInput = useCallback(() => {
    setReasonInputOpen(false);
  }, [setReasonInputOpen]);
 
  useEffect(() => {
    registerCloseReasonInput(() => {
      closeReasonInput();
      setReasonInputValue(form.note || null);
    });
  }, [closeReasonInput, form.note, registerCloseReasonInput]);
 
  useEffect(() => {
    const isQuickReason = quickReasons.some(item => item.label === form.note);
 
    setQuickReason(isQuickReason ? form.note || null : null);
  }, [form.note]);
 
  const openReasonInput = useCallback(() => {
    setReasonInputOpen(true);
 
    setReasonInputValue(form.note === quickReason ? null : form.note || null);
  }, [form.note, quickReason, setReasonInputOpen]);
 
  const handleChangeQuickReason = useCallback(
    (value: string) => {
      setQuickReason(value);
      changeReason(value);
    },
    [changeReason],
  );
 
  const canSubmitReasonInput = useMemo(
    () => canSubmitReason(reasonInputValue),
    [reasonInputValue],
  );
 
  const handleSubmitTextInput = useCallback(() => {
    if (!canSubmitReasonInput || !reasonInputValue) {
      return;
    }
 
    changeReason(reasonInputValue);
    closeReasonInput();
    navigation.navigate(TimeOffStep.PREVIEW);
  }, [
    canSubmitReasonInput,
    reasonInputValue,
    changeReason,
    closeReasonInput,
    navigation,
  ]);
 
  return {
    state: {
      isOpenReasonInput: isReasonInputOpen,
      quickReason,
      reasonInputValue,
      canSubmitReasonInput,
    },
    actions: {
      setReasonInputValue,
      openReasonInput,
      handleChangeQuickReason,
      handleSubmitTextInput,
    },
  };
};