Merge pull request #59 from SyncrowIOT/power_clamp

Power clamp
This commit is contained in:
mohammadnemer1
2024-10-27 14:03:24 +03:00
committed by GitHub
30 changed files with 2598 additions and 137 deletions

View File

@ -0,0 +1,25 @@
<svg width="23" height="18" viewBox="0 0 23 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.3032 0.832703H1.4526C1.10932 0.832703 0.830078 1.11285 0.830078 1.45725V16.6318C0.830078 16.9762 1.10932 17.2563 1.4526 17.2563H22.3032C22.6463 17.2563 22.9257 16.9762 22.9257 16.6318V1.45725C22.9257 1.11265 22.6465 0.832703 22.3032 0.832703Z" fill="#E6E7E8"/>
<path d="M21.8881 0.624556V15.7989C21.8881 16.029 21.7023 16.2153 21.4731 16.2153H0.622537C0.393143 16.2153 0.20752 16.029 0.20752 15.7989V0.624556C0.20752 0.394417 0.393143 0.208191 0.622537 0.208191H21.4731C21.7023 0.208191 21.8881 0.394417 21.8881 0.624556Z" fill="white"/>
<path d="M0.20752 15.7989C0.20752 16.0288 0.393143 16.2152 0.622537 16.2152H21.4731C21.7023 16.2152 21.8881 16.0288 21.8881 15.7989V0.832703H0.20752V15.7989Z" fill="#D4FBFF"/>
<path d="M4.44421 8.45071C4.36336 8.45071 4.29 8.3952 4.27055 8.31266C3.4626 4.87562 2.7657 4.37773 2.4283 4.37427C1.65825 4.38423 0.871172 6.79256 0.555856 8.30819C0.535592 8.40517 0.440754 8.46758 0.3447 8.44705C0.248038 8.42672 0.186231 8.33177 0.206293 8.235C0.29566 7.80501 1.11779 4.03293 2.42364 4.01605H2.43336C3.2484 4.01605 3.94267 5.35582 4.61829 8.23053C4.64098 8.32669 4.58161 8.42326 4.48555 8.44603C4.47157 8.44928 4.45799 8.45071 4.44421 8.45071Z" fill="#FFD7E5"/>
<path d="M12.6696 8.59971C12.5887 8.59971 12.5156 8.54421 12.4959 8.46167C11.6916 5.03987 11.001 4.52328 10.6583 4.52328C10.6569 4.52328 10.6553 4.52348 10.6539 4.52348C9.88383 4.53344 9.09696 6.94157 8.78164 8.45719C8.76118 8.55417 8.66634 8.61679 8.57029 8.59605C8.47362 8.57572 8.41182 8.48078 8.43188 8.38401C8.52145 7.95402 9.34358 4.18193 10.6494 4.16526C11.4762 4.15693 12.1656 5.49364 12.8437 8.37953C12.8664 8.4757 12.807 8.57226 12.7109 8.59524C12.6972 8.59829 12.6834 8.59971 12.6696 8.59971Z" fill="#FFD7E5"/>
<path d="M20.7961 8.29596C20.7152 8.29596 20.6418 8.24046 20.6224 8.15792C19.8181 4.73612 19.1275 4.21953 18.7848 4.21953C18.7832 4.21953 18.7818 4.21973 18.7803 4.21973C18.0103 4.2297 17.2234 6.63782 16.9081 8.15345C16.8878 8.25042 16.7928 8.31284 16.6968 8.2923C16.6001 8.27197 16.5383 8.17703 16.5583 8.08026C16.6477 7.65027 17.47 3.87818 18.7759 3.86151C19.5903 3.84647 20.2921 5.1899 20.9701 8.07579C20.9928 8.17195 20.9335 8.26852 20.8374 8.29149C20.8234 8.29454 20.8098 8.29596 20.7961 8.29596Z" fill="#FFD7E5"/>
<path d="M6.52174 12.5619C6.5185 12.5619 6.51546 12.5617 6.51181 12.5617C5.17537 12.5448 4.33378 8.7729 4.24219 8.34291C4.22152 8.24594 4.28495 8.15099 4.38384 8.13087C4.48252 8.11074 4.57959 8.17275 4.60006 8.26972C4.92287 9.78535 5.729 12.1935 6.51668 12.2034C6.5181 12.2034 6.51972 12.2036 6.52114 12.2036C6.87212 12.2036 7.57915 11.6875 8.40229 8.26525C8.42519 8.16909 8.52388 8.10993 8.62216 8.13188C8.72065 8.15465 8.78144 8.25122 8.75814 8.34759C8.06671 11.2215 7.35583 12.5619 6.52174 12.5619Z" fill="#FFD7E5"/>
<path d="M14.7221 12.5619C14.7187 12.5619 14.7157 12.5617 14.7124 12.5617C13.4066 12.5448 12.5842 8.7729 12.4949 8.34291C12.4748 8.24594 12.5366 8.15099 12.6333 8.13087C12.7299 8.11074 12.8244 8.17275 12.8446 8.26972C13.1599 9.78535 13.9472 12.1935 14.7169 12.2034C14.7183 12.2034 14.7197 12.2036 14.7213 12.2036C15.064 12.2036 15.7546 11.6875 16.5589 8.26525C16.5816 8.16909 16.6777 8.10972 16.7737 8.13188C16.8698 8.15465 16.9292 8.25122 16.9065 8.34759C16.2314 11.2215 15.5368 12.5619 14.7221 12.5619Z" fill="#FFD7E5"/>
<path d="M21.7088 11.1408C21.6411 11.1408 21.5763 11.102 21.5463 11.0361C20.9983 9.83621 20.6678 8.26468 20.6542 8.1982C20.634 8.10142 20.696 8.00648 20.7926 7.98615C20.8887 7.96602 20.9837 8.02803 21.0038 8.12501C21.0072 8.14087 21.34 9.72419 21.8711 10.8871C21.912 10.9769 21.8727 11.0831 21.783 11.1245C21.7591 11.1357 21.7339 11.1408 21.7088 11.1408Z" fill="#FFD7E5"/>
<path d="M3.03701 8.32623C2.97175 8.32623 2.91238 8.2811 2.89677 8.21462C2.36037 5.93295 1.90949 5.68532 1.73582 5.69386C1.28088 5.69976 0.771229 7.16923 0.554601 8.21096C0.538389 8.28923 0.46179 8.33945 0.383771 8.32298C0.305753 8.30671 0.255902 8.23007 0.271911 8.152C0.366952 7.69498 0.884102 5.41534 1.73177 5.40436H1.73845C2.28033 5.40436 2.7379 6.27653 3.17764 8.14814C3.19588 8.2258 3.14785 8.30387 3.07024 8.32237C3.0593 8.32461 3.04815 8.32623 3.03701 8.32623Z" fill="#FA759E"/>
<path d="M8.34895 8.42239C8.2835 8.42239 8.22412 8.37746 8.20852 8.31078C7.67475 6.03927 7.22204 5.79002 7.04979 5.79002C7.04898 5.79002 7.04838 5.79002 7.04757 5.79002C6.59283 5.79592 6.08318 7.26539 5.86655 8.30712C5.85014 8.38539 5.77333 8.43561 5.69572 8.41914C5.6177 8.40288 5.56765 8.32623 5.58386 8.24816C5.6789 7.79114 6.19605 5.5115 7.04372 5.50052H7.0502C7.59207 5.50052 8.04965 6.37269 8.48939 8.2443C8.50762 8.32196 8.4596 8.40003 8.38198 8.41853C8.37084 8.42117 8.3599 8.42239 8.34895 8.42239Z" fill="#FA759E"/>
<path d="M13.5964 8.22601C13.5309 8.22601 13.4716 8.18108 13.456 8.1144C12.9198 5.83293 12.4648 5.59039 12.295 5.59385C11.8401 5.59974 11.3304 7.06922 11.1138 8.11094C11.0976 8.18921 11.021 8.23984 10.9432 8.22296C10.8651 8.2067 10.8151 8.12985 10.8313 8.05178C10.9263 7.59476 11.4435 5.31532 12.2912 5.30414H12.2976C12.8395 5.30414 13.2971 6.17651 13.7368 8.04812C13.7551 8.12578 13.707 8.20385 13.6294 8.22235C13.6185 8.22479 13.6073 8.22601 13.5964 8.22601Z" fill="#FA759E"/>
<path d="M18.895 8.42239C18.8298 8.42239 18.7704 8.37746 18.7548 8.31078C18.2186 6.02931 17.7635 5.78677 17.5938 5.79002C17.1389 5.79612 16.6292 7.26539 16.4126 8.30712C16.3962 8.38539 16.3198 8.43601 16.242 8.41914C16.1638 8.40288 16.1139 8.32623 16.1301 8.24816C16.2252 7.79114 16.7421 5.5115 17.5898 5.50052H17.5965C18.1383 5.50052 18.5959 6.37269 19.0357 8.2443C19.0539 8.32196 19.0059 8.40003 18.9283 8.41853C18.9171 8.42117 18.9062 8.42239 18.895 8.42239Z" fill="#FA759E"/>
<path d="M4.4265 11.1188C4.42427 11.1188 4.42204 11.1188 4.41981 11.1188C3.57195 11.1076 3.055 8.8282 2.95996 8.37118C2.94375 8.2929 2.9938 8.21626 3.07162 8.19999C3.14984 8.18332 3.22623 8.23374 3.24245 8.31201C3.45928 9.35354 3.96913 10.8234 4.42367 10.8291H4.42589C4.59814 10.8291 5.05065 10.5799 5.58462 8.30856C5.60286 8.2309 5.68067 8.18312 5.75808 8.20081C5.8357 8.2191 5.88352 8.29717 5.86528 8.37504C5.42575 10.2464 4.96838 11.1188 4.4265 11.1188Z" fill="#FA759E"/>
<path d="M9.67406 10.9584C9.67183 10.9584 9.6696 10.9584 9.66737 10.9584C8.81951 10.9474 8.30256 8.66778 8.20752 8.21076C8.19131 8.13248 8.24136 8.05584 8.31917 8.03978C8.3976 8.02311 8.47359 8.07353 8.49 8.1518C8.70683 9.19332 9.21669 10.663 9.67122 10.6689H9.67345C9.8457 10.6689 10.2982 10.4196 10.8322 8.14814C10.8504 8.07027 10.928 8.0229 11.0056 8.04059C11.0833 8.05889 11.1311 8.13696 11.1128 8.21482C10.6733 10.086 10.2159 10.9584 9.67406 10.9584Z" fill="#FA759E"/>
<path d="M14.9774 10.9842C14.9752 10.9842 14.9732 10.9842 14.971 10.9842C14.1229 10.9732 13.6061 8.69361 13.5111 8.23658C13.4949 8.15831 13.5449 8.08166 13.6228 8.0656C13.701 8.04893 13.7772 8.09915 13.7934 8.17762C14.0102 9.21915 14.5201 10.6888 14.9746 10.6947H14.9768C15.1491 10.6947 15.6016 10.4455 16.1356 8.17396C16.1538 8.0963 16.2316 8.04873 16.309 8.06642C16.3866 8.08471 16.4347 8.16278 16.4164 8.24065C15.9767 10.1121 15.5193 10.9842 14.9774 10.9842Z" fill="#FA759E"/>
<path d="M20.234 11.1188C20.2318 11.1188 20.2298 11.1188 20.2274 11.1188C19.3795 11.1076 18.8627 8.8282 18.7677 8.37118C18.7515 8.2929 18.8015 8.21626 18.8794 8.19999C18.9576 8.18332 19.0338 8.23374 19.05 8.31201C19.2668 9.35354 19.7767 10.8234 20.2312 10.8291H20.2334C20.4057 10.8291 20.8582 10.5799 21.3922 8.30856C21.4104 8.2309 21.4882 8.18312 21.5656 8.20081C21.6432 8.2191 21.6913 8.29717 21.673 8.37504C21.2335 10.2464 20.7759 11.1188 20.234 11.1188Z" fill="#FA759E"/>
<path d="M5.67451 8.26302C5.58717 8.26302 5.50794 8.20284 5.48707 8.11399C4.43696 3.6462 3.52019 2.97225 3.06363 2.97225C3.06161 2.97225 3.05958 2.97225 3.05776 2.97225C2.03541 2.98567 1.00151 6.12996 0.589942 8.10912C0.568258 8.21382 0.46572 8.28091 0.361763 8.25895C0.257401 8.2372 0.190528 8.13473 0.212211 8.02983C0.327719 7.47501 1.38816 2.60651 3.05269 2.58496H3.06404C4.08719 2.58496 5.00254 4.36447 5.86257 8.02495C5.88709 8.12884 5.82265 8.23333 5.7191 8.25793C5.7043 8.26139 5.68931 8.26302 5.67451 8.26302Z" fill="#0089EF"/>
<path d="M16.3507 8.26302C16.2633 8.26302 16.1841 8.20284 16.163 8.11399C15.1131 3.6462 14.1964 2.97225 13.7398 2.97225C13.7378 2.97225 13.7357 2.97225 13.7337 2.97225C12.7116 2.98567 11.6779 6.12996 11.2661 8.10912C11.2442 8.21382 11.1419 8.28091 11.0379 8.25895C10.9336 8.2372 10.8667 8.13473 10.8882 8.02983C11.0039 7.47501 12.0641 2.60651 13.7286 2.58496H13.74C14.7627 2.58496 15.6781 4.36447 16.5385 8.02495C16.563 8.12884 16.4986 8.23333 16.3951 8.25793C16.3805 8.26139 16.3655 8.26302 16.3507 8.26302Z" fill="#0089EF"/>
<path d="M8.46634 13.838C8.46269 13.838 8.45884 13.838 8.45499 13.838C6.79046 13.8164 5.73002 8.94794 5.61431 8.39292C5.59263 8.28843 5.6595 8.18576 5.76406 8.164C5.86802 8.14205 5.97056 8.20934 5.99224 8.31384C6.40422 10.2928 7.43832 13.4375 8.45985 13.4505H8.46593C8.9227 13.4505 9.83926 12.777 10.8892 8.30896C10.9137 8.20507 11.0178 8.14123 11.1212 8.16482C11.2249 8.18942 11.2892 8.29371 11.2647 8.3978C10.4046 12.0583 9.48909 13.838 8.46634 13.838Z" fill="#0089EF"/>
<path d="M19.014 13.6947C19.0103 13.6947 19.0065 13.6947 19.0026 13.6947C17.3381 13.6729 16.2776 8.80464 16.1619 8.24963C16.1402 8.14513 16.2069 8.04246 16.3117 8.0205C16.416 7.99875 16.518 8.06604 16.5399 8.17054C16.9518 10.1495 17.9859 13.294 19.0075 13.3072H19.0135C19.4703 13.3072 20.3869 12.6335 21.4368 8.16546C21.4613 8.06157 21.5655 7.99794 21.6688 8.02152C21.7726 8.04592 21.837 8.15021 21.8123 8.2543C20.9523 11.9148 20.0367 13.6947 19.014 13.6947Z" fill="#0089EF"/>
<path d="M21.4731 0H0.622526C0.279245 0 0 0.280152 0 0.624547V15.7991C0 16.1435 0.279245 16.4236 0.622526 16.4236H21.4731C21.8162 16.4236 22.0956 16.1435 22.0956 15.7991V6.08324C22.0956 5.96817 22.0026 5.87506 21.8881 5.87506C21.7734 5.87506 21.6806 5.96817 21.6806 6.08324V8.00323H18.0263C17.7882 6.70921 16.7602 1.48066 15.5275 0.416365H21.4731C21.5874 0.416365 21.6806 0.509681 21.6806 0.624547V2.90866C21.6806 3.02373 21.7734 3.11684 21.8881 3.11684C22.0026 3.11684 22.0956 3.02373 22.0956 2.90866V0.624547C22.0956 0.279949 21.8164 0 21.4731 0ZM17.6453 8.4196C17.94 9.69594 19.2156 14.9412 20.4964 16.0071H9.63335C10.8664 14.9428 11.8945 9.71342 12.1324 8.4196H17.6453ZM9.20192 15.7828C8.47685 15.7828 7.18702 12.0658 6.33874 8.4196H11.7101C11.0348 12.0642 9.92273 15.7828 9.20192 15.7828ZM5.80943 8.00323H0.438119C1.11576 4.35902 2.23011 0.640405 2.95072 0.640405C3.67558 0.640405 4.96319 4.3574 5.80943 8.00323ZM0.622526 0.416365H2.51908C1.64751 1.16899 0.876441 4.00121 0.415017 6.0564V0.624547C0.415017 0.509681 0.508032 0.416365 0.622526 0.416365ZM0.415017 15.7989V8.4196H5.91258C6.20723 9.69594 7.48288 14.9412 8.7636 16.0071H0.622526C0.508032 16.0071 0.415017 15.9138 0.415017 15.7989ZM21.4731 16.0071H21.3939C21.4934 15.9217 21.5902 15.8062 21.6806 15.6543V15.7989C21.6806 15.9138 21.5874 16.0071 21.4731 16.0071ZM21.6806 14.2969C21.5136 15.3866 21.1434 15.7828 20.9347 15.7828C20.2096 15.7828 18.9198 12.0658 18.0715 8.4196H21.6802V14.2969H21.6806ZM17.604 8.00323H12.2329C13.081 4.3574 14.3708 0.640405 15.0959 0.640405C15.8167 0.640405 16.9288 4.35902 17.604 8.00323ZM11.8065 8.00323H6.2356C5.94156 6.72629 4.66915 1.48249 3.38944 0.416365H14.6569C13.3768 1.48269 12.1014 6.72669 11.8065 8.00323Z" fill="#3A2C60"/>
<path d="M21.8882 3.50696C21.7735 3.50696 21.6807 3.60007 21.6807 3.71514V5.22446C21.6807 5.33953 21.7735 5.43265 21.8882 5.43265C22.0027 5.43265 22.0957 5.33953 22.0957 5.22446V3.71514C22.0957 3.60027 22.0027 3.50696 21.8882 3.50696Z" fill="#3A2C60"/>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,3 @@
<svg width="13" height="23" viewBox="0 0 13 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.95088 0L0.141105 11.2883H4.3742L0 23L11.5706 9.17177H7.47851L12.8404 0H3.95088Z" fill="#F7CF52"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@ -0,0 +1,43 @@
<svg width="37" height="40" viewBox="0 0 37 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M29.7686 39.9196H7.39439C6.50537 39.9196 5.78473 39.1989 5.78473 38.3099V28.9739L18.5413 29.0544L31.3783 28.9739L31.4588 30.1006V38.3904C31.4588 38.5295 31.4411 38.6645 31.4079 38.7933C31.2291 39.4873 30.5185 39.9196 29.7686 39.9196Z" fill="#8D9CA8"/>
<path d="M31.4588 30.1006V28.8933L18.6217 28.6921L5.70422 28.8933V38.3903C5.70422 39.2793 6.42487 40 7.31388 40H29.8491C30.5989 40 31.227 39.4866 31.406 38.7927H7.7163C7.27179 38.7927 6.91147 38.4324 6.91147 37.9879V30.9054C6.91147 30.4609 7.27179 30.1006 7.7163 30.1006H31.4588Z" fill="#7A8C98"/>
<path d="M16.0865 36.7002H15.4426C14.9981 36.7002 14.6378 36.3399 14.6378 35.8954V28.9739H16.8913L16.9718 30.1006V35.5735L16.8913 35.8954C16.8913 36.3399 16.531 36.7002 16.0865 36.7002Z" fill="#CCF49F"/>
<path d="M10.4527 36.7002H9.80886C9.36435 36.7002 9.00403 36.3399 9.00403 35.8954V28.9739H11.2575L11.338 30.1006V35.5735L11.2575 35.8954C11.2575 36.3399 10.8972 36.7002 10.4527 36.7002Z" fill="#CCF49F"/>
<path d="M21.7203 36.7002H21.0764C20.6319 36.7002 20.2716 36.3399 20.2716 35.8954V28.9739H22.5251L22.6056 30.1006V35.5735L22.5251 35.8954C22.5251 36.3399 22.1648 36.7002 21.7203 36.7002Z" fill="#CCF49F"/>
<path d="M27.3541 36.7002H26.7102C26.2657 36.7002 25.9054 36.3399 25.9054 35.8954V28.9739H28.1589L28.2394 30.1006V35.5735L28.1589 35.8954C28.1589 36.3399 27.7986 36.7002 27.3541 36.7002Z" fill="#CCF49F"/>
<path d="M16.9718 30.1005V28.8933L15.7646 28.6519L14.5573 28.8933V35.9758C14.5573 36.4203 14.9176 36.7806 15.3621 36.7806H16.167C16.6115 36.7806 16.9718 36.4203 16.9718 35.9758V35.5734H16.006C15.8726 35.5734 15.7646 35.4653 15.7646 35.3319V30.342C15.7646 30.2086 15.8726 30.1005 16.006 30.1005H16.9718Z" fill="#B3E59F"/>
<path d="M11.338 30.1005V28.8933L10.1308 28.6519L8.92352 28.8933V35.9758C8.92352 36.4203 9.28384 36.7806 9.72835 36.7806H10.5332C10.9777 36.7806 11.338 36.4203 11.338 35.9758V35.5734H10.3722C10.2389 35.5734 10.1308 35.4653 10.1308 35.3319V30.342C10.1308 30.2086 10.2389 30.1005 10.3722 30.1005H11.338Z" fill="#B3E59F"/>
<path d="M22.6056 30.1005V28.8933L21.3984 28.6519L20.1912 28.8933V35.9758C20.1912 36.4203 20.5515 36.7806 20.996 36.7806H21.8008C22.2453 36.7806 22.6056 36.4203 22.6056 35.9758V35.5734H21.6399C21.5065 35.5734 21.3984 35.4653 21.3984 35.3319V30.342C21.3984 30.2086 21.5065 30.1005 21.6399 30.1005H22.6056Z" fill="#B3E59F"/>
<path d="M28.2394 30.1005V28.8933L27.0322 28.6519L25.825 28.8933V35.9758C25.825 36.4203 26.1853 36.7806 26.6298 36.7806H27.4346C27.8791 36.7806 28.2394 36.4203 28.2394 35.9758V35.5734H27.2736C27.1403 35.5734 27.0322 35.4653 27.0322 35.3319V30.342C27.0322 30.2086 27.1403 30.1005 27.2736 30.1005H28.2394Z" fill="#B3E59F"/>
<path d="M28.2394 31.3079H9.32592L9.00399 31.3883C8.55948 31.3883 8.19916 31.7487 8.19916 32.1932V32.837C8.19916 33.2815 8.55948 33.6419 9.00399 33.6419H28.1589C28.6034 33.6419 28.9637 33.2815 28.9637 32.837L29.0442 32.5151V32.1127C29.0442 31.6682 28.6839 31.3079 28.2394 31.3079Z" fill="#B6C4CF"/>
<path d="M9.56741 32.5151C9.43405 32.5151 9.32596 32.407 9.32596 32.2737V31.3079H8.92354C8.47904 31.3079 8.11871 31.6682 8.11871 32.1127V32.9175C8.11871 33.362 8.47904 33.7223 8.92354 33.7223H28.2394C28.6839 33.7223 29.0443 33.362 29.0443 32.9175V32.5151H9.56741Z" fill="#9FACBA"/>
<path d="M33.7123 28.8129H3.37024C2.03672 28.8129 0.95575 27.7319 0.95575 26.3984V2.49497C0.95575 1.60145 1.36066 0.740765 2.08219 0.323219C2.43736 0.117666 2.84983 0 3.28975 0H33.7928C35.1263 0 36.2073 1.08097 36.2073 2.41449V26.4789C36.2073 26.9188 36.0896 27.3313 35.884 27.6864C35.4665 28.408 34.6058 28.8129 33.7123 28.8129Z" fill="#B6C4CF"/>
<path d="M3.48498 27.6861C2.71042 27.6861 2.08249 27.0581 2.08249 26.2836V0.32373C1.36104 0.741276 0.875244 1.52091 0.875244 2.41443V26.4788C0.875244 27.8123 1.95621 28.8933 3.28973 28.8933H33.7928C34.6863 28.8933 35.4659 28.4075 35.8835 27.6861H3.48498Z" fill="#9FACBA"/>
<path d="M32.9075 26.3983H4.17507C3.73056 26.3983 3.37024 26.038 3.37024 25.5935V3.29974C3.37024 2.85523 3.73056 2.49491 4.17507 2.49491L4.497 2.41443H32.9879C33.4325 2.41443 33.7928 2.77475 33.7928 3.21926V25.2716L33.7123 25.5935C33.7123 26.038 33.352 26.3983 32.9075 26.3983Z" fill="#F8F7F7"/>
<path d="M4.89939 25.2716C4.67718 25.2716 4.49698 25.0914 4.49698 24.8692V2.41443H4.09456C3.65006 2.41443 3.28973 2.77475 3.28973 3.21926V25.674C3.28973 26.1185 3.65006 26.4788 4.09456 26.4788H32.9879C33.4324 26.4788 33.7928 26.1185 33.7928 25.674V25.2716H4.89939Z" fill="#E8E8E8"/>
<path d="M29.4467 17.7062H7.71634C7.04962 17.7062 6.50909 17.1657 6.50909 16.4989V13.2796C6.50909 12.6129 7.04962 12.0724 7.71634 12.0724H29.4467C30.1134 12.0724 30.654 12.6129 30.654 13.2796V16.4989C30.654 17.1657 30.1134 17.7062 29.4467 17.7062Z" fill="#B6C4CF"/>
<path d="M29.4467 11.4689H7.71632C6.71777 11.4689 5.90546 12.2812 5.90546 13.2797V16.4991C5.90546 17.4976 6.71777 18.3099 7.71632 18.3099H29.4467C30.4453 18.3099 31.2576 17.4976 31.2576 16.4991V13.2797C31.2576 12.2812 30.4453 11.4689 29.4467 11.4689ZM17.3743 12.6761H19.7888C20.1221 12.6761 20.3924 12.9464 20.3924 13.2797V16.4991C20.3924 16.8324 20.1221 17.1027 19.7888 17.1027H17.3743C17.0409 17.1027 16.7706 16.8324 16.7706 16.4991V13.2797C16.7706 12.9464 17.0409 12.6761 17.3743 12.6761ZM14.9598 17.1027H12.5453C12.2119 17.1027 11.9417 16.8324 11.9417 16.4991V13.2797C11.9417 12.9464 12.2119 12.6761 12.5453 12.6761H14.9598C15.2931 12.6761 15.5634 12.9464 15.5634 13.2797V16.4991C15.5634 16.8324 15.2931 17.1027 14.9598 17.1027ZM22.2032 12.6761H24.6177C24.9511 12.6761 25.2214 12.9464 25.2214 13.2797V16.4991C25.2214 16.8324 24.9511 17.1027 24.6177 17.1027H22.2032C21.8699 17.1027 21.5996 16.8324 21.5996 16.4991V13.2797C21.5996 12.9464 21.8699 12.6761 22.2032 12.6761ZM7.1127 16.4991V13.2797C7.1127 12.9464 7.38296 12.6761 7.71632 12.6761H10.1308C10.4642 12.6761 10.7344 12.9464 10.7344 13.2797V16.4991C10.7344 16.8324 10.4642 17.1027 10.1308 17.1027H7.71632C7.38296 17.1027 7.1127 16.8324 7.1127 16.4991ZM30.0503 16.4991C30.0503 16.8324 29.7801 17.1027 29.4467 17.1027H27.0322C26.6989 17.1027 26.4286 16.8324 26.4286 16.4991V13.2797C26.4286 12.9464 26.6989 12.6761 27.0322 12.6761H29.4467C29.7801 12.6761 30.0503 12.9464 30.0503 13.2797V16.4991Z" fill="#9FACBA"/>
<path d="M14.5573 10.2616H12.9477C12.6143 10.2616 12.3441 9.9913 12.3441 9.65794C12.3441 9.32458 12.6143 9.05432 12.9477 9.05432H14.5573C14.8907 9.05432 15.161 9.32458 15.161 9.65794C15.161 9.9913 14.8907 10.2616 14.5573 10.2616Z" fill="#E8E8E8"/>
<path d="M19.3863 10.2616H17.7767C17.4433 10.2616 17.173 9.9913 17.173 9.65794C17.173 9.32458 17.4433 9.05432 17.7767 9.05432H19.3863C19.7197 9.05432 19.9899 9.32458 19.9899 9.65794C19.9899 9.9913 19.7197 10.2616 19.3863 10.2616Z" fill="#E8E8E8"/>
<path d="M24.2153 10.2616H22.6056C22.2723 10.2616 22.002 9.9913 22.002 9.65794C22.002 9.32458 22.2723 9.05432 22.6056 9.05432H24.2153C24.5487 9.05432 24.8189 9.32458 24.8189 9.65794C24.8189 9.9913 24.5487 10.2616 24.2153 10.2616Z" fill="#E8E8E8"/>
<path d="M29.0443 10.2616H27.4346C27.1013 10.2616 26.831 9.9913 26.831 9.65794C26.831 9.32458 27.1013 9.05432 27.4346 9.05432H29.0443C29.3776 9.05432 29.6479 9.32458 29.6479 9.65794C29.6479 9.9913 29.3776 10.2616 29.0443 10.2616Z" fill="#E8E8E8"/>
<path d="M9.72836 10.2616H8.1187C7.78534 10.2616 7.51508 9.9913 7.51508 9.65794C7.51508 9.32458 7.78534 9.05432 8.1187 9.05432H9.72836C10.0617 9.05432 10.332 9.32458 10.332 9.65794C10.332 9.9913 10.0617 10.2616 9.72836 10.2616Z" fill="#E8E8E8"/>
<path d="M19.7887 22.1328C19.7887 21.4661 19.2482 20.9255 18.5815 20.9255C18.4152 20.9255 18.2567 20.9592 18.1126 21.0199C17.6787 21.203 17.4547 21.6323 17.4547 22.1328C17.4547 22.7995 17.9148 23.2595 18.5815 23.2595C19.0815 23.2595 19.5106 23.036 19.6938 22.6027C19.7549 22.4583 19.7887 22.2995 19.7887 22.1328Z" fill="#DF646E"/>
<path d="M14.9597 22.1328C14.9597 21.4661 14.4192 20.9255 13.7525 20.9255C13.5862 20.9255 13.4277 20.9592 13.2836 21.0199C12.8497 21.203 12.6257 21.6323 12.6257 22.1328C12.6257 22.7995 13.0858 23.2595 13.7525 23.2595C14.2525 23.2595 14.6816 23.036 14.8648 22.6027C14.9259 22.4583 14.9597 22.2995 14.9597 22.1328Z" fill="#DF646E"/>
<path d="M10.1308 22.1328C10.1308 21.4661 9.59023 20.9255 8.92351 20.9255C8.75724 20.9255 8.59877 20.9592 8.45462 21.0199C8.02074 21.203 7.79675 21.6323 7.79675 22.1328C7.79675 22.7995 8.25679 23.2595 8.92351 23.2595C9.42355 23.2595 9.85261 23.036 10.0359 22.6027C10.097 22.4583 10.1308 22.2995 10.1308 22.1328Z" fill="#DF646E"/>
<path d="M24.6177 22.1328C24.6177 21.4661 24.0772 20.9255 23.4105 20.9255C23.2442 20.9255 23.0857 20.9592 22.9416 21.0199C22.5077 21.203 22.2837 21.6323 22.2837 22.1328C22.2837 22.7995 22.7437 23.2595 23.4105 23.2595C23.9105 23.2595 24.3395 23.036 24.5228 22.6027C24.5839 22.4583 24.6177 22.2995 24.6177 22.1328Z" fill="#DF646E"/>
<path d="M29.4467 22.1328C29.4467 21.4661 28.9062 20.9255 28.2394 20.9255C28.0732 20.9255 27.9147 20.9592 27.7705 21.0199C27.3367 21.203 27.1127 21.6323 27.1127 22.1328C27.1127 22.7995 27.5727 23.2595 28.2394 23.2595C28.7395 23.2595 29.1685 23.036 29.3518 22.6027C29.4129 22.4583 29.4467 22.2995 29.4467 22.1328Z" fill="#DF646E"/>
<path d="M19.2254 22.6962C18.5587 22.6962 18.0181 22.1556 18.0181 21.4889C18.0181 21.3226 18.0518 21.1642 18.1126 21.02C17.6788 21.203 17.3743 21.6323 17.3743 22.1328C17.3743 22.7995 17.9148 23.34 18.5815 23.34C19.082 23.34 19.5112 23.0355 19.6943 22.6017C19.5501 22.6625 19.3917 22.6962 19.2254 22.6962Z" fill="#DC4955"/>
<path d="M14.3964 22.6962C13.7297 22.6962 13.1892 22.1556 13.1892 21.4889C13.1892 21.3226 13.2228 21.1642 13.2836 21.02C12.8498 21.203 12.5453 21.6323 12.5453 22.1328C12.5453 22.7995 13.0858 23.34 13.7525 23.34C14.253 23.34 14.6823 23.0355 14.8653 22.6017C14.7211 22.6625 14.5627 22.6962 14.3964 22.6962Z" fill="#DC4955"/>
<path d="M9.56742 22.6962C8.90069 22.6962 8.36017 22.1556 8.36017 21.4889C8.36017 21.3226 8.39381 21.1642 8.45466 21.02C8.02086 21.203 7.71631 21.6323 7.71631 22.1328C7.71631 22.7995 8.25683 23.34 8.92355 23.34C9.42399 23.34 9.85329 23.0355 10.0363 22.6017C9.89216 22.6625 9.73369 22.6962 9.56742 22.6962Z" fill="#DC4955"/>
<path d="M24.0544 22.6962C23.3876 22.6962 22.8471 22.1556 22.8471 21.4889C22.8471 21.3226 22.8808 21.1642 22.9416 21.02C22.5078 21.203 22.2032 21.6323 22.2032 22.1328C22.2032 22.7995 22.7438 23.34 23.4105 23.34C23.9109 23.34 24.3402 23.0355 24.5232 22.6017C24.3791 22.6625 24.2206 22.6962 24.0544 22.6962Z" fill="#DC4955"/>
<path d="M28.8833 22.6962C28.2166 22.6962 27.676 22.1556 27.676 21.4889C27.676 21.3226 27.7097 21.1642 27.7705 21.02C27.3367 21.203 27.0322 21.6323 27.0322 22.1328C27.0322 22.7995 27.5727 23.34 28.2394 23.34C28.7399 23.34 29.1691 23.0355 29.3522 22.6017C29.208 22.6625 29.0495 22.6962 28.8833 22.6962Z" fill="#DC4955"/>
<path d="M19.4668 6.63986H16.006C15.6727 6.63986 15.4024 6.3696 15.4024 6.03624C15.4024 5.70288 15.6727 5.43262 16.006 5.43262H19.4668C19.8002 5.43262 20.0704 5.70288 20.0704 6.03624C20.0704 6.3696 19.8002 6.63986 19.4668 6.63986Z" fill="#E8E8E8"/>
<path d="M13.5915 6.63986H7.71629C7.38293 6.63986 7.11267 6.3696 7.11267 6.03624C7.11267 5.70288 7.38293 5.43262 7.71629 5.43262H13.5915C13.9249 5.43262 14.1952 5.70288 14.1952 6.03624C14.1952 6.3696 13.9249 6.63986 13.5915 6.63986Z" fill="#E8E8E8"/>
<path d="M30.4125 4.82898H28.4809C28.3475 4.82898 28.2394 4.93707 28.2394 5.07043V7.00202C28.2394 7.13538 28.3475 7.24347 28.4809 7.24347H30.4125C30.5458 7.24347 30.6539 7.13538 30.6539 7.00202V5.07043C30.6539 4.93707 30.5458 4.82898 30.4125 4.82898Z" fill="#B6C4CF"/>
<path d="M8.92351 15.8954C8.59015 15.8954 8.31989 15.6251 8.31989 15.2918V14.4869C8.31989 14.1536 8.59015 13.8833 8.92351 13.8833C9.25687 13.8833 9.52713 14.1536 9.52713 14.4869V15.2918C9.52713 15.6251 9.25687 15.8954 8.92351 15.8954Z" fill="#9FACBA"/>
<path d="M13.7525 15.8954C13.4191 15.8954 13.1489 15.6251 13.1489 15.2918V14.4869C13.1489 14.1536 13.4191 13.8833 13.7525 13.8833C14.0858 13.8833 14.3561 14.1536 14.3561 14.4869V15.2918C14.3561 15.6251 14.0858 15.8954 13.7525 15.8954Z" fill="#9FACBA"/>
<path d="M18.5815 15.8954C18.2481 15.8954 17.9778 15.6251 17.9778 15.2918V14.4869C17.9778 14.1536 18.2481 13.8833 18.5815 13.8833C18.9148 13.8833 19.1851 14.1536 19.1851 14.4869V15.2918C19.1851 15.6251 18.9148 15.8954 18.5815 15.8954Z" fill="#9FACBA"/>
<path d="M23.4104 15.8954C23.0771 15.8954 22.8068 15.6251 22.8068 15.2918V14.4869C22.8068 14.1536 23.0771 13.8833 23.4104 13.8833C23.7438 13.8833 24.0141 14.1536 24.0141 14.4869V15.2918C24.0141 15.6251 23.7438 15.8954 23.4104 15.8954Z" fill="#9FACBA"/>
<path d="M28.2394 15.8954C27.9061 15.8954 27.6358 15.6251 27.6358 15.2918V14.4869C27.6358 14.1536 27.9061 13.8833 28.2394 13.8833C28.5728 13.8833 28.843 14.1536 28.843 14.4869V15.2918C28.843 15.6251 28.5728 15.8954 28.2394 15.8954Z" fill="#9FACBA"/>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.37318 13.8499C-0.790913 10.6858 -0.79085 5.53728 2.37318 2.37312C5.53734 -0.79104 10.6858 -0.79104 13.8499 2.37312C16.5342 5.05748 16.9408 9.0498 15.0706 12.1674C15.0706 12.1674 14.9363 12.3928 15.1177 12.5741C16.1527 13.609 19.2581 16.7144 19.2581 16.7144C20.0822 17.5385 20.2784 18.6908 19.5476 19.4217L19.4217 19.5474C18.6909 20.2784 17.5385 20.0823 16.7145 19.2581C16.7145 19.2581 13.6157 16.1593 12.5828 15.1265C12.3927 14.9363 12.1674 15.0707 12.1674 15.0707C9.04987 16.9408 5.05754 16.5343 2.37318 13.8499ZM12.3516 12.3516C14.6896 10.0137 14.6896 6.20953 12.3516 3.87154C10.0136 1.53361 6.20946 1.53355 3.87154 3.87154C1.53355 6.20946 1.53355 10.0137 3.87154 12.3516C6.20953 14.6895 10.0136 14.6895 12.3516 12.3516Z" fill="#999999" fill-opacity="0.3"/>
<path d="M11.8337 7.62992C11.9425 7.62992 12.0531 7.60853 12.1598 7.56349C12.5857 7.38322 12.785 6.89176 12.6047 6.46576C11.4717 3.78817 8.37155 2.53161 5.69403 3.66465C5.26809 3.84493 5.06881 4.33639 5.24908 4.76239C5.42942 5.18839 5.92075 5.38754 6.34688 5.20734C8.1737 4.43432 10.289 5.29167 11.062 7.11849C11.1972 7.43799 11.5074 7.62992 11.8337 7.62992Z" fill="#999999" fill-opacity="0.3"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,16 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 24C8.8072 24 5.79717 22.7483 3.52439 20.4756C1.25166 18.2028 0 15.1928 0 12C0 8.8072 1.25166 5.79717 3.52444 3.52444C5.79717 1.25166 8.8072 0 12 0C15.1928 0 18.2028 1.25166 20.4756 3.52444C22.7483 5.79717 24 8.8072 24 12C24 15.1928 22.7483 18.2028 20.4756 20.4756C18.2028 22.7483 15.1928 24 12 24Z" fill="#EDF3F9"/>
<path d="M20.4756 20.4756C22.7483 18.2028 24 15.1928 24 12C24 8.8072 22.7483 5.79717 20.4756 3.52444C18.2028 1.25166 15.1928 0 12 0V24C15.1928 24 18.2028 22.7483 20.4756 20.4756Z" fill="#C2DBF2"/>
<path d="M12 22.5938C17.8508 22.5938 22.5938 17.8508 22.5938 12C22.5938 6.14923 17.8508 1.40625 12 1.40625C6.14923 1.40625 1.40625 6.14923 1.40625 12C1.40625 17.8508 6.14923 22.5938 12 22.5938Z" fill="#465A61"/>
<path d="M22.5938 12C22.5938 6.15858 17.8414 1.40625 12 1.40625V22.5938C17.8414 22.5938 22.5938 17.8414 22.5938 12Z" fill="#3B4A51"/>
<path d="M7.88953 9.29576C7.37672 10.072 7.07812 11.002 7.07812 12V12.7031H2.85938V12C2.85938 9.83717 3.61453 7.84779 4.87453 6.28076L7.88953 9.29576Z" fill="#F36A3D"/>
<path d="M21.1408 12V12.7031H16.922V12C16.922 11.002 16.6234 10.072 16.1106 9.29576L19.1256 6.28076C20.3856 7.84779 21.1408 9.83717 21.1408 12Z" fill="#66A6FF"/>
<path d="M19.1255 6.28078L16.1105 9.29578C15.2292 7.96078 13.7161 7.07812 12 7.07812V2.85938C14.8772 2.85938 17.4488 4.19578 19.1255 6.28078Z" fill="#FFDF40"/>
<path d="M12 2.85938V7.07812C10.2839 7.07812 8.77076 7.96078 7.88951 9.29578L4.87451 6.28078C6.55123 4.19578 9.12279 2.85938 12 2.85938Z" fill="#FF9F40"/>
<path d="M11.2969 8.48438H12.7031V14.8594H11.2969V8.48438Z" fill="#F36A3D"/>
<path d="M12 8.48438H12.7031V14.8594H12V8.48438Z" fill="#EC4C36"/>
<path d="M12 24C15.1066 24 17.625 21.4816 17.625 18.375C17.625 15.2684 15.1066 12.75 12 12.75C8.8934 12.75 6.375 15.2684 6.375 18.375C6.375 21.4816 8.8934 24 12 24Z" fill="#FFDF40"/>
<path d="M17.625 18.375C17.625 15.2734 15.1016 12.75 12 12.75V24C15.1016 24 17.625 21.4766 17.625 18.375Z" fill="#FFBE40"/>
<path d="M11.8818 21.5776L10.7118 20.7976L11.7983 19.1678L10.3921 17.7615L12.1182 15.1724L13.2882 15.9524L12.2017 17.5823L13.6079 18.9886L11.8818 21.5776Z" fill="#465A61"/>
<path d="M12.1182 15.1724L12 15.3496V21.4004L13.6079 18.9886L12.2017 17.5823L13.2882 15.9524L12.1182 15.1724Z" fill="#3B4A51"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,26 @@
<svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.1346 0H3.09615C1.3862 0 0 1.3862 0 3.09615V19.9038C0 21.6138 1.3862 23 3.09615 23H18.1346C19.8446 23 21.2308 21.6138 21.2308 19.9038V3.09615C21.2308 1.3862 19.8446 0 18.1346 0Z" fill="#EF5350"/>
<path d="M20.6445 1.29056C17.6514 17.7494 4.1507 20.9781 0.482056 21.5556C0.760485 21.9974 1.1462 22.3615 1.60328 22.6141C2.06036 22.8666 2.57393 22.9994 3.09614 23H18.1346C18.9554 22.999 19.7424 22.6725 20.3228 22.0921C20.9032 21.5116 21.2298 20.7247 21.2308 19.9038V3.09615C21.2306 2.44752 21.0254 1.81554 20.6445 1.29056Z" fill="#E53935"/>
<path d="M18.1347 1.76923H3.09621C2.36337 1.76923 1.76929 2.36331 1.76929 3.09615V12.8269C1.76929 13.5598 2.36337 14.1538 3.09621 14.1538H18.1347C18.8675 14.1538 19.4616 13.5598 19.4616 12.8269V3.09615C19.4616 2.36331 18.8675 1.76923 18.1347 1.76923Z" fill="#BBDEFB"/>
<path d="M16.5513 12.3846C16.8258 11.4606 16.8808 10.4852 16.7119 9.53621C16.543 8.58718 16.1549 7.69068 15.5785 6.91809C15.0021 6.14549 14.2532 5.51814 13.3916 5.08598C12.53 4.65381 11.5793 4.42877 10.6154 4.42877C9.65145 4.42877 8.70082 4.65381 7.83918 5.08598C6.97755 5.51814 6.2287 6.14549 5.65227 6.91809C5.07583 7.69068 4.68773 8.58718 4.51885 9.53621C4.34997 10.4852 4.40498 11.4606 4.67951 12.3846L2.875 12.1635V2.875H18.3558V12.1635L16.5513 12.3846Z" fill="#90CAF9"/>
<path d="M10.6154 5.30769C10.5573 5.30772 10.4998 5.2963 10.4461 5.27408C10.3924 5.25187 10.3436 5.21929 10.3026 5.17821C10.2615 5.13713 10.2289 5.08836 10.2067 5.03468C10.1845 4.981 10.1731 4.92347 10.1731 4.86538V3.09615C10.1731 2.97884 10.2197 2.86634 10.3026 2.78339C10.3856 2.70044 10.4981 2.65384 10.6154 2.65384C10.7327 2.65384 10.8452 2.70044 10.9282 2.78339C11.0111 2.86634 11.0577 2.97884 11.0577 3.09615V4.86538C11.0577 4.92347 11.0463 4.981 11.0241 5.03468C11.0019 5.08836 10.9693 5.13713 10.9282 5.17821C10.8872 5.21929 10.8384 5.25187 10.7847 5.27408C10.731 5.2963 10.6735 5.30772 10.6154 5.30769Z" fill="#37474F"/>
<path d="M6.54954 6.99182C6.49145 6.99189 6.43392 6.98047 6.38026 6.95823C6.32659 6.93599 6.27785 6.90336 6.23683 6.86223L4.995 5.62039C4.9133 5.5372 4.86776 5.42511 4.86829 5.30851C4.86882 5.19191 4.91537 5.08024 4.99782 4.99779C5.08027 4.91534 5.19194 4.86879 5.30854 4.86826C5.42514 4.86773 5.53723 4.91327 5.62043 4.99497L6.86226 6.2368C6.9241 6.29866 6.96621 6.37746 6.98327 6.46325C7.00032 6.54904 6.99156 6.63796 6.9581 6.71877C6.92463 6.79958 6.86795 6.86865 6.79523 6.91725C6.72251 6.96585 6.63701 6.9918 6.54954 6.99182Z" fill="#37474F"/>
<path d="M14.6812 6.99184C14.5938 6.99182 14.5083 6.96587 14.4355 6.91727C14.3628 6.86867 14.3061 6.79959 14.2727 6.71878C14.2392 6.63797 14.2304 6.54906 14.2475 6.46327C14.2646 6.37748 14.3067 6.29868 14.3685 6.23682L15.6103 4.99499C15.6513 4.95331 15.7001 4.92015 15.7539 4.89743C15.8077 4.87471 15.8655 4.86288 15.9239 4.86261C15.9823 4.86235 16.0402 4.87366 16.0942 4.89589C16.1482 4.91812 16.1973 4.95084 16.2386 4.99214C16.2799 5.03345 16.3126 5.08253 16.3349 5.13655C16.3571 5.19057 16.3684 5.24846 16.3681 5.30687C16.3679 5.36529 16.356 5.42307 16.3333 5.47689C16.3106 5.5307 16.2774 5.57948 16.2358 5.62041L14.9939 6.86224C14.9529 6.90338 14.9042 6.93601 14.8505 6.95825C14.7969 6.98049 14.7393 6.99191 14.6812 6.99184Z" fill="#37474F"/>
<path d="M10.6154 11.0577C10.5573 11.0578 10.4997 11.0463 10.4461 11.0241C10.3924 11.0019 10.3437 10.9692 10.3026 10.9281L7.48769 8.11314C7.40475 8.0302 7.35815 7.91771 7.35815 7.80041C7.35815 7.68312 7.40475 7.57063 7.48769 7.48769C7.57063 7.40475 7.68312 7.35815 7.80041 7.35815C7.91771 7.35815 8.0302 7.40475 8.11314 7.48769L10.9281 10.3027C10.9899 10.3645 11.032 10.4433 11.0491 10.5291C11.0661 10.6149 11.0574 10.7038 11.0239 10.7846C10.9904 10.8654 10.9338 10.9345 10.861 10.9831C10.7883 11.0317 10.7028 11.0577 10.6154 11.0577Z" fill="#37474F"/>
<path d="M3.98083 19.9039C5.20222 19.9039 6.19236 18.9137 6.19236 17.6923C6.19236 16.4709 5.20222 15.4808 3.98083 15.4808C2.75943 15.4808 1.76929 16.4709 1.76929 17.6923C1.76929 18.9137 2.75943 19.9039 3.98083 19.9039Z" fill="#CFD8DC"/>
<path d="M5.7035 16.3228C5.78399 16.7463 5.75972 17.1831 5.6328 17.5952C5.50588 18.0072 5.28016 18.382 4.9753 18.6868C4.67043 18.9917 4.29567 19.2174 3.88363 19.3443C3.47159 19.4713 3.03477 19.4955 2.61121 19.415C2.9987 19.7293 3.48188 19.9017 3.98075 19.9038C4.56708 19.9032 5.12919 19.6699 5.54379 19.2553C5.95838 18.8407 6.1916 18.2786 6.19229 17.6923C6.19015 17.1934 6.0177 16.7103 5.7035 16.3228Z" fill="#B0BEC5"/>
<path d="M17.25 19.9039C18.4714 19.9039 19.4615 18.9137 19.4615 17.6923C19.4615 16.4709 18.4714 15.4808 17.25 15.4808C16.0286 15.4808 15.0385 16.4709 15.0385 17.6923C15.0385 18.9137 16.0286 19.9039 17.25 19.9039Z" fill="#CFD8DC"/>
<path d="M18.9728 16.3228C19.0533 16.7463 19.029 17.1831 18.9021 17.5952C18.7752 18.0072 18.5495 18.382 18.2446 18.6868C17.9397 18.9917 17.565 19.2174 17.1529 19.3443C16.7409 19.4713 16.3041 19.4955 15.8805 19.415C16.268 19.7293 16.7512 19.9017 17.25 19.9038C17.8364 19.9032 18.3985 19.6699 18.8131 19.2553C19.2277 18.8407 19.4609 18.2786 19.4616 17.6923C19.4594 17.1934 19.287 16.7103 18.9728 16.3228Z" fill="#B0BEC5"/>
<path d="M4.42312 17.6923C4.42277 17.8095 4.37606 17.9218 4.29319 18.0047C4.21032 18.0876 4.09802 18.1343 3.98082 18.1346H1.81351C1.75455 17.8427 1.75455 17.5419 1.81351 17.25H3.98082C4.09802 17.2504 4.21032 17.2971 4.29319 17.3799C4.37606 17.4628 4.42277 17.5751 4.42312 17.6923Z" fill="#546E7A"/>
<path d="M19.0989 16.4716L17.5641 18.0064C17.4802 18.0886 17.3675 18.1346 17.25 18.1346C17.1326 18.1346 17.0199 18.0886 16.936 18.0064C16.8531 17.9228 16.8066 17.81 16.8066 17.6923C16.8066 17.5747 16.8531 17.4618 16.936 17.3783L18.4708 15.8435C18.7181 16.0111 18.9312 16.2243 19.0989 16.4716Z" fill="#546E7A"/>
<path d="M15.4808 21.6731H5.75005C5.63274 21.6731 5.52024 21.6265 5.43729 21.5435C5.35434 21.4606 5.30774 21.3481 5.30774 21.2308C5.30774 21.1135 5.35434 21.0009 5.43729 20.918C5.52024 20.8351 5.63274 20.7885 5.75005 20.7885H15.4808C15.5981 20.7885 15.7106 20.8351 15.7936 20.918C15.8765 21.0009 15.9231 21.1135 15.9231 21.2308C15.9231 21.3481 15.8765 21.4606 15.7936 21.5435C15.7106 21.6265 15.5981 21.6731 15.4808 21.6731Z" fill="#37474F"/>
<path d="M14.1539 19.9038H7.07695C6.95964 19.9038 6.84714 19.8572 6.76419 19.7743C6.68124 19.6913 6.63464 19.5788 6.63464 19.4615C6.63464 19.3442 6.68124 19.2317 6.76419 19.1488C6.84714 19.0658 6.95964 19.0192 7.07695 19.0192H14.1539C14.2712 19.0192 14.3837 19.0658 14.4666 19.1488C14.5496 19.2317 14.5962 19.3442 14.5962 19.4615C14.5962 19.5788 14.5496 19.6913 14.4666 19.7743C14.3837 19.8572 14.2712 19.9038 14.1539 19.9038Z" fill="#37474F"/>
<path d="M14.1539 16.3654H7.07695C6.95964 16.3654 6.84714 16.3188 6.76419 16.2358C6.68124 16.1529 6.63464 16.0404 6.63464 15.9231C6.63464 15.8058 6.68124 15.6933 6.76419 15.6103C6.84714 15.5274 6.95964 15.4808 7.07695 15.4808H14.1539C14.2712 15.4808 14.3837 15.5274 14.4666 15.6103C14.5496 15.6933 14.5962 15.8058 14.5962 15.9231C14.5962 16.0404 14.5496 16.1529 14.4666 16.2358C14.3837 16.3188 14.2712 16.3654 14.1539 16.3654Z" fill="#37474F"/>
<path d="M18.1347 1.76923H3.09621C2.74441 1.76961 2.40712 1.90953 2.15836 2.1583C1.90959 2.40706 1.76967 2.74435 1.76929 3.09615V12.8269C1.76967 13.1787 1.90959 13.516 2.15836 13.7648C2.40712 14.0135 2.74441 14.1535 3.09621 14.1538H18.1347C18.4865 14.1535 18.8238 14.0135 19.0725 13.7648C19.3213 13.516 19.4612 13.1787 19.4616 12.8269V3.09615C19.4612 2.74435 19.3213 2.40706 19.0725 2.1583C18.8238 1.90953 18.4865 1.76961 18.1347 1.76923ZM17.2501 11.0577H13.7116C13.6535 11.0577 13.596 11.0463 13.5423 11.0241C13.4886 11.0019 13.4398 10.9693 13.3988 10.9282C13.3577 10.8871 13.3251 10.8384 13.3029 10.7847C13.2807 10.731 13.2693 10.6735 13.2693 10.6154C13.2693 9.91154 12.9897 9.23652 12.492 8.73883C11.9943 8.24113 11.3193 7.96153 10.6154 7.96153C9.9116 7.96153 9.23658 8.24113 8.73889 8.73883C8.2412 9.23652 7.9616 9.91154 7.9616 10.6154C7.96163 10.6735 7.95021 10.731 7.92799 10.7847C7.90578 10.8384 7.8732 10.8871 7.83212 10.9282C7.79104 10.9693 7.74227 11.0019 7.68859 11.0241C7.63491 11.0463 7.57738 11.0577 7.51929 11.0577H3.98083C3.92273 11.0577 3.8652 11.0463 3.81152 11.0241C3.75784 11.0019 3.70907 10.9693 3.66799 10.9282C3.62691 10.8871 3.59434 10.8384 3.57212 10.7847C3.5499 10.731 3.53848 10.6735 3.53852 10.6154C3.53852 8.73846 4.28412 6.93842 5.6113 5.61124C6.93848 4.28406 8.73852 3.53846 10.6154 3.53846C12.4924 3.53846 14.2924 4.28406 15.6196 5.61124C16.9468 6.93842 17.6924 8.73846 17.6924 10.6154C17.6924 10.6735 17.681 10.731 17.6588 10.7847C17.6365 10.8384 17.604 10.8871 17.5629 10.9282C17.5218 10.9693 17.473 11.0019 17.4194 11.0241C17.3657 11.0463 17.3082 11.0577 17.2501 11.0577Z" fill="#FFEE58"/>
<path d="M18.1347 1.76923H18.1031C17.4341 11.9799 5.19342 12.4807 1.76929 12.4194V12.8269C1.76967 13.1787 1.90959 13.516 2.15836 13.7648C2.40712 14.0135 2.74441 14.1535 3.09621 14.1538H18.1347C18.4865 14.1535 18.8238 14.0135 19.0725 13.7648C19.3213 13.516 19.4612 13.1787 19.4616 12.8269V3.09615C19.4612 2.74435 19.3213 2.40706 19.0725 2.1583C18.8238 1.90953 18.4865 1.76961 18.1347 1.76923Z" fill="#90CAF9"/>
<path d="M18.1347 1.76923H18.1031C18.0218 3.53365 17.4778 5.24565 16.5259 6.7335C17.2874 7.88491 17.693 9.23498 17.6924 10.6154C17.6924 10.6735 17.681 10.731 17.6588 10.7847C17.6365 10.8384 17.604 10.8871 17.5629 10.9282C17.5218 10.9693 17.473 11.0019 17.4194 11.0241C17.3657 11.0463 17.3082 11.0577 17.2501 11.0577H13.7116C13.6535 11.0577 13.596 11.0463 13.5423 11.0241C13.4886 11.0019 13.4398 10.9693 13.3988 10.9282C13.3577 10.8871 13.3251 10.8384 13.3029 10.7847C13.2807 10.731 13.2693 10.6735 13.2693 10.6154C13.2688 10.3667 13.2332 10.1193 13.1635 9.88054C9.14984 12.2871 3.84304 12.4565 1.76929 12.4194V12.8269C1.76967 13.1787 1.90959 13.516 2.15836 13.7648C2.40712 14.0135 2.74441 14.1535 3.09621 14.1538H18.1347C18.4865 14.1535 18.8238 14.0135 19.0725 13.7648C19.3213 13.516 19.4612 13.1787 19.4616 12.8269V3.09615C19.4612 2.74435 19.3213 2.40706 19.0725 2.1583C18.8238 1.90953 18.4865 1.76961 18.1347 1.76923Z" fill="#FDD835"/>
<path d="M10.6154 12.3846C11.5925 12.3846 12.3847 11.5925 12.3847 10.6154C12.3847 9.63827 11.5925 8.84616 10.6154 8.84616C9.6383 8.84616 8.84619 9.63827 8.84619 10.6154C8.84619 11.5925 9.6383 12.3846 10.6154 12.3846Z" fill="#CFD8DC"/>
<path d="M11.9109 9.41928C11.9288 9.52222 11.9393 9.62632 11.9423 9.73076C11.9418 10.3171 11.7086 10.8793 11.2939 11.2939C10.8793 11.7085 10.3172 11.9417 9.73079 11.9423C9.62635 11.9393 9.52225 11.9288 9.41931 11.9108C9.75346 12.2224 10.1955 12.392 10.6523 12.3841C11.1091 12.3761 11.545 12.191 11.868 11.868C12.1911 11.5449 12.3761 11.1091 12.3841 10.6523C12.3921 10.1955 12.2224 9.75343 11.9109 9.41928Z" fill="#B0BEC5"/>
<path d="M3.53842 4.86538C4.02698 4.86538 4.42304 4.37031 4.42304 3.75961C4.42304 3.14891 4.02698 2.65384 3.53842 2.65384C3.04986 2.65384 2.65381 3.14891 2.65381 3.75961C2.65381 4.37031 3.04986 4.86538 3.53842 4.86538Z" fill="white"/>
<path d="M3.09612 6.63462C3.3404 6.63462 3.53842 6.43659 3.53842 6.19231C3.53842 5.94803 3.3404 5.75 3.09612 5.75C2.85184 5.75 2.65381 5.94803 2.65381 6.19231C2.65381 6.43659 2.85184 6.63462 3.09612 6.63462Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,41 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.998 2.5882C11.8004 2.5882 11.6403 2.42817 11.6403 2.23069V0.357516C11.6403 0.160078 11.8004 0 11.998 0C12.1956 0 12.3558 0.160031 12.3558 0.357516V2.23073C12.3558 2.42817 12.1956 2.5882 11.998 2.5882Z" fill="#E6E2E6"/>
<path d="M5.22457 2.5882C5.02699 2.5882 4.86682 2.42817 4.86682 2.23069V0.357516C4.86682 0.160078 5.02699 0 5.22457 0C5.42215 0 5.58232 0.160031 5.58232 0.357516V2.23073C5.58232 2.42817 5.42215 2.5882 5.22457 2.5882Z" fill="#E6E2E6"/>
<path d="M18.7714 2.5882C18.5738 2.5882 18.4137 2.42817 18.4137 2.23069V0.357516C18.4137 0.160078 18.5739 0 18.7714 0C18.969 0 19.1292 0.160031 19.1292 0.357516V2.23073C19.1292 2.42817 18.969 2.5882 18.7714 2.5882Z" fill="#E6E2E6"/>
<path d="M17.6937 1.7467H19.8492C20.0782 1.7467 20.2814 1.8937 20.3528 2.1112L20.7326 3.26672C20.7832 3.42084 20.6683 3.57942 20.506 3.57942H17.0369C16.8746 3.57942 16.7596 3.42084 16.8103 3.26672L17.19 2.1112C17.2615 1.8937 17.4647 1.7467 17.6937 1.7467Z" fill="#545454"/>
<path d="M17.6935 3.57938H19.8492C20.0782 3.57938 20.2814 3.72638 20.3528 3.94383L20.7326 5.0993C20.7832 5.25342 20.6683 5.412 20.506 5.412H17.0369C16.8746 5.412 16.7596 5.25342 16.8103 5.0993L17.1901 3.94359C17.2615 3.72628 17.4646 3.57938 17.6935 3.57938Z" fill="#545454"/>
<path d="M17.6935 5.41205H19.8492C20.0782 5.41205 20.2814 5.55905 20.3528 5.77655L20.7326 6.93206C20.7832 7.08619 20.6683 7.24477 20.506 7.24477H17.0369C16.8746 7.24477 16.7596 7.08619 16.8103 6.93206L17.1901 5.77636C17.2615 5.55895 17.4646 5.41205 17.6935 5.41205Z" fill="#545454"/>
<path d="M13.0759 1.7467H10.9203C10.6912 1.7467 10.488 1.8937 10.4166 2.1112L10.0369 3.26672C9.9862 3.42084 10.1011 3.57942 10.2635 3.57942H13.7325C13.8949 3.57942 14.0098 3.42084 13.9591 3.26672L13.5793 2.11102C13.5079 1.89361 13.3049 1.7467 13.0759 1.7467Z" fill="#545454"/>
<path d="M13.0757 3.57938H10.9203C10.6912 3.57938 10.4881 3.72638 10.4166 3.94383L10.0369 5.0993C9.9862 5.25342 10.1011 5.412 10.2635 5.412H13.7325C13.8949 5.412 14.0098 5.25342 13.9591 5.0993L13.5794 3.94378C13.508 3.72638 13.3048 3.57938 13.0757 3.57938Z" fill="#545454"/>
<path d="M13.0759 5.41205H10.9203C10.6912 5.41205 10.4881 5.55905 10.4166 5.77655L10.0369 6.93206C9.9862 7.08619 10.1011 7.24477 10.2635 7.24477H13.7325C13.8949 7.24477 14.0098 7.08619 13.9591 6.93206L13.5793 5.77636C13.5079 5.55895 13.3049 5.41205 13.0759 5.41205Z" fill="#545454"/>
<path d="M6.30253 1.7467H4.14689C3.91781 1.7467 3.71465 1.8937 3.64321 2.1112L3.26343 3.26667C3.21276 3.4208 3.3277 3.57938 3.49003 3.57938H6.9591C7.12143 3.57938 7.23637 3.4208 7.1857 3.26667L6.80592 2.11097C6.73448 1.89361 6.53146 1.7467 6.30253 1.7467Z" fill="#545454"/>
<path d="M3.44264 2.72137L3.26343 3.26667C3.21276 3.4208 3.3277 3.57937 3.49003 3.57937H6.9591C7.12143 3.57937 7.23637 3.4208 7.1857 3.26667L7.0065 2.72137H3.44264Z" fill="#494949"/>
<path d="M6.30248 3.57938H4.14684C3.91776 3.57938 3.71461 3.72638 3.64317 3.94383L3.26343 5.0993C3.21276 5.25342 3.3277 5.412 3.49003 5.412H6.95911C7.12143 5.412 7.23637 5.25342 7.1857 5.0993L6.80592 3.94359C6.73443 3.72628 6.53142 3.57938 6.30248 3.57938Z" fill="#545454"/>
<path d="M3.44264 4.55405L3.26343 5.09934C3.21276 5.25347 3.3277 5.41205 3.49003 5.41205H6.9591C7.12143 5.41205 7.23637 5.25347 7.1857 5.09934L7.0065 4.55405H3.44264Z" fill="#494949"/>
<path d="M6.30225 5.41205H4.14684C3.91776 5.41205 3.71461 5.55905 3.64317 5.77655L3.26343 6.93206C3.21276 7.08619 3.3277 7.24477 3.49003 7.24477H6.95911C7.12143 7.24477 7.23637 7.08619 7.1857 6.93206L6.80596 5.77655C6.73448 5.55905 6.53132 5.41205 6.30225 5.41205Z" fill="#545454"/>
<path d="M3.44264 6.38666L3.26343 6.93196C3.21276 7.08608 3.3277 7.24466 3.49003 7.24466H6.9591C7.12143 7.24466 7.23637 7.08608 7.1857 6.93196L7.0065 6.38666H3.44264Z" fill="#494949"/>
<path d="M10.2161 2.72137L10.0369 3.26667C9.9862 3.4208 10.1011 3.57937 10.2635 3.57937H13.7325C13.8949 3.57937 14.0098 3.4208 13.9591 3.26667L13.7799 2.72137H10.2161Z" fill="#494949"/>
<path d="M10.2161 4.55405L10.0369 5.09934C9.9862 5.25347 10.1011 5.41205 10.2635 5.41205H13.7325C13.8949 5.41205 14.0098 5.25347 13.9591 5.09934L13.7799 4.55405H10.2161Z" fill="#494949"/>
<path d="M10.2161 6.38666L10.0369 6.93196C9.9862 7.08608 10.1011 7.24466 10.2635 7.24466H13.7325C13.8949 7.24466 14.0098 7.08608 13.9591 6.93196L13.7799 6.38666H10.2161Z" fill="#494949"/>
<path d="M16.9895 2.72137L16.8103 3.26667C16.7596 3.4208 16.8746 3.57937 17.0369 3.57937H20.506C20.6683 3.57937 20.7832 3.4208 20.7326 3.26667L20.5534 2.72137H16.9895Z" fill="#494949"/>
<path d="M16.9895 4.55405L16.8103 5.09934C16.7596 5.25347 16.8746 5.41205 17.0369 5.41205H20.506C20.6683 5.41205 20.7832 5.25347 20.7326 5.09934L20.5534 4.55405H16.9895Z" fill="#494949"/>
<path d="M16.9895 6.38666L16.8103 6.93196C16.7596 7.08608 16.8746 7.24466 17.0369 7.24466H20.506C20.6683 7.24466 20.7832 7.08608 20.7326 6.93196L20.5534 6.38666H16.9895Z" fill="#494949"/>
<path d="M11.0522 7.24466H12.9437V8.88885H11.0522V7.24466Z" fill="#545454"/>
<path d="M4.27881 7.24466H6.17031V8.88885H4.27881V7.24466Z" fill="#545454"/>
<path d="M19.7172 8.88892H17.8257V7.24473H19.7172V8.88892Z" fill="#545454"/>
<path d="M1.21143 10.9806H22.7886V21.9083H1.21143V10.9806Z" fill="#545454"/>
<path d="M1.21143 10.9806H22.7886V11.8386H1.21143V10.9806Z" fill="#494949"/>
<path d="M11.998 12.3605C11.8004 12.3605 11.6403 12.2004 11.6403 12.003V10.7935C11.6403 10.596 11.8004 10.436 11.998 10.436C12.1956 10.436 12.3558 10.596 12.3558 10.7935V12.003C12.3558 12.2004 12.1956 12.3605 11.998 12.3605Z" fill="#E6E2E6"/>
<path d="M5.22457 12.3605C5.02699 12.3605 4.86682 12.2004 4.86682 12.003V10.7935C4.86682 10.596 5.02699 10.436 5.22457 10.436C5.42215 10.436 5.58232 10.596 5.58232 10.7935V12.003C5.58232 12.2004 5.42215 12.3605 5.22457 12.3605Z" fill="#E6E2E6"/>
<path d="M18.7714 12.3605C18.5738 12.3605 18.4137 12.2004 18.4137 12.003V10.7935C18.4137 10.596 18.5739 10.436 18.7714 10.436C18.969 10.436 19.1292 10.596 19.1292 10.7935V12.003C19.1292 12.2004 18.969 12.3605 18.7714 12.3605Z" fill="#E6E2E6"/>
<path d="M23.5233 10.9806H0.476672C0.213422 10.9806 0 10.7672 0 10.5039V9.36559C0 9.10234 0.213422 8.88892 0.476672 8.88892H23.5233C23.7865 8.88892 24 9.10234 24 9.36559V10.5039C24 10.7672 23.7866 10.9806 23.5233 10.9806Z" fill="#A8A7A8"/>
<path d="M23.5231 10.1226H0.476859C0.213516 10.1226 0 9.90929 0 9.64609V10.5041C0 10.7673 0.213516 10.9806 0.476859 10.9806H23.5231C23.7865 10.9806 24 10.7673 24 10.5041V9.64609C24 9.90929 23.7865 10.1226 23.5231 10.1226Z" fill="#818181"/>
<path d="M23.5233 24H0.476672C0.213422 24 0 23.7866 0 23.5234V22.385C0 22.1217 0.213422 21.9083 0.476672 21.9083H23.5233C23.7865 21.9083 24 22.1217 24 22.385V23.5234C24 23.7866 23.7866 24 23.5233 24Z" fill="#A8A7A8"/>
<path d="M23.5231 23.142H0.476859C0.213516 23.142 0 22.9287 0 22.6655V23.5235C0 23.7867 0.213516 24 0.476859 24H23.5231C23.7865 24 24 23.7867 24 23.5235V22.6655C24 22.9287 23.7865 23.142 23.5231 23.142Z" fill="#818181"/>
<path d="M15.6454 19.172L12.6056 14.0633C12.3317 13.6029 11.6644 13.6029 11.3904 14.0633L8.35062 19.172C8.07068 19.6425 8.4102 20.2384 8.95816 20.2384H15.0378C15.5858 20.2384 15.9253 19.6425 15.6454 19.172Z" fill="#F6E266"/>
<path d="M15.6023 19.0995C15.4767 19.2667 15.2772 19.3804 15.0379 19.3804H8.95829C8.71894 19.3804 8.51944 19.2667 8.39387 19.0995L8.35074 19.172C8.0708 19.6425 8.41032 20.2384 8.95829 20.2384H15.0379C15.5859 20.2384 15.9254 19.6425 15.6454 19.172L15.6023 19.0995Z" fill="#FFC239"/>
<path d="M11.0522 8.06677H12.9437V8.88887H11.0522V8.06677Z" fill="#494949"/>
<path d="M4.27881 8.06677H6.17031V8.88887H4.27881V8.06677Z" fill="#494949"/>
<path d="M17.8257 8.06677H19.7172V8.88887H17.8257V8.06677Z" fill="#494949"/>
<path d="M11.9225 15.9461L10.9958 17.4033C10.9256 17.5136 10.9211 17.6534 10.9841 17.7679C11.0471 17.8825 11.1675 17.9536 11.2983 17.9536H11.7902L11.2135 18.8605C11.1073 19.0275 11.1567 19.2488 11.3237 19.355C11.4658 19.449 11.7038 19.4221 11.8185 19.2448L12.7453 17.7876C12.8154 17.6773 12.8198 17.5376 12.7569 17.423C12.6939 17.3085 12.5735 17.2373 12.4427 17.2373H11.9508L12.5276 16.3304C12.6338 16.1634 12.5844 15.942 12.4173 15.8359C12.2503 15.7298 12.0287 15.7792 11.9225 15.9461Z" fill="#DD636E"/>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -1,5 +1,4 @@
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -171,6 +171,9 @@ class GarageDoorBloc extends Bloc<GarageDoorEvent, GarageDoorSensorState> {
code: 'switch_1',
);
recordGroups = response;
emit(UpdateState(garageSensor: deviceStatus));
} on DioException catch (e) {
final errorData = e.response!.data;

View File

@ -0,0 +1,792 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart';
import 'package:syncrow_app/features/devices/model/device_report_model.dart';
import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
class PowerClampBloc extends Bloc<PowerClampEvent, PowerClampState> {
final String PCId;
PowerClampBloc({
required this.PCId,
}) : super(const PowerClampState()) {
on<PowerClampInitial>(_fetchPowerClampInfo);
// on<ReportLogsInitial>(fetchLogsForLastMonth);
// on<FetchEnergyData>(_mapReportToEnergyData);
on<SelectDateEvent>(checkDayMonthYearSelected);
on<FilterRecordsByDateEvent>(_filterRecordsByDate);
}
DateTime? dateTime = DateTime.now();
String formattedDate = DateFormat('yyyy/MM/dd').format(DateTime.now());
bool lowBattery = false;
bool closingReminder = false;
bool doorAlarm = false;
PowerClampModel deviceStatus = PowerClampModel(
productType: '',
productUuid: '',
status: PowerStatus(
phaseA: Phase(
dataPoints: [
DataPoint(
code: '', customName: '', dpId: 0, time: 0, type: '', value: 0),
],
),
phaseB: Phase(
dataPoints: [
DataPoint(
code: '', customName: '', dpId: 0, time: 0, type: '', value: 0),
],
),
phaseC: Phase(
dataPoints: [
DataPoint(
code: '', customName: '', dpId: 0, time: 0, type: '', value: 0),
],
),
general: Phase(
dataPoints: [
DataPoint(
code: '', customName: '', dpId: 0, time: 0, type: '', value: 0),
],
),
),
);
void _fetchPowerClampInfo(
PowerClampInitial event, Emitter<PowerClampState> emit) async {
emit(PowerClampLoadingState());
try {
var response = await DevicesAPI.getPowerClampStatus(PCId);
PowerClampModel deviceStatus = PowerClampModel.fromJson(response);
emit(UpdateState(powerClampModel: deviceStatus));
} catch (e) {
emit(PowerClampFailedState(errorMessage: e.toString()));
return;
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
EventDevice recordGroupsDateTime =
EventDevice(code: '', eventTime: DateTime.now(), value: '');
List<EventDevice> record = [
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-11 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-11 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-12 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-13 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-14 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-15 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-16 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-17 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-18 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-19 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-20 11:14:13'),
value: '2284'),
];
List<EventDevice> filteredRecords = [];
int currentIndex = 0;
final List<String> views = ['Day', 'Month', 'Year'];
Widget dateSwitcher() {
void switchView(int direction) {
currentIndex = (currentIndex + direction + views.length) % views.length;
}
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: const Icon(Icons.arrow_left),
onPressed: () {
setState(() {
switchView(-1);
});
},
),
Text(
views[currentIndex],
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w500),
),
IconButton(
icon: const Icon(Icons.arrow_right),
onPressed: () {
setState(() {
switchView(1);
});
},
),
],
);
},
);
}
void checkDayMonthYearSelected(
SelectDateEvent event, Emitter<PowerClampState> emit) async {
emit(PowerClampLoadingState());
if (currentIndex == 0) {
await dayMonthYearPicker(context: event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy/MM/dd').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
} else if (currentIndex == 1) {
await selectMonthAndYear(event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy-MM').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
} else if (currentIndex == 2) {
await selectYear(event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
}
emit(DateSelectedState());
}
Future<DateTime?> selectMonthAndYear(BuildContext context) async {
int selectedYear = DateTime.now().year;
int selectedMonth = DateTime.now().month;
FixedExtentScrollController yearController =
FixedExtentScrollController(initialItem: selectedYear - 1905);
FixedExtentScrollController monthController =
FixedExtentScrollController(initialItem: selectedMonth - 1);
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 300,
child: Column(
children: [
const Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Select Month and Year',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
const Divider(),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Spacer(),
Expanded(
child: ListWheelScrollView.useDelegate(
controller: yearController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedYear = 1905 + index;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
(1905 + index).toString(),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 200,
),
),
),
Expanded(
flex: 2,
child: ListWheelScrollView.useDelegate(
controller: monthController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedMonth = index + 1;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
DateFormat.MMMM()
.format(DateTime(0, index + 1)),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 12,
),
),
),
const Spacer(),
],
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
final selectedDateTime =
DateTime(selectedYear, selectedMonth);
Navigator.of(context).pop(selectedDateTime);
},
),
],
),
),
],
),
);
},
);
}
Future<DateTime?> selectYear(BuildContext context) async {
int selectedYear = DateTime.now().year;
FixedExtentScrollController yearController =
FixedExtentScrollController(initialItem: selectedYear - 1905);
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 300,
child: Column(
children: [
const Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Select Year',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
const Divider(),
Expanded(
child: ListWheelScrollView.useDelegate(
controller: yearController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedYear = 1905 + index;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
(1905 + index).toString(),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 200,
),
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context)
.pop(); // Pops without value, returning null
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
final selectedDateTime = DateTime(selectedYear);
Navigator.of(context).pop(
selectedDateTime); // Pops with the selected date
},
),
],
),
),
],
),
);
},
);
}
Future<DateTime?> dayMonthYearPicker({
required BuildContext context,
}) async {
DateTime selectedDate = DateTime.now(); // Default selected date
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 350, // Increased height to accommodate the buttons
child: Column(
children: [
Expanded(
child: CupertinoDatePicker(
mode: CupertinoDatePickerMode.date,
initialDateTime: DateTime.now(),
minimumYear: 1900,
maximumYear: DateTime.now().year,
onDateTimeChanged: (DateTime newDateTime) {
selectedDate =
newDateTime; // Update the selected date when changed
},
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context)
.pop(); // Dismiss the modal without returning a value
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context)
.pop(selectedDate); // Return the selected date
},
),
],
),
),
],
),
);
},
);
}
List<EnergyData> energyDataList = [];
void _filterRecordsByDate(
FilterRecordsByDateEvent event, Emitter<PowerClampState> emit) {
emit(PowerClampLoadingState());
if (event.viewType == 'Year') {
filteredRecords = record
.where((record) => record.eventTime!.year == event.selectedDate.year)
.toList();
} else if (event.viewType == 'Month') {
filteredRecords = record
.where((record) =>
record.eventTime!.year == event.selectedDate.year &&
record.eventTime!.month == event.selectedDate.month)
.toList();
} else if (event.viewType == 'Day') {
filteredRecords = record
.where((record) =>
record.eventTime!.year == event.selectedDate.year &&
record.eventTime!.month == event.selectedDate.month &&
record.eventTime!.day == event.selectedDate.day)
.toList();
}
String getMonthShortName(int month) {
final date = DateTime(0, month);
return DateFormat.MMM().format(date);
}
energyDataList = filteredRecords.map((eventDevice) {
return EnergyData(
event.viewType == 'Year'
? getMonthShortName(
int.tryParse(DateFormat('MM').format(eventDevice.eventTime!))!)
: event.viewType == 'Month'
? DateFormat('yyyy/MM/dd').format(eventDevice.eventTime!)
: DateFormat('HH:mm:ss').format(eventDevice.eventTime!),
double.parse(eventDevice.value!),
);
}).toList();
Future.delayed(const Duration(milliseconds: 500));
emit(FilterRecordsState(filteredRecords: energyDataList));
}
}
// Event for filtering records by date
// _listenToChanges() {
// try {
// DatabaseReference ref =
// FirebaseDatabase.instance.ref('device-status/$PCId');
// Stream<DatabaseEvent> stream = ref.onValue;
// stream.listen((DatabaseEvent event) async {
// if (_timer != null) {
// await Future.delayed(const Duration(seconds: 2));
// }
// Map<dynamic, dynamic> usersMap =
// event.snapshot.value as Map<dynamic, dynamic>;
// List<StatusModel> statusList = [];
// usersMap['status'].forEach((element) {
// statusList.add(StatusModel(code: element['code'], value: true));
// });
// deviceStatus = PowerClampModel.fromJson(statusList);
// if (!isClosed) {
// add(
// PowerClampSwitch(switchD: deviceStatus.doorContactState),
// );
// }
// });
// } catch (_) {}
// }
// New Function: Convert the device report data into EnergyData and emit it.
// void _mapReportToEnergyData(
// FetchEnergyData event, Emitter<PowerClampState> emit) {
// try {
// List<EnergyData> energyDataList = recordGroups.data
// ?.map((event) {
// if (event.code == "VoltageA" && event.eventTime != null) {
// // Convert eventTime to readable format
// DateTime eventDateTime =
// DateTime.fromMillisecondsSinceEpoch(event.eventTime!);
// String formattedTime =
// "${eventDateTime.hour}:${eventDateTime.minute.toString().padLeft(2, '0')} ${eventDateTime.hour >= 12 ? 'PM' : 'AM'}";
// double value = double.tryParse(event.value ?? "0") ?? 0;
// return EnergyData(
// formattedTime, value / 1000); // Assume kWh format
// }
// return null;
// })
// .where((data) => data != null)
// .cast<EnergyData>()
// .toList() ??
// [];
// emit(EnergyDataState(energyData: energyDataList));
// } catch (e) {
// emit(PowerClampFailedState(errorMessage: e.toString()));
// }
// }
// Future<void> selectTimeOfLinePassword(
// SelectDateEvent event, Emitter<PowerClampState> emit) async {
// emit(ChangeTimeState());
// final DateTime? picked = await showDatePicker(
// initialDatePickerMode: DatePickerMode.year,
// context: event.context,
// initialDate: DateTime.now(),
// firstDate: DateTime(1905),
// lastDate: DateTime(2101),
// );
// if (picked != null) {
// final selectedDateTime = DateTime(
// picked.year,
// picked.month,
// picked.day,
// 0,
// 0,
// );
// final selectedTimestamp = DateTime(
// selectedDateTime.year,
// selectedDateTime.month,
// selectedDateTime.day,
// selectedDateTime.hour,
// selectedDateTime.minute,
// ).millisecondsSinceEpoch ~/
// 1000;
// DateTime dateTime = selectedDateTime;
// formattedDate = DateFormat('yyyy/MM/dd').format(dateTime);
// emit(DateSelectedState());
// }
// }
// void _fetchStatus(
// PowerClampInitial event, Emitter<PowerClampState> emit) async {
// emit(PowerClampLoadingState());
// try {
// var response = await DevicesAPI.getDeviceStatus(PCId);
// List<StatusModel> statusModelList = [];
// for (var status in response['status']) {
// statusModelList.add(StatusModel.fromJson(status));
// }
// deviceStatus = PowerClampModel.fromJson(
// statusModelList,
// );
// emit(UpdateState(powerClampModel: deviceStatus));
// Future.delayed(const Duration(milliseconds: 500));
// // _listenToChanges();
// } catch (e) {
// emit(PowerClampFailedState(errorMessage: e.toString()));
// return;
// }
// }
// Future<void> fetchLogsForLastMonth(
// ReportLogsInitial event, Emitter<PowerClampState> emit) async {
// DateTime now = DateTime.now();
// DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
// int startTime = lastMonth.millisecondsSinceEpoch;
// int endTime = now.millisecondsSinceEpoch;
// try {
// emit(PowerClampLoadingState());
// var response = await DevicesAPI.getReportLogs(
// startTime: startTime.toString(),
// endTime: endTime.toString(),
// deviceUuid: PCId,
// code: event.code!,
// );
// recordGroups = response;
// record = recordGroups.data!.map((event) {
// return EventDevice(
// code: event.code,
// eventTime: event.eventTime != null
// ? DateTime.fromMillisecondsSinceEpoch(event.eventTime!)
// : null,
// value: event.value,
// );
// }).toList();
// for (var event in record) {
// print(
// 'Code: ${event.code}, Event Time: ${DateFormat('yyyy-MM-dd hh:mm:ss a').format(event.eventTime!)}, Value: ${event.value}');
// }
// emit(UpdateState(powerClampModel: deviceStatus));
// } on DioException catch (e) {
// final errorData = e.response!.data;
// String errorMessage = errorData['message'];
// }
// }
// int transformTimestamp(int originalTime) {
// DateTime originalDateTime =
// DateTime.fromMillisecondsSinceEpoch(originalTime);
// DateTime transformedDateTime = originalDateTime.add(Duration(hours: 1));
// return transformedDateTime.millisecondsSinceEpoch;
// }
// void addDataToRecord(List<Map<String, dynamic>> rawData) {
// for (var dataPoint in rawData) {
// EventDevice event = EventDevice.fromJson(dataPoint);
// record.add(event);
// }
// }

