Skip to content

Commit 3cfb293

Browse files
authored
Merge branch 'dev' into ee-setup
2 parents 5f94c41 + e7e3d9e commit 3cfb293

File tree

29 files changed

+1409
-308
lines changed

29 files changed

+1409
-308
lines changed

.github/workflows/docker-images.yml

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ on:
1010
default: 'latest'
1111
options:
1212
- latest
13+
- stable
1314
- test
14-
- 2.4.6
1515
build_allinone:
1616
type: boolean
1717
description: 'Build the All-In-One image'
@@ -41,24 +41,60 @@ jobs:
4141
build:
4242
runs-on: ubuntu-latest
4343
steps:
44+
- name: 'Setup jq'
45+
uses: dcarbone/install-jq-action@v3
46+
with:
47+
version: '1.7'
48+
4449
- name: Set environment variables
4550
shell: bash
4651
run: |
4752
# Get the short SHA of last commit
4853
echo "SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-7)" >> "${GITHUB_ENV}"
49-
54+
5055
# Get branch name - we don't use github.ref_head_name since we don't build on PRs
5156
echo "BRANCH_NAME=${{ github.ref_name }}" >> "${GITHUB_ENV}"
52-
57+
5358
# Set docker image tag
54-
echo "IMAGE_TAG=${{ inputs.imageTag || github.ref_name }}" >> "${GITHUB_ENV}"
55-
59+
IMAGE_TAG=${{ inputs.imageTag || github.ref_name }}
60+
61+
# Check whether it's a release
62+
LATEST_TAG=$(
63+
curl -s -L \
64+
-H "Accept: application/vnd.github+json" \
65+
-H "Authorization: Bearer ${{ github.token }}" \
66+
https://api.github.com/repos/${{ github.repository }}/releases/latest \
67+
| jq -r '.tag_name'
68+
)
69+
IS_LATEST="false"
70+
if [[ "${LATEST_TAG}" == "${{ github.event.release.tag_name }}" ]]; then
71+
IS_LATEST="true"
72+
fi;
73+
5674
# Control which images to build
5775
echo "BUILD_ALLINONE=${{ inputs.build_allinone || true }}" >> "${GITHUB_ENV}"
5876
echo "BUILD_FRONTEND=${{ inputs.build_frontend || true }}" >> "${GITHUB_ENV}"
5977
echo "BUILD_NODESERVICE=${{ inputs.build_nodeservice || true }}" >> "${GITHUB_ENV}"
6078
echo "BUILD_APISERVICE=${{ inputs.build_apiservice || true }}" >> "${GITHUB_ENV}"
6179
80+
# Image names
81+
ALLINONE_IMAGE_NAMES=lowcoderorg/lowcoder-ce:${IMAGE_TAG}
82+
FRONTEND_IMAGE_NAMES=lowcoderorg/lowcoder-ce-frontend:${IMAGE_TAG}
83+
APISERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-api-service:${IMAGE_TAG}
84+
NODESERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-node-service:${IMAGE_TAG}
85+
86+
if [[ "${IS_LATEST}" == "true" ]]; then
87+
ALLINONE_IMAGE_NAMES="lowcoderorg/lowcoder-ce:latest,${ALLINONE_IMAGE_NAMES}"
88+
FRONTEND_IMAGE_NAMES="lowcoderorg/lowcoder-ce-frontend:latest,${FRONTEND_IMAGE_NAMES}"
89+
APISERVICE_IMAGE_NAMES="lowcoderorg/lowcoder-ce-api-service:latest,${APISERVICE_IMAGE_NAMES}"
90+
NODESERVICE_IMAGE_NAMES="lowcoderorg/lowcoder-ce-node-service:latest,${NODESERVICE_IMAGE_NAMES}"
91+
fi;
92+
93+
echo "ALLINONE_IMAGE_NAMES=${ALLINONE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
94+
echo "FRONTEND_IMAGE_NAMES=${FRONTEND_IMAGE_NAMES}" >> "${GITHUB_ENV}"
95+
echo "APISERVICE_IMAGE_NAMES=${APISERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
96+
echo "NODESERVICE_IMAGE_NAMES=${NODESERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
97+
6298
- name: Checkout lowcoder source
6399
uses: actions/checkout@v4
64100
with:
@@ -91,7 +127,7 @@ jobs:
91127
linux/amd64
92128
linux/arm64
93129
push: true
94-
tags: lowcoderorg/lowcoder-ce:${{ env.IMAGE_TAG }}
130+
tags: ${{ env.ALLINONE_IMAGE_NAMES }}
95131

