diff --git a/js/desktop/src/App.tsx b/js/desktop/src/App.tsx
index 5a8da62..2858f50 100644
--- a/js/desktop/src/App.tsx
+++ b/js/desktop/src/App.tsx
@@ -11,6 +11,7 @@ import NetworkSelector from '@/features/network-selector';
import NetworkRoot from '@/features/network-root';
import ParticleViewResolver from '@/features/particles/particle-view-resolver';
import Layout from '@/features/layout';
+import { logError } from '@/lib/errors';
import NetworkSettingsPage from '@/features/network-settings';
import { Toaster } from '@/components/ui/sonner';
import { PusherProvider } from '@/lib/pusher-provider';
@@ -56,10 +57,16 @@ function DeepLinkNavigationListener() {
const navigate = useNavigate();
useEffect(() => {
- window.electronDeepLink.getPending().then((path) => {
- if (path) navigate(path);
- });
- return window.electronDeepLink.onNavigate((path) => navigate(path));
+ platform.deepLink
+ .getPending()
+ .then((path) => {
+ if (path) navigate(path);
+ })
+ .catch((err) => {
+ logError(err, { scope: 'deepLink.getPending' });
+ });
+
+ return platform.deepLink.onNavigate((path) => navigate(path));
}, [navigate]);
return null;
diff --git a/js/desktop/src/features/network-root.tsx b/js/desktop/src/features/network-root.tsx
index 17d0f00..5b6556a 100644
--- a/js/desktop/src/features/network-root.tsx
+++ b/js/desktop/src/features/network-root.tsx
@@ -30,8 +30,7 @@ export default function NetworkRoot() {
setSearchParams(
(prev) => {
const params = new URLSearchParams(prev);
- if (next === 'open') params.delete('status');
- else params.set('status', next);
+ params.set('status', next);
return params;
},
{ replace: true },
@@ -56,7 +55,6 @@ export default function NetworkRoot() {
return (
- {/* Top bar — stays in place */}
- {/* Scrollable content */}
void;
}
@@ -54,21 +50,10 @@ export function useStreamParticles(
const user = useAuthStore((s) => s.user);
const visibilityScopes = useVisibilityScopes(user?.id, networkId);
- const [closedLimit, setClosedLimit] = useState(CLOSED_INITIAL_PAGE_SIZE);
- const [prevStatus, setPrevStatus] = useState(status);
-
- // Switching back to the closed tab starts a fresh window, avoiding an
- // ever-growing subscription across a long session.
- if (status !== prevStatus) {
- setPrevStatus(status);
- if (status === 'closed') {
- setClosedLimit(CLOSED_INITIAL_PAGE_SIZE);
- }
- }
+ const [limit, setLimit] = useState(INITIAL_PAGE_SIZE);
const whereFilter: QueryFieldFilterConstraint =
status === 'open' ? OPEN_STATUS_FILTER : CLOSED_STATUS_FILTER;
- const limit = status === 'closed' ? closedLimit : undefined;
const { children, isLoading } = useLiveParticleChildren(path, {
orderByField: 'last_child_created_at',
@@ -85,12 +70,11 @@ export function useStreamParticles(
// Heuristic: if we got back as many items as we asked for, assume there
// might be more. Clicking load-more when there are no more is a no-op.
- const canLoadMore = status === 'closed' && streams.length >= closedLimit;
+ const canLoadMore = streams.length >= limit;
const loadMore = useCallback(() => {
- if (status !== 'closed') return;
- setClosedLimit((prev) => prev + CLOSED_PAGE_INCREMENT);
- }, [status]);
+ setLimit((prev) => prev + PAGE_INCREMENT);
+ }, []);
return { streams, isLoading, networkId, canLoadMore, loadMore };
}
diff --git a/js/desktop/src/lib/platform/electron.ts b/js/desktop/src/lib/platform/electron.ts
index f7b9101..84715cd 100644
--- a/js/desktop/src/lib/platform/electron.ts
+++ b/js/desktop/src/lib/platform/electron.ts
@@ -55,4 +55,9 @@ export const electronPlatform: Platform = {
setDockBadge: (count) => window.electronApp.setDockBadge(count),
getVersion: () => window.electronApp.getVersion(),
},
+
+ deepLink: {
+ getPending: () => window.electronDeepLink.getPending(),
+ onNavigate: (cb) => window.electronDeepLink.onNavigate(cb),
+ },
};
diff --git a/js/desktop/src/lib/platform/types.ts b/js/desktop/src/lib/platform/types.ts
index d5874ba..4e21f13 100644
--- a/js/desktop/src/lib/platform/types.ts
+++ b/js/desktop/src/lib/platform/types.ts
@@ -60,6 +60,11 @@ export interface Platform {
setDockBadge: (count: number) => void;
getVersion: () => Promise;
};
+
+ deepLink: {
+ getPending: () => Promise;
+ onNavigate: (callback: (path: string) => void) => () => void;
+ };
}
export const DESKTOP_DOWNLOAD_URL = 'https://flowylabs.ai/llink/download';
diff --git a/js/desktop/src/lib/platform/web.ts b/js/desktop/src/lib/platform/web.ts
index b02a978..11e46b5 100644
--- a/js/desktop/src/lib/platform/web.ts
+++ b/js/desktop/src/lib/platform/web.ts
@@ -117,4 +117,11 @@ export const webPlatform: Platform = {
setDockBadge: applyDockBadge,
getVersion: async () => __APP_VERSION__,
},
+
+ deepLink: {
+ getPending: () => Promise.resolve(null),
+ onNavigate: (_) => {
+ return () => {};
+ },
+ },
};