{"version":3,"file":"static/js/1748.35051a19.chunk.js","mappings":"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","sources":["settings/oAuthSettings.ts","redux/api/BaseApi.ts","redux/api/ChatApi.ts","redux/hooks.ts","types/ChatVisibility.ts","redux/reducers/ChatSlice.ts","components/OnlineIndicator.tsx","util/ChatUtils.ts","components/UnreadMessageCount.tsx","components/ChatHeader.tsx","components/Common/Spinny.tsx","components/ChatMenu.tsx","components/Chat.tsx","components/ChatListItem.tsx","components/ChatFilter.tsx","components/ChatCount.tsx","components/ChatVisibilityMenu.tsx","components/UserListItem.tsx","components/UserOffline.tsx","components/ChatList.tsx","components/ChatPage.tsx","redux/middleware/SignalRMiddleware.ts","redux/store.ts","components/ChatDialog.tsx","components/NewMessageSound.tsx","components/ChatRequest.tsx","components/Header/ProfileImage.tsx","components/Header/Nav.tsx","components/PinnedChats.tsx","App.tsx","components/auth/CallbackPage.tsx","components/auth/SilentRenewPage.tsx","bootstrap.tsx"],"sourcesContent":["import { UserManagerSettings } from \"oidc-client\";\nimport { createUserManager } from 'redux-oidc';\n\nexport const oAuthSettings = {\n authority: process.env.REACT_APP_AUTHORITY_URL,\n client_id: 'Revelation.NewUX',\n redirect_uri: `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}${process.env.PUBLIC_URL}/signin-callback`,//`${Constants.clientRoot}/signin-callback.html`,\n silent_redirect_uri: `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}${process.env.PUBLIC_URL}/silent-renew`,\n automaticSilentRenew: true,\n post_logout_redirect_uri: `https://localhost:8090`,\n response_type: \"code\",\n scope: \"offline_access Revelation.Api\", //offline_access required for silent renew to work in the browser\n validateSubOnSilentRenew: false,\n includeIdTokenInSilentRenew: true,\n silentRequestTimeoutInSeconds: 30,\n} as UserManagerSettings;\n\nconst userManager = createUserManager(oAuthSettings);\nexport default userManager;","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport { RootState } from \"../store\";\n\nconst Api = createApi({\n reducerPath: \"chatApi\",\n baseQuery: fetchBaseQuery({\n baseUrl: process.env.REACT_APP_REVELATION_API_URL,\n prepareHeaders: async (headers, { getState }) => {\n const token = (getState() as RootState).auth.user?.access_token;\n token && headers?.set(\"authorization\", `Bearer ${token || ''}`);\n return headers;\n },\n }),\n tagTypes: [\n \"GetTenant\",\n \"Chat\",\n \"Chats\",\n \"ChatMessages\",\n \"Profile\",\n \"UserFeatures\",\n \"ChatConfig\",\n \"ChatRequest\",\n \"ChatMyVisibility\",\n \"ChatPins\"\n ],\n endpoints: (build) => ({\n getTenant: build.query<string, string>({\n query: (hostName) => \"Account/TenantConfig/?tenantUrl=\" + hostName,\n providesTags: [\"GetTenant\"],\n }),\n }),\n});\n\nexport { Api };\n","import { IChat } from '../../types/IChat';\nimport { IChatConfig } from '../../types/IChatConfig';\nimport { IChatMessage, IChatMessage2 } from '../../types/IChatMessage';\nimport IChatPin from '../../types/IChatPin';\nimport IChatVisibility from '../../types/IChatVisibility';\nimport { ITicket } from '../../types/ITicket';\nimport { IUserProfile } from '../../types/IUserProfile';\nimport { Api } from './BaseApi'\n\nconst ChatApi = Api.injectEndpoints({\n endpoints: (build) => ({\n getChats: build.query<IChat[], boolean | void>({\n query: (includeClosed) => `Chat/My/?includeClosed=${includeClosed ? \"true\" : \"false\"}`,\n providesTags: [\"Chats\"],\n }),\n getProfile: build.query<IUserProfile, string | void>({\n query: (uid) => {\n if (uid) {\n return `User/${uid}/Profile/`;\n }\n console.warn('getProfile', uid);\n return \"User/Profile/\";\n },\n providesTags: [\"Profile\"],\n }),\n getConfig: build.query<IChatConfig, void>({\n query: () => `Chat/Config`,\n providesTags: [\"ChatConfig\"],\n }),\n updateChat: build.mutation<IChat, IChat>({\n query: (chat) => ({\n url: `Chat/${chat.ConversationId}/`,\n method: \"POST\",\n body: chat\n }),\n invalidatesTags: [\"Chat\", \"Chats\"],\n async onQueryStarted({ ConversationId, ...chat }, { dispatch, queryFulfilled }) {\n const patchResult = dispatch(\n ChatApi.util.updateQueryData('getChat', ConversationId, (draft) => {\n Object.assign(draft, chat)\n })\n )\n try {\n await queryFulfilled\n } catch {\n patchResult.undo()\n }\n },\n }),\n acceptChat: build.mutation<unknown, IChat>({\n query: (chat) => ({\n url: `Chat/${chat.ConversationId}/Join`,\n method: \"POST\"\n }),\n invalidatesTags: [\"Chat\"]\n }),\n leaveChat: build.mutation<unknown, IChat>({\n query: (chat) => ({\n url: `Chat/${chat.ConversationId}/Leave`,\n method: \"POST\"\n }),\n invalidatesTags: [\"Chat\"]\n }),\n closeChat: build.mutation<unknown, IChat>({\n query: (chat) => ({\n url: `Chat/${chat.ConversationId}/Close`,\n method: \"POST\"\n }),\n invalidatesTags: [\"Chat\", \"Chats\"]\n }),\n continueChat: build.mutation<IChat, IChat>({\n query: (chat) => ({\n url: `Chat/Continue`,\n method: \"POST\",\n body: chat\n }),\n invalidatesTags: [\"Chat\", \"Chats\"]\n }),\n getChat: build.query<IChat, string>({\n query: (UId) => `Chat/${UId}`,\n providesTags: [\"Chat\"],\n }),\n getChatForUser: build.query<IChat, number>({\n query: (Id) => `Chat/ByUser/${Id}`,\n providesTags: [\"Chat\"],\n }),\n getMessages: build.query<IChatMessage[], string>({\n query: (UId) => `Chat/${UId}/Message`,\n providesTags: [\"ChatMessages\"],\n }),\n getMyVisibility: build.query<IChatVisibility, void>({\n query: () => `Chat/My/Visibility`,\n providesTags: [\"ChatMyVisibility\"],\n }),\n getPinnedChats: build.query<IChatPin[], void>({\n query: () => `Chat/Pin`,\n providesTags: [\"ChatPins\"],\n }),\n pinChat: build.mutation<boolean, IChatPin>({\n query: (pin) => {\n return {\n url: `Chat/${pin.ConversationId}/Pin`,\n method: \"POST\",\n body: pin\n }\n },\n invalidatesTags: [\"ChatPins\"],\n async onQueryStarted(pin, { dispatch, queryFulfilled }) {\n const patchResult = dispatch(\n ChatApi.util.updateQueryData('getPinnedChats', undefined, (draft) => {\n draft.find(d => d.ConversationId === pin.ConversationId) ?? draft.push(pin);\n })\n )\n try {\n await queryFulfilled\n } catch {\n patchResult.undo()\n }\n },\n }),\n unpinChat: build.mutation<boolean, IChatPin>({\n query: (pin) => ({\n url: `Chat/${pin.ConversationId}/Unpin`,\n method: \"POST\",\n body: pin\n }),\n invalidatesTags: [\"ChatPins\"],\n async onQueryStarted(pin, { dispatch, queryFulfilled }) {\n const patchResult = dispatch(\n ChatApi.util.updateQueryData('getPinnedChats', undefined, (pins) => {\n var pinIndex = pins.indexOf(pins.find(obj => pin.Contact_Id === obj?.Contact_Id && pin.Chat_Id === obj?.Chat_Id))\n //console.log('unpinChat updateQueryData', pins, pinIndex)\n //draft.slice(draft.indexOf(draft.find(obj => pin.Contact_Id == obj.Contact_Id && pin.Chat_Id == obj.Chat_Id)), 1);\n delete pins[pinIndex]\n //console.log('unpinChat updateQueryData', pins)\n })\n )\n try {\n await queryFulfilled\n } catch {\n patchResult.undo()\n }\n },\n }),\n updateUserVisibility: build.mutation<boolean, IChatVisibility>({\n query: (visData) => ({\n url: `Chat/Visibility`,\n method: \"POST\",\n body: visData\n }),\n invalidatesTags: [\"ChatMyVisibility\"],\n }),\n invalidateChatCache: build.mutation<null, void>({\n queryFn: () => ({ data: null }),\n invalidatesTags: [\"Chat\", \"Chats\"],\n }),\n createTicket: build.mutation<ITicket, ITicket>({\n query: (info) => ({\n url: \"Ticket\",\n method: \"POST\",\n body: info,\n }),\n }),\n }),\n overrideExisting: false,\n})\n\n\nexport { ChatApi };","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { RootState, AppDispatch } from './store';\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useReduxDispatch = () => useDispatch<AppDispatch>();\nexport const useReduxSelector: TypedUseSelectorHook<RootState> = useSelector;\n","export enum ChatVisibility {\n Internal_External = 2,\n Internal = 1,\n Offline = 0\n}","import { PayloadAction, createSlice } from \"@reduxjs/toolkit\";\nimport { IChat } from \"../../types/IChat\";\nimport { IChatMessage } from \"../../types/IChatMessage\";\nimport { ChatApi } from \"../api/ChatApi\";\nimport IChatUser from \"../../types/IChatUser\";\nimport { ChatVisibility } from \"../../types/ChatVisibility\";\nimport { IChatConfig } from \"../../types/IChatConfig\";\nimport { IUserProfile } from \"../../types/IUserProfile\";\nimport { NotificationLog } from \"../../types/NotificationLog\";\n\n\nconst ChatSlice = createSlice({\n name: \"chat\",\n initialState: {\n notifications: [] as NotificationLog[],\n requests: [] as IChat[],\n //messages: [] as IChatMessage[],\n usersOnline: [] as IChatUser[],\n connectionStatus: \"\" as string,\n unreadChats: 0,\n requestingChat: false,\n config: {} as IChatConfig,\n chatAvailable: false,\n profile: {} as IUserProfile,\n },\n reducers: {\n SetAvailable: (state, action: PayloadAction<boolean>) => {\n state.chatAvailable = action.payload;\n },\n SetUsersOnline: (state, action: PayloadAction<IChatUser[]>) => {\n state.usersOnline = action.payload;\n },\n SetConnectionStatus: (state, action) => {\n state.connectionStatus = action.payload;\n },\n SetRequests: (state, action) => {\n //Only set\n state.requests = action.payload\n },\n SetNotifications: (state, action) => {\n state.notifications = action.payload\n },\n SetChats: (state, action) => {\n\n },\n SetMessages: (state, action: PayloadAction<IChatMessage[]>) => {\n //console.log('SetMessages', action.payload?.length)\n if (!action.payload?.length)\n return;\n\n\n },\n PostMessage: (state, action: PayloadAction<IChatMessage>) => {\n //Adds a new message to the chat\n console.log('PostMessage');\n //AddMessage(action.payload);\n },\n DisconnectUser: (state, action: PayloadAction<IChatUser>) => {\n //Signal R Server event handled by Middleware\n console.log('DisconnectUser');\n },\n ChatStarted: (state, action: PayloadAction<IChat>) => {\n //Signal R Server event handled by Middleware\n console.log('ChatStarted');\n },\n MarkAsRead: (state, action: PayloadAction<{ conversationId: string, contactId: number, unRead: boolean }>) => {\n console.log('MarkAsRead');\n },\n ToggleChat: (state, action: PayloadAction<{ conversationId: string, uId: string, expanded: boolean }>) => {\n console.log('ToggleChat');\n },\n AddMessage: (state, action: PayloadAction<IChatMessage>) => {\n //Set the last message if this is a Chat rwquest\n var currentRequest = state.requests.find(c => c.ConversationId === action.payload.ConversationId);\n if (!currentRequest)\n return;\n\n currentRequest.Last_Message = action.payload.Text;\n currentRequest.Last_Message_Contact_Id = action.payload.Contact_Id;\n currentRequest.Last_Message_Date = action.payload.Created;\n\n },\n StartConnecting: (state, action) => {\n console.log('StartConnecting');\n },\n TypingMessage: (state, action: PayloadAction<IChat>) => {\n //Adds a new message to the chat\n console.log('TypingMessage');\n },\n RequestChat: (state, action: PayloadAction<string>) => {\n //Signal R Server event handled by Middleware\n console.log('RequestChat');\n state.requestingChat = true;\n },\n StaffJoined: (state, action: PayloadAction<IChat>) => {\n //Signal R Server event handled by Middleware\n console.log('StaffJoined');\n },\n LeaveChat: (state, action: PayloadAction<IChat>) => {\n //Signal R Server event handled by Middleware\n console.log('LeaveChat');\n },\n CloseChat: (state, action: PayloadAction<IChat>) => {\n //Signal R Server event handled by Middleware\n console.log('CloseChat');\n },\n ClearTyping: (state, action: PayloadAction<string>) => {\n console.log('ClearTyping');\n //state.messages = [...state.messages.filter(m => !m.Is_Typing)] as IChatMessage[]\n },\n SetRequesting: (state, action) => {\n state.requestingChat = action.payload;\n },\n SetVisibility: (state, action: PayloadAction<ChatVisibility>) => {\n console.log('SetVisibility', action.payload);\n //remove chat requests when goign offline\n if (action.payload !== ChatVisibility.Internal_External)\n state.requests = [];\n\n },\n PlayNewMessageSound: (state, action) => {\n var audio = new Audio('audio_file.mp3'); audio.play();\n }\n },\n extraReducers: (builder) => {\n builder.addMatcher(\n //Populate the chats in Redux state from the API\n ChatApi.endpoints.getConfig.matchFulfilled, (state, { payload }) => {\n console.log(\"ChatApi.endpoints.getConfig.matchFulfilled\", payload);\n\n //Merge with existing chats\n state.config = payload\n }\n );\n builder.addMatcher(\n //Populate the chats in Redux state from the API\n ChatApi.endpoints.getChats.matchFulfilled,\n (state, { payload }) => {\n //console.log(\"ChatApi.endpoints.getChats.matchFulfilled\", payload);\n\n //Merge with existing chats\n //state.chats = payload.concat(state.chats?.filter(c => !payload?.find(a => a?.ConversationId === c?.ConversationId)));\n }\n );\n builder.addMatcher(\n //Populate the userProfile in Redux state from the API\n ChatApi.endpoints.getProfile.matchFulfilled, (state, { payload }) => {\n state.profile = payload;\n console.log(\"ChatApi.endpoints.getProfile.matchFulfilled\", payload);\n }\n );\n builder.addMatcher(\n //Populate the chat requests in Redux state from the API\n ChatApi.endpoints.getChatForUser.matchFulfilled,\n (state, { payload }) => {\n console.log(\"ChatApi.endpoints.getChatForUser.matchFulfilled\", payload);\n\n //Merge with existing chats\n //if (payload)\n // state.chats = [payload].concat(state.chats?.filter(c => payload?.ConversationId !== c?.ConversationId));\n }\n );\n },\n});\n\nexport const { ToggleChat, SetNotifications, SetAvailable, ChatStarted, SetVisibility, DisconnectUser, SetUsersOnline, SetChats, PostMessage, AddMessage, StartConnecting, SetMessages, TypingMessage, ClearTyping, MarkAsRead, RequestChat, SetConnectionStatus, StaffJoined, LeaveChat, CloseChat, SetRequesting, SetRequests } = ChatSlice.actions\nexport default ChatSlice\n","import React from 'react'\nimport { useReduxSelector } from '../redux/hooks';\n\nexport default function OnlineIndicator(props: { Uid: string }) {\n const staffOnline = useReduxSelector(s => s.chat.usersOnline);\n const user = staffOnline?.find(s => s.UId === props.Uid);\n if (!user)\n return (<span className='offline k-icon k-i-close-outline' title={`offline`}></span>)\n\n\n return (\n <span className='online k-icon k-i-check-circle' title={`online`}></span>\n )\n}\n","import { IChat } from \"../types/IChat\";\n\nexport function ChatIsUnRead(userId: string, chat: IChat) {\n //Always unread before a staff joins\n if (!chat.Staff_Uid) return true;\n\n\n const result = chat.IsClosed ? false : chat.Staff_Uid === userId\n ? new Date(chat.Last_Message_Date) > new Date(chat.Staff_Last_Read)\n : new Date(chat.Last_Message_Date) > new Date(chat.EndUser_Last_Read)\n\n //console.log('checking ChatIsUnRead', chat?.ConversationId, chat.Last_Message_Date, chat.EndUser_Last_Read, new Date(chat.Last_Message_Date) > new Date(chat.EndUser_Last_Read), result)\n\n return result;\n}\n\nexport function ensureUTCDate(dateTime: string) {\n if (!dateTime) return null;\n\n return dateTime.endsWith('Z') ? dateTime : dateTime + 'Z';\n}\n\nexport function mergeByProperty(target, source, prop) {\n source.forEach(sourceElement => {\n let targetElement = target.find(targetElement => {\n return sourceElement[prop] === targetElement[prop];\n })\n targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);\n })\n}","import { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { Badge, BadgeContainer } from '@progress/kendo-react-indicators';\nimport { ensureUTCDate } from '../util/ChatUtils';\n\nexport default function UnreadMessageCount(props: { conversationUid: string, showLabel?: boolean, showZero?: boolean }) {\n const dispatch = useReduxDispatch();\n const { data: messages } = ChatApi.useGetMessagesQuery(props.conversationUid);\n const { data: chat } = ChatApi.useGetChatQuery(props.conversationUid);\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n\n //count the number of unready messages by the other user\n const unreadMessages = messages?.filter(m => !m.Is_Event && m.Id !== 0 && new Date(ensureUTCDate(m.Created)) > (chat?.StaffContact_Id == userProfile?.Id ? new Date(ensureUTCDate(chat?.Staff_Last_Read) ?? 0) : new Date(ensureUTCDate(chat?.EndUser_Last_Read) ?? 0)));\n\n //console.log('UnreadMessageCount: ', props.conversationUid, unreadMessages?.length, messages?.length, chat?.StaffContact_Id == userProfile?.Id, ensureUTCDate(chat?.Staff_Last_Read));\n //console.log('found mesages:', messages?.filter(m => !m.Is_Event && m.Id !== 0 && new Date(ensureUTCDate(m.Created)) > new Date(ensureUTCDate(chat?.Staff_Last_Read) ?? 0)), new Date(ensureUTCDate(chat?.Staff_Last_Read) ?? 0).toISOString());\n\n if (props.showLabel == false)\n return <></>\n\n\n if (unreadMessages?.length || props.showZero)\n return (\n <BadgeContainer><Badge align={{ horizontal: 'start', vertical: 'top' }} position='outside' rounded={'full'}>{unreadMessages?.length || 0}</Badge></BadgeContainer>\n )\n}\n","import { IChatHeaderProps } from '../types/IChatProps';\nimport { Avatar, Card } from '@progress/kendo-react-layout';\nimport OnlineIndicator from './OnlineIndicator';\nimport UnreadMessageCount from './UnreadMessageCount';\n\nexport default function ChatHeader(props: IChatHeaderProps) {\n return (\n <div className='chat-header' onClick={props.onClick}>\n <Card orientation=\"horizontal\" >\n <div className='profile-wrapper'>\n <Avatar size='medium' type=\"image\" style={{ margin: 5 }}>\n <img\n src={props.image ?? './images/placeholder.png'}\n alt={`profile image`}\n />\n </Avatar>\n {props.uId && <OnlineIndicator Uid={props.uId} />}\n </div>\n <div className=\"k-vbox\">\n <UnreadMessageCount conversationUid={props.conversationUid} />\n <h4>{props.header}</h4>\n {props.subheader && <h5>{props.subheader}</h5>}\n </div>\n </Card>\n </div>\n )\n}\n\n// export type ChatHeaderProps = {\n// chat?: IChat,\n// closeChat?:(chat:IChat)=>void\n// }","const Spinny = (props: { text?: string }) => {\n return (\n <>\n <div className=\"fixed inset-0 bg-dark-gray bg-opacity-50 transition-opacity\"></div>\n <div className=\"fixed flex items-center justify-center h-screen w-screen z-5 transition-opacity\">\n <img\n alt=\"spinny\"\n src={\"./images/rev_loading_small.gif\"}\n ></img><div className=\"ml-4\">{props.text}</div>\n </div>\n </>\n );\n};\n\nconst PartialSpinny = (props) => {\n return (\n <>\n <div className=\"absolute inset-0 bg-dark-gray bg-opacity-50 transition-opacity h-full w-full\" style={{ zIndex: props.z || 10500 }}>\n <div className=\"flex items-center justify-center h-full w-full z-5 transition-opacity\">\n <img\n alt=\"spinny\"\n src={\"./images/rev_loading_small.gif\"}\n ></img>\n </div>\n </div>\n </>\n );\n};\n\nconst SimpleSpinny = () => {\n return (\n <>\n <div className=\"flex items-center justify-center h-full w-full z-5 transition-opacity\">\n <img\n alt=\"spinny\"\n src={\"./images/rev_loading_small.gif\"}\n ></img>\n </div>\n </>\n );\n};\n\nexport { Spinny, PartialSpinny, SimpleSpinny };\n\n","import React, { useRef, useState } from 'react'\nimport { Button } from '@progress/kendo-react-buttons'\nimport { Offset, Popup } from '@progress/kendo-react-popup';\nimport { MenuProps } from './ChatOptions';\nimport { Menu, MenuItem, MenuSelectEvent } from '@progress/kendo-react-layout';\nimport { IChat } from '../types/IChat';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { useReduxDispatch } from '../redux/hooks';\nimport { CloseChat, LeaveChat, MarkAsRead } from '../redux/reducers/ChatSlice';\nimport { ChatIsUnRead } from '../util/ChatUtils';\nimport { IUserProfile } from '../types/IUserProfile';\n\nexport default function ChatMenu({ chat, profile }: { chat: IChat, profile: IUserProfile }) {\n const dispatch = useReduxDispatch();\n const [menu, setMenu] = useState<MenuProps>({} as MenuProps)\n const [closeChat] = ChatApi.useCloseChatMutation();\n const [updateChat] = ChatApi.useUpdateChatMutation();\n const [leaveChat] = ChatApi.useLeaveChatMutation();\n const [unpinChat] = ChatApi.useUnpinChatMutation();\n const { data: pins } = ChatApi.useGetPinnedChatsQuery(undefined, { skip: !profile?.Features.Chat });\n\n async function moreOptionsClick(e: MenuSelectEvent) {\n //End user leaving chat\n if (e.item.data === 4) {\n if (window.confirm('Are you sure you want to leave this Chat session')) {\n leaveChat(chat).unwrap().then(() => {\n dispatch(LeaveChat(chat));\n });\n }\n }\n\n //Mark unread\n if (e.item.data === 2)\n dispatch(MarkAsRead({ conversationId: chat.ConversationId, contactId: profile.Id, unRead: true }))\n //Mark read\n if (e.item.data === 3)\n dispatch(MarkAsRead({ conversationId: chat.ConversationId, contactId: profile.Id, unRead: false }))\n //Mark read\n //if (e.item.data === 3)\n // dispatch(MarkAsRead({ conversationId: chat.ConversationId, contactId: profile.Id, unRead: false }))\n\n\n //Close Chat\n if (e.item.data === 1) {\n if (window.confirm('Are you sure you want to permanently close this Chat?')) {\n await closeChat(chat).unwrap().then((res) => {\n dispatch(CloseChat(chat));\n });\n //Unpin the chat if it is pinned\n if (pins.find(p => p.Chat_Id === chat.Id) !== null) {\n await unpinChat(pins.find(p => p.Chat_Id === chat.Id)).unwrap();\n }\n }\n }\n\n\n setMenu(null);\n }\n const anchor = useRef();\n\n if (!profile) return <></>;\n\n\n return (\n <>\n <Button ref={anchor} title='More options' className='more-options' icon='more-horizontal' fillMode='flat'\n onBlur={(e) =>\n setTimeout(() => {\n setMenu((v) => { return { visible: false, offset: { top: 0, left: 0 } } as MenuProps });\n }, 500)}\n onClick={(e) => setMenu((v) => {\n //console.log(e.currentTarget.offsetLeft, e.currentTarget.offsetTop)\n return { visible: !v?.visible, offset: { top: e.clientY + 30, left: e.clientX - 110 } } as MenuProps\n })}></Button >\n\n <Popup show={menu?.visible}\n offset={menu?.offset}\n // anchor={anchor.current}\n anchorAlign={{ horizontal: 'left', vertical: 'center' }} className='chat-menu' collision={{ horizontal: 'fit', vertical: 'fit' }} >\n <Menu openOnClick={true} onSelect={moreOptionsClick} vertical={true} >\n {profile?.Features.Chat && !chat.IsClosed && (ChatIsUnRead(profile?.Uid, chat)\n ? <MenuItem text='Mark as read' data={3} icon='eye' />\n : <MenuItem text='Mark as unread' data={2} icon='eye' />)}\n {profile?.Features.Chat && <MenuItem text='Full screen' data={0} icon='fullscreen' url={`./chat/${chat.ConversationId}`} />}\n {profile?.Features.Chat && <MenuItem text={`Log ${profile.Phrases.CallPhrase}`} data={0} icon='login' url={`./ticket/fromchat/${chat.ConversationId}/`} />}\n {profile?.Features.Chat && !chat?.IsClosed && <MenuItem text='Close Chat' data={1} icon='close-circle' />}\n {/* End user option to leave chat */}\n {profile?.Features.SSIChat && <MenuItem text='Leave Chat' data={4} icon='close-circle' />}\n </Menu>\n </Popup>\n </>\n )\n}\n","import React, { useEffect, useMemo, useRef } from 'react'\nimport { Chat as ChatUI, Message, User as ChatUser, ChatMessageBoxProps } from \"@progress/kendo-react-conversational-ui\";\nimport { Button } from \"@progress/kendo-react-buttons\";\nimport '../App.scss';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { IChatMessage } from '../types/IChatMessage';\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { AddMessage, CloseChat, MarkAsRead, PostMessage, StaffJoined, TypingMessage, ChatStarted, LeaveChat } from '../redux/reducers/ChatSlice';\nimport { IChatHeaderProps, IChatProps } from '../types/IChatProps';\nimport ChatHeader from './ChatHeader';\nimport { PartialSpinny, SimpleSpinny } from './Common/Spinny';\nimport { TextArea, TextAreaHandle } from '@progress/kendo-react-inputs';\nimport ChatMenu from './ChatMenu';\nimport { ITicket } from '../types/ITicket';\n\nexport default function Chat(props: IChatProps) {\n const navigate = useNavigate();\n const { id } = useParams();\n const chatId = props.id || id;\n const dispatch = useReduxDispatch();\n const config = useReduxSelector(s => s.chat?.config);\n const [postTicket, { isLoading: loggingTicket }] = ChatApi.useCreateTicketMutation();\n const { data: chat } = ChatApi.useGetChatQuery(chatId, { skip: !chatId });\n const { data: chatMessages, isFetching: fetchingMessages } = ChatApi.useGetMessagesQuery(chatId, { skip: !chatId });\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n ChatApi.useGetConfigQuery(); //Required for playing sounds in the middleware\n const [acceptChat, { isLoading: joiningChat }] = ChatApi.useAcceptChatMutation();\n const [closeChat] = ChatApi.useCloseChatMutation();\n const [error, setError] = React.useState<string>(\"\");\n const [message, setMessage] = React.useState<string>(\"\");\n const [user, setUser] = React.useState<ChatUser>();\n const [leaveChat, { isLoading: leavingChat }] = ChatApi.useLeaveChatMutation();\n const [cursor, setCursor] = React.useState(null);\n\n //Load user Profile\n useEffect(() => {\n if (userProfile && chat) {\n const displayName = chat.EndUserContact_Id == userProfile?.Id ? chat.End_User : chat.Staff_From_Name;\n const profileImage = displayName == \"Support Person\" ? null : userProfile.Profile_Image_Url; //No profile image in Anonymous mode\n setUser({ id: userProfile?.Id, name: displayName, avatarUrl: profileImage } as ChatUser)\n }\n }, [userProfile, chat])\n\n\n const addNewMessage = (event: { message: Message; }) => {\n console.log('addNewMessage')\n var newMessage = { Id: 0, Chat_Id: chat?.Id, Is_Event: false, ConversationId: chat?.ConversationId, Text: event.message.text as string, From: user?.name, Created: new Date().toISOString(), Contact_Id: user?.id, Profile_Image: user?.avatarUrl as string } as IChatMessage\n\n //Post to Server with Signal R\n dispatch(PostMessage(newMessage));\n //Add to local storage for instant view\n dispatch(AddMessage(newMessage));\n\n };\n\n const messageBox = useRef<TextAreaHandle>(null);\n\n const sendMessage = () => {\n console.log('sendMessage', message);\n let sendMessage = message//messageBox.current.value; //_message || message;\n if (sendMessage) {\n var newMessage = { Id: 0, Chat_Id: chat?.Id, Is_Event: false, ConversationId: chat?.ConversationId, Text: sendMessage as string, From: user?.name, Created: new Date().toISOString(), Contact_Id: user?.id, Profile_Image: user?.avatarUrl as string } as IChatMessage\n var newChat = !chat.Last_Message_Contact_Id;\n\n //Post to Server with Signal R\n dispatch(PostMessage(newMessage));\n //Add to local storage for instant view\n dispatch(AddMessage(newMessage));\n\n //Tell the signal R server that a new chat may have started so the other staff gets notified.\n console.log('ChatStarted? newChat=', newChat)\n newChat && dispatch(ChatStarted(chat));\n\n setMessage(\"\");\n }\n };\n\n //The messages to render from storage - useMemo(() => \n const elementRef = useRef<HTMLDivElement>();\n useEffect(() => elementRef.current?.scrollIntoView());\n var renderMessages = useMemo(() => {\n const renderItems = chatMessages && [...chatMessages];\n if (!chat?.StaffContact_Id && userProfile?.Features.SSIChat) { renderItems?.push({ Chat_Id: chat?.Id, Is_Event: true, Text: 'Waiting for Support Staff to join...', Created: new Date().toISOString(), Contact_Id: chat?.EndUserContact_Id, Profile_Image: chat?.EndUser_Profile_Path } as IChatMessage) }\n\n return renderItems?.filter(c => c.Chat_Id === chat?.Id)?.map((cm, index) => {\n return cm.Is_Event ? {\n //Event\n text: (index === chatMessages.length - 1 ? <div ref={elementRef} className=\"event\" dangerouslySetInnerHTML={{ __html: cm.Text }}></div> : <span className=\"event\" dangerouslySetInnerHTML={{ __html: cm.Text }}></span>),\n author: {\n id: cm.Contact_Id,\n }\n }\n : {\n text: (index === chatMessages.length - 1 ? <div ref={elementRef}>{cm.Text}</div> : cm.Text),\n timestamp: new Date(cm.Created),\n author: {\n id: cm.Contact_Id,\n name: cm.From,\n avatarUrl: cm.Profile_Image\n }\n } as Message\n }) as Message[]\n }, [chat, chatMessages, userProfile]);\n\n\n //Close the chat.\n const closeCurrentChat = async () => {\n if (!window.confirm('Are you sure you want to close this chat?'))\n return;\n\n await closeChat(chat).unwrap().then((res) => {\n dispatch(CloseChat(chat));\n });\n }\n\n //Staff accepts a chat request.\n const acceptRequest = async () => {\n console.log('acceptRequest');\n\n await acceptChat(chat).unwrap().then((res) => {\n\n console.log('before StaffJoined', res);\n\n //Tell chat Server we have joined the chat\n dispatch(StaffJoined(chat));\n\n console.log('dispatch StaffJoined');\n\n }).catch(ex => {\n console.error(ex);\n setError(ex['data']);\n });\n\n\n }\n\n const isRequest = !chat?.StaffContact_Id;\n const isClosed = chat?.IsClosed;\n const endUserLeft = chat?.EndUser_Left;\n const notPartOfConversation = chat?.EndUserContact_Id !== userProfile?.Id && chat?.StaffContact_Id !== userProfile?.Id;\n let headerProps: IChatHeaderProps = (chat?.EndUserContact_Id === userProfile?.Id\n ? { image: chat?.Staff_Profile_Path, header: chat?.EndUser_Header, subheader: chat?.EndUser_Sub_Header, uId: chat?.Staff_Uid }\n : { image: chat?.EndUser_Profile_Path, header: chat?.Staff_Header || chat?.End_User, subheader: chat?.Staff_Sub_Header, uId: chat?.EndUser_Uid }) as IChatHeaderProps\n headerProps = { ...headerProps, closeChat: closeCurrentChat, isClosed: chat?.IsClosed, showOptions: props.showOptions, conversationUid: chat?.ConversationId }\n\n //Set a timer to switch to Log ticket controls after a certain amount of time.\n const [showLogControls, setLogControls] = React.useState<boolean>(false);\n useEffect(() => {\n const timer = setInterval(() => {\n //console.log('LogControls', (new Date().getTime() - new Date(chat?.Created + 'Z').getTime()) / 1000.0, 'Show_Log_Option_After_Mins', config.Show_Log_Option_After_Mins, 'Created', chat?.Created);\n if (userProfile?.Features.SSIChat && isRequest && config.Show_Log_Option && chat?.Created && ((new Date().getTime() - new Date(chat?.Created + 'Z').getTime()) / 1000.0) > config.Show_Log_Option_After_Mins) {\n setLogControls(true);\n clearInterval(timer);\n } else {\n setLogControls(false);\n }\n }, 1000);\n\n return () => {\n clearInterval(timer);\n }\n }, [chat])\n\n const logTicket = async () => {\n const newTicket = {\n Ticket_Source_Id: 9,\n Company_Id: userProfile?.Company_Id,\n Company_Contact: userProfile?.Id,\n Company_Contact_Uid: userProfile?.Uid,\n Call_Desc: \"Logged from chat: \" + chatMessages?.filter(m => !m.Is_Event).map(m => m.Text).join('\\r\\n'),\n } as ITicket;\n\n //log a ticket via the API and show a success message\n try {\n var createdTicket = await postTicket(newTicket).unwrap() as ITicket;\n\n var eventMessage = `${user?.name} logged ${userProfile?.Phrases.CallPhrase} <a href='/calls/callhistory.aspx?call_id=${createdTicket.ID}'>#${createdTicket.ID}</a> from chat.`\n var newMessage = { Id: 0, Chat_Id: chat?.Id, Is_Event: true, ConversationId: chat?.ConversationId, Text: eventMessage, From: user?.name, Created: new Date().toISOString(), Contact_Id: user?.id, Profile_Image: user?.avatarUrl as string } as IChatMessage\n\n //Post to Server with Signal R\n dispatch(PostMessage(newMessage));\n\n //Leave the chat\n const result = await leaveChat(chat).unwrap().then((res) => {\n //Tell chat Server we have closed the chat\n dispatch(LeaveChat(chat));\n });\n\n navigate(`/deeplink?url=/Calls/CallLoggedSuccessfully.aspx?Call_Id=${createdTicket.ID}`, { replace: true });\n } catch (ex) {\n setError(`Error logging ${userProfile?.Phrases.CallPhrase} from Chat:` + ex['data']);\n }\n }\n\n useEffect(() => {\n const input = messageBox.current;\n if (input) input.element.current.setSelectionRange(cursor, cursor);\n }, [messageBox, cursor, message]);\n\n\n const customMessageBox = (props: ChatMessageBoxProps) => {\n if (error) return <div className='k-form-error'>{error}</div>\n\n //Show option to log a ticket after wainting for the configured amount of time.\n if (showLogControls) return <>\n <p>All our technitians are busy helping others, would you like to log a {userProfile?.Phrases.CallPhrase} instead?</p>\n <Button onClick={logTicket} className='chat-yes-button' themeColor={\"primary\"} size='large' icon='check'>Yes</Button>\n <Button onClick={() => setLogControls(false)} className='chat-accept-button m-1' themeColor={\"secondary\"} size='large' icon='close'>No</Button>\n </>;\n\n return (\n !isClosed && isRequest && !userProfile?.Features.SSIChat\n ?\n <>\n {joiningChat\n ? <SimpleSpinny />\n : <Button onClick={acceptRequest} className='chat-accept-button' themeColor={\"primary\"} size='large' icon='check'>Accept Chat Request</Button>\n }\n </>\n :\n <>\n <TextArea disabled={isClosed || endUserLeft || notPartOfConversation} ref={messageBox} autoFocus style={{ maxHeight: 80 }} autoSize={true} rows={1}\n onBeforeInput={() => dispatch(TypingMessage(chat))}\n value={message}\n onChange={(e) => {\n setCursor(messageBox.current.element.current.selectionStart);\n setMessage(e.value);\n }}\n onKeyPress={(e) => {\n //console.log('onKeyPress', e.currentTarget)\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n sendMessage();\n }\n }}\n\n />\n\n {!isClosed && !endUserLeft && !notPartOfConversation &&\n <Button className='send-button' title='Send message' fillMode='flat' onClick={() => sendMessage()}><svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 16 16\"><path d=\"M0,14.3c-0.1,0.6,0.3,0.8,0.8,0.6l14.8-6.5c0.5-0.2,0.5-0.6,0-0.8L0.8,1.1C0.3,0.9-0.1,1.1,0,1.7l0.7,4.2C0.8,6.5,1.4,7,1.9,7.1l8.8,0.8c0.6,0.1,0.6,0.1,0,0.2L1.9,8.9C1.4,9,0.8,9.5,0.7,10.1L0,14.3z\"></path></svg>\n </Button>}\n <ChatMenu chat={chat} profile={userProfile} />\n </>\n );\n };\n var customMessageBoxMem = useMemo(() => customMessageBox, [chat, user, message, showLogControls]);\n\n if (!chat) return <></>\n //const chatUidRef = useRef<ChatUI>();\n //chatUidRef.current?.forceUpdate();\n\n return (\n <div className='chat-wrapper'>\n {isClosed && <i className='chat-status'>This chat has been closed.</i>}\n {(loggingTicket || leavingChat) && <PartialSpinny />}\n {props.showHeader &&\n <ChatHeader {...headerProps} />}\n\n <ChatUI onToolbarActionExecute={(e) => console.log('action', e)} onActionExecute={(e) => console.log('action', e)}\n user={user as ChatUser}\n messages={renderMessages}\n onMessageSend={addNewMessage}\n width={400}\n showToolbar={false}\n messageBox={customMessageBoxMem}\n />\n {/* </Provider> */}\n </div>\n )\n\n}\n\nconst AlwaysScrollToBottom = () => {\n const elementRef = useRef<HTMLDivElement>();\n useEffect(() => elementRef.current.scrollIntoView());\n return <div ref={elementRef}>bottom</div>;\n};","import { IChat } from '../types/IChat'\nimport { Avatar, Card, CardBody, CardHeader, CardSubtitle, CardTitle } from '@progress/kendo-react-layout'\nimport ReactTimeago from 'react-timeago'\nimport { ChatApi } from '../redux/api/ChatApi'\nimport OnlineIndicator from './OnlineIndicator'\nimport { ChatIsUnRead } from '../util/ChatUtils'\nimport TimeAgo from \"javascript-time-ago\";\nimport en from \"javascript-time-ago/locale/en.json\";\nTimeAgo.addDefaultLocale(en);\n\nexport const ChatListItem = (chat: IChat) => {\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n\n let rgx = new RegExp(/(\\p{L}{1})\\p{L}+/, 'gu');\n let name = chat.Staff_Header || chat.End_User;\n let initials = [...name.matchAll(rgx)] || [];\n //console.log('initials', initials)\n let letters = (\n (initials.shift()?.[1] || '') + (initials.pop()?.[1] || '')\n ).toUpperCase();\n\n if (!userProfile || !chat)\n return <></>\n\n return (\n\n <Card orientation=\"horizontal\" style={{ width: '100%' }} className={ChatIsUnRead(userProfile.Uid, chat) ? 'unread chat-item' : 'chat-item'}>\n <span className=\"dot\"></span>\n <span title={chat.End_User} className='profile-wrapper'>\n <OnlineIndicator Uid={chat.EndUserContact_Id === userProfile?.Id ? chat.Staff_Uid : chat.EndUser_Uid} />\n {chat.EndUser_Profile_Path && chat.EndUser_Profile_Path?.indexOf('placeholder') > -1\n ? <Avatar className='avatar' size='medium' type=\"text\">\n {letters}\n </Avatar>\n : <Avatar className='avatar' size='small' type=\"image\">\n <img\n src={(chat.EndUserContact_Id === userProfile?.Id ? chat.Staff_Profile_Path : chat.EndUser_Profile_Path) ?? './images/placeholder.png'}\n alt={`profile image`}\n />\n </Avatar>\n }\n </span>\n <div className=\"k-vbox\">\n <CardHeader>\n {/* {ChatIsUnRead(userProfile.Uid, chat) ? 'unread' : 'read'} */}\n <CardTitle>{chat.EndUserContact_Id === userProfile?.Id ? chat.Staff_Name : chat.Staff_Header}</CardTitle>\n <CardSubtitle style={{ fontSize: '14px' }}>\n {/* <div>{chat.Last_Message_Date}</div>\n <div>{chat.EndUser_Last_Read}</div>\n <div>{chat.Staff_Last_Read}</div> */}\n <div className='truncate' style={{ width: 200 }}>{chat.Last_Message_Contact_Id == userProfile?.Id ? 'You: ' : ''} {chat.Last_Message}</div>\n </CardSubtitle>\n </CardHeader>\n </div>\n <div style={{ margin: 0, fontSize: \"0.7em\" }}>\n {chat.Last_Message_Date && <ReactTimeago date={new Date(chat.Last_Message_Date + 'Z')} minPeriod={60} />}\n </div>\n </Card>\n\n )\n}\n","import { Checkbox, InputClearValue, InputPrefix, TextBox } from '@progress/kendo-react-inputs'\nimport { Icon } from '@progress/kendo-react-common';\nimport { Loader } from '@progress/kendo-react-indicators';\nimport React, { useState } from 'react'\nimport './Chat.scss'\n\nexport default function ChatFilter(props: { onFilterChange(val: FilterProps) }) {\n const [filter, setFilter] = useState<FilterProps>({} as FilterProps)\n return (\n <div className='chat-filter'>\n <TextBox className='chat-search'\n value={filter.search}\n onChange={(e) => {\n //console.log('onChange')\n setFilter((prev) => {\n var newFilter = { ...prev, search: e.value.toString().toLocaleLowerCase() }\n props.onFilterChange(newFilter);\n return newFilter;\n });\n\n }}\n placeholder=\"Search...\"\n prefix={() => (\n <InputPrefix>\n <Icon name=\"search\" />\n </InputPrefix>)\n }\n suffix={() => (\n <>\n {filter.search && (\n <InputClearValue onClick={() => {\n setFilter(p => {\n var newFilter = { ...p, search: null }\n props.onFilterChange(newFilter);\n return newFilter;\n })\n }}>\n <Icon name=\"x\" />\n </InputClearValue>\n )}\n {false && <Loader type='pulsing' themeColor='secondary' />}\n </>\n )}\n />\n <Checkbox checked={filter.closed} onChange={(e) => {\n setFilter((prev) => {\n var newFilter = { ...prev, closed: e.value }\n props.onFilterChange(newFilter);\n return newFilter;\n });\n }} label={'Include closed chats'} />\n </div>\n )\n}\n\nexport type FilterProps = {\n search: string\n closed: boolean\n}","import React, { useEffect } from 'react'\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { ChatVisibility } from '../types/ChatVisibility';\nimport { ChatIsUnRead } from '../util/ChatUtils';\n\nexport default function ChatCount(props: { showLabel?: boolean, showZero?: boolean }) {\n const dispatch = useReduxDispatch();\n const { data: visibility } = ChatApi.useGetMyVisibilityQuery();\n const { notifications } = useReduxSelector(s => s.chat);\n const { data: chats } = ChatApi.useGetChatsQuery();\n const { requests, config } = useReduxSelector(s => s.chat);\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n\n //console.log('ChatCount', chats?.length, requests?.length);\n //The unread count is any chat who's last read date is less than the last message date\n const unreadChats = chats?.concat(requests).filter(c => ChatIsUnRead(userProfile?.Uid, c));\n\n useEffect(() => {\n if (!userProfile) return;\n\n if (config && unreadChats?.length && visibility?.Visibility !== ChatVisibility.Offline && notifications !== null) {\n document.title = `(${unreadChats?.length}) ${userProfile?.Site_Title}}`;\n } else {\n document.title = `${userProfile?.Site_Title}}`;\n }\n }, [chats, requests, userProfile, config])\n\n\n if (props.showLabel == false || visibility?.Visibility == ChatVisibility.Offline)\n return <></>\n\n if (unreadChats?.length || props.showZero)\n return (\n <>{unreadChats?.length || 0}</>\n )\n}\n","\nimport React, { useRef, useState } from 'react'\nimport { Offset, Popup } from '@progress/kendo-react-popup';\nimport { Menu, MenuItem, MenuSelectEvent } from '@progress/kendo-react-layout';\nimport { MenuOption } from '../types/MenuOption';\nimport { Button } from \"@progress/kendo-react-buttons\";\nimport { MenuProps } from './ChatOptions';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { SetVisibility } from '../redux/reducers/ChatSlice';\n\n\nexport default function ChatVisibilityMenu() {\n const dispatch = useReduxDispatch();\n const staffOnline = useReduxSelector(r => r.chat.usersOnline);\n const { data: userProfile, error } = ChatApi.useGetProfileQuery();\n const { data } = ChatApi.useGetMyVisibilityQuery();\n const [updateVisibility] = ChatApi.useUpdateUserVisibilityMutation();\n const [menu, setMenu] = useState<MenuProps>({} as MenuProps)\n const options: MenuOption[] = [\n {\n id: userProfile?.Uid,\n title: 'Your visibility',\n image: data?.Visibility == 0 ? './images/chat_off.jpg' : data?.Visibility == 2 ? './images/chat_all.jpg' : './images/chat_internal.jpg',\n onclick: () => { },\n visibility: data?.Visibility,\n } as MenuOption,\n\n ]\n\n const menuItemSelected = (e: MenuSelectEvent) => {\n //Fire the click event for this option\n console.log('menuItemSelected', e.item.data);\n\n //Update the visibility via the API\n updateVisibility({ Visibility: e.item.data, Contact_Id: userProfile.Id, ID: 0 }).unwrap()\n .then(() => {\n //reconnect to signalR\n console.log('reconnect to signalR')\n dispatch(SetVisibility(e.item.data));\n });\n\n //Hide the menu\n setMenu(null);\n }\n\n\n return (\n <>\n <Button className='' icon='more-horizontal' fillMode='flat' onClick={(e) => setMenu((v) => {\n //console.log(e.currentTarget.offsetLeft, e.currentTarget.offsetTop)\n return { visible: !v?.visible, offset: { top: e.clientY + 20, left: e.clientX - 150 } } as MenuProps\n })}></Button>\n <Popup show={menu?.visible}\n offset={menu?.offset}\n anchorAlign={{ horizontal: 'right', vertical: 'bottom' }} className='chat-menu' collision={{ horizontal: 'fit', vertical: 'fit' }} >\n <Menu className='chat-header-menu' vertical={true} style={{ display: \"inline-block\" }} onSelect={menuItemSelected} openOnClick={false} hoverCloseDelay={100} >\n {options.map(o => (\n <MenuItem key={-1} render={() => {\n return <div> <img src={o.image} className='tool-image' /><span>{o.title}</span></div>\n }} icon={o.icon?.replace('k-i-', '')} text={o.title} data={o.id} >\n <MenuItem key={0} data={2} render={() => {\n return <div className='vis-menu-option'><span>Internal / External</span>{o.visibility === 2 && <span className='k-icon k-i-check-circle'></span>}</div>\n }} ></MenuItem>\n <MenuItem key={1} data={1} render={() => {\n return <div className='vis-menu-option'><span>Internal</span>{o.visibility === 1 && <span className='k-icon k-i-check-circle'></span>}</div>\n }} ></MenuItem>\n <MenuItem key={2} data={0} render={() => {\n return <div className='vis-menu-option'><span>Offline</span>{o.visibility === 0 && <span className='k-icon k-i-check-circle'></span>}</div>\n }} >\n </MenuItem>\n </MenuItem>\n ))}\n </Menu>\n </Popup>\n </>\n )\n}\n\n\n\n","import { Avatar, Card, CardHeader, CardSubtitle, CardTitle, Menu, MenuItem, MenuSelectEvent } from '@progress/kendo-react-layout'\nimport { ChatApi } from '../redux/api/ChatApi'\nimport IChatUser from '../types/IChatUser'\nimport OnlineIndicator from './OnlineIndicator';\nimport { Link } from 'react-router-dom';\nimport { useReduxDispatch } from '../redux/hooks';\nimport { ChatStarted, DisconnectUser } from '../redux/reducers/ChatSlice';\nimport { IChat } from '../types/IChat';\n\nexport const UserListItem = ({ user, onChatStarted }: { user: IChatUser, onChatStarted: (chat: IChat) => void }) => {\n const dispatch = useReduxDispatch();\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n const [updateVisibility] = ChatApi.useUpdateUserVisibilityMutation();\n const [continueChat] = ChatApi.useContinueChatMutation();\n\n let rgx = new RegExp(/(\\p{L}{1})\\p{L}+/, 'gu');\n let initials = [...user.Name.matchAll(rgx)] || [];\n //console.log('initials', initials)\n let letters = (\n (initials.shift()?.[1] || '') + (initials.pop()?.[1] || '')\n ).toUpperCase();\n\n if (!userProfile)\n return <></>\n\n function moreOptionsClick(e: MenuSelectEvent) {\n e.syntheticEvent.stopPropagation();\n e.syntheticEvent.preventDefault();\n console.log('moreOptionsClick', e);\n if (e.item.data === 0) {\n continueStaffChat(e);\n }\n\n if (e.item.data === 1) {\n updateVisibility({ ID: 0, Contact_Id: user.Contact_Id, Visibility: 0 }).unwrap().then(() => {\n //Tell the Signal R backend this user was booted.\n console.log(user.Contact_Id + ' was booted from the chat')\n dispatch(DisconnectUser(user));\n });\n }\n //\n }\n\n function continueStaffChat(e) {\n\n console.log('continueStaffChat', userProfile.Id, user.Contact_Id)\n //Start chat with user.\n continueChat({ StaffContact_Id: userProfile.Id, EndUserContact_Id: user.Contact_Id } as IChat).unwrap().then((chat: IChat) => {\n console.log('chat continued...', chat);\n onChatStarted(chat);\n\n //Only do this once we post the first message to the user - that will POP the chat open and pin it\n //Tell the signal R server that a new chat may have started so the other staff gets notified.\n //dispatch(ChatStarted(chat));\n });\n }\n\n return (\n <Link to='#' onClick={continueStaffChat}>\n <Card orientation=\"horizontal\" className='user-card'>\n <span title={user.Name} className='profile-wrapper'>\n <OnlineIndicator Uid={user.UId} />\n {!user.Profile_Image_Url || user.Profile_Image_Url?.indexOf('placeholder') > -1\n ? <Avatar className='avatar' size='medium' type=\"text\">\n {letters}\n </Avatar>\n : <Avatar className='avatar' size='small' type=\"image\">\n <img\n src={user.Profile_Image_Url}\n alt={`profile image`}\n />\n </Avatar>\n }\n </span>\n <div className=\"k-vbox\">\n <CardHeader>\n <CardTitle>{user.Name}</CardTitle>\n <CardSubtitle style={{ fontSize: '14px' }}>\n {user.Team}\n </CardSubtitle>\n </CardHeader>\n </div>\n\n <div className='chat-user-menu'>\n <Menu openOnClick={true} onSelect={moreOptionsClick} >\n <MenuItem linkRender={() => { return <Link to='#' className='k-icon k-i-more-horizontal'></Link> }} >\n <MenuItem text='Chat' data={0} icon='comment' />\n <MenuItem text='Disconnect User' data={1} icon='close-circle' />\n </MenuItem>\n </Menu>\n </div>\n </Card >\n </Link>\n )\n}\n","import { Card, CardBody, CardHeader, CardTitle } from '@progress/kendo-react-layout'\nimport { DropDownList, DropDownListChangeEvent } from \"@progress/kendo-react-dropdowns\";\nimport React from 'react'\nimport { PartialSpinny } from './Common/Spinny';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { SetVisibility } from '../redux/reducers/ChatSlice';\nimport { useReduxDispatch } from '../redux/hooks';\n\nexport default function UserOffline() {\n const dispatch = useReduxDispatch();\n const { data: myVisibility } = ChatApi.useGetMyVisibilityQuery();\n const [updateVisibility, { isLoading }] = ChatApi.useUpdateUserVisibilityMutation();\n const items = [\n { text: \"Internal / External\", id: 2, img: '/images/chat_all.jpg' },\n { text: \"Internal\", id: 1, img: '/images/chat_internal.jpg' },\n ]\n\n const itemRender = (li, itemProps) => {\n const index = itemProps.index;\n //console.log('li.props', li.props, itemProps);\n const itemChildren = (\n <span className=\"k-hbox\">\n <img src={itemProps.dataItem.img} alt={itemProps.dataItem.text} />\n\n <span className='ml-1'>{itemProps.dataItem.text}</span>\n </span>\n );\n return React.cloneElement(li, li.props, itemChildren);\n };\n\n const changeVisibility = (e: DropDownListChangeEvent) => {\n updateVisibility({ ID: 0, Contact_Id: myVisibility.Contact_Id, Visibility: e.target.value.id }).unwrap()\n .then(() => {\n //reconnect to signalR\n dispatch(SetVisibility(e.target.value.id));\n });\n }\n\n return (\n <div className='chat-user-offline'>\n <Card>\n <CardHeader className=\"k-hbox\">\n <img src='/images/chat_off.jpg' width={'34px'} height={'30px'} />\n <CardTitle>\n You are currently offline</CardTitle>\n </CardHeader>\n <CardBody>\n Select your visibility status to go online:\n <DropDownList\n textField=\"text\"\n dataItemKey='id'\n data={items}\n itemRender={itemRender}\n defaultItem={{ text: \"Select ...\" }}\n style={{\n width: \"200px\",\n }}\n onChange={changeVisibility}\n />\n </CardBody>\n\n {isLoading && <PartialSpinny />}\n\n </Card>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ChatApi } from '../redux/api/ChatApi'\nimport { ChatListItem } from './ChatListItem';\nimport './Chat.scss'\nimport { IChatProps } from '../types/IChatProps';\nimport { Link, useNavigate } from 'react-router-dom';\nimport ChatFilter, { FilterProps } from './ChatFilter';\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport ChatCount from './ChatCount';\nimport { Badge, BadgeContainer } from '@progress/kendo-react-indicators';\nimport { Button } from '@progress/kendo-react-buttons';\nimport { IChat } from '../types/IChat';\nimport { TabStrip, TabStripContent, TabStripTab } from '@progress/kendo-react-layout';\nimport ChatVisibilityMenu from './ChatVisibilityMenu';\nimport { UserListItem } from './UserListItem';\nimport UserOffline from './UserOffline';\nimport { PartialSpinny } from './Common/Spinny';\nimport IChatPin from '../types/IChatPin';\nimport ChatMenu from './ChatMenu';\nimport { MarkAsRead } from '../redux/reducers/ChatSlice';\nimport { ChatIsUnRead } from '../util/ChatUtils';\n\nexport default function ChatList(props: IChatProps) {\n const navigate = useNavigate();\n const usersOnline = useReduxSelector(s => s.chat.usersOnline);\n //const chats = useReduxSelector(s => s.chat.chats);\n const [filter, setFilter] = useState<FilterProps>({ closed: false } as FilterProps)\n const requests = useReduxSelector(s => s.chat.requests);\n const { data: chats } = ChatApi.useGetChatsQuery(filter?.closed); //Needed to populate the ChatSlice\n const { data: pins } = ChatApi.useGetPinnedChatsQuery();\n const { data: profile } = ChatApi.useGetProfileQuery();\n const { data: visibility } = ChatApi.useGetMyVisibilityQuery();\n const [updateChat] = ChatApi.useUpdateChatMutation();\n const [pinChat] = ChatApi.usePinChatMutation();\n\n const [filterVisible, setFilterVisible] = useState<boolean>(!props.showHeader)\n const dispatch = useReduxDispatch();\n const [selected, setSelected] = React.useState(0);\n const handleSelect = (e) => {\n setSelected(e.selected);\n };\n\n\n var renderItems = chats?.concat(requests).filter(c => c && (!c.IsClosed || filter.closed))\n .map(c => {\n return { ...c, sortOrder: (c.StaffContact_Id ? new Date(c?.Last_Message_Date).getTime() : (new Date().getTime() + c?.Id)) }\n })\n .filter(c => c.End_User?.toLocaleLowerCase().startsWith(filter.search) || c.Staff_Name?.toLocaleLowerCase().startsWith(filter.search) || !filter.search)\n .sort((c, c2) => {\n return c2.sortOrder - c.sortOrder //(c.StaffContact_Id ? new Date().getTime() : new Date(c?.Last_Message_Date).getTime() - new Date(c2?.Last_Message_Date).getTime())\n //return new Date(c?.Last_Message_Date).getTime() - new Date(c2?.Last_Message_Date).getTime();\n })\n\n useEffect(() => {\n console.log('ChatList.tsx', 'chats updated', chats?.length)\n }, [chats]);\n\n\n const chatItemClicked = (e, c: IChat) => {\n\n if (props.chatClicked) {\n e.preventDefault();\n e.stopPropagation();\n\n props.chatClicked(c.ConversationId)\n }\n if (props.pinChatOnClick) {\n e.preventDefault();\n e.stopPropagation();\n\n console.log('chatItemClicked', c.Staff_Expanded, c.EndUser_Expanded);\n\n //If the chat is not expanded, expand it and pin it\n if (c.Staff_Uid === profile.Uid)\n !c.Staff_Expanded && updateChat({ ...c, Staff_Expanded: true, Staff_Pinned: true } as IChat).unwrap();\n else\n !c.EndUser_Expanded && updateChat({ ...c, EndUser_Expanded: true } as IChat).unwrap();\n\n if (pins.find(p => p.ConversationId === c.ConversationId && p.Pinned) == null)\n pinChat({ Chat_Id: c.Id, Contact_Id: profile.Id, Pinned: true, ConversationId: c.ConversationId } as IChatPin).unwrap();\n\n }\n\n //mark the chat as read\n if (ChatIsUnRead(profile.Uid, c))\n dispatch(MarkAsRead({ conversationId: c.ConversationId, contactId: profile.Id, unRead: false }));\n }\n\n function chatStarted(chat: IChat) {\n if (props.pinChatOnClick) {\n pinChat({ Chat_Id: chat.Id, Contact_Id: profile.Id, Pinned: true, ConversationId: chat.ConversationId } as IChatPin).unwrap();\n } else {\n navigate(`/chat/${chat.ConversationId}`);\n }\n }\n\n if (!visibility || !renderItems)\n return <PartialSpinny />\n\n //Only show staff that are online and not the current user\n const staff = usersOnline?.filter(u => u.Is_Staff && u.UId !== profile?.Uid);\n const userOnline = (visibility.Visibility === 1 || visibility.Visibility === 2);\n\n return (\n <div className='chat-list'>\n {props.showHeader &&\n <header className='header-bar'>\n <Button icon='menu' fillMode='flat' onClick={props.toggleExpanded} ></Button>\n <h5><BadgeContainer><Badge align={{ horizontal: 'start', vertical: 'top' }} position='outside' rounded={'full'}><ChatCount /></Badge>Active Chats</BadgeContainer></h5>\n <Button icon='search' fillMode='flat' onClick={() => setFilterVisible((prev) => !prev)}></Button>\n <ChatVisibilityMenu />\n </header>}\n {userOnline && filterVisible && <ChatFilter onFilterChange={(val) => setFilter(val)} />}\n {userOnline ?\n <TabStrip selected={selected} onSelect={handleSelect} className='chat-tabs'>\n <TabStripTab title={<span>Active Chats {renderItems.length && <>(<ChatCount showZero={true} />/{renderItems.length})</>}</span>}>\n {renderItems?.map(c =>\n <div className='chat-item' key={c?.Id}>\n <Link to={`./chat/${c?.ConversationId}/dialog`} onClick={(e) => chatItemClicked(e, c)}>\n <ChatListItem {...c} />\n </Link>\n <ChatMenu chat={c} profile={profile} />\n </div>\n )}\n {!renderItems?.length && <div className='m-5 k-notification-info'><span className='k-icon k-i-info m-2'></span>No active chats</div>}\n </TabStripTab>\n <TabStripTab title={`Online Staff (${staff?.length || '0'})`}>\n {staff.map(s => <UserListItem key={s?.UId} user={s} onChatStarted={chatStarted} />)}\n {!staff?.length && <div className='m-5 k-notification-warning'><span className='k-icon k-i-info m-2'></span>No staff currently online</div>}\n </TabStripTab>\n </TabStrip>\n :\n <UserOffline />}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport {\n Drawer,\n DrawerContent,\n DrawerItem,\n DrawerItemProps,\n DrawerSelectEvent,\n} from \"@progress/kendo-react-layout\";\nimport Chat from './Chat';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { Route, Routes, useNavigate, useParams } from 'react-router-dom';\nimport { Button } from \"@progress/kendo-react-buttons\";\nimport \"./Chat.scss\"\nimport { useReduxDispatch } from '../redux/hooks';\nimport { ChatListItem } from './ChatListItem';\nimport { IChat } from '../types/IChat';\nimport ChatFilter, { FilterProps } from './ChatFilter';\nimport ChatList from './ChatList';\n\nexport default function ChatPage() {\n const navigate = useNavigate()\n const { id } = useParams()\n const dispatch = useReduxDispatch();\n //const storage = useReduxSelector(s => s.chat.chats);\n const [expanded, setExpanded] = React.useState(true);\n const { data: chats } = ChatApi.useGetChatsQuery();\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n const [filter, setFilter] = useState<FilterProps>({} as FilterProps)\n\n //Sort by last message date\n const renderItems = chats?.slice().sort((c, c2) => {\n return (new Date(c2?.Last_Message_Date).getTime() - new Date(c?.Last_Message_Date).getTime())\n }\n ).filter(c => c).map(c => {\n return c ? {\n chat: c,\n unread: new Date(c?.Last_Message_Date).getTime() >= new Date(c?.Staff_Last_Read).getTime(),\n selected: c?.ConversationId === id,\n menu: false,\n text: c?.End_User,\n route: `/chat/${c.ConversationId}`,\n subtext: `${c?.Last_Message_Contact_Id == userProfile?.Id ? 'You' : c?.Last_Message_By}: ${c.Last_Message}`,\n last: c?.Last_Message_Date,\n image: c?.EndUser_Profile_Path\n } : {} as RenderProps\n })\n\n const CustomItem = (props: DrawerItemProps) => {\n return (\n <DrawerItem {...props} className={props.unread == true ? 'unread chat-item' : 'chat-item'}>\n {props.menu == true ?\n <>\n <Button icon=\"menu\" fillMode=\"flat\" onClick={() => setExpanded((currentVal) => !currentVal)} style={{ marginLeft: 21, marginRight: 21 }} />\n <div><ChatFilter onFilterChange={(val) => setFilter(val)} /></div>\n </>\n : <ChatListItem {...props.chat} />\n }\n </DrawerItem>\n );\n };\n\n const NewItem = (props: DrawerItemProps) => {\n return (\n <DrawerItem {...props} >\n {/* className={props.unread == true ? 'unread chat-item' : 'chat-item'}> */}\n <ChatList chatClicked={(chatId) => navigate(`/chat/${chatId}`)} showHeader={true} toggleExpanded={() => setExpanded(prev => !prev)} />\n </DrawerItem>\n );\n };\n\n const onSelect = (e: DrawerSelectEvent) => {\n //history.push(e.itemTarget.props.route);\n //navigate(e.itemTarget.props.route);\n //setExpanded(!expanded);\n };\n\n //add drawer menu\n renderItems?.unshift({ menu: true } as RenderProps)\n\n const style = `linear-gradient(to bottom, ${userProfile?.Nav_Hex_Color}, #ffffff)` // `linear-gradient(0deg, ${userProfile?.Nav_Hex_Color} 0%,#ffffff 100%)!important;`\n return (\n <div style={{ backgroundImage: style }} className='chat-fullscreen grow flex-col'>\n {/* <div className='k-drawer-wrapper'>\n {userProfile?.Features.Chat &&\n <div className={expanded ? 'sidebar k-drawer k-drawer-end' : 'sidebar sidebar-collapsed k-drawer k-drawer-end'}>\n <Scrollbars autoHeight={false}>\n <ChatNotification pinChatOnClick={false} />\n <ChatList chatClicked={(chatId) => navigate(`/chat/${chatId}`)} showHeader={true} toggleExpanded={() => setExpanded(prev => !prev)} />\n </Scrollbars>\n </div>}\n <div className='k-drawer-content'>\n <Routes>\n <Route path=\"/chat/:id\" element={<Chat showHeader={true} showOptions={true} />} />\n <Route path=\"*\" element={<Chat showHeader={true} showOptions={true} />} />\n </Routes></div>\n </div> */}\n {userProfile?.Features.Chat ?\n <Drawer\n expanded={expanded}\n position={\"end\"}\n mode={\"push\"}\n mini={true}\n item={NewItem}\n items={[{}]}\n onSelect={onSelect}\n width={350}\n miniWidth={60}\n style={{ transition: 'none' }}\n >\n <DrawerContent>\n <Routes>\n <Route path=\"/chat\" element={<Chat />} />\n <Route path=\"/chat/:id/*\" element={<Chat showHeader={true} />} />\n <Route path=\"*\" element={<Chat showHeader={true} />} />\n </Routes>\n </DrawerContent>\n </Drawer>\n : <Chat showHeader={true} />}\n </div>\n )\n}\n\nexport type RenderProps = {\n unread: boolean,\n selected: boolean,\n menu: boolean,\n text: string,\n route: string,\n chat: IChat\n}","import { Middleware } from 'redux'\nimport { AddMessage, ChatStarted, ClearTyping, CloseChat, DisconnectUser, LeaveChat, MarkAsRead, PostMessage, RequestChat, SetAvailable, SetRequesting, SetRequests, SetUsersOnline, SetVisibility, StaffJoined, ToggleChat, TypingMessage } from '../reducers/ChatSlice';\nimport { HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\nimport { IChatMessage } from '../../types/IChatMessage';\nimport { RootState } from '../store';\nimport { IChat } from '../../types/IChat';\nimport { ChatApi } from '../api/ChatApi';\nimport IChatUser from '../../types/IChatUser';\nimport { ChatVisibility } from '../../types/ChatVisibility';\nimport { ThunkDispatch } from '@reduxjs/toolkit';\n\n\n//let newConnection: HubConnection;\n//const [invalidateApiCache] = ChatApi.useInvalidateChatCacheMutation();\n//<ThunkDispatch<any, any, AnyAction>>\nconst SignalRMiddleware: Middleware = ({ getState, dispatch }) => {\n let connection;\n return next => action => {\n\n var token = (getState() as RootState).auth?.user?.access_token;\n var profile = (getState() as RootState).chat.profile;\n //var token = (getState() as RootState).auth.user\n //console.log('SignalRMiddleware start, profile =', profile, \"SSIChat:\", profile?.Features?.SSIChat, \"Chat:\", profile?.Features?.Chat);\n if (!connection && token && (profile?.Features?.SSIChat || profile?.Features?.Chat)) {\n console.log('new HubConnectionBuilder in SignalRMiddleware', process.env.REACT_APP_CHAT_HUB_URL);\n\n\n connection = new HubConnectionBuilder()\n .withUrl(process.env.REACT_APP_CHAT_HUB_URL, { accessTokenFactory: () => token })\n .withAutomaticReconnect()\n .build();\n\n connection.onreconnected(e => { console.log('ChatHub onreconnected', connection?.state) });\n connection.onclose(e => { console.log('ChatHub onclose', connection?.state) });\n\n //console.log('starting:', connection)\n connection.start().catch(e => console.error('No SignalR connection could be established', e));\n\n\n\n ///Chat has been updated - probably last ready date\n connection.on('ChatUpdated', (chat: IChat) => {\n console.log('ChatUpdated in SignalRMiddleware', chat);\n //if (chat)\n //store.dispatch(SetChats([chat]))\n\n //invalidate the Chat API cache\n //await invalidateApiCache();\n dispatch(ChatApi.util.invalidateTags([\"Chat\", \"Chats\", \"ChatMessages\"]));\n console.log('done invalidateApiCache');\n });\n\n connection.on('UserConnected', (users: IChatUser[]) => {\n //console.log('UserConnected in SignalRMiddleware', users);\n\n dispatch(SetUsersOnline(users))\n });\n\n connection.on('ReceiveMessage', (message: IChatMessage) => {\n const lastRead = new Date(message.Created).toISOString();\n console.log('ReceiveMessage in SignalRMiddleware', message, lastRead);\n\n\n //Api Update function\n const updateFunc = (draft: IChat[]) => {\n var found = draft.find(c => c?.ConversationId === message?.ConversationId);\n\n console.log('ChatApi.util.updateQueryData.getChats', found);\n\n if (found) {\n found.Last_Message = message.Text;\n found.Last_Message_Contact_Id = message.Contact_Id;\n found.Last_Message_Date = lastRead;\n found.Staff_Last_Read = message.Contact_Id === found.StaffContact_Id ? lastRead : found.Staff_Last_Read;\n found.EndUser_Last_Read = message.Contact_Id === found.EndUserContact_Id ? lastRead : found.EndUser_Last_Read;\n }\n }\n\n //Set the last message in the message list (feed)\n (dispatch as ThunkDispatch<any, any, any>)(ChatApi.util.updateQueryData('getChats', undefined, updateFunc));\n (dispatch as ThunkDispatch<any, any, any>)(ChatApi.util.updateQueryData('getChats', true, updateFunc));\n (dispatch as ThunkDispatch<any, any, any>)(ChatApi.util.updateQueryData('getChats', false, updateFunc));\n (dispatch as ThunkDispatch<any, any, any>)(ChatApi.util.updateQueryData('getChat', message?.ConversationId, (draft: IChat) => {\n draft.Last_Message = message.Text;\n draft.Last_Message_Contact_Id = message.Contact_Id;\n draft.Last_Message_Date = lastRead;\n draft.Staff_Last_Read = message.Contact_Id === draft.StaffContact_Id ? lastRead : draft.Staff_Last_Read;\n draft.EndUser_Last_Read = message.Contact_Id === draft.EndUserContact_Id ? lastRead : draft.EndUser_Last_Read;\n }));\n\n dispatch(AddMessage(message));\n\n });\n\n //Recieve a list of chat requests\n connection.on('Requests', (requests: IChat[]) => {\n console.log('Requests in SignalRMiddleware', requests);\n\n dispatch(SetRequests(requests))\n });\n\n //The current user has been force disconnected.\n connection.on('ForceDisconnect', () => {\n console.log('ForceDisconnect in SignalRMiddleware');\n\n dispatch(SetVisibility(ChatVisibility.Offline));\n\n //invalidate the Chat API cache\n dispatch(ChatApi.util.invalidateTags([\"ChatMyVisibility\"]));\n });\n\n //Recieve a list of chat requests\n connection.on('StartChat', (newChat: IChat) => {\n console.log('StartChat in SignalRMiddleware', newChat);\n //Stop progress indicator\n dispatch(SetRequesting(false));\n //Forces API refetch\n dispatch(ChatApi.util.invalidateTags([\"Chat\", \"Chats\", \"ChatPins\"]));\n //store.dispatch(SetChats([newChat]));dotnet \n });\n connection.on('ChatAvailable', (available: boolean) => {\n console.log('ChatAvailable in SignalRMiddleware', available);\n //Stop progress indicator\n dispatch(SetAvailable(available));\n });\n\n //Someone else is typing a message\n let typingTimer = null;\n connection.on('IsTyping', (Id: number, conversationId: string, displayName: string) => {\n console.log('Someone else IsTyping', Id, displayName, typingTimer)\n if (!typingTimer) {\n const typeingMessage = { Id: 0, Is_Typing: true, Chat_Id: Id, ConversationId: conversationId, Text: `${displayName} is typing...`, Is_Event: true } as IChatMessage\n dispatch(AddMessage(typeingMessage));\n }\n //Setup a timeout to remove the message\n typingTimer && clearTimeout(typingTimer);\n typingTimer = setTimeout(() => {\n dispatch(ClearTyping(conversationId))\n typingTimer = null;\n }, 8000);\n });\n\n\n //Auto PING process to keep user's precense alive\n window.setInterval(() => {\n if (connection?.state === HubConnectionState.Connected) {\n console.log('Ping!', connection?.state)\n connection.send('Ping');\n }\n }, 30000);\n\n }\n\n //Post new message\n if (SetVisibility.match(action)) {\n console.log('SetVisibility', connection?.state);\n try {\n console.log('stopping', connection?.state);\n connection.stop().then(() => {\n console.log('stopped', connection?.state);\n console.log('restarting');\n connection.start().then(() => {\n console.log('restarted', connection?.state);\n });\n });\n\n }\n catch (e) {\n console.error(e);\n }\n\n }\n\n //Adds a message to the Redux API Cache for instant view (optamistic update)\n if (AddMessage.match(action)) {\n (dispatch as ThunkDispatch<any, any, any>)(\n ChatApi.util.updateQueryData('getMessages', action.payload.ConversationId, (draft: IChatMessage[]) => {\n console.log('AddMessage', draft.length, action.payload.Id);\n //clear typing message\n var isTyping = draft.find(m => m.Is_Typing);\n if (isTyping) draft.splice(draft.indexOf(isTyping), 1);\n\n //Add to messages \n var exists = draft.find(m => m.Id === 0 && m.Text === action.payload.Text);\n if (exists) draft.splice(draft.indexOf(exists), 1);\n\n draft.push(action.payload);\n }));\n }\n\n //Clear any 'typing' messages in the Redux API cache\n if (ClearTyping.match(action)) {\n (dispatch as ThunkDispatch<any, any, any>)(\n ChatApi.util.updateQueryData('getMessages', action.payload, (draft: IChatMessage[]) => {\n console.log('ClearTyping', draft.length);\n var isTyping = draft.find(m => m.Is_Typing);\n if (isTyping) draft.splice(draft.indexOf(isTyping), 1);\n console.log('ClearTyping after', draft.length, isTyping);\n }));\n }\n\n //Toggle the chat expanded or collapsed.\n if (ToggleChat.match(action)) {\n (dispatch as ThunkDispatch<any, any, any>)(\n ChatApi.util.updateQueryData('getChat', action.payload.conversationId, (draft: IChat) => {\n if (action.payload.uId == draft.Staff_Uid) draft.Staff_Expanded = action.payload.expanded;\n if (action.payload.uId == draft.EndUser_Uid) draft.EndUser_Expanded = action.payload.expanded;\n }));\n\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('ToggleChat', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n }\n\n //Post new message\n if (PostMessage.match(action)) {\n console.log('PostMessage', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('SendMessage', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n return;\n }\n\n //Post new message\n if (DisconnectUser.match(action)) {\n console.log('DisconnectUser', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('DisconnectUser', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n return;\n }\n\n //Post new message\n if (StaffJoined.match(action)) {\n console.log('StaffJoined', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('StaffJoined', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n return;\n }\n\n //End user sends a chat request\n if (RequestChat.match(action)) {\n console.log('RequestChat in Middleware', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('RequestChat', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n\n return;\n }\n\n //End user sends a chat request\n if (LeaveChat.match(action)) {\n console.log('LeaveChat in Middleware', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('LeftChat', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n\n return;\n }\n\n //Staff Closes a chat\n if (CloseChat.match(action)) {\n console.log('CloseChat in Middleware', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('ClosedChat', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n\n return;\n }\n\n //User is typing a message\n if (TypingMessage.match(action)) {\n console.log('TypingMessage in Middleware', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('Typing', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n\n return;\n }\n\n //Has been started by the user\n if (ChatStarted.match(action)) {\n console.log('ChatStarted in Middleware', connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('ChatStarted', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n else {\n alert('No connection to server yet.');\n }\n\n return;\n }\n\n if (MarkAsRead.match(action)) {\n console.log('MarkAsRead in Middleware', action.payload, connection?.state);\n if (connection?.state === HubConnectionState.Connected) {\n try {\n connection.send('MarkAsRead', action.payload);\n }\n catch (e) {\n console.error(e);\n }\n }\n //else {\n //alert('No connection to server yet.');\n // }\n } else {\n next(action);\n }\n }\n}\n\nexport default SignalRMiddleware;","import { Action, ThunkAction, configureStore } from \"@reduxjs/toolkit\";\nimport { setupListeners } from \"@reduxjs/toolkit/dist/query\";\nimport ChatSlice from \"./reducers/ChatSlice\";\nimport { Api } from \"./api/BaseApi\";\nimport { reducer as oidcReducer, loadUser } from 'redux-oidc';\nimport userManager from \"../settings/oAuthSettings\";\nimport SignalRMiddleware from \"./middleware/SignalRMiddleware\";\nimport { ChatApi } from \"./api/ChatApi\";\n\n\nexport const store = configureStore({\n reducer: {\n auth: oidcReducer,\n chat: ChatSlice.reducer,\n [Api.reducerPath]: Api.reducer,\n },\n devTools: true,\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: false //Stop OIDC serializable warnings\n }).concat([ChatApi.middleware, SignalRMiddleware])\n});\n\n// optional, but required for refetchOnFocus/refetchOnReconnect behaviors\nsetupListeners(store.dispatch);\n\n//OAuth\nloadUser(store, userManager);\n\n\nexport type AppDispatch = typeof store.dispatch;\nexport type RootState = ReturnType<typeof store.getState>;\nexport type AppThunk<ReturnType = void> = ThunkAction<\n ReturnType,\n RootState,\n unknown,\n Action<string>\n>;\n","import { Window, WindowMoveEvent } from '@progress/kendo-react-dialogs';\nimport { IChatHeaderProps, IChatProps } from '../types/IChatProps';\nimport Chat from './Chat';\nimport './Chat.scss'\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport ChatHeader from './ChatHeader';\nimport { useReduxDispatch } from '../redux/hooks';\nimport { LeaveChat, MarkAsRead, ToggleChat } from '../redux/reducers/ChatSlice';\nimport React, { useEffect } from 'react';\nimport { PartialSpinny } from './Common/Spinny';\nimport IChatPin from '../types/IChatPin';\nimport { ChatIsUnRead } from '../util/ChatUtils';\n\n\nexport default function ChatDialog(props: IChatProps) {\n const { id } = useParams();\n const chatId = props.id || id;\n const { data: chat } = ChatApi.useGetChatQuery(chatId, { skip: !chatId });\n const { data: config } = ChatApi.useGetConfigQuery();\n\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n const [unpinChat] = ChatApi.useUnpinChatMutation();\n const [leaveChat] = ChatApi.useLeaveChatMutation();\n const navigate = useNavigate();\n const dispatch = useReduxDispatch();\n const [windowStage, setWindowStage] = React.useState<string>('MINIMIZED')\n //const chat = result.data;\n\n\n //Set the initial expanded / collapsed state\n useEffect(() => {\n if (chat) {\n var expanded = chat.Staff_Uid === userProfile?.Uid ? chat?.Staff_Expanded : chat?.EndUser_Expanded;\n setWindowStage(expanded ? 'DEFAULT' : 'MINIMIZED');\n }\n //else\n // trigger(chatId);\n\n }, [chat])\n\n\n const headerProps: IChatHeaderProps = (chat?.EndUserContact_Id === userProfile?.Id\n ? { image: chat?.Staff_Profile_Path ?? config?.Chat_Image, header: chat?.EndUser_Header, subheader: chat?.EndUser_Sub_Header, uId: chat?.Staff_Uid, conversationUid: chatId }\n : { image: chat?.EndUser_Profile_Path, header: chat?.Staff_Header, subheader: chat?.Staff_Sub_Header, uId: chat?.EndUser_Uid, conversationUid: chatId })\n\n const windowClosed = async () => {\n }\n\n //Staff accepts a chat request.\n const leaveCurrentChat = async () => {\n if (!window.confirm('Are you sure you want to permanently close this chat session?'))\n return;\n\n const result = await leaveChat(chat).unwrap().then((res) => {\n //Tell chat Server we have closed the chat\n dispatch(LeaveChat(chat));\n });\n\n }\n\n ///Staff unpins the chat\n const unpinCurrentChat = async () => {\n userProfile.Features.Chat && props.unPinned(chat);\n\n userProfile.Features.Chat\n ? unpinChat({ Chat_Id: chat.Id, Contact_Id: userProfile.Id, Pinned: true, ConversationId: chat.ConversationId } as IChatPin).unwrap()//updateChat({ ...chat, Staff_Pinned: false } as IChat).unwrap() //Staff can simply close the chat\n : await leaveCurrentChat() //End users permanently leave for good.\n\n }\n\n const windowChange = (e) => {\n //Update local state\n setWindowStage(e.state);\n\n var collapsed = e.state === 'MINIMIZED';\n\n //Toggle via the Chat hub so it can notify all other users and have them update the Chat object in state\n dispatch(ToggleChat({ conversationId: chat.ConversationId, uId: userProfile.Uid, expanded: !collapsed }));\n\n\n //Mark the chat as read\n var markAsRead = false;\n if (ChatIsUnRead(userProfile?.Uid, chat)) {\n //markAsRead = true;\n dispatch(MarkAsRead({ conversationId: chat.ConversationId, contactId: userProfile.Id, unRead: false }));\n }\n\n }\n\n const windowTitle = (<ChatHeader {...headerProps} onClick={() => { windowChange({ state: 'DEFAULT' }) }} />)\n //const windowStyle = { backgroundColor: '#'userProfile?.Nav_Hex_Color } //{ background: `linear-gradient(to bottom, ${userProfile?.Nav_Hex_Color}, #ffffff)` };\n return (\n <>\n <Window appendTo={props.anchor} style={{ background: userProfile?.Nav_Hex_Color, boxShadow: '-3px 4px 9px 0 #989898' }} title={windowTitle} width={400} height={400} initialLeft={props.leftPx} className={windowStage == 'MINIMIZED' ? 'chat-window-collapsed chat-window chat-dialog' : 'chat-window chat-dialog'}\n onStageChange={windowChange} stage={windowStage} onClose={unpinCurrentChat}\n maximizeButton={() =>\n <Link className='k-icon k-i-maximize' target={`ChatWindow_${chatId}`} to={`/chat/${chatId}`}></Link>\n }>\n {/* {isFetching || unPinning || chatUpdating\n ? <PartialSpinny />\n : \n } */}\n <Chat {...props} showHeader={false} />\n </Window>\n </>\n )\n}\n","import React, { useEffect } from 'react'\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { ChatIsUnRead } from '../util/ChatUtils';\nimport { NotificationLog } from '../types/NotificationLog';\nimport { SetNotifications } from '../redux/reducers/ChatSlice';\n\nexport default function NewMessageSound() {\n const dispatch = useReduxDispatch();\n const { data: profile } = ChatApi.useGetProfileQuery();\n const { data: chats } = ChatApi.useGetChatsQuery();\n const { config, notifications } = useReduxSelector(s => s.chat);\n const unreadChats = chats?.filter(c => ChatIsUnRead(profile?.Uid, c));\n useEffect(() => {\n //Play Sound when chat message is received\n const notNotified = unreadChats?.filter(c => !notifications?.find(log => log.conversationId == c.ConversationId && c.Last_Message_Contact_Id != profile.Id && log.lastMessage.toISOString() == new Date(c.Last_Message_Date).toISOString()));\n const dateFind = unreadChats?.filter(c => notifications?.find(log => log.lastMessage.toISOString() == new Date(c.Last_Message_Date).toISOString()));\n console.log('Playing audio...', 'notNotified=', notNotified?.length, 'Play_Sound=', config?.Play_Sound);\n //console.log('notifications.lastMessage.toISOString()', notifications.map(m => m.lastMessage.toISOString()), unreadChats.map(m => new Date(m.Last_Message_Date).toISOString()), 'find=', dateFind);\n if (notNotified?.length > 0 && config?.Play_Sound) {\n\n //this could fail:play() failed because the user didn't interact with the document first.\n try {\n const audio = new Audio('./sounds/new-message.wav');\n audio.volume = config.Sound_Volume / 10;\n audio.play().then(e => console.log('Sound played')).catch(e => console.error('Sound error:' + e));\n } catch (e) {\n console.error('Sound error:' + e);\n }\n let newNotificationLog = [...notifications]\n newNotificationLog = newNotificationLog.filter(n => !notNotified.find(nn => nn.ConversationId == n.conversationId)) //Remove existing\n newNotificationLog = newNotificationLog.concat(notNotified.map(c => { return { conversationId: c.ConversationId, lastMessage: new Date(c.Last_Message_Date) } as NotificationLog }));\n //remove old logs\n //newNotificationLog = newNotificationLog.filter(n=> notNotified.find(nn=> nn.ConversationId == n.conversationId) !== null);\n //newNotificationLog = newNotificationLog.push();\n console.warn('SetNotifications', newNotificationLog?.length)\n\n //Set the chats that have been 'dinged'\n dispatch(SetNotifications(newNotificationLog));\n }\n }, [unreadChats?.length]);\n\n return (\n <>\n {/* NewMessageSound {unreadChats?.length} */}\n </>\n )\n}\n","import { Window } from '@progress/kendo-react-dialogs';\nimport React, { useEffect, useRef, useState } from 'react'\nimport { IChatProps } from '../types/IChatProps';\nimport './Chat.scss'\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport ChatHeader from './ChatHeader';\nimport { TextArea } from '@progress/kendo-react-inputs';\nimport { Button } from '@progress/kendo-react-buttons';\nimport { Hint } from \"@progress/kendo-react-labels\";\nimport { useReduxDispatch, useReduxSelector } from '../redux/hooks';\nimport { RequestChat, SetRequesting } from '../redux/reducers/ChatSlice';\nimport ChatDialog from './ChatDialog';\nimport { PartialSpinny } from './Common/Spinny';\nimport ChatCount from './ChatCount';\nimport ChatNotification from './ChatNotification';\nimport NewMessageSound from './NewMessageSound';\n\nexport default function ChatRequest(props: IChatProps) {\n const max = 2000;\n const dispatch = useReduxDispatch();\n const isRequesting = useReduxSelector(s => s.chat.requestingChat)\n const isChatAvailable = useReduxSelector(s => s.chat.chatAvailable)\n const { data: myChats } = ChatApi.useGetChatsQuery();\n const { data: chatConfig } = ChatApi.useGetConfigQuery();\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n const navigate = useNavigate();\n const [value, setValue] = React.useState<string>('');\n const [stage, setStage] = React.useState(\"MINIMIZED\"); //MINIMIZED\n const [leaveChat] = ChatApi.useLeaveChatMutation();\n //Check for existing chats\n const { data: existingChat } = ChatApi.useGetChatForUserQuery(userProfile?.Id, { skip: !userProfile?.Id });\n\n //expand the chat if there is an existing request\n const myOpenChat = myChats?.find(c => !c.IsClosed && !c.EndUser_Left)\n useEffect(() => {\n if (myOpenChat) {\n console.log('reset the for if an active chat is found');\n\n //reset the for if an active chat is found \n setStage('MINIMIZED')\n setValue('');\n }\n\n }, [myOpenChat])\n\n //Send the chat request to the server\n const sendRequest = async () => {\n dispatch(SetRequesting(true));\n await dispatch(RequestChat(value));\n\n //reset form.\n // setStage('MINIMIZED');\n // setValue('');\n }\n\n //const chatProps = { EndUser_Header: \"Live Chat\", Staff_Image_Path: chatConfig?.Chat_Image } as IChat\n //onClick={() => setStage('DEFAULT')}\n const windowTitle = (<ChatHeader conversationUid={existingChat?.ConversationId} uId={null} image={chatConfig?.Chat_Image || './images/Host_Images/Chat/Logo.png'} header='Live Chat' onClick={() => setStage('DEFAULT')} />)\n const windowStyle = { background: `linear-gradient(to bottom, ${userProfile?.Nav_Hex_Color}, #ffffff)` };\n const parent = useRef();\n\n if (!userProfile)\n return <></>\n\n return (\n <div ref={parent} className='chat-request-wrapper'>\n <NewMessageSound />\n {existingChat\n ? <ChatDialog anchor={parent.current} id={existingChat.ConversationId} />\n : isChatAvailable &&\n <Window appendTo={parent.current} closeButton={() => <></>} style={windowStyle} title={windowTitle} width={stage == 'DEFAULT' ? 400 : 250} height={300} className='chat-request chat-window' onStageChange={(e) => setStage(e.state)} stage={stage}\n onClose={() => navigate(-1)}\n >\n {existingChat && !existingChat.StaffContact_Id && false && <PartialSpinny />}\n <p className='intro' >Please enter your request in the field below and a support technician will be with you shortly</p>\n {/* style={{ backgroundColor: shadeColor(userProfile?.Nav_Hex_Color, 20) }} */}\n <TextArea autoFocus style={{ width: 400, maxHeight: 500 }} autoSize={false} rows={5} maxLength={max}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n <Hint direction={\"end\"}>\n {value.length} / {max}\n </Hint>\n <div className=\"k-form-buttons k-justify-content-end\">\n <Button disabled={isRequesting || !value} size='large' themeColor={\"primary\"} onClick={sendRequest}>Send</Button>\n </div>\n {isRequesting && <PartialSpinny zIndex=\"100\" />}\n </Window>\n }\n </div>\n )\n}\n","import React, { Suspense } from 'react'\nimport { SplitButton } from \"@progress/kendo-react-buttons\";\nimport { ChatApi } from '../../redux/api/ChatApi';\nimport userManager from '../../settings/oAuthSettings';\n\nexport default function ProfileImage() {\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n if (!userProfile) return <></>\n\n return (\n\n <SplitButton className='profile-image-button-small'\n imageUrl={\n userProfile.Profile_Image_Url?.indexOf(\"/images\") === 0\n ? process.env.PUBLIC_URL + userProfile.Profile_Image_Url\n : userProfile.Profile_Image_Url\n }\n items={[{ text: \"Logout\" }]}\n fillMode={\"flat\"}\n //onButtonClick={(e) => {\n //handleProfileClick()\n //unfocus\n // e.target.setState(s => {\n // return { ...s, focused: false }\n // });\n //}} \n onItemClick={(e) => {\n console.log('handleOnClick', e.item);\n //unfocus\n // e.target.setState(s => {\n // return { ...s, focused: false }\n // });\n //const navItem: NavItems = e.item as NavItems;\n //handleOnClick(e.item?.Url);\n userManager.signoutRedirect();\n }} />\n\n )\n}\n","import { AppBar, AppBarSection, AppBarSpacer, Avatar } from '@progress/kendo-react-layout'\nimport React from 'react'\nimport { ChatApi } from '../../redux/api/ChatApi';\nimport ProfileImage from './ProfileImage';\nimport { Button } from \"@progress/kendo-react-buttons\";\nimport { useNavigate } from 'react-router-dom';\n\nexport default function Nav() {\n const navigate = useNavigate();\n const { data: userProfile } = ChatApi.useGetProfileQuery();\n return (\n <AppBar >\n <AppBarSection>\n <img src='/images/Host_Images/Chat/Logo.png' style={{ width: 40, height: 40 }}></img>\n </AppBarSection>\n <AppBarSection ><h3 className='chat-title' >Revelation helpdesk Chat</h3></AppBarSection>\n <AppBarSpacer />\n <AppBarSection>\n <ProfileImage />\n </AppBarSection>\n </AppBar >\n )\n}\n","import React, { useMemo, useRef } from 'react'\nimport { useReduxSelector } from '../redux/hooks';\nimport ChatDialog from './ChatDialog';\nimport { ChatApi } from '../redux/api/ChatApi';\nimport { IChat } from '../types/IChat';\n\nexport default function PinnedChats() {\n const { data: pins } = ChatApi.useGetPinnedChatsQuery();\n const { data: config } = ChatApi.useGetConfigQuery();\n\n let pinnedChats = useMemo(() =>\n //chats?.concat(requests)?.filter(c => pins?.find(p => p?.Contact_Id === profile?.Id && p?.Chat_Id === c.Id))\n pins?.filter(p => p).map(p => p.ConversationId)\n , [pins])\n\n function chatUnpinned(chat: IChat) {\n // \n // pinnedChats = pinnedChats.filter(p => p.ConversationId == chat.ConversationId)\n // console.log('chatUnpinned 2', chat, pinnedChats)\n }\n\n const parent = useRef();\n\n let totalLeft = 20;\n\n return (\n <div className='pinned-chats' ref={parent}>\n {pinnedChats?.slice(0, config?.Max_Chats ?? 3).map((p, i) => {\n const prev = i > 0 ? pinnedChats[i - 1] : null;\n //const leftPx = prev && (!prev?.Staff_Expanded ? 250 : 400) + (20);\n const leftPx = prev && 400 + (20);\n totalLeft += leftPx;\n return <ChatDialog anchor={parent.current} leftPx={totalLeft} unPinned={chatUnpinned} key={`${p.toString()}_${i}`} id={p.toString()} index={i} />\n })}\n </div>\n )\n}\n","import './App.scss';\nimport { OidcProvider } from 'redux-oidc';\nimport userManager from './settings/oAuthSettings';\nimport ChatPage from './components/ChatPage';\nimport { store } from './redux/store'\nimport { useEffect, useState } from 'react';\nimport { User } from 'oidc-client-ts';\nimport ChatList from './components/ChatList';\nimport { useReduxDispatch } from './redux/hooks';\nimport { StartConnecting } from './redux/reducers/ChatSlice';\nimport { Route, Router, Routes } from 'react-router-dom';\nimport { ChatApi } from './redux/api/ChatApi';\nimport ChatDialog from './components/ChatDialog';\nimport ChatRequest from './components/ChatRequest';\nimport Nav from './components/Header/Nav';\nimport PinnedChats from './components/PinnedChats';\nimport ChatNotification from './components/ChatNotification';\n\nexport default function App() {\n const dispatch = useReduxDispatch();\n const [user, setUser] = useState<User>();\n const { data: userProfile, error: fetchError } = ChatApi.useGetProfileQuery();\n\n useEffect(() => {\n checkUser();\n\n //console.log('Create StartConnecting');\n //var action = StartConnecting(null);\n //console.log('dispatching StartConnecting');\n //dispatch(action);\n }, [fetchError])\n\n const checkUser = async () => {\n let u = await userManager.getUser();\n\n console.log('fetchError', fetchError?.[\"status\"])\n\n\n u && setUser(u as unknown as User)\n console.log('User Expired', u, u?.expired);\n\n if (!u || u?.expired || fetchError?.[\"status\"] === 401) {\n console.log('signinRedirect')\n await userManager.signinRedirect();\n }\n };\n\n\n if (!user)\n return <>Loading...</>\n\n return (\n <OidcProvider store={store} userManager={userManager}>\n <div className=\"App\">\n <Nav />\n <Routes>\n <Route path=\"/list\" element={<ChatList />} />\n <Route path=\"/dude\" element={<>Dude</>} />\n <Route path=\"/chat/request\" element={<ChatRequest />} />\n <Route path=\"/chat/:id\" element={<ChatPage />} />\n <Route path=\"/*\" element={<ChatPage />} />\n <Route path=\"/chat/pinned\" element={<>\n <ChatPage />\n <PinnedChats />\n </>} />\n\n </Routes>\n {/* <PinnedChats /> */}\n </div>\n </OidcProvider>\n\n );\n}\n","import { User } from 'oidc-client';\nimport { CallbackComponent } from 'redux-oidc';\nimport userManager from '../../settings/oAuthSettings';\n\n\nconst CallbackPage = () => {\n console.log('Chat CallBackPage');\n const successCallback = (user: User) => {\n console.log('successCallback', user);\n window.location.href = user.state ? user.state : \"./\";\n //window.location.href = \"./\";\n };\n\n const errorCallback = (error: Error) => {\n console.error('errorCallback', error);\n //try re-authenticate\n //authManager.signinRedirect();\n };\n\n\n console.log('CallbackPage authManager', userManager);\n return (\n <CallbackComponent userManager={userManager} successCallback={successCallback} errorCallback={errorCallback} >\n <></>\n </CallbackComponent>\n )\n}\n\nexport default CallbackPage;","import { processSilentRenew } from 'redux-oidc';\n\nconst SilentRenewPage = () => {\n //testing\n processSilentRenew();\n\n return <></>\n}\n\nexport default SilentRenewPage;","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport { store } from './redux/store'\nimport { Provider } from 'react-redux'\nimport { BrowserRouter, Route, Routes } from 'react-router-dom';\nimport CallbackPage from './components/auth/CallbackPage';\nimport SilentRenewPage from './components/auth/SilentRenewPage';\nimport './index.css';\nimport TimeAgo from \"javascript-time-ago\";\nimport en from \"javascript-time-ago/locale/en.json\";\nTimeAgo.addDefaultLocale(en);\n\nconst root = ReactDOM.createRoot(\n document.getElementById('root') as HTMLElement\n);\n\nroot.render(\n <React.StrictMode>\n <Provider store={store}>\n <BrowserRouter>\n <Routes>\n {/* For OAuth */}\n <Route path=\"/signin-callback\" element={<CallbackPage />} />\n <Route path=\"/silent-renew\" element={<SilentRenewPage />} />\n <Route path=\"*\" element={<App />} />\n </Routes>\n </BrowserRouter >\n </Provider >\n </React.StrictMode>\n);"],"names":["oAuthSettings","authority","process","client_id","redirect_uri","concat","window","location","protocol","hostname","port","silent_redirect_uri","automaticSilentRenew","post_logout_redirect_uri","response_type","scope","validateSubOnSilentRenew","includeIdTokenInSilentRenew","silentRequestTimeoutInSeconds","createUserManager","Api","createApi","reducerPath","baseQuery","fetchBaseQuery","baseUrl","prepareHeaders","async","headers","_ref","_auth$user","getState","token","auth","user","access_token","set","tagTypes","endpoints","build","getTenant","query","hostName","providesTags","ChatApi","injectEndpoints","getChats","includeClosed","getProfile","uid","console","warn","getConfig","updateChat","mutation","chat","url","ConversationId","method","body","invalidatesTags","_ref2","dispatch","queryFulfilled","patchResult","util","updateQueryData","draft","Object","assign","undo","acceptChat","leaveChat","closeChat","continueChat","getChat","UId","getChatForUser","Id","getMessages","getMyVisibility","getPinnedChats","pinChat","pin","_ref3","undefined","_draft$find","find","d","push","unpinChat","_ref4","pins","pinIndex","indexOf","obj","Contact_Id","Chat_Id","updateUserVisibility","visData","invalidateChatCache","queryFn","data","createTicket","info","overrideExisting","useReduxDispatch","useDispatch","useReduxSelector","useSelector","ChatVisibility","ChatSlice","createSlice","name","initialState","notifications","requests","usersOnline","connectionStatus","unreadChats","requestingChat","config","chatAvailable","profile","reducers","SetAvailable","state","action","payload","SetUsersOnline","SetConnectionStatus","SetRequests","SetNotifications","SetChats","SetMessages","_action$payload","length","PostMessage","log","DisconnectUser","ChatStarted","MarkAsRead","ToggleChat","AddMessage","currentRequest","c","Last_Message","Text","Last_Message_Contact_Id","Last_Message_Date","Created","StartConnecting","TypingMessage","RequestChat","StaffJoined","LeaveChat","CloseChat","ClearTyping","SetRequesting","SetVisibility","Internal_External","PlayNewMessageSound","Audio","play","extraReducers","builder","addMatcher","matchFulfilled","actions","OnlineIndicator","props","staffOnline","s","Uid","_jsx","className","title","ChatIsUnRead","userId","Staff_Uid","IsClosed","Date","Staff_Last_Read","EndUser_Last_Read","ensureUTCDate","dateTime","endsWith","UnreadMessageCount","messages","useGetMessagesQuery","conversationUid","useGetChatQuery","userProfile","useGetProfileQuery","unreadMessages","filter","m","_ensureUTCDate","_ensureUTCDate2","Is_Event","StaffContact_Id","showLabel","_Fragment","showZero","BadgeContainer","children","Badge","align","horizontal","vertical","position","rounded","ChatHeader","_props$image","onClick","_jsxs","Card","orientation","Avatar","size","type","style","margin","src","image","alt","uId","header","subheader","PartialSpinny","zIndex","z","SimpleSpinny","ChatMenu","menu","setMenu","useState","useCloseChatMutation","useUpdateChatMutation","useLeaveChatMutation","useUnpinChatMutation","useGetPinnedChatsQuery","skip","Features","Chat","anchor","useRef","Button","ref","icon","fillMode","onBlur","e","setTimeout","v","visible","offset","top","left","clientY","clientX","Popup","show","anchorAlign","collision","Menu","openOnClick","onSelect","item","confirm","unwrap","then","conversationId","contactId","unRead","res","p","MenuItem","text","Phrases","CallPhrase","SSIChat","navigate","useNavigate","id","useParams","chatId","_s$chat","postTicket","isLoading","loggingTicket","useCreateTicketMutation","chatMessages","isFetching","fetchingMessages","useGetConfigQuery","joiningChat","useAcceptChatMutation","error","setError","React","message","setMessage","setUser","leavingChat","cursor","setCursor","useEffect","displayName","EndUserContact_Id","End_User","Staff_From_Name","profileImage","Profile_Image_Url","avatarUrl","messageBox","sendMessage","newMessage","From","toISOString","Profile_Image","newChat","elementRef","_elementRef$current","current","scrollIntoView","renderMessages","useMemo","_renderItems$filter","renderItems","EndUser_Profile_Path","map","cm","index","dangerouslySetInnerHTML","__html","author","timestamp","acceptRequest","catch","ex","isRequest","isClosed","endUserLeft","EndUser_Left","notPartOfConversation","headerProps","Staff_Profile_Path","EndUser_Header","EndUser_Sub_Header","Staff_Header","Staff_Sub_Header","EndUser_Uid","showOptions","showLogControls","setLogControls","timer","setInterval","Show_Log_Option","getTime","Show_Log_Option_After_Mins","clearInterval","logTicket","newTicket","Ticket_Source_Id","Company_Id","Company_Contact","Company_Contact_Uid","Call_Desc","join","createdTicket","eventMessage","ID","replace","input","element","setSelectionRange","customMessageBox","themeColor","TextArea","disabled","autoFocus","maxHeight","autoSize","rows","onBeforeInput","value","onChange","selectionStart","onKeyPress","key","preventDefault","stopPropagation","version","xmlns","x","y","viewBox","customMessageBoxMem","showHeader","ChatUI","onToolbarActionExecute","onActionExecute","onMessageSend","event","width","showToolbar","TimeAgo","en","ChatListItem","_initials$shift","_initials$pop","_chat$EndUser_Profile","rgx","RegExp","initials","matchAll","letters","shift","pop","toUpperCase","CardHeader","CardTitle","Staff_Name","CardSubtitle","fontSize","ReactTimeago","date","minPeriod","ChatFilter","setFilter","TextBox","search","prev","newFilter","toString","toLocaleLowerCase","onFilterChange","placeholder","prefix","InputPrefix","Icon","suffix","InputClearValue","Checkbox","checked","closed","label","ChatCount","visibility","useGetMyVisibilityQuery","chats","useGetChatsQuery","Visibility","Offline","document","Site_Title","ChatVisibilityMenu","r","updateVisibility","useUpdateUserVisibilityMutation","options","onclick","display","hoverCloseDelay","o","_o$icon","render","UserListItem","_user$Profile_Image_U","onChatStarted","useContinueChatMutation","Name","continueStaffChat","Link","to","Team","syntheticEvent","linkRender","UserOffline","myVisibility","height","CardBody","DropDownList","textField","dataItemKey","img","itemRender","li","itemProps","itemChildren","dataItem","defaultItem","target","ChatList","usePinChatMutation","filterVisible","setFilterVisible","selected","setSelected","sortOrder","_c$End_User","_c$Staff_Name","startsWith","sort","c2","chatStarted","pinChatOnClick","Pinned","staff","u","Is_Staff","userOnline","toggleExpanded","val","TabStrip","TabStripTab","chatItemClicked","chatClicked","Staff_Expanded","EndUser_Expanded","Staff_Pinned","ChatPage","expanded","setExpanded","slice","unread","route","subtext","Last_Message_By","last","unshift","Nav_Hex_Color","backgroundImage","Drawer","mode","mini","DrawerItem","items","miniWidth","transition","DrawerContent","Routes","Route","path","connection","next","_auth","_profile$Features","_profile$Features2","_connection9","_connection10","_connection11","_connection12","_connection13","_connection14","_connection15","_connection16","_connection17","_connection18","_connection19","_connection20","_connection21","_connection22","_connection23","_connection24","_connection25","_connection26","_connection27","HubConnectionBuilder","withUrl","accessTokenFactory","withAutomaticReconnect","onreconnected","_connection","onclose","_connection2","start","on","invalidateTags","users","lastRead","updateFunc","found","available","typingTimer","typeingMessage","Is_Typing","clearTimeout","_connection3","_connection4","HubConnectionState","send","match","_connection5","_connection6","stop","_connection7","_connection8","isTyping","splice","exists","alert","store","configureStore","reducer","oidcReducer","devTools","middleware","getDefaultMiddleware","serializableCheck","SignalRMiddleware","setupListeners","loadUser","userManager","ChatDialog","_chat$Staff_Profile_P","windowStage","setWindowStage","Chat_Image","windowChange","collapsed","windowTitle","Window","appendTo","background","boxShadow","initialLeft","leftPx","onStageChange","stage","onClose","unPinned","leaveCurrentChat","maximizeButton","NewMessageSound","notNotified","lastMessage","Play_Sound","_newNotificationLog","audio","volume","Sound_Volume","newNotificationLog","n","nn","ChatRequest","isRequesting","isChatAvailable","myChats","chatConfig","setValue","setStage","existingChat","useGetChatForUserQuery","myOpenChat","windowStyle","parent","closeButton","maxLength","Hint","direction","ProfileImage","_userProfile$Profile_","SplitButton","imageUrl","onItemClick","Nav","AppBar","AppBarSection","AppBarSpacer","PinnedChats","_config$Max_Chats","pinnedChats","chatUnpinned","totalLeft","Max_Chats","i","App","fetchError","checkUser","expired","OidcProvider","CallbackPage","CallbackComponent","successCallback","href","errorCallback","SilentRenewPage","processSilentRenew","ReactDOM","getElementById","Provider","BrowserRouter"],"sourceRoot":""}