mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-16 13:08:06 +01:00
51 lines
1.1 KiB
TypeScript
51 lines
1.1 KiB
TypeScript
import { ref, inject } from 'vue'
|
|
import type { ShallowRef, Component, InjectionKey } from 'vue'
|
|
import { createSharedComposable } from '@vueuse/core'
|
|
import type { ComponentProps } from '../types/component'
|
|
import type { Modal, ModalState } from '../types/modal'
|
|
|
|
export const modalInjectionKey: InjectionKey<ShallowRef<ModalState>> = Symbol('nuxt-ui.modal')
|
|
|
|
function _useModal () {
|
|
const modalState = inject(modalInjectionKey)
|
|
|
|
const isOpen = ref(false)
|
|
|
|
function open<T extends Component> (component: T, props?: Modal & ComponentProps<T>) {
|
|
modalState.value = {
|
|
component,
|
|
props: props ?? {}
|
|
}
|
|
isOpen.value = true
|
|
}
|
|
|
|
function close () {
|
|
isOpen.value = false
|
|
modalState.value = {
|
|
component: 'div',
|
|
props: {}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Allows updating the modal props
|
|
*/
|
|
function patch <T extends Component = {}> (props: Partial<Modal & ComponentProps<T>>) {
|
|
modalState.value = {
|
|
...modalState.value,
|
|
props: {
|
|
...modalState.value.props,
|
|
...props
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
isOpen,
|
|
open,
|
|
close,
|
|
patch
|
|
}
|
|
}
|
|
|
|
export const useModal = createSharedComposable(_useModal) |