diff --git a/panel/src/pages/admin/ImageBuildPage.tsx b/panel/src/pages/admin/ImageBuildPage.tsx index 280c13c..960f327 100644 --- a/panel/src/pages/admin/ImageBuildPage.tsx +++ b/panel/src/pages/admin/ImageBuildPage.tsx @@ -61,7 +61,11 @@ export function ImageBuildPage() { const locale = i18n.language; const now = Date.now(); const config = useConfig(); - const { identity } = useTier(); + // The owner tier comes from the server-side /me verdict (TierProvider), never + // from guessing at the address: the old mock-era email heuristic misread the + // real owner (felis-owner@example.com) as non-owner while treating any + // "owner@…" address as one. + const { isOwner } = useTier(); // Form & Dialog State const [dialogOpen, setDialogOpen] = useState(false); @@ -76,12 +80,6 @@ export function ImageBuildPage() { const [loadingSubmissions, setLoadingSubmissions] = useState(false); const [selectedSub, setSelectedSub] = useState(null); - const isOwner = useMemo(() => { - if (!identity?.email) return false; - const emailLower = identity.email.toLowerCase(); - return emailLower === "owner@mock.felis.local" || emailLower.startsWith("owner@"); - }, [identity]); - const visibleSubmissions = useMemo(() => { if (isOwner) { return submissions; @@ -137,12 +135,6 @@ export function ImageBuildPage() { const stored = localStorage.getItem(LOCAL_STORAGE_KEY); if (stored) { setBuildIds(JSON.parse(stored)); - } else { - // Seed default IDs so mock builds are loaded on first visit. - // In production, querying these will 404 and safely show the empty state. - const defaultIds = ["bld-1", "bld-2"]; - localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(defaultIds)); - setBuildIds(defaultIds); } } catch { setLoadingBuilds(false); @@ -598,4 +590,4 @@ export function ImageBuildPage() { ); -} \ No newline at end of file +}