Skip to content

Commit a2f09c3

Browse files
committed
Switch folders when switch user
1 parent 06a57cf commit a2f09c3

File tree

10 files changed

+116
-65
lines changed

10 files changed

+116
-65
lines changed

src/components/PlayStopButton/PlayStopButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default observer(function PlayStopButton({
2727
if (!task?.active) {
2828
tasksStore.startTimer(task);
2929
} else {
30-
tasksStore.stopTimer(task);
30+
tasksStore.stopTimer();
3131
}
3232
}
3333
}

src/components/SettingsModal/NewProfilePopover.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,20 @@ const NewProfilePopover: React.FC<INewProfilePopoverProps> = (
2727
return !settingsStore.settings.profiles.includes(profile);
2828
}, []);
2929

30-
const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {
31-
const profile = event.target.value;
32-
setProfile(profile);
33-
setIsValid(isProfileValid(profile));
34-
}, []);
30+
const handleChange = useCallback(
31+
(event: ChangeEvent<HTMLInputElement>) => {
32+
const profile = event.target.value;
33+
setProfile(profile);
34+
setIsValid(isProfileValid(profile));
35+
},
36+
[isProfileValid]
37+
);
38+
39+
const handleCreate = useCallback(() => {
40+
settingsStore.addProfile(profile);
41+
setVisible(false);
42+
setProfile('');
43+
}, [profile, setVisible]);
3544

