fix switching between canvas types

(all known issues that got introduced in the past days are fixed)
This commit is contained in:
HF 2024-01-21 16:02:20 +01:00
parent 6b1cd683c9
commit e4566462bf

View File

@ -51,6 +51,43 @@ function fixHistoryIfNeccessary(state) {
return state; return state;
} }
/*
* parse canvas data
* @param canvas object from api/me
* @param prevCoords from state
* @return partial canvas specific state
*/
function getCanvasArgs(canvas, prevCoords) {
const clrIgnore = canvas.cli || 0;
const {
size: canvasSize,
sd: canvasStartDate = null,
ed: canvasEndDate = null,
ident: canvasIdent,
colors,
} = canvas;
const is3D = !!canvas.v;
// get previous view if possible
let view = [0, 0, DEFAULT_SCALE];
let selectedColor = clrIgnore;
if (prevCoords) {
view = prevCoords.view;
selectedColor = prevCoords.selectedColor;
}
const palette = new Palette(colors, 0);
return {
clrIgnore,
canvasSize,
canvasStartDate,
canvasEndDate,
canvasIdent,
is3D,
view,
selectedColor,
palette,
};
}
/* /*
* parse url hash and sets view to coordinates * parse url hash and sets view to coordinates
* @param canvases Object with all canvas information * @param canvases Object with all canvas information
@ -112,7 +149,7 @@ const initialState = {
// last canvas view and selectedColor // last canvas view and selectedColor
// just used to get back to the previous state when switching canvases // just used to get back to the previous state when switching canvases
// { [canvasId]: { view: [x, y, z], selectedColor: c }, ... } // { [canvasId]: { view: [x, y, z], selectedColor: c }, ... }
prevCanvasCoords: {}, prevCanvasState: {},
}; };
export default function canvasReducer( export default function canvasReducer(
@ -163,6 +200,19 @@ export default function canvasReducer(
return state; return state;
} }
const urlState = getViewFromURL(canvases); const urlState = getViewFromURL(canvases);
if (urlState.canvasId !== state.canvasId) {
const { canvasId } = urlState;
const canvas = canvases[canvasId];
const canvasState = getCanvasArgs(
canvas,
state.prevCanvasState[canvasId],
);
return {
...state,
...canvasState,
...urlState,
};
}
return { return {
...state, ...state,
...urlState, ...urlState,
@ -195,7 +245,7 @@ export default function canvasReducer(
let { canvasId } = action; let { canvasId } = action;
const { const {
canvases, canvases,
prevCanvasCoords, prevCanvasState,
canvasId: prevCanvasId, canvasId: prevCanvasId,
} = state; } = state;
let canvas = canvases[canvasId]; let canvas = canvases[canvasId];
@ -203,41 +253,17 @@ export default function canvasReducer(
canvasId = DEFAULT_CANVAS_ID; canvasId = DEFAULT_CANVAS_ID;
canvas = canvases[DEFAULT_CANVAS_ID]; canvas = canvases[DEFAULT_CANVAS_ID];
} }
const clrIgnore = canvas.cli || 0; const canvasState = getCanvasArgs(canvas, prevCanvasState[canvasId]);
const {
size: canvasSize,
sd: canvasStartDate = null,
ed: canvasEndDate = null,
ident: canvasIdent,
colors,
} = canvas;
const is3D = !!canvas.v;
// get previous view if possible
let view = [0, 0, DEFAULT_SCALE];
let selectedColor = clrIgnore;
if (prevCanvasCoords[canvasId]) {
view = prevCanvasCoords[canvasId].view;
selectedColor = prevCanvasCoords[canvasId].selectedColor;
}
const palette = new Palette(colors, 0);
return fixHistoryIfNeccessary({ return fixHistoryIfNeccessary({
...state, ...state,
...canvasState,
canvasId, canvasId,
canvasIdent,
selectedColor,
canvasSize,
is3D,
canvasStartDate,
canvasEndDate,
palette,
clrIgnore,
view,
// reset if last canvas was retired // reset if last canvas was retired
isHistoricalView: (!state.canvasEndDate && state.isHistoricalView), isHistoricalView: (!state.canvasEndDate && state.isHistoricalView),
// remember view and color // remember view and color
prevCanvasCoords: { prevCanvasState: {
...state.prevCanvasCoords, ...state.prevCanvasState,
[prevCanvasId]: { [prevCanvasId]: {
view: state.view, view: state.view,
selectedColor: state.selectedColor, selectedColor: state.selectedColor,
@ -250,34 +276,22 @@ export default function canvasReducer(
const { canvases } = action; const { canvases } = action;
let { let {
canvasId, canvasId,
canvasIdent,
view, view,
} = state; } = state;
if (canvasId === null) { if (canvasId === null) {
({ canvasId, canvasIdent, view } = getViewFromURL(canvases)); ({ canvasId, view } = getViewFromURL(canvases));
} }
const canvas = canvases[canvasId]; const canvas = canvases[canvasId];
const clrIgnore = canvas.cli || 0; const canvasState = getCanvasArgs(
const { canvas,
size: canvasSize, state.prevCanvasState[canvasId],
sd: canvasStartDate = null, );
ed: canvasEndDate = null,
colors,
} = canvas;
const palette = new Palette(colors);
return fixHistoryIfNeccessary({ return fixHistoryIfNeccessary({
...state, ...state,
...canvasState,
canvasId, canvasId,
canvasIdent,
canvasSize,
is3D: !!canvas.v,
canvasStartDate,
canvasEndDate,
palette,
clrIgnore,
selectedColor: clrIgnore,
canvases, canvases,
view, view,
}); });