diff --git a/client/contexts/ServerContext/endpoints.ts b/client/contexts/ServerContext/endpoints.ts index f356da45dbbd2..f2a4c07a37744 100644 --- a/client/contexts/ServerContext/endpoints.ts +++ b/client/contexts/ServerContext/endpoints.ts @@ -19,6 +19,7 @@ import { ImMembersEndpoint } from './endpoints/v1/im/members'; import { AppearanceEndpoint as LivechatAppearanceEndpoint } from './endpoints/v1/livechat/appearance'; import { LivechatCustomFieldsEndpoint } from './endpoints/v1/livechat/customFields'; import { LivechatDepartment } from './endpoints/v1/livechat/department'; +import { LivechatDepartmentSingle } from './endpoints/v1/livechat/departmentSingle'; import { LivechatDepartmentsByUnit } from './endpoints/v1/livechat/departmentsByUnit'; import { LivechatMonitorsList } from './endpoints/v1/livechat/monitorsList'; import { LivechatRoomOnHoldEndpoint } from './endpoints/v1/livechat/onHold'; @@ -26,6 +27,7 @@ import { LivechatRoomsEndpoint } from './endpoints/v1/livechat/rooms'; import { LivechatTagsList } from './endpoints/v1/livechat/tagsList'; import { LivechatUsersAgentEndpoint } from './endpoints/v1/livechat/usersAgent'; import { LivechatVisitorInfoEndpoint } from './endpoints/v1/livechat/visitorInfo'; +import { CannedResponseEndpoint } from './endpoints/v1/omnichannel/cannedResponse'; import { CannedResponsesEndpoint } from './endpoints/v1/omnichannel/cannedResponses'; import { AutocompleteAvailableForTeamsEndpoint as RoomsAutocompleteTeamsEndpoint } from './endpoints/v1/rooms/autocompleteAvailableForTeams'; import { AutocompleteChannelAndPrivateEndpoint as RoomsAutocompleteEndpoint } from './endpoints/v1/rooms/autocompleteChannelAndPrivate'; @@ -66,6 +68,7 @@ export type ServerEndpoints = { 'livechat/monitors.list': LivechatMonitorsList; 'livechat/tags.list': LivechatTagsList; 'livechat/department': LivechatDepartment; + 'livechat/department/${string}': LivechatDepartmentSingle; 'livechat/departments.by-unit/': LivechatDepartmentsByUnit; 'engagement-dashboard/users/active-users': EngagementDashboardActiveUsersEndpoint; 'rooms.info': RoomsInfoEndpoint; @@ -74,6 +77,7 @@ export type ServerEndpoints = { 'livechat/rooms': LivechatRoomsEndpoint; 'livechat/users/agent': LivechatUsersAgentEndpoint; 'canned-responses': CannedResponsesEndpoint; + 'canned-responses/${string}': CannedResponseEndpoint; }; export type ServerEndpointPath = keyof ServerEndpoints; diff --git a/client/contexts/ServerContext/endpoints/v1/livechat/departmentSingle.ts b/client/contexts/ServerContext/endpoints/v1/livechat/departmentSingle.ts new file mode 100644 index 0000000000000..6bfbe5768e2ed --- /dev/null +++ b/client/contexts/ServerContext/endpoints/v1/livechat/departmentSingle.ts @@ -0,0 +1,10 @@ +import { ILivechatDepartment } from '../../../../../../definition/ILivechatDepartment'; + +export type LivechatDepartmentSingleGetReturn = { + department: ILivechatDepartment; + success: boolean; +}; + +export type LivechatDepartmentSingle = { + GET: () => LivechatDepartmentSingleGetReturn; +}; diff --git a/client/contexts/ServerContext/endpoints/v1/omnichannel/cannedResponse.tsx b/client/contexts/ServerContext/endpoints/v1/omnichannel/cannedResponse.tsx new file mode 100644 index 0000000000000..57b84d74dfb32 --- /dev/null +++ b/client/contexts/ServerContext/endpoints/v1/omnichannel/cannedResponse.tsx @@ -0,0 +1,10 @@ +import { IOmnichannelCannedResponse } from '../../../../../../definition/IOmnichannelCannedResponse'; + +export type CannedResponseEndpointGetReturn = { + cannedResponse: IOmnichannelCannedResponse; + success: boolean; +}; + +export type CannedResponseEndpoint = { + GET: () => CannedResponseEndpointGetReturn; +}; diff --git a/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx b/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx index 58905943e0582..1982cdbfaeba0 100644 --- a/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx +++ b/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx @@ -6,16 +6,19 @@ import Page from '../../../../client/components/Page'; import { useRole } from '../../../../client/contexts/AuthorizationContext'; import { useRoute } from '../../../../client/contexts/RouterContext'; import { useEndpoint } from '../../../../client/contexts/ServerContext'; +import { LivechatDepartmentSingleGetReturn } from '../../../../client/contexts/ServerContext/endpoints/v1/livechat/departmentSingle'; +import { CannedResponseEndpointGetReturn } from '../../../../client/contexts/ServerContext/endpoints/v1/omnichannel/cannedResponse'; import { useToastMessageDispatch } from '../../../../client/contexts/ToastMessagesContext'; import { useTranslation } from '../../../../client/contexts/TranslationContext'; import { useForm } from '../../../../client/hooks/useForm'; import CannedResponseForm from './components/cannedResponseForm'; const CannedResponseEdit: FC<{ - data: any; + data?: CannedResponseEndpointGetReturn; reload: () => void; - isNew: boolean; -}> = ({ data, reload, isNew = false }) => { + isNew?: boolean; + departmentData?: LivechatDepartmentSingleGetReturn; +}> = ({ data, reload, isNew = false, departmentData = {} }) => { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const Route = useRoute('omnichannel-canned-responses'); @@ -38,7 +41,7 @@ const CannedResponseEdit: FC<{ scope: data ? data.cannedResponse.scope : 'user', departmentId: data && data.cannedResponse && data.cannedResponse.departmentId - ? data.cannedResponse.departmentId + ? { value: data.cannedResponse.departmentId, label: departmentData?.department?.name } : '', }); diff --git a/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.js b/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx similarity index 52% rename from ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.js rename to ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx index 1ca745c6c0a9c..50462f5c05674 100644 --- a/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.js +++ b/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx @@ -1,15 +1,22 @@ import { Callout } from '@rocket.chat/fuselage'; -import React, { useMemo } from 'react'; +import React, { FC } from 'react'; import { FormSkeleton } from '../../../../client/components/Skeleton'; import { useTranslation } from '../../../../client/contexts/TranslationContext'; import { AsyncStatePhase } from '../../../../client/hooks/useAsyncState'; import { useEndpointData } from '../../../../client/hooks/useEndpointData'; import CannedResponseEdit from './CannedResponseEdit'; +import CannedResponseEditWithDepartmentData from './CannedResponseEditWithDepartmentData'; -function CannedResponseEditWithData({ cannedResponseId, reload, title }) { - const query = useMemo(() => ({ _id: cannedResponseId }), [cannedResponseId]); - const { value: data, phase: state, error } = useEndpointData('canned-responses.getOne', query); +const CannedResponseEditWithData: FC<{ + cannedResponseId: string; + reload: () => void; +}> = ({ cannedResponseId, reload }) => { + const { + value: data, + phase: state, + error, + } = useEndpointData(`canned-responses/${cannedResponseId}` as 'canned-responses/${string}'); const t = useTranslation(); @@ -25,14 +32,11 @@ function CannedResponseEditWithData({ cannedResponseId, reload, title }) { ); } - return ( - - ); -} + if (data?.cannedResponse?.scope === 'department') { + return ; + } + + return ; +}; export default CannedResponseEditWithData; diff --git a/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx b/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx new file mode 100644 index 0000000000000..1fb9daa7aafe3 --- /dev/null +++ b/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx @@ -0,0 +1,39 @@ +import { Callout } from '@rocket.chat/fuselage'; +import React, { useMemo, FC } from 'react'; + +import { FormSkeleton } from '../../../../client/components/Skeleton'; +import { CannedResponseEndpointGetReturn } from '../../../../client/contexts/ServerContext/endpoints/v1/omnichannel/cannedResponse'; +import { useTranslation } from '../../../../client/contexts/TranslationContext'; +import { AsyncStatePhase } from '../../../../client/hooks/useAsyncState'; +import { useEndpointData } from '../../../../client/hooks/useEndpointData'; +import CannedResponseEdit from './CannedResponseEdit'; + +const CannedResponseEditWithData: FC<{ + data: CannedResponseEndpointGetReturn | undefined; + reload: () => void; +}> = ({ data, reload }) => { + const departmentId = useMemo(() => data?.cannedResponse?.departmentId, [data]) as string; + const { + value: departmentData, + phase: state, + error, + } = useEndpointData(`livechat/department/${departmentId}` as 'livechat/department/${string}'); + + const t = useTranslation(); + + if (state === AsyncStatePhase.LOADING) { + return ; + } + + if (error) { + return ( + + {t('Not_Available')} + + ); + } + + return ; +}; + +export default CannedResponseEditWithData; diff --git a/ee/client/omnichannel/cannedResponses/CannedResponseNew.js b/ee/client/omnichannel/cannedResponses/CannedResponseNew.js deleted file mode 100644 index 38edbd1990cc4..0000000000000 --- a/ee/client/omnichannel/cannedResponses/CannedResponseNew.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -import CannedResponseEdit from './CannedResponseEdit'; - -function CannedResponseNew({ reload }) { - return ; -} - -export default CannedResponseNew; diff --git a/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx b/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx new file mode 100644 index 0000000000000..bee08724d0f8b --- /dev/null +++ b/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx @@ -0,0 +1,9 @@ +import React, { FC } from 'react'; + +import CannedResponseEdit from './CannedResponseEdit'; + +const CannedResponseNew: FC<{ reload: () => void }> = ({ reload }) => ( + +); + +export default CannedResponseNew; diff --git a/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx b/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx index 110ceb1c249cd..945100eb9d371 100644 --- a/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx +++ b/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx @@ -172,10 +172,8 @@ const CannedResponsesRoute: FC = () => { [getTime, onRowClick, reload], ); - if (context === 'edit') { - return ( - - ); + if (context === 'edit' && id) { + return ; } if (context === 'new') {