import { useContext, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { HouseholdContext } from "../../context/HouseholdContext"; import useActionToast from "../../hooks/useActionToast"; import getApiErrorMessage from "../../lib/getApiErrorMessage"; import "../../styles/components/manage/CreateJoinHousehold.css"; function extractInviteToken(value) { const trimmed = value.trim(); if (!trimmed) return null; const directMatch = trimmed.match(/^\/?invite\/([a-zA-Z0-9]+)$/); if (directMatch) return directMatch[1]; try { const parsed = new URL(trimmed, window.location.origin); const urlMatch = parsed.pathname.match(/^\/invite\/([a-zA-Z0-9]+)$/); if (urlMatch) return urlMatch[1]; } catch { return null; } return null; } export default function CreateJoinHousehold({ initialMode = "create", onClose }) { const navigate = useNavigate(); const toast = useActionToast(); const { createHousehold: createHouseholdWithContext } = useContext(HouseholdContext); const [mode, setMode] = useState(initialMode === "join" ? "join" : "create"); const [householdName, setHouseholdName] = useState(""); const [inviteLink, setInviteLink] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); useEffect(() => { setMode(initialMode === "join" ? "join" : "create"); setError(""); }, [initialMode]); const handleCreate = async (e) => { e.preventDefault(); if (!householdName.trim()) return; setLoading(true); setError(""); try { await createHouseholdWithContext(householdName); toast.success("Created household", `Created household ${householdName.trim()}`); onClose(); } catch (err) { console.error("Failed to create household:", err); const message = getApiErrorMessage(err, "Failed to create household"); setError(message); toast.error("Create household failed", `Create household failed: ${message}`); } finally { setLoading(false); } }; const handleJoin = async (e) => { e.preventDefault(); if (!inviteLink.trim()) return; setLoading(true); setError(""); try { const inviteToken = extractInviteToken(inviteLink); if (!inviteToken) { const message = "Use a household invite link like /invite/abcd1234."; setError(message); toast.error("Open invite link failed", message); return; } toast.info("Opening invite link", "Checking invite details"); onClose(); navigate(`/invite/${inviteToken}`); } finally { setLoading(false); } }; return (
e.stopPropagation()}>

Household

{error &&
{error}
} {mode === "create" ? (
setHouseholdName(e.target.value)} placeholder="e.g., Smith Family" required autoFocus />
) : (
setInviteLink(e.target.value)} placeholder="https://.../invite/your-token" required autoFocus />

Paste the full invite URL or a local path like /invite/your-token

)}
); }