import { Form, Link, useLoaderData, useNavigation } from "react-router"; import type { Route } from "./+types/favorites"; import { addFavorite, deleteFavorite, deletePasskey, listFavorites, listPasskeys, requireLogin, } from "~/lib/auth.server"; export async function loader({ request }: Route.LoaderArgs) { requireLogin(request); return { favorites: listFavorites(), passkeys: listPasskeys() }; } export async function action({ request }: Route.ActionArgs) { requireLogin(request); const form = await request.formData(); switch (form.get("intent")) { case "add": { const added = addFavorite(String(form.get("term") ?? "")); return { error: added ? null : "空欄か、登録済みのワードです" }; } case "delete": deleteFavorite(Number(form.get("id"))); return { error: null }; case "delete-passkey": return { error: deletePasskey(String(form.get("id"))) ? null : "最後のパスキーは削除できません", }; } return { error: null }; } export default function Favorites({ actionData }: Route.ComponentProps) { const { favorites, passkeys } = useLoaderData(); const navigation = useNavigation(); const adding = navigation.formData?.get("intent") === "add"; return (
🎸 ライブに行くしかない

お気に入り

該当イベントを見る →

バンド名などを登録すると、タイトルか出演者に含まれるイベントに ★ が付きます(全角/半角・大文字/小文字は区別しません)。

{actionData?.error &&

{actionData.error}

} {favorites.length === 0 ? (

まだ登録されていません

) : (
    {favorites.map((f) => (
  • {f.term} 0 ? "text-indigo-300" : "text-gray-600"}`}> {f.upcoming_count} 件
  • ))}
)}

パスキー

    {passkeys.map((p) => (
  • {p.label ?? "(名前なし)"} {p.last_used_at ? `最終使用 ${p.last_used_at.slice(0, 10)}` : `登録 ${p.created_at.slice(0, 10)}`} {passkeys.length > 1 && (
    )}
  • ))}
パスキーを追加
); }