View File

@ -0,0 +1,119 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
abstract class PowerClampEvent extends Equatable {
const PowerClampEvent();
@override
List<Object> get props => [];
}
class PowerClampLoading extends PowerClampEvent {}
class PowerClampSwitch extends PowerClampEvent {
final bool switchD;
final String deviceId;
final String productId;
const PowerClampSwitch(
{required this.switchD, this.deviceId = '', this.productId = ''});
@override
List<Object> get props => [switchD, deviceId, productId];
}
class PowerClampUpdated extends PowerClampEvent {}
class FetchEnergyData extends PowerClampEvent {}
class SelectDateEvent extends PowerClampEvent {
BuildContext context;
SelectDateEvent({required this.context});
}
class PowerClampInitial extends PowerClampEvent {
const PowerClampInitial();
}
class ReportLogsInitial extends PowerClampEvent {
final String? code;
const ReportLogsInitial({required this.code});
@override
List<Object> get props => [code!];
}
class PowerClampChangeStatus extends PowerClampEvent {}
class GetCounterEvent extends PowerClampEvent {
final String deviceCode;
const GetCounterEvent({required this.deviceCode});
@override
List<Object> get props => [deviceCode];
}
class ToggleLowBatteryEvent extends PowerClampEvent {
final bool isLowBatteryEnabled;
const ToggleLowBatteryEvent(this.isLowBatteryEnabled);
@override
List<Object> get props => [isLowBatteryEnabled];
}
class ToggleClosingReminderEvent extends PowerClampEvent {
final bool isClosingReminderEnabled;
const ToggleClosingReminderEvent(this.isClosingReminderEnabled);
@override
List<Object> get props => [isClosingReminderEnabled];
}
class ToggleDoorAlarmEvent extends PowerClampEvent {
final bool isDoorAlarmEnabled;
const ToggleDoorAlarmEvent(this.isDoorAlarmEnabled);
@override
List<Object> get props => [isDoorAlarmEnabled];
}
class SetCounterValue extends PowerClampEvent {
final Duration duration;
final String deviceCode;
const SetCounterValue({required this.duration, required this.deviceCode});
@override
List<Object> get props => [duration, deviceCode];
}
class StartTimer extends PowerClampEvent {
final int duration;
const StartTimer(this.duration);
@override
List<Object> get props => [duration];
}
class TickTimer extends PowerClampEvent {
final int remainingTime;
const TickTimer(this.remainingTime);
@override
List<Object> get props => [remainingTime];
}
class StopTimer extends PowerClampEvent {}
class OnClose extends PowerClampEvent {}
class FilterRecordsByDateEvent extends PowerClampEvent {
final DateTime selectedDate;
final String viewType; // 'Day', 'Month', 'Year'
const FilterRecordsByDateEvent(
{required this.selectedDate, required this.viewType});
}

