11import React , {
2- useCallback , useEffect , useMemo , useState ,
2+ useCallback , useEffect , useState ,
33} from 'react' ;
44import PropTypes from 'prop-types' ;
5- import debounce from 'lodash.debounce ' ;
5+ import _ from 'lodash' ;
66import {
77 Col , Container , Form , Hyperlink , Row ,
88} from '@openedx/paragon' ;
@@ -11,10 +11,11 @@ import { FormattedMessage } from '@edx/frontend-platform/i18n';
1111import InviteModalSummary from '../learner-credit-management/invite-modal/InviteModalSummary' ;
1212import InviteSummaryCount from '../learner-credit-management/invite-modal/InviteSummaryCount' ;
1313import FileUpload from '../learner-credit-management/invite-modal/FileUpload' ;
14- import { EMAIL_ADDRESSES_INPUT_VALUE_DEBOUNCE_DELAY , isInviteEmailAddressesInputValueValid } from '../learner-credit-management/cards/data' ;
14+ import { isInviteEmailAddressesInputValueValid } from '../learner-credit-management/cards/data' ;
1515import { HELP_CENTER_URL , MAX_LENGTH_GROUP_NAME } from './constants' ;
1616import EnterpriseCustomerUserDataTable from './EnterpriseCustomerUserDataTable' ;
1717import { useEnterpriseLearners } from '../learner-credit-management/data' ;
18+ import { splitAndTrim } from '../../utils' ;
1819
1920const CreateGroupModalContent = ( {
2021 enterpriseUUID,
@@ -25,7 +26,6 @@ const CreateGroupModalContent = ({
2526 setIsCreateGroupListSelection,
2627} ) => {
2728 const [ learnerEmails , setLearnerEmails ] = useState ( [ ] ) ;
28- const [ emailAddressesInputValue , setEmailAddressesInputValue ] = useState ( '' ) ;
2929 const [ memberInviteMetadata , setMemberInviteMetadata ] = useState ( {
3030 isValidInput : null ,
3131 lowerCasedEmails : [ ] ,
@@ -69,25 +69,12 @@ const CreateGroupModalContent = ({
6969 setLearnerEmails ( prev => prev . filter ( ( el ) => ! value . includes ( el ) ) ) ;
7070 } , [ onEmailAddressesChange ] ) ;
7171
72- const handleEmailAddressesChanged = useCallback ( ( value ) => {
73- if ( ! value ) {
74- setLearnerEmails ( [ ] ) ;
75- onEmailAddressesChange ( [ ] ) ;
76- return ;
77- }
78- // handles csv upload value and formats emails into an array of strings
79- const emails = value . split ( '\n' ) . map ( ( email ) => email . trim ( ) ) . filter ( ( email ) => email . length > 0 ) ;
80- setLearnerEmails ( emails ) ;
81- } , [ onEmailAddressesChange ] ) ;
82-
83- const debouncedHandleEmailAddressesChanged = useMemo (
84- ( ) => debounce ( handleEmailAddressesChanged , EMAIL_ADDRESSES_INPUT_VALUE_DEBOUNCE_DELAY ) ,
85- [ handleEmailAddressesChanged ] ,
86- ) ;
87-
88- useEffect ( ( ) => {
89- debouncedHandleEmailAddressesChanged ( emailAddressesInputValue ) ;
90- } , [ emailAddressesInputValue , debouncedHandleEmailAddressesChanged ] ) ;
72+ const handleCsvUpload = useCallback ( ( emails ) => {
73+ // Merge new emails with old emails (removing duplicates)
74+ const allEmails = _ . union ( learnerEmails , splitAndTrim ( '\n' , emails ) ) ;
75+ setLearnerEmails ( allEmails ) ;
76+ setIsCreateGroupFileUpload ( true ) ;
77+ } , [ learnerEmails , setIsCreateGroupFileUpload ] ) ;
9178
9279 // Validate the learner emails emails from user input whenever it changes
9380 useEffect ( ( ) => {
@@ -151,7 +138,7 @@ const CreateGroupModalContent = ({
151138 </ p >
152139 < FileUpload
153140 memberInviteMetadata = { memberInviteMetadata }
154- setEmailAddressesInputValue = { setEmailAddressesInputValue }
141+ setEmailAddressesInputValue = { handleCsvUpload }
155142 setIsCreateGroupFileUpload = { setIsCreateGroupFileUpload }
156143 />
157144 </ Col >
0 commit comments