mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
## 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
133 lines
3.2 KiB
JavaScript
133 lines
3.2 KiB
JavaScript
import { useState, useEffect } from "react";
|
|
import userbase from "userbase-js";
|
|
|
|
function Todo({ name, done, toggleComplete, deleteTodo }) {
|
|
return (
|
|
<li className="my-4">
|
|
<div className="flex items-center">
|
|
<span className={done ? "text-gray-500" : ""}>{name}</span>
|
|
<button
|
|
type="button"
|
|
className="mx-4 p-1 rounded bg-purple-400 text-white font-bold"
|
|
onClick={(e) => {
|
|
e.preventDefault();
|
|
toggleComplete();
|
|
}}
|
|
>
|
|
{done ? "not done" : "done"}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
onClick={(e) => {
|
|
e.preventDefault();
|
|
deleteTodo();
|
|
}}
|
|
className=" p-1 bg-red-500 text-white rounded font-bold"
|
|
>
|
|
delete
|
|
</button>
|
|
</div>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
function TodoForm() {
|
|
const [newTodo, setNewTodo] = useState("");
|
|
const [todos, setTodos] = useState([]);
|
|
const [disabled, setDisabled] = useState();
|
|
|
|
useEffect(() => {
|
|
async function openDatabase() {
|
|
try {
|
|
console.log("opening db...");
|
|
await userbase.openDatabase({
|
|
databaseName: "next-userbase-todos",
|
|
changeHandler: function (items) {
|
|
setTodos(items);
|
|
},
|
|
});
|
|
} catch (e) {
|
|
console.error(e.message);
|
|
}
|
|
}
|
|
openDatabase();
|
|
}, []);
|
|
|
|
async function addTodo(e) {
|
|
e.preventDefault();
|
|
setDisabled(true);
|
|
try {
|
|
await userbase.insertItem({
|
|
databaseName: "next-userbase-todos",
|
|
item: { name: newTodo, done: false },
|
|
});
|
|
setNewTodo("");
|
|
setDisabled(false);
|
|
} catch (e) {
|
|
console.error(e.message);
|
|
setDisabled(false);
|
|
}
|
|
}
|
|
|
|
async function toggleComplete(itemId, currentValue) {
|
|
try {
|
|
await userbase.updateItem({
|
|
databaseName: "next-userbase-todos",
|
|
item: { ...currentValue, done: !currentValue.done },
|
|
itemId,
|
|
});
|
|
} catch (e) {
|
|
console.error(e.message);
|
|
}
|
|
}
|
|
|
|
function handleNewTodo(e) {
|
|
e.preventDefault();
|
|
setNewTodo(e.target.value);
|
|
}
|
|
|
|
async function deleteTodo(itemId) {
|
|
setDisabled(true);
|
|
try {
|
|
await userbase.deleteItem({
|
|
databaseName: "next-userbase-todos",
|
|
itemId,
|
|
});
|
|
setNewTodo("");
|
|
setDisabled(false);
|
|
} catch (e) {
|
|
console.error(e.message);
|
|
setDisabled(false);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<form className="bg-white shadow-md rounded p-8" onSubmit={addTodo}>
|
|
<ul>
|
|
{todos.map((todo) => (
|
|
<Todo
|
|
key={todo.itemId}
|
|
name={todo.item.name}
|
|
done={todo.item.done}
|
|
toggleComplete={() => toggleComplete(todo.itemId, todo.item)}
|
|
deleteTodo={() => deleteTodo(todo.itemId)}
|
|
/>
|
|
))}
|
|
</ul>
|
|
<div className="flex my-4">
|
|
<input
|
|
type="text"
|
|
onChange={handleNewTodo}
|
|
value={newTodo}
|
|
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
|
/>
|
|
<button disabled={disabled} className="btn-yellow mx-4" type="submit">
|
|
add
|
|
</button>
|
|
</div>
|
|
</form>
|
|
);
|
|
}
|
|
|
|
export default TodoForm;
|