@@ -151,9 +151,11 @@ interface SelectedResource {
151151 [ key : string ] : unknown ;
152152}
153153
154+ type SelectedResources = SelectedResource | SelectedResource [ ] ;
155+
154156export type ResourceAccessArg = {
155157 resourceType : string ;
156- resourceId : string ;
158+ resourceId : string | string [ ] ;
157159 resourceAccessMappingPayload : {
158160 grant_access : string [ ] ;
159161 revoke_access : string [ ] ;
@@ -167,8 +169,8 @@ import { VISIBILITY } from '../../constants/constants';
167169interface ShareModalProps {
168170 /** Function to close the share modal */
169171 handleShareModalClose : ( ) => void ;
170- /** The resource that is selected for sharing.*/
171- selectedResource : SelectedResource ;
172+ /** The resource(s) that is selected for sharing.*/
173+ selectedResource : SelectedResources ;
172174 /** The name of the data being shared, like design or filter */
173175 dataName : string ;
174176 /** Data of the user who owns the resource */
@@ -212,26 +214,29 @@ const ShareModal: React.FC<ShareModalProps> = ({
212214 useGetAllUsersQuery,
213215 shareableLink
214216} : ShareModalProps ) : JSX . Element => {
217+ console . log ( 'amit selectdResource' , selectedResource ) ;
215218 const theme = useTheme ( ) ;
216219 const [ openMenu , setMenu ] = useState < boolean > ( false ) ;
217220 const [ shareUserData , setShareUserData ] = useState < User [ ] > ( [ ] ) ;
218- const [ resourceVisibility , setVisibility ] = useState ( selectedResource . visibility ) ;
221+ const [ resourceVisibility , setVisibility ] = useState (
222+ Array . isArray ( selectedResource ) ? selectedResource [ 0 ] . visibility : selectedResource . visibility
223+ ) ;
224+ console . log ( 'amit resourceVisibility' , resourceVisibility ) ;
219225 const [ isUpdatingVisibility , setUpdatingVisibility ] = useState ( false ) ;
220226
221- const userCanUpdateVisibility = canUpdateResourceVisibility (
222- selectedResource ,
223- currentUser ,
224- ownerData
225- ) ;
226- const userCanShareWithNewUsers = canShareResourceWithNewUsers (
227- selectedResource ,
228- currentUser ,
229- ownerData
230- ) ;
227+ const userCanUpdateVisibility = Array . isArray ( selectedResource )
228+ ? selectedResource . every ( ( resource ) =>
229+ canUpdateResourceVisibility ( resource , currentUser , ownerData )
230+ )
231+ : canUpdateResourceVisibility ( selectedResource , currentUser , ownerData ) ;
232+
233+ const userCanShareWithNewUsers = Array . isArray ( selectedResource )
234+ ? selectedResource . every ( ( resource ) =>
235+ canShareResourceWithNewUsers ( resource , currentUser , ownerData )
236+ )
237+ : canShareResourceWithNewUsers ( selectedResource , currentUser , ownerData ) ;
231238
232239 const handleCopy = ( ) => {
233- // const shareableLink = getShareableResourceRoute(dataName,selectedResource.id,selectedResource.name)
234- console . log ( 'shareableLink' , shareableLink ) ;
235240 navigator . clipboard . writeText ( shareableLink ) ;
236241 notify ( {
237242 message : 'Link copied to clipboard' ,
@@ -242,16 +247,49 @@ const ShareModal: React.FC<ShareModalProps> = ({
242247 const resourceType = dataName === 'design' ? 'pattern' : dataName ;
243248
244249 const handleShareWithNewUsers = async ( newUsers : User [ ] ) => {
245- console . log ( 'new users' , newUsers ) ;
246250 const grantAccessList = newUsers . map ( ( user ) => ( {
247251 actor_id : user . user_id ,
248252 actor_type : 'user'
249253 } ) ) ;
250254 const emails = newUsers . map ( ( u ) => u . email ) ;
251255
256+ if ( Array . isArray ( selectedResource ) ) {
257+ const responses = await Promise . all (
258+ selectedResource . map ( ( resource ) =>
259+ resourceAccessMutator ( {
260+ resourceType,
261+ resourceId : resource . id ,
262+ resourceAccessMappingPayload : {
263+ grant_access : [ ...grantAccessList ] ,
264+ revoke_access : [ ] ,
265+ notify_users : true
266+ }
267+ } )
268+ )
269+ ) ;
270+
271+ const hasError = responses . some ( ( response ) => response ?. error ) ;
272+
273+ if ( ! hasError ) {
274+ notify ( {
275+ message : `${ dataName } s shared with ${ emails . join ( ', ' ) } ` ,
276+ event_type : 'success'
277+ } ) ;
278+ } else {
279+ notify ( {
280+ message : `An error occurred. Some ${ dataName } s may not have been shared` ,
281+ event_type : 'error'
282+ } ) ;
283+ }
284+
285+ return {
286+ error : hasError ? 'Some resources failed to share' : ''
287+ } ;
288+ }
289+
252290 const response = await resourceAccessMutator ( {
253291 resourceType,
254- resourceId : selectedResource ? .id ,
292+ resourceId : ! Array . isArray ( selectedResource ) ? selectedResource . id : selectedResource [ 0 ] . id ,
255293 resourceAccessMappingPayload : {
256294 grant_access : [ ...grantAccessList ] ,
257295 revoke_access : [ ] ,
@@ -260,9 +298,8 @@ const ShareModal: React.FC<ShareModalProps> = ({
260298 } ) ;
261299
262300 if ( ! response ?. error ) {
263- const msg = `${ dataName } shared with ${ emails . join ( ', ' ) } ` ;
264301 notify ( {
265- message : msg ,
302+ message : ` ${ dataName } shared with ${ emails . join ( ', ' ) } ` ,
266303 event_type : 'success'
267304 } ) ;
268305 }
@@ -288,7 +325,7 @@ const ShareModal: React.FC<ShareModalProps> = ({
288325
289326 const response = await resourceAccessMutator ( {
290327 resourceType,
291- resourceId : selectedResource ? .id ,
328+ resourceId : ! Array . isArray ( selectedResource ) ? selectedResource . id : selectedResource [ 0 ] . id ,
292329 resourceAccessMappingPayload : {
293330 grant_access : [ ] ,
294331 revoke_access : [ ...revokeAccessList ] ,
@@ -327,7 +364,9 @@ const ShareModal: React.FC<ShareModalProps> = ({
327364
328365 /* eslint-disable @typescript-eslint/no-explicit-any */
329366 const notifyVisibilityChange = ( res : any , value : any ) => {
330- const UPDATE_VISIBILITY_MSG = `${ startCase ( dataName ) } '${ selectedResource . name } ' is now ${ value } ` ;
367+ const UPDATE_VISIBILITY_MSG = Array . isArray ( selectedResource )
368+ ? `${ startCase ( dataName ) } s (${ selectedResource . length } ) are now ${ value } `
369+ : `${ startCase ( dataName ) } '${ selectedResource . name } ' is now ${ value } ` ;
331370 const FAILED_TO_UPDATE_VISIBILITY_MSG = `Failed to update visibility. ${ res ?. error ?. error || '' } ` ;
332371
333372 if ( ! res . error ) {
@@ -378,7 +417,11 @@ const ShareModal: React.FC<ShareModalProps> = ({
378417 < Modal
379418 open = { true }
380419 closeModal = { handleShareModalClose }
381- title = { `Share ${ dataName } "${ selectedResource ?. name } "` }
420+ title = {
421+ Array . isArray ( selectedResource )
422+ ? `Share ${ selectedResource . length } ${ dataName } s`
423+ : `Share ${ dataName } "${ selectedResource ?. name } "`
424+ }
382425 >
383426 < ModalBody >
384427 < UserShareSearch
@@ -395,7 +438,7 @@ const ShareModal: React.FC<ShareModalProps> = ({
395438 hostURL = { hostURL }
396439 />
397440
398- { resourceVisibility !== 'published' && (
441+ { ! Array . isArray ( selectedResource ) && resourceVisibility !== 'published' && (
399442 < >
400443 < CustomListItemText >
401444 < Typography variant = "h6" > General Access</ Typography >
0 commit comments