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.js 4.6KB

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