Skip to content

Commit f7ce748

Browse files
committed
Revert "review(todo-app): resplit task/model"
This reverts commit 297281e.
1 parent 297281e commit f7ce748

File tree

13 files changed

+105
-109
lines changed

13 files changed

+105
-109
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { createEffect } from "effector";
2+
import { typicodeApi } from "shared/api";
3+
4+
export const getTasksListFx = createEffect((params?: typicodeApi.tasks.GetTasksListParams) => {
5+
// Здесь также может быть доп. обработка эффекта
6+
return typicodeApi.tasks.getTasksList(params);
7+
});
8+
9+
export const getTaskByIdFx = createEffect((params: typicodeApi.tasks.GetTaskByIdParams) => {
10+
// Здесь также может быть доп. обработка эффекта
11+
return typicodeApi.tasks.getTaskById(params);
12+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createEvent } from "effector";
2+
import type { QueryConfig } from "./types";
3+
4+
export const toggleTask = createEvent<number>();
5+
export const setQueryConfig = createEvent<QueryConfig>();
Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,5 @@
1-
import { useStore, useStoreMap } from "effector-react";
2-
import * as tasks from "./tasks";
3-
import * as queryConfig from "./query-config";
4-
5-
const useQueryConfig = () => {
6-
return useStore(queryConfig.$queryConfig);
7-
};
8-
9-
const useTasks = () => {
10-
return useStore(tasks.$tasks);
11-
};
12-
13-
const useTasksList = () => {
14-
return useStoreMap({
15-
store: tasks.$tasks,
16-
keys: ["tasksList"],
17-
fn: (state) => Object.values(state)
18-
})
19-
};
20-
21-
/**
22-
* Можно разруливать на уровне эффектов - но тогда нужно подключать дополнительную логику в стор
23-
* @remark Например скрывать/показывать таск при `toggleTask` событии
24-
*/
25-
const useTasksListFiltered = () => {
26-
const tasksList = useTasksList();
27-
const queryConfig = useQueryConfig();
28-
29-
return tasksList.filter(task => (
30-
queryConfig.completed === undefined ||
31-
task.completed === queryConfig.completed
32-
));
33-
};
34-
35-
/**
36-
* @remark Можно добавить потенциально debounce логику
37-
*/
38-
const useLoading = () => {
39-
const tasksList = useStore(tasks.getTasksListFx.pending);
40-
const taskDetails = useStore(tasks.getTaskByIdFx.pending);
41-
return {tasksList, taskDetails}
42-
};
43-
44-
45-
const useTask = (taskId: number): import("shared/api").Task | undefined => {
46-
return useTasks()[taskId];
47-
};
48-
49-
export const selectors = {
50-
useQueryConfig,
51-
useTasks,
52-
useTask,
53-
useLoading,
54-
useTasksListFiltered,
55-
};
56-
57-
export { tasks, queryConfig };
1+
export * as effects from "./effects";
2+
export * as selectors from "./selectors";
3+
export * as store from "./store";
4+
export * as events from "./events";
5+
export * from "./types";

todo-app/src/entities/task/model/query-config.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { useStore, useStoreMap } from "effector-react";
2+
import { $tasks, $queryConfig } from "./store";
3+
import { getTaskByIdFx, getTasksListFx } from "./effects";
4+
5+
export const useQueryConfig = () => {
6+
return useStore($queryConfig);
7+
};
8+
9+
export const useTasks = () => {
10+
return useStore($tasks);
11+
};
12+
13+
export const useTasksList = () => {
14+
return useStoreMap({
15+
store: $tasks,
16+
keys: ["tasksList"],
17+
fn: (state) => Object.values(state)
18+
})
19+
};
20+
21+
/**
22+
* Можно разруливать на уровне эффектов - но тогда нужно подключать дополнительную логику в стор
23+
* @remark Например скрывать/показывать таск при `toggleTask` событии
24+
*/
25+
export const useTasksListFiltered = () => {
26+
const tasksList = useTasksList();
27+
const queryConfig = useQueryConfig();
28+
29+
return tasksList.filter(task => (
30+
queryConfig.completed === undefined ||
31+
task.completed === queryConfig.completed
32+
));
33+
};
34+
35+
/**
36+
* @remark Можно добавить потенциально debounce логику
37+
*/
38+
export const useLoading = () => {
39+
const tasksList = useStore(getTasksListFx.pending);
40+
const taskDetails = useStore(getTaskByIdFx.pending);
41+
return {tasksList, taskDetails}
42+
};
43+
44+
45+
export const useTask = (taskId: number): import("shared/api").Task | undefined => {
46+
return useTasks()[taskId];
47+
};
48+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { createStore } from "effector";
2+
import { normalize, schema } from "normalizr";
3+
import produce from "immer";
4+
import { getTasksListFx, getTaskByIdFx } from "./effects";
5+
import { toggleTask, setQueryConfig } from "./events";
6+
import { QueryConfig } from "./types";
7+
8+
export const taskSchema = new schema.Entity("tasks");
9+
10+
export const tasksInitialState: Record<number, import("shared/api").Task> = {};
11+
12+
// В рамках демо некритично, но можно хранить и в виде массива без нормализации
13+
export const $tasks = createStore(tasksInitialState)
14+
.on(getTasksListFx.doneData, (_, payload) => normalize(payload.data, [taskSchema]).entities.tasks)
15+
.on(getTaskByIdFx.doneData, (state, payload) => ({
16+
...state,
17+
...normalize(payload.data, taskSchema).entities.tasks,
18+
}))
19+
.on(toggleTask, (state, taskId) => produce(state, draft => {
20+
const task = draft[taskId];
21+
task.completed = !task.completed;
22+
}))
23+
24+
// Можно вынести в отдельную директорию (для хранения нескольких моделей)
25+
export const $queryConfig = createStore<QueryConfig>({})
26+
.on(setQueryConfig, (_, payload) => payload)

todo-app/src/entities/task/model/tasks.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export type QueryConfig = {
2+
completed?: boolean;
3+
userId?: number;
4+
};

todo-app/src/features/tasks-filters/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export type Filter = {
22
id: number;
33
title: string;
4-
config: import("entities/task").taskModel.queryConfig.QueryConfig;
4+
config: import("entities/task").taskModel.QueryConfig;
55
}
66

77
// Описываем здесь датасет фильтров "Закрытые" / "Открытые" и т.п.

todo-app/src/features/tasks-filters/ui.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const TasksFilters = ({ loading }: Props) => {
1313
{filtersList.map(({ title, id }) => (
1414
<Radio.Button
1515
key={id}
16-
onClick={() => taskModel.queryConfig.setQueryConfig(getFilterById(id).config)}
16+
onClick={() => taskModel.events.setQueryConfig(getFilterById(id).config)}
1717
value={id}
1818
disabled={loading}
1919
>

0 commit comments

Comments
 (0)