1
1
import { computed , inject , markRaw , nextTick , reactive , useAttrs } from 'vue'
2
2
import { tryOnUnmounted } from '@vueuse/core'
3
- import type { Component } from 'vue'
4
3
import VueFinalModal from './components/VueFinalModal/VueFinalModal.vue'
5
4
import type CoreModal from './components/CoreModal/CoreModal.vue'
6
5
import { internalVfmSymbol } from './injectionSymbols'
7
6
8
- import type { ComponentProps , Constructor , InternalVfm , ModalSlot , ModalSlotOptions , RawProps , UseModalOptions , UseModalOptionsPrivate , UseModalReturnType , Vfm } from './Modal'
7
+ import type { ComponentProps , ComponentType , InternalVfm , ModalSlot , ModalSlotOptions , UseModalOptions , UseModalOptionsPrivate , UseModalReturnType , Vfm } from './Modal'
9
8
import { activeVfm , getActiveVfm } from './plugin'
10
9
import { isString } from '~/utils'
11
10
@@ -34,7 +33,7 @@ export function useInternalVfm(): InternalVfm {
34
33
return inject ( internalVfmSymbol ) !
35
34
}
36
35
37
- function withMarkRaw < P > ( options : Partial < UseModalOptions < P > > , DefaultComponent : Component = VueFinalModal ) {
36
+ function withMarkRaw < T extends ComponentType > ( options : Partial < UseModalOptions < T > > , DefaultComponent : ComponentType = VueFinalModal ) {
38
37
const { component, slots : innerSlots , ...rest } = options
39
38
40
39
const slots = typeof innerSlots === 'undefined'
@@ -55,23 +54,23 @@ function withMarkRaw<P>(options: Partial<UseModalOptions<P>>, DefaultComponent:
55
54
56
55
return {
57
56
...rest ,
58
- component : markRaw ( component || DefaultComponent ) as Constructor < P > ,
57
+ component : markRaw ( component || DefaultComponent ) ,
59
58
slots,
60
59
}
61
60
}
62
61
63
62
/**
64
63
* Create a dynamic modal.
65
64
*/
66
- export function useModal < P = InstanceType < typeof VueFinalModal > [ '$props' ] > ( _options : UseModalOptions < P > ) : UseModalReturnType < P > {
65
+ export function useModal < T extends ComponentType = typeof VueFinalModal > ( _options : UseModalOptions < T > ) : UseModalReturnType < T > {
67
66
const options = reactive ( {
68
67
id : Symbol ( 'useModal' ) ,
69
68
modelValue : ! ! _options ?. defaultModelValue ,
70
69
resolveOpened : ( ) => { } ,
71
70
resolveClosed : ( ) => { } ,
72
71
attrs : { } ,
73
- ...withMarkRaw < P > ( _options ) ,
74
- } ) as UseModalOptions < P > & UseModalOptionsPrivate
72
+ ...withMarkRaw < T > ( _options ) ,
73
+ } ) as UseModalOptions < T > & UseModalOptionsPrivate
75
74
tryOnUnmounted ( ( ) => {
76
75
if ( ! options ?. keepAlive )
77
76
destroy ( )
@@ -122,7 +121,7 @@ export function useModal<P = InstanceType<typeof VueFinalModal>['$props']>(_opti
122
121
} )
123
122
}
124
123
125
- function patchOptions ( _options : Partial < UseModalOptions < P > > ) {
124
+ function patchOptions ( _options : Partial < UseModalOptions < T > > ) {
126
125
const { slots, ...rest } = withMarkRaw ( _options , options . component )
127
126
128
127
if ( _options . defaultModelValue !== undefined )
@@ -147,9 +146,9 @@ export function useModal<P = InstanceType<typeof VueFinalModal>['$props']>(_opti
147
146
}
148
147
}
149
148
150
- function patchComponentOptions < P > (
151
- options : UseModalOptions < P > | ModalSlotOptions ,
152
- newOptions : Partial < UseModalOptions < P > > | ModalSlotOptions ,
149
+ function patchComponentOptions < T extends ComponentType > (
150
+ options : UseModalOptions < T > | ModalSlotOptions ,
151
+ newOptions : Partial < UseModalOptions < T > > | ModalSlotOptions ,
153
152
) {
154
153
if ( newOptions . component )
155
154
options . component = newOptions . component
@@ -182,9 +181,9 @@ export function useModal<P = InstanceType<typeof VueFinalModal>['$props']>(_opti
182
181
}
183
182
}
184
183
185
- export function useModalSlot < P > ( options : {
186
- component : Constructor < P >
187
- attrs ?: ( RawProps & P ) | ( { } extends P ? null : never )
184
+ export function useModalSlot < T extends ComponentType > ( options : {
185
+ component : T
186
+ attrs ?: ComponentProps < T >
188
187
} ) {
189
188
return options
190
189
}
@@ -217,8 +216,8 @@ export function byPassAllModalEvents(emit?: InstanceType<typeof CoreModal>['$emi
217
216
}
218
217
219
218
export function useVfmAttrs ( options : {
220
- props : ComponentProps
221
- modalProps : ComponentProps
219
+ props : Record < any , any >
220
+ modalProps : Record < any , any >
222
221
emit ?: any
223
222
} ) {
224
223
const { props, modalProps, emit } = options
0 commit comments