This commit is contained in:
Ren Amamiya
2023-03-24 10:59:28 +07:00
parent 18a9bf3e49
commit 47f6e6833b
32 changed files with 419 additions and 524 deletions

View File

@@ -1,4 +1,8 @@
import { Provider } from 'jotai';
import RelayProvider from '@components/relaysProvider';
import { relaysAtom } from '@stores/relays';
import { Provider, useAtom } from 'jotai';
import type { NextPage } from 'next';
import type { AppProps } from 'next/app';
import { ReactElement, ReactNode } from 'react';
@@ -17,5 +21,11 @@ type AppPropsWithLayout = AppProps & {
export default function MyApp({ Component, pageProps }: AppPropsWithLayout) {
// Use the layout defined at the page level, if available
const getLayout = Component.getLayout ?? ((page) => page);
return <Provider>{getLayout(<Component {...pageProps} />)}</Provider>;
const [relays] = useAtom(relaysAtom);
return (
<Provider>
<RelayProvider relays={relays}>{getLayout(<Component {...pageProps} />)}</RelayProvider>
</Provider>
);
}

View File

@@ -1,6 +1,6 @@
import BaseLayout from '@layouts/base';
import { getActiveAccount } from '@utils/storage';
import { getAccounts } from '@utils/storage';
import LumeSymbol from '@assets/icons/Lume';
@@ -11,10 +11,10 @@ export default function Page() {
const router = useRouter();
useEffect(() => {
getActiveAccount()
.then((res: any[]) => {
getAccounts()
.then((res: any) => {
if (res.length > 0) {
router.push('/newsfeed/following');
router.push('/newsfeed/circle');
} else {
router.push('/onboarding');
}

View File

@@ -1,11 +1,12 @@
import BaseLayout from '@layouts/base';
import WithSidebarLayout from '@layouts/withSidebar';
import { DatabaseContext } from '@components/contexts/database';
import { RelayContext } from '@components/contexts/relay';
import { Content } from '@components/note/content';
import { ContentExtend } from '@components/note/content/extend';
import FormComment from '@components/note/form/comment';
import { RelayContext } from '@components/relaysProvider';
import { getNoteByID } from '@utils/storage';
import useLocalStorage from '@rehooks/local-storage';
import { useRouter } from 'next/router';
@@ -14,15 +15,13 @@ import {
ReactElement,
ReactFragment,
ReactPortal,
useCallback,
useContext,
useEffect,
useState,
} from 'react';
export default function Page() {
const { db }: any = useContext(DatabaseContext);
const relayPool: any = useContext(RelayContext);
const pool: any = useContext(RelayContext);
const router = useRouter();
const id = router.query.id;
@@ -32,17 +31,15 @@ export default function Page() {
const [rootEvent, setRootEvent] = useState(null);
const [comments, setComments] = useState([]);
const fetchRoot = useCallback(async () => {
const result = await db.select(`SELECT * FROM cache_notes WHERE id = "${id}"`);
setRootEvent(result[0]);
}, [db, id]);
useEffect(() => {
let unsubscribe: () => void;
fetchRoot()
.then(() => {
unsubscribe = relayPool.subscribe(
getNoteByID(id)
.then((res) => {
// update state
setRootEvent(res);
// get all comments
unsubscribe = pool.subscribe(
[
{
'#e': [id],
@@ -60,7 +57,7 @@ export default function Page() {
return () => {
unsubscribe();
};
}, [fetchRoot, id, relayPool, relays]);
}, [id, pool, relays]);
return (
<div className="scrollbar-hide flex h-full flex-col gap-2 overflow-y-auto py-5">

View File

@@ -1,13 +1,17 @@
import BaseLayout from '@layouts/base';
import { pool } from '@utils/pool';
import { createAccount, getAllRelays } from '@utils/storage';
import { RelayContext } from '@components/relaysProvider';
import { relaysAtom } from '@stores/relays';
import { createAccount } from '@utils/storage';
import { EyeClosedIcon, EyeOpenIcon } from '@radix-ui/react-icons';
import { useAtom } from 'jotai';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { generatePrivateKey, getEventHash, getPublicKey, nip19, signEvent } from 'nostr-tools';
import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useMemo, useState } from 'react';
import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useContext, useMemo, useState } from 'react';
import { Config, names, uniqueNamesGenerator } from 'unique-names-generator';
const config: Config = {
@@ -16,7 +20,9 @@ const config: Config = {
export default function Page() {
const router = useRouter();
const pool: any = useContext(RelayContext);
const [relays] = useAtom(relaysAtom);
const [type, setType] = useState('password');
const [loading, setLoading] = useState(false);
@@ -78,16 +84,11 @@ export default function Page() {
// insert to database then broadcast
createAccount(data)
.then(() => {
getAllRelays()
.then((res) => {
// publish to relays
pool(res).publish(event, res);
router.push({
pathname: '/onboarding/create/step-2',
query: { id: pubKey, privkey: privKey },
});
})
.catch(console.error);
pool.publish(event, relays);
router.push({
pathname: '/onboarding/create/step-2',
query: { id: pubKey, privkey: privKey },
});
})
.catch(console.error);
};

View File

@@ -1,15 +1,27 @@
import BaseLayout from '@layouts/base';
import { RelayContext } from '@components/relaysProvider';
import { UserBase } from '@components/user/base';
import { pool } from '@utils/pool';
import { createFollows, getAllRelays } from '@utils/storage';
import { relaysAtom } from '@stores/relays';
import { createFollows } from '@utils/storage';
import { CheckCircledIcon } from '@radix-ui/react-icons';
import { createClient } from '@supabase/supabase-js';
import { useAtom } from 'jotai';
import { useRouter } from 'next/router';
import { getEventHash, signEvent } from 'nostr-tools';
import { JSXElementConstructor, Key, ReactElement, ReactFragment, ReactPortal, useEffect, useState } from 'react';
import {
JSXElementConstructor,
Key,
ReactElement,
ReactFragment,
ReactPortal,
useContext,
useEffect,
useState,
} from 'react';
const supabase = createClient(
'https://niwaazauwnrwiwmnocnn.supabase.co',
@@ -52,9 +64,12 @@ const initialList = [
];
export default function Page() {
const pool: any = useContext(RelayContext);
const router = useRouter();
const { id, privkey }: any = router.query;
const [relays] = useAtom(relaysAtom);
const [loading, setLoading] = useState(false);
const [list, setList]: any = useState(initialList);
const [follows, setFollows] = useState([]);
@@ -93,13 +108,9 @@ export default function Page() {
createFollows(follows, id, 0)
.then((res) => {
if (res === 'ok') {
getAllRelays()
.then((res) => {
// publish to relays
pool(res).publish(event, res);
router.push('/');
})
.catch(console.error);
// publish to relays
pool.publish(event, relays);
router.push('/');
}
})
.catch(console.error);

View File

@@ -1,69 +1,72 @@
import BaseLayout from '@layouts/base';
import { pool } from '@utils/pool';
import { createAccount, createFollows, getAllRelays } from '@utils/storage';
import { RelayContext } from '@components/relaysProvider';
import { relaysAtom } from '@stores/relays';
import { createAccount, createFollows } from '@utils/storage';
import { tagsToArray } from '@utils/tags';
import { truncate } from '@utils/truncate';
import destr from 'destr';
import { useAtom } from 'jotai';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { getPublicKey, nip19 } from 'nostr-tools';
import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useEffect, useState } from 'react';
const tags = (arr) => {
const newarr = [];
// push item to newarr
arr.forEach((item) => {
newarr.push(['p', item]);
});
return newarr;
};
import {
JSXElementConstructor,
ReactElement,
ReactFragment,
ReactPortal,
useContext,
useEffect,
useState,
} from 'react';
export default function Page() {
const pool: any = useContext(RelayContext);
const router = useRouter();
const privkey: any = router.query.privkey;
const pubkey = getPublicKey(privkey);
const [relays] = useAtom(relaysAtom);
const [profile, setProfile] = useState(null);
useEffect(() => {
getAllRelays()
.then((res) => {
pool(res).subscribe(
[
{
authors: [pubkey],
kinds: [0, 3],
since: 0,
},
],
res,
(event: any) => {
if (event.kind === 0) {
const data = {
pubkey: pubkey,
privkey: privkey,
npub: nip19.npubEncode(pubkey),
nsec: nip19.nsecEncode(privkey),
metadata: event.content,
};
setProfile(destr(event.content));
createAccount(data);
} else {
if (event.tags.length > 0) {
createFollows(tags(event.tags), pubkey, 0);
}
}
},
undefined,
undefined,
{
unsubscribeOnEose: true,
pool.subscribe(
[
{
authors: [pubkey],
kinds: [0, 3],
since: 0,
},
],
relays,
(event: any) => {
if (event.kind === 0) {
const data = {
pubkey: pubkey,
privkey: privkey,
npub: nip19.npubEncode(pubkey),
nsec: nip19.nsecEncode(privkey),
metadata: event.content,
};
setProfile(destr(event.content));
createAccount(data);
} else {
if (event.tags.length > 0) {
createFollows(tagsToArray(event.tags), pubkey, 0);
}
);
})
.catch(console.error);
}, [privkey, pubkey]);
}
},
undefined,
undefined,
{
unsubscribeOnEose: true,
}
);
}, [pool, privkey, pubkey, relays]);
// submit then redirect to home
const submit = () => {