useMaterialDrawer.ts 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { useReducer } from 'react'
  2. type State = {
  3. dataArr: any[],//数据存储
  4. actionId: number,//左侧当前选中
  5. actionIdold?: number,//记录上一次的选中
  6. mediaTagIds?: number[],//标签
  7. groupId?: number,//类型
  8. actionData?: any,//当前选中数据
  9. tags?: any[],//重写标签
  10. ueditorRef?: any,//编辑器实例
  11. delIds: any[],
  12. sort?: number, // 排序
  13. }
  14. export type Action = {
  15. type: 'addDataArr' | 'delDataArr' | 'action' | 'mobile' | 'get' | 'setSort' | 'pushData' | 'addTag' | 'addClass' | 'initData' | 'actionData' | 'setRef' | 'importNews',
  16. params?: { up: boolean, eq: number } | { menuId: number } | any
  17. }
  18. export function reducer(state: State, action: Action) {
  19. let { dataArr } = state
  20. let { type, params } = action
  21. switch (type) {
  22. case 'addDataArr': //左侧添加
  23. if (dataArr.length < 8) {
  24. let id = dataArr.length + 1
  25. let newDelIds = [...state.delIds]
  26. if (newDelIds.length > 0) {
  27. id = state.delIds[0]
  28. newDelIds.splice(0, 1)
  29. }
  30. console.log('state', { ...state, dataArr: [...dataArr, { menuId: id, content: '<p></p>' }], delIds: newDelIds })
  31. return { ...state, dataArr: [...dataArr, { menuId: id, content: '<p></p>' }], delIds: newDelIds }
  32. }
  33. return state
  34. case 'delDataArr': //左侧删除
  35. if (dataArr.length > 1) {
  36. return { ...state, dataArr: dataArr.filter((item: any) => item.menuId !== params.menuId), delIds: [...state.delIds, params.menuId] }
  37. }
  38. return { ...state, ... { dataArr: [{ menuId: 1, content: '' }], actionId: 1, mediaTagIds: [], groupId: '', actionData: null } }
  39. case 'action': //左侧选中
  40. console.log({ ...state, actionIdold: state.actionId, actionId: params.menuId })
  41. return { ...state, actionIdold: state.actionId, actionId: params.menuId }
  42. case 'actionData':
  43. console.log(params.data)
  44. return { ...state, actionData: params.data }
  45. case 'mobile'://左侧移动
  46. let arr: any[] = []
  47. dataArr.forEach((item: any, index: number) => {
  48. if (index === (params.up ? params.eq - 1 : params.eq + 1)) {
  49. arr[index] = dataArr[params.eq]
  50. arr[params.eq] = dataArr[index]
  51. } else if (index !== params.eq) {
  52. arr[index] = dataArr[index]
  53. }
  54. })
  55. return { ...state, dataArr: arr }
  56. case 'pushData'://插入数据
  57. dataArr = dataArr.map((item: any, index: number) => {
  58. if (item.menuId === params.menuId) {
  59. item = { ...item, ...params }
  60. }
  61. return item
  62. })
  63. return { ...state, dataArr }
  64. case 'setSort': // 排序
  65. return { ...state, sort: params.sort }
  66. case 'addTag':
  67. return { ...state, mediaTagIds: params.mediaTagIds }
  68. case 'addClass':
  69. return { ...state, groupId: params.groupId }
  70. case 'initData':
  71. let data = params?.data || { dataArr: [{ menuId: 1, content: '' }], actionId: 1, mediaTagIds: [], groupId: '', actionData: null, delIds: [], actionIdold: undefined, ueditorRef: null, sort: 0 }
  72. console.log('initData', { ...state, ...data })
  73. return { ...state, ...data }
  74. case 'importNews'://批量导入图文
  75. let { actionId, dataArrs } = params.data
  76. let newsarr: any[] = [...dataArr]
  77. if (newsarr.length > 0) {
  78. newsarr.splice(actionId - 1, dataArrs.length)
  79. }
  80. return { ...state, dataArr: [...newsarr, ...dataArrs] }
  81. case 'setRef':
  82. return { ...state, ueditorRef: params.ueditorRef }
  83. default:
  84. return state;
  85. }
  86. }
  87. export default function useMaterialDrawer() {
  88. const [state, dispatch] = useReducer(reducer, { dataArr: [{ menuId: 1, content: undefined }], actionId: 1, delIds: [], actionIdold: undefined, sort: 0 })
  89. return {
  90. state,
  91. dispatch
  92. }
  93. }