diff --git a/build-templates/lobby/index.html b/build-templates/lobby/index.html new file mode 100644 index 0000000..8e9fcaa --- /dev/null +++ b/build-templates/lobby/index.html @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/UI/Login.tsx b/src/UI/Login.tsx index 600b333..009e1c7 100644 --- a/src/UI/Login.tsx +++ b/src/UI/Login.tsx @@ -4,7 +4,7 @@ import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2"; import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse"; import { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; import { useGameItems } from "@/context/GameItemsContext"; -import { AccountLoginRequest } from "@/define/Request/AccountRequest"; +import { AccountCreateRequest, AccountLoginRequest } from "@/define/Request/AccountRequest"; import { CommonAccountResponse, LineLoginRequest } from "@/define/Request/RegisterRequest"; import WheelSelect from "@/components/WheelSelect"; import { EnvName, fetchGameUrl, fetchPlatformConfig, fetchPlatformList, PlatformEnvConfig, PlatformOption } from "@/modules/GoogleSheet/GoogleSheetService"; @@ -148,13 +148,29 @@ const Login = () => { setIsLogin(false); return; } - console.warn("LINE帳號無綁定"); - setIsLogin(false); + console.warn("LINE帳號無綁定,自動建立帳號"); + setLoginStep("無綁定帳號,建立新帳號中"); + yield* createAccountAndLogin(); return; } yield* serverAccountLogin(resp.Data.id, resp.Data.pw); } + /** LINE帳號無綁定(status 12)時:請Server建立訪客帳號後直接登入 */ + function* createAccountAndLogin(): IterableIterator { + const req: AccountCreateRequest = new AccountCreateRequest(); + yield req.SendAsync(true); + const resp: INetResponse = req.Result; + if (!resp.IsValid) { + CSMessage.CreateYesMsg("Account Create Error! Error Code : " + resp.Status); + setIsLogin(false); + return; + } + // 回傳格式為 [id, pw] + const [id, pw] = resp.Data as [number, string]; + yield* serverAccountLogin(String(id), pw); + } + /** 遊戲帳號登入取得玩家資料.統一登入時在刪除需要刪除的資料 */ function* serverAccountLogin(a: string, pw: string, partner: string = null): IterableIterator { let hasAP: boolean = (a && a != "null" && a != "undefined" && pw && pw != "null" && pw != "undefined"); diff --git a/src/index.tsx b/src/index.tsx index 2a04f90..bf5c874 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,7 +5,7 @@ import "dayjs/locale/zh-tw"; import React from "react"; import ReactDOM from "react-dom/client"; -import { createHashRouter, RouterProvider } from "react-router-dom"; +import { createBrowserRouter, RouterProvider } from "react-router-dom"; import { BaseEnumerator } from "./Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator"; import { GameItemsProvider } from "@/context/GameItemsContext"; @@ -27,11 +27,22 @@ BaseEnumerator.Init(); // 設定 dayjs 語言 dayjs.locale("zh-tw"); +// 依目前網址推導部署子路徑(專案不一定放在網站根目錄,例如 /Line_Project_Bot/) +function getBasename(): string { + let path: string = location.pathname.replace(/index\.html$/, ""); + // 去除已知路由字尾,避免在 /lobby 重新整理時把路由誤當成資料夾 + path = path.replace(/lobby\/?$/, ""); + if (!path.endsWith("/")) { + path += "/"; + } + return path; +} + // 路由設定 -const router = createHashRouter([ +const router = createBrowserRouter([ { path: "/", element: }, { path: "/lobby", element: }, -]); +], { basename: getBasename() }); // Render // 注意:不能用 React.StrictMode — 開發模式雙重掛載會讓 NetManagerSD 等靜態單例的連線互相覆蓋