Skip to main content

Dialogs

Please refer to MUI's official docs for more details on component's usage guide and API documentation.

Basic

Manage open prop with the help of a state.

Selected: user02@gmail.com

// React Imports
import { useState } from 'react'

// MUI Imports
import List from '@mui/material/List'
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import MuiAvatar from '@mui/material/Avatar'
import ListItem from '@mui/material/ListItem'
import Typography from '@mui/material/Typography'
import DialogTitle from '@mui/material/DialogTitle'
import ListItemText from '@mui/material/ListItemText'
import ListItemButton from '@mui/material/ListItemButton'
import ListItemAvatar from '@mui/material/ListItemAvatar'

// Component Imports
import CustomAvatar from '@core/components/mui/Avatar'

const emails = ['username@gmail.com', 'user02@gmail.com']

const DialogsBasic = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [selectedValue, setSelectedValue] = useState<string>(emails[1])

const handleClickOpen = () => setOpen(true)

const handleDialogClose = () => setOpen(false)

const handleClose = (value: string) => {
setOpen(false)
setSelectedValue(value)
}

return (
<div>
<Typography variant='subtitle1' className='mbe-2' color='text.primary'>
Selected: {selectedValue}
</Typography>
<Button variant='outlined' onClick={handleClickOpen}>
Open simple dialog
</Button>
<Dialog
onClose={handleDialogClose}
aria-labelledby='simple-dialog-title'
open={open}
closeAfterTransition={false}
>
<DialogTitle id='simple-dialog-title'>Set backup account</DialogTitle>
<List className='pt-0 px-0'>
{emails.map(email => (
<ListItem key={email} disablePadding onClick={() => handleClose(email)}>
<ListItemButton>
<ListItemAvatar>
<CustomAvatar color='primary' skin='light'>
<i className='bx-user' />
</CustomAvatar>
</ListItemAvatar>
<ListItemText primary={email} />
</ListItemButton>
</ListItem>
))}
<ListItem disablePadding onClick={() => handleClose('addAccount')}>
<ListItemButton>
<ListItemAvatar>
<MuiAvatar>
<i className='bx-plus' />
</MuiAvatar>
</ListItemAvatar>
<ListItemText primary='Add account' />
</ListItemButton>
</ListItem>
</List>
</Dialog>
</div>
)
}

export default DialogsBasic
Alerts

Show an alert to the user to convey something or make the user choose from the given options.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsAlert = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
onClose={handleClose}
aria-labelledby='alert-dialog-title'
aria-describedby='alert-dialog-description'
closeAfterTransition={false}
>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsAlert
Transitions

You can also use any of the transitions that you like. Use TransitionComponent prop for the transition.


// React Imports
import { forwardRef, useState } from 'react'
import type { ReactElement, Ref } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'
import Slide from '@mui/material/Slide'
import type { SlideProps } from '@mui/material/Slide'

const Transition = forwardRef(function Transition(
props: SlideProps & { children?: ReactElement<any, any> },
ref: Ref<unknown>
) {
return <Slide direction='up' ref={ref} {...props} />
})

const DialogsTransition = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Slide in alert dialog
</Button>
<Dialog
open={open}
keepMounted
onClose={handleClose}
TransitionComponent={Transition}
aria-labelledby='alert-dialog-slide-title'
aria-describedby='alert-dialog-slide-description'
closeAfterTransition={false}
>
<DialogTitle id='alert-dialog-slide-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-slide-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsTransition
Form Dialog

Form dialogs allow users to fill out form fields within a dialog.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

// Component Imports
import CustomTextField from '@core/components/mui/TextField'

const DialogsForm = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open form dialog
</Button>
<Dialog open={open} onClose={handleClose} aria-labelledby='form-dialog-title' closeAfterTransition={false}>
<DialogTitle id='form-dialog-title'>Subscribe</DialogTitle>
<DialogContent>
<DialogContentText className='mbe-3'>
To subscribe to this website, please enter your email address here. We will send updates occasionally.
</DialogContentText>
<CustomTextField id='name' autoFocus fullWidth type='email' label='Email Address' />
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsForm
Customized Dialog

