您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

useSalesforceLinkDialog.ts 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { useCallback, useEffect, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { useDispatch, useSelector } from 'react-redux';
  4. import { IReduxState } from '../app/types';
  5. import { getCurrentConference } from '../base/conference/functions';
  6. import { hideNotification, showNotification } from '../notifications/actions';
  7. import {
  8. NOTIFICATION_TIMEOUT_TYPE,
  9. NOTIFICATION_TYPE,
  10. SALESFORCE_LINK_NOTIFICATION_ID
  11. } from '../notifications/constants';
  12. import {
  13. executeLinkMeetingRequest,
  14. getRecentSessionRecords,
  15. getSessionRecordDetails,
  16. searchSessionRecords
  17. } from './functions';
  18. interface ISelectedRecord {
  19. id: string;
  20. name: string;
  21. onClick: (e?: React.MouseEvent) => void;
  22. type: string;
  23. }
  24. export const useSalesforceLinkDialog = () => {
  25. const { t } = useTranslation();
  26. const dispatch = useDispatch();
  27. const [ selectedRecord, setSelectedRecord ] = useState<ISelectedRecord | null>(null);
  28. const [ selectedRecordOwner, setSelectedRecordOwner ] = useState<{
  29. id: string; name: string; type: string; } | null>(null);
  30. const [ records, setRecords ] = useState([]);
  31. const [ isLoading, setLoading ] = useState(false);
  32. const [ searchTerm, setSearchTerm ] = useState<string | null>(null);
  33. const [ notes, setNotes ] = useState('');
  34. const [ hasRecordsErrors, setRecordsErrors ] = useState(false);
  35. const [ hasDetailsErrors, setDetailsErrors ] = useState(false);
  36. const conference = useSelector(getCurrentConference);
  37. const sessionId = conference?.getMeetingUniqueId();
  38. const { salesforceUrl = '' } = useSelector((state: IReduxState) => state['features/base/config']);
  39. const { jwt = '' } = useSelector((state: IReduxState) => state['features/base/jwt']);
  40. const showSearchResults = searchTerm && searchTerm.length > 1;
  41. const showNoResults = showSearchResults && records.length === 0;
  42. useEffect(() => {
  43. const fetchRecords = async () => {
  44. setRecordsErrors(false);
  45. setLoading(true);
  46. try {
  47. const text = showSearchResults ? searchTerm : null;
  48. const result = text
  49. ? await searchSessionRecords(salesforceUrl, jwt, text)
  50. : await getRecentSessionRecords(salesforceUrl, jwt);
  51. setRecords(result);
  52. } catch (error) {
  53. setRecordsErrors(true);
  54. }
  55. setLoading(false);
  56. };
  57. fetchRecords();
  58. }, [
  59. getRecentSessionRecords,
  60. jwt,
  61. salesforceUrl,
  62. searchSessionRecords,
  63. searchTerm
  64. ]);
  65. useEffect(() => {
  66. const fetchRecordDetails = async () => {
  67. setDetailsErrors(false);
  68. setSelectedRecordOwner(null);
  69. try {
  70. const result = await getSessionRecordDetails(salesforceUrl, jwt, selectedRecord);
  71. setSelectedRecordOwner({
  72. id: result.id,
  73. name: result.ownerName,
  74. type: 'OWNER'
  75. });
  76. } catch (error) {
  77. setDetailsErrors(true);
  78. }
  79. };
  80. selectedRecord && fetchRecordDetails();
  81. }, [
  82. jwt,
  83. getSessionRecordDetails,
  84. salesforceUrl,
  85. selectedRecord
  86. ]);
  87. const linkMeeting = useCallback(async () => {
  88. dispatch(showNotification({
  89. titleKey: 'notify.linkToSalesforceProgress',
  90. uid: SALESFORCE_LINK_NOTIFICATION_ID,
  91. appearance: NOTIFICATION_TYPE.NORMAL
  92. }, NOTIFICATION_TIMEOUT_TYPE.STICKY));
  93. try {
  94. await executeLinkMeetingRequest(salesforceUrl, jwt, sessionId, {
  95. id: selectedRecord?.id,
  96. type: selectedRecord?.type,
  97. notes
  98. });
  99. dispatch(hideNotification(SALESFORCE_LINK_NOTIFICATION_ID));
  100. dispatch(showNotification({
  101. titleKey: 'notify.linkToSalesforceSuccess',
  102. uid: SALESFORCE_LINK_NOTIFICATION_ID,
  103. appearance: NOTIFICATION_TYPE.SUCCESS
  104. }, NOTIFICATION_TIMEOUT_TYPE.LONG));
  105. } catch (error: any) {
  106. dispatch(hideNotification(SALESFORCE_LINK_NOTIFICATION_ID));
  107. dispatch(showNotification({
  108. titleKey: 'notify.linkToSalesforceError',
  109. descriptionKey: error?.messageKey && t(error.messageKey),
  110. uid: SALESFORCE_LINK_NOTIFICATION_ID,
  111. appearance: NOTIFICATION_TYPE.ERROR
  112. }, NOTIFICATION_TIMEOUT_TYPE.LONG));
  113. }
  114. }, [
  115. executeLinkMeetingRequest,
  116. hideNotification,
  117. jwt,
  118. notes,
  119. salesforceUrl,
  120. selectedRecord,
  121. showNotification
  122. ]);
  123. return {
  124. hasDetailsErrors,
  125. hasRecordsErrors,
  126. isLoading,
  127. linkMeeting,
  128. notes,
  129. records,
  130. searchTerm,
  131. selectedRecord,
  132. selectedRecordOwner,
  133. setNotes,
  134. setSearchTerm,
  135. setSelectedRecord,
  136. showNoResults,
  137. showSearchResults
  138. };
  139. };