22import {
33 Alert ,
44 Button ,
5+ CircularProgress ,
56 DialogActions ,
67 DialogContent ,
78 DialogContentText ,
@@ -31,28 +32,38 @@ interface ExportToGoogleState {
3132 url : string
3233 googleSheetTitles : StringArrayResult | undefined
3334 selectedSheet : number
34- loadingStatus : LoadingStatus
35+ loadingSheets : boolean
36+ exportStatus : LoadingStatus
3537 error : string | null
3638}
3739
3840const ExportToGoogle : FC < ExportToGoogleProps > = ( props : ExportToGoogleProps ) => {
3941 const [ state , setState ] = useState < ExportToGoogleState > ( {
4042 url : "" ,
41- selectedSheet : 0 ,
4243 googleSheetTitles : undefined ,
43- loadingStatus : LoadingStatus . None ,
44+ selectedSheet : 0 ,
45+ loadingSheets : false ,
46+ exportStatus : LoadingStatus . None ,
4447 error : null
4548 } )
4649
47- const { url, googleSheetTitles, selectedSheet, loadingStatus , error } = state
50+ const { url, googleSheetTitles, selectedSheet, loadingSheets , exportStatus , error } = state
4851
4952 const handleGoogleDocUrlChange = ( value : string ) => {
50- setState ( prevState => ( { ...prevState , url : value } ) )
53+ setState ( prevState => ( { ...prevState , url : value , loadingSheets : true } ) )
5154 if ( value )
5255 apiSingleton . statisticsApi . statisticsGetSheetTitles ( value )
53- . then ( response => setState ( prevState => ( { ...prevState , googleSheetTitles : response } ) ) )
56+ . then ( response => setState ( prevState => ( {
57+ ...prevState ,
58+ googleSheetTitles : response ,
59+ loadingSheets : false ,
60+ } ) ) )
5461 else
55- setState ( prevState => ( { ...prevState , googleSheetTitles : undefined } ) )
62+ setState ( prevState => ( {
63+ ...prevState ,
64+ googleSheetTitles : undefined ,
65+ loadingSheets : false ,
66+ } ) )
5667 }
5768
5869 const getGoogleSheetName = ( ) => {
@@ -62,10 +73,10 @@ const ExportToGoogle: FC<ExportToGoogleProps> = (props: ExportToGoogleProps) =>
6273 }
6374
6475 const buttonSx = {
65- ...( loadingStatus === LoadingStatus . Success && {
76+ ...( exportStatus === LoadingStatus . Success && {
6677 color : green [ 600 ] ,
6778 } ) ,
68- ...( loadingStatus === LoadingStatus . Error && {
79+ ...( exportStatus === LoadingStatus . Error && {
6980 color : red [ 600 ] ,
7081 } ) ,
7182 } ;
@@ -78,7 +89,7 @@ const ExportToGoogle: FC<ExportToGoogleProps> = (props: ExportToGoogleProps) =>
7889 < Alert severity = "error" >
7990 { googleSheetTitles ! . errors ! [ 0 ] }
8091 </ Alert >
81- ) || ( loadingStatus === LoadingStatus . Error &&
92+ ) || ( exportStatus === LoadingStatus . Error &&
8293 < Alert severity = "error" >
8394 { error }
8495 </ Alert >
@@ -91,7 +102,7 @@ const ExportToGoogle: FC<ExportToGoogleProps> = (props: ExportToGoogleProps) =>
91102 </ Grid >
92103 </ DialogContentText >
93104 < DialogActions style = { { padding : 0 , marginTop : 12 } } >
94- < Grid item container spacing = { 1 } style = { { marginRight : "auto" } } >
105+ < Grid item container spacing = { 1 } alignItems = "center" marginRight = "auto" >
95106 < Grid item >
96107 < TextField
97108 fullWidth
@@ -104,7 +115,12 @@ const ExportToGoogle: FC<ExportToGoogleProps> = (props: ExportToGoogleProps) =>
104115 } }
105116 />
106117 </ Grid >
107- { googleSheetTitles && googleSheetTitles . value && googleSheetTitles . value . length > 0 &&
118+ { loadingSheets &&
119+ < Grid item >
120+ < CircularProgress size = { 28 } />
121+ </ Grid >
122+ }
123+ { ! loadingSheets && googleSheetTitles && googleSheetTitles . value && googleSheetTitles . value . length > 0 &&
108124 < Grid item >
109125 < TextField
110126 select
@@ -126,16 +142,16 @@ const ExportToGoogle: FC<ExportToGoogleProps> = (props: ExportToGoogleProps) =>
126142 color = "primary"
127143 type = "button"
128144 sx = { buttonSx }
129- loading = { loadingStatus === LoadingStatus . Loading }
145+ loading = { exportStatus === LoadingStatus . Loading }
130146 onClick = { async ( ) => {
131- setState ( ( prevState ) => ( { ...prevState , loadingStatus : LoadingStatus . Loading } ) )
147+ setState ( ( prevState ) => ( { ...prevState , exportStatus : LoadingStatus . Loading } ) )
132148 const result = await apiSingleton . statisticsApi . statisticsExportToGoogleSheets (
133149 props . courseId ,
134150 url ,
135151 getGoogleSheetName ( ) )
136152 setState ( ( prevState ) =>
137153 ( { ...prevState ,
138- loadingStatus : result . succeeded ? LoadingStatus . Success : LoadingStatus . Error ,
154+ exportStatus : result . succeeded ? LoadingStatus . Success : LoadingStatus . Error ,
139155 error : result . errors === undefined
140156 || result . errors === null
141157 || result . errors . length === 0
0 commit comments