Skip to content

Commit b88e8a6

Browse files
authored
feat: persist layer selection (#95)
This PR makes it so the current layer is persisted between sessions in local storage.
1 parent 99af1a4 commit b88e8a6

File tree

5 files changed

+50
-38
lines changed

5 files changed

+50
-38
lines changed

src/context.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ export class GlobalContext {
1717
private saveIntervalId: NodeJS.Timeout | null = null;
1818
private ipGenerator: IpAddressGenerator;
1919

20-
initialize(viewport: Viewport, layer: string) {
20+
constructor(viewport: Viewport) {
2121
this.viewport = viewport;
2222

2323
// Sets the initial datagraph and viewgraph
24-
loadFromLocalStorage(this, layer);
24+
loadFromLocalStorage(this);
2525

2626
this.setIpGenerator();
2727
}
@@ -52,6 +52,10 @@ export class GlobalContext {
5252
return this.viewgraph;
5353
}
5454

55+
getCurrentLayer() {
56+
return this.viewgraph.getLayer();
57+
}
58+
5559
getDataGraph() {
5660
return this.datagraph;
5761
}

src/index.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { Application, Assets } from "pixi.js";
33
import {
44
AddDevice,
55
loadFromFile,
6-
loadFromLocalStorage,
76
saveToFile,
87
urManager,
98
} from "./types/viewportManager";
@@ -24,6 +23,7 @@ import PlaySvg from "./assets/play-icon.svg";
2423
import PauseSvg from "./assets/pause-icon.svg";
2524
import UndoSvg from "./assets/left-curve-arrow.svg";
2625
import RedoSvg from "./assets/right-curve-arrow.svg";
26+
import { layerToName } from "./types/devices/utils";
2727

2828
// IIFE to avoid errors
2929
(async () => {
@@ -42,18 +42,20 @@ import RedoSvg from "./assets/right-curve-arrow.svg";
4242
await Assets.load(RouterSvg);
4343
await Assets.load(ComputerSvg);
4444

45-
// Context initialization
46-
const ctx = new GlobalContext();
47-
4845
// Background container initialization
4946
const viewport = new Viewport(app.renderer.events);
5047
app.stage.addChild(viewport);
5148

49+
// Context initialization
50+
const ctx = new GlobalContext(viewport);
51+
5252
// Get the layer’s menu
5353
const layerSelect = document.getElementById(
5454
"layer-select",
5555
) as HTMLSelectElement;
5656

57+
layerSelect.value = layerToName(ctx.getCurrentLayer());
58+
5759
// Left bar logic
5860
const leftBar = LeftBar.getFrom(document);
5961
RightBar.getInstance();
@@ -87,9 +89,6 @@ import RedoSvg from "./assets/right-curve-arrow.svg";
8789

8890
setButtonsByLayer(layerSelect.value);
8991

90-
// Initialize Context
91-
ctx.initialize(viewport, layerSelect.value);
92-
9392
// Ticker logic
9493
// app.ticker.add(() => { });
9594
const lBar = document.getElementById("left-bar");
@@ -237,8 +236,5 @@ import RedoSvg from "./assets/right-curve-arrow.svg";
237236
}
238237
};
239238

240-
// TODO: load from local storage directly, without first generating a context
241-
loadFromLocalStorage(ctx, layerSelect.value);
242-
243239
console.log("initialized!");
244240
})();

src/types/devices/utils.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,26 @@ export function createDevice(
2929
}
3030
}
3131

