/** * 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 { return new Promise((resolve) => setTimeout(resolve, ms)); } /** จำลองเปิดหน้าต่าง login — สำเร็จทันที ตั้งชื่อจาก NEXT_PUBLIC_ADDIN_MOCK_USERNAME */ export async function login(): Promise { 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 { return username ? `mock-token-${username}` : null; } /** mock: token ไม่มีวันหมดอายุจริง — คืนตัวเดิมหรือ null ตามสถานะ login */ export async function refreshAccessToken(): Promise { 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; }