Skip to content

Commit efbfa7b

Browse files
committed
Move url sync out of app
1 parent fb81bb3 commit efbfa7b

2 files changed

Lines changed: 26 additions & 22 deletions

File tree

src/main.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { generateKeyBetween } from "fractional-indexing";
22
import { mount } from "svelte";
33
import "prismjs/themes/prism-tomorrow.min.css";
4-
import App from "./app.svelte";
54
import "./app.css";
5+
import App from "./app.svelte";
66
import { parseDesignTokens } from "./tokens";
7+
import {
8+
isResolverFormat,
9+
parseTokenResolver,
10+
serializeTokenResolver,
11+
} from "./resolver";
12+
import { setDataInUrl, getDataFromUrl } from "./url-data";
713
import { treeState, type SetMeta } from "./state.svelte";
8-
import { getDataFromUrl } from "./url-data";
914
import type { TreeNode } from "./store";
10-
import { isResolverFormat, parseTokenResolver } from "./resolver";
1115
import type { Preset } from "./new-project.svelte";
16+
import type { TreeNodeMeta } from "./state.svelte";
1217

1318
const presets: Preset[] = [
1419
{
@@ -96,7 +101,21 @@ if (parsedResult.errors.length > 0) {
96101

97102
console.info(`Loaded design tokens: ${parsedResult.nodes.length} nodes`);
98103

99-
// Enable URL sync after initial load
100-
treeState.enableUrlSync();
104+
// Set up debounced URL sync after initial load
105+
const URL_SYNC_DEBOUNCE_MS = 300;
106+
let urlUpdateTimeout: ReturnType<typeof setTimeout> | undefined;
107+
108+
treeState.subscribe(() => {
109+
if (urlUpdateTimeout) {
110+
clearTimeout(urlUpdateTimeout);
111+
}
112+
urlUpdateTimeout = setTimeout(() => {
113+
const allNodes = treeState.nodes() as Map<string, TreeNode<TreeNodeMeta>>;
114+
const serialized = serializeTokenResolver(allNodes);
115+
setDataInUrl(serialized).catch((error: unknown) => {
116+
console.error("Failed to sync design tokens to URL:", error);
117+
});
118+
}, URL_SYNC_DEBOUNCE_MS);
119+
});
101120

102121
mount(App, { target: document.body, props: { presets } });

src/state.svelte.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import {
99
RawValueSchema,
1010
isNodeRef,
1111
} from "./schema";
12-
import { setDataInUrl } from "./url-data";
13-
import { serializeTokenResolver } from "./resolver";
1412

1513
export type SetMeta = {
1614
nodeType: "token-set";
@@ -334,30 +332,17 @@ export type TreeNodeMeta = GroupMeta | TokenMeta | SetMeta;
334332
export class TreeState<Meta> {
335333
#store = new TreeStore<Meta>();
336334
#subscribe = createSubscriber((update) => this.#store.subscribe(update));
337-
#syncToUrl: boolean = false;
338335

339336
get store() {
340337
return this.#store;
341338
}
342339

343340
transact(callback: (tx: Transaction<Meta>) => void): void {
344341
this.#store.transact(callback);
345-
// Sync to URL after transaction completes
346-
if (this.#syncToUrl) {
347-
this.#updateUrl();
348-
}
349-
}
350-
351-
enableUrlSync(): void {
352-
this.#syncToUrl = true;
353342
}
354343

355-
#updateUrl(): void {
356-
const allNodes = this.#store.nodes() as Map<string, TreeNode<TreeNodeMeta>>;
357-
const serialized = serializeTokenResolver(allNodes);
358-
setDataInUrl(serialized).catch((error) => {
359-
console.error("Failed to sync design tokens to URL:", error);
360-
});
344+
subscribe(callback: () => void): () => void {
345+
return this.#store.subscribe(callback);
361346
}
362347

363348
values(): TreeNode<Meta>[] {

0 commit comments

Comments
 (0)