index.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { reactive, h } from 'vue'
  2. import PtcDialog from './Dialog.vue'
  3. import { mountComponent } from '../utils/mount-component'
  4. interface DialogProps {
  5. visible: boolean
  6. title?: string
  7. content?: string
  8. showCancel?: boolean
  9. cancelText?: string
  10. confirmText?: string
  11. }
  12. type DialogOptions = Omit<DialogProps, 'visible'> & {
  13. onCancel?(): void
  14. onConfirm?(): void
  15. }
  16. interface DialogExposed {
  17. open(options: DialogOptions): void
  18. }
  19. const defaultOptions: Partial<DialogOptions> = {
  20. showCancel: false,
  21. cancelText: 'CANCEL',
  22. confirmText: 'OK',
  23. }
  24. let instance: DialogExposed | undefined
  25. function getInstance() {
  26. if (!instance) {
  27. instance = mountComponent<DialogExposed>({
  28. setup(props, { expose }) {
  29. const state = reactive<DialogProps>({ visible: false })
  30. const attrs = {
  31. 'onUpdate:visible': (v: boolean) => {
  32. state.visible = v
  33. },
  34. }
  35. const open = (options: DialogOptions) => {
  36. state.visible = true
  37. Object.assign(state, { ...defaultOptions, ...options })
  38. }
  39. expose({ open })
  40. return () => h(PtcDialog, { ...state, ...attrs })
  41. },
  42. }).instance
  43. }
  44. return instance
  45. }
  46. export default function Dialog(options: DialogOptions) {
  47. return new Promise((resolve, reject) => {
  48. getInstance().open({
  49. ...options,
  50. onCancel: reject,
  51. onConfirm: () => resolve('ok'),
  52. })
  53. })
  54. }
  55. Dialog.alert = (title: string, content: string, options?: DialogOptions) =>
  56. Dialog({ title, content, ...options })
  57. Dialog.confirm = (title: string, content: string, options?: DialogOptions) =>
  58. Dialog({ title, content, showCancel: true, ...options })
  59. const win: any = window
  60. win.Dialog = Dialog