nextjs-panel
Version:
Schema-based admin panel generator for Next.js using Prisma and React components.
25 lines (24 loc) • 1.48 kB
JavaScript
"use client";
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { useRouter } from "next/navigation";
import { useState } from "react";
import styles from "./SchemaForm.module.css";
function SchemaForm({ schema, api, params }) {
const [formData, setFormData] = useState({});
const router = useRouter();
const handleChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleSubmit = async (e) => {
e.preventDefault();
await fetch(api.create, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(formData),
});
setFormData({});
router.push(`/admin/${params}`);
};
return (_jsxs("form", { onSubmit: handleSubmit, className: styles.form, children: [schema.map((field) => (_jsxs("div", { className: styles.field, children: [_jsx("label", { className: styles.label, children: field.label }), field.type === "select" ? (_jsx("select", { name: field.name, onChange: handleChange, className: styles.select, children: field.options.map((opt) => (_jsx("option", { value: opt, children: opt }, opt))) })) : (_jsx("input", { type: field.type, name: field.name, value: formData[field.name] || "", onChange: handleChange, className: styles.input }))] }, field.name))), _jsx("button", { type: "submit", className: styles.button, children: "Submit" })] }));
}
export default SchemaForm;