slider.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { Button } from 'antd'
  2. import { useEffect, useState } from 'react'
  3. import { metas, labels, images } from './board'
  4. import { BoardType, BoardTypeDesc } from 'store'
  5. import { SelectMap, SelectFuse } from './modal'
  6. import style from './style.module.scss'
  7. import type { ShapeType, Board } from './board'
  8. import type { RefObject } from 'react'
  9. type SliderProps = {
  10. board: RefObject<Board>
  11. type: BoardType
  12. caseId: number
  13. }
  14. export const DfSlider = ({ board, type, caseId }: SliderProps) => {
  15. const [selectMode, setSelectMode] = useState(false)
  16. const [currentShape, setCurrentShape] = useState<ShapeType>()
  17. const getEle = (shapeType: ShapeType) => (
  18. <div
  19. key={shapeType}
  20. className={style['df-slide-shape'] + (currentShape === shapeType ? ` ${style['active']}` : '')}
  21. onClick={() => setCurrentShape(shapeType)}
  22. >
  23. <img src={metas[shapeType].icon} />
  24. <p>{metas[shapeType].desc}</p>
  25. </div>
  26. )
  27. const setBoardImage = async (blob: Blob) => {
  28. const url = URL.createObjectURL(blob)
  29. board.current?.setImage(url)
  30. }
  31. const SelectImage = type === BoardType.map ? SelectMap : SelectFuse
  32. const renderSelect = selectMode && <SelectImage
  33. caseId={caseId}
  34. onClose={() => setSelectMode(false)}
  35. onSave={setBoardImage}
  36. />
  37. useEffect(() => {
  38. const boardRef = board.current
  39. if (currentShape && boardRef) {
  40. const clickHandler = (ev: MouseEvent) => {
  41. const pos = boardRef.getPosByScreen({ x: ev.offsetX, y: ev.offsetY })
  42. boardRef.addShape(currentShape, pos)
  43. setCurrentShape(void 0)
  44. }
  45. const keyupHandler = (ev: KeyboardEvent) => {
  46. if (ev.key === 'Escape') {
  47. setCurrentShape(void 0)
  48. }
  49. }
  50. boardRef.el.addEventListener('click', clickHandler)
  51. document.documentElement.addEventListener('keyup', keyupHandler)
  52. return () => {
  53. boardRef.el.removeEventListener('click', clickHandler)
  54. document.documentElement.removeEventListener('keyup', keyupHandler)
  55. }
  56. }
  57. }, [currentShape, board])
  58. return (
  59. <div className={style['df-slide-content']}>
  60. { renderSelect }
  61. <h3>户型图</h3>
  62. <Button type="primary" block ghost onClick={() => setSelectMode(true)}>设置{ BoardTypeDesc[type] }</Button>
  63. <h3>标注</h3>
  64. <div className={style['df-shape-layout']}>{ labels.map(getEle) }</div>
  65. <h3>图例</h3>
  66. <div className={style['df-shape-layout']}>{ images.map(getEle) }</div>
  67. </div>
  68. )
  69. }
  70. export default DfSlider