"use client"; import { useEffect, useState } from "react"; import { checkAdultContent, fetchRomanceEligibility, setAdultModeConsent, type AdultContentCheckResult, type RomanceEligibility, } from "../../lib/api"; const CHARACTER_ID = "seed-character-genki"; const USER_ID = "seed-user-primary"; // L-8 成人模式 opt-in 介面:只做開關與既有 API 串接。 // 「成年使用者驗證」的實際機制計畫未指定(需人工確認),這裡先讓 verifiedAdult 等同使用者自我宣告, // 待正式驗證流程拍板後再另行補項——不在這裡臆測或假造一套驗證邏輯。 export function AdultModeSection() { const [optedIn, setOptedIn] = useState(false); const [eligibility, setEligibility] = useState(null); const [checkResult, setCheckResult] = useState(null); const [pending, setPending] = useState(false); const [error, setError] = useState(null); async function refresh() { setError(null); try { const [eligibilityResult, checkResultValue] = await Promise.all([ fetchRomanceEligibility(CHARACTER_ID), checkAdultContent(CHARACTER_ID, USER_ID), ]); setEligibility(eligibilityResult); setCheckResult(checkResultValue); } catch { setError("無法連線到 api 服務,成人模式狀態暫時無法顯示"); } } useEffect(() => { void refresh(); }, []); async function handleToggle(next: boolean) { setPending(true); setError(null); try { await setAdultModeConsent(USER_ID, next, next); setOptedIn(next); await refresh(); } catch { setError("成人模式設定失敗,請確認 api 服務是否已啟動"); } finally { setPending(false); } } return (

成人模式

系統預設為全年齡純愛尺度;開啟後也只有正史成年角色能解鎖,正史未成年、後日談推演才成年的角色永久限純愛尺度。

{error && (

{error}

)} {eligibility && (
戀愛軸資格:{eligibility.romanceAxisEligible ? "可用" : "尚未解鎖"} 成人模式角色資格:{eligibility.adultModeEligible ? "符合" : "不符合"} {eligibility.isEpilogueAdult && 此角色為後日談推演成年,永久限純愛尺度。}
)} {checkResult && (

{checkResult.allowed ? "目前可使用成人內容。" : `目前無法使用成人內容:${checkResult.reason}`}

)}
); }