The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Rocket.Chat/client/providers/OmniChannelProvider.tsx

121 lines
4.2 KiB

[IMPROVE] New sidebar layout (#19089) * wip * wip * more work in progress * lint * Fix IE11 support livechat widget * More wip * lint * Add correct buttons and fix some errors * fix import * Fix error with empty department agents * fix title and tags * more fixes * fix agents save * Fix agentlist not saving * First Review * update fuselage * Sidebar variations * Fix Stories * Sidebar Header * Initial data * Fix paddings * sidebar search * Wip Chats * Added more logic * Fix Memo * Virtual List * switch to VariableSizeList * Fix Size * Te acalma Gabriel * Badges * Menu actions * Do not group by type option * Highligthed state * Fix menu * Item Skeletons * Search list * Omnichannel to virtualList * Sidebar header * SidebarHeader * Better Ominichannel Context usage * Revome livechat template * Remove discussion Room List * alert and open prop * Menu as renderprop * ReactiveUserPresence * Update components * Update cachedCollection * Fiz discussions * update cachedcolletion * Header color * Fix unread * Presence * Fix presence * Fix Admin * [wip] Search bar * get usernames in subscription * Local an spotlight search * Fix avatar id prop * Fix multi users on search * Livechat RoomMenu * Fix Header in anonymous sessions * Fix sidebar * update base old * Sidebar variations * Fix Stories * Sidebar Header * Initial data * Fix paddings * sidebar search * Wip Chats * Added more logic * Virtual List * Fix Memo * switch to VariableSizeList * Fix Size * Te acalma Gabriel * Badges * Menu actions * Do not group by type option * Highligthed state * Item Skeletons * Search list * Fix menu * Omnichannel to virtualList * Sidebar header * SidebarHeader * Better Ominichannel Context usage * Revome livechat template * Remove discussion Room List * alert and open prop * Menu as renderprop * ReactiveUserPresence * Update components * Update cachedCollection * Fiz discussions * update cachedcolletion * Header color * Fix unread * Presence * Fix presence * Fix Admin * [wip] Search bar * get usernames in subscription * Local an spotlight search * Fix avatar id prop * [FIX] Missing "Bio" in user's profile view (#19166) * [FIX] Omnichannel: triggers page not rendering (#19134) * [FIX] VisitorAutoComplete component (#19133) * [FIX] Admin Sidebar overflowing (#19101) * [FIX] Integrations history page not reacting to changes. (#19114) * [FIX] Selecting the same department for multiple units (#19168) * [FIX] Error when editing priority and required description (#19170) * [FIX] Thread view in a channel user haven't joined (#19172) * [FIX] Livechat Appearance label and reset button (#19171) * Refactor: Omnichannel departments (#18920) Co-authored-by: Guilherme Gazzo <guilherme@gazzo.xyz> Co-authored-by: Gabriel Henriques <gabriel.henriques@rocket.chat> Co-authored-by: Guilherme Gazzo <guilhermegazzo@gmail.com> * Fix multi users on search * Livechat RoomMenu * Fix Header in anonymous sessions * Fix sidebar * Fix admin user Info * update base old * fix sidebar size * Fix sidebar tests * Lint * Package-lock * package-lock * Fix callback * Removed useless files * Fix LGTM * Isolate userpresence to dont leak react and fuselage * Fix Alert * update fuselage * fix hide modal not closing * Sort by name and activity * Fix reset * Arrow controls (#19239) Co-authored-by: Guilherme Gazzo <guilherme@gazzo.xyz> * Fixes * ActionButton * ActionButton[2] * ActionButton [3] * Support anonymous * Open menu by keyboard * Login button for anonymous users * Login button for anonymous users * Update code * ShouldUpdate * Change login Icon, fix badge * Update fuselage * Fix storybook * Fix storybook * Use Style and renamed * wip stories sidebar * Types * wip * Testing IE11 * WIP * Fix Typo * Use Layout colors * Lint * Fix * Remove CallProvider * Remove CallContext Co-authored-by: Martin <martin.schoeler@rocket.chat> Co-authored-by: Gabriel Henriques <gabriel.henriques@rocket.chat> Co-authored-by: Douglas Fabris <deefabris@gmail.com> Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Co-authored-by: Renato Becker <renato.augusto.becker@gmail.com> Co-authored-by: Tasso Evangelista <tasso.evangelista@rocket.chat>
5 years ago
import React, { useState, useEffect, FC, useCallback, useMemo } from 'react';
import { OmichannelRoutingConfig } from '../../definition/OmichannelRoutingConfig';
import { IOmnichannelAgent } from '../../definition/IOmnichannelAgent';
import { Notifications } from '../../app/notifications/client';
import { OmnichannelContext, OmnichannelContextValue } from '../contexts/OmnichannelContext';
import { useReactiveValue } from '../hooks/useReactiveValue';
import { useUser, useUserId } from '../contexts/UserContext';
import { useMethodData, AsyncState } from '../contexts/ServerContext';
import { usePermission, useRole } from '../contexts/AuthorizationContext';
import { useSetting } from '../contexts/SettingsContext';
import { LivechatInquiry } from '../../app/livechat/client/collections/LivechatInquiry';
import { initializeLivechatInquiryStream } from '../../app/livechat/client/lib/stream/queueManager';
const args = [] as any;
const emptyContext = {
inquiries: { enabled: false },
enabled: false,
agentAvailable: false,
showOmnichannelQueueLink: false,
} as OmnichannelContextValue;
const useOmnichannelInquiries = (): Array<any> => {
const uid = useUserId();
const isOmnichannelManger = useRole('livechat-manager');
const omnichannelPoolMaxIncoming = useSetting('Livechat_guest_pool_max_number_incoming_livechats_displayed') as number;
useEffect(() => {
const handler = async (): Promise<void> => {
initializeLivechatInquiryStream(uid, isOmnichannelManger);
};
(async (): Promise<void> => {
initializeLivechatInquiryStream(uid, isOmnichannelManger);
Notifications.onUser('departmentAgentData', handler);
})();
return (): void => {
Notifications.unUser('departmentAgentData', handler);
};
}, [isOmnichannelManger, uid]);
return useReactiveValue(useCallback(() => LivechatInquiry.find({
status: 'queued',
}, {
sort: {
queueOrder: 1,
estimatedWaitingTimeQueue: 1,
estimatedServiceTimeAt: 1,
},
limit: omnichannelPoolMaxIncoming,
}).fetch(), [omnichannelPoolMaxIncoming]));
};
const OmnichannelDisabledProvider: FC = ({ children }) => <OmnichannelContext.Provider value={emptyContext} children={children}/>;
const OmnichannelManualSelectionProvider: FC<{ value: OmnichannelContextValue }> = ({ value, children }) => {
const queue = useOmnichannelInquiries();
const showOmnichannelQueueLink = useSetting('Livechat_show_queue_list_link') as boolean && value.agentAvailable;
const contextValue = useMemo(() => ({
...value,
inquiries: {
enabled: true,
queue,
},
showOmnichannelQueueLink,
}), [value, queue, showOmnichannelQueueLink]);
return <OmnichannelContext.Provider value={contextValue} children={children}/>;
};
const OmnichannelEnabledProvider: FC = ({ children }) => {
const omnichannelRouting = useSetting('Livechat_Routing_Method');
const [contextValue, setContextValue] = useState<OmnichannelContextValue>({
...emptyContext,
enabled: true,
});
const user = useUser() as IOmnichannelAgent;
const [routeConfig, status, reload] = useMethodData<OmichannelRoutingConfig>('livechat:getRoutingConfig', args);
const canViewOmnichannelQueue = usePermission('view-livechat-queue');
useEffect(() => {
status !== AsyncState.LOADING && reload();
}, [omnichannelRouting, reload]); // eslint-disable-line
useEffect(() => {
setContextValue((context) => ({
...context,
agentAvailable: user?.statusLivechat === 'available',
}));
}, [user?.statusLivechat]);
if (!routeConfig || !user) {
return <OmnichannelDisabledProvider children={children}/>;
}
if (canViewOmnichannelQueue && routeConfig.showQueue && !routeConfig.autoAssignAgent && contextValue.agentAvailable) {
return <OmnichannelManualSelectionProvider value={contextValue} children={children} />;
}
return <OmnichannelContext.Provider value={contextValue} children={children}/>;
};
const OmniChannelProvider: FC = React.memo(({ children }) => {
const omniChannelEnabled = useSetting('Livechat_enabled') as boolean;
const hasAccess = usePermission('view-l-room') as boolean;
if (!omniChannelEnabled || !hasAccess) {
return <OmnichannelDisabledProvider children={children}/>;
}
return <OmnichannelEnabledProvider children={children}/>;
});
export default OmniChannelProvider;