extract hooks

This commit is contained in:
Alejandro Gomez 2023-01-21 14:11:44 +01:00
parent a8348597e2
commit 5a065bf7ba
No known key found for this signature in database
GPG Key ID: 4DF39E566658C817
4 changed files with 93 additions and 82 deletions

View File

@ -9,8 +9,8 @@ import TextareaAutosize from "react-textarea-autosize";
import Avatar from "Element/Avatar"; import Avatar from "Element/Avatar";
import Nip05 from "Element/Nip05"; import Nip05 from "Element/Nip05";
import { hexToBech32 } from "Util"; import { hexToBech32 } from "Util";
import { db } from "Db"; import { MetadataCache } from "State/Users";
import { useQuery, MetadataCache } from "State/Users"; import { useQuery } from "State/Users/Hooks";
interface EmojiItemProps { interface EmojiItemProps {
name: string name: string

View File

@ -2,7 +2,8 @@ import { useLiveQuery } from "dexie-react-hooks";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import { useEffect, useMemo } from "react"; import { useEffect, useMemo } from "react";
import { RootState } from "State/Store"; import { RootState } from "State/Store";
import { MetadataCache, find, bulkGet, useQuery, useKey, useKeys } from "State/Users"; import { MetadataCache } from "State/Users";
import { useKey, useKeys } from "State/Users/Hooks";
import { HexKey } from "Nostr"; import { HexKey } from "Nostr";
import { System } from "Nostr/System"; import { System } from "Nostr/System";

View File

@ -1,6 +1,4 @@
import { useMemo } from "react";
import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { useLiveQuery } from "dexie-react-hooks";
import { HexKey, TaggedRawEvent, UserMetadata } from "Nostr"; import { HexKey, TaggedRawEvent, UserMetadata } from "Nostr";
import { hexToBech32 } from "../Util"; import { hexToBech32 } from "../Util";
import { db } from "Db"; import { db } from "Db";
@ -68,11 +66,6 @@ function groupByPubkey(acc: Record<HexKey, MetadataCache>, user: MetadataCache)
return { ...acc, [user.pubkey]: user } return { ...acc, [user.pubkey]: user }
} }
function groupByPubkeyMap(acc: Map<HexKey, MetadataCache>, user: MetadataCache) {
acc.set(user.pubkey, user)
return acc
}
export const add = async (user: MetadataCache) => { export const add = async (user: MetadataCache) => {
try { try {
return await db.users.add(user) return await db.users.add(user)
@ -150,76 +143,4 @@ export const bulkPut = async (newUsers: MetadataCache[]) => {
} }
} }
export function useQuery(query: string, limit: number = 5) {
const state = store.getState()
const { users } = state.users
const inMemoryUsers = useMemo(() => {
return Object.values(users).filter((user) => {
return user.name?.includes(query)
|| user.npub?.includes(query)
|| user.display_name?.includes(query)
|| user.nip05?.includes(query)
})
}, [users, query])
const allUsers = useLiveQuery(
() => db.users
.where("npub").startsWithIgnoreCase(query)
.or("name").startsWithIgnoreCase(query)
.or("display_name").startsWithIgnoreCase(query)
.or("nip05").startsWithIgnoreCase(query)
.limit(5)
.toArray()
.catch((err) => {
return inMemoryUsers
}),
[query],
)
return allUsers
}
export function useKey(pubKey: HexKey) {
const state = store.getState()
const { users } = state.users
const inMemoryUser = useMemo(() => {
return users[pubKey]
}, [users, pubKey])
const user = useLiveQuery(async () => {
if (pubKey) {
return await find(pubKey);
}
}, [pubKey]);
return user ?? inMemoryUser
}
export function useKeys(pubKeys: HexKey[]): Map<HexKey, MetadataCache> {
const state = store.getState()
const { users } = state.users
const inMemoryUsers = useMemo(() => {
const res = new Map()
Object.values(users).forEach(u => {
if (pubKeys.includes(u.pubkey)) {
res.set(u.pubkey, u)
}
})
return res
}, [users, pubKeys])
const dbUsers = useLiveQuery(async () => {
if (pubKeys) {
const ret = await bulkGet(pubKeys);
return new Map(ret.map(a => [a.pubkey, a]))
}
return new Map()
}, [pubKeys]);
return dbUsers || inMemoryUsers
}
export const reducer = UsersSlice.reducer; export const reducer = UsersSlice.reducer;

89
src/State/Users/Hooks.ts Normal file
View File

@ -0,0 +1,89 @@
import { useMemo } from "react";
import { useSelector } from "react-redux";
import { useLiveQuery } from "dexie-react-hooks";
import { RootState } from "State/Store";
import { MetadataCache } from "State/Users";
import { HexKey } from "Nostr";
import { db } from "Db";
export function useQuery(query: string, limit: number = 5) {
const { users } = useSelector((state: RootState) => state.users)
const inMemoryUsers = useMemo(() => {
return Object.values(users).filter(user => {
const profile = user as MetadataCache
return profile.name?.includes(query)
|| profile.npub?.includes(query)
|| profile.display_name?.includes(query)
|| profile.nip05?.includes(query)
})
}, [users, query])
const allUsers = useLiveQuery(
() => db.users
.where("npub").startsWithIgnoreCase(query)
.or("name").startsWithIgnoreCase(query)
.or("display_name").startsWithIgnoreCase(query)
.or("nip05").startsWithIgnoreCase(query)
.limit(5)
.toArray()
.catch((err) => {
return inMemoryUsers
}),
[query, inMemoryUsers],
)
return allUsers
}
export function useKey(pubKey: HexKey) {
const { users } = useSelector((s: RootState) => s.users)
const inMemoryUser = useMemo(() => {
return users[pubKey]
}, [users, pubKey])
const user = useLiveQuery(async () => {
if (pubKey) {
try {
return await db.users.get(pubKey);
} catch (error) {
return inMemoryUser
}
}
}, [pubKey, inMemoryUser]);
return user
}
export function useKeys(pubKeys: HexKey[]): Map<HexKey, MetadataCache> {
const { users } = useSelector((s: RootState) => s.users)
const inMemoryUsers = useMemo(() => {
const res = new Map()
Object.values(users).forEach(u => {
const profile = u as MetadataCache
if (pubKeys.includes(profile.pubkey)) {
res.set(profile.pubkey, profile)
}
})
return res
}, [users, pubKeys])
const dbUsers = useLiveQuery(async () => {
if (pubKeys) {
try {
const ret = await db.users.bulkGet(pubKeys);
// @ts-ignore
return new Map(ret.map(a => [a.pubkey, a]))
} catch (error) {
return inMemoryUsers
}
}
return new Map()
}, [pubKeys, inMemoryUsers]);
return dbUsers || inMemoryUsers
}