feat: improve stamp selector (#400)
This commit is contained in:
@@ -22,6 +22,7 @@ const navBarItems = [
|
|||||||
label: 'Files',
|
label: 'Files',
|
||||||
path: ROUTES.UPLOAD,
|
path: ROUTES.UPLOAD,
|
||||||
icon: FileText,
|
icon: FileText,
|
||||||
|
pathMatcherSubstring: '/files/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Account',
|
label: 'Account',
|
||||||
|
|||||||
@@ -1,13 +1,27 @@
|
|||||||
import { createStyles, FormHelperText, makeStyles, MenuItem, Select as SimpleSelect, Theme } from '@material-ui/core'
|
import { createStyles, FormHelperText, makeStyles, MenuItem, Select as MuiSelect, Theme } from '@material-ui/core'
|
||||||
import { Field } from 'formik'
|
import { Field } from 'formik'
|
||||||
import { Select } from 'formik-material-ui'
|
import { Select } from 'formik-material-ui'
|
||||||
import { ReactElement } from 'react'
|
import { ReactElement, ReactNode } from 'react'
|
||||||
|
|
||||||
export type SelectEvent = React.ChangeEvent<{
|
export type SelectEvent = React.ChangeEvent<{
|
||||||
name?: string | undefined
|
name?: string | undefined
|
||||||
value: unknown
|
value: unknown
|
||||||
}>
|
}>
|
||||||
|
|
||||||
|
function renderValue(value: unknown): ReactNode {
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
const label = Reflect.get(value as object, 'label')
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
return label
|
||||||
|
}
|
||||||
|
|
||||||
|
return value as ReactNode
|
||||||
|
}
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
label?: string
|
label?: string
|
||||||
name?: string
|
name?: string
|
||||||
@@ -15,6 +29,7 @@ interface Props {
|
|||||||
onChange?: (event: SelectEvent) => void
|
onChange?: (event: SelectEvent) => void
|
||||||
formik?: boolean
|
formik?: boolean
|
||||||
defaultValue?: string
|
defaultValue?: string
|
||||||
|
placeholder?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const useStyles = makeStyles((theme: Theme) =>
|
const useStyles = makeStyles((theme: Theme) =>
|
||||||
@@ -37,7 +52,15 @@ const useStyles = makeStyles((theme: Theme) =>
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
export function SwarmSelect({ defaultValue, formik, name, options, onChange, label }: Props): ReactElement {
|
export function SwarmSelect({
|
||||||
|
defaultValue,
|
||||||
|
formik,
|
||||||
|
name,
|
||||||
|
options,
|
||||||
|
onChange,
|
||||||
|
label,
|
||||||
|
placeholder,
|
||||||
|
}: Props): ReactElement {
|
||||||
const classes = useStyles()
|
const classes = useStyles()
|
||||||
|
|
||||||
if (formik) {
|
if (formik) {
|
||||||
@@ -50,9 +73,10 @@ export function SwarmSelect({ defaultValue, formik, name, options, onChange, lab
|
|||||||
name={name}
|
name={name}
|
||||||
fullWidth
|
fullWidth
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
defaultValue={defaultValue || ''}
|
defaultValue={defaultValue}
|
||||||
className={classes.select}
|
className={classes.select}
|
||||||
placeholder={label}
|
displayEmpty
|
||||||
|
renderValue={(value: unknown) => (value ? renderValue(value) : placeholder)}
|
||||||
MenuProps={{ MenuListProps: { disablePadding: true }, PaperProps: { square: true } }}
|
MenuProps={{ MenuListProps: { disablePadding: true }, PaperProps: { square: true } }}
|
||||||
>
|
>
|
||||||
{options.map((x, i) => (
|
{options.map((x, i) => (
|
||||||
@@ -68,15 +92,16 @@ export function SwarmSelect({ defaultValue, formik, name, options, onChange, lab
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{label && <FormHelperText>{label}</FormHelperText>}
|
{label && <FormHelperText>{label}</FormHelperText>}
|
||||||
<SimpleSelect
|
<MuiSelect
|
||||||
required
|
required
|
||||||
name={name}
|
name={name}
|
||||||
fullWidth
|
fullWidth
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
className={classes.select}
|
className={classes.select}
|
||||||
defaultValue={defaultValue || ''}
|
defaultValue={defaultValue}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
placeholder={label}
|
displayEmpty
|
||||||
|
renderValue={(value: unknown) => (value ? renderValue(value) : placeholder)}
|
||||||
MenuProps={{ MenuListProps: { disablePadding: true }, PaperProps: { square: true } }}
|
MenuProps={{ MenuListProps: { disablePadding: true }, PaperProps: { square: true } }}
|
||||||
>
|
>
|
||||||
{options.map((x, i) => (
|
{options.map((x, i) => (
|
||||||
@@ -84,7 +109,7 @@ export function SwarmSelect({ defaultValue, formik, name, options, onChange, lab
|
|||||||
{x.label}
|
{x.label}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
))}
|
))}
|
||||||
</SimpleSelect>
|
</MuiSelect>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export function Upload(): ReactElement {
|
|||||||
const [isUploading, setUploading] = useState(false)
|
const [isUploading, setUploading] = useState(false)
|
||||||
const [showPasswordPrompt, setShowPasswordPrompt] = useState(false)
|
const [showPasswordPrompt, setShowPasswordPrompt] = useState(false)
|
||||||
|
|
||||||
const { refresh } = useContext(StampsContext)
|
const { stamps, refresh } = useContext(StampsContext)
|
||||||
const { beeApi, beeDebugApi } = useContext(SettingsContext)
|
const { beeApi, beeDebugApi } = useContext(SettingsContext)
|
||||||
const { files, setFiles, uploadOrigin, metadata, previewUri, previewBlob } = useContext(FileContext)
|
const { files, setFiles, uploadOrigin, metadata, previewUri, previewBlob } = useContext(FileContext)
|
||||||
const { identities, setIdentities } = useContext(IdentityContext)
|
const { identities, setIdentities } = useContext(IdentityContext)
|
||||||
@@ -40,6 +40,8 @@ export function Upload(): ReactElement {
|
|||||||
const { enqueueSnackbar } = useSnackbar()
|
const { enqueueSnackbar } = useSnackbar()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
|
|
||||||
|
const hasAnyStamps = stamps !== null && stamps.length > 0
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
refresh()
|
refresh()
|
||||||
}, []) // eslint-disable-line react-hooks/exhaustive-deps
|
}, []) // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
@@ -180,7 +182,7 @@ export function Upload(): ReactElement {
|
|||||||
{step === 1 && (
|
{step === 1 && (
|
||||||
<>
|
<>
|
||||||
<Box mb={2}>
|
<Box mb={2}>
|
||||||
{stampMode === 'SELECT' ? (
|
{hasAnyStamps && stampMode === 'SELECT' ? (
|
||||||
<PostageStampSelector onSelect={stamp => setStamp(stamp)} defaultValue={stamp?.batchID} />
|
<PostageStampSelector onSelect={stamp => setStamp(stamp)} defaultValue={stamp?.batchID} />
|
||||||
) : (
|
) : (
|
||||||
<PostageStampCreation onFinished={() => setStampMode('SELECT')} />
|
<PostageStampCreation onFinished={() => setStampMode('SELECT')} />
|
||||||
@@ -210,6 +212,7 @@ export function Upload(): ReactElement {
|
|||||||
onUpload={onUpload}
|
onUpload={onUpload}
|
||||||
isUploading={isUploading}
|
isUploading={isUploading}
|
||||||
hasStamp={Boolean(stamp)}
|
hasStamp={Boolean(stamp)}
|
||||||
|
hasAnyStamps={hasAnyStamps}
|
||||||
uploadLabel={identity ? 'Update Feed' : 'Upload To Your Node'}
|
uploadLabel={identity ? 'Update Feed' : 'Upload To Your Node'}
|
||||||
stampMode={stampMode}
|
stampMode={stampMode}
|
||||||
setStampMode={setStampMode}
|
setStampMode={setStampMode}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ interface Props {
|
|||||||
onProceed: () => void
|
onProceed: () => void
|
||||||
isUploading: boolean
|
isUploading: boolean
|
||||||
hasStamp: boolean
|
hasStamp: boolean
|
||||||
|
hasAnyStamps: boolean
|
||||||
uploadLabel: string
|
uploadLabel: string
|
||||||
stampMode: 'BUY' | 'SELECT'
|
stampMode: 'BUY' | 'SELECT'
|
||||||
setStampMode: (mode: 'BUY' | 'SELECT') => void
|
setStampMode: (mode: 'BUY' | 'SELECT') => void
|
||||||
@@ -26,6 +27,7 @@ export function UploadActionBar({
|
|||||||
onProceed,
|
onProceed,
|
||||||
isUploading,
|
isUploading,
|
||||||
hasStamp,
|
hasStamp,
|
||||||
|
hasAnyStamps,
|
||||||
uploadLabel,
|
uploadLabel,
|
||||||
stampMode,
|
stampMode,
|
||||||
setStampMode,
|
setStampMode,
|
||||||
@@ -62,6 +64,7 @@ export function UploadActionBar({
|
|||||||
</SwarmButton>
|
</SwarmButton>
|
||||||
</ExpandableListItemActions>
|
</ExpandableListItemActions>
|
||||||
<SwarmButton
|
<SwarmButton
|
||||||
|
disabled={stampMode === 'BUY' && !hasAnyStamps}
|
||||||
onClick={() => setStampMode(stampMode === 'BUY' ? 'SELECT' : 'BUY')}
|
onClick={() => setStampMode(stampMode === 'BUY' ? 'SELECT' : 'BUY')}
|
||||||
iconType={stampMode === 'BUY' ? Layers : PlusSquare}
|
iconType={stampMode === 'BUY' ? Layers : PlusSquare}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { ReactElement, useContext } from 'react'
|
import { ReactElement, useContext } from 'react'
|
||||||
import { SwarmSelect } from '../../components/SwarmSelect'
|
import { SwarmSelect } from '../../components/SwarmSelect'
|
||||||
import { Context, EnrichedPostageBatch } from '../../providers/Stamps'
|
import { Context, EnrichedPostageBatch } from '../../providers/Stamps'
|
||||||
|
|
||||||
@@ -26,6 +26,7 @@ export function PostageStampSelector({ onSelect, defaultValue }: Props): ReactEl
|
|||||||
options={(stamps || []).map(x => ({ label: x.batchID.slice(0, 8), value: x.batchID }))}
|
options={(stamps || []).map(x => ({ label: x.batchID.slice(0, 8), value: x.batchID }))}
|
||||||
onChange={event => onChange(event.target.value as string)}
|
onChange={event => onChange(event.target.value as string)}
|
||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
|
placeholder="Please select a postage stamp..."
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user