callback.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import { useRef, useState } from 'react';
  2. import { Modal } from 'app/design/controls';
  3. import { ScrollView } from 'app/design/view';
  4. import { fetcher } from 'app/lib/fetcher';
  5. import Submenu from './submenu';
  6. import SubmenuShare from './submenu-share';
  7. import Redirect from 'app/ui/atoms/redirect';
  8. import { useBottomSheetData } from 'app/context/bottomsheet';
  9. import { Platform } from 'react-native';
  10. import RbList from 'app/ui/molecules/form-controls/radio-list';
  11. import ChkList from 'app/ui/molecules/form-controls/checkbox-list';
  12. import { storageClear } from 'app/lib/util';
  13. import Badge from 'app/ui/molecules/profile/badge';
  14. import Msg from 'app/ui/molecules/dialogs/msg';
  15. import Stripe from 'app/ui/molecules/integrations/stripe';
  16. import emitter, { EVENTS } from 'app/context/emitter';
  17. import MenuItemActionBase, {
  18. getMenuItemFlags,
  19. resolveMenuItemIcon,
  20. MenuItemSubmenuSwitch,
  21. } from 'app/lib/menu-item-helpers';
  22. const ICON_ALIASES = {
  23. 'item-comment': 'MessageCircleMore',
  24. 'item-share': 'Share2',
  25. };
  26. const SUBMENU_MAP = {
  27. 'bx_timeline_menu_item_share': SubmenuShare,
  28. };
  29. const handleClick = async (event, oProps, setBottomSheetData, redirectdRef, buttonProps, setButtonProps, setShowMsg, setShowModal) => {
  30. const setMembership = async (val) => {
  31. oProps.data.value = val;
  32. const request_url = '/api.php?r=system/set_membership/TemplServiceProfiles&params[]=' + oProps.data.profile_id + '&params[]=' + val;
  33. await fetcher(request_url);
  34. setBottomSheetData(false);
  35. };
  36. const setBadges = async (val) => {
  37. oProps.data.value = val;
  38. const request_url = '/api.php?r=system/set_badges/TemplServices&params[]=' + oProps.data.content_id + '&params[]=' + val + '&params[]=' + oProps.data.module;
  39. await fetcher(request_url);
  40. setBottomSheetData(false);
  41. };
  42. if (oProps.content_type == 'memberships') {
  43. if (Platform.OS == 'web') {
  44. const popperDiv = document.querySelector('div[data-radix-popper-content-wrapper]');
  45. if (popperDiv) {
  46. popperDiv.classList.add('radix-hide');
  47. }
  48. }
  49. setBottomSheetData({ title: 'Choose membership', showClose: true, snapPoints: ['70%', '70%'], content: <RbList values={oProps.data.values} setValue={setMembership} selectedValue={oProps.data.value} /> });
  50. return;
  51. }
  52. if (oProps.content_type == 'badges') {
  53. if (Platform.OS == 'web') {
  54. const popperDiv = document.querySelector('div[data-radix-popper-content-wrapper]');
  55. if (popperDiv) {
  56. popperDiv.classList.add('radix-hide');
  57. }
  58. }
  59. const badges = oProps.data.values.map((badge) => ({
  60. ...badge,
  61. icon: null,
  62. label: <Badge data={{ ...badge, text: badge.label }} />,
  63. }));
  64. setBottomSheetData({ title: 'Choose badges', showClose: true, snapPoints: ['70%', '70%'], content: <ChkList values={badges} setValue={setBadges} selectedValue={oProps.data.value} /> });
  65. return;
  66. }
  67. let request_url = '/api.php?r=' + buttonProps.request_url;
  68. const sResponse = await fetcher(request_url);
  69. if (oProps.data.on_callback == 'hide') {
  70. setButtonProps({ ...buttonProps, visible: false });
  71. // Wiki delete-block: refresh the page shell so the block disappears.
  72. if (String(buttonProps.request_url || '').includes('wiki_action')) {
  73. emitter.emit(EVENTS.wiki, { action: 'reload' });
  74. }
  75. }
  76. if (oProps.data.on_callback == 'change')
  77. setButtonProps({ ...buttonProps, title: sResponse.data?.title, request_url: sResponse.data?.request_url });
  78. if (oProps.data.on_callback == 'redirect') {
  79. if (sResponse.data?.[0]?.type == 'msg') {
  80. setShowMsg(sResponse.data?.[0]?.data);
  81. }
  82. else {
  83. redirectdRef.current.redirect(sResponse.data?.url ? sResponse.data?.url : sResponse.data);
  84. }
  85. }
  86. if (oProps.data.on_callback == 'alert') {
  87. if (oProps.data.on_callback_clear_cache)
  88. storageClear();
  89. emitter.emit(EVENTS.connections, { action: 'changed', reload: true });
  90. }
  91. if (oProps.data.on_callback == 'alert,hide') {
  92. setButtonProps({ ...buttonProps, visible: false });
  93. if (oProps.data.on_callback_clear_cache)
  94. storageClear();
  95. emitter.emit(EVENTS.connections, { action: 'changed', reload: true });
  96. }
  97. if (oProps.data.on_callback == 'object') {
  98. const paymentData = {
  99. ...oProps.data,
  100. ...(sResponse?.data && typeof sResponse.data === 'object' && !Array.isArray(sResponse.data) ? sResponse.data : {}),
  101. };
  102. if (paymentData.object_name == 'stripe_v3') {
  103. setShowModal(paymentData);
  104. }
  105. }
  106. };
  107. export default function MenuItemCallback(oProps) {
  108. const redirectdRef = useRef();
  109. const { setBottomSheetData } = useBottomSheetData();
  110. const [buttonProps, setButtonProps] = useState({ isVisible: true, title: oProps.title, request_url: oProps.data?.request_url });
  111. const [showMsg, setShowMsg] = useState(false);
  112. const [showModal, setShowModal] = useState(false);
  113. const { showVertical } = getMenuItemFlags(oProps);
  114. if (!buttonProps.isVisible)
  115. return <></>;
  116. const msgBox = <Msg onVisible={showMsg} title={showMsg} handleOk={() => { setShowMsg(false); }} />;
  117. const stripeModal = showModal ? (
  118. <Modal onVisible={!!showModal} onClose={() => { setShowModal(false); }} transparent={false}>
  119. <ScrollView className="h-[400px]">
  120. <Stripe payment_type={showModal.payment_type} seller_id={showModal.seller_id} items={showModal.items} />
  121. </ScrollView>
  122. </Modal>
  123. ) : null;
  124. if (oProps.content_type === 'submenu') {
  125. return (
  126. <MenuItemSubmenuSwitch
  127. item={oProps}
  128. map={SUBMENU_MAP}
  129. Fallback={Submenu}
  130. extra={<>{msgBox}{stripeModal}</>}
  131. wrapperClassName={'menu-item flex-auto ' + (showVertical ? ' w-full' : ' flex-row items-center justify-center')}
  132. />
  133. );
  134. }
  135. const sButtonIcon = resolveMenuItemIcon(oProps, { aliases: ICON_ALIASES, preferAliases: true });
  136. const onPress = (event) => handleClick(event, oProps, setBottomSheetData, redirectdRef, buttonProps, setButtonProps, setShowMsg, setShowModal);
  137. return (
  138. <MenuItemActionBase
  139. item={oProps}
  140. title={buttonProps.title}
  141. icon={sButtonIcon}
  142. onPress={onPress}
  143. extra={
  144. <>
  145. <Redirect ref={redirectdRef} />
  146. {msgBox}
  147. {stripeModal}
  148. </>
  149. }
  150. innerClassName="flex-auto"
  151. />
  152. );
  153. }