mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-07-16 10:06:16 +00:00
door sensor
This commit is contained in:
47
assets/icons/closed_door.svg
Normal file
47
assets/icons/closed_door.svg
Normal file
@ -0,0 +1,47 @@
|
||||
<svg width="201" height="260" viewBox="0 0 201 260" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_3851_4852)">
|
||||
<g filter="url(#filter1_i_3851_4852)">
|
||||
<path d="M1 32.5794C1 17.65 11.9782 4.87264 26.8261 3.31376C56.9938 0.146434 80.4127 0.288676 110.23 3.38644C125.15 4.93649 136.229 17.743 136.229 32.7433V219.157C136.229 233.932 125.474 246.635 110.8 248.355C80.8281 251.869 57.0283 251.901 26.4597 248.336C11.7726 246.623 1 233.917 1 219.131V32.5794Z" fill="#EAF6FF"/>
|
||||
</g>
|
||||
<path d="M116.627 154.669C117.475 154.669 118.323 154.345 118.971 153.698C120.266 152.403 120.266 150.304 118.971 149.009C107.888 137.927 107.888 119.894 118.971 108.812C120.266 107.517 120.266 105.418 118.971 104.123C117.676 102.829 115.577 102.829 114.283 104.123C100.615 117.792 100.615 140.03 114.283 153.698C114.93 154.345 115.778 154.669 116.627 154.669Z" fill="#B3DAFE"/>
|
||||
<path d="M123.6 141.79C124.312 141.79 125.024 141.518 125.567 140.975C126.653 139.889 126.653 138.127 125.566 137.041C123.395 134.87 122.199 131.982 122.199 128.911C122.199 125.839 123.395 122.952 125.566 120.78C126.653 119.694 126.653 117.933 125.567 116.847C124.48 115.76 122.719 115.76 121.633 116.846C118.411 120.069 116.636 124.353 116.636 128.911C116.636 133.468 118.41 137.753 121.633 140.975C122.176 141.518 122.888 141.79 123.6 141.79Z" fill="#B3DAFE"/>
|
||||
<path d="M74.4947 201.887L74.4947 214.513C74.4947 217.026 72.4581 219.063 69.9447 219.063C67.4313 219.063 65.3948 217.026 65.3948 214.513L65.3948 201.887C65.3948 199.374 67.4313 197.337 69.9447 197.337C72.4581 197.337 74.4947 199.374 74.4947 201.887Z" fill="#B3DAFE"/>
|
||||
<g filter="url(#filter2_i_3851_4852)">
|
||||
<path d="M146.229 60.2459C146.229 53.612 150.555 47.5909 157.072 46.3483C165.305 44.7783 172.168 44.839 180.304 46.382C186.889 47.6306 191.305 53.6871 191.305 60.3888V203.89C191.305 210.378 187.172 216.307 180.833 217.686C172.408 219.518 165.306 219.531 156.73 217.674C150.379 216.299 146.229 210.366 146.229 203.867V60.2459Z" fill="#EAF6FF"/>
|
||||
</g>
|
||||
<path d="M162.423 103.153C161.575 103.153 160.727 103.476 160.079 104.124C158.784 105.419 158.784 107.517 160.079 108.812C171.162 119.894 171.162 137.927 160.079 149.009C158.784 150.305 158.784 152.403 160.079 153.698C161.374 154.992 163.473 154.992 164.767 153.698C178.435 140.03 178.435 117.791 164.767 104.123C164.12 103.476 163.272 103.153 162.423 103.153Z" fill="#B3DAFE"/>
|
||||
<path d="M155.45 116.032C154.738 116.032 154.026 116.303 153.483 116.847C152.397 117.933 152.397 119.694 153.484 120.78C155.655 122.952 156.851 125.839 156.851 128.911C156.851 131.982 155.655 134.869 153.484 137.041C152.397 138.128 152.397 139.889 153.483 140.975C154.57 142.061 156.331 142.061 157.417 140.975C160.639 137.753 162.414 133.468 162.414 128.911C162.414 124.353 160.64 120.069 157.417 116.846C156.874 116.304 156.162 116.032 155.45 116.032Z" fill="#B3DAFE"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_3851_4852" x="0" y="0" width="200.305" height="260" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="4" dy="4"/>
|
||||
<feGaussianBlur stdDeviation="2.5"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3851_4852"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3851_4852" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter1_i_3851_4852" x="0" y="1" width="136.229" height="250" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-1"/>
|
||||
<feGaussianBlur stdDeviation="10"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_3851_4852"/>
|
||||
</filter>
|
||||
<filter id="filter2_i_3851_4852" x="144.229" y="45.1975" width="47.0764" height="173.866" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-2"/>
|
||||
<feGaussianBlur stdDeviation="5"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_3851_4852"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
10
assets/icons/door_notification_setting_icon.svg
Normal file
10
assets/icons/door_notification_setting_icon.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg width="44" height="50" viewBox="0 0 44 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24.9023 9.10478C24.0934 9.10478 23.4375 8.44893 23.4375 7.63994V4.39453C23.4375 3.58682 22.7804 2.92969 21.9727 2.92969C21.1649 2.92969 20.5078 3.58682 20.5078 4.39453V7.63994C20.5078 8.44893 19.852 9.10478 19.043 9.10478C18.234 9.10478 17.5781 8.44893 17.5781 7.63994V4.39453C17.5781 1.97139 19.5495 0 21.9727 0C24.3958 0 26.3672 1.97139 26.3672 4.39453V7.63994C26.3672 8.44893 25.7113 9.10478 24.9023 9.10478Z" fill="#FFB454"/>
|
||||
<path d="M23.4375 4.39453V7.63994C23.4375 8.44893 24.0934 9.10478 24.9023 9.10478C25.7113 9.10478 26.3672 8.44893 26.3672 7.63994V4.39453C26.3672 1.97139 24.3958 0 21.9727 0V2.92969C22.7805 2.92969 23.4375 3.58682 23.4375 4.39453Z" fill="#FF8E00"/>
|
||||
<path d="M21.9727 50C17.9341 50 14.6484 46.7144 14.6484 42.6758C14.6484 41.8668 15.3043 41.2109 16.1133 41.2109H27.832C28.641 41.2109 29.2969 41.8668 29.2969 42.6758C29.2969 46.7144 26.0113 50 21.9727 50Z" fill="#FFB454"/>
|
||||
<path d="M27.832 41.2109H21.9727V50C26.0112 50 29.2969 46.7144 29.2969 42.6758C29.2969 41.8668 28.641 41.2109 27.832 41.2109Z" fill="#FF8E00"/>
|
||||
<path d="M42.4805 44.1406H1.46486C0.877946 44.1406 0.34777 43.7903 0.117497 43.2505C-0.112777 42.7106 0.00138367 42.0855 0.407634 41.6619C4.55295 37.3389 6.83595 31.6595 6.83595 25.6701V20.9961C6.83595 12.6497 13.6263 5.85938 21.9727 5.85938C30.3191 5.85938 37.1094 12.6497 37.1094 20.9961V25.6701C37.1094 31.6596 39.3924 37.3389 43.5378 41.6619C43.944 42.0855 44.0581 42.7106 43.8279 43.2505C43.5977 43.7903 43.0674 44.1406 42.4805 44.1406Z" fill="#FFE278"/>
|
||||
<path d="M42.4805 44.1406C43.0674 44.1406 43.5976 43.7903 43.8278 43.2505C44.0581 42.7106 43.9439 42.0855 43.5378 41.6619C39.3924 37.3389 37.1094 31.6595 37.1094 25.6701V20.9961C37.1094 12.6497 30.319 5.85938 21.9727 5.85938V44.1406H42.4805Z" fill="#FFB454"/>
|
||||
<path d="M42.4803 22.4612C41.6713 22.4612 41.0154 21.8053 41.0154 20.9963C41.0154 15.9097 39.0347 11.1276 35.4379 7.53091C34.8658 6.95884 34.8658 6.0314 35.4379 5.45933C36.0099 4.88726 36.9374 4.88726 37.5095 5.45933C41.6596 9.60933 43.9451 15.1272 43.9451 20.9963C43.9451 21.8053 43.2893 22.4612 42.4803 22.4612Z" fill="#08475E"/>
|
||||
<path d="M1.46484 22.4612C0.655859 22.4612 0 21.8053 0 20.9963C0 15.1272 2.28555 9.60942 6.43564 5.45933C7.00762 4.88726 7.93516 4.88726 8.50723 5.45933C9.0793 6.0314 9.0793 6.95884 8.50723 7.53091C4.91055 11.1277 2.92969 15.9098 2.92969 20.9963C2.92969 21.8053 2.27383 22.4612 1.46484 22.4612Z" fill="#0A789B"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
18
assets/icons/door_records_icon.svg
Normal file
18
assets/icons/door_records_icon.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.61102 32.55L0.0294905 14.2492C-0.0650406 13.9826 0.0752911 13.6874 0.341795 13.5901C8.9949 10.4779 18.7455 7.58334 27.0805 4.02691C27.453 3.79194 27.7453 4.02407 27.9057 4.46821L38.2465 31.1229L41.0545 38.9321C41.149 39.1986 41.0115 39.4967 40.745 39.5913L20.9575 46.707L13.2441 49.4811C12.9776 49.5786 12.6825 49.4381 12.5851 49.1716L6.61102 32.55Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.098 26.4772L8.81158 7.31083C8.76285 7.02997 8.95201 6.76347 9.22994 6.71474L31.8627 2.83448L37.046 1.98047C37.3297 1.85723 37.791 2.00049 37.8998 2.63389L43.4985 30.5925L44.8997 38.7715C44.9484 39.0495 44.7593 39.3189 44.4813 39.3676L23.7568 42.9212L15.6767 44.3082C15.3988 44.3541 15.1294 44.165 15.0807 43.8869L12.098 26.4772Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.439 20.8256V39.2527C18.439 39.5479 18.6797 39.7914 18.9748 39.7914H27.5276H40.1893H42.0088H49.4642C49.7593 39.7914 50 39.5479 50 39.2527V30.5952V6.68016V6.43085H44.556C44.0317 6.43085 42.9428 6.50536 42.9428 5.3161L42.9313 0H18.9747C18.6796 0 18.4389 0.240722 18.4389 0.535936V5.13554V7.08143V20.8256H18.439Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.35594 10.4889C6.29012 11.5206 3.25292 12.5436 0.341795 13.5896C0.0752911 13.6871 -0.0650406 13.9822 0.0294905 14.2487L6.61102 32.5497L12.5851 49.1712C12.6826 49.4377 12.9777 49.5781 13.2441 49.4807L20.9575 46.7066L38.5331 40.3875L9.35594 10.4889Z" fill="#B5C4CF"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.4389 5.13535L9.22994 6.71435C8.95201 6.76308 8.76285 7.02958 8.81158 7.31044L9.35601 10.4886L12.0981 26.4768L15.0808 43.8864C15.1295 44.1645 15.3989 44.3535 15.6768 44.3077L23.7569 42.9207L38.5331 40.3873L42.0087 39.7912H40.1893L18.4389 5.13535Z" fill="#D7E7EC"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9999 30.5952V6.68016V6.43085V6.34774C49.9999 6.19296 49.934 6.16718 49.6962 5.93505L43.8196 0.329589C43.5417 0.0659178 43.4959 0 43.3325 0H42.9313H18.9747C18.6796 0 18.4389 0.240722 18.4389 0.535936V39.2527C18.4389 39.5479 18.6796 39.7914 18.9747 39.7914H49.4641C49.7592 39.7914 49.9999 39.5479 49.9999 39.2527V30.5952Z" fill="#EDF3F4"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.4389 5.13535L16.2814 5.50507V41.2328C16.2814 41.5309 16.5221 41.7716 16.8172 41.7716H25.37H30.4588L38.5331 40.3874L42.0087 39.7913H40.1893H37.9515H27.5276H18.9747C18.6796 39.7913 18.4389 39.5478 18.4389 39.2526C18.4389 27.881 18.4389 16.5067 18.4389 5.13535Z" fill="#B5C4CF"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.098 26.4771L9.35591 10.4889C8.61383 10.7382 7.87457 10.9875 7.13815 11.2368L7.47916 13.2228L10.2212 29.2111L13.2069 46.6207C13.2527 46.8987 13.522 47.0878 13.7999 47.042L21.88 45.655L25.7138 44.9988L37.2608 40.8434L37.1233 40.6285L30.4587 41.7719L23.7569 42.9211L15.6768 44.3081C15.3989 44.354 15.1295 44.1649 15.0808 43.8868L12.098 26.4771Z" fill="#9AAFB7"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9999 30.5952V6.68016V6.43085C49.9999 6.14139 49.9053 6.13856 49.6962 5.93505L43.8195 0.329589C43.5416 0.0659178 43.4958 0 43.3324 0H42.9312H36.9685C44.255 9.75516 44.6704 27.3396 39.2637 38.3156C39.0143 38.8257 38.7536 39.3157 38.4814 39.7914H40.1891H42.0086H49.464C49.7591 39.7914 49.9999 39.5479 49.9999 39.2527V30.5952Z" fill="#D7E7EC"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M42.9427 5.3161C42.9427 6.50536 44.0315 6.43085 44.5559 6.43085H49.9999V6.34774C49.9999 6.19296 49.934 6.16718 49.6962 5.93505L43.8196 0.329589C43.5416 0.0659178 43.4958 0 43.3325 0H42.9313L42.9427 5.3161Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.6962 5.93505L43.8196 0.329589C43.5416 0.0659178 43.4958 0 43.3325 0H42.9313L42.9427 5.31601C42.9427 6.50526 44.0315 6.43075 44.5559 6.43075H49.9999V6.34764C49.9999 6.19296 49.934 6.16718 49.6962 5.93505Z" fill="#B5C4CF"/>
|
||||
<path d="M45.1576 11.7192H23.5849C23.1682 11.7192 22.8304 11.3813 22.8304 10.9644C22.8304 10.5475 23.1682 10.2096 23.5849 10.2096H45.1576C45.5742 10.2096 45.912 10.5475 45.912 10.9644C45.912 11.3813 45.5743 11.7192 45.1576 11.7192Z" fill="#9AAFB7"/>
|
||||
<path d="M45.1576 17.0811H23.5849C23.1682 17.0811 22.8304 16.7432 22.8304 16.3263C22.8304 15.9095 23.1682 15.5716 23.5849 15.5716H45.1576C45.5742 15.5716 45.912 15.9095 45.912 16.3263C45.912 16.7432 45.5743 17.0811 45.1576 17.0811Z" fill="#9AAFB7"/>
|
||||
<path d="M45.1576 22.4431H23.5849C23.1682 22.4431 22.8304 22.1052 22.8304 21.6883C22.8304 21.2714 23.1682 20.9335 23.5849 20.9335H45.1576C45.5742 20.9335 45.912 21.2714 45.912 21.6883C45.912 22.1052 45.5743 22.4431 45.1576 22.4431Z" fill="#9AAFB7"/>
|
||||
<path d="M45.1576 27.805H23.5849C23.1682 27.805 22.8304 27.4671 22.8304 27.0502C22.8304 26.6333 23.1682 26.2954 23.5849 26.2954H45.1576C45.5742 26.2954 45.912 26.6333 45.912 27.0502C45.912 27.4671 45.5743 27.805 45.1576 27.805Z" fill="#9AAFB7"/>
|
||||
<path d="M45.1576 33.1669H23.5849C23.1682 33.1669 22.8304 32.829 22.8304 32.4121C22.8304 31.9952 23.1682 31.6573 23.5849 31.6573H45.1576C45.5742 31.6573 45.912 31.9952 45.912 32.4121C45.912 32.829 45.5743 33.1669 45.1576 33.1669Z" fill="#9AAFB7"/>
|
||||
</svg>
|
After Width: | Height: | Size: 5.1 KiB |
47
assets/icons/opened_door.svg
Normal file
47
assets/icons/opened_door.svg
Normal file
@ -0,0 +1,47 @@
|
||||
<svg width="241" height="260" viewBox="0 0 241 260" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_3851_4840)">
|
||||
<g filter="url(#filter1_i_3851_4840)">
|
||||
<path d="M1 32.5794C1 17.65 11.9782 4.87264 26.8261 3.31376C56.9938 0.146434 80.4127 0.288676 110.23 3.38644C125.15 4.93649 136.229 17.743 136.229 32.7433V219.157C136.229 233.932 125.474 246.635 110.8 248.355C80.8281 251.869 57.0283 251.901 26.4597 248.336C11.7726 246.623 1 233.917 1 219.131V32.5794Z" fill="#EAF6FF"/>
|
||||
</g>
|
||||
<path d="M113.787 154.669C112.938 154.669 112.09 154.345 111.442 153.698C110.147 152.403 110.147 150.304 111.442 149.009C122.525 137.927 122.525 119.894 111.442 108.812C110.147 107.517 110.147 105.418 111.442 104.123C112.737 102.829 114.836 102.829 116.131 104.123C129.798 117.792 129.798 140.03 116.131 153.698C115.484 154.345 114.635 154.669 113.787 154.669Z" fill="#FF0000" fill-opacity="0.7"/>
|
||||
<path d="M106.813 141.79C106.101 141.79 105.39 141.518 104.846 140.975C103.76 139.889 103.76 138.127 104.847 137.041C107.018 134.87 108.214 131.982 108.214 128.911C108.214 125.839 107.018 122.952 104.847 120.78C103.76 119.694 103.76 117.933 104.846 116.847C105.933 115.76 107.694 115.76 108.78 116.846C112.002 120.069 113.777 124.353 113.777 128.911C113.777 133.468 112.003 137.753 108.78 140.975C108.237 141.518 107.525 141.79 106.813 141.79Z" fill="#FF0000" fill-opacity="0.7"/>
|
||||
<path d="M74.4946 201.887L74.4946 214.513C74.4946 217.026 72.4581 219.063 69.9447 219.063C67.4313 219.063 65.3948 217.026 65.3948 214.513L65.3948 201.887C65.3948 199.374 67.4313 197.337 69.9447 197.337C72.4581 197.337 74.4946 199.374 74.4946 201.887Z" fill="#B3DAFE"/>
|
||||
<g filter="url(#filter2_i_3851_4840)">
|
||||
<path d="M186.229 60.2459C186.229 53.612 190.555 47.5909 197.072 46.3483C205.305 44.7783 212.168 44.839 220.304 46.382C226.889 47.6306 231.305 53.6871 231.305 60.3888V203.89C231.305 210.378 227.172 216.307 220.833 217.686C212.408 219.518 205.306 219.531 196.73 217.674C190.379 216.299 186.229 210.366 186.229 203.867V60.2459Z" fill="#EAF6FF"/>
|
||||
</g>
|
||||
<path d="M205.263 103.153C206.112 103.153 206.96 103.476 207.608 104.124C208.903 105.419 208.903 107.517 207.608 108.812C196.525 119.894 196.525 137.927 207.608 149.009C208.903 150.305 208.903 152.403 207.608 153.698C206.313 154.992 204.214 154.992 202.919 153.698C189.252 140.03 189.252 117.791 202.919 104.123C203.567 103.476 204.415 103.153 205.263 103.153Z" fill="#FF0000" fill-opacity="0.7"/>
|
||||
<path d="M212.237 116.032C212.949 116.032 213.66 116.303 214.204 116.847C215.29 117.933 215.29 119.694 214.203 120.78C212.032 122.952 210.836 125.839 210.836 128.911C210.836 131.982 212.032 134.869 214.203 137.041C215.29 138.128 215.29 139.889 214.204 140.975C213.117 142.061 211.356 142.061 210.27 140.975C207.048 137.753 205.273 133.468 205.273 128.911C205.273 124.353 207.047 120.069 210.27 116.846C210.813 116.304 211.525 116.032 212.237 116.032Z" fill="#FF0000" fill-opacity="0.7"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_3851_4840" x="0" y="0" width="240.305" height="260" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="4" dy="4"/>
|
||||
<feGaussianBlur stdDeviation="2.5"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3851_4840"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3851_4840" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter1_i_3851_4840" x="0" y="1" width="136.229" height="250" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-1"/>
|
||||
<feGaussianBlur stdDeviation="10"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_3851_4840"/>
|
||||
</filter>
|
||||
<filter id="filter2_i_3851_4840" x="184.229" y="45.1975" width="47.0763" height="173.866" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-2"/>
|
||||
<feGaussianBlur stdDeviation="5"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_3851_4840"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
220
lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart
Normal file
220
lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart
Normal file
@ -0,0 +1,220 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:firebase_database/firebase_database.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/door_sensor_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/report_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/status_model.dart';
|
||||
import 'package:syncrow_app/services/api/devices_api.dart';
|
||||
|
||||
class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
final String DSId;
|
||||
final String switchCode;
|
||||
DoorSensorBloc({required this.DSId, required this.switchCode})
|
||||
: super(const DoorSensorState()) {
|
||||
on<DoorSensorInitial>(_fetchWaterHeaterStatus);
|
||||
on<ReportLogsInitial>(fetchLogsForLastMonth);
|
||||
on<DoorSensorSwitch>(_changeFirstSwitch);
|
||||
on<ToggleLowBatteryEvent>(_toggleLowBattery);
|
||||
on<ToggleClosingReminderEvent>(_toggleClosingReminder);
|
||||
on<ToggleDoorAlarmEvent>(_toggleDoorAlarm);
|
||||
}
|
||||
Timer? _timer;
|
||||
bool lowBattery = false;
|
||||
bool closingReminder = false;
|
||||
bool doorAlarm = false;
|
||||
DoorSensorModel deviceStatus =
|
||||
DoorSensorModel(doorContactState: false, batteryPercentage: 0);
|
||||
void _fetchWaterHeaterStatus(
|
||||
DoorSensorInitial event, Emitter<DoorSensorState> emit) async {
|
||||
emit(DoorSensorLoadingState());
|
||||
try {
|
||||
var response = await DevicesAPI.getDeviceStatus(DSId);
|
||||
List<StatusModel> statusModelList = [];
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
}
|
||||
deviceStatus = DoorSensorModel.fromJson(
|
||||
statusModelList,
|
||||
);
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
Future.delayed(const Duration(milliseconds: 500));
|
||||
// _listenToChanges();
|
||||
} catch (e) {
|
||||
emit(DoorSensorFailedState(errorMessage: e.toString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void _changeFirstSwitch(
|
||||
DoorSensorSwitch event, Emitter<DoorSensorState> emit) async {
|
||||
emit(LoadingNewSate(doorSensor: deviceStatus));
|
||||
try {
|
||||
deviceStatus.doorContactState = !event.switchD;
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
final response = await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: DSId,
|
||||
code: 'doorcontact_state',
|
||||
value: deviceStatus.doorContactState),
|
||||
DSId);
|
||||
|
||||
if (!response['success']) {
|
||||
// add(InitialEvent(groupScreen: oneGangGroup));
|
||||
}
|
||||
} catch (_) {
|
||||
emit(DoorSensorFailedState(errorMessage: _.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle functions for each switch
|
||||
void _toggleLowBattery(
|
||||
ToggleLowBatteryEvent event, Emitter<DoorSensorState> emit) async {
|
||||
emit(LoadingNewSate(doorSensor: deviceStatus));
|
||||
try {
|
||||
lowBattery = event.isLowBatteryEnabled;
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: DSId,
|
||||
code: 'low_battery',
|
||||
value: lowBattery,
|
||||
),
|
||||
DSId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(DoorSensorFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
void _toggleClosingReminder(
|
||||
ToggleClosingReminderEvent event, Emitter<DoorSensorState> emit) async {
|
||||
emit(LoadingNewSate(doorSensor: deviceStatus));
|
||||
try {
|
||||
closingReminder = event.isClosingReminderEnabled;
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: DSId,
|
||||
code: 'closing_reminder',
|
||||
value: closingReminder,
|
||||
),
|
||||
DSId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(DoorSensorFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
void _toggleDoorAlarm(
|
||||
ToggleDoorAlarmEvent event, Emitter<DoorSensorState> emit) async {
|
||||
emit(LoadingNewSate(doorSensor: deviceStatus));
|
||||
try {
|
||||
doorAlarm = event.isDoorAlarmEnabled;
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: DSId,
|
||||
code: 'door_alarm',
|
||||
value: doorAlarm,
|
||||
),
|
||||
DSId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(DoorSensorFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
final List<RecordGroup> recordGroups = [
|
||||
RecordGroup(
|
||||
date: DateTime(2024, 8, 31),
|
||||
records: [
|
||||
Record(status: 'Opened', time: '15:10:25', isOpen: false),
|
||||
Record(status: 'Closed', time: '12:24:45', isOpen: false),
|
||||
Record(status: 'Opened', time: '12:20:05', isOpen: true),
|
||||
],
|
||||
),
|
||||
RecordGroup(
|
||||
date: DateTime(2024, 8, 30),
|
||||
records: [
|
||||
Record(status: 'Opened', time: '14:15:30', isOpen: true),
|
||||
Record(status: 'Closed', time: '10:22:45', isOpen: false),
|
||||
],
|
||||
),
|
||||
RecordGroup(
|
||||
date: DateTime(2024, 8, 29),
|
||||
records: [
|
||||
Record(status: 'Opened', time: '13:45:00', isOpen: true),
|
||||
Record(status: 'Closed', time: '11:30:15', isOpen: false),
|
||||
Record(status: 'Opened', time: '09:20:10', isOpen: true),
|
||||
],
|
||||
),
|
||||
];
|
||||
|
||||
Future<void> fetchLogsForLastMonth(
|
||||
ReportLogsInitial event, Emitter<DoorSensorState> emit) async {
|
||||
// Get the current date and time
|
||||
DateTime now = DateTime.now();
|
||||
|
||||
// Calculate the date one month ago
|
||||
DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
|
||||
|
||||
// Convert the date to milliseconds since epoch (Unix timestamp in milliseconds)
|
||||
int startTime = lastMonth.millisecondsSinceEpoch;
|
||||
int endTime = now.millisecondsSinceEpoch;
|
||||
try {
|
||||
var response = await DevicesAPI.getReportLogs(
|
||||
startTime: startTime.toString(), // Convert to String if the API expects it
|
||||
endTime: endTime.toString(), // Convert to String if the API expects it
|
||||
deviceUuid: DSId,
|
||||
code: 'doorcontact_state',
|
||||
);
|
||||
// Process response here
|
||||
print(response);
|
||||
} on DioException catch (e) {
|
||||
final errorData = e.response!.data;
|
||||
String errorMessage = errorData['message'];
|
||||
// Handle error
|
||||
print('Error fetching logs: ${errorMessage}');
|
||||
}
|
||||
}
|
||||
|
||||
_listenToChanges() {
|
||||
try {
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$DSId');
|
||||
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: element['value']));
|
||||
});
|
||||
|
||||
deviceStatus = DoorSensorModel.fromJson(statusList);
|
||||
if (!isClosed) {
|
||||
add(
|
||||
DoorSensorSwitch(switchD: deviceStatus.doorContactState),
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class DoorSensorEvent extends Equatable {
|
||||
const DoorSensorEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class DoorSensorLoading extends DoorSensorEvent {}
|
||||
|
||||
class DoorSensorSwitch extends DoorSensorEvent {
|
||||
final bool switchD;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const DoorSensorSwitch({required this.switchD, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [switchD, deviceId, productId];
|
||||
}
|
||||
|
||||
class DoorSensorUpdated extends DoorSensorEvent {}
|
||||
|
||||
class DoorSensorInitial extends DoorSensorEvent {
|
||||
const DoorSensorInitial();
|
||||
}
|
||||
|
||||
class ReportLogsInitial extends DoorSensorEvent {
|
||||
const ReportLogsInitial();
|
||||
}
|
||||
|
||||
|
||||
class DoorSensorChangeStatus extends DoorSensorEvent {}
|
||||
|
||||
|
||||
class GetCounterEvent extends DoorSensorEvent {
|
||||
final String deviceCode;
|
||||
const GetCounterEvent({required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [deviceCode];
|
||||
}
|
||||
|
||||
|
||||
|
||||
class ToggleLowBatteryEvent extends DoorSensorEvent {
|
||||
final bool isLowBatteryEnabled;
|
||||
|
||||
const ToggleLowBatteryEvent(this.isLowBatteryEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isLowBatteryEnabled];
|
||||
}
|
||||
|
||||
class ToggleClosingReminderEvent extends DoorSensorEvent {
|
||||
final bool isClosingReminderEnabled;
|
||||
|
||||
const ToggleClosingReminderEvent(this.isClosingReminderEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isClosingReminderEnabled];
|
||||
}
|
||||
|
||||
class ToggleDoorAlarmEvent extends DoorSensorEvent {
|
||||
final bool isDoorAlarmEnabled;
|
||||
|
||||
const ToggleDoorAlarmEvent(this.isDoorAlarmEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isDoorAlarmEnabled];
|
||||
}
|
||||
|
||||
|
||||
|
||||
class SetCounterValue extends DoorSensorEvent {
|
||||
final Duration duration;
|
||||
final String deviceCode;
|
||||
const SetCounterValue({required this.duration, required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [duration, deviceCode];
|
||||
}
|
||||
|
||||
class StartTimer extends DoorSensorEvent {
|
||||
final int duration;
|
||||
|
||||
const StartTimer(this.duration);
|
||||
|
||||
@override
|
||||
List<Object> get props => [duration];
|
||||
}
|
||||
|
||||
class TickTimer extends DoorSensorEvent {
|
||||
final int remainingTime;
|
||||
|
||||
const TickTimer(this.remainingTime);
|
||||
|
||||
@override
|
||||
List<Object> get props => [remainingTime];
|
||||
}
|
||||
|
||||
class StopTimer extends DoorSensorEvent {}
|
||||
|
||||
class OnClose extends DoorSensorEvent {}
|
@ -0,0 +1,128 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:syncrow_app/features/devices/model/door_sensor_model.dart';
|
||||
|
||||
class DoorSensorState extends Equatable {
|
||||
const DoorSensorState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class DoorSensorInitialState extends DoorSensorState {}
|
||||
|
||||
class DoorSensorLoadingState extends DoorSensorState {}
|
||||
|
||||
class DoorSensorFailedState extends DoorSensorState {
|
||||
final String errorMessage;
|
||||
|
||||
const DoorSensorFailedState({required this.errorMessage});
|
||||
|
||||
@override
|
||||
List<Object> get props => [errorMessage];
|
||||
}
|
||||
|
||||
class UpdateState extends DoorSensorState {
|
||||
final DoorSensorModel doorSensor;
|
||||
const UpdateState({required this.doorSensor});
|
||||
|
||||
@override
|
||||
List<Object> get props => [doorSensor];
|
||||
}
|
||||
|
||||
|
||||
class LoadingNewSate extends DoorSensorState {
|
||||
final DoorSensorModel doorSensor;
|
||||
const LoadingNewSate({required this.doorSensor});
|
||||
|
||||
@override
|
||||
List<Object> get props => [doorSensor];
|
||||
}
|
||||
|
||||
// class WHModifyingState extends DoorSensorState {
|
||||
// final WHModel whStatusModel;
|
||||
// const WHModifyingState({required this.whStatusModel});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [whStatusModel];
|
||||
// }
|
||||
//
|
||||
// class GetWHStatusState extends DoorSensorState {
|
||||
// final WHModel whStatusModel;
|
||||
// const GetWHStatusState({required this.whStatusModel});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [whStatusModel];
|
||||
// }
|
||||
//
|
||||
//
|
||||
// class WHFailedState extends WaterHeaterState {
|
||||
// final String errorMessage;
|
||||
//
|
||||
// const WHFailedState({required this.errorMessage});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [errorMessage];
|
||||
// }
|
||||
|
||||
|
||||
// class LoadingNewSate extends WaterHeaterState {
|
||||
// final WHModel whModel;
|
||||
// const LoadingNewSate({required this.whModel});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [whModel];
|
||||
// }
|
||||
// class TimerRunComplete extends WaterHeaterState {}
|
||||
// class UpdateTimerState extends WaterHeaterState {
|
||||
// final int seconds;
|
||||
// const UpdateTimerState({required this.seconds});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [seconds];
|
||||
// }
|
||||
//
|
||||
// class TimerRunInProgress extends WaterHeaterState {
|
||||
// final int remainingTime;
|
||||
//
|
||||
// const TimerRunInProgress(this.remainingTime);
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [remainingTime];
|
||||
// }
|
||||
//
|
||||
// class SaveSchedule extends WaterHeaterState {}
|
||||
// class ChangeTimeState extends WaterHeaterState {}
|
||||
// class UpdateCreateScheduleState extends WaterHeaterState {
|
||||
// final bool createSchedule;
|
||||
// UpdateCreateScheduleState(this.createSchedule);
|
||||
// }
|
||||
// class IsToggleState extends WaterHeaterState {
|
||||
// final bool? onOff;
|
||||
// const IsToggleState({this.onOff});
|
||||
// }
|
||||
//
|
||||
//
|
||||
// class UpdateState extends WaterHeaterState {
|
||||
// final WHModel whModel;
|
||||
// const UpdateState({required this.whModel});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [WHModel];
|
||||
// }
|
||||
//
|
||||
// class ChangeSwitchStatusEvent extends WaterHeaterState {
|
||||
// final bool value;
|
||||
// final String deviceId;
|
||||
// const ChangeSwitchStatusEvent({required this.value, this.deviceId = ''});
|
||||
// @override
|
||||
// List<Object> get props => [value, deviceId];
|
||||
// }
|
||||
//
|
||||
// class ChangeSlidingSegmentState extends WaterHeaterState {
|
||||
// final int value;
|
||||
//
|
||||
// const ChangeSlidingSegmentState({required this.value});
|
||||
//
|
||||
// @override
|
||||
// List<Object> get props => [value];
|
||||
// }
|
33
lib/features/devices/model/door_sensor_model.dart
Normal file
33
lib/features/devices/model/door_sensor_model.dart
Normal file
@ -0,0 +1,33 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import 'package:syncrow_app/features/devices/model/status_model.dart';
|
||||
|
||||
class DoorSensorModel {
|
||||
bool doorContactState;
|
||||
int batteryPercentage;
|
||||
|
||||
DoorSensorModel(
|
||||
{required this.doorContactState,
|
||||
required this.batteryPercentage,
|
||||
});
|
||||
|
||||
factory DoorSensorModel.fromJson(List<StatusModel> jsonList) {
|
||||
late bool _doorContactState;
|
||||
late int _batteryPercentage;
|
||||
|
||||
|
||||
for (int i = 0; i < jsonList.length; i++) {
|
||||
if (jsonList[i].code == 'doorcontact_state') {
|
||||
_doorContactState = jsonList[i].value ?? false;
|
||||
} else if (jsonList[i].code == 'battery_percentage') {
|
||||
_batteryPercentage = jsonList[i].value ?? 0;
|
||||
}
|
||||
}
|
||||
return DoorSensorModel(
|
||||
doorContactState: _doorContactState,
|
||||
batteryPercentage: _batteryPercentage,
|
||||
);
|
||||
}
|
||||
}
|
23
lib/features/devices/model/report_model.dart
Normal file
23
lib/features/devices/model/report_model.dart
Normal file
@ -0,0 +1,23 @@
|
||||
// Record model
|
||||
class Record {
|
||||
final String status;
|
||||
final String time;
|
||||
final bool isOpen;
|
||||
|
||||
Record({
|
||||
required this.status,
|
||||
required this.time,
|
||||
required this.isOpen,
|
||||
});
|
||||
}
|
||||
|
||||
// RecordGroup model to group records by date
|
||||
class RecordGroup {
|
||||
final DateTime date;
|
||||
final List<Record> records;
|
||||
|
||||
RecordGroup({
|
||||
required this.date,
|
||||
required this.records,
|
||||
});
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/door_sensor_model.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/features/shared_widgets/text_widgets/body_large.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
|
||||
class NotificationSettingsPage extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultScaffold(
|
||||
title: 'Notification Settings',
|
||||
child: BlocProvider(
|
||||
create: (context) => DoorSensorBloc(switchCode: 'switch_1', DSId: '')
|
||||
..add(const DoorSensorInitial()),
|
||||
child: BlocBuilder<DoorSensorBloc, DoorSensorState>(
|
||||
builder: (context, state) {
|
||||
final doorSensorBloc = BlocProvider.of<DoorSensorBloc>(context);
|
||||
DoorSensorModel model = DoorSensorModel(
|
||||
batteryPercentage: 0, doorContactState: false);
|
||||
if (state is LoadingNewSate) {
|
||||
model = state.doorSensor;
|
||||
} else if (state is UpdateState) {
|
||||
model = state.doorSensor;
|
||||
}
|
||||
return state is DoorSensorLoadingState
|
||||
? const Center(
|
||||
child: DefaultContainer(
|
||||
width: 50,
|
||||
height: 50,
|
||||
child: CircularProgressIndicator()),
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
DefaultContainer(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 50,
|
||||
child: ListTile(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: const BodyLarge(
|
||||
text: 'Low Battery',
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
trailing: Transform.scale(
|
||||
scale: .8,
|
||||
child: CupertinoSwitch(
|
||||
value: doorSensorBloc.lowBattery,
|
||||
onChanged: (value) {
|
||||
context.read<DoorSensorBloc>().add(
|
||||
ToggleLowBatteryEvent(value));
|
||||
},
|
||||
applyTheme: true,
|
||||
)),
|
||||
),
|
||||
),
|
||||
const Divider(
|
||||
color: ColorsManager.graysColor,
|
||||
),
|
||||
SizedBox(
|
||||
height: 50,
|
||||
child: ListTile(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: const BodyLarge(
|
||||
text: 'Closing Reminder',
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
trailing: Transform.scale(
|
||||
scale: .8,
|
||||
child: CupertinoSwitch(
|
||||
value: doorSensorBloc.closingReminder,
|
||||
onChanged: (value) {
|
||||
context.read<DoorSensorBloc>().add(
|
||||
ToggleClosingReminderEvent(
|
||||
value));
|
||||
},
|
||||
applyTheme: true,
|
||||
)),
|
||||
),
|
||||
),
|
||||
const Divider(
|
||||
color: ColorsManager.graysColor,
|
||||
),
|
||||
SizedBox(
|
||||
height: 50,
|
||||
child: ListTile(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: const BodyLarge(
|
||||
text: 'Door Alarm',
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
trailing: Transform.scale(
|
||||
scale: .8,
|
||||
child: CupertinoSwitch(
|
||||
value: doorSensorBloc.closingReminder,
|
||||
onChanged: (value) {
|
||||
context
|
||||
.read<DoorSensorBloc>()
|
||||
.add(ToggleDoorAlarmEvent(value));
|
||||
},
|
||||
applyTheme: true,
|
||||
)),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_state.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
|
||||
|
||||
class DoorRecordsScreen extends StatelessWidget {
|
||||
final String DSId;
|
||||
const DoorRecordsScreen({super.key,required this.DSId});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultScaffold(
|
||||
title: 'Records',
|
||||
child: BlocProvider(
|
||||
create: (context) =>
|
||||
DoorSensorBloc(switchCode: 'switch_1', DSId:DSId )
|
||||
..add(const ReportLogsInitial()),
|
||||
child: BlocBuilder<DoorSensorBloc, DoorSensorState>(
|
||||
builder: (context, state) {
|
||||
final doorSensorBloc = BlocProvider.of<DoorSensorBloc>(context);
|
||||
return SizedBox(
|
||||
child: ListView.builder(
|
||||
itemCount: doorSensorBloc.recordGroups.length,
|
||||
itemBuilder: (context, index) {
|
||||
final recordGroup = doorSensorBloc.recordGroups[index];
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// Date header
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Text(
|
||||
DateFormat('EEEE, dd/MM/yyyy')
|
||||
.format(recordGroup.date),
|
||||
style: const TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
// Display each record for the date
|
||||
DefaultContainer(
|
||||
child: Column(
|
||||
children: recordGroup.records.map((record) {
|
||||
return ListTile(
|
||||
leading: Icon(
|
||||
record.isOpen
|
||||
? Icons.radio_button_checked
|
||||
: Icons.radio_button_unchecked,
|
||||
color:
|
||||
record.isOpen ? Colors.blue : Colors.grey,
|
||||
),
|
||||
title: Text(
|
||||
record.status,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18,
|
||||
),
|
||||
),
|
||||
subtitle: Text(record.time),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
})));
|
||||
}
|
||||
}
|
@ -0,0 +1,207 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/door_sensor_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/door_sensor/door_notification_settings.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/door_sensor/door_records_screen.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/battery_bar.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/features/shared_widgets/text_widgets/body_small.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
|
||||
class DoorSensorScreen extends StatelessWidget {
|
||||
final DeviceModel? device;
|
||||
|
||||
const DoorSensorScreen({super.key, this.device});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultScaffold(
|
||||
title: 'Door Sensor',
|
||||
child: BlocProvider(
|
||||
create: (context) =>
|
||||
DoorSensorBloc(switchCode: 'switch_1', DSId: device?.uuid ?? '')
|
||||
..add(const DoorSensorInitial()),
|
||||
child: BlocBuilder<DoorSensorBloc, DoorSensorState>(
|
||||
builder: (context, state) {
|
||||
final doorSensorBloc = BlocProvider.of<DoorSensorBloc>(context);
|
||||
DoorSensorModel model =
|
||||
DoorSensorModel(batteryPercentage: 0, doorContactState: false);
|
||||
if (state is LoadingNewSate) {
|
||||
model = state.doorSensor;
|
||||
} else if (state is UpdateState) {
|
||||
model = state.doorSensor;
|
||||
}
|
||||
return state is DoorSensorLoadingState
|
||||
? const Center(
|
||||
child: DefaultContainer(
|
||||
width: 50,
|
||||
height: 50,
|
||||
child: CircularProgressIndicator()),
|
||||
)
|
||||
: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
doorSensorBloc.add(const DoorSensorInitial());
|
||||
},
|
||||
child: Center(
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
children: [
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
BatteryBar(
|
||||
batteryPercentage: model.batteryPercentage,
|
||||
),
|
||||
InkWell(
|
||||
overlayColor:
|
||||
WidgetStateProperty.all(Colors.transparent),
|
||||
onTap: () {
|
||||
|
||||
},
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
// color: Colors.white.withOpacity(0.1),
|
||||
borderRadius:
|
||||
BorderRadius.circular(890),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color:
|
||||
Colors.white.withOpacity(0.1),
|
||||
blurRadius: 24,
|
||||
offset: const Offset(-5, -5),
|
||||
blurStyle: BlurStyle.outer,
|
||||
),
|
||||
BoxShadow(
|
||||
color:
|
||||
Colors.black.withOpacity(0.11),
|
||||
blurRadius: 25,
|
||||
offset: const Offset(5, 5),
|
||||
blurStyle: BlurStyle.outer,
|
||||
),
|
||||
BoxShadow(
|
||||
color:
|
||||
Colors.black.withOpacity(0.13),
|
||||
blurRadius: 30,
|
||||
offset: const Offset(5, 5),
|
||||
blurStyle: BlurStyle.inner,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: SvgPicture.asset(
|
||||
model.doorContactState
|
||||
? Assets.doorOpen
|
||||
: Assets.doorClose,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.13,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DefaultContainer(
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) =>
|
||||
DoorRecordsScreen(
|
||||
DSId: device!.uuid!)),
|
||||
);
|
||||
},
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.center,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.center,
|
||||
children: [
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxHeight: 46, maxWidth: 50),
|
||||
child: SvgPicture.asset(
|
||||
Assets.doorRecordsIcon),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 15,
|
||||
),
|
||||
const Flexible(
|
||||
child: FittedBox(
|
||||
child: BodySmall(
|
||||
text: 'Records',
|
||||
// doorLockButtons.keys.elementAt(index),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: DefaultContainer(
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) =>
|
||||
NotificationSettingsPage()),
|
||||
);
|
||||
},
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.center,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.center,
|
||||
children: [
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxHeight: 46, maxWidth: 50),
|
||||
child: SvgPicture.asset(
|
||||
Assets.doorNotificationSetting),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 15,
|
||||
),
|
||||
const Flexible(
|
||||
child: FittedBox(
|
||||
child: BodySmall(
|
||||
text: 'Notification Settings',
|
||||
// doorLockButtons.keys.elementAt(index),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -9,10 +9,10 @@ import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/ACs/acs_view.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/curtains/curtain_view.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/door_sensor/door_sensor_screen.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_view.dart';
|
||||
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_gang/one_gang_screen.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_Interface.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/wall_sensor/wall_sensor_interface.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/ceiling_sensor/ceiling_sensor_interface.dart';
|
||||
@ -31,7 +31,6 @@ class RoomPageSwitch extends StatelessWidget {
|
||||
});
|
||||
|
||||
final DeviceModel device;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
@ -87,7 +86,8 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) => ACsView(deviceModel: device)));
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
ACsView(deviceModel: device)));
|
||||
// navigateToInterface(ACsView(deviceModel: device), context);
|
||||
break;
|
||||
case DeviceType.WallSensor:
|
||||
@ -110,8 +110,9 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
CurtainView(curtain: device,)));
|
||||
pageBuilder: (context, animation1, animation2) => CurtainView(
|
||||
curtain: device,
|
||||
)));
|
||||
break;
|
||||
case DeviceType.Blind:
|
||||
break;
|
||||
@ -119,14 +120,16 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) => DoorInterface(doorLock: device)));
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
DoorInterface(doorLock: device)));
|
||||
// navigateToInterface(DoorInterface(doorlock: device), context);
|
||||
break;
|
||||
case DeviceType.Gateway:
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) => GateWayView(gatewayObj: device)));
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
GateWayView(gatewayObj: device)));
|
||||
break;
|
||||
case DeviceType.LightBulb:
|
||||
navigateToInterface(LightInterface(light: device), context);
|
||||
@ -149,13 +152,18 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
ThreeGangInterface(gangSwitch: device)));
|
||||
|
||||
|
||||
case DeviceType.WH:
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
WaterHeaterPage(device: device)));
|
||||
case DeviceType.DS:
|
||||
Navigator.push(
|
||||
context,
|
||||
PageRouteBuilder(
|
||||
pageBuilder: (context, animation1, animation2) =>
|
||||
DoorSensorScreen(device: device)));
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
57
lib/features/shared_widgets/battery_bar.dart
Normal file
57
lib/features/shared_widgets/battery_bar.dart
Normal file
@ -0,0 +1,57 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
||||
|
||||
|
||||
class BatteryBar extends StatelessWidget {
|
||||
const BatteryBar({
|
||||
required this.batteryPercentage,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final int batteryPercentage;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(),
|
||||
Transform.rotate(
|
||||
angle: 1.5708, // 90 degrees in radians (π/2 or 1.5708)
|
||||
child: Icon(
|
||||
_getBatteryIcon(batteryPercentage),
|
||||
color: _getBatteryColor(batteryPercentage),
|
||||
size: 30,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
IconData _getBatteryIcon(int batteryLevel) {
|
||||
// if (batteryState == BatteryState.charging) {
|
||||
// return Icons.battery_charging_full;
|
||||
// } else
|
||||
if (batteryLevel >= 80) {
|
||||
return Icons.battery_full;
|
||||
} else if (batteryLevel >= 60) {
|
||||
return Icons.battery_4_bar;
|
||||
} else if (batteryLevel >= 40) {
|
||||
return Icons.battery_3_bar;
|
||||
} else if (batteryLevel >= 20) {
|
||||
return Icons.battery_2_bar;
|
||||
} else {
|
||||
return Icons.battery_alert;
|
||||
}
|
||||
}
|
||||
|
||||
Color _getBatteryColor(int batteryLevel) {
|
||||
if (batteryLevel >= 80) {
|
||||
return Colors.green;
|
||||
} else if (batteryLevel >= 40) {
|
||||
return Colors.yellowAccent;
|
||||
} else {
|
||||
return Colors.red;
|
||||
}
|
||||
}
|
||||
}
|
@ -1044,13 +1044,18 @@ class Assets {
|
||||
static const String waterHeaterOn = "assets/icons/water_heater_on.svg";
|
||||
static const String waterHeaterOff = "assets/icons/water_heater_off.svg";
|
||||
|
||||
static const String scheduleCelenderIcon = "assets/icons/schedule_celender_icon.svg";
|
||||
static const String scheduleCirculateIcon = "assets/icons/schedule_circulate_icon.svg";
|
||||
static const String scheduleInchingIcon = "assets/icons/schedule_Inching_icon.svg";
|
||||
static const String scheduleCelenderIcon =
|
||||
"assets/icons/schedule_celender_icon.svg";
|
||||
static const String scheduleCirculateIcon =
|
||||
"assets/icons/schedule_circulate_icon.svg";
|
||||
static const String scheduleInchingIcon =
|
||||
"assets/icons/schedule_Inching_icon.svg";
|
||||
static const String scheduleTimeIcon = "assets/icons/schedule_time_icon.svg";
|
||||
static const String waterHeaterIcon = "assets/icons/water_heater_icon.svg";
|
||||
|
||||
|
||||
|
||||
|
||||
static const String doorOpen = "assets/icons/opened_door.svg";
|
||||
static const String doorClose = "assets/icons/closed_door.svg";
|
||||
static const String doorNotificationSetting =
|
||||
"assets/icons/door_notification_setting_icon.svg";
|
||||
static const String doorRecordsIcon = "assets/icons/door_records_icon.svg";
|
||||
}
|
||||
|
@ -81,7 +81,8 @@ abstract class ApiEndpoints {
|
||||
static const String controlGroup = '/group/control';
|
||||
//GET
|
||||
static const String groupBySpace = '/group/{unitUuid}';
|
||||
static const String devicesByGroupName = '/group/{unitUuid}/devices/{groupName}';
|
||||
static const String devicesByGroupName =
|
||||
'/group/{unitUuid}/devices/{groupName}';
|
||||
|
||||
static const String groupByUuid = '/group/{groupUuid}';
|
||||
//DELETE
|
||||
@ -93,7 +94,8 @@ abstract class ApiEndpoints {
|
||||
static const String addDeviceToRoom = '/device/room';
|
||||
static const String addDeviceToGroup = '/device/group';
|
||||
static const String controlDevice = '/device/{deviceUuid}/control';
|
||||
static const String firmwareDevice = '/device/{deviceUuid}/firmware/{firmwareVersion}';
|
||||
static const String firmwareDevice =
|
||||
'/device/{deviceUuid}/firmware/{firmwareVersion}';
|
||||
static const String getDevicesByUserId = '/device/user/{userId}';
|
||||
static const String getDevicesByUnitId = '/device/unit/{unitUuid}';
|
||||
static const String openDoorLock = '/door-lock/open/{doorLockUuid}';
|
||||
@ -103,7 +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';
|
||||
|
||||
///Device Permission Module
|
||||
//POST
|
||||
@ -128,24 +131,29 @@ abstract class ApiEndpoints {
|
||||
|
||||
static const String getUnitAutomation = '/automation/{unitUuid}';
|
||||
|
||||
static const String getAutomationDetails = '/automation/details/{automationId}';
|
||||
static const String getAutomationDetails =
|
||||
'/automation/details/{automationId}';
|
||||
|
||||
/// PUT
|
||||
static const String updateScene = '/scene/tap-to-run/{sceneId}';
|
||||
|
||||
static const String updateAutomation = '/automation/{automationId}';
|
||||
|
||||
static const String updateAutomationStatus = '/automation/status/{automationId}';
|
||||
static const String updateAutomationStatus =
|
||||
'/automation/status/{automationId}';
|
||||
|
||||
/// DELETE
|
||||
static const String deleteScene = '/scene/tap-to-run/{unitUuid}/{sceneId}';
|
||||
|
||||
static const String deleteAutomation = '/automation/{unitUuid}/{automationId}';
|
||||
static const String deleteAutomation =
|
||||
'/automation/{unitUuid}/{automationId}';
|
||||
|
||||
//////////////////////Door Lock //////////////////////
|
||||
//online
|
||||
static const String addTemporaryPassword = '/door-lock/temporary-password/online/{doorLockUuid}';
|
||||
static const String getTemporaryPassword = '/door-lock/temporary-password/online/{doorLockUuid}';
|
||||
static const String addTemporaryPassword =
|
||||
'/door-lock/temporary-password/online/{doorLockUuid}';
|
||||
static const String getTemporaryPassword =
|
||||
'/door-lock/temporary-password/online/{doorLockUuid}';
|
||||
|
||||
//one-time offline
|
||||
static const String addOneTimeTemporaryPassword =
|
||||
@ -176,11 +184,10 @@ abstract class ApiEndpoints {
|
||||
static const String deleteTemporaryPassword =
|
||||
'/door-lock/temporary-password/online/{doorLockUuid}/{passwordId}';
|
||||
|
||||
|
||||
static const String saveSchedule = '/schedule/{deviceUuid}';
|
||||
static const String getSchedule = '/schedule/{deviceUuid}?category={category}';
|
||||
static const String getSchedule =
|
||||
'/schedule/{deviceUuid}?category={category}';
|
||||
static const String changeSchedule = '/schedule/enable/{deviceUuid}';
|
||||
static const String deleteSchedule = '/schedule/{deviceUuid}/{scheduleId}';
|
||||
|
||||
|
||||
static const String reportLogs = '/device/report-logs/{deviceUuid}?code={code}&startTime={startTime}&endTime={endTime}';
|
||||
}
|
||||
|
@ -39,7 +39,6 @@ class DevicesAPI {
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
},
|
||||
|
||||
);
|
||||
return response;
|
||||
} catch (e) {
|
||||
@ -72,7 +71,8 @@ class DevicesAPI {
|
||||
|
||||
static Future<Map<String, dynamic>> getDeviceStatus(String deviceId) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.deviceFunctionsStatus.replaceAll('{deviceUuid}', deviceId),
|
||||
path: ApiEndpoints.deviceFunctionsStatus
|
||||
.replaceAll('{deviceUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -82,7 +82,9 @@ class DevicesAPI {
|
||||
}
|
||||
|
||||
static Future<Map<String, dynamic>> renamePass(
|
||||
{required String name, required String doorLockUuid, required String passwordId}) async {
|
||||
{required String name,
|
||||
required String doorLockUuid,
|
||||
required String passwordId}) async {
|
||||
final response = await _httpService.put(
|
||||
path: ApiEndpoints.renamePassword
|
||||
.replaceAll('{doorLockUuid}', doorLockUuid)
|
||||
@ -107,7 +109,8 @@ class DevicesAPI {
|
||||
return response;
|
||||
}
|
||||
|
||||
static Future<List<DeviceModel>> getDeviceByGroupName(String unitId, String groupName) async {
|
||||
static Future<List<DeviceModel>> getDeviceByGroupName(
|
||||
String unitId, String groupName) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.devicesByGroupName
|
||||
.replaceAll('{unitUuid}', unitId)
|
||||
@ -146,7 +149,8 @@ class DevicesAPI {
|
||||
return response;
|
||||
}
|
||||
|
||||
static Future<List<DeviceModel>> getDevicesByGatewayId(String gatewayId) async {
|
||||
static Future<List<DeviceModel>> getDevicesByGatewayId(
|
||||
String gatewayId) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.gatewayApi.replaceAll('{gatewayUuid}', gatewayId),
|
||||
showServerMessage: false,
|
||||
@ -168,7 +172,8 @@ class DevicesAPI {
|
||||
String deviceId,
|
||||
) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.getTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.getTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -179,7 +184,8 @@ class DevicesAPI {
|
||||
|
||||
static Future getOneTimePasswords(String deviceId) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.getOneTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.getOneTimeTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -190,7 +196,8 @@ class DevicesAPI {
|
||||
|
||||
static Future getTimeLimitPasswords(String deviceId) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.getMultipleTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.getMultipleTimeTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -215,10 +222,12 @@ class DevicesAPI {
|
||||
"invalidTime": invalidTime,
|
||||
};
|
||||
if (scheduleList != null) {
|
||||
body["scheduleList"] = scheduleList.map((schedule) => schedule.toJson()).toList();
|
||||
body["scheduleList"] =
|
||||
scheduleList.map((schedule) => schedule.toJson()).toList();
|
||||
}
|
||||
final response = await _httpService.post(
|
||||
path: ApiEndpoints.addTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.addTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
body: body,
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) => json,
|
||||
@ -229,7 +238,8 @@ class DevicesAPI {
|
||||
static Future generateOneTimePassword({deviceId}) async {
|
||||
try {
|
||||
final response = await _httpService.post(
|
||||
path: ApiEndpoints.addOneTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.addOneTimeTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -241,10 +251,12 @@ class DevicesAPI {
|
||||
}
|
||||
}
|
||||
|
||||
static Future generateMultiTimePassword({deviceId, effectiveTime, invalidTime}) async {
|
||||
static Future generateMultiTimePassword(
|
||||
{deviceId, effectiveTime, invalidTime}) async {
|
||||
try {
|
||||
final response = await _httpService.post(
|
||||
path: ApiEndpoints.addMultipleTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
|
||||
path: ApiEndpoints.addMultipleTimeTemporaryPassword
|
||||
.replaceAll('{doorLockUuid}', deviceId),
|
||||
showServerMessage: true,
|
||||
body: {"effectiveTime": effectiveTime, "invalidTime": invalidTime},
|
||||
expectedResponseModel: (json) {
|
||||
@ -282,8 +294,8 @@ class DevicesAPI {
|
||||
final response = await _httpService.post(
|
||||
path: ApiEndpoints.saveSchedule.replaceAll('{deviceUuid}', deviceId),
|
||||
showServerMessage: false,
|
||||
body:
|
||||
jsonEncode({
|
||||
body: jsonEncode(
|
||||
{
|
||||
"category": category,
|
||||
"time": time,
|
||||
"function": {
|
||||
@ -291,7 +303,8 @@ class DevicesAPI {
|
||||
"value": value,
|
||||
},
|
||||
"days": days
|
||||
},),
|
||||
},
|
||||
),
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
},
|
||||
@ -304,7 +317,9 @@ class DevicesAPI {
|
||||
required String deviceId,
|
||||
}) async {
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.getSchedule.replaceAll('{deviceUuid}', deviceId).replaceAll('{category}', category),
|
||||
path: ApiEndpoints.getSchedule
|
||||
.replaceAll('{deviceUuid}', deviceId)
|
||||
.replaceAll('{category}', category),
|
||||
showServerMessage: false,
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
@ -320,10 +335,7 @@ class DevicesAPI {
|
||||
}) async {
|
||||
final response = await _httpService.put(
|
||||
path: ApiEndpoints.changeSchedule.replaceAll('{deviceUuid}', deviceUuid),
|
||||
body: {
|
||||
"scheduleId": scheduleId,
|
||||
"enable": enable
|
||||
},
|
||||
body: {"scheduleId": scheduleId, "enable": enable},
|
||||
expectedResponseModel: (json) {
|
||||
return json['success'];
|
||||
},
|
||||
@ -336,11 +348,36 @@ class DevicesAPI {
|
||||
required String scheduleId,
|
||||
}) async {
|
||||
final response = await _httpService.delete(
|
||||
path: ApiEndpoints.deleteSchedule.replaceAll('{deviceUuid}', deviceUuid).replaceAll('{scheduleId}', scheduleId),
|
||||
path: ApiEndpoints.deleteSchedule
|
||||
.replaceAll('{deviceUuid}', deviceUuid)
|
||||
.replaceAll('{scheduleId}', scheduleId),
|
||||
expectedResponseModel: (json) {
|
||||
return json;
|
||||
},
|
||||
);
|
||||
return response;
|
||||
}
|
||||
|
||||
static Future getReportLogs({
|
||||
required String deviceUuid,
|
||||
required String code,
|
||||
required String startTime,
|
||||
required String endTime,
|
||||
}) async {
|
||||
// print(
|
||||
// '---------${ApiEndpoints.reportLogs.replaceAll('{deviceUuid}', deviceUuid).replaceAll('{code}', code).replaceAll('{startTime}', startTime).replaceAll('{endTime}', endTime)}');
|
||||
final response = await _httpService.get(
|
||||
path: ApiEndpoints.reportLogs
|
||||
.replaceAll('{deviceUuid}', deviceUuid)
|
||||
.replaceAll('{code}', code)
|
||||
.replaceAll('{startTime}', startTime)
|
||||
.replaceAll('{endTime}', endTime),
|
||||
expectedResponseModel: (json) {
|
||||
print('====---------${json}');
|
||||
return json;
|
||||
},
|
||||
);
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
//ignore_for_file: constant_identifier_names
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:syncrow_app/features/devices/model/function_model.dart';
|
||||
import 'package:syncrow_app/features/menu/view/widgets/create_home/create_home_view.dart';
|
||||
import 'package:syncrow_app/features/menu/view/widgets/join_home/join_home_view.dart';
|
||||
@ -50,6 +49,7 @@ enum DeviceType {
|
||||
CeilingSensor,
|
||||
WallSensor,
|
||||
WH,
|
||||
DS,
|
||||
Other,
|
||||
}
|
||||
|
||||
@ -75,11 +75,14 @@ Map<String, DeviceType> devicesTypesMap = {
|
||||
"1G": DeviceType.OneGang,
|
||||
"CUR": DeviceType.Curtain,
|
||||
"WH": DeviceType.WH,
|
||||
"DS": DeviceType.DS,
|
||||
};
|
||||
Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
DeviceType.AC: [
|
||||
FunctionModel(
|
||||
code: 'switch', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'switch',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'mode',
|
||||
type: functionTypesMap['Enum'],
|
||||
@ -102,7 +105,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
// "range": ["low", "middle", "high", "auto"]
|
||||
})),
|
||||
FunctionModel(
|
||||
code: 'child_lock', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'child_lock',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
],
|
||||
DeviceType.Gateway: [
|
||||
FunctionModel(
|
||||
@ -116,7 +121,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
"range": ["normal", "alarm"]
|
||||
})),
|
||||
FunctionModel(
|
||||
code: 'factory_reset', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'factory_reset',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'alarm_active',
|
||||
type: functionTypesMap['String'],
|
||||
@ -126,7 +133,8 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
FunctionModel(
|
||||
code: 'sensitivity',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "", "min": 1, "max": 10, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "", "min": 1, "max": 10, "scale": 0, "step": 1})),
|
||||
],
|
||||
DeviceType.DoorLock: [
|
||||
FunctionModel(
|
||||
@ -134,7 +142,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
type: functionTypesMap['Raw'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'remote_no_dp_key', type: functionTypesMap['Raw'], values: ValueModel.fromJson({})),
|
||||
code: 'remote_no_dp_key',
|
||||
type: functionTypesMap['Raw'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'normal_open_switch',
|
||||
type: functionTypesMap['Boolean'],
|
||||
@ -144,119 +154,142 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
||||
FunctionModel(
|
||||
code: 'far_detection',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "cm", "min": 75, "max": 600, "scale": 0, "step": 75})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "cm", "min": 75, "max": 600, "scale": 0, "step": 75})),
|
||||
FunctionModel(
|
||||
code: 'presence_time',
|
||||
type: functionTypesMap['Integer'],
|
||||
values:
|
||||
ValueModel.fromJson({"unit": "Min", "min": 0, "max": 65535, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "Min", "min": 0, "max": 65535, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'motion_sensitivity_value',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "", "min": 1, "max": 5, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "", "min": 1, "max": 5, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'motionless_sensitivity',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "", "min": 1, "max": 5, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "", "min": 1, "max": 5, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'indicator', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'indicator',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
],
|
||||
DeviceType.OneGang: [
|
||||
FunctionModel(
|
||||
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'switch_1',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'countdown_1',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
],
|
||||
DeviceType.TwoGang: [
|
||||
FunctionModel(
|
||||
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})
|
||||
),
|
||||
code: 'switch_1',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})
|
||||
),
|
||||
code: 'switch_2',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'countdown_1',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})
|
||||
),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'countdown_2',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})
|
||||
),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
],
|
||||
DeviceType.ThreeGang: [
|
||||
FunctionModel(
|
||||
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'switch_1',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'switch_2',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'switch_3', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})),
|
||||
code: 'switch_3',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'countdown_1',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'countdown_2',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'countdown_3',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
],
|
||||
DeviceType.Curtain: [
|
||||
FunctionModel(
|
||||
code: 'control',
|
||||
type: functionTypesMap['Enum'],
|
||||
values: ValueModel.fromJson(
|
||||
{"range": ["open","stop","close"]}
|
||||
)
|
||||
),
|
||||
values: ValueModel.fromJson({
|
||||
"range": ["open", "stop", "close"]
|
||||
})),
|
||||
FunctionModel(
|
||||
code: 'percent_control',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "%", "min": 0, "max": 100, "scale": 0, "step": 1})
|
||||
),
|
||||
{"unit": "%", "min": 0, "max": 100, "scale": 0, "step": 1})),
|
||||
],
|
||||
DeviceType.WH: [
|
||||
FunctionModel(
|
||||
code: 'switch_1',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson({})
|
||||
),
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'countdown_1',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson(
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})
|
||||
),
|
||||
{"unit": "s", "min": 0, "max": 43200, "scale": 0, "step": 1})),
|
||||
FunctionModel(
|
||||
code: 'relay_status',
|
||||
type: functionTypesMap['Enum'],
|
||||
values: ValueModel.fromJson(
|
||||
{"range": [ "off", "on"]})
|
||||
),
|
||||
values: ValueModel.fromJson({
|
||||
"range": ["off", "on"]
|
||||
})),
|
||||
FunctionModel(
|
||||
code: 'switch_backlight',
|
||||
type: functionTypesMap['Boolean'],
|
||||
values: ValueModel.fromJson(
|
||||
{})
|
||||
),
|
||||
values: ValueModel.fromJson({})),
|
||||
FunctionModel(
|
||||
code: 'switch_inching',
|
||||
type: functionTypesMap['String'],
|
||||
values: ValueModel.fromJson(
|
||||
{"maxlen": 255,})
|
||||
),
|
||||
values: ValueModel.fromJson({
|
||||
"maxlen": 255,
|
||||
})),
|
||||
FunctionModel(
|
||||
code: 'cycle_timing',
|
||||
type: functionTypesMap['Raw'],
|
||||
values: ValueModel.fromJson(
|
||||
{"maxlen": 255})
|
||||
values: ValueModel.fromJson({"maxlen": 255})),
|
||||
],
|
||||
DeviceType.DS: [
|
||||
FunctionModel(
|
||||
code: 'doorcontact_state',
|
||||
type: functionTypesMap['Raw'],
|
||||
values: ValueModel.fromJson({})
|
||||
),
|
||||
FunctionModel(
|
||||
code: 'battery_percentage',
|
||||
type: functionTypesMap['Integer'],
|
||||
values: ValueModel.fromJson({})
|
||||
),
|
||||
],
|
||||
};
|
||||
@ -404,7 +437,11 @@ List<Map<String, Object>> menuSections = [
|
||||
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsMessages,
|
||||
'page': null
|
||||
},
|
||||
{'title': 'FAQs', 'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsFAQs, 'page': null},
|
||||
{
|
||||
'title': 'FAQs',
|
||||
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsFAQs,
|
||||
'page': null
|
||||
},
|
||||
{
|
||||
'title': 'Help & Feedback',
|
||||
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsHelpAndFeedback,
|
||||
@ -434,7 +471,11 @@ List<Map<String, Object>> menuSections = [
|
||||
'title': 'Legal Information',
|
||||
'color': const Color(0xFF001B72),
|
||||
'buttons': [
|
||||
{'title': 'About', 'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsAbout, 'page': null},
|
||||
{
|
||||
'title': 'About',
|
||||
'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsAbout,
|
||||
'page': null
|
||||
},
|
||||
{
|
||||
'title': 'Privacy Policy',
|
||||
'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsPrivacyPolicy,
|
||||
|
Reference in New Issue
Block a user