Skip to content

Commit

Permalink
Merge pull request #123 from luminous-devs/feat/v2.1.6
Browse files Browse the repository at this point in the history
Feat/v2.1.6
  • Loading branch information
reyamir authored Nov 27, 2023
2 parents 8439428 + 5229458 commit d989d6f
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 112 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "lume",
"description": "the communication app",
"private": true,
"version": "2.1.5",
"version": "2.1.6",
"scripts": {
"dev": "vite",
"build": "vite build",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "lume"
version = "2.1.5"
version = "2.1.6"
description = "the communication app"
authors = ["Ren Amamiya"]
license = "GPL-3.0"
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
},
"package": {
"productName": "Lume",
"version": "2.1.5"
"version": "2.1.6"
},
"plugins": {
"fs": {
Expand Down
14 changes: 9 additions & 5 deletions src/app/relays/components/relayList.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { message } from '@tauri-apps/plugin-dialog';
import { normalizeRelayUrl } from 'nostr-fetch';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
import { VList } from 'virtua';

import { useStorage } from '@libs/storage/provider';
Expand Down Expand Up @@ -37,10 +37,14 @@ export function RelayList() {
const url = normalizeRelayUrl(relayUrl);
const res = await db.createRelay(url);

if (!res) await message("You're aldready connected to this relay");
queryClient.invalidateQueries({
queryKey: ['user-relay'],
});
if (res) {
toast.info('Connected. You need to restart app to take effect');
queryClient.invalidateQueries({
queryKey: ['user-relay'],
});
} else {
toast.warning("You're aldready connected to this relay");
}
};

return (
Expand Down
48 changes: 26 additions & 22 deletions src/app/users/components/profile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,44 +26,48 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
const svgURI =
'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon(pubkey, 90, 50));

const follow = async (pubkey: string) => {
const follow = async () => {
try {
if (!ndk.signer) return navigate('/new/privkey');
setFollowed(true);

const user = ndk.getUser({ pubkey: db.account.pubkey });
const contacts = await user.follows();
const add = await user.follow(new NDKUser({ pubkey: pubkey }), contacts);

if (add) {
setFollowed(true);
} else {
toast('You already follow this user');
if (!add) {
toast.success('You already follow this user');
setFollowed(false);
}
} catch (error) {
console.log(error);
} catch (e) {
toast.error(e);
setFollowed(false);
}
};

const unfollow = async (pubkey: string) => {
const unfollow = async () => {
try {
if (!ndk.signer) return navigate('/new/privkey');
setFollowed(false);

const user = ndk.getUser({ pubkey: db.account.pubkey });
const contacts = await user.follows();
contacts.delete(new NDKUser({ pubkey: pubkey }));

let list: string[][];
contacts.forEach((el) => list.push(['p', el.pubkey, el.relayUrls?.[0] || '', '']));

const list = [...contacts].map((item) => [
'p',
item.pubkey,
item.relayUrls?.[0] || '',
'',
]);
const event = new NDKEvent(ndk);
event.content = '';
event.kind = NDKKind.Contacts;
event.tags = list;

const publishedRelays = await event.publish();
if (publishedRelays) {
setFollowed(false);
}
} catch (error) {
console.log(error);
await event.publish();
} catch (e) {
toast.error(e);
}
};

Expand Down Expand Up @@ -139,23 +143,23 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
{followed ? (
<button
type="button"
onClick={() => unfollow(pubkey)}
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-600 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
onClick={unfollow}
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-500 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
>
Unfollow
</button>
) : (
<button
type="button"
onClick={() => follow(pubkey)}
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-600 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
onClick={follow}
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-500 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
>
Follow
</button>
)}
<Link
to={`/chats/${pubkey}`}
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-600 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-neutral-200 text-sm font-medium text-neutral-900 backdrop-blur-xl hover:bg-blue-500 hover:text-neutral-100 dark:bg-neutral-800 dark:text-neutral-100 dark:hover:bg-blue-600 dark:hover:text-neutral-100"
>
Message
</Link>
Expand Down
80 changes: 44 additions & 36 deletions src/libs/ndk/instance.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from '@nostr-dev-kit/ndk';
import { ndkAdapter } from '@nostr-fetch/adapter-ndk';
import { message } from '@tauri-apps/plugin-dialog';
import { ask } from '@tauri-apps/plugin-dialog';
import { fetch } from '@tauri-apps/plugin-http';
import { relaunch } from '@tauri-apps/plugin-process';
import { NostrFetcher } from 'nostr-fetch';
import { useEffect, useMemo, useState } from 'react';
import { toast } from 'sonner';
Expand Down Expand Up @@ -78,50 +79,57 @@ export const NDKInstance = () => {
}

async function initNDK() {
const outboxSetting = await db.getSettingValue('outbox');
const bunkerSetting = await db.getSettingValue('nsecbunker');
const signer = await getSigner(!!parseInt(bunkerSetting));
const explicitRelayUrls = await getExplicitRelays();

const tauriAdapter = new NDKCacheAdapterTauri(db);
const instance = new NDK({
explicitRelayUrls,
cacheAdapter: tauriAdapter,
outboxRelayUrls: ['wss://purplepag.es'],
blacklistRelayUrls: [],
enableOutboxModel: !!parseInt(outboxSetting),
});
instance.signer = signer;

try {
const outboxSetting = await db.getSettingValue('outbox');
const bunkerSetting = await db.getSettingValue('nsecbunker');
const signer = await getSigner(!!parseInt(bunkerSetting));
const explicitRelayUrls = await getExplicitRelays();

const tauriAdapter = new NDKCacheAdapterTauri(db);
const instance = new NDK({
explicitRelayUrls,
cacheAdapter: tauriAdapter,
outboxRelayUrls: ['wss://purplepag.es'],
blacklistRelayUrls: [],
enableOutboxModel: !!parseInt(outboxSetting),
});
instance.signer = signer;

// connect
await instance.connect(2000);
await instance.connect();

// update account's metadata
if (db.account) {
const user = instance.getUser({ pubkey: db.account.pubkey });
const follows = [...(await user.follows())].map((user) => user.pubkey);
const relayList = await user.relayList();

// update user's follows
await db.updateAccount('follows', JSON.stringify(follows));

// update user's relay list
if (relayList) {
for (const relay of relayList.relays) {
await db.createRelay(relay);
}
if (user) {
const follows = [...(await user.follows())].map((user) => user.pubkey);
const relayList = await user.relayList();

// update user's follows
await db.updateAccount('follows', JSON.stringify(follows));

if (relayList)
// update user's relays
for (const relay of relayList.relays) {
await db.createRelay(relay);
}
}
}
} catch (error) {
await message(`NDK instance init failed: ${error}`, {
title: 'Lume',
type: 'error',
});
}

setNDK(instance);
setRelayUrls(explicitRelayUrls);
setNDK(instance);
setRelayUrls(explicitRelayUrls);
} catch (e) {
const yes = await ask(
`Something wrong, Lume is not working as expected, do you want to relaunch app?`,
{
title: 'Lume',
type: 'error',
okLabel: 'Yes',
}
);

if (yes) relaunch();
}
}

useEffect(() => {
Expand Down
2 changes: 1 addition & 1 deletion src/libs/storage/instance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ export class LumeStorage {
[relay, this.account.id]
);

if (!existRelays.length) return;
if (existRelays.length) return;

return await this.db.execute(
'INSERT OR IGNORE INTO relays (account_id, relay, purpose) VALUES ($1, $2, $3);',
Expand Down
57 changes: 13 additions & 44 deletions src/shared/widgets/other/nostrBandUserProfile.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { NDKEvent, NDKKind, NDKUser } from '@nostr-dev-kit/ndk';
import { NDKUser } from '@nostr-dev-kit/ndk';
import { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';

import { useNDK } from '@libs/ndk/provider';
import { useStorage } from '@libs/storage/provider';

import { FollowIcon, UnfollowIcon } from '@shared/icons';
import { FollowIcon } from '@shared/icons';

import { shortenKey } from '@utils/shortenKey';

Expand All @@ -16,53 +16,30 @@ export interface Profile {
}

export function NostrBandUserProfile({ data }: { data: Profile }) {
const embedProfile = data.profile ? JSON.parse(data.profile.content) : null;
const profile = embedProfile;

const { db } = useStorage();
const { ndk } = useNDK();

const [followed, setFollowed] = useState(false);
const navigate = useNavigate();

const follow = async (pubkey: string) => {
try {
const user = ndk.getUser({ pubkey: db.account.pubkey });
const contacts = await user.follows();
const add = await user.follow(new NDKUser({ pubkey: pubkey }), contacts);

if (add) {
setFollowed(true);
} else {
toast('You already follow this user');
}
} catch (error) {
console.log(error);
}
};
const profile = data.profile ? JSON.parse(data.profile.content) : null;

const unfollow = async (pubkey: string) => {
const follow = async (pubkey: string) => {
try {
if (!ndk.signer) return navigate('/new/privkey');
setFollowed(true);

const user = ndk.getUser({ pubkey: db.account.pubkey });
const contacts = await user.follows();
contacts.delete(new NDKUser({ pubkey: pubkey }));

let list: string[][];
contacts.forEach((el) => list.push(['p', el.pubkey, el.relayUrls?.[0] || '', '']));

const event = new NDKEvent(ndk);
event.content = '';
event.kind = NDKKind.Contacts;
event.tags = list;
const add = await user.follow(new NDKUser({ pubkey: pubkey }), contacts);

const publishedRelays = await event.publish();
if (publishedRelays) {
if (!add) {
toast.success('You already follow this user');
setFollowed(false);
}
} catch (error) {
console.log(error);
} catch (e) {
toast.error(e);
setFollowed(false);
}
};

Expand Down Expand Up @@ -100,23 +77,15 @@ export function NostrBandUserProfile({ data }: { data: Profile }) {
</div>
</div>
<div className="inline-flex items-center gap-2">
{followed ? (
<button
type="button"
onClick={() => unfollow(data.pubkey)}
className="inline-flex h-8 w-8 items-center justify-center rounded-md bg-neutral-200 text-neutral-900 backdrop-blur-xl hover:bg-blue-600 hover:text-white dark:bg-neutral-800 dark:text-neutral-100 dark:hover:text-white"
>
<UnfollowIcon className="h-4 w-4" />
</button>
) : (
{!followed ? (
<button
type="button"
onClick={() => follow(data.pubkey)}
className="inline-flex h-8 w-8 items-center justify-center rounded-md bg-neutral-200 text-neutral-900 backdrop-blur-xl hover:bg-blue-600 hover:text-white dark:bg-neutral-800 dark:text-neutral-100 dark:hover:text-white"
>
<FollowIcon className="h-4 w-4" />
</button>
)}
) : null}
</div>
</div>
<div className="mt-2 line-clamp-5 whitespace-pre-line break-all text-neutral-900 dark:text-neutral-100">
Expand Down

0 comments on commit d989d6f

Please sign in to comment.