All files / src/features/Permissions/ModalV2/hooks useDataWithLogs.ts

96.29% Statements 26/27
90% Branches 9/10
100% Functions 7/7
96.29% Lines 26/27

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                  4x 306x               306x         306x             306x   306x 49x         49x     306x 5x 5x     306x 1x 1x 1x 1x     306x         11x   11x     11x       306x 51x   306x 306x 306x   306x                                      
import useHashedData from "@hooks/common/data-management/useHashedData";
import useLogs from "@hooks/common/data-management/useLogs";
import {
  IUpdatedData,
  PermisionHashMap,
} from "features/Permissions/Modal/api/types";
import { useRef } from "react";
import { TPermissionsData } from "../types";
 
const useDataWithLogs = () => {
  const initialData = useRef<TPermissionsData>({});
 
  const {
    logs,
    updateItem: updateLogsItem,
    updateAll: updateAllLogs,
    reset,
    hasChanged,
  } = useLogs<IUpdatedData>();
  const {
    logs: latestAdded,
    updateAll: updateLatestAdded,
    reset: resetLatestAdded,
  } = useLogs<IUpdatedData>();
 
  const {
    data: hashedData,
    updateAll: updateAllHashedData,
    updateEntry: updateHashedDataItem,
    reset: resetHashedData,
  } = useHashedData<IUpdatedData>();
 
  const setDataFromAPI = (APIData: PermisionHashMap) => {
    const syncedData = {
      ...(Object.keys(APIData) && APIData),
      ...(Object.keys(latestAdded) && latestAdded),
      ...(Object.keys(logs) && logs),
    };
    resetHashedData(syncedData);
  };
 
  const clearLogs = () => {
    reset();
    resetLatestAdded();
  };
 
  const removeItemFromLogs = (key: string) =>
    updateAllLogs((old) => {
      const newData = old;
      delete newData[key];
      return newData;
    });
 
  const handleChangePermissionStatus = (
    key: string,
    updatedItem: IUpdatedData,
    isUnchanged: boolean,
  ) => {
    updateHashedDataItem(key, updatedItem);
 
    Iif (isUnchanged) {
      removeItemFromLogs(key);
    } else {
      updateLogsItem(key, updatedItem);
    }
  };
 
  const setInitialData = (data: TPermissionsData) =>
    (initialData.current = data);
 
  const effectsChanged = hasChanged(initialData.current);
  const listChanged = Object.keys(latestAdded).length > 0;
  const isMutated = effectsChanged || listChanged;
 
  return {
    setDataFromAPI,
    clearLogs,
    resetHashedData,
    hashedData,
    latestAdded,
    logs,
    handleChangePermissionStatus,
    updateLatestAdded,
    updateAllHashedData,
    isMutated,
    setInitialData,
    initialData,
    updateAllLogs,
    removeItemFromLogs,
  };
};
 
export default useDataWithLogs;