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

100% Statements 39/39
83.33% Branches 15/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 17x 17x 17x   17x 17x   17x 17x   17x 17x     17x 17x       17x       17x 2x     17x 8x 1x 1x       17x 34x   8x     17x 2x   2x     17x   1x 1x         17x 11x       17x 2x 1x     1x 1x 1x                 17x                              
import { useCallback, useEffect, useMemo, useState } from 'react';
 
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
 
import {
  useTimeOffV2ActionsSelector,
  useTimeOffV2StateSelector,
} from '../TimeOffV2/context';
import { TimeOffStep, TimeOffV2StackParamList } from '../TimeOffV2/types';
 
import { canSubmitReason, quickReasons } from './utils';
 
export const useChooseReason = () => {
  const form = useTimeOffV2StateSelector(state => state.form);
  const isReasonInputOpen = useTimeOffV2StateSelector(
    state => state.isReasonInputOpen,
  );
  const changeReason = useTimeOffV2ActionsSelector(
    actions => actions.changeReason,
  );
  const setReasonInputOpen = useTimeOffV2ActionsSelector(
    actions => actions.setReasonInputOpen,
  );
  const registerCloseReasonInput = useTimeOffV2ActionsSelector(
    actions => actions.registerCloseReasonInput,
  );
  const navigation =
    useNavigation<NativeStackNavigationProp<TimeOffV2StackParamList>>();
  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,
    },
  };
};