"use server"; import { revalidatePath } from "next/cache"; import { api, unwrap } from "@/lib/api"; import { attempt, field, type ActionState } from "@/lib/actions"; const done = () => revalidatePath("/account"); /** Starts linking an IMVU account: the API makes a code to put in its tagline. */ export async function linkAccount(_: ActionState, form: FormData): Promise { return attempt(async () => { unwrap(await api.account.links.post({ username: field(form, "username") })); done(); }); } /** A pending link: check the tagline for the code, or cancel. */ export async function challengeAction(_: ActionState, form: FormData): Promise { const imvu = field(form, "imvu"); return attempt(async () => { if (field(form, "intent") === "cancel") { unwrap(await api.account.challenges({ imvu }).delete()); } else { unwrap(await api.account.links({ imvu }).check.post()); } done(); }); } /** A linked account: check its age status with IMVU again, or unlink it. */ export async function linkAction(_: ActionState, form: FormData): Promise { const imvu = field(form, "imvu"); return attempt(async () => { if (field(form, "intent") === "unlink") { unwrap(await api.account.links({ imvu }).delete()); done(); return; } unwrap(await api.account.links({ imvu }).recheck.post()); done(); return "Checked with IMVU just now."; }); } export async function saveSettings( imvu: number, settings: { showBadge?: boolean; showPresence?: boolean; listRooms?: boolean }, ): Promise { return attempt(async () => { unwrap(await api.account.links({ imvu }).patch(settings)); done(); }); } export async function signOutComputers(_: ActionState, _form: FormData): Promise { return attempt(async () => { unwrap(await api.account["signout-computers"].post()); done(); return "Signed out everywhere."; }); }