import React, { useContext, useState } from 'react' import { Clipboard, FlatList, ListRenderItem, ScrollView, StyleSheet, View } from 'react-native' import { useTranslation } from 'react-i18next' import { RelayPoolContext } from '../../Contexts/RelayPoolContext' import { Relay } from '../../Functions/DatabaseFunctions/Relays' import { defaultRelays, REGEX_SOCKET_LINK } from '../../Constants/Relay' import { List, Switch, AnimatedFAB, useTheme, Text, Button, TextInput, IconButton, Divider, Snackbar, } from 'react-native-paper' import RBSheet from 'react-native-raw-bottom-sheet' export const RelaysPage: React.FC = () => { const defaultRelayInput = React.useMemo(() => 'wss://', []) const { addRelayItem, removeRelayItem, relays } = useContext(RelayPoolContext) const { t } = useTranslation('common') const theme = useTheme() const bottomSheetAddRef = React.useRef(null) const bottomSheetEditRef = React.useRef(null) const [selectedRelay, setSelectedRelay] = useState() const [addRelayInput, setAddRelayInput] = useState(defaultRelayInput) const [showNotification, setShowNotification] = useState() const addRelay: (url: string) => void = (url) => { addRelayItem({ url, }).then(() => { setShowNotification('add') }) } const removeRelay: (url: string) => void = (url) => { removeRelayItem({ url, }).then(() => { setShowNotification('remove') }) } const onPressAddRelay: () => void = () => { if (REGEX_SOCKET_LINK.test(addRelayInput)) { bottomSheetAddRef.current?.close() setAddRelayInput(defaultRelayInput) } else { bottomSheetAddRef.current?.close() setShowNotification('badFormat') } } const defaultList: () => Relay[] = () => { return defaultRelays .filter((url) => !relays?.find((item) => item.url === url)) .map((url) => { return { url, } }) } const relayToggle: (relay: Relay) => JSX.Element = (relay) => { const active = relays?.some((item) => item.url === relay.url) const onValueChange: () => void = () => { active ? removeRelay(relay.url) : addRelay(relay.url) } return } const renderItem: ListRenderItem = ({ index, item }) => ( relayToggle(item)} onPress={() => { setSelectedRelay(item) bottomSheetEditRef.current?.open() }} /> ) const rbSheetCustomStyles = React.useMemo(() => { return { container: { backgroundColor: theme.colors.background, padding: 16, borderTopRightRadius: 28, borderTopLeftRadius: 28, }, } }, []) return ( bottomSheetAddRef.current?.open()} animateFrom='right' iconMode='static' extended={false} /> {showNotification && ( setShowNotification(undefined)} onDismiss={() => setShowNotification(undefined)} > {t(`relaysPage.notifications.${showNotification}`)} )} { if (selectedRelay) removeRelay(selectedRelay.url) bottomSheetEditRef.current?.close() }} /> {t('relaysPage.removeRelay')} { if (selectedRelay) Clipboard.setString(selectedRelay.url) }} /> {t('relaysPage.copyRelay')} {selectedRelay?.url.split('wss://')[1]?.split('/')[0]} ) } const styles = StyleSheet.create({ container: { padding: 0, paddingBottom: 32, }, list: { padding: 0, paddingBottom: 45, }, snackbar: { margin: 16, bottom: 70, }, fab: { bottom: 16, right: 16, position: 'absolute', }, relayActions: { flexDirection: 'row', }, actionButton: { justifyContent: 'center', alignItems: 'center', width: 80, }, divider: { marginBottom: 26, marginTop: 26, }, }) export default RelaysPage