index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import {css} from '@emotion/react';
  2. import type {ModalRenderProps} from 'sentry/actionCreators/modal';
  3. import ErrorBoundary from 'sentry/components/errorBoundary';
  4. import LoadingError from 'sentry/components/loadingError';
  5. import LoadingIndicator from 'sentry/components/loadingIndicator';
  6. import InviteMembersModalView from 'sentry/components/modals/inviteMembersModal/inviteMembersModalview';
  7. import type {InviteRow} from 'sentry/components/modals/inviteMembersModal/types';
  8. import useInviteModal from 'sentry/components/modals/inviteMembersModal/useInviteModal';
  9. import {InviteModalHook} from 'sentry/components/modals/memberInviteModalCustomization';
  10. import {t} from 'sentry/locale';
  11. import {trackAnalytics} from 'sentry/utils/analytics';
  12. import {isActiveSuperuser} from 'sentry/utils/isActiveSuperuser';
  13. import useOrganization from 'sentry/utils/useOrganization';
  14. interface InviteMembersModalProps extends ModalRenderProps {
  15. initialData?: Partial<InviteRow>[];
  16. source?: string;
  17. }
  18. function InviteMembersModal({
  19. closeModal,
  20. initialData,
  21. source,
  22. Footer,
  23. }: InviteMembersModalProps) {
  24. const organization = useOrganization();
  25. const {
  26. addInviteRow,
  27. invites,
  28. memberResult,
  29. removeInviteRow,
  30. reset,
  31. sendInvites,
  32. sessionId,
  33. setEmails,
  34. setRole,
  35. setTeams,
  36. willInvite,
  37. complete,
  38. inviteStatus,
  39. pendingInvites,
  40. sendingInvites,
  41. error,
  42. } = useInviteModal({
  43. initialData,
  44. organization,
  45. source,
  46. });
  47. if (memberResult.isLoading) {
  48. return <LoadingIndicator />;
  49. }
  50. if (memberResult.isError && !isActiveSuperuser()) {
  51. return (
  52. <LoadingError
  53. message={t('Failed to load members')}
  54. onRetry={memberResult.refetch}
  55. />
  56. );
  57. }
  58. return (
  59. <ErrorBoundary>
  60. <InviteModalHook
  61. organization={organization}
  62. willInvite={willInvite}
  63. onSendInvites={sendInvites}
  64. >
  65. {({sendInvites: _sendInvites, canSend, headerInfo}) => {
  66. return (
  67. <InviteMembersModalView
  68. addInviteRow={addInviteRow}
  69. canSend={canSend}
  70. closeModal={() => {
  71. trackAnalytics('invite_modal.closed', {
  72. organization,
  73. modal_session: sessionId,
  74. });
  75. closeModal();
  76. }}
  77. complete={complete}
  78. Footer={Footer}
  79. headerInfo={headerInfo}
  80. invites={invites}
  81. inviteStatus={inviteStatus}
  82. member={memberResult.data}
  83. pendingInvites={pendingInvites}
  84. removeInviteRow={removeInviteRow}
  85. reset={reset}
  86. sendingInvites={sendingInvites}
  87. sendInvites={sendInvites}
  88. setEmails={setEmails}
  89. setRole={setRole}
  90. setTeams={setTeams}
  91. willInvite={willInvite}
  92. error={error}
  93. />
  94. );
  95. }}
  96. </InviteModalHook>
  97. </ErrorBoundary>
  98. );
  99. }
  100. export const modalCss = css`
  101. width: 100%;
  102. max-width: 900px;
  103. margin: 50px auto;
  104. `;
  105. export default InviteMembersModal;