diff --git a/js/reducers/windows.ts b/js/reducers/windows.ts index 9a1137f7..6ca1902d 100644 --- a/js/reducers/windows.ts +++ b/js/reducers/windows.ts @@ -1,4 +1,4 @@ -import { WebampWindow, WindowPositions, Action } from "../types"; +import { WebampWindow, WindowPositions, Action, WindowId } from "../types"; import { WINDOWS } from "../constants"; import { SET_FOCUSED_WINDOW, @@ -8,16 +8,29 @@ import { ADD_GEN_WINDOW, UPDATE_WINDOW_POSITIONS, WINDOW_SIZE_CHANGED, - TOGGLE_WINDOW_SHADE_MODE + TOGGLE_WINDOW_SHADE_MODE, + LOAD_SERIALIZED_STATE } from "../actionTypes"; +import { objectMap } from "../utils"; -export interface WindowState { +export interface WindowsState { focused: string; genWindows: { [name: string]: WebampWindow }; positions: WindowPositions; } -const defaultWindowsState: WindowState = { +interface SerializedWindow { + size: [number, number]; + open: boolean; + hidden: boolean; + shade: boolean; +} + +export interface WindowsSerializedStateV1 { + genWindows: { [windowId: string]: SerializedWindow }; +} + +const defaultWindowsState: WindowsState = { focused: WINDOWS.MAIN, genWindows: { // TODO: Remove static capabilites and derive them from ids/generic @@ -62,9 +75,9 @@ const defaultWindowsState: WindowState = { }; const windows = ( - state: WindowState = defaultWindowsState, + state: WindowsState = defaultWindowsState, action: Action -): WindowState => { +): WindowsState => { switch (action.type) { case SET_FOCUSED_WINDOW: return { ...state, focused: action.window }; @@ -162,9 +175,38 @@ const windows = ( ...state, positions: { ...state.positions, ...action.positions } }; + case LOAD_SERIALIZED_STATE: { + const serializedWindow = action.serializedState.windows.genWindows; + return { + ...state, + genWindows: objectMap(state.genWindows, (w, windowId) => { + const serializedW = serializedWindow[windowId]; + if (serializedW == null || w.generic) { + return w; + } + return { ...w, ...serializedW }; + }) + }; + } + default: return state; } }; +export function getSerializedState( + state: WindowsState +): WindowsSerializedStateV1 { + return { + genWindows: objectMap(state.genWindows, w => { + return { + size: w.size, + open: w.open, + hidden: w.hidden, + shade: w.shade || false + }; + }) + }; +} + export default windows; diff --git a/js/selectors.ts b/js/selectors.ts index ee8d1a98..ba0b9e2a 100644 --- a/js/selectors.ts +++ b/js/selectors.ts @@ -29,6 +29,7 @@ import * as fromPlaylist from "./reducers/playlist"; import * as fromDisplay from "./reducers/display"; import * as fromEqualizer from "./reducers/equalizer"; import * as fromMedia from "./reducers/media"; +import * as fromWindows from "./reducers/windows"; import { generateGraph } from "./resizeUtils"; export const getSliders = (state: AppState) => state.equalizer.sliders; @@ -411,7 +412,8 @@ export function getSerlializedState(state: AppState): SerializedStateV1 { version: 1, media: fromMedia.getSerializedState(state.media), equalizer: fromEqualizer.getSerializedState(state.equalizer), - display: fromDisplay.getSerializedState(state.display) + display: fromDisplay.getSerializedState(state.display), + windows: fromWindows.getSerializedState(state.windows) }; } diff --git a/js/types.ts b/js/types.ts index 8afd82da..70b1fe96 100644 --- a/js/types.ts +++ b/js/types.ts @@ -3,7 +3,7 @@ import { SettingsState } from "./reducers/settings"; import { UserInputState } from "./reducers/userInput"; import { MediaState, MediaSerializedStateV1 } from "./reducers/media"; import { DisplayState, DisplaySerializedStateV1 } from "./reducers/display"; -import { WindowState } from "./reducers/windows"; +import { WindowsState, WindowsSerializedStateV1 } from "./reducers/windows"; import { EqualizerState, EqualizerSerializedStateV1 @@ -464,7 +464,7 @@ export interface PlaylistTrack { export interface AppState { userInput: UserInputState; - windows: WindowState; + windows: WindowsState; display: DisplayState; settings: SettingsState; equalizer: EqualizerState; @@ -501,10 +501,7 @@ export interface MiddlewareStore { export interface SerializedStateV1 { version: 1; - /* - windows: WindowSerializedState; - settings: SettingsSerializedState; - */ + windows: WindowsSerializedStateV1; media: MediaSerializedStateV1; display: DisplaySerializedStateV1; equalizer: EqualizerSerializedStateV1;