Skip to content

Commit abdfdbd

Browse files
committed
SettingsStore, dynamic profile folder
1 parent 07aaf56 commit abdfdbd

File tree

12 files changed

+132
-30
lines changed

12 files changed

+132
-30
lines changed

src/base/repositories/AbstractFileRepository.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,38 @@ const path = require('path');
33

44
import FsHelper from '../../helpers/FsHelper';
55

6-
const APP_FOLDER = 'YadroTimeTracker';
7-
const PROFILE_FOLDER = 'profile1';
6+
const APP_DIR = 'YadroTimeTracker';
87

98
export default abstract class AbstractFileRepository<T = any> {
10-
folderWithProfile: string = 'profile1';
9+
dirWithProfileData: string = 'profile1';
1110
fileName: string = 'defaultFileName.json';
11+
saveInRoot: boolean = false;
12+
13+
private logPrefix = `Repository[${this.fileName}]:`;
1214

1315
private static get appDataFolder() {
1416
return process.env.APPDATA || '';
1517
}
1618

17-
private static get profileFolder() {
18-
return path.join(
19-
AbstractFileRepository.appDataFolder,
20-
APP_FOLDER,
21-
PROFILE_FOLDER,
22-
);
19+
private get destFolder() {
20+
const pathItems = [AbstractFileRepository.appDataFolder, APP_DIR];
21+
if (!this.saveInRoot) {
22+
pathItems.push(this.dirWithProfileData);
23+
}
24+
return path.join(...pathItems);
2325
}
2426

2527
private get filePath() {
26-
return path.join(AbstractFileRepository.profileFolder, this.fileName);
28+
return path.join(this.destFolder, this.fileName);
29+
}
30+
31+
public setProfile(profile: string | null) {
32+
if (profile) {
33+
this.dirWithProfileData = profile;
34+
console.log(`${this.logPrefix} set profile=${profile}`);
35+
} else {
36+
console.error(`${this.logPrefix} set profile=null`);
37+
}
2738
}
2839

2940
public restore(defaultValue: T): T {
@@ -36,7 +47,7 @@ export default abstract class AbstractFileRepository<T = any> {
3647
}
3748

3849
public save(data: T) {
39-
FsHelper.mkdirIfNotExists(AbstractFileRepository.profileFolder);
50+
FsHelper.mkdirIfNotExists(this.destFolder);
4051
return FsHelper.writeFile(this.filePath, data);
4152
}
4253
}

src/modules/RootStore.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import TaskStore from './tasks/TaskStore';
22
import ProjectStore from './projects/ProjectStore';
33
import ProjectModel from './projects/ProjectModel';
4+
import SettingsStore from './settings/SettingsStore';
45

5-
class RootStore {
6-
tasksStore = new TaskStore();
7-
projectStore = new ProjectStore();
6+
export class RootStore {
7+
settingsStore = new SettingsStore();
8+
tasksStore = new TaskStore(this);
9+
projectStore = new ProjectStore(this);
810

911
restore() {
12+
this.settingsStore.restore();
1013
this.tasksStore.restore();
1114
this.projectStore.restore();
1215
}

src/modules/projects/ProjectService.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ import ProjectFactory from './ProjectFactory';
44
import ProjectRepository from './ProjectRepository';
55

66
export default class ProjectService implements IService<ProjectModel[]> {
7-
projectFactory = new ProjectFactory();
8-
projectRepository = new ProjectRepository();
7+
factory = new ProjectFactory();
8+
repository = new ProjectRepository();
9+
10+
setProfile(profile: string) {
11+
this.repository.setProfile(profile);
12+
}
913

1014
getAll(): ProjectModel[] {
11-
const data = this.projectRepository.restore([]);
12-
return this.projectFactory.createList(ProjectModel, data);
15+
const data = this.repository.restore([]);
16+
return this.factory.createList(ProjectModel, data);
1317
}
1418

1519
save(data: ProjectModel[]): void {
16-
this.projectRepository.save(data);
20+
this.repository.save(data);
1721
}
1822
}

src/modules/projects/ProjectStore.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { makeAutoObservable } from 'mobx';
1+
import { autorun, makeAutoObservable } from 'mobx';
22

33
import ProjectModel from './ProjectModel';
44
import ProjectService from './ProjectService';
55
import TreeModelStoreHelper from '../../base/TreeModelStoreHelper';
66
import { Undefined } from '../../types/CommonTypes';
7+
import {RootStore} from '../RootStore';
78

89
export default class ProjectStore {
910
projects: ProjectModel[] = [];
@@ -12,8 +13,14 @@ export default class ProjectStore {
1213

1314
private projectService = new ProjectService();
1415

15-
constructor() {
16+
constructor(private rootStore: RootStore) {
1617
makeAutoObservable(this);
18+
autorun(() => {
19+
const profile = this.rootStore.settingsStore.settings.currentProfile;
20+
if (profile) {
21+
this.projectService.setProfile(profile);
22+
}
23+
});
1724
}
1825

1926
set(projects: ProjectModel[]) {
@@ -33,7 +40,7 @@ export default class ProjectStore {
3340
setProjectProps(
3441
project: ProjectModel,
3542
title: string,
36-
color: string | undefined
43+
color: string | undefined,
3744
) {
3845
project.title = title;
3946
project.color = color || '';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import AbstractFactory from '../../base/AbstractFactory';
2+
3+
export default class SettingsFactory extends AbstractFactory {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import AbstractFileRepository from '../../base/repositories/AbstractFileRepository';
2+
3+
export default class SettingsRepository extends AbstractFileRepository {
4+
saveInRoot = true;
5+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import IService from '../../base/IService';
2+
import SettingsModel from './models/SettingsModel';
3+
import SettingsFactory from './SettingsFactory';
4+
import SettingsRepository from './SettingsRepository';
5+
6+
export const DEFAULT_SETTINGS = {
7+
currentProfile: 'profile1',
8+
profiles: ['profile1'],
9+
hoursInWorkingDay: 8 * 60 * 60 * 1000,
10+
};
11+
12+
export default class SettingsService implements IService<SettingsModel> {
13+
private repository: SettingsRepository = new SettingsRepository();
14+
private factory: SettingsFactory = new SettingsFactory();
15+
16+
getAll(): SettingsModel {
17+
const settings = this.repository.restore(DEFAULT_SETTINGS);
18+
return this.factory.create(SettingsModel, settings);
19+
}
20+
21+
save(data: SettingsModel): void {
22+
this.repository.save(data);
23+
}
24+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { makeAutoObservable } from 'mobx';
2+
import SettingsModel from './models/SettingsModel';
3+
import SettingsService, { DEFAULT_SETTINGS } from './SettingsService';
4+
5+
export default class SettingsStore {
6+
settings: SettingsModel = new SettingsModel(DEFAULT_SETTINGS);
7+
8+
private service: SettingsService = new SettingsService();
9+
10+
constructor() {
11+
makeAutoObservable(this);
12+
}
13+
14+
setActiveProfile(profile: string) {
15+
this.settings.currentProfile = profile;
16+
this.service.save(this.settings);
17+
}
18+
19+
restore() {
20+
this.settings = this.service.getAll();
21+
}
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import AbstractModel from '../../../base/AbstractModel';
2+
3+
export default class SettingsModel extends AbstractModel {
4+
currentProfile: string | null = null;
5+
profiles: string[] | null = null;
6+
hoursInWorkingDay: number | null = null;
7+
8+
constructor(data: any) {
9+
super();
10+
this.load(data);
11+
}
12+
}

src/modules/tasks/TaskRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import AbstractFileRepository from '../../base/repositories/AbstractFileRepository';
2-
import TasksByProject from '../../models/TasksByProject';
2+
import TasksByProject from './models/TasksByProject';
33

44
export default class TaskRepository extends AbstractFileRepository<
55
TasksByProject

0 commit comments

Comments
 (0)