@@ -27,6 +27,7 @@ export const WorkspaceProvider: React.FunctionComponent = () => {
2727 const [ workspaceServices , setWorkspaceServices ] = useState ( [ ] as Array < WorkspaceService > ) ;
2828 const [ sharedServices , setSharedServices ] = useState ( [ ] as Array < SharedService > ) ;
2929 const workspaceCtx = useRef ( useContext ( WorkspaceContext ) ) ;
30+ const [ wsRoles , setWSRoles ] = useState ( [ ] as Array < string > ) ;
3031 const [ loadingState , setLoadingState ] = useState ( LoadingState . Loading ) ;
3132 const [ apiError , setApiError ] = useState ( { } as APIError ) ;
3233 const { workspaceId } = useParams ( ) ;
@@ -37,41 +38,6 @@ export const WorkspaceProvider: React.FunctionComponent = () => {
3738
3839 // set workspace context from url
3940 useEffect ( ( ) => {
40- const getWorkspaceCosts = async ( ) => {
41- try {
42- // TODO: amend when costs enabled in API for WorkspaceRoleName.Researcher
43- if ( workspaceCtx . current . roles . includes ( WorkspaceRoleName . WorkspaceOwner ) ) {
44- let scopeId = ( await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } /scopeid` , HttpMethod . Get ) ) . workspaceAuth . scopeId ;
45- const r = await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } /${ ApiEndpoint . Costs } ` , HttpMethod . Get , scopeId , undefined , ResultType . JSON ) ;
46- const costs = [
47- ...r . costs ,
48- ...r . workspace_services ,
49- ...r . workspace_services . flatMap ( ( ws : { user_resources : any ; } ) => [
50- ...ws . user_resources
51- ] )
52- ] ;
53- workspaceCtx . current . setCosts ( costs ) ;
54- }
55- }
56- catch ( e : any ) {
57- if ( e instanceof APIError ) {
58- if ( e . status === 404 /*subscription not supported*/ ) {
59- }
60- else if ( e . status === 429 /*too many requests*/ || e . status === 503 /*service unavaiable*/ ) {
61- let msg = JSON . parse ( e . message ) ;
62- let retryAfter = Number ( msg . error [ "retry-after" ] ) ;
63- setTimeout ( getWorkspaceCosts , retryAfter * 1000 ) ;
64- }
65- else {
66- e . userMessage = 'Error retrieving costs' ;
67- }
68- }
69- else {
70- e . userMessage = 'Error retrieving costs' ;
71- }
72- setCostApiError ( e ) ;
73- }
74- } ;
7541
7642 const getWorkspace = async ( ) => {
7743 try {
@@ -95,16 +61,16 @@ export const WorkspaceProvider: React.FunctionComponent = () => {
9561 ws = ( await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } ` , HttpMethod . Get , scopeId ) ) . workspace ;
9662 workspaceCtx . current . setWorkspace ( ws ) ;
9763 workspaceCtx . current . setRoles ( wsRoles ) ;
64+ setWSRoles ( wsRoles ) ;
9865
9966 // get workspace services to pass to nav + ws services page
10067 const workspaceServices = await apiCall ( `${ ApiEndpoint . Workspaces } /${ ws . id } /${ ApiEndpoint . WorkspaceServices } ` ,
10168 HttpMethod . Get , ws . properties . scope_id ) ;
10269 setWorkspaceServices ( workspaceServices . workspaceServices ) ;
103- setLoadingState ( LoadingState . Ok ) ;
10470 // get shared services to pass to nav shared services pages
10571 const sharedServices = await apiCall ( ApiEndpoint . SharedServices , HttpMethod . Get ) ;
10672 setSharedServices ( sharedServices . sharedServices ) ;
107- getWorkspaceCosts ( ) ;
73+ setLoadingState ( LoadingState . Ok ) ;
10874 } else if ( appRoles . roles . includes ( RoleName . TREAdmin ) ) {
10975 ws = ( await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } ` , HttpMethod . Get ) ) . workspace ;
11076 workspaceCtx . current . setWorkspace ( ws ) ;
@@ -140,6 +106,46 @@ export const WorkspaceProvider: React.FunctionComponent = () => {
140106 } ;
141107 } , [ apiCall , workspaceId , isTREAdminUser , appRoles . roles ] ) ;
142108
109+ useEffect ( ( ) => {
110+ const getWorkspaceCosts = async ( ) => {
111+ try {
112+ // TODO: amend when costs enabled in API for WorkspaceRoleName.Researcher
113+ if ( wsRoles . includes ( WorkspaceRoleName . WorkspaceOwner ) ) {
114+ let scopeId = ( await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } /scopeid` , HttpMethod . Get ) ) . workspaceAuth . scopeId ;
115+ const r = await apiCall ( `${ ApiEndpoint . Workspaces } /${ workspaceId } /${ ApiEndpoint . Costs } ` , HttpMethod . Get , scopeId , undefined , ResultType . JSON ) ;
116+ const costs = [
117+ ...r . costs ,
118+ ...r . workspace_services ,
119+ ...r . workspace_services . flatMap ( ( ws : { user_resources : any ; } ) => [
120+ ...ws . user_resources
121+ ] )
122+ ] ;
123+ workspaceCtx . current . setCosts ( costs ) ;
124+ }
125+ }
126+ catch ( e : any ) {
127+ if ( e instanceof APIError ) {
128+ if ( e . status === 404 /*subscription not supported*/ ) {
129+ }
130+ else if ( e . status === 429 /*too many requests*/ || e . status === 503 /*service unavaiable*/ ) {
131+ let msg = JSON . parse ( e . message ) ;
132+ let retryAfter = Number ( msg . error [ "retry-after" ] ) ;
133+ setTimeout ( getWorkspaceCosts , retryAfter * 1000 ) ;
134+ }
135+ else {
136+ e . userMessage = 'Error retrieving costs' ;
137+ }
138+ }
139+ else {
140+ e . userMessage = 'Error retrieving costs' ;
141+ }
142+ setCostApiError ( e ) ;
143+ }
144+ } ;
145+
146+ getWorkspaceCosts ( ) ;
147+ } , [ apiCall , workspaceId , wsRoles ] ) ;
148+
143149 const addWorkspaceService = ( w : WorkspaceService ) => {
144150 let ws = [ ...workspaceServices ] ;
145151 ws . push ( w ) ;
0 commit comments