Skip to content

Commit 3aa45b8

Browse files
author
Andrei Telteu
committed
Save last window size and pos based on component
1 parent c3d3e9b commit 3aa45b8

File tree

4 files changed

+55
-4
lines changed

4 files changed

+55
-4
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,10 @@ npm start
104104
105105
## Changelog:
106106
107-
### v1.0.5 [WIP]
107+
### v1.0.5
108108
109109
- Added minimum size restriction
110+
- Save last window size and position based on component name
110111
111112
### v1.0.4
112113

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "solidjs-window-manager",
3-
"version": "1.0.4",
3+
"version": "1.0.5",
44
"description": "Create a window based UI that is persistent in localstorage.",
55
"type": "module",
66
"main": "dist/esm/index.js",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { defineStore } from 'solidjs-storex';
2+
3+
interface WindowPreferencesState {
4+
[key: string | number]: WindowPreferencesProps;
5+
}
6+
interface WindowPreferencesProps {
7+
pos?: [number, number];
8+
size?: [number, number];
9+
}
10+
11+
export default defineStore({
12+
state: {} as WindowPreferencesState,
13+
options: {
14+
persistance: true,
15+
storageKey: 'windows-preferences-state',
16+
storageThrottle: 250,
17+
},
18+
actions: (state, set) => ({
19+
save: (key: string, props: WindowPreferencesProps) => {
20+
set(key, props);
21+
},
22+
get: (key: string) => {
23+
if (state.hasOwnProperty(key)) {
24+
return state[key]; // return does nothing now. i dont capture it. to be fixed in a future release
25+
}
26+
},
27+
}),
28+
});
29+
30+
export function findWindowPreferences(state, key: string) {
31+
if (state.hasOwnProperty(key)) {
32+
return state[key];
33+
}
34+
}

src/store/windowState.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { produce } from 'solid-js/store';
22
import { defineStore } from 'solidjs-storex';
3+
import windowPreferencesStore, { findWindowPreferences } from './windowPreferencesStore';
34

45
type WindowState = {
56
windows: WindowsObject;
@@ -21,6 +22,8 @@ interface WindowAttrs {
2122
key: string;
2223
}
2324

25+
const [windowPreferencesState, { save: saveWindowPreferences }] = windowPreferencesStore();
26+
2427
export default defineStore({
2528
state: {
2629
windows: {},
@@ -53,6 +56,7 @@ export default defineStore({
5356
},
5457
moveWindow: (key, pos) => {
5558
set('windows', key, 'attrs', 'pos', pos);
59+
saveWindowPreferences(state.windows[key].component, (attrs) => ({ ...attrs, pos: state.windows[key].attrs.pos }));
5660
},
5761
resizeWindow: (key, size) => {
5862
const minWidth = 300;
@@ -61,6 +65,10 @@ export default defineStore({
6165
let newSize = [...size(currentSize)];
6266
return [newSize[0] < minWidth ? minWidth : newSize[0], newSize[1] < minHeight ? minHeight : newSize[1]];
6367
});
68+
saveWindowPreferences(state.windows[key].component, (attrs) => ({
69+
...attrs,
70+
size: state.windows[key].attrs.size,
71+
}));
6472
},
6573
focusWindow: (key) => {
6674
Object.keys(state?.windows || {}).forEach((item) => {
@@ -72,16 +80,24 @@ export default defineStore({
7280
});
7381

7482
const getDefaultWindowsAttrs = (props): WindowAttrs => {
75-
// TODO: get last window pos based on comp name
76-
return {
83+
const defaultAttrs: WindowAttrs = {
7784
minimized: false,
85+
// TODO: calculate center of window minus half window size
7886
// pos: [window.innerWidth / 2 || 200, window.innerHeight / 2 || 200],
7987
pos: [200, 200],
8088
size: [500, 400],
8189
zIndex: 1,
8290
icon: null,
8391
key: '',
8492
};
93+
if (props.component) {
94+
let preferences = findWindowPreferences(windowPreferencesState, props.component);
95+
if (preferences) {
96+
if (preferences.pos) defaultAttrs.pos = preferences.pos;
97+
if (preferences.size) defaultAttrs.size = preferences.size;
98+
}
99+
}
100+
return defaultAttrs;
85101
};
86102

87103
const generateWindowKey = (props) => {

0 commit comments

Comments
 (0)