11import { PrimaryAppOption } from './ComputeSessionNodeItems/SessionActionButtons' ;
2- import { App , ButtonProps , Image , Tooltip } from 'antd' ;
3- import { BAIButton , useErrorMessageResolver } from 'backend.ai-ui' ;
2+ import { App , Image , Tooltip } from 'antd' ;
3+ import {
4+ BAIButton ,
5+ BAIButtonProps ,
6+ useErrorMessageResolver ,
7+ } from 'backend.ai-ui' ;
8+ import _ from 'lodash' ;
49import React from 'react' ;
510import { useTranslation } from 'react-i18next' ;
611import { graphql , useFragment } from 'react-relay' ;
712import { FileBrowserButtonFragment$key } from 'src/__generated__/FileBrowserButtonFragment.graphql' ;
8- import { useDefaultFileBrowserImageWithFallback } from 'src/hooks/useDefaultFileBrowserImageWithFallback' ;
13+ import { useCurrentDomainValue , useSuspendedBackendaiClient } from 'src/hooks' ;
14+ import { useSetBAINotification } from 'src/hooks/useBAINotification' ;
15+ import { useCurrentProjectValue } from 'src/hooks/useCurrentProject' ;
16+ import { useDefaultFileBrowserImageWithFallback } from 'src/hooks/useDefaultImagesWithFallback' ;
17+ import { useMergedAllowedStorageHostPermission } from 'src/hooks/useMergedAllowedStorageHostPermission' ;
918import {
19+ startSessionErrorCodes ,
1020 StartSessionWithDefaultValue ,
1121 useStartSession ,
1222} from 'src/hooks/useStartSession' ;
1323
14- interface FileBrowserButtonProps extends ButtonProps {
24+ interface FileBrowserButtonProps extends BAIButtonProps {
1525 showTitle ?: boolean ;
1626 vfolderFrgmt : FileBrowserButtonFragment$key ;
1727}
1828const FileBrowserButton : React . FC < FileBrowserButtonProps > = ( {
1929 showTitle = true ,
2030 vfolderFrgmt,
31+ ...buttonProps
2132} ) => {
2233 'use memo' ;
2334 const { t } = useTranslation ( ) ;
2435 const { message, modal } = App . useApp ( ) ;
2536
37+ const baiClient = useSuspendedBackendaiClient ( ) ;
38+ const currentDomain = useCurrentDomainValue ( ) ;
39+ const currentProject = useCurrentProjectValue ( ) ;
40+ const currentUserAccessKey = baiClient ?. _config ?. accessKey ;
41+ const { unitedAllowedPermissionByVolume } =
42+ useMergedAllowedStorageHostPermission (
43+ currentDomain ,
44+ currentProject . id ,
45+ currentUserAccessKey ,
46+ ) ;
47+
2648 const { getErrorMessage } = useErrorMessageResolver ( ) ;
2749 const { startSessionWithDefault, upsertSessionNotification } =
2850 useStartSession ( ) ;
51+ const { upsertNotification } = useSetBAINotification ( ) ;
2952
3053 const filebrowserImage = useDefaultFileBrowserImageWithFallback ( ) ;
3154
@@ -34,21 +57,29 @@ const FileBrowserButton: React.FC<FileBrowserButtonProps> = ({
3457 fragment FileBrowserButtonFragment on VirtualFolderNode {
3558 id
3659 row_id
60+ host
3761 }
3862 ` ,
3963 vfolderFrgmt ,
4064 ) ;
4165
66+ const hasAccessPermission = _ . includes (
67+ unitedAllowedPermissionByVolume [ vfolder ?. host ?? '' ] ,
68+ 'mount-in-session' ,
69+ ) ;
70+
71+ const getTooltipTitle = ( ) => {
72+ if ( ! hasAccessPermission ) {
73+ return t ( 'data.explorer.NoPermissionToMountFolder' ) ;
74+ } else if ( filebrowserImage === null ) {
75+ return t ( 'data.explorer.NoImagesSupportingFileBrowser' ) ;
76+ } else if ( ! showTitle && filebrowserImage ) {
77+ return t ( 'data.explorer.ExecuteFileBrowser' ) ;
78+ } else return '' ;
79+ } ;
80+
4281 return (
43- < Tooltip
44- title = {
45- filebrowserImage === null
46- ? t ( 'data.explorer.NoImagesSupportingFileBrowser' )
47- : ! showTitle &&
48- filebrowserImage &&
49- t ( 'data.explorer.ExecuteFileBrowser' )
50- }
51- >
82+ < Tooltip title = { getTooltipTitle ( ) } >
5283 < BAIButton
5384 icon = {
5485 < Image
@@ -65,7 +96,7 @@ const FileBrowserButton: React.FC<FileBrowserButtonProps> = ({
6596 }
6697 />
6798 }
68- disabled = { ! filebrowserImage }
99+ disabled = { ! filebrowserImage || ! hasAccessPermission }
69100 action = { async ( ) => {
70101 if ( ! filebrowserImage ) {
71102 return ;
@@ -100,17 +131,30 @@ const FileBrowserButton: React.FC<FileBrowserButtonProps> = ({
100131 }
101132 if ( results ?. rejected && results . rejected . length > 0 ) {
102133 const error = results . rejected [ 0 ] . reason ;
103- modal . error ( {
104- title : error ?. title ,
105- content : getErrorMessage ( error ) ,
106- } ) ;
134+ if (
135+ _ . includes (
136+ error . message ,
137+ startSessionErrorCodes . DUPLICATED_SESSION ,
138+ )
139+ ) {
140+ upsertNotification ( {
141+ key : `filebrowser-${ vfolder . row_id } ` ,
142+ open : true ,
143+ } ) ;
144+ } else {
145+ modal . error ( {
146+ title : error ?. title ,
147+ content : getErrorMessage ( error ) ,
148+ } ) ;
149+ }
107150 }
108151 } )
109152 . catch ( ( error ) => {
110153 console . error ( 'Unexpected error during session creation:' , error ) ;
111154 message . error ( t ( 'error.UnexpectedError' ) ) ;
112155 } ) ;
113156 } }
157+ { ...buttonProps }
114158 >
115159 { showTitle && t ( 'data.explorer.ExecuteFileBrowser' ) }
116160 </ BAIButton >
0 commit comments