View File

@ -0,0 +1,57 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
class PowerClampState extends Equatable {
const PowerClampState();
@override
List<Object> get props => [];
}
class PowerClampInitialState extends PowerClampState {}
class PowerClampLoadingState extends PowerClampState {}
class ChangeTimeState extends PowerClampState {}
class DateSelectedState extends PowerClampState {}
//DateSelectedState
class PowerClampFailedState extends PowerClampState {
final String errorMessage;
const PowerClampFailedState({required this.errorMessage});
@override
List<Object> get props => [errorMessage];
}
class UpdateState extends PowerClampState {
final PowerClampModel powerClampModel;
const UpdateState({required this.powerClampModel});
@override
List<Object> get props => [powerClampModel];
}
class LoadingNewSate extends PowerClampState {
final PowerClampModel powerClampModel;
const LoadingNewSate({required this.powerClampModel});
@override
List<Object> get props => [powerClampModel];
}
class EnergyDataState extends PowerClampState {
final List<EnergyData> energyData;
const EnergyDataState({required this.energyData});
}
// State for filtered records
class FilterRecordsState extends PowerClampState {
final List<EnergyData> filteredRecords;
const FilterRecordsState({required this.filteredRecords});
}

View File

@ -76,6 +76,8 @@ class DeviceModel {
tempIcon = Assets.gang3touch;
} else if (type == DeviceType.WaterLeak) {
tempIcon = Assets.waterLeakIcon;
} else if (type == DeviceType.PC) {
tempIcon = Assets.powerClampIcon;
} else {
tempIcon = Assets.assetsIconsLogo;
}

