add-collaborators.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { useMemo } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { useMultipleSelection } from 'downshift'
  4. import SelectCollaborators, { ContactItem } from './select-collaborators'
  5. import { useUserContacts } from '../hooks/use-user-contacts'
  6. import { useProjectContext } from '@/shared/context/project-context'
  7. import OLForm from '@/shared/components/ol/ol-form'
  8. import OLFormText from '@/shared/components/ol/ol-form-text'
  9. import OLFormGroup from '@/shared/components/ol/ol-form-group'
  10. import AddCollaboratorsSelect from '@/features/share-project-modal/components/add-collaborators-select'
  11. import { useFeatureFlag } from '@/shared/context/split-test-context'
  12. export default function AddCollaborators({ readOnly }: { readOnly?: boolean }) {
  13. const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates')
  14. const { data: contacts } = useUserContacts()
  15. const { t } = useTranslation()
  16. const { project } = useProjectContext()
  17. const { members } = project || {}
  18. const currentMemberEmails = useMemo(
  19. () => (members || []).map(member => member.email.toLowerCase()).sort(),
  20. [members]
  21. )
  22. const nonMemberContacts = useMemo(() => {
  23. if (!contacts) {
  24. return null
  25. }
  26. return contacts.filter(
  27. contact => !currentMemberEmails.includes(contact.email.toLowerCase())
  28. )
  29. }, [contacts, currentMemberEmails])
  30. const multipleSelectionProps = useMultipleSelection<ContactItem>({
  31. initialActiveIndex: 0,
  32. initialSelectedItems: [],
  33. })
  34. return (
  35. <OLForm className="add-collabs">
  36. {isSharingUpdatesEnabled ? (
  37. <SelectCollaborators
  38. loading={!nonMemberContacts}
  39. options={nonMemberContacts || []}
  40. multipleSelectionProps={multipleSelectionProps}
  41. currentMemberEmails={currentMemberEmails}
  42. readOnly={readOnly}
  43. size="lg"
  44. />
  45. ) : (
  46. <>
  47. <OLFormGroup>
  48. <SelectCollaborators
  49. loading={!nonMemberContacts}
  50. options={nonMemberContacts || []}
  51. multipleSelectionProps={multipleSelectionProps}
  52. currentMemberEmails={currentMemberEmails}
  53. readOnly={readOnly}
  54. />
  55. <OLFormText id="add-collaborator-help-text">
  56. {t('add_comma_separated_emails_help')}
  57. </OLFormText>
  58. </OLFormGroup>
  59. <OLFormGroup>
  60. <div className="float-end add-collaborator-controls add-collaborator-controls-legacy">
  61. <AddCollaboratorsSelect
  62. readOnly={readOnly}
  63. multipleSelectionProps={multipleSelectionProps}
  64. currentMemberEmails={currentMemberEmails}
  65. />
  66. </div>
  67. </OLFormGroup>
  68. </>
  69. )}
  70. </OLForm>
  71. )
  72. }