aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-26 20:13:17 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-26 20:14:07 +0100
commit6195c16580e1ac92f5187ced52afd5bf3b28a0da (patch)
treefac09ec99ec9b501676e0e37cb02a7406a3ad942
parentrefactor: Make all stores optional (diff)
downloadsophie-6195c16580e1ac92f5187ced52afd5bf3b28a0da.tar.gz
sophie-6195c16580e1ac92f5187ced52afd5bf3b28a0da.tar.zst
sophie-6195c16580e1ac92f5187ced52afd5bf3b28a0da.zip
refactor: Rename RootStore to RendererStore
-rw-r--r--packages/renderer/src/components/StoreProvider.tsx8
-rw-r--r--packages/renderer/src/index.tsx4
-rw-r--r--packages/renderer/src/stores/RendererEnv.ts37
-rw-r--r--packages/renderer/src/stores/RendererStore.ts (renamed from packages/renderer/src/stores/RootStore.ts)25
4 files changed, 48 insertions, 26 deletions
diff --git a/packages/renderer/src/components/StoreProvider.tsx b/packages/renderer/src/components/StoreProvider.tsx
index 0d9a36c..da1e699 100644
--- a/packages/renderer/src/components/StoreProvider.tsx
+++ b/packages/renderer/src/components/StoreProvider.tsx
@@ -20,11 +20,11 @@
20 20
21import React, { createContext, useContext } from 'react'; 21import React, { createContext, useContext } from 'react';
22 22
23import type { RootStore } from '../stores/RootStore'; 23import type { RendererStore } from '../stores/RendererStore';
24 24
25const StoreContext = createContext<RootStore | null>(null); 25const StoreContext = createContext<RendererStore | null>(null);
26 26
27export function useStore(): RootStore { 27export function useStore(): RendererStore {
28 const store = useContext(StoreContext); 28 const store = useContext(StoreContext);
29 if (store === null) { 29 if (store === null) {
30 throw new Error('useStore can only be called inside of StoreProvider'); 30 throw new Error('useStore can only be called inside of StoreProvider');
@@ -34,7 +34,7 @@ export function useStore(): RootStore {
34 34
35export function StoreProvider({ children, store }: { 35export function StoreProvider({ children, store }: {
36 children: JSX.Element | JSX.Element[], 36 children: JSX.Element | JSX.Element[],
37 store: RootStore, 37 store: RendererStore,
38}): JSX.Element { 38}): JSX.Element {
39 return ( 39 return (
40 <StoreContext.Provider value={store}> 40 <StoreContext.Provider value={store}>
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx
index 0919b93..befb823 100644
--- a/packages/renderer/src/index.tsx
+++ b/packages/renderer/src/index.tsx
@@ -30,7 +30,7 @@ import { App } from './components/App';
30import { StoreProvider } from './components/StoreProvider'; 30import { StoreProvider } from './components/StoreProvider';
31import { ThemeProvider } from './components/ThemeProvider'; 31import { ThemeProvider } from './components/ThemeProvider';
32import { exposeToReduxDevtools, hotReloadServices } from './devTools'; 32import { exposeToReduxDevtools, hotReloadServices } from './devTools';
33import { createAndConnectRootStore } from './stores/RootStore'; 33import { createAndConnectRendererStore } from './stores/RendererStore';
34 34
35const isDevelopment = import.meta.env.MODE === 'development'; 35const isDevelopment = import.meta.env.MODE === 'development';
36 36
@@ -38,7 +38,7 @@ if (isDevelopment) {
38 hotReloadServices(); 38 hotReloadServices();
39} 39}
40 40
41const store = createAndConnectRootStore(window.sophieRenderer); 41const store = createAndConnectRendererStore(window.sophieRenderer);
42 42
43if (isDevelopment) { 43if (isDevelopment) {
44 exposeToReduxDevtools(store); 44 exposeToReduxDevtools(store);
diff --git a/packages/renderer/src/stores/RendererEnv.ts b/packages/renderer/src/stores/RendererEnv.ts
new file mode 100644
index 0000000..f2ec519
--- /dev/null
+++ b/packages/renderer/src/stores/RendererEnv.ts
@@ -0,0 +1,37 @@
1/*
2 * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com>
3 *
4 * This file is part of Sophie.
5 *
6 * Sophie is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as
8 * published by the Free Software Foundation, version 3.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: AGPL-3.0-only
19 */
20
21import { getEnv as getAnyEnv, IAnyStateTreeNode } from 'mobx-state-tree';
22import type { SophieRenderer } from '@sophie/shared';
23
24export interface RendererEnv {
25 ipc: Omit<SophieRenderer, 'setSharedStoreListener'>;
26}
27
28/**
29 * Gets a well-typed environment from `model`.
30 *
31 * Only useable inside state trees created by `createAndConnectRootStore`.
32 *
33 * @param model The state tree node.
34 */
35export function getEnv(model: IAnyStateTreeNode): RendererEnv {
36 return getAnyEnv<RendererEnv>(model);
37}
diff --git a/packages/renderer/src/stores/RootStore.ts b/packages/renderer/src/stores/RendererStore.ts
index f7f37f0..001f23a 100644
--- a/packages/renderer/src/stores/RootStore.ts
+++ b/packages/renderer/src/stores/RendererStore.ts
@@ -21,8 +21,6 @@
21import { 21import {
22 applySnapshot, 22 applySnapshot,
23 applyPatch, 23 applyPatch,
24 getEnv as getAnyEnv,
25 IAnyStateTreeNode,
26 Instance, 24 Instance,
27 types 25 types
28} from 'mobx-state-tree'; 26} from 'mobx-state-tree';
@@ -33,22 +31,9 @@ import {
33 ThemeSource, 31 ThemeSource,
34} from '@sophie/shared'; 32} from '@sophie/shared';
35 33
36export interface RootEnv { 34import { getEnv } from './RendererEnv';
37 ipc: Omit<SophieRenderer, 'setSharedStoreListener'>;
38}
39
40/**
41 * Gets a well-typed environment from `model`.
42 *
43 * Only useable inside state trees created by `createAndConnectRootStore`.
44 *
45 * @param model The state tree node.
46 */
47export function getEnv(model: IAnyStateTreeNode): RootEnv {
48 return getAnyEnv<RootEnv>(model);
49}
50 35
51export const rootStore = types.model('RootStore', { 36export const rendererStore = types.model('RendererStore', {
52 shared: types.optional(sharedStore, {}), 37 shared: types.optional(sharedStore, {}),
53}).actions((self) => ({ 38}).actions((self) => ({
54 setBrowserViewBounds(bounds: BrowserViewBounds) { 39 setBrowserViewBounds(bounds: BrowserViewBounds) {
@@ -66,7 +51,7 @@ export const rootStore = types.model('RootStore', {
66 }, 51 },
67})); 52}));
68 53
69export interface RootStore extends Instance<typeof rootStore> {} 54export interface RendererStore extends Instance<typeof rendererStore> {}
70 55
71/** 56/**
72 * Creates a new `RootStore` with a new environment and connects it to `ipc`. 57 * Creates a new `RootStore` with a new environment and connects it to `ipc`.
@@ -76,8 +61,8 @@ export interface RootStore extends Instance<typeof rootStore> {}
76 * 61 *
77 * @param ipc The `sophieRenderer` context bridge. 62 * @param ipc The `sophieRenderer` context bridge.
78 */ 63 */
79export function createAndConnectRootStore(ipc: SophieRenderer): RootStore { 64export function createAndConnectRendererStore(ipc: SophieRenderer): RendererStore {
80 const store = rootStore.create({}, { 65 const store = rendererStore.create({}, {
81 ipc, 66 ipc,
82 }); 67 });
83 68