back
bolt.new 生成 TODOアプリ、サーバー保存等 修正 shadcnUI + React
id: 174, 2024-10-15
概要:
生成AI的な、bolt.new使用して。TODOアプリ作成後、機能追加等のメモになります。
- データ(配列データ)、サーバー保存の追加になります。
[ 公開日: 2024/10/14 ]
構成
- bolt.new
- shadcn/ui
- Express.js
- esbuild
- typescript
関連
作成したコード
https://github.com/kuc-arc-f/bolt_4example/tree/main/todo_2
dev-start
bun run build
bun run dev
- APIエンドポイントに、POST通信
- todo_2/src/routes/todoData.ts
- https://github.com/kuc-arc-f/bolt_4example/blob/main/todo_2/src/routes/todoData.ts
....
create: function(body: any){
try {
if(!body){
throw new Error("nothing, body");
}
console.log(body);
const now = new Date();
const myUUID = uuidv4();
let row = {
id: myUUID,
text: body.text,
completed: false,
createdAt: now.toISOString(),
}
this.items.push(row);
return this.items;
} catch (error) {
console.error(error);
throw new Error("error, create");
}
},
- TOP画面
- todo_2/src/App.tsx
- https://github.com/kuc-arc-f/bolt_4example/blob/main/todo_2/src/App.tsx
....
return (
<>
<Card className="w-[350px] mx-auto">
<CardHeader>
<CardTitle>TODOアプリ</CardTitle>
</CardHeader>
<CardContent>
<div className="flex space-x-2 mb-4">
<Input
placeholder="タスクを検索..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="flex-grow"
/>
<Button onClick={() => openDialog()}>新しいタスク</Button>
</div>
<ScrollArea className="h-[300px]">
{filteredTodos.map(todo => (
<div key={todo.id} className="flex items-center space-x-2 mb-2">
<Checkbox
checked={todo.completed}
onCheckedChange={() => toggleTodo(todo.id)}
/>
<span className={`flex-grow text-left ${todo.completed ? "line-through" : ""}`}>{todo.text}</span>
<Button variant="ghost" size="icon" onClick={() => openDialog(todo)}>
<Edit className="h-4 w-4" />
</Button>
<Button variant="ghost" size="icon" onClick={() => {
if (window.confirm("Delete OK?")) {
deleteTodo(todo.id);
}
}}>
<Trash2 className="h-4 w-4" />
</Button>
</div>
))}
</ScrollArea>
</CardContent>
</Card>
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>{currentTodo ? "タスクを編集" : "新しいタスク"}</DialogTitle>
</DialogHeader>
<Input
value={todoText}
onChange={(e) => setTodoText(e.target.value)}
placeholder="タスクを入力..."
/>
<DialogFooter>
<Button onClick={saveTodo}>保存</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</>
);