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.

useSalesforceLinkDialog.ts 5.1KB

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