import LandlordLayout from "@/Layouts/LandlordLayout"; import { Link, useForm, router } from "@inertiajs/react"; import { Globe, Plus, Trash2, ArrowLeft } from "lucide-react"; import { FormEvent, useState } from "react"; interface Domain { id: number; domain: string; } interface Tenant { id: string; name: string; short_name: string | null; email: string | null; is_active: boolean; created_at: string; updated_at: string; domains: Domain[]; } interface Token { id: number; name: string; last_used_at: string; created_at: string; } interface Flash { success: string | null; error: string | null; new_token: string | null; } interface Props { tenant: Tenant; tokens: Token[]; flash: Flash; } export default function TenantShow({ tenant, tokens = [], flash }: Props) { const [showAddDomain, setShowAddDomain] = useState(false); const [showAddToken, setShowAddToken] = useState(false); const { data, setData, post, processing, errors, reset } = useForm({ domain: "", }); // Token Form const { data: tokenData, setData: setTokenData, post: postToken, processing: processingToken, reset: resetToken } = useForm({ name: "", }); const handleAddDomain = (e: FormEvent) => { e.preventDefault(); post(route("landlord.tenants.domains.store", tenant.id), { onSuccess: () => { reset(); setShowAddDomain(false); }, }); }; const handleAddToken = (e: FormEvent) => { e.preventDefault(); postToken(route("landlord.tenants.tokens.store", tenant.id), { onSuccess: () => { resetToken(); // Don't close immediately if we want to show flash message? // Flash message usually appears on redirect back. setShowAddToken(false); }, }); }; const handleRevokeToken = (tokenId: number) => { if (confirm("確定要撤銷此金鑰嗎?撤銷後無法復原,POS 連線將中斷。")) { router.delete(route("landlord.tenants.tokens.destroy", [tenant.id, tokenId])); } }; const handleRemoveDomain = (domainId: number) => { if (confirm("確定要移除這個域名嗎?")) { router.delete(route("landlord.tenants.domains.destroy", [tenant.id, domainId])); } }; return (
{/* Back Link */} 返回列表 {/* Header */}

{tenant.name}

客戶 ID: {tenant.id}

樣式管理 編輯
{/* Info Card */}

基本資訊

狀態
{tenant.is_active ? "啟用" : "停用"}
客戶簡稱
{tenant.short_name || "-"}
聯絡信箱
{tenant.email || "-"}
建立時間
{tenant.created_at}
更新時間
{tenant.updated_at}
{/* Domains Card */}

綁定域名

{showAddDomain && (
setData("domain", e.target.value)} placeholder="例如:koori.erp.koori.tw" className="flex-1 px-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary-main focus:border-primary-main" />
)} {errors.domain &&

{errors.domain}

} {tenant.domains.length === 0 ? (

尚未綁定任何域名

) : (
    {tenant.domains.map((domain) => (
  • {domain.domain}
  • ))}
)}
{/* API Tokens Card */}

API 金鑰 (POS 整合)

{flash?.new_token && (

金鑰建立成功!請立即複製,離開後將無法再次查看。

{flash.new_token}
)} {showAddToken && (
setTokenData("name", e.target.value)} placeholder="金鑰名稱 (例如: POS-01)" className="flex-1 px-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary-main focus:border-primary-main" />
)} {tokens.length === 0 ? (

尚未建立任何 API 金鑰

) : (
{tokens.map((token) => ( ))}
名稱 建立時間 最後使用 操作
{token.name} {token.created_at} {token.last_used_at}
)}
); }