96132
- name: Build and push the frontend image
97133
if: ${{ env.BUILD_FRONTEND == 'true' }}
@@ -108,7 +144,7 @@ jobs:
108144
linux/amd64
109145
linux/arm64
110146
push: true
111-
tags: lowcoderorg/lowcoder-ce-frontend:${{ env.IMAGE_TAG }}
147+
tags: ${{ env.FRONTEND_IMAGE_NAMES }}
112148

113149
- name: Build and push the node service image
114150
if: ${{ env.BUILD_NODESERVICE == 'true' }}
@@ -120,7 +156,7 @@ jobs:
120156
linux/amd64
121157
linux/arm64
122158
push: true
123-
tags: lowcoderorg/lowcoder-ce-node-service:${{ env.IMAGE_TAG }}
159+
tags: ${{ env.NODESERVICE_IMAGE_NAMES }}
124160

125161
- name: Build and push the API service image
126162
if: ${{ env.BUILD_APISERVICE == 'true' }}
@@ -132,5 +168,5 @@ jobs:
132168
linux/amd64
133169
linux/arm64
134170
push: true
135-
tags: lowcoderorg/lowcoder-ce-api-service:${{ env.IMAGE_TAG }}
171+
tags: ${{ env.APISERVICE_IMAGE_NAMES }}
136172

client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
"flag-icons": "^7.2.1",
8484
"number-precision": "^1.6.0",
8585
"react-countup": "^6.5.3",
86+
"react-github-btn": "^1.4.0",
8687
"react-player": "^2.11.0",
8788
"resize-observer-polyfill": "^1.5.1",
8889
"rollup": "^4.22.5",

