Files
StevenandGitHub 4466ba436b chore(examples): use default prettier for examples/templates (#60530)
## Description
This PR ensures that the default prettier config is used for examples
and templates.

This config is compatible with `prettier@3` as well (upgrading prettier
is bigger change that can be a future PR).

## Changes
- Updated `.prettierrc.json` in root with `"trailingComma": "es5"` (will
be needed upgrading to prettier@3)
- Added `examples/.prettierrc.json` with default config (this will
change every example)
- Added `packages/create-next-app/templates/.prettierrc.json` with
default config (this will change every template)

## Related

- Fixes #54402
- Closes #54409
2024-01-11 16:01:44 -07:00

75 lines
1.4 KiB
TypeScript

"use server";
import { revalidatePath } from "next/cache";
import postgres from "postgres";
import { z } from "zod";
let sql = postgres(process.env.DATABASE_URL || process.env.POSTGRES_URL!, {
ssl: "allow",
});
// CREATE TABLE todos (
// id SERIAL PRIMARY KEY,
// text TEXT NOT NULL
// );
export async function createTodo(
prevState: {
message: string;
},
formData: FormData,
) {
const schema = z.object({
todo: z.string().min(1),
});
const parse = schema.safeParse({
todo: formData.get("todo"),
});
if (!parse.success) {
return { message: "Failed to create todo" };
}
const data = parse.data;
try {
await sql`
INSERT INTO todos (text)
VALUES (${data.todo})
`;
revalidatePath("/");
return { message: `Added todo ${data.todo}` };
} catch (e) {
return { message: "Failed to create todo" };
}
}
export async function deleteTodo(
prevState: {
message: string;
},
formData: FormData,
) {
const schema = z.object({
id: z.string().min(1),
todo: z.string().min(1),
});
const data = schema.parse({
id: formData.get("id"),
todo: formData.get("todo"),
});
try {
await sql`
DELETE FROM todos
WHERE id = ${data.id};
`;
revalidatePath("/");
return { message: `Deleted todo ${data.todo}` };
} catch (e) {
return { message: "Failed to delete todo" };
}
}