1
1
import styled from "styled-components" ;
2
2
import history from "../../util/history" ;
3
3
import { default as Button } from "antd/es/button" ;
4
- import { useCallback , useMemo , useState } from "react" ;
4
+ import { Spin } from "antd" ;
5
+ import { useCallback , useEffect , useMemo , useState } from "react" ;
5
6
import { CopyTextButton , DocIcon , PackUpIcon , TacoButton } from "lowcoder-design" ;
6
7
import { useDatasourceForm } from "./form/useDatasourceForm" ;
7
8
import { useParams } from "react-router-dom" ;
8
9
import { DATASOURCE_URL } from "../../constants/routesURL" ;
9
10
import { useSelector } from "react-redux" ;
10
- import { getDataSource , getDataSourceTypes } from "../../redux/selectors/datasourceSelectors" ;
11
+ import { getDataSourceTypes } from "../../redux/selectors/datasourceSelectors" ;
11
12
import { trans } from "i18n" ;
12
13
import { DatasourceType } from "@lowcoder-ee/constants/queryConstants" ;
13
14
import { getDatasourceTutorial } from "@lowcoder-ee/util/tutorialUtils" ;
14
15
import { getDataSourceFormManifest } from "./getDataSourceFormManifest" ;
15
16
import DataSourceIcon from "components/DataSourceIcon" ;
16
17
import { Helmet } from "react-helmet" ;
17
-
18
+ import { DatasourceApi } from "@lowcoder-ee/api/datasourceApi" ;
19
+ import { DatasourceInfo } from "@lowcoder-ee/api/datasourceApi" ;
20
+ import { GenericApiResponse } from "../../api/apiResponses" ;
21
+ import { Datasource } from "@lowcoder-ee/constants/datasourceConstants" ;
22
+ import { AxiosResponse } from "axios" ;
18
23
const Wrapper = styled . div `
19
24
display: flex;
20
25
justify-content: center;
@@ -154,16 +159,44 @@ type DatasourcePathParams = {
154
159
155
160
export const DatasourceEditPage = ( ) => {
156
161
const { datasourceId, datasourceType } = useParams < DatasourcePathParams > ( ) ;
157
- const datasourceList = useSelector ( getDataSource ) ;
158
162
const datasourceTypes = useSelector ( getDataSourceTypes ) ;
159
163
const [ isReady , setIsReady ] = useState ( true ) ;
160
164
161
- const datasourceInfo = useMemo ( ( ) => {
165
+
166
+ const [ datasourceInfo , setDatasourceInfo ] = useState < DatasourceInfo | undefined > ( ) ;
167
+ const [ loading , setLoading ] = useState ( false ) ;
168
+
169
+ // Fetch individual datasource when editing
170
+ useEffect ( ( ) => {
162
171
if ( ! datasourceId ) {
163
- return undefined ;
172
+ setDatasourceInfo ( undefined ) ;
173
+ return ;
164
174
}
165
- return datasourceList . find ( ( info ) => info . datasource . id === datasourceId ) ;
166
- } , [ datasourceId , datasourceList ] ) ;
175
+
176
+ const fetchDatasource = async ( ) => {
177
+ setLoading ( true ) ;
178
+ try {
179
+ const response : AxiosResponse < GenericApiResponse < Datasource > > = await DatasourceApi . getDatasourceById ( datasourceId ) ;
180
+ if ( response . data . success ) {
181
+ // Transform to DatasourceInfo format
182
+ setDatasourceInfo ( {
183
+ datasource : response . data . data ,
184
+ edit : true , // Assume editable since user reached edit page
185
+ } ) ;
186
+ } else {
187
+ console . error ( 'API returned error:' , response . data ) ;
188
+ setDatasourceInfo ( undefined ) ;
189
+ }
190
+ } catch ( error : any ) {
191
+ console . error ( 'Failed to fetch datasource:' , error ) ;
192
+ setDatasourceInfo ( undefined ) ;
193
+ } finally {
194
+ setLoading ( false ) ;
195
+ }
196
+ } ;
197
+
198
+ fetchDatasource ( ) ;
199
+ } , [ datasourceId ] ) ;
167
200
168
201
const dataSourceTypeInfo = useMemo ( ( ) => {
169
202
if ( datasourceId ) {
@@ -181,6 +214,26 @@ export const DatasourceEditPage = () => {
181
214
setIsReady ( isReady ) ;
182
215
} , [ ] ) ;
183
216
217
+ // Show loading state while fetching datasource
218
+ if ( loading ) {
219
+ return (
220
+ < Wrapper >
221
+ < ContentWrapper >
222
+ < div style = { {
223
+ display : 'flex' ,
224
+ justifyContent : 'center' ,
225
+ alignItems : 'center' ,
226
+ height : '400px' ,
227
+ flexDirection : 'column' ,
228
+ gap : '16px'
229
+ } } >
230
+ < Spin size = "large" />
231
+ </ div >
232
+ </ ContentWrapper >
233
+ </ Wrapper >
234
+ ) ;
235
+ }
236
+
184
237
if ( ! finalDataSourceType ) {
185
238
return null ;
186
239
}
0 commit comments