1
+ import Api from "api/api" ;
2
+ import axios , { AxiosInstance , AxiosPromise , AxiosRequestConfig } from "axios" ;
3
+ import { calculateFlowCode } from "./apiUtils" ;
4
+
5
+ export interface SearchParams {
6
+ query : string ;
7
+ asset : string ;
8
+ per_page : number ;
9
+ page : 1 ;
10
+ sort : string ;
11
+ formats ?: string ;
12
+ price ?: string ;
13
+ }
14
+
15
+ export type ResponseType = {
16
+ response : any ;
17
+ } ;
18
+
19
+ const lcHeaders = {
20
+ "Lowcoder-Token" : calculateFlowCode ( ) ,
21
+ "Content-Type" : "application/json"
22
+ } ;
23
+
24
+ let axiosIns : AxiosInstance | null = null ;
25
+
26
+ const getAxiosInstance = ( clientSecret ?: string ) => {
27
+ if ( axiosIns && ! clientSecret ) {
28
+ return axiosIns ;
29
+ }
30
+
31
+ const headers : Record < string , string > = {
32
+ "Content-Type" : "application/json" ,
33
+ } ;
34
+
35
+ const apiRequestConfig : AxiosRequestConfig = {
36
+ baseURL : "https://api-service.lowcoder.cloud/api/flow" ,
37
+ headers,
38
+ } ;
39
+
40
+ axiosIns = axios . create ( apiRequestConfig ) ;
41
+ return axiosIns ;
42
+ }
43
+
44
+ class IconFlowApi extends Api {
45
+
46
+ static async secureRequest ( body : any , timeout : number = 6000 ) : Promise < any > {
47
+ let response ;
48
+ const axiosInstance = getAxiosInstance ( ) ;
49
+
50
+ // Create a cancel token and set timeout for cancellation
51
+ const source = axios . CancelToken . source ( ) ;
52
+ const timeoutId = setTimeout ( ( ) => {
53
+ source . cancel ( "Request timed out." ) ;
54
+ } , timeout ) ;
55
+
56
+ // Request configuration with cancel token
57
+ const requestConfig : AxiosRequestConfig = {
58
+ method : "POST" ,
59
+ withCredentials : true ,
60
+ data : body ,
61
+ cancelToken : source . token , // Add cancel token
62
+ } ;
63
+
64
+ try {
65
+ response = await axiosInstance . request ( requestConfig ) ;
66
+ } catch ( error ) {
67
+ if ( axios . isCancel ( error ) ) {
68
+ // Retry once after timeout cancellation
69
+ try {
70
+ // Reset the cancel token and retry
71
+ const retrySource = axios . CancelToken . source ( ) ;
72
+ const retryTimeoutId = setTimeout ( ( ) => {
73
+ retrySource . cancel ( "Retry request timed out." ) ;
74
+ } , 20000 ) ;
75
+
76
+ response = await axiosInstance . request ( {
77
+ ...requestConfig ,
78
+ cancelToken : retrySource . token ,
79
+ } ) ;
80
+
81
+ clearTimeout ( retryTimeoutId ) ;
82
+ } catch ( retryError ) {
83
+ console . warn ( "Error at Secure Flow Request. Retry failed:" , retryError ) ;
84
+ throw retryError ;
85
+ }
86
+ } else {
87
+ console . warn ( "Error at Secure Flow Request:" , error ) ;
88
+ throw error ;
89
+ }
90
+ } finally {
91
+ clearTimeout ( timeoutId ) ; // Clear the initial timeout
92
+ }
93
+
94
+ return response ;
95
+ }
96
+
97
+ }
98
+
99
+ export const searchAssets = async ( searchParameters : SearchParams ) => {
100
+ const apiBody = {
101
+ path : "webhook/scout/search-asset" ,
102
+ data : searchParameters ,
103
+ method : "post" ,
104
+ headers : lcHeaders
105
+ } ;
106
+ try {
107
+ const result = await IconFlowApi . secureRequest ( apiBody ) ;
108
+ return result ?. data ?. response ?. items ?. total > 0 ? result . data . response . items as any : null ;
109
+ } catch ( error ) {
110
+ console . error ( "Error searching Design Assets:" , error ) ;
111
+ throw error ;
112
+ }
113
+ } ;
114
+
115
+ export const getAssetLinks = async ( uuid : string , params : Record < string , string > ) => {
116
+ const apiBody = {
117
+ path : "webhook/scout/get-asset-links" ,
118
+ data : { "uuid" : uuid , "params" : params } ,
119
+ method : "post" ,
120
+ headers : lcHeaders
121
+ } ;
122
+ try {
123
+ const result = await IconFlowApi . secureRequest ( apiBody ) ;
124
+
125
+ return result ?. data ?. response ?. download ?. url . length > 0 ? result . data . response . download as any : null ;
126
+ } catch ( error ) {
127
+ console . error ( "Error searching Design Assets:" , error ) ;
128
+ throw error ;
129
+ }
130
+ } ;
131
+
132
+
133
+ /*
134
+
135
+ static async search(params: SearchParams): Promise<any> {
136
+ let response;
137
+ try {
138
+ response = await getAxiosInstance().request({
139
+ url: '/v3/search',
140
+ method: "GET",
141
+ withCredentials: false,
142
+ params: {
143
+ ...params,
144
+ },
145
+ });
146
+ } catch (error) {
147
+ console.error(error);
148
+ }
149
+ return response?.data.response.items;
150
+ }
151
+
152
+ static async download(uuid: string, params: Record<string, string>): Promise<any> {
153
+ const response = await getAxiosInstance(clientSecret).request({
154
+ url: `/v3/items/${uuid}/api-download?format=${params.format}`,
155
+ method: "POST",
156
+ withCredentials: false,
157
+ });
158
+ return response?.data.response.download;
159
+ }
160
+
161
+ */
162
+
163
+ export default IconFlowApi ;
0 commit comments