Skip to main content

Modal Dialogs

This recipe demonstrates how to use ScopeProvider to create isolated service instances for modal dialogs.

Isolated Modal Services

import { Injectable, InjectableScope } from '@navios/di'
import { ScopeProvider, useService } from '@navios/di-react'

@Injectable({ scope: InjectableScope.Request })
class ModalService {
private isOpen = false

open() {
this.isOpen = true
}

close() {
this.isOpen = false
}

getIsOpen() {
return this.isOpen
}
}

function Modal({ isOpen, onClose, children }) {
if (!isOpen) return null

return (
<ScopeProvider scopeId={`modal-${Date.now()}`}>
<ModalDialog onClose={onClose}>{children}</ModalDialog>
</ScopeProvider>
)
}

function ModalDialog({ onClose, children }) {
const { data: modalService } = useService(ModalService)

useEffect(() => {
modalService?.open()
return () => {
modalService?.close()
}
}, [modalService])

return (
<div className="modal">
<button onClick={onClose}>Close</button>
{children}
</div>
)
}