Skip to content

Commit

Permalink
Добавляет возможность удаления задачи
Browse files Browse the repository at this point in the history
  • Loading branch information
Seasle committed Dec 29, 2023
1 parent b3d5301 commit 600db9c
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/entities/task/model/tasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@ import {
createStorageAdapter,
compareIf,
customCompareIf,
excludeKey,
} from '@/shared/utils';
import { type TaskBase, type Task, type TaskId } from '@/shared/types';

const addTask = createEvent<TaskBase>();

const removeTask = createEvent<TaskId>();

const toggleTask = createEvent<TaskId>();

export const $tasks = createStore<Record<TaskId, Task>>({})
Expand All @@ -36,6 +39,7 @@ export const $tasks = createStore<Record<TaskId, Task>>({})
},
};
})
.on(removeTask, (store, taskId) => excludeKey(store, taskId))
.on(toggleTask, (store, taskId) => {
const isCompleted = !store[taskId].isCompleted;

Expand Down Expand Up @@ -76,6 +80,7 @@ const useTasks = () => {

export const events = {
addTask,
removeTask,
toggleTask,
};

Expand Down
10 changes: 9 additions & 1 deletion src/entities/task/ui/task-card/ui/TaskCard.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Paper, Stack, Group, Flex, Text, Button } from '@mantine/core';
import { TaskOverdueIcon, TaskPriorityIcon, TaskProgress } from '../..';
import { DeleteButton } from '@/shared/ui';
import { toDate, humanizedDate } from '@/shared/utils';
import { type Task } from '@/shared/types';
import { taskModel } from '@/entities/task';
Expand All @@ -11,6 +12,10 @@ export interface TaskCardProps {
export const TaskCard = ({ task }: TaskCardProps) => {
const isOverdue = toDate(task.expiresIn ?? '').getTime() < Date.now();

const onDeleteClick = () => {
taskModel.events.removeTask(task.id);
};

const onToggleClick = () => {
taskModel.events.toggleTask(task.id);
};
Expand All @@ -25,7 +30,10 @@ export const TaskCard = ({ task }: TaskCardProps) => {
{task.title}
</Text>
</Group>
<TaskPriorityIcon variant={task.priority} />
<Group>
<TaskPriorityIcon variant={task.priority} />
<DeleteButton onClick={onDeleteClick} />
</Group>
</Flex>
{task.description && <Text size="sm">{task.description}</Text>}
{task.expiresIn && (
Expand Down
1 change: 1 addition & 0 deletions src/shared/ui/delete-button/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './ui';
50 changes: 50 additions & 0 deletions src/shared/ui/delete-button/ui/DeleteButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { useState, useCallback, useRef, memo } from 'react';
import { ActionIcon, type MantineColor } from '@mantine/core';
import { IconTrash } from '@tabler/icons-react';

export interface DeleteButtonProps {
delay?: number;
idleColor?: MantineColor;
confirmColor?: MantineColor;
onClick?: () => void;
}

export const DeleteButton = memo(
({
delay = 1000,
idleColor = 'blue',
confirmColor = 'red',
onClick,
}: DeleteButtonProps) => {
const [color, setColor] = useState<MantineColor>(idleColor);
const isClicked = useRef(false);
const timeout = useRef<number | undefined>(undefined);

const onDelete = useCallback(() => {
if (!isClicked.current) {
setColor(confirmColor);
isClicked.current = true;

timeout.current = window.setTimeout(() => {
setColor(idleColor);
isClicked.current = false;
}, delay);
} else {
setColor(idleColor);
isClicked.current = false;

window.clearTimeout(timeout.current);

onClick?.();
}
}, [delay, idleColor, confirmColor, onClick]);

return (
<ActionIcon color={color} onClick={onDelete}>
<IconTrash />
</ActionIcon>
);
},
);

DeleteButton.displayName = 'DeleteButton';
1 change: 1 addition & 0 deletions src/shared/ui/delete-button/ui/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './DeleteButton';
1 change: 1 addition & 0 deletions src/shared/ui/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './layout';
export * from './theme-switcher';
export * from './to-top';
export * from './choice-item';
export * from './delete-button';
7 changes: 7 additions & 0 deletions src/shared/utils/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,10 @@ export const compareIf = <T>(value: T, needle: T | undefined) => {

export const clamp = (min: number, max: number, value: number) =>
Math.max(min, Math.min(max, value));

export const excludeKey = <T, K extends keyof T>(entry: T, key: K) => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { [key]: _, ...data } = entry;

return data;
};

0 comments on commit 600db9c

Please sign in to comment.