aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src/stores
diff options
context:
space:
mode:
Diffstat (limited to 'packages/main/src/stores')
-rw-r--r--packages/main/src/stores/GlobalSettings.ts43
-rw-r--r--packages/main/src/stores/MainEnv.ts2
-rw-r--r--packages/main/src/stores/MainStore.ts9
-rw-r--r--packages/main/src/stores/Service.ts3
-rw-r--r--packages/main/src/stores/SharedStore.ts53
5 files changed, 93 insertions, 17 deletions
diff --git a/packages/main/src/stores/GlobalSettings.ts b/packages/main/src/stores/GlobalSettings.ts
index 31b7e12..4e6aa13 100644
--- a/packages/main/src/stores/GlobalSettings.ts
+++ b/packages/main/src/stores/GlobalSettings.ts
@@ -27,23 +27,32 @@ import Service from './Service';
27 27
28const log = getLogger('sharedStore'); 28const log = getLogger('sharedStore');
29 29
30const GlobalSettings = defineGlobalSettingsModel(Service).actions((self) => ({ 30const GlobalSettings = defineGlobalSettingsModel(Service)
31 setThemeSource(mode: ThemeSource): void { 31 .actions((self) => ({
32 self.themeSource = mode; 32 setThemeSource(mode: ThemeSource): void {
33 }, 33 self.themeSource = mode;
34 setShowLocationBar(showLocationBar: boolean): void { 34 },
35 self.showLocationBar = showLocationBar; 35 setShowLocationBar(showLocationBar: boolean): void {
36 }, 36 self.showLocationBar = showLocationBar;
37 setSelectedServiceId(serviceId: string): void { 37 },
38 const serviceInstance = resolveIdentifier(Service, self, serviceId); 38 setSelectedService(service: Service): void {
39 if (serviceInstance === undefined) { 39 self.selectedService = service;
40 log.warn('Trying to select unknown service', serviceId); 40 },
41 return; 41 }))
42 } 42 .actions((self) => ({
43 self.selectedService = serviceInstance; 43 toggleLocationBar(): void {
44 log.debug('Selected service', serviceId); 44 self.setShowLocationBar(!self.showLocationBar);
45 }, 45 },
46})); 46 setSelectedServiceId(serviceId: string): void {
47 const serviceInstance = resolveIdentifier(Service, self, serviceId);
48 if (serviceInstance === undefined) {
49 log.warn('Trying to select unknown service', serviceId);
50 return;
51 }
52 self.setSelectedService(serviceInstance);
53 log.debug('Selected service', serviceId);
54 },
55 }));
47 56
48/* 57/*
49 eslint-disable-next-line @typescript-eslint/no-redeclare -- 58 eslint-disable-next-line @typescript-eslint/no-redeclare --
diff --git a/packages/main/src/stores/MainEnv.ts b/packages/main/src/stores/MainEnv.ts
index 94c34f3..8923322 100644
--- a/packages/main/src/stores/MainEnv.ts
+++ b/packages/main/src/stores/MainEnv.ts
@@ -26,4 +26,6 @@ export function getEnv(model: IAnyStateTreeNode): MainEnv {
26 26
27export default interface MainEnv { 27export default interface MainEnv {
28 openURLInExternalBrowser(url: string): void; 28 openURLInExternalBrowser(url: string): void;
29
30 openAboutDialog(): void;
29} 31}
diff --git a/packages/main/src/stores/MainStore.ts b/packages/main/src/stores/MainStore.ts
index ed0f391..86fadcb 100644
--- a/packages/main/src/stores/MainStore.ts
+++ b/packages/main/src/stores/MainStore.ts
@@ -25,6 +25,7 @@ import type { MainWindow } from '../infrastructure/electron/types';
25import { getLogger } from '../utils/log'; 25import { getLogger } from '../utils/log';
26 26
27import GlobalSettings from './GlobalSettings'; 27import GlobalSettings from './GlobalSettings';
28import { getEnv } from './MainEnv';
28import Profile from './Profile'; 29import Profile from './Profile';
29import Service from './Service'; 30import Service from './Service';
30import SharedStore from './SharedStore'; 31import SharedStore from './SharedStore';
@@ -112,6 +113,14 @@ const MainStore = types
112 setMainWindow(mainWindow: MainWindow | undefined): void { 113 setMainWindow(mainWindow: MainWindow | undefined): void {
113 self.mainWindow = mainWindow; 114 self.mainWindow = mainWindow;
114 }, 115 },
116 openWebpageInBrowser() {
117 getEnv(self).openURLInExternalBrowser(
118 'https://gitlab.com/say-hi-to-sophie/shophie',
119 );
120 },
121 openAboutDialog() {
122 getEnv(self).openAboutDialog();
123 },
115 beforeDestroy(): void { 124 beforeDestroy(): void {
116 self.mainWindow?.dispose(); 125 self.mainWindow?.dispose();
117 }, 126 },
diff --git a/packages/main/src/stores/Service.ts b/packages/main/src/stores/Service.ts
index 0a35114..d8f3166 100644
--- a/packages/main/src/stores/Service.ts
+++ b/packages/main/src/stores/Service.ts
@@ -126,6 +126,9 @@ const Service = defineServiceModel(ServiceSettings)
126 dismissAllPopups(): void { 126 dismissAllPopups(): void {
127 self.popups.splice(0); 127 self.popups.splice(0);
128 }, 128 },
129 toggleDeveloperTools(): void {
130 self.serviceView?.toggleDeveloperTools();
131 },
129 })) 132 }))
130 .actions((self) => { 133 .actions((self) => {
131 function setState(state: ServiceStateSnapshotIn): void { 134 function setState(state: ServiceStateSnapshotIn): void {
diff --git a/packages/main/src/stores/SharedStore.ts b/packages/main/src/stores/SharedStore.ts
index d72c532..67d58d6 100644
--- a/packages/main/src/stores/SharedStore.ts
+++ b/packages/main/src/stores/SharedStore.ts
@@ -21,12 +21,16 @@
21import { defineSharedStoreModel } from '@sophie/shared'; 21import { defineSharedStoreModel } from '@sophie/shared';
22import { getSnapshot, Instance } from 'mobx-state-tree'; 22import { getSnapshot, Instance } from 'mobx-state-tree';
23 23
24import { getLogger } from '../utils/log';
25
24import GlobalSettings from './GlobalSettings'; 26import GlobalSettings from './GlobalSettings';
25import Profile from './Profile'; 27import Profile from './Profile';
26import Service from './Service'; 28import Service from './Service';
27import type Config from './config/Config'; 29import type Config from './config/Config';
28import loadConfig from './config/loadConfig'; 30import loadConfig from './config/loadConfig';
29 31
32const log = getLogger('SharedStore');
33
30function getConfigs<T>(models: { config: T }[]): T[] | undefined { 34function getConfigs<T>(models: { config: T }[]): T[] | undefined {
31 return models.length === 0 ? undefined : models.map((model) => model.config); 35 return models.length === 0 ? undefined : models.map((model) => model.config);
32} 36}
@@ -42,6 +46,19 @@ const SharedStore = defineSharedStoreModel(GlobalSettings, Profile, Service)
42 services: getConfigs(services), 46 services: getConfigs(services),
43 }; 47 };
44 }, 48 },
49 get canSwitchServices(): boolean {
50 return self.services.length >= 2;
51 },
52 get selectedServiceIndex(): number {
53 const {
54 services,
55 settings: { selectedService },
56 } = self;
57 if (selectedService === undefined) {
58 return -1;
59 }
60 return services.indexOf(selectedService);
61 },
45 })) 62 }))
46 .actions((self) => ({ 63 .actions((self) => ({
47 loadConfig(config: Config): void { 64 loadConfig(config: Config): void {
@@ -50,6 +67,42 @@ const SharedStore = defineSharedStoreModel(GlobalSettings, Profile, Service)
50 setShouldUseDarkColors(shouldUseDarkColors: boolean): void { 67 setShouldUseDarkColors(shouldUseDarkColors: boolean): void {
51 self.shouldUseDarkColors = shouldUseDarkColors; 68 self.shouldUseDarkColors = shouldUseDarkColors;
52 }, 69 },
70 activateServiceByOffset(offset: number): void {
71 if (offset === 0) {
72 return;
73 }
74 const { selectedServiceIndex: index, services, settings } = self;
75 if (index < 0) {
76 log.warn('No selected service to offset');
77 return;
78 }
79 const { length } = services;
80 const indexWithOffset = (index + offset) % length;
81 // Make sure that `newIndex` is positive even for large negative `offset`.
82 const newIndex =
83 indexWithOffset < 0 ? indexWithOffset + length : indexWithOffset;
84 const newService = services.at(newIndex);
85 if (newService === undefined) {
86 log.error(
87 'Could not advance selected service index from',
88 index,
89 'by',
90 offset,
91 'to',
92 newIndex,
93 );
94 return;
95 }
96 settings.setSelectedService(newService);
97 },
98 }))
99 .actions((self) => ({
100 activateNextService(): void {
101 self.activateServiceByOffset(1);
102 },
103 activatePreviousService(): void {
104 self.activateServiceByOffset(-1);
105 },
53 })); 106 }));
54 107
55/* 108/*