Make username settings button red if name empty, add sections to username settings, UI fixes to username settings, remove qs params from username settings

This commit is contained in:
artur 2024-02-19 10:37:06 +03:00
parent 4ad66c8711
commit ba3775e6c6
3 changed files with 38 additions and 33 deletions

View File

@ -13,27 +13,24 @@ import { DOMAIN } from '@/utils/consts'
import { fetchNip05 } from '@/utils/helpers/helpers' import { fetchNip05 } from '@/utils/helpers/helpers'
import { Stack, Typography, useTheme } from '@mui/material' import { Stack, Typography, useTheme } from '@mui/material'
import { ChangeEvent, Fragment, useCallback, useEffect, useState } from 'react' import { ChangeEvent, Fragment, useCallback, useEffect, useState } from 'react'
import { useSearchParams } from 'react-router-dom' import { useParams, useSearchParams } from 'react-router-dom'
import { useDebounce } from 'use-debounce' import { useDebounce } from 'use-debounce'
import { StyledSettingContainer } from './styled'
import { SectionTitle } from '@/shared/SectionTitle/SectionTitle'
export const ModalEditName = () => { export const ModalEditName = () => {
const keys = useAppSelector(selectKeys) const keys = useAppSelector(selectKeys)
const notify = useEnqueueSnackbar() const notify = useEnqueueSnackbar()
const { npub = '' } = useParams<{ npub: string }>()
const [searchParams, setSearchParams] = useSearchParams() const key = keys.find((k) => k.npub === npub)
const name = searchParams.get('name') || '' const name = key?.name || ''
const npub = searchParams.get('npub') || ''
const { palette } = useTheme() const { palette } = useTheme()
const { getModalOpened, createHandleCloseReplace } = useModalSearchParams() const { getModalOpened, createHandleCloseReplace } = useModalSearchParams()
const isModalOpened = getModalOpened(MODAL_PARAMS_KEYS.EDIT_NAME) const isModalOpened = getModalOpened(MODAL_PARAMS_KEYS.EDIT_NAME)
const handleCloseModal = createHandleCloseReplace(MODAL_PARAMS_KEYS.EDIT_NAME, { const handleCloseModal = createHandleCloseReplace(MODAL_PARAMS_KEYS.EDIT_NAME)
onClose: (search) => {
search.delete('name')
search.delete('npub')
},
})
const [enteredName, setEnteredName] = useState('') const [enteredName, setEnteredName] = useState('')
const [debouncedName] = useDebounce(enteredName, 300) const [debouncedName] = useDebounce(enteredName, 300)
@ -52,7 +49,7 @@ export const ModalEditName = () => {
try { try {
setIsChecking(true) setIsChecking(true)
const npubNip05 = await fetchNip05(`${debouncedName}@${DOMAIN}`) const npubNip05 = await fetchNip05(`${debouncedName}@${DOMAIN}`)
setIsAvailable(!npubNip05) setIsAvailable(!npubNip05 || npubNip05 === npub)
setIsChecking(false) setIsChecking(false)
} catch (error) { } catch (error) {
setIsAvailable(true) setIsAvailable(true)
@ -67,7 +64,10 @@ export const ModalEditName = () => {
useEffect(() => { useEffect(() => {
setEnteredName(name) setEnteredName(name)
return () => { return () => {
if (isModalOpened) setEnteredName('') if (isModalOpened) {
setEnteredName('')
setReceiverNpub('')
}
} }
// eslint-disable-next-line // eslint-disable-next-line
}, [isModalOpened]) }, [isModalOpened])
@ -101,17 +101,15 @@ export const ModalEditName = () => {
} }
const isEditButtonDisabled = isNameEqual || !isAvailable || isChecking || isLoading || !enteredName.trim().length const isEditButtonDisabled = isNameEqual || !isAvailable || isChecking || isLoading || !enteredName.trim().length
const isTransferButtonDisabled = !enteredName.trim().length || !receiverNpub.trim().length || isTransferLoading const isTransferButtonDisabled = !name.length || !receiverNpub.trim().length || isTransferLoading
const handleEditName = async () => { const handleEditName = async () => {
if (isEditButtonDisabled) return if (isEditButtonDisabled) return
try { try {
setIsLoading(true) setIsLoading(true)
await swicCall('editName', npub, enteredName) await swicCall('editName', npub, enteredName)
notify('Username successfully editted!', 'success') notify('Username updated!', 'success')
setIsLoading(false) setIsLoading(false)
searchParams.set('name', enteredName)
setSearchParams(searchParams)
} catch (error: any) { } catch (error: any) {
setIsLoading(false) setIsLoading(false)
notify(error?.message || 'Failed to edit username!', 'error') notify(error?.message || 'Failed to edit username!', 'error')
@ -123,20 +121,22 @@ export const ModalEditName = () => {
try { try {
setIsTransferLoading(true) setIsTransferLoading(true)
await swicCall('transferName', npub, enteredName, receiverNpub) await swicCall('transferName', npub, enteredName, receiverNpub)
notify('Npub successfully transfered!', 'success') notify('Username transferred!', 'success')
setIsTransferLoading(false) setIsTransferLoading(false)
setEnteredName('')
} catch (error: any) { } catch (error: any) {
setIsTransferLoading(false) setIsTransferLoading(false)
notify(error?.message || 'Failed to transfer npub!', 'error') notify(error?.message || 'Failed to transfer username!', 'error')
} }
} }
return ( return (
<Modal open={isModalOpened} title="Edit username" onClose={handleCloseModal}> <Modal open={isModalOpened} title="Username Settings" onClose={handleCloseModal}>
<Stack gap={'1rem'}> <Stack gap={'1rem'}>
<Stack gap={'1rem'}> <StyledSettingContainer>
<SectionTitle>Change name</SectionTitle>
<Input <Input
label="Username" label="User name"
fullWidth fullWidth
placeholder="Enter a Username" placeholder="Enter a Username"
endAdornment={<Typography color={'#FFFFFFA8'}>@{DOMAIN}</Typography>} endAdornment={<Typography color={'#FFFFFFA8'}>@{DOMAIN}</Typography>}
@ -152,10 +152,11 @@ export const ModalEditName = () => {
}} }}
/> />
<Button fullWidth disabled={isEditButtonDisabled} onClick={handleEditName}> <Button fullWidth disabled={isEditButtonDisabled} onClick={handleEditName}>
Edit name {isLoading && <LoadingSpinner />} Save name {isLoading && <LoadingSpinner />}
</Button> </Button>
</Stack> </StyledSettingContainer>
<Stack gap={'1rem'}> <StyledSettingContainer>
<SectionTitle>Transfer name</SectionTitle>
<Input <Input
label="Receiver npub" label="Receiver npub"
fullWidth fullWidth
@ -166,7 +167,7 @@ export const ModalEditName = () => {
<Button fullWidth onClick={handleTransferName} disabled={isTransferButtonDisabled}> <Button fullWidth onClick={handleTransferName} disabled={isTransferButtonDisabled}>
Transfer name Transfer name
</Button> </Button>
</Stack> </StyledSettingContainer>
</Stack> </Stack>
</Modal> </Modal>
) )

View File

@ -0,0 +1,10 @@
import { Stack, StackProps, styled } from "@mui/material";
export const StyledSettingContainer = styled((props: StackProps) => (
<Stack gap={'0.75rem'} component={'form'} {...props} />
))(({ theme }) => ({
padding: '1rem',
borderRadius: '1rem',
background: theme.palette.background.default,
color: theme.palette.text.primary,
}))

View File

@ -63,13 +63,7 @@ const KeyPage = () => {
const handleOpenConnectAppModal = () => handleOpen(MODAL_PARAMS_KEYS.CONNECT_APP) const handleOpenConnectAppModal = () => handleOpen(MODAL_PARAMS_KEYS.CONNECT_APP)
const handleOpenSettingsModal = () => handleOpen(MODAL_PARAMS_KEYS.SETTINGS) const handleOpenSettingsModal = () => handleOpen(MODAL_PARAMS_KEYS.SETTINGS)
const handleOpenEditNameModal = () => const handleOpenEditNameModal = () => handleOpen(MODAL_PARAMS_KEYS.EDIT_NAME)
handleOpen(MODAL_PARAMS_KEYS.EDIT_NAME, {
search: {
name: key.name || '',
npub,
},
})
return ( return (
<> <>
@ -82,7 +76,7 @@ const KeyPage = () => {
value={username} value={username}
endAdornment={ endAdornment={
<Box display={'flex'} alignItems={'center'} gap={'0.25rem'}> <Box display={'flex'} alignItems={'center'} gap={'0.25rem'}>
<IconButton onClick={handleOpenEditNameModal}> <IconButton onClick={handleOpenEditNameModal} color={username ? 'default' : 'error'}>
<MoreHorizRoundedIcon /> <MoreHorizRoundedIcon />
</IconButton> </IconButton>
<InputCopyButton value={username} /> <InputCopyButton value={username} />