From 6a272bda500af10d7e310f4e9beb89bfbf94643c Mon Sep 17 00:00:00 2001 From: BiggerRain <15911122312@163.COM> Date: Wed, 22 Jan 2025 20:00:38 +0800 Subject: [PATCH] feat: adjust oauth callback & profile info (#110) * chore: adjust oauth callback * chore: debug profile info * chore: modify logs logic and display * chore: add logout * chore: add userinfo * chore: remove advanced settings --- .env | 4 +- src-tauri/capabilities/default.json | 5 +- src/api/tauriFetchClient.ts | 2 +- src/assets/hugo_site/blog.png | Bin 753 -> 0 bytes src/assets/hugo_site/icon.png | Bin 1049 -> 0 bytes src/assets/hugo_site/news.png | Bin 621 -> 0 bytes src/assets/hugo_site/web.png | Bin 710 -> 0 bytes src/assets/hugo_site/web_page.png | Bin 439 -> 0 bytes src/components/AppAI/ApiDetails.tsx | 43 +++++-- src/components/Auth/CocoCloud.tsx | 116 +++++++------------ src/components/Auth/UserProfile.tsx | 54 +++++++-- src/components/Settings/AdvancedSettings.tsx | 3 +- src/components/Settings/index2.tsx | 8 +- src/pages/login/index.tsx | 4 +- src/stores/authStore.ts | 1 + src/stores/logStore.ts | 4 +- src/utils/env.ts | 3 - 17 files changed, 136 insertions(+), 111 deletions(-) delete mode 100644 src/assets/hugo_site/blog.png delete mode 100644 src/assets/hugo_site/icon.png delete mode 100644 src/assets/hugo_site/news.png delete mode 100644 src/assets/hugo_site/web.png delete mode 100644 src/assets/hugo_site/web_page.png diff --git a/.env b/.env index c15d962f..c700e9de 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ -COCO_SERVER_URL=https://infini.tpddns.cn:27200 #https://coco.infini.cloud # http://localhost:2900 +COCO_SERVER_URL=http://infini.tpddns.cn:27200 #https://coco.infini.cloud # http://localhost:9000 -COCO_WEBSOCKET_URL=wss://infini.tpddns.cn:27200/ws #wss://coco.infini.cloud/ws # ws://localhost:2900/ws \ No newline at end of file +COCO_WEBSOCKET_URL=ws://infini.tpddns.cn:27200/ws #wss://coco.infini.cloud/ws # ws://localhost:9000/ws \ No newline at end of file diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index baeb78d0..30ccc469 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -52,9 +52,6 @@ { "identifier": "http:default", "allow": [ - { - "url": "http://localhost:2900" - }, { "url": "http://localhost:9000" }, @@ -62,7 +59,7 @@ "url": "https://coco.infini.cloud" }, { - "url": "https://infini.tpddns.cn:27200" + "url": "http://infini.tpddns.cn:27200" } ], "deny": [] diff --git a/src/api/tauriFetchClient.ts b/src/api/tauriFetchClient.ts index b91cc568..2132e5f4 100644 --- a/src/api/tauriFetchClient.ts +++ b/src/api/tauriFetchClient.ts @@ -54,7 +54,7 @@ export const tauriFetch = async ({ headers["Content-Type"] = "application/json"; } - headers["X-API-TOKEN"] = auth?.token || ""; + headers["X-API-TOKEN"] = headers["X-API-TOKEN"] || auth?.token || ""; // debug API const requestInfo = { diff --git a/src/assets/hugo_site/blog.png b/src/assets/hugo_site/blog.png deleted file mode 100644 index 0b70c63c139a7f88c2755466645ed95c5927fac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmV^DP@VJmCNU0scuuK~z}7?U&htf-nq4$7K)^jqI{2DlVgr{{PpF zfgu)TD}D7o(TAQkH)%<~J}PUdDzY?(8qFnHQHKrF2h$O>YBU|xtv(w=Cyi&r%H=1} zS(A!QEWUw5-;1~PaXt@WP>O#7oSGDUm;twDg#gCl|U5l>mtV zb?4U%;*7Aj*KzT>TNz8@aF@z=Q7f1n)jcz7}CnNdE z2wSqk!HV)ZvT(YlgqR42bPGIbJnqvy&=}9fg$DqUU+}@e+(bM8a8d&0BF1Xs0ziaO zcx)nkJ^&nX3wcGE7=yzHfGg`GW>Rkln6~TEJ$S-Z^HkoRgQOK;rpJGk6R@Hlkm-)6 zx)osK{8!y4%p?OXZ3Va)z@(9^cJud)FSm#;A*my$-@gm3z3mtt2%o|O_`$4Pv z9uYulN+aG6nqKuSF+bN{l9}IoFDXoe(Mu}Z;`GpHDB5HRw|SzCrf{n(+H8xq`=SpH j(I=1Kqf7MJ_fbiIjDNIea!8Ai00000NkvXXu0mjf{k>uu diff --git a/src/assets/hugo_site/icon.png b/src/assets/hugo_site/icon.png deleted file mode 100644 index a8833e4c377d3007e0d9d48e37cde928aa21b46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz{nKf6XFWwo)oX68~X3i@&EsS zpmit2>i#=*{x@&_Z_;>7r1pR3*59`6|94zID^>r=tnGinvi~#p|KET8zfIf!Uw{68 z`1ap-!hfrl_a?2UCF;IgwZGJF`5!&=u3FO-xrQ$mZ4Wh@{@b;`Hf(vK(|l98@w#H; z|E7(9?K{p%*I$sS|37K>|Ln#8-Fp77IQc(l%76X3|60}m*Ps1A_u&78Ii+V=e*!~6 zwIs+dnBms#jWcW&7RtjA0%}B)QWN+{iL{<57slEFfcGJ z^mK6yi8%ar`pcqQ1|qEo-~1Ljv`@u1=JbOAkA=EyS!EoJIl1@$hibh%bt6GY|L5d0 z1$C7s#dfiGt>t8Q+HDc4%(oC-^(5)sn|(0>30B?KAL=KkUT$z&~68P-Wq`Sp>0-kFX^*@C?s^D~G zS*#kod;fupZzo<_Ql{`>bG1XudY?ZZIYR6wt&DZPbM|)uU;dx77uhqu{{1QY<7-D_ zlgi|YaqWq}k2c)m?fAxV?%>tFK9hrP_4bc@>#lVvN@woM_!3`W@XIrJPT9(3vqEDp zx>e1y`NF=SGI!#9yFZJnF1+0vEqI(;x-jr_r&pnuOD4xzTf7&_14xk-}%GLY^QDO*uP7j zUpZ^n;f}nyt5$bgY-svx@xa1KWo?>&<~WzX4=-Fom|2#Z)*a=yyfH4K5(h6X85#X{ounR(uhV|?`K zNk-K3EYImP*PYV&l=Z&#n-HJ;iO4Fesh{#3d)Gz?Tz+eNPw36XCNbyAWnT`)Y3|C= z5Myjq}5X7F_Nb6Mw< G&;$V7Yy_47 diff --git a/src/assets/hugo_site/news.png b/src/assets/hugo_site/news.png deleted file mode 100644 index 794ea4c7258fe556b226b2db6da6f299492bfc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)b(EWWdFZ7|N8O&_22*T)c@qF|JQ^6(|7;IP5=D%|M=+t?#lnhPygq% z|KOniz&roXZ2!+{|HxLsLx5ZW000eiQchC<^B4x>*~h<@m4Zht^D#)K0004$Nkl2AU>41gD)H%_mVw%o_q_Wn<}Acjekb|LjN35o9q5>@ggcBlK0J)yvx)f(9GK0G_2qmg!$gbU2S@yF9%67N z?gYTV8Kwpi!U#eo1Lg*{>s4w}F4QgDvygz!ddK^z1Rx0tBGCBYgH(V-Cm zD#-spP~fx21>&=KCkX2D@)8pSa&c9#&u=^^_>$vxc{~0T3c0AbC2_?&G{Pph&N<;J z)SE(Ky#<>92V4aP|1F@0U?$O3aNu2zu7d24D=f<=JO#2~)9@db0xl3vVKYil;{0ao zBrreg!jc0vE{RMpZP#7rH58n;;85C>;=16{P|2TtnmQEM2#|^+4&^-oL}&(UgJHHf zi!wzlEe^HGBDZh4=;tHkV=Jx#M_WZ2i^@h^$fzj}D%kE>v?2$M-nE(I)4s=pZQvmW9^yAsb zzm}DPM=mXokI;qy00G)bL_t(o!|j*Xnu0(Kh1cG8Gd842Rj~X1kGIDNtRh7=xBeG0 zpPDl#Awc;0@WNy?=(VVXR&OwxR7JOkEvlt8Y?sB4JMp8n@7!jNuY#w{LSEiUlH=HaEnPW=s^DtV0_dXVDu1 zHg-Zh8#ogC4@xr@1zvtrd0+qCC1lRz# z?hb}SVnQUfYJ4~F3skOx>O3VNtahgrB0M^ zQtHSHmlLcKaI!Ml$;n8{Z)YWTDg^?i_EW}0>8A-ETI#;qD-~1<=&BZ7EFe!oUPSq6 zlsA&RmE{+c{BoAxP~^8X`At=PTNgiA#E&-d!&Uxxmk${ABaW_@k2vBXOFZUD2Tkdy sD;~C`|0ssI207*qoM6N<$f`^M`+W-In diff --git a/src/assets/hugo_site/web_page.png b/src/assets/hugo_site/web_page.png deleted file mode 100644 index 2581d6621a557380f6bb19654ce46a72c7e01bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!0t0+PT!A!0;}Z~SxX;ja6Uqj1 zo4|sNj~E&s0|o#8|9|}P&%&J_Wcr_)HG7 zf3Ls(t)u@%8fYd@NswPK!{=!dY>#gq-{0h}`?>Pw4h9BBPEQxdkch)?E_w?!83?ch zsQ=k0&8wjG-G0Ryp*qhFYu$T%L02cgjPc9PTze|!fkNfVS6?1Y({P-y;)v;9AsMC6 zUDo>!BpyAdx=vCl<@(t_Jb{~1w$?X#9NpB;b#c{Erlt&|c&CTlS=Sm4RDH>PeBm2^ zL{jvM#64D3rTP+I@3F};@7gQtRbB5_@_2#e#^@<(3g-W-Ciz>~dVYJRZO*vuaM>(= ze&21|T!k4HD@y0=IQQSo;l6E&MncMk7rYh5FW&M>NSL%(N#w~L_P2Q~`5|*ZUoQhg zf&|OE{iU_B?{p;<#9l0D{@HNwP)70&qkEAC5rrX}B0h(hM3#nb3;k|tVNz+Z%jEa1 Z+l=x-J { const logs = useLogStore((state) => state.logs); const [showAPIDetails, setShowAPIDetails] = useState(false); + const [showFullscreen, setShowFullscreen] = useState(false); + const [showIndex, setShowIndex] = useState(null); const toggleAPIDetails = useCallback(() => { setShowAPIDetails((prev) => !prev); }, []); + const toggleFullscreen = useCallback(() => { + setShowFullscreen((prev) => !prev); + }, []); + const handleKeyDown = useCallback( (event: KeyboardEvent) => { if (event.metaKey && event.key === "d") { @@ -38,15 +44,18 @@ const ApiDetails: React.FC = () => { return (
{showAPIDetails && (
-

+

API Logs (Latest 10) - +
+ + +

{logs.map((log, index) => ( @@ -55,7 +64,7 @@ const ApiDetails: React.FC = () => { className="p-4 border rounded-md shadow-sm bg-gray-50" >

- Request {index + 1}: + Latest Request {index + 1}:

@@ -65,13 +74,23 @@ const ApiDetails: React.FC = () => {
                 {log.response && (
                   <>
                     

- Response: + Response:{" "} +

-
-
-                        {JSON.stringify(log.response, null, 2)}
-                      
-
+ {showIndex === index ? ( +
+
+                          {JSON.stringify(log.response, null, 2)}
+                        
+
+ ) : null} )} {log.error && ( diff --git a/src/components/Auth/CocoCloud.tsx b/src/components/Auth/CocoCloud.tsx index 355087b3..2ec4960b 100644 --- a/src/components/Auth/CocoCloud.tsx +++ b/src/components/Auth/CocoCloud.tsx @@ -17,12 +17,7 @@ import { } from "@tauri-apps/plugin-deep-link"; export default function CocoCloud() { - const appStore = useAppStore(); - - const [lastUrl, setLastUrl] = useState(null); const [error, setError] = useState(null); - const [info, setInfo] = useState(null); - const [info2, setInfo2] = useState(null); const [isConnect] = useState(true); @@ -31,19 +26,19 @@ export default function CocoCloud() { const endpoint_http = useAppStore((state) => state.endpoint_http); const { auth, setAuth } = useAuthStore(); + const userInfo = useAuthStore((state) => state.userInfo); + const setUserInfo = useAuthStore((state) => state.setUserInfo); const [loading, setLoading] = useState(false); const getProfile = async () => { const response: any = await tauriFetch({ - url: `/profile`, + url: `/provider/account/profile`, method: "GET", - baseURL: appStore.endpoint_http, }); console.log("getProfile", response); - - setInfo2(JSON.stringify(response)) - } + setUserInfo(response.data || {}); + }; const handleOAuthCallback = async ( code: string | null, @@ -54,37 +49,40 @@ export default function CocoCloud() { return; } - // mock - // code = "d11feeab43f6c3e48a43" - // provider = "coco-cloud" - try { console.log("Handling OAuth callback:", { code, provider }); const response: any = await tauriFetch({ url: `/auth/request_access_token?request_id=${app_uid}`, method: "GET", - baseURL: appStore.endpoint_http, headers: { "X-API-TOKEN": code, }, }); - // { "access_token":xxx, "expire_at": "unix_timestamp_in_s" } - console.log("response", response); - setInfo(JSON.stringify(response)) + console.log( + "response", + `/auth/request_access_token?request_id=${app_uid}`, + code, + response + ); - getProfile() + if (response.data?.access_token) { + await setAuth({ + token: response.data?.access_token, + expires: response.data?.expire_at, + plan: { upgraded: false, last_checked: 0 }, + }); - await setAuth({ - token: response.data?.access_token, - expires: response.data?.expire_at, - plan: { upgraded: false, last_checked: 0 }, - }); + getProfile(); + } else { + setError("Sign in failed: " + response.data?.error?.reason); + } getCurrentWindow() .setFocus() .catch(() => {}); } catch (e) { console.error("Sign in failed:", error); + setError("Sign in failed: catch"); await setAuth(undefined); throw error; } finally { @@ -94,21 +92,23 @@ export default function CocoCloud() { const handleUrl = (url: string) => { try { + // url = "coco://oauth_callback?code=cu8ag982sdb06e0j6k3g&provider=coco-cloud" const urlObject = new URL(url); - console.error("1111111:", urlObject); + console.log("urlObject:", urlObject); - switch (urlObject.pathname) { - case "oauth_callback": - const code = urlObject.searchParams.get("code"); - const provider = urlObject.searchParams.get("provider"); - handleOAuthCallback(code, provider); - break; + const code = urlObject.searchParams.get("code"); + const provider = urlObject.searchParams.get("provider"); + handleOAuthCallback(code, provider); - default: - console.log("Unhandled deep link path:", urlObject.pathname); - } + // switch (urlObject.hostname) { + // case "/oauth_callback": + + // break; + + // default: + // console.log("Unhandled deep link path:", urlObject.pathname); + // } - setLastUrl(url); } catch (err) { console.error("Failed to parse URL:", err); setError("Invalid URL format"); @@ -117,15 +117,12 @@ export default function CocoCloud() { // Fetch the initial deep link intent useEffect(() => { - // coco://oauth_calback?code=&provider= - // handleOAuthCallback("cu0bpu53q95r66at2010", "coco-cloud"); - // + // handleUrl(""); getCurrentDeepLinkUrls() .then((urls) => { - console.error("22222 URLs:", urls); + console.log("URLs:", urls); if (urls && urls.length > 0) { handleUrl(urls[0]); - console.error("URLs:", urls); } }) .catch((err) => { @@ -141,22 +138,11 @@ export default function CocoCloud() { }, []); function LoginClick() { - let uid = app_uid; - if (!uid) { - uid = uuidv4(); - setAppUid(uid); - } - - // const response = await fetch("/api/register", { - // method: "POST", - // headers: { "Content-Type": "application/json" }, - // body: JSON.stringify({ uid }), - // }); - // const { token } = await response.json(); - // localStorage.setItem("auth_token", token); + let uid = uuidv4(); + setAppUid(uid); OpenBrowserURL( - `${endpoint_http}/sso/login/github?provider=coco-cloud&product=coco&request_id=${uid}` + `${endpoint_http}/sso/login/?provider=coco-cloud&product=coco&request_id=${uid}` ); setLoading(true); @@ -169,24 +155,8 @@ export default function CocoCloud() {
{error && ( -
Error: {error}
- )} - - {lastUrl && ( -
- Last opened URL: {lastUrl} -
- )} - - {info && ( -
- Info : {info} -
- )} - - {info2 && ( -
- info2 : {info2} +
+ Error: {error}
)}
@@ -231,7 +201,7 @@ export default function CocoCloud() { Account Information {auth ? ( - + ) : (
- {email} + {userInfo.email || "-"}
+
); -} \ No newline at end of file +} diff --git a/src/components/Settings/AdvancedSettings.tsx b/src/components/Settings/AdvancedSettings.tsx index 6a7f7d37..1d92c109 100644 --- a/src/components/Settings/AdvancedSettings.tsx +++ b/src/components/Settings/AdvancedSettings.tsx @@ -7,9 +7,8 @@ import { AppEndpoint } from "@/utils/tauri"; const ENDPOINTS = [ { value: "https://coco.infini.cloud", label: "https://coco.infini.cloud" }, - { value: "http://localhost:2900", label: "http://localhost:2900" }, { value: "http://localhost:9000", label: "http://localhost:9000" }, - { value: "https://infini.tpddns.cn:27200", label: "https://infini.tpddns.cn:27200" }, + { value: "http://infini.tpddns.cn:27200", label: "http://infini.tpddns.cn:27200" }, ]; export default function AdvancedSettings() { diff --git a/src/components/Settings/index2.tsx b/src/components/Settings/index2.tsx index 682fd856..33c2e16a 100644 --- a/src/components/Settings/index2.tsx +++ b/src/components/Settings/index2.tsx @@ -5,12 +5,12 @@ import { useSearchParams } from "react-router-dom"; import SettingsPanel from "./SettingsPanel"; import GeneralSettings from "./GeneralSettings"; -import AdvancedSettings from "./AdvancedSettings"; import AboutView from "./AboutView"; import CocoCloud from "@/components/Auth/CocoCloud" import Footer from "../Footer"; import { useTheme } from "../../contexts/ThemeContext"; import { AppTheme } from "../../utils/tauri"; +import ApiDetails from "@/components/AppAI/ApiDetails"; function SettingsPage() { const [defaultIndex, setDefaultIndex] = useState(0); @@ -82,7 +82,9 @@ function SettingsPage() { - +
+ Advanced Settings content +
@@ -95,6 +97,8 @@ function SettingsPage() {