slider.tsx 2.5 KB

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