list.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import style from './style.module.scss'
  2. import { SceneType } from "constant"
  3. import { memo } from 'react'
  4. import { Table, Input, Button, Upload, message } from 'antd'
  5. import { useTypeColumns } from './cloumns'
  6. import { useThunkPaging } from 'hook'
  7. import {
  8. useSelector,
  9. useDispatch,
  10. filterScenesSelector,
  11. fetchScenes,
  12. uploadModelScene
  13. } from 'store'
  14. import { GetSceneByTypeParams, PagingRequest } from 'api'
  15. import type { UploadProps } from 'antd'
  16. const { Search } = Input
  17. type ListHeaderProps = SceneListProps & {
  18. onDataChange?: () => void,
  19. onSearch: (params: (GetSceneByTypeParams extends PagingRequest<infer T> ? Omit<T, 'type'> : never)) => void
  20. }
  21. const ListHeader = memo(({ type, onSearch, onDataChange }: ListHeaderProps) => {
  22. const dispatch = useDispatch()
  23. const onUpload: UploadProps['beforeUpload'] = file => {
  24. const isZip = ['application/zip', 'application/rar'].includes(file.type)
  25. if (!isZip) {
  26. message.error('只能上传zip或rar文件')
  27. }
  28. dispatch(uploadModelScene({ file }))
  29. .unwrap()
  30. .finally(onDataChange)
  31. return Upload.LIST_IGNORE
  32. }
  33. const renderUpload = type === SceneType.SWMX && (
  34. <Upload beforeUpload={onUpload} multiple={false} >
  35. <Button type="primary" children="上传数据" />
  36. </Upload>
  37. )
  38. return (
  39. <div className={style['table-header']}>
  40. { renderUpload }
  41. <Search
  42. className={style['table-search']}
  43. placeholder="输入名称搜索"
  44. onSearch={sceneName => onSearch({ sceneName }) }
  45. style={{ width: 264 }}
  46. />
  47. </div>
  48. )
  49. })
  50. export type SceneListProps = { type: SceneType }
  51. export const SceneList = memo(({ type }: SceneListProps) => {
  52. const scenes = useSelector((state) => filterScenesSelector(state, { type }))
  53. const states = useThunkPaging({ type, sceneName: '' }, fetchScenes)
  54. const [[paging, setPaging], [, setParams], refresh] = states
  55. const cloumns = useTypeColumns(type, refresh)
  56. return (
  57. <div className={style['table-layout']}>
  58. <ListHeader type={type} onSearch={setParams} onDataChange={refresh} />
  59. <Table
  60. columns={cloumns}
  61. dataSource={scenes}
  62. rowKey="id"
  63. pagination={{
  64. showSizeChanger: false,
  65. pageSize: paging.pageSize,
  66. total: paging.total,
  67. onChange: (page, pageSize) => setPaging({ pageNum: page, pageSize })
  68. }}
  69. />
  70. </div>
  71. )
  72. })
  73. export default SceneList