mirror of
https://github.com/KoalaSat/nostros.git
synced 2024-09-29 06:30:47 +00:00
refactor user data
This commit is contained in:
parent
1a32a5c9a2
commit
4956440245
@ -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 && (
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
78
frontend/Components/ProfileData/index.tsx
Normal file
78
frontend/Components/ProfileData/index.tsx
Normal 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
|
@ -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
|
||||
`
|
||||
|
@ -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,
|
||||
|
@ -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')}
|
||||
|
@ -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
|
||||
|
@ -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} />
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user