iframe {\n pointer-events: none;\n }\n `}\n />\n);\n\nexport default GlobalStyle;\n","import React from \"react\";\nimport { Outlet } from \"react-router-dom\";\nimport styled from \"@emotion/styled\";\n\nimport { CssBaseline } from \"@mui/material\";\n\n//import Settings from \"../components/Settings\";\nimport GlobalStyle from \"../components/GlobalStyle\";\n\nconst Root = styled.div`\n max-width: 520px;\n margin: 0 auto;\n justify-content: center;\n align-items: center;\n display: flex;\n min-height: 100%;\n flex-direction: column;\n`;\n\nconst Auth = ({ children }) => {\n return (\n \n \n \n {children}\n \n {/* */}\n \n );\n};\n\nexport default Auth;\n","import * as React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { withTheme } from \"@emotion/react\";\n\nimport { Grid, IconButton as MuiIconButton } from \"@mui/material\";\n\nimport { Menu as MenuIcon } from \"@mui/icons-material\";\n\nconst IconButton = styled(MuiIconButton)`\n svg {\n width: 22px;\n height: 22px;\n }\n`;\n\nconst Navbar = ({ onDrawerToggle }) => {\n return (\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default withTheme(Navbar);\n","import {\n Layout,\n //Sliders,\n Users,\n Settings,\n FileMinus,\n} from \"react-feather\";\n\n// const role = localStorage.getItem(\"atur\");\n// console.log(\"role == \", role);\n\nvar pagesSection = [];\n\npagesSection = [\n {\n href: \"/chat\",\n icon: Layout,\n },\n {\n href: \"/contact\",\n icon: Users,\n },\n {\n href: \"/settings\",\n icon: Settings,\n },\n {\n href: \"/reports\",\n icon: FileMinus,\n },\n];\n\nconst navItems = [\n {\n // title: \"Pages\",\n pages: pagesSection,\n },\n];\n\nexport default navItems;\n","import {\n Layout,\n //Sliders,\n //Users,\n Settings,\n} from \"react-feather\";\n\n// const role = localStorage.getItem(\"atur\");\n// console.log(\"role == \", role);\n\nvar pagesSection = [];\n\npagesSection = [\n {\n href: \"/chat\",\n icon: Layout,\n },\n // {\n // href: \"/contact\",\n // icon: Users,\n // },\n {\n href: \"/settings\",\n icon: Settings,\n },\n];\n\nconst navItems = [\n {\n // title: \"Pages\",\n pages: pagesSection,\n },\n];\n\nexport default navItems;\n","export const firebaseConfig = {\n apiKey: process.env.REACT_APP_FIREBASE_API_KEY,\n authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,\n databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,\n projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,\n storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\n appId: process.env.REACT_APP_FIREBASE_APPID,\n measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID,\n};\n\nexport const auth0Config = {\n clientId: process.env.REACT_APP_AUTH0_CLIENT_ID,\n domain: process.env.REACT_APP_AUTH0_DOMAIN,\n};\n\nexport const cognitoConfig = {\n userPoolId: process.env.REACT_APP_COGNITO_USER_POOL_ID,\n clientId: process.env.REACT_APP_COGNITO_CLIENT_ID,\n};\n\nexport const basePathConfig = {\n baseURL: process.env.REACT_APP_BASE_URl,\n socketURL: process.env.REACT_APP_SOCKET_URl,\n};\n\n// export const basePathConfig = {\n// baseURL: \"http://127.0.0.1:4230\",\n// //socketURL: \"http://127.0.0.1:3123/account\",\n// socketURL: \"http://127.0.0.1:4230/account\",\n// };\n\n// export const basePathConfig = {\n// baseURL: \"https://liveagentservices.1spoc.ai:3123\",\n// socketURL: \"https://liveagentservices.1spoc.ai:3123/account\",\n// };\n","const errorHandler = async (error) => {\n var ErrorData;\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n // console.log(\"error.response.status == \", error.response.status);\n // console.log(\"error.response.headers == \", error.response.headers);\n\n if (parseInt(error.response.status) === 404) {\n ErrorData = { message: error.response.statusText, status: 404 };\n } else {\n ErrorData = {\n message: error.response.data.message,\n status: error.response.data.status,\n };\n }\n }\n // else if (error.request) {\n // // The request was made but no response was received\n // // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // // http.ClientRequest in node.js\n // console.log(\"else if == \", error.request);\n // }\n else {\n // Something happened in setting up the request that triggered an Error\n ErrorData = {\n message: error.message,\n status: 400,\n };\n }\n return await ErrorData;\n};\nexport default errorHandler;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\nexport const fetchLogin = createAsyncThunk(\"login/fetch\", async (payload) => {\n try {\n const res = await axios.post(`${basePathConfig.baseURL}/app/login`, {\n email: payload.email,\n password: payload.password,\n });\n var user = {\n uid: res.data.user._id,\n email: res.data.user.email,\n name: res.data.user.name,\n displayname: res.data.user.displayname,\n avatar: res.data.user.avatar,\n };\n\n var role = {\n role:\n res.data.user.role === 0\n ? \"638f1029a1c0997b2085c2a2\"\n : \"638f1032a1c0997b2085c2a6\",\n };\n //console.log(\"res.data == \", JSON.stringify(res.data));\n localStorage.setItem(\"accessToken\", res.data.accessToken.token);\n localStorage.setItem(\"user\", JSON.stringify(user));\n localStorage.setItem(\"atur\", role.role);\n localStorage.setItem(\"atua\", res.data.user.account_id);\n return await res.data;\n } catch (error) {\n //const data = await error.response.data;\n var ErrorData = await errorHandler(error);\n return ErrorData;\n }\n});\n\nexport const fetchLogOut = createAsyncThunk(\"logout/post\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const emailID = user.email;\n var payload = {\n email: emailID,\n account_id: accountID,\n };\n\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/logout`,\n payload,\n config\n );\n\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const fetchLoginLogOut_Socket = createAsyncThunk(\n \"loginlogout/socket\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n var payload = {\n account_id: accountID,\n };\n\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/loginlogout`,\n payload,\n config\n );\n\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\n// initialize userToken from local storage\n\nexport const loginSlice = createSlice({\n name: \"login\",\n initialState: {\n data: [],\n logoutData: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {\n logout: (state) => {\n localStorage.removeItem(\"accessToken\"); // deletes token from storage\n localStorage.removeItem(\"atur\"); // deletes token from storage\n localStorage.removeItem(\"atua\"); // deletes token from storage\n localStorage.removeItem(\"user\"); // deletes user from storage\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchLogin.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchLogin.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchLogin.rejected, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.ERROR;\n })\n .addCase(fetchLogOut.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchLogOut.fulfilled, (state, action) => {\n state.logoutData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchLogOut.rejected, (state, action) => {\n state.logoutData = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setLogin, setStatus, setLogoutData, logout } =\n loginSlice.actions;\nexport default loginSlice.reducer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch pause status Data\nexport const fetchPause = createAsyncThunk(\"pause/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const agentID = user.uid;\n if (!!bearer_token && !!accountID) {\n var bodyData = {\n account_id: accountID,\n agent_id: agentID,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/getavailability`,\n bodyData,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const ChangePauseState = createAsyncThunk(\n \"pause/update\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const agentID = user.uid;\n if (!!bearer_token && !!accountID) {\n var bodyData = {\n account_id: accountID,\n agent_id: agentID,\n isAvailable: payload === \"online\" ? 1 : 3,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/putpause_status`,\n bodyData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const pauseSlice = createSlice({\n name: \"pauseUnpause\",\n initialState: {\n data: [],\n updateData: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchPause.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchPause.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchPause.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(ChangePauseState.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(ChangePauseState.fulfilled, (state, action) => {\n state.updateData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(ChangePauseState.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setData, setStatus } = pauseSlice.actions;\nexport default pauseSlice.reducer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Update Profile\nexport const updateProfile = createAsyncThunk(\n \"updateProfile/post\",\n async (payload) => {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n try {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n var bodyData = {\n name: payload.name,\n displayname: payload.displayname,\n avatar: payload.avatar,\n role: payload.role,\n email: payload.email,\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/account_agent/${user.uid}/account/${accountID}`,\n bodyData,\n config\n );\n //console.log(\"updateProfile res.data == \", JSON.stringify(res.data));\n var userData = {\n uid: res.data.data._id,\n email: res.data.data.email,\n name: res.data.data.name,\n displayname: res.data.data.displayname,\n avatar: res.data.data.avatar,\n };\n localStorage.removeItem(\"user\"); // deletes user from storage\n localStorage.setItem(\"user\", JSON.stringify(userData));\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n //console.log(\"updateProfile ErrorData == \", JSON.stringify(ErrorData));\n return await ErrorData;\n }\n }\n);\n\n// delete File\nexport const deleteProfile = createAsyncThunk(\n \"deleteProfile/post\",\n async (selectedFile) => {\n //console.log(\"deleteProfile selectedFile == \", JSON.stringify(selectedFile));\n try {\n var bodyData = {\n location: selectedFile,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/deletemedia`,\n bodyData\n );\n // console.log(\"deleteProfile res.data == \", JSON.stringify(res.data));\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n console.log(\"deleteProfile ErrorData == \", JSON.stringify(ErrorData));\n return await ErrorData;\n }\n }\n);\n\n// upload File\n// fetch Current Chat Details Data\nexport const uploadProfile = createAsyncThunk(\n \"uploadProfile/post\",\n async (selectedFile) => {\n //console.log(\"uploadProfile selectedFile == \", JSON.stringify(selectedFile));\n try {\n const formData = new FormData();\n\n formData.append(\"profile\", selectedFile);\n const res = await axios.post(\n `${basePathConfig.baseURL}/uploadprofile`,\n formData\n );\n //console.log(\"uploadProfile res.data == \", JSON.stringify(res.data));\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nvar initialState = {\n status: STATUSES.SUCCESS,\n uploadData: [],\n uploadImage: \"\",\n success: \"\",\n error: \"\",\n loading: \"\",\n};\nexport const profileDetailsSlice = createSlice({\n name: \"profileDetails\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(deleteProfile.pending, (state, action) => {\n state.loading = \"loading\";\n })\n .addCase(deleteProfile.fulfilled, (state, action) => {\n state.uploadImage = action.payload;\n state.success = \"success\";\n })\n .addCase(deleteProfile.rejected, (state, action) => {\n state.error = \"error\";\n })\n .addCase(uploadProfile.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(uploadProfile.fulfilled, (state, action) => {\n state.uploadImage = action.payload;\n state.success = \"success\";\n })\n .addCase(uploadProfile.rejected, (state, action) => {\n state.loading = \"loading\";\n })\n .addCase(updateProfile.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(updateProfile.fulfilled, (state, action) => {\n state.uploadData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(updateProfile.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setUploadImage, setStatus, setUploadData, reset } =\n profileDetailsSlice.actions;\nexport default profileDetailsSlice.reducer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// fetch Current Chat Details Data\nexport const fetchCurrentChat = createAsyncThunk(\n \"currentChat/fetch\",\n async (conID) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n var payload = {\n account_id: accountID,\n conversation_id: conID,\n };\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/currentchatdetails`,\n payload,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// upload File\n// fetch Current Chat Details Data\nexport const uploadFileData = createAsyncThunk(\n \"uploadfile/post\",\n async (selectedFile, { rejectWithValue }) => {\n // console.log(\"selectedFile == \", selectedFile);\n // console.log(\"selectedFile[0].file == \", selectedFile.file);\n // console.log(\"selectedFile[0].channel_id == \", selectedFile.channel_id);\n try {\n const formData = new FormData();\n\n formData.append(\"file\", selectedFile.file);\n const res = await axios.post(\n `${basePathConfig.baseURL}/uploadmedia/` + selectedFile.channel_id,\n formData\n );\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await rejectWithValue(ErrorData);\n }\n }\n);\n\nexport const uploadPrivateFileData = createAsyncThunk(\n \"uploadPrivatefile/post\",\n async (selectedFile) => {\n try {\n const formData = new FormData();\n\n formData.append(\"file\", selectedFile);\n const res = await axios.post(\n `${basePathConfig.baseURL}/uploadmedia`,\n formData\n );\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const resolveCurrentChat = createAsyncThunk(\n \"resolveChat/post\",\n async (conID) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const accountID = localStorage.getItem(\"atua\");\n const agentID = user.uid;\n var payload = {\n account_id: accountID,\n conversation_id: conID,\n agent_id: agentID,\n };\n if (!!bearer_token && !!accountID && !!agentID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/resolve_conversation`,\n payload,\n config\n );\n\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const chatSettingsSlice = createSlice({\n name: \"chatSettings\",\n initialState: {\n chatList: \"Current\",\n chatListData: [],\n conversationId: \"\",\n conStatus: 0,\n botId: \"\",\n orgId: \"\",\n agentId: \"\",\n channelId: \"\",\n contactId: \"\",\n recipientID: \"\",\n contactData: [],\n conversationData: [],\n mute: false,\n fileData: [],\n filePrivateData: [],\n resolveData: [],\n status: STATUSES.SUCCESS,\n uploadFilestatus: STATUSES.SUCCESS,\n uploadPrivateFilestatus: STATUSES.SUCCESS,\n },\n reducers: {\n chatConversationIdClear: (state, action) => {\n state.conversationId = \"\";\n },\n chatConversatioStatus: (state, action) => {\n state.conStatus = action.payload.conStatus;\n },\n chatSettingsList: (state, action) => {\n state.chatList = action.payload.name;\n state.chatListData = action.payload.data;\n },\n chatConversation: (state, action) => {\n state.conversationId = action.payload.conversationId;\n state.conStatus = action.payload.conStatus;\n state.botId = action.payload.botId;\n state.orgId = action.payload.orgId;\n state.agentId = action.payload.agentId;\n state.channelId = action.payload.channelId;\n state.contactId = action.payload.contactId;\n state.contactData = action.payload.contactData;\n state.recipientID = action.payload.recipientID;\n },\n muteUnmute: (state, action) => {\n state.mute = action.payload;\n },\n reset_fileData: (state, action) => {\n state.fileData = [];\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchCurrentChat.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchCurrentChat.fulfilled, (state, action) => {\n state.conversationData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchCurrentChat.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(uploadFileData.pending, (state, action) => {\n state.uploadFilestatus = STATUSES.LOADING;\n })\n .addCase(uploadFileData.fulfilled, (state, action) => {\n state.fileData = action.payload;\n state.uploadFilestatus = STATUSES.SUCCESS;\n })\n .addCase(uploadFileData.rejected, (state, action) => {\n state.uploadFilestatus = STATUSES.ERROR;\n //state.fileData = [];\n state.fileData = action.payload;\n })\n .addCase(uploadPrivateFileData.pending, (state, action) => {\n state.uploadPrivateFilestatus = STATUSES.LOADING;\n })\n .addCase(uploadPrivateFileData.fulfilled, (state, action) => {\n state.filePrivateData = action.payload;\n state.uploadPrivateFilestatus = STATUSES.SUCCESS;\n })\n .addCase(uploadPrivateFileData.rejected, (state, action) => {\n state.uploadPrivateFilestatus = STATUSES.ERROR;\n state.filePrivateData = [];\n })\n .addCase(resolveCurrentChat.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(resolveCurrentChat.fulfilled, (state, action) => {\n state.resolveData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(resolveCurrentChat.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.resolveData = [];\n });\n },\n});\nexport const {\n setChatList,\n chatSettingsList,\n setChatListData,\n setConversationId,\n setConStatus,\n setChannelId,\n setContactData,\n chatConversation,\n setUploadFilestatus,\n setUploadPrivateFilestatus,\n muteUnmute,\n setMute,\n setFileData,\n setFilePrivateData,\n reset_fileData,\n setResolveData,\n chatConversatioStatus,\n chatConversationIdClear,\n} = chatSettingsSlice.actions;\nexport default chatSettingsSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Alert,\n Avatar as MuiAvatar,\n Box,\n Button as MuiButton,\n Card,\n CardContent,\n Dialog,\n DialogContent,\n Paper,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n TextField as MuiTextField,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { CloudUpload as MuiCloudUpload } from \"@mui/icons-material\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n deleteProfile,\n updateProfile,\n uploadProfile,\n reset,\n} from \"../../redux/slices/profileDetails\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { fetchCurrentChat } from \"../../redux/slices/chatSettings\";\n\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CloudUpload = styled(MuiCloudUpload)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\n//comment for main test 2\nconst Centered = styled.div`\n text-align: center;\n`;\n\nconst Avatar = styled(MuiAvatar)`\n display: inline-block;\n height: 128px;\n width: 128px;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst CardContentProfile = styled(CardContent)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n`;\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\n\nfunction Public({ fileData, handleAddClose }) {\n var [agent, setAgent] = React.useState(\"\");\n var [role, setRole] = React.useState(\"\");\n\n var [file, setFile] = React.useState(\"\");\n var [fileStatus, setFileStatus] = React.useState(\"notUploadedFile\");\n var [fileSize, setFileSize] = React.useState(false);\n var [fileload, setFileload] = React.useState(false);\n var [fileloadError, setFileloadError] = React.useState(\"\");\n const { conversationId } = useSelector((state) => state.chatSettings);\n\n var [name, setName] = React.useState(\"\");\n var [displayname, setDisplayname] = React.useState(\"\");\n const dispatch = useDispatch();\n const { uploadImage, uploadData } = useSelector(\n (state) => state.profileDetails\n );\n\n React.useEffect(() => {\n !!uploadImage ? setFile(uploadImage.data) : setFile(\"\");\n !!uploadImage\n ? setFileStatus(uploadImage.message)\n : setFileStatus(\"notUploadedFile\");\n }, [uploadImage]);\n\n React.useEffect(() => {\n !!agent && !!agent.name && setName(agent.name);\n !!agent && !!agent.displayname && setDisplayname(agent.displayname);\n !!agent && !!agent.avatar && setFile(agent.avatar);\n }, [agent]);\n\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n setRole(localStorage.getItem(\"atur\"));\n }, []);\n\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, [uploadData]);\n\n const changeHandler = async (event) => {\n // 5242855 as 5mb and 2002855 is 2mb\n // console.log(\"event.target.files[0].size == \", event.target.files[0].size);\n // console.log(\"event.target.files[0].type == \", event.target.files[0].type);\n var targetFiles = event.target.files[0].type;\n // console.log(\"targetFiles == \", targetFiles);\n var fileFormate = targetFiles.split(\"/\");\n // console.log(\"fileFormate == \", fileFormate);\n setFileload(true);\n if (fileFormate[0] === \"image\") {\n if (parseInt(event.target.files[0].size) > 2002855) {\n setFileSize(true);\n setFileloadError(\n \"The file is too large. The total size is more than 2MB!\"\n );\n await timeOut(2000);\n setFileloadError(\"\");\n setFileSize(false);\n setFileload(false);\n } else {\n setFileStatus(\"\");\n await dispatch(uploadProfile(event.target.files[0]));\n setFileload(false);\n }\n } else {\n setFileloadError(\n \"File format is not valid ,it should have a valid image file extension like .jpg, .png, or .gif.\"\n );\n setFileSize(true);\n await timeOut(2000);\n setFileloadError(\"\");\n setFileSize(false);\n setFileload(false);\n }\n event.target.value = \"\";\n };\n\n const changeDeleteHandler = async (event) => {\n setFileStatus(\"\");\n await dispatch(deleteProfile(file));\n setFile(\"\");\n };\n\n const changeUpdateHandler = async (event) => {\n var payload = {\n name: name,\n displayname: displayname,\n email: agent.email,\n avatar: file,\n role: role === \"638f1032a1c0997b2085c2a6\" ? 1 : 0,\n };\n await dispatch(updateProfile(payload));\n !!conversationId && dispatch(fetchCurrentChat(conversationId));\n await timeOut(3000);\n await dispatch(reset());\n };\n // test staging\n return (\n <>\n \n \n {/* */}\n\n \n \n \n {agent.displayname}\n \n {role === \"638f1032a1c0997b2085c2a6\" ? \"Agent\" : \"Admin\"}\n \n {agent.email}\n \n \n {!file && (\n \n )}\n {!!file && (\n \n )}\n \n {!fileStatus && }\n \n \n \n \n \n Public info\n \n {!!uploadData &&\n !!uploadData.status &&\n parseInt(uploadData.status) !== 200 && (\n \n {!!uploadData && uploadData.message}\n \n )}\n\n {!!uploadData &&\n !!uploadData.status &&\n parseInt(uploadData.status) === 200 && (\n \n Your data has been updated successfully!\n \n )}\n setName(e.target.value)}\n fullWidth\n my={2}\n />\n setDisplayname(e.target.value)}\n fullWidth\n my={2}\n />\n \n \n \n >\n );\n}\n// test react project\nconst Profile = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n \n \n \n \n \n \n );\n};\n// test Comments 111\nexport default Profile;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\nexport const fetchTodayschat = createAsyncThunk(\n \"todayschatData/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n var payloadData = {\n account_id: accountID,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/todayschat`,\n payloadData,\n config\n );\n\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const sockets = createSlice({\n name: \"socketsSlice\",\n initialState: {\n todaysChat: [],\n chatFromoneSpocData: [],\n loginLogoutData: [],\n contactUpdateData: [],\n openedChat: [],\n resolvedChat: [],\n },\n reducers: {\n fun_resetChatFromoneSpocData: (state, action) => {\n state.chatFromoneSpocData = [];\n },\n fun_TodaysChat: (state, action) => {\n state.todaysChat = [];\n state.todaysChat = action.payload;\n },\n fun_ChatFromoneSpoc: (state, action) => {\n state.chatFromoneSpocData = action.payload;\n },\n fun_LoginLogout: (state, action) => {\n state.loginLogoutData = action.payload;\n },\n fun_Contact_Upate: (state, action) => {\n state.contactUpdateData = action.payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchTodayschat.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchTodayschat.fulfilled, (state, action) => {\n state.todaysChat = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchTodayschat.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport const {\n setTodaysChat,\n setChatFromoneSpocData,\n setOpenedChat,\n setLoginLogoutData,\n setContactUpdateData,\n fun_TodaysChat,\n fun_ChatFromoneSpoc,\n fun_resetChatFromoneSpocData,\n fun_LoginLogout,\n fun_Contact_Upate,\n} = sockets.actions;\nexport default sockets.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Card,\n CardContent,\n Dialog,\n DialogContent,\n Paper,\n CircularProgress as MuiCircularProgress,\n Typography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst LogoutProcess = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default LogoutProcess;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport { Badge, Grid, Avatar } from \"@mui/material\";\n\nimport Menu from \"@mui/material/Menu\";\nimport Paper from \"@mui/material/Paper\";\nimport MenuList from \"@mui/material/MenuList\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport PowerSettingsNew from \"@mui/icons-material/PowerSettingsNew\";\nimport AccountCircle from \"@mui/icons-material/AccountCircle\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport NotificationsNoneIcon from \"@mui/icons-material/NotificationsNone\";\n\nimport {\n fetchLoginLogOut_Socket,\n fetchLogOut,\n logout,\n} from \"../../redux/slices/login\";\nimport CircleIcon from \"@mui/icons-material/Circle\";\nimport { ChangePauseState, fetchPause } from \"../../redux/slices/pauseUnpause\";\nimport Profile from \"./Profile\";\nimport { fetchTodayschat } from \"../../redux/slices/socketsSlice\";\nimport LogoutProcess from \"./LogoutProcess\";\n//import useAuth from \"../../hooks/useAuth\";\n\n// background-color: ${(props) =>\n// props.theme.sidebar.footer.background} !important;\nconst Footer = styled.div`\n background-color: #fff !important;\n padding: ${(props) => props.theme.spacing(2.75)}\n ${(props) => props.theme.spacing(4)};\n border-right: 1px solid rgba(0, 0, 0, 0.12);\n`;\n\nconst CircleIconOnline = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.online.background};\n`;\n\nconst CircleIconPause = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.pause.background};\n`;\n\n// const CircleIconBuzy = styled(CircleIcon)`\n// color: ${(props) => props.theme.sidebar.footer.buzy.background};\n// `;\n\nconst FooterBadge = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\n\nconst FooterBadgePause = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) => props.theme.sidebar.footer.pause.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst NotificationsNoneIconIcon = styled(NotificationsNoneIcon)`\n color: ${(props) => props.theme.sidebar.footer.background};\n`;\n\nconst BadgeIcon = styled(Badge)`\n color: ${(props) => props.theme.sidebar.footer.background};\n`;\n\n// const FooterBadgeBuzy = styled(Badge)`\n// margin-right: ${(props) => props.theme.spacing(1)};\n// span {\n// background-color: ${(props) => props.theme.sidebar.footer.buzy.background};\n// border: 1.5px solid ${(props) => props.theme.palette.common.white};\n// height: 12px;\n// width: 12px;\n// border-radius: 50%;\n// }\n// `;\n\nconst SidebarFooter = ({ ...rest }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const { data } = useSelector((state) => state.pauseUnpause);\n const { todaysChat } = useSelector((state) => state.socketsSlice);\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const [current, setCurrent] = React.useState([]);\n const [notification, setNotification] = React.useState(0);\n const [pause, setPause] = React.useState(\"online\");\n const LogOut = async () => {\n // alert(\"hi\");\n handleLogoutAddClickOpen();\n await dispatch(fetchLogOut());\n await dispatch(fetchLoginLogOut_Socket());\n await dispatch(logout());\n\n navigate(\"/\");\n };\n\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n }, [dispatch]);\n\n React.useEffect(() => {\n setCurrent([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 0 &&\n item.chatAssign.map(\n (agentData) =>\n agentData.assignee_id === user.uid &&\n parseInt(item.status) === 0 &&\n setCurrent((current) => [...current, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setNotification(0);\n !!current &&\n current.map(\n (item) =>\n !!item &&\n !!item.unReadmessages &&\n item.unReadmessages.length > 0 &&\n setNotification(\n (notification) => notification + item.unReadmessages.length\n )\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [todaysChat]);\n\n React.useEffect(() => {\n setNotification(0);\n !!current &&\n current.map(\n (item) =>\n !!item &&\n !!item.unReadmessages &&\n item.unReadmessages.length > 0 &&\n setNotification(\n (notification) => notification + item.unReadmessages.length\n )\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [todaysChat]);\n\n // console.log(\"current == \", JSON.stringify(current));\n // console.log(\"notification == \", notification);\n\n React.useEffect(() => {\n dispatch(fetchPause());\n }, [dispatch]);\n\n React.useEffect(() => {\n var status = !!data && data.isAvailable === 1 ? \"online\" : \"pause\";\n setPause(status);\n }, [data]);\n\n var [users, setAgent] = React.useState(\"\");\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [localStorage.getItem(\"user\")]);\n\n const [anchorEl, setAnchorEl] = React.useState(null);\n const open = Boolean(anchorEl);\n const handleClick = (event) => {\n setAnchorEl(event.currentTarget);\n };\n const handleClose = () => {\n setAnchorEl(null);\n };\n // close menu\n const ChangeStatus = async (paused) => {\n var status = paused === \"online\" ? \"pause\" : \"online\";\n setPause(status);\n await dispatch(ChangePauseState(status));\n await dispatch(fetchLoginLogOut_Socket());\n };\n\n // show chat Profile\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleAddClickOpen = () => {\n setOpenAdd({\n Open: true,\n fileData: \"\",\n });\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n fileData: \"\",\n });\n };\n\n // show logout Process\n const [openLogoutAdd, setOpenLogoutAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleLogoutAddClickOpen = () => {\n setOpenLogoutAdd({\n Open: true,\n fileData: \"\",\n });\n };\n\n // const handleLogoutAddClose = () => {\n // setOpenAdd({\n // Open: false,\n // fileData: \"\",\n // });\n // };\n return (\n \n );\n};\n\nexport default SidebarFooter;\n","import React, { forwardRef } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { NavLink } from \"react-router-dom\";\nimport { rgba, darken } from \"polished\";\n\nimport { Chip, Collapse, ListItemButton, ListItemText } from \"@mui/material\";\nimport { ExpandLess, ExpandMore } from \"@mui/icons-material\";\n\nconst CustomRouterLink = forwardRef((props, ref) => (\n \n \n
\n));\n\nconst Item = styled(ListItemButton)`\n padding-top: ${(props) =>\n props.theme.spacing(props.depth && props.depth > 0 ? 2 : 3)};\n padding-bottom: ${(props) =>\n props.theme.spacing(props.depth && props.depth > 0 ? 2 : 3)};\n padding-left: ${(props) =>\n props.theme.spacing(props.depth && props.depth > 0 ? 14 : 8)};\n padding-right: ${(props) =>\n props.theme.spacing(props.depth && props.depth > 0 ? 4 : 7)};\n font-weight: ${(props) => props.theme.typography.fontWeightRegular};\n svg {\n color: ${(props) => props.theme.sidebar.color};\n font-size: 40px;\n width: 80px;\n height: 20px;\n opacity: 1;\n }\n &:hover {\n background: rgba(0, 0, 0, 0.08);\n color: ${(props) => props.theme.sidebar.color};\n }\n &.${(props) => props.activeclassname} {\n background-color: ${(props) =>\n darken(0.03, props.theme.sidebar.background)};\n span {\n color: ${(props) => props.theme.sidebar.color};\n }\n }\n`;\n\nconst Title = styled(ListItemText)`\n margin: 0;\n span {\n color: ${(props) =>\n rgba(\n props.theme.sidebar.color,\n props.depth && props.depth > 0 ? 0.7 : 1\n )};\n font-size: ${(props) => props.theme.typography.body1.fontSize}px;\n padding: 0 ${(props) => props.theme.spacing(4)};\n }\n`;\n\nconst Badge = styled(Chip)`\n font-weight: ${(props) => props.theme.typography.fontWeightBold};\n height: 20px;\n position: absolute;\n right: 26px;\n top: 12px;\n background: ${(props) => props.theme.sidebar.badge.background};\n z-index: 1;\n span.MuiChip-label,\n span.MuiChip-label:hover {\n font-size: 11px;\n cursor: pointer;\n color: ${(props) => props.theme.sidebar.badge.color};\n padding-left: ${(props) => props.theme.spacing(2)};\n padding-right: ${(props) => props.theme.spacing(2)};\n }\n`;\n\nconst ExpandLessIcon = styled(ExpandLess)`\n color: ${(props) => rgba(props.theme.sidebar.color, 0.5)};\n`;\n\nconst ExpandMoreIcon = styled(ExpandMore)`\n color: ${(props) => rgba(props.theme.sidebar.color, 0.5)};\n`;\n\nconst SidebarNavListItem = (props) => {\n const {\n title,\n href,\n depth = 0,\n children,\n icon: Icon,\n badge,\n open: openProp = false,\n keyIndex,\n } = props;\n\n const [open, setOpen] = React.useState(openProp);\n\n const handleToggle = () => {\n setOpen((state) => !state);\n };\n\n if (children) {\n return (\n \n - \n {Icon && }\n \n {title}\n {badge && }\n \n {open ? : }\n
\n {children}\n \n );\n }\n\n return (\n \n - \n {Icon && }\n \n {title}\n {badge && }\n \n
\n \n );\n};\n\nexport default SidebarNavListItem;\n","import React from \"react\";\nimport { matchPath } from \"react-router-dom\";\n\nimport SidebarNavListItem from \"./SidebarNavListItem\";\nimport SidebarNavList from \"./SidebarNavList\";\n\nconst reduceChildRoutes = (props) => {\n const { items, page, depth, currentRoute, i } = props;\n if (page.children) {\n const open = page.href\n ? !!matchPath(\n {\n path: page.href,\n end: false,\n },\n currentRoute\n )\n : false;\n\n // !!role &&\n // role === \"638f1029a1c0997b2085c2a2\" && page.href=== \"/\"\n items.push(\n \n \n \n );\n } else {\n items.push(\n \n );\n }\n\n return items;\n};\n\nexport default reduceChildRoutes;\n","import React from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nimport reduceChildRoutes from \"./reduceChildRoutes\";\n\nconst SidebarNavList = (props) => {\n const { pages, depth } = props;\n const router = useLocation();\n const currentRoute = router.pathname;\n const childRoutes = pages.reduce(\n (items, page, i) =>\n reduceChildRoutes({ items, page, currentRoute, depth, i }),\n []\n );\n return {childRoutes};\n};\n\nexport default SidebarNavList;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport { Typography } from \"@mui/material\";\n\nimport SidebarNavList from \"./SidebarNavList\";\n\n// color: ${(props) => props.theme.sidebar.color};\n// opacity: 0.4;\nconst Title = styled(Typography)`\n color: ${(props) => props.theme.sidebar.color};\n font-size: ${(props) => props.theme.typography.caption.fontSize};\n padding: ${(props) => props.theme.spacing(4)}\n ${(props) => props.theme.spacing(7)} ${(props) => props.theme.spacing(1)};\n text-transform: uppercase;\n display: block;\n`;\n\nconst SidebarNavSection = (props) => {\n const {\n title,\n pages,\n className,\n component: Component = \"nav\",\n ...rest\n } = props;\n\n return (\n \n {title && {title}}\n \n \n );\n};\n\nexport default SidebarNavSection;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport ReactPerfectScrollbar from \"react-perfect-scrollbar\";\nimport { List } from \"@mui/material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\n\nimport SidebarNavSection from \"./SidebarNavSection\";\n\nimport \"../../vendor/perfect-scrollbar.css\";\n\nconst baseScrollbar = (props) => css`\n background-color: ${props.theme.sidebar.background};\n border-right: 1px solid rgba(0, 0, 0, 0.12);\n flex-grow: 1;\n`;\n\nconst Scrollbar = styled.div`\n ${baseScrollbar}\n`;\n\nconst PerfectScrollbar = styled(ReactPerfectScrollbar)`\n ${baseScrollbar}\n`;\n\nconst Items = styled.div`\n padding-top: ${(props) => props.theme.spacing(2.5)};\n padding-bottom: ${(props) => props.theme.spacing(2.5)};\n`;\n\nconst SidebarNav = ({ items }) => {\n const theme = useTheme();\n const matches = useMediaQuery(theme.breakpoints.up(\"md\"));\n const ScrollbarComponent = matches ? PerfectScrollbar : Scrollbar;\n return (\n \n \n \n {items &&\n items.map((item, i) => (\n // !!role && role === \"638f1029a1c0997b2085c2a2\"\n \n ))}\n \n
\n \n );\n};\n\nexport default SidebarNav;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { NavLink } from \"react-router-dom\";\n\nimport {\n Drawer as MuiDrawer,\n ListItemButton,\n ImageListItem,\n} from \"@mui/material\";\n\n// import { ReactComponent as Logo } from \"../../vendor/favicon.svg\";\nimport Footer from \"./SidebarFooter\";\nimport SidebarNav from \"./SidebarNav\";\nimport { io } from \"socket.io-client\";\nimport { basePathConfig } from \"../../config\";\nimport { fun_TodaysChat } from \"../../redux/slices/socketsSlice\";\nimport { useDispatch } from \"react-redux\";\n\nconst Drawer = styled(MuiDrawer)`\n border-right: 0;\n\n > div {\n border-right: 0;\n }\n`;\n//background - color: ${ (props) => props.theme.sidebar.header.background };\n// color: ${ (props) => props.theme.sidebar.header.color };\n// background - color: ${ (props) => props.theme.sidebar.header.background };\n\nconst Brand = styled(ListItemButton)`\n font-size: ${(props) => props.theme.typography.h5.fontSize};\n font-weight: ${(props) => props.theme.typography.fontWeightMedium};\n color: \"#000\";\n background-color: \"#fff\";\n font-family: ${(props) => props.theme.typography.fontFamily};\n min-height: 56px;\n padding-left: ${(props) => props.theme.spacing(6)};\n padding-right: ${(props) => props.theme.spacing(6)};\n justify-content: center;\n cursor: pointer;\n flex-grow: 0;\n border-right: 1px solid rgba(0, 0, 0, 0.12);\n\n ${(props) => props.theme.breakpoints.up(\"sm\")} {\n min-height: 64px;\n }\n\n &:hover {\n background-color: \"#fff\";\n }\n`;\n\n// const BrandIcon = styled(Logo)`\n// margin-right: ${(props) => props.theme.spacing(2)};\n// color: ${(props) => props.theme.sidebar.header.brand.color};\n// fill: ${(props) => props.theme.sidebar.header.brand.color};\n// width: 55px;\n// height: 55px;\n// `;\n\nconst Sidebar = ({ user, items, domainFetch, showFooter = true, ...rest }) => {\n const dispatch = useDispatch();\n var socket = React.useRef(null);\n React.useEffect(() => {\n socket.current = io(basePathConfig.socketURL, {\n reconnectionDelayMax: 10000,\n });\n socket.current.on(\"connect\", () => {\n console.info(\n `Successfully connected to socket ${basePathConfig.socketURL}`\n );\n });\n\n socket.current.on(\"todaysChat\", (data) => {\n //console.log(\"todaysChat == data == \", JSON.stringify(data));\n dispatch(fun_TodaysChat(data));\n });\n\n return () => {\n socket.current.disconnect();\n };\n }, [dispatch, socket]);\n\n return (\n \n {/* \n \n */}\n \n {domainFetch?.data?.logo_url && (\n \n
\n \n )}\n \n\n \n {!!showFooter && }\n \n );\n};\n\nexport default Sidebar;\n","import * as React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Grid,\n List,\n ListItemText as MuiListItemText,\n ListItemButton as MuiListItemButton,\n} from \"@mui/material\";\n\nconst Wrapper = styled.div`\n padding: ${(props) => props.theme.spacing(0.25)}\n ${(props) => props.theme.spacing(4)};\n background: ${(props) => props.theme.footer.background};\n position: fixed;\n bottom: 0;\n`;\n\nconst ListItemButton = styled(MuiListItemButton)`\n display: inline-block;\n width: 100vw;\n padding-left: ${(props) => props.theme.spacing(2)};\n padding-right: ${(props) => props.theme.spacing(2)};\n\n &,\n &:hover,\n &:active {\n color: #ff0000;\n }\n`;\n\nconst ListItemText = styled(MuiListItemText)`\n span {\n color: ${(props) => props.theme.footer.color};\n }\n`;\n\nfunction Footer({ domainFetch }) {\n return (\n \n \n \n {/* \n \n \n \n \n \n \n \n \n \n \n \n \n
*/}\n \n \n \n \n \n \n
\n \n \n \n );\n}\n\nexport default Footer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\nexport const fetchAllDomainData = createAsyncThunk(\n \"fetchAllDomainData/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/sub_admin/whitelist_solution`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// Find Whitelist_Solution by domain\nexport const fetchSingleDomainData = createAsyncThunk(\n \"fetchSingleDomainData/fetch\",\n async (domainName) => {\n try {\n // const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n // const accountID = localStorage.getItem(\"atua\");\n const payload = {\n domain: domainName,\n };\n // if (!!bearer_token && !!accountID) {\n const res = await axios.post(\n `${basePathConfig.baseURL}/sub_admin/whitelist_solution/fetchbydomain`,\n payload\n );\n return await res.data.data;\n // } else {\n // return { message: \"Unauthorized\", status: 401 };\n // }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// Find Whitelist_Solution by _id\nexport const fetchSingleDomainDataVia_id = createAsyncThunk(\n \"fetchSingleDomainDataVia_id/fetch\",\n async (id) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/sub_admin/whitelist_solution/fetchbydomain/${id}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// Create Whitelist_Solution\nexport const createDomainData = createAsyncThunk(\n \"createDomainData/fetch\",\n async (payloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/sub_admin/whitelist_solution`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nconst initialState = {\n domainFetchSingleDataViaDomain: {\n data: {},\n status: \"\",\n error: {},\n },\n domainFetchSingleDataViaId: {\n data: {},\n status: \"\",\n error: {},\n },\n domainFetchAllData: {\n data: {},\n status: \"\",\n error: {},\n },\n domainAddData: {\n data: {},\n status: \"\",\n error: {},\n },\n domainDeleteData: {\n data: {},\n status: \"\",\n error: {},\n },\n domainEditData: {\n data: {},\n status: \"\",\n error: {},\n },\n};\n\nexport const whitelistsolutionSlice = createSlice({\n name: \"customer\",\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllDomainData.pending, (state) => {\n // fetch All Domains\n state.domainFetchAllData = {\n status: \"loading\",\n data: {},\n error: {},\n };\n })\n .addCase(fetchAllDomainData.fulfilled, (state, action) => {\n if (action.payload.error) {\n state.domainFetchAllData = {\n status: \"failed\",\n data: {},\n error: action.payload.error,\n };\n } else {\n state.domainFetchAllData = {\n status: \"succeeded\",\n data: action.payload,\n error: {},\n };\n }\n })\n .addCase(fetchAllDomainData.rejected, (state, action) => {\n state.domainFetchAllData = {\n status: \"failed\",\n data: {},\n error: action.payload,\n };\n })\n .addCase(fetchSingleDomainData.pending, (state) => {\n // fetch Single Domains via domain\n state.domainFetchSingleDataViaDomain = {\n status: \"loading\",\n data: {},\n error: {},\n };\n })\n .addCase(fetchSingleDomainData.fulfilled, (state, action) => {\n if (action.payload.error) {\n state.domainFetchSingleDataViaDomain = {\n status: \"failed\",\n data: {},\n error: action.payload.error,\n };\n } else {\n state.domainFetchSingleDataViaDomain = {\n status: \"succeeded\",\n data: action.payload,\n error: {},\n };\n }\n })\n .addCase(fetchSingleDomainData.rejected, (state, action) => {\n state.domainFetchSingleDataViaDomain = {\n status: \"failed\",\n data: {},\n error: action.payload,\n };\n })\n .addCase(fetchSingleDomainDataVia_id.pending, (state) => {\n // fetch Single Domains via id\n state.domainFetchSingleDataViaId = {\n status: \"loading\",\n data: {},\n error: {},\n };\n })\n .addCase(fetchSingleDomainDataVia_id.fulfilled, (state, action) => {\n if (action.payload.error) {\n state.domainFetchSingleDataViaId = {\n status: \"failed\",\n data: {},\n error: action.payload.error,\n };\n } else {\n state.domainFetchSingleDataViaId = {\n status: \"succeeded\",\n data: action.payload,\n error: {},\n };\n }\n })\n .addCase(fetchSingleDomainDataVia_id.rejected, (state, action) => {\n state.domainFetchSingleDataViaId = {\n status: \"failed\",\n data: {},\n error: action.payload,\n };\n })\n .addCase(createDomainData.pending, (state) => {\n // add Domains\n state.domainAddData = {\n status: \"loading\",\n data: {},\n error: {},\n };\n })\n .addCase(createDomainData.fulfilled, (state, action) => {\n if (action.payload.error) {\n state.domainAddData = {\n status: \"failed\",\n data: {},\n error: action.payload.error,\n };\n } else {\n state.domainAddData = {\n status: \"succeeded\",\n data: action.payload,\n error: {},\n };\n }\n })\n .addCase(createDomainData.rejected, (state, action) => {\n state.domainAddData = {\n status: \"failed\",\n data: {},\n error: action.payload,\n };\n });\n },\n});\n\nexport default whitelistsolutionSlice.reducer;\n","import React, { useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Outlet } from \"react-router-dom\";\n\nimport { Box, CssBaseline, Paper as MuiPaper } from \"@mui/material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { spacing } from \"@mui/system\";\n\nimport GlobalStyle from \"../components/GlobalStyle\";\nimport Navbar from \"../components/navbar/Navbar\";\n//import dashboardItems from \"../components/sidebar/dashboardItems\";\nimport dashboardItemsAdmin from \"../components/sidebar/dashboardItemsAdmin\";\nimport dashboardItemsAgent from \"../components/sidebar/dashboardItemsAgent\";\n\nimport Sidebar from \"../components/sidebar/Sidebar\";\nimport Footer from \"../components/Footer\";\nimport { useNavigate } from \"react-router-dom\";\nimport { fetchSingleDomainData } from \"../redux/slices/whitelistsolutionSlice\";\nimport { useDispatch, useSelector } from \"react-redux\";\n\nconst drawerWidth = 90;\n\nconst Root = styled.div`\n display: flex;\n min-height: 100vh;\n`;\n\nconst Drawer = styled.div`\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n width: ${drawerWidth}px;\n flex-shrink: 0;\n }\n`;\n\nconst AppContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n`;\n\nconst Paper = styled(MuiPaper)(spacing);\n\nconst MainContent = styled(Paper)`\n flex: 1;\n background: ${(props) => props.theme.palette.background.default};\n\n @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n flex: none;\n }\n\n .MuiPaper-root .MuiPaper-root {\n box-shadow: none;\n }\n`;\n\nconst Dashboard = ({ children }) => {\n const [mobileOpen, setMobileOpen] = useState(false);\n const navigate = useNavigate();\n const role = localStorage.getItem(\"atur\");\n //console.log(\"Dashboard role == \", role);\n\n const dispatch = useDispatch();\n const domainFetchSingleDataViaDomain = useSelector(\n (state) => state.whitelistsolution.domainFetchSingleDataViaDomain\n );\n\n const domainName = window.location.hostname;\n //console.log(\"\\n domainName == \", domainName);\n // console.log(\n // \"\\n\\n domainFetchSingleDataViaDomain == \",\n // JSON.stringify(domainFetchSingleDataViaDomain)\n // );\n\n React.useEffect(() => {\n dispatch(fetchSingleDomainData(domainName));\n }, [dispatch, domainName]);\n\n React.useEffect(() => {\n localStorage.setItem(\"awlid\", domainFetchSingleDataViaDomain?.data?._id);\n localStorage.setItem(\n \"awlogo\",\n domainFetchSingleDataViaDomain?.data?.logo_url ??\n \"https://liveagentapp.s3.ap-northeast-1.amazonaws.com/uploads/1733225729490_sample_link.png\"\n );\n }, [domainFetchSingleDataViaDomain, domainName]);\n\n const handleDrawerToggle = () => {\n setMobileOpen(!mobileOpen);\n };\n\n const theme = useTheme();\n const isLgUp = useMediaQuery(theme.breakpoints.up(\"lg\"));\n\n const [user, setUser] = React.useState([]);\n\n React.useEffect(() => {\n const items = localStorage.getItem(\"user\");\n const atua = localStorage.getItem(\"atua\");\n if (atua) {\n setUser(items);\n } else {\n navigate(\"/\");\n }\n }, [navigate]);\n\n return (\n \n \n \n \n {/* \n \n \n \n \n */}\n \n {!!role && role === \"638f1029a1c0997b2085c2a2\" ? (\n \n ) : (\n \n )}\n \n \n {!!role && role === \"638f1029a1c0997b2085c2a2\" ? (\n \n ) : (\n \n )}\n \n \n \n \n \n {children}\n \n \n \n \n \n );\n};\n\nexport default Dashboard;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport const agentOtherDataSlice = createSlice({\n name: \"agentOtherData\",\n initialState: {\n agentRole: \"638f1029a1c0997b2085c2a2\",\n },\n reducers: {\n loginRole: (state, action) => {\n state.agentRole = action.payload.role;\n },\n },\n extraReducers: (builder) => {},\n});\n\nexport const { loginRole, setAgentRole } = agentOtherDataSlice.actions;\nexport default agentOtherDataSlice.reducer;\n","import React from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"@emotion/styled\";\nimport { Link } from \"react-router-dom\";\nimport * as Yup from \"yup\";\nimport { Formik } from \"formik\";\n\nimport {\n IconButton as MuiIconButton,\n Alert as MuiAlert,\n Checkbox,\n FormControlLabel,\n Button,\n TextField as MuiTextField,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport {\n Visibility as VisibilityIcon,\n VisibilityOff as VisibilityOffIcon,\n} from \"@mui/icons-material\";\nimport { fetchLogin, fetchLoginLogOut_Socket } from \"../../redux/slices/login\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { chatConversationIdClear } from \"../../redux/slices/chatSettings\";\nimport { loginRole } from \"../../redux/slices/agentOtherDataSlice\";\n\nconst Alert = styled(MuiAlert)(spacing);\nconst IconButton = styled(MuiIconButton)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\n\nfunction SignIn() {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const [showPassword, setShowPassword] = React.useState(false);\n const { data: login } = useSelector((state) => state.login);\n const role = localStorage.getItem(\"atur\");\n const accessToken = localStorage.getItem(\"accessToken\");\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n React.useEffect(() => {\n if (!!accessToken) {\n navigate(\"/chat\");\n } else {\n navigate(\"/\");\n }\n }, [accessToken, navigate]);\n\n return (\n {\n try {\n var palyload = {\n email: values.email,\n password: values.password,\n };\n await dispatch(fetchLogin(palyload));\n await dispatch(fetchLoginLogOut_Socket());\n await dispatch(chatConversationIdClear());\n await dispatch(loginRole({ role: role }));\n //navigate(\"/chat\");\n //await (parseInt(login.status) === 200 && navigate(\"/chat\"));\n } catch (error) {\n const message = error.message || \"Something went wrong\";\n alert(message);\n setStatus({ success: false });\n setErrors({ submit: message });\n setSubmitting(false);\n }\n }}\n >\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n }) => (\n \n )}\n \n );\n}\n\nexport default SignIn;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Helmet } from \"react-helmet-async\";\n\nimport {\n // Avatar,\n Paper,\n ImageListItem,\n //Typography,\n} from \"@mui/material\";\n\n// import { ReactComponent as Logo } from \"../../vendor/1spoc-logo.svg\";\nimport SignInComponent from \"../../components/auth/SignIn\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchSingleDomainData } from \"../../redux/slices/whitelistsolutionSlice\";\n\n// const Brand = styled(Logo)`\n// fill: ${(props) => props.theme.palette.primary.main};\n// width: 250px;\n// height: 64px;\n// margin-bottom: 32px;\n// `;\n\nconst Wrapper = styled(Paper)`\n padding: ${(props) => props.theme.spacing(6)};\n\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n padding: ${(props) => props.theme.spacing(10)};\n }\n`;\n\n// const BigAvatar = styled(Avatar)`\n// width: 92px;\n// height: 92px;\n// text-align: center;\n// margin: 0 auto ${(props) => props.theme.spacing(5)};\n// `;\n\nfunction SignIn() {\n const dispatch = useDispatch();\n const domainFetchSingleDataViaDomain = useSelector(\n (state) => state.whitelistsolution.domainFetchSingleDataViaDomain\n );\n\n const domainName = window.location.hostname;\n console.log(\"\\n\\n Dashboard domainName == \" + domainName);\n\n React.useEffect(() => {\n dispatch(fetchSingleDomainData(domainName));\n }, [dispatch, domainName]);\n\n React.useEffect(() => {\n localStorage.setItem(\"awlid\", domainFetchSingleDataViaDomain?.data?._id);\n }, [domainFetchSingleDataViaDomain, domainName]);\n\n // console.log(\n // \"domainFetchSingleDataViaDomain == \" +\n // JSON.stringify(domainFetchSingleDataViaDomain)\n // );\n\n // const [user, setUser] = React.useState([]);\n\n // React.useEffect(() => {\n // const items = JSON.parse(localStorage.getItem(\"user\"));\n // if (items) {\n // setUser(items);\n // }\n // }, []);\n return (\n \n {/* */}\n\n {/* */}\n\n {domainFetchSingleDataViaDomain?.data?.logo_url &&\n domainFetchSingleDataViaDomain?.data?.signIn_logo_url && (\n \n
\n \n )}\n\n \n \n {/* {!!user && }\n \n Welcome back {!!user && user.displayname}!\n */}\n {/* \n Sign in to your account to continue\n */}\n\n \n \n \n );\n}\n\nexport default SignIn;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Link } from \"react-router-dom\";\nimport { Helmet } from \"react-helmet-async\";\n\nimport { Button as MuiButton, Typography } from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nconst Button = styled(MuiButton)(spacing);\n\nconst Wrapper = styled.div`\n padding: ${(props) => props.theme.spacing(6)};\n text-align: center;\n background: transparent;\n\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n padding: ${(props) => props.theme.spacing(10)};\n }\n`;\n\nfunction Page404() {\n return (\n \n \n \n 404\n \n \n Page not found.\n \n \n The page you are looking for might have been removed.\n \n\n \n \n );\n}\n\nexport default Page404;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch all labels Data\nexport const fetchPreviousConversation = createAsyncThunk(\n \"previousConversation/fetch\",\n async (contactID) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n var payload = {\n account_id: accountID,\n contact_id: contactID,\n };\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/contactPreviousHistory`,\n payload,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all company Attributes Data\nexport const fetchAllcompanyAttributes = createAsyncThunk(\n \"companyAttribute/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/custom-attribute/mode/0`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all company Attributes Data\nexport const fetchAllAgentStatus = createAsyncThunk(\n \"AgentStatus/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/account_agent/account/${accountID}/available_status`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all company Attributes Data\nexport const fetchJoinChatStatus = createAsyncThunk(\n \"chatStatus/post\",\n async (conversationId) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/conversation/${conversationId}/chat-assign`,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n// fetch join chat agent details Data\nexport const fetchJoinChatAgentStatus = createAsyncThunk(\n \"chatAgentStatus/fetch\",\n async (conversationId) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n var bodyPayload = {\n conversation_id: conversationId,\n account_id: accountID,\n };\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/agent_status_joincall`,\n bodyPayload,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const conversationalActionsSlice = createSlice({\n name: \"conversationalAction\",\n initialState: {\n previousHistory: [],\n companyAttribute: [],\n agentStatus: [],\n joinChatStatus: [],\n joinChatAgentStatus: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchPreviousConversation.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchPreviousConversation.fulfilled, (state, action) => {\n state.previousHistory = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchPreviousConversation.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.previousHistory = [];\n })\n .addCase(fetchAllcompanyAttributes.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllcompanyAttributes.fulfilled, (state, action) => {\n state.companyAttribute = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllcompanyAttributes.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.companyAttribute = [];\n })\n .addCase(fetchAllAgentStatus.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllAgentStatus.fulfilled, (state, action) => {\n state.agentStatus = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllAgentStatus.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.agentStatus = [];\n })\n .addCase(fetchJoinChatStatus.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchJoinChatStatus.fulfilled, (state, action) => {\n state.joinChatStatus = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchJoinChatStatus.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.joinChatStatus = [];\n })\n .addCase(fetchJoinChatAgentStatus.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchJoinChatAgentStatus.fulfilled, (state, action) => {\n state.joinChatAgentStatus = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchJoinChatAgentStatus.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.joinChatAgentStatus = [];\n });\n },\n});\n\nexport const {\n setPreviousHistory,\n setStatus,\n setCompanyAttribute,\n setAgentStatus,\n setJoinChatStatus,\n setJoinChatAgentStatus,\n} = conversationalActionsSlice.actions;\nexport default conversationalActionsSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Badge,\n Card,\n CardContent,\n Dialog,\n DialogContentText,\n DialogTitle,\n DialogContent,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography as MuiTypography,\n CircularProgress as MuiCircularProgress,\n Button,\n Select,\n MenuItem,\n FormControl,\n Divider as MuiDivider,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAllAgentStatus } from \"../../../../../redux/slices/conversationalActions\";\nimport { fun_LoginLogout } from \"../../../../../redux/slices/socketsSlice\";\nimport QueueIcon from \"@mui/icons-material/Queue\";\nconst Typography = styled(MuiTypography)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\n\nconst ListContainer = styled(List)`\n overflow-y: scroll;\n height: calc(80vh - 94px);\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n`;\n\nconst Online = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst NoConversation = styled(`div`)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n width: 100%;\n text-align: center;\n position: relative;\n font-size: 1rem;\n`;\nconst MessageIcons = styled(QueueIcon)`\n font-size: 4rem;\n color: ${(props) => props.theme.sidebar.footer.online.background};\n`;\nconst QueueList = ({ QueueChatsList, socket }) => {\n const dispatch = useDispatch();\n const { agentStatus } = useSelector((state) => state.conversationalAction);\n const { loginLogoutData, todaysChat } = useSelector(\n (state) => state.socketsSlice\n );\n const roleID = localStorage.getItem(\"atur\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n var [loginStatus, setLoginStatus] = React.useState([]);\n var [chatListData, setChatListData] = React.useState([]);\n const [selfQueue, setSelfQueue] = React.useState(false);\n const [selfQueueClose, setSelfQueueClose] = React.useState(true);\n var [role, setRole] = React.useState(1);\n const [selAgent, setSelAgent] = React.useState(\"\");\n\n React.useEffect(() => {\n !!roleID && setRole(roleID === \"638f1032a1c0997b2085c2a6\" ? 1 : 0);\n }, [roleID]);\n\n React.useEffect(() => {\n !!QueueChatsList && setChatListData(QueueChatsList);\n }, [QueueChatsList]);\n React.useEffect(() => {\n dispatch(fetchAllAgentStatus());\n }, [dispatch]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n }, [dispatch]);\n\n React.useEffect(() => {\n !!agentStatus && setLoginStatus(agentStatus);\n }, [agentStatus]);\n\n React.useEffect(() => {\n !!loginLogoutData && setLoginStatus(loginLogoutData);\n }, [loginLogoutData]);\n\n React.useEffect(() => {\n setChatListData([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 0 &&\n item.chatAssign.map((chatitem) =>\n setChatListData((chatListData) => [...chatListData, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n const handleChange = (event) => {\n setSelAgent(event.target.value);\n };\n\n const handleSelfAssign = (item, user) => {\n setSelfQueue(true);\n setSelfQueueClose(false);\n var msg = `This conversation is selfed assign by ${user.displayname}`;\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: !!item && item.channel_id,\n bot_id: !!item && item.bot_id,\n org_id: !!item && item.org_id,\n account_id: !!item && item.account_id,\n conversation_id:\n !!item && item.chatAssign[0] && item.chatAssign[0].conversation_id,\n agent_id: user.uid,\n agentName: \"\",\n assign_id: user.uid,\n contact_id: !!item && item.contact_id,\n contact: !!item && item.contactDetails[0],\n label_id: \"\",\n role: role,\n message: [\n {\n content_type: 14,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n setTimeout(() => {\n setSelfQueueClose(true);\n setSelfQueue(false);\n }, 2000);\n };\n\n const handleAssignToOther = (item, user) => {\n setSelfQueue(true);\n setSelfQueueClose(false);\n var msg = `This conversation is assigned by ${user.displayname}`;\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: !!item && item.channel_id,\n bot_id: !!item && item.bot_id,\n org_id: !!item && item.org_id,\n account_id: !!item && item.account_id,\n conversation_id:\n !!item && item.chatAssign[0] && item.chatAssign[0].conversation_id,\n agent_id: user.uid,\n agentName: \"\",\n assign_id: selAgent,\n contact_id: !!item && item.contact_id,\n contact: !!item && item.contactDetails[0],\n label_id: \"\",\n role: role,\n message: [\n {\n content_type: 14,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n setTimeout(() => {\n setSelfQueueClose(true);\n setSelfQueue(false);\n }, 2000);\n };\n\n return (\n <>\n \n\n \n \n {!!chatListData && chatListData.length !== 0 ? (\n <>\n \n {role === 0 && (\n \n )}\n \n \n \n {!!chatListData &&\n chatListData.map((item, i) => (\n \n \n \n \n \n \n 10\n ? item.channel_id\n .split(\"_\")[0]\n .toString()\n .substring(0, 15) + \"...\"\n : item.channel_id.split(\"_\")[0]\n }\n />\n \n {!!selAgent && selAgent.length > 0 && (\n \n )}\n \n ))}\n \n >\n ) : (\n \n \n Uh oh! Looks like there are no messages in queue.\n \n )}\n {/* \n {role === 0 && (\n \n )}\n \n \n \n {!!chatListData &&\n chatListData.map((item, i) => (\n \n \n \n \n \n \n \n \n {!!selAgent && selAgent.length > 0 && (\n \n )}\n \n ))}\n */}\n \n \n >\n );\n};\nconst QueueChats = ({ openAdd, handleAddClose, socket }) => {\n return (\n <>\n \n >\n );\n};\n\nexport default QueueChats;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Badge,\n Card,\n CardContent,\n Dialog,\n DialogContentText,\n DialogTitle,\n DialogContent,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAllAgentStatus } from \"../../../../../redux/slices/conversationalActions\";\nimport { fun_LoginLogout } from \"../../../../../redux/slices/socketsSlice\";\nimport QueueIcon from \"@mui/icons-material/Queue\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ListContainer = styled(List)`\n overflow-y: scroll;\n height: calc(80vh - 94px);\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n`;\n\nconst Online = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst NoConversation = styled(`div`)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n width: 100%;\n text-align: center;\n position: relative;\n font-size: 1rem;\n`;\nconst MessageIcons = styled(QueueIcon)`\n font-size: 4rem;\n color: ${(props) => props.theme.sidebar.footer.online.background};\n`;\n\nconst QueueConfirmationList = ({ QueueChatsList, socket }) => {\n const dispatch = useDispatch();\n const { todaysChat } = useSelector((state) => state.socketsSlice);\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const role = localStorage.getItem(\"atur\");\n var [chatListData, setChatListData] = React.useState([]);\n\n React.useEffect(() => {\n !!QueueChatsList && setChatListData(QueueChatsList);\n }, [QueueChatsList]);\n React.useEffect(() => {\n dispatch(fetchAllAgentStatus());\n }, [dispatch]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n }, [dispatch]);\n\n React.useEffect(() => {\n setChatListData([]);\n !!role && role === \"638f1029a1c0997b2085c2a2\"\n ? !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item, i) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 1 &&\n // item.chatAssign[].assignee_id === user.uid &&\n item.chatAssign.map((chatitem) =>\n //chatitem.assignee_id === user.uid &&\n setChatListData((chatListData) => [...chatListData, item])\n )\n )\n : !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item, i) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 1 &&\n // item.chatAssign[].assignee_id === user.uid &&\n item.chatAssign.map(\n (chatitem) =>\n chatitem.assignee_id === user.uid &&\n setChatListData((chatListData) => [...chatListData, item])\n )\n );\n }, [role, todaysChat, user.uid]);\n\n return (\n <>\n \n \n {!!chatListData && chatListData.length !== 0 ? (\n <>\n \n {!!chatListData &&\n chatListData.map((item, i) => (\n \n \n \n \n \n \n 10\n ? item.channel_id\n .split(\"_\")[0]\n .toString()\n .substring(0, 15) + \"...\"\n : item.channel_id.split(\"_\")[0]\n }\n />\n \n {`This conversation assigned to ${item.chatAssign[0].agentData[0].name}`}\n \n \n ))}\n \n >\n ) : (\n \n \n Uh oh! Looks like there are no messages in queue.\n \n )}\n \n \n >\n );\n};\nconst QueueConfirmationChats = ({\n openAssigedQueueAdd,\n handleAddAssigedQueueClose,\n socket,\n}) => {\n return (\n <>\n \n >\n );\n};\n\nexport default QueueConfirmationChats;\n","import axios from \"axios\";\n\nconst axiosInstance = axios.create();\n\naxiosInstance.interceptors.response.use(\n (response) => response,\n (error) =>\n Promise.reject(\n (error.response && error.response.data) || \"Something went wrong\"\n )\n);\n\nexport default axiosInstance;\n","import jwtDecode from \"jwt-decode\";\nimport { verify, sign } from \"jsonwebtoken\";\nimport axios from \"./axios\";\n\nconst isValidToken = (accessToken) => {\n if (!accessToken) {\n return false;\n }\n const decoded = jwtDecode(accessToken);\n const currentTime = Date.now() / 1000;\n\n return decoded.exp > currentTime;\n};\n\nconst handleTokenExpired = (exp) => {\n let expiredTimer;\n window.clearTimeout(expiredTimer);\n const currentTime = Date.now();\n //const timeLeft = exp * 100 - currentTime;\n const timeLeft = exp * 1000 - currentTime;\n\n console.log(timeLeft);\n console.log(\"currentTime == \", currentTime);\n console.log(\"exp * 10000 == \", exp * 100);\n expiredTimer = window.setTimeout(() => {\n console.log(\"Session expired\");\n window.location.href = \"/\";\n }, timeLeft);\n};\n\nconst setSession = (accessToken) => {\n if (accessToken) {\n localStorage.setItem(\"accessToken\", accessToken);\n axios.defaults.headers.common.Authorization = `Bearer ${accessToken}`;\n // This function below will handle when token is expired\n const { exp } = jwtDecode(accessToken);\n handleTokenExpired(exp);\n } else {\n localStorage.removeItem(\"accessToken\");\n delete axios.defaults.headers.common.Authorization;\n }\n};\n\nexport { verify, sign, isValidToken, setSession };\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n List,\n ListItemButton,\n ListItemText as MuiListItemText,\n ListItemIcon,\n} from \"@mui/material\";\nimport { useSelector, useDispatch } from \"react-redux\";\n//import useSound from \"use-sound\";\nimport { fetchTodayschat } from \"../../../../redux/slices/socketsSlice\";\nimport { chatSettingsList } from \"../../../../redux/slices/chatSettings\";\nimport QueueChats from \"../rightPannel/conversationalActions/QueueChats\";\nimport QueueConfirmationChats from \"../rightPannel/conversationalActions/QueueConfirmationChats\";\nimport { isValidToken } from \"../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n//import notificationSound from \"../../audio/notification.mp3\";\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst LiButton = styled(ListItemButton)`\n color: ${(props) => props.theme.palette.secondary.main};\n font-weight: ${(props) => props.theme.typography.fontWeightBoldTop};\n`;\n\nconst LiIcon = styled(ListItemIcon)`\n color: ${(props) => props.theme.palette.secondary.main};\n font-weight: ${(props) => props.theme.typography.fontWeightBoldMediam};\n`;\n\nconst ConversationsList = ({ socket }) => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n //const [sendingSPlay] = useSound(notificationSound);\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const role = localStorage.getItem(\"atur\");\n // const { mute } = useSelector((state) => state.chatSettings);\n const { todaysChat } = useSelector((state) => state.socketsSlice);\n\n const [current, setCurrent] = React.useState([]);\n const [resolved, setResolved] = React.useState([]);\n const [allChat, setAllChat] = React.useState([]);\n const [queueChat, setQueueChat] = React.useState([]);\n const [queueConfirmChat, setQueueConfirmChat] = React.useState([]);\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n setCurrent([]);\n setResolved([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 0 &&\n item.chatAssign.map(\n (agentItem) =>\n agentItem.assignee_id === user.uid &&\n (parseInt(item.status) === 0\n ? setCurrent((current) => [...current, item])\n : setResolved((resolved) => [...resolved, item]))\n )\n );\n // mute === true && sendingSPlay();\n //sendingSPlay();\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setAllChat([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 0 &&\n item.chatAssign.map(\n (chatItem) =>\n chatItem.assignee_id === user.uid &&\n setAllChat((allChat) => [...allChat, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setQueueChat([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 0 &&\n item.chatAssign.map((chatItem) =>\n //chatItem.assignee_id === user.uid &&\n setQueueChat((queueChat) => [...queueChat, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setQueueConfirmChat([]);\n\n !!role && role === \"638f1029a1c0997b2085c2a2\"\n ? !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 1 &&\n item.chatAssign.map((chatItem) =>\n // chatItem.assignee_id === user.uid &&\n setQueueConfirmChat((queueChat) => [...queueChat, item])\n )\n )\n : !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 1 &&\n item.chatAssign.map(\n (chatItem) =>\n chatItem.assignee_id === user.uid &&\n setQueueConfirmChat((queueChat) => [...queueChat, item])\n )\n );\n }, [role, todaysChat, user.uid]);\n\n // show Queue chat\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleAddClickOpen = (item) => {\n setOpenAdd({\n Open: true,\n data: item,\n });\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n });\n };\n\n // show Assiged Queue chat\n const [openAssigedQueueAdd, setOpenAssigedQueueAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleAddClickOpenAssigedQueue = (item) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setOpenAssigedQueueAdd({\n Open: true,\n data: item,\n });\n }\n };\n\n const handleAddCloseAssigedQueue = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setOpenAssigedQueueAdd({\n Open: false,\n data: \"\",\n });\n }\n };\n const handleSettingList = (Name, dataName) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(chatSettingsList({ name: Name, data: dataName }));\n }\n };\n return (\n <>\n \n {\n handleSettingList(\"Current\", current);\n }}\n >\n \n {!!current ? current.length : 0}\n \n {\n handleSettingList(\"Resolved\", resolved);\n }}\n >\n \n {!!resolved ? resolved.length : 0}\n \n {\n handleSettingList(\"All\", allChat);\n }}\n >\n \n {!!allChat ? allChat.length : 0}\n \n\n {\n handleAddClickOpen(queueChat);\n }}\n >\n \n {!!queueChat ? queueChat.length : 0}\n \n {\n handleAddClickOpenAssigedQueue(queueConfirmChat);\n }}\n >\n \n {!!queueConfirmChat ? queueConfirmChat.length : 0}\n \n
\n\n \n\n \n >\n );\n};\n\nexport default ConversationsList;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box as MuiBox,\n Chip,\n Divider as MuiDivider,\n ListItemButton,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { green } from \"@mui/material/colors\";\nimport ConversationsList from \"./ConversationsList\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst Box = styled(MuiBox)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Brand = styled(ListItemButton)`\n font-size: ${(props) => props.theme.typography.h5.fontSize};\n font-weight: ${(props) => props.theme.typography.fontWeightMedium};\n color: ${(props) => props.theme.sidebar.header.color};\n font-family: ${(props) => props.theme.typography.fontFamily};\n min-height: 40px;\n padding-right: ${(props) => props.theme.spacing(6)};\n justify-content: center;\n flex-grow: 0;\n margin-bottom: -14px;\n padding-top: 14px;\n\n ${(props) => props.theme.breakpoints.up(\"sm\")} {\n min-height: 40px;\n }\n`;\nconst BrandChip = styled(Chip)`\n background-color: ${green[700]};\n border-radius: 5px;\n color: ${(props) => props.theme.palette.common.white};\n font-size: 55%;\n height: 18px;\n margin-left: 2px;\n margin-top: -16px;\n padding: 3px 0;\n\n span {\n padding-left: ${(props) => props.theme.spacing(1.375)};\n padding-right: ${(props) => props.theme.spacing(1.375)};\n }\n`;\n\nconst LeftChatPannel = ({ socket }) => {\n return (\n <>\n \n \n \n Live-Agent \n \n \n \n \n \n \n Today`s conversations\n \n\n \n \n >\n );\n};\n\nexport default LeftChatPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Badge,\n InputBase,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Avatar,\n IconButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n} from \"@mui/material\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport {\n chatConversation,\n chatSettingsList,\n fetchCurrentChat,\n} from \"../../../../redux/slices/chatSettings\";\nimport { fetchTodayschat } from \"../../../../redux/slices/socketsSlice\";\nimport moment from \"moment\";\nimport { isValidToken } from \"../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Typography = styled(MuiTypography)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n color: ${(props) => props.theme.palette.secondary.main};\n`;\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nconst Online = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst ListContainer = styled(List)`\n overflow-y: scroll;\n height: 80vh;\n`;\nvar chatFilterListData = [];\nconst ChatSidebar = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { chatList, conversationId } = useSelector(\n (state) => state.chatSettings\n );\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const { todaysChat } = useSelector((state) => state.socketsSlice);\n\n const [current, setCurrent] = React.useState([]);\n const [resolved, setResolved] = React.useState([]);\n const [allChat, setAllChat] = React.useState([]);\n const [queueChat, setQueueChat] = React.useState([]);\n //const [queueChat, setQueueChat] = React.useState([]);\n\n var [chatListData, setChatListData] = React.useState([]);\n\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n }, [dispatch]);\n\n React.useEffect(() => {\n setCurrent([]);\n setResolved([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 0 &&\n item.chatAssign.map(\n (agentData) =>\n agentData.assignee_id === user.uid &&\n (parseInt(item.status) === 0\n ? setCurrent((current) => [...current, item])\n : setResolved((resolved) => [...resolved, item]))\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setAllChat([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 0 &&\n item.chatAssign.map(\n (chatitem) =>\n chatitem.assignee_id === user.uid &&\n setAllChat((allChat) => [...allChat, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n setQueueChat([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n !!item.chatAssign &&\n parseInt(item.is_queue_chat) === 1 &&\n parseInt(item.is_queue_confirm) === 0 &&\n item.chatAssign.map(\n (chatitem) =>\n chatitem.assignee_id === user.uid &&\n setQueueChat((queueChat) => [...queueChat, item])\n )\n );\n }, [todaysChat, user.uid]);\n\n React.useEffect(() => {\n chatList === \"\" && setChatListData(current);\n !!chatList &&\n chatList === \"Current\" &&\n !!current &&\n setChatListData(current);\n !!chatList &&\n chatList === \"Resolved\" &&\n !!resolved &&\n setChatListData(resolved);\n !!chatList && chatList === \"All\" && !!allChat && setChatListData(allChat);\n !!chatList &&\n chatList === \"Queue\" &&\n !!queueChat &&\n setChatListData(queueChat);\n }, [allChat, chatList, current, queueChat, resolved]);\n\n React.useEffect(() => {\n dispatch(chatSettingsList({ name: chatList, data: chatListData }));\n }, [chatList, chatListData, dispatch]);\n\n const getConversationDetails = (item) => {\n // console.log(\n // \"getConversationDetails ChatSidebar item == \",\n // JSON.stringify(item)\n // );\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n !!item &&\n dispatch(\n chatConversation({\n conStatus: item.status,\n conversationId: item._id,\n botId: !!item.bot_id && item.bot_id,\n orgId: !!item.org_id && item.org_id,\n agentId:\n !!item.chatAssign[0].assignee_id &&\n item.chatAssign[0].assignee_id,\n channelId: !!item.channel_id && item.channel_id,\n contactId: !!item.contact_id && item.contact_id,\n contactData: item.contactDetails[0],\n recipientID: !!item.recipient_id && item.recipient_id,\n })\n );\n !!item && dispatch(fetchCurrentChat(item._id));\n }\n };\n\n // Search Conversation by Name\n var [search, getSearch] = React.useState(\"\");\n\n chatFilterListData =\n search === \"\"\n ? chatListData\n : chatListData.filter((i) =>\n i.contactDetails[0].name.toLowerCase().includes(search.toLowerCase())\n );\n\n return (\n <>\n \n \n \n \n {\n getSearch(e.target.value);\n }}\n />\n \n \n \n {chatList} ({chatFilterListData.length})\n \n \n \n \n {!!chatFilterListData &&\n chatFilterListData.length > 0 &&\n chatFilterListData.map((item, i) =>\n !!conversationId && conversationId === item._id ? (\n {\n getConversationDetails(item);\n }}\n className=\"selected\"\n >\n \n \n \n \n \n \n {item.contactDetails && item.contactDetails[0].name\n ? item.contactDetails[0].name\n : \"\"}\n \n }\n secondary={\n item.channel_id && item.channel_id.split(\"_\")[0].length > 10\n ? item.channel_id\n .split(\"_\")[0]\n .toString()\n .substring(0, 11) + \"...\"\n : item.channel_id.split(\"_\")[0]\n }\n style={{ display: \"block\", maxWidth: \"180px\" }}\n />\n {!!item &&\n !!item.unReadmessages &&\n item.unReadmessages.length > 0 ? (\n \n \n {moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n ) > 0\n ? (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n )\n ).slice(-2) + \" hours ago\"\n : (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"minutes\"\n )\n ).slice(-2) + \" mins ago\"}\n \n }\n secondary={\n !!item &&\n !!chatList &&\n chatList === \"All\" &&\n (parseInt(item.status) === 0 ? \"Current\" : \"Resolved\")\n }\n />\n \n ) : (\n \n \n {moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n ) > 0\n ? (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n )\n ).slice(-2) + \" hours ago\"\n : (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"minutes\"\n )\n ).slice(-2) + \" mins ago\"}\n \n }\n secondary={\n !!item &&\n !!chatList &&\n chatList === \"All\" &&\n (parseInt(item.status) === 0 ? \"Current\" : \"Resolved\")\n }\n />{\" \"}\n \n )}\n \n ) : (\n {\n getConversationDetails(item);\n }}\n >\n \n \n 0\n ? item.contactDetails[0].name\n : \"\"\n }\n src={\n !!item.contactDetails.length &&\n item.contactDetails.length > 0\n ? item.contactDetails[0].photo\n : \"\"\n }\n />\n \n \n \n {item.contactDetails && item.contactDetails[0].name\n ? item.contactDetails[0].name\n : \"\"}\n \n }\n secondary={\n item.channel_id && item.channel_id.split(\"_\")[0].length > 10\n ? item.channel_id\n .split(\"_\")[0]\n .toString()\n .substring(0, 11) + \"...\"\n : item.channel_id.split(\"_\")[0]\n }\n style={{ display: \"block\", maxWidth: \"180px\" }}\n />\n {!!item &&\n !!item.unReadmessages &&\n item.unReadmessages.length > 0 ? (\n \n \n {moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n ) > 0\n ? (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n )\n ).slice(-2) + \" hours ago\"\n : (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"minutes\"\n )\n ).slice(-2) + \" mins ago\"}\n \n }\n secondary={\n !!item &&\n !!chatList &&\n chatList === \"All\" &&\n (parseInt(item.status) === 0 ? \"Current\" : \"Resolved\")\n }\n />\n \n ) : (\n \n \n {moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n ) > 0\n ? (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"hours\"\n )\n ).slice(-2) + \" hours ago\"\n : (\n \"0\" +\n moment(new Date()).diff(\n moment(item.chatAssign[0].updated_at),\n \"minutes\"\n )\n ).slice(-2) + \" mins ago\"}\n \n }\n secondary={\n !!item &&\n !!chatList &&\n chatList === \"All\" &&\n (parseInt(item.status) === 0 ? \"Current\" : \"Resolved\")\n }\n />{\" \"}\n \n )}\n \n )\n )}\n \n >\n );\n};\n\nexport default ChatSidebar;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// sendmail\nexport const sendCurrentChatMail = createAsyncThunk(\n \"sendCurrentChatMail/post\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n // const smtp_id = localStorage.getItem(\"awlid\");\n\n var bodyData = {\n account_id: accountID,\n conversation_id: payload.conversation_id,\n email: payload.email,\n timeZone: payload.timeZone,\n smtp_id: payload.smtp_id,\n };\n\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/mailtranscripts`,\n bodyData,\n config\n );\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nvar initialState = {\n data: [],\n status: STATUSES.SUCCESS,\n};\nexport const sendMailPreviousChatSlice = createSlice({\n name: \"sendMail_PreviousChat\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(sendCurrentChatMail.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(sendCurrentChatMail.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(sendCurrentChatMail.rejected, (state, action) => {\n state.data = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setData, setStatus, reset } = sendMailPreviousChatSlice.actions;\nexport default sendMailPreviousChatSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Alert as MuiAlert,\n CircularProgress as MuiCircularProgress,\n Dialog,\n DialogContent,\n DialogContentText,\n //Divider as MuiDivider,\n DialogTitle,\n DialogActions,\n TextField,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n reset,\n sendCurrentChatMail,\n} from \"../../../../../redux/slices/sendMailPreviousChat\";\nconst Alert = styled(MuiAlert)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst SendMail = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n const dispatch = useDispatch();\n const { data } = useSelector((state) => state.sendMail_PreviousChat);\n\n const [sendEmail, setSendEmail] = React.useState(\"\");\n const [isLoading, setIsLoading] = React.useState(false);\n const [isError, setIsError] = React.useState(false);\n const [errors, setErrors] = React.useState(\"\");\n\n const SendMail = async () => {\n const { timeZone } = Intl.DateTimeFormat().resolvedOptions();\n const smtp_id = localStorage.getItem(\"awlid\");\n //console.log(timeZone);\n setIsLoading(true);\n try {\n var payload = {\n conversation_id: openAdd.conversation_id,\n email: sendEmail,\n timeZone: timeZone,\n smtp_id: smtp_id,\n };\n await dispatch(sendCurrentChatMail(payload));\n setIsLoading(false);\n setIsError(false);\n } catch (error) {\n setIsLoading(false);\n setIsError(true);\n setErrors(\"Error \");\n }\n await timeOut(4000);\n await dispatch(reset());\n setSendEmail(\"\");\n };\n return (\n \n );\n};\nexport default SendMail;\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\n\nexport const fetchBotLogs = createAsyncThunk(\n \"botlogs/fetchBotLogs\",\n async (dataPayload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const response = await fetch(`${basePathConfig.baseURL}/botlogs`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: bearer_token,\n },\n body: JSON.stringify(dataPayload),\n });\n\n const responseData = await response.json();\n return responseData;\n } catch (error) {\n return Promise.reject(error.message);\n }\n }\n);\n\nconst initialState = {\n botLogsFetchData: {\n data: {},\n status: \"\",\n error: {},\n },\n};\n\nexport const botlogsSlice = createSlice({\n name: \"botlogs\",\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchBotLogs.pending, (state) => {\n // fetch\n state.botLogsFetchData = {\n status: \"loading\",\n data: {},\n error: {},\n };\n })\n .addCase(fetchBotLogs.fulfilled, (state, action) => {\n if (action.payload.error) {\n state.botLogsFetchData = {\n status: \"failed\",\n data: {},\n error: action.payload.error,\n };\n } else {\n state.botLogsFetchData = {\n status: \"succeeded\",\n data: action.payload,\n error: {},\n };\n }\n })\n .addCase(fetchBotLogs.rejected, (state, action) => {\n state.botLogsFetchData = {\n status: \"failed\",\n data: {},\n error: action.payload,\n };\n });\n },\n});\n\nexport default botlogsSlice.reducer;\n","import React from \"react\";\nimport Accordion from \"@mui/material/Accordion\";\nimport AccordionSummary from \"@mui/material/AccordionSummary\";\nimport AccordionDetails from \"@mui/material/AccordionDetails\";\n//import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport ListIcon from \"@mui/icons-material/List\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport FormControl from \"@mui/material/FormControl\";\n// import { Divider as MuiDivider } from \"@mui/material\";\n\nconst BotInteractiveList = ({ data }) => {\n return (\n <>\n {data?.content?.bodyText && {data?.content?.bodyText}}\n \n }\n aria-controls=\"panel1-content\"\n id=\"panel1-header\"\n >\n {data?.content?.openButtonText && (\n \n {data?.content?.openButtonText}\n \n )}\n \n \n {/* */}\n \n \n {data?.content?.list?.map((item, index) => (\n }\n label={item?.listTitle}\n labelPlacement=\"start\"\n disabled\n />\n ))}\n \n \n \n \n >\n );\n};\n\nexport default BotInteractiveList;\n","import React from \"react\";\n//import { styled } from \"@mui/material/styles\";\nimport Card from \"@mui/material/Card\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport CardMedia from \"@mui/material/CardMedia\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardActions from \"@mui/material/CardActions\";\nimport Typography from \"@mui/material/Typography\";\nimport Button from \"@mui/material/Button\";\nimport ButtonGroup from \"@mui/material/ButtonGroup\";\nimport Box from \"@mui/material/Box\";\n\nconst BotInteractiveButton = ({ data }) => {\n return (\n <>\n \n {data?.content?.headerText && (\n \n )}\n {data?.content?.mediaUrl && data?.content?.mediaType === \"image\" && (\n \n )}\n {data?.content?.url && data?.content?.mediaType === \"image\" && (\n \n )}\n {data?.content?.mediaUrl && data?.content?.mediaType === \"document\" && (\n \n )}\n {data?.content?.url && data?.content?.mediaType === \"document\" && (\n \n )}\n {data?.content?.mediaUrl && data?.content?.mediaType === \"audio\" && (\n \n \n \n )}\n\n {data?.content?.url && data?.content?.mediaType === \"audio\" && (\n \n \n \n )}\n\n {data?.content?.mediaUrl && data?.content?.mediaType === \"video\" && (\n \n \n \n )}\n\n {data?.content?.url && data?.content?.mediaType === \"video\" && (\n \n \n \n )}\n\n {data?.content?.bodyText && (\n \n \n {data?.content?.bodyText}\n \n \n )}\n {data?.content?.footerText && (\n {data?.content?.footerText}\n )}\n \n\n {data?.content?.buttons && (\n \n \n {data?.content?.buttons &&\n data?.content?.buttons?.map((item, index) => (\n \n ))}\n \n \n )}\n >\n );\n};\n\nexport default BotInteractiveButton;\n","import React, { Component } from \"react\";\n\nclass ErrorBoundary extends Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n componentDidCatch(error, errorInfo) {\n console.error(\"Error caught in ErrorBoundary:\", error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return Something went wrong.
;\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n","import { Card, CardContent } from \"@mui/material\";\nimport React from \"react\";\nimport Box from \"@mui/material/Box\";\nimport CardMedia from \"@mui/material/CardMedia\";\nimport PictureAsPdfIcon from \"@mui/icons-material/PictureAsPdf\";\nimport Typography from \"@mui/material/Typography\";\nimport ErrorBoundary from \"./ErrorBoundary\";\n\nconst SelectedBotInteractiveButton = ({ data, lastdata }) => {\n // Function to limit words\n const limitWords = (text, limit) => {\n if (!text) return \"\"; // Return empty if there's no text\n const words = text.split(\" \"); // Split the text into words\n return words.length > limit\n ? words.slice(0, limit).join(\" \") + \"...\"\n : text; // Limit the words\n };\n return (\n <>\n \n \n \n \n {lastdata?.data?.content &&\n lastdata?.data?.content?.bodyText &&\n limitWords(lastdata?.data?.content?.bodyText, 6)}\n\n {lastdata?.data?.data &&\n lastdata?.data?.data?.title &&\n limitWords(lastdata?.data?.data?.title, 6)}\n \n \n \n {lastdata?.data?.content &&\n lastdata?.data?.content?.mediaUrl &&\n lastdata?.data?.content?.mediaType === \"image\" && (\n \n )}\n {lastdata?.data?.content &&\n lastdata?.data?.content?.mediaUrl &&\n lastdata?.data?.content?.mediaType === \"video\" && (\n \n )}\n\n {lastdata?.data?.content &&\n lastdata?.data?.content?.url &&\n lastdata?.data?.content?.mediaType === \"video\" && (\n \n )}\n {lastdata?.data?.content &&\n lastdata?.data?.content?.mediaUrl &&\n lastdata?.data?.content?.mediaType === \"Audio\" && (\n \n \n \n )}\n\n {lastdata?.data?.content &&\n lastdata?.data?.content?.url &&\n lastdata?.data?.content?.mediaType === \"Audio\" && (\n \n \n \n )}\n {lastdata?.data?.content &&\n lastdata?.data?.content?.mediaType === \"document\" && (\n \n )}\n \n \n \n {data?.data?.title ?? data?.data ?? data ?? \"No Data Available\"}\n \n \n >\n );\n};\n\nexport default SelectedBotInteractiveButton;\n","import React from \"react\";\nimport { Typography, Box } from \"@mui/material\";\n\nconst BotFormInput = ({ data }) => {\n console.log(\"data == \" + JSON.stringify(data));\n\n return (\n <>\n \n test\n {data?.data &&\n Object.entries(data.data).map(([key, value], index) => (\n \n {`${key}: ${value}`} {\"\\n\"}\n \n ))}\n \n >\n );\n};\n\nexport default BotFormInput;\n","import React from \"react\";\nimport { Card, CardMedia } from \"@mui/material\";\n\nconst BotDocument = ({ data }) => {\n return (\n <>\n {data?.type === \"document\" && data?.mimeType.split(\"/\")[0] === \"image\" && (\n \n \n \n )}\n {data?.type === \"document\" &&\n data?.mimeType.split(\"/\")[0] === \"application\" && (\n \n )}\n {data?.type === \"document\" && data?.mimeType.split(\"/\")[0] === \"audio\" && (\n \n \n \n )}\n {data?.type === \"document\" && data?.mimeType.split(\"/\")[0] === \"video\" && (\n \n \n \n )}\n >\n );\n};\n\nexport default BotDocument;\n","import React from \"react\";\nimport BotInteractiveList from \"./BotInteractiveList\";\nimport BotInteractiveButton from \"./BotInteractiveButton\";\n//import SelectedBotInteractiveList from \"./SelectedBotInteractiveList\";\nimport SelectedBotInteractiveButton from \"./SelectedBotInteractiveButton\";\nimport BotFormInput from \"./BotFormInput\";\nimport BotDocument from \"./BotDocument\";\n\nconst BotContainer = ({ type, data, lastdata }) => {\n return (\n <>\n {type === \"listNode\" && }\n {type === \"mediaNode\" && }\n {type === \"whatsAppFlowsNode\" && }\n {type === \"document\" && }\n {type === \"text\" && data?.data}\n {type === \"documentCognitionNode\" && data?.content}\n {type === \"flows-input\" && }\n {type === \"plainMessageTextNode\" && data?.content}\n {type === \"liveAgentNode\" && data?.content}\n {type === \"interactive\" && (\n \n )}\n {type === \"buttonNode\" && }\n {type !== \"listNode\" &&\n type !== \"text\" &&\n type !== \"document\" &&\n type !== \"plainMessageTextNode\" &&\n type !== \"interactive\" &&\n type !== \"liveAgentNode\" &&\n type !== \"buttonNode\" &&\n type !== \"mediaNode\" &&\n type !== \"flows-input\" &&\n type !== \"documentCognitionNode\" &&\n type !== \"whatsAppFlowsNode\" &&\n type}\n >\n );\n};\n\nexport default BotContainer;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport {\n Avatar,\n Box,\n Button,\n Card,\n CardContent,\n ListItem,\n ListItemIcon,\n ListItemText,\n Dialog,\n DialogContent,\n DialogContentText,\n DialogTitle,\n DialogActions,\n} from \"@mui/material\";\n\n// import botObj from \"./botObj\";\nimport BotContainer from \"./BotContainer\";\nimport moment from \"moment\";\nimport { useSelector } from \"react-redux\";\n\nconst BotLogsHistory = ({\n openBotAdd,\n handleAddBotClose,\n handleAddBotClickOpen,\n}) => {\n const contentRef = useRef(null);\n const { botLogsFetchData } = useSelector((state) => state.botlogs);\n const [contactData, setContactData] = useState({});\n const [channelId, setChannelId] = useState(\"\");\n\n const [data, setData] = useState([]);\n\n // Validation function to check if contactData is valid\n const validateContactData = (data) => {\n return data && typeof data === \"object\" && Object.keys(data).length > 0;\n };\n\n //setData(botObj?.logs);\n useEffect(() => {\n botLogsFetchData?.data && botLogsFetchData?.data?.data?.logs?.length > 0\n ? setData(botLogsFetchData?.data?.data?.logs)\n : setData([]);\n }, [botLogsFetchData]);\n\n useEffect(() => {\n // Check if openBotAdd is valid and has contactData\n if (openBotAdd && validateContactData(openBotAdd.contactData)) {\n setContactData(openBotAdd.contactData); // Set valid contactData\n } else {\n setContactData({}); // Reset contactData if invalid\n }\n }, [openBotAdd]);\n\n useEffect(() => {\n // Check if openBotAdd is valid and has contactData\n if (openBotAdd && openBotAdd.channelId) {\n setChannelId(openBotAdd.channelId); // Set valid contactData\n } else {\n setChannelId(\"\"); // Reset contactData if invalid\n }\n }, [openBotAdd]);\n\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n\n return date.isSame(moment(), \"day\")\n ? date.format(\"hh:mm A\")\n : date.format(\"MMM-DD hh:mm A\");\n };\n\n return (\n <>\n \n >\n );\n};\n\nexport default BotLogsHistory;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Badge,\n ListItem,\n ListItemIcon,\n ListItemText,\n Button,\n} from \"@mui/material\";\nimport * as Icon from \"react-feather\";\nimport Check from \"@mui/icons-material/Check\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n muteUnmute,\n chatConversatioStatus,\n //resolveCurrentChat,\n} from \"../../../../redux/slices/chatSettings\";\nimport SendMail from \"./conversationalActions/SendMail\";\nimport { fetchTodayschat } from \"../../../../redux/slices/socketsSlice\";\nimport { fetchBotLogs } from \"../../../../redux/slices/botLogsSlice\";\nimport BotLogsHistory from \"./conversationalActions/BotHistory/BotLogsHistory\";\nimport ThreePIcon from \"@mui/icons-material/ThreeP\";\n\nconst Online = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst LItemIcon = styled(ListItemIcon)`\n cursor: pointer;\n`;\n\nconst ChatHeader = ({ socket }) => {\n const dispatch = useDispatch();\n const {\n conversationId,\n botId,\n orgId,\n channelId,\n contactId,\n mute,\n contactData,\n conStatus,\n recipientID,\n } = useSelector((state) => state.chatSettings);\n\n const { todaysChat } = useSelector((state) => state.socketsSlice);\n const user = JSON.parse(localStorage.getItem(\"user\"));\n var [chatAssignee, setChatAssignee] = React.useState(\"\");\n var [chatAssigneeCount, setChatAssigneeCount] = React.useState(0);\n var [agent, setAgent] = React.useState(\"\");\n var [resolveData, setResolveData] = React.useState(\"resolve\");\n var [recipntID, setRecipntID] = React.useState(\"\");\n\n React.useEffect(() => {\n !!recipientID && setRecipntID(recipientID);\n }, [recipientID]);\n\n const handleMuteUnmute = (muteData) => {\n dispatch(muteUnmute(muteData));\n };\n\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n }, [dispatch]);\n\n React.useEffect(() => {\n setChatAssignee(\"\");\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n item._id === conversationId &&\n dispatch(chatConversatioStatus({ conStatus: item.status }))\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [todaysChat]);\n\n React.useEffect(() => {\n setChatAssignee(\"\");\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n item._id === conversationId &&\n setChatAssignee(item.chatAssign[0].assignee_id)\n );\n }, [todaysChat, conversationId]);\n //console.log(\"contactData == \", contactData);\n // check chat asignee Count\n React.useEffect(() => {\n setChatAssigneeCount([]);\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n item._id === conversationId &&\n setChatAssigneeCount(item.chatAssign.length)\n );\n }, [todaysChat, conversationId]);\n\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n // Resolved\n React.useEffect(() => {\n var status = conStatus > 0 ? \"resolved\" : \"resolve\";\n setResolveData(status);\n }, [conStatus, conversationId]);\n\n const sendResolvedMessage = async () => {\n var msg = `This conversation is resolved by ${agent.displayname} `;\n\n var messagePayload = {\n data: {\n flag: \"end\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n assign_id: \"\",\n contact_id: contactId,\n contact: contactData,\n message: [\n {\n content_type: 1,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n\n const ChangeResolveStatus = async (resolved) => {\n var status = resolved === \"resolve\" ? \"resolved\" : \"resolve\";\n setResolveData(status);\n await sendResolvedMessage();\n };\n // Resolved Close\n\n // send Mail\n const [openAdd, setOpenAdd] = React.useState({\n conversation_id: \"\",\n Open: false,\n });\n const handleAddClickOpen = (conversation_id) => {\n setOpenAdd({\n conversation_id: conversation_id,\n Open: true,\n });\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n conversation_id: \"\",\n Open: false,\n });\n };\n\n // Bot Logs History\n const [openBotAdd, setOpenBotAdd] = React.useState({\n conversation_id: \"\",\n channelId: \"\",\n contactData: {},\n Open: false,\n });\n\n const handleAddBotClickOpen = (\n conversation_id,\n recipient_id,\n bot_Id,\n org_Id,\n channel_Id\n ) => {\n const payload = {\n conversationID: conversation_id,\n recipientID: recipient_id,\n accountID: localStorage.getItem(\"atua\"),\n orgID: org_Id,\n channelID: channel_Id,\n botID: bot_Id,\n };\n dispatch(fetchBotLogs(payload));\n setOpenBotAdd({\n conversation_id: conversation_id,\n channelId: channelId,\n contactData: contactData,\n Open: true,\n });\n };\n\n const handleAddBotClose = () => {\n setOpenBotAdd({\n conversation_id: \"\",\n channelId: \"\",\n contactData: {},\n Open: false,\n });\n };\n return (\n <>\n \n \n \n \n \n \n \n {/* */}\n {!!mute && mute === true ? (\n {\n handleMuteUnmute(false);\n }}\n >\n \n \n ) : (\n {\n handleMuteUnmute(true);\n }}\n >\n \n \n )}\n\n \n handleAddClickOpen(conversationId)} />\n \n\n \n {/* {\n // dispatch(chatConversatioStatus({ conStatus: 1 }));\n // }}\n /> */}\n \n handleAddBotClickOpen(\n conversationId,\n recipntID,\n botId,\n orgId,\n channelId\n )\n }\n />\n \n\n {!!chatAssigneeCount && chatAssigneeCount > 1 ? (\n !!resolveData && resolveData === \"resolved\" ? (\n }\n >\n Resolved\n \n ) : (\n }\n onClick={() => {\n ChangeResolveStatus(resolveData);\n }}\n >\n Resolve\n \n )\n ) : (\n !!chatAssignee &&\n chatAssignee === user.uid &&\n (!!resolveData && resolveData === \"resolved\" ? (\n }\n >\n Resolved\n \n ) : (\n }\n onClick={() => {\n ChangeResolveStatus(resolveData);\n }}\n >\n Resolve\n \n ))\n )}\n \n\n \n \n >\n );\n};\n\nexport default ChatHeader;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch all labels Data\nexport const fetchContacts = createAsyncThunk(\"account/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/contacts`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\n// fetch all labels Data\nexport const UpdateContacts = createAsyncThunk(\n \"account/update\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n var bodyData = {\n name: payload.name,\n company_name: payload.company_name,\n email: payload.email,\n phone_number: payload.phone_number,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/accounts/${accountID}/contact/${payload._id}/contact_update`,\n bodyData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nvar initialState = {\n data: [],\n updateData: [],\n status: STATUSES.SUCCESS,\n};\nexport const contactSlice = createSlice({\n name: \"contact\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchContacts.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchContacts.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchContacts.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(UpdateContacts.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(UpdateContacts.fulfilled, (state, action) => {\n state.updateData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(UpdateContacts.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setContacts, setStatus, setUpdateData, reset } =\n contactSlice.actions;\nexport default contactSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Alert,\n Avatar as MuiAvatar,\n Button as MuiButton,\n Card,\n CardContent,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n Typography as MuiTypography,\n TextField as MuiTextField,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { UpdateContacts, reset } from \"../../../../../redux/slices/contact\";\nimport { fetchCurrentChat } from \"../../../../../redux/slices/chatSettings\";\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Centered = styled.div`\n text-align: center;\n`;\nconst Avatar = styled(MuiAvatar)`\n display: inline-block;\n height: 80px;\n width: 80px;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst EditContactDetails = ({ onClose, selectedValue, open }) => {\n const { updateData } = useSelector((state) => state.contact);\n const [name, setName] = React.useState(\"\");\n const [companyName, setCompanyName] = React.useState(\"\");\n const [email, setEmail] = React.useState(\"\");\n const [phoneNo, setPhoneNo] = React.useState(\"\");\n const [photo, setPhoto] = React.useState(\"\");\n const {\n conversationId,\n //reset_fileData,\n } = useSelector((state) => state.chatSettings);\n\n React.useEffect(() => {\n !!selectedValue && setName(selectedValue.name);\n !!selectedValue && setCompanyName(selectedValue.company_name);\n !!selectedValue && setEmail(selectedValue.email);\n !!selectedValue && setPhoneNo(selectedValue.phone_number);\n !!selectedValue && setPhoto(selectedValue.photo);\n }, [selectedValue]);\n const handleClose = () => {\n onClose();\n };\n\n const dispatch = useDispatch();\n const fun_update = async () => {\n var payload = {\n _id: !!selectedValue && selectedValue._id,\n name: name,\n company_name: companyName,\n email: email,\n phone_number: phoneNo,\n };\n\n await dispatch(UpdateContacts(payload));\n !!conversationId && dispatch(fetchCurrentChat(conversationId));\n await timeOut(3000);\n await dispatch(reset());\n };\n return (\n \n );\n};\n\nexport default EditContactDetails;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Avatar,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography as MuiTypography,\n} from \"@mui/material\";\n//import { Edit, Mail, Phone, Share } from \"@mui/icons-material\";\nimport { Edit, Mail, Phone } from \"@mui/icons-material\";\nimport AccountBalanceIcon from \"@mui/icons-material/AccountBalance\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport EditContactDetails from \"./conversationalActions/EditContactDetails\";\nimport { fun_LoginLogout } from \"../../../../redux/slices/socketsSlice\";\nimport { chatConversation } from \"../../../../redux/slices/chatSettings\";\n\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n color: ${(props) => props.theme.palette.secondary.main};\n`;\nconst ChatAction = styled(`span`)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n border-radius: 10px;\n margin-right: 20px;\n cursor: pointer;\n`;\n\nconst ContactDetails = ({ socket }) => {\n const dispatch = useDispatch();\n // conversationId\n const { contactData, conversationId } = useSelector(\n (state) => state.chatSettings\n );\n const { contactUpdateData, todaysChat } = useSelector(\n (state) => state.socketsSlice\n );\n\n const [contact, setContact] = React.useState([]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n !!contactUpdateData && setContact(contactUpdateData[0]);\n }, [contactUpdateData]);\n React.useEffect(() => {\n !!contactData && setContact(contactData);\n }, [contactData]);\n\n React.useEffect(() => {\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) => item._id === conversationId && getConversationDetails(item)\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationId, todaysChat]);\n\n const getConversationDetails = (item) => {\n !!item &&\n dispatch(\n chatConversation({\n conStatus: item.status,\n conversationId: item._id,\n botId: !!item.bot_id && item.bot_id,\n orgId: !!item.org_id && item.org_id,\n agentId:\n !!item.chatAssign[0].assignee_id && item.chatAssign[0].assignee_id,\n channelId: !!item.channel_id && item.channel_id,\n contactId: !!item.contact_id && item.contact_id,\n contactData: item.contactDetails[0],\n })\n );\n };\n // Open Dialogbox\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = () => {\n setOpen(true);\n };\n\n const handleClose = (value) => {\n setOpen(false);\n };\n\n return (\n <>\n \n \n \n \n \n \n \n \n {!!contact && contact.name}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* \n \n */}\n \n
\n \n >\n );\n};\n\nexport default ContactDetails;\n","/* eslint-disable jsx-a11y/alt-text */\nimport React from \"react\";\nimport \"./ZoomableImage.css\";\nconst ImageZoom = ({ src, zoom }) => {\n return (\n \n
\n

\n
\n
\n );\n};\n\nexport default ImageZoom;\n","import React from \"react\";\n//import styled from \"@emotion/styled\";\nimport {\n Button,\n Card,\n //CardMedia as MuiCardMedia,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from \"@mui/material\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport AddIcon from \"@mui/icons-material/Add\";\nimport RemoveIcon from \"@mui/icons-material/Remove\";\nimport { Player } from \"video-react\";\nimport AudioPlayer from \"react-h5-audio-player\";\nimport ImageZoom from \"./ImageZoom\";\n//import html2canvas from \"html2canvas\";\nconst ChatMediaDialog = ({ openAdd, handleClickClose }) => {\n const [scale, setScale] = React.useState(1);\n const handleClose = () => {\n setScale(1);\n handleClickClose();\n };\n\n const handleZoomIn = () => {\n setScale(scale + 0.1);\n };\n\n const handleZoomOut = () => {\n if (scale > 0.2) {\n setScale(scale - 0.1);\n }\n };\n return (\n <>\n \n >\n );\n};\n\nexport default ChatMediaDialog;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\n//import { Player } from \"video-react\";\nimport \"video-react/dist/video-react.css\"; // import css\n//import AudioPlayer from \"react-h5-audio-player\";\nimport \"react-h5-audio-player/lib/styles.css\";\nimport {\n Avatar,\n Box,\n Card,\n CardHeader,\n CardMedia as MuiCardMedia,\n Typography,\n} from \"@mui/material\";\nimport DownloadForOfflineSharpIcon from \"@mui/icons-material/DownloadForOfflineSharp\";\n\nimport { red } from \"@mui/material/colors\";\nimport ChatMediaDialog from \"./ChatMediaDialog\";\nimport Rating from \"@mui/material/Rating\";\n\nconst ChatMessage = styled.div`\n margin: 30px;\n text-align: ${(props) => props.position};\n`;\n\nconst ChatMessageInner = styled.div`\n display: inline-block;\n`;\n\nconst ChatMessageComponent = ({\n name,\n message,\n time,\n avatar,\n position = \"left\",\n sender_type,\n content_type,\n is_media,\n media_type,\n media_url,\n}) => {\n const onDocDownload = (docURL) => {\n let alink = document.createElement(\"a\");\n alink.href = docURL;\n alink.target = \"_blank\";\n alink.click();\n };\n const ChatMessageTime = styled(Typography)`\n text-align: right;\n opacity: 0.8;\n `;\n\n const ChatMessageBubble = styled.div`\n display: inline-block;\n margin-right: auto;\n text-align: left;\n background: ${(props) =>\n props.highlighted\n ? props.theme.palette.secondary.main\n : props.theme.palette.common.white};\n color: ${(props) =>\n props.highlighted\n ? props.theme.palette.common.white\n : props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubblePrivate = styled.div`\n display: inline-block;\n text-align: left;\n margin-right: auto;\n background: ${(props) => props.theme.sidebar.header.chipNote.color};\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleResolve = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #acdbae;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const ChatMessageBubbleResolvebyClient = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #87cb8a;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleLabel = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #c0d9f5;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleAssign = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ffb3ff;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoin = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #b05782;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoinAgent = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ddb7c9;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const CardMedia = styled(MuiCardMedia)`\n height: 220px;\n // cursor: pointer;\n `;\n const CardVedioMedia = styled(MuiCardMedia)`\n width: 100%;\n height: 120px;\n cursor: pointer;\n `;\n const CrdHeader = styled(CardHeader)`\n cursor: pointer;\n `;\n const ChatMessageBubbleName = styled(Typography)`\n font-weight: ${(props) => props.theme.typography.fontWeightBold};\n `;\n\n const [open, setOpen] = React.useState({\n Open: false,\n });\n\n const handleClickOpen = (mediaUrl, mediaType) => {\n setOpen({\n Open: true,\n MediaUrl: mediaUrl,\n MediaType: mediaType,\n });\n };\n\n const handleClickClose = () => {\n setOpen({\n Open: false,\n });\n };\n\n const [copied, setCopied] = React.useState(false);\n const handleCopyText = () => {\n navigator.clipboard.writeText(message).then(\n () => {\n //console.log(\"Text copied to clipboard\");\n setCopied(true);\n setTimeout(() => {\n setCopied(false); // Hide the message after 1 second\n }, 1000); // 1000ms = 1 second\n },\n (err) => {\n console.error(\"Failed to copy text: \", err);\n }\n );\n };\n\n return (\n <>\n {parseInt(content_type) === 0 && (\n \n \n {/* */}\n \n \n \n {name}\n\n {copied ? (\n Copied!\n ) : (\n \n \n \n )}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n \n {message}\n \n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 11 && (\n \n \n {/* */}\n \n \n \n {name}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n \n {message}\n \n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 1 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 2 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 4 && (\n \n \n \n \n \n {`Feedback from ${name}`}\n \n \n \n \n \n \n {message.split(\"â”´\")[1]}\n \n\n \n {time}\n \n \n \n )}\n {parseInt(content_type) === 6 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 9 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 10 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 12 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 14 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n \n >\n );\n};\n\nexport default ChatMessageComponent;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n// Thunks\n// fetch all Canned Responses Data\nexport const fetchAllCannedResponses = createAsyncThunk(\n \"cannedResponses/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/canned-reponses`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const addCannedResponces = createAsyncThunk(\n \"cannedResponses/add\",\n async (payloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/canned-reponses`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const editCannedResponces = createAsyncThunk(\n \"cannedResponses/edit\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const payloadData = {\n short_code: payload.short_code,\n content: payload.content,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/canned-reponses/${payload.id}`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const deleteCannedResponces = createAsyncThunk(\n \"cannedResponses/delete\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.delete(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/canned-reponses/${payload.id}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nconst initialState = {\n data: [],\n addData: [],\n editData: [],\n deleteData: [],\n status: STATUSES.SUCCESS,\n};\n\nexport const cannedResponsesSlice = createSlice({\n name: \"cannedResponses\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllCannedResponses.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllCannedResponses.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllCannedResponses.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(addCannedResponces.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(addCannedResponces.fulfilled, (state, action) => {\n state.addData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(addCannedResponces.rejected, (state, action) => {\n state.addData = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(editCannedResponces.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(editCannedResponces.fulfilled, (state, action) => {\n state.editData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(editCannedResponces.rejected, (state, action) => {\n state.editData = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(deleteCannedResponces.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(deleteCannedResponces.fulfilled, (state, action) => {\n state.deleteData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(deleteCannedResponces.rejected, (state, action) => {\n state.deleteData = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setCannedResponses, setStatus, setAddData, reset } =\n cannedResponsesSlice.actions;\nexport default cannedResponsesSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Popover as MuiPopover } from \"@mui/material\";\n\nimport EmojiPicker from \"emoji-picker-react\";\n\nconst Popover = styled(MuiPopover)`\n .MuiPaper-root {\n width: 300px;\n ${(props) => props.theme.shadows[1]};\n border: 1px solid ${(props) => props.theme.palette.divider};\n }\n`;\n\nconst EmojiComponent = ({ isOpen, handleClose, onClick }) => {\n return (\n <>\n \n \n \n
\n \n >\n );\n};\n\nexport default EmojiComponent;\n","import React, { useState, useRef } from \"react\";\nimport {\n Button,\n Card,\n Dialog,\n DialogContent,\n DialogContentText,\n DialogTitle,\n IconButton,\n} from \"@mui/material\";\nimport MicIcon from \"@mui/icons-material/Mic\";\nimport MicOffIcon from \"@mui/icons-material/MicOff\";\nimport CloseIcon from \"@mui/icons-material/Close\"; // Import close icon\nimport SendIcon from \"@mui/icons-material/Send\";\nimport ReplayIcon from \"@mui/icons-material/Replay\";\n\nconst VoiceNote = ({ openAdd, handleClickClose, channelId, sendVoiceNote }) => {\n const [isRecording, setIsRecording] = useState(false);\n const [audioURL, setAudioURL] = useState(\"\");\n const [convertedAudio, setConvertedAudio] = useState(\"\");\n //const [recordedAudio, setRecordedAudio] = useState({});\n const mediaRecorderRef = useRef(null);\n const audioChunksRef = useRef([]);\n\n // useEffect(() => {\n // setRecordedAudio(convertedAudio);\n // }, [convertedAudio]);\n\n // const startRecording = async () => {\n // try {\n // const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // mediaRecorderRef.current = new MediaRecorder(stream);\n\n // mediaRecorderRef.current.ondataavailable = (event) => {\n // console.log(\"1\");\n // audioChunksRef.current.push(event.data);\n // };\n\n // mediaRecorderRef.current.onstop = () => {\n // console.log(\"2\");\n // const audioBlob = new Blob(audioChunksRef.current, {\n // type: \"audio/mpeg\",\n // });\n // const audioUrl = URL.createObjectURL(audioBlob);\n // setAudioURL(audioUrl);\n // audioChunksRef.current = [];\n // };\n\n // mediaRecorderRef.current.start();\n // setIsRecording(true);\n // } catch (error) {\n // console.error(\"Error accessing microphone: \", error);\n // }\n // };\n\n // const stopRecording = () => {\n // mediaRecorderRef.current.stop();\n // setIsRecording(false);\n\n // mediaRecorderRef.current.onstop = async () => {\n // const audioBlob = new Blob(audioChunksRef.current, {\n // type: \"audio/mpeg\",\n // });\n\n // // Create a URL for the Blob and update state\n // const audioUrl = URL.createObjectURL(audioBlob);\n // setAudioURL(audioUrl); // Set the new audio URL\n\n // // Convert Blob to File\n // const file = new File([audioBlob], `audio${Date.now()}.mp3`, {\n // type: \"audio/mpeg\", // Keep the MIME type\n // lastModified: Date.now(), // You can use a timestamp here\n // });\n\n // //console.log(file); // Log the new file\n // setConvertedAudio(file); // Update the converted audio state\n // audioChunksRef.current = []; // Clear the audio chunks\n // };\n // };\n\n const startRecording = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Check for Ogg Audio support in the browser\n const mimeType = MediaRecorder.isTypeSupported(\"audio/ogg; codecs=opus\")\n ? \"audio/ogg; codecs=opus\"\n : \"audio/webm; codecs=opus\"; // Fallback to WebM if Ogg is unavailable\n\n mediaRecorderRef.current = new MediaRecorder(stream, { mimeType });\n\n mediaRecorderRef.current.ondataavailable = (event) => {\n audioChunksRef.current.push(event.data);\n };\n\n mediaRecorderRef.current.onstop = () => {\n const audioBlob = new Blob(audioChunksRef.current, { type: mimeType });\n const audioUrl = URL.createObjectURL(audioBlob);\n setAudioURL(audioUrl);\n audioChunksRef.current = [];\n };\n\n mediaRecorderRef.current.start();\n setIsRecording(true);\n } catch (error) {\n console.error(\"Error accessing microphone: \", error);\n }\n };\n\n const stopRecording = () => {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n\n mediaRecorderRef.current.onstop = async () => {\n const mimeType =\n mediaRecorderRef.current.mimeType || \"audio/ogg; codecs=opus\";\n const audioBlob = new Blob(audioChunksRef.current, { type: mimeType });\n\n const audioUrl = URL.createObjectURL(audioBlob);\n setAudioURL(audioUrl);\n\n const file = new File([audioBlob], `audio${Date.now()}.ogg`, {\n type: mimeType,\n lastModified: Date.now(),\n });\n\n setConvertedAudio(file);\n audioChunksRef.current = []; // Clear the audio chunks\n };\n };\n\n const handleClose = () => {\n handleClickClose();\n };\n const handleReset = () => {\n setAudioURL(\"\");\n };\n\n // console.log(\"\\n audioURL == \" + audioURL);\n\n const handleSend = async () => {\n console.log(audioURL);\n if (audioURL) {\n // Convert to MP3 if necessary\n if (convertedAudio) {\n // Send the MP3 file\n sendVoiceNote(convertedAudio, channelId);\n } else {\n // Fallback or handle the raw audio URL\n sendVoiceNote(audioURL, channelId);\n }\n }\n setAudioURL(\"\");\n handleClose();\n };\n\n // const handleSend = async () => {\n // console.log(audioURL);\n // audioURL && sendVoiceNote(recordedAudio, channelId);\n // setAudioURL(\"\");\n // handleClose();\n // };\n\n return (\n \n );\n};\n\nexport default VoiceNote;\n","import React, { useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Grid, TextField, Box, List, ListItem, Button } from \"@mui/material\";\nimport { useDispatch } from \"react-redux\";\nimport EmojiEmotionsIcon from \"@mui/icons-material/EmojiEmotions\";\nimport AttachmentIcon from \"@mui/icons-material/Attachment\";\nimport MicIcon from \"@mui/icons-material/Mic\";\nimport { green, yellow } from \"@mui/material/colors\";\nimport EmojiComponent from \"./EmojiComponent\";\nimport VoiceNote from \"./VoiceNote\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst ChatInput = styled(Grid)`\n max-height: 60px;\n padding: ${(props) => props.theme.spacing(5)};\n`;\n\nconst ChatAction = styled(`span`)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n border-radius: 10px;\n margin-right: 20px;\n cursor: pointer;\n`;\n\nvar suggestions = [];\n\nconst ChatInputComponent = ({\n user,\n process,\n chatAssignee,\n chatAssigneeCount,\n handleSendMessage,\n callStateData,\n setFileSize,\n setFile,\n setSelectedFile,\n setIsFilePicked,\n channelId,\n uploadFileData,\n cannedResponses,\n isFilePicked,\n conversationId,\n}) => {\n const dispatch = useDispatch();\n const [chatMsg, setChatMsg] = useState(\"\");\n const [filteredSuggestions, setFilteredSuggestions] = useState([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [isOpen, setOpen] = React.useState(false);\n\n const [openMic, setOpenMic] = React.useState({\n Open: false,\n });\n\n !!cannedResponses &&\n !!cannedResponses?.data &&\n cannedResponses.data.length > 0 &&\n (suggestions = cannedResponses?.data);\n\n const handleOpen = () => {\n setOpen(true);\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n // draft messages\n\n React.useEffect(() => {\n const savedDraft = localStorage.getItem(`draft-${conversationId}`) || \"\";\n setChatMsg(savedDraft);\n }, [conversationId]);\n\n // Save draft message\n const handleDraftChange = (value) => {\n //setDraft(value);\n setChatMsg(value);\n localStorage.setItem(`draft-${conversationId}`, value); // Save draft to localStorage\n };\n\n // Load draft when chatId changes\n React.useEffect(() => {\n const savedDraft = localStorage.getItem(`draft-${conversationId}`) || \"\";\n setChatMsg(savedDraft);\n }, [conversationId]);\n\n // draft messages\n\n // send Emojis\n function onClick(emojiData, event) {\n setChatMsg((e) => e !== null && e + emojiData.emoji);\n const existingDraft = localStorage.getItem(`draft-${conversationId}`) || \"\"; // Get existing draft or default to an empty string\n localStorage.setItem(\n `draft-${conversationId}`,\n existingDraft + emojiData.emoji // Append the emoji to the draft\n );\n }\n\n const sendVoiceNote = async (file, channelId) => {\n setFile(\"\");\n setSelectedFile();\n setSelectedFile(file);\n setIsFilePicked(true);\n\n var obj = {\n file: file,\n channel_id: channelId,\n };\n await dispatch(uploadFileData(obj));\n };\n\n const changeAttachmentsHandler = async (event) => {\n if (parseInt(event.target.files[0].size) > 5242855) {\n console.log(\"1\");\n\n setFileSize(true);\n await timeOut(2000);\n setFileSize(false);\n } else {\n // dispatch(reset_fileData());\n setFile(\"\");\n setSelectedFile();\n setSelectedFile(event.target.files[0]);\n setIsFilePicked(true);\n\n var obj = {\n file: event.target.files[0],\n channel_id: channelId,\n };\n\n //await dispatch(uploadFileData(event.target.files[0], \"channel_id\"));\n await dispatch(uploadFileData(obj));\n }\n event.target.value = \"\";\n };\n\n const handleChange = (value) => {\n //setChatMsg(value);\n handleDraftChange(value);\n // Show suggestions if the last character is '/'\n if (value.endsWith(\"/\")) {\n setFilteredSuggestions(suggestions);\n setShowSuggestions(true);\n } else if (value.includes(\"/\")) {\n const lastSlashIndex = value.lastIndexOf(\"/\");\n const searchTerm = value.slice(lastSlashIndex + 1).trim();\n const filtered = suggestions.filter((suggestion) =>\n suggestion.short_code.toLowerCase().includes(searchTerm.toLowerCase())\n );\n setFilteredSuggestions(filtered);\n setShowSuggestions(filtered.length > 0);\n } else {\n setShowSuggestions(false);\n }\n };\n\n const handleSelectSuggestion = (suggestion) => {\n const lastSlashIndex = chatMsg.lastIndexOf(\"/\");\n // Slice the chat message up to the last slash (excluding the slash itself)\n const newMessage = chatMsg.slice(0, lastSlashIndex) + suggestion + \" \";\n // Update the chat message state\n setChatMsg(newMessage);\n // Hide the suggestions\n setShowSuggestions(false);\n };\n\n const handleKeyDown = (e) => {\n if (!!process && process === \"success\") {\n if (e.key === \"Enter\" && !e.shiftKey) {\n // Send message on Enter without Shift\n e.preventDefault();\n // Ensure the message is not just whitespace\n if (chatMsg.trim() !== \"\") {\n if (chatMsg.includes(\"/\")) {\n const lastSlashIndex = chatMsg.lastIndexOf(\"/\");\n const searchTerm = chatMsg.slice(lastSlashIndex + 1).trim();\n const filtered = filteredSuggestions.filter((suggestion) =>\n suggestion.short_code\n .toLowerCase()\n .includes(searchTerm.toLowerCase())\n );\n // If a suggestion is found, replace the short_code with its content\n if (filtered.length > 0) {\n const newMessage =\n chatMsg.slice(0, lastSlashIndex).trim() +\n \" \" +\n filtered[0].content;\n\n callStateData(newMessage); // Send the concatenated message\n } else {\n // If no suggestion matches, send the entire chatMsg\n callStateData(chatMsg);\n }\n\n setChatMsg(\"\"); // Clear the input field after sending\n setShowSuggestions(false);\n } else {\n callStateData(chatMsg);\n setChatMsg(\"\"); // Clear the input field after sending\n setShowSuggestions(false);\n }\n } else {\n if (isFilePicked) {\n console.log(\"event.target.files[0] == \");\n handleSendMessage(); // Call the send message function with the current chatMsg\n //callStateData(chatMsg);\n setChatMsg(\"\"); // Clear the input field after sending\n setShowSuggestions(false);\n }\n }\n } else if (e.key === \"Enter\" && e.shiftKey) {\n // Add a newline character to the input value on Shift + Enter\n e.preventDefault();\n setChatMsg((prev) => prev + \"\\n\");\n callStateData(chatMsg);\n handleSendMessage();\n }\n }\n };\n\n // on Button click\n const handleButtonEvent = () => {\n if (chatMsg.trim() !== \"\") {\n callStateData(chatMsg);\n setChatMsg(\"\"); // Clear the input field after sending\n setShowSuggestions(false);\n } else {\n if (isFilePicked) {\n handleSendMessage(); // Call the send message function with the current chatMsg\n callStateData(chatMsg);\n setChatMsg(\"\"); // Clear the input field after sending\n setShowSuggestions(false);\n }\n }\n };\n\n const handleClickOpenMic = () => {\n setOpenMic({\n Open: true,\n });\n };\n\n const handleClickCloseMic = () => {\n setOpenMic({\n Open: false,\n });\n };\n\n return (\n <>\n \n\n \n\n \n \n \n handleChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {showSuggestions && filteredSuggestions.length > 0 && (\n \n \n {filteredSuggestions.map((suggestion, index) => (\n handleSelectSuggestion(suggestion.content)}\n className=\"suggestion-item\"\n >\n \n {suggestion.short_code}\n \n :\n \n {suggestion.content}\n \n \n ))}\n
\n \n )}\n \n \n \n \n \n \n \n \n \n \n {\n handleClickOpenMic();\n }}\n />\n \n {!!process && process === \"success\" ? (\n \n setFiles(e.target.files[0])}\n onChange={(e) => {\n changeAttachmentsHandler(e);\n }}\n />\n \n \n ) : (\n \n \n \n )}\n \n \n \n \n {!!chatAssigneeCount && chatAssigneeCount > 1 ? (\n \n ) : (\n !!chatAssignee &&\n chatAssignee === user.uid && (\n \n )\n )}\n \n \n \n >\n );\n};\n\nexport default ChatInputComponent;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport \"react-h5-audio-player/lib/styles.css\";\nimport useSound from \"use-sound\";\nimport {\n Alert as MuiAlert,\n Box,\n Grid,\n TextField as MuiTextField,\n Divider as MuiDivider,\n Popover as MuiPopover,\n LinearProgress as MuiLinearProgress,\n} from \"@mui/material\";\n//import HelpIcon from \"@mui/icons-material/Help\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport moment from \"moment\";\n//import EmojiEmotionsIcon from \"@mui/icons-material/EmojiEmotions\";\nimport AttachmentIcon from \"@mui/icons-material/Attachment\";\nimport Button from \"@mui/material/Button\";\nimport ChatMessageComponent from \"./ChatMessageComponent\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport EmojiPicker from \"emoji-picker-react\";\n\nimport {\n uploadFileData,\n uploadPrivateFileData,\n} from \"../../../../redux/slices/chatSettings\";\nimport { fetchAllCannedResponses } from \"../../../../redux/slices/cannedResponses\";\nimport { fetchTodayschat } from \"../../../../redux/slices/socketsSlice\";\n//import { yellow } from \"@mui/material/colors\";\nimport ChatInputComponent from \"./chatInputs/ChatInputComponent\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst LinearProgress = styled(MuiLinearProgress)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\n//console.log(\"sendingSound == \", sendingSound);\nconst Popover = styled(MuiPopover)`\n .MuiPaper-root {\n width: 300px;\n ${(props) => props.theme.shadows[1]};\n border: 1px solid ${(props) => props.theme.palette.divider};\n }\n`;\n\nconst ChatMessages = styled.div`\n overflow-y: scroll;\n background-color: rgba(255, 255, 255, 0.6);\n flex-direction: \"column\";\n gap: 2;\n background-image: url(/static/img/samples/fbe41cd97ada760e7b38de1be18301a5.jpg);\n background-size: 10%;\n background-blend-mode: overlay;\n background-attachment: fixed;\n height: calc(-35px + 68vh);\n overflowy: auto;\n //border: 1px solid #ccc;\n border-radius: 5px;\n`;\n\nconst ChatInput = styled(Grid)`\n max-height: 60px;\n padding: ${(props) => props.theme.spacing(5)};\n`;\n\nconst ChatActionNote = styled(`span`)`\n background-color: ${(props) => props.theme.sidebar.header.chipNote.color};\n padding: ${(props) => props.theme.spacing(2)};\n border-radius: 10px;\n margin-right: 20px;\n cursor: pointer;\n`;\n\nconst ChatMessagePannel = ({ socket }) => {\n //const [notificationSPlay] = useSound(notificationSound);\n const dispatch = useDispatch();\n const bottomRef = React.useRef(null);\n //const [sendingPlay] = useSound(sendingSound);\n const [sendingPlay] = useSound(\n \"https://liveagentapp-in.s3.ap-south-1.amazonaws.com/uploads/1720614091715_new-notification-7-210334.mp3\"\n );\n const [key, setKey] = React.useState(\"reply\");\n const {\n conversationData,\n conversationId,\n botId,\n orgId,\n channelId,\n contactId,\n mute,\n contactData,\n fileData,\n filePrivateData,\n uploadFilestatus,\n uploadPrivateFilestatus,\n //reset_fileData,\n } = useSelector((state) => state.chatSettings);\n const { chatFromoneSpocData, todaysChat } = useSelector(\n (state) => state.socketsSlice\n );\n\n const { contactUpdateData } = useSelector((state) => state.socketsSlice);\n const user = JSON.parse(localStorage.getItem(\"user\"));\n var [chatAssignee, setChatAssignee] = React.useState(\"\");\n var [chatAssigneeCount, setChatAssigneeCount] = React.useState(0);\n\n var [conData, setConData] = React.useState([]);\n var [chatData, setChatData] = React.useState([]);\n var [chatMsg, setChatMsg] = React.useState(\"\");\n var [chatPrivateMsg, setChatPrivateMsg] = React.useState(\"\");\n var [agent, setAgent] = React.useState(\"\");\n var [file, setFile] = React.useState(\"\");\n var [filePrivate, setFilePrivate] = React.useState(\"\");\n var [fileSize, setFileSize] = React.useState(false);\n var [filePrivateSize, setFilePrivateSize] = React.useState(false);\n\n const [selectedFile, setSelectedFile] = React.useState();\n const [selectedPrivateFile, setSelectedPrivateFile] = React.useState();\n const [isFilePicked, setIsFilePicked] = React.useState(false);\n const [isFilePickedPrivate, setIsFilePickedPrivate] = React.useState(false);\n const [isOpen, setOpen] = React.useState(false);\n const [process, setProcess] = React.useState(\"success\");\n const [privateProcess, setPrivateProcess] = React.useState(\"success\");\n const ref = React.useRef(null);\n const [progress, setProgress] = React.useState(0);\n\n const [buffer, setBuffer] = React.useState(10);\n const progressRef = React.useRef(() => {});\n\n React.useEffect(() => {\n !!uploadFilestatus && setProcess(uploadFilestatus);\n !!uploadFilestatus &&\n uploadFilestatus === \"error\" &&\n setIsFilePicked(false);\n const setTimeOutFun = async () => {\n await timeOut(2000);\n setProcess(\"success\");\n };\n !!uploadFilestatus && uploadFilestatus === \"error\" && setTimeOutFun();\n }, [uploadFilestatus]);\n\n React.useEffect(() => {\n setPrivateProcess(uploadPrivateFilestatus);\n }, [uploadPrivateFilestatus]);\n\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n setProcess(\"success\");\n handleFileClose();\n handleFilePrivateClose();\n }, [dispatch, conversationId]);\n\n React.useEffect(() => {\n dispatch(fetchTodayschat());\n }, [dispatch, conversationId, contactUpdateData]);\n\n React.useEffect(() => {\n // console.log(\" mute === true && sendingPlay(); \");\n // mute === true && sendingPlay();\n // sendingPlay();\n\n setChatAssignee(\"\");\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n item._id === conversationId &&\n parseInt(item.status) === 0 &&\n setChatAssignee(item.chatAssign[0].assignee_id)\n );\n }, [todaysChat, conversationId]);\n\n // check chat asignee Count\n React.useEffect(() => {\n setChatAssigneeCount([]);\n // setChatMsg(\"\");\n !!todaysChat &&\n !!todaysChat.data &&\n todaysChat.data.map(\n (item) =>\n item._id === conversationId &&\n parseInt(item.status) === 0 &&\n setChatAssigneeCount(item.chatAssign.length)\n );\n }, [todaysChat, conversationId]);\n\n // CLear Chat Message if Select New Chat\n React.useEffect(() => {\n setChatMsg(\"\");\n setChatPrivateMsg(\"\");\n }, [conversationId]);\n\n function onClick(emojiData, event) {\n setChatMsg((e) => e !== null && e + emojiData.emoji);\n }\n\n const handleClose = () => {\n setOpen(false);\n };\n\n // Close Emoji Picker\n\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n //console.log(\"mute == \", mute);\n React.useEffect(() => {\n !!chatFromoneSpocData &&\n chatFromoneSpocData.sender_type === 1 &&\n mute === true &&\n sendingPlay();\n !!chatFromoneSpocData &&\n chatFromoneSpocData.length !== 0 &&\n setChatData((chatData) => [...chatData, chatFromoneSpocData]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chatFromoneSpocData]);\n\n React.useEffect(() => {\n !!conversationData &&\n conversationData.length !== 0 &&\n setConData(conversationData);\n setChatData(\"\");\n }, [conversationData]);\n\n React.useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [chatData]);\n\n React.useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [todaysChat]);\n\n React.useEffect(() => {\n setFile(fileData);\n }, [fileData]);\n\n React.useEffect(() => {\n setFilePrivate(filePrivateData);\n }, [filePrivateData]);\n\n React.useEffect(() => {\n progressRef.current = () => {\n if (progress > 100) {\n setProgress(0);\n setBuffer(10);\n } else {\n const diff = Math.random() * 10;\n const diff2 = Math.random() * 10;\n setProgress(progress + diff);\n setBuffer(progress + diff + diff2);\n }\n };\n });\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n progressRef.current();\n }, 500);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n const handleFileClose = () => {\n setFile(\"\");\n setIsFilePicked(false);\n };\n\n const handleFilePrivateClose = () => {\n setFilePrivate(\"\");\n setIsFilePickedPrivate(false);\n };\n\n const changePrivateHandler = async (event) => {\n if (parseInt(event.target.files[0].size) > 5242855) {\n setFilePrivateSize(true);\n await timeOut(2000);\n setFilePrivateSize(false);\n } else {\n // dispatch(reset_fileData());\n setFilePrivate(\"\");\n setSelectedPrivateFile();\n setSelectedPrivateFile(event.target.files[0]);\n setIsFilePickedPrivate(true);\n await dispatch(uploadPrivateFileData(event.target.files[0]));\n }\n event.target.value = \"\";\n };\n\n const { data: cannedResponses } = useSelector(\n (state) => state.cannedResponses\n );\n\n React.useEffect(() => {\n dispatch(fetchAllCannedResponses());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const sendMessage = async (media, mimetype) => {\n var msg = chatMsg;\n var messagePayload = {\n data: {\n flag: \"continue\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: \"\",\n contact_id: contactId,\n contact: contactData,\n isPrivate: 0,\n message: [\n {\n content_type: 0,\n content: msg,\n media: {\n media_type: isFilePicked === true && !!mimetype ? mimetype : \"\",\n media_path: isFilePicked === true && !!media ? media : \"\",\n },\n message_type: isFilePicked === true ? \"media\" : \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n //https://www.shutterstock.com/image-photo/focused-woman-wearing-headphones-using-260nw-1395298487.jpg\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n setChatMsg(\"\");\n localStorage.removeItem(`draft-${conversationId}`); // Remove saved draft\n //}\n };\n\n // for child component\n const callStateData = async (data) => {\n setChatMsg(data);\n };\n\n React.useEffect(() => {\n !!chatMsg && handleSendMessage();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chatMsg]);\n\n const handleSendMessage = async () => {\n if (chatAssigneeCount > 0) {\n callStateData();\n var mimetype =\n !!file && (!!file.mimetype ? file.mimetype.split(\"/\") : \"\");\n var media = !!file && (!!file.data ? file.data : \"\");\n\n if (!!chatMsg && chatMsg.length > 0 && !!media && media.length > 0) {\n await sendMessage(media, mimetype[0]);\n } else if (\n (!!chatMsg && chatMsg.trim() !== \"\") ||\n (!!media && media.length > 0)\n ) {\n await sendMessage(media, mimetype[0]);\n }\n setSelectedFile(\"\");\n setIsFilePicked(false);\n media = \"\";\n setFile(\"\");\n }\n };\n\n const handleSendPrivateMessage = async () => {\n var mimetype =\n !!filePrivate &&\n (!!filePrivate.mimetype ? filePrivate.mimetype.split(\"/\") : \"\");\n var media = !!filePrivate && (!!filePrivate.data ? filePrivate.data : \"\");\n //chatPrivateMsg\n if (\n !!chatPrivateMsg &&\n chatPrivateMsg.length > 0 &&\n !!media &&\n media.length > 0\n ) {\n await sendPrivateMessage(media, mimetype[0]);\n } else if (\n (!!chatPrivateMsg && chatPrivateMsg.trim() !== \"\") ||\n (!!media && media.length > 0)\n ) {\n await sendPrivateMessage(media, mimetype[0]);\n }\n\n setSelectedPrivateFile(\"\");\n setIsFilePickedPrivate(false);\n media = \"\";\n setFilePrivate(\"\");\n };\n const sendPrivateMessage = async (media, mimetype) => {\n var msg = chatPrivateMsg;\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: \"\",\n contact_id: contactId,\n contact: contactData,\n message: [\n {\n content_type: 11,\n content: msg,\n media: {\n media_type:\n isFilePickedPrivate === true && !!mimetype ? mimetype : \"\",\n media_path: isFilePickedPrivate === true && !!media ? media : \"\",\n },\n message_type: isFilePickedPrivate === true ? \"media\" : \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n setChatPrivateMsg(\"\");\n };\n\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n\n return date.isSame(moment(), \"day\")\n ? date.format(\"hh:mm A\")\n : date.format(\"MMM-DD hh:mm A\");\n };\n\n return (\n <>\n \n \n \n
\n \n\n \n {!!conData &&\n conData.length > 0 &&\n conData[0]._id === conversationId &&\n conData[0].chat.map((item, i) =>\n item.sender_type === 1 ? (\n \n ) : (\n \n )\n )}\n\n {!!chatData &&\n chatData.length !== 0 &&\n chatData.map(\n (item, i) =>\n !!item.data &&\n item.data.conversation_id === conversationId &&\n (item.sender_type === 1 ? (\n \n ) : (\n \n ))\n )}\n\n \n \n \n >\n );\n};\n\nexport default ChatMessagePannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Button,\n Card,\n CardMedia as MuiCardMedia,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from \"@mui/material\";\n//import ReactPlayer from \"react-player\";\nimport { Player } from \"video-react\";\nimport AudioPlayer from \"react-h5-audio-player\";\nconst ChatMediaDialog = ({ openAdd, handleClickClose }) => {\n // const [open, setOpen] = React.useState(false);\n\n // const handleClose = () => {\n // setOpen(false);\n // };\n const CardMedia = styled(MuiCardMedia)`\n weight: 100%;\n height: 80vh;\n cursor: pointer;\n `;\n return (\n <>\n \n >\n );\n};\n\nexport default ChatMediaDialog;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n//import { Player } from \"video-react\";\nimport \"video-react/dist/video-react.css\"; // import css\n//import AudioPlayer from \"react-h5-audio-player\";\nimport \"react-h5-audio-player/lib/styles.css\";\nimport {\n Avatar,\n Box,\n Card,\n CardHeader,\n CardMedia as MuiCardMedia,\n Typography,\n} from \"@mui/material\";\nimport DownloadForOfflineSharpIcon from \"@mui/icons-material/DownloadForOfflineSharp\";\n\nimport { red } from \"@mui/material/colors\";\nimport ChatMediaDialog from \"./ChatMediaDialog\";\nimport Rating from \"@mui/material/Rating\";\n\nconst ChatMessage = styled.div`\n margin: 30px;\n text-align: ${(props) => props.position};\n`;\n\nconst ChatMessageInner = styled.div`\n display: inline-block;\n`;\n\nconst ChatMessageComponent = ({\n name,\n message,\n time,\n avatar,\n position = \"left\",\n sender_type,\n content_type,\n is_media,\n media_type,\n media_url,\n}) => {\n const onDocDownload = (docURL) => {\n let alink = document.createElement(\"a\");\n alink.href = docURL;\n alink.target = \"_blank\";\n alink.click();\n };\n\n // console.log(\"name == \", name);\n const ChatMessageTime = styled(Typography)`\n text-align: right;\n opacity: 0.8;\n `;\n\n const ChatMessageBubble = styled.div`\n display: inline-block;\n margin-right: auto;\n background: ${(props) =>\n props.highlighted\n ? props.theme.palette.secondary.main\n : props.theme.palette.common.white};\n color: ${(props) =>\n props.highlighted\n ? props.theme.palette.common.white\n : props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubblePrivate = styled.div`\n display: inline-block;\n margin-right: auto;\n background: ${(props) => props.theme.sidebar.header.chipNote.color};\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleResolve = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #acdbae;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const ChatMessageBubbleResolvebyClient = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #87cb8a;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleLabel = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #c0d9f5;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleAssign = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ffb3ff;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoin = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #b05782;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoinAgent = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ddb7c9;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const CardMedia = styled(MuiCardMedia)`\n height: 220px;\n // cursor: pointer;\n `;\n const CardVedioMedia = styled(MuiCardMedia)`\n width: 100%;\n height: 120px;\n cursor: pointer;\n `;\n const CrdHeader = styled(CardHeader)`\n cursor: pointer;\n `;\n const ChatMessageBubbleName = styled(Typography)`\n font-weight: ${(props) => props.theme.typography.fontWeightBold};\n `;\n\n const [open, setOpen] = React.useState({\n Open: false,\n });\n\n const handleClickOpen = (mediaUrl, mediaType) => {\n setOpen({\n Open: true,\n MediaUrl: mediaUrl,\n MediaType: mediaType,\n });\n };\n\n const handleClickClose = () => {\n setOpen({\n Open: false,\n });\n };\n\n return (\n <>\n {parseInt(content_type) === 0 && (\n \n \n {/* */}\n \n \n \n {name}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {message}\n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 11 && (\n \n \n {/* */}\n \n \n \n {name}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {message}\n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 1 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 2 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 4 && (\n \n \n \n \n \n {`Feedback from ${name}`}\n \n \n \n \n \n \n {message.split(\"â”´\")[1]}\n \n\n \n {time}\n \n \n \n )}\n {parseInt(content_type) === 6 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 9 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 10 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 12 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 14 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n \n >\n );\n};\n\nexport default ChatMessageComponent;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport moment from \"moment\";\nimport {\n Alert as MuiAlert,\n // Avatar,\n // Box,\n CircularProgress as MuiCircularProgress,\n Dialog,\n DialogContent,\n DialogContentText,\n DialogTitle,\n DialogActions,\n Grid,\n //Typography,\n TextField,\n Divider as MuiDivider,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n sendCurrentChatMail,\n reset,\n} from \"../../../../../redux/slices/sendMailPreviousChat\";\nimport ChatMessageComponent from \"./ContactChatHistory/ChatMessageComponent\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst ChatContainer = styled(Grid)`\n width: 100%;\n height: calc(68vh - 85px);\n`;\nconst ChatMain = styled(Grid)``;\n\nconst ChatMessages = styled.div`\n overflow-y: scroll;\n background-color: rgba(255, 255, 255, 0.6);\n flex-direction: \"column\";\n gap: 2;\n background-image: url(/static/img/samples/fbe41cd97ada760e7b38de1be18301a5.jpg);\n background-size: 10%;\n background-blend-mode: overlay;\n background-attachment: fixed;\n height: calc(-35px + 62vh);\n overflowy: auto;\n border: 1px solid #ccc;\n border-radius: 5px;\n`;\n\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst Chat = ({ chatData }) => {\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n\n return date.isSame(moment(), \"day\")\n ? date.format(\"hh:mm A\")\n : date.format(\"MMM-DD hh:mm A\");\n };\n return (\n \n \n \n {!!chatData &&\n chatData.messagesData.length > 0 &&\n chatData.messagesData.map((items, i) =>\n //items.content_type === 0 &&\n items.sender_type === 1 ? (\n \n ) : (\n \n )\n )}\n \n \n \n );\n};\n\nconst ChatContactHistory = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n email,\n}) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const dispatch = useDispatch();\n const { data } = useSelector((state) => state.sendMail_PreviousChat);\n\n const [sendEmail, setSendEmail] = React.useState(\"\");\n const [isError, setIsError] = React.useState(false);\n const [errors, setErrors] = React.useState(\"\");\n React.useEffect(() => {\n setSendEmail(email);\n }, [email]);\n\n const SendMail = async (conversation_id) => {\n try {\n setIsLoading(true);\n const { timeZone } = Intl.DateTimeFormat().resolvedOptions();\n const smtp_id = localStorage.getItem(\"awlid\");\n var payload = {\n conversation_id: openAdd.data._id,\n email: sendEmail,\n timeZone: timeZone,\n smtp_id: smtp_id,\n };\n await dispatch(sendCurrentChatMail(payload));\n setIsLoading(false);\n setIsError(false);\n } catch (error) {\n setIsLoading(false);\n setIsError(true);\n setErrors(\"Error \");\n }\n await timeOut(4000);\n await dispatch(reset());\n setSendEmail(\"\");\n };\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n // return date.isSame(moment(), \"day\")\n // ? date.format(\"hh:mm A\")\n // : date.format(\"MMM-DD hh:mm A\");\n return date.format(\"hh:mm A\");\n };\n\n return (\n \n );\n};\nexport default ChatContactHistory;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Typography,\n List,\n ListItem as ListItemListData,\n ListItemText as MuiListItemText,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport moment from \"moment\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchPreviousConversation } from \"../../../../../redux/slices/conversationalActions\";\nimport ChatContactHistory from \"./ChatContactHistory\";\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst ListItemList = styled(ListItemListData)`\n background-color: ${(props) => props.theme.palette.common.white};\n padding: ${(props) => props.theme.spacing(2)};\n border-bottom: 1px solid ${(props) => props.theme.palette.divider};\n cursor: pointer;\n`;\n\nconst PreviousConversation = () => {\n const { previousHistory } = useSelector(\n (state) => state.conversationalAction\n );\n const { contactData } = useSelector((state) => state.chatSettings);\n const { chatFromoneSpocData } = useSelector((state) => state.socketsSlice);\n\n const [contactID, setContactID] = React.useState(\"\");\n const dispatch = useDispatch();\n\n React.useEffect(() => {\n setContactID(contactData._id);\n }, [contactData]);\n React.useEffect(() => {\n !!contactID && dispatch(fetchPreviousConversation(contactID));\n }, [contactID, dispatch, chatFromoneSpocData, contactData]);\n\n // show chat history\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleAddClickOpen = (item) => {\n setOpenAdd({\n Open: true,\n data: item,\n });\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n });\n };\n\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n\n return date.isSame(moment(), \"day\")\n ? date.format(\"hh:mm A\")\n : date.format(\"DD-MMM-YY\");\n };\n return (\n <>\n \n {!!previousHistory ? (\n previousHistory.map((item, i) => (\n {\n handleAddClickOpen(item);\n }}\n sx={{\n marginBottom: \"2px!important\",\n //border: \"1px solid rgba(0, 21, 45, 0.3)\",\n boxShadow: \"0px 4px 6px rgba(0, 0, 1, 0.1)\",\n transition: \"all 0.3s ease\", // Smooth transition for hover effects\n \"&:hover\": {\n boxShadow: \"0px 6px 10px rgba(0, 0, 0, 0.2)\", // Stronger shadow on hover\n backgroundColor: \"rgba(231, 242, 255, 0.9)!important\",\n },\n }}\n >\n \n \n \n ))\n ) : (\n \n There are no Previous Conversations associated to this Contacts.\n \n )}\n
\n \n >\n );\n};\n\nexport default PreviousConversation;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Typography,\n Card as MuiCard,\n CardActionArea,\n List,\n ListItemButton as MuiListItemButton,\n ListItemText as MuiListItemText,\n CardContent,\n IconButton,\n InputBase,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport { fetchAllcompanyAttributes } from \"../../../../../redux/slices/conversationalActions\";\nconst Card = styled(MuiCard)(spacing);\nconst ListItemButton = styled(MuiListItemButton)(spacing);\nconst ListItemText = styled(MuiListItemText)(spacing);\n\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nfunction createData(\n srno,\n id,\n display_name,\n key,\n display_type,\n mode,\n description\n) {\n return { srno, id, display_name, key, display_type, mode, description };\n}\nvar rows = [];\nvar rowsData = [];\n\nconst CompanyAttributes = ({ socket }) => {\n const [search, setSearch] = React.useState(\"\");\n const { conversationId, botId, orgId, channelId, contactId, contactData } =\n useSelector((state) => state.chatSettings);\n const dispatch = useDispatch();\n const { companyAttribute } = useSelector(\n (state) => state.conversationalAction\n );\n\n React.useEffect(() => {\n dispatch(fetchAllcompanyAttributes());\n }, [dispatch]);\n\n var [agent, setAgent] = React.useState(\"\");\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n rowsData =\n !!companyAttribute && !!companyAttribute.data\n ? companyAttribute.data.map((item, i) =>\n createData(\n ++i,\n item._id,\n item.display_name,\n item.key,\n item.display_type,\n item.mode,\n item.description\n )\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.display_name.toLowerCase().includes(search.toLowerCase()) ||\n i.key.toLowerCase().includes(search.toLowerCase())\n );\n\n const sendCompanyAttributeMessage = async (description) => {\n var msg = `${description}`;\n\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: \"\",\n contact_id: contactId,\n contact: contactData,\n label_id: \"\",\n message: [\n {\n content_type: 0,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n\n return (\n <>\n \n \n \n \n \n \n \n {\n setSearch(e.target.value);\n }}\n />\n \n \n {!!rows && !!rows.length > 0 ? (\n rows.map((item, i) => (\n {\n sendCompanyAttributeMessage(item.description);\n }}\n >\n \n \n ))\n ) : (\n Company attributes are not found.\n )}\n
\n \n \n \n >\n );\n};\n\nexport default CompanyAttributes;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Typography,\n List,\n ListItemIcon,\n ListItem as ListItemListData,\n ListItemText as MuiListItemText,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAllAgentStatus } from \"../../../../../redux/slices/conversationalActions\";\nimport CircleIcon from \"@mui/icons-material/Circle\";\nimport { fun_LoginLogout } from \"../../../../../redux/slices/socketsSlice\";\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst ListItemList = styled(ListItemListData)`\n background-color: ${(props) => props.theme.palette.common.white};\n padding: ${(props) => props.theme.spacing(2)};\n border-bottom: 1px solid ${(props) => props.theme.palette.divider};\n cursor: pointer;\n`;\nconst CircleIconOnline = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.online.background};\n`;\nconst CircleIconOffline = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.offline.background};\n`;\nconst CircleIconPause = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.pause.background};\n`;\n\nconst CircleIconBuzy = styled(CircleIcon)`\n color: ${(props) => props.theme.sidebar.footer.buzy.background};\n`;\n\nconst AgentStatus = () => {\n const { agentStatus } = useSelector((state) => state.conversationalAction);\n const { loginLogoutData } = useSelector((state) => state.socketsSlice);\n var [loginStatus, setLoginStatus] = React.useState([]);\n\n const dispatch = useDispatch();\n\n React.useEffect(() => {\n dispatch(fetchAllAgentStatus());\n }, [dispatch]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n }, [dispatch]);\n\n React.useEffect(() => {\n !!agentStatus && setLoginStatus(agentStatus);\n }, [agentStatus]);\n\n React.useEffect(() => {\n !!loginLogoutData && setLoginStatus(loginLogoutData);\n }, [loginLogoutData]);\n\n return (\n <>\n \n {!!loginStatus && !!loginStatus.data ? (\n loginStatus.data.map((item, i) => {\n const availability =\n item?.signinsignout?.[0]?.availability?.[0]?.isAvailable;\n const availabilityText =\n availability === 1\n ? \"Online\"\n : availability === 2\n ? \"Busy\"\n : availability === 3\n ? \"Pause\"\n : availability === 0\n ? \"Offline\"\n : \"Not Available\";\n\n const IconComponent =\n availability === 1\n ? CircleIconOnline\n : availability === 2\n ? CircleIconBuzy\n : availability === 3\n ? CircleIconPause\n : CircleIconOffline;\n\n return (\n \n \n \n \n \n \n \n );\n })\n ) : (\n \n There are no Previous Conversations associated with this Contact.\n \n )}\n
\n >\n );\n};\n\nexport default AgentStatus;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Badge,\n Typography,\n List,\n ListItem as ListItemListData,\n ListItemText as MuiListItemText,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAllAgentStatus } from \"../../../../../redux/slices/conversationalActions\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport { fun_LoginLogout } from \"../../../../../redux/slices/socketsSlice\";\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst ListItemList = styled(ListItemListData)`\n background-color: ${(props) => props.theme.palette.common.white};\n padding: ${(props) => props.theme.spacing(2)};\n border-bottom: 1px solid ${(props) => props.theme.palette.divider};\n cursor: pointer;\n`;\n\nconst FooterBadge = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\n\nconst FooterBadgeBuzy = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) => props.theme.sidebar.footer.buzy.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\n\nconst FooterBadgePause = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) => props.theme.sidebar.footer.pause.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst ChatAssignedAgent = ({ socket }) => {\n const { agentStatus } = useSelector((state) => state.conversationalAction);\n const { conversationId, botId, orgId, channelId, contactId, contactData } =\n useSelector((state) => state.chatSettings);\n const { loginLogoutData } = useSelector((state) => state.socketsSlice);\n var [agent, setAgent] = React.useState(\"\");\n var [loginStatus, setLoginStatus] = React.useState([]);\n const dispatch = useDispatch();\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n React.useEffect(() => {\n dispatch(fetchAllAgentStatus());\n }, [dispatch]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n }, [dispatch]);\n\n React.useEffect(() => {\n !!agentStatus && setLoginStatus(agentStatus);\n }, [agentStatus]);\n\n React.useEffect(() => {\n !!loginLogoutData && setLoginStatus(loginLogoutData);\n }, [loginLogoutData]);\n\n // setLoginLogoutData\n\n const sendChatAssignMessage = async (agentName, assigneeID) => {\n var msg = `This conversation is assigned to ${agentName} by ${agent.displayname}`;\n //console.log(\"sendChatAssignMessage == \", msg);\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: assigneeID,\n contact_id: contactId,\n contact: contactData,\n label_id: \"\",\n message: [\n {\n content_type: 6,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n created_at: Date.now(),\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n return (\n <>\n \n {loginStatus.length !== 0 && !!loginStatus.data ? (\n loginStatus.data.map(\n (item, i) =>\n !!item.signinsignout[0] &&\n !!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable > 0 && (\n {\n sendChatAssignMessage(item.displayname, item._id);\n }}\n >\n {!!item.signinsignout[0] &&\n !!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 1 && (\n <>\n \n \n \n \n >\n )}\n\n {!!item.signinsignout[0] &&\n !!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 2 && (\n <>\n \n \n \n \n >\n )}\n\n {!!item.signinsignout[0] &&\n !!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 3 && (\n <>\n \n \n \n \n >\n )}\n\n {!!agent && agent.uid === item._id && (\n <>\n \n \n >\n )}\n \n )\n )\n ) : (\n \n There are no Previous Conversations associated to this Contacts.\n \n )}\n
\n >\n );\n};\n\nexport default ChatAssignedAgent;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n// Thunks\n// fetch all labels Data\nexport const fetchAllLabels = createAsyncThunk(\"labels/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/label`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\n// add labels Data\nexport const addLabels = createAsyncThunk(\"labels/add\", async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/label`,\n payload,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\n// edit labels Data\nexport const editLabels = createAsyncThunk(\"labels/edit\", async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n var payloadData = {\n title: payload.title,\n description: payload.description,\n color: payload.color,\n show_on_sid: payload.show_on_sid,\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/label/${payload.id}`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\n// delete labels Data\nexport const deleteLabels = createAsyncThunk(\n \"labels/delete\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.delete(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/label/${payload.id}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nconst initialState = {\n data: [],\n addData: [],\n editData: [],\n deleteData: [],\n status: STATUSES.SUCCESS,\n};\n\nexport const labelsSlice = createSlice({\n name: \"labels\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllLabels.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllLabels.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllLabels.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(addLabels.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(addLabels.fulfilled, (state, action) => {\n state.addData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(addLabels.rejected, (state, action) => {\n state.addData = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(editLabels.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(editLabels.fulfilled, (state, action) => {\n state.editData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(editLabels.rejected, (state, action) => {\n state.editData = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(deleteLabels.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(deleteLabels.fulfilled, (state, action) => {\n state.deleteData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(deleteLabels.rejected, (state, action) => {\n state.deleteData = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const {\n setLabels,\n setStatus,\n setAddData,\n setEditData,\n reset,\n setDeleteData,\n} = labelsSlice.actions;\nexport default labelsSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Typography,\n Card as MuiCard,\n CardActionArea,\n List,\n ListItemButton as MuiListItemButton,\n ListItemText as MuiListItemText,\n CardContent,\n IconButton,\n InputBase,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { fetchAllLabels } from \"../../../../../redux/slices/labels\";\nimport { Info } from \"react-feather\";\n// import {\n// createOtherMessage,\n// UpdateLabelID,\n// } from \"../../../../../redux/slices/otherMessages\";\n// import { fetchCurrentChat } from \"../../../../../redux/slices/chatSettings\";\nconst Card = styled(MuiCard)(spacing);\nconst ListItemButton = styled(MuiListItemButton)(spacing);\nconst ListItemText = styled(MuiListItemText)(spacing);\n\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nfunction createData(srno, id, title, color, description) {\n return { srno, id, title, color, description };\n}\nvar rows = [];\nvar rowsData = [];\nconst LabelAccordion = ({ socket }) => {\n const [search, setSearch] = React.useState(\"\");\n const dispatch = useDispatch();\n const { data: labels } = useSelector((state) => state.labels);\n const { conversationId, botId, orgId, channelId, contactId, contactData } =\n useSelector((state) => state.chatSettings);\n var [agent, setAgent] = React.useState(\"\");\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n React.useEffect(() => {\n dispatch(fetchAllLabels());\n }, [dispatch]);\n\n rowsData =\n !!labels && !!labels.data\n ? labels.data.map((item, i) =>\n createData(++i, item._id, item.title, item.color, item.description)\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter((i) =>\n i.title.toLowerCase().includes(search.toLowerCase())\n );\n\n const sendLabelMessage = async (label, labelId) => {\n var msg = `${agent.displayname} added ${label} label`;\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: \"\",\n contact_id: contactId,\n contact: contactData,\n label_id: labelId,\n message: [\n {\n content_type: 12,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n return (\n <>\n \n \n \n \n \n \n \n {\n setSearch(e.target.value);\n }}\n />\n \n \n {!!rows && !!rows.length > 0 ? (\n rows.map((item, i) => (\n \n {\n // addlabel(\n // item.title,\n // item.id,\n // conversationId,\n // contactData._id\n // );\n // sendLabelMessage(item.title,\n // item.id,)\n // }}\n onClick={() => {\n sendLabelMessage(item.title, item.id);\n }}\n >\n \n \n \n \n ))\n ) : (\n There are no Labels to assign.\n )}\n
\n \n \n \n >\n );\n};\n\nexport default LabelAccordion;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Avatar,\n Badge,\n Button as MuiButton,\n Typography,\n List,\n ListItem as ListItemListData,\n ListItemText as MuiListItemText,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchAllAgentStatus,\n fetchJoinChatAgentStatus,\n fetchJoinChatStatus,\n} from \"../../../../../redux/slices/conversationalActions\";\nimport { fun_LoginLogout } from \"../../../../../redux/slices/socketsSlice\";\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst ListItemList = styled(ListItemListData)`\n background-color: ${(props) => props.theme.palette.common.white};\n padding: ${(props) => props.theme.spacing(2)};\n border-bottom: 1px solid ${(props) => props.theme.palette.divider};\n cursor: pointer;\n`;\n\nconst FooterBadge = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) =>\n props.theme.sidebar.footer.online.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\n\nconst FooterBadgeBuzy = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) => props.theme.sidebar.footer.buzy.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\n\nconst FooterBadgePause = styled(Badge)`\n margin-right: ${(props) => props.theme.spacing(1)};\n span {\n background-color: ${(props) => props.theme.sidebar.footer.pause.background};\n border: 1.5px solid ${(props) => props.theme.palette.common.white};\n height: 12px;\n width: 12px;\n border-radius: 50%;\n }\n`;\nconst JoinCall = ({ socket }) => {\n const { agentStatus, joinChatAgentStatus } = useSelector(\n (state) => state.conversationalAction\n );\n const { conversationId, botId, orgId, channelId, contactId, contactData } =\n useSelector((state) => state.chatSettings);\n const { loginLogoutData, chatFromoneSpocData } = useSelector(\n (state) => state.socketsSlice\n );\n var [loginStatus, setLoginStatus] = React.useState([]);\n\n const dispatch = useDispatch();\n var [agent, setAgent] = React.useState(\"\");\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n\n React.useEffect(() => {\n dispatch(fetchAllAgentStatus());\n }, [dispatch]);\n\n React.useEffect(() => {\n dispatch(fun_LoginLogout());\n }, [dispatch]);\n\n React.useEffect(() => {\n !!agentStatus && setLoginStatus(agentStatus);\n }, [agentStatus]);\n\n React.useEffect(() => {\n !!loginLogoutData && setLoginStatus(loginLogoutData);\n }, [loginLogoutData]);\n\n React.useEffect(() => {\n !!conversationId && dispatch(fetchJoinChatStatus(conversationId));\n }, [conversationId, dispatch, loginLogoutData]);\n\n React.useEffect(() => {\n setAgent(JSON.parse(localStorage.getItem(\"user\")));\n }, []);\n React.useEffect(() => {\n dispatch(fetchJoinChatAgentStatus(conversationId));\n }, [conversationId, dispatch]);\n React.useEffect(() => {\n dispatch(fetchJoinChatAgentStatus(conversationId));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chatFromoneSpocData]);\n\n const sendChatRemoveAssignMessage = async (agentName, assigneeID) => {\n // var msg = `This conversation is assigned to ${agentName} by ${agent.displayname}`;\n var msg = `${agent.displayname} remove ${agentName} from join conversation`;\n\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: assigneeID,\n contact_id: contactId,\n contact: contactData,\n label_id: \"\",\n message: [\n {\n content_type: 9,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n\n const sendChatAssignMessage = async (agentName, assigneeID) => {\n // var msg = `This conversation is assigned to ${agentName} by ${agent.displayname}`;\n var msg = `${agent.displayname} added ${agentName} in join conversation`;\n var messagePayload = {\n data: {\n flag: \"note\",\n channel_id: channelId,\n bot_id: botId,\n org_id: orgId,\n account_id: localStorage.getItem(\"atua\"),\n conversation_id: conversationId,\n agent_id: agent.uid,\n agentName: agent.displayname,\n assign_id: assigneeID,\n contact_id: contactId,\n contact: contactData,\n label_id: \"\",\n message: [\n {\n content_type: 10,\n content: msg,\n media: {\n media_type: \"\",\n media_path: \"\",\n },\n message_type: \"text\",\n },\n ],\n },\n position: \"right\",\n sender_type: 0,\n };\n\n socket.current.emit(\"chatSentFromApp\", messagePayload);\n };\n return (\n <>\n \n {!!loginStatus && !!loginStatus.data ? (\n loginStatus.data.map(\n (item, i) =>\n !!item.signinsignout[0] &&\n !!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable > 0 && (\n \n {!!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 1 && (\n <>\n \n \n \n \n >\n )}\n\n {!!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 2 && (\n <>\n \n \n \n \n >\n )}\n\n {!!item.signinsignout[0].availability[0] &&\n item.signinsignout[0].availability[0].isAvailable === 3 && (\n <>\n \n \n \n \n >\n )}\n\n {/* {!!agent && agent.uid !== item._id && (\n <>\n \n \n >\n )} */}\n\n {!!joinChatAgentStatus &&\n joinChatAgentStatus.map(\n (chatItem) =>\n !!chatItem &&\n !!agent &&\n agent.uid !== item._id &&\n chatItem.agent_id === item._id &&\n chatItem.isJoinChat === 1 && (\n \n )\n )}\n {!!joinChatAgentStatus &&\n joinChatAgentStatus.map(\n (chatItem) =>\n !!chatItem &&\n !!agent &&\n agent.uid !== item._id &&\n chatItem.agent_id === item._id &&\n chatItem.isJoinChat === 0 && (\n \n )\n )}\n \n )\n )\n ) : (\n \n There are no Previous Conversations associated to this Contacts.\n \n )}\n
\n >\n );\n};\n\nexport default JoinCall;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Typography,\n} from \"@mui/material\";\nimport { ExpandMore as ExpandMoreIcon } from \"@mui/icons-material\";\nimport ChatAssignedAgent from \"./ChatAssignedAgent\";\nimport LabelAccordion from \"./LabelAccordion\";\nimport JoinCall from \"./JoinCall\";\nconst AccordionPannel = styled(`div`)`\n background-color: #e9f0fb;\n`;\n\nconst ConversationalActions = ({ socket }) => {\n const [expanded, setExpanded] = React.useState(false);\n const handleChange = (panel) => (event, isExpanded) => {\n setExpanded(isExpanded ? panel : false);\n };\n return (\n <>\n \n \n }>\n Chat Assigned Agent\n \n \n \n \n \n\n \n }>\n Join Chat\n \n \n \n \n \n \n }>\n Labels \n \n \n \n \n \n \n >\n );\n};\n\nexport default ConversationalActions;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Typography,\n} from \"@mui/material\";\nimport { ExpandMore as ExpandMoreIcon } from \"@mui/icons-material\";\nimport PreviousConversation from \"./conversationalActions/PreviousConversation\";\nimport CompanyAttributes from \"./conversationalActions/CompanyAttributes\";\nimport AgentStatus from \"./conversationalActions/AgentStatus\";\nimport ConversationalActions from \"./conversationalActions/ConversationalActions\";\n\nconst AccordionPannel = styled(`div`)`\n background-color: #eeeeee;\n`;\nconst AccordionDetailsHistory = styled(AccordionDetails)`\n // overflow-y: scroll;\n // height: 30vh;\n`;\n\nconst ChatControlledAccordion = ({ socket }) => {\n const [expanded, setExpanded] = React.useState(false);\n\n const handleChange = (panel) => (event, isExpanded) => {\n setExpanded(isExpanded ? panel : false);\n };\n return (\n <>\n \n \n }>\n Agents Status\n \n \n \n \n \n \n }>\n Conversational Actions\n \n \n \n \n \n \n }>\n Company Attributes\n \n \n \n \n \n {/* \n }>\n Contact Attributes\n \n \n \n Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer\n sit amet egestas eros, vitae egestas augue. Duis vel est augue.\n \n \n */}\n \n }>\n Previous Conversation\n \n \n \n \n \n \n >\n );\n};\n\nexport default ChatControlledAccordion;\n","import React from \"react\";\n\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport { Box, Grid, Divider as MuiDivider } from \"@mui/material\";\nimport ChatSidebar from \"../leftPannel/ChatSidebar\";\nimport ChatHeader from \"./ChatHeader\";\nimport ContactDetails from \"./ContactDetails\";\nimport ChatMessagePannel from \"./ChatMessage\";\nimport ChatControlledAccordion from \"./ChatControlledAccordion\";\nimport MessageIcon from \"@mui/icons-material/Message\";\nimport { useSelector } from \"react-redux\";\nconst Divider = styled(MuiDivider)(spacing);\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst NoConversation = styled(`div`)`\n background-color: ${(props) => props.theme.sidebar.header.chip.color};\n padding: ${(props) => props.theme.spacing(2)};\n width: 100%;\n height: 95vh;\n text-align: center;\n position: relative;\n`;\nconst NoTitle = styled(`span`)`\n top: 45%;\n left: 20%;\n position: absolute;\n`;\nconst MessageIcons = styled(MessageIcon)`\n font-size: 7rem;\n color: ${(props) => props.theme.sidebar.footer.online.background};\n margin-bottom: 5px;\n`;\n\nconst RightChatPannel = ({ socket }) => {\n const { conversationId } = useSelector((state) => state.chatSettings);\n\n return (\n <>\n \n \n \n \n \n \n \n \n {!!conversationId ? (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ) : (\n \n \n \n \n \n \n Uh oh! Looks like there are no messages.\n
\n \n \n \n \n )}\n \n >\n );\n};\n\nexport default RightChatPannel;\n","import { useEffect } from \"react\";\nimport jwtDecode from \"jwt-decode\";\n\nlet expiredTimer;\n\nconst handleTokenExpired = (exp) => {\n // Clear any existing timer\n window.clearTimeout(expiredTimer);\n\n // Get the current time in milliseconds\n const currentTime = Date.now();\n\n // Calculate the time left until the token expires\n const timeLeft = exp * 1000 - currentTime;\n\n // Set a new timer if the token has not yet expired\n if (timeLeft > 0) {\n expiredTimer = window.setTimeout(() => {\n // Redirect to home page when the token expires\n window.location.href = \"/\";\n }, timeLeft);\n } else {\n // Immediately redirect if the token has already expired\n window.location.href = \"/\";\n }\n};\n\nconst useTokenExpirationHandler = () => {\n useEffect(() => {\n const handleTokenFromLocalStorage = () => {\n // Retrieve the token from local storage\n const token = localStorage.getItem(\"accessToken\");\n\n if (token) {\n try {\n // Decode the token\n const decoded = jwtDecode(token);\n\n // Check if the token has an exp field\n if (decoded && decoded.exp) {\n // Handle token expiration\n handleTokenExpired(decoded.exp);\n } else {\n // Redirect immediately if the token is invalid\n window.location.href = \"/\";\n }\n } catch (error) {\n console.error(\"Failed to decode token:\", error);\n // Redirect immediately if decoding fails\n window.location.href = \"/\";\n }\n } else {\n // Redirect immediately if no token is found\n window.location.href = \"/\";\n }\n };\n\n handleTokenFromLocalStorage();\n }, []); // Empty dependency array means this effect runs once when the component mounts\n};\n\nexport default useTokenExpirationHandler;\n","import React, { useEffect, useRef } from \"react\";\nimport { io } from \"socket.io-client\";\nimport { basePathConfig } from \"../../../config\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport { Helmet } from \"react-helmet-async\";\nimport { Grid } from \"@mui/material\";\nimport LeftChatPannel from \"./leftPannel/LeftChatPannel\";\nimport RightChatPannel from \"./rightPannel/RightChatPannel\";\nimport { useDispatch } from \"react-redux\";\nimport CryptoJS from \"crypto-js\"; // Import crypto-js for hashing\nimport {\n fun_ChatFromoneSpoc,\n fun_LoginLogout,\n fun_Contact_Upate,\n fun_TodaysChat,\n} from \"../../../redux/slices/socketsSlice\";\nimport { isValidToken } from \"../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nimport useTokenExpirationHandler from \"../../../utils/useTokenExpirationHandler\";\n\nconst TopSpacing = styled(\"div\")(spacing);\n\nconst ChatPannel = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const socket = useRef(null);\n const processedMessages = useRef(new Set()); // To track processed messages\n const notificationIcon = localStorage.getItem(\"awlogo\");\n\n useTokenExpirationHandler();\n\n useEffect(() => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n return;\n }\n\n // Initialize socket connection\n socket.current = io(basePathConfig.socketURL, {\n reconnectionDelayMax: 10000,\n });\n\n socket.current.on(\"connect\", () => {\n console.info(\n `Successfully connected to socket ${basePathConfig.socketURL}`\n );\n });\n\n const accountID = window.localStorage.getItem(\"atua\");\n socket.current.emit(\"joinRoom\", accountID);\n\n socket.current.on(\"chatFromoneSpoc\", (data) => {\n const messageKey = CryptoJS.SHA256(\n `${data?.data?.message[0]?.created_at}-${data?.data?.message[0]?.content}`\n ).toString();\n\n if (processedMessages.current.has(messageKey)) return;\n\n processedMessages.current.add(messageKey);\n //console.log(\"New message:\", data);\n\n // Dispatch the action for new messages\n dispatch(fun_ChatFromoneSpoc(data));\n\n // Show notification only if the tab is not in focus\n if (document.visibilityState === \"hidden\") {\n sendNotification(\n data?.data?.contact?.name,\n data?.data?.message[0]?.content\n );\n }\n });\n\n socket.current.on(\"todaysChat\", (data) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n }\n dispatch(fun_TodaysChat(data));\n });\n\n socket.current.on(\"loginlogoutstatus\", (data) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n }\n dispatch(fun_LoginLogout(data));\n });\n\n socket.current.on(\"contact_update\", (data) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n }\n dispatch(fun_Contact_Upate(data));\n });\n\n // Clean up socket and event listeners\n return () => {\n if (socket.current) {\n socket.current.off(\"chatFromoneSpoc\"); // Remove chat listener\n socket.current.disconnect(); // Disconnect socket\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accessToken, dispatch, navigate]);\n\n const sendNotification = (name, content) => {\n if (!(\"Notification\" in window)) {\n console.log(\"This browser does not support notifications.\");\n return;\n }\n\n Notification.requestPermission().then((permission) => {\n if (permission === \"granted\") {\n const notification = new Notification(\"Live-Agent\", {\n body: `You have a new message from ${name}: ${content}`,\n icon: `${notificationIcon}`,\n });\n // Handle click event to open the tab\n notification.onclick = () => {\n window.focus(); // Bring the tab to focus if it's already open\n };\n }\n });\n };\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n );\n};\n\nexport default ChatPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box as MuiBox,\n Chip,\n Divider as MuiDivider,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText as MuiListItemText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { green } from \"@mui/material/colors\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAllLabels } from \"../../../../redux/slices/labels\";\n// import SettingsList from \"./SettingsList\";\n//import ConversationsList from \"./ConversationsList\";\nconst ListItemText = styled(MuiListItemText)(spacing);\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst Box = styled(MuiBox)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Brand = styled(ListItemButton)`\n font-size: ${(props) => props.theme.typography.h5.fontSize};\n font-weight: ${(props) => props.theme.typography.fontWeightMedium};\n color: ${(props) => props.theme.sidebar.header.color};\n font-family: ${(props) => props.theme.typography.fontFamily};\n min-height: 40px;\n padding-right: ${(props) => props.theme.spacing(6)};\n justify-content: center;\n flex-grow: 0;\n margin-bottom: -14px;\n padding-top: 14px;\n\n ${(props) => props.theme.breakpoints.up(\"sm\")} {\n min-height: 40px;\n }\n`;\nconst BrandChip = styled(Chip)`\n background-color: ${green[700]};\n border-radius: 5px;\n color: ${(props) => props.theme.palette.common.white};\n font-size: 55%;\n height: 18px;\n margin-left: 2px;\n margin-top: -16px;\n padding: 3px 0;\n\n span {\n padding-left: ${(props) => props.theme.spacing(1.375)};\n padding-right: ${(props) => props.theme.spacing(1.375)};\n }\n`;\n\nconst LeftContactPannel = () => {\n const dispatch = useDispatch();\n const { data: labels } = useSelector((state) => state.labels);\n React.useEffect(() => {\n dispatch(fetchAllLabels());\n }, [dispatch]);\n return (\n <>\n \n \n \n Live-Agent \n \n \n \n \n \n \n Tagged with\n \n \n {!!labels && !!labels.data\n ? labels.data.map((item, i) => (\n \n \n \n \n \n \n ))\n : []}\n
\n \n >\n );\n};\n\nexport default LeftContactPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Avatar as MuiAvatar,\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n Grid,\n InputBase,\n IconButton,\n Paper as MuiPaper,\n Divider as MuiDivider,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n //Button,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport // Add as AddIcon,\n// Delete as DeleteIcon,\n// Edit as EditIcon,\n\"@mui/icons-material\";\nimport { spacing } from \"@mui/system\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\nimport { fetchContacts } from \"../../../../redux/slices/contact\";\nimport { useDispatch, useSelector } from \"react-redux\";\n//import UnAuthenticated from \"../../UnAuthenticated\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\n\nconst Divider = styled(MuiDivider)(spacing);\n// const timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Avatar = styled(MuiAvatar)`\n margin-right: ${(props) => props.theme.spacing(2)};\n`;\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\n\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nfunction createData(\n srno,\n id,\n photo,\n name,\n company_name,\n email,\n label_id,\n title,\n color\n) {\n return { srno, id, photo, name, company_name, email, label_id, title, color };\n}\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"color\",\n numeric: false,\n disablePadding: true,\n label: \"Color\",\n },\n { id: \"photo\", numeric: false, disablePadding: true, label: \"Pic\" },\n {\n id: \"name\",\n numeric: false,\n disablePadding: true,\n label: \"Name\",\n },\n {\n id: \"company_name\",\n numeric: false,\n disablePadding: true,\n label: \"Company Name\",\n },\n {\n id: \"email\",\n numeric: false,\n disablePadding: true,\n label: \"Email\",\n },\n];\n\nconst EnhancedTableHead = (props) => {\n const {\n //onSelectAllClick,\n order,\n orderBy,\n //numSelected,\n //rowCount,\n onRequestSort,\n } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {/* \n 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ \"aria-label\": \"select all desserts\" }}\n />\n */}\n {headCells.map((headCell, i) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({ contacts, status }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(8);\n const [search, setSearch] = React.useState(\"\");\n React.useEffect(() => {\n setDense(true);\n }, []);\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n\n // rowsData =\n // !!contacts &&\n // !!contacts.data &&\n // (!!contacts.data.length > 0\n // ? contacts.data.map((item, i) =>\n // createData(\n // ++i,\n // item._id,\n // item.photo,\n // item.name,\n // item.company_name,\n // item.email,\n // item.label_id,\n // !!item.LabelData && item.LabelData.length !== 0\n // ? item.LabelData[0].title\n // : \"\",\n // !!item.LabelData && item.LabelData.length !== 0\n // ? item.LabelData[0].color\n // : \"\"\n // )\n // )\n // : []);\n\n // rows =\n // search === \"\"\n // ? rowsData\n // : rowsData.filter(\n // (i) =>\n // i.name.toLowerCase().includes(search.toLowerCase()) ||\n // i.title.toLowerCase().includes(search.toLowerCase())\n // );\n\n rowsData =\n !!contacts &&\n !!contacts.data &&\n (!!contacts.data.length > 0\n ? contacts.data.map((item, i) =>\n createData(\n ++i,\n item._id,\n item.photo,\n item.name,\n item.company_name,\n item.email,\n item.label_id,\n !!item.LabelData && item.LabelData.length !== 0\n ? item.LabelData[0].title\n : \"\",\n !!item.LabelData && item.LabelData.length !== 0\n ? item.LabelData[0].color\n : \"\"\n )\n )\n : []);\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.name.toLowerCase().includes(search.toLowerCase()) ||\n i.title.toLowerCase().includes(search.toLowerCase())\n );\n\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n \n {\n // setSearch(e.target.value);\n // }}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n \n \n Contacts List\n \n
\n \n \n {/* }\n label=\"Dense padding\"\n /> */}\n
\n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!contacts &&\n !!contacts.status &&\n parseInt(contacts.status) !== 200 && (\n \n \n Error: (status-code : {contacts.status})\n \n {contacts.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n \n
\n );\n}\n\nfunction ContactsTable() {\n const dispatch = useDispatch();\n const { data: contacts, status } = useSelector((state) => state.contact);\n React.useEffect(() => {\n dispatch(fetchContacts());\n }, [dispatch]);\n return (\n \n \n \n {/* */}\n \n \n \n \n );\n}\n\nexport default ContactsTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport PeopleIcon from \"@mui/icons-material/People\";\nimport ContactsTable from \"./ContactsTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst RightContactPannel = () => {\n return (\n <>\n \n \n \n Contacts\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n );\n};\n\nexport default RightContactPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport { Helmet } from \"react-helmet-async\";\nimport { Grid } from \"@mui/material\";\nimport LeftContactPannel from \"./leftPannel/LeftContactPannel\";\nimport RightContactPannel from \"./rightPannel/RightContactPannel\";\nimport { isValidToken } from \"../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../redux/slices/login\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nconst TopSpacing = styled(\"div\")(spacing);\n\nconst Contacts = () => {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const dispatch = useDispatch();\n const navigate = useNavigate();\n React.useEffect(() => {\n !isValidToken(accessToken) && dispatch(fetchLogOut());\n !isValidToken(accessToken) && dispatch(fetchLoginLogOut_Socket());\n !isValidToken(accessToken) && dispatch(logout());\n !isValidToken(accessToken) && navigate(\"/\");\n }, [accessToken, dispatch, navigate]);\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n );\n};\n\nexport default Contacts;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport const settingsSlice = createSlice({\n name: \"settings\",\n initialState: {\n settingsList: \"canned_responses\",\n settingsData: [],\n },\n reducers: {\n settingsMenu: (state, action) => {\n state.settingsList = action.payload.list;\n state.settingsData = action.payload.listData;\n },\n },\n});\nexport const { setSettingsList, setSettingsData, settingsMenu } =\n settingsSlice.actions;\nexport default settingsSlice.reducer;\n","// export default SettingsList;\nimport React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n List,\n ListItemButton,\n ListItemText as MuiListItemText,\n //ListItemIcon,\n} from \"@mui/material\";\nimport PeopleIcon from \"@mui/icons-material/People\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport ChatIcon from \"@mui/icons-material/Chat\";\nimport QuestionAnswerIcon from \"@mui/icons-material/QuestionAnswer\";\nimport SettingsSuggestIcon from \"@mui/icons-material/SettingsSuggest\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { settingsMenu } from \"../../../../redux/slices/settings\";\nimport { isValidToken } from \"../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst LiButton = styled(ListItemButton)`\n color: ${(props) => props.theme.palette.secondary.main};\n font-weight: ${(props) => props.theme.typography.fontWeightBoldTop};\n`;\n\nconst SettingsList = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const [listName, setListName] = React.useState(\"canned_responses\");\n const { settingsList } = useSelector((state) => state.settings);\n const callList = (name) => {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setListName(name);\n dispatch(\n settingsMenu({\n list: name,\n listData: [],\n })\n );\n }\n };\n\n React.useEffect(() => {\n !!settingsList && setListName(settingsList);\n }, [settingsList]);\n return (\n <>\n \n {/* //canned_responses */}\n {!!listName && listName === \"canned_responses\" ? (\n {\n callList(\"canned_responses\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"canned_responses\");\n }}\n >\n \n \n \n )}\n {/* //labels */}\n {!!listName && listName === \"labels\" ? (\n {\n callList(\"labels\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"labels\");\n }}\n >\n \n \n \n )}\n {/* //companyattributes */}\n {!!listName && listName === \"companyattributes\" ? (\n {\n callList(\"companyattributes\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"companyattributes\");\n }}\n >\n \n \n \n )}\n {/* //agents */}\n {!!listName && listName === \"agents\" ? (\n {\n callList(\"agents\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"agents\");\n }}\n >\n \n \n \n )}\n {/* //Chat history viewer */}\n {!!listName && listName === \"chat_history_viewer\" ? (\n {\n callList(\"chat_history_viewer\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"chat_history_viewer\");\n }}\n >\n \n \n \n )}\n {/* //accountsettings */}\n {!!listName && listName === \"accountsettings\" ? (\n {\n callList(\"accountsettings\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"accountsettings\");\n }}\n >\n \n \n \n )}\n
\n >\n );\n};\n\nexport default SettingsList;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box as MuiBox,\n Chip,\n Divider as MuiDivider,\n ListItemButton,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { green } from \"@mui/material/colors\";\nimport SettingsList from \"./SettingsList\";\n//import ConversationsList from \"./ConversationsList\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst Box = styled(MuiBox)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Brand = styled(ListItemButton)`\n font-size: ${(props) => props.theme.typography.h5.fontSize};\n font-weight: ${(props) => props.theme.typography.fontWeightMedium};\n color: ${(props) => props.theme.sidebar.header.color};\n font-family: ${(props) => props.theme.typography.fontFamily};\n min-height: 40px;\n padding-right: ${(props) => props.theme.spacing(6)};\n justify-content: center;\n flex-grow: 0;\n margin-bottom: -14px;\n padding-top: 14px;\n\n ${(props) => props.theme.breakpoints.up(\"sm\")} {\n min-height: 40px;\n }\n`;\nconst BrandChip = styled(Chip)`\n background-color: ${green[700]};\n border-radius: 5px;\n color: ${(props) => props.theme.palette.common.white};\n font-size: 55%;\n height: 18px;\n margin-left: 2px;\n margin-top: -16px;\n padding: 3px 0;\n\n span {\n padding-left: ${(props) => props.theme.spacing(1.375)};\n padding-right: ${(props) => props.theme.spacing(1.375)};\n }\n`;\n\nconst LeftSettingPannel = () => {\n return (\n <>\n \n \n \n Live-Agent \n \n \n \n \n \n \n Settings\n \n \n \n >\n );\n};\n\nexport default LeftSettingPannel;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch all labels Data\nexport const fetchAccount = createAsyncThunk(\"account/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/onespoc_webhook/account/${accountID}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const accountSlice = createSlice({\n name: \"agents\",\n initialState: {\n data: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAccount.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAccount.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAccount.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setAccount, setStatus } = accountSlice.actions;\nexport default accountSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Alert as MuiAlert,\n AlertTitle,\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n TextField as MuiTextField,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport SettingsSuggestIcon from \"@mui/icons-material/SettingsSuggest\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchAccount } from \"../../../../redux/slices/account\";\n//import UnAuthenticated from \"../../UnAuthenticated\";\nconst Alert = styled(MuiAlert)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TextField = styled(MuiTextField)`\n margin-top: 5px;\n margin-right: 5px;\n padding: 11px;\n`;\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst AccountSettings = () => {\n const dispatch = useDispatch();\n const { data: account, status } = useSelector((state) => state.account);\n React.useEffect(() => {\n dispatch(fetchAccount());\n }, [dispatch]);\n return (\n <>\n {/* */}\n \n \n \n Account Settings\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!account && !!account.status && parseInt(account.status) !== 200 && (\n \n Error: (status-code : {account.status})\n {account.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n \n \n \n \n \n \n \n General settings\n \n \n \n Account Name\n \n \n Conversation continuity with emails is enabled for your\n account.\n \n \n Number of days after a ticket should auto resolve if there\n is no activity\n \n \n \n \n \n\n \n \n \n Account ID\n \n \n This ID is required if you are building an API based\n integration\n \n \n \n Account ID\n \n \n \n \n \n \n \n \n \n {/* \n This account created by 1SPOC.{\" \"}\n */}\n \n \n \n \n \n \n {/* \n Account Settings\n \n \n Canned Responses are saved reply templates which can be used\n to quickly send out a reply to a conversation\n \n \n For creating a Canned Response, just click on theAdd Canned\n Response. You can also edit or delete an existing Canned\n Response by clicking on the Edit or Delete button.\n \n \n Canned responses are used with the help of Short Codes. Agents\n can access canned responses while on a chat by typing '/'\n followed by the short code.\n */}\n \n \n \n \n \n >\n );\n};\n\nexport default AccountSettings;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch all labels Data\nexport const fetchAllAgents = createAsyncThunk(\"agents/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/account_agent/account/${accountID}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const agentsSlice = createSlice({\n name: \"agents\",\n initialState: {\n data: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllAgents.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllAgents.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllAgents.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setAgents, setStatus } = agentsSlice.actions;\nexport default agentsSlice.reducer;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nimport { logout } from \"../../redux/slices/login\";\nconst UnAuthenticated = ({ isAuthenticateData }) => {\n // for unAuthenticated user access\n\n const navigate = useNavigate();\n const dispatch = useDispatch();\n var [isAuthenticated, setIsAuthenticated] = React.useState(true);\n React.useEffect(() => {\n !!isAuthenticateData &&\n parseInt(isAuthenticateData.status) === 401 &&\n setIsAuthenticated(false);\n }, [isAuthenticateData]);\n\n if (!isAuthenticated) {\n dispatch(logout());\n navigate(\"/\");\n }\n // for unAuthenticated user access close\n return <>>;\n};\n\nexport default UnAuthenticated;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Avatar as MuiAvatar,\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n InputBase,\n IconButton,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n //Button,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport // Add as AddIcon,\n// Delete as DeleteIcon,\n// Edit as EditIcon,\n\"@mui/icons-material\";\nimport { spacing } from \"@mui/system\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\nimport { fetchAllAgents } from \"../../../../../redux/slices/agents\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport UnAuthenticated from \"../../../UnAuthenticated\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\n\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\n\n// const timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Avatar = styled(MuiAvatar)`\n margin-right: ${(props) => props.theme.spacing(2)};\n`;\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\nfunction createData(srno, id, avatar, name, displayname) {\n return { srno, id, avatar, name, displayname };\n}\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n { id: \"avatar\", numeric: false, disablePadding: true, label: \"Pic\" },\n {\n id: \"name\",\n numeric: false,\n disablePadding: true,\n label: \"Name\",\n },\n {\n id: \"displayname\",\n numeric: false,\n disablePadding: true,\n label: \"Display Name\",\n },\n // {\n // id: \"action\",\n // numeric: false,\n // disablePadding: true,\n // label: \"Actions\",\n // },\n];\n\nconst EnhancedTableHead = (props) => {\n const {\n //onSelectAllClick,\n order,\n orderBy,\n // numSelected,\n // rowCount,\n onRequestSort,\n } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {/* \n 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ \"aria-label\": \"select all desserts\" }}\n />\n */}\n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({ agents, status }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\n const [search, setSearch] = React.useState(\"\");\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n rowsData =\n !!agents && !!agents.data\n ? agents.data.map((item, i) =>\n createData(++i, item._id, item.avatar, item.name, item.displayname)\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.name.toLowerCase().includes(search.toLowerCase()) ||\n i.displayname.toLowerCase().includes(search.toLowerCase())\n );\n\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n Agents List\n \n
\n \n \n {/* }\n label=\"Dense padding\"\n /> */}\n
\n \n \n \n \n \n {\n // setSearch(e.target.value);\n // }}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!agents && !!agents.status && parseInt(agents.status) !== 200 && (\n \n Error: (status-code : {agents.status})\n {agents.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n {!!rows &&\n stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.short_code);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n role=\"checkbox\"\n aria-checked={isItemSelected}\n tabIndex={-1}\n // key={row._id}\n key={index}\n selected={isItemSelected}\n >\n {/* \n \n */}\n\n \n \n \n \n {row.name}\n \n {row.displayname}\n {/* \n \n \n */}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction AgentsTable() {\n const dispatch = useDispatch();\n const { data: agents, status } = useSelector((state) => state.agents);\n React.useEffect(() => {\n dispatch(fetchAllAgents());\n }, [dispatch]);\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nexport default AgentsTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport PeopleIcon from \"@mui/icons-material/People\";\nimport AgentsTable from \"./agents/AgentsTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\nconst Agents = () => {\n return (\n <>\n \n \n \n Agents\n \n \n \n \n \n \n \n \n \n \n \n \n \n Agents\n \n \n An Agent is a member of your Customer Support team.\n \n \n Agents will be able to view and reply to messages from your\n users. The list shows all agents currently in your account.\n \n \n Click on Add Agent to add a new agent. Agent you add will\n receive an email with a confirmation link to activate their\n account, after which they can access live-agent and respond to\n messages.\n \n \n Access to live-agent's features are based on following roles.\n \n \n Agent - Agents with this role can only access inboxes, reports\n and conversations. They can assign conversations to other\n agents or themselves and resolve conversations.\n \n\n \n Administrator - Administrator will have access to all\n live-agent features enabled for your account, including\n settings, along with all of a normal agents' privileges.\n \n \n \n \n \n \n >\n );\n};\n\nexport default Agents;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n IconButton,\n InputBase,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport {\n Add as AddIcon,\n Delete as DeleteIcon,\n Edit as EditIcon,\n} from \"@mui/icons-material\";\nimport { spacing } from \"@mui/system\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\n//import { useNavigate } from \"react-router-dom\";\nimport { fetchAllCannedResponses } from \"../../../../../redux/slices/cannedResponses\";\nimport { useDispatch, useSelector } from \"react-redux\";\n//import UnAuthenticated from \"../../../UnAuthenticated\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport { useNavigate } from \"react-router-dom\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\n\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\nfunction createData(srno, id, short_code, content) {\n return { srno, id, short_code, content };\n}\nvar rows = [];\nvar rowsData = [];\n// var rows = [\n// createData(\"Cupcake\", \"305\", \"3.7\"),\n// createData(\"Donut\", \"452\", \"25.0\"),\n// ];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"short_code\",\n numeric: false,\n disablePadding: true,\n label: \"Short Code\",\n },\n { id: \"content\", numeric: false, disablePadding: true, label: \"Content\" },\n {\n id: \"action\",\n numeric: false,\n disablePadding: true,\n label: \"Actions\",\n },\n];\n\nconst EnhancedTableHead = (props) => {\n const {\n //onSelectAllClick,\n order,\n orderBy,\n //numSelected,\n //rowCount,\n onRequestSort,\n } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {/* \n 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ \"aria-label\": \"select all desserts\" }}\n />\n */}\n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({ cannedResponses, status, dispatch }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(8);\n const [search, setSearch] = React.useState(\"\");\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n React.useEffect(() => {\n setDense(true);\n }, []);\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const handleEdit = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses_edit\",\n listData: row,\n })\n );\n }\n };\n\n const handleDelete = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses_delete\",\n listData: row,\n })\n );\n }\n };\n\n const handleAdd = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses_add\",\n listData: [],\n })\n );\n }\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n rowsData =\n !!cannedResponses && !!cannedResponses.data\n ? cannedResponses.data.map((item, i) =>\n createData(++i, item._id, item.short_code, item.content)\n )\n : [];\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.short_code.toLowerCase().includes(search.toLowerCase()) ||\n i.content.toLowerCase().includes(search.toLowerCase())\n );\n\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n Canned Responses List\n \n
\n \n \n
\n {/*
}\n label=\"Dense padding\"\n /> */}\n
\n \n \n \n \n \n setSearch(e.target.value)}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!cannedResponses &&\n !!cannedResponses.status &&\n parseInt(cannedResponses.status) !== 200 && (\n \n \n Error: (status-code : {cannedResponses.status})\n \n {cannedResponses.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n {!!rows &&\n stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.short_code);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.short_code)}\n role=\"checkbox\"\n aria-checked={isItemSelected}\n tabIndex={-1}\n key={row.srno}\n selected={isItemSelected}\n >\n {/* \n \n */}\n \n {row.short_code}\n \n {row.content}\n \n {\n handleEdit(row);\n }}\n />\n {\n handleDelete(row);\n }}\n />\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction CannedResponsesTable() {\n const dispatch = useDispatch();\n\n const { data: cannedResponses, status } = useSelector(\n (state) => state.cannedResponses\n );\n React.useEffect(() => {\n dispatch(fetchAllCannedResponses());\n }, [dispatch]);\n\n return (\n \n \n \n {/* */}\n \n \n \n \n );\n}\n\nexport default CannedResponsesTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport QuestionAnswerIcon from \"@mui/icons-material/QuestionAnswer\";\nimport CannedResponsesTable from \"./cannedResponses/CannedResponsesTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst CannedResponses = () => {\n return (\n <>\n \n \n \n Canned Responses\n \n \n \n \n \n \n \n {/* \n \n \n \n \n \n */}\n \n \n \n \n \n \n Canned Responses\n \n \n Canned Responses are saved reply templates which can be used\n to quickly send out a reply to a conversation\n \n \n For creating a Canned Response, just click on theAdd Canned\n Response. You can also edit or delete an existing Canned\n Response by clicking on the Edit or Delete button.\n \n \n Canned responses are employed with the assistance of short\n codes, enabling agents to access pre-defined responses by\n simply writing the corresponding short code.\n \n \n \n \n \n \n >\n );\n};\n\nexport default CannedResponses;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n} from \"@mui/material\";\nimport QuestionAnswerIcon from \"@mui/icons-material/QuestionAnswer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n addCannedResponces,\n reset,\n} from \"../../../../../redux/slices/cannedResponses\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst initialValues = {\n short_code: \"\",\n content: \"\",\n};\n\nconst validationSchema = Yup.object().shape({\n short_code: Yup.string().max(10).required(\"Required\"),\n content: Yup.string().required(\"Required\"),\n});\n\nconst AddCannedResponses = ({ dispatch }) => {\n const { addData } = useSelector((state) => state.cannedResponses);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(addCannedResponces(values));\n resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n };\n\n return (\n <>\n \n
\n \n \n \n Add new Canned Responses\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!addData &&\n (!!addData.status && parseInt(addData.status) !== 201 ? (\n \n {!!addData && addData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CannedResponsesAdd = () => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Canned Responses\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Canned Responses\n \n \n Canned Responses are saved reply templates which can be used\n to quickly send out a reply to a conversation\n \n \n For creating a Canned Response, just click on theAdd Canned\n Response. You can also edit or delete an existing Canned\n Response by clicking on the Edit or Delete button.\n \n \n Canned responses are used with the help of Short Codes. Agents\n can access canned responses while on a chat by typing '/'\n followed by the short code.\n \n \n \n \n \n \n >\n );\n};\nexport default CannedResponsesAdd;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n Table,\n TableBody,\n TableCell as MuiTableCell,\n TableRow as MuiTableRow,\n} from \"@mui/material\";\nimport QuestionAnswerIcon from \"@mui/icons-material/QuestionAnswer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n deleteCannedResponces,\n reset,\n} from \"../../../../../redux/slices/cannedResponses\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\n\nconst TableRow = styled(MuiTableRow)`\n height: 42px;\n`;\n\nconst TableCell = styled(MuiTableCell)`\n padding-top: 0;\n padding-bottom: 0;\n`;\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n};\n\nconst validationSchema = Yup.object().shape({});\n\nconst DeleteCannedResponses = ({ dispatch, data }) => {\n const { deleteData } = useSelector((state) => state.cannedResponses);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n id: data.id,\n };\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(deleteCannedResponces(values));\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n };\n\n return (\n <>\n \n
\n \n \n \n Delete Canned Responses\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!deleteData &&\n (!!deleteData.status &&\n parseInt(deleteData.status) !== 201 ? (\n \n {!!deleteData && deleteData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been Deleted successfully!\n \n )\n ))}\n {/* {!!deleteData &&\n !!deleteData.status &&\n parseInt(deleteData.status) !== 201 && (\n \n {!!deleteData && deleteData.message}\n \n )}\n\n {!!deleteData &&\n !!deleteData.status &&\n parseInt(deleteData.status) === 201 && (\n \n {!!deleteData && deleteData.message}\n \n )} */}\n\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CannedResponsesDelete = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Canned Responses\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Canned Responses\n \n \n Canned Responses are saved reply templates which can be used\n to quickly send out a reply to a conversation\n \n \n For creating a Canned Response, just click on theAdd Canned\n Response. You can also edit or delete an existing Canned\n Response by clicking on the Edit or Delete button.\n \n \n Canned responses are used with the help of Short Codes. Agents\n can access canned responses while on a chat by typing '/'\n followed by the short code.\n \n \n \n \n \n \n >\n );\n};\n\nexport default CannedResponsesDelete;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n} from \"@mui/material\";\nimport QuestionAnswerIcon from \"@mui/icons-material/QuestionAnswer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n editCannedResponces,\n reset,\n} from \"../../../../../redux/slices/cannedResponses\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n short_code: \"\",\n content: \"\",\n};\n\nconst validationSchema = Yup.object().shape({\n short_code: Yup.string().max(10).required(\"Required\"),\n content: Yup.string().required(\"Required\"),\n});\n\nconst EditCannedResponses = ({ dispatch, data }) => {\n const { editData } = useSelector((state) => state.cannedResponses);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n id: data.id,\n short_code: data.short_code,\n content: data.content,\n };\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(editCannedResponces(values));\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"canned_responses\",\n listData: [],\n })\n );\n }\n };\n\n return (\n <>\n \n
\n \n \n \n Edit Canned Responses\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!editData &&\n (!!editData.status && parseInt(editData.status) !== 201 ? (\n \n {!!editData && editData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CannedResponsesEdit = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Canned Responses\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Canned Responses\n \n \n Canned Responses are saved reply templates which can be used\n to quickly send out a reply to a conversation\n \n \n For creating a Canned Response, just click on theAdd Canned\n Response. You can also edit or delete an existing Canned\n Response by clicking on the Edit or Delete button.\n \n \n Canned responses are used with the help of Short Codes. Agents\n can access canned responses while on a chat by typing '/'\n followed by the short code.\n \n \n \n \n \n \n >\n );\n};\nexport default CannedResponsesEdit;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n// Thunks\n// fetch all company Attributes Data\nexport const fetchAllcompanyAttributes = createAsyncThunk(\n \"companyAttributesSlice/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/custom-attribute/mode/0`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const addCompanyAttributes = createAsyncThunk(\n \"companyAttributes/add\",\n async (payloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/custom-attribute`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const editCompanyAttributes = createAsyncThunk(\n \"companyAttributes/edit\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const payloadData = {\n display_name: payload.display_name,\n key: payload.key,\n display_type: payload.display_type,\n mode: 0,\n description: payload.description,\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/custom-attribute/${payload.id}`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const deleteCompanyAttributes = createAsyncThunk(\n \"companyAttributes/delete\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n\n const res = await axios.delete(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/custom-attribute/${payload.id}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nconst initialState = {\n data: [],\n addData: [],\n status: STATUSES.SUCCESS,\n};\n\nexport const companyAttributesSlice = createSlice({\n name: \"companyAttributes\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllcompanyAttributes.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllcompanyAttributes.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllcompanyAttributes.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(addCompanyAttributes.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(addCompanyAttributes.fulfilled, (state, action) => {\n state.addData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(addCompanyAttributes.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(editCompanyAttributes.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(editCompanyAttributes.fulfilled, (state, action) => {\n state.editData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(editCompanyAttributes.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.editData = [];\n })\n .addCase(deleteCompanyAttributes.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(deleteCompanyAttributes.fulfilled, (state, action) => {\n state.deleteData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(deleteCompanyAttributes.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.deleteData = [];\n });\n },\n});\nexport const {\n setCompanyAttributes,\n setStatus,\n reset,\n setEditData,\n setDeleteData,\n} = companyAttributesSlice.actions;\nexport default companyAttributesSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n Divider as MuiDivider,\n Grid,\n IconButton,\n InputBase,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport {\n Add as AddIcon,\n Delete as DeleteIcon,\n Edit as EditIcon,\n} from \"@mui/icons-material\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport { spacing } from \"@mui/system\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\nimport { fetchAllcompanyAttributes } from \"../../../../../redux/slices/companyAttributes\";\nimport { useDispatch, useSelector } from \"react-redux\";\n//import UnAuthenticated from \"../../../UnAuthenticated\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\n\nfunction createData(\n srno,\n id,\n display_name,\n key,\n display_type,\n mode,\n description\n) {\n return { srno, id, display_name, key, display_type, mode, description };\n}\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"display_name\",\n numeric: false,\n disablePadding: true,\n label: \"Display Name\",\n },\n { id: \"key\", numeric: false, disablePadding: true, label: \"key\" },\n {\n id: \"display_type\",\n numeric: false,\n disablePadding: true,\n label: \"Display Type\",\n },\n {\n id: \"action\",\n numeric: false,\n disablePadding: true,\n label: \"Actions\",\n },\n];\n\nconst EnhancedTableHead = (props) => {\n const {\n //onSelectAllClick,\n order,\n orderBy,\n //numSelected,\n //rowCount,\n onRequestSort,\n } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {/* \n 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ \"aria-label\": \"select all desserts\" }}\n />\n */}\n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({ companyAttributes, status, dispatch }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\n const [search, setSearch] = React.useState(\"\");\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n React.useEffect(() => {\n setDense(true);\n }, []);\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n const handleAdd = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes_add\",\n listData: [],\n })\n );\n }\n };\n\n const handleEdit = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes_edit\",\n listData: row,\n })\n );\n }\n };\n\n const handleDelete = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes_delete\",\n listData: row,\n })\n );\n }\n };\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n rowsData =\n !!companyAttributes && !!companyAttributes.data\n ? companyAttributes.data.map((item, i) =>\n createData(\n ++i,\n item._id,\n item.display_name,\n item.key,\n item.display_type,\n item.mode,\n item.description\n )\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.display_name.toLowerCase().includes(search.toLowerCase()) ||\n i.key.toLowerCase().includes(search.toLowerCase())\n );\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n Company Attributes List\n \n
\n \n \n
\n {/*
}\n label=\"Dense padding\"\n /> */}\n
\n \n \n \n \n \n {\n // setSearch(e.target.value);\n // }}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!companyAttributes &&\n !!companyAttributes.status &&\n parseInt(companyAttributes.status) !== 200 && (\n \n \n Error: (status-code : {companyAttributes.status})\n \n {companyAttributes.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n {!!rows &&\n stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n \n handleClick(event, row.display_name)\n }\n role=\"checkbox\"\n aria-checked={isItemSelected}\n tabIndex={-1}\n key={row.srno}\n selected={isItemSelected}\n >\n {/* \n \n */}\n \n {row.display_name}\n \n {row.key}\n \n {row.display_type === 0 ? \"Link\" : \"Text\"}\n \n \n {\n handleEdit(row);\n }}\n />\n {\n handleDelete(row);\n }}\n />\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction CompanyAttributesTable() {\n const dispatch = useDispatch();\n const { data: companyAttributes, status } = useSelector(\n (state) => state.companyAttributes\n );\n React.useEffect(() => {\n dispatch(fetchAllcompanyAttributes());\n }, [dispatch]);\n return (\n \n \n \n {/* */}\n \n \n \n \n );\n}\n\nexport default CompanyAttributesTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport CompanyAttributesTable from \"./companyAttributes/CompanyAttributesTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst CompanyAttributes = () => {\n return (\n <>\n \n \n \n Company Attributes\n \n \n \n \n \n \n \n \n \n \n \n \n \n Company Attributes\n \n \n A custom attribute tracks facts about your\n contacts/conversation — like the subscription plan, or when\n they ordered the first item etc.\n \n \n For creating a Custom Attribute, just click on theAdd Custom\n Attribute . You can also edit or delete an existing Custom\n Attribute by clicking on the Edit or Delete button.\n \n \n \n \n \n \n >\n );\n};\n\nexport default CompanyAttributes;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n FormControl as MuiFormControl,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n Select,\n MenuItem,\n InputLabel,\n} from \"@mui/material\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport * as Yup from \"yup\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n addCompanyAttributes,\n reset,\n} from \"../../../../../redux/slices/companyAttributes\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst initialValues = {\n display_name: \"\",\n key: \"\",\n //display_type: \"\",\n description: \"\",\n};\n\nconst validationSchema = Yup.object().shape({\n display_name: Yup.string().max(10).required(\"Required\"),\n key: Yup.string().max(10).required(\"Required\"),\n //display_type: Yup.number().required(\"Required\"),\n description: Yup.string().required(\"Required\"),\n});\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\nconst AddCompanyAttribute = ({ dispatch }) => {\n const { addData } = useSelector((state) => state.cannedResponses);\n const [displayType, setDisplayType] = React.useState(0);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n var payload = {\n display_name: values.display_name,\n key: values.key,\n display_type: displayType,\n mode: 0,\n description: values.description,\n };\n\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(addCompanyAttributes(payload));\n resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Add Company Attributes\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!addData &&\n (!!addData.status && parseInt(addData.status) !== 201 ? (\n \n {!!addData && addData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CompanyAttributesAdd = () => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Company Attributes\n \n \n \n \n \n \n \n \n \n \n \n \n \n Company Attributes\n \n \n A custom attribute tracks facts about your\n contacts/conversation — like the subscription plan, or when\n they ordered the first item etc.\n \n \n For creating a Custom Attribute, just click on theAdd Custom\n Attribute . You can also edit or delete an existing Custom\n Attribute by clicking on the Edit or Delete button.\n \n \n \n \n \n \n >\n );\n};\n\nexport default CompanyAttributesAdd;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n Table,\n TableBody,\n TableCell as MuiTableCell,\n TableRow as MuiTableRow,\n} from \"@mui/material\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n deleteCompanyAttributes,\n reset,\n} from \"../../../../../redux/slices/companyAttributes\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\n\nconst TableRow = styled(MuiTableRow)`\n height: 42px;\n`;\n\nconst TableCell = styled(MuiTableCell)`\n padding-top: 0;\n padding-bottom: 0;\n`;\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n};\n\nconst validationSchema = Yup.object().shape({});\n\nconst DeleteCompanyAttributesData = ({ dispatch, data }) => {\n const { deleteData } = useSelector((state) => state.companyAttributes);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n id: data.id,\n };\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(deleteCompanyAttributes(values));\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Delete Company Attributes\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!deleteData &&\n (!!deleteData.status &&\n parseInt(deleteData.status) !== 201 ? (\n \n {!!deleteData && deleteData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been Deleted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CompanyAttributesDelete = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Company Attributes\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Company Attributes\n \n \n A custom attribute tracks facts about your\n contacts/conversation — like the subscription plan, or when\n they ordered the first item etc.\n \n \n For creating a Custom Attribute, just click on theAdd Custom\n Attribute . You can also edit or delete an existing Custom\n Attribute by clicking on the Edit or Delete button.\n \n \n \n \n \n \n >\n );\n};\nexport default CompanyAttributesDelete;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n FormControl as MuiFormControl,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n Select,\n MenuItem,\n InputLabel,\n} from \"@mui/material\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport * as Yup from \"yup\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n editCompanyAttributes,\n reset,\n} from \"../../../../../redux/slices/companyAttributes\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n display_name: \"\",\n key: \"\",\n description: \"\",\n display_type: 0,\n};\n\nconst validationSchema = Yup.object().shape({\n display_name: Yup.string().max(20).required(\"Required\"),\n key: Yup.string().max(10).required(\"Required\"),\n description: Yup.string().required(\"Required\"),\n});\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\nconst EditCompanyAttribute = ({ dispatch, data }) => {\n const { addData } = useSelector((state) => state.companyAttributes);\n const [displayType, setDisplayType] = React.useState(0);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n display_name: data.display_name,\n key: data.key,\n description: data.description,\n };\n React.useEffect(() => {\n setDisplayType(data.display_type);\n }, [data.display_type]);\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n var payload = {\n id: data.id,\n display_name: values.display_name,\n key: values.key,\n display_type: displayType,\n mode: 0,\n description: values.description,\n };\n\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(editCompanyAttributes(payload));\n //resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"companyattributes\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Edit Company Attributes\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!addData &&\n (!!addData.status && parseInt(addData.status) !== 201 ? (\n \n {!!addData && addData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst CompanyAttributesEdit = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Company Attributes\n \n \n \n \n \n \n \n \n \n \n \n \n \n Company Attributes\n \n \n A custom attribute tracks facts about your\n contacts/conversation — like the subscription plan, or when\n they ordered the first item etc.\n \n \n For creating a Custom Attribute, just click on theAdd Custom\n Attribute . You can also edit or delete an existing Custom\n Attribute by clicking on the Edit or Delete button.\n \n \n \n \n \n \n >\n );\n};\n\nexport default CompanyAttributesEdit;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n InputBase,\n IconButton,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport {\n Add as AddIcon,\n Delete as DeleteIcon,\n Edit as EditIcon,\n} from \"@mui/icons-material\";\nimport { spacing } from \"@mui/system\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\nimport SearchIcon from \"@mui/icons-material/Search\";\n//import { useNavigate } from \"react-router-dom\";\nimport { fetchAllLabels } from \"../../../../../redux/slices/labels\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport UnAuthenticated from \"../../../UnAuthenticated\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Divider = styled(MuiDivider)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\nfunction createData(srno, id, title, color, description) {\n return { srno, id, title, color, description };\n}\nvar rows = [];\nvar rowsData = [];\n// var rows = [\n// createData(\"Cupcake\", \"305\", \"3.7\"),\n// createData(\"Donut\", \"452\", \"25.0\"),\n// ];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"title\",\n numeric: false,\n disablePadding: true,\n label: \"Title\",\n },\n { id: \"color\", numeric: false, disablePadding: true, label: \"Color\" },\n {\n id: \"description\",\n numeric: false,\n disablePadding: true,\n label: \"Description\",\n },\n {\n id: \"action\",\n numeric: false,\n disablePadding: true,\n label: \"Actions\",\n },\n];\n\nconst EnhancedTableHead = (props) => {\n const {\n //onSelectAllClick,\n order,\n orderBy,\n //numSelected,\n //rowCount,\n onRequestSort,\n } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {/* \n 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ \"aria-label\": \"select all desserts\" }}\n />\n */}\n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({ labels, status, dispatch }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\n const [search, setSearch] = React.useState(\"\");\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n React.useEffect(() => {\n setDense(true);\n }, []);\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n const handleAdd = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"labels_add\",\n listData: [],\n })\n );\n }\n };\n\n const handleEdit = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"labels_edit\",\n listData: row,\n })\n );\n }\n };\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n\n rowsData =\n !!labels && !!labels.data\n ? labels.data.map((item, i) =>\n createData(++i, item._id, item.title, item.color, item.description)\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter((i) =>\n i.title.toLowerCase().includes(search.toLowerCase())\n );\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n Labels List\n \n
\n \n \n
\n {/*
}\n label=\"Dense padding\"\n /> */}\n
\n \n \n \n \n \n {\n // setSearch(e.target.value);\n // }}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!labels && !!labels.status && parseInt(labels.status) !== 200 && (\n \n Error: (status-code : {labels.status})\n {labels.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n \n
\n );\n}\n\nfunction LabelsTable() {\n //const navigate = useNavigate();\n const dispatch = useDispatch();\n const { data: labels, status } = useSelector((state) => state.labels);\n React.useEffect(() => {\n dispatch(fetchAllLabels());\n }, [dispatch]);\n\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nexport default LabelsTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport LabelsTable from \"./labels/LabelsTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Labels = () => {\n return (\n <>\n \n \n \n Labels\n \n \n \n \n \n \n \n \n \n \n \n \n \n Labels\n \n \n Labels help you to categorize conversations and prioritize\n them. You can assign label to a conversation from the\n sidepanel.\n \n \n Labels are tied to the account and can be used to create\n custom workflows in your organization. You can assign custom\n color to a label, it makes it easier to identify the label.\n You will be able to display the label on the sidebar to filter\n the conversations easily.\n \n \n \n \n \n \n >\n );\n};\n\nexport default Labels;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n} from \"@mui/material\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { addLabels, reset } from \"../../../../../redux/slices/labels\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst initialValues = {\n color: \"#000000\",\n title: \"\",\n description: \"\",\n};\n\nconst validationSchema = Yup.object().shape({\n title: Yup.string().required(\"Required\"),\n description: Yup.string().required(\"Required\"),\n});\n\nconst LabelAdd = ({ dispatch }) => {\n const { addData } = useSelector((state) => state.labels);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n const payload = {\n title: values.title,\n description: values.description,\n color: values.color,\n show_on_sid: false,\n };\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(addLabels(payload));\n resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Add new Labels\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!addData &&\n (!!addData.status && parseInt(addData.status) !== 201 ? (\n \n {!!addData && addData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst LabelsAdd = () => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Labels\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Labels\n \n \n Labels help you to categorize conversations and prioritize\n them. You can assign label to a conversation from the\n sidepanel.\n \n \n Labels are tied to the account and can be used to create\n custom workflows in your organization. You can assign custom\n color to a label, it makes it easier to identify the label.\n You will be able to display the label on the sidebar to filter\n the conversations easily.\n \n \n \n \n \n \n >\n );\n};\nexport default LabelsAdd;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n Table,\n TableBody,\n TableCell as MuiTableCell,\n TableRow as MuiTableRow,\n} from \"@mui/material\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { deleteLabels, reset } from \"../../../../../redux/slices/labels\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\n\nconst TableRow = styled(MuiTableRow)`\n height: 42px;\n`;\n\nconst TableCell = styled(MuiTableCell)`\n padding-top: 0;\n padding-bottom: 0;\n`;\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n};\n\nconst validationSchema = Yup.object().shape({});\n\nconst DeleteCannedResponses = ({ dispatch, data }) => {\n const { deleteData } = useSelector((state) => state.cannedResponses);\n //console.log(\"deleteData == \", JSON.stringify(deleteData));\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n id: data.id,\n };\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(deleteLabels(values));\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Delete Labels\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!deleteData &&\n (!!deleteData.status &&\n parseInt(deleteData.status) !== 201 ? (\n \n {!!deleteData && deleteData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been Deleted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst LabelsDelete = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Labels\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Labels\n \n \n Labels help you to categorize conversations and prioritize\n them. You can assign label to a conversation from the\n sidepanel.\n \n \n Labels are tied to the account and can be used to create\n custom workflows in your organization. You can assign custom\n color to a label, it makes it easier to identify the label.\n You will be able to display the label on the sidebar to filter\n the conversations easily.\n \n \n \n \n \n \n >\n );\n};\n\nexport default LabelsDelete;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport * as Yup from \"yup\";\nimport {\n Alert as MuiAlert,\n Box,\n Button,\n Card as MuiCard,\n CardContent,\n CircularProgress,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n TextField as MuiTextField,\n Toolbar,\n} from \"@mui/material\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport NavigateBeforeIcon from \"@mui/icons-material/NavigateBefore\";\nimport { settingsMenu } from \"../../../../../redux/slices/settings\";\nimport { Formik } from \"formik\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { editLabels, reset } from \"../../../../../redux/slices/labels\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\nconst Alert = styled(MuiAlert)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Card = styled(MuiCard)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nvar initialValues = {\n id: \"\",\n color: \"\",\n title: \"\",\n description: \"\",\n};\n\nconst validationSchema = Yup.object().shape({\n title: Yup.string().required(\"Required\"),\n description: Yup.string().required(\"Required\"),\n});\n\nconst EditLabel = ({ dispatch, data }) => {\n const { editData } = useSelector((state) => state.labels);\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const navigate = useNavigate();\n initialValues = {\n id: data.id,\n color: data.color,\n title: data.title,\n description: data.description,\n };\n\n const handleSubmit = async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n const payload = {\n id: values.id,\n title: values.title,\n description: values.description,\n color: values.color,\n show_on_sid: false,\n };\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n await timeOut(1500);\n await dispatch(editLabels(payload));\n //resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n await timeOut(1500);\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n } catch (error) {\n setStatus({ sent: false });\n setErrors({ submit: error.message });\n setSubmitting(false);\n }\n };\n\n const handleBack = (row) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n dispatch(\n settingsMenu({\n list: \"labels\",\n listData: [],\n })\n );\n }\n };\n return (\n <>\n \n
\n \n \n \n Edit Labels\n \n
\n \n \n \n
\n \n \n
\n \n \n
\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n status,\n }) => (\n \n \n {errors && errors.sent && (\n \n {errors.message}\n \n )}\n {!!editData &&\n (!!editData.status && parseInt(editData.status) !== 201 ? (\n \n {!!editData && editData.message}\n \n ) : (\n status &&\n status.sent && (\n \n Your data has been submitted successfully!\n \n )\n ))}\n {isSubmitting ? (\n \n \n \n ) : (\n \n )}\n \n \n )}\n \n
\n >\n );\n};\n\nconst LabelsEdit = ({ data }) => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n return (\n <>\n \n \n \n Labels\n \n \n \n \n \n \n \n {/* add */}\n \n {/* close add */}\n \n \n \n \n \n Labels\n \n \n Labels help you to categorize conversations and prioritize\n them. You can assign label to a conversation from the\n sidepanel.\n \n \n Labels are tied to the account and can be used to create\n custom workflows in your organization. You can assign custom\n color to a label, it makes it easier to identify the label.\n You will be able to display the label on the sidebar to filter\n the conversations easily.\n \n \n \n \n \n \n >\n );\n};\nexport default LabelsEdit;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n// Thunks\n// fetch all Chat History\nexport const fetchAllChatHistory = createAsyncThunk(\n \"chatHistoryViewer/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/chat_history_viewer/accounts/${accountID}`,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all Chat History\nexport const fetchAllChatHistoryConversation = createAsyncThunk(\n \"chatHistoryViewer/fetchChat\",\n async (payloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/chat_history_viewer/getconversationsdetails`,\n payloadData,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nconst initialState = {\n data: [],\n fetchData: [],\n editData: [],\n deleteData: [],\n status: STATUSES.SUCCESS,\n};\n\nexport const chatHistoryViewerSlice = createSlice({\n name: \"chatHistoryViewer\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchAllChatHistory.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllChatHistory.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllChatHistory.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(fetchAllChatHistoryConversation.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAllChatHistoryConversation.fulfilled, (state, action) => {\n state.fetchData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAllChatHistoryConversation.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport default chatHistoryViewerSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Button,\n Card,\n CardMedia as MuiCardMedia,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from \"@mui/material\";\n//import ReactPlayer from \"react-player\";\nimport { Player } from \"video-react\";\nimport AudioPlayer from \"react-h5-audio-player\";\nconst ChatMediaDialog = ({ openAdd, handleClickClose }) => {\n // const [open, setOpen] = React.useState(false);\n\n // const handleClose = () => {\n // setOpen(false);\n // };\n const CardMedia = styled(MuiCardMedia)`\n weight: 100%;\n height: 80vh;\n cursor: pointer;\n `;\n return (\n <>\n \n >\n );\n};\n\nexport default ChatMediaDialog;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n//import { Player } from \"video-react\";\nimport \"video-react/dist/video-react.css\"; // import css\n//import AudioPlayer from \"react-h5-audio-player\";\nimport \"react-h5-audio-player/lib/styles.css\";\nimport {\n Avatar,\n Box,\n Card,\n CardHeader,\n CardMedia as MuiCardMedia,\n Typography,\n} from \"@mui/material\";\nimport DownloadForOfflineSharpIcon from \"@mui/icons-material/DownloadForOfflineSharp\";\n\nimport { red } from \"@mui/material/colors\";\nimport ChatMediaDialog from \"./ChatMediaDialog\";\nimport Rating from \"@mui/material/Rating\";\n\nconst ChatMessage = styled.div`\n margin: 30px;\n text-align: ${(props) => props.position};\n`;\n\nconst ChatMessageInner = styled.div`\n display: inline-block;\n`;\n\nconst ChatMessageComponent = ({\n name,\n message,\n time,\n avatar,\n position = \"left\",\n sender_type,\n content_type,\n is_media,\n media_type,\n media_url,\n}) => {\n const onDocDownload = (docURL) => {\n let alink = document.createElement(\"a\");\n alink.href = docURL;\n alink.target = \"_blank\";\n alink.click();\n };\n\n const ChatMessageTime = styled(Typography)`\n text-align: right;\n opacity: 0.8;\n `;\n\n const ChatMessageBubble = styled.div`\n display: inline-block;\n margin-right: auto;\n background: ${(props) =>\n props.highlighted\n ? props.theme.palette.secondary.main\n : props.theme.palette.common.white};\n color: ${(props) =>\n props.highlighted\n ? props.theme.palette.common.white\n : props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubblePrivate = styled.div`\n display: inline-block;\n margin-right: auto;\n background: ${(props) => props.theme.sidebar.header.chipNote.color};\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 10px;\n padding: ${(props) => props.theme.spacing(2)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleResolve = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #acdbae;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const ChatMessageBubbleResolvebyClient = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #87cb8a;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleLabel = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #c0d9f5;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleAssign = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ffb3ff;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoin = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #b05782;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n\n const ChatMessageBubbleJoinAgent = styled.div`\n display: inline-block;\n margin-right: auto;\n background: #ddb7c9;\n color: ${(props) => props.theme.palette.text.primary};\n border-radius: 5px;\n padding: ${(props) => props.theme.spacing(3)};\n margin-bottom: ${(props) => props.theme.spacing(1)};\n ${(props) => props.theme.shadows[1]};\n `;\n const CardMedia = styled(MuiCardMedia)`\n height: 220px;\n // cursor: pointer;\n `;\n const CardVedioMedia = styled(MuiCardMedia)`\n width: 100%;\n height: 120px;\n cursor: pointer;\n `;\n const CrdHeader = styled(CardHeader)`\n cursor: pointer;\n `;\n const ChatMessageBubbleName = styled(Typography)`\n font-weight: ${(props) => props.theme.typography.fontWeightBold};\n `;\n\n const [open, setOpen] = React.useState({\n Open: false,\n });\n\n const handleClickOpen = (mediaUrl, mediaType) => {\n setOpen({\n Open: true,\n MediaUrl: mediaUrl,\n MediaType: mediaType,\n });\n };\n\n const handleClickClose = () => {\n setOpen({\n Open: false,\n });\n };\n\n return (\n <>\n {parseInt(content_type) === 0 && (\n \n \n {/* */}\n \n \n \n {name}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n \n {message}\n \n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 11 && (\n \n \n {/* */}\n \n \n \n {name}\n \n \n {parseInt(is_media) === 1 && media_type === \"image\" ? (\n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"application\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"text\" ? (\n \n \n \n \n }\n onClick={() => onDocDownload(media_url)}\n title={media_url}\n subheader={media_type}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"video\" ? (\n // \n // \n // \n \n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {parseInt(is_media) === 1 && media_type === \"audio\" ? (\n \n {/* console.log(\"onPlay\")}\n /> */}\n {\n handleClickOpen(media_url, media_type);\n }}\n />\n \n ) : null}\n {message}\n \n {time}\n \n \n )}\n\n {parseInt(content_type) === 1 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 2 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n\n {parseInt(content_type) === 4 && (\n \n \n \n \n \n {`Feedback from ${name}`}\n \n \n \n \n \n \n {message.split(\"â”´\")[1]}\n \n\n \n {time}\n \n \n \n )}\n {parseInt(content_type) === 6 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 9 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 10 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 12 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n {parseInt(content_type) === 14 && (\n \n \n \n {message}\n {time}\n \n \n \n )}\n \n >\n );\n};\n\nexport default ChatMessageComponent;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport moment from \"moment\";\nimport {\n Alert as MuiAlert,\n // Avatar,\n // Box,\n CircularProgress as MuiCircularProgress,\n Dialog,\n DialogContent,\n DialogContentText,\n DialogTitle,\n DialogActions,\n Grid,\n //Typography,\n TextField,\n Divider as MuiDivider,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n sendCurrentChatMail,\n reset,\n} from \"../../../../../redux/slices/sendMailPreviousChat\";\nimport ChatMessageComponent from \"./ContactChatHistory/ChatMessageComponent\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst ChatContainer = styled(Grid)`\n width: 100%;\n height: calc(68vh - 85px);\n`;\nconst ChatMain = styled(Grid)``;\n\nconst ChatMessages = styled.div`\n overflow-y: scroll;\n background-color: rgba(255, 255, 255, 0.6);\n flex-direction: \"column\";\n gap: 2;\n background-image: url(/static/img/samples/fbe41cd97ada760e7b38de1be18301a5.jpg);\n background-size: 10%;\n background-blend-mode: overlay;\n background-attachment: fixed;\n height: calc(-35px + 62vh);\n overflowy: auto;\n border: 1px solid #ccc;\n border-radius: 5px;\n`;\n\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nconst Chat = ({ chatData }) => {\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n\n return date.isSame(moment(), \"day\")\n ? date.format(\"hh:mm A\")\n : date.format(\"MMM-DD hh:mm A\");\n };\n\n return (\n \n \n \n {!!chatData &&\n chatData[0]?.messagesData?.length > 0 &&\n chatData[0]?.messagesData?.map((items, i) =>\n //items.content_type === 0 &&\n items.sender_type === 1 ? (\n \n ) : (\n \n )\n )}\n \n \n \n );\n};\n\nconst ChatHistoryViewerModel = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n email,\n}) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const dispatch = useDispatch();\n const { fetchData: chatHistoryViewerCon } = useSelector(\n (state) => state.chatHistoryViewer\n );\n\n const { data } = useSelector((state) => state.sendMail_PreviousChat);\n\n const [sendEmail, setSendEmail] = React.useState(\"\");\n const [isError, setIsError] = React.useState(false);\n const [errors, setErrors] = React.useState(\"\");\n React.useEffect(() => {\n setSendEmail(email);\n }, [email]);\n\n const SendMail = async (conversation_id) => {\n try {\n setIsLoading(true);\n const { timeZone } = Intl.DateTimeFormat().resolvedOptions();\n const smtp_id = localStorage.getItem(\"awlid\");\n var payload = {\n conversation_id: conversation_id,\n email: sendEmail,\n timeZone: timeZone,\n smtp_id: smtp_id,\n };\n await dispatch(sendCurrentChatMail(payload));\n setIsLoading(false);\n setIsError(false);\n } catch (error) {\n setIsLoading(false);\n setIsError(true);\n setErrors(\"Error \");\n }\n await timeOut(4000);\n await dispatch(reset());\n setSendEmail(\"\");\n };\n // Helper Datetime function here\n const formatDate = (createdAt) => {\n const date = moment.utc(createdAt).add(5, \"hours\").add(30, \"minutes\");\n // return date.isSame(moment(), \"day\")\n // ? date.format(\"hh:mm A\")\n // : date.format(\"MMM-DD hh:mm A\");\n return date.format(\"hh:mm A\");\n };\n console.log(\"\\n openAdd == \" + JSON.stringify(openAdd));\n\n return (\n \n );\n};\nexport default ChatHistoryViewerModel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n AlertTitle,\n //Checkbox,\n IconButton,\n InputBase,\n Divider as MuiDivider,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n CircularProgress as MuiCircularProgress,\n} from \"@mui/material\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport PageviewIcon from \"@mui/icons-material/Pageview\";\n\nimport { spacing } from \"@mui/system\";\nimport { tableCellClasses } from \"@mui/material/TableCell\";\nimport { useDispatch, useSelector } from \"react-redux\";\n\nimport {\n fetchAllChatHistory,\n fetchAllChatHistoryConversation,\n} from \"../../../../../redux/slices/chatHistoryViewer\";\nimport ChatHistoryViewerModel from \"./ChatHistoryViewerModel\";\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\n\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nconst Spacer = styled.div`\n flex: 1 1 20%;\n`;\nconst CustomTableCell = styled(TableCell)`\n &.${tableCellClasses.head} {\n background: ${(props) => props.theme.palette.tertiary.main};\n color: ${(props) => props.theme.palette.common.black};\n margin-right: 10px;\n }\n &.${tableCellClasses.body} {\n font-size: 14px;\n }\n`;\n\nfunction createData(\n srno,\n id,\n created_at,\n channel_id,\n // agent_name,\n contact_name,\n contact_email\n) {\n // Format the date to 'yy-mm-dd'\n const formattedDate = new Date(created_at).toISOString().slice(0, 10);\n return {\n srno,\n id,\n created_at: formattedDate, // Only 'yy-mm-dd'\n channel_id: channel_id.split(\"_\")[0],\n // agent_name,\n contact_name,\n contact_email,\n };\n}\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"created_at\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"channel_id\",\n numeric: false,\n disablePadding: true,\n label: \"Channel \",\n },\n // {\n // id: \"agent_name\",\n // numeric: false,\n // disablePadding: true,\n // label: \"Agent \",\n // },\n {\n id: \"contact_name\",\n numeric: false,\n disablePadding: true,\n label: \"Contact\",\n },\n {\n id: \"contact_email\",\n numeric: false,\n disablePadding: true,\n label: \"Email\",\n },\n {\n id: \"action\",\n numeric: false,\n disablePadding: true,\n label: \"Actions\",\n },\n];\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nfunction EnhancedTable({\n chatHistoryViewer,\n status,\n dispatch,\n handleAddClickOpen,\n}) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(8);\n const [search, setSearch] = React.useState(\"\");\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n rowsData =\n !!chatHistoryViewer && !!chatHistoryViewer.data\n ? chatHistoryViewer.data.map((item, i) =>\n createData(\n ++i,\n item._id,\n item.created_at,\n item.channel_id,\n //item.agent_name,\n item.contact_name,\n item.contact_email\n )\n )\n : [];\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter(\n (i) =>\n i.contact_name.toLowerCase().includes(search.toLowerCase()) ||\n i.channel_id.toLowerCase().includes(search.toLowerCase())\n );\n\n const searchFilter = (e) => {\n setPage(0);\n setSearch(e.target.value);\n };\n return (\n \n
\n \n \n \n Chat History Viewer List\n \n
\n \n \n \n \n \n \n setSearch(e.target.value)}\n onChange={(e) => {\n searchFilter(e);\n }}\n />\n \n \n \n {!!status && status === \"loading\" && (\n \n )}\n {!!chatHistoryViewer &&\n !!chatHistoryViewer.status &&\n parseInt(chatHistoryViewer.status) !== 200 && (\n \n \n Error: (status-code : {chatHistoryViewer.status})\n \n {chatHistoryViewer.message} — check it out!\n \n )}\n\n {!!status && status === \"error\" && (\n \n Error: \n Something went wrong\n \n )}\n\n \n \n \n {!!rows &&\n stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.date)}\n role=\"checkbox\"\n aria-checked={isItemSelected}\n tabIndex={-1}\n key={row.srno}\n selected={isItemSelected}\n >\n \n {row.created_at}\n \n {row.channel_id}\n {/* {row.agent_name} */}\n {row.contact_name}\n {row.contact_email}\n \n {\n handleAddClickOpen(row);\n }}\n />\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ChatHistoryViewerTable() {\n const dispatch = useDispatch();\n\n const { data: chatHistoryViewer, status } = useSelector(\n (state) => state.chatHistoryViewer\n );\n React.useEffect(() => {\n dispatch(fetchAllChatHistory());\n }, [dispatch]);\n\n // show chat history\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n });\n const handleAddClickOpen = (item) => {\n const payloadData = {\n conversation_id: item.id,\n };\n dispatch(fetchAllChatHistoryConversation(payloadData));\n setOpenAdd({\n Open: true,\n data: item,\n });\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nexport default ChatHistoryViewerTable;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Typography as MuiTypography,\n Divider as MuiDivider,\n Grid,\n} from \"@mui/material\";\nimport ChatIcon from \"@mui/icons-material/Chat\";\nimport ChatHistoryViewerTable from \"./chatHistoryViewer/ChatHistoryViewerTable\";\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst Ptypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n`;\n\nconst ChatHistoryViewer = () => {\n return (\n <>\n \n \n \n Chat History Viewer\n \n \n \n \n \n \n \n \n \n \n \n \n \n Chat History Viewer\n \n \n The Chat History Viewer module is designed to retrieve and\n display previous conversations based on specific contact\n details such as contact name.\n \n \n Allows users to search for historical chat records using a\n contact's name, facilitating quick access to past interactions\n for reference or context.\n \n \n \n \n \n \n >\n );\n};\n\nexport default ChatHistoryViewer;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport AccountSettings from \"./AccountSettings\";\nimport Agents from \"./Agents\";\nimport CannedResponses from \"./CannedResponses\";\nimport CannedResponsesAdd from \"./cannedResponses/CannedResponsesAdd\";\nimport CannedResponsesDelete from \"./cannedResponses/CannedResponsesDelete\";\nimport CannedResponsesEdit from \"./cannedResponses/CannedResponsesEdit\";\nimport CompanyAttributes from \"./CompanyAttributes\";\nimport CompanyAttributesAdd from \"./companyAttributes/CompanyAttributesAdd\";\nimport CompanyAttributesDelete from \"./companyAttributes/CompanyAttributesDelete\";\nimport CompanyAttributesEdit from \"./companyAttributes/CompanyAttributesEdit\";\nimport Labels from \"./Labels\";\nimport LabelsAdd from \"./labels/LabelAdd\";\nimport LabelsDelete from \"./labels/LabelDelete\";\nimport LabelsEdit from \"./labels/LabelEdit\";\nimport ChatHistoryViewer from \"./ChatHistoryViewer\";\n\nconst RightSettingPannel = () => {\n const { settingsList, settingsData } = useSelector((state) => state.settings);\n const [list, setList] = React.useState(\"\");\n React.useEffect(() => {\n setList(settingsList);\n }, [settingsList]);\n return (\n <>\n {!!list && list === \"canned_responses\" && }\n {!!list && list === \"canned_responses_add\" && }\n {!!list && list === \"canned_responses_edit\" && (\n \n )}\n {!!list && list === \"canned_responses_delete\" && (\n \n )}\n {!!list && list === \"labels\" && }\n {!!list && list === \"labels_add\" && }\n {!!list && list === \"labels_edit\" && }\n {!!list && list === \"labels_delete\" && (\n \n )}\n {!!list && list === \"companyattributes\" && }\n {!!list && list === \"companyattributes_add\" && }\n {!!list && list === \"companyattributes_edit\" && (\n \n )}\n {!!list && list === \"companyattributes_delete\" && (\n \n )}\n {!!list && list === \"agents\" && }\n {!!list && list === \"chat_history_viewer\" && }\n {!!list && list === \"accountsettings\" && }\n >\n );\n};\n\nexport default RightSettingPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport { Helmet } from \"react-helmet-async\";\nimport { Grid } from \"@mui/material\";\nimport LeftSettingPannel from \"./leftPannel/LeftSettingPannel\";\nimport RightSettingPannel from \"./rightPannel/RightSettingPannel\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nimport { isValidToken } from \"../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../redux/slices/login\";\n\n// import RightChatPannel from \"./rightPannel/RightChatPannel\";\nconst TopSpacing = styled(\"div\")(spacing);\nconst Settings = () => {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const dispatch = useDispatch();\n const navigate = useNavigate();\n React.useEffect(() => {\n !isValidToken(accessToken) && dispatch(fetchLogOut());\n !isValidToken(accessToken) && dispatch(fetchLoginLogOut_Socket());\n !isValidToken(accessToken) && dispatch(logout());\n !isValidToken(accessToken) && navigate(\"/\");\n }, [accessToken, dispatch, navigate]);\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n );\n};\n\nexport default Settings;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\nexport const resetPasswordFun = createAsyncThunk(\n \"resetPasswordFun/post\",\n async (payload) => {\n try {\n const res = await axios.post(\n `${basePathConfig.baseURL}/resetpasswordmail`,\n payload\n );\n\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nvar initialState = {\n data: [],\n status: STATUSES.SUCCESS,\n};\n\nexport const resetPasswordSlice = createSlice({\n name: \"reset_password\",\n initialState,\n reducers: {\n reset: () => initialState,\n },\n extraReducers: (builder) => {\n builder\n .addCase(resetPasswordFun.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(resetPasswordFun.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(resetPasswordFun.rejected, (state, action) => {\n state.data = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setData, setStatus, reset } = resetPasswordSlice.actions;\nexport default resetPasswordSlice.reducer;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"@emotion/styled\";\nimport * as Yup from \"yup\";\nimport { Formik } from \"formik\";\n\nimport {\n Alert as MuiAlert,\n Button,\n TextField as MuiTextField,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { resetPasswordFun, reset } from \"../../redux/slices/resetPassword\";\n\nconst Alert = styled(MuiAlert)(spacing);\n\nconst TextField = styled(MuiTextField)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nfunction ResetPassword() {\n const dispatch = useDispatch();\n const { data } = useSelector((state) => state.reset_password);\n const smtp_id = localStorage.getItem(\"awlid\");\n\n React.useEffect(() => {\n dispatch(reset());\n }, [dispatch]);\n\n return (\n {\n try {\n var payload = {\n email: values.email,\n smtp_id: smtp_id,\n };\n await timeOut(1500);\n await dispatch(resetPasswordFun(payload));\n resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n } catch (error) {\n const message = error.message || \"Something went wrong\";\n\n setStatus({ success: false });\n setErrors({ submit: message });\n setSubmitting(false);\n }\n }}\n >\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n }) => (\n \n )}\n \n );\n}\n\nexport default ResetPassword;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Helmet } from \"react-helmet-async\";\n\nimport { ImageListItem, Paper, Typography } from \"@mui/material\";\n\n//import { ReactComponent as Logo } from \"../../vendor/1spoc-logo.svg\";\nimport ResetPasswordComponent from \"../../components/auth/ResetPassword\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchSingleDomainData } from \"../../redux/slices/whitelistsolutionSlice\";\n\n// const Brand = styled(Logo)`\n// fill: ${(props) => props.theme.palette.primary.main};\n// width: 250px;\n// height: 64px;\n// margin-bottom: 32px;\n// `;\n\nconst Wrapper = styled(Paper)`\n padding: ${(props) => props.theme.spacing(6)};\n\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n padding: ${(props) => props.theme.spacing(10)};\n }\n`;\n\nfunction ResetPassword() {\n const dispatch = useDispatch();\n const domainFetchSingleDataViaDomain = useSelector(\n (state) => state.whitelistsolution.domainFetchSingleDataViaDomain\n );\n\n const domainName = window.location.hostname;\n // console.log(\"\\n\\n Dashboard domainName == \" + domainName);\n\n React.useEffect(() => {\n dispatch(fetchSingleDomainData(domainName));\n }, [dispatch, domainName]);\n return (\n \n {/* */}\n\n {domainFetchSingleDataViaDomain?.data?.logo_url &&\n domainFetchSingleDataViaDomain?.data?.signIn_logo_url && (\n \n
\n \n )}\n \n \n\n \n Reset Password\n \n \n Enter your email to reset your password\n \n\n \n \n \n );\n}\n\nexport default ResetPassword;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\nexport const updatePasswordAgent = createAsyncThunk(\n \"updatePasswordAgent/fetch\",\n async (payload) => {\n try {\n const res = await axios.put(\n `${basePathConfig.baseURL}/passwordconfirmation`,\n payload\n );\n\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch Agent Data\nexport const fetchAgent = createAsyncThunk(\"agent/fetch\", async (Id) => {\n try {\n const res = await axios.get(\n `${basePathConfig.baseURL}/super/account_agent/${Id}/fetch_agent`\n );\n\n return await res.data.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const updatePasswordAgentStatus = createAsyncThunk(\n \"updatePasswordAgentStatus/put\",\n async (payload) => {\n try {\n const res = await axios.post(\n `${basePathConfig.baseURL}/expirpasswordlink`,\n payload\n );\n\n return await res.data;\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const passwordConfirmationSlice = createSlice({\n name: \"password_Confirmation\",\n initialState: {\n data: [],\n agentData: [],\n updateStatusData: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAgent.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAgent.fulfilled, (state, action) => {\n state.agentData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAgent.rejected, (state, action) => {\n state.agentData = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(updatePasswordAgent.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(updatePasswordAgent.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(updatePasswordAgent.rejected, (state, action) => {\n state.data = [];\n state.status = STATUSES.ERROR;\n })\n .addCase(updatePasswordAgentStatus.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(updatePasswordAgentStatus.fulfilled, (state, action) => {\n state.updateStatusData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(updatePasswordAgentStatus.rejected, (state, action) => {\n state.updateStatusData = [];\n state.status = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setData, setAgentData, setStatus, setUpdateStatusData } =\n passwordConfirmationSlice.actions;\nexport default passwordConfirmationSlice.reducer;\n","import React from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"@emotion/styled\";\nimport * as Yup from \"yup\";\nimport { Formik } from \"formik\";\nimport moment from \"moment\";\n\nimport {\n IconButton as MuiIconButton,\n Alert as MuiAlert,\n Button,\n TextField as MuiTextField,\n} from \"@mui/material\";\nimport {\n Visibility as VisibilityIcon,\n VisibilityOff as VisibilityOffIcon,\n} from \"@mui/icons-material\";\nimport { spacing } from \"@mui/system\";\nimport { useParams } from \"react-router-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchAgent,\n updatePasswordAgent,\n updatePasswordAgentStatus,\n} from \"../../redux/slices/passwordConfirmation\";\nconst Alert = styled(MuiAlert)(spacing);\nconst IconButton = styled(MuiIconButton)(spacing);\nconst TextField = styled(MuiTextField)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nfunction PasswordConfirmations() {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const [showPassword, setShowPassword] = React.useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = React.useState(false);\n const [checkExpireLink, setCheckExpireLink] = React.useState(true);\n const { passwordconfirmation } = useParams();\n const { agentData } = useSelector((state) => state.password_Confirmation);\n\n const passwordconfirmationData = passwordconfirmation.split(\".\");\n // console.log(\"passwordconfirmation split \", passwordconfirmationData);\n var account_id = passwordconfirmationData[1];\n var id = passwordconfirmationData[2];\n var [agent, setAgent] = React.useState([]);\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n const toggleConfirmPasswordVisibility = () => {\n setShowConfirmPassword(!showConfirmPassword);\n };\n React.useEffect(() => {\n dispatch(fetchAgent(id));\n }, [dispatch, id]);\n\n React.useEffect(() => {\n !!agentData && setAgent(agentData);\n }, [agentData]);\n\n //console.log(\"agentData = \", JSON.stringify(agentData));\n var startTime = moment(agentData.passwordupdate_at);\n var endTime = moment(new Date());\n\n function calculateDuration(startDate, endDate) {\n const startMoment = moment(startDate);\n const endMoment = moment(endDate);\n\n const duration = moment.duration(endMoment.diff(startMoment));\n\n const days = duration.asDays();\n const hours = duration.asHours();\n const minutes = duration.asMinutes();\n const seconds = duration.asSeconds();\n\n return {\n days,\n hours,\n minutes,\n seconds,\n };\n }\n\n function checkLinkStatus(agentStatus, account_id, agentId) {\n const duration = calculateDuration(startTime, endTime);\n\n //console.log(\"duration == \" + JSON.stringify(duration));\n //console.log(\"Test \", agentStatus);\n if (parseInt(agentStatus) === 0) {\n setCheckExpireLink(false);\n if (parseInt(duration.days) > 0) {\n setCheckExpireLink(true);\n dispatch(\n updatePasswordAgentStatus({\n account_id: account_id,\n agent_id: agentId,\n })\n );\n } else {\n if (parseInt(duration.minutes) > 60) {\n setCheckExpireLink(true);\n dispatch(\n updatePasswordAgentStatus({\n account_id: account_id,\n agent_id: agentId,\n })\n );\n }\n }\n } else {\n setCheckExpireLink(true);\n }\n }\n\n React.useEffect(() => {\n !!agentData && setAgent(agentData);\n !!agentData && checkLinkStatus(agentData.pstatus, account_id, id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentData]);\n\n return (\n (val && val.length > 0 ? true : false),\n then: Yup.string().oneOf(\n [Yup.ref(\"password\")],\n \"Both password need to be the same\"\n ),\n }),\n })}\n onSubmit={async (\n values,\n { resetForm, setErrors, setStatus, setSubmitting }\n ) => {\n try {\n const bodyData = {\n account_id: account_id,\n agent_id: id,\n email: agent.email,\n password: values.password,\n };\n await timeOut(1500);\n await dispatch(updatePasswordAgent(bodyData));\n resetForm();\n setStatus({ sent: true });\n setSubmitting(false);\n navigate(\"/\");\n } catch (error) {\n const message = error.message || \"Something went wrong\";\n setStatus({ success: false });\n setErrors({ submit: message });\n setSubmitting(false);\n }\n }}\n >\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n }) => (\n \n )}\n \n );\n}\n\nexport default PasswordConfirmations;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Helmet } from \"react-helmet-async\";\n\nimport { ImageListItem, Paper, Typography } from \"@mui/material\";\n\n// import { ReactComponent as Logo } from \"../../vendor/1spoc-logo.svg\";\nimport PasswordConfirmations from \"../../components/auth/PasswordConfirmations\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchSingleDomainData } from \"../../redux/slices/whitelistsolutionSlice\";\n\n// const Brand = styled(Logo)`\n// fill: ${(props) => props.theme.palette.primary.main};\n// width: 250px;\n// height: 64px;\n// margin-bottom: 32px;\n// `;\n\nconst Wrapper = styled(Paper)`\n padding: ${(props) => props.theme.spacing(6)};\n\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n padding: ${(props) => props.theme.spacing(10)};\n }\n`;\n\nfunction PasswordConfirmation() {\n const dispatch = useDispatch();\n const domainFetchSingleDataViaDomain = useSelector(\n (state) => state.whitelistsolution.domainFetchSingleDataViaDomain\n );\n\n const domainName = window.location.hostname;\n React.useEffect(() => {\n dispatch(fetchSingleDomainData(domainName));\n }, [dispatch, domainName]);\n\n React.useEffect(() => {\n localStorage.setItem(\"awlid\", domainFetchSingleDataViaDomain?.data?._id);\n }, [domainFetchSingleDataViaDomain, domainName]);\n\n return (\n \n {/* */}\n\n {domainFetchSingleDataViaDomain?.data?.logo_url &&\n domainFetchSingleDataViaDomain?.data?.signIn_logo_url && (\n \n
\n \n )}\n \n \n\n \n Password confirmation\n \n \n Set your password\n \n\n \n \n \n );\n}\n\nexport default PasswordConfirmation;\n","var _defs, _style, _use, _path, _path2;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction Svg1Spocbeta(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 619 112\",\n width: 619,\n height: 112,\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"image\", {\n width: 500,\n height: 112,\n id: \"img1\",\n href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAABwCAYAAADogILwAAAAAXNSR0IArs4c6QAAIABJREFUeF7tXXl8VNX1n7cvM2+2TDJZIUBIIAiCiIioRbHiCm4g1lbtotbui/antVa0Lm1tq9ZW6651F62KC+6iUgGViiCLkEDInslk1jdv3v5+n2tDRUgyM/e9mUySN59P/so55557zn3v++69Z0Ecw/zrnT+fw0KxlQ4UWXSgKr4dWzAEQfRhVtGy4Y855pjSrVu3TjIMY5KmaVMURZmk63qVYRheTdNcGIZ5FEXBCIJgMAyjwMCapqVVVRUxDJMdDkfC4XDEMAzrw3G8DUGQnTiOf+5yufZMnTp1z+uvv56yTNk8C6qurp7b19e3Ps/DWCreMAxdURQeQRDV4XAIKIomDcOIoyjaSxDEXhzHm1AU3c6y7O558+a1rly5EvjM/g2DBWbMmFHd1tZWaxhGvaIojbqu12maVuZwOHwOh4NTVZVBUZQgCILrf85EVVXTGIYpDocjvu85Q1F0N0mSu4BffT5f88KFC/fec889gMb+jRALLFq0yL9x48aJDodjsizL0zRNq5NluQJBEL9hGFz/H06SpMvhcKC6Dh5zJUUQhKzregJBkAiGYd04jjdjGLYFRdEddXV1Oz/88MO+YjMBMpwK9c2a22jEY6sQTZs0kB7+ll0jFtCPOOKIkubm5tN4nj/CMIyZhmFMVRQFvEzy8kNR1IHjeIdhGNtQFN3GcdyGmpqaNz/55JPevAxoUmgwGJzb09MzogA9lymjKKpiGNaCouhWDMM2+f3+d/7yl7+sXbZsmZaLHJs2swUaGxvHdXR0nKooyhGqqk7XdX2KqqrOzJy5U6AoqoAPN4fDsZmiqE8DgcAru3fv3owgiJG7NJvDagssXryYe//9908VRXG+qqqHOByORlVVywzDevcQBBEG6wBF0U85jltz3HHHvbFy5cq01XPKRd6wALphGEhk+uxlDj55t8MwPIMpPNIAfeLEiXO6urqWapq2sP/FQuTiDKtpURTVMAzbjmHYepZlX1u4cOHLw73g9s1xtAP6QL7EcRycrnxAkuTb48ePf/qzzz5rs9rnY0He7NmziZaWltNTqdRpuq4frSjK5Hy8sLO1JY7j3SiKvs8wzNtTpkx5fMOGDeAkzf4VyAK1tbVHdnV1neNwOBYoinKorut4gYb+yjAYhqVRFN1AEMSbFRUVTzU3N4MPv4L+Cg7okdmzxxnx9AqHqlzgMAxsqNkWO6AvWLAA37Zt2zSe589UVfUccLQHPlYK6sEcBsNxPI5h2PsYhr3qdDpf6+3tbXY4HNZ/umah01gE9P3NgiAI2OmtI0nyeZZlX+r3xai5XspiCeRCgpSWlgYlSTpeluUzVFU9UVXVQTcCuQi2mhZFUZEgiHcxDHsRPGOhUKjZ3r1ba+W6ujp3KBSapyjKElVVT1JVFVytFNV7F0EQsJnaRNP0SxiGrZo1a9bmNWvWgKu6vP4KZgRjxQo0+syqU4y08CeHqjZkM6tiBXQA5J988smxkiRdoijKaZqm5eV4LxsbwdJgGJYkCOJFmqafDQQCbzY1NRV0VzHWAX1/v2EYlqAoaiVJko/MnDnz34V48GHXTSH5li5dir399tuH8Tz/DV3Xz1IUZVwhxzc7FoZhUYIgXqAo6pFZs2Z9sGbNGtGszDHMjwSDwVqe58HG6RtgJ15sID6Yb1AUlQmCeJ2m6Ud9Pt9rLS0tsXz5sSCAHpozpxyL8H9xqOoyh2PoXfn+Ey1CQEf8fv+R6XT6j+COZqQsqEyLB8fxToZh/u7xeB5ub2/vyERvxf9tQD/YiuCrnqKoD1mWvTYSibwNYiKtsPVIk9HY2Eh2dXUtTKfTV0uSdKSR4SRvBMzPIAgCBK9eX1ZW9tLnn3+eHAE6F4uKSCAQOEwQhJ+Ioni2rusjbvO0vyFxHO+lKOovPp/vkXy8a/MK6EZjIxk18LMMUbzDoeuBXFdIMQF6IBCoFAThhnQ6fcEoeMEM6Aqwo2BZ9n6Px3NbPhbb/oPagD740wAyOyiKeoNhmF9Fo9HNuT43I5UeAHlHR8ex6XT6JlmWD3c4HHl9Pw2HnUDEPMuyN1AU9WxPT8+IyUoptK3AZqmkpKSR5/lrwdG6YRhkoXXI53jgXet0OsEm6q62trZOq8bKywNjOBxIdObhRxlJ/jaHqoIHE+pXJICOeTyei3iev0HTtHKoiYwwJgzDYjRN319RUXF9vo7ibUDPvCgQBJFpmr6vqqrqqnz5IbMWBaEAL++FyWTyhn4gHzK2piAa5XcQA8fxXU6n85pZs2b9y75i+aqx/X5/TSqVul2W5VNHG5AfuKz637X/KC0t/YMVR/GWA3rvrPmVGB+9xVCUMx2GwZh5LoYb0BsbG11NTU13KYqy3DCMYYmcNGM/s7wYhu1hWfaXyWRyldXHvzagZ+8dgiC2Op3OH8ZisXez5xoZlNXV1VXhcPhPkiSdaRjGF7UXxsoPXLHgOP6+2+2+rK+vb8dYmfdg86ysrGSTyeRPU6nUr3Rd944le2AY1sxx3PWVlZVPbtu2Dbp+hWWA3jv7mAo8GblCV5QLHLpeYoUzhhPQy8rKJkWj0ScVRYE+YbDCBsMtA0Rj0zT9Ak3T34tGo6DghiU/G9BzMyOKojxN07dNnTr1+o0bN474wia1tbV0b2/vZaIoXqVpWmlu1hhd1CiKJmiavr2srOwvVuzSRqJ1OI47LZ1OX6+q6szReNWSjU/6P/DWchx3ZSQSgarRYRrQ4/Pm+bUYf7EhSt936HptNopnSzNcgF5VVTWzp6fnCVVVp2Sr62imoyjqvZKSkpM7OzsFq+ZpA3ruluwPmnuyurr6ByP5CD4QCNQnEok/yLK8GFTmyt0So48DpLbhOP5vjuOugH2Zj0SrBINBZywWu1aW5R8YhjGiA96ssj/4wCNJ8k/l5eW3tLS05JQZAQ3ofSef7HY0t37PoSi/cuh60KrJ7C9nOAC9rKxsRiwWWyPLct6quuXDVvmUyXHc95LJ5P1WjmEDOrw1QZ7zuHHjljU3N4fgpQwPp8vlOjedTt+paZp/eDQo7lFRFJU4jvt5PB6/q7g1Na9dRUXF1HA4/IiiKLPNSxt9EkiS3OJ2u5eGw+HPs51dzoAeO/pUn9HbdoEhS9cYumbJ0fpgyhYa0D0ez4RUKrVazTJPPlsjj2Q6giDaqqur5+zZs6fHynnYgG7OmjiOb6Rp+hSe50cEqIOc8ldeeeUGQRCuHM6qbuasXjhuEAxZXl7+41x3aIXT0NRIiM/nOy0ejz+m6/oXtfTt38AWQFE07fF4vhOJRJ7KpkBR1oDeN3duNcKnrzJS6e84DIMuhAMKCejV1dX+np6e1aAedCHmBpqtoCi6F0XRVhzHWwFwqqra7fV6k11dXRGn02mo6heFhTC3212aSqV8oJGLruu1mqaNNwyjRlXV0nznwrMse7MgCL+22iZmAR3UrqeowsZQaZrmkGXoeBWrTeggSXJdWVnZae3t7RHLhVsoEASXNjc3vwAqvVko1rQosIZIknQgCOJQFMXR/7yZlmuVAJIkd1RVVS2w+mPaKv1g5YB8/FQqdbVhGEVz3YLjuAO8k0FjFgRBnMX0nDscDp1l2YenTp36o40bNw557TkkoIP0s9isOccaqdQVhqyc6DCMgtYmLySg0zT9D1EUL4VdpJn4QPEWiqLeoijqJZZl//O9732vZcWKFaZKAc6dO9fd2to6WRTFuZIknSDL8lxVVSsz6ZLt/0FXsdLS0sNDodCn2fJkS2cW0GmabhJFcXK241lFt2LFCnTr1q3ezz77jOvt7S0BqYyGYUyRJGmmpmmgk9NUTdNMZXfkoitFUQAoz8iFp5C0wWCwLBKJrAX11gs57hdfwhgmYBi2kyCIT0mS/Bh0JyQIotPr9UaWL1+euO666/j9dfrrX/9KPfjgg+6enh6/IAjgGnGSqqqH99cHb8xnc6XBbAM++MeNG7eopaVlNETBo06n8/5UKnXRMKwFBUVR0J0SrIVNqqpucjqdPSUlJb3nnntufMWKFV8Byssvv9z58ssvB0KhUJmqqhNVVZ2l6/ocTdMaZVkelvRlgiA+qKioOK21tTU6mP0GBPTogpNqjY6OywxdOcehqqDt3LD8CgXoHMedwfP8v6ze7VIUtQdF0TuDweBLhXogp0yZUtvZ2XmUoiingqAj0JYV1nkURa1ZvHjxCStXrrS8YtlIBfRMtgSA/8ADD0zt6+ubo+v6QlmWz843wDudzj+nUqnLM+lW6P9TFNWg6/obiqLUFGJsHMclHMefJgjiHZ/Pt2HixIk7rczxbmhomNDR0XG4ruvHybJ8rqqqBYkDwDCs0+fznR8Oh9cUwo75GAMUDWpubn5VkqTj8iH/QJmgDS5okoIgCOhb8cGcOXO2rF69WrJi7FmzZpW2tLQcIUkSeMbPliTpkEJdI4EOjjU1NWe2tLRsGmgu/wN0fuHCoNQRPh9R5dMNVT0mU+MUKwyTSUYhAH3p0qXk888/v8vKOtE0Ta8jCOLmk0466ZV8gGEmu+37f0NDA9fZ2Qk6v50jSdIyXddzOmHxer1LYrEYyEG3/DdaAf1AQ4Hj5o6OjpNkWf6WKIqL8/Hgg+h3j8dzTiwWe95yR0EKrKurO6y1tfVfsiyPhxSRFRs4JiUI4nGXy/XcvHnz3nzxxRcty8QYSgHw3njjjTfmybK8FPhWVVV3VgpDEqEoGmJZ9lye50ccqAMw37lz58uqqp4AOf2s2MDVCcMwAMQfrKqqen3nzp2gvWm+f0hNTc3Evr6+Rbquf0OSJFASPK9joijaGwwGT+nq6vr4wIGQ6JQZ1+qycrzD0I506HpRldcrBKC7XK7f8Dz/Oys8gOP4ZyzL3njYYYc9Y+XOwArdGhoaKtvb25f17ywOy1SBCdzpT5w4cVq+6k6PFUDf33fBYPCQWCx2maqq52qatQGlGIZ1BYPBGZ2dnYV4iQ25JFmWna0oyjOKoliaxrpv0P583U8oino4EAg809LS0m3FMwIro7a21tvb23tmP7AfbeTpahKAut/vXxYOh0dMgaGZM2d6t27dulJRlHyBuQF2rRRFPeb3+//Z3t6+C9aPZvnACW9NTc0hkUhkuSzLZ2maVp+vOAEURSMkSZ4tiuJXPvCQvklTDMd/g6/y80PRHgeCqA5Nq8p1gHwD+rhx43wdHR27NU0zVZUIvGAIgngiEAj8vBheqEPZ+eSTT6bWrl0LdoyXybJ8/GAvH6fTeVsqlfp5rj7Lln4sAvo+25SVlR0ai8WuVBTlHCsrENI0/ZAoit/O1gf5oPN6veN5nn81HzUc+oH8Y5Ikb58zZ85zxda9DHRh3LRp02k8z/9Y07Rj8gHsGIZ1eL3er/f19W3Ph/+slFldXc2Ew+H7RVE8z0q5+2ThOL6TYZgHGIZ5KBQKWZqFY1Zf8JEXDoeXSZJ0KSiWkw9gR1G0w+12fxOkWf/vYzevgI5hO3QXdwYqpB52KMrcXI2Ub0B3uVzX8Dx/fa567U+PIIjIMAxIx7kZRCOakVVgXtDFaFYikbhJUZSF+wMLiqKpYDA4raura2++dBrLgN5vU9Tr9Z6eSCTu1i2q4wDSWsrKyub19PRsyJffhpLr9Xq9qVTqPUVRpls8Pii60gRKYx566KFPFtvp14FzBSl6b7755iKe529UFAVUPrP0B8qEVlRUfC3fDZTMKA0+bjZs2PCndDr9UzNyBuJFUTTMsuztDMPc1tvb+5XARqvHMisP2GHLli2nx+Pxm/LxkYthWMjpdC5OJBJfPPN52qEjOkIQLzo8lRf6N74Z76ubur7YAB0Yeu3ate2qqkIXxelvnnFlOp2+zeFw5PfixOzKGpwftIT9ejKZ/H3/lyRCUdRqSZJOzeecbED/r0OCweDESCTytFXFNUCXtquuuuqkFStWFPTjsq6ujuro6HgknU4vtXKpIgiSpmn6rxUVFTfv3r3bstLDVuo4mCywQ41EIr8QRfHXuq6zVo4JqjeCcqnhcLgoW7E6nc6fCoLwJytPoEDWDUmSqwOBwA86OjrarbRnvmWBUsfhcPj/BEH4ua7rHivHAx94NTU1R4OrJ+sBHUVjKO38qZdFn0D6a04XI6B7PJ7j4/H4W2YMyzDM70HP5hG2Mx9wyiBwpa2t7ZvpdPp3Xq837xG1NqB/6Ya6ujp3S0vLo6qqnm5mPe7j9fv9J0UikdeskJWlDJCOdGMqlfo/K+twkyS53el0Lh/pLWQrKyunhMPhB2VZPjJLe2ZFxrLsHUccccQviu3EguO4JalUChSNsayUK47jPeAjIR6PrxzJ71twJZVOp/8uSdIpVj4rBEF8NGPGjPlWArruoKgXMI6+wrtxY/P+K7IYAZ1hGHAc9MusnpwBiEAu45QpU47evHnzqOppXF5eXlpVVRXLdwMQG9C/uqjAcbUgCI/Lsnwy7Jrcx0fT9JvpdPrEbCpLmR0L8IOqX7FY7DmrdmNAb4qi7h4/fvyv8hWUacW8c5HR34zmD4Ig/NAwDEvaw4Idq8vlujiZTD6Uiy75pJ0wYUKwvb19g6IolmU3EATxttfrvbS3t7cpn7oXSnb/bv2SVCr1B8PCIm1Op/N2awAdwzahNLPCW+Z9GVmz5qAIu2IDdHDH9cILL+yVZTnnQD3gdJAe4fV6j45Go/8u1CIYbePYgH6wR0tLS8uj0egbqqoeYtLfRiAQOCIcDh+U1mJS7kHsoNFKNBp9TdM0SyLaURRNsix7Oc/z943kndggdkY4jrswlUr9SbeoIyWGYb3l5eVHd3R07LTat7nKA6d8TU1NL8iyfFKuvAPRg/csTdO3ulyu3xb7XTnEfEH526OTyeS9VpUap2n6aVOAjmBYq4GTtxNe5mH3hx/2DTapYgP0CRMmNOzZswe68hJJkhtkWZ6XzztmiAUyolhsQB/YXYFA4PBIJPKeruumqs0xDHNLOp3+Vb4XBUVRKyVJOseKcTAM62ZZ9rJkMlk0+fRWzOsAGYjH41koCMJ9Vu1iQQEoSZIWDvcHEMdx3wEAZVEHPZXjuGuTyeQfHQ5HHtOw8uDhHESCGJpYLAaeocNyYDuIlKbplfX19d+GA3QU4xGCuEOtDNxUtmZNxijDYgN0l8u1nOf5J2ANWFJScmZfX99ofunAmiZrPhvQBzeV0+n8WSqVujVrYw5AiOP4tvLy8sPb29vTZuQMxVtSUnJhX1+fJce9OI63syx7ViKR+Chf+haTXJfL1SiKIjiNsaRUs8fjuSoej/9+uOZYVlY2KRwOf2JFsxUURVWGYS4C9/DDNZ8Cj8sSBPGKoihfgxnX6XQ+nkqlzge8uQE6ivIOknyAaJx8vfu55wbdkR+oVLEBOk3TvxVF8ToY46Eoqpxwwgm+119/fVTdncPYwgyPDeiDW2/BggX0+++/36xpGvTLHkEQxefzLY5EIq+a8dNgvNOmTfPv2LFjixkd98nGMCxSWVl5Ultb25gA833zLi8vb+zt7X3DIhsmysvLJ3Z0dGT9XrZqXfSnqD2TTqeXmJUJ4gLcbveP4vH43WZljST+KVOmlDQ3Nz+bK6gTBPE3RVFALNgXXaOyA3QUC6E0/TfV77qt9N//zjlNotgAnSTJB2RZhirAgeP4x6qqzhlJi6UYdbUBfWivgNrd0Wj0UTO+6w/8vMKMjMF4aZp+WBTFC8zKxjCM5zjumFgsNmBtarPyi50/EAg0RCKRdbqu+8zqyrLsM4IgWJo2mI1OHMct5nn+eQt6YRhOp/OXZk+nstG5GGlAMZrOzs6XZVk+Kgv9DJfLdcPhhx9+/f5ZDkMDOo5vRRj29ymOerZm3Troo7siBHRgNJA2kPPP6XQ+lEqloD4Gch5sFDPYgD60c/vrJHSpqhqAXQYURf1bkqSjYfkH4xs3btzE9vb2nbqum4rWBqcIbrcb9MV+3WodR5I8v99/YjQaXWUYhql+wCCIrLy8fHZXV9d/CjX/QCDAJRKJt2RZNr3JAR+gp5122pXD2f+iUHYbbJyamprKjo4O8IE3bjAakAXCcdwNiURixYFxEwcBOoLhYQeJ3edgXU/4/rN+C+JATBdMKUJAXw9ajcI4z+fz/SYajd4Iw2vzfGkBG9AzrwaWZa8XBOGazJQDU4AI6OnTp9dv2rQpBitjID6KokDXrEUmZYLd2K9AxLdJOaOC3el0XiEIwu/NlgglSXKjLMuHF8ooLpfrhzzP/83seCCoq7y8/IKWlhbRrKyRzl9aWloXjUY/UVX1oE6ZoPwxSZJXXHXVVbcPVDzqv4DuQHpQDH1MJ4lXBW7y2pp1K6F34wMZs9gAHUXRj3Vdnw3jeBRFL9V1/R4YXpvHBvRc1sDEiRPrd+/e/XkuPPvTIgiiV1ZWHtbR0WFZP/uamhoQaPeR2Y5SJEmuWrJkyVljeTe2v6/Aicz69esfEUVxOay/9/F5vd6vxWKx98zKycQPjtgJgtihqmp9Jtqh/o/jOOhRPyccDneakTOaeEtKShZGIpHXD/jAk0tKSi7v6+sDH1ADbrSR6LxjZ3mrg5uRPPS83mfgYgN0giD+oyjKLJgF4Ha7f5FIJExFIMOMO9p47B16dh4lCKLVTD9xn8/3g2g0eld2ow1NBV7gDMO8I4oiVDTuPumgqUYgEFjU3d3dYoVeo0VGIBCoiMVir6mqaqoWPkVRb1111VUn5rv8r8vl+j7P86bWFoIgktvtPiUej789Wvxo1Tw4jvtFMpkEJ1gIhmFJiqJ+KQgCSAsc9Pe/fuhWKTGQnGIDdAzDPtI0DepYyuVy3cbzfN66kOXTD8Uk2wb07LxBUdSzkiSdlR31wVQsy94tCML3Yfn35wPtX0Oh0GYzwU+gmZHT6byI5/mnrNBptMnwer2L4/E4qLqHmpmb3+8/CgTbmZExFG9/ca5PZVmeZmYMmqYfuPLKKy/O98eHGR2HixfY+Pnnn38PNHVhWfYn2aTxjUlAJ0ny31lGEh7kS4Ig1iiKctxwOXm0jGsDenaeZFn2t4IgQKVYghH677tNl5MFshiG+Vs6nf5hdpoPTEWS5MP9GSamY3PM6FHEvAjLsg8KgnChGR37M3m+a0bGULx+v38paCpkRj7oY15VVXVYa2tr1Iyc0cxbXl4+TdO08b29va9kM8+xCuirZFmGaoSB43ji6KOPLim2hgjZOLuYaGxAz84b/UWM/pUd9cFUJEl+IsuyqSpUQGp9fX2gubm5Q9M0ElYXFEXFysrKGe3t7btgZYwFvsrKypru7m6QRUDDzhdU3Rs/fvzc3bt3t8LKGIqPoqjXJEk6EVY2iO/weDzficViD8PKsPkOtsCYBHSKou6RJOli2AVRVlZ2UigUKmQ3K1hVi5bPBvTsXDNt2rS6rVu3QgMghmF7nnjiicnLli3TshtxYCqXy3UZz/N3mpRxHc/zINXG/mWwAMdxNyeTySvNGKo/i+AWMzIG4gUNWFpaWtrNNOMhCGLdjBkzvpbvJlBWz73Y5Y1JQGdZ9mpBEG6AdQ5FUWslSTrWruUOa8Ev+oDP7enpWQ8rgabpJlEUJ8PyjxS+u+++m7jssstkXYdrb44gSEdFRUV9Z2enYGLOCEmSr8qyDL0jQ1E0XVFRUTMclcxMzHvYWEFL3T179rRpmuaGVYIkyQ9kWT7G6hrvfr//8kgkAv2hAKrB0TR9QTqdhi6/DWuT0c43JgHd6/WeFYvFnoV1bn9i/6mJRGI1rIyxzmcDevYrAMdxXlVVqN7SOI6HjzzyyPq1a9dC31P6fL7p8Xj8fV3XPdlr/VVKjuP+nEwmL4flH4t8brf7ukQi8VvYuSMIIvh8vhOsDo4jCGKboihTYfUCBY9qamoWNjU1SbAybL6BLTAmAb2urm5SU1OTqd664CizvLz82I6OjnZ7ceVuARvQs7cZhmF9mqb5s+f4khLUSa+oqJjc3t4egeEHPAzDXJFOp0HXK6gf6H9QVVVV29bWZucZ52DBurq6UnAHbuYuvb840bU5DDsk6fjx4yfs3bu3GaRSwcrkOO6S/q5ssCJsvkEsAO2UXCxabGlrQPf+I9tJuczjQFqCIN6eMGHCuTt37gybkTMWeW1Az97rOI73qaoKBegoioLGJ6YAnSCINxVFAe05oX4MwzyXTqehU++gBh0lTCRJrpRlGbo9LUEQ4Nj9aHCqaIVJWJa9WBAE6MJaIJ96woQJ1U1NTQkr9LFlfNUCYxbQWZa9ThAE6OOsfWYkCOIdj8fzTbvKUW6Plg3o2dsLw7A47F0q+BiYM2dO/bp166B26BMmTBi/d+/ej3RdL81e469SlpaWHtvb2/s+LP9Y5qusrDy9s7NzFawNUBSNlZeXT+7s7LRk08Gy7LOCIEB/nDmdzttSqZRdxwPWoRn4xiygV1ZWzurs7LSkiQFBEG0gL7Onp2dDnvw06sTagJ6dS0ERFxzHdU2DC1I3GxTndru/mUwmH4Et9UoQRI8syxVW7RCzs9rooiIIYo+iKLWwswoGg2f09PS8AMu/j6+/rS/4uIROXSwrK5sfCoU+MKuLzT+wBcYsoANzkCT5uSzLpuoQ7zMr6BzldDr/6Ha7bzIZUTwm1qoN6Nm5+cgjj6xdv379nuyoD6YCxTvuvPPO+ksvvVSBkcEwzF/T6fSPYXj7nzFQSOYiWH6b74vrwbtFUbwE1hY0Td8jiuKlsPz7+MrKyo4KhUL/hpVDkmTXkiVLauz6/bAWzMw3pgHd7/efE4lEVmY2U/YUOI53UxR1y5QpU/6xceNGM6lC2Q86AiltQM/OaT6f7+RoNJpVlaiBJBIEsVlRlEOzG+1gKjNVFYG0srKys0Kh0HOw49t8DofL5TqL53norJz+3hVQzaj2t7/L5foJz/O3w/qEYZhb0un0r2D5bb7MFhjTgN5fK/czRVGmZDZVbhQ4jreTJHn/uHHj7tixY0dfbtyjn9oG9Ox8zHHcVclk8qbsqA+momn6LVEUT4Dhb2xsdO3YsQN3W14kAAAgAElEQVRULKuA4ccwLHXWWWf5V65cKcPw2zz/tUBFRcX4UCi0SdM0L4xNQBvdmpqa+paWFlNtdGmaflAURejTFp/Pd3o0Gn0JZg42T3YWGNOA3r+DmN/b27vGTNWjoUwNCmqQJPkSSZLP+3y+d1paWrrt+0S7sEx2j+cXx62Pi6J4Xrb0B9LRNH2fKIpQVRGrq6vrOjs7t+m6TsCMT1HUu5IkLYDhtXm+tABorfrBBx+8JMsyVA96UGbV7/dP6+vr22HGrjRNt4iiOB5GBnjnTZ48uczOCIKxXvY8Yx7Qgalomn5IFEVTzRCyMTno+4th2CugvaHT6Vx36aWXto3VLkP2Dj2bFeNwEASxU1EU6Ip4Xq/357FY7LbsRvsqVVlZ2dmhUOgZGF7AQ1HUrZIk/QKW3+b70gIMw/w+nU7/H6xN3G43KIQFfXWzYMEC77vvvhuFDY4kSbJNluVxsPrbfNlZwAZ0h8NRW1tLd3R0bFAUZUZ2ZjNPBXbuoOISjuNP0jT9nsfj+Xz37t1x85JHhgQb0DP7qbGxcdy2bdtAz3Co5xTsioCdu7u7P8o82sEUZuuJcxz3nWQy+SDM2DbPVy3gcrmW8zwPXSrV7Xb/LJFIQN9/V1RUzO7q6voY1i8Mw7yQTqfPgOW3+bKzANSLIjvRX1IVY2GZA+fg8Xhm8zz/kqZp5bnOzyw9ePGiKBomSXI9juMvMAzzUSAQ2L1t2zberOxi5bcBPbNnOI77ZTKZ/FNmyoEpUBSNgipxsPXTaZp+UhTFc2HHt1OUYC13MF8gEJjd19f3MewO2eVy3c3z/PdhNeI4bkkymXwelt/j8fw6Ho/fDMtv82VnARvQ97MTx3FHiaL4oqIoUFW5sjN5Zipw54WiaAhF0a2gEQzHcS86nc5do6m6kg3oQ6+DFStWoDfeeONuRVGg7iyBdIIgPlYU5QjYJkIURb0vSdLRmVfswRSgzTDHcdOj0Whe2nfC6DSSeQKBQGU8Hv9UUZQAzDxomn5XFEXoeAaWZS8TBAG6215paenJvb29r8LofiCP4XAgsZkLPJjYjcWnTxdqVq5MWyEXPHP/bNzKSWkVH8fUCuuW3WqJXFBLYtmlK93tUQdWXe1Ir7x1mSVyB5qzDegHWAWAuiAIYKfus2KRWCEDQRANRdFeFEW3gZcswzDPV1RU7Nq8eXPKCvnDIcMG9KGt7vf7T4pEIqaa/1AU9TdJkqBzyHEc366qKlQGCLhOqqqqmm82sno41mYxjgkyDnbt2vWeoiizYPQjCKL56quvroeN2aFp+lpRFKFb35aXl0/r7u7eBqP7Ph7j5JOpaGvXd3VR/J5D06oRhwNzIGjKgaIfISy7wr9l4xYY+XWv/JhKdHZcJKnyxZqhjTMQB446kBSGYhucBH1Dx0VPf+qAKJ27dOnTZIzQvqEo2vc1w5hoGAaGImgaR9F1JIH+8dXHlkNdhQ01RxvQB7COz+ebwfP8Q7APD8yiyoWnfwffjWHYJhzHP3A6ne9NmzbtozVr1oi5yBlOWhvQB7f+7Nmzic2bN29SFKUR1kfgI9Dj8SyNxWJQOeCgKth77723S9f1ahgdKIp6+6qrrlq0YsUKFYbf5vmqBcAuj6bplyRJOgXGNhiGdR1zzDH1a9asgbrGoyjqdkmSfgIzNuBZtGhRyWuvvQZVfhjwx6bPmagJyXsdqnrcgDElCCI4MOK3Jc3b/pyLjuUPLC0VVOE5VdOOGkguiiBpDMV/G+9M3uZYsSbrtXz80oerNAd+r6brJw+4k0YcKQzDbl4wdefNsB9Z9g49B0+PHz++oqen53ZRFM92OBxoDqwFJ0VRVEJRdA+GYe+BRhrV1dVvF3vuuw3ogy8TUG41kUg8YmYhYRjWXFNTczjsDnnmzJneLVu27NQ0DaqGe39TkWVm5mDzftUCNE0/IoriN2HsYrZJD03TD4uieAHM2DiOG4qiYLDpurHpR/s0IfyMQ1WPzzC+irpc3/Nt3fRwNno2Pr2UbI+m31J1NdO1ksxi5I/Cl6y6Nxu5J37rn05JxFYOBub7ZCAOh0LT+M/feOy8v2cjNxsae4eewUoul+v76XT6etgXWzZOsJoGRVGNoqhVBEE8M3HixFc2bdpkqqCE1foBeTagD2zVYDA4IRwOf6ppGmfG7gzD3JlOp38IK4PjuBKe53cZhgF19cSy7P2CIHwPdnyb72ALYBj2V03ToK5QMAzjq6ur6/fu3dsFY1uCIJ5UFAUqQBLDsChs+1+ga9/kQy53yOItWemNYjwyqaba/+abGTOGSu8546KUJmaVhYEhaGge2zjx9Qv+lPGa8/jzHv+ZImu3ZtPeDkWQiJMjp6x+cFlvVvPLQGQDehZWrKioGBeNRn8vSdJ5sFGmWQyTFxIMw0SKoh5nWfaR44477v1iqaNsA/rB7p49ezb72WefvQYbiLa/xEAgcFw4HF4Du6jq6+urdu/evVNVVRZGBkEQdyiKAn1ECzPmaOfhOO7PyWQSKq8fpMn6fL7JfX19HTB2cjqdr6RSqQGPjzPJo2k6LIoi1EkPkB2dPOVDXVbnZBrnf/9nnctLtn/6VCZ6/z2L14mafGQmun3/d+H0paGLn8/YOvbYZY+t1TV9frZyaRo//83Hzns8W/qh6GxAz8GKwWDwkHg8DhodzMuBrWhICYLY63Q6/+r1eh+APYq1ajI2oB9kSRyUCpZlGepYc39pFEV9IoribNgjTiCrpKSkKhqNgjt0BsbnXq/3jlgsZgM6jPEG4SFJ8neyLP8GUiSIrAYFiqAAnSTJV2RZhgJ08N4x0y2ub+IU2aGpWVcrRGjqD/7Pt145lJ2+9dotzn/tfps3HNnso/8ricbIByKXrPruUHLP//Er7rbuyE5dN4LZ+okksXvffuIb0M139h/HBvRsrb4fXVVV1ZF9fX1/kCTpGBCsAiFiWFlQFE04nc47a2pqbhyuXHcb0L9cAv09Be5SFAUcUZteTy6XaxnP86aaDtmAPqyP6ICD4zh+vaqq10BqNiIB3TAMNFI7OafewQiO3+Fv3jHkx6T7vqV+VUnm1GMDRZDH+O+vHjKGYdHSp/2CIe4yDCTr1GcEcTz2/jPfgoqNOHAtmH55ZLO4RkJhmWzmcSANSMWIx+MXKoryXVVVs3YgzFj54AH3ajRN3zVnzpzfFjpC3gb0/3q0rq7O3dbW9pgkSadZ4WOSJDdedNFF8+655x6odqn7dABH7nv27NmlKArUDt0+crfCm1+VwXHcn5LJ5C9hJIMjd4qiJqfTaagdOsdxrySTSagdOk3TfaIoQuXPg7n2TZoSdqhqSbbzRhj61/4dnw1ZxGbFO+/gf9n5p7iqa1lfKdEY+ZfIJauGtP/Sa58me7bJu3TdyLrMLU1jN7752DdgT16+YhYb0LNdJUPQgZdyKBQ6VVXVb6fT6YXgq9ICsQUTQRDEHrfbfXlfX9+/CjWoDegOR2lp6cxoNPqkqqoNVtm9P3/9NbPyzAbFmWkKY1b30cpPEMRfFUWBCorDcTxVVVU1GTYoDsOwxzVNg2oShGFYzExdj0hd43OGImddNhZxeo7xb9u4NtM6CNy75FFBlc7PRLfv/+VcyQm7v/nYW5noj1v22NOKpi/NRAf+DwDYyeDHvfroedDxLvuPYwN6NlbPgWbChAnje3t7T1EU5URVVefpuh4cKYF0JEk+6vP5ftvT07MnhylDkY5lQK+qqqqORqM/EEXx57qu01AGHICJoqhXJUmC2kUdKK4/bW2XpmlQOyuSJJ+WZRkqKtoqe4w2OTRN/1MUxW/BzMts2hrLsg8JggDVwArHccdvfvMbDDbfum/KoSc6ROEFh2FkflYIYoP/m+cehaxYoWeyU839yw+PyPEPDIeR8X6exIh3Y5e8mFWlva+f9/TXREVaZRgOdyYdcAz9qJaVj33ooW9bUkPEBvRMFjfx/4aGhsqurq7jRVE8zjCMozRNm6DrOmVCZN5ZcRzfwXHcxdFoNOMXrhllxiKgT5gwIdjd3X2+qqo/VBRlohn7HciLomi8rKxsZnd3N2jmYvpntrAMQRBvnXHGGYuKJavCtEGGWQCI1aEo6kVZlk+FUQUUlmloaKiHjZmhKOo2SZJ+CjM24DnmmGPK3n//fajULGPpUizy6fZrHJJ0tcNh4IPqgOFdust1XOnmjz/PVs+y+5Zcl1Lk3xiOwU9VUQRr9RH02W3ffTbr5jQnLH/iN5KqXWMYBjmYLiiKdDEUftprjy7/T7b6ZqKzAT2ThSz6Pwh82rBhw/hEInG6IAgnaJp2qK7rlaAcoEVDWCYGQRDB4/H8MBaLgQIN2YeB5qDBWAH0xsZGsqOj4xBd178pCMJ3NE3z5GCmbEl1l8v1I57n78qWIRs6giA+VxSlPhvaA2kIgthaU1Mzfyx1EISxU7Y8M2bMcO7YseM9WZYPy5ZnfzoLSr9eI4ri9TBjA55gMDi9p6fnM1h+AOrRrTsvNtLpGxy6/tX7dATRHQi6Aa0oOc/3wQd7cxrDcCDB+8/4iaBK12iG8RW5iMOhExj+sYd2XrT3gqe25yIX1IVf+/mUCyVF/b1hGGX78wK5CIp85GLwC1755/KducjNRGsDeiYL5en/8+bNY9ra2uqSyeTp6XT6WE3Tpuu6XmYYQ3yB5kmXgcQiCKJ4vd6fRKNRkHeZ8fgqV9VGMaAjkyZNKo1EIg2KoiwURXG5pmmT8xlXQdP04/0VxCz9+AKNgSRJyjqf9gAAAc1ZDolEIm25rg2b/mALBAKBing8DsoBfwUcsrUVaNEsiuLXsqU/kA4U2DLzwRgIBBaHw+EXYcffx8fPXRiUUn3fQiXlSMNhMA4H0m6w1L/8OPI2snEjdCBo/ePnBZKSfIGoKkc6DMOJII5OF+562uVU3922bKUMq/fS7z7tjwvqcsVwfA1xGJzDQDowHF2J+93vrr7jFAlW7mB8NqBbbVFIeeALvKOjY5woiqCAwkmSJH0NtHLNJxBkUhXUA3e5XBcnk8mHrN6pj1RA/6Jz0rJl9EcffUTxPM+QJOnRNK0+lUrNVFX1EFVVpxqGMa6/0lveny+CINYGg8ET29vbLe/gRNP0U6IoQpdv9fv98yKRyPpM68z+f2YLVFRUHNbd3b0RNh7H5XLdy/M8dK6zz+c7PRqNrsqs6cAULMv+VhCE38Hy23zZWSDvLxygxmhNW8vOxHBUAOB7enomCIIwR9O0MyVJOrI/QKkgPtunNYqiSZfLtTSRSJiOnN7fEmYBHcMwhaKo3I7X4FzxPy5VVR2KoiAoioLgHNIwDJDywui6PixZDQRBbAcv2lAo1GxyagOyO53Om1Op1JAFOoYal+O4i5LJZFZ1tfOh/2iS6XK5zuV5/knYObnd7l8kEolbYfmrqqoO7ejo2ATLT9P0alEUoRrLwI45FvkKAg42oJtfWhMnTvTEYrFGUBZUUZTjdV0/WlVVl3nJmSVgGLbX4/GcEolETLU/tBLQM2s9uikwDGvyeDxLrPTJgRbz+/3nRCIR6AI1FEX9RZIkqLzp0e293GfHsuxNgiBclTvnfzk4jjs9mUy+BMs/f/58bv369QlNy6nGy/+GI0myS5blStjxbb7sLGADenZ2KiqqBQsW4E1NTbWRSOQ4WZYXGYZxkqZpznwqSVHUC5IkZZ0LmkkXszv0TPJH8/9RFN1cVlb2je7u7q35nGdVVVV9V1fXVl3XB48sHkIBgiDeAR+f+dRxLMgGz/u6detWwaYkgnbLICjNbD9yhmF2ptNpUD425x8oQzxlypSq7du3QzWHyXnAMcpgA/oocPzcuXPd27dvv1AUxQtlWZ6dryn5fL7zQCEUK+TbgA5nRYIgPpgwYcKSnTt3huEkZM/V2Njo2rFjB6jnXp4915eUoBLhWWedVbJyJXxQEcy4o42nsrKyJhQKbYKtRolhWF9jY+PkLVu2RM3Yhqbpe0VRhO6g5/V6z47FYgUrXmVmriOV1wb0keq5QfQOBoMnRKPRn6mqepKu65amxJEkuWvJkiVTrcgttgE9t4UHdlkURT1RXV393aamJsujYwfThiTJ9bIsz81N2y+pA4HA6eFwGPqoF3bc0cTHcdwZyWTyOdg5EQQBouNnwfLv43O5XJfxPH8nrByGYf6aTqehc9lhxx1LfDagj1JvgzrzsVjsVlEUv27lFEtKSs62okSsDejZewXDsLDT6fxxIpGw5HQk+5EdDoqi7pAk6Ue58OxPS1HU/ZIkQe/qYMcdTXwMw/w9nU7/AHZOVpXhLS8vP6K7u3sDrB4EQUTmz58fXLNmjQorw+Yb2gI2oI/uFYJ6PJ6zeZ7/h6ZpljSPAc0/ZFk+3KzZbEDPzoIURb1eWlr6nfb2dqimGtmNMjgVx3EX9qctQonCcbxDVdVqKGab6QsLkCTZLMsydGXBsrKyc0Kh0LNmzTl79mxi8+bNCUVRMpdgHWQwr9d7fCwWe8esLjb/wBawAX0MrIxgMFgWi8WeBrntZqeLIIhj4sSJk5ubm5vMyLIBfWjrURS1i6KonycSiZfN2Nksb319/cTm5uYPNU3LutvVgWNWVVUd1dHRsc6sLmORv6ys7OuhUOh12LmDksClpaX1PT09IVgZ+/MxDPNoOp3OuqHJgWO6XK77eJ6/2ApdbBkHW8AG9DGyKmpra+murq7HJUk60+yUOY67OplM3mRGjg3oA1sPx/FOmqava2hoeHCjicpXZnxzIG9/tHpWjSkGGpdhmKfS6fRyK3UaK7Jomn5SFEXoJjckSX4IaliAKHMrbOZ0Oi9MpVKg0BTUD8MwcdKkSTWFCOqEUnCEM9mAPsIdmIv6DQ0N3J49ex6SZfmsXPgOpCVJ8hPYmtL7ZNmA/qVVURQVMQxbR9P0I7Nnz36i0L3pM60Fp9N5VSqVgv6AQ1FUGjduXG1LS0t3prHs/39pgerqan9XV1ebpmXfs/tA+9E0fYMoitdYZdf6+vqqXbt2tZqpYOlyuX7K8/xfrdLJlvOlBWxAH2Orobq6uqq7u/tVUKYUduqgStsxxxzjNgM8Yx3QQVldFEX3kiS5mmXZf02fPv29Yg0WAmVHe3p63tV1HbqQkcvluonn+ath19xY5OM47tfJZPJG2LmDD8WSkpJFvb2978HKGIiPoqhNkiQdCiuTIIiPp06dumDz5s0pWBk238AWsAF9DK4Mr9e7JBaLPW9m6mVlZYeGQqHNsDLGIqD378R34zi+xuv1PtXQ0PChmY8iWNtD8IHWnW9JknQcBO8XLBiGCaAPfGtrq6lcaNjxRxofOE1rampq1TTNC6s7SZIblixZMt+KNNP9dfB4PJfG4/F/wOoFUjAZhrlUEIT7YGXYfDag22ug3wKgleuqVas2SJIEXYSG47gzk8kk9EfBaAd08NJCUTSGomgHhmGbaZp+m2GYtxoaGjqKdSc+1APicrl+bPaY1Ol0/jqVSt1sP4iZLcCy7DWCIEC3KwUjsCx7tSAI0Fclg2k5bdo0P6j4puv6oL2+M82QIIhPx48fP7eQNRUy6TQa/m/v0EeDFyHmYDa4hWXZHwmC8HeIob9gMQvoINoex6EqksKq7DAMQ9M0TekPMJIRBJENwxAJguAxDGtBUXSXw+H4nCTJ3QiCtDAME2pra4taFZAErbgFjBMmTAju3bu3Tdd1AlYciqJCaWnpIT09PXtgZYwFvoaGhspdu3Y16brOwM4Xw7DeqqqqI1tbW3fDyhiKj6Ko5yVJWmJCtuH1en8ei8VuNyFj1LOCVMHm5uZDYrHYJ9lM1gb0bKw0CmmmTp06fvv27S2wUyNJ8lpZlqF3EGYBnabpvVVVVSfA6g/Dx/O8nkgkFJZldRzHlYqKCtnr9Yoj5NgcZspf4WFZ9h5BEEylHPWXD73U6na8pidXRAJYlr1bEAToVqdgKjRN/xOUgs7XtEpLS08Kh8OrYdu5Ar0wDOsuKSmZGQqFevKl50iXC9rOiqL4fZIkzxVF8f1M87EBPZOFRun/QV9vgiD6VFX1wUyR47hbk8nkL2B4AY8FgN4kiiJUowhYncc6X2lp6cxwOPyJmZc4giBpl8t1vplSpqPZD263e1EymXzZMAxTZZtLS0uP7e3tzQgAJmyJgJQ4s0WmKIp6dvHixedafc9vYl5FwxoMBif29vZu0nWdQ1G0iyCI70iS9OpQCtqAXjTuK7wiOI5/qqrqDJiRGYa5I51O/wSG1wZ0WKsNOx94ia+VZfkoM5rgOL7N4/Gc2NfXNyzV78zonk9eUAAqEomsVhTlMDPj0DS99vTTT1+Qb5B0u93nJxKJR83oiiCI6vF4lsViMeha9WbGL1be/g57b+5fDAyAeqadug3oxerRAujFMMz6dDoN1XjDBvQCOKgIhygpKZkbiUTWm9mlg2lRFPWMJEmgYIpehNMsuEorVqxAb7rppvtlWb7I7OB+v//ESCTyhlk52fATBPGJoigzs6EdjAZF0UhlZeXc9vZ2U9UnzehQbLxut/t3iUTiNwfqhSBInKKoxaIoDpiKaAN6sXmygPqY6aTldDpvSaVSv4JV1z5yh7Xc8PPRNL1GFEVTZYRBoCDHcaDhDHRg5fBbwjoNQBZBKpW61exRO0VRn0mSNN06zYaWxHHcRclk8kGz4xEE8QboOxEOh5NmZY10fq/Xe2w8Hl8DrkUHmgsAdYZhThAE4eODAL8Qk++rm7reoSg57wT9LbswkP5TCB3H4hgEQWxXFGUKzNzNpsTYgA5j9eLgqaysbOjq6tpmploYmAnIEvB4PF+PxWKWFj4pDitlr0VpaekxfX19r5mJat83WjAYnNfT07M++9HNUVZXVzM9PT0vKYpyvDlJX6TZPVhbW/v9bdu2yWZljVT+ioqKqaFQCPROGLKIE4IgKZqmT0in01/xtb1DH6met0BvgiBSiqKwMKI4jvteMpm8H4YX8NiADmu54uCjafoJURRN12dHUTRaVVV1bFtb22fFMbPCahEMBieEw2HwAg+YHZlhmBfT6fRis3Jy5fd4PAvj8ThoIIPmynsgvcvlupHn+YOOms3KHQn8oMb93r17X8m2iieKomGKok7fH9RtQB8Jns6DjhMmTGjYs2fPDljRHo/nhHg8/hYsvw3osJYrDr66urrSlpaWbaqqmgYiBEE6nU7n13me31YcsyuMFjRNj9c07T1FUcaZHRHDsFRJScmk4UgBA/f/f/zjHx8UBOECs/MA6YwkSV4ty/KYKkDEMEyNKIrPG4aRU0AkAPX+QLm3ge3HNKDPnj2b3b59+yO1tbUXbtu2jbdgMY4YES6X6xKe5++GVXjq1Km127dv3wvLbwM6rOWKh89sCdD9Z4KiaBPLsmfyPD8mdurV1dWTOzo6XjEMo84Kj7pcrhU8z19nhSwYGYFAoDISiXyq67rpDzwA6hRF/UKSpNtgdBlpPFOnTq34/PPPV+u6DlUff/+d+pgGdI7jrkgmk38kCOI/TqfzO7FY7NORthhg9O1PiVgPW/oVx3GQv27qwbUBHcZzxcdDUdSLkiSdZoVmOI63syz7vUQi8ZoV8opUBuLz+eYnk8kHVFW1pI4CQRBr58+ff9xwlxTmOO7yZDJ5ixV2B5UgWZa9tbS09NctLS2iFTKLUYbX652VTCaf1jTN1IfdPlAfs4AOgjm6u7v3qKoaBI5GUbSdYZgrp0yZ8nSx9KHO1wIsLS09pbe392VY+Vbc1dmADmv94uLz+/2N8Xj8VU3TaqzQDNypMwzzo1Qq9cRorCbncrmWpdPp2zVNK7fCXhiGRUARme7u7q1WyDMjw+Vy3cXz/PfNyDiQl6bpx/x+/886OzvDVsotAlkox3GLBUG4y8K10DVmAd3r9X47Fos9sL9jQUtLULnI5XL9LBwOdxWB0y1XAXRx2r1792uKosyDFe73+5dHIpGnYPkBnw3oZqxXXLwul+vsVCr1lNmUq32zApktLpfrVo/Hc017e3u6uGYLp01jYyPZ2tp6LUj1NAzDkiYE4H3FMMwPBUGAvjqDm83BXOD6cvPmzTsURbHkw27/EUAjF4/H851wOPwfq/QdTjmBQIATBOHKdDr9f1Y9M2A+Lpfrt2MS0MHDtWvXrs2KojQM5FgMw3qcTucV1dXVT42yFAqUYZjfp9Ppy2HjJ1AUlWbNmhXcuHFj3MxDYQO6GesVHS/qdDpvTaVS0JUDB5oRSZIfBwKBb3Z2dn5edDPOQSEQyR6Px+8VRXFhDmwZSWmavmfatGk/KoYTRZ/PBxqIbLISoPY3AIqiIPf62vHjx981kt/Jfr9/WjKZvNfMhmqghUEQxNtnnHHGiWMS0N1u93mJROLxDE+MQRDExwDYY7EYqIk84vPhKYr6mSzLfzAMA7rtIcMwT6fTaVDhy9TPBnRT5is6ZnCFFQqFnpJl+XQrlUNRlGdZ9vdut/vWzs5OwUrZ+ZYFNg7t7e2X8Tx/va7rbivHA3XUq6urT9y9e7epD2urdHK73T9KJBJ3WCVvEDngnbze7/df2tPTsyXPY1kqHpyMtra2/k6SpIt1XYdKFR5MIRzHPysvL/9ae3t7ZMwB+kA1cofyHIIgEkEQb9E0fX08Hv9whLbCRN1uN6jKBVJBoFsygjvNioqKOV1dXRvNrnYb0M1asPj4KysrA6FQaK2qqgOefJnQGLzIP3M6ndfEYrEXi/3jGqRx/e1vfzsGPG+yLENfbQ3xAm93uVxHx2Ix6CwTE74YiBWhafptURQXWCx3QHEoioKiKv/kOG5FT09PqBBjwo5RW1tLx2Kx5alU6jor0hMP1APDsE6fz3f6vuuIMQfooLxgIpF4wjCMnPo6A2DHcfx90ELyqKOOWrV69WoJ1smF5KuurvaHw+GbJEn6rtm7OxzH31VV9TgrgpVsQC/kKijcWIFAoD4aja7WNG2i1aOCRh4kSf6bYZhbZ86c+fJwR3UfOD8A5LfccsvxiqL8TFGUEwzDoKy2AcNuUogAAAw/SURBVIZhIY7jTiymjJyysrJgOBzeafUpRCbboSjaSRDEY4FA4L6Ojo6dmegL+X9Qp6Gjo+M8TdO+ryjKVLO9DwbSHUXRDo/Hc140Gv1fV70xBehLly7FVq1atVqSpK/DOhcEouA4voUkySdLSkpWtra27oaVlU8+cBKxadOm00BuKmxHtf31A/MGTR/6+vq+KGBg9mcDulkLFi+/z+c7Jh6PP6rruumCKQNuBxFEAX0ISJJ80OfzPd/a2hodTmuAgLDPP//8NEVRLpBleaFhGHQ+9MFxPEbT9Nk8z1vyDFqlIyjf218pziqROcnBMKyXIIjnWZZ9KBKJrLNiw5GTAl8SI6DFcCKR+Iaqqmfquj5xsHrskPL/x4YgSATDsLNVVV3zlfe0WcHZ8BdLLXeO407nef4ZM3fIB4IcwzBvYxj2RHV19avbt28f9sh48NHy2muvfV1V1WsEQTDV5nL/uZIk+bgsy+dn4+9saGxAz8ZKI5eGZdnZoij+K1+gvs8yGIYlGYZ5mKKo56dPn/5uoXbtYDf+j3/8Y3Y8Hj9LUZSLVFW1JA1tMI8DMPd6vReGw+FVxbYqWJa9QRCEq4tBL4qiduI4/g+Px/NKgYIpkaqqqsmxWOxkTdO+IYriEfm2A4ZhMZIkF6XT6Q8PHGss7dARiqJekiTplHwYHKTaMAzzlmEYL3m93rVHH330ZytXrixYkwFQyrW7u/sUXdd/IklSrZVzRFG0u7y8fIGVD4gN6FZ6qDhlBQKB2bFY7KV8g92+2RMEESUI4gmCIN7z+/3r9+zZY+kd84wZM8ra2trmiKJ4rKZp58uyXFUIy6MoGvJ6vd+KRCKgXnpR/UDgX3Nz8+v79+0uBgVBYRqKorajKPocRVEf1NXVbfzoo4+6rdBtxowZ1Xv27DlM07S5mqadLUmS1TEjg6qJYVh3SUnJ2aFQ6IOBiMYMoFdVVc3s7OzcYNXuPNPCwDBMIAhiM4Zh75Ik+W4wGNy+fPny1hUrVpiOlge78I0bN06MRqPg5XKSoigLVVWtzKQTzP/BvaXb7T4/Ho8/DcM/GI8N6FZas3hlVVZW1vT29v47H/nJmWaN43gUw7BtFEV9jGHYRwRB7GEYpquxsbFv9erViYH4L7nkEnbNmjW+ZDJZLsvyeEVRDpNl+XBd16fLspyXZ2yoeeA4HuY47vhoNFqUUd0lJSVTwH2+pmnQmTOZ/GjV/wmC6MUwDID8ZpZlt6TT6Wav1xsuLS2N9/b2Jk866SSjpqbGsW7dOkdXVxcbiUT8yWSyFEXRekVRpiuKMkPX9SmKopRYpVMucgiC2BoMBhe1t7d3DMY3ZgC9vLz8lFAo9IwVLQpzccL+tBiGSRiGtSII0o7jeAuGYS04jncqihJyuVxyOp0WwE4fwzAMx3E2lUoRKIqWGYZRqet6jSRJINCoRtf1Wk3Tcgrqg9XZ6XTefMUVV/zGig+R/XWwAR3WIyOPr7a21tvd3f1aIY4js7UOjuOgfaugKMoXZUVRFAXPnFuW5YK8E7PRE8OwPcFg8GudnZ1t2dAPBw3Hcd8GZWyHY+wxNCaobf9SMBi8MFO8SEEWb7HcoYNgHZ7nHxuO3cJIXHwMw6ysqqr6VlNTk+UR/Tagj8QVYUpnnGXZ2wRB+KEpKWOEmabpJydOnHhxsTeNIknyIVmWLxwjbin4NMEGj+O4nx922GF3ZhMfMqYAHXgDVG2KxWL3SZJ0fMG9M4IGZFn2A0EQQDZAXop52IA+ghaDhapyHPfdVCp1q67rnIViR40oFEVVp9P562Qy+adhjNbO2p4EQTQpijIpawabMGsLgGZFbrd7aSQSWZ8t05gDdGCYefPmMZ988snPZVm+0n6xHLRUdIqi/iVJ0kUOhyOV7ULKlc4G9FwtNnrofT7fjFQq9UdZlk+ELUE8eqzxv5kYOI5vdLlcv4rFYu+MhPnV1dVNa25u/iwfOdYjYf750hFFURB/9Y+amprrmpqaBoz1GGzsMQno+4zh9/vnJZPJm1VVPTZf+YL5cno+5CIIIlMU9WB5efnP8t2y0Ab0fHhw5MisrKxkY7HYL0RR/KWu696Ro7n1mva/wO8qKSn5/UjqKsay7NWCINxgxiKgvgXodAk+ZgzDqFAU5Yh81YM3o2cheMHxOo7jH7rd7mv6+vrehBlzTAM6MBiIGH/11Ve/JYriCkVRxsMYcTTwoCiacDqdP0smkw8XorSmDeijYdWYn0NNTc2kUCh0qyzLJ5utZGhem4JL0AmC+Mjr9V7W29v7ScFHNzkgQRCvK4qSU5EukE6GomgPiqLbaJp+w+PxvFRXV7drzZo14uzZs4mdO3d+I51O35SvrB2TU84bO4ZhzSzL3hQMBh8zE7M05gF9n4dAidRYLPZjQRAu0XW94OkpeVspWQgmCGJDSUnJdwvZU9kG9CwcM3ZIUK/XuziVSq1QVXW6YRjoaJ86QRB7QX+I+vr6R4qhW1qu9l66dCn53HPP9amq6srEi2FYHMOwJoqi3mMY5lm3271lqKNkkBURCoVuFEXxW6P9ShR09qQo6s7y8vLbrWi0YwP6AasRADso3ZdOp6/IRzH9TIu/kP/HMKyPZdlfmf0qhNHZBnQYq41uHtDIQhCEU+Px+I2FLNZRSKtiGLaXYZg/BAKBJ1paWmKFHNvKscrKys4IhULPDSQTRdE0juPNBEG8jOP46wzDbOnq6grn2thq0qRJNT09Pb8SBOHbuq47rdR/mGWBZkPtDMP8keO4Jzo6Ovqs0scG9EEsCdrddXd3n5xOp38JikuMpuNA0JISfBW63e4/D1e3IhvQrXqER58c0Io1mUyeKgjCr1VVnTka4lsIgmilKOpGv98P+j8Ma+15K1YMwzB/T6fTPwCyQPEpHMc7SJJ8myCIlxiG+bihoaEzmzSrbHQJBoMTeZ6/WBTF72qaVpoNTzHSgDtygiA+BR90JSUlr1qxIz9wnjagZ/A8KG0YCoUO4Xn+dMMwzpEk6ZBiXCzZ6EQQxC6CIB7hOO6xnp6eYW0qYwN6Nh4b2zTgTrW5uXleOp3+pqZpZ6iqOqJe5hiGpcAuFTxzEyZMeGfz5s15yxop9ErhOO4RWZZTJEmuA3EADQ0Ne9atW5fOpx7l5eWlqVTqVEmSzgNdH3VdL0hxLbNzIkmyCUXRZ1wu1zPjx4/fnM8rFhvQc/BWXV2dOxKJzE2lUiDdZpEsy9OK/b6vP4L2HRzHn+Y4bnV3d3dvDlPOG6kN6Hkz7agTDBqh3H333TU8z39dluUzFEU5fjgrPg5lYBRFQdT2WoqiVpMk+fJPf/rTbVZXWSwGB4MOcxs3bsxLjYpM8+vfZE0XBGGxqqonq6o6S9d1PBNfof4PrhZwHAdNYt5CEORl0Fegvb09UojxbUA3YeUpU6bUdnR0nCXL8nxN044slsjM/hrW74Eo1GnTpj26YcOGnHIZTZgka1Yb0LM2lU14gAXmz5/Pbd269RxRFMHL/ChVVQvSJGUwR4DuVziOryNJ8p36+vpHN27cOOxdF8fSojnkkENq9uzZcy740DMM40hFUXyFnj945yII8jFBEO9XV1ev3Llz545C6wDGswHdQqtPnjx5aldX1/GKoswyDKPRMIypiqLkNccWRVFQ+70VpIEgCLKxtLT0jT//+c8fLFu2TLNwapaLsgHdcpOOWYH19fWHdnV1LZIk6TCHw3GoqqqT8nUci6KoAwS2oSi6BcOwT/1+/5unnHLKv++55x5lzDqgiCYO4i1qa2uP7OvrO2FfMxXDMOpVVbWseQyO4xKKojsdDsdW0ICrtLT0nYsuuujDYjiJKQigR+qmrjcUZW6ufve37MJAIEGufMVEv2jRIj/ojAaa3cuyPNUwjAawk9d13e9wODwgLQPHcU5VVVzTvsRggiBAvqakaVoKQZAkgiBxFEX7UBTdC+7CEQTZxnFc08yZM3e/+OKLw3L0ZcbONqCbsZ7NO5QFVqxYgd97770TBUEAwD5NVdWpmqZN0HUddMny6bruwjDMraoqtu+ZA/nRJEkamqYlwTWVYRhR8LzhON6GIMjnJEluA8eoM2fObHr99ddHzV34WFhJ4MrmySefHBcOh8fruj5ZUZQ6XdfHy7JcBtYCQRA+SZIQHMe/uJPXdV3DcVw0DAOcvPSAJjkoiu4A71232737ggsuaC8G8B7Id/8PdG3TF/iH/fYAAAAASUVORK5CYII=\"\n }))), _style || (_style = /*#__PURE__*/React.createElement(\"style\", null, \".a{fill:none;stroke:#535353;stroke-linecap:round;stroke-linejoin:round}.b{fill:#535353}\")), _use || (_use = /*#__PURE__*/React.createElement(\"use\", {\n href: \"#img1\",\n transform: \"matrix(1,0,0,1,0,0)\"\n })), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n className: \"a\",\n d: \"m508 21.5c0-10.8 8.7-19.5 19.5-19.5h72c10.8 0 19.5 8.7 19.5 19.5 0 10.8-8.7 19.5-19.5 19.5h-72c-10.8 0-19.5-8.7-19.5-19.5z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n className: \"b\",\n d: \"m538.5 22.9h-4.6v7.7h4.6q2.3 0 3.4-0.9 1.2-1 1.2-2.9 0-2-1.2-2.9-1.1-1-3.4-1zm-0.3-8.7h-4.3v6.4h4.3q2.1 0 3.1-0.8 1-0.8 1-2.4 0-1.6-1-2.4-1-0.8-3.1-0.8zm-7.1 18.8v-21.1h7.3q3.3 0 5 1.3 1.8 1.4 1.8 3.9 0 1.9-0.9 3.1-0.9 1.1-2.7 1.4 2.1 0.5 3.3 1.9 1.2 1.4 1.2 3.6 0 2.8-1.9 4.4-2 1.5-5.5 1.5zm19.9 0v-21.1h13.3v2.4h-10.5v6.2h10.1v2.4h-10.1v7.7h10.8v2.4zm15.4-18.7v-2.4h17.9v2.4h-7.5v18.7h-2.9v-18.7zm29.3 10.9l-3.9-10.5-3.8 10.5zm-13.6 7.8l8.1-21.1h3.2l8.1 21.1h-3l-1.9-5.4h-9.6l-1.9 5.4z\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(Svg1Spocbeta);\nexport default __webpack_public_path__ + \"static/media/1spocbeta.7fa64178.svg\";\nexport { ForwardRef as ReactComponent };","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch Single CSAT_Rating Data\nexport const fetchCSATRating = createAsyncThunk(\n \"csat/fetch\",\n async (payload) => {\n try {\n if (!!payload.account_id) {\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/account/${payload.account_id}/csat/${payload.csat_id}`\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// update CSAT_Rating\nexport const postCSATRating = createAsyncThunk(\"csat/put\", async (payload) => {\n try {\n if (!!payload.account_id) {\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/csat`,\n payload\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const csatRatingSlice = createSlice({\n name: \"csatRating\",\n initialState: {\n fetchData: [],\n data: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchCSATRating.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchCSATRating.fulfilled, (state, action) => {\n state.fetchData = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchCSATRating.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.fetchData = [];\n })\n .addCase(postCSATRating.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(postCSATRating.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(postCSATRating.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n state.data = [];\n });\n },\n});\nexport const { setFetchData, setData, setStatus } = csatRatingSlice.actions;\nexport default csatRatingSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport * as Yup from \"yup\";\nimport { Formik } from \"formik\";\nimport Rating from \"@mui/material/Rating\";\n// import Rating from \"react-rating\";\nimport { useParams } from \"react-router-dom\";\n\nimport {\n Alert as MuiAlert,\n Button,\n TextField as MuiTextField,\n Typography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchCSATRating, postCSATRating } from \"../../redux/slices/csatRating\";\n\nconst Alert = styled(MuiAlert)(spacing);\n\nconst TextField = styled(MuiTextField)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\n\nfunction Csat() {\n const dispatch = useDispatch();\n const { data, fetchData } = useSelector((state) => state.csatRating);\n const { csat } = useParams();\n const csatData = csat.split(\".\");\n\n var accountID = csatData[1];\n var conversationID = csatData[2];\n var csatID = csatData[3];\n const [ratingValue, setRatingValue] = React.useState(3);\n const [csatStatus, setCsatStatus] = React.useState(0);\n const [csatFeedBack, setCsatFeedBack] = React.useState(0);\n\n React.useEffect(() => {\n var payload = {\n account_id: accountID,\n csat_id: csatID,\n };\n dispatch(fetchCSATRating(payload));\n }, [accountID, csatID, dispatch]);\n\n React.useEffect(() => {\n !!fetchData && !!fetchData.data && setCsatStatus(fetchData.data.status);\n !!fetchData && !!fetchData.data && setRatingValue(fetchData.data.rating);\n !!fetchData && !!fetchData.data && setCsatFeedBack(fetchData.data.feedback);\n }, [fetchData, csatStatus]);\n\n React.useEffect(() => {\n !!data && !!data.data && setCsatStatus(data.data.status);\n !!data && !!data.data && setRatingValue(data.data.rating);\n !!data && !!data.data && setCsatFeedBack(data.data.feedback);\n }, [csatStatus, data]);\n\n return (\n <>\n \n {parseInt(csatStatus) === 0 ? (\n <>\n
\n CSAT Feedback\n \n
\n Set your rating\n \n >\n ) : (\n \"\"\n )}\n
{\n try {\n var payload = {\n account_id: accountID,\n conversation_id: conversationID,\n csat_id: csatID,\n rating: ratingValue,\n feedback: csatFeedBack,\n csat_link: csat,\n };\n await timeOut(1500);\n await dispatch(postCSATRating(payload));\n setStatus({ sent: true });\n setSubmitting(false);\n } catch (error) {\n const message = error.message || \"Something went wrong\";\n setStatus({ sent: false });\n setErrors({ submit: message });\n setSubmitting(false);\n }\n }}\n >\n {({\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n isSubmitting,\n touched,\n values,\n }) => (\n <>\n {parseInt(csatStatus) === 1 ? (\n \n Thank you for submitting the survey. Your feedback is\n valuable.\n
\n ) : (\n \n )}\n >\n )}\n \n
\n >\n );\n}\n\nexport default Csat;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Helmet } from \"react-helmet-async\";\n\nimport { Paper } from \"@mui/material\";\n\nimport { ReactComponent as Logo } from \"../../vendor/1spocbeta.svg\";\nimport Csat from \"../../components/auth/Csat\";\n\nconst Brand = styled(Logo)`\n fill: ${(props) => props.theme.palette.primary.main};\n width: 250px;\n height: 64px;\n margin-bottom: 32px;\n`;\n\nconst Wrapper = styled(Paper)`\n padding: ${(props) => props.theme.spacing(6)};\n\n ${(props) => props.theme.breakpoints.up(\"md\")} {\n padding: ${(props) => props.theme.spacing(10)};\n }\n`;\n\nfunction CustomerSatisfactionScore() {\n return (\n \n \n \n \n \n \n \n );\n}\nexport default CustomerSatisfactionScore;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport const reportListSlice = createSlice({\n name: \"reportList\",\n initialState: {\n reportList: \"overview_report\",\n reportListData: [],\n },\n reducers: {\n reportListMenu: (state, action) => {\n state.reportList = action.payload.list;\n state.reportListData = action.payload.listData;\n },\n },\n});\nexport const { setrReportList, setReportListData, reportListMenu } =\n reportListSlice.actions;\nexport default reportListSlice.reducer;\n","// export default ReportsList;\n\nimport React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n List,\n ListItemButton,\n ListItemText as MuiListItemText,\n //ListItemIcon,\n} from \"@mui/material\";\nimport TrendingUpIcon from \"@mui/icons-material/TrendingUp\";\nimport PeopleIcon from \"@mui/icons-material/People\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport TagFacesIcon from \"@mui/icons-material/TagFaces\";\nimport WhatshotIcon from \"@mui/icons-material/Whatshot\";\nimport LogoutIcon from \"@mui/icons-material/Logout\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { reportListMenu } from \"../../../../redux/slices/reportList\";\nimport { isValidToken } from \"../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst ListItemText = styled(MuiListItemText)(spacing);\nconst LiButton = styled(ListItemButton)`\n color: ${(props) => props.theme.palette.secondary.main};\n font-weight: ${(props) => props.theme.typography.fontWeightBoldTop};\n`;\n//const hover = { background: \"#cfe6ff\", color: \"#1180ff\", borderRadius: \"8px\" };\n\nconst ReportsList = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { reportList } = useSelector((state) => state.reportList);\n const [listName, setListName] = React.useState(\"overview_report\");\n const callList = (name) => {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setListName(name);\n dispatch(\n reportListMenu({\n list: name,\n listData: [],\n })\n );\n }\n };\n\n React.useEffect(() => {\n !!reportList && setListName(reportList);\n }, [reportList]);\n\n return (\n <>\n \n {/* //overview_report */}\n {!!listName && listName === \"overview_report\" ? (\n {\n callList(\"overview_report\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"overview_report\");\n }}\n >\n \n \n \n )}\n {/* //csat_report */}\n {!!listName && listName === \"csat_report\" ? (\n {\n callList(\"csat_report\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"csat_report\");\n }}\n >\n \n \n \n )}\n {/* //labels */}\n {!!listName && listName === \"labels\" ? (\n {\n callList(\"labels\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"labels\");\n }}\n >\n \n \n \n )}\n\n {/* //agents */}\n {!!listName && listName === \"agents\" ? (\n {\n callList(\"agents\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"agents\");\n }}\n >\n \n \n \n )}\n\n {/* //chanels */}\n {!!listName && listName === \"chanels\" ? (\n {\n callList(\"chanels\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"chanels\");\n }}\n >\n \n \n \n )}\n {!!listName && listName === \"signin_signout\" ? (\n {\n callList(\"signin_signout\");\n }}\n >\n \n \n \n ) : (\n {\n callList(\"signin_signout\");\n }}\n >\n \n \n \n )}\n
\n >\n );\n};\n\nexport default ReportsList;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box as MuiBox,\n Chip,\n Divider as MuiDivider,\n ListItemButton,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { green } from \"@mui/material/colors\";\nimport { useDispatch } from \"react-redux\";\nimport { fetchAllLabels } from \"../../../../redux/slices/labels\";\nimport ReportsList from \"./ReportsList\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst Box = styled(MuiBox)(spacing);\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Brand = styled(ListItemButton)`\n font-size: ${(props) => props.theme.typography.h5.fontSize};\n font-weight: ${(props) => props.theme.typography.fontWeightMedium};\n color: ${(props) => props.theme.sidebar.header.color};\n font-family: ${(props) => props.theme.typography.fontFamily};\n min-height: 40px;\n padding-right: ${(props) => props.theme.spacing(6)};\n justify-content: center;\n flex-grow: 0;\n margin-bottom: -14px;\n padding-top: 14px;\n\n ${(props) => props.theme.breakpoints.up(\"sm\")} {\n min-height: 40px;\n }\n`;\nconst BrandChip = styled(Chip)`\n background-color: ${green[700]};\n border-radius: 5px;\n color: ${(props) => props.theme.palette.common.white};\n font-size: 55%;\n height: 18px;\n margin-left: 2px;\n margin-top: -16px;\n padding: 3px 0;\n\n span {\n padding-left: ${(props) => props.theme.spacing(1.375)};\n padding-right: ${(props) => props.theme.spacing(1.375)};\n }\n`;\n\nconst LeftReportsPannel = () => {\n const dispatch = useDispatch();\n React.useEffect(() => {\n dispatch(fetchAllLabels());\n }, [dispatch]);\n return (\n <>\n \n \n \n Live-Agent \n \n \n \n \n \n \n Reports\n \n \n \n >\n );\n};\n\nexport default LeftReportsPannel;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch all days labels Data\nexport const fetchDaysList = createAsyncThunk(\"reportDays/fetch\", async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.get(\n `${basePathConfig.baseURL}/app/daysList`,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n});\n\n// fetch all agents Data\nexport const fetchAgentsList = createAsyncThunk(\n \"reportAgentList/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n var data = {\n account_id: accountID,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/agentList`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all labels Data\nexport const fetchlabelsList = createAsyncThunk(\n \"reportLabelList/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n var data = {\n account_id: accountID,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/labelList`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\n// fetch all Channel Data\nexport const fetchchannelList = createAsyncThunk(\n \"reportChannelList/fetch\",\n async () => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n var data = {\n account_id: accountID,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/channelList`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const reportOtherFunctionSlice = createSlice({\n name: \"reportOtherFunction\",\n initialState: {\n dayList: [],\n agentsList: [],\n labelsList: [],\n channelList: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchDaysList.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchDaysList.fulfilled, (state, action) => {\n state.dayList = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchDaysList.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(fetchAgentsList.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAgentsList.fulfilled, (state, action) => {\n state.agentsList = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAgentsList.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(fetchlabelsList.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchlabelsList.fulfilled, (state, action) => {\n state.labelsList = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchlabelsList.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(fetchchannelList.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchchannelList.fulfilled, (state, action) => {\n state.channelList = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchchannelList.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const {\n setDayList,\n setStatus,\n setAgentsList,\n setLabelsList,\n setChannelList,\n} = reportOtherFunctionSlice.actions;\nexport default reportOtherFunctionSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { withTheme } from \"@emotion/react\";\nimport Chart from \"react-apexcharts\";\nimport moment from \"moment\";\n\nimport { CardContent, Card as MuiCard, Typography } from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nconst Card = styled(MuiCard)(spacing);\n\nconst Spacer = styled.div(spacing);\n\nconst ChartWrapper = styled.div`\n height: 350px;\n width: 100%;\n`;\n\nconst TheamChartConversation = ({ theme, RowData, reportName }) => {\n var FieldName = !!RowData ? Object.keys(RowData[0])[1] : \"\";\n var mainData = [];\n var mainHeader = [];\n // console.log(\"FieldName == \", FieldName);\n switch (FieldName) {\n case \"count\":\n !!RowData &&\n RowData.map(\n (item, i) => mainData.push(item.count) && mainHeader.push(item.date)\n );\n break;\n case \"NoOfCount\":\n !!RowData &&\n RowData.map(\n (item, i) =>\n mainData.push(item.NoOfCount) && mainHeader.push(item.Date)\n );\n break;\n case \"ResolutionCount\":\n !!RowData &&\n RowData.map(\n (item, i) =>\n mainData.push(item.ResolutionCount) && mainHeader.push(item.Date)\n );\n break;\n case \"resolutionTime\":\n !!RowData &&\n RowData.map(\n (item, i) =>\n //mainData.push(item.FirstResponseTime) && mainHeader.push(item.Date)\n mainData.push(\n moment(item.resolutionTime, \"HH:mm:ss\").diff(\n moment().startOf(\"day\"),\n \"seconds\"\n )\n ) && mainHeader.push(item.Date)\n );\n break;\n case \"timecount\":\n !!RowData &&\n RowData.map(\n (item, i) =>\n mainData.push(\n moment(item.timecount, \"HH:mm:ss\").diff(\n moment().startOf(\"day\"),\n \"seconds\"\n )\n ) && mainHeader.push(item.date)\n );\n break;\n case \"FirstResponseTime\":\n !!RowData &&\n RowData.map(\n (item, i) =>\n //mainData.push(item.FirstResponseTime) && mainHeader.push(item.Date)\n mainData.push(\n moment(item.FirstResponseTime, \"HH:mm:ss\").diff(\n moment().startOf(\"day\"),\n \"seconds\"\n )\n ) && mainHeader.push(item.Date)\n );\n break;\n default:\n break;\n }\n\n var SecondsOrCount = 0;\n SecondsOrCount =\n (!!FieldName && FieldName === \"FirstResponseTime\") ||\n FieldName === \"resolutionTime\" ||\n FieldName === \"timecount\"\n ? 1\n : 0;\n\n const data = [\n {\n name:\n parseInt(SecondsOrCount) === 1 ? \"Per Day Seconds\" : \"Per Day Counts\",\n type: \"column\",\n data: mainData,\n },\n ];\n\n const options = {\n chart: {\n stacked: false,\n },\n stroke: {\n width: [0, 2, 5],\n curve: \"smooth\",\n },\n plotOptions: {\n bar: {\n columnWidth: \"50%\",\n },\n },\n fill: {\n opacity: [0.85, 0.25, 1],\n gradient: {\n inverseColors: false,\n shade: \"light\",\n type: \"vertical\",\n opacityFrom: 0.85,\n opacityTo: 0.55,\n stops: [0, 100, 100, 100],\n },\n },\n labels: mainHeader,\n markers: {\n size: 0,\n },\n xaxis: {\n type: \"datetime\",\n // title: {\n // text: \"Counts 555\",\n // },\n },\n yaxis: {\n title: {\n text: parseInt(SecondsOrCount) === 1 ? \"Seconds\" : \"Counts\",\n },\n min: 0,\n },\n tooltip: {\n shared: true,\n intersect: false,\n y: {\n formatter: function (y) {\n if (typeof y !== \"undefined\") {\n return parseInt(SecondsOrCount) === 1\n ? y.toFixed(0) + \" Seconds\"\n : y.toFixed(0) + \" Counts\";\n }\n return y;\n },\n },\n },\n colors: [theme.palette.primary.light],\n };\n\n return (\n \n \n \n {!!reportName && reportName}\n \n {/* \n A Mixed Chart is a visualization that allows the combination of two or\n more distinct graphs.\n */}\n\n \n\n \n \n \n \n \n );\n};\n\nexport default withTheme(TheamChartConversation);\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartConversation = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartConversation;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartConversation from \"./charts/ChartConversation\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, NoOfCount) {\n return { Date, NoOfCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"NoOfCount\",\n numeric: false,\n disablePadding: true,\n label: \"No Of Count\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Conversation Report\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Conversations\n \n
\n \n \n
\n\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n rows =\n !!agentReportdata &&\n !!agentReportdata.conversation &&\n agentReportdata.conversation.conversationMsgCount\n ? agentReportdata.conversation.conversationMsgCount.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.NoOfCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ConversationsTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ConversationsTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartIncoming = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n //console.log(\"openAdd == \", JSON.stringify(openAdd));\n return (\n \n );\n};\n\nexport default ChartIncoming;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport ChartIncoming from \"./charts/ChartIncoming\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, NoOfCount) {\n return { Date, NoOfCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"NoOfCount\",\n numeric: false,\n disablePadding: true,\n label: \"No Of Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Incoming Messages\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Incoming Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n rows =\n !!agentReportdata &&\n !!agentReportdata.inCommingMsg &&\n agentReportdata.inCommingMsg.inCommingMsgCount\n ? agentReportdata.inCommingMsg.inCommingMsgCount.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.NoOfCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction IncomingMessagesTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default IncomingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartOutgoing = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartOutgoing;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport ChartOutgoing from \"./charts/ChartOutgoing\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, NoOfCount) {\n return { Date, NoOfCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"NoOfCount\",\n numeric: false,\n disablePadding: true,\n label: \"Outgoing Messages Count\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n // const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Outgoing Messages\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Outgoing Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n rows =\n !!agentReportdata &&\n !!agentReportdata.outGoingMsg &&\n agentReportdata.outGoingMsg.OutGoingMsgCount\n ? agentReportdata.outGoingMsg.OutGoingMsgCount.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.NoOfCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction OutgoingMessagesTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default OutgoingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartFirstResponceTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartFirstResponceTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartFirstResponceTime from \"./charts/ChartFirstResponceTime\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, FirstResponseTime) {\n return { Date, FirstResponseTime };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"FirstResponseTime\",\n numeric: false,\n disablePadding: true,\n label: \"First Response Time (in Minutes) \",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"First Response Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n First Response Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n rows =\n !!agentReportdata &&\n !!agentReportdata.firstResponseTime &&\n agentReportdata.firstResponseTime.FirstResponceData\n ? agentReportdata.firstResponseTime.FirstResponceData.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.FirstResponseTime}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction FirstResponseTimeTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default FirstResponseTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport ChartResolutionTime from \"./charts/ChartResolutionTime\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, resolutionTime) {\n return { Date, resolutionTime };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"resolutionTime\",\n numeric: false,\n disablePadding: true,\n label: \"Resolution Time \",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Resolution Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n React.useEffect(() => {\n setDense(true);\n }, []);\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n rows =\n !!agentReportdata &&\n !!agentReportdata.ResolutionTime &&\n agentReportdata.ResolutionTime.ResolutionTimeCount\n ? agentReportdata.ResolutionTime.ResolutionTimeCount.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.resolutionTime}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionTimeTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionCount = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionCount;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionCount from \"./charts/ChartResolutionCount\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, ResolutionCount) {\n return { Date, ResolutionCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"ResolutionCount\",\n numeric: false,\n disablePadding: true,\n label: \"Resolution Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n // const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Resolution Count\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Count\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n
\n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ agentReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n React.useEffect(() => {\n setDense(true);\n }, []);\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n rows =\n !!agentReportdata &&\n !!agentReportdata.ResolveConversation &&\n agentReportdata.ResolveConversation.ConversationCount\n ? agentReportdata.ResolveConversation.ConversationCount.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.name);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.name)}\n key={row.name}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.ResolutionCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionCountTab({ agentReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionCountTab;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport ConversationsTab from \"./ConversationsTab\";\nimport IncomingMessagesTab from \"./IncomingMessagesTab\";\nimport OutgoingMessagesTab from \"./OutgoingMessagesTab\";\nimport FirstResponseTimeTab from \"./FirstResponseTimeTab\";\nimport ResolutionTimeTab from \"./ResolutionTimeTab\";\nimport ResolutionCountTab from \"./ResolutionCountTab\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst TabTables = ({ agentReportdata }) => {\n const [key, setKey] = React.useState(\"Conversations\");\n return (\n <>\n \n setKey(k)}\n >\n {/* Conversations Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Incoming Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Outgoing Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*First response time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Count Messages Tab */}\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for agent Data\nexport const fetchAgentReport = createAsyncThunk(\n \"agentReport/fetch\",\n async (PayloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n agent_id: PayloadData.agentID,\n day_label: PayloadData.dayID,\n start_date: !!PayloadData.start_date ? PayloadData.start_date : \"\",\n end_date: !!PayloadData.end_date ? PayloadData.end_date : \"\",\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/agent-reports`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const reportAgentSlice = createSlice({\n name: \"reportAgent\",\n initialState: {\n agentReportdata: [],\n agentStatus: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAgentReport.pending, (state, action) => {\n state.agentReportdata = [];\n state.agentStatus = STATUSES.LOADING;\n })\n .addCase(fetchAgentReport.fulfilled, (state, action) => {\n state.agentReportdata = action.payload;\n state.agentStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchAgentReport.rejected, (state, action) => {\n state.agentReportdata = [];\n state.agentStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setAgentReportdata, setAgentStatus } = reportAgentSlice.actions;\nexport default reportAgentSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport TrendingUpIcon from \"@mui/icons-material/TrendingUp\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchAgentsList,\n fetchDaysList,\n} from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport TabTables from \"./TabTables\";\nimport { fetchAgentReport } from \"../../../../../redux/slices/reportAgentWise\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst ShowCalender = ({ agents }) => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n agentID: agents,\n dayID: 6,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchAgentReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n />\n \n\n \n setToDate(e.target.value)}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\n\nconst AgentReport = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { dayList, status, agentsList } = useSelector(\n (state) => state.reportOtherFunction\n );\n\n var { agentReportdata } = useSelector((state) => state.reportAgent);\n\n React.useEffect(() => {\n dispatch(fetchDaysList());\n dispatch(fetchAgentsList());\n let PayloadData = {\n agentID: \"\",\n dayID: 0,\n };\n dispatch(fetchAgentReport(PayloadData));\n }, [dispatch]);\n\n const [days, setDays] = React.useState(\"\");\n const [agents, setAgents] = React.useState(\"\");\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n }, [dayList]);\n\n React.useEffect(() => {\n !!agentsList &&\n agentsList.length > 0 &&\n !!agentsList[0].AgentData &&\n !!agentsList[0].AgentData[0] &&\n setAgents(agentsList[0].AgentData[0]._id);\n }, [agentsList]);\n\n // filter Events\n const handleDaysChange = (event) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setDays(event.target.value);\n let PayloadData = {\n dayID: event.target.value,\n agentID: agents,\n };\n dispatch(fetchAgentReport(PayloadData));\n }\n };\n\n const handleAgentChange = (event) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setAgents(event.target.value);\n let PayloadData = {\n agentID: event.target.value,\n dayID: days,\n };\n dispatch(fetchAgentReport(PayloadData));\n }\n };\n\n return (\n <>\n \n {/* Report Title */}\n \n \n Agent Overview Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Agents\n \n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n {/* Tabs */}\n \n \n \n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default AgentReport;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartConversation = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartConversation;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartConversation from \"./charts/ChartConversation\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, assignee, contact, contactNo) {\n return { Date, channel, assignee, contact, contactNo };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel Conversation\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Conversations\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n !!item.chatAssign.length > 0 &&\n item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ConversationsTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ConversationsTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\n\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartIncoming = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartIncoming;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartIncoming from \"./charts/ChartIncoming\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n inComingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, inComingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n // {\n // id: \"contactNo\",\n // numeric: false,\n // disablePadding: false,\n // label: \"Contact No\",\n // },\n {\n id: \"inComingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Incoming Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n // const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel Incoming Messages\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Incoming Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n item.inComingMsgCount.length > 0 ? item.inComingMsgCount[0].count : 0\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {/* {row.contactNo} */}\n {row.inComingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction IncomingMessagesTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\nexport default IncomingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartOutgoing = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartOutgoing;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartOutgoing from \"./charts/ChartOutgoing\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n outgoingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n // {\n // id: \"contactNo\",\n // numeric: false,\n // disablePadding: false,\n // label: \"Contact No\",\n // },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Outgoing Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel Outgoing Message\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Outgoing Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n item.outGoingMsgCount.length > 0 ? item.outGoingMsgCount[0].count : 0\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {/* {row.contactNo} */}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction OutgoingMessagesTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default OutgoingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartFirstResponceTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartFirstResponceTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport { CSVLink } from \"react-csv\";\nimport ChartFirstResponceTime from \"./charts/ChartFirstResponceTime\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n firstResponsetime\n) {\n return { Date, channel, assignee, contact, contactNo, firstResponsetime };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"firstResponsetime\",\n numeric: false,\n disablePadding: false,\n label: \"First Response in Time\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel First Response Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n First Response Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n !!item.firstResponsetime ? item.firstResponsetime : \"00:00:00\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n \n {row.firstResponsetime}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction FirstResponseTimeTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default FirstResponseTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionTime from \"./charts/ChartResolutionTime\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n outgoingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n // {\n // id: \"contactNo\",\n // numeric: false,\n // disablePadding: false,\n // label: \"Contact No\",\n // },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Outgoing Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel Resolution Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n item.resolutiontime.length > 0 ? item.resolutiontime : \"00:00:00\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {/* {row.contactNo} */}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionTimeTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionCount = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionCount;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionCount from \"./charts/ChartResolutionCount\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, assignee, contact, contactNo, status) {\n return { Date, channel, assignee, contact, contactNo, status };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n // {\n // id: \"contactNo\",\n // numeric: false,\n // disablePadding: false,\n // label: \"Contact No\",\n // },\n {\n id: \"status\",\n numeric: false,\n disablePadding: false,\n label: \"Resolve status\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Channel Resolution Count\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n !!item.status && parseInt(item.status) === 1\n ? \"Resolved By Agent\"\n : parseInt(item.status) === 2\n ? \"Resolved By User\"\n : parseInt(item.status) === 3\n ? \"Resolved By System\"\n : \"Open Conversation\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {/* {row.contactNo} */}\n \n {row.status === \"Resolved By Agent\" && (\n \n Resolved By Agent\n \n )}\n {row.status === \"Resolved By User\" && (\n \n Resolved By User\n \n )}\n {row.status === \"Resolved By System\" && (\n \n Resolved By System\n \n )}\n {row.status === \"Open Conversation\" && (\n \n Open Conversation\n \n )}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionCountTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionCountTab;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport ConversationsTab from \"./ConversationsTab\";\nimport IncomingMessagesTab from \"./IncomingMessagesTab\";\nimport OutgoingMessagesTab from \"./OutgoingMessagesTab\";\nimport FirstResponseTimeTab from \"./FirstResponseTimeTab\";\nimport ResolutionTimeTab from \"./ResolutionTimeTab\";\nimport ResolutionCountTab from \"./ResolutionCountTab\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst TabTables = ({ channelReportdata }) => {\n const [key, setKey] = React.useState(\"Conversations\");\n return (\n <>\n \n setKey(k)}\n >\n {/* Conversations Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Incoming Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Outgoing Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*First response time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Count Messages Tab */}\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for Channel Data\nexport const fetchChannelReport = createAsyncThunk(\n \"channelReport/fetch\",\n async (PayloadData) => {\n // console.log(\"PayloadData == \", JSON.stringify(PayloadData));\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n day_label: PayloadData.dayID,\n channel_id: PayloadData.channel_id,\n start_date: PayloadData.start_date,\n end_date: PayloadData.end_date,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/channel-reports`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const reportChannelSlice = createSlice({\n name: \"reportChannel\",\n initialState: {\n channelReportdata: [],\n channelStatus: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchChannelReport.pending, (state, action) => {\n state.channelReportdata = [];\n state.channelStatus = STATUSES.LOADING;\n })\n .addCase(fetchChannelReport.fulfilled, (state, action) => {\n state.channelReportdata = action.payload;\n state.channelStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchChannelReport.rejected, (state, action) => {\n state.channelReportdata = [];\n state.channelStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setChannelReportdata, setChannelStatus } =\n reportChannelSlice.actions;\nexport default reportChannelSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport WhatshotIcon from \"@mui/icons-material/Whatshot\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchDaysList,\n fetchchannelList,\n} from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport TabTables from \"./TabTables\";\n// import { fetchOverviewReport } from \"../../../../../redux/slices/reportsOverview\";\nimport { fetchChannelReport } from \"../../../../../redux/slices/reportChannel\";\nimport { useNavigate } from \"react-router-dom\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst ShowCalender = ({ channels }) => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: 6,\n channel_id: channels,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchChannelReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n />\n \n\n \n setToDate(e.target.value)}\n ml={15}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\nconst ChanelsReport = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { dayList, status, channelList } = useSelector(\n (state) => state.reportOtherFunction\n );\n\n var { channelReportdata } = useSelector((state) => state.reportChannel);\n\n React.useEffect(() => {\n dispatch(fetchchannelList());\n dispatch(fetchDaysList());\n let PayloadData = {\n agentID: \"\",\n dayID: 0,\n };\n dispatch(fetchChannelReport(PayloadData));\n }, [dispatch]);\n\n const [days, setDays] = React.useState(\"\");\n const [channels, setChannels] = React.useState(\"\");\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n !!channelList &&\n channelList.length > 0 &&\n !!channelList[0].channelData &&\n !!channelList[0].channelData[0] &&\n setChannels(channelList[0].channelData[0].channel_id);\n }, [channelList, dayList]);\n\n // filter Events\n const handleDaysChange = (event) => {\n setDays(event.target.value);\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: event.target.value,\n channel_id: channels,\n start_date: \"\",\n end_date: \"\",\n };\n dispatch(fetchChannelReport(PayloadData));\n }\n };\n const handleChannelChange = (event) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setChannels(event.target.value);\n let PayloadData = {\n dayID: days,\n channel_id: event.target.value,\n start_date: \"\",\n end_date: \"\",\n };\n dispatch(fetchChannelReport(PayloadData));\n }\n };\n return (\n <>\n \n {/* Report Title */}\n \n \n Channel Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Channel\n \n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n {/* Tabs */}\n \n \n \n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default ChanelsReport;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport { CSVLink } from \"react-csv\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, NoOfCount) {\n return { Date, NoOfCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"NoOfCount\",\n numeric: false,\n disablePadding: true,\n label: \"No Of Count (per day CSAT feedback count)\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n return (\n \n \n \n CSAT Count\n \n
\n \n \n \n {/* }\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n );\n};\n\nfunction EnhancedTable({ csatReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n\n // rows = createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n React.useEffect(() => {\n setDense(true);\n }, []);\n rows =\n !!csatReportdata && !!csatReportdata.csatCountDayWise\n ? csatReportdata.csatCountDayWise.map((item, i) =>\n createData(item._id, item.count)\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n const emptyRows =\n rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date}\n {row.NoOfCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction CSATDetailsByDateTab({ csatReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default CSATDetailsByDateTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\nimport Rating from \"@mui/material/Rating\";\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n// srno date assignedAgent contact rating feedbackComments\nfunction createData(\n date,\n assignedAgent,\n contact,\n rating,\n feedbackComments,\n responseStatus\n) {\n return {\n date,\n assignedAgent,\n contact,\n rating,\n feedbackComments,\n responseStatus,\n };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: true,\n label: \"Sr.No.\",\n },\n {\n id: \"date\",\n numeric: false,\n disablePadding: true,\n label: \"Date\",\n },\n {\n id: \"assignedAgent\",\n numeric: false,\n disablePadding: true,\n label: \"Assigned Agent\",\n },\n {\n id: \"contact\",\n numeric: false,\n disablePadding: true,\n label: \"Contact\",\n },\n {\n id: \"rating\",\n numeric: false,\n disablePadding: true,\n label: \"Rating\",\n },\n {\n id: \"feedbackComments\",\n numeric: false,\n disablePadding: true,\n label: \"Feedback Comments\",\n },\n {\n id: \"responseStatus\",\n numeric: false,\n disablePadding: true,\n label: \"Response Status\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n // const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n return (\n \n \n \n CSAT Overview\n \n
\n \n \n \n {/* }\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n );\n};\n\nfunction EnhancedTable({ csatReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n\n React.useEffect(() => {\n !!csatReportdata && !!csatReportdata.csatDetails\n ? setConversationData(csatReportdata.csatDetails)\n : setConversationData([]);\n setDense(true);\n }, [csatReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n item.agentData.length > 0 ? item.agentData[0].displayname : \"\",\n item.contactData.length > 0 ? item.contactData[0].name : \"\",\n parseInt(item.status) === 1 ? item.rating : 0,\n !!item.feedback ? item.feedback : \"\",\n parseInt(item.status) === 1 ? \"Yes\" : \"No\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.date}\n {row.assignedAgent}\n {row.contact}\n \n {\n \n }\n \n {row.feedbackComments}\n \n {row.responseStatus === \"Yes\" ? (\n Yes\n ) : (\n No\n )}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction CSATDetailsTab({ csatReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default CSATDetailsTab;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport CSATDetailsByDateTab from \"./CSATDetailsByDateTab\";\nimport CSATDetailsTab from \"./CSATDetailsTab\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst TabTables = ({ csatReportdata }) => {\n const [key, setKey] = React.useState(\"CSATDetails\");\n return (\n <>\n \n setKey(k)}\n >\n {/* CSAT Details Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* CSAT Details by Date */}\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for CSAT Data\nexport const fetchCsatReport = createAsyncThunk(\n \"csatAllReport/fetchAllData\",\n async (PayloadData, thunkAPI) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n day_label: PayloadData.dayID,\n start_date: PayloadData.start_date,\n end_date: PayloadData.end_date,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/csat-reports`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return thunkAPI.rejectWithValue(await ErrorData);\n }\n }\n);\nexport var STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nvar initialState = {\n csatReportdata: [],\n csatStatus: STATUSES.SUCCESS,\n};\nexport const reportCSATSlice = createSlice({\n name: \"reportCSAT\",\n // initialState: {\n // csatReportdata: [],\n // csatStatus: STATUSES.SUCCESS,\n // },\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder\n // .addCase(fetchCsatReport.pending, (state, action) => {\n // state.csatReportdata = [];\n // state.csatStatus = STATUSES.LOADING;\n // })\n // .addCase(fetchCsatReport.fulfilled, (state, action) => {\n // state.csatReportdata = action.payload;\n // state.csatStatus = STATUSES.SUCCESS;\n // })\n // .addCase(fetchCsatReport.rejected, (state, action) => {\n // state.csatReportdata = [];\n // state.csatStatus = STATUSES.ERROR;\n // })\n .addCase(fetchCsatReport.pending, (state, action) => {\n state.csatStatus = STATUSES.LOADING;\n })\n .addCase(fetchCsatReport.fulfilled, (state, action) => {\n state.csatReportdata = action.payload;\n state.csatStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchCsatReport.rejected, (state, action) => {\n state.csatReportdata = [];\n state.csatStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setCsatReportdata, setCsatStatus } = reportCSATSlice.actions;\nexport default reportCSATSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { withTheme } from \"@emotion/react\";\nimport Chart from \"react-apexcharts\";\n\nconst ChartWrapper = styled.div`\n height: 50px;\n width: 100%;\n`;\n\nconst BarChart = ({ theme, csatReportdata }) => {\n const RatingData =\n !!csatReportdata && !!csatReportdata.rating_Count\n ? csatReportdata.rating_Count\n : [];\n\n const data = [\n {\n name: \"Rating 0\",\n data: [!!RatingData ? parseInt(RatingData.rating_0) : 0],\n },\n {\n name: \"Rating 1\",\n data: [!!RatingData ? parseInt(RatingData.rating_1) : 0],\n },\n {\n name: \"Rating 2\",\n data: [!!RatingData ? parseInt(RatingData.rating_2) : 0],\n },\n {\n name: \"Rating 3\",\n data: [!!RatingData ? parseInt(RatingData.rating_3) : 0],\n },\n {\n name: \"Rating 4\",\n data: [!!RatingData ? parseInt(RatingData.rating_4) : 0],\n },\n {\n name: \"Rating 5\",\n data: [!!RatingData ? parseInt(RatingData.rating_5) : 0],\n },\n ];\n\n const options = {\n chart: {\n stacked: true,\n },\n plotOptions: {\n bar: {\n horizontal: true,\n },\n },\n stroke: {\n width: 2,\n colors: [\"#fff\"],\n },\n xaxis: {\n categories: [\"Ratings\"],\n labels: {\n formatter: function (val) {\n return val + \"%\";\n },\n },\n },\n yaxis: {\n title: {\n text: undefined,\n },\n },\n tooltip: {\n y: {\n formatter: function (val) {\n return val + \"%\";\n },\n },\n },\n fill: {\n opacity: 1,\n },\n legend: {\n position: \"top\",\n horizontalAlign: \"left\",\n offsetX: 50,\n },\n colors: [\n theme.palette.primary.light,\n theme.palette.primary.dark,\n theme.palette.info.light,\n theme.palette.warning.dark,\n theme.palette.error.dark,\n theme.palette.success.dark,\n ],\n };\n\n return (\n <>\n \n \n \n >\n );\n};\n\nexport default withTheme(BarChart);\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport TrendingUpIcon from \"@mui/icons-material/TrendingUp\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchAgentsList,\n fetchDaysList,\n} from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport TabTables from \"./TabTables\";\nimport { fetchCsatReport } from \"../../../../../redux/slices/reportCSAT\";\nimport BarChart from \"./BarChart\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst ShowCalender = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n //alert(\"chechValidation\");\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n //alert(\"fetch_Data\");\n let PayloadData = {\n dayID: 6,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchCsatReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n ml={15}\n />\n \n\n \n setToDate(e.target.value)}\n ml={15}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\nconst CSATReport = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { dayList, status } = useSelector((state) => state.reportOtherFunction);\n\n var { csatReportdata } = useSelector((state) => state.reportCSAT);\n // console.log(\"csatStatus == \", csatStatus);\n\n React.useEffect(() => {\n dispatch(fetchDaysList());\n dispatch(fetchAgentsList());\n let PayloadData = {\n agentID: \"\",\n dayID: 0,\n };\n dispatch(fetchCsatReport(PayloadData));\n }, [dispatch]);\n\n const [days, setDays] = React.useState(\"\");\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n }, [dayList]);\n\n // filter Events\n const handleDaysChange = (event) => {\n setDays(event.target.value);\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: event.target.value,\n start_date: \"\",\n end_date: \"\",\n };\n dispatch(fetchCsatReport(PayloadData));\n }\n };\n\n return (\n <>\n \n {/* Report Title */}\n \n \n CSAT Overview Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n \n \n {!!csatReportdata && !!csatReportdata.rating_Count && (\n \n )}\n \n {/* Tabs */}\n \n \n \n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default CSATReport;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartConversation = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartConversation;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n //FormControlLabel,\n //Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartConversation from \"./charts/ChartConversation\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n//Date, Contact, Label_Added_By, TotalConversationCounts\nfunction createData(Date, Contact, Label_Added_By, TotalConversationCounts) {\n return { Date, Contact, Label_Added_By, TotalConversationCounts };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// Date, Contact, Label_Added_By, TotalConversationCounts\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Label Added At\",\n },\n {\n id: \"Contact\",\n numeric: false,\n disablePadding: false,\n label: \"Contact Name\",\n },\n {\n id: \"Label_Added_By\",\n numeric: false,\n disablePadding: false,\n label: \"Label Added By\",\n },\n {\n id: \"TotalConversationCounts\",\n numeric: false,\n disablePadding: false,\n label: \"Conversations Counts\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n const [showAlert, setShowAlert] = React.useState(false);\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview Conversation\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Conversations\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_Conversation }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartConversationData, setChartConversationDataData] = React.useState(\n []\n );\n\n React.useEffect(() => {\n !!reportData ? setConversationData(reportData) : setConversationData([]);\n !!chart_Conversation\n ? setChartConversationDataData(chart_Conversation)\n : setChartConversationDataData([]);\n setDense(true);\n }, [chart_Conversation, reportData]);\n //Date, Contact, Label_Added_By, TotalConversationCounts\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.label_added_at ? item.label_added_at.split(\"T\")[0] : \"\",\n !!item.name ? item.name : \"\",\n item.agentData.length > 0 ? item.agentData[0].displayname : \"\",\n item.conversationData.length\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // let emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.Contact}\n {row.Label_Added_By}\n \n {row.TotalConversationCounts}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ConversationsTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ConversationsTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\n\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartIncoming = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartIncoming;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n //FormControlLabel,\n //Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartIncoming from \"./charts/ChartIncoming\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, contact, contactNo, inComingMsgCount) {\n return { Date, channel, contact, contactNo, inComingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// Date, channel, contact, contactNo, inComingMsgCount\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"inComingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Incoming Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n const [showAlert, setShowAlert] = React.useState(false);\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview Incoming Message\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Incoming Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found for Chart\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_Incomming }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartIncomming, setChartIncomming] = React.useState([]);\n React.useEffect(() => {\n !!reportData ? setConversationData(reportData) : setConversationData([]);\n !!chart_Incomming\n ? setChartIncomming(chart_Incomming)\n : setChartIncomming([]);\n setDense(true);\n }, [chart_Incomming, reportData]);\n\n // Date, channel, contact, contactNo, inComingMsgCount\n\n rows = [];\n !!conversationData &&\n conversationData.map((item, i) =>\n item.conversationData.map((con) =>\n rows.push(\n createData(\n !!con.created_at ? con.created_at.split(\"T\")[0] : \"\",\n !!con.channel_id ? con.channel_id : \"\",\n !!item.name ? item.name : \"\",\n !!item.phone_number ? item.phone_number : \"\",\n con.inComingMsgCount.length > 0 ? con.inComingMsgCount[0].count : \"\"\n )\n )\n )\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value), 10);\n setPage(0);\n };\n\n // const handleChangeDense = (event) => {\n // setDense(event.target.checked);\n // };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n // let emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // Date, channel, contact, contactNo, inComingMsgCount\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.contact}\n {row.contactNo}\n {row.inComingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction IncomingMessagesTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\nexport default IncomingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartOutgoing = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartOutgoing;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n //FormControlLabel,\n //Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartOutgoing from \"./charts/ChartOutgoing\";\nimport { TrendingUpRounded } from \"@mui/icons-material\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, contact, contactNo, outgoingMsgCount) {\n return { Date, channel, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Outgoing Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n const [showAlert, setShowAlert] = React.useState(false);\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview Outgoing Message\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Outgoing Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_Outgoing }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartOutgoing, setChartOutgoing] = React.useState([]);\n React.useEffect(() => {\n !!reportData && setConversationData(reportData);\n !!chart_Outgoing && setChartOutgoing(chart_Outgoing);\n setDense(TrendingUpRounded);\n }, [chart_Outgoing, reportData]);\n\n rows = [];\n !!conversationData &&\n conversationData.map((item) =>\n item.conversationData.map((itm) =>\n rows.push(\n createData(\n !!itm.created_at ? itm.created_at.split(\"T\")[0] : \"\",\n !!itm.channel_id ? itm.channel_id : \"\",\n !!item.name ? item.name : \"\",\n !!item.phone_number ? item.phone_number : \"\",\n itm.outGoingMsgCount.length > 0 ? itm.outGoingMsgCount[0].count : 0\n )\n )\n )\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.contact}\n {row.contactNo}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction OutgoingMessagesTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default OutgoingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartFirstResponceTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartFirstResponceTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n //FormControlLabel,\n //Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport { CSVLink } from \"react-csv\";\nimport ChartFirstResponceTime from \"./charts/ChartFirstResponceTime\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, contact, contactNo, firstResponsetime) {\n return { Date, channel, contact, contactNo, firstResponsetime };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"firstResponsetime\",\n numeric: false,\n disablePadding: false,\n label: \"First Response in Time\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n const [showAlert, setShowAlert] = React.useState(false);\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview First Response Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n First Responce Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_firstResponceTimeCount }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartFirstResponceTimeCount, setChartFirstResponceTimeCount] =\n React.useState([]);\n React.useEffect(() => {\n !!reportData ? setConversationData(reportData) : setConversationData([]);\n !!chart_firstResponceTimeCount\n ? setChartFirstResponceTimeCount(chart_firstResponceTimeCount)\n : setChartFirstResponceTimeCount([]);\n setDense(true);\n }, [chart_firstResponceTimeCount, reportData]);\n\n rows = [];\n !!conversationData &&\n conversationData.map((item, i) =>\n item.conversationData.map((con) =>\n rows.push(\n createData(\n !!con.created_at ? con.created_at.split(\"T\")[0] : \"\",\n !!con.channel_id ? con.channel_id : \"\",\n !!item.name ? item.name : \"\",\n !!item.phone_number ? item.phone_number : \"\",\n !!con.firstResponsetime ? con.firstResponsetime : \"00:00:00\"\n )\n )\n )\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.contact}\n {row.contactNo}\n \n {row.firstResponsetime}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction FirstResponseTimeTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default FirstResponseTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionTime from \"./charts/ChartResolutionTime\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, contact, contactNo, outgoingMsgCount) {\n return { Date, channel, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Resolution Time\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n const [showAlert, setShowAlert] = React.useState(false);\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview Resolution Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_ResolutionTime }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartResolutionTime, setChartResolutionTime] = React.useState([]);\n\n React.useEffect(() => {\n !!reportData ? setConversationData(reportData) : setConversationData([]);\n !!chart_ResolutionTime\n ? setChartResolutionTime(chart_ResolutionTime)\n : setChartResolutionTime([]);\n setDense(true);\n }, [chart_ResolutionTime, reportData]);\n\n rows = [];\n !!conversationData &&\n conversationData.map((item, i) =>\n item.conversationData.map((con) =>\n rows.push(\n createData(\n !!con.created_at ? con.created_at.split(\"T\")[0] : \"\",\n !!con.channel_id ? con.channel_id : \"\",\n !!item.name ? item.name : \"\",\n !!item.phone_number ? item.phone_number : \"\",\n !!con.resolutiontime ? con.resolutiontime : \"00:00:00\"\n )\n )\n )\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.contact}\n {row.contactNo}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionTimeTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionCount = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionCount;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionCount from \"./charts/ChartResolutionCount\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, contact, contactNo, status) {\n return { Date, channel, contact, contactNo, status };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"status\",\n numeric: false,\n disablePadding: false,\n label: \"Resolve status\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n // const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n const [showAlert, setShowAlert] = React.useState(false);\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.rows,\n report: \"Overview Resolution Count\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Count\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ reportData, chart_ResolutionCount }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n var [chartResolutionCount, setChartResolutionCount] = React.useState([]);\n React.useEffect(() => {\n !!reportData ? setConversationData(reportData) : setConversationData([]);\n !!chart_ResolutionCount\n ? setChartResolutionCount(chart_ResolutionCount)\n : setChartResolutionCount([]);\n setDense(true);\n }, [chart_ResolutionCount, reportData]);\n\n rows = [];\n !!conversationData &&\n conversationData.map((item, i) =>\n item.conversationData.map((con) =>\n rows.push(\n createData(\n !!con.created_at ? con.created_at.split(\"T\")[0] : \"\",\n !!con.channel_id ? con.channel_id : \"\",\n !!item.name ? item.name : \"\",\n !!item.phone_number ? item.phone_number : \"\",\n !!con.status && parseInt(con.status) === 1\n ? \"Resolved By Agent\"\n : parseInt(item.status) === 2\n ? \"Resolved By User\"\n : parseInt(item.status) === 3\n ? \"Resolved By System\"\n : \"Open Conversation\"\n )\n )\n )\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n const emptyRows =\n rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0 ? index + 1 : index + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.contact}\n {row.contactNo}\n \n {row.status === \"Resolved By Agent\" && (\n \n Resolved By Agent\n \n )}\n {row.status === \"Resolved By User\" && (\n \n Resolved By User\n \n )}\n {row.status === \"Resolved By System\" && (\n \n Resolved By System\n \n )}\n {row.status === \"Open Conversation\" && (\n \n Open Conversation\n \n )}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionCountTab({ reportData }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionCountTab;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport ConversationsTab from \"./ConversationsTab\";\nimport IncomingMessagesTab from \"./IncomingMessagesTab\";\nimport OutgoingMessagesTab from \"./OutgoingMessagesTab\";\nimport FirstResponseTimeTab from \"./FirstResponseTimeTab\";\nimport ResolutionTimeTab from \"./ResolutionTimeTab\";\nimport ResolutionCountTab from \"./ResolutionCountTab\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst TabTables = ({ reportData }) => {\n const [key, setKey] = React.useState(\"Conversations\");\n return (\n <>\n \n setKey(k)}\n >\n {/* Conversations Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Incoming Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Outgoing Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*First response time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Count Messages Tab */}\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for overview Data\nexport const fetchLabelsReport = createAsyncThunk(\n \"labelsReport/fetch\",\n async (PayloadData) => {\n // console.log(\n // \"fetchLabelsReport PayloadData == \",\n // JSON.stringify(PayloadData)\n // );\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n label_id: PayloadData.labelId,\n day_label: PayloadData.dayID,\n start_date: PayloadData.start_date,\n end_date: PayloadData.end_date,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/label-reports`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const reportLabelsSlice = createSlice({\n name: \"reportLabels\",\n initialState: {\n labelReportdata: [],\n labelsStatus: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchLabelsReport.pending, (state, action) => {\n state.labelReportdata = [];\n state.labelsStatus = STATUSES.LOADING;\n })\n .addCase(fetchLabelsReport.fulfilled, (state, action) => {\n state.labelReportdata = action.payload;\n state.labelsStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchLabelsReport.rejected, (state, action) => {\n state.labelReportdata = [];\n state.labelsStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setLabelReportdata, setLabelsStatus } =\n reportLabelsSlice.actions;\nexport default reportLabelsSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Chip as MuiChip, Table, TableBody, TableCell } from \"@mui/material\";\nconst Chip = styled(MuiChip)`\n height: 20px;\n padding: 4px 0;\n font-size: 90%;\n background-color: ${(props) =>\n props.theme.palette[props.color ? props.color : \"primary\"].light};\n color: ${(props) => props.theme.palette.common.white};\n`;\nconst HederLabelDetails = ({ labeldetails }) => {\n return (\n <>\n {!!labeldetails && (\n \n \n \n \n \n \n {!!labeldetails && !!labeldetails.title && labeldetails.title}\n \n \n Descriptions:{\" \"}\n {!!labeldetails &&\n !!labeldetails.description &&\n labeldetails.description}{\" \"}\n \n \n
\n )}\n >\n );\n};\nexport default HederLabelDetails;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n fetchDaysList,\n fetchlabelsList,\n} from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport LocalOfferIcon from \"@mui/icons-material/LocalOffer\";\nimport TabTables from \"./TabTables\";\nimport { fetchLabelsReport } from \"../../../../../redux/slices/reportsLabels\";\nimport HederLabelDetails from \"./HederLabelDetails\";\nimport { useNavigate } from \"react-router-dom\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst LabelStamp = styled.div`\n background-color: #fff;\n padding-top: 5px;\n padding-left: 5px;\n`;\n\nconst ShowCalender = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: 6,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchLabelsReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n ml={15}\n />\n \n\n \n setToDate(e.target.value)}\n ml={15}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\n\nconst Labels = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [days, setDays] = React.useState(\"\");\n const [labels, setlabels] = React.useState(\"\");\n const [reportData, setReportData] = React.useState([]);\n const { dayList, status, labelsList } = useSelector(\n (state) => state.reportOtherFunction\n );\n var { labelReportdata } = useSelector((state) => state.reportLabels);\n\n React.useEffect(() => {\n dispatch(fetchDaysList());\n dispatch(fetchlabelsList());\n let PayloadData = {\n labelId: \"\",\n dayID: 0,\n };\n dispatch(fetchLabelsReport(PayloadData));\n }, [dispatch]);\n\n React.useEffect(() => {\n !!labelReportdata && setReportData(labelReportdata);\n }, [labelReportdata]);\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n !!labelsList &&\n labelsList.length > 0 &&\n !!labelsList[0].labelsData &&\n !!labelsList[0].labelsData[0] &&\n setlabels(labelsList[0].labelsData[0]._id);\n }, [dayList, labelsList]);\n\n // filter Events\n const handleLabelsChange = (event) => {\n setlabels(event.target.value);\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: days,\n labelId: event.target.value,\n };\n dispatch(fetchLabelsReport(PayloadData));\n }\n };\n const handleDaysChange = (event) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setDays(event.target.value);\n let PayloadData = {\n dayID: event.target.value,\n labelId: labels,\n };\n dispatch(fetchLabelsReport(PayloadData));\n }\n };\n\n return (\n <>\n \n \n \n Labels Overview Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Labels\n \n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n \n \n \n \n \n \n \n \n \n {/* Tabs */}\n \n \n \n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default Labels;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartConversation = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartConversation;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartConversation from \"./charts/ChartConversation\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, assignee, contact, contactNo) {\n return { Date, channel, assignee, contact, contactNo };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n const [showAlert, setShowAlert] = React.useState(false);\n // Here was 'let'\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview Conversation\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Conversations\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ConversationsTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ConversationsTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\n\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartIncoming = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartIncoming;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartIncoming from \"./charts/ChartIncoming\";\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n inComingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, inComingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"inComingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Incoming Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview Incoming Message\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Incoming Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n item.inComingMsgCount.length > 0 ? item.inComingMsgCount[0].count : \"\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n {row.inComingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction IncomingMessagesTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\nexport default IncomingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartOutgoing = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartOutgoing;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartOutgoing from \"./charts/ChartOutgoing\";\nconst Alert = styled(MuiAlert)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n outgoingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Outgoing Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview Outgoing Message\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Outgoing Messages\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n item.outGoingMsgCount.length > 0 ? item.outGoingMsgCount[0].count : 0\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction OutgoingMessagesTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default OutgoingMessagesTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartFirstResponceTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartFirstResponceTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport { CSVLink } from \"react-csv\";\nimport ChartFirstResponceTime from \"./charts/ChartFirstResponceTime\";\nconst Alert = styled(MuiAlert)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n firstResponsetime\n) {\n return { Date, channel, assignee, contact, contactNo, firstResponsetime };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"firstResponsetime\",\n numeric: false,\n disablePadding: false,\n label: \"First Responce in Time\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview First Response Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n First Responce Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n !!item.firstResponsetime ? item.firstResponsetime : \"00:00:00\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n \n {row.firstResponsetime}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction FirstResponseTimeTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default FirstResponseTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionTime = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionTime;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionTime from \"./charts/ChartResolutionTime\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n channel,\n assignee,\n contact,\n contactNo,\n outgoingMsgCount\n) {\n return { Date, channel, assignee, contact, contactNo, outgoingMsgCount };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"outgoingMsgCount\",\n numeric: false,\n disablePadding: false,\n label: \"Outgoing Message Count\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview Resolution Time\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Time\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item, i) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n !!item.resolutiontime ? item.resolutiontime : \"00:00:00\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n {row.outgoingMsgCount}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionTimeTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionTimeTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartConversation from \"../../TheamChartConversation\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartResolutionCount = ({\n openAdd,\n handleAddClose,\n handleAddClickOpen,\n}) => {\n return (\n \n );\n};\n\nexport default ChartResolutionCount;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartResolutionCount from \"./charts/ChartResolutionCount\";\n\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\n\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(Date, channel, assignee, contact, contactNo, status) {\n return { Date, channel, assignee, contact, contactNo, status };\n}\n\nvar rows = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// date, channel, assignee, contact, contactNo\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"channel\", numeric: false, disablePadding: false, label: \"Channel\" },\n { id: \"assignee\", numeric: false, disablePadding: false, label: \"Assignee\" },\n { id: \"contact\", numeric: false, disablePadding: false, label: \"Contact\" },\n {\n id: \"contactNo\",\n numeric: false,\n disablePadding: false,\n label: \"Contact No\",\n },\n {\n id: \"status\",\n numeric: false,\n disablePadding: false,\n label: \"Resolve status\",\n },\n];\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Overview Resolution Count\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n return (\n <>\n \n \n \n Resolution Counts\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewReportdata }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [conversationData, setConversationData] = React.useState([]);\n React.useEffect(() => {\n !!overviewReportdata && !!overviewReportdata.conversationData\n ? setConversationData(overviewReportdata.conversationData)\n : setConversationData([]);\n setDense(true);\n }, [overviewReportdata]);\n\n rows = !!conversationData\n ? conversationData.map((item) =>\n createData(\n !!item.created_at ? item.created_at.split(\"T\")[0] : \"\",\n !!item.channel_id ? item.channel_id.split(\"_\")[0] : \"\",\n item.chatAssign.length > 0 && item.chatAssign[0].agentData.length > 0\n ? item.chatAssign[0].agentData[0].name\n : \"\",\n item.contactDetails.length > 0 ? item.contactDetails[0].name : \"\",\n item.contactDetails.length > 0\n ? item.contactDetails[0].phone_number\n : \"\",\n !!item.status && parseInt(item.status) === 1\n ? \"Resolved By Agent\"\n : parseInt(item.status) === 2\n ? \"Resolved By User\"\n : parseInt(item.status) === 3\n ? \"Resolved By System\"\n : \"Open Conversation\"\n )\n )\n : [];\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n // const emptyRows =\n // rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n let emptyRows = rowsPerPage - (rowsPerPage + 1);\n return (\n \n
\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // date, channel, assignee, contact, contactNo\n\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.channel}\n {row.assignee}\n {row.contact}\n {row.contactNo}\n \n {row.status === \"Resolved By Agent\" && (\n \n Resolved By Agent\n \n )}\n {row.status === \"Resolved By User\" && (\n \n Resolved By User\n \n )}\n {row.status === \"Resolved By System\" && (\n \n Resolved By System\n \n )}\n {row.status === \"Open Conversation\" && (\n \n Open Conversation\n \n )}\n \n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction ResolutionCountTab({ overviewReportdata }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default ResolutionCountTab;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport ConversationsTab from \"./ConversationsTab\";\nimport IncomingMessagesTab from \"./IncomingMessagesTab\";\nimport OutgoingMessagesTab from \"./OutgoingMessagesTab\";\nimport FirstResponseTimeTab from \"./FirstResponseTimeTab\";\nimport ResolutionTimeTab from \"./ResolutionTimeTab\";\nimport ResolutionCountTab from \"./ResolutionCountTab\";\n\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst TabTables = ({ overviewReportdata }) => {\n const [key, setKey] = React.useState(\"Conversations\");\n return (\n <>\n \n setKey(k)}\n >\n {/* Conversations Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Incoming Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/* Outgoing Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*First response time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Time Messages Tab */}\n \n \n \n \n \n \n \n \n \n\n {/*Resolution Count Messages Tab */}\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for overview Data\nexport const fetchOverviewReport = createAsyncThunk(\n \"agentReport/fetch\",\n async (PayloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n day_label: PayloadData.dayID,\n start_date: !!PayloadData.start_date ? PayloadData.start_date : \"\",\n end_date: !!PayloadData.end_date ? PayloadData.end_date : \"\",\n };\n //console.log(\"fetchOverviewReport data == \", JSON.stringify(data));\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/overview-reports`,\n data,\n config\n );\n // console.log(\n // \"fetchOverviewReport res.data == \",\n // JSON.stringify(res.data)\n // );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const reportOverviewSlice = createSlice({\n name: \"reportOverview\",\n initialState: {\n overviewReportdata: [],\n overviewStatus: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchOverviewReport.pending, (state, action) => {\n state.overviewReportdata = [];\n state.overviewStatus = STATUSES.LOADING;\n })\n .addCase(fetchOverviewReport.fulfilled, (state, action) => {\n state.overviewReportdata = action.payload;\n state.overviewStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchOverviewReport.rejected, (state, action) => {\n state.overviewReportdata = [];\n state.overviewStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setOverviewReportdata, setOverviewStatus } =\n reportOverviewSlice.actions;\nexport default reportOverviewSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport TrendingUpIcon from \"@mui/icons-material/TrendingUp\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchDaysList } from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport TabTables from \"./TabTables\";\nimport { fetchOverviewReport } from \"../../../../../redux/slices/reportsOverview\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst ShowCalender = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: 6,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchOverviewReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n ml={15}\n />\n \n\n \n setToDate(e.target.value)}\n ml={15}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\n\nconst OverviewReports = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { dayList, status } = useSelector((state) => state.reportOtherFunction);\n\n var { overviewReportdata } = useSelector((state) => state.reportOverview);\n\n React.useEffect(() => {\n dispatch(fetchDaysList());\n let PayloadData = {\n dayID: 0,\n };\n dispatch(fetchOverviewReport(PayloadData));\n }, [dispatch]);\n\n const [days, setDays] = React.useState(\"\");\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n }, [dayList]);\n\n // filter Events\n const handleDaysChange = (event) => {\n setDays(event.target.value);\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: event.target.value,\n };\n event.target.value < 6 && dispatch(fetchOverviewReport(PayloadData));\n }\n };\n\n return (\n <>\n \n {/* Report Title */}\n \n \n Overview Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n \n {/* Tabs */}\n \n \n \n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default OverviewReports;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { withTheme } from \"@emotion/react\";\nimport Chart from \"react-apexcharts\";\n\nimport { CardContent, Card as MuiCard, Typography } from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\n\nconst Card = styled(MuiCard)(spacing);\n\nconst Spacer = styled.div(spacing);\n\nconst ChartWrapper = styled.div`\n height: 350px;\n width: 100%;\n`;\n\nconst TheamChartConversation = ({ theme, RowData, reportName }) => {\n // console.log(\" TheamChartConversation RowData == \", JSON.stringify(RowData));\n // console.log(\n // \" TheamChartConversation reportName == \",\n // JSON.stringify(reportName)\n // );\n\n var dateRangeData = !!RowData ? RowData.dateRange : [];\n\n var data = !!RowData ? RowData.data : [];\n // console.log(\"data == \", JSON.stringify(data));\n const options = {\n plotOptions: {\n bar: {\n horizontal: false,\n endingShape: \"rounded\",\n columnWidth: \"55%\",\n },\n },\n dataLabels: {\n enabled: false,\n },\n stroke: {\n show: true,\n width: 2,\n colors: [\"transparent\"],\n },\n xaxis: {\n categories: dateRangeData,\n },\n yaxis: {\n title: {\n text: \"Minutes\",\n },\n },\n fill: {\n opacity: 1,\n },\n tooltip: {\n y: {\n formatter: function (val) {\n return val + \" Minutes\";\n },\n },\n },\n colors: [\n theme.palette.primary.light,\n theme.palette.success.light,\n theme.palette.warning.light,\n theme.palette.error.light,\n theme.palette.info.light,\n ],\n };\n\n return (\n \n \n \n {!!reportName && reportName}\n \n {/* \n A column chart uses vertical bars to display data and is used to\n compare values across categories.\n */}\n\n \n\n \n \n \n \n \n );\n};\n\nexport default withTheme(TheamChartConversation);\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogContentText,\n Typography as MuiTypography,\n} from \"@mui/material\";\nimport { spacing } from \"@mui/system\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport TheamChartForTime from \"../../TheamChartForTime\";\nconst Typography = styled(MuiTypography)(spacing);\n\nconst ChartOverview = ({ openAdd, handleAddClose, handleAddClickOpen }) => {\n return (\n \n );\n};\n\nexport default ChartOverview;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n IconButton,\n InputBase,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport AddchartIcon from \"@mui/icons-material/Addchart\";\nimport ChartOverview from \"./charts/ChartOverview\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nconst Paper = styled(MuiPaper)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\n\nfunction createData(\n Date,\n Role,\n Name,\n FirstSignIn,\n LastSignOut,\n SessionCount,\n SessionTime\n) {\n return {\n Date,\n Role,\n Name,\n FirstSignIn,\n LastSignOut,\n SessionCount,\n SessionTime,\n };\n}\n\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// Date, Role, Name, FirstSignIn, LastSignOut, SessionCount, SessionTime\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"Role\", numeric: false, disablePadding: false, label: \"Role\" },\n { id: \"Name\", numeric: false, disablePadding: false, label: \"Agent Name\" },\n {\n id: \"FirstSignIn\",\n numeric: false,\n disablePadding: false,\n label: \"First Sign-In\",\n },\n {\n id: \"LastSignOut\",\n numeric: false,\n disablePadding: false,\n label: \"Last Sign-Out\",\n },\n {\n id: \"SessionCount\",\n numeric: false,\n disablePadding: false,\n label: \"Session Count\",\n },\n {\n id: \"SessionTime\",\n numeric: false,\n disablePadding: false,\n label: \"Session Time\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Login Logout Overview\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Overview\n \n
\n \n \n
\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overview, chartoverview }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n var [overviewData, setOverviewData] = React.useState([]);\n const [search, setSearch] = React.useState(\"\");\n var [chartoverviewData, setChartoverviewData] = React.useState([]);\n React.useEffect(() => {\n !!overview ? setOverviewData(overview) : setOverviewData([]);\n !!chartoverview\n ? setChartoverviewData(chartoverview)\n : setChartoverviewData([]);\n setDense(true);\n }, [chartoverview, overview]);\n //Date, Role, Name, FirstSignIn, LastSignOut, SessionCount, SessionTime\n rowsData = !!overviewData\n ? overviewData.map((item, i) =>\n createData(\n item.date,\n item.agentName.role === 0 ? \"Admin\" : \"Agent\",\n item.agentName.displayname,\n item.firstSignin,\n item.lastSignout,\n item.sessionCount,\n item.sessiontime\n )\n )\n : [];\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter((i) =>\n i.Name.toLowerCase().includes(search.toLowerCase())\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n const emptyRows =\n rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n\n return (\n \n
\n \n \n \n \n \n {\n setSearch(e.target.value);\n }}\n />\n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n //Date, Role, Name, FirstSignIn, LastSignOut, SessionCount, SessionTime\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.Role}\n {row.Name}\n {row.FirstSignIn}\n {row.LastSignOut}\n {row.SessionCount}\n {row.SessionTime}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction OverviewTab({ overview, chartoverview }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default OverviewTab;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\n\nimport {\n Alert as MuiAlert,\n Grid,\n IconButton,\n InputBase,\n Divider as MuiDivider,\n Paper as MuiPaper,\n Table,\n TableBody,\n TableContainer,\n TableCell,\n TableHead,\n TablePagination,\n TableRow,\n TableSortLabel,\n Toolbar,\n Typography,\n // FormControlLabel,\n // Switch,\n Button,\n} from \"@mui/material\";\n\nimport { spacing } from \"@mui/system\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport { CSVLink } from \"react-csv\";\nimport ChartOverview from \"./charts/ChartOverview\";\nimport SearchIcon from \"@mui/icons-material/Search\";\n//import AddchartIcon from \"@mui/icons-material/Addchart\";\nconst Divider = styled(MuiDivider)(spacing);\nconst timeOut = (time) => new Promise((res) => setTimeout(res, time));\nconst Alert = styled(MuiAlert)(spacing);\nconst Paper = styled(MuiPaper)(spacing);\nconst Search = styled.div`\n margin-top: 5px;\n margin-left: 5px;\n margin-right: 5px;\n background-color: #e7f2ff;\n`;\nconst Spacer = styled.div`\n flex: 1 1 50%;\n`;\n\nfunction createData(\n Date,\n Role,\n Agent_Name,\n Signin_Time,\n Signout_Time,\n Spent_Time\n) {\n return { Date, Role, Agent_Name, Signin_Time, Signout_Time, Spent_Time };\n}\n\nvar rows = [];\nvar rowsData = [];\n\nfunction descendingComparator(a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(order, orderBy) {\n return order === \"desc\"\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n const stabilizedThis = array.map((el, index) => ({\n el,\n index,\n }));\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.el, b.el);\n if (order !== 0) return order;\n return a.index - b.index;\n });\n return stabilizedThis.map((element) => element.el);\n}\n// Date, Role, Agent_Name, Signin_Time, Signout_Time, Spent_Time\nconst headCells = [\n {\n id: \"srno\",\n numeric: false,\n disablePadding: false,\n label: \"Sr.No.\",\n },\n {\n id: \"Date\",\n numeric: false,\n disablePadding: false,\n label: \"Date\",\n },\n { id: \"Role\", numeric: false, disablePadding: false, label: \"Role\" },\n {\n id: \"Agent_Name\",\n numeric: false,\n disablePadding: false,\n label: \"Agent Name\",\n },\n {\n id: \"Signin_Time\",\n numeric: false,\n disablePadding: false,\n label: \"Signin Time\",\n },\n {\n id: \"Spent_Time\",\n numeric: false,\n disablePadding: false,\n label: \"Signout Time\",\n },\n {\n id: \"Spent_Time\",\n numeric: false,\n disablePadding: false,\n label: \"Spent Time\",\n },\n];\n\nvar HeaderName = [];\nheadCells.map(\n (item) => !!item.id && item.id !== \"srno\" && HeaderName.push(item.id)\n);\n\nconst EnhancedTableHead = (props) => {\n const { order, orderBy, onRequestSort } = props;\n const createSortHandler = (property) => (event) => {\n onRequestSort(event, property);\n };\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n {headCell.label}\n \n \n ))}\n \n \n );\n};\n\nconst EnhancedTableToolbar = (props) => {\n // Here was 'let'\n const [showAlert, setShowAlert] = React.useState(false);\n //const { handleChangeDense, dense } = props;\n var [timeStamp, setTimeStamp] = React.useState(Number(new Date()));\n // show chart Conversation\n const [openAdd, setOpenAdd] = React.useState({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n const handleAddClickOpen = async () => {\n if (!!props.rows && props.rows.length > 0) {\n setOpenAdd({\n Open: true,\n data: props.ChartRows,\n report: \"Agent Sessions count Report\",\n name: \"\",\n });\n } else {\n setShowAlert(true);\n await timeOut(1500);\n setShowAlert(false);\n }\n };\n\n const handleAddClose = () => {\n setOpenAdd({\n Open: false,\n data: \"\",\n report: \"\",\n name: \"\",\n });\n };\n\n return (\n <>\n \n \n \n Agent Sessions count\n \n
\n \n \n {/*
*/}\n
\n {/*
}\n label=\"Dense padding\"\n ml={10}\n /> */}\n
\n \n \n {!!showAlert && (\n \n No Data Found\n \n )}\n >\n );\n};\n\nfunction EnhancedTable({ overviewdetail }) {\n const [order, setOrder] = React.useState(\"asc\");\n const [orderBy, setOrderBy] = React.useState(\"calories\");\n const [selected, setSelected] = React.useState([]);\n const [page, setPage] = React.useState(0);\n const [dense, setDense] = React.useState(true);\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\n const [search, setSearch] = React.useState(\"\");\n var [agentData, setAgentData] = React.useState([]);\n React.useEffect(() => {\n !!overviewdetail ? setAgentData(overviewdetail) : setAgentData([]);\n setDense(true);\n }, [overviewdetail]);\n\n // Date, Role, Agent_Name, Signin_Time, Signout_Time, Spent_Time\n rowsData = !!agentData\n ? agentData.map((item, i) =>\n createData(\n !!item.loginDate ? item.loginDate : \"\",\n item.agentName.length > 0 && !!item.agentName.role === 0\n ? \"Admin\"\n : \"Agent\",\n item.agentName && item.agentName.displayname\n ? item.agentName.displayname\n : \"\",\n !!item.signin_time ? item.signin_time : \"\",\n !!item.signout_time ? item.signout_time : \"\",\n !!item.spent_time ? item.spent_time : \"\"\n )\n )\n : [];\n\n rows =\n search === \"\"\n ? rowsData\n : rowsData.filter((i) =>\n i.Agent_Name.toLowerCase().includes(search.toLowerCase())\n );\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === \"asc\";\n setOrder(isAsc ? \"desc\" : \"asc\");\n setOrderBy(property);\n };\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = rows.map((n) => n.name);\n setSelected(newSelecteds);\n return;\n }\n setSelected([]);\n };\n\n const handleClick = (event, name) => {\n const selectedIndex = selected.indexOf(name);\n let newSelected = [];\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name);\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1));\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1));\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n );\n }\n\n setSelected(newSelected);\n };\n\n const handleChangePage = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n const handleChangeDense = (event) => {\n setDense(event.target.checked);\n };\n\n const isSelected = (name) => selected.indexOf(name) !== -1;\n\n const emptyRows =\n rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n\n return (\n \n
\n \n \n \n \n \n {\n setSearch(e.target.value);\n }}\n />\n \n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = isSelected(row.date);\n const labelId = `enhanced-table-checkbox-${index}`;\n // Date, Role, Agent_Name, Signin_Time, Signout_Time, Spent_Time\n return (\n handleClick(event, row.date)}\n key={row.date}\n selected={isItemSelected}\n >\n \n {/* {index + 1} */}\n {page === 0\n ? index + 1\n : index + 1 + rowsPerPage * page}\n \n {row.Date} \n {row.Role}\n {row.Agent_Name}\n {row.Signin_Time}\n {row.Signout_Time}\n {row.Spent_Time}\n \n );\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n \n
\n \n \n \n
\n );\n}\n\nfunction AgentsSessions({ overviewdetail }) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default AgentsSessions;\n","import React from \"react\";\nimport Tab from \"react-bootstrap/Tab\";\nimport Tabs from \"react-bootstrap/Tabs\";\nimport styled from \"@emotion/styled\";\nimport { Grid } from \"@mui/material\";\nimport OverviewTab from \"./OverviewTab\";\nimport AgentsSessions from \"./AgentsSessions\";\nimport { useState } from \"react\";\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\nconst TabTables = ({ loginLogoutReportdata }) => {\n const [key, setKey] = React.useState(\"OverviewReport\");\n const [overview, setOverview] = useState(\"\");\n const [overviewdetail, setOverviewdetail] = useState(\"\");\n const [chartoverview, setChartoverview] = useState(\"\");\n\n React.useEffect(() => {\n !!loginLogoutReportdata &&\n !!loginLogoutReportdata.overview &&\n setOverview(loginLogoutReportdata.overview);\n !!loginLogoutReportdata &&\n !!loginLogoutReportdata.overviewdetail &&\n setOverviewdetail(loginLogoutReportdata.overviewdetail);\n !!loginLogoutReportdata &&\n !!loginLogoutReportdata.chartoverview &&\n setChartoverview(loginLogoutReportdata.chartoverview);\n }, [loginLogoutReportdata]);\n\n return (\n <>\n \n
setKey(k)}\n >\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n
\n >\n );\n};\n\nexport default TabTables;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n// fetch report for overview Data\nexport const fetchLoginLoutReport = createAsyncThunk(\n \"loginoutReport/fetch\",\n async (PayloadData) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const data = {\n account_id: accountID.toString(),\n day_label: PayloadData.dayID,\n start_date: PayloadData.start_date,\n end_date: PayloadData.end_date,\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/signinsignout-reports`,\n data,\n config\n );\n return await res.data.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\nexport const reportLoginLogoutSlice = createSlice({\n name: \"reportLoginLogout\",\n initialState: {\n loginLogoutReportdata: [],\n loginLogoutStatus: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchLoginLoutReport.pending, (state, action) => {\n state.loginLogoutReportdata = [];\n state.loginLogoutStatus = STATUSES.LOADING;\n })\n .addCase(fetchLoginLoutReport.fulfilled, (state, action) => {\n state.loginLogoutReportdata = action.payload;\n state.loginLogoutStatus = STATUSES.SUCCESS;\n })\n .addCase(fetchLoginLoutReport.rejected, (state, action) => {\n state.loginLogoutReportdata = [];\n state.loginLogoutStatus = STATUSES.ERROR;\n });\n },\n});\n\nexport const { setLoginLogoutReportdata, setLoginLogoutStatus } =\n reportLoginLogoutSlice.actions;\nexport default reportLoginLogoutSlice.reducer;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport {\n Box,\n Button as MuiButton,\n Typography as MuiTypography,\n Divider as MuiDivider,\n InputLabel,\n Grid,\n FormControl as MuiFormControl,\n MenuItem,\n Select,\n CircularProgress as MuiCircularProgress,\n TextField,\n} from \"@mui/material\";\n\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { fetchDaysList } from \"../../../../../redux/slices/reportOtherFunction\";\nimport moment from \"moment\";\nimport LogoutIcon from \"@mui/icons-material/Logout\";\nimport TabTables from \"./TabTables\";\nimport { fetchLoginLoutReport } from \"../../../../../redux/slices/reportLoginLogout\";\nimport { isValidToken } from \"../../../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst Divider = styled(MuiDivider)(spacing);\nconst Typography = styled(MuiTypography)(spacing);\nconst Button = styled(MuiButton)(spacing);\nconst CircularProgress = styled(MuiCircularProgress)(spacing);\nconst FormControlSpacing = styled(MuiFormControl)(spacing);\nconst FormControl = styled(FormControlSpacing)`\n min-width: 148px;\n`;\n\nconst TitleTypography = styled(Typography)`\n margin-top: 15px;\n padding-right: 20px;\n padding-bottom: 12px;\n color: ${(props) => props.theme.sidebar.header.color};\n`;\nconst Wrapper = styled.div`\n padding-left: 10px;\n padding-right: 10px;\n`;\n\nconst ShowCalender = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const [fromDate, setFromDate] = React.useState(null);\n const [toDate, setToDate] = React.useState(null);\n const [validation, setValidation] = React.useState(null);\n\n const chechValidation = () => {\n setValidation(null);\n !toDate && setValidation(\"Check To Date\");\n !fromDate && setValidation(\"Check From Date\");\n const startDate = moment(fromDate);\n const timeEnd = moment(toDate);\n const diff = timeEnd.diff(startDate);\n const diffDuration = moment.duration(diff);\n diffDuration.days() <= 0\n ? setValidation(\n \"Please select From date that is at least 1 business days from To date.\"\n )\n : fetch_Data();\n };\n\n const fetch_Data = () => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n let PayloadData = {\n dayID: 6,\n start_date: moment(fromDate).format(\"YYYY-MM-DD\"),\n end_date: moment(toDate).format(\"YYYY-MM-DD\"),\n };\n dispatch(fetchLoginLoutReport(PayloadData));\n }\n };\n return (\n <>\n \n setFromDate(e.target.value)}\n />\n \n\n \n setToDate(e.target.value)}\n ml={15}\n />\n \n \n \n \n {!!validation && (\n \n {validation}\n \n )}\n >\n );\n};\nconst SignInSignOutReport = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const { dayList, status } = useSelector((state) => state.reportOtherFunction);\n const { loginLogoutReportdata, loginLogoutStatus } = useSelector(\n (state) => state.reportLoginLogout\n );\n\n React.useEffect(() => {\n dispatch(fetchDaysList());\n let PayloadData = {\n dayID: 0,\n };\n dispatch(fetchLoginLoutReport(PayloadData));\n }, [dispatch]);\n\n const [days, setDays] = React.useState(\"\");\n\n // 1st value in dropdown\n React.useEffect(() => {\n !!dayList && dayList.length > 0 && setDays(dayList[0].id);\n }, [dayList]);\n\n // filter Events\n const handleDaysChange = (event) => {\n if (!isValidToken(accessToken)) {\n dispatch(fetchLogOut());\n dispatch(fetchLoginLogOut_Socket());\n dispatch(logout());\n navigate(\"/\");\n } else {\n setDays(event.target.value);\n let PayloadData = {\n dayID: event.target.value,\n start_date: \"\",\n end_date: \"\",\n };\n dispatch(fetchLoginLoutReport(PayloadData));\n }\n };\n return (\n <>\n \n \n \n Agent Login-Logout Reports\n \n \n \n {/* Filters */}\n \n \n \n \n Days\n \n \n \n \n {!!days && days === 6 && }\n \n \n \n \n {/* Tabs */}\n \n \n \n {!!loginLogoutStatus && loginLogoutStatus === \"loading\" && (\n \n )}\n {!!status && status === \"loading\" && }\n \n \n \n \n \n \n >\n );\n};\n\nexport default SignInSignOutReport;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport AgentReport from \"./Agents/AgentReport\";\nimport ChanelsReport from \"./Chanels/ChanelsReport\";\nimport CSATReport from \"./CSAT/CSATReport\";\nimport Labels from \"./Labels/Labels\";\nimport OverviewReports from \"./Overview/OverviewReports\";\nimport SignInSignOutReport from \"./SignInSignOut/SignInSignOutReport\";\n\nconst RightReportsPannel = () => {\n const { reportList } = useSelector((state) => state.reportList);\n const [list, setList] = React.useState(\"\");\n React.useEffect(() => {\n setList(reportList);\n }, [reportList]);\n\n return (\n <>\n {!!list && list === \"overview_report\" && }\n {!!list && list === \"csat_report\" && }\n {!!list && list === \"labels\" && }\n {!!list && list === \"agents\" && }\n {!!list && list === \"chanels\" && }\n {!!list && list === \"signin_signout\" && }\n >\n );\n};\n\nexport default RightReportsPannel;\n","import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { spacing } from \"@mui/system\";\nimport { Helmet } from \"react-helmet-async\";\nimport { Grid } from \"@mui/material\";\nimport LeftReportsPannel from \"./leftPannel/LeftReportsPannel\";\nimport RightReportsPannel from \"./rightPannel/RightReportsPannel\";\nimport { useDispatch } from \"react-redux\";\nimport { isValidToken } from \"../../../utils/jwt\";\nimport {\n fetchLogOut,\n fetchLoginLogOut_Socket,\n logout,\n} from \"../../../redux/slices/login\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst TopSpacing = styled(\"div\")(spacing);\nconst Reports = () => {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n const dispatch = useDispatch();\n const navigate = useNavigate();\n React.useEffect(() => {\n !isValidToken(accessToken) && dispatch(fetchLogOut());\n !isValidToken(accessToken) && dispatch(fetchLoginLogOut_Socket());\n !isValidToken(accessToken) && dispatch(logout());\n !isValidToken(accessToken) && navigate(\"/\");\n }, [accessToken, dispatch, navigate]);\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n );\n};\n\nexport default Reports;\n","import React from \"react\";\n\nimport async from \"./components/Async\";\n\n// Layouts\nimport AuthLayout from \"./layouts/Auth\";\nimport DashboardLayout from \"./layouts/Dashboard\";\n\n// Auth components\nimport SignIn from \"./pages/auth/SignIn\";\n// import SignUp from \"./pages/auth/SignUp\";\n// import ResetPassword from \"./pages/auth/ResetPassword\";\nimport Page404 from \"./pages/auth/Page404\";\nimport ChatPannel from \"./pages/app/conversations/ChatPannel\";\nimport Contacts from \"./pages/app/contacts/Contacts\";\nimport Settings from \"./pages/app/settings/Settings\";\nimport ResetPassword from \"./pages/auth/ResetPassword\";\nimport PasswordConfirmation from \"./pages/auth/PasswordConfirmation\";\nimport CustomerSatisfactionScore from \"./pages/auth/CustomerSatisfactionScore\";\nimport Reports from \"./pages/app/reports/Reports\";\n//import Page500 from \"./pages/auth/Page500\";\n\n// Dashboard components\nconst Default = async(() => import(\"./pages/dashboards/Default\"));\n\nconst routes = [\n {\n path: \"/\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"/\",\n element: ,\n children: [\n {\n path: \"/resetpassword\",\n element: ,\n },\n ],\n },\n {\n path: \"/\",\n element: ,\n children: [\n {\n path: \"/passwordconfirmation/:passwordconfirmation\",\n element: ,\n },\n ],\n },\n {\n path: \"/\",\n element: ,\n children: [\n {\n path: \"/csat/:csat\",\n element: ,\n },\n ],\n },\n {\n path: \"dashboard\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"chat\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"contact\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"settings\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"reports\",\n element: ,\n children: [\n {\n path: \"\",\n element: ,\n },\n ],\n },\n {\n path: \"*\",\n element: ,\n children: [\n {\n path: \"*\",\n element: ,\n },\n ],\n },\n];\n\nexport default routes;\n","import * as React from \"react\";\n\nimport Loader from \"./Loader\";\n\nconst sleep = (m) => new Promise((r) => setTimeout(r, m));\n\nexport default function asyncComponent(importComponent) {\n class AsyncComponent extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n component: null,\n };\n }\n\n async componentDidMount() {\n await sleep(process.env.NODE_ENV === \"development\" ? 150 : 0);\n\n const { default: component } = await importComponent();\n\n this.setState({\n component: component,\n });\n }\n\n render() {\n const C = this.state.component;\n\n return C ? : ;\n }\n }\n\n return AsyncComponent;\n}\n","import React, { useEffect } from \"react\";\n\nimport { THEMES } from \"../constants\";\n\nconst initialState = {\n theme: THEMES.DEFAULT,\n setTheme: (theme) => {},\n};\n\nconst ThemeContext = React.createContext(initialState);\n\nfunction ThemeProvider({ children }) {\n const [theme, _setTheme] = React.useState(initialState.theme);\n\n useEffect(() => {\n const storedTheme = localStorage.getItem(\"theme\");\n\n if (storedTheme) {\n _setTheme(JSON.parse(storedTheme));\n }\n }, []);\n\n const setTheme = (theme) => {\n localStorage.setItem(\"theme\", JSON.stringify(theme));\n _setTheme(theme);\n };\n\n return (\n \n {children}\n \n );\n}\n\nexport { ThemeProvider, ThemeContext };\n","import { useContext } from \"react\";\nimport { ThemeContext } from \"../contexts/ThemeContext\";\n\nconst useTheme = () => useContext(ThemeContext);\n\nexport default useTheme;\n","import { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\n\nconst initialState = {\n value: 0,\n status: \"idle\",\n};\n\n// A mock function to mimic making an async request for data\nexport function fetchCount(amount = 1) {\n return new Promise((resolve) =>\n setTimeout(() => resolve({ data: amount }), 500)\n );\n}\n\n// The function below is called a thunk and allows us to perform async logic. It\n// can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This\n// will call the thunk with the `dispatch` function as the first argument. Async\n// code can then be executed and other actions can be dispatched. Thunks are\n// typically used to make async requests.\nexport const incrementAsync = createAsyncThunk(\n \"counter/fetchCount\",\n async (amount) => {\n const response = await fetchCount(amount);\n // The value we return becomes the `fulfilled` action payload\n return response.data;\n }\n);\n\nexport const counterSlice = createSlice({\n name: \"counter\",\n initialState,\n // The `reducers` field lets us define reducers and generate associated actions\n reducers: {\n increment: (state) => {\n // Redux Toolkit allows us to write \"mutating\" logic in reducers. It\n // doesn't actually mutate the state because it uses the Immer library,\n // which detects changes to a \"draft state\" and produces a brand new\n // immutable state based off those changes\n state.value += 1;\n },\n decrement: (state) => {\n state.value -= 1;\n },\n // Use the PayloadAction type to declare the contents of `action.payload`\n incrementByAmount: (state, action) => {\n state.value += action.payload;\n },\n },\n // The `extraReducers` field lets the slice handle actions defined elsewhere,\n // including actions generated by createAsyncThunk or in other slices.\n extraReducers: (builder) => {\n builder\n .addCase(incrementAsync.pending, (state) => {\n state.status = \"loading\";\n })\n .addCase(incrementAsync.fulfilled, (state, action) => {\n state.status = \"idle\";\n state.value += action.payload;\n });\n },\n});\n\nexport const { increment, decrement, incrementByAmount } = counterSlice.actions;\n\n// The function below is called a selector and allows us to select a value from\n// the state. Selectors can also be defined inline where they're used instead of\n// in the slice file. For example: `useSelector((state: RootState) => state.counter.value)`\nexport const selectCount = (state) => state.counter.value;\n\n// We can also write thunks by hand, which may contain both sync and async logic.\n// Here's an example of conditionally dispatching actions based on current state.\nexport const incrementIfOdd = (amount) => (dispatch, getState) => {\n const currentValue = selectCount(getState());\n if (currentValue % 2 === 1) {\n dispatch(incrementByAmount(amount));\n }\n};\n\nexport default counterSlice.reducer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// Thunks\n//Create Other messages\nexport const createOtherMessage = createAsyncThunk(\n \"othermessage/create\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n const user = JSON.parse(localStorage.getItem(\"user\"));\n const agentId = user.uid;\n var body = {\n message_type: payload.message_type,\n media_path: payload.media_path,\n content: payload.content,\n is_private: 1,\n content_type: payload.content_type,\n sender_type: 0,\n };\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/conversation/${payload.conversationID}/agent/${agentId}/createOtherMessage`,\n body,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const UpdateLabelID = createAsyncThunk(\n \"updateLabel/create\",\n async (payload) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n var body = {\n label_id: payload.labelId,\n };\n if (!!bearer_token && !!accountID) {\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.put(\n `${basePathConfig.baseURL}/app/accounts/${accountID}/contact/${payload.contactID}`,\n body,\n config\n );\n\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const otherMessageSlice = createSlice({\n name: \"otherMessages\",\n initialState: {\n data: [],\n updateData: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(createOtherMessage.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(createOtherMessage.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(createOtherMessage.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n })\n .addCase(UpdateLabelID.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(UpdateLabelID.fulfilled, (state, action) => {\n state.data = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(UpdateLabelID.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setData, setStatus, setUpdateData } = otherMessageSlice.actions;\nexport default otherMessageSlice.reducer;\n","import axios from \"axios\";\nimport { createAsyncThunk, createSlice } from \"@reduxjs/toolkit\";\nimport { basePathConfig } from \"../../config\";\nimport errorHandler from \"../error/errorHandler\";\n\n// fetch all labels Data\nexport const fetchAnswer = createAsyncThunk(\n \"answer/fetch\",\n async (Question) => {\n try {\n const bearer_token = `Bearer ${localStorage.getItem(\"accessToken\")}`;\n const accountID = localStorage.getItem(\"atua\");\n if (!!bearer_token && !!accountID) {\n const data = {\n keyword: Question,\n };\n const config = {\n headers: {\n Authorization: bearer_token,\n },\n };\n const res = await axios.post(\n `${basePathConfig.baseURL}/app/chatgpt`,\n data,\n config\n );\n return await res.data;\n } else {\n return { message: \"Unauthorized\", status: 401 };\n }\n } catch (error) {\n var ErrorData = await errorHandler(error);\n return await ErrorData;\n }\n }\n);\n\nexport const STATUSES = Object.freeze({\n SUCCESS: \"success\",\n ERROR: \"error\",\n LOADING: \"loading\",\n});\n\nexport const chatGTPSlice = createSlice({\n name: \"chatGTP\",\n initialState: {\n chatGTPAnswer: [],\n status: STATUSES.SUCCESS,\n },\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchAnswer.pending, (state, action) => {\n state.status = STATUSES.LOADING;\n })\n .addCase(fetchAnswer.fulfilled, (state, action) => {\n state.chatGTPAnswer = action.payload;\n state.status = STATUSES.SUCCESS;\n })\n .addCase(fetchAnswer.rejected, (state, action) => {\n state.status = STATUSES.ERROR;\n });\n },\n});\nexport const { setChatGTPAnswer, setStatus } = chatGTPSlice.actions;\nexport default chatGTPSlice.reducer;\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport counterReducer from \"./slices/counter\";\nimport loginReducer from \"./slices/login\";\nimport settingReducer from \"./slices/settings\";\nimport labelsReducer from \"./slices/labels\";\nimport cannedResponsesReducer from \"./slices/cannedResponses\";\nimport agentsReducer from \"./slices/agents\";\nimport companyAttributesReducer from \"./slices/companyAttributes\";\nimport accountReducer from \"./slices/account\";\nimport contactReducer from \"./slices/contact\";\nimport socketsReducer from \"./slices/socketsSlice\";\nimport chatSettingsReducer from \"./slices/chatSettings\";\nimport conversationalActionReducer from \"./slices/conversationalActions\";\nimport passwordConfirmationReducer from \"./slices/passwordConfirmation\";\nimport csatRatingReducer from \"./slices/csatRating\";\nimport reserPasswordReducer from \"./slices/resetPassword\";\nimport sendMailPreviousChatReducer from \"./slices/sendMailPreviousChat\";\nimport otherMessagesReducer from \"./slices/otherMessages\";\nimport pauseUnpauseReducer from \"./slices/pauseUnpause\";\nimport profileDetailsReducer from \"./slices/profileDetails\";\nimport chatGTPReducer from \"./slices/chatGTPslice\";\nimport reportListReducer from \"./slices/reportList\";\nimport reportOtherFunctionReducer from \"./slices/reportOtherFunction\";\nimport reportAgentReducer from \"./slices/reportAgentWise\";\nimport reportCsatReducer from \"./slices/reportCSAT\";\nimport reportOverviewSlice from \"./slices/reportsOverview\";\nimport reportChannelSlice from \"./slices/reportChannel\";\nimport reportLoginLogoutSlice from \"./slices/reportLoginLogout\";\nimport reportLabelsSlice from \"./slices/reportsLabels\";\nimport agentOtherDataSlice from \"./slices/agentOtherDataSlice\";\nimport whitelistsolutionSlice from \"./slices/whitelistsolutionSlice\";\nimport botlogsSlice from \"./slices/botLogsSlice\";\nimport chatHistoryViewerSlice from \"./slices/chatHistoryViewer\";\n\nexport const store = configureStore(\n {\n reducer: {\n counter: counterReducer,\n login: loginReducer,\n settings: settingReducer,\n labels: labelsReducer,\n cannedResponses: cannedResponsesReducer,\n agents: agentsReducer,\n companyAttributes: companyAttributesReducer,\n account: accountReducer,\n contact: contactReducer,\n socketsSlice: socketsReducer,\n chatSettings: chatSettingsReducer,\n conversationalAction: conversationalActionReducer,\n password_Confirmation: passwordConfirmationReducer,\n csatRating: csatRatingReducer,\n reset_password: reserPasswordReducer,\n sendMail_PreviousChat: sendMailPreviousChatReducer,\n otherMessages: otherMessagesReducer,\n pauseUnpause: pauseUnpauseReducer,\n profileDetails: profileDetailsReducer,\n chatGTP: chatGTPReducer,\n reportList: reportListReducer,\n reportOtherFunction: reportOtherFunctionReducer,\n reportAgent: reportAgentReducer,\n reportCSAT: reportCsatReducer,\n reportOverview: reportOverviewSlice,\n reportChannel: reportChannelSlice,\n reportLoginLogout: reportLoginLogoutSlice,\n reportLabels: reportLabelsSlice,\n agentOtherData: agentOtherDataSlice,\n whitelistsolution: whitelistsolutionSlice,\n botlogs: botlogsSlice,\n chatHistoryViewer: chatHistoryViewerSlice,\n },\n },\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n);\n","import createCache from \"@emotion/cache\";\n\nconst createEmotionCache = () => {\n return createCache({ key: \"css\" });\n};\n\nexport default createEmotionCache;\n","import { createContext, useEffect, useReducer } from \"react\";\n\nimport axios from \"../utils/axios\";\nimport { isValidToken, setSession } from \"../utils/jwt\";\n\nconst INITIALIZE = \"INITIALIZE\";\nconst SIGN_IN = \"SIGN_IN\";\nconst SIGN_OUT = \"SIGN_OUT\";\nconst SIGN_UP = \"SIGN_UP\";\n\nconst initialState = {\n isAuthenticated: false,\n isInitialized: false,\n user: null,\n};\n\nconst JWTReducer = (state, action) => {\n switch (action.type) {\n case INITIALIZE:\n return {\n isAuthenticated: action.payload.isAuthenticated,\n isInitialized: true,\n user: action.payload.user,\n };\n case SIGN_IN:\n return {\n ...state,\n isAuthenticated: true,\n user: action.payload.user,\n };\n case SIGN_OUT:\n return {\n ...state,\n isAuthenticated: false,\n user: null,\n };\n\n case SIGN_UP:\n return {\n ...state,\n isAuthenticated: true,\n user: action.payload.user,\n };\n\n default:\n return state;\n }\n};\n\nconst AuthContext = createContext(null);\n\nfunction AuthProvider({ children }) {\n const [state, dispatch] = useReducer(JWTReducer, initialState);\n\n useEffect(() => {\n const initialize = async () => {\n try {\n const accessToken = window.localStorage.getItem(\"accessToken\");\n\n if (accessToken && isValidToken(accessToken)) {\n setSession(accessToken);\n\n const response = await axios.get(\"/api/auth/my-account\");\n const { user } = response.data;\n\n console.log(user);\n\n dispatch({\n type: INITIALIZE,\n payload: {\n isAuthenticated: true,\n user,\n },\n });\n } else {\n dispatch({\n type: INITIALIZE,\n payload: {\n isAuthenticated: false,\n user: null,\n },\n });\n }\n } catch (err) {\n console.error(err);\n dispatch({\n type: INITIALIZE,\n payload: {\n isAuthenticated: false,\n user: null,\n },\n });\n }\n };\n\n initialize();\n }, []);\n\n const signIn = async (email, password) => {\n const response = await axios.post(\"/api/auth/sign-in\", {\n email,\n password,\n });\n const { accessToken, user } = response.data;\n\n setSession(accessToken);\n dispatch({\n type: SIGN_IN,\n payload: {\n user,\n },\n });\n };\n\n const signOut = async () => {\n setSession(null);\n dispatch({ type: SIGN_OUT });\n };\n\n const signUp = async (email, password, firstName, lastName) => {\n const response = await axios.post(\"/api/auth/sign-up\", {\n email,\n password,\n firstName,\n lastName,\n });\n const { accessToken, user } = response.data;\n\n window.localStorage.setItem(\"accessToken\", accessToken);\n dispatch({\n type: SIGN_UP,\n payload: {\n user,\n },\n });\n };\n\n const resetPassword = (email) => console.log(email);\n\n return (\n \n {children}\n \n );\n}\n\nexport { AuthContext, AuthProvider };\n","import React from \"react\";\nimport { useRoutes } from \"react-router-dom\";\nimport { Provider } from \"react-redux\";\nimport { HelmetProvider, Helmet } from \"react-helmet-async\";\nimport { CacheProvider } from \"@emotion/react\";\n\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n//import AdapterDateFns from \"@mui/lab/AdapterDateFns\";\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFns\";\n//import LocalizationProvider from \"@mui/lab/LocalizationProvider\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\n\nimport \"./i18n\";\nimport createTheme from \"./theme\";\nimport routes from \"./routes\";\n\nimport useTheme from \"./hooks/useTheme\";\nimport { store } from \"./redux/store\";\nimport createEmotionCache from \"./utils/createEmotionCache\";\n\nimport { AuthProvider } from \"./contexts/JWTContext\";\n// import { AuthProvider } from \"./contexts/FirebaseAuthContext\";\n// import { AuthProvider } from \"./contexts/Auth0Context\";\n// import { AuthProvider } from \"./contexts/CognitoContext\";\n\nconst clientSideEmotionCache = createEmotionCache();\n\nfunction App({ emotionCache = clientSideEmotionCache }) {\n const content = useRoutes(routes);\n\n const { theme } = useTheme();\n\n return (\n \n \n \n \n \n \n {content}\n \n \n \n \n \n );\n}\n\nexport default App;\n","import AxiosMockAdapter from \"axios-mock-adapter\";\n\nimport axios from \"../utils/axios\";\n\nconst axiosMockAdapter = new AxiosMockAdapter(axios, {\n delayResponse: 0,\n});\n\nexport default axiosMockAdapter;\n","import faker from \"faker\";\n\nimport mock from \"./adapter\";\n\nimport { verify, sign } from \"../utils/jwt\";\n\nconst JWT_SECRET = \"super-secret-key\";\nconst JWT_EXPIRES_IN = \"3 days\";\n\nconst users = [\n {\n id: \"a8553063-7bd5-45ed-adbe-db6f069a3802\",\n displayName: \"Lucy Lavender\",\n email: \"demo@bootlab.io\",\n password: \"unsafepassword\",\n avatar: \"/static/img/avatars/avatar-1.jpg\",\n },\n];\n\nfunction fakeRequest(time) {\n return new Promise((res) => setTimeout(res, time));\n}\n\nmock.onPost(\"/api/auth/sign-in\").reply(async (config) => {\n try {\n await fakeRequest(1000);\n\n const { email, password } = JSON.parse(config.data);\n const user = users.find((_user) => _user.email === email);\n\n if (!user) {\n return [\n 400,\n { message: \"There is no user corresponding to the email address.\" },\n ];\n }\n\n if (user.password !== password) {\n return [400, { message: \"Incorrect password\" }];\n }\n\n const accessToken = sign({ userId: user.id }, JWT_SECRET, {\n expiresIn: JWT_EXPIRES_IN,\n });\n\n return [200, { accessToken, user }];\n } catch (error) {\n console.error(error);\n return [500, { message: \"Internal server error\" }];\n }\n});\n\nmock.onPost(\"/api/auth/sign-up\").reply(async (config) => {\n try {\n await fakeRequest(1000);\n\n const { email, password, firstName, lastName } = JSON.parse(config.data);\n let user = users.find((_user) => _user.email === email);\n\n if (user) {\n return [\n 400,\n {\n message:\n \"There already exists an account with the given email address.\",\n },\n ];\n }\n\n user = {\n id: faker.datatype.uuid(),\n displayName: `${firstName} ${lastName}`,\n email,\n password,\n avatar: null,\n };\n\n const accessToken = sign({ userId: user.id }, JWT_SECRET, {\n expiresIn: JWT_EXPIRES_IN,\n });\n\n return [200, { accessToken, user }];\n } catch (error) {\n console.error(error);\n return [500, { message: \"Internal server error\" }];\n }\n});\n\nmock.onGet(\"/api/auth/my-account\").reply((config) => {\n try {\n const { Authorization } = config.headers;\n\n if (!Authorization) {\n return [401, { message: \"Authorization token missing\" }];\n }\n\n const accessToken = Authorization.split(\" \")[1];\n const data = verify(accessToken, JWT_SECRET);\n const userId = typeof data === \"object\" ? data?.userId : \"\";\n const user = users.find((_user) => _user.id === userId);\n\n if (!user) {\n return [401, { message: \"Invalid authorization token\" }];\n }\n\n return [200, { user }];\n } catch (error) {\n console.error(error);\n return [500, { message: \"Internal server error\" }];\n }\n});\n","import \"react-app-polyfill/stable\";\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter } from \"react-router-dom\";\n\nimport reportWebVitals from \"./utils/reportWebVitals\";\nimport App from \"./App\";\n\nimport \"./css/custom.css\";\nimport \"./mocks\";\n\nimport { ThemeProvider } from \"./contexts/ThemeContext\";\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}