index.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * @Author: weisheng
  3. * @Date: 2022-12-14 17:33:21
  4. * @LastEditTime: 2024-12-05 13:23:17
  5. * @LastEditors: weisheng
  6. * @Description:
  7. * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-message-box\index.ts
  8. * 记得注释
  9. */
  10. import { inject, provide, ref } from 'vue'
  11. import type { Message, MessageOptions, MessageOptionsWithCallBack, MessageResult, MessageType } from './types'
  12. import { deepMerge } from '../common/util'
  13. const messageDefaultOptionKey = '__MESSAGE_OPTION__'
  14. const None = Symbol('None')
  15. // 默认模板
  16. export const defaultOptions: MessageOptionsWithCallBack = {
  17. title: '',
  18. showCancelButton: false,
  19. show: false,
  20. closeOnClickModal: true,
  21. msg: '',
  22. type: 'alert',
  23. inputType: 'text',
  24. inputValue: '',
  25. showErr: false,
  26. zIndex: 99,
  27. lazyRender: true,
  28. inputError: ''
  29. }
  30. export function useMessage(selector: string = ''): Message {
  31. const messageOptionKey = selector ? messageDefaultOptionKey + selector : messageDefaultOptionKey
  32. const messageOption = inject(messageOptionKey, ref<MessageOptionsWithCallBack | typeof None>(None)) // Message选项
  33. if (messageOption.value === None) {
  34. messageOption.value = defaultOptions
  35. provide(messageOptionKey, messageOption)
  36. }
  37. const createMethod = (type: MessageType) => {
  38. // 优先级:options->MessageOptions->defaultOptions
  39. return (options: MessageOptions | string) => {
  40. const messageOptions = deepMerge({ type: type }, typeof options === 'string' ? { title: options } : options) as MessageOptions
  41. if (messageOptions.type === 'confirm' || messageOptions.type === 'prompt') {
  42. messageOptions.showCancelButton = true
  43. } else {
  44. messageOptions.showCancelButton = false
  45. }
  46. return show(messageOptions)
  47. }
  48. }
  49. const show = (option: MessageOptions | string) => {
  50. // 返回一个promise
  51. return new Promise<MessageResult>((resolve, reject) => {
  52. const options = deepMerge(defaultOptions, typeof option === 'string' ? { title: option } : option)
  53. messageOption.value = deepMerge(options, {
  54. show: true,
  55. success: (res: MessageResult) => {
  56. close()
  57. resolve(res)
  58. },
  59. fail: (res: MessageResult) => {
  60. close()
  61. reject(res)
  62. }
  63. })
  64. })
  65. }
  66. // 打开Alert 弹框
  67. const alert = createMethod('alert')
  68. // 打开Confirm 弹框
  69. const confirm = createMethod('confirm')
  70. // 打开Prompt 弹框
  71. const prompt = createMethod('prompt')
  72. const close = () => {
  73. if (messageOption.value !== None) {
  74. messageOption.value.show = false
  75. }
  76. }
  77. return {
  78. show,
  79. alert,
  80. confirm,
  81. prompt,
  82. close
  83. }
  84. }
  85. export const getMessageDefaultOptionKey = (selector: string) => {
  86. return selector ? `${messageDefaultOptionKey}${selector}` : messageDefaultOptionKey
  87. }