View File

@ -27,6 +27,33 @@ class DeviceReport {
};
}
class EventDevice {
final String? code;
final DateTime? eventTime;
final String? value;
EventDevice({
this.code,
this.eventTime,
this.value,
});
EventDevice.fromJson(Map<String, dynamic> json)
: code = json['code'] as String?,
eventTime = json['eventTime'] ,
value = json['value'] as String?;
Map<String, dynamic> toJson() => {
'code': code,
'eventTime': eventTime,
'value': value,
};
}
class DeviceEvent {
final String? code;
final int? eventTime;

View File

@ -0,0 +1,86 @@
// PowerClampModel class to represent the response
class PowerClampModel {
String productUuid;
String productType;
PowerStatus status;
PowerClampModel({
required this.productUuid,
required this.productType,
required this.status,
});
factory PowerClampModel.fromJson(Map<String, dynamic> json) {
return PowerClampModel(
productUuid: json['productUuid'],
productType: json['productType'],
status: PowerStatus.fromJson(json['status']),
);
}
}
class PowerStatus {
Phase phaseA;
Phase phaseB;
Phase phaseC;
Phase general;
PowerStatus({
required this.phaseA,
required this.phaseB,
required this.phaseC,
required this.general,
});
factory PowerStatus.fromJson(Map<String, dynamic> json) {
return PowerStatus(
phaseA: Phase.fromJson(json['phaseA']),
phaseB: Phase.fromJson(json['phaseB']),
phaseC: Phase.fromJson(json['phaseC']),
general: Phase.fromJson(json['general']
// List<DataPoint>.from(
// json['general'].map((x) => DataPoint.fromJson(x))),
));
}
}
class Phase {
List<DataPoint> dataPoints;
Phase({required this.dataPoints});
factory Phase.fromJson(List<dynamic> json) {
return Phase(
dataPoints: json.map((x) => DataPoint.fromJson(x)).toList(),
);
}
}
class DataPoint {
dynamic code;
dynamic customName;
dynamic dpId;
dynamic time;
dynamic type;
dynamic value;
DataPoint({
required this.code,
required this.customName,
required this.dpId,
required this.time,
required this.type,
required this.value,
});
factory DataPoint.fromJson(Map<String, dynamic> json) {
return DataPoint(
code: json['code'],
customName: json['customName'],
dpId: json['dpId'],
time: json['time'],
type: json['type'],
value: json['value'],
);
}
}

View File

@ -0,0 +1,177 @@
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class EnergyConsumptionPage extends StatefulWidget {
final List<dynamic> chartData;
final double totalConsumption;
final String date;
EnergyConsumptionPage({
required this.chartData,
required this.totalConsumption,
required this.date,
});
@override
_EnergyConsumptionPageState createState() => _EnergyConsumptionPageState();
}
class _EnergyConsumptionPageState extends State<EnergyConsumptionPage> {
late List<dynamic> _chartData;
@override
void initState() {
_chartData = widget.chartData;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 19),
child: LineChart(
LineChartData(
lineTouchData: LineTouchData(
handleBuiltInTouches: true,
touchSpotThreshold: 2,
getTouchLineEnd: (barData, spotIndex) {
return 10.0;
},
touchTooltipData: LineTouchTooltipData(
getTooltipColor: (touchTooltipItem) => Colors.white,
tooltipRoundedRadius: 10.0,
tooltipPadding: const EdgeInsets.all(8.0),
tooltipBorder: BorderSide(color: Colors.grey, width: 1),
getTooltipItems: (List<LineBarSpot> touchedSpots) {
return touchedSpots.map((spot) {
return LineTooltipItem(
'${spot.x},\n ${spot.y.toStringAsFixed(2)} kWh',
const TextStyle(
color: Colors.blue,
fontWeight: FontWeight.bold,
fontSize: 12,
),
);
}).toList();
},
)),
titlesData: FlTitlesData(
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: false,
),
),
leftTitles: const AxisTitles(
sideTitles: SideTitles(
showTitles: false,
),
),
rightTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: false,
),
),
topTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 70,
getTitlesWidget: (value, meta) {
int index = value.toInt();
if (index >= 0 && index < _chartData.length) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: RotatedBox(
quarterTurns: -1,
child: Text(_chartData[index].time,
style: TextStyle(fontSize: 10)),
),
);
}
return const SizedBox.shrink();
},
),
),
),
gridData: FlGridData(
show: true,
drawVerticalLine: true,
horizontalInterval: 1,
verticalInterval: 1,
getDrawingVerticalLine: (value) {
return FlLine(
color: Colors.grey.withOpacity(0.2),
dashArray: [8, 8],
strokeWidth: 1,
);
},
getDrawingHorizontalLine: (value) {
return FlLine(
color: Colors.grey.withOpacity(0.2),
dashArray: [5, 5],
strokeWidth: 1,
);
},
drawHorizontalLine: false,
),
lineBarsData: [
LineChartBarData(
preventCurveOvershootingThreshold: 0.1,
curveSmoothness: 0.5,
preventCurveOverShooting: true,
aboveBarData: BarAreaData(),
spots: _chartData
.asMap()
.entries
.map((entry) => FlSpot(
entry.key.toDouble(), entry.value.consumption))
.toList(),
isCurved: true,
color: ColorsManager.chart.withOpacity(0.6),
show: true,
shadow: Shadow(color: Colors.black12),
belowBarData: BarAreaData(
show: true,
gradient: LinearGradient(
colors: [
ColorsManager.chart.withOpacity(0.5),
Colors.blue.withOpacity(0.1),
],
begin: Alignment.center,
end: Alignment.bottomCenter,
),
),
dotData: FlDotData(
show: false,
),
isStrokeCapRound: true,
barWidth: 2,
),
],
borderData: FlBorderData(
show: false,
border: Border.all(
color: Color(0xff023DFE).withOpacity(0.7),
width: 10,
),
),
),
),
),
),
],
),
);
}
}
class EnergyData {
EnergyData(this.time, this.consumption);
final String time;
final double consumption;
}
//

