พอร์ต taskpane ของ Word add-in "e-Court Documents Versioning" จาก D:\word-addin-poc มาเป็น sibling app ที่ route /docedit/wordaddin: - wordaddin/ (client-only zone): services พอร์ตดิบทั้งชุด (authService/versioningService เป็น mock รอ backend จริง) + models + config - components/wordaddin/: WordAddinGate ฉีด office.js self-host (singleton กัน StrictMode double-inject + fallback timer ครอบเคส onReady เงียบ) และ TaskpaneApp state machine แปลง JSX เป็น Genesis design system - scripts/fetch-office-js.mjs (postinstall ตัวที่สาม): ดาวน์โหลด Office.js runtime ล่าสุดจาก CDN Microsoft ไป public/wordaddin/office-js/ (gitignore สร้างใหม่ได้ — npm @microsoft/office-js ตกรุ่นไม่มี Document.close) - middleware/basePath/root page: เปิด /wordaddin เป็น public (auth แยกจาก แอป note), root /docedit redirect ไป taskpane ยกเว้นลิงก์ e-Court N8 (?fileUrl=&fileId=&typeId=) ที่ยังส่งต่อ /note ตามเดิม - docker/web.Dockerfile รัน fetch-office-js ตอน build + npm scripts dev:https สำหรับ sideload ตาม docs/WORDADDIN-DEV.md Co-Authored-By: Claude Code <noreply@anthropic.com>
61 lines
2.4 KiB
TypeScript
61 lines
2.4 KiB
TypeScript
/**
|
|
* MOCK — แทน Keycloak OIDC/PKCE ของต้นฉบับ (ผู้ใช้งานเลือกไม่ใช้ Keycloak ช่วงพอร์ต)
|
|
* ต้นฉบับ: D:\word-addin-poc\addin\src\services\authService.ts (login ผ่าน Office Dialog API,
|
|
* token เก็บใน memory เท่านั้น, auto-refresh)
|
|
*
|
|
* วันสลับเป็น auth จริง: เขียน implementation ใหม่โดยคง export surface ด้านล่างครบทุกตัว
|
|
* (เพิ่ม refreshAccessToken ที่ต้นฉบับมีอยู่แล้วสำหรับ apiClient) — โค้ดอื่นไม่ต้องแตะ
|
|
*/
|
|
|
|
import { config } from "../config";
|
|
|
|
/** discriminated union เหมือนต้นฉบับ — ok:false ต้องมี error เสมอ */
|
|
export type LoginResult = { ok: true } | { ok: false; error: string };
|
|
|
|
/** state เดียวของ mock — null = signed out */
|
|
let username: string | null = null;
|
|
|
|
function delay(ms: number): Promise<void> {
|
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
}
|
|
|
|
/** จำลองเปิดหน้าต่าง login — สำเร็จทันที ตั้งชื่อจาก NEXT_PUBLIC_ADDIN_MOCK_USERNAME */
|
|
export async function login(): Promise<LoginResult> {
|
|
await delay(300);
|
|
username = config.mockUsername;
|
|
return { ok: true };
|
|
}
|
|
|
|
/** mock-only — โหมด ?addindemo ใช้ตั้ง session ทันทีไม่ผ่านปุ่ม Sign in */
|
|
export function signInForDemo(): void {
|
|
username = config.mockUsername;
|
|
}
|
|
|
|
export async function getAccessToken(): Promise<string | null> {
|
|
return username ? `mock-token-${username}` : null;
|
|
}
|
|
|
|
/** mock: token ไม่มีวันหมดอายุจริง — คืนตัวเดิมหรือ null ตามสถานะ login */
|
|
export async function refreshAccessToken(): Promise<string | null> {
|
|
return getAccessToken();
|
|
}
|
|
|
|
export function getUsername(): string | undefined {
|
|
return username ?? undefined;
|
|
}
|
|
|
|
export function isTokenValid(): boolean {
|
|
return username !== null;
|
|
}
|
|
|
|
export function hasRefreshToken(): boolean {
|
|
return username !== null;
|
|
}
|
|
|
|
export function startAutoRefresh(): void {
|
|
// mock: ไม่มีอะไรต้อง refresh
|
|
}
|
|
|
|
export function signOut(): void {
|
|
username = null;
|
|
}
|