@@ -151,9 +151,11 @@ interface SelectedResource {
151
151
[ key : string ] : unknown ;
152
152
}
153
153
154
+ type SelectedResources = SelectedResource | SelectedResource [ ] ;
155
+
154
156
export type ResourceAccessArg = {
155
157
resourceType : string ;
156
- resourceId : string ;
158
+ resourceId : string | string [ ] ;
157
159
resourceAccessMappingPayload : {
158
160
grant_access : string [ ] ;
159
161
revoke_access : string [ ] ;
@@ -167,8 +169,8 @@ import { VISIBILITY } from '../../constants/constants';
167
169
interface ShareModalProps {
168
170
/** Function to close the share modal */
169
171
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 ;
172
174
/** The name of the data being shared, like design or filter */
173
175
dataName : string ;
174
176
/** Data of the user who owns the resource */
@@ -212,26 +214,29 @@ const ShareModal: React.FC<ShareModalProps> = ({
212
214
useGetAllUsersQuery,
213
215
shareableLink
214
216
} : ShareModalProps ) : JSX . Element => {
217
+ console . log ( 'amit selectdResource' , selectedResource ) ;
215
218
const theme = useTheme ( ) ;
216
219
const [ openMenu , setMenu ] = useState < boolean > ( false ) ;
217
220
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 ) ;
219
225
const [ isUpdatingVisibility , setUpdatingVisibility ] = useState ( false ) ;
220
226
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 ) ;
231
238
232
239
const handleCopy = ( ) => {
233
- // const shareableLink = getShareableResourceRoute(dataName,selectedResource.id,selectedResource.name)
234
- console . log ( 'shareableLink' , shareableLink ) ;
235
240
navigator . clipboard . writeText ( shareableLink ) ;
236
241
notify ( {
237
242
message : 'Link copied to clipboard' ,
@@ -242,16 +247,49 @@ const ShareModal: React.FC<ShareModalProps> = ({
242
247
const resourceType = dataName === 'design' ? 'pattern' : dataName ;
243
248
244
249
const handleShareWithNewUsers = async ( newUsers : User [ ] ) => {
245
- console . log ( 'new users' , newUsers ) ;
246
250
const grantAccessList = newUsers . map ( ( user ) => ( {
247
251
actor_id : user . user_id ,
248
252
actor_type : 'user'
249
253
} ) ) ;
250
254
const emails = newUsers . map ( ( u ) => u . email ) ;
251
255
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
+
252
290
const response = await resourceAccessMutator ( {
253
291
resourceType,
254
- resourceId : selectedResource ? .id ,
292
+ resourceId : ! Array . isArray ( selectedResource ) ? selectedResource . id : selectedResource [ 0 ] . id ,
255
293
resourceAccessMappingPayload : {
256
294
grant_access : [ ...grantAccessList ] ,
257
295
revoke_access : [ ] ,
@@ -260,9 +298,8 @@ const ShareModal: React.FC<ShareModalProps> = ({
260
298
} ) ;
261
299
262
300
if ( ! response ?. error ) {
263
- const msg = `${ dataName } shared with ${ emails . join ( ', ' ) } ` ;
264
301
notify ( {
265
- message : msg ,
302
+ message : ` ${ dataName } shared with ${ emails . join ( ', ' ) } ` ,
266
303
event_type : 'success'
267
304
} ) ;
268
305
}
@@ -288,7 +325,7 @@ const ShareModal: React.FC<ShareModalProps> = ({
288
325
289
326
const response = await resourceAccessMutator ( {
290
327
resourceType,
291
- resourceId : selectedResource ? .id ,
328
+ resourceId : ! Array . isArray ( selectedResource ) ? selectedResource . id : selectedResource [ 0 ] . id ,
292
329
resourceAccessMappingPayload : {
293
330
grant_access : [ ] ,
294
331
revoke_access : [ ...revokeAccessList ] ,
@@ -327,7 +364,9 @@ const ShareModal: React.FC<ShareModalProps> = ({
327
364
328
365
/* eslint-disable @typescript-eslint/no-explicit-any */
329
366
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 } ` ;
331
370
const FAILED_TO_UPDATE_VISIBILITY_MSG = `Failed to update visibility. ${ res ?. error ?. error || '' } ` ;
332
371
333
372
if ( ! res . error ) {
@@ -378,7 +417,11 @@ const ShareModal: React.FC<ShareModalProps> = ({
378
417
< Modal
379
418
open = { true }
380
419
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
+ }
382
425
>
383
426
< ModalBody >
384
427
< UserShareSearch
@@ -395,7 +438,7 @@ const ShareModal: React.FC<ShareModalProps> = ({
395
438
hostURL = { hostURL }
396
439
/>
397
440
398
- { resourceVisibility !== 'published' && (
441
+ { ! Array . isArray ( selectedResource ) && resourceVisibility !== 'published' && (
399
442
< >
400
443
< CustomListItemText >
401
444
< Typography variant = "h6" > General Access</ Typography >
0 commit comments