Skip to content

Commit e21d180

Browse files
committed
Migrate filterActive from a writeable store to runes
1 parent 85b41d9 commit e21d180

File tree

5 files changed

+23
-28
lines changed

5 files changed

+23
-28
lines changed

src/treetop/Folder.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
const builtInFolderInfo: Treetop.BuiltInFolderInfo =
1717
getContext('builtInFolderInfo');
1818
const nodeStoreMap: Treetop.NodeStoreMap = getContext('nodeStoreMap');
19-
const filterActive = getContext<Writable<boolean>>('filterActive');
19+
const filterActive = getContext<() => boolean>('filterActive');
2020
const filterSet = getContext<Treetop.FilterSet>('filterSet');
2121
2222
let node: Writable<Treetop.FolderNode> = nodeStoreMap.get(nodeId)!;
@@ -117,7 +117,7 @@
117117
{/if}
118118
</svelte:head>
119119

120-
{#if root || !$filterActive || filterSet.has($node.id)}
120+
{#if root || !filterActive() || filterSet.has($node.id)}
121121
<div class="folder" class:root>
122122
<div class="heading">
123123
<div class="title">
@@ -130,7 +130,7 @@
130130
</div>
131131
</div>
132132
<div class="contents">
133-
{#if root && $filterActive && !filterSet.has(nodeId)}
133+
{#if root && filterActive() && !filterSet.has(nodeId)}
134134
<em>{chrome.i18n.getMessage('noResults')}</em>
135135
{/if}
136136
{#each $node.children as child (child.id)}
@@ -142,7 +142,7 @@
142142
Unsafe argument of type `any` assigned to a parameter of type `string` @typescript-eslint/no-unsafe-argument
143143
-->
144144
{@const { id, title, url } = child}
145-
{#if !$filterActive || filterSet.has(id)}
145+
{#if !filterActive() || filterSet.has(id)}
146146
<Bookmark nodeId={id} {title} {url} />
147147
{/if}
148148
{:else if child.type === Treetop.NodeType.Folder}

src/treetop/Folder.svelte.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
// Folder component requirements
1919
let builtInFolderInfo: Treetop.BuiltInFolderInfo;
2020
let nodeStoreMap: Treetop.NodeStoreMap;
21-
let filterActive: Writable<boolean>;
21+
let currentFilterActive: boolean;
22+
const filterActive = () => currentFilterActive;
2223
let filterSet: Treetop.FilterSet;
2324
let nodeId: string;
2425

@@ -112,7 +113,7 @@ beforeEach(() => {
112113
};
113114
nodeStoreMap = new Map() as Treetop.NodeStoreMap;
114115
lastVisitTimeMap = new Map() as Treetop.LastVisitTimeMap;
115-
filterActive = writable(false);
116+
currentFilterActive = false;
116117
filterSet = new SvelteSet();
117118
truncate = writable(false);
118119
tooltips = writable(false);
@@ -669,7 +670,7 @@ describe('filter active', () => {
669670
nodeStoreMap.set(folderNode3.id, writable(folderNode3));
670671

671672
// Enable filter
672-
filterActive.set(true);
673+
currentFilterActive = true;
673674
});
674675

675676
describe('rooted at bookmarks root', () => {

src/treetop/Treetop.svelte

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
<script lang="ts">
22
import { onDestroy, onMount, setContext } from 'svelte';
33
import { SvelteSet } from 'svelte/reactivity';
4-
import {
5-
get,
6-
type Unsubscriber,
7-
type Writable,
8-
writable,
9-
} from 'svelte/store';
4+
import { get, type Unsubscriber, type Writable } from 'svelte/store';
105
import { fade } from 'svelte/transition';
116
import LinearProgress from '@smui/linear-progress';
127
import Snackbar, { Label } from '@smui/snackbar';
@@ -95,8 +90,8 @@
9590
// Filter manager
9691
const filterManager = new FilterManager(filterSet, nodeStoreMap);
9792
98-
// Store for whether filter is active.
99-
const filterActive = writable(false);
93+
// Whether the filter is active.
94+
let filterActive = $state(false);
10095
10196
// Clock to age recently visited bookmarks
10297
const clock = createClock();
@@ -105,7 +100,7 @@
105100
setContext('builtInFolderInfo', builtInFolderInfo);
106101
setContext('nodeStoreMap', nodeStoreMap);
107102
setContext('lastVisitTimeMap', lastVisitTimeMap);
108-
setContext('filterActive', filterActive);
103+
setContext('filterActive', () => filterActive);
109104
setContext('filterSet', filterSet);
110105
setContext('clock', clock);
111106
@@ -186,7 +181,7 @@
186181
const nodeStore = nodeStoreMap.get(nodeId)!;
187182
const node: Treetop.FolderNode = get(nodeStore);
188183
189-
const activeFilterSet = get(filterActive) ? filterSet : undefined;
184+
const activeFilterSet = filterActive ? filterSet : undefined;
190185
191186
const promises: Promise<chrome.tabs.Tab>[] = [];
192187
@@ -504,13 +499,13 @@
504499
function applyFilter(filter: string) {
505500
// Clear any previous filtering
506501
filterManager.clearFilter();
507-
filterActive.set(false);
502+
filterActive = false;
508503
509504
// Set the current filter if the string is not empty
510505
const value = filter.trim();
511506
if (value && value.length > 0) {
512507
filterManager.setFilter(value);
513-
filterActive.set(true);
508+
filterActive = true;
514509
}
515510
}
516511
@@ -590,7 +585,7 @@
590585
new DeleteMenuItem(
591586
builtInFolderInfo,
592587
nodeStoreMap,
593-
filterActive,
588+
() => filterActive,
594589
deleteBookmark,
595590
),
596591
);

src/treetop/menus/DeleteMenuItem.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type Writable, writable } from 'svelte/store';
1+
import { writable } from 'svelte/store';
22
import { faker } from '@faker-js/faker';
33
import { beforeEach, describe, expect, it } from 'vitest';
44

@@ -10,7 +10,8 @@ import { createFolderNode } from '../../../test/utils/factories';
1010

1111
let menuItem: DeleteMenuItem;
1212
let nodeStoreMap: Treetop.NodeStoreMap;
13-
let filterActive: Writable<boolean>;
13+
let currentFilterActive: boolean;
14+
const filterActive = () => currentFilterActive;
1415

1516
const BUILT_IN_FOLDER_INFO: Treetop.BuiltInFolderInfo = {
1617
rootNodeId: 'bookmarks-root-id',
@@ -19,7 +20,7 @@ const BUILT_IN_FOLDER_INFO: Treetop.BuiltInFolderInfo = {
1920

2021
beforeEach(() => {
2122
nodeStoreMap = new Map() as Treetop.NodeStoreMap;
22-
filterActive = writable(false);
23+
currentFilterActive = false;
2324

2425
const callback: OnClickedCallback = (nodeId) => {
2526
void nodeId;
@@ -53,7 +54,7 @@ describe('when a filter is active', () => {
5354
folderNode = createFolderNode();
5455
nodeStoreMap.set(folderNode.id, writable(folderNode));
5556

56-
filterActive.set(true);
57+
currentFilterActive = true;
5758
});
5859

5960
it('is disabled for a folder', () => {

src/treetop/menus/DeleteMenuItem.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { get, type Writable } from 'svelte/store';
2-
31
import type * as Treetop from '@Treetop/treetop/types';
42

53
import { MenuItem, type OnClickedCallback } from './MenuItem';
@@ -11,7 +9,7 @@ export class DeleteMenuItem extends MenuItem {
119
constructor(
1210
private readonly builtInFolderInfo: Treetop.BuiltInFolderInfo,
1311
private readonly nodeStoreMap: Treetop.NodeStoreMap,
14-
private readonly filterActive: Writable<boolean>,
12+
private readonly filterActive: () => boolean,
1513
onClickedCallback: OnClickedCallback,
1614
) {
1715
super(onClickedCallback);
@@ -25,7 +23,7 @@ export class DeleteMenuItem extends MenuItem {
2523
}
2624

2725
// Disable deleting folders when filter is active
28-
if (this.nodeStoreMap.has(nodeId) && get(this.filterActive)) {
26+
if (this.nodeStoreMap.has(nodeId) && this.filterActive()) {
2927
return false;
3028
}
3129

0 commit comments

Comments
 (0)