Skip to content

Commit 50b26e2

Browse files
authored
fix: resolve deeplink login issue (#881)
* fix: resolve deeplink login issue * docs: update changelog * refactor: update
1 parent a4aacc1 commit 50b26e2

4 files changed

Lines changed: 54 additions & 47 deletions

File tree

docs/content.en/docs/release-notes/_index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Information about release notes of Coco App is provided here.
2828
- fix: web component login state #857
2929
- fix: shortcut key not opening extension store #877
3030
- fix: set up hotkey on main thread or Windows will complain #879
31+
- fix: resolve deeplink login issue #881
3132

3233
### ✈️ Improvements
3334

src/components/Cloud/Cloud.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { useEffect, useRef, useState, useCallback } from "react";
2+
import { isEqual } from "lodash-es";
3+
import { usePrevious } from "ahooks";
24

35
import { DataSourcesList } from "./DataSourcesList";
46
import { Sidebar } from "./Sidebar";
@@ -7,9 +9,9 @@ import { useAppStore } from "@/stores/appStore";
79
import { useConnectStore } from "@/stores/connectStore";
810
import ServiceInfo from "./ServiceInfo";
911
import ServiceAuth from "./ServiceAuth";
10-
import platformAdapter from "@/utils/platformAdapter";
1112
import type { Server } from "@/types/server";
1213
import { useServers } from "@/hooks/useServers";
14+
import platformAdapter from "@/utils/platformAdapter";
1315

1416
export default function Cloud() {
1517
const SidebarRef = useRef<{ refreshData: () => void }>(null);
@@ -24,13 +26,16 @@ export default function Cloud() {
2426
serverList,
2527
setServerList,
2628
} = useConnectStore();
29+
const prevServerList = usePrevious(serverList);
2730

2831
const [refreshLoading, setRefreshLoading] = useState(false);
2932

3033
const { addServer, refreshServerList } = useServers();
3134

3235
// fetch the servers
3336
useEffect(() => {
37+
if (isEqual(prevServerList, serverList)) return;
38+
3439
fetchServers();
3540
}, [serverList]);
3641

@@ -40,32 +45,37 @@ export default function Cloud() {
4045
}, [cloudSelectService?.id]);
4146

4247
const fetchServers = useCallback(async () => {
43-
let res = serverList;
48+
let { serverList } = useConnectStore.getState();
49+
4450
if (errors.length > 0) {
45-
res = res.map((item: Server) => {
51+
serverList = serverList.map((item: Server) => {
4652
if (item.id === cloudSelectService?.id) {
47-
item.health = {
48-
services: item.health?.services || {},
49-
status: item.health?.status || "red",
53+
return {
54+
...item,
55+
health: {
56+
services: item.health?.services || {},
57+
status: item.health?.status || "red",
58+
},
5059
};
5160
}
5261
return item;
5362
});
5463
}
55-
setServerList(res);
5664

57-
if (res.length > 0) {
58-
const matched = res.find((server: any) => {
65+
setServerList(serverList);
66+
67+
if (serverList.length > 0) {
68+
const matched = serverList.find((server: any) => {
5969
return server.id === cloudSelectService?.id;
6070
});
6171

6272
if (matched) {
6373
setCloudSelectService(matched);
6474
} else {
65-
setCloudSelectService(res[res.length - 1]);
75+
setCloudSelectService(serverList[serverList.length - 1]);
6676
}
6777
}
68-
}, [serverList, errors, cloudSelectService]);
78+
}, [errors, cloudSelectService]);
6979

7080
const refreshClick = useCallback(
7181
async (id: string, callback?: () => void) => {

src/components/Cloud/ServiceAuth.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const ServiceAuth = memo(
4242
// Generate the login URL with the current appUid
4343
const url = `${cloudSelectService?.auth_provider?.sso?.url}/?provider=${cloudSelectService?.id}&product=coco&request_id=${requestID}`;
4444

45-
console.log("Open SSO link, requestID:", ssoRequestID, url);
45+
console.log("Open SSO link, requestID:", url);
4646

4747
// Open the URL in a browser
4848
OpenURLWithBrowser(url);

src/hooks/useDeepLinkManager.ts

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,44 @@ export interface DeepLinkHandler {
2020

2121
export function useDeepLinkManager() {
2222
const addError = useAppStore((state) => state.addError);
23-
const ssoRequestID = useAppStore((state) => state.ssoRequestID);
24-
const cloudSelectService = useConnectStore(
25-
(state) => state.cloudSelectService
26-
);
2723
const { t } = useTranslation();
2824

2925
// handle oauth callback
30-
const handleOAuthCallback = useCallback(
31-
async (url: URL) => {
32-
try {
33-
const reqId = url.searchParams.get("request_id");
34-
const code = url.searchParams.get("code");
35-
36-
if (reqId !== ssoRequestID) {
37-
console.log("Request ID not matched, skip");
38-
addError("Request ID not matched, skip");
39-
return;
40-
}
26+
const handleOAuthCallback = useCallback(async (url: URL) => {
27+
try {
28+
const reqId = url.searchParams.get("request_id");
29+
const code = url.searchParams.get("code");
4130

42-
const serverId = cloudSelectService?.id;
43-
if (!code || !serverId) {
44-
addError("No authorization code received");
45-
return;
46-
}
31+
const { ssoRequestID } = useAppStore.getState();
32+
const { cloudSelectService } = useConnectStore.getState();
4733

48-
console.log("Handling OAuth callback:", { code, serverId });
49-
await platformAdapter.commands("handle_sso_callback", {
50-
serverId: serverId,
51-
requestId: ssoRequestID,
52-
code: code,
53-
});
34+
if (reqId !== ssoRequestID) {
35+
console.log("Request ID not matched, skip");
36+
addError("Request ID not matched, skip");
37+
return;
38+
}
5439

55-
// trigger oauth success event
56-
platformAdapter.emitEvent("oauth_success", { serverId });
57-
getCurrentWindow().setFocus();
58-
} catch (err) {
59-
console.error("Failed to parse OAuth callback URL:", err);
60-
addError("Invalid OAuth callback URL format: " + err);
40+
const serverId = cloudSelectService?.id;
41+
if (!code || !serverId) {
42+
addError("No authorization code received");
43+
return;
6144
}
62-
},
63-
[ssoRequestID, cloudSelectService, addError]
64-
);
45+
46+
console.log("Handling OAuth callback:", { code, serverId });
47+
await platformAdapter.commands("handle_sso_callback", {
48+
serverId: serverId,
49+
requestId: ssoRequestID,
50+
code: code,
51+
});
52+
53+
// trigger oauth success event
54+
platformAdapter.emitEvent("oauth_success", { serverId });
55+
getCurrentWindow().setFocus();
56+
} catch (err) {
57+
console.error("Failed to parse OAuth callback URL:", err);
58+
addError("Invalid OAuth callback URL format: " + err);
59+
}
60+
}, []);
6561

6662
// handle install extension from store
6763
const handleInstallExtension = useCallback(async (url: URL) => {

0 commit comments

Comments
 (0)