You can customize the component the way you want using styled hook.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import Typography from '@mui/material/Typography'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'

// Component Imports
import DialogCloseButton from '@components/dialogs/DialogCloseButton'

const DialogsCustomized = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
onClose={handleClose}
aria-labelledby='customized-dialog-title'
open={open}
closeAfterTransition={false}
PaperProps={{ sx: { overflow: 'visible' } }}
>
<DialogTitle id='customized-dialog-title'>
<Typography variant='h5' component='span'>
Modal title
</Typography>
<DialogCloseButton onClick={handleClose} disableRipple>
<i className='bx-x' />
</DialogCloseButton>
</DialogTitle>
<DialogContent>
<Typography>
Chupa chups jelly-o candy sweet roll wafer cake chocolate bar. Brownie sweet roll topping cake chocolate
cake cheesecake tiramisu chocolate cake. Jujubes liquorice chocolate bar pastry. Chocolate jujubes caramels
pastry. Ice cream marshmallow dragée bonbon croissant. Carrot cake sweet donut ice cream bonbon oat cake
danish sugar plum. Gingerbread gummies marzipan gingerbread.
</Typography>
</DialogContent>
<DialogActions>
<Button onClick={handleClose} variant='tonal' color='secondary'>
Close
</Button>
<Button onClick={handleClose} variant='contained'>
Save changes
</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsCustomized
Full Screen Dialog

Add fullScreen prop with Dialog component for a full screen dialog.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsFullScreen = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
fullScreen
onClose={handleClose}
aria-labelledby='full-screen-dialog-title'
open={open}
closeAfterTransition={false}
>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsFullScreen
Optional Sizes

You can set a dialog maximum width by using the maxWidth enumerable in combination with the fullWidth boolean. When thefullWidth property is true, the dialog will adapt based on the maxWidth value.


// React Imports
import { useState } from 'react'
import type { ChangeEvent } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Switch from '@mui/material/Switch'
import Dialog from '@mui/material/Dialog'
import MenuItem from '@mui/material/MenuItem'
import { styled } from '@mui/material/styles'
import DialogTitle from '@mui/material/DialogTitle'
import DialogActions from '@mui/material/DialogActions'
import DialogContent from '@mui/material/DialogContent'
import FormControlLabel from '@mui/material/FormControlLabel'
import DialogContentText from '@mui/material/DialogContentText'
import type { SelectChangeEvent } from '@mui/material/Select'
import type { Breakpoint } from '@mui/material/styles'

// Component Imports
import CustomTextField from '@core/components/mui/TextField'

// Styled component for the form
const Form = styled('form')({
margin: 'auto',
display: 'flex',
width: 'fit-content',
flexDirection: 'column'
})

const DialogsSizes = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [fullWidth, setFullWidth] = useState<boolean>(true)
const [maxWidth, setMaxWidth] = useState<Breakpoint>('sm')

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

const handleMaxWidthChange = (event: SelectChangeEvent) => {
setMaxWidth(event.target.value as Breakpoint)
}

const handleFullWidthChange = (event: ChangeEvent<HTMLInputElement>) => {
setFullWidth(event.target.checked)
}

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
maxWidth={maxWidth}
fullWidth={fullWidth}
onClose={handleClose}
aria-labelledby='max-width-dialog-title'
closeAfterTransition={false}
>
<DialogTitle id='max-width-dialog-title'>Optional sizes</DialogTitle>
<DialogContent>
<DialogContentText className='mbe-4'>
You can set my maximum width and whether to adapt or not.
</DialogContentText>
<Form noValidate>
<CustomTextField
select
label='maxWidth'
value={maxWidth}
slotProps={{
select: { onChange: handleMaxWidthChange },
htmlInput: {
name: 'max-width',
id: 'max-width'
}
}}
>
<MenuItem value={false as any}>false</MenuItem>
<MenuItem value='xs'>xs</MenuItem>
<MenuItem value='sm'>sm</MenuItem>
<MenuItem value='md'>md</MenuItem>
<MenuItem value='lg'>lg</MenuItem>
<MenuItem value='xl'>xl</MenuItem>
</CustomTextField>
<FormControlLabel
label='Full width'
className='mbs-2'
control={<Switch checked={fullWidth} onChange={handleFullWidthChange} />}
/>
</Form>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Close</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsSizes
Responsive full-screen

