{"version":3,"file":"common.util.mjs","sources":["../../src/lib/utils/common.util.js"],"sourcesContent":["/*\nCopyright 2022 Iguazio Systems Ltd.\nLicensed under the Apache License, Version 2.0 (the \"License\") with\nan addition restriction as set forth herein. You may not use this\nfile except in compliance with the License. You may obtain a copy of\nthe License at http://www.apache.org/licenses/LICENSE-2.0.\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing\npermissions and limitations under the License.\nIn addition, you may not use the software for any purposes that are\nillegal under applicable law, and the grant of the foregoing license\nunder the Apache 2.0 license is conditioned upon your compliance with\nsuch restriction.\n*/\nimport { create } from 'react-modal-promise'\nimport { differenceWith, isEqual, get, omit, isEmpty, isNumber } from 'lodash'\n\nimport ConfirmDialog from '../components/ConfirmDialog/ConfirmDialog'\n\nimport {\n  DANGER_BUTTON,\n  FORBIDDEN_ERROR_STATUS_CODE,\n  PRIMARY_BUTTON,\n  TERTIARY_BUTTON,\n  VIEW_SEARCH_PARAMETER\n} from '../constants'\nimport { setFiltersWasHandled, showWarning } from '../reducers/commonDetailsReducer'\nimport { setNotification } from '../reducers/notificationReducer'\nimport { showErrorNotification } from './notification.util'\n\nexport const openPopUp = (element, props) => {\n  return create(element)(props)\n}\n\nexport const openConfirmPopUp = (message, confirmHandler) => {\n  return openPopUp(ConfirmDialog, {\n    cancelButton: {\n      label: 'Cancel',\n      variant: TERTIARY_BUTTON\n    },\n    confirmButton: {\n      label: 'OK',\n      variant: PRIMARY_BUTTON,\n      handler: confirmHandler\n    },\n    header: 'Are you sure?',\n    message\n  })\n}\n\nexport const openDeleteConfirmPopUp = (header, message, confirmHandler) => {\n  return openPopUp(ConfirmDialog, {\n    cancelButton: {\n      label: 'Cancel',\n      variant: TERTIARY_BUTTON\n    },\n    confirmButton: {\n      label: 'Delete',\n      variant: DANGER_BUTTON,\n      handler: confirmHandler\n    },\n    header,\n    message\n  })\n}\n\nexport const isEveryObjectValueEmpty = obj =>\n  Object.values(obj).every(\n    item => !item || item?.length === 0 || (!isNumber(item) && isEmpty(item))\n  )\n\n// Checks, whether two arrays of objects are equal, can omit some keys if their comparison is not necessary\nexport const areArraysEqual = (firstArray, secondArray, omitBy = []) => {\n  if (firstArray.length !== secondArray.length) return false\n\n  return isEmpty(\n    differenceWith(firstArray, secondArray, (a, b) => {\n      return isEqual(omit(a, omitBy), omit(b, omitBy))\n    })\n  )\n}\n\nconst commonErrorMessagesMap = {\n  [FORBIDDEN_ERROR_STATUS_CODE]: 'You do not have a permission to view this data'\n}\n\n/**\n * Get error information from the error object.\n *\n * @param {Error} error - The error object.\n * @returns {string} - The detailed error information.\n */\nexport const getErrorDetail = error => {\n  const errorDetail = get(error, 'response.data.detail', null)\n\n  if (typeof errorDetail === 'string') {\n    return errorDetail\n  } else {\n    return get(errorDetail, 'reason', '')\n  }\n}\n\n/**\n * Get the error message from the error object or a default error message.\n *\n * @param {Error} error - The error object.\n * @param {string} defaultError - The default error message.\n * @returns {string} - The error message.\n */\nexport const getErrorMsg = (error, defaultError) => {\n  const errorDetail = getErrorDetail(error)\n  const errorMsg = errorDetail || error.message\n\n  if (\n    (!errorMsg ||\n      errorMsg === 'Not Found' ||\n      errorMsg.startsWith('Request failed with status code')) &&\n    defaultError\n  ) {\n    return defaultError\n  } else {\n    if (commonErrorMessagesMap[error.status]) {\n      return commonErrorMessagesMap[error.status]\n    }\n\n    return errorMsg || ''\n  }\n}\n\n/**\n * Retrieves the appropriate transition end event name based on the browser.\n *\n * @returns {string} The transition end event name.\n */\nexport const getTransitionEndEventName = () => {\n  const transitions = {\n    transition: 'transitionend',\n    OTransition: 'oTransitionEnd',\n    MozTransition: 'transitionend',\n    WebkitTransition: 'webkitTransitionEnd'\n  }\n\n  let bodyStyle = document.body.style\n\n  for (let transition in transitions) {\n    if (bodyStyle[transition] !== undefined) {\n      return transitions[transition]\n    }\n  }\n}\n\nexport const getScssVariableValue = variableName => {\n  return getComputedStyle(document.documentElement).getPropertyValue(variableName).trim()\n}\n\nexport const getViewMode = search => {\n  return new URLSearchParams(search).get(VIEW_SEARCH_PARAMETER)?.toLowerCase()\n}\n\nexport const performDetailsActionHelper = async (changes, dispatch, filtersWasHandled = false) => {\n  let actionCanBePerformed = Promise.resolve(true)\n\n  if (changes.counter > 0) {\n    actionCanBePerformed = await new Promise(resolve => {\n      const resolver = isSuccess => {\n        window.removeEventListener('discardChanges', resolver)\n        window.removeEventListener('cancelLeave', resolver)\n\n        resolve(isSuccess)\n      }\n\n      window.addEventListener('discardChanges', () => resolver(true))\n      window.addEventListener('cancelLeave', () => resolver(false))\n\n      dispatch(setFiltersWasHandled(filtersWasHandled))\n      dispatch(showWarning(true))\n    })\n  }\n\n  return actionCanBePerformed\n}\n\nexport const copyToClipboard = (textToCopy, dispatch) => {\n  if (!navigator.clipboard?.writeText) {\n    return showErrorNotification(\n      dispatch,\n      null,\n      '',\n      'Copy to clipboard failed due to unsecured connection'\n    )\n  }\n\n  navigator.clipboard\n    .writeText(textToCopy)\n    .then(() => {\n      dispatch(\n        setNotification({\n          status: 200,\n          id: Math.random(),\n          message: 'Copied to clipboard successfully'\n        })\n      )\n    })\n    .catch(error => {\n      showErrorNotification(dispatch, error, '', 'Copy to clipboard failed')\n    })\n}\n\nexport const roundFloats = (value, precision) => {\n  if (\n    ((typeof value === 'string' && value.trim() !== '') || typeof value === 'number') &&\n    !isNaN(value)\n  ) {\n    const parsedNum = parseFloat(value)\n\n    return parsedNum % 1 === 0 ? parsedNum : +parsedNum.toFixed(precision ?? 2)\n  }\n\n  return value\n}\n\nexport const generateUrlFromRouterPath = link => {\n  return new URL(link, window.location.origin).toString()\n}\n"],"names":["openPopUp","element","props","create","openConfirmPopUp","message","confirmHandler","ConfirmDialog","TERTIARY_BUTTON","PRIMARY_BUTTON","openDeleteConfirmPopUp","header","DANGER_BUTTON","isEveryObjectValueEmpty","obj","item","isNumber","isEmpty","areArraysEqual","firstArray","secondArray","omitBy","differenceWith","a","b","isEqual","omit","commonErrorMessagesMap","FORBIDDEN_ERROR_STATUS_CODE","getErrorDetail","error","errorDetail","get","getErrorMsg","defaultError","errorMsg","getTransitionEndEventName","transitions","bodyStyle","transition","getScssVariableValue","variableName","getViewMode","search","_a","VIEW_SEARCH_PARAMETER","performDetailsActionHelper","changes","dispatch","filtersWasHandled","actionCanBePerformed","resolve","resolver","isSuccess","setFiltersWasHandled","showWarning","copyToClipboard","textToCopy","showErrorNotification","setNotification","roundFloats","value","precision","parsedNum","generateUrlFromRouterPath","link"],"mappings":"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"}