Skip to content

Commit 940cc60

Browse files
committed
refactor: view_store for persistant quib view
1 parent e3f1745 commit 940cc60

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

frontend/src/lib/components/quib.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
</p>
6565
{:else}
6666
<img
67-
class="relative rounded-2xl outline outline-1 outline-offset-[-1px] outline-base-content/15"
67+
class="rounded-2xl inner-border inner-border-base-content/15"
6868
src={quib.cover}
6969
alt=""
7070
/>

frontend/src/lib/components/quibs_header.svelte

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import RocketIcon from '$lib/components/icons/rocket.svelte';
77
import TopIcon from '$lib/components/icons/top.svelte';
88
import { cn } from '$lib/functions/classnames';
9+
import { createViewStore } from '$lib/stores/view.svelte';
910
10-
let active_mapping = $state<{
11+
const viewStore = createViewStore();
12+
13+
let active_mapping = $derived<{
1114
filter: keyof typeof mapping.filters;
1215
view: keyof typeof mapping.view;
1316
}>({
1417
filter: 'best',
15-
view: 'card'
18+
view: viewStore.state
1619
});
1720
1821
const mapping = {
@@ -25,11 +28,11 @@
2528
view: {
2629
card: {
2730
icon: CardIcon,
28-
onclick: () => (active_mapping.view = 'card')
31+
onclick: () => viewStore.update('card')
2932
},
3033
compact: {
3134
icon: CompactIcon,
32-
onclick: () => (active_mapping.view = 'compact')
35+
onclick: () => viewStore.update('compact')
3336
}
3437
}
3538
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { browser } from '$app/environment';
2+
3+
type ViewState = 'card' | 'compact';
4+
5+
const default_view: ViewState = 'card';
6+
7+
const stored_view_state: ViewState = browser
8+
? ((localStorage.getItem('view') as ViewState) ?? default_view)
9+
: default_view;
10+
11+
let view_state = $state<ViewState>(stored_view_state);
12+
13+
$effect.root(() => {
14+
$effect(() => {
15+
// auto sync to localStorage on state update
16+
localStorage.setItem('view', view_state);
17+
});
18+
});
19+
20+
export function createViewStore() {
21+
return {
22+
get state() {
23+
return view_state;
24+
},
25+
update(view: ViewState) {
26+
view_state = view;
27+
}
28+
};
29+
}

0 commit comments

Comments
 (0)