{"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":""}