import React, { useContext, useState } from 'react'; import { Button, Grid, List, ListItem, Paper, TextField, Typography } from '@mui/material'; import SettingsForm from '../../components/SettingsForm'; import { AppContext, type UseAppStoreType } from '../../contexts/AppContext'; import FederationTable from '../../components/FederationTable'; import { t } from 'i18next'; import { FederationContext, type UseFederationStoreType } from '../../contexts/FederationContext'; const SettingsPage = (): JSX.Element => { const { windowSize, navbarHeight } = useContext(AppContext); const { federation, addNewCoordinator } = useContext(FederationContext); const maxHeight = (windowSize.height * 0.65) const [newAlias, setNewAlias] = useState(''); const [newUrl, setNewUrl] = useState(''); const [error, setError] = useState(); // Regular expression to match a valid .onion URL const onionUrlPattern = /^((http|https):\/\/)?[a-zA-Z2-7]{16,56}\.onion$/; const addCoordinator: () => void = () => { if (federation.coordinators[newAlias]) { setError(t('Alias already exists')); } else { if (onionUrlPattern.test(newUrl)) { let fullNewUrl = newUrl; if (!/^((http|https):\/\/)/.test(fullNewUrl)) { fullNewUrl = `http://${newUrl}`; } addNewCoordinator(newAlias, fullNewUrl); setNewAlias(''); setNewUrl(''); } else { setError(t('Invalid Onion URL')); } } }; return ( {error} { setNewAlias(e.target.value); }} /> { setNewUrl(e.target.value); }} /> ); }; export default SettingsPage;