refactor user data

This commit is contained in:
KoalaSat 2023-01-24 12:32:40 +01:00
parent 1a32a5c9a2
commit 4956440245
No known key found for this signature in database
GPG Key ID: 2F7F61C6146AB157
12 changed files with 209 additions and 287 deletions

View File

@ -4,7 +4,6 @@ import { DrawerContentScrollView } from '@react-navigation/drawer'
import {
Button,
Card,
Chip,
Drawer,
IconButton,
Text,
@ -17,14 +16,13 @@ import { RelayPoolContext } from '../../Contexts/RelayPoolContext'
import { UserContext } from '../../Contexts/UserContext'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { navigate } from '../../lib/Navigation'
import NostrosAvatar from '../NostrosAvatar'
import { formatPubKey, username } from '../../Functions/RelayFunctions/Users'
import { username } from '../../Functions/RelayFunctions/Users'
import ProfileData from '../ProfileData'
export const MenuItems: React.FC = () => {
const [drawerItemIndex, setDrawerItemIndex] = React.useState<number>(-1)
const { relays } = React.useContext(RelayPoolContext)
const { nPub, publicKey, privateKey, user, contactsCount, followersCount, logout } =
React.useContext(UserContext)
const { nPub, publicKey, privateKey, user, logout } = React.useContext(UserContext)
const { t } = useTranslation('common')
const theme = useTheme()
@ -69,32 +67,14 @@ export const MenuItems: React.FC = () => {
})
}
>
<View style={styles.cardContent}>
<View style={styles.cardAvatar}>
<NostrosAvatar
name={user?.name}
pubKey={nPub ?? ''}
src={user?.picture}
lud06={user?.lnurl}
/>
</View>
<View>
<View style={styles.username}>
<Text variant='titleMedium'>{user?.name}</Text>
{user?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
<Text>{formatPubKey(publicKey ?? '')}</Text>
</View>
</View>
<ProfileData
username={user?.name}
publicKey={user?.id}
validNip05={user?.valid_nip05}
nip05={user?.nip05}
lud06={user?.lnurl}
picture={user?.picture}
/>
</TouchableRipple>
<View style={styles.cardEdit}>
{privateKey && (
@ -106,22 +86,6 @@ export const MenuItems: React.FC = () => {
)}
</View>
</Card.Content>
<Card.Content style={styles.cardActions}>
<Chip
compact={true}
style={styles.cardActionsChip}
onPress={() => console.log('Pressed')}
>
{t('menuItems.following', { following: contactsCount })}
</Chip>
<Chip
compact={true}
style={styles.cardActionsChip}
onPress={() => console.log('Pressed')}
>
{t('menuItems.followers', { followers: followersCount })}
</Chip>
</Card.Content>
</Card>
)}
{publicKey && (

View File

@ -4,7 +4,7 @@ import { Avatar as PaperAvatar, useTheme } from 'react-native-paper'
import { validImageUrl } from '../../Functions/NativeFunctions'
interface NostrosAvatarProps {
pubKey: string
pubKey?: string
src?: string
name?: string
size?: number

View File

@ -1,4 +1,4 @@
import React, { useContext, useEffect, useMemo, useState } from 'react'
import React, { useContext, useEffect, useState } from 'react'
import { getRepliesCount, Note } from '../../Functions/DatabaseFunctions/Notes'
import { StyleSheet, View } from 'react-native'
import { RelayPoolContext } from '../../Contexts/RelayPoolContext'
@ -8,10 +8,9 @@ import { isContentWarning } from '../../Functions/RelayFunctions/Events'
import { Event } from '../../../lib/nostr/Events'
import moment from 'moment'
import { populateRelay } from '../../Functions/RelayFunctions'
import { NostrosAvatar } from '../NostrosAvatar'
import { searchRelays } from '../../Functions/DatabaseFunctions/Relays'
import TextContent from '../../Components/TextContent'
import { formatPubKey, usernamePubKey } from '../../Functions/RelayFunctions/Users'
import { formatPubKey } from '../../Functions/RelayFunctions/Users'
import { getReactions } from '../../Functions/DatabaseFunctions/Reactions'
import { UserContext } from '../../Contexts/UserContext'
import {
@ -26,9 +25,9 @@ import {
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { REGEX_SOCKET_LINK } from '../../Constants/Relay'
import { push } from '../../lib/Navigation'
import { getNpub } from '../../lib/nostr/Nip19'
import { User } from '../../Functions/DatabaseFunctions/Users'
import { Kind } from 'nostr-tools'
import ProfileData from '../ProfileData'
interface NoteCardProps {
note: Note
@ -52,8 +51,6 @@ export const NoteCard: React.FC<NoteCardProps> = ({
const [userDownvoted, setUserDownvoted] = useState<boolean>(false)
const [repliesCount, setRepliesCount] = React.useState<number>(0)
const [hide, setHide] = useState<boolean>(isContentWarning(note))
const timestamp = useMemo(() => moment.unix(note.created_at).format('L HH:mm'), [note])
const nPub = useMemo(() => getNpub(note.pubkey), [note])
useEffect(() => {
if (database && publicKey && note.id) {
@ -188,33 +185,16 @@ export const NoteCard: React.FC<NoteCardProps> = ({
<Card style={styles.container}>
<Card.Content style={styles.title}>
<TouchableRipple onPress={() => onPressUser({ id: note.pubkey, name: note.name })}>
<View style={styles.titleUser}>
<View>
<NostrosAvatar
name={note.name}
pubKey={nPub}
src={note.picture}
lud06={note.lnurl}
size={54}
/>
</View>
<View style={styles.titleUserInfo}>
<View style={styles.titleUser}>
<Text style={styles.titleUsername}>{usernamePubKey(note.name, nPub)}</Text>
{note?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
<Text>{timestamp}</Text>
</View>
</View>
<ProfileData
username={note?.name}
publicKey={note.pubkey}
validNip05={note?.valid_nip05}
nip05={note?.nip05}
lud06={note?.lnurl}
picture={note?.picture}
timestamp={note?.created_at}
avatarSize={56}
/>
</TouchableRipple>
<View>
<IconButton

View File

@ -8,12 +8,12 @@ import { RelayPoolContext } from '../../Contexts/RelayPoolContext'
import { UserContext } from '../../Contexts/UserContext'
import { getUser, updateUserContact, User } from '../../Functions/DatabaseFunctions/Users'
import { populatePets, usernamePubKey } from '../../Functions/RelayFunctions/Users'
import NostrosAvatar from '../NostrosAvatar'
import LnPayment from '../LnPayment'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { navigate, push } from '../../lib/Navigation'
import RBSheet from 'react-native-raw-bottom-sheet'
import { getNpub } from '../../lib/nostr/Nip19'
import ProfileData from '../ProfileData'
interface ProfileCardProps {
userPubKey: string
@ -78,33 +78,15 @@ export const ProfileCard: React.FC<ProfileCardProps> = ({ userPubKey, bottomShee
<Card.Content style={styles.card}>
<View style={styles.cardUser}>
<View style={styles.cardUserMain}>
<View>
<NostrosAvatar
name={user?.name}
pubKey={nPub}
src={user?.picture}
lud06={user?.lnurl}
size={54}
/>
</View>
<View>
<View style={styles.usernameData}>
<View style={styles.username}>
<Text variant='titleMedium'>{username}</Text>
{user?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
<Text>{user?.nip05}</Text>
</View>
</View>
<ProfileData
username={user?.name}
publicKey={user?.id}
validNip05={user?.valid_nip05}
nip05={user?.nip05}
lud06={user?.lnurl}
picture={user?.picture}
avatarSize={54}
/>
</View>
<View style={styles.about}>
<Text>

View File

@ -0,0 +1,78 @@
import * as React from 'react'
import { StyleSheet, View } from 'react-native'
import { Text, useTheme } from 'react-native-paper'
import { getNip05Domain, usernamePubKey } from '../../Functions/RelayFunctions/Users'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import NostrosAvatar from '../NostrosAvatar'
import moment from 'moment'
import { getNpub } from '../../lib/nostr/Nip19'
interface ProfileCardProps {
username?: string
publicKey?: string
lud06?: string
validNip05?: boolean
nip05?: string
picture?: string
avatarSize?: number
timestamp?: number
}
export const ProfileData: React.FC<ProfileCardProps> = ({
username,
publicKey,
lud06,
validNip05,
nip05,
picture,
avatarSize,
timestamp,
}) => {
const theme = useTheme()
const nPub = React.useMemo(() => (publicKey ? getNpub(publicKey) : ''), [publicKey])
const date = React.useMemo(
() => (timestamp ? moment.unix(timestamp).format('L HH:mm') : null),
[timestamp],
)
return (
<View style={styles.container}>
<NostrosAvatar name={username} pubKey={nPub} src={picture} lud06={lud06} size={avatarSize} />
<View style={styles.contactData}>
<View style={styles.contactName}>
<Text variant='titleSmall'>{usernamePubKey(username, nPub)}</Text>
{validNip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
{validNip05 ? <Text>{getNip05Domain(nip05)}</Text> : <></>}
{date ? <Text>{date}</Text> : <></>}
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
},
contactName: {
flexDirection: 'row',
},
contactData: {
flexDirection: 'column',
marginLeft: 8,
},
verifyIcon: {
paddingTop: 5,
paddingLeft: 5,
},
})
export default ProfileData

View File

@ -8,6 +8,7 @@ export interface Note extends Event {
lnurl: string
reply_event_id: string
user_created_at: number
nip05: string
valid_nip05: boolean
}
@ -23,7 +24,7 @@ export const getMainNotes: (
) => Promise<Note[]> = async (db, pubKey, limit) => {
const notesQuery = `
SELECT
nostros_notes.*, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
nostros_notes.*, nostros_users.nip05, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
LEFT JOIN
nostros_users ON nostros_users.id = nostros_notes.pubkey
WHERE (nostros_users.contact = 1 OR nostros_notes.pubkey = '${pubKey}')
@ -46,7 +47,7 @@ export const getMentionNotes: (
) => Promise<Note[]> = async (db, pubKey, limit) => {
const notesQuery = `
SELECT
nostros_notes.*, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
nostros_notes.*, nostros_users.nip05, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
LEFT JOIN
nostros_users ON nostros_users.id = nostros_notes.pubkey
WHERE (nostros_notes.reply_event_id IN (
@ -115,7 +116,7 @@ export const getNotes: (
) => Promise<Note[]> = async (db, { filters = {}, limit, contacts, includeIds }) => {
let notesQuery = `
SELECT
nostros_notes.*, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
nostros_notes.*, nostros_users.nip05, nostros_users.valid_nip05, nostros_users.lnurl, nostros_users.name, nostros_users.picture, nostros_users.contact, nostros_users.created_at as user_created_at FROM nostros_notes
LEFT JOIN
nostros_users ON nostros_users.id = nostros_notes.pubkey
`

View File

@ -19,20 +19,35 @@ export const tagToUser: (tag: string[]) => User = (tag) => {
}
}
export const username: (user: User) => string = (user) => {
export const username: (user: User | undefined) => string = (user) => {
if (!user) return ''
return user.name && user.name !== '' ? user.name : formatPubKey(getNpub(user.id))
}
export const usernamePubKey: (name: string, pubKey: string) => string = (name, pubKey) => {
export const usernamePubKey: (name: string | undefined, pubKey: string | undefined) => string = (
name,
pubKey,
) => {
return name && name !== '' ? name : formatPubKey(pubKey)
}
export const formatPubKey: (pubKey: string) => string = (pubKey) => {
export const formatPubKey: (pubKey: string | undefined) => string = (pubKey) => {
if (!pubKey) return ''
return `${pubKey.slice(0, 6)}...${pubKey.slice(-6)}`
}
export const getNip05Domain: (nip05: string | undefined) => string | null = (nip05) => {
if (!nip05) return null
const splitString = nip05.split('@')
if (splitString.length < 2) return null
return `@${splitString[1]}`
}
export const populatePets: (
relayPool: RelayPool,
database: QuickSQLiteConnection,

View File

@ -10,7 +10,7 @@ import {
User,
} from '../../Functions/DatabaseFunctions/Users'
import { RelayPoolContext } from '../../Contexts/RelayPoolContext'
import { formatPubKey, populatePets, username } from '../../Functions/RelayFunctions/Users'
import { populatePets } from '../../Functions/RelayFunctions/Users'
import { getNip19Key, getNpub } from '../../lib/nostr/Nip19'
import { UserContext } from '../../Contexts/UserContext'
import {
@ -23,11 +23,11 @@ import {
TouchableRipple,
useTheme,
} from 'react-native-paper'
import NostrosAvatar from '../../Components/NostrosAvatar'
import RBSheet from 'react-native-raw-bottom-sheet'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { useFocusEffect } from '@react-navigation/native'
import ProfileCard from '../../Components/ProfileCard'
import ProfileData from '../../Components/ProfileData'
export const ContactsFeed: React.FC = () => {
const { t } = useTranslation('common')
@ -163,31 +163,15 @@ export const ContactsFeed: React.FC = () => {
}}
>
<View key={item.id} style={styles.contactRow}>
<View style={styles.contactInfo}>
<NostrosAvatar
name={item.name}
pubKey={nPub}
src={item.picture}
lud06={item.lnurl}
size={40}
/>
<View style={styles.contactData}>
<View style={styles.contactName}>
<Text>{formatPubKey(nPub)}</Text>
{item.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
{item.name && <Text variant='titleSmall'>{username(item)}</Text>}
</View>
</View>
<ProfileData
username={item?.name}
publicKey={nPub}
validNip05={item?.valid_nip05}
nip05={item?.nip05}
lud06={item?.lnurl}
picture={item?.picture}
avatarSize={40}
/>
<View style={styles.contactFollow}>
<Button onPress={() => (item.contact ? removeContact(item) : addContact(item))}>
{item.contact ? t('contactsFeed.stopFollowing') : t('contactsFeed.follow')}

View File

@ -10,8 +10,7 @@ import {
} from '../../Functions/DatabaseFunctions/DirectMessages'
import { getUsers, User } from '../../Functions/DatabaseFunctions/Users'
import { getOtherPubKey } from '../../Functions/RelayFunctions/DirectMessages'
import { NostrosAvatar } from '../../Components/NostrosAvatar'
import { formatPubKey, username } from '../../Functions/RelayFunctions/Users'
import { username } from '../../Functions/RelayFunctions/Users'
import {
AnimatedFAB,
Badge,
@ -30,7 +29,7 @@ import RBSheet from 'react-native-raw-bottom-sheet'
import { useTranslation } from 'react-i18next'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { useFocusEffect } from '@react-navigation/native'
import { getNpub } from '../../lib/nostr/Nip19'
import ProfileData from '../../Components/ProfileData'
export const ConversationsFeed: React.FC = () => {
const theme = useTheme()
@ -115,28 +114,15 @@ export const ConversationsFeed: React.FC = () => {
}
>
<View key={user.id} style={styles.contactRow}>
<View style={styles.contactUser}>
<NostrosAvatar
name={user.name}
pubKey={getNpub(user.id)}
src={user.picture}
lud06={user.lnurl}
size={40}
/>
<View style={styles.contactName}>
<Text variant='titleSmall'>{userMame}</Text>
{user?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
</View>
<ProfileData
username={user?.name}
publicKey={user.id}
validNip05={user?.valid_nip05}
nip05={user?.nip05}
lud06={user?.lnurl}
picture={user?.picture}
avatarSize={40}
/>
<View style={styles.contactInfo}>
<View style={styles.contactDate}>
<Text>{moment.unix(item.created_at).format('L HH:mm')}</Text>
@ -215,31 +201,15 @@ export const ConversationsFeed: React.FC = () => {
}}
>
<View key={item.id} style={styles.contactRow}>
<View style={styles.contactUser}>
<NostrosAvatar
name={item.name}
pubKey={getNpub(item.id)}
src={item.picture}
lud06={item.lnurl}
size={40}
/>
<View style={styles.contactData}>
<View style={styles.contactName}>
<Text variant='titleSmall'>{formatPubKey(item.id)}</Text>
{item?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
{item.name && <Text variant='titleSmall'>{username(item)}</Text>}
</View>
</View>
<ProfileData
username={item?.name}
publicKey={item.id}
validNip05={item?.valid_nip05}
nip05={item?.nip05}
lud06={item?.lnurl}
picture={item?.picture}
avatarSize={40}
/>
</View>
</TouchableRipple>
)
@ -368,19 +338,9 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
width: '100%',
},
contactData: {
paddingLeft: 16,
},
contactDate: {
paddingLeft: 16,
},
contactName: {
flexDirection: 'row',
alignContent: 'center',
justifyContent: 'center',
paddingLeft: 16,
paddingTop: 10,
},
contactUser: {
flexDirection: 'row',
alignContent: 'center',
@ -410,10 +370,6 @@ const styles = StyleSheet.create({
list: {
paddingBottom: 64,
},
verifyIcon: {
paddingTop: 3,
paddingLeft: 5,
},
})
export default ConversationsFeed

View File

@ -17,8 +17,7 @@ import {
useTheme,
} from 'react-native-paper'
import moment from 'moment'
import { formatPubKey, usernamePubKey } from '../../Functions/RelayFunctions/Users'
import NostrosAvatar from '../../Components/NostrosAvatar'
import { formatPubKey } from '../../Functions/RelayFunctions/Users'
import TextContent from '../../Components/TextContent'
import { getReactions } from '../../Functions/DatabaseFunctions/Reactions'
import { UserContext } from '../../Contexts/UserContext'
@ -29,6 +28,7 @@ import { navigate, push } from '../../lib/Navigation'
import { useFocusEffect } from '@react-navigation/native'
import { getNpub } from '../../lib/nostr/Nip19'
import { useTranslation } from 'react-i18next'
import ProfileData from '../../Components/ProfileData'
interface NotePageProps {
route: { params: { noteId: string } }
@ -46,7 +46,6 @@ export const NotePage: React.FC<NotePageProps> = ({ route }) => {
const [negaiveReactions, setNegativeReactions] = useState<number>(0)
const [userUpvoted, setUserUpvoted] = useState<boolean>(false)
const [userDownvoted, setUserDownvoted] = useState<boolean>(false)
const [timestamp, setTimestamp] = useState<string>()
const [profileCardPubkey, setProfileCardPubKey] = useState<string>()
const theme = useTheme()
const { t } = useTranslation('common')
@ -76,7 +75,6 @@ export const NotePage: React.FC<NotePageProps> = ({ route }) => {
const event = events[0]
setNote(event)
setNPub(getNpub(event.pubkey))
setTimestamp(moment.unix(event.created_at).format('L HH:mm'))
const notes = await getNotes(database, { filters: { reply_event_id: route.params.noteId } })
const rootReplies = getDirectReplies(event, notes)
@ -191,33 +189,16 @@ export const NotePage: React.FC<NotePageProps> = ({ route }) => {
<Surface elevation={1}>
<View style={styles.title}>
<TouchableRipple onPress={openProfileDrawer}>
<View style={styles.titleUser}>
<View>
<NostrosAvatar
name={note.name}
pubKey={nPub}
src={note.picture}
lud06={note.lnurl}
size={54}
/>
</View>
<View style={styles.titleUserData}>
<View style={styles.titleUser}>
<Text style={styles.titleUsername}>{usernamePubKey(note.name, nPub)}</Text>
{note?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
<Text>{timestamp}</Text>
</View>
</View>
<ProfileData
username={note?.name}
publicKey={note.pubkey}
validNip05={note?.valid_nip05}
nip05={note?.nip05}
lud06={note?.lnurl}
picture={note?.picture}
timestamp={note?.created_at}
avatarSize={54}
/>
</TouchableRipple>
<View>
<IconButton icon='dots-vertical' size={25} onPress={openProfileDrawer} />

View File

@ -16,7 +16,6 @@ import {
useTheme,
Snackbar,
} from 'react-native-paper'
import NostrosAvatar from '../../Components/NostrosAvatar'
import { AppContext } from '../../Contexts/AppContext'
import { UserContext } from '../../Contexts/UserContext'
import { RelayPoolContext } from '../../Contexts/RelayPoolContext'
@ -34,7 +33,7 @@ import ProfileCard from '../../Components/ProfileCard'
import { navigate } from '../../lib/Navigation'
import { useFocusEffect } from '@react-navigation/native'
import { getNpub } from '../../lib/nostr/Nip19'
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import ProfileData from '../../Components/ProfileData'
interface ProfilePageProps {
route: { params: { pubKey: string } }
@ -198,35 +197,15 @@ export const ProfilePage: React.FC<ProfilePageProps> = ({ route }) => {
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}
>
<Surface style={styles.container} elevation={1}>
<View style={styles.mainLayout}>
<View>
<NostrosAvatar
name={user?.name}
pubKey={getNpub(route.params.pubKey)}
src={user?.picture}
lud06={user?.lnurl}
size={54}
/>
</View>
<View>
<View style={styles.userData}>
<View style={styles.userName}>
<Text variant='titleMedium'>{user && username(user)}</Text>
{user?.valid_nip05 ? (
<MaterialCommunityIcons
name='check-decagram-outline'
size={14}
color={theme.colors.onPrimaryContainer}
style={styles.verifyIcon}
/>
) : (
<></>
)}
</View>
<Text>{user?.nip05}</Text>
</View>
</View>
</View>
<ProfileData
username={user?.name}
publicKey={route.params.pubKey}
validNip05={user?.valid_nip05}
nip05={user?.nip05}
lud06={user?.lnurl}
picture={user?.picture}
avatarSize={54}
/>
<View>
<Text>{user?.about}</Text>
</View>

View File

@ -8,13 +8,12 @@ import moment from 'moment'
import { Note } from '../../Functions/DatabaseFunctions/Notes'
import { getETags, getTaggedPubKeys } from '../../Functions/RelayFunctions/Events'
import { getUsers, User } from '../../Functions/DatabaseFunctions/Users'
import { formatPubKey, username } from '../../Functions/RelayFunctions/Users'
import { formatPubKey } from '../../Functions/RelayFunctions/Users'
import { Button, Switch, Text, TextInput, TouchableRipple } from 'react-native-paper'
import { UserContext } from '../../Contexts/UserContext'
import NostrosAvatar from '../../Components/NostrosAvatar'
import { goBack } from '../../lib/Navigation'
import { getNpub } from '../../lib/nostr/Nip19'
import { Kind } from 'nostr-tools'
import ProfileData from '../../Components/ProfileData'
interface SendPageProps {
route: { params: { note: Note } | undefined }
@ -37,7 +36,7 @@ export const SendPage: React.FC<SendPageProps> = ({ route }) => {
}, [lastConfirmationtId])
const onChangeText: (text: string) => void = (text) => {
const match = text.match(/@(.*)$/)
const match = text.match(/.*@(.*)$/)
const note: Note | undefined = route.params?.note
if (database && match && match?.length > 0) {
let request = getUsers(database, { name: match[1], order: 'contact DESC,name ASC' })
@ -111,7 +110,7 @@ export const SendPage: React.FC<SendPageProps> = ({ route }) => {
setContent((prev) => {
const splitText = prev.split('@')
splitText.pop()
return `${splitText.join('@')}${mentionText(user)}`
return `${splitText.join('@')}${mentionText(user)} `
})
setUserSuggestions([])
}
@ -119,19 +118,15 @@ export const SendPage: React.FC<SendPageProps> = ({ route }) => {
const renderContactItem: (item: User, index: number) => JSX.Element = (item, index) => (
<TouchableRipple onPress={() => addUserMention(item)}>
<View key={index} style={styles.contactRow}>
<View style={styles.contactInfo}>
<NostrosAvatar
name={item.name}
pubKey={getNpub(item.id)}
src={item.picture}
lud06={item.lnurl}
size={34}
/>
<View style={styles.contactName}>
<Text>{formatPubKey(item.id)}</Text>
{item.name && <Text variant='titleSmall'>{username(item)}</Text>}
</View>
</View>
<ProfileData
username={item?.name}
publicKey={item?.id}
validNip05={item?.valid_nip05}
nip05={item?.nip05}
lud06={item?.lnurl}
picture={item?.picture}
avatarSize={34}
/>
<View style={styles.contactFollow}>
<Text>{item.contact ? t('sendPage.isContact') : t('sendPage.isNotContact')}</Text>
</View>
@ -203,9 +198,12 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
width: '100%',
},
contactName: {
contactData: {
paddingLeft: 16,
},
contactName: {
flexDirection: 'row',
},
contactInfo: {
flexDirection: 'row',
alignContent: 'center',
@ -224,6 +222,10 @@ const styles = StyleSheet.create({
send: {
padding: 16,
},
verifyIcon: {
paddingTop: 4,
paddingLeft: 5,
},
})
export default SendPage