Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
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;
|