Files
JianMiauandClaude Fable 5 d391726dd1 改用一般 Router 並支援 LINE 無綁定自動建帳號
根本原因:
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>
2026-08-03 11:30:24 +08:00

79 lines
2.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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>
</>
);