blue-chestnut-solar-expert 0.0.64 → 0.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/cjs/eraser-icon_19.cjs.entry.js +1 -1
  2. package/dist/cjs/{lerc-CQf05pmr.js → lerc-Bzx_uOA8.js} +3 -3
  3. package/dist/cjs/{lerc-CQf05pmr.js.map → lerc-Bzx_uOA8.js.map} +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/loading-widget.cjs.entry.js +1 -1
  6. package/dist/cjs/loading-widget.cjs.entry.js.map +1 -1
  7. package/dist/cjs/loading-widget.entry.cjs.js.map +1 -1
  8. package/dist/cjs/stencil-library.cjs.js +1 -1
  9. package/dist/collection/components/map-draw/map-draw.js +8 -10
  10. package/dist/collection/components/map-draw/map-draw.js.map +1 -1
  11. package/dist/collection/components/solar-system-form/solar-system-form.js +73 -50
  12. package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
  13. package/dist/collection/output.css +0 -52
  14. package/dist/collection/utils/lang/german.js +5 -5
  15. package/dist/collection/utils/lang/german.js.map +1 -1
  16. package/dist/components/eraser-icon.js +1 -1
  17. package/dist/components/house-icon.js +1 -1
  18. package/dist/components/icon-selector.js +1 -1
  19. package/dist/components/loading-widget.js +1 -1
  20. package/dist/components/loading-widget.js.map +1 -1
  21. package/dist/components/map-draw.js +1 -1
  22. package/dist/components/map-selector.js +1 -1
  23. package/dist/components/marker-icon.js +1 -1
  24. package/dist/components/move-icon.js +1 -1
  25. package/dist/components/octagon-minus-icon.js +1 -1
  26. package/dist/components/{p-B_6Ue-UQ.js → p-BGDUEqPw.js} +7 -7
  27. package/dist/components/p-BGDUEqPw.js.map +1 -0
  28. package/dist/components/p-BJLO76Yi.js +40 -0
  29. package/dist/components/p-BJLO76Yi.js.map +1 -0
  30. package/dist/components/p-B_d25VbK.js +76 -0
  31. package/dist/components/p-B_d25VbK.js.map +1 -0
  32. package/dist/components/{p-IzVa21Wl.js → p-Bb2Y3Z89.js} +81 -55
  33. package/dist/components/p-Bb2Y3Z89.js.map +1 -0
  34. package/dist/components/p-Btv8OdhG.js +47 -0
  35. package/dist/components/p-Btv8OdhG.js.map +1 -0
  36. package/dist/components/p-C5QieOat.js +114 -0
  37. package/dist/components/p-C5QieOat.js.map +1 -0
  38. package/dist/components/p-CAfEQ2E5.js +121 -0
  39. package/dist/components/p-CAfEQ2E5.js.map +1 -0
  40. package/dist/components/p-CL74Q4VR.js +40 -0
  41. package/dist/components/p-CL74Q4VR.js.map +1 -0
  42. package/dist/components/{p-DoOT28vq.js → p-Cmq8WfHd.js} +3 -3
  43. package/dist/components/{p-DoOT28vq.js.map → p-Cmq8WfHd.js.map} +1 -1
  44. package/dist/components/p-D-7y2xyY.js +89 -0
  45. package/dist/components/p-D-7y2xyY.js.map +1 -0
  46. package/dist/components/p-D8w3bTPO.js +40 -0
  47. package/dist/components/p-D8w3bTPO.js.map +1 -0
  48. package/dist/components/p-DBwr8xSB.js +40 -0
  49. package/dist/components/p-DBwr8xSB.js.map +1 -0
  50. package/dist/components/p-DTXeHbuh.js +40 -0
  51. package/dist/components/p-DTXeHbuh.js.map +1 -0
  52. package/dist/components/p-DlZrNkTC.js +623 -0
  53. package/dist/components/p-DlZrNkTC.js.map +1 -0
  54. package/dist/components/p-FdEV2qPo.js +40 -0
  55. package/dist/components/p-FdEV2qPo.js.map +1 -0
  56. package/dist/components/p-P28NBglk.js +86 -0
  57. package/dist/components/p-P28NBglk.js.map +1 -0
  58. package/dist/components/p-Umz6nJIv.js +40 -0
  59. package/dist/components/p-Umz6nJIv.js.map +1 -0
  60. package/dist/components/{p-De6Uhz0b.js → p-bfmX8bQv.js} +29 -31
  61. package/dist/components/p-bfmX8bQv.js.map +1 -0
  62. package/dist/components/p-waOPoUcA.js +40 -0
  63. package/dist/components/p-waOPoUcA.js.map +1 -0
  64. package/dist/components/p-zTqylr2Y.js +163 -0
  65. package/dist/components/p-zTqylr2Y.js.map +1 -0
  66. package/dist/components/polygon-buttons.js +1 -1
  67. package/dist/components/polygon-information.js +1 -1
  68. package/dist/components/search-icon.js +1 -1
  69. package/dist/components/settings-icon.js +1 -1
  70. package/dist/components/settings-modal.js +1 -1
  71. package/dist/components/solar-expert.js +20 -20
  72. package/dist/components/solar-expert.js.map +1 -1
  73. package/dist/components/solar-system-form.js +1 -1
  74. package/dist/components/toast-notification.js +1 -1
  75. package/dist/components/tool-box.js +1 -1
  76. package/dist/components/tutorial-component.js +1 -1
  77. package/dist/components/undo-icon.js +1 -1
  78. package/dist/esm/eraser-icon_19.entry.js +1 -1
  79. package/dist/esm/{lerc-j3yBkoBc.js → lerc-fDBsT-r9.js} +3 -3
  80. package/dist/esm/{lerc-j3yBkoBc.js.map → lerc-fDBsT-r9.js.map} +1 -1
  81. package/dist/esm/loader.js +1 -1
  82. package/dist/esm/loading-widget.entry.js +1 -1
  83. package/dist/esm/loading-widget.entry.js.map +1 -1
  84. package/dist/esm/stencil-library.js +1 -1
  85. package/dist/stencil-library/loading-widget.entry.esm.js.map +1 -1
  86. package/dist/stencil-library/{p-d2fcb2d8.entry.js → p-0020e897.entry.js} +2 -2
  87. package/dist/stencil-library/p-BwLev3G_.js +2 -0
  88. package/dist/stencil-library/p-BwLev3G_.js.map +1 -0
  89. package/dist/stencil-library/{p-rVA7BFlW.js → p-C9kyZnQX.js} +2 -2
  90. package/dist/stencil-library/{p-rVA7BFlW.js.map → p-C9kyZnQX.js.map} +1 -1
  91. package/dist/stencil-library/p-ab0f2031.entry.js +2 -0
  92. package/dist/stencil-library/p-ab0f2031.entry.js.map +1 -0
  93. package/dist/stencil-library/stencil-library.esm.js +1 -1
  94. package/dist/types/components/solar-system-form/solar-system-form.d.ts +1 -0
  95. package/package.json +1 -1
  96. package/dist/components/p-1jcVNjsm.js +0 -47
  97. package/dist/components/p-1jcVNjsm.js.map +0 -1
  98. package/dist/components/p-4FooU4eR.js +0 -40
  99. package/dist/components/p-4FooU4eR.js.map +0 -1
  100. package/dist/components/p-6rmvkwsO.js +0 -163
  101. package/dist/components/p-6rmvkwsO.js.map +0 -1
  102. package/dist/components/p-BYULvwxQ.js +0 -40
  103. package/dist/components/p-BYULvwxQ.js.map +0 -1
  104. package/dist/components/p-B_6Ue-UQ.js.map +0 -1
  105. package/dist/components/p-BcBvva_X.js +0 -40
  106. package/dist/components/p-BcBvva_X.js.map +0 -1
  107. package/dist/components/p-But3uNm3.js +0 -76
  108. package/dist/components/p-But3uNm3.js.map +0 -1
  109. package/dist/components/p-COCnOrkb.js +0 -121
  110. package/dist/components/p-COCnOrkb.js.map +0 -1
  111. package/dist/components/p-COL7rExT.js +0 -86
  112. package/dist/components/p-COL7rExT.js.map +0 -1
  113. package/dist/components/p-CpGXfh7Q.js +0 -114
  114. package/dist/components/p-CpGXfh7Q.js.map +0 -1
  115. package/dist/components/p-Cu7ckMQp.js +0 -40
  116. package/dist/components/p-Cu7ckMQp.js.map +0 -1
  117. package/dist/components/p-CxwiRuTf.js +0 -623
  118. package/dist/components/p-CxwiRuTf.js.map +0 -1
  119. package/dist/components/p-DCMO4ssM.js +0 -40
  120. package/dist/components/p-DCMO4ssM.js.map +0 -1
  121. package/dist/components/p-DWrXodHT.js +0 -40
  122. package/dist/components/p-DWrXodHT.js.map +0 -1
  123. package/dist/components/p-De6Uhz0b.js.map +0 -1
  124. package/dist/components/p-IzVa21Wl.js.map +0 -1
  125. package/dist/components/p-JzJ_ZuEh.js +0 -89
  126. package/dist/components/p-JzJ_ZuEh.js.map +0 -1
  127. package/dist/components/p-kB7DMoo7.js +0 -40
  128. package/dist/components/p-kB7DMoo7.js.map +0 -1
  129. package/dist/components/p-rW0sFWOp.js +0 -40
  130. package/dist/components/p-rW0sFWOp.js.map +0 -1
  131. package/dist/stencil-library/p-741a746a.entry.js +0 -2
  132. package/dist/stencil-library/p-741a746a.entry.js.map +0 -1
  133. package/dist/stencil-library/p-c6J1w7ew.js +0 -2
  134. package/dist/stencil-library/p-c6J1w7ew.js.map +0 -1
  135. /package/dist/stencil-library/{p-d2fcb2d8.entry.js.map → p-0020e897.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" | \"error\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n @State()\r\n showToast: boolean = false;\r\n @State()\r\n toastMessage: string = \"\";\r\n @State()\r\n toastType: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\";\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels(false);\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n });\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels(false);\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n // this.loadingState = \"loaded\";\r\n } else {\r\n this.loadingState = \"error\";\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n this.loadingState = \"error\";\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n this.loadingState = \"loaded\";\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n console.log(\"undo\");\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(t.mapDraw.toast.undoSuccess, \"success\");\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels(showToast: boolean = false) {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n\r\n // Show toast message only when explicitly requested\r\n if (showToast) {\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.calculateSolarPanelsSuccess,\r\n \"success\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.markAsFlatRoofSuccess,\r\n \"info\",\r\n );\r\n\r\n // Auto-select the mark roof edge tool\r\n this.handleToolSelect(markRoofEdgeTool);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const displayAzimuth = parseFloat(target.value);\r\n const azimuth = (displayAzimuth + 270) % 360;\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n this.handleToolSelect(markRoofEdgeTool);\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n };\r\n\r\n private showToastMessage(\r\n message: string,\r\n type: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\",\r\n ) {\r\n this.toastMessage = message;\r\n this.toastType = type;\r\n this.showToast = true;\r\n\r\n // Hide toast after 3 seconds\r\n setTimeout(() => {\r\n this.showToast = false;\r\n }, 3000);\r\n }\r\n\r\n render() {\r\n console.log(this.loadingState);\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"error\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"text-red-500 text-center text-lg font-semibold\">\r\n {t.mapDraw.imageLoadError}\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n {this.rgbTiff && (\r\n <div class=\"w-full\">\r\n <div class=\"w-full pb-4\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) =>\r\n this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels(true)}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n {this.showToast && (\r\n <toast-notification\r\n message={this.toastMessage}\r\n type={this.toastType}\r\n duration={3000}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" | \"error\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n @State()\r\n showToast: boolean = false;\r\n @State()\r\n toastMessage: string = \"\";\r\n @State()\r\n toastType: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\";\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels(false);\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n });\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels(false);\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n // this.loadingState = \"loaded\";\r\n } else {\r\n this.loadingState = \"error\";\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n this.loadingState = \"error\";\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n this.loadingState = \"loaded\";\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(t.mapDraw.toast.undoSuccess, \"success\");\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels(showToast: boolean = false) {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n\r\n // Show toast message only when explicitly requested\r\n if (showToast) {\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.calculateSolarPanelsSuccess,\r\n \"success\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.markAsFlatRoofSuccess,\r\n \"info\",\r\n );\r\n\r\n // Auto-select the mark roof edge tool\r\n this.handleToolSelect(markRoofEdgeTool);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const displayAzimuth = parseFloat(target.value);\r\n const azimuth = (displayAzimuth + 270) % 360;\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n this.handleToolSelect(markRoofEdgeTool);\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n };\r\n\r\n private showToastMessage(\r\n message: string,\r\n type: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\",\r\n ) {\r\n this.toastMessage = message;\r\n this.toastType = type;\r\n this.showToast = true;\r\n\r\n // Hide toast after 3 seconds\r\n setTimeout(() => {\r\n this.showToast = false;\r\n }, 3000);\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"error\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"text-red-500 text-center text-lg font-semibold\">\r\n {t.mapDraw.imageLoadError}\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n {this.rgbTiff && (\r\n <div class=\"w-full\">\r\n <div class=\"w-full pb-4\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) =>\r\n this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels(true)}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n {this.showToast && (\r\n <toast-notification\r\n message={this.toastMessage}\r\n type={this.toastType}\r\n duration={3000}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}