32+
const layerFromNameMap: Record<string, Layer> = {
33+
application: Layer.App,
34+
transport: Layer.Transport,
35+
network: Layer.Network,
36+
link: Layer.Link,
37+
};
38+
39+
const layerToNameMap = new Map([
40+
[Layer.App, "application"],
41+
[Layer.Transport, "transport"],
42+
[Layer.Network, "network"],
43+
[Layer.Link, "link"],
44+
]);
45+
3246
export function layerFromName(name: string): Layer {
33-
switch (name) {
34-
case "application":
35-
// Lógica específica para la capa de aplicación
36-
console.log("Application Layer selected");
37-
return Layer.App;
38-
case "transport":
39-
// Lógica específica para la capa de transporte
40-
console.log("Transport Layer selected");
41-
return Layer.Transport;
42-
case "network":
43-
// Lógica específica para la capa de red
44-
console.log("Network Layer selected");
45-
return Layer.Network;
46-
case "link":
47-
// Lógica específica para la capa de enlace
48-
console.log("Link Layer selected");
49-
return Layer.Link;
50-
}
47+
return layerFromNameMap[name];
48+
}
49+
50+
export function layerToName(layer: Layer): string {
51+
return layerToNameMap.get(layer);
5152
}
5253

5354
export function layerIncluded(layer1: Layer, layer2: Layer) {

src/types/graphs/viewgraph.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ export class ViewGraph {
194194
this.datagraph.updateDevicePosition(deviceId, { x: device.x, y: device.y });
195195
}
196196

197+
getLayer(): Layer {
198+
return this.layer;
199+
}
200+
197201
// Get all connections of a device
198202
getConnections(id: DeviceId): Edge[] {
199203
const device = this.devices.get(id);

src/types/viewportManager.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ import { Device } from "./devices/index";
44
import { Edge } from "./edge";
55
import { RightBar } from "../graphics/right_bar";
66
import { Packet } from "./packet";
7-
import { DeviceType } from "./devices/device";
7+
import { DeviceType, Layer } from "./devices/device";
88
import { CreateDevice } from "./devices/utils";
99
import {
1010
UndoRedoManager,
1111
AddDeviceMove,
1212
RemoveDeviceMove,
1313
RemoveEdgeMove,
1414
} from "./undo-redo";
15-
import { layerFromName } from "./devices/utils";
1615

1716
type Selectable = Device | Edge | Packet;
1817

@@ -178,23 +177,31 @@ export function loadFromFile(ctx: GlobalContext) {
178177

179178
const LOCAL_STORAGE_KEY = "graphData";
180179

180+
interface LocalStorageData {
181+
graph: string;
182+
layer: Layer;
183+
}
184+
181185
export function saveToLocalStorage(ctx: GlobalContext) {
182186
const dataGraph = ctx.getDataGraph();
183187
const graphData = JSON.stringify(dataGraph.toData());
184-
localStorage.setItem(LOCAL_STORAGE_KEY, graphData);
188+
const layer = ctx.getCurrentLayer();
189+
const data: LocalStorageData = { graph: graphData, layer };
190+
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(data));
185191

186192
console.log("Graph saved in local storage.");
187193
}
188194

189-
export function loadFromLocalStorage(ctx: GlobalContext, currLayer: string) {
190-
const jsonData = localStorage.getItem(LOCAL_STORAGE_KEY) || "[]";
195+
export function loadFromLocalStorage(ctx: GlobalContext) {
196+
const jsonData = localStorage.getItem(LOCAL_STORAGE_KEY) || "{}";
191197
try {
192-
const graphData: GraphData = JSON.parse(jsonData);
193-
ctx.load(DataGraph.fromData(graphData), layerFromName(currLayer));
198+
const data: LocalStorageData = JSON.parse(jsonData);
199+
const graphData: GraphData = JSON.parse(data.graph);
200+
ctx.load(DataGraph.fromData(graphData), data.layer);
194201
} catch (error) {
195202
const extraData = { jsonData, error };
196203
console.error("Failed to load graph from local storage.", extraData);
197-
ctx.load(new DataGraph(), layerFromName(currLayer));
204+
ctx.load(new DataGraph(), Layer.App);
198205
return;
199206
}
200207
console.log("Graph loaded from local storage.");

0 commit comments

Comments
 (0)