View File

@ -0,0 +1,235 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_info_card.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import 'power_chart.dart';
class PowerClampCard extends StatelessWidget {
final bool? isGeneral;
final String? title;
final String? totalCurrent;
final String? totalActiveGeneral;
final String? totalCurrentGeneral;
final String? totalFrequencyGeneral;
final String? totalVoltage;
final String? totalActive;
final String? totalFrequency;
final String? dateTimeSelected;
final String? totalFactor;
final Widget? dateSwitcher;
final String? formattedDate;
final String? energyConsumption;
final Function()? selectDateEvent;
final List<EnergyData>? chartData;
final BuildContext? context;
const PowerClampCard({
Key? key,
this.isGeneral,
this.title,
this.totalCurrent,
this.totalActiveGeneral,
this.dateTimeSelected,
this.totalCurrentGeneral,
this.totalFrequencyGeneral,
this.totalVoltage,
this.totalActive,
this.totalFrequency,
this.totalFactor,
this.dateSwitcher,
this.formattedDate,
this.selectDateEvent,
this.chartData,
this.context,
this.energyConsumption,
//nConsumption
}) : super(key: key);
@override
Widget build(BuildContext context) {
return DefaultContainer(
child: Padding(
padding:
const EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Energy usage'),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyLarge(
text: title!,
fontSize: 20,
fontWeight: FontWeight.w700,
),
Row(
children: [
BodyLarge(
text: energyConsumption!,
fontSize: 20,
fontWeight: FontWeight.w700,
),
const BodySmall(text: 'kWh')
],
),
],
),
const SizedBox(
height: 10,
),
isGeneral == true
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
PowerClampInfoCard(
iconPath: Assets.powerActiveIcon,
title: 'Active',
value: '$totalActiveGeneral',
unit: ' w',
),
PowerClampInfoCard(
iconPath: Assets.voltMeterIcon,
title: 'Current',
value: '$totalCurrentGeneral',
unit: ' A',
),
PowerClampInfoCard(
iconPath: Assets.frequencyIcon,
title: 'Frequency',
value: '$totalFrequencyGeneral',
unit: ' Hz',
),
],
)
: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
PowerClampInfoCard(
iconPath: Assets.voltageIcon,
title: 'Voltage',
value: totalVoltage!,
unit: ' V',
),
PowerClampInfoCard(
iconPath: Assets.voltMeterIcon,
title: 'Current',
value: '$totalCurrent',
unit: ' A',
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
PowerClampInfoCard(
iconPath: Assets.powerActiveIcon,
title: 'Active Power',
value: '$totalActive',
unit: ' w',
),
PowerClampInfoCard(
iconPath: Assets.speedoMeter,
title: 'Power Factor',
value: '$totalFactor',
unit: '',
),
],
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const BodyMedium(
text: 'Total consumption',
fontSize: 12,
fontWeight: FontWeight.w700,
),
Text(
dateTimeSelected !,
style: const TextStyle(
fontSize: 8, fontWeight: FontWeight.w400),
),
],
),
const Row(
children: [
BodyMedium(
text: '1000.00 ',
fontSize: 12,
fontWeight: FontWeight.w700),
BodyMedium(
text: 'kWh',
fontSize: 8,
fontWeight: FontWeight.w700),
],
),
],
),
Expanded(
child: SizedBox(
child: EnergyConsumptionPage(
chartData: chartData!.isNotEmpty
? chartData!
: [
EnergyData('12:00 AM', 4.0),
EnergyData('01:00 AM', 3.5),
EnergyData('02:00 AM', 3.8),
EnergyData('03:00 AM', 3.2),
EnergyData('04:00 AM', 4.0),
EnergyData('05:00 AM', 3.4),
EnergyData('06:00 AM', 3.2),
EnergyData('07:00 AM', 3.5),
EnergyData('08:00 AM', 3.8),
EnergyData('09:00 AM', 3.6),
EnergyData('10:00 AM', 3.9),
EnergyData('11:00 AM', 4.0),
],
totalConsumption: chartData!
.fold(0, (sum, data) => sum + data.consumption),
date: '10/08/2024',
),
),
),
const SizedBox(
height: 5,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DefaultContainer(
padding: EdgeInsets.all(0),
color: ColorsManager.grayBox,
child: SizedBox(
child: dateSwitcher,
)),
InkWell(
onTap: selectDateEvent,
child: DefaultContainer(
color: ColorsManager.grayBox,
child: SizedBox(
child: Padding(
padding: const EdgeInsets.all(5),
child: Text(formattedDate!),
),
)),
),
],
)
]),
),
);
}
}

