11import styled from "styled-components" ;
22import history from "../../util/history" ;
33import { 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" ;
56import { CopyTextButton , DocIcon , PackUpIcon , TacoButton } from "lowcoder-design" ;
67import { useDatasourceForm } from "./form/useDatasourceForm" ;
78import { useParams } from "react-router-dom" ;
89import { DATASOURCE_URL } from "../../constants/routesURL" ;
910import { useSelector } from "react-redux" ;
10- import { getDataSource , getDataSourceTypes } from "../../redux/selectors/datasourceSelectors" ;
11+ import { getDataSourceTypes } from "../../redux/selectors/datasourceSelectors" ;
1112import { trans } from "i18n" ;
1213import { DatasourceType } from "@lowcoder-ee/constants/queryConstants" ;
1314import { getDatasourceTutorial } from "@lowcoder-ee/util/tutorialUtils" ;
1415import { getDataSourceFormManifest } from "./getDataSourceFormManifest" ;
1516import DataSourceIcon from "components/DataSourceIcon" ;
1617import { 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" ;
1823const Wrapper = styled . div `
1924 display: flex;
2025 justify-content: center;
@@ -154,16 +159,44 @@ type DatasourcePathParams = {
154159
155160export const DatasourceEditPage = ( ) => {
156161 const { datasourceId, datasourceType } = useParams < DatasourcePathParams > ( ) ;
157- const datasourceList = useSelector ( getDataSource ) ;
158162 const datasourceTypes = useSelector ( getDataSourceTypes ) ;
159163 const [ isReady , setIsReady ] = useState ( true ) ;
160164
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 ( ( ) => {
162171 if ( ! datasourceId ) {
163- return undefined ;
172+ setDatasourceInfo ( undefined ) ;
173+ return ;
164174 }
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 ] ) ;
167200
168201 const dataSourceTypeInfo = useMemo ( ( ) => {
169202 if ( datasourceId ) {
@@ -181,6 +214,26 @@ export const DatasourceEditPage = () => {
181214 setIsReady ( isReady ) ;
182215 } , [ ] ) ;
183216
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+
184237 if ( ! finalDataSourceType ) {
185238 return null ;
186239 }
0 commit comments