Skip to content

Commit 8a9ffbe

Browse files
committed
refactor: update implement
1 parent 502ced1 commit 8a9ffbe

File tree

3 files changed

+40
-48
lines changed

3 files changed

+40
-48
lines changed

packages/vue-final-modal/src/Modal.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export type ComponentProps = ComponentPublicInstance['$props']
55
export type ModalId = number | string | symbol
66
export type StyleValue = string | CSSProperties | (string | CSSProperties)[]
77

8-
export type ModalSlot<T extends Record<string, any> = {}> = string | {
8+
export type ModalSlot<T extends Record<string, any> = {}> = string | Component | {
99
component: Component
1010
attrs?: T
1111
}
@@ -28,7 +28,7 @@ export type UseModalOptionsPrivate<
2828
resolveClosed?: () => void
2929
}
3030

31-
export type ModalOptions<
31+
export type UseModalOptions<
3232
ModalProps extends ComponentProps,
3333
DefaultSlotProps extends ComponentProps = {},
3434
> = Pick<
@@ -39,21 +39,11 @@ UseModalOptionsPrivate<ModalProps, DefaultSlotProps>,
3939
| 'slots'
4040
>
4141

42-
export type UseModalOptions<
43-
ModalProps extends ComponentProps,
44-
DefaultSlotProps extends ComponentProps = {},
45-
> = Omit<ModalOptions<ModalProps, DefaultSlotProps>, 'slots'> & {
46-
slots?: {
47-
default: ModalSlot<DefaultSlotProps> | Component
48-
[key: string]: ModalSlot | Component
49-
}
50-
}
51-
5242
export type UseModalReturnType<ModalProps extends ComponentProps, DefaultSlotProps extends ComponentProps> = {
53-
options: ModalOptions<ModalProps, DefaultSlotProps>
43+
options: UseModalOptions<ModalProps, DefaultSlotProps>
5444
open: () => Promise<string>
5545
close: () => Promise<string>
56-
patchOptions: (options: ModalOptions<ModalProps, DefaultSlotProps>) => void
46+
patchOptions: (options: UseModalOptions<ModalProps, DefaultSlotProps>) => void
5747
destroy: () => void
5848
}
5949

packages/vue-final-modal/src/components/ModalsContainer.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,13 @@ onBeforeUnmount(() => {
3030
<div v-if="isString(slot)" v-html="slot" />
3131
<component
3232
:is="slot.component"
33-
v-else
33+
v-else-if="'component' in slot"
3434
v-bind="slot.attrs"
3535
/>
36+
<component
37+
:is="slot"
38+
v-else
39+
/>
3640
</template>
3741
</component>
3842
</template>

packages/vue-final-modal/src/useApi.ts

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { tryOnUnmounted } from '@vueuse/core'
2-
import type { Component } from 'vue'
32
import { computed, inject, markRaw, reactive, useAttrs } from 'vue'
43
import type CoreModal from './components/CoreModal/CoreModal.vue'
54
import { internalVfmSymbol, vfmSymbol } from './injectionSymbols'
6-
import type { ComponentProps, InternalVfm, UseModalOptions, UseModalOptionsPrivate, UseModalReturnType, Vfm } from './Modal'
5+
import type { ComponentProps, InternalVfm, ModalSlot, UseModalOptions, UseModalOptionsPrivate, UseModalReturnType, Vfm } from './Modal'
76
import { isString } from './utils'
87

98
/**
@@ -21,47 +20,46 @@ export function useInternalVfm(): InternalVfm {
2120
return inject(internalVfmSymbol)!
2221
}
2322

23+
function withMarkRaw<
24+
ModalProps extends ComponentProps,
25+
DefaultSlotProps extends ComponentProps = {},
26+
>(options: UseModalOptions<ModalProps, DefaultSlotProps>) {
27+
const { component, slots: innerSlots, ...rest } = options
28+
29+
const slots = typeof innerSlots === 'undefined'
30+
? undefined
31+
: Object.fromEntries<ModalSlot>(Object.entries(innerSlots).map(([name, maybeComponent]) => {
32+
if (isString(maybeComponent))
33+
return [name, maybeComponent] as const
34+
35+
if ('component' in maybeComponent) {
36+
return [name, {
37+
...maybeComponent,
38+
component: markRaw(maybeComponent.component),
39+
}]
40+
}
41+
42+
return [name, markRaw(maybeComponent)]
43+
}))
44+
45+
return {
46+
...rest,
47+
component: markRaw(component),
48+
slots,
49+
}
50+
}
51+
2452
/**
2553
* Define a dynamic modal.
2654
*/
2755
function defineModal<
2856
ModalProps extends ComponentProps,
2957
DefaultSlotProps extends ComponentProps = {},
3058
>(_options: UseModalOptions<ModalProps, DefaultSlotProps>): UseModalReturnType<ModalProps, DefaultSlotProps> {
31-
const { component, slots: innerSlots, ...rest } = _options
32-
33-
const slots = typeof innerSlots !== 'undefined'
34-
? Object.fromEntries<string | {
35-
component: Component
36-
attrs?: any
37-
}>(
38-
Object.entries(innerSlots).map(([name, maybeComponent]) => {
39-
if (isString(maybeComponent))
40-
return [name, maybeComponent]
41-
42-
if ('component' in maybeComponent) {
43-
return [name, {
44-
component: markRaw(maybeComponent.component),
45-
attrs: maybeComponent.attrs,
46-
}] as const
47-
}
48-
49-
return [
50-
name,
51-
{
52-
component: markRaw(maybeComponent),
53-
},
54-
] as const
55-
}),
56-
)
57-
: undefined
58-
5959
const options = reactive({
6060
id: Symbol('useModal'),
6161
modelValue: false,
62-
component: markRaw(component),
63-
slots,
64-
...rest,
62+
...withMarkRaw(_options),
6563
}) as UseModalOptionsPrivate<ModalProps, DefaultSlotProps>
6664

6765
if (!options.context)

0 commit comments

Comments
 (0)