根本原因: 1. Hash router 網址帶 /#/ 不美觀且與一般網站行為不一致。 2. register.line_login 收到 status 12(LINE 帳號無綁定)時直接中止, 新 token 無法登入。 影響: 網址改為一般路徑(自動偵測部署子路徑,不需放網站根目錄);靜態主機在 /lobby 重新整理由殘根導回入口頁。無綁定帳號時自動 account.create 取得 [id, pw] 後直接 account.login,登入面板顯示建立進度。 修法: - index.tsx:createHashRouter 改 createBrowserRouter,getBasename() 依 location.pathname 推導子路徑並去除已知路由字尾 - build-templates/lobby/index.html:靜態主機 SPA 殘根,重整時導回 ../ - Login.tsx:status 12 時走 createAccountAndLogin()(account.create 回傳 格式為 [id, pw] 陣列) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
import { ConfigProvider, theme } from "antd";
|
||
import zhTW from "antd/locale/zh_TW";
|
||
import dayjs from "dayjs";
|
||
import "dayjs/locale/zh-tw";
|
||
import React from "react";
|
||
import ReactDOM from "react-dom/client";
|
||
|
||
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
||
import { BaseEnumerator } from "./Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator";
|
||
|
||
import { GameItemsProvider } from "@/context/GameItemsContext";
|
||
import Lobby from "./UI/Lobby";
|
||
import Login from "./UI/Login";
|
||
import { ModalProvider } from "./UIControl/ModalContext";
|
||
|
||
// utils
|
||
import "@/FormTableExt/TableExt/CSSettingsV3Ext";
|
||
import "@/utils/ArrayExtension";
|
||
import "@/utils/catan";
|
||
import "@/utils/NumberExtension";
|
||
import "@/utils/String";
|
||
import "./index.css";
|
||
|
||
// 初始化 BaseEnumerator
|
||
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 = createBrowserRouter([
|
||
{ path: "/", element: <Login /> },
|
||
{ path: "/lobby", element: <Lobby /> },
|
||
], { basename: getBasename() });
|
||
|
||
// Render
|
||
// 注意:不能用 React.StrictMode — 開發模式雙重掛載會讓 NetManagerSD 等靜態單例的連線互相覆蓋
|
||
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
|
||
<>
|
||
<ConfigProvider
|
||
locale={zhTW}
|
||
theme={{
|
||
algorithm: theme.darkAlgorithm,
|
||
token: {
|
||
colorPrimary: "#ffb020",
|
||
colorBgBase: "#0a0d12",
|
||
colorBgContainer: "#10151d",
|
||
colorBorder: "#232d3d",
|
||
colorText: "#dbe4f0",
|
||
colorTextSecondary: "#6b7a8f",
|
||
borderRadius: 8,
|
||
fontFamily: "\"Noto Sans TC\", sans-serif",
|
||
},
|
||
components: {
|
||
Button: { fontFamily: "\"Chakra Petch\", \"Noto Sans TC\", sans-serif" },
|
||
Modal: { contentBg: "#10151d", headerBg: "#10151d" },
|
||
},
|
||
}}
|
||
>
|
||
<ModalProvider>
|
||
<GameItemsProvider>
|
||
<RouterProvider router={router} />
|
||
</GameItemsProvider>
|
||
</ModalProvider>
|
||
</ConfigProvider>
|
||
</>
|
||
);
|