View File

@ -0,0 +1,242 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class PowerClampPage extends StatefulWidget {
final DeviceModel? device;
const PowerClampPage({super.key, this.device});
@override
State<PowerClampPage> createState() => _PowerClampPageState();
}
class _PowerClampPageState extends State<PowerClampPage> {
final PageController _pageController = PageController();
int _currentPage = 0;
static const int _pageCount = 4;
late PowerClampModel model;
@override
void initState() {
super.initState();
_pageController.addListener(_handlePageChange);
model = _initialPowerClampModel();
}
void _handlePageChange() {
int nextPage = _pageController.page?.round() ?? 0;
if (_currentPage != nextPage) {
setState(() {
_currentPage = nextPage;
});
}
}
@override
void dispose() {
_pageController.removeListener(_handlePageChange);
_pageController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Power Clamp',
child: BlocProvider(
create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '')
..add(const PowerClampInitial()),
// ..add(const ReportLogsInitial(code: 'VoltageA')),
child: BlocBuilder<PowerClampBloc, PowerClampState>(
builder: (context, state) {
final blocProvider = context.read<PowerClampBloc>();
List<EnergyData> chartData = [];
if (state is UpdateState) {
model = state.powerClampModel;
} else if (state is EnergyDataState) {
chartData = state.energyData;
} else if (state is FilterRecordsState) {
chartData = state.filteredRecords;
}
if (state is PowerClampLoadingState) {
return const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
);
}
return Column(
children: [
Flexible(
child: RefreshIndicator(
onRefresh: () async {
blocProvider.add(const PowerClampInitial());
},
child: PageView(controller: _pageController, children: [
_buildPowerClampCard(
title: 'Total Energy \nConsumption',
phase: model.status.general,
isGeneral: true,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase A Energy \nConsumption',
phase: model.status.phaseA,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase B Energy \nConsumption',
phase: model.status.phaseB,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase C Energy \nConsumption',
phase: model.status.phaseC,
chartData: chartData,
blocProvider: blocProvider,
),
]),
),
),
_buildPageIndicator(),
],
);
},
),
),
);
}
PowerClampModel _initialPowerClampModel() {
return PowerClampModel(
productType: '',
productUuid: '',
status: PowerStatus(
phaseA: Phase(dataPoints: _emptyDataPoints()),
phaseB: Phase(dataPoints: _emptyDataPoints()),
phaseC: Phase(dataPoints: _emptyDataPoints()),
general: Phase(dataPoints: _emptyDataPoints()),
),
);
}
List<DataPoint> _emptyDataPoints() {
return [
DataPoint(
code: '',
customName: '',
dpId: 0,
time: 0,
type: '',
value: 0,
),
];
}
List<Widget> _buildPowerClampCards(PowerClampModel model,
List<EnergyData> chartData, PowerClampBloc blocProvider) {
return [
_buildPowerClampCard(
title: 'Total Energy \nConsumption',
phase: model.status.general,
isGeneral: true,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase A Energy \nConsumption',
phase: model.status.phaseA,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase B Energy \nConsumption',
phase: model.status.phaseB,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase C Energy \nConsumption',
phase: model.status.phaseC,
chartData: chartData,
blocProvider: blocProvider,
),
];
}
Widget _buildPowerClampCard({
required String title,
required Phase phase,
bool isGeneral = false,
required List<EnergyData> chartData,
required PowerClampBloc blocProvider,
}) {
return PowerClampCard(
dateTimeSelected:blocProvider.formattedDate,
energyConsumption: _getValueOrNA(phase.dataPoints, isGeneral ? 0 : 5),
title: title,
isGeneral: isGeneral,
dateSwitcher: blocProvider.dateSwitcher(),
formattedDate: blocProvider.formattedDate,
selectDateEvent: () {
blocProvider.add(SelectDateEvent(context: context));
},
totalActiveGeneral: isGeneral ? _getValueOrNA(phase.dataPoints, 2) : null,
totalCurrentGeneral:
isGeneral ? _getValueOrNA(phase.dataPoints, 1) : null,
totalFrequencyGeneral:
isGeneral ? _getValueOrNA(phase.dataPoints, 4) : null,
totalFactor: !isGeneral ? _getValueOrNA(phase.dataPoints, 3) : null,
totalActive: !isGeneral ? _getValueOrNA(phase.dataPoints, 2) : null,
totalCurrent: !isGeneral ? _getValueOrNA(phase.dataPoints, 1) : null,
totalVoltage: !isGeneral ? _getValueOrNA(phase.dataPoints, 0) : null,
chartData: chartData,
context: context,
);
}
String _getValueOrNA(List<DataPoint> dataPoints, int index) {
return dataPoints.length > index
? dataPoints[index].value.toString()
: 'N/A';
}
Widget _buildPageIndicator() {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(_pageCount, (index) {
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
margin: const EdgeInsets.symmetric(horizontal: 4.0),
height: 10.0,
width: _currentPage == index ? 10.0 : 10.0,
decoration: BoxDecoration(
color:
_currentPage == index ? Colors.grey : ColorsManager.greyColor,
borderRadius: BorderRadius.circular(5.0),
),
);
}),
),
);
}
}

