Skip to content

Commit

Permalink
Модифицирует логику удаления задачи
Browse files Browse the repository at this point in the history
  • Loading branch information
Seasle committed Dec 30, 2023
1 parent 9286194 commit eb54451
Show file tree
Hide file tree
Showing 13 changed files with 146 additions and 66 deletions.
43 changes: 41 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"@mantine/form": "^7.3.2",
"@mantine/hooks": "^7.3.2",
"@mantine/modals": "^7.3.2",
"@mantine/notifications": "^7.3.2",
"@mantine/spotlight": "^7.3.2",
"@tabler/icons-react": "^2.44.0",
"dayjs": "^1.11.10",
Expand Down
3 changes: 3 additions & 0 deletions src/app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Notifications } from '@mantine/notifications';
import {
ThemeProvider,
DateProvider,
Expand All @@ -7,11 +8,13 @@ import {
import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
import '@mantine/spotlight/styles.css';
import '@mantine/notifications/styles.css';
import './index.css';

export const App = () => {
return (
<ThemeProvider>
<Notifications />
<DateProvider>
<ModalProvider>
<Routing />
Expand Down
2 changes: 1 addition & 1 deletion src/entities/task/model/query-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const resetQueryConfig = createEvent();

export const $queryConfig = createStore<QueryConfig>({})
.on(setQueryConfig, (store, payload) => ({ ...store, ...payload }))
.on(resetQueryConfig, () => ({}));
.reset(resetQueryConfig);

persist({
key: 'query-config',
Expand Down
37 changes: 33 additions & 4 deletions src/entities/task/model/tasks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createStore, createEvent, combine } from 'effector';
import { createStore, createEvent, combine, sample } from 'effector';
import { useUnit } from 'effector-react';
import { persist } from 'effector-storage';
import { nanoid } from 'nanoid';
Expand All @@ -18,6 +18,15 @@ const removeTask = createEvent<TaskId>();

const toggleTask = createEvent<TaskId>();

const markTaskToRemove = createEvent<TaskId>();

const unmarkTaskToRemove = createEvent<TaskId>();

sample({
clock: removeTask,
target: unmarkTaskToRemove,
});

export const $tasks = createStore<Record<TaskId, Task>>({})
.on(addTask, (store, taskBase) => {
const id = nanoid();
Expand Down Expand Up @@ -53,16 +62,34 @@ export const $tasks = createStore<Record<TaskId, Task>>({})
};
});

export const $tasksList = combine($tasks, (tasks) => Object.values(tasks));
export const $tasksToDelete = createStore<TaskId[]>([])
.on(markTaskToRemove, (store, taskId) => [...store, taskId])
.on(unmarkTaskToRemove, (store, taskId) =>
store.filter((entry) => entry !== taskId),
);

$tasksToDelete.watch((s) => {
console.log(s);
});

export const $tasksList = combine(
$tasks,
$tasksToDelete,
(tasks, tasksToDelete) =>
Object.values(tasks).filter((task) => !tasksToDelete.includes(task.id)),
);

export const $tasksFiltered = combine(
$tasksList,
$queryConfig,
(tasks, query) =>
tasks.filter(
(task) =>
(customCompareIf(task.title, query.text, compareText) ||
customCompareIf(task.title, query.text, compareText)) &&
customCompareIf(
task.title.concat(task.description ?? ''),
query.text,
compareText,
) &&
compareIf(task.priority, query.priority) &&
compareIf(task.isCompleted, query.isCompleted) &&
customCompareIf(task.expiresIn, query.isOverdue, compareExpiresIn),
Expand Down Expand Up @@ -93,6 +120,8 @@ export const events = {
addTask,
removeTask,
toggleTask,
markTaskToRemove,
unmarkTaskToRemove,
};

export const selectors = {
Expand Down
1 change: 1 addition & 0 deletions src/entities/task/ui/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ export * from './task-overdue-icon';
export * from './task-non-overdue-icon';
export * from './task-priority-icon';
export * from './task-progress';
export * from './task-delete-button';
export * from './task-create-form';
14 changes: 7 additions & 7 deletions src/entities/task/ui/task-card/ui/TaskCard.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { Link } from 'react-router-dom';
import { Paper, Stack, Group, Flex, Text, Button } from '@mantine/core';
import { TaskOverdueIcon, TaskPriorityIcon, TaskProgress } from '../..';
import { DeleteButton } from '@/shared/ui';
import {
TaskOverdueIcon,
TaskPriorityIcon,
TaskProgress,
TaskDeleteButton,
} from '../..';
import { toDate, humanizedDate } from '@/shared/utils';
import { type Task } from '@/shared/types';
import { taskModel } from '@/entities/task';
Expand All @@ -14,10 +18,6 @@ export const TaskCard = ({ task }: TaskCardProps) => {
const linkTo = `/${task.id}`;
const isOverdue = toDate(task.expiresIn ?? '').getTime() < Date.now();

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

const onToggleClick = () => {
taskModel.events.toggleTask(task.id);
};
Expand All @@ -39,7 +39,7 @@ export const TaskCard = ({ task }: TaskCardProps) => {
</Group>
<Group>
<TaskPriorityIcon variant={task.priority} />
<DeleteButton onClick={onDeleteClick} />
<TaskDeleteButton task={task} />
</Group>
</Flex>
{task.description && <Text size="sm">{task.description}</Text>}
Expand Down
File renamed without changes.
58 changes: 58 additions & 0 deletions src/entities/task/ui/task-delete-button/ui/TaskDeleteButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Group, Button, ActionIcon, rem } from '@mantine/core';
import { notifications } from '@mantine/notifications';
import { IconQuestionMark, IconCheck, IconTrash } from '@tabler/icons-react';
import { type Task } from '@/shared/types';
import { taskModel } from '@/entities/task';

export interface TaskDeleteButtonProps {
task: Task;
}

export const TaskDeleteButton = ({ task }: TaskDeleteButtonProps) => {
const onClick = () => {
taskModel.events.markTaskToRemove(task.id);

notifications.show({
id: task.id,
title: `Вы удалили задачу: ${task.title}`,
message: (
<Group gap={rem(4)}>
Хотите вернуть?
<Button
color="blue"
variant="light"
size="compact-xs"
onClick={() => {
taskModel.events.unmarkTaskToRemove(task.id);

notifications.update({
id: task.id,
title: `Вы вернули задачу: ${task.title}`,
message: 'Задача возвращена',
color: 'green',
icon: <IconCheck />,
withCloseButton: true,
// eslint-disable-next-line @typescript-eslint/no-empty-function
onClose: () => {},
});
}}
>
Да!
</Button>
</Group>
),
color: 'yellow',
icon: <IconQuestionMark />,
withCloseButton: false,
onClose: () => {
taskModel.events.removeTask(task.id);
},
});
};

return (
<ActionIcon color="blue" onClick={onClick}>
<IconTrash />
</ActionIcon>
);
};
1 change: 1 addition & 0 deletions src/entities/task/ui/task-delete-button/ui/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './TaskDeleteButton';
50 changes: 0 additions & 50 deletions src/shared/ui/delete-button/ui/DeleteButton.tsx

This file was deleted.

1 change: 0 additions & 1 deletion src/shared/ui/delete-button/ui/index.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/shared/ui/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@ export * from './layout';
export * from './theme-switcher';
export * from './to-top';
export * from './choice-item';
export * from './delete-button';

0 comments on commit eb54451

Please sign in to comment.