78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
import { useRouter } from "next/navigation";
|
|
import { AdminItemForm, type ItemFormPayload } from "./AdminItemForm";
|
|
|
|
interface AdminItemCreateViewProps {
|
|
locale: string;
|
|
categories: string[];
|
|
serverOptions: string[];
|
|
}
|
|
|
|
export function AdminItemCreateView({ locale, categories, serverOptions }: AdminItemCreateViewProps) {
|
|
const router = useRouter();
|
|
const [submitting, setSubmitting] = useState(false);
|
|
|
|
const handleSubmit = async (payload: ItemFormPayload) => {
|
|
setSubmitting(true);
|
|
try {
|
|
const body = {
|
|
name: payload.name,
|
|
category: payload.category,
|
|
rarity: payload.rarity,
|
|
imageUrl: payload.imageUrl,
|
|
imageLocalPath: payload.imageLocalPath,
|
|
level: payload.level,
|
|
weight: payload.weight,
|
|
slots: payload.slots,
|
|
skill: payload.skill,
|
|
description: payload.description,
|
|
servers: payload.servers,
|
|
tags: payload.tags,
|
|
metadata: payload.metadata,
|
|
fields: payload.fields,
|
|
};
|
|
|
|
const response = await fetch("/api/admin/items", {
|
|
method: "POST",
|
|
credentials: "include",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(body),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorPayload = await response.json().catch(() => ({ error: "Erro ao criar item" }));
|
|
throw new Error(errorPayload?.error || "Falha ao criar item");
|
|
}
|
|
|
|
router.push(`/${locale}/admin?tab=items`);
|
|
router.refresh();
|
|
} finally {
|
|
setSubmitting(false);
|
|
}
|
|
};
|
|
|
|
const handleCancel = () => {
|
|
router.push(`/${locale}/admin?tab=items`);
|
|
};
|
|
|
|
return (
|
|
<div className="max-w-5xl mx-auto">
|
|
<div className="rounded-2xl border border-border/60 bg-card shadow-sm">
|
|
<AdminItemForm
|
|
mode="create"
|
|
categories={categories}
|
|
serverOptions={serverOptions}
|
|
onSubmit={handleSubmit}
|
|
onCancel={handleCancel}
|
|
submitting={submitting}
|
|
className="flex flex-col"
|
|
contentClassName="px-6 py-6"
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|