View File

@ -0,0 +1,312 @@
// import 'package:flutter/material.dart';
// import 'package:flutter_bloc/flutter_bloc.dart';
// import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart';
// import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart';
// import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart';
// import 'package:syncrow_app/features/devices/model/device_model.dart';
// import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
// import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
// import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart';
// import 'package:syncrow_app/features/shared_widgets/default_container.dart';
// import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
// import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
// class PowerClampTestPage extends StatefulWidget {
// late final DeviceModel? device;
// PowerClampTestPage({super.key, this.device});
// @override
// _PowerClampTestPageState createState() => _PowerClampTestPageState();
// }
// class _PowerClampTestPageState extends State<PowerClampTestPage> {
// final PageController _pageController = PageController();
// int _currentPage = 0;
// final int _pageCount = 4;
// @override
// void initState() {
// super.initState();
// _pageController.addListener(() {
// int nextPage = _pageController.page?.round() ?? 0;
// if (_currentPage != nextPage) {
// setState(() {
// _currentPage = nextPage;
// });
// }
// });
// }
// @override
// void dispose() {
// _pageController.dispose();
// super.dispose();
// }
// @override
// Widget build(BuildContext context) {
// return DefaultScaffold(
// title: 'Power Clamp',
// child: BlocProvider(
// create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '')
// ..add(const PowerClampInitial()),
// child: BlocBuilder<PowerClampBloc, PowerClampState>(
// builder: (context, state) {
// final _blocProvider = BlocProvider.of<PowerClampBloc>(context);
// PowerClampModel model = PowerClampModel(
// productType: '',
// productUuid: '',
// status: PowerStatus(
// phaseA: Phase(
// dataPoints: [
// DataPoint(
// code: '',
// customName: '',
// dpId: 0,
// time: 0,
// type: '',
// value: 0),
// ],
// ),
// phaseB: Phase(
// dataPoints: [
// DataPoint(
// code: '',
// customName: '',
// dpId: 0,
// time: 0,
// type: '',
// value: 0),
// ],
// ),
// phaseC: Phase(
// dataPoints: [
// DataPoint(
// code: '',
// customName: '',
// dpId: 0,
// time: 0,
// type: '',
// value: 0),
// ],
// ),
// general: Phase(
// dataPoints: [
// DataPoint(
// code: '',
// customName: '',
// dpId: 0,
// time: 0,
// type: '',
// value: 0),
// ],
// ),
// ),
// );
// List<EnergyData> chartData = [];
// if (state is UpdateState) {
// model = state.powerClampModel;
// } else if (state is EnergyDataState) {
// chartData = state.energyData;
// }
// return state is PowerClampLoadingState
// ? const Center(
// child: DefaultContainer(
// width: 50,
// height: 50,
// child: CircularProgressIndicator()),
// )
// : Column(
// children: [
// Flexible(
// child: RefreshIndicator(
// onRefresh: () async {
// _blocProvider.add(const PowerClampInitial());
// },
// child: PageView(
// controller: _pageController,
// children: [
// PowerClampCard(
// energyConsumption:
// model.status.general.dataPoints.length > 0
// ? model.status.general.dataPoints[0].value
// .toString()
// : 'N/A',
// title: 'Total Energy \nConsumption',
// isGeneral: true,
// dateSwitcher: Container(),
// formattedDate: _blocProvider.formattedDate,
// selectDateEvent: () {
// _blocProvider.add(
// SelectDateEvent(context: context));
// },
// totalFrequencyGeneral:
// model.status.general.dataPoints.length > 4
// ? model.status.general.dataPoints[4].value
// .toString()
// : 'N/A',
// totalActiveGeneral:
// model.status.general.dataPoints.length > 2
// ? model.status.general.dataPoints[2].value
// .toString()
// : 'N/A',
// totalCurrentGeneral:
// model.status.general.dataPoints.length > 1
// ? model.status.general.dataPoints[1].value
// .toString()
// : 'N/A',
// totalVoltage:
// model.status.general.dataPoints.length > 0
// ? model.status.general.dataPoints[0].value.toString()
// : 'N/A',
// chartData: chartData,
// context: context),
// PowerClampCard(
// energyConsumption:
// model.status.phaseA.dataPoints.length > 5
// ? model.status.phaseA.dataPoints[5].value
// .toString()
// : 'N/A',
// title: 'Phase A Energy \nConsumption',
// dateSwitcher: _blocProvider.dateSwitcher(),
// formattedDate: _blocProvider.formattedDate,
// selectDateEvent: () {
// _blocProvider.add(
// SelectDateEvent(context: context));
// },
// totalFactor: model.status.phaseA.dataPoints.length > 3
// ? model.status.phaseA.dataPoints[3].value
// .toString()
// : 'N/A',
// totalActive: model.status.phaseA.dataPoints.length > 2
// ? model.status.phaseA.dataPoints[2].value
// .toString()
// : 'N/A',
// totalCurrent:
// model.status.phaseA.dataPoints.length > 1
// ? model.status.phaseA.dataPoints[1]
// .value
// .toString()
// : 'N/A',
// totalVoltage:
// model.status.phaseA.dataPoints.length > 0
// ? model.status.phaseA.dataPoints[0]
// .value
// .toString()
// : 'N/A',
// chartData: chartData,
// context: context),
// PowerClampCard(
// energyConsumption:
// model.status.phaseB.dataPoints.length > 5
// ? model.status.phaseB.dataPoints[5].value
// .toString()
// : 'N/A',
// title: 'Phase B Energy \nConsumption',
// dateSwitcher: _blocProvider.dateSwitcher(),
// formattedDate: _blocProvider.formattedDate,
// selectDateEvent: () {
// _blocProvider.add(
// SelectDateEvent(context: context));
// },
// totalFactor: model.status.phaseA.dataPoints.length > 3
// ? model.status.phaseB.dataPoints[3].value
// .toString()
// : 'N/A',
// totalActive: model.status.phaseB.dataPoints.length > 2
// ? model.status.phaseB.dataPoints[2].value
// .toString()
// : 'N/A',
// totalCurrent:
// model.status.phaseB.dataPoints.length > 1
// ? model.status.phaseB.dataPoints[1]
// .value
// .toString()
// : 'N/A',
// totalVoltage:
// model.status.phaseB.dataPoints.length > 0
// ? model.status.phaseB.dataPoints[0]
// .value
// .toString()
// : 'N/A',
// chartData: chartData,
// context: context),
// PowerClampCard(
// energyConsumption:
// model.status.phaseC.dataPoints.length > 5
// ? model.status.phaseC.dataPoints[5].value
// .toString()
// : 'N/A',
// title: 'Phase A Energy \nConsumption',
// dateSwitcher: _blocProvider.dateSwitcher(),
// formattedDate: _blocProvider.formattedDate,
// selectDateEvent: () {
// _blocProvider.add(
// SelectDateEvent(context: context));
// },
// totalFactor: model.status.phaseC.dataPoints.length > 3
// ? model.status.phaseC.dataPoints[3].value
// .toString()
// : 'N/A',
// totalActive: model.status.phaseC.dataPoints.length > 2
// ? model.status.phaseC.dataPoints[2].value
// .toString()
// : 'N/A',
// totalCurrent:
// model.status.phaseC.dataPoints.length > 1
// ? model.status.phaseC.dataPoints[1]
// .value
// .toString()
// : 'N/A',
// totalVoltage:
// model.status.phaseC.dataPoints.length > 0
// ? model.status.phaseC.dataPoints[0]
// .value
// .toString()
// : 'N/A',
// chartData: chartData,
// context: context),
// ]),
// ),
// ),
// Padding(
// padding: const EdgeInsets.symmetric(vertical: 10.0),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: List.generate(_pageCount, (index) {
// return AnimatedContainer(
// duration: const Duration(milliseconds: 300),
// margin:
// const EdgeInsets.symmetric(horizontal: 4.0),
// height: 10.0,
// width: _currentPage == index
// ? 10.0
// : 10.0, // Change width for current page
// decoration: BoxDecoration(
// color: _currentPage == index
// ? Colors
// .grey // Use a different color for the active indicator
// : ColorsManager.greyColor,
// borderRadius: BorderRadius.circular(5.0),
// ),
// );
// }),
// ),
// ),
// ],
// );
// },
// ),
// ),
// );
// }
// }