client/packages/lowcoder-comps/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-comps",
3-
"version": "2.7.0",
3+
"version": "2.7.1",
44
"type": "module",
55
"license": "MIT",
66
"dependencies": {
@@ -17,8 +17,6 @@
1717
"@fullcalendar/resource-timeline": "^6.1.11",
1818
"@fullcalendar/timegrid": "^6.1.6",
1919
"@fullcalendar/timeline": "^6.1.6",
20-
"@types/react": "^19.1.2",
21-
"@types/react-dom": "^19.1.2",
2220
"agora-rtc-sdk-ng": "^4.20.2",
2321
"agora-rtm-sdk": "^1.5.1",
2422
"big.js": "^6.2.1",
@@ -28,8 +26,8 @@
2826
"lowcoder-cli": "workspace:^",
2927
"lowcoder-sdk": "workspace:^",
3028
"mermaid": "^10.6.1",
31-
"react": "^19.1.0",
32-
"react-dom": "^19.1.0",
29+
"react": "18.3.0",
30+
"react-dom": "18.3.0",
3331
"typescript": "4.8.4"
3432
},
3533
"lowcoder": {
@@ -261,6 +259,8 @@
261259
"test": "jest"
262260
},
263261
"devDependencies": {
262+
"@types/react": "18",
263+
"@types/react-dom": "18",
264264
"jest": "29.3.0",
265265
"vite": "^4.5.5",
266266
"vite-tsconfig-paths": "^3.6.0"

client/packages/lowcoder-design/src/icons/index.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,6 @@ export { ReactComponent as BorderWidthIcon } from "./remix/space.svg";
225225
export { ReactComponent as BorderStyleIcon } from "./remix/separator.svg";
226226
export { ReactComponent as RotationIcon } from "./remix/clockwise-line.svg";
227227
export { ReactComponent as BorderRadiusIcon } from "./remix/rounded-corner.svg";
228-
229-
// Falk: TODO
230228
export { ReactComponent as ShadowIcon } from "./remix/shadow-line.svg";
231229
export { ReactComponent as OpacityIcon } from "./remix/contrast-drop-2-line.svg";
232230
export { ReactComponent as AnimationIcon } from "./remix/loader-line.svg";
@@ -261,6 +259,13 @@ export { ReactComponent as EnterpriseIcon } from "./remix/earth-line.svg";
261259
export { ReactComponent as VerticalIcon } from "./remix/vertical.svg";
262260
export { ReactComponent as HorizontalIcon } from "./remix/horizontal.svg";
263261

262+
// Social Sharing
263+
export { ReactComponent as TwitterIcon } from "./remix/twitter-x-line.svg";
264+
export { ReactComponent as LinkedInIcon } from "./remix/linkedin-box-fill.svg";
265+
export { ReactComponent as FacebookIcon } from "./remix/facebook-circle-fill.svg";
266+
export { ReactComponent as MediumIcon } from "./remix/medium-fill.svg";
267+
export { ReactComponent as RedditIcon } from "./remix/reddit-line.svg";
268+
264269

265270
// components
266271

client/packages/lowcoder/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@
3232
"@rjsf/validator-ajv8": "^5.24.9",
3333
"@types/lodash": "^4.14.194",
3434
"@types/node": "^16.7.13",
35-
"@types/react": "^19.1.2",
36-
"@types/react-dom": "^19.1.2",
3735
"@types/react-signature-canvas": "^1.0.2",
3836
"@types/react-test-renderer": "^18.0.0",
3937
"@types/react-virtualized": "^9.21.21",
4038
"alasql": "^4.6.6",
4139
"animate.css": "^4.1.1",
42-
"antd": "^5.24.8",
40+
"antd": "^5.25.2",
4341
"axios": "^1.7.7",
4442
"buffer": "^6.0.3",
4543
"clsx": "^2.0.0",
@@ -68,12 +66,12 @@
6866
"pigeon-maps": "^0.22.1",
6967
"qrcode.react": "^3.1.0",
7068
"rc-trigger": "^5.3.1",
71-
"react": "^19.1.0",
69+
"react": "18.3.0",
7270
"react-best-gradient-color-picker": "^3.0.10",
7371
"react-colorful": "^5.5.1",
7472
"react-device-mockup": "^1.0.0",
7573
"react-documents": "^1.2.1",
76-
"react-dom": "^19.1.0",
74+
"react-dom": "18.3.0",
7775
"react-draggable": "^4.4.6",
7876
"react-error-boundary": "^4.0.13",
7977
"react-grid-layout": "^1.3.0",
@@ -122,6 +120,8 @@
122120
"@types/core-js": "^2.5.5",
123121
"@types/intl": "^1.2.1",
124122
"@types/papaparse": "^5.3.5",
123+
"@types/react": "18",
124+
"@types/react-dom": "18",
125125
"@types/regenerator-runtime": "^0.13.1",
126126
"@types/uuid": "^8.3.4",
127127
"@vitejs/plugin-react": "^2.2.0",
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import Api from "api/api";
2+
import axios, { AxiosInstance, AxiosRequestConfig, CancelToken } from "axios";
3+
import { calculateFlowCode } from "./apiUtils";
4+
5+
export type ResponseType = {
6+
response: any;
7+
};
8+
9+
// Axios Configuration
10+
const lcHeaders = {
11+
"Lowcoder-Token": calculateFlowCode(),
12+
"Content-Type": "application/json"
13+
};
14+
15+
let axiosIns: AxiosInstance | null = null;
16+
17+
const getAxiosInstance = (clientSecret?: string) => {
18+
if (axiosIns && !clientSecret) {
19+
return axiosIns;
20+
}
21+
22+
const headers: Record<string, string> = {
23+
"Content-Type": "application/json",
24+
};
25+
26+
const apiRequestConfig: AxiosRequestConfig = {
27+
baseURL: "https://api-service.lowcoder.cloud/api/flow",
28+
headers,
29+
};
30+
31+
axiosIns = axios.create(apiRequestConfig);
32+
return axiosIns;
33+
};
34+
35+
class NewsApi extends Api {
36+
37+
static async secureRequest(body: any, timeout: number = 6000): Promise<any> {
38+
let response;
39+
const axiosInstance = getAxiosInstance();
40+
41+
// Create a cancel token and set timeout for cancellation
42+
const source = axios.CancelToken.source();
43+
const timeoutId = setTimeout(() => {
44+
source.cancel("Request timed out.");
45+
}, timeout);
46+
47+
// Request configuration with cancel token
48+
const requestConfig: AxiosRequestConfig = {
49+
method: "POST",
50+
withCredentials: true,
51+
data: body,
52+
cancelToken: source.token, // Add cancel token
53+
};
54+
55+
try {
56+
response = await axiosInstance.request(requestConfig);
57+
} catch (error) {
58+
if (axios.isCancel(error)) {
59+
// Retry once after timeout cancellation
60+
try {
61+
// Reset the cancel token and retry
62+
const retrySource = axios.CancelToken.source();
63+
const retryTimeoutId = setTimeout(() => {
64+
retrySource.cancel("Retry request timed out.");
65+
}, 10000);
66+
67+
response = await axiosInstance.request({
68+
...requestConfig,
69+
cancelToken: retrySource.token,
70+
});
71+
72+
clearTimeout(retryTimeoutId);
73+
} catch (retryError) {
74+
console.warn("Error at Secure Flow Request. Retry failed:", retryError);
75+
throw retryError;
76+
}
77+
} else {
78+
console.warn("Error at Secure Flow Request:", error);
79+
throw error;
80+
}
81+
} finally {
82+
clearTimeout(timeoutId); // Clear the initial timeout
83+
}
84+
85+
return response;
86+
}
87+
}
88+
89+
// API Functions
90+
91+
// secure/get-youtube-videos
92+
// secure/get-github-releases
93+
94+
export const getReleases = async () => {
95+
const apiBody = {
96+
path: "webhook/secure/get-github-releases",
97+
data: {},
98+
method: "post",
99+
headers: lcHeaders
100+
};
101+
try {
102+
const result = await NewsApi.secureRequest(apiBody);
103+
return result?.data[0]?.github?.length > 0 ? result.data[0].github as any[] : [];
104+
} catch (error) {
105+
console.error("Error getting news:", error);
106+
throw error;
107+
}
108+
};
109+
110+
export const getYoutubeVideos = async () => {
111+
const apiBody = {
112+
path: "webhook/secure/get-youtube-videos",
113+
data: {},
114+
method: "post",
115+
headers: lcHeaders
116+
};
117+
try {
118+
const result = await NewsApi.secureRequest(apiBody);
119+
return result?.data[0]?.youtube?.length > 0 ? result.data[0].youtube as any[] : [];
120+
} catch (error) {
121+
console.error("Error getting news:", error);
122+
throw error;
123+
}
124+
};
125+
126+
export const getHubspotContent = async () => {
127+
const apiBody = {
128+
path: "webhook/secure/get-hubspot-content",
129+
data: {},
130+
method: "post",
131+
headers: lcHeaders
132+
};
133+
try {
134+
const result = await NewsApi.secureRequest(apiBody);
135+
return result?.data[0]?.hubspot?.length > 0 ? result.data[0].hubspot as any[] : [];
136+
} catch (error) {
137+
console.error("Error getting news:", error);
138+
throw error;
139+
}
140+
};
141+
142+
export default NewsApi;

0 commit comments

Comments
 (0)