Skip to content

Commit 1b36393

Browse files
committed
[frontend] save browser state to puter cloud
1 parent 5cbb26b commit 1b36393

File tree

15 files changed

+64
-36
lines changed

15 files changed

+64
-36
lines changed

frontend/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Component } from "dreamland/core";
22
import { Omnibox } from "./components/Omnibox";
33
import { Tabs } from "./components/TabStrip";
4-
import { browser } from "./main";
4+
import { browser } from "./Browser";
55
import type { Tab } from "./Tab";
66
import { BookmarksStrip } from "./components/BookmarksStrip";
77

frontend/src/Browser.tsx

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { createState, type Stateful } from "dreamland/core";
2-
import { browser, scramjet } from "./main";
32
import { StatefulClass } from "./StatefulClass";
43
import { Tab, type SerializedTab } from "./Tab";
54
import { createDelegate } from "dreamland/core";
@@ -8,12 +7,11 @@ import { HistoryState } from "./History";
87
import { focusOmnibox } from "./components/UrlInput";
98

109
import * as tldts from "tldts";
11-
console.log(tldts);
1210
export const pushTab = createDelegate<Tab>();
1311
export const popTab = createDelegate<Tab>();
1412
export const forceScreenshot = createDelegate<Tab>();
1513

16-
export const saveBrowserState = createDelegate<void>();
14+
export let browser: Browser;
1715

1816
export const config = createState({
1917
theme: {
@@ -154,7 +152,45 @@ export class Browser extends StatefulClass {
154152
}
155153
}
156154

157-
saveBrowserState.listen(() => {
155+
let loaded = false;
156+
export function saveBrowserState() {
157+
if (!loaded) return;
158+
158159
let ser = browser.serialize();
159-
localStorage["browserstate"] = JSON.stringify(ser);
160-
});
160+
161+
if (import.meta.env.VITE_LOCAL) {
162+
localStorage["browserstate"] = JSON.stringify(ser);
163+
} else {
164+
puter.kv.set("browserstate", JSON.stringify(ser));
165+
}
166+
}
167+
168+
export async function initBrowser() {
169+
browser = new Browser();
170+
171+
let de;
172+
if (import.meta.env.VITE_LOCAL) {
173+
de = localStorage["browserstate"];
174+
} else {
175+
de = await puter.kv.get("browserstate");
176+
console.log(de);
177+
}
178+
if (de) {
179+
try {
180+
browser.deserialize(JSON.parse(de));
181+
} catch (e) {
182+
console.error(e);
183+
console.error("Error while loading browser state. Resetting...");
184+
185+
browser = new Browser();
186+
let tab = browser.newTab();
187+
browser.activetab = tab;
188+
}
189+
} else {
190+
let tab = browser.newTab();
191+
browser.activetab = tab;
192+
}
193+
194+
(self as any).browser = browser;
195+
loaded = true;
196+
}

frontend/src/CDP.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import type Protocol from "devtools-protocol";
2+
import { browser } from "./Browser";
3+
import type { Tab } from "./Tab";
4+
15
export function startCDP(message: (message: string) => void): CDPServer {
26
const server = new CDPServer(message);
37

@@ -166,10 +170,6 @@ class CDPServer {
166170
}
167171
}
168172

169-
import type Protocol from "devtools-protocol";
170-
import { browser } from "./main";
171-
import type { Tab } from "./Tab";
172-
173173
function createTargetInfo(tab: Tab): Protocol.Target.TargetInfo {
174174
return {
175175
browserContextId: "0",

frontend/src/History.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { browser } from "./main";
1+
import { browser } from "./Browser";
22
import type { Tab } from "./Tab";
33

44
// history api emulation

frontend/src/Tab.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createDelegate, createState } from "dreamland/core";
22
import { StatefulClass } from "./StatefulClass";
3-
import { browser, scramjet } from "./main";
3+
import { browser } from "./Browser";
44
import {
55
addHistoryListeners,
66
History,
@@ -13,6 +13,7 @@ import { createMenu } from "./components/Menu";
1313
import { AboutPage } from "./pages/AboutPage";
1414
import { HistoryPage } from "./pages/HistoryPage";
1515
import { SettingsPage } from "./pages/SettingsPage";
16+
import { scramjet } from "./main";
1617

1718
const requestInspectElement = createDelegate<[HTMLElement, Tab]>();
1819

frontend/src/components/BookmarksStrip.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { css, type Component } from "dreamland/core";
22
import { Icon } from "./Icon";
33
import iconAdd from "@ktibow/iconset-ion/add";
4-
import { browser } from "../main";
4+
import { browser } from "../Browser";
55
import { createMenu } from "./Menu";
66

77
export const BookmarksStrip: Component = function () {

frontend/src/components/Menu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { css, type Component, type DLElement } from "dreamland/core";
2-
import { browser } from "../main";
2+
import { browser } from "../Browser";
33

44
export const Menu: Component<{
55
x: number;

frontend/src/components/Omnibox.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import iconRefresh from "@ktibow/iconset-ion/refresh";
55
import iconExtension from "@ktibow/iconset-ion/extension-puzzle-outline";
66
import iconMore from "@ktibow/iconset-ion/more";
77
import { createMenu, setContextMenu } from "./Menu";
8-
import { browser, scramjet } from "../main";
98
import { IconButton } from "./IconButton";
109
import { createDelegate, type Delegate } from "dreamland/core";
1110
import type { Tab } from "../Tab";
1211
import { UrlInput } from "./UrlInput";
12+
import { browser } from "../Browser";
1313

1414
export const Spacer: Component = function (cx) {
1515
return <div></div>;

frontend/src/components/Shell.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { css, type Component } from "dreamland/core";
2-
import { browser } from "../main";
2+
import { browser } from "../Browser";
33
import { forceScreenshot, popTab, pushTab } from "../Browser";
44
import type { Tab } from "../Tab";
55
import { toBlob } from "html-to-image";

frontend/src/components/TabStrip.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { IconButton } from "./IconButton";
1313
import type { Tab } from "../Tab";
1414
import html2canvas from "html2canvas";
1515
import { setContextMenu } from "./Menu";
16-
import { browser } from "../main";
16+
import { browser } from "../Browser";
1717

1818
export const DragTab: Component<
1919
{

0 commit comments

Comments
 (0)