fix(task): replace Date.now with nanoid for unique keys and update task interface
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"nanoid": "^5.1.9",
|
||||||
"react": "^19.2.5",
|
"react": "^19.2.5",
|
||||||
"react-dom": "^19.2.5"
|
"react-dom": "^19.2.5"
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ function App() {
|
|||||||
value={inputValue}
|
value={inputValue}
|
||||||
onChange={(e) => setInputValue(e.target.value)}
|
onChange={(e) => setInputValue(e.target.value)}
|
||||||
/>
|
/>
|
||||||
<button onClick={() => addTask(inputValue)}>Add</button>
|
<button onClick={() => { addTask(inputValue); setInputValue(''); }}>Add</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="task-list">
|
<div className="task-list">
|
||||||
{tasks.length === 0 ? (
|
{tasks.length === 0 ? (
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ import type { Task } from "../types/task";
|
|||||||
|
|
||||||
interface TaskItemProps {
|
interface TaskItemProps {
|
||||||
task: Task;
|
task: Task;
|
||||||
onDelete: (id: number) => void;
|
onDelete: (id: string) => void;
|
||||||
onToggle: (id: number) => void;
|
onToggle: (id: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TaskItem = memo(({ task, onDelete, onToggle }: TaskItemProps) => {
|
export const TaskItem = memo(({ task, onDelete, onToggle }: TaskItemProps) => {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useCallback, useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
import type { Task } from "../types/task";
|
import type { Task } from "../types/task";
|
||||||
|
import { nanoid } from "nanoid";
|
||||||
|
|
||||||
export const useTasks = () => {
|
export const useTasks = () => {
|
||||||
const [tasks, setTasks] = useState<Task[]>(() => {
|
const [tasks, setTasks] = useState<Task[]>(() => {
|
||||||
@@ -15,23 +16,21 @@ export const useTasks = () => {
|
|||||||
if (title.trim() === '') return;
|
if (title.trim() === '') return;
|
||||||
|
|
||||||
const newTask: Task = {
|
const newTask: Task = {
|
||||||
id: Date.now(),
|
id: nanoid(),
|
||||||
title: title,
|
title,
|
||||||
completed: false,
|
completed: false,
|
||||||
createdAt: new Date().toISOString()
|
createdAt: new Date().toISOString()
|
||||||
};
|
};
|
||||||
|
|
||||||
setTasks([...tasks, newTask]);
|
|
||||||
|
|
||||||
setTasks(prev => [...prev, newTask]);
|
setTasks(prev => [...prev, newTask]);
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteTask = useCallback((id: number) => {
|
const deleteTask = useCallback((id: string) => {
|
||||||
setTasks(tasks.filter(task => task.id !== id));
|
setTasks(prev => prev.filter(task => task.id !== id));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const toggleTask = useCallback((id: number) => {
|
const toggleTask = useCallback((id: string) => {
|
||||||
setTasks(tasks.map(task =>
|
setTasks(prev => prev.map(task =>
|
||||||
task.id === id ? { ...task, completed: !task.completed } : task
|
task.id === id ? { ...task, completed: !task.completed } : task
|
||||||
));
|
));
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
export interface Task {
|
export interface Task {
|
||||||
id: number;
|
id: string;
|
||||||
title: string;
|
title: string;
|
||||||
completed: boolean;
|
completed: boolean;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
|
|||||||
@@ -999,6 +999,11 @@ nanoid@^3.3.11:
|
|||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
|
||||||
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
|
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
|
||||||
|
|
||||||
|
nanoid@^5.1.9:
|
||||||
|
version "5.1.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.9.tgz#aac959acf7d685269fb1be7f70a90d9db0848948"
|
||||||
|
integrity sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==
|
||||||
|
|
||||||
natural-compare@^1.4.0:
|
natural-compare@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
|
|||||||
Reference in New Issue
Block a user