Make a full screen dialog at particular screen sizes only by using useMediaQuery hook.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import useMediaQuery from '@mui/material/useMediaQuery'
import DialogActions from '@mui/material/DialogActions'
import DialogContent from '@mui/material/DialogContent'
import DialogContentText from '@mui/material/DialogContentText'
import { useTheme } from '@mui/material/styles'

const DialogsRespoFullScreen = () => {
// States
const [open, setOpen] = useState<boolean>(false)

// Hooks
const theme = useTheme()
const fullScreen = useMediaQuery(theme.breakpoints.down('sm'))

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open responsive dialog
</Button>
<Dialog
fullScreen={fullScreen}
open={open}
onClose={handleClose}
aria-labelledby='responsive-dialog-title'
closeAfterTransition={false}
>
<DialogTitle id='responsive-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsRespoFullScreen
Confirmation Dialog

Use disableEscapeKeyDown prop to disable 'Escape' key and use onClose prop to disable the backdrop.


// React Imports
import { useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsConfirmation = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
disableEscapeKeyDown
aria-labelledby='alert-dialog-title'
aria-describedby='alert-dialog-description'
onClose={(event, reason) => {
if (reason !== 'backdropClick') {
handleClose()
}
}}
closeAfterTransition={false}
>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsConfirmation
Scrolling Long Content

scroll=paper scrolls within the paper element and scroll=body scrolls within the body element.


// React Imports
import { useEffect, useRef, useState } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'
import type { DialogProps } from '@mui/material/Dialog'

// Third-party Imports
import classnames from 'classnames'

const DialogsScroll = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [scroll, setScroll] = useState<DialogProps['scroll']>('paper')

// Refs
const descriptionElementRef = useRef<HTMLElement>(null)

const handleClickOpen = (scrollType: DialogProps['scroll']) => () => {
setOpen(true)
setScroll(scrollType)
}

const handleClose = () => setOpen(false)

useEffect(() => {
if (open) {
const { current: descriptionElement } = descriptionElementRef

if (descriptionElement !== null) {
descriptionElement.focus()
}
}
}, [open])

return (
<div className='flex gap-4'>
<Button variant='outlined' onClick={handleClickOpen('paper')}>
scroll=paper
</Button>
<Button variant='outlined' onClick={handleClickOpen('body')}>
scroll=body
</Button>
<Dialog
open={open}
scroll={scroll}
onClose={handleClose}
aria-labelledby='scroll-dialog-title'
aria-describedby='scroll-dialog-description'
closeAfterTransition={false}
>
<DialogTitle id='scroll-dialog-title'>Subscribe</DialogTitle>
<DialogContent dividers={scroll === 'paper'}>
<DialogContentText id='scroll-dialog-description' ref={descriptionElementRef} tabIndex={-1}>
{[...new Array(50)].map(
() =>
`Cotton candy sesame snaps toffee chupa chups caramels. Candy icing gummi bears pastry cake icing brownie
oat cake. Tootsie roll biscuit chupa chups apple pie muffin jelly-o caramels. Muffin chocolate bar sweet
cookie chupa chups.`
)}
</DialogContentText>
</DialogContent>
<DialogActions className={classnames('dialog-actions-dense', { '!pt-3': scroll === 'paper' })}>
<Button onClick={handleClose}>Cancel</Button>
<Button onClick={handleClose}>Subscribe</Button>
</DialogActions>
</Dialog>
</div>
)
}

export default DialogsScroll