useMaterialModal.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { useCallback, useReducer } from 'react'
  2. type State = {
  3. visible: boolean,//弹窗开关
  4. actionUrl?: string,//选中的图片
  5. file?: File//上传的文件
  6. }
  7. export type Action = {
  8. type: 'hide' | 'show' | 'action' | 'file',
  9. params?: any
  10. }
  11. export function reducer(state: State, action: Action) {
  12. let { type, params } = action
  13. switch (type) {
  14. case 'show':
  15. return { ...state, visible: true }
  16. case 'hide':
  17. return { ...state, visible: false }
  18. case 'action':
  19. return { ...state, actionUrl: params.url }
  20. case 'file':
  21. return { ...state, file: params.file }
  22. default:
  23. return state;
  24. }
  25. }
  26. export default function useMaterialModal() {
  27. const [state, dispatch] = useReducer(reducer, { visible: false })
  28. const show = useCallback(() => {
  29. dispatch({ type: 'show' })
  30. }, [])
  31. const hide = useCallback(() => {
  32. dispatch({ type: 'hide' })
  33. }, [])
  34. const action = useCallback((url) => {
  35. dispatch({ type: 'action', params: { url } })
  36. }, [])
  37. return {
  38. state,
  39. show,
  40. hide,
  41. action,
  42. dispatch
  43. }
  44. }