{"version":3,"file":"HelpCenter.mjs","names":["React","useState","useCallback","useEffect","useRef","Suspense","lazy","makeStyles","IconButton","Popover","Typography","List","ListItem","ListItemIcon","ListItemText","Dialog","DialogTitle","DialogContent","HelpOutline","HelpOutlineIcon","Chat","ChatIcon","Close","CloseIcon","useActions","useTranslation","useUser","apiMutate","ConfigService","UserFormSideSheet","SupportCaseSideSheet","preloadUserFormSideSheet","preloadSupportCaseSideSheet","useStyles","theme","root","display","popover","padding","spacing","maxWidth","icon","minWidth","closeButton","position","right","top","color","palette","grey","header","alignItems","justifyContent","dialog","minHeight","HelpCenter","classes","t","triggerAction","user","productId","Number","config","UNITY_PRODUCT_ID","udpaiAPI","UDPAI_API_BASE","udpaisearch","AI_SEARCH_URL","udpaisearchkey","AI_SEARCH_KEY","udpaisearchindex","AI_SEARCH_INDEX_NAME","anchorEl","setAnchorEl","isSupportCaseSideSheetOpen","setSupportCaseSideSheetOpen","isUserFormOpen","setUserFormOpen","supportCaseHealthOk","setSupportCaseHealthOk","hasPreloadedRef","handleOpenPopover","event","currentTarget","current","e","handleClosePopover","handleLaunchAction","handleOpenSupportCaseSideSheet","handleCloseSupportCaseSideSheet","handleOpenUserForm","handleCloseUserForm","open","Boolean","id","undefined","shouldShowAddUsers","isValidProduct","includes","isSecurityApiConfigured","securityV1ApiUrl","isValidUser","can","CAN_MANAGE_ROLES_USERS","CAN_MANAGE_USERS","CAN_VIEW_USERS","getSupportCaseStatus","productV1ApiUrl","method","headers","currentTenantId","getSupportCaseStatusUnity","supportV1ApiUrl","showAddUsers","shouldShowChatAssistant","shouldShowSupportTicket","supportCaseStatus","response","status","error","opacity","vertical","horizontal","defaultValue","values","console","log"],"sources":["../../../src/shell/ui/HelpCenter.jsx"],"sourcesContent":["import React, { useState, useCallback, useEffect, useRef, Suspense, lazy } from 'react';\nimport {\n  makeStyles,\n  IconButton,\n  Popover,\n  Typography,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  Dialog,\n  DialogTitle,\n  DialogContent\n} from '@material-ui/core';\nimport { HelpOutline as HelpOutlineIcon, Chat as ChatIcon, Close as CloseIcon } from '@material-ui/icons';\nimport { useActions } from '../../hooks/useActions';\nimport { useTranslation } from 'react-i18next';\nimport { useUser } from '../../../src/utilities/auth/useUser';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { ConfigService } from '../../configService';\n\n// Lazy-load side sheets so they aren't imported until needed. Keep\n// module-level lazy declarations so the imports are deduped and cached.\nconst UserFormSideSheet = lazy(() => import('./user/UserFormSideSheet'));\nconst SupportCaseSideSheet = lazy(() => import('../../UI/support/SupportCaseSideSheet'));\n\n// Preload helpers (return the dynamic import promise). Calling these\n// will start fetching the chunk in the background and populate the\n// module cache so React.lazy resolves quickly later.\nconst preloadUserFormSideSheet = () => import('./user/UserFormSideSheet');\nconst preloadSupportCaseSideSheet = () => import('../../UI/support/SupportCaseSideSheet');\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: 'flex'\n  },\n  popover: {\n    padding: theme.spacing(2),\n    maxWidth: 300\n  },\n  icon: {\n    minWidth: 40\n  },\n  closeButton: {\n    position: 'absolute',\n    right: theme.spacing(1),\n    top: theme.spacing(1),\n    color: theme.palette.grey[500]\n  },\n  header: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between'\n  },\n  dialog: {\n    minWidth: '80vw',\n    minHeight: '80vh'\n  }\n}));\n\nexport const HelpCenter = () => {\n  const classes = useStyles();\n  const { t } = useTranslation();\n  const { triggerAction } = useActions();\n  const user = useUser();\n  const productId = Number(ConfigService.config.UNITY_PRODUCT_ID);\n\n  const udpaiAPI = ConfigService.config.UDPAI_API_BASE;\n  const udpaisearch = ConfigService.config.AI_SEARCH_URL;\n  const udpaisearchkey = ConfigService.config.AI_SEARCH_KEY;\n  const udpaisearchindex = ConfigService.config.AI_SEARCH_INDEX_NAME;\n\n  const [anchorEl, setAnchorEl] = useState(null);\n  const [isSupportCaseSideSheetOpen, setSupportCaseSideSheetOpen] =\n    useState(false);\n  const [isUserFormOpen, setUserFormOpen] = useState(false);\n  const [supportCaseHealthOk, setSupportCaseHealthOk] = useState(false);\n\n  const hasPreloadedRef = useRef(false);\n\n  const handleOpenPopover = (event) => {\n    setAnchorEl(event.currentTarget);\n\n    // Preload both side sheets in the background the first time the popover opens.\n    // We assume that if the user opened the popover, they might open one of the sheets.\n    if (!hasPreloadedRef.current) {\n      hasPreloadedRef.current = true;\n      // Start background fetches but don't await them.\n      try {\n        preloadUserFormSideSheet();\n      } catch (e) {\n        // ignore preload errors\n      }\n      try {\n        preloadSupportCaseSideSheet();\n      } catch (e) {\n        // ignore preload errors\n      }\n    }\n  };\n\n  const handleClosePopover = () => {\n    setAnchorEl(null);\n  };\n\n  const handleLaunchAction = useCallback(() => {\n    setAnchorEl(null);\n    triggerAction('CEE75B36-01B0-4FAC-9AE7-C1AC8A2A194F');\n  }, [triggerAction]);\n\n  const handleOpenSupportCaseSideSheet = () => {\n    setSupportCaseSideSheetOpen(true);\n    setAnchorEl(null);\n  };\n\n  const handleCloseSupportCaseSideSheet = () => {\n    setSupportCaseSideSheetOpen(false);\n  };\n\n  const handleOpenUserForm = () => {\n    setUserFormOpen(true); // Open UserForm modal\n    setAnchorEl(null);\n  };\n\n  const handleCloseUserForm = () => {\n    setUserFormOpen(false); // Close UserForm modal\n  };\n\n  const open = Boolean(anchorEl);\n  const id = open ? 'help-center-popover' : undefined;\n\n  // Conditions for rendering buttons\n  // 2 assets, 41 sandbox, 51 assets, 53 mm, 68 timesheets\n  const shouldShowAddUsers = (productId) => {\n    const isValidProduct = [41, 53].includes(productId);\n    const isSecurityApiConfigured = !!ConfigService.securityV1ApiUrl;\n    const isValidUser =\n      user.can.CAN_MANAGE_ROLES_USERS &&\n      user.can.CAN_MANAGE_USERS &&\n      user.can.CAN_VIEW_USERS;\n    return isValidProduct && isSecurityApiConfigured && isValidUser;\n  };\n\n  const getSupportCaseStatus = useCallback(\n    async () =>\n      apiMutate(\n        ConfigService.productV1ApiUrl,\n        `udpunitysupport/healthCheck`,\n        {\n          method: 'get',\n          headers: {\n            currentTenantId: user?.currentTenantId\n          }\n        }\n      ),\n    [user?.currentTenantId]\n  );\n\n  const getSupportCaseStatusUnity = useCallback(\n    async () =>\n      apiMutate(\n        ConfigService.supportV1ApiUrl,\n        `ServiceHealth/Support`,\n        {\n          method: 'get',\n          headers: {\n            currentTenantId: user?.currentTenantId\n          }\n        }\n      ),\n    [user?.currentTenantId]\n  );\n\n  const showAddUsers = shouldShowAddUsers(productId);\n  const shouldShowChatAssistant =\n    [2, 41, 51, 68].includes(productId) &&\n    udpaiAPI &&\n    udpaisearch &&\n    udpaisearchkey &&\n    udpaisearchindex;\n  const shouldShowSupportTicket = productId && supportCaseHealthOk;\n\n  useEffect(() => {\n    const supportCaseStatus = async () => {\n      try {\n        if (ConfigService.config.UNITY_PRODUCT_ID === \"1\") {\n          const response = await getSupportCaseStatusUnity();\n          setSupportCaseHealthOk(response?.status === 200);\n        } else {\n          const response = await getSupportCaseStatus();\n          setSupportCaseHealthOk(response?.status === 200);\n        }\n      } catch (error) {\n        setSupportCaseHealthOk(false);\n      }\n    };\n    supportCaseStatus();\n  }, [getSupportCaseStatus, getSupportCaseStatusUnity]);\n\n  // Hide the entire help center if neither button should be rendered\n  if (!showAddUsers && !shouldShowChatAssistant && !shouldShowSupportTicket) {\n    return <div id='udpRecord-HelpCenter' />;\n  }\n\n  return (\n    <div id='udpRecord-HelpCenter' className={classes.root}>\n      <IconButton\n        id='udpRecord-HelpCenter-IconButton'\n        aria-controls={id}\n        aria-haspopup='true'\n        onClick={handleOpenPopover}\n      >\n        <HelpOutlineIcon style={{ color: 'white', opacity: 0.8 }} />\n      </IconButton>\n      <Popover\n        id={id}\n        open={open}\n        anchorEl={anchorEl}\n        onClose={handleClosePopover}\n        anchorOrigin={{\n          vertical: 'bottom',\n          horizontal: 'center'\n        }}\n        transformOrigin={{\n          vertical: 'top',\n          horizontal: 'center'\n        }}\n      >\n        <div className={classes.popover}>\n          <div className={classes.header}>\n            <Typography variant='h6'>\n              {t('shell.helpCenter.title', { defaultValue: 'Help' })}\n            </Typography>\n            <IconButton\n              size='small'\n              className={classes.closeButton}\n              onClick={handleClosePopover}\n            >\n              <CloseIcon />\n            </IconButton>\n          </div>\n          <List\n            component='nav'\n            aria-label={t('shell.helpCenter.optionsAria', {\n              defaultValue: 'Help options'\n            })}\n          >\n            {/* First Button: Add User */}\n            {showAddUsers && (\n              <ListItem\n                button\n                id='udpRecord-HelpCenter-AddUsers'\n                onClick={handleOpenUserForm}\n              >\n                <ListItemIcon className={classes.icon}>\n                  <HelpOutlineIcon />\n                </ListItemIcon>\n                <ListItemText\n                  primary={t('shell.helpCenter.addUser', {\n                    defaultValue: 'Add User'\n                  })}\n                />\n              </ListItem>\n            )}\n\n            {/* Second Button: Chat Assistant */}\n            {shouldShowChatAssistant && (\n              <ListItem\n                button\n                id='udpRecord-HelpCenter-ChatAssistant'\n                onClick={handleLaunchAction}\n              >\n                <ListItemIcon className={classes.icon}>\n                  <ChatIcon />\n                </ListItemIcon>\n                <ListItemText\n                  primary={t('shell.helpCenter.chatAssistant', {\n                    defaultValue: 'Chat Assistant'\n                  })}\n                />\n              </ListItem>\n            )}\n\n            {/* Third Button: Submit Support Ticket */}\n            {shouldShowSupportTicket && (\n              <ListItem\n                button\n                id='udpRecord-HelpCenter-SupportTicket'\n                onClick={handleOpenSupportCaseSideSheet}\n              >\n                <ListItemIcon className={classes.icon}>\n                  <HelpOutlineIcon />\n                </ListItemIcon>\n                <ListItemText\n                  primary={t('shell.helpCenter.submitSupportTicket', {\n                    defaultValue: 'Submit Support Ticket'\n                  })}\n                />\n              </ListItem>\n            )}\n          </List>\n        </div>\n      </Popover>\n\n      {/* Modal for UserForm (lazy-loaded) */}\n      <Suspense fallback={null}>\n        <UserFormSideSheet open={isUserFormOpen} onClose={handleCloseUserForm} />\n      </Suspense>\n\n      {/* Side Sheet for Support Ticket (lazy-loaded) */}\n      <Suspense fallback={null}>\n        <SupportCaseSideSheet\n          open={isSupportCaseSideSheetOpen}\n          onClose={handleCloseSupportCaseSideSheet}\n          handleCloseSupportCaseSideSheet={handleCloseSupportCaseSideSheet}\n          onSubmit={(values) => {\n            console.log('Form submitted', values);\n          }}\n          initialValues={{}}\n        />\n      </Suspense>\n    </div>\n  );\n};\n"],"mappings":"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"}