Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/app.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ declare global {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
interface PageState {
readerOpen?: boolean;
}
// interface Platform {}
}
}
Expand Down
16 changes: 15 additions & 1 deletion src/lib/components/feed/FeedListView.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<script lang="ts">
import { tick } from 'svelte';
import { pushState } from '$app/navigation';
import { page } from '$app/state';
import ArticleCard from '$lib/components/ArticleCard.svelte';
import SavedReader from '$lib/components/feed/SavedReader.svelte';
import InfiniteScrollSentinel from '$lib/components/common/InfiniteScrollSentinel.svelte';
Expand All @@ -18,17 +20,29 @@

let { onToggleSave, onShare, onUnshare }: Props = $props();

// Reader overlay state
// Reader overlay state — readerItem holds the data, page.state.readerOpen drives history
let readerItem = $state<FeedDisplayItem | null>(null);
let savedScrollY = 0;

// Close reader when back button is pressed (page.state.readerOpen becomes falsy)
$effect(() => {
if (!page.state.readerOpen && readerItem) {
readerItem = null;
requestAnimationFrame(() => {
window.scrollTo(0, savedScrollY);
});
}
});

function openReader(item: FeedDisplayItem) {
savedScrollY = window.scrollY;
readerItem = item;
pushState('', { readerOpen: true });
}

function closeReader() {
readerItem = null;
history.back();
requestAnimationFrame(() => {
window.scrollTo(0, savedScrollY);
});
Expand Down
14 changes: 14 additions & 0 deletions src/lib/components/feed/SavedListView.svelte
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script lang="ts">
import { pushState } from '$app/navigation';
import { page } from '$app/state';
import SavedCard from './SavedCard.svelte';
import SavedReader from './SavedReader.svelte';
import InfiniteScrollSentinel from '$lib/components/common/InfiniteScrollSentinel.svelte';
Expand Down Expand Up @@ -26,13 +28,25 @@
window.scrollBy({ top: offset, behavior: 'instant' });
}

// Close reader when back button is pressed (page.state.readerOpen becomes falsy)
$effect(() => {
if (!page.state.readerOpen && readerItem) {
readerItem = null;
requestAnimationFrame(() => {
window.scrollTo(0, savedScrollY);
});
}
});

function openReader(item: FeedDisplayItem) {
savedScrollY = window.scrollY;
readerItem = item;
pushState('', { readerOpen: true });
}

function closeReader() {
readerItem = null;
history.back();
requestAnimationFrame(() => {
window.scrollTo(0, savedScrollY);
});
Expand Down