imports etc
This commit is contained in:
parent
762ce3c90d
commit
4f5a9c429c
@ -2,6 +2,8 @@ import WineList from "./_components/WineList";
|
||||
import FilterStatus from "./_components/FilterState";
|
||||
import CreateCountry from "./_components/admin/CreateCountry";
|
||||
import AllCountries from "./_components/AllCountries";
|
||||
import CreateRegion from "./_components/admin/CreateRegion";
|
||||
import AllRegions from "./_components/AllRegions";
|
||||
|
||||
export default function App() {
|
||||
return (
|
||||
@ -10,6 +12,8 @@ export default function App() {
|
||||
<WineList />
|
||||
<CreateCountry />
|
||||
<AllCountries />
|
||||
<CreateRegion />
|
||||
<AllRegions />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { Delete, LucideDelete } from "lucide-react";
|
||||
import Image from "next/image";
|
||||
import { Delete } from "lucide-react";
|
||||
import { deleteCountry } from "~/server/actions/deleteCountry";
|
||||
import { db } from "~/server/db";
|
||||
|
||||
@ -9,8 +8,8 @@ export default async function AllCountries() {
|
||||
<div className="pt-4">
|
||||
<h1 className="text-2xl">All Countries:</h1>
|
||||
{countries.map((country) => (
|
||||
<div className="flex gap-1">
|
||||
<p key={country.id}>{country.name}</p>
|
||||
<div key={country.id} className="flex gap-1">
|
||||
<p>{country.name}</p>
|
||||
<form action={deleteCountry.bind(null, country.id)}>
|
||||
<button>
|
||||
<Delete />
|
||||
|
21
src/app/_components/AllRegions.tsx
Normal file
21
src/app/_components/AllRegions.tsx
Normal file
@ -0,0 +1,21 @@
|
||||
import { db } from "~/server/db";
|
||||
|
||||
export default async function AllRegions() {
|
||||
const allRegions = await db.query.regions.findMany();
|
||||
return (
|
||||
<div className="pt-4">
|
||||
<h1 className="text-2xl">All Regions:</h1>
|
||||
{allRegions[0] ? (
|
||||
<>
|
||||
<ul>
|
||||
{allRegions.map((region) => (
|
||||
<li key={region.id}>{region.name}</li>
|
||||
))}
|
||||
</ul>
|
||||
</>
|
||||
) : (
|
||||
<p>There are no regions in the db.</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
13
src/app/_components/admin/CreateRegion.tsx
Normal file
13
src/app/_components/admin/CreateRegion.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
"use server";
|
||||
import { db } from "~/server/db";
|
||||
import CreateRegionForm from "./CreateRegionForm";
|
||||
|
||||
export default async function CreateRegion() {
|
||||
const allCountries = await db.query.countries.findMany();
|
||||
return (
|
||||
<>
|
||||
<h1 className="pt-4 text-2xl">Fill the form to create a new region</h1>
|
||||
<CreateRegionForm countries={allCountries} />
|
||||
</>
|
||||
);
|
||||
}
|
45
src/app/_components/admin/CreateRegionForm.tsx
Normal file
45
src/app/_components/admin/CreateRegionForm.tsx
Normal file
@ -0,0 +1,45 @@
|
||||
"use client";
|
||||
import { Input } from "~/components/ui/input";
|
||||
import SubmitButton from "../SubmitButton";
|
||||
import { useRef } from "react";
|
||||
import { addRegion } from "~/server/actions/createRegion";
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "~/components/ui/select";
|
||||
|
||||
type Country = {
|
||||
id: string;
|
||||
name: string;
|
||||
};
|
||||
|
||||
export default function CreateRegionForm(props: { countries: Country[] }) {
|
||||
const { countries } = props;
|
||||
const ref = useRef<HTMLFormElement>(null);
|
||||
const handleSubmit = async (formData: FormData) => {
|
||||
ref.current?.reset();
|
||||
await addRegion(formData);
|
||||
};
|
||||
return (
|
||||
<form ref={ref} action={handleSubmit}>
|
||||
<Input name="name" required />
|
||||
<Select name="country">
|
||||
<SelectTrigger className="w-[180px]">
|
||||
<SelectValue placeholder="Country" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{countries.map((country) => (
|
||||
<SelectItem key={country.id} value={country.id}>
|
||||
{country.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
<SubmitButton />
|
||||
</form>
|
||||
);
|
||||
}
|
30
src/server/actions/createRegion.ts
Normal file
30
src/server/actions/createRegion.ts
Normal file
@ -0,0 +1,30 @@
|
||||
"use server";
|
||||
|
||||
import { revalidatePath } from "next/cache";
|
||||
import { db } from "../db";
|
||||
import { regions } from "../db/schema";
|
||||
import { z } from "zod";
|
||||
|
||||
type NewRegion = {
|
||||
name: string;
|
||||
countryId: string;
|
||||
};
|
||||
|
||||
const schema = z.object({
|
||||
countryId: z.string(),
|
||||
name: z.string().min(1, "Name is required"),
|
||||
});
|
||||
|
||||
export const addRegion = async (formData: FormData) => {
|
||||
const newRegion: NewRegion = {
|
||||
name: (formData.get("name") as string).toLowerCase(),
|
||||
countryId: formData.get("country") as string,
|
||||
};
|
||||
revalidatePath("/");
|
||||
await db.insert(regions).values(newRegion).returning();
|
||||
return {
|
||||
message: message,
|
||||
errors: error,
|
||||
status: 200,
|
||||
};
|
||||
};
|
Loading…
Reference in New Issue
Block a user