View File

@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class PowerClampInfoCard extends StatelessWidget {
final String iconPath;
final String title;
final String value;
final String unit;
const PowerClampInfoCard({
Key? key,
required this.iconPath,
required this.title,
required this.value,
required this.unit,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: DefaultContainer(
height: 55,
color: ColorsManager.grayBox,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: SvgPicture.asset(
iconPath,
fit: BoxFit.fill,
),
),
Expanded(
flex: 3,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
BodyMedium(
fontWeight: FontWeight.w400,
fontSize: 8,
text: title,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
BodyMedium(
fontWeight: FontWeight.w700,
fontSize: 15,
text: value,
),
BodyMedium(
fontWeight: FontWeight.w700,
fontSize: 8,
text: unit,
),
],
),
],
),
)
],
),
),
),
);
}
}

View File

@ -1,30 +1,88 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/room_page_switch.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class RoomPage extends StatelessWidget {
class RoomPage extends StatefulWidget {
const RoomPage({super.key, required this.room});
final RoomModel room;
@override
_RoomPageState createState() => _RoomPageState();
}
class _RoomPageState extends State<RoomPage> {
final TextEditingController _searchController = TextEditingController();
List<dynamic> _filteredDevices = [];
@override
void initState() {
super.initState();
_filteredDevices = widget.room.devices ?? [];
_searchController.addListener(_filterDevices);
}
@override
void dispose() {
_searchController.removeListener(_filterDevices);
_searchController.dispose();
super.dispose();
}
void _filterDevices() {
final query = _searchController.text.toLowerCase();
setState(() {
_filteredDevices = widget.room.devices!
.where((device) => device.type!.toLowerCase().contains(query))
.toList();
});
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.5,
return Column(
children: [
if (widget.room.devices!.isNotEmpty)
TextFormField(
controller: _searchController,
decoration: InputDecoration(
hintText: 'Search',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
prefixIcon: Container(
padding: const EdgeInsets.all(5.0),
margin: const EdgeInsets.all(10.0),
child: SvgPicture.asset(
Assets.searchIcon,
fit: BoxFit.contain,
),
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
),
Expanded(
child: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.5,
),
padding: const EdgeInsets.only(top: 10),
itemCount: _filteredDevices.length,
itemBuilder: (context, index) {
return RoomPageSwitch(device: _filteredDevices[index]);
},
),
),
padding: const EdgeInsets.only(top: 10),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: room.devices!.length,
itemBuilder: (context, index) {
return RoomPageSwitch(device: room.devices![index]);
},
),
],
);
}
}

View File

@ -15,6 +15,7 @@ import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_view.d
import 'package:syncrow_app/features/devices/view/widgets/lights/light_interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_Interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_touch/one_touch_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_touch/three_touch_interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_Interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_touch/two_touch_Interface.dart';
@ -170,6 +171,13 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
pageBuilder: (context, animation1, animation2) =>
DoorSensorScreen(device: device)));
case DeviceType.PC:
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
PowerClampPage(device: device)));
case DeviceType.OneTouch:
Navigator.push(
context,

View File

@ -13,7 +13,9 @@ import 'package:syncrow_app/features/devices/view/widgets/two_touch/two_touch_wi
import 'package:syncrow_app/features/devices/view/widgets/water_heater/wh_wizard.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class WizardPage extends StatelessWidget {
final List<DevicesCategoryModel> groupsList;
@ -21,126 +23,171 @@ class WizardPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.5,
),
padding: const EdgeInsets.only(top: 10),
shrinkWrap: true,
itemCount: groupsList.length,
itemBuilder: (_, index) {
return GestureDetector(
onTap: () {
if (groupsList[index].name == 'AC') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ACsView()));
}
if (groupsList[index].name == '3G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ThreeGangWizard()));
}
if (groupsList[index].name == '2G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const TwoGangWizard()));
}
if (groupsList[index].name == '1G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const OneGangWizard()));
}
if (groupsList[index].name == 'WH') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const WHWizard()));
}
final TextEditingController _searchController = TextEditingController();
List<DevicesCategoryModel> _filteredGroups = groupsList;
if (groupsList[index].name == '1GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const OneTouchWizard()));
}
void _filterGroups(String query) {
_filteredGroups = groupsList
.where((group) =>
group.name!.toLowerCase().contains(query.toLowerCase()))
.toList();
}
if (groupsList[index].name == '2GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const TwoTouchWizard()));
}
if (groupsList[index].name == '3GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ThreeTouchWizard()));
}
if (groupsList[index].name == 'GD') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const GarageWizard()));
}
if (groupsList[index].name == 'CUR') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const CurtainsWizard()));
}
},
child: DefaultContainer(
padding: const EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(
groupsList[index].icon!,
return StatefulBuilder(
builder: (context, setState) {
return ListView(
children: [
if (groupsList.isNotEmpty)
TextFormField(
controller: _searchController,
onChanged: (value) {
setState(() {
_filterGroups(value);
});
},
decoration: InputDecoration(
hintText: 'Search',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
prefixIcon: Container(
padding: const EdgeInsets.all(5.0),
margin: const EdgeInsets.all(10.0),
child: SvgPicture.asset(
Assets.searchIcon,
fit: BoxFit.contain,
),
// CustomSwitch(
],
),
FittedBox(
fit: BoxFit.scaleDown,
child: BodyLarge(
text: groupsList[index].name!,
style: context.bodyLarge.copyWith(
fontWeight: FontWeight.bold,
height: 0,
fontSize: 20,
color: Colors.grey,
),
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
],
),
GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.5,
),
padding: const EdgeInsets.only(top: 10),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: _filteredGroups.length,
itemBuilder: (_, index) {
return GestureDetector(
onTap: () {
if (_filteredGroups[index].name == 'AC') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ACsView()));
}
if (_filteredGroups[index].name == '3G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ThreeGangWizard()));
}
if (_filteredGroups[index].name == '2G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const TwoGangWizard()));
}
if (_filteredGroups[index].name == '1G') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const OneGangWizard()));
}
if (_filteredGroups[index].name == 'WH') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const WHWizard()));
}
if (_filteredGroups[index].name == '1GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const OneTouchWizard()));
}
if (_filteredGroups[index].name == '2GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const TwoTouchWizard()));
}
if (_filteredGroups[index].name == '3GT') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const ThreeTouchWizard()));
}
if (_filteredGroups[index].name == 'GD') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const GarageWizard()));
}
if (_filteredGroups[index].name == 'CUR') {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
const CurtainsWizard()));
}
},
child: DefaultContainer(
padding: const EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(
_filteredGroups[index].icon!,
fit: BoxFit.contain,
),
],
),
FittedBox(
fit: BoxFit.scaleDown,
child: BodyLarge(
text: _filteredGroups[index].name!,
style: context.bodyLarge.copyWith(
fontWeight: FontWeight.bold,
height: 0,
fontSize: 20,
color: Colors.grey,
),
),
),
],
),
),
);
},
),
),
],
);
},
);

View File

@ -1081,5 +1081,14 @@ class Assets {
static const String gang1touch = "assets/icons/1gang_touch.svg";
static const String gang2touch = "assets/icons/2gang_touch.svg";
static const String gang3touch = "assets/icons/3gang_touch.svg";
//leakNormalIcon
static const String frequencyIcon = "assets/icons/frequency_icon.svg";
static const String voltMeterIcon = "assets/icons/volt_meter_icon.svg";
static const String powerActiveIcon = "assets/icons/power_active_icon.svg";
static const String searchIcon = "assets/icons/search_icon.svg";
static const String voltageIcon = "assets/icons/voltage_icon.svg";
static const String speedoMeter = "assets/icons/speedo_meter.svg";
static const String powerClampIcon = "assets/icons/power_clamp.svg";
//powerClampIcon
}

View File

@ -105,8 +105,8 @@ abstract class ApiEndpoints {
static const String deviceByUuid = '/device/{deviceUuid}';
static const String deviceFunctions = '/device/{deviceUuid}/functions';
static const String gatewayApi = '/device/gateway/{gatewayUuid}/devices';
static const String deviceFunctionsStatus =
'/device/{deviceUuid}/functions/status';
static const String deviceFunctionsStatus = '/device/{deviceUuid}/functions/status';
static const String powerClamp = '/device/{powerClampUuid}/power-clamp/status';
///Device Permission Module
//POST

View File

@ -80,6 +80,18 @@ class DevicesAPI {
return response;
}
static Future<Map<String, dynamic>> getPowerClampStatus(
String deviceId) async {
final response = await _httpService.get(
path: ApiEndpoints.powerClamp.replaceAll('{powerClampUuid}', deviceId),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
},
);
return response;
}
static Future<Map<String, dynamic>> renamePass(
{required String name,
required String doorLockUuid,
@ -371,6 +383,7 @@ class DevicesAPI {
.replaceAll('{startTime}', startTime)
.replaceAll('{endTime}', endTime),
expectedResponseModel: (json) {
log('json=====$json');
return DeviceReport.fromJson(json);
},
);

View File

@ -29,4 +29,7 @@ abstract class ColorsManager {
static const Color graysColor = Color(0xffEBEBEB);
static const Color textGray = Color(0xffD5D5D5);
static const Color switchButton = Color(0xff023DFE);
static const Color grayBox = Color(0xffF5F5F5);
static const Color chart = Color(0xff023DFE);
}
//background: #F5F5F5;023DFE

View File

@ -55,7 +55,7 @@ enum DeviceType {
ThreeTouch,
GarageDoor,
WaterLeak,
PC,
Other,
}
@ -87,6 +87,7 @@ Map<String, DeviceType> devicesTypesMap = {
"3GT": DeviceType.ThreeTouch,
"GD": DeviceType.GarageDoor,
"WL": DeviceType.WaterLeak,
"PC": DeviceType.PC,
};
Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
DeviceType.AC: [
@ -471,6 +472,43 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
})),
],
DeviceType.WaterLeak: [],
DeviceType.PC: [
FunctionModel(
code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel(
code: 'countdown_1',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel(
code: 'tr_timecon',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 120, "scale": 0, "step": 1})),
FunctionModel(
code: 'countdown_alarm',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel(
code: 'door_control_1',
type: functionTypesMap['Enum'],
values: ValueModel.fromJson({
"range": ['open', 'open']
})),
FunctionModel(
code: 'voice_control_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel(
code: 'door_state_1',
type: functionTypesMap['Enum'],
values: ValueModel.fromJson({
"range": ["unclosed_time", "close_time_alarm", "none"]
})),
],
};
enum TempModes { hot, cold, wind }

View File

@ -317,10 +317,10 @@ packages:
dependency: "direct main"
description:
name: fl_chart
sha256: "00b74ae680df6b1135bdbea00a7d1fc072a9180b7c3f3702e4b19a9943f5ed7d"
sha256: "94307bef3a324a0d329d3ab77b2f0c6e5ed739185ffc029ed28c0f9b019ea7ef"
url: "https://pub.dev"
source: hosted
version: "0.66.2"
version: "0.69.0"
flutter:
dependency: "direct main"
description: flutter

View File

@ -18,7 +18,6 @@ dependencies:
firebase_analytics: ^10.8.7
firebase_core: ^2.25.5
firebase_crashlytics: ^3.4.16
fl_chart: ^0.66.2
flutter:
sdk: flutter
flutter_animated_dialog: ^2.0.1
@ -45,8 +44,10 @@ dependencies:
time_picker_spinner: ^1.0.0
image_picker: ^1.1.2
device_info_plus: ^10.1.0
fl_chart: ^0.69.0
firebase_database: ^10.5.7
dev_dependencies:
flutter_lints: ^3.0.1
flutter_test: