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 4.9KB

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