diff --git a/frontend/app/p/[treeId]/page.tsx b/frontend/app/p/[treeId]/page.tsx
index 75c6dea..aa95744 100644
--- a/frontend/app/p/[treeId]/page.tsx
+++ b/frontend/app/p/[treeId]/page.tsx
@@ -1,25 +1,30 @@
"use client";
import Link from "next/link";
-import { useParams } from "next/navigation";
+import { useParams, useRouter } from "next/navigation";
import { useEffect, useMemo, useState } from "react";
import { api } from "@/lib/api/client";
import type { components } from "@/lib/api/schema";
import { Card, CardContent } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
+import { PublicTreeChart } from "@/components/public-tree-chart";
type Person = components["schemas"]["PersonRead"];
type Event = components["schemas"]["EventRead"];
+type Relationship = components["schemas"]["RelationshipRead"];
type Tree = components["schemas"]["PublicTreeRead"];
// Public, no-login view of a tree. Everything here is already redacted by the
// /api/v1/public surface (living people show as "Living person").
export default function PublicTreePage() {
const { treeId } = useParams<{ treeId: string }>();
+ const router = useRouter();
const [tree, setTree] = useState(null);
const [people, setPeople] = useState([]);
const [events, setEvents] = useState([]);
+ const [rels, setRels] = useState([]);
+ const [focusId, setFocusId] = useState(null);
const [status, setStatus] = useState<"loading" | "ready" | "notfound">("loading");
const [search, setSearch] = useState("");
@@ -34,14 +39,22 @@ export default function PublicTreePage() {
setStatus("notfound");
return;
}
- const [p, e] = await Promise.all([
+ const [p, e, r] = await Promise.all([
api.GET("/api/v1/public/trees/{tree_id}/persons", { params: { path: { tree_id: treeId } } }),
api.GET("/api/v1/public/trees/{tree_id}/events", { params: { path: { tree_id: treeId } } }),
+ api.GET("/api/v1/public/trees/{tree_id}/relationships", {
+ params: { path: { tree_id: treeId } },
+ }),
]);
if (cancelled) return;
+ const ppl = p.data ?? [];
+ const home = t.data.home_person_id;
+ const homeId = home && ppl.some((x) => x.id === home) ? home : null;
setTree(t.data);
- setPeople(p.data ?? []);
+ setPeople(ppl);
setEvents(e.data ?? []);
+ setRels(r.data ?? []);
+ setFocusId((cur) => cur ?? homeId ?? ppl[0]?.id ?? null);
setStatus("ready");
})();
return () => {
@@ -97,12 +110,26 @@ export default function PublicTreePage() {
- setSearch(e.target.value)}
- />
+ {focusId && people.length > 0 && (
+ router.push(`/p/${treeId}/persons/${id}`)}
+ />
+ )}
+
+
+
All people
+ setSearch(e.target.value)}
+ />
+
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index f05ad9b..e49d837 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -31,6 +31,9 @@ export default function Home() {