3645
return (
3746
<Popover
@@ -42,7 +51,7 @@ const NewProfilePopover: React.FC<INewProfilePopoverProps> = (
4251
value={profile}
4352
onChange={handleChange}
4453
/>
45-
<Button type="primary" disabled={!isValid}>
54+
<Button type="primary" disabled={!isValid} onClick={handleCreate}>
4655
Create
4756
</Button>
4857
</Space>

src/components/SettingsModal/SettingsModal.tsx

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import React, { useState } from 'react';
1+
import React, { useCallback, useState } from 'react';
22
import { Col, Form, Modal, Row, Select, Space } from 'antd';
33
import { createUseStyles } from 'react-jss';
4+
import { observer } from 'mobx-react';
45

56
import rootStore from '../../modules/RootStore';
67
import IModalProps from '../../types/IModalProps';
@@ -10,45 +11,58 @@ const { settingsStore } = rootStore;
1011

1112
interface ISettingsModalProps extends IModalProps {}
1213

13-
const SettingsModal: React.VFC<ISettingsModalProps> = (
14-
props: ISettingsModalProps
15-
) => {
16-
const { visible, onClose } = props;
17-
const [showNewProfilePopover, setShowNewProfilePopover] = useState<boolean>(
18-
false
19-
);
20-
21-
return (
22-
<Modal
23-
title="Settings"
24-
visible={visible}
25-
// okButtonProps={{ disabled: !valid }}
26-
okText="Save"
27-
onOk={onClose}
28-
onCancel={onClose}
29-
>
30-
<Row>
31-
<Col span={24}>
32-
<Form.Item label="Profile" labelCol={{ span: 24 }}>
33-
<Space>
34-
<Select>
35-
{settingsStore.settings.profiles.map((profile) => (
36-
<Select.Option key={profile} value={profile}>
37-
{profile}
38-
</Select.Option>
39-
))}
40-
</Select>
41-
<NewProfilePopover
42-
visible={showNewProfilePopover}
43-
setVisible={setShowNewProfilePopover}
44-
/>
45-
</Space>
46-
</Form.Item>
47-
</Col>
48-
</Row>
49-
</Modal>
50-
);
51-
};
14+
const SettingsModal: React.VFC<ISettingsModalProps> = observer(
15+
(props: ISettingsModalProps) => {
16+
const { visible, onClose } = props;
17+
18+
const [showNewProfilePopover, setShowNewProfilePopover] = useState<boolean>(
19+
false
20+
);
21+
const [profile, setProfile] = useState<string>(
22+
settingsStore.settings.currentProfile
23+
);
24+
25+
const handleSave = useCallback(() => {
26+
settingsStore.setActiveProfile(profile);
27+
onClose();
28+
}, [profile, onClose]);
29+
30+
const handleChangeProfile = useCallback((selected: string) => {
31+
setProfile(selected);
32+
}, []);
33+
34+
return (
35+
<Modal
36+
title="Settings"
37+
visible={visible}
38+
// okButtonProps={{ disabled: !valid }}
39+
okText="Save"
40+
onOk={handleSave}
41+
onCancel={onClose}
42+
>
43+
<Row>
44+
<Col span={24}>
45+
<Form.Item label="Profile" labelCol={{ span: 24 }}>
46+
<Space>
47+
<Select value={profile} onChange={handleChangeProfile}>
48+
{settingsStore.settings.profiles.map((profile) => (
49+
<Select.Option key={profile} value={profile}>
50+
{profile}
51+
</Select.Option>
52+
))}
53+
</Select>
54+
<NewProfilePopover
55+
visible={showNewProfilePopover}
56+
setVisible={setShowNewProfilePopover}
57+
/>
58+
</Space>
59+
</Form.Item>
60+
</Col>
61+
</Row>
62+
</Modal>
63+
);
64+
}
65+
);
5266

5367
const useStyles = createUseStyles({});
5468

src/components/TaskControl/TaskControl.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default observer(function TaskControl() {
2626
<span>{task.title}</span>
2727
</div>
2828
<span className="task-control__duration">{duration}</span>
29-
<CircleButton onClick={() => tasksStore.stopTimer(task)}>
29+
<CircleButton onClick={() => tasksStore.stopTimer()}>
3030
<PauseOutlined />
3131
</CircleButton>
3232
</span>

src/modules/RootStore.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import ProjectModel from './projects/models/ProjectModel';
44
import SettingsStore from './settings/SettingsStore';
55

66
export class RootStore {
7-
settingsStore = new SettingsStore();
7+
settingsStore = new SettingsStore(this);
88
tasksStore = new TaskStore(this);
99
projectStore = new ProjectStore(this);
1010

@@ -14,6 +14,11 @@ export class RootStore {
1414
this.projectStore.restore();
1515
}
1616

17+
loadTaskAndProjects() {
18+
this.tasksStore.restore();
19+
this.projectStore.restore();
20+
}
21+
1722
deleteProject(project: ProjectModel) {
1823
this.tasksStore.deleteProjectTasks(project.key);
1924
this.projectStore.delete(project);

src/modules/settings/SettingsRepository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ import AbstractFileRepository from '../../base/repositories/AbstractFileReposito
22

33
export default class SettingsRepository extends AbstractFileRepository {
44
saveInRoot = true;
5+
fileName = 'settings.json';
56
}

src/modules/settings/SettingsStore.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,33 @@
11
import { makeAutoObservable } from 'mobx';
2+
23
import SettingsModel, { DEFAULT_SETTINGS } from './models/SettingsModel';
34
import SettingsService from './SettingsService';
5+
import { RootStore } from '../RootStore';
46

57
export default class SettingsStore {
68
settings: SettingsModel = new SettingsModel(DEFAULT_SETTINGS);
79

810
private service: SettingsService = new SettingsService();
911

10-
constructor() {
12+
constructor(private rootStore: RootStore) {
1113
makeAutoObservable(this);
1214
}
1315

16+
addProfile(profile: string) {
17+
this.settings.profiles.push(profile);
18+
this.service.save(this.settings);
19+
}
20+
1421
setActiveProfile(profile: string) {
22+
if (profile === this.settings.currentProfile) {
23+
return;
24+
}
25+
this.rootStore.tasksStore.stopTimer();
1526
this.settings.currentProfile = profile;
1627
this.service.save(this.settings);
28+
setTimeout(() => {
29+
this.rootStore.loadTaskAndProjects();
30+
});
1731
}
1832

1933
restore() {

src/modules/settings/models/SettingsModel.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AbstractModel from '../../../base/AbstractModel';
2+
import { makeObservable, observable } from 'mobx';
23

34
export const DEFAULT_SETTINGS = {
45
currentProfile: 'profile1',
@@ -16,5 +17,11 @@ export default class SettingsModel extends AbstractModel {
1617
constructor(data: any) {
1718
super();
1819
this.load(data);
20+
makeObservable(this, {
21+
currentProfile: observable,
22+
profiles: observable,
23+
hoursInWorkingDay: observable,
24+
isFirstLoad: observable,
25+
});
1926
}
2027
}

src/modules/tasks/TaskStore.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { autorun, makeAutoObservable } from 'mobx';
1+
import { autorun, makeAutoObservable, reaction } from 'mobx';
22

33
import TaskService from './TaskService';
44
import TaskModel, { ITimeRangeModel } from './models/TaskModel';
@@ -96,15 +96,13 @@ export default class TaskStore {
9696
return _task.key === task.key;
9797
}
9898

99-
if (task.active) {
100-
this.stopTimer(task);
101-
}
99+
this.stopTimer();
102100

103101
for (const projectKey in this.tasks) {
104102
if (this.tasks.hasOwnProperty(projectKey)) {
105103
this.tasks[projectKey] = TreeModelStoreHelper.deleteItems(
106104
this.tasks[projectKey],
107-
condition,
105+
condition
108106
);
109107
}
110108
}
@@ -118,20 +116,23 @@ export default class TaskStore {
118116
}
119117

120118
startTimer(task: TaskModel) {
121-
if (this.activeTask) {
122-
this.stopTimer(this.activeTask);
123-
}
119+
this.stopTimer(true);
124120
this.activeTask = task;
125121
task.start();
126122
this.setupReminder(task);
127123
this.tasksService.save(this.tasks);
128124
}
129125

130-
stopTimer(task: TaskModel) {
131-
this.activeTask = undefined;
132-
task.stop();
133-
this.setupReminder();
134-
this.tasksService.save(this.tasks);
126+
stopTimer(silent?: boolean) {
127+
if (this.activeTask) {
128+
this.activeTask.stop();
129+
this.activeTask = undefined;
130+
}
131+
132+
if (!silent) {
133+
this.setupReminder();
134+
this.tasksService.save(this.tasks);
135+
}
135136
}
136137

137138
restore() {
@@ -148,7 +149,7 @@ export default class TaskStore {
148149
if (Array.isArray(this.tasks[projectId])) {
149150
return TreeModelStoreHelper.getFlatItemsRecursive(
150151
this.tasks[projectId],
151-
condition,
152+
condition
152153
).map((task) => task.key);
153154
}
154155
return [];

src/screens/projects/components/TaskNode/TaskNode.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default observer(function TaskNode({ task }: TaskNodeProps) {
4040
/>
4141
) : (
4242
<PauseOutlined
43-
onClick={preventDefault(() => tasksStore.stopTimer(task))}
43+
onClick={preventDefault(() => tasksStore.stopTimer())}
4444
/>
4545
)}
4646
<DeleteOutlined

0 commit comments

Comments
 (0)