prefetch data

This commit is contained in:
2023-12-09 18:11:02 +07:00
parent 6440680898
commit 38e82a4feb
5 changed files with 233 additions and 14 deletions

View File

@@ -1,6 +1,81 @@
import { Link } from 'react-router-dom';
import { NDKKind } from '@nostr-dev-kit/ndk';
import { useQueryClient } from '@tanstack/react-query';
import { useState } from 'react';
import { Link, useNavigate } from 'react-router-dom';
import { useArk } from '@libs/ark';
import { LoaderIcon } from '@shared/icons';
import { FETCH_LIMIT } from '@utils/constants';
export function FinishScreen() {
const { ark } = useArk();
const [loading, setLoading] = useState(false);
const queryClient = useQueryClient();
const navigate = useNavigate();
const prefetch = async () => {
if (!ark.account.contacts.length) return navigate('/');
try {
setLoading(true);
// prefetch newsfeed
await queryClient.prefetchInfiniteQuery({
queryKey: ['newsfeed'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost],
authors: !ark.account.contacts.length
? [ark.account.pubkey]
: ark.account.contacts,
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
// prefetch notification
await queryClient.prefetchInfiniteQuery({
queryKey: ['notification'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap],
'#p': [ark.account.pubkey],
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
navigate('/');
} catch (e) {
console.error(e);
}
};
return (
<div className="flex h-full w-full items-center justify-center">
<div className="mx-auto flex w-full max-w-md flex-col gap-10">
@@ -17,12 +92,13 @@ export function FinishScreen() {
>
Start tutorial
</Link>
<Link
to="/"
<button
type="button"
onClick={prefetch}
className="inline-flex h-11 w-full items-center justify-center rounded-lg bg-neutral-100 font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
>
Skip
</Link>
{loading ? <LoaderIcon className="h-4 w-4 animate-spin" /> : 'Skip'}
</button>
<p className="text-center text-sm font-medium text-neutral-500 dark:text-neutral-600">
You need to restart app to make changes in previous step take effect or you
can continue with Lume default settings

View File

@@ -1,6 +1,81 @@
import { Link } from 'react-router-dom';
import { NDKKind } from '@nostr-dev-kit/ndk';
import { useQueryClient } from '@tanstack/react-query';
import { useState } from 'react';
import { Link, useNavigate } from 'react-router-dom';
import { useArk } from '@libs/ark';
import { LoaderIcon } from '@shared/icons';
import { FETCH_LIMIT } from '@utils/constants';
export function TutorialFinishScreen() {
const { ark } = useArk();
const [loading, setLoading] = useState(false);
const queryClient = useQueryClient();
const navigate = useNavigate();
const prefetch = async () => {
if (!ark.account.contacts.length) return navigate('/');
try {
setLoading(true);
// prefetch newsfeed
await queryClient.prefetchInfiniteQuery({
queryKey: ['newsfeed'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost],
authors: !ark.account.contacts.length
? [ark.account.pubkey]
: ark.account.contacts,
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
// prefetch notification
await queryClient.prefetchInfiniteQuery({
queryKey: ['notification'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap],
'#p': [ark.account.pubkey],
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
navigate('/');
} catch (e) {
console.error(e);
}
};
return (
<div className="flex h-full w-full items-center justify-center">
<div className="mx-auto flex w-full max-w-md flex-col gap-10">
@@ -11,12 +86,17 @@ export function TutorialFinishScreen() {
</h1>
</div>
<div className="flex flex-col gap-2">
<Link
to="/"
<button
type="button"
onClick={prefetch}
className="inline-flex h-11 w-full items-center justify-center rounded-lg bg-blue-500 font-medium text-white hover:bg-blue-600"
>
Start using
</Link>
{loading ? (
<LoaderIcon className="h-4 w-4 animate-spin" />
) : (
'Start using Lume'
)}
</button>
<Link
to="https://nostr.how/"
target="_blank"

View File

@@ -445,7 +445,6 @@ export class Ark {
public async getUserProfile({ pubkey }: { pubkey: string }) {
try {
console.log(pubkey);
const user = this.#ndk.getUser({ pubkey });
const profile = await user.fetchProfile({
cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST,
@@ -472,7 +471,7 @@ export class Ark {
(user) => user.pubkey
);
this.account.contacts = contacts;
if (pubkey === this.account.pubkey) this.account.contacts = contacts;
return contacts;
} catch (e) {
console.error(e);

View File

@@ -1,3 +1,5 @@
import { NDKKind } from '@nostr-dev-kit/ndk';
import { useQueryClient } from '@tanstack/react-query';
import { ask } from '@tauri-apps/plugin-dialog';
import { platform } from '@tauri-apps/plugin-os';
import { relaunch } from '@tauri-apps/plugin-process';
@@ -10,7 +12,7 @@ import { Ark } from '@libs/ark';
import { LoaderIcon } from '@shared/icons';
import { QUOTES } from '@utils/constants';
import { FETCH_LIMIT, QUOTES } from '@utils/constants';
interface ArkContext {
ark: Ark;
@@ -24,6 +26,8 @@ const ArkProvider = ({ children }: PropsWithChildren<object>) => {
const [ark, setArk] = useState<Ark>(undefined);
const [isNewVersion, setIsNewVersion] = useState(false);
const queryClient = useQueryClient();
async function initArk() {
try {
const sqlite = await Database.load('sqlite:lume_v2.db');
@@ -61,6 +65,56 @@ const ArkProvider = ({ children }: PropsWithChildren<object>) => {
}
}
if (_ark.account) {
// prefetch newsfeed
await queryClient.prefetchInfiniteQuery({
queryKey: ['newsfeed'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost],
authors: !ark.account.contacts.length
? [ark.account.pubkey]
: ark.account.contacts,
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
// prefetch notification
await queryClient.prefetchInfiniteQuery({
queryKey: ['notification'],
initialPageParam: 0,
queryFn: async ({
signal,
pageParam,
}: {
signal: AbortSignal;
pageParam: number;
}) => {
return await ark.getInfiniteEvents({
filter: {
kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap],
'#p': [ark.account.pubkey],
},
limit: FETCH_LIMIT,
pageParam,
signal,
});
},
});
}
setArk(_ark);
} catch (e) {
console.error(e);

View File

@@ -23,9 +23,19 @@ const NOSTR_MENTIONS = [
'npub1',
'nprofile1',
'naddr1',
'Nostr:npub1',
'Nostr:nprofile1',
'Nostr:naddre1',
];
const NOSTR_EVENTS = ['nostr:note1', 'note1', 'nostr:nevent1', 'nevent1'];
const NOSTR_EVENTS = [
'nostr:note1',
'note1',
'nostr:nevent1',
'nevent1',
'Nostr:note1',
'Nostr:nevent1',
];
// const BITCOINS = ['lnbc', 'bc1p', 'bc1q'];