4_scene&6_scene

This commit is contained in:
mohammad
2024-11-18 09:09:47 +03:00
parent b547a126ed
commit ec7b351a82
76 changed files with 8584 additions and 130 deletions

View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="9" fill="#7CC67B"/>
<line x1="3" y1="9" x2="15" y2="9" stroke="white" stroke-width="2"/>
<line x1="9" y1="3" x2="9" y2="15" stroke="white" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 286 B

View File

@ -0,0 +1,5 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 0V36C27.9411 36 36 27.9411 36 18C36 8.05886 27.9411 0 18 0Z" fill="#3B88F5"/>
<path d="M33.827 18C33.827 8.05886 26.741 0 18 0C8.05886 0 0 8.05886 0 18C0 27.9411 8.05886 36 18 36C26.741 36 33.827 27.9411 33.827 18Z" fill="#28ABFA"/>
<path d="M25.2749 19.8827C25.8404 19.5071 26.2213 18.805 26.2213 18.0002C26.2213 17.1953 25.8404 16.4932 25.2749 16.1177C25.2749 16.1169 14.5527 8.99908 14.5527 8.99908C14.3036 8.83407 14.0248 8.73643 13.7391 8.71289C13.4191 8.73469 13.0992 8.82726 12.8027 8.99843C12.1057 9.40087 11.7166 10.1312 11.7165 10.882C11.7158 10.8824 11.7158 25.1181 11.7158 25.1181C11.7166 25.8693 12.1057 26.5996 12.8027 27.002C13.099 27.1731 13.419 27.2657 13.7387 27.2875C14.0245 27.264 14.3032 27.1662 14.5521 27.001L25.2749 19.8827Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 881 B

View File

@ -0,0 +1,10 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4487_8092)">
<path d="M9.75 5.25H8.25V8.25H5.25V9.75H8.25V12.75H9.75V9.75H12.75V8.25H9.75V5.25ZM9 1.5C4.86 1.5 1.5 4.86 1.5 9C1.5 13.14 4.86 16.5 9 16.5C13.14 16.5 16.5 13.14 16.5 9C16.5 4.86 13.14 1.5 9 1.5ZM9 15C5.6925 15 3 12.3075 3 9C3 5.6925 5.6925 3 9 3C12.3075 3 15 5.6925 15 9C15 12.3075 12.3075 15 9 15Z" fill="#6488FB"/>
</g>
<defs>
<clipPath id="clip0_4487_8092">
<rect width="18" height="18" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 567 B

View File

@ -0,0 +1,10 @@
<svg width="48" height="49" viewBox="0 0 48 49" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M29.5377 41.3253V44.6226C29.5377 47.0444 27.6825 48.9996 25.384 48.9996H22.6148C20.3163 48.9996 18.4611 47.0444 18.4611 44.6226V41.3253C18.4611 40.5082 19.0702 39.769 19.8456 39.769H28.1531C28.9286 39.769 29.5377 40.5082 29.5377 41.3253Z" fill="#FEA832"/>
<path d="M29.5377 41.3253V44.6226C29.5377 47.0444 27.6825 48.9996 25.384 48.9996H23.9994V39.769H28.1531C28.9286 39.769 29.5377 40.5082 29.5377 41.3253Z" fill="#FE9923"/>
<path d="M23.996 12.0776C22.9619 12.0776 21.9279 12.1913 20.8936 12.4474C16.2977 13.4999 12.5923 17.1122 11.4719 21.635C10.3517 26.1861 11.6443 30.7941 14.9476 34.0083C16.1254 35.1747 16.8148 36.9097 16.8148 38.7871V39.1C16.8148 41.4608 18.7392 43.4615 21.1235 43.4615H26.8685C29.2528 43.4615 31.1772 41.4608 31.1772 39.1V38.7871C31.1772 36.9381 31.8953 35.1461 33.1592 33.923C35.5722 31.5052 36.9222 28.2911 36.9222 24.8777C36.9222 17.7096 31.0624 12.0776 23.996 12.0776Z" fill="#FEDB41"/>
<path d="M11.0733 14.0625L7.09628 10.0855C6.54701 9.53623 6.54701 8.64628 7.09628 8.09701C7.64555 7.54774 8.5355 7.54774 9.08477 8.09701L13.0618 12.074C13.611 12.6233 13.611 13.5132 13.0618 14.0625C12.5125 14.6118 11.6226 14.6118 11.0733 14.0625Z" fill="#FEA832"/>
<path d="M7.12498 26.4077H1.40634C0.629078 26.4077 0.00012207 25.7787 0.00012207 25.0014C0.00012207 24.2242 0.629078 23.5952 1.40634 23.5952H7.12498C7.90225 23.5952 8.5312 24.2242 8.5312 25.0014C8.5312 25.7787 7.90225 26.4077 7.12498 26.4077Z" fill="#FEA832"/>
<path d="M46.5931 26.4077H40.8745C40.0972 26.4077 39.4683 25.7787 39.4683 25.0014C39.4683 24.2242 40.0972 23.5952 40.8745 23.5952H46.5931C47.3704 23.5952 47.9993 24.2242 47.9993 25.0014C47.9993 25.7787 47.3704 26.4077 46.5931 26.4077Z" fill="#FE9923"/>
<path d="M34.9375 14.0625C34.3882 13.5132 34.3882 12.6233 34.9375 12.074L38.9144 8.09701C39.4637 7.54774 40.3537 7.54774 40.9029 8.09701C41.4522 8.64628 41.4522 9.53623 40.9029 10.0855L36.926 14.0625C36.3766 14.6118 35.4867 14.6118 34.9375 14.0625Z" fill="#FE9923"/>
<path d="M23.8009 9.01898C23.0241 9.01898 22.3948 8.38969 22.3948 7.6129V1.9886C22.3948 1.21181 23.0241 0.58252 23.8009 0.58252C24.5776 0.58252 25.2069 1.21181 25.2069 1.9886L25.2069 7.6129C25.2069 8.38982 24.5777 9.01904 23.8009 9.01898Z" fill="#FE9923"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<g transform="matrix(1 0 0 1 540 540)" id="08fc7ff7-a606-462d-8969-ede27d8e77f9" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
</g>
<g transform="matrix(1 0 0 1 540 540)" id="6aac87eb-d0cb-4bcd-affa-b5008406fb16" >
</g>
<g transform="matrix(56.84 0 0 56.84 540 540)" >
<g style="" >
<g transform="matrix(1 0 0 1 3 -6)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-12.5, -4.5)" d="M 10.1364 7.1194 L 7.03409 4.29851 L 6 5.23881 L 10.1364 9 L 19 0.940299 L 17.9659 0 L 10.1364 7.1194 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -2.63 1.24)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-6.87, -11.74)" d="M 2.29002 7.87775 C 2.29002 11.6677 5.3701 14.7478 9.16009 14.7478 L 9.16009 11.3128 L 13.7401 15.8928 L 9.16009 20.4729 L 9.16009 17.0378 C 4.09914 17.0378 0 12.9387 0 7.87775 C 0 6.08008 0.526705 4.40836 1.41981 3 L 3.09153 4.67172 C 2.57628 5.62208 2.29002 6.72129 2.29002 7.87775 Z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.3334 2.50008H10L8.16671 0.666748H2.66671C1.64921 0.666748 0.842541 1.48258 0.842541 2.50008L0.833374 13.5001C0.833374 14.5176 1.64921 15.3334 2.66671 15.3334H17.3334C18.3509 15.3334 19.1667 14.5176 19.1667 13.5001V4.33341C19.1667 3.31591 18.3509 2.50008 17.3334 2.50008ZM17.3334 13.5001H2.66671V2.50008H7.40587L9.23921 4.33341H17.3334V13.5001ZM10 9.83342H11.8334V11.6667H13.6667V9.83342H15.5V8.00008H13.6667V6.16675H11.8334V8.00008H10V9.83342Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 576 B

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.3258 4.08383C15.0587 3.35098 15.0585 2.16495 14.3258 1.43217L13.4419 0.548297C12.7108 -0.182766 11.5213 -0.182766 10.7902 0.548297L2.54069 8.79789C2.06572 9.27286 1.75181 9.90067 1.65681 10.5656L1.21484 13.6592L4.30847 13.2173C4.97341 13.1223 5.60122 12.8084 6.07619 12.3334L14.3258 4.08383ZM4.16112 8.9452L9.46444 3.64189L11.2322 5.40964L5.92891 10.713L4.16112 8.9452ZM2.688 12.1861L2.89425 10.7425C2.94141 10.4125 3.07863 10.0979 3.28581 9.83764L5.0365 11.5883C4.77628 11.7955 4.46172 11.9327 4.13172 11.9799L2.688 12.1861ZM13.4419 3.19992L12.1161 4.52577L10.3483 2.75802L11.6742 1.4322C11.9178 1.18852 12.3143 1.18852 12.558 1.4322L13.4419 2.31608C13.6862 2.56039 13.6861 2.95577 13.4419 3.19992Z" fill="#D5D5D5"/>
<path d="M0 14.749H16V15.999H0V14.749Z" fill="#D5D5D5"/>
</svg>

After

Width:  |  Height:  |  Size: 891 B

View File

@ -0,0 +1,16 @@
<svg width="100" height="139" viewBox="0 0 100 139" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.5419 20.2425C11.1182 19.3486 10.0545 18.9679 9.16647 19.3936L1.38334 23.1269C0.591819 23.3099 0 24.0198 0 24.8727V33.8466C0 34.8381 0.797668 35.6414 1.78229 35.6414C2.76668 35.6414 3.56412 34.8381 3.56412 33.8466V27.6645L9.16647 30.3517C9.41376 30.4705 9.67449 30.5264 9.93112 30.5264C10.5974 30.5264 11.2359 30.1484 11.5419 29.5026C11.9643 28.6076 11.5875 27.5367 10.699 27.1104L6.03295 24.8725L10.699 22.6347C11.5877 22.2085 11.9643 21.1376 11.5419 20.2425Z" fill="#D5D5D5"/>
<path d="M20.6084 17.6894C20.8655 17.6894 21.1257 17.6335 21.3737 17.5147L32.0481 12.3952C32.9366 11.9685 33.3141 10.8974 32.891 10.0025C32.4682 9.10867 31.4052 8.72817 30.5156 9.15363L19.8408 14.2736C18.9522 14.7 18.5754 15.7706 18.998 16.6658C19.3038 17.3112 19.9423 17.6894 20.6084 17.6894Z" fill="#D5D5D5"/>
<path d="M42.7227 7.27445L48.1841 4.65449V10.9114C48.1841 11.9027 48.9818 12.7061 49.9659 12.7061C50.9503 12.7061 51.7478 11.9027 51.7478 10.9114V4.62192L57.2779 7.27445C57.5259 7.39303 57.7862 7.44922 58.0433 7.44922C58.7091 7.44922 59.3478 7.07124 59.6534 6.42537C60.0763 5.53041 59.6994 4.45953 58.8106 4.03316L50.7663 0.174427C50.2813 -0.0581424 49.7189 -0.0581424 49.2338 0.174427L41.19 4.03316C40.3015 4.45953 39.9244 5.53018 40.3472 6.42537C40.771 7.32101 41.8362 7.70198 42.7227 7.27445Z" fill="#D5D5D5"/>
<path d="M67.9533 12.3944L78.6281 17.5146C78.875 17.6334 79.1361 17.6894 79.3932 17.6894C80.059 17.6894 80.6978 17.3114 81.0034 16.6655C81.426 15.7705 81.0494 14.6997 80.1606 14.2733L69.4856 9.15287C68.5982 8.72718 67.5345 9.10722 67.1105 10.0017C66.6875 10.8967 67.0645 11.9676 67.9533 12.3944Z" fill="#D5D5D5"/>
<path d="M81.539 34.8099C82.4275 34.3838 82.8046 33.3129 82.3815 32.4177C81.9587 31.5232 80.8946 31.1425 80.0065 31.5695L73.167 34.851L51.7477 24.5771V16.5766C51.7477 15.5846 50.9503 14.7819 49.9659 14.7819C48.9817 14.7819 48.1841 15.5848 48.1841 16.5766V24.6096L26.8346 34.85L20.6999 31.9074C19.8093 31.481 18.7482 31.8613 18.3244 32.7565C17.9016 33.6514 18.2787 34.7225 19.1672 35.1489L25.8031 38.3319V61.6685L19.0593 64.9031C18.1707 65.3295 17.7939 66.4002 18.2165 67.2956C18.5221 67.9412 19.1606 68.3192 19.8266 68.3192C20.0837 68.3192 20.3447 68.2632 20.5917 68.1444L26.8349 65.1499L48.1841 75.3903V81.5075C48.1841 82.4993 48.9817 83.3023 49.9659 83.3023C50.9503 83.3023 51.7477 82.4991 51.7477 81.5075V75.4234L73.1657 65.1502L79.6524 68.2616C79.9002 68.3802 80.1607 68.4364 80.4175 68.4364C81.0834 68.4364 81.7221 68.0584 82.0277 67.4125C82.4508 66.5176 82.0735 65.4467 81.1849 65.0201L74.1977 61.6687V38.3319L81.539 34.8099ZM70.634 62.388L51.7479 71.4467V49.0994L70.634 40.0402V62.388ZM29.4788 61.8939C29.4472 61.827 29.4053 61.7692 29.3668 61.7082V40.0404L48.1841 49.0664V71.4142L29.6409 62.5199C29.6239 62.3086 29.5745 62.0965 29.4788 61.8939ZM50.0003 27.7152L69.0207 36.8384L50.0003 45.9611L30.9799 36.8384L50.0003 27.7152Z" fill="#D5D5D5"/>
<path d="M78.6271 82.4859L67.9525 87.6061C67.0639 88.0327 66.6864 89.1036 67.1095 89.9979C67.4153 90.644 68.054 91.0215 68.7199 91.0215C68.9767 91.0215 69.2379 90.9655 69.485 90.8477L80.1598 85.7272C81.0483 85.3009 81.4252 84.2295 81.0025 83.3346C80.579 82.4401 79.5149 82.0616 78.6271 82.4859Z" fill="#D5D5D5"/>
<path d="M57.2782 92.7265L51.748 95.3793V88.227C51.748 87.2357 50.9506 86.4323 49.9662 86.4323C48.982 86.4323 48.1844 87.2357 48.1844 88.227V95.3467L42.723 92.7265C41.8335 92.3022 40.7713 92.6807 40.3475 93.5759C39.9246 94.4708 40.3015 95.5412 41.1903 95.9676L49.2346 99.8259C49.4769 99.9417 49.7387 100 50.0008 100C50.2629 100 50.5248 99.9417 50.7671 99.8259L58.8114 95.9676C59.6999 95.5412 60.077 94.4708 59.6541 93.5759C59.2304 92.6807 58.166 92.3031 57.2782 92.7265Z" fill="#D5D5D5"/>
<path d="M32.0477 87.6061L21.3729 82.4859C20.4864 82.0605 19.4219 82.4394 18.9976 83.3343C18.575 84.2293 18.9519 85.3006 19.8404 85.727L30.5154 90.8474C30.7623 90.9653 31.0235 91.0213 31.2803 91.0213C31.9461 91.0213 32.5849 90.6438 32.8905 89.9977C33.3133 89.1036 32.9362 88.0327 32.0477 87.6061Z" fill="#D5D5D5"/>
<path d="M11.5419 70.4973C11.1182 69.6028 10.0545 69.2239 9.16647 69.6487L3.56412 72.3354V65.6177C3.56412 64.6264 2.76668 63.823 1.78229 63.823C0.797668 63.823 0 64.6264 0 65.6177V74.5918C0 74.8162 0.0457694 75.0283 0.120686 75.2262C0.156892 75.8783 0.53193 76.465 1.12215 76.7485L9.16647 80.6072C9.41376 80.7254 9.67449 80.7818 9.93112 80.7818C10.5974 80.7818 11.2359 80.4038 11.5419 79.7581C11.9643 78.8632 11.5875 77.7923 10.699 77.3655L6.03295 75.1281L10.699 72.8902C11.5877 72.4636 11.9643 71.3923 11.5419 70.4973Z" fill="#D5D5D5"/>
<path d="M1.78229 56.8226C2.76668 56.8226 3.56412 56.0194 3.56412 55.0274V44.4374C3.56412 43.4461 2.76668 42.6427 1.78229 42.6427C0.797668 42.6427 0 43.4461 0 44.4374V55.0274C0.00022771 56.0194 0.797896 56.8226 1.78229 56.8226Z" fill="#D5D5D5"/>
<path d="M98.6173 23.1267L90.8342 19.3935C89.9443 18.9666 88.8825 19.3478 88.4589 20.2423C88.0363 21.1377 88.4132 22.2084 89.3017 22.635L93.9677 24.8729L89.3017 27.1107C88.4132 27.5371 88.0363 28.6077 88.4589 29.5029C88.7645 30.1488 89.4032 30.5268 90.0691 30.5268C90.3262 30.5268 90.5873 30.4708 90.8342 30.352L96.4365 27.6648V33.847C96.4365 34.8385 97.234 35.6417 98.2184 35.6417C99.2027 35.6417 100 34.8385 100 33.847V24.8731C100 24.0196 99.4088 23.3098 98.6173 23.1267Z" fill="#D5D5D5"/>
<path d="M98.2184 42.642C97.2337 42.642 96.4365 43.4454 96.4365 44.4367V55.0266C96.4365 56.0186 97.234 56.8214 98.2184 56.8214C99.2027 56.8214 100 56.0184 100 55.0266V44.4367C100 43.4454 99.203 42.642 98.2184 42.642Z" fill="#D5D5D5"/>
<path d="M98.2184 63.8228C97.2337 63.8228 96.4365 64.6262 96.4365 65.6175V72.3352L90.8342 69.6485C89.9443 69.223 88.8825 69.6021 88.4589 70.4971C88.0363 71.392 88.4132 72.4634 89.3017 72.8898L93.9677 75.1276L89.3017 77.365C88.4132 77.7918 88.0363 78.8627 88.4589 79.7577C88.7645 80.4033 89.4032 80.7813 90.0691 80.7813C90.3262 80.7813 90.5873 80.7249 90.8342 80.6068L98.8785 76.748C99.4687 76.4645 99.8438 75.8778 99.88 75.2258C99.9546 75.0278 100 74.8157 100 74.5914V65.6173C100 64.6262 99.203 63.8228 98.2184 63.8228Z" fill="#D5D5D5"/>
<path d="M28.6625 123.289H30.3578V135H28.7094L22.4906 126.25V135H20.8109V123.289H22.4359L28.6625 132.055V123.289ZM37.4631 135.18V135.188C36.0829 135.188 34.9501 134.729 34.0647 133.812C33.1845 132.901 32.7444 131.776 32.7444 130.438C32.7444 129.115 33.1845 128.005 34.0647 127.109C34.9501 126.208 36.0829 125.758 37.4631 125.758C38.8381 125.758 39.9709 126.208 40.8616 127.109C41.7522 128.005 42.1975 129.115 42.1975 130.438C42.1975 131.771 41.7522 132.896 40.8616 133.812C39.9709 134.724 38.8381 135.18 37.4631 135.18ZM37.4631 127.234V127.242C36.536 127.242 35.7913 127.547 35.2288 128.156C34.6663 128.766 34.385 129.534 34.385 130.461C34.385 131.404 34.6663 132.182 35.2288 132.797C35.7913 133.417 36.536 133.727 37.4631 133.727C38.3902 133.727 39.135 133.417 39.6975 132.797C40.26 132.182 40.5413 131.401 40.5413 130.453C40.5413 129.526 40.26 128.758 39.6975 128.148C39.135 127.539 38.3902 127.234 37.4631 127.234ZM57.2753 133.492V135H49.6816V123.289H51.3612V133.492H57.2753ZM62.9119 135.18V135.188C61.5317 135.188 60.3989 134.729 59.5134 133.812C58.6332 132.901 58.1931 131.776 58.1931 130.438C58.1931 129.115 58.6332 128.005 59.5134 127.109C60.3989 126.208 61.5317 125.758 62.9119 125.758C64.2869 125.758 65.4197 126.208 66.3103 127.109C67.2009 128.005 67.6462 129.115 67.6462 130.438C67.6462 131.771 67.2009 132.896 66.3103 133.812C65.4197 134.724 64.2869 135.18 62.9119 135.18ZM62.9119 127.234V127.242C61.9848 127.242 61.24 127.547 60.6775 128.156C60.115 128.766 59.8337 129.534 59.8337 130.461C59.8337 131.404 60.115 132.182 60.6775 132.797C61.24 133.417 61.9848 133.727 62.9119 133.727C63.839 133.727 64.5837 133.417 65.1462 132.797C65.7087 132.182 65.99 131.401 65.99 130.453C65.99 129.526 65.7087 128.758 65.1462 128.148C64.5837 127.539 63.839 127.234 62.9119 127.234ZM76.7203 125.93H78.3141V134.266C78.3141 137.26 76.7411 138.758 73.5953 138.758C72.0276 138.758 70.7047 138.359 69.6266 137.562L70.3531 136.328C71.3115 136.99 72.3583 137.32 73.4938 137.32C75.6396 137.32 76.7125 136.271 76.7125 134.172V133.641C75.999 134.667 74.9052 135.18 73.4313 135.18C72.2385 135.18 71.2438 134.747 70.4469 133.883C69.65 133.013 69.2516 131.87 69.2516 130.453C69.2516 129.052 69.6474 127.917 70.4391 127.047C71.2255 126.182 72.2255 125.75 73.4391 125.75C74.913 125.75 76.0068 126.263 76.7203 127.289V125.93ZM73.8844 133.688V133.695C74.7698 133.695 75.4625 133.385 75.9625 132.766C76.4625 132.151 76.7125 131.385 76.7125 130.469C76.7125 129.531 76.4625 128.758 75.9625 128.148C75.4625 127.539 74.7698 127.234 73.8844 127.234C72.9781 127.234 72.2516 127.542 71.7047 128.156C71.1578 128.771 70.8844 129.536 70.8844 130.453C70.8844 131.359 71.1578 132.125 71.7047 132.75C72.2516 133.375 72.9781 133.688 73.8844 133.688Z" fill="#D5D5D5"/>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -0,0 +1,9 @@
<svg width="61" height="78" viewBox="0 0 61 78" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.4903 47.9279L16.8438 49.2221C16.8166 49.2741 16.8032 49.3322 16.8049 49.3909C16.8067 49.4496 16.8234 49.5069 16.8537 49.5573C16.8839 49.6076 16.9266 49.6493 16.9776 49.6784C17.0286 49.7075 17.0862 49.723 17.145 49.7234H22.5828L23.7334 44.1986H19.5621C19.4988 44.1983 19.4366 44.2158 19.3827 44.249C19.3287 44.2822 19.2852 44.3298 19.2568 44.3864L18.8425 45.2013L7.5883 30.867C8.6698 18.425 13.1546 7.9471 19.3604 2.1377C13.9907 4.23837 9.33495 7.83301 5.94387 12.4964C2.55279 17.1598 0.568261 22.6969 0.225024 28.4527C0.208229 28.7362 0.28111 29.0177 0.433331 29.2575C0.585552 29.4972 0.809388 29.6829 1.07309 29.7883C2.01199 30.1535 2.97179 30.4626 3.94741 30.7137L17.4903 47.9279Z" fill="#E9E9E9"/>
<path d="M20.5167 32.9022C20.8068 20.3124 22.6162 7.15076 26.054 0.922852C17.8068 4.28197 11.3855 16.5624 10.2639 31.9561C12.9946 32.3497 16.3855 32.6867 20.5167 32.9022Z" fill="#E9E9E9"/>
<path d="M29.2309 33.1492V44.199H26.5555L25.4049 49.7239H35.8207L34.6688 44.199H31.9933V33.1492C34.1163 33.1368 36.0914 33.094 37.9326 33.0277C37.4837 12.2321 33.4201 0.313537 30.695 0H30.6121H30.5334C27.7972 0.330111 23.7406 12.2445 23.2861 33.0111C25.1328 33.0871 27.108 33.1299 29.2309 33.1492Z" fill="#E9E9E9"/>
<path d="M25.0867 60.4366L25.7676 59.7557C26.1351 59.3987 26.6258 59.1965 27.1382 59.1911C27.6506 59.1857 28.1454 59.3775 28.5204 59.7267L30.6115 61.8289L32.6709 59.7571C33.038 59.3989 33.5289 59.1959 34.0417 59.19C34.5545 59.184 35.0498 59.3757 35.4251 59.7253L36.1364 60.4352V52.4863H25.0867V60.4366Z" fill="#E9E9E9"/>
<path d="M38.8993 52.4856V62.3751C38.9008 62.7626 38.7872 63.1417 38.5729 63.4645C38.3586 63.7872 38.0533 64.0391 37.6957 64.1881C37.3381 64.3371 36.9442 64.3765 36.5642 64.3014C36.1841 64.2262 35.8349 64.0399 35.5609 63.766L34.065 62.2715L32.0043 64.3434C31.6256 64.7048 31.123 64.9074 30.5996 64.9097C30.0973 64.9106 29.6138 64.7188 29.2487 64.3738L27.1589 62.2715L25.6645 63.766C25.3905 64.0404 25.0412 64.2271 24.6609 64.3025C24.2806 64.378 23.8865 64.3386 23.5285 64.1896C23.1706 64.0405 22.8651 63.7885 22.6507 63.4654C22.4364 63.1423 22.3229 62.7628 22.3247 62.3751V52.4856H17.1451C17.0292 52.4779 16.9139 52.4631 16.7998 52.4414V75.9663C16.7998 76.3326 16.9453 76.684 17.2044 76.943C17.4634 77.202 17.8147 77.3475 18.181 77.3475H43.043C43.4093 77.3475 43.7606 77.202 44.0196 76.943C44.2787 76.684 44.4242 76.3326 44.4242 75.9663V52.4414C44.3105 52.4631 44.1957 52.4779 44.0802 52.4856H38.8993ZM26.4683 74.5851H20.9435C20.5771 74.5851 20.2258 74.4396 19.9668 74.1806C19.7078 73.9215 19.5622 73.5702 19.5622 73.2039C19.5622 72.8376 19.7078 72.4862 19.9668 72.2272C20.2258 71.9682 20.5771 71.8227 20.9435 71.8227H26.4683C26.8347 71.8227 27.186 71.9682 27.445 72.2272C27.704 72.4862 27.8496 72.8376 27.8496 73.2039C27.8496 73.5702 27.704 73.9215 27.445 74.1806C27.186 74.4396 26.8347 74.5851 26.4683 74.5851Z" fill="#E9E9E9"/>
<path d="M41.8629 2.14062C48.0674 7.94174 52.5522 18.4238 53.6364 30.87L42.3726 45.2015L41.9665 44.388C41.9383 44.3311 41.8947 44.2833 41.8408 44.2499C41.7869 44.2165 41.7247 44.1988 41.6613 44.1987H37.49L38.6419 49.7236H44.0812C44.1396 49.7251 44.1973 49.7109 44.2483 49.6825C44.2993 49.6541 44.3418 49.6124 44.3712 49.562C44.4032 49.5126 44.4214 49.4557 44.4241 49.3969C44.4268 49.3382 44.4138 49.2798 44.3864 49.2277L43.74 47.9349L57.2759 30.7084C58.2509 30.4566 59.2102 30.1476 60.1489 29.7829C60.4117 29.6777 60.6349 29.4929 60.7872 29.2543C60.9396 29.0158 61.0134 28.7355 60.9983 28.4528C60.6542 22.6976 58.6694 17.1613 55.2784 12.4985C51.8873 7.83568 47.2321 4.24139 41.8629 2.14062Z" fill="#E9E9E9"/>
<path d="M50.96 31.9552C49.8385 16.5739 43.4283 4.30181 35.1907 0.931641C38.6092 7.15955 40.4186 20.3157 40.7073 32.9013C44.8454 32.6859 48.2294 32.3488 50.96 31.9552Z" fill="#E9E9E9"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.16663 14.0003H9.83329V12.3337H8.16663V14.0003ZM8.99996 0.666992C4.39996 0.666992 0.666626 4.40033 0.666626 9.00033C0.666626 13.6003 4.39996 17.3337 8.99996 17.3337C13.6 17.3337 17.3333 13.6003 17.3333 9.00033C17.3333 4.40033 13.6 0.666992 8.99996 0.666992ZM8.99996 15.667C5.32496 15.667 2.33329 12.6753 2.33329 9.00033C2.33329 5.32533 5.32496 2.33366 8.99996 2.33366C12.675 2.33366 15.6666 5.32533 15.6666 9.00033C15.6666 12.6753 12.675 15.667 8.99996 15.667ZM8.99996 4.00033C7.15829 4.00033 5.66663 5.49199 5.66663 7.33366H7.33329C7.33329 6.41699 8.08329 5.66699 8.99996 5.66699C9.91663 5.66699 10.6666 6.41699 10.6666 7.33366C10.6666 9.00033 8.16663 8.79199 8.16663 11.5003H9.83329C9.83329 9.62533 12.3333 9.41699 12.3333 7.33366C12.3333 5.49199 10.8416 4.00033 8.99996 4.00033Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 912 B

View File

@ -0,0 +1,38 @@
<svg width="286" height="286" viewBox="0 0 286 286" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_di_4487_3093)">
<path d="M250.999 132.999C250.999 67.8301 198.169 15 132.999 15C67.8301 15 15 67.8301 15 132.999C15 198.169 67.8301 250.999 132.999 250.999C198.169 250.999 250.999 198.169 250.999 132.999Z" fill="#EBECED"/>
</g>
<g filter="url(#filter1_i_4487_3093)">
<path d="M196.919 196.919C232.066 161.772 232.066 104.787 196.919 69.6396C161.772 34.4924 104.787 34.4924 69.6396 69.6396C34.4924 104.787 34.4924 161.772 69.6396 196.919C104.787 232.066 161.772 232.066 196.919 196.919Z" fill="#55E675"/>
</g>
<path d="M199.04 199.04C235.359 162.721 235.359 103.837 199.04 67.5183C162.721 31.1995 103.837 31.1995 67.5183 67.5183C31.1995 103.837 31.1995 162.721 67.5183 199.04C103.837 235.359 162.721 235.359 199.04 199.04Z" stroke="#F1F2F2" stroke-width="6"/>
<path d="M93.8516 139.562L93.8906 139.582C96.9115 141.665 100.154 142.707 103.617 142.707C107.029 142.707 108.734 141.678 108.734 139.621C108.734 138.853 108.298 138.215 107.426 137.707C106.527 137.186 105.434 136.822 104.145 136.613C102.829 136.392 101.404 136.079 99.8672 135.676C98.3698 135.272 96.944 134.79 95.5898 134.23C94.2747 133.684 93.181 132.805 92.3086 131.594C91.4362 130.396 91 128.911 91 127.141C91 124.354 92.1068 122.167 94.3203 120.578C96.5208 119.003 99.2357 118.215 102.465 118.215C106.931 118.215 110.759 119.562 113.949 122.258L110.746 126.73C108.337 124.973 105.486 124.094 102.191 124.094C98.9622 124.094 97.3477 125.083 97.3477 127.062C97.3477 127.792 97.7904 128.404 98.6758 128.898C99.5482 129.393 100.642 129.745 101.957 129.953C103.272 130.161 104.698 130.474 106.234 130.891C107.771 131.307 109.197 131.796 110.512 132.355C111.827 132.928 112.921 133.833 113.793 135.07C114.678 136.333 115.121 137.85 115.121 139.621C115.121 142.473 114.086 144.68 112.016 146.242C109.945 147.805 107.146 148.586 103.617 148.586C101.091 148.586 98.6823 148.176 96.3906 147.355C94.125 146.535 92.1523 145.428 90.4727 144.035L93.8516 139.562ZM133.461 148.527H133.441C128.793 148.527 125.036 147.102 122.172 144.25C119.307 141.398 117.875 137.772 117.875 133.371C117.875 128.983 119.307 125.363 122.172 122.512C125.036 119.66 128.793 118.234 133.441 118.234C138.09 118.234 141.853 119.66 144.73 122.512C147.608 125.363 149.047 128.983 149.047 133.371C149.047 137.772 147.608 141.398 144.73 144.25C141.853 147.102 138.096 148.527 133.461 148.527ZM133.441 124.035V124.074C130.824 124.074 128.637 124.96 126.879 126.73C125.121 128.514 124.242 130.734 124.242 133.391C124.242 136.047 125.121 138.273 126.879 140.07C128.637 141.867 130.824 142.766 133.441 142.766C136.072 142.766 138.259 141.874 140.004 140.09C141.749 138.306 142.621 136.066 142.621 133.371C142.621 130.702 141.749 128.475 140.004 126.691C138.272 124.921 136.085 124.035 133.441 124.035ZM155.336 139.562L155.375 139.582C158.396 141.665 161.638 142.707 165.102 142.707C168.513 142.707 170.219 141.678 170.219 139.621C170.219 138.853 169.783 138.215 168.91 137.707C168.012 137.186 166.918 136.822 165.629 136.613C164.314 136.392 162.888 136.079 161.352 135.676C159.854 135.272 158.428 134.79 157.074 134.23C155.759 133.684 154.665 132.805 153.793 131.594C152.921 130.396 152.484 128.911 152.484 127.141C152.484 124.354 153.591 122.167 155.805 120.578C158.005 119.003 160.72 118.215 163.949 118.215C168.415 118.215 172.243 119.562 175.434 122.258L172.23 126.73C169.822 124.973 166.97 124.094 163.676 124.094C160.447 124.094 158.832 125.083 158.832 127.062C158.832 127.792 159.275 128.404 160.16 128.898C161.033 129.393 162.126 129.745 163.441 129.953C164.757 130.161 166.182 130.474 167.719 130.891C169.255 131.307 170.681 131.796 171.996 132.355C173.311 132.928 174.405 133.833 175.277 135.07C176.163 136.333 176.605 137.85 176.605 139.621C176.605 142.473 175.57 144.68 173.5 146.242C171.43 147.805 168.63 148.586 165.102 148.586C162.576 148.586 160.167 148.176 157.875 147.355C155.609 146.535 153.637 145.428 151.957 144.035L155.336 139.562Z" fill="white"/>
<defs>
<filter id="filter0_di_4487_3093" x="0" y="1.52588e-05" width="285.999" height="285.999" 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="10" dy="10"/>
<feGaussianBlur stdDeviation="12.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.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4487_3093"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_3093" 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="5" dy="5"/>
<feGaussianBlur stdDeviation="15"/>
<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.05 0"/>
<feBlend mode="normal" in2="shape" result="effect2_innerShadow_4487_3093"/>
</filter>
<filter id="filter1_i_4487_3093" x="37.2792" y="25.2792" width="193" height="204" 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" dy="-12"/>
<feGaussianBlur stdDeviation="15"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.0980392 0 0 0 0 0.0980392 0 0 0 0.5 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_4487_3093"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

10
assets/icons/info.svg Normal file
View File

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4487_2199)">
<path d="M11 7H13V9H11V7ZM11 11H13V17H11V11ZM12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 20C7.59 20 4 16.41 4 12C4 7.59 7.59 4 12 4C16.41 4 20 7.59 20 12C20 16.41 16.41 20 12 20Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_4487_2199">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@ -0,0 +1,4 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="9" fill="#FF0909"/>
<line x1="3" y1="9" x2="15" y2="9" stroke="white" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 217 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="19" viewBox="0 0 16 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.34167 16.5083C6.34167 17.425 7.08333 18.1667 8 18.1667C8.91667 18.1667 9.65833 17.425 9.65833 16.5083H6.34167ZM8 4C10.3 4 12.1667 5.86667 12.1667 8.16667V14H3.83333V8.16667C3.83333 5.86667 5.7 4 8 4ZM8 0.25C7.30833 0.25 6.75 0.808333 6.75 1.5V2.475C4.13333 3.04167 2.16667 5.375 2.16667 8.16667V13.1667L0.5 14.8333V15.6667H15.5V14.8333L13.8333 13.1667V8.16667C13.8333 5.375 11.8667 3.04167 9.25 2.475V1.5C9.25 0.808333 8.69167 0.25 8 0.25ZM7.16667 5.66667H8.83333V9H7.16667V5.66667ZM7.16667 10.6667H8.83333V12.3333H7.16667V10.6667Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 663 B

38
assets/icons/red_sos.svg Normal file
View File

@ -0,0 +1,38 @@
<svg width="286" height="286" viewBox="0 0 286 286" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_di_4487_3092)">
<path d="M250.999 132.999C250.999 67.8301 198.169 15 132.999 15C67.8301 15 15 67.8301 15 132.999C15 198.169 67.8301 250.999 132.999 250.999C198.169 250.999 250.999 198.169 250.999 132.999Z" fill="#EBECED"/>
</g>
<g filter="url(#filter1_i_4487_3092)">
<path d="M196.919 196.919C232.066 161.772 232.066 104.787 196.919 69.6396C161.772 34.4924 104.787 34.4924 69.6396 69.6396C34.4924 104.787 34.4924 161.772 69.6396 196.919C104.787 232.066 161.772 232.066 196.919 196.919Z" fill="#FF3232"/>
</g>
<path d="M199.04 199.04C235.359 162.721 235.359 103.837 199.04 67.5183C162.721 31.1995 103.837 31.1995 67.5183 67.5183C31.1995 103.837 31.1995 162.721 67.5183 199.04C103.837 235.359 162.721 235.359 199.04 199.04Z" stroke="#F1F2F2" stroke-width="6"/>
<path d="M93.8516 139.562L93.8906 139.582C96.9115 141.665 100.154 142.707 103.617 142.707C107.029 142.707 108.734 141.678 108.734 139.621C108.734 138.853 108.298 138.215 107.426 137.707C106.527 137.186 105.434 136.822 104.145 136.613C102.829 136.392 101.404 136.079 99.8672 135.676C98.3698 135.272 96.944 134.79 95.5898 134.23C94.2747 133.684 93.181 132.805 92.3086 131.594C91.4362 130.396 91 128.911 91 127.141C91 124.354 92.1068 122.167 94.3203 120.578C96.5208 119.003 99.2357 118.215 102.465 118.215C106.931 118.215 110.759 119.562 113.949 122.258L110.746 126.73C108.337 124.973 105.486 124.094 102.191 124.094C98.9622 124.094 97.3477 125.083 97.3477 127.062C97.3477 127.792 97.7904 128.404 98.6758 128.898C99.5482 129.393 100.642 129.745 101.957 129.953C103.272 130.161 104.698 130.474 106.234 130.891C107.771 131.307 109.197 131.796 110.512 132.355C111.827 132.928 112.921 133.833 113.793 135.07C114.678 136.333 115.121 137.85 115.121 139.621C115.121 142.473 114.086 144.68 112.016 146.242C109.945 147.805 107.146 148.586 103.617 148.586C101.091 148.586 98.6823 148.176 96.3906 147.355C94.125 146.535 92.1523 145.428 90.4727 144.035L93.8516 139.562ZM133.461 148.527H133.441C128.793 148.527 125.036 147.102 122.172 144.25C119.307 141.398 117.875 137.772 117.875 133.371C117.875 128.983 119.307 125.363 122.172 122.512C125.036 119.66 128.793 118.234 133.441 118.234C138.09 118.234 141.853 119.66 144.73 122.512C147.608 125.363 149.047 128.983 149.047 133.371C149.047 137.772 147.608 141.398 144.73 144.25C141.853 147.102 138.096 148.527 133.461 148.527ZM133.441 124.035V124.074C130.824 124.074 128.637 124.96 126.879 126.73C125.121 128.514 124.242 130.734 124.242 133.391C124.242 136.047 125.121 138.273 126.879 140.07C128.637 141.867 130.824 142.766 133.441 142.766C136.072 142.766 138.259 141.874 140.004 140.09C141.749 138.306 142.621 136.066 142.621 133.371C142.621 130.702 141.749 128.475 140.004 126.691C138.272 124.921 136.085 124.035 133.441 124.035ZM155.336 139.562L155.375 139.582C158.396 141.665 161.638 142.707 165.102 142.707C168.513 142.707 170.219 141.678 170.219 139.621C170.219 138.853 169.783 138.215 168.91 137.707C168.012 137.186 166.918 136.822 165.629 136.613C164.314 136.392 162.888 136.079 161.352 135.676C159.854 135.272 158.428 134.79 157.074 134.23C155.759 133.684 154.665 132.805 153.793 131.594C152.921 130.396 152.484 128.911 152.484 127.141C152.484 124.354 153.591 122.167 155.805 120.578C158.005 119.003 160.72 118.215 163.949 118.215C168.415 118.215 172.243 119.562 175.434 122.258L172.23 126.73C169.822 124.973 166.97 124.094 163.676 124.094C160.447 124.094 158.832 125.083 158.832 127.062C158.832 127.792 159.275 128.404 160.16 128.898C161.033 129.393 162.126 129.745 163.441 129.953C164.757 130.161 166.182 130.474 167.719 130.891C169.255 131.307 170.681 131.796 171.996 132.355C173.311 132.928 174.405 133.833 175.277 135.07C176.163 136.333 176.605 137.85 176.605 139.621C176.605 142.473 175.57 144.68 173.5 146.242C171.43 147.805 168.63 148.586 165.102 148.586C162.576 148.586 160.167 148.176 157.875 147.355C155.609 146.535 153.637 145.428 151.957 144.035L155.336 139.562Z" fill="white"/>
<defs>
<filter id="filter0_di_4487_3092" x="0" y="1.52588e-05" width="285.999" height="285.999" 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="10" dy="10"/>
<feGaussianBlur stdDeviation="12.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.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4487_3092"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_3092" 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="5" dy="5"/>
<feGaussianBlur stdDeviation="15"/>
<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.05 0"/>
<feBlend mode="normal" in2="shape" result="effect2_innerShadow_4487_3092"/>
</filter>
<filter id="filter1_i_4487_3092" x="37.2792" y="25.2792" width="193" height="204" 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" dy="-12"/>
<feGaussianBlur stdDeviation="15"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.0980392 0 0 0 0 0.0980392 0 0 0 0.5 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_4487_3092"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.24976 7.25V8.75H11.7498V7.25H4.24976ZM7.99976 0.5C3.85976 0.5 0.499756 3.86 0.499756 8C0.499756 12.14 3.85976 15.5 7.99976 15.5C12.1398 15.5 15.4998 12.14 15.4998 8C15.4998 3.86 12.1398 0.5 7.99976 0.5ZM7.99976 14C4.69226 14 1.99976 11.3075 1.99976 8C1.99976 4.6925 4.69226 2 7.99976 2C11.3073 2 13.9998 4.6925 13.9998 8C13.9998 11.3075 11.3073 14 7.99976 14Z" fill="#FF2F2F"/>
</svg>

After

Width:  |  Height:  |  Size: 493 B

View File

@ -0,0 +1,3 @@
<svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.3333 7.16667V0.5H11.5V3H6.49996V0.5H0.666626V7.16667H6.49996V4.66667H8.16663V13H11.5V15.5H17.3333V8.83333H11.5V11.3333H9.83329V4.66667H11.5V7.16667H17.3333ZM4.83329 5.5H2.33329V2.16667H4.83329V5.5ZM13.1666 10.5H15.6666V13.8333H13.1666V10.5ZM13.1666 2.16667H15.6666V5.5H13.1666V2.16667Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@ -0,0 +1,34 @@
<svg width="52" height="48" viewBox="0 0 52 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d_4487_7074)">
<path d="M4 5.53846C4 4.68879 4.69121 4 5.54386 4H46.4561C47.3088 4 48 4.68879 48 5.53846V42.4615C48 43.3112 47.3088 44 46.4561 44H5.54386C4.69121 44 4 43.3112 4 42.4615V5.53846Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.4561 4.15385H5.54386C4.77647 4.15385 4.15439 4.77376 4.15439 5.53846V42.4615C4.15439 43.2262 4.77647 43.8462 5.54386 43.8462H46.4561C47.2235 43.8462 47.8456 43.2262 47.8456 42.4615V5.53846C47.8456 4.77376 47.2235 4.15385 46.4561 4.15385ZM5.54386 4C4.69121 4 4 4.68879 4 5.53846V42.4615C4 43.3112 4.69121 44 5.54386 44H46.4561C47.3088 44 48 43.3112 48 42.4615V5.53846C48 4.68879 47.3088 4 46.4561 4H5.54386Z" fill="#E4E4E4"/>
<path d="M12.6144 10.6736C12.6148 10.6994 12.6228 10.7245 12.6374 10.7458C12.6519 10.7671 12.6724 10.7838 12.6963 10.7937C12.91 10.8873 13.0907 11.0425 13.2152 11.2393C13.3397 11.4361 13.4024 11.6655 13.3951 11.898C13.3901 12.2075 13.2619 12.5023 13.0387 12.7176C12.8155 12.9329 12.5157 13.051 12.2051 13.046C11.8945 13.041 11.5986 12.9132 11.3826 12.6908C11.1665 12.4684 11.048 12.1696 11.053 11.8601C11.0533 11.634 11.1195 11.4129 11.2436 11.2236C11.3677 11.0343 11.5443 10.8849 11.7519 10.7938C11.7758 10.7838 11.7963 10.7672 11.8108 10.7458C11.8254 10.7244 11.8333 10.6993 11.8337 10.6735C11.8338 10.6522 11.8286 10.6313 11.8186 10.6125C11.8086 10.5938 11.7942 10.5777 11.7765 10.5658C11.7588 10.5539 11.7385 10.5466 11.7173 10.5443C11.6961 10.5421 11.6747 10.5451 11.655 10.553C11.353 10.6835 11.1054 10.9136 10.9538 11.2048C10.8022 11.4959 10.756 11.8302 10.8228 12.1513C10.8897 12.4724 11.0656 12.7608 11.3208 12.9678C11.5761 13.1748 11.8952 13.2879 12.2243 13.2879C12.5534 13.2879 12.8725 13.1748 13.1277 12.9678C13.383 12.7608 13.5589 12.4724 13.6257 12.1513C13.6926 11.8302 13.6463 11.4959 13.4948 11.2048C13.3432 10.9136 13.0956 10.6835 12.7936 10.553C12.7738 10.545 12.7523 10.5419 12.7311 10.5441C12.7098 10.5463 12.6894 10.5537 12.6717 10.5656C12.654 10.5776 12.6395 10.5936 12.6295 10.6125C12.6195 10.6313 12.6144 10.6523 12.6144 10.6736Z" fill="#6488FB"/>
<path d="M12.3542 10.3042C12.3542 10.2326 12.2959 10.1746 12.2241 10.1746C12.1522 10.1746 12.094 10.2326 12.094 10.3042V11.0822C12.094 11.1538 12.1522 11.2119 12.2241 11.2119C12.2959 11.2119 12.3542 11.1538 12.3542 11.0822V10.3042Z" fill="#6488FB"/>
<path d="M12.6144 35.1144C12.6148 35.1402 12.6228 35.1653 12.6374 35.1866C12.6519 35.2079 12.6724 35.2246 12.6963 35.2345C12.91 35.3281 13.0907 35.4833 13.2152 35.6801C13.3397 35.8769 13.4024 36.1063 13.3951 36.3388C13.3901 36.6483 13.2619 36.9431 13.0387 37.1584C12.8155 37.3737 12.5157 37.4918 12.2051 37.4868C11.8945 37.4818 11.5986 37.354 11.3826 37.1316C11.1665 36.9092 11.048 36.6104 11.053 36.3009C11.0533 36.0748 11.1195 35.8537 11.2436 35.6644C11.3677 35.4751 11.5443 35.3258 11.7519 35.2346C11.7758 35.2246 11.7963 35.208 11.8108 35.1866C11.8254 35.1652 11.8333 35.1401 11.8337 35.1143C11.8338 35.093 11.8286 35.0721 11.8186 35.0533C11.8086 35.0346 11.7942 35.0185 11.7765 35.0066C11.7588 34.9947 11.7385 34.9874 11.7173 34.9851C11.6961 34.9829 11.6747 34.9859 11.655 34.9938C11.353 35.1243 11.1054 35.3544 10.9538 35.6456C10.8022 35.9367 10.756 36.271 10.8228 36.5921C10.8897 36.9132 11.0656 37.2016 11.3208 37.4086C11.5761 37.6156 11.8952 37.7287 12.2243 37.7287C12.5534 37.7287 12.8725 37.6156 13.1277 37.4086C13.383 37.2016 13.5589 36.9132 13.6257 36.5921C13.6926 36.271 13.6463 35.9367 13.4948 35.6456C13.3432 35.3544 13.0956 35.1243 12.7936 34.9938C12.7738 34.9858 12.7523 34.9827 12.7311 34.9849C12.7098 34.9871 12.6894 34.9945 12.6717 35.0064C12.654 35.0184 12.6395 35.0345 12.6295 35.0533C12.6195 35.0721 12.6144 35.0931 12.6144 35.1144Z" fill="#6488FB"/>
<path d="M12.3542 34.745C12.3542 34.6734 12.2959 34.6154 12.2241 34.6154C12.1522 34.6154 12.094 34.6734 12.094 34.745V35.523C12.094 35.5946 12.1522 35.6527 12.2241 35.6527C12.2959 35.6527 12.3542 35.5946 12.3542 35.523V34.745Z" fill="#6488FB"/>
<path d="M41.4846 10.6736C41.485 10.6994 41.493 10.7245 41.5075 10.7458C41.5221 10.7671 41.5426 10.7838 41.5665 10.7937C41.7801 10.8873 41.9608 11.0425 42.0854 11.2393C42.2099 11.4361 42.2726 11.6655 42.2653 11.898C42.2603 12.2075 42.1321 12.5023 41.9089 12.7176C41.6857 12.9329 41.3858 13.051 41.0753 13.046C40.7647 13.041 40.4688 12.9132 40.2528 12.6908C40.0367 12.4684 39.9182 12.1696 39.9232 11.8601C39.9235 11.634 39.9897 11.4129 40.1138 11.2236C40.2379 11.0343 40.4144 10.8849 40.6221 10.7938C40.646 10.7838 40.6665 10.7672 40.681 10.7458C40.6955 10.7244 40.7035 10.6993 40.7039 10.6735C40.7039 10.6522 40.6987 10.6313 40.6888 10.6125C40.6788 10.5938 40.6643 10.5777 40.6467 10.5658C40.629 10.5539 40.6087 10.5466 40.5875 10.5443C40.5663 10.5421 40.5449 10.5451 40.5251 10.553C40.2232 10.6835 39.9756 10.9136 39.824 11.2048C39.6724 11.4959 39.6262 11.8302 39.693 12.1513C39.7599 12.4724 39.9357 12.7608 40.191 12.9678C40.4463 13.1748 40.7653 13.2879 41.0945 13.2879C41.4236 13.2879 41.7426 13.1748 41.9979 12.9678C42.2532 12.7608 42.4291 12.4724 42.4959 12.1513C42.5628 11.8302 42.5165 11.4959 42.3649 11.2048C42.2134 10.9136 41.9657 10.6835 41.6638 10.553C41.644 10.545 41.6225 10.5419 41.6013 10.5441C41.58 10.5463 41.5596 10.5537 41.5419 10.5656C41.5242 10.5776 41.5097 10.5936 41.4997 10.6125C41.4897 10.6313 41.4845 10.6523 41.4846 10.6736Z" fill="#6488FB"/>
<path d="M41.2244 10.3042C41.2244 10.2326 41.1661 10.1746 41.0943 10.1746C41.0224 10.1746 40.9641 10.2326 40.9641 10.3042V11.0822C40.9641 11.1538 41.0224 11.2119 41.0943 11.2119C41.1661 11.2119 41.2244 11.1538 41.2244 11.0822V10.3042Z" fill="#6488FB"/>
<path d="M26.3548 10.6736C26.3552 10.6994 26.3632 10.7245 26.3777 10.7458C26.3922 10.7671 26.4127 10.7838 26.4366 10.7937C26.6503 10.8873 26.831 11.0425 26.9555 11.2393C27.0801 11.4361 27.1427 11.6655 27.1355 11.898C27.1305 12.2075 27.0022 12.5023 26.7791 12.7176C26.5559 12.9329 26.256 13.051 25.9454 13.046C25.6349 13.041 25.339 12.9132 25.1229 12.6908C24.9069 12.4684 24.7884 12.1696 24.7934 11.8601C24.7937 11.634 24.8599 11.4129 24.984 11.2236C25.108 11.0343 25.2846 10.8849 25.4922 10.7938C25.5162 10.7838 25.5366 10.7672 25.5512 10.7458C25.5657 10.7244 25.5737 10.6993 25.5741 10.6735C25.5741 10.6522 25.5689 10.6313 25.5589 10.6125C25.549 10.5938 25.5345 10.5777 25.5169 10.5658C25.4992 10.5539 25.4789 10.5466 25.4577 10.5443C25.4365 10.5421 25.4151 10.5451 25.3953 10.553C25.0933 10.6835 24.8457 10.9136 24.6942 11.2048C24.5426 11.4959 24.4963 11.8302 24.5632 12.1513C24.63 12.4724 24.8059 12.7608 25.0612 12.9678C25.3164 13.1748 25.6355 13.2879 25.9646 13.2879C26.2938 13.2879 26.6128 13.1748 26.8681 12.9678C27.1234 12.7608 27.2992 12.4724 27.3661 12.1513C27.4329 11.8302 27.3867 11.4959 27.2351 11.2048C27.0835 10.9136 26.8359 10.6835 26.534 10.553C26.5142 10.545 26.4927 10.5419 26.4714 10.5441C26.4502 10.5463 26.4298 10.5537 26.4121 10.5656C26.3944 10.5776 26.3799 10.5936 26.3699 10.6125C26.3599 10.6313 26.3547 10.6523 26.3548 10.6736Z" fill="#6488FB"/>
<path d="M26.0945 10.3042C26.0945 10.2326 26.0363 10.1746 25.9644 10.1746C25.8926 10.1746 25.8343 10.2326 25.8343 10.3042V11.0822C25.8343 11.1538 25.8926 11.2119 25.9644 11.2119C26.0363 11.2119 26.0945 11.1538 26.0945 11.0822V10.3042Z" fill="#6488FB"/>
<path d="M41.4846 35.1144C41.485 35.1402 41.493 35.1653 41.5075 35.1866C41.5221 35.2079 41.5426 35.2246 41.5665 35.2345C41.7801 35.3281 41.9608 35.4833 42.0854 35.6801C42.2099 35.8769 42.2726 36.1063 42.2653 36.3388C42.2603 36.6483 42.1321 36.9431 41.9089 37.1584C41.6857 37.3737 41.3858 37.4918 41.0753 37.4868C40.7647 37.4818 40.4688 37.354 40.2528 37.1316C40.0367 36.9092 39.9182 36.6104 39.9232 36.3009C39.9235 36.0748 39.9897 35.8537 40.1138 35.6644C40.2379 35.4751 40.4144 35.3258 40.6221 35.2346C40.646 35.2246 40.6665 35.208 40.681 35.1866C40.6955 35.1652 40.7035 35.1401 40.7039 35.1143C40.7039 35.093 40.6987 35.0721 40.6888 35.0533C40.6788 35.0346 40.6643 35.0185 40.6467 35.0066C40.629 34.9947 40.6087 34.9874 40.5875 34.9851C40.5663 34.9829 40.5449 34.9859 40.5251 34.9938C40.2232 35.1243 39.9756 35.3544 39.824 35.6456C39.6724 35.9367 39.6262 36.271 39.693 36.5921C39.7599 36.9132 39.9357 37.2016 40.191 37.4086C40.4463 37.6156 40.7653 37.7287 41.0945 37.7287C41.4236 37.7287 41.7426 37.6156 41.9979 37.4086C42.2532 37.2016 42.4291 36.9132 42.4959 36.5921C42.5628 36.271 42.5165 35.9367 42.3649 35.6456C42.2134 35.3544 41.9657 35.1243 41.6638 34.9938C41.644 34.9858 41.6225 34.9827 41.6013 34.9849C41.58 34.9871 41.5596 34.9945 41.5419 35.0064C41.5242 35.0184 41.5097 35.0345 41.4997 35.0533C41.4897 35.0721 41.4845 35.0931 41.4846 35.1144Z" fill="#6488FB"/>
<path d="M41.2244 34.745C41.2244 34.6734 41.1661 34.6154 41.0943 34.6154C41.0224 34.6154 40.9641 34.6734 40.9641 34.745V35.523C40.9641 35.5946 41.0224 35.6527 41.0943 35.6527C41.1661 35.6527 41.2244 35.5946 41.2244 35.523V34.745Z" fill="#6488FB"/>
<path d="M26.3548 35.1144C26.3552 35.1402 26.3632 35.1653 26.3777 35.1866C26.3922 35.2079 26.4127 35.2246 26.4366 35.2345C26.6503 35.3281 26.831 35.4833 26.9555 35.6801C27.0801 35.8769 27.1427 36.1063 27.1355 36.3388C27.1305 36.6483 27.0022 36.9431 26.7791 37.1584C26.5559 37.3737 26.256 37.4918 25.9454 37.4868C25.6349 37.4818 25.339 37.354 25.1229 37.1316C24.9069 36.9092 24.7884 36.6104 24.7934 36.3009C24.7937 36.0748 24.8599 35.8537 24.984 35.6644C25.108 35.4751 25.2846 35.3258 25.4922 35.2346C25.5162 35.2246 25.5366 35.208 25.5512 35.1866C25.5657 35.1652 25.5737 35.1401 25.5741 35.1143C25.5741 35.093 25.5689 35.0721 25.5589 35.0533C25.549 35.0346 25.5345 35.0185 25.5169 35.0066C25.4992 34.9947 25.4789 34.9874 25.4577 34.9851C25.4365 34.9829 25.4151 34.9859 25.3953 34.9938C25.0933 35.1243 24.8457 35.3544 24.6942 35.6456C24.5426 35.9367 24.4963 36.271 24.5632 36.5921C24.63 36.9132 24.8059 37.2016 25.0612 37.4086C25.3164 37.6156 25.6355 37.7287 25.9646 37.7287C26.2938 37.7287 26.6128 37.6156 26.8681 37.4086C27.1234 37.2016 27.2992 36.9132 27.3661 36.5921C27.4329 36.271 27.3867 35.9367 27.2351 35.6456C27.0835 35.3544 26.8359 35.1243 26.534 34.9938C26.5142 34.9858 26.4927 34.9827 26.4714 34.9849C26.4502 34.9871 26.4298 34.9945 26.4121 35.0064C26.3944 35.0184 26.3799 35.0345 26.3699 35.0533C26.3599 35.0721 26.3547 35.0931 26.3548 35.1144Z" fill="#6488FB"/>
<path d="M26.0945 34.745C26.0945 34.6734 26.0363 34.6154 25.9644 34.6154C25.8926 34.6154 25.8343 34.6734 25.8343 34.745V35.523C25.8343 35.5946 25.8926 35.6527 25.9644 35.6527C26.0363 35.6527 26.0945 35.5946 26.0945 35.523V34.745Z" fill="#6488FB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.92631 41.8462L4.92632 5.38462H5.0807L5.0807 41.8462H4.92631Z" fill="#D3D1D1"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.9193 41.8462V5.38462H47.0737V41.8462H46.9193Z" fill="#D3D1D1"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.6667 43.8462V4.15385H18.8211V43.8462H18.6667Z" fill="#E4E4E4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.3333 43.8462V4.15385H33.4877V43.8462H33.3333Z" fill="#E4E4E4"/>
</g>
<defs>
<filter id="filter0_d_4487_7074" x="0" y="0" width="52" height="48" 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/>
<feGaussianBlur stdDeviation="2"/>
<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.06 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4487_7074"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_7074" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,6 @@
<svg width="124" height="124" viewBox="0 0 124 124" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M62 122C95.1371 122 122 95.1371 122 62C122 28.8629 95.1371 2 62 2C28.8629 2 2 28.8629 2 62C2 95.1371 28.8629 122 62 122Z" fill="#F6F6F6" stroke="white" stroke-width="3"/>
<circle cx="62" cy="62" r="51" fill="white"/>
<circle cx="62.5" cy="62.5" r="43.5" fill="#FF1D1D"/>
<path d="M50.6152 69.3027L50.5859 69.3223C48.6589 69.3223 47.0736 68.847 45.8301 67.8965L46.6309 66.4805C47.1191 66.8255 47.7148 67.1055 48.418 67.3203C49.1341 67.5352 49.8275 67.6426 50.498 67.6426C52.0866 67.6426 52.8809 67.1413 52.8809 66.1387C52.8809 65.6243 52.6367 65.224 52.1484 64.9375C51.6667 64.6576 51.0807 64.4492 50.3906 64.3125C49.6615 64.1693 48.9779 64.0098 48.3398 63.834C47.6562 63.6452 47.0703 63.3034 46.582 62.8086C46.0938 62.3138 45.8496 61.6497 45.8496 60.8164C45.8496 59.7096 46.2728 58.8796 47.1191 58.3262C47.972 57.7663 48.9779 57.4863 50.1367 57.4863C51.7383 57.4863 53.0729 57.8672 54.1406 58.6289L53.418 60.0938C52.4284 59.4818 51.3249 59.1693 50.1074 59.1562C49.5475 59.1562 49.0332 59.2734 48.5645 59.5078C48.0957 59.7422 47.8613 60.1328 47.8613 60.6797C47.8613 61.0898 48.0339 61.4219 48.3789 61.6758C48.7174 61.9297 49.1471 62.1055 49.668 62.2031C50.1953 62.3008 50.7585 62.4277 51.3574 62.584C51.9954 62.7467 52.5586 62.9258 53.0469 63.1211C53.5742 63.3294 54.0104 63.6745 54.3555 64.1562C54.707 64.6445 54.8828 65.2533 54.8828 65.9824C54.8828 67.0436 54.4922 67.8639 53.7109 68.4434C52.9362 69.0163 51.9043 69.3027 50.6152 69.3027ZM62.6758 69.2246V69.2344C60.9505 69.2344 59.5345 68.6615 58.4277 67.5156C57.3275 66.3763 56.7773 64.9701 56.7773 63.2969C56.7773 61.6432 57.3275 60.2565 58.4277 59.1367C59.5345 58.0104 60.9505 57.4473 62.6758 57.4473C64.3945 57.4473 65.8105 58.0104 66.9238 59.1367C68.0371 60.2565 68.5938 61.6432 68.5938 63.2969C68.5938 64.9635 68.0371 66.3698 66.9238 67.5156C65.8105 68.6549 64.3945 69.2246 62.6758 69.2246ZM62.6758 59.293V59.3027C61.5169 59.3027 60.5859 59.6836 59.8828 60.4453C59.1797 61.207 58.8281 62.1673 58.8281 63.3262C58.8281 64.5046 59.1797 65.4779 59.8828 66.2461C60.5859 67.0208 61.5169 67.4082 62.6758 67.4082C63.8346 67.4082 64.7656 67.0208 65.4688 66.2461C66.1719 65.4779 66.5234 64.5013 66.5234 63.3164C66.5234 62.1576 66.1719 61.1973 65.4688 60.4355C64.7656 59.6738 63.8346 59.293 62.6758 59.293ZM75.1074 69.3027L75.0781 69.3223C73.151 69.3223 71.5658 68.847 70.3223 67.8965L71.123 66.4805C71.6113 66.8255 72.207 67.1055 72.9102 67.3203C73.6263 67.5352 74.3197 67.6426 74.9902 67.6426C76.5788 67.6426 77.373 67.1413 77.373 66.1387C77.373 65.6243 77.1289 65.224 76.6406 64.9375C76.1589 64.6576 75.5729 64.4492 74.8828 64.3125C74.1536 64.1693 73.4701 64.0098 72.832 63.834C72.1484 63.6452 71.5625 63.3034 71.0742 62.8086C70.5859 62.3138 70.3418 61.6497 70.3418 60.8164C70.3418 59.7096 70.765 58.8796 71.6113 58.3262C72.4642 57.7663 73.4701 57.4863 74.6289 57.4863C76.2305 57.4863 77.5651 57.8672 78.6328 58.6289L77.9102 60.0938C76.9206 59.4818 75.8171 59.1693 74.5996 59.1562C74.0397 59.1562 73.5254 59.2734 73.0566 59.5078C72.5879 59.7422 72.3535 60.1328 72.3535 60.6797C72.3535 61.0898 72.526 61.4219 72.8711 61.6758C73.2096 61.9297 73.6393 62.1055 74.1602 62.2031C74.6875 62.3008 75.2507 62.4277 75.8496 62.584C76.4876 62.7467 77.0508 62.9258 77.5391 63.1211C78.0664 63.3294 78.5026 63.6745 78.8477 64.1562C79.1992 64.6445 79.375 65.2533 79.375 65.9824C79.375 67.0436 78.9844 67.8639 78.2031 68.4434C77.4284 69.0163 76.3965 69.3027 75.1074 69.3027Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,4 @@
<svg width="19" height="21" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.7981 3.37822C11.8007 3.54583 11.8523 3.709 11.9465 3.84766C12.0407 3.98632 12.1734 4.09442 12.3282 4.15866C13.7123 4.76765 14.8827 5.77642 15.6893 7.05545C16.4959 8.33448 16.9018 9.8254 16.8549 11.3368C16.8223 13.3485 15.9918 15.2649 14.5462 16.6643C13.1006 18.0637 11.1584 18.8316 9.14663 18.799C7.13491 18.7663 5.21855 17.9359 3.81912 16.4903C2.41969 15.0447 1.65184 13.1024 1.68447 11.0907C1.68642 9.62104 2.11527 8.1836 2.91888 6.95311C3.7225 5.72263 4.86627 4.7521 6.21116 4.1595C6.36606 4.09488 6.49873 3.98645 6.59289 3.84752C6.68706 3.70859 6.73863 3.5452 6.74128 3.37738C6.7415 3.23934 6.7078 3.10335 6.64316 2.98138C6.57852 2.85941 6.4849 2.75519 6.37055 2.67787C6.25619 2.60055 6.12459 2.5525 5.98732 2.53795C5.85004 2.5234 5.7113 2.54279 5.58327 2.59442C3.62737 3.44239 2.02347 4.93853 1.04172 6.83083C0.0599786 8.72313 -0.239618 10.896 0.193397 12.9833C0.626412 15.0707 1.76558 16.9451 3.41902 18.2907C5.07246 19.6364 7.13914 20.3711 9.27095 20.3711C11.4028 20.3711 13.4694 19.6364 15.1229 18.2907C16.7763 16.9451 17.9155 15.0707 18.3485 12.9833C18.7815 10.896 18.4819 8.72313 17.5002 6.83083C16.5184 4.93853 14.9145 3.44239 12.9586 2.59442C12.8304 2.54223 12.6913 2.52242 12.5536 2.53676C12.4159 2.55109 12.2839 2.59912 12.1692 2.6766C12.0545 2.75408 11.9606 2.85862 11.8959 2.98099C11.8311 3.10336 11.7976 3.23979 11.7981 3.37822Z" fill="#C0B4B4"/>
<path d="M10.1124 0.977567C10.1124 0.512101 9.73503 0.134766 9.26956 0.134766C8.80409 0.134766 8.42676 0.512101 8.42676 0.977567V6.03437C8.42676 6.49984 8.80409 6.87717 9.26956 6.87717C9.73503 6.87717 10.1124 6.49984 10.1124 6.03437V0.977567Z" fill="#C0B4B4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,4 @@
<svg width="19" height="21" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.7981 3.37822C11.8007 3.54583 11.8523 3.709 11.9465 3.84766C12.0407 3.98632 12.1734 4.09442 12.3282 4.15866C13.7123 4.76765 14.8827 5.77642 15.6893 7.05545C16.4959 8.33448 16.9018 9.8254 16.8549 11.3368C16.8223 13.3485 15.9918 15.2649 14.5462 16.6643C13.1006 18.0637 11.1584 18.8316 9.14663 18.799C7.13491 18.7663 5.21855 17.9359 3.81912 16.4903C2.41969 15.0447 1.65184 13.1024 1.68447 11.0907C1.68642 9.62104 2.11527 8.1836 2.91888 6.95311C3.7225 5.72263 4.86627 4.7521 6.21116 4.1595C6.36606 4.09488 6.49873 3.98645 6.59289 3.84752C6.68706 3.70859 6.73863 3.5452 6.74128 3.37738C6.7415 3.23934 6.7078 3.10335 6.64316 2.98138C6.57852 2.85941 6.4849 2.75519 6.37055 2.67787C6.25619 2.60055 6.12459 2.5525 5.98732 2.53795C5.85004 2.5234 5.7113 2.54279 5.58327 2.59442C3.62737 3.44239 2.02347 4.93853 1.04172 6.83083C0.0599786 8.72313 -0.239618 10.896 0.193397 12.9833C0.626412 15.0707 1.76558 16.9451 3.41902 18.2907C5.07246 19.6364 7.13914 20.3711 9.27095 20.3711C11.4028 20.3711 13.4694 19.6364 15.1229 18.2907C16.7763 16.9451 17.9155 15.0707 18.3485 12.9833C18.7815 10.896 18.4819 8.72313 17.5002 6.83083C16.5184 4.93853 14.9145 3.44239 12.9586 2.59442C12.8304 2.54223 12.6913 2.52242 12.5536 2.53676C12.4159 2.55109 12.2839 2.59912 12.1692 2.6766C12.0545 2.75408 11.9606 2.85862 11.8959 2.98099C11.8311 3.10336 11.7976 3.23979 11.7981 3.37822Z" fill="#6488FB"/>
<path d="M10.1124 0.977567C10.1124 0.512101 9.73503 0.134766 9.26956 0.134766C8.80409 0.134766 8.42676 0.512101 8.42676 0.977567V6.03437C8.42676 6.49984 8.80409 6.87717 9.26956 6.87717C9.73503 6.87717 10.1124 6.49984 10.1124 6.03437V0.977567Z" fill="#6488FB"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,3 @@
<svg width="11" height="14" viewBox="0 0 11 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 3.64L7.27 7L2 10.36V3.64ZM0 0V14L11 7L0 0Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 174 B

View File

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4487_1385)">
<path d="M15 3H6C5.17 3 4.46 3.5 4.16 4.22L1.14 11.27C1.05 11.5 1 11.74 1 12V14C1 15.1 1.9 16 3 16H9.31L8.36 20.57L8.33 20.89C8.33 21.3 8.5 21.68 8.77 21.95L9.83 23L16.42 16.41C16.78 16.05 17 15.55 17 15V5C17 3.9 16.1 3 15 3ZM15 15L10.66 19.34L12 14H3V12L6 5H15V15ZM19 3H23V15H19V3Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_4487_1385">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 548 B

10
assets/icons/thumb_up.svg Normal file
View File

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4487_1378)">
<path d="M9 21H18C18.83 21 19.54 20.5 19.84 19.78L22.86 12.73C22.95 12.5 23 12.26 23 12V10C23 8.9 22.1 8 21 8H14.69L15.64 3.43L15.67 3.11C15.67 2.7 15.5 2.32 15.23 2.05L14.17 1L7.58 7.59C7.22 7.95 7 8.45 7 9V19C7 20.1 7.9 21 9 21ZM9 9L13.34 4.66L12 10H21V12L18 19H9V9ZM1 9H5V21H1V9Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_4487_1378">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 548 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="22" viewBox="0 0 16 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.99996 3.66699V0.916992L4.33329 4.58366L7.99996 8.25033V5.50033C11.0341 5.50033 13.5 7.96616 13.5 11.0003C13.5 11.9262 13.2708 12.8062 12.8583 13.567L14.1966 14.9053C14.9116 13.7778 15.3333 12.4395 15.3333 11.0003C15.3333 6.94866 12.0516 3.66699 7.99996 3.66699ZM7.99996 16.5003C4.96579 16.5003 2.49996 14.0345 2.49996 11.0003C2.49996 10.0745 2.72913 9.19449 3.14163 8.43366L1.80329 7.09532C1.08829 8.22283 0.666626 9.56116 0.666626 11.0003C0.666626 15.052 3.94829 18.3337 7.99996 18.3337V21.0837L11.6666 17.417L7.99996 13.7503V16.5003Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 667 B

View File

@ -0,0 +1,314 @@
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/device_report_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/sex_scene_question_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/model/status_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
import 'package:syncrow_app/services/api/scene_api.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
class SixSceneBloc extends Bloc<SixSceneEvent, SixSceneState> {
final String sixSceneId;
SixSceneBloc({
required this.sixSceneId,
}) : super(const SixSceneState()) {
on<SixSceneInitial>(_fetchStatus);
on<ReportLogsInitial>(fetchLogsForLastMonth);
on<ToggleNotificationEvent>(_toggleNotification);
on<ChangeNameEvent>(_changeName);
on<SearchFaqEvent>(_onSearchFaq);
on<FetchRoomsEvent>(_fetchRoomsAndDevices);
on<ChangeSwitchStatusEvent>(changeSwitchStatus);
on<LoadScenes>(_onLoadScenes);
on<SelectSceneEvent>(_selectScene);
on<SearchScenesEvent>(searchScene);
on<SaveSelectionEvent>(_onSaveSelection);
on<SelectOptionEvent>(_onOptionSelected);
on<AddDeviceToGroup>(_addDeviceToGroup); // Register handler here
on<RemoveDeviceFromGroup>(_removeDeviceFromGroup);
}
final TextEditingController nameController =
TextEditingController(text: '${'firstName'}');
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool closingReminder = false;
bool waterAlarm = false;
SixSceneModel deviceStatus =
SixSceneModel(waterContactState: 'normal', batteryPercentage: 0);
void _fetchStatus(SixSceneInitial event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(sixSceneId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = SixSceneModel.fromJson(
statusModelList,
);
emit(UpdateState(sensor: deviceStatus));
Future.delayed(const Duration(milliseconds: 500));
// _listenToChanges();
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
void _onSearchFaq(SearchFaqEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
// Filter FAQ questions based on search query
List<SixSceneQuestionModel> _faqQuestions = faqQuestions.where((question) {
return question.question
.toLowerCase()
.contains(event.query.toLowerCase());
}).toList();
print(_faqQuestions);
emit(FaqSearchState(filteredFaqQuestions: _faqQuestions));
}
void _changeName(ChangeNameEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
void _toggleNotification(
ToggleNotificationEvent event, Emitter<SixSceneState> emit) async {
emit(LoadingNewSate(sosSensor: deviceStatus));
try {
closingReminder = event.isClosingEnabled;
emit(UpdateState(sensor: deviceStatus));
// API call to update the state, if necessary
// await DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: sosId,
// code: 'closing_reminder',
// value: closingReminder,
// ),
// sosId,
// );
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
Future<void> fetchLogsForLastMonth(
ReportLogsInitial event, Emitter<SixSceneState> 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(SixSceneLoadingState());
var response = await DevicesAPI.getReportLogs(
startTime: startTime.toString(),
endTime: endTime.toString(),
deviceUuid: sixSceneId,
code: 'sossensor_state',
);
recordGroups = response;
emit(UpdateState(sensor: deviceStatus));
} on DioException catch (e) {
final errorData = e.response!.data;
String errorMessage = errorData['message'];
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
final List<SixSceneQuestionModel> faqQuestions = [
SixSceneQuestionModel(
id: 1,
question: 'How does an SOS emergency button work?',
answer:
'The SOS emergency button sends an alert to your contacts when pressed.',
),
SixSceneQuestionModel(
id: 2,
question: 'How long will an SOS alarm persist?',
answer:
'The SOS alarm will persist until it is manually turned off or after a set time.',
),
SixSceneQuestionModel(
id: 3,
question: 'What should I do if the SOS button is unresponsive?',
answer: 'Try restarting the device. If it persists, contact support.',
),
SixSceneQuestionModel(
id: 4,
question: 'Can I use the SOS feature without a network connection?',
answer:
'No, a network connection is required to send the alert to your contacts.',
),
SixSceneQuestionModel(
id: 5,
question: 'How often should I check the SOS battery?',
answer:
'Check the SOS battery at least once a month to ensure it is operational.',
),
];
Future<void> _onSixSceneInitial(
SixSceneInitialQuestion event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
emit(FaqLoadedState(filteredFaqQuestions: faqQuestions));
}
List<DeviceModel> allDevices = [];
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
final roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(const SixSceneFailedState(errorMessage: 'Something went wrong'));
return;
}
}
bool switchStatus = true;
void changeSwitchStatus(
ChangeSwitchStatusEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
switchStatus = !switchStatus;
emit(ChangeSwitchState(isEnable: switchStatus));
}
// List<ScenesModel> allScenes = [];
Future<void> _onLoadScenes(
LoadScenes event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
try {
if (event.unitId.isNotEmpty) {
allScenes = await SceneApi.getScenesByUnitId(
event.unitId, event.unit.community.uuid,
showInDevice: event.showInDevice);
emit(SceneLoaded(
allScenes,
));
filteredScenes = allScenes;
} else {
emit(const SixSceneFailedState(errorMessage: 'Unit ID is empty'));
}
} catch (e) {
emit(const SixSceneFailedState(errorMessage: 'Something went wrong'));
}
}
bool selecedScene = false;
String selectedSceneId = '';
_selectScene(SelectSceneEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
selecedScene = !selecedScene;
emit(SelectedSceneState());
}
List<ScenesModel> allScenes = [];
List<ScenesModel> filteredScenes = [];
void searchScene(SearchScenesEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
filteredScenes = event.query.isEmpty
? allScenes
: allScenes.where((scene) {
final sceneName = scene.name?.toLowerCase() ?? '';
return sceneName.contains(event.query.toLowerCase());
}).toList();
emit(SearchResultsState());
}
String _selectedOption = '';
bool _hasSelectionChanged = false;
void _onOptionSelected(SelectOptionEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
_selectedOption = event.selectedOption;
_hasSelectionChanged = true;
emit(OptionSelectedState(
selectedOption: _selectedOption,
hasSelectionChanged: _hasSelectionChanged));
}
void _onSaveSelection(SaveSelectionEvent event, Emitter<SixSceneState> emit) {
if (_hasSelectionChanged) {
print('Save button clicked with selected option: $_selectedOption');
_hasSelectionChanged = false;
emit(SaveSelectionSuccessState());
}
}
//addDevicesIcon
List<GroupDevicesModel> groupDevices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.minusIcon, name: '6 Scene Switch')
];
List<GroupDevicesModel> devices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.addDevicesIcon, name: '6 Scene Switch')
];
// @override
// Stream<SixSceneState> mapEventToState(SixSceneEvent event) async* {
// if (event is AddDeviceToGroup) {
// devices.remove(event.device);
// groupDevices.add(event.device);
// yield UpdateStateList(groupDevices: groupDevices, devices: devices);
// } else if (event is RemoveDeviceFromGroup) {
// groupDevices.remove(event.device);
// devices.add(event.device);
// yield UpdateStateList(groupDevices: groupDevices, devices: devices);
// }
// }
// Handler for AddDeviceToGroup
void _addDeviceToGroup(AddDeviceToGroup event, Emitter<SixSceneState> emit) {
devices.remove(event.device);
groupDevices.add(event.device);
for (var device in groupDevices) {
device.icon = event.icon;
}
emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
}
// Handler for RemoveDeviceFromGroup
void _removeDeviceFromGroup(
RemoveDeviceFromGroup event, Emitter<SixSceneState> emit) {
groupDevices.remove(event.device);
devices.add(event.device);
for (var device in groupDevices) {
device.icon = event.icon;
}
emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
}
}

View File

@ -0,0 +1,173 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
abstract class SixSceneEvent extends Equatable {
const SixSceneEvent();
@override
List<Object> get props => [];
}
class SixSceneLoading extends SixSceneEvent {}
class SixSceneSwitch extends SixSceneEvent {
final String switchD;
final String deviceId;
final String productId;
const SixSceneSwitch(
{required this.switchD, this.deviceId = '', this.productId = ''});
@override
List<Object> get props => [switchD, deviceId, productId];
}
class SixSceneUpdated extends SixSceneEvent {}
class SixSceneInitial extends SixSceneEvent {
const SixSceneInitial();
}
class ReportLogsInitial extends SixSceneEvent {
const ReportLogsInitial();
}
class SixSceneChangeStatus extends SixSceneEvent {}
class GetCounterEvent extends SixSceneEvent {
final String deviceCode;
const GetCounterEvent({required this.deviceCode});
@override
List<Object> get props => [deviceCode];
}
class ToggleEnableAlarmEvent extends SixSceneEvent {
final bool isLowBatteryEnabled;
const ToggleEnableAlarmEvent(this.isLowBatteryEnabled);
@override
List<Object> get props => [isLowBatteryEnabled];
}
class ToggleNotificationEvent extends SixSceneEvent {
final bool isClosingEnabled;
const ToggleNotificationEvent(this.isClosingEnabled);
@override
List<Object> get props => [isClosingEnabled];
}
class ToggleSixSceneAlarmEvent extends SixSceneEvent {
final bool isSixSceneAlarmEnabled;
const ToggleSixSceneAlarmEvent(this.isSixSceneAlarmEnabled);
@override
List<Object> get props => [isSixSceneAlarmEnabled];
}
class SetCounterValue extends SixSceneEvent {
final Duration duration;
final String deviceCode;
const SetCounterValue({required this.duration, required this.deviceCode});
@override
List<Object> get props => [duration, deviceCode];
}
class StartTimer extends SixSceneEvent {
final int duration;
const StartTimer(this.duration);
@override
List<Object> get props => [duration];
}
class TickTimer extends SixSceneEvent {
final int remainingTime;
const TickTimer(this.remainingTime);
@override
List<Object> get props => [remainingTime];
}
class StopTimer extends SixSceneEvent {}
class OnClose extends SixSceneEvent {}
class ChangeNameEvent extends SixSceneEvent {
final bool? value;
const ChangeNameEvent({this.value});
}
class SearchFaqEvent extends SixSceneEvent {
final String query;
const SearchFaqEvent(this.query);
}
class SixSceneInitialQuestion extends SixSceneEvent {
const SixSceneInitialQuestion();
}
class ChangeSwitchStatusEvent extends SixSceneEvent {}
class FetchRoomsEvent extends SixSceneEvent {
final SpaceModel unit;
const FetchRoomsEvent({required this.unit});
@override
List<Object> get props => [unit];
}
class LoadScenes extends SixSceneEvent {
final String unitId;
final bool showInDevice;
final SpaceModel unit;
const LoadScenes(
{required this.unitId, required this.unit, this.showInDevice = false});
@override
List<Object> get props => [unitId, showInDevice];
}
class SelectSceneEvent extends SixSceneEvent {
final String unitId;
const SelectSceneEvent({
required this.unitId,
});
}
class SearchScenesEvent extends SixSceneEvent {
final String query;
const SearchScenesEvent({
required this.query,
});
}
class SaveSelectionEvent extends SixSceneEvent {}
class SelectOptionEvent extends SixSceneEvent {
dynamic selectedOption;
SelectOptionEvent({
this.selectedOption,
});
}
class AddDeviceToGroup extends SixSceneEvent {
final GroupDevicesModel device;
final String icon;
AddDeviceToGroup(this.device, this.icon);
}
class RemoveDeviceFromGroup extends SixSceneEvent {
final GroupDevicesModel device;
final String icon;
RemoveDeviceFromGroup(this.device, this.icon);
}

View File

@ -0,0 +1,113 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/sex_scene_question_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
class SixSceneState extends Equatable {
const SixSceneState();
@override
List<Object> get props => [];
}
class SixSceneInitialState extends SixSceneState {}
class SixSceneLoadingState extends SixSceneState {}
class SixSceState extends SixSceneState {}
class UpdateStateList extends SixSceneState {
final List<GroupDevicesModel> groupDevices;
final List<GroupDevicesModel> devices;
const UpdateStateList({required this.groupDevices, required this.devices});
}
class SixSceneFailedState extends SixSceneState {
final String errorMessage;
const SixSceneFailedState({required this.errorMessage});
@override
List<Object> get props => [errorMessage];
}
class UpdateState extends SixSceneState {
final SixSceneModel sensor;
const UpdateState({required this.sensor});
@override
List<Object> get props => [sensor];
}
class LoadingNewSate extends SixSceneState {
final SixSceneModel sosSensor;
const LoadingNewSate({required this.sosSensor});
@override
List<Object> get props => [sosSensor];
}
class NameEditingState extends SixSceneState {
final bool editName;
NameEditingState({required this.editName});
}
class FaqLoadedState extends SixSceneState {
final List<SixSceneQuestionModel> filteredFaqQuestions;
FaqLoadedState({this.filteredFaqQuestions = const []});
}
class FaqSearchState extends SixSceneState {
final List<SixSceneQuestionModel> filteredFaqQuestions;
const FaqSearchState({this.filteredFaqQuestions = const []});
}
class FetchRoomsState extends SixSceneState {
final List<SubSpaceModel> roomsList;
final List<DeviceModel> devicesList;
const FetchRoomsState({required this.devicesList, required this.roomsList});
@override
List<Object> get props => [devicesList];
}
class ChangeSwitchState extends SixSceneState {
final bool isEnable;
const ChangeSwitchState({required this.isEnable});
}
class SceneLoaded extends SixSceneState {
final List<ScenesModel> scenes;
final String? loadingSceneId;
final Map<String, bool> loadingStates;
const SceneLoaded(this.scenes,
{this.loadingSceneId, this.loadingStates = const {}});
}
class SelectedSceneState extends SixSceneState {}
class SearchResultsState extends SixSceneState {}
class SaveSelectionSuccessState extends SixSceneState {}
class OptionSelectedState extends SixSceneState {
final String selectedOption;
final bool hasSelectionChanged;
OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}

View File

@ -0,0 +1,370 @@
import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/device_report_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_question_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/scene_switch_model.dart';
import 'package:syncrow_app/features/devices/model/status_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
import 'package:syncrow_app/services/api/scene_api.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
final String fourSceneId;
FourSceneBloc({
required this.fourSceneId,
}) : super(const FourSceneState()) {
on<FourSceneInitial>(_fetchStatus);
on<FourSceneInitialInfo>(fetchDeviceData);
on<ReportLogsInitial>(fetchLogsForLastMonth);
on<ToggleNotificationEvent>(_toggleNotification);
on<ChangeNameEvent>(_changeName);
on<SearchFaqEvent>(_onSearchFaq);
on<FetchRoomsEvent>(_fetchRoomsAndDevices);
on<ChangeSwitchStatusEvent>(changeSwitchStatus);
on<LoadScenes>(_onLoadScenes);
on<SelectSceneEvent>(_selectScene);
on<SearchScenesEvent>(searchScene);
on<SaveSelectionEvent>(_onSaveSelection);
on<SelectOptionEvent>(_onOptionSelected);
on<AddDeviceToGroup>(_addDeviceToGroup); // Register handler here
on<RemoveDeviceFromGroup>(_removeDeviceFromGroup);
}
final TextEditingController nameController =
TextEditingController(text: '${'firstName'}');
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool closingReminder = false;
bool waterAlarm = false;
FourSceneModel deviceStatus = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: false);
SceneSwitch sceneInfo = SceneSwitch(
activeTime: 1728118263,
category: "",
categoryName: "",
createTime: 1728118263,
gatewayId: "",
icon: "",
ip: "",
lat: "",
localKey: "",
lon: "",
model: "",
name: "",
nodeId: "",
online: true,
ownerId: "",
productName: "",
sub: true,
timeZone: "",
updateTime: 0,
uuid: "",
productUuid: "",
productType: "",
permissionType: "",
macAddress: "",
subspace: Subspace(
uuid: "",
createdAt: "",
updatedAt: "",
subspaceName: "",
),
);
void _fetchStatus(
FourSceneInitial event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(fourSceneId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = FourSceneModel.fromJson(
statusModelList,
);
emit(UpdateState(sensor: deviceStatus));
Future.delayed(const Duration(milliseconds: 500));
// _listenToChanges();
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
Future fetchDeviceData(
FourSceneInitialInfo event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
var response = await DevicesAPI.getDeviceInfo(fourSceneId);
if (response.statusCode == 200) {
Map<String, dynamic> jsonData = jsonDecode(response.body);
sceneInfo = SceneSwitch.fromJson(jsonData);
emit(LoadingDeviceInfo(sosSensor: sceneInfo));
} else {
throw Exception('Failed to load device data: ${response.reasonPhrase}');
}
}
void _onSearchFaq(SearchFaqEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
List<FourSceneQuestionModel> _faqQuestions = faqQuestions.where((question) {
return question.question
.toLowerCase()
.contains(event.query.toLowerCase());
}).toList();
print(_faqQuestions);
emit(FaqSearchState(filteredFaqQuestions: _faqQuestions));
}
void _changeName(ChangeNameEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
void _toggleNotification(
ToggleNotificationEvent event, Emitter<FourSceneState> emit) async {
emit(LoadingNewSate(sosSensor: deviceStatus));
try {
closingReminder = event.isClosingEnabled;
emit(UpdateState(sensor: deviceStatus));
// API call to update the state, if necessary
// await DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: sosId,
// code: 'closing_reminder',
// value: closingReminder,
// ),
// sosId,
// );
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
Future<void> fetchLogsForLastMonth(
ReportLogsInitial event, Emitter<FourSceneState> 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(FourSceneLoadingState());
var response = await DevicesAPI.getReportLogs(
startTime: startTime.toString(),
endTime: endTime.toString(),
deviceUuid: fourSceneId,
code: 'sossensor_state',
);
recordGroups = response;
emit(UpdateState(sensor: deviceStatus));
} on DioException catch (e) {
final errorData = e.response!.data;
String errorMessage = errorData['message'];
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
final List<FourSceneQuestionModel> faqQuestions = [
FourSceneQuestionModel(
id: 1,
question: 'How does an SOS emergency button work?',
answer:
'The SOS emergency button sends an alert to your contacts when pressed.',
),
FourSceneQuestionModel(
id: 2,
question: 'How long will an SOS alarm persist?',
answer:
'The SOS alarm will persist until it is manually turned off or after a set time.',
),
FourSceneQuestionModel(
id: 3,
question: 'What should I do if the SOS button is unresponsive?',
answer: 'Try restarting the device. If it persists, contact support.',
),
FourSceneQuestionModel(
id: 4,
question: 'Can I use the SOS feature without a network connection?',
answer:
'No, a network connection is required to send the alert to your contacts.',
),
FourSceneQuestionModel(
id: 5,
question: 'How often should I check the SOS battery?',
answer:
'Check the SOS battery at least once a month to ensure it is operational.',
),
];
Future<void> _onFourSceneInitial(
FourSceneInitialQuestion event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
emit(FaqLoadedState(filteredFaqQuestions: faqQuestions));
}
List<DeviceModel> allDevices = [];
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
final roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
return;
}
}
bool switchStatus = true;
void changeSwitchStatus(
ChangeSwitchStatusEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
switchStatus = !switchStatus;
emit(ChangeSwitchState(isEnable: switchStatus));
}
// List<ScenesModel> allScenes = [];
Future<void> _onLoadScenes(
LoadScenes event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
try {
if (event.unitId.isNotEmpty) {
allScenes = await SceneApi.getScenesByUnitId(
event.unitId, event.unit.community.uuid,
showInDevice: event.showInDevice);
emit(SceneLoaded(
allScenes,
));
filteredScenes = allScenes;
} else {
emit(const FourSceneFailedState(errorMessage: 'Unit ID is empty'));
}
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
}
}
bool selecedScene = false;
String selectedSceneId = '';
_selectScene(SelectSceneEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
selecedScene = !selecedScene;
emit(SelectedSceneState());
}
List<ScenesModel> allScenes = [];
List<ScenesModel> filteredScenes = [];
void searchScene(SearchScenesEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
filteredScenes = event.query.isEmpty
? allScenes
: allScenes.where((scene) {
final sceneName = scene.name?.toLowerCase() ?? '';
return sceneName.contains(event.query.toLowerCase());
}).toList();
emit(SearchResultsState());
}
String _selectedOption = '';
bool _hasSelectionChanged = false;
void _onOptionSelected(
SelectOptionEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
_selectedOption = event.selectedOption;
_hasSelectionChanged = true;
emit(OptionSelectedState(
selectedOption: _selectedOption,
hasSelectionChanged: _hasSelectionChanged));
}
void _onSaveSelection(
SaveSelectionEvent event, Emitter<FourSceneState> emit) {
if (_hasSelectionChanged) {
print('Save button clicked with selected option: $_selectedOption');
_hasSelectionChanged = false;
emit(SaveSelectionSuccessState());
}
}
//addDevicesIcon
List<GroupDevicesModel> groupDevices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.minusIcon, name: '6 Scene Switch')
];
List<GroupDevicesModel> devices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.addDevicesIcon, name: '6 Scene Switch')
];
// @override
// Stream<FourSceneState> mapEventToState(FourSceneEvent event) async* {
// if (event is AddDeviceToGroup) {
// devices.remove(event.device);
// groupDevices.add(event.device);
// yield UpdateStateList(groupDevices: groupDevices, devices: devices);
// } else if (event is RemoveDeviceFromGroup) {
// groupDevices.remove(event.device);
// devices.add(event.device);
// yield UpdateStateList(groupDevices: groupDevices, devices: devices);
// }
// }
// Handler for AddDeviceToGroup
void _addDeviceToGroup(AddDeviceToGroup event, Emitter<FourSceneState> emit) {
devices.remove(event.device);
groupDevices.add(event.device);
for (var device in groupDevices) {
device.icon = event.icon;
}
emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
}
// Handler for RemoveDeviceFromGroup
void _removeDeviceFromGroup(
RemoveDeviceFromGroup event, Emitter<FourSceneState> emit) {
groupDevices.remove(event.device);
devices.add(event.device);
for (var device in groupDevices) {
device.icon = event.icon;
}
emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
}
}

View File

@ -0,0 +1,174 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
abstract class FourSceneEvent extends Equatable {
const FourSceneEvent();
@override
List<Object> get props => [];
}
class FourSceneLoading extends FourSceneEvent {}
class FourSceneSwitch extends FourSceneEvent {
final String switchD;
final String deviceId;
final String productId;
const FourSceneSwitch(
{required this.switchD, this.deviceId = '', this.productId = ''});
@override
List<Object> get props => [switchD, deviceId, productId];
}
class FourSceneUpdated extends FourSceneEvent {}
class FourSceneInitialInfo extends FourSceneEvent {}
class FourSceneInitial extends FourSceneEvent {
const FourSceneInitial();
}
class ReportLogsInitial extends FourSceneEvent {
const ReportLogsInitial();
}
class FourSceneChangeStatus extends FourSceneEvent {}
class GetCounterEvent extends FourSceneEvent {
final String deviceCode;
const GetCounterEvent({required this.deviceCode});
@override
List<Object> get props => [deviceCode];
}
class ToggleEnableAlarmEvent extends FourSceneEvent {
final bool isLowBatteryEnabled;
const ToggleEnableAlarmEvent(this.isLowBatteryEnabled);
@override
List<Object> get props => [isLowBatteryEnabled];
}
class ToggleNotificationEvent extends FourSceneEvent {
final bool isClosingEnabled;
const ToggleNotificationEvent(this.isClosingEnabled);
@override
List<Object> get props => [isClosingEnabled];
}
class ToggleFourSceneAlarmEvent extends FourSceneEvent {
final bool isFourSceneAlarmEnabled;
const ToggleFourSceneAlarmEvent(this.isFourSceneAlarmEnabled);
@override
List<Object> get props => [isFourSceneAlarmEnabled];
}
class SetCounterValue extends FourSceneEvent {
final Duration duration;
final String deviceCode;
const SetCounterValue({required this.duration, required this.deviceCode});
@override
List<Object> get props => [duration, deviceCode];
}
class StartTimer extends FourSceneEvent {
final int duration;
const StartTimer(this.duration);
@override
List<Object> get props => [duration];
}
class TickTimer extends FourSceneEvent {
final int remainingTime;
const TickTimer(this.remainingTime);
@override
List<Object> get props => [remainingTime];
}
class StopTimer extends FourSceneEvent {}
class OnClose extends FourSceneEvent {}
class ChangeNameEvent extends FourSceneEvent {
final bool? value;
const ChangeNameEvent({this.value});
}
class SearchFaqEvent extends FourSceneEvent {
final String query;
const SearchFaqEvent(this.query);
}
class FourSceneInitialQuestion extends FourSceneEvent {
const FourSceneInitialQuestion();
}
class ChangeSwitchStatusEvent extends FourSceneEvent {}
class FetchRoomsEvent extends FourSceneEvent {
final SpaceModel unit;
const FetchRoomsEvent({required this.unit});
@override
List<Object> get props => [unit];
}
class LoadScenes extends FourSceneEvent {
final String unitId;
final bool showInDevice;
final SpaceModel unit;
const LoadScenes(
{required this.unitId, required this.unit, this.showInDevice = false});
@override
List<Object> get props => [unitId, showInDevice];
}
class SelectSceneEvent extends FourSceneEvent {
final String unitId;
const SelectSceneEvent({
required this.unitId,
});
}
class SearchScenesEvent extends FourSceneEvent {
final String query;
const SearchScenesEvent({
required this.query,
});
}
class SaveSelectionEvent extends FourSceneEvent {}
class SelectOptionEvent extends FourSceneEvent {
dynamic selectedOption;
SelectOptionEvent({
this.selectedOption,
});
}
class AddDeviceToGroup extends FourSceneEvent {
final GroupDevicesModel device;
final String icon;
AddDeviceToGroup(this.device, this.icon);
}
class RemoveDeviceFromGroup extends FourSceneEvent {
final GroupDevicesModel device;
final String icon;
RemoveDeviceFromGroup(this.device, this.icon);
}

View File

@ -0,0 +1,123 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_question_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/scene_switch_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
class FourSceneState extends Equatable {
const FourSceneState();
@override
List<Object> get props => [];
}
class FourSceneInitialState extends FourSceneState {}
class FourSceneLoadingState extends FourSceneState {}
class FourSceState extends FourSceneState {}
class UpdateStateList extends FourSceneState {
final List<GroupDevicesModel> groupDevices;
final List<GroupDevicesModel> devices;
const UpdateStateList({required this.groupDevices, required this.devices});
}
class FourSceneFailedState extends FourSceneState {
final String errorMessage;
const FourSceneFailedState({required this.errorMessage});
@override
List<Object> get props => [errorMessage];
}
class UpdateState extends FourSceneState {
final FourSceneModel sensor;
const UpdateState({required this.sensor});
@override
List<Object> get props => [sensor];
}
class LoadingNewSate extends FourSceneState {
final FourSceneModel sosSensor;
const LoadingNewSate({required this.sosSensor});
@override
List<Object> get props => [sosSensor];
}
class NameEditingState extends FourSceneState {
final bool editName;
NameEditingState({required this.editName});
}
class FaqLoadedState extends FourSceneState {
final List<FourSceneQuestionModel> filteredFaqQuestions;
FaqLoadedState({this.filteredFaqQuestions = const []});
}
class FaqSearchState extends FourSceneState {
final List<FourSceneQuestionModel> filteredFaqQuestions;
const FaqSearchState({this.filteredFaqQuestions = const []});
}
class FetchRoomsState extends FourSceneState {
final List<SubSpaceModel> roomsList;
final List<DeviceModel> devicesList;
const FetchRoomsState({required this.devicesList, required this.roomsList});
@override
List<Object> get props => [devicesList];
}
class ChangeSwitchState extends FourSceneState {
final bool isEnable;
const ChangeSwitchState({required this.isEnable});
}
class SceneLoaded extends FourSceneState {
final List<ScenesModel> scenes;
final String? loadingSceneId;
final Map<String, bool> loadingStates;
const SceneLoaded(this.scenes,
{this.loadingSceneId, this.loadingStates = const {}});
}
class SelectedSceneState extends FourSceneState {}
class SearchResultsState extends FourSceneState {}
class SaveSelectionSuccessState extends FourSceneState {}
class OptionSelectedState extends FourSceneState {
final String selectedOption;
final bool hasSelectionChanged;
OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}
class LoadingDeviceInfo extends FourSceneState {
final SceneSwitch sosSensor;
const LoadingDeviceInfo({required this.sosSensor});
@override
List<Object> get props => [sosSensor];
}

View File

@ -0,0 +1,52 @@
import 'package:syncrow_app/features/devices/model/status_model.dart';
class FourSceneModel {
dynamic scene_1;
dynamic scene_2;
dynamic scene_3;
dynamic scene_4;
dynamic scene_id_group_id;
dynamic switch_backlight;
FourSceneModel({
required this.scene_1,
required this.scene_2,
required this.scene_3,
required this.scene_4,
required this.scene_id_group_id,
required this.switch_backlight,
});
factory FourSceneModel.fromJson(List<StatusModel> jsonList) {
late dynamic _scene_1;
late dynamic _scene_2;
late dynamic _scene_3;
late dynamic _scene_4;
late dynamic _scene_id_group_id;
late dynamic _switch_backlight;
for (int i = 0; i < jsonList.length; i++) {
if (jsonList[i].code == 'scene_1') {
_scene_1 = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'scene_2') {
_scene_2 = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'scene_3') {
_scene_3 = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'scene_4') {
_scene_4 = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'scene_id_group_id') {
_scene_id_group_id = jsonList[i].value ?? 0;
} else if (jsonList[i].code == 'switch_backlight') {
_switch_backlight = jsonList[i].value ?? false;
}
}
return FourSceneModel(
scene_1: _scene_1,
scene_2: _scene_2,
scene_3: _scene_3,
scene_4: _scene_4,
scene_id_group_id: _scene_id_group_id,
switch_backlight: _switch_backlight,
);
}
}

View File

@ -0,0 +1,11 @@
class FourSceneQuestionModel {
final int id;
final String question;
final String answer;
FourSceneQuestionModel({
required this.id,
required this.question,
required this.answer,
});
}

View File

@ -0,0 +1,6 @@
class GroupDevicesModel {
String? icon;
final String? name;
final String? dec;
GroupDevicesModel({this.icon, this.name, this.dec});
}

View File

@ -0,0 +1,149 @@
import 'dart:convert';
class SceneSwitch {
final int activeTime;
final String category;
final String categoryName;
final int createTime;
final String gatewayId;
final String icon;
final String ip;
final String lat;
final String localKey;
final String lon;
final String model;
final String name;
final String nodeId;
final bool online;
final String ownerId;
final String productName;
final bool sub;
final String timeZone;
final int updateTime;
final String uuid;
final String productUuid;
final String productType;
final String permissionType;
final String macAddress;
final Subspace subspace;
SceneSwitch({
required this.activeTime,
required this.category,
required this.categoryName,
required this.createTime,
required this.gatewayId,
required this.icon,
required this.ip,
required this.lat,
required this.localKey,
required this.lon,
required this.model,
required this.name,
required this.nodeId,
required this.online,
required this.ownerId,
required this.productName,
required this.sub,
required this.timeZone,
required this.updateTime,
required this.uuid,
required this.productUuid,
required this.productType,
required this.permissionType,
required this.macAddress,
required this.subspace,
});
factory SceneSwitch.fromJson(Map<String, dynamic> json) {
return SceneSwitch(
activeTime: json['activeTime'],
category: json['category'],
categoryName: json['categoryName'],
createTime: json['createTime'],
gatewayId: json['gatewayId'],
icon: json['icon'],
ip: json['ip'] ?? "",
lat: json['lat'],
localKey: json['localKey'],
lon: json['lon'],
model: json['model'],
name: json['name'],
nodeId: json['nodeId'],
online: json['online'],
ownerId: json['ownerId'],
productName: json['productName'],
sub: json['sub'],
timeZone: json['timeZone'],
updateTime: json['updateTime'],
uuid: json['uuid'],
productUuid: json['productUuid'],
productType: json['productType'],
permissionType: json['permissionType'],
macAddress: json['macAddress'],
subspace: Subspace.fromJson(json['subspace']),
);
}
Map<String, dynamic> toJson() {
return {
'activeTime': activeTime,
'category': category,
'categoryName': categoryName,
'createTime': createTime,
'gatewayId': gatewayId,
'icon': icon,
'ip': ip,
'lat': lat,
'localKey': localKey,
'lon': lon,
'model': model,
'name': name,
'nodeId': nodeId,
'online': online,
'ownerId': ownerId,
'productName': productName,
'sub': sub,
'timeZone': timeZone,
'updateTime': updateTime,
'uuid': uuid,
'productUuid': productUuid,
'productType': productType,
'permissionType': permissionType,
'macAddress': macAddress,
'subspace': subspace.toJson(),
};
}
}
class Subspace {
final String uuid;
final String createdAt;
final String updatedAt;
final String subspaceName;
Subspace({
required this.uuid,
required this.createdAt,
required this.updatedAt,
required this.subspaceName,
});
factory Subspace.fromJson(Map<String, dynamic> json) {
return Subspace(
uuid: json['uuid'],
createdAt: json['createdAt'],
updatedAt: json['updatedAt'],
subspaceName: json['subspaceName'],
);
}
Map<String, dynamic> toJson() {
return {
'uuid': uuid,
'createdAt': createdAt,
'updatedAt': updatedAt,
'subspaceName': subspaceName,
};
}
}

View File

@ -0,0 +1,11 @@
class SixSceneQuestionModel {
final int id;
final String question;
final String answer;
SixSceneQuestionModel({
required this.id,
required this.question,
required this.answer,
});
}

View File

@ -0,0 +1,28 @@
import 'package:syncrow_app/features/devices/model/status_model.dart';
class SixSceneModel {
String waterContactState;
int batteryPercentage;
SixSceneModel({
required this.waterContactState,
required this.batteryPercentage,
});
factory SixSceneModel.fromJson(List<StatusModel> jsonList) {
late String _waterContactState;
late int _batteryPercentage;
for (int i = 0; i < jsonList.length; i++) {
if (jsonList[i].code == 'sossensor_state') {
_waterContactState = jsonList[i].value ?? false;
} else if (jsonList[i].code == 'battery_percentage') {
_batteryPercentage = jsonList[i].value ?? 0;
}
}
return SixSceneModel(
waterContactState: _waterContactState,
batteryPercentage: _batteryPercentage,
);
}
}

View File

@ -0,0 +1,151 @@
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/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/sex_scene_question_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/question_page.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FaqSixScenePage extends StatelessWidget {
final DeviceModel? device;
const FaqSixScenePage({super.key, this.device});
@override
Widget build(BuildContext context) {
TextEditingController _searchController = TextEditingController();
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitialQuestion()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
List<SixSceneQuestionModel> displayedQuestions = [];
if (state is FaqSearchState) {
displayedQuestions = state.filteredFaqQuestions;
} else if (state is FaqLoadedState) {
displayedQuestions = state.filteredFaqQuestions;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
// sensor.add(const SosInitial());
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
DefaultContainer(
padding: const EdgeInsets.all(5),
child: TextFormField(
controller: _searchController,
onChanged: (value) {
sensor.add(SearchFaqEvent(value));
},
decoration: InputDecoration(
hintText: 'Enter your questions',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
suffixIcon: 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),
),
),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.04,
),
BodyMedium(
text: _searchController.text.isEmpty
? 'Device Related FAQs'
: '${displayedQuestions.length} Help Topics',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
Expanded(
child: DefaultContainer(
child: ListView.builder(
shrinkWrap: true,
itemCount: displayedQuestions.length,
itemBuilder: (context, index) {
final faq = displayedQuestions[index];
return InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => QuestionPage(
questionModel: faq,
)),
);
},
child: SizedBox(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: BodyMedium(
fontSize: 14,
fontWeight: FontWeight.w400,
text: faq.question,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
),
],
),
),
const Divider(
color: ColorsManager.dividerColor,
),
],
),
),
);
},
)),
),
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,197 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_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_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class LocationSixScenePage extends StatefulWidget {
final SpaceModel? space;
LocationSixScenePage({super.key, this.space});
@override
_LocationSixScenePageState createState() => _LocationSixScenePageState();
}
class _LocationSixScenePageState extends State<LocationSixScenePage> {
String _selectedOption = 'Conference Room';
bool _hasSelectionChanged = false;
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Location',
actions: [
InkWell(
onTap: _hasSelectionChanged
? () {
print('Save button clicked');
}
: null,
child: BodyMedium(
text: 'Save',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: _hasSelectionChanged
? ColorsManager.slidingBlueColor
: ColorsManager.primaryTextColor,
),
),
const SizedBox(width: 20),
],
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: '')
..add(FetchRoomsEvent(unit: widget.space!)),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
List<SubSpaceModel>? rooms = [];
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is FetchRoomsState) {
rooms = state.roomsList;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: ListView(
padding: const EdgeInsets.symmetric(vertical: 20),
children: [
const BodyMedium(
text: 'Smart Device Location',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(height: 5),
DefaultContainer(
padding: const EdgeInsets.all(20),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: rooms!.length,
itemBuilder: (context, index) {
final room = rooms![index];
return Column(
children: [
_buildCheckboxOption(
label: room.name!,
onTap: (v) {
setState(() {
_selectedOption = v;
_hasSelectionChanged = true;
});
},
),
if (index < rooms.length - 1) ...[
const SizedBox(height: 10),
const Divider(
color: ColorsManager.dividerColor,
),
const SizedBox(height: 10),
],
],
);
},
),
),
],
),
);
},
),
),
);
}
Widget _buildCheckboxOption(
{required String label, required Function(String) onTap}) {
return Padding(
padding: const EdgeInsets.only(bottom: 10, top: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyMedium(
text: label,
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w400),
),
CircularCheckbox(
value: _selectedOption == label,
onChanged: (bool? value) {
if (value == true) {
setState(() {
_selectedOption = label;
_hasSelectionChanged = true;
});
onTap(label);
}
},
),
],
),
);
}
}
class CircularCheckbox extends StatefulWidget {
final bool value;
final ValueChanged<bool?> onChanged;
CircularCheckbox({required this.value, required this.onChanged});
@override
_CircularCheckboxState createState() => _CircularCheckboxState();
}
class _CircularCheckboxState extends State<CircularCheckbox> {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
widget.onChanged(!widget.value);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: widget.value
? ColorsManager.primaryColorWithOpacity.withOpacity(0.01)
: Colors.grey,
width: 2.0,
),
color: widget.value
? ColorsManager.primaryColorWithOpacity
: Colors.transparent,
),
width: 24.0,
height: 24.0,
child: widget.value
? const Icon(
Icons.check,
color: Colors.white,
size: 16.0,
)
: null,
),
);
}
}

View File

@ -0,0 +1,144 @@
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/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/sex_scene_question_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class QuestionPage extends StatelessWidget {
final SixSceneQuestionModel? questionModel;
const QuestionPage({super.key, this.questionModel});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) =>
SixSceneBloc(sixSceneId: '')..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: Column(
children: [
DefaultContainer(
padding: EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BodyLarge(
text: questionModel!.question,
fontSize: 22,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
SizedBox(
height: 15,
),
BodyMedium(
text: questionModel!.answer,
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbUp,
fit: BoxFit.fill,
),
SizedBox(
width: 10,
),
BodyMedium(
text: 'Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
SizedBox(
height: 15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbDown,
fit: BoxFit.fill,
),
SizedBox(
width: 10,
),
BodyMedium(
text: 'Not Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
],
));
},
),
),
);
}
}

View File

@ -0,0 +1,101 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class ShareSixScenePage extends StatelessWidget {
final DeviceModel? device;
const ShareSixScenePage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Share Device',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is LoadingNewSate
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const BodyLarge(
text: 'Sharing Method Not Supported',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
const BodyMedium(
text:
'Currently, you cannot use the specified method to share Bluetooth mesh devices Zigbee devices, infrared devices, Bluetooth Beacon Devices, and certain Bluetooth LE devices with other users.',
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Recommended Sharing Method',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
const BodyMedium(
text:
'If the recipient is a home member or a reliable user, tap Me > Home Management > Add Member and add the recipient to your home. Then, devices in the home can be shared with the recipient in bulk.',
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
),
Center(
child: SizedBox(
width: 250,
child: DefaultButton(
backgroundColor: ColorsManager.blueColor1,
borderRadius: 50,
onPressed: () {},
child: Text('Add Home Member')),
),
)
],
));
},
),
),
);
}
}

View File

@ -0,0 +1,208 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_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/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';
class SixSceneCreateGroup extends StatelessWidget {
final DeviceModel? device;
const SixSceneCreateGroup({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Create Group',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is LoadingNewSate
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: Padding(
padding: EdgeInsets.all(8.0),
child: Column(
children: [
const Padding(
padding: EdgeInsets.only(left: 25, right: 25),
child: BodySmall(
text:
'Devices in the same group can be controlled together',
fontColor: ColorsManager.primaryTextColor,
textAlign: TextAlign.center,
),
),
Flexible(
child: ListView.builder(
itemCount: sensor.groupDevices.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () {
BlocProvider.of<SixSceneBloc>(context).add(
RemoveDeviceFromGroup(
sensor.groupDevices[index],
Assets.addDevicesIcon));
},
child: DefaultContainer(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset(
sensor.groupDevices[index].icon!,
fit: BoxFit.contain,
),
const SizedBox(
width: 15,
),
BodyMedium(
text: sensor
.groupDevices[index].name!,
fontColor:
ColorsManager.primaryTextColor,
textAlign: TextAlign.center,
fontSize: 15,
),
],
),
BodyMedium(
text: sensor.groupDevices[index].dec!,
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 15,
),
],
),
)),
);
},
),
),
Flexible(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const BodyLarge(
text: 'Devices to be added',
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 12,
fontWeight: FontWeight.w700,
),
const SizedBox(
height: 5,
),
sensor.devices.isNotEmpty
? Expanded(
child: ListView.builder(
itemCount: sensor.devices.length,
itemBuilder: (context, index) {
final device = sensor.devices[index];
return GestureDetector(
onTap: () {
BlocProvider.of<SixSceneBloc>(
context)
.add(AddDeviceToGroup(device,
Assets.minusIcon));
},
child: DefaultContainer(
child: Padding(
padding:
const EdgeInsets.all(5.0),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset(
device.icon!,
fit: BoxFit.contain,
),
const SizedBox(
width: 15,
),
BodyMedium(
text: device.name!,
fontColor: ColorsManager
.primaryTextColor,
textAlign:
TextAlign.center,
fontSize: 15,
),
],
),
BodyMedium(
text: device.dec!,
fontColor: ColorsManager
.grayColor,
textAlign:
TextAlign.center,
fontSize: 15,
),
],
),
),
),
);
},
),
)
: const Column(
children: [
BodySmall(
text:
'Currently no devices available to create group',
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 12,
fontWeight: FontWeight.w400,
),
],
),
],
),
),
Spacer()
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,227 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class DisconnectDeviceDialog extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const DisconnectDeviceDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Disconnect Device',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.red,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This will disconnect your device from this Application')),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Disconnect',
style: TextStyle(
color: ColorsManager.red,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}
class DisconnectWipeData extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const DisconnectWipeData({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Disconnect and Wipe Data',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.red,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This will disconnect your device from this Application and wipe all the data')),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Disconnect',
style: TextStyle(
color: ColorsManager.red,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,132 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SixSceneInfoPage extends StatelessWidget {
final DeviceModel? device;
const SixSceneInfoPage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Information',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: DefaultContainer(
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
const BodyLarge(
text: 'Virtual ID',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const BodySmall(
text: 'bf3575d0e0c8b6e0a6hybl',
fontColor: ColorsManager.primaryTextColor,
),
InkWell(
onTap: () {},
child: const Row(
children: [
Icon(
Icons.copy,
color: ColorsManager.blueColor,
),
BodyMedium(
text: 'Copy',
fontColor: ColorsManager.blueColor,
),
],
),
)
],
),
const Divider(
color: ColorsManager.dividerColor,
),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyLarge(
text: 'MAC',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: 'bf3575d0e0c8b6e0a6hybl',
fontColor: ColorsManager.primaryTextColor,
),
],
),
const Divider(
color: ColorsManager.dividerColor,
),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyLarge(
text: 'Time Zone',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: 'Asia/Dubai',
fontColor: ColorsManager.primaryTextColor,
),
],
),
]),
)));
},
),
),
);
}
}

View File

@ -0,0 +1,171 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/location_setting.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SixSceneProfilePage extends StatelessWidget {
final DeviceModel? device;
const SixSceneProfilePage({super.key, this.device});
@override
Widget build(BuildContext context) {
var spaces = HomeCubit.getInstance().spaces;
return DefaultScaffold(
title: 'Device Settings',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: ListView(
children: [
CircleAvatar(
radius: 60,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 55,
backgroundColor: Colors.grey,
child: ClipOval(
child: SvgPicture.asset(
Assets.sosProfileIcon,
fit: BoxFit.fill,
),
),
),
),
const SizedBox(
height: 10,
),
SizedBox(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
IntrinsicWidth(
child: ConstrainedBox(
constraints:
const BoxConstraints(maxWidth: 200),
child: TextFormField(
maxLength: 30,
style: const TextStyle(
color: Colors.black,
),
textAlign: TextAlign.center,
focusNode: sensor.focusNode,
controller: sensor.nameController,
enabled: sensor.editName,
onEditingComplete: () {
// sensor.add(SaveNameEvent(context: context));
},
decoration: const InputDecoration(
hintText: "Your Name",
border: InputBorder.none,
fillColor: Colors.white10,
counterText: '',
),
),
),
),
const SizedBox(width: 5),
InkWell(
onTap: () {
sensor
.add(const ChangeNameEvent(value: true));
},
child: const Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: Icon(
Icons.edit_outlined,
size: 20,
color: ColorsManager.textPrimaryColor,
),
),
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Smart Device Information',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
padding: const EdgeInsets.all(20),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => LocationSixScenePage(
space: spaces!.first,
)),
);
},
child: const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(
child: Text('Location'),
),
Row(
children: [
SizedBox(
child: BodyMedium(
text: 'Syncroom',
fontColor: ColorsManager.textGray,
),
),
Icon(
Icons.arrow_forward_ios,
size: 15,
color: ColorsManager.textGray,
),
],
)
],
),
),
)
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,520 @@
import 'package:flutter/cupertino.dart';
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/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/faq_six_scene_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/share_six_scene_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_create_group.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_delete_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_info_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_profile_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_update_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_update_page.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_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';
class SixSceneSettings extends StatelessWidget {
final DeviceModel? device;
const SixSceneSettings({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Settings',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: ListView(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10,
),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const SixSceneProfilePage(),
),
);
},
child: Stack(
children: [
const Column(
crossAxisAlignment:
CrossAxisAlignment.stretch,
children: [
SizedBox(height: 20),
DefaultContainer(
borderRadius:
BorderRadius.all(Radius.circular(30)),
child: Padding(
padding: EdgeInsets.all(10.0),
child: Padding(
padding: EdgeInsets.only(left: 90),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
BodyMedium(
text: '6 Scene Switch',
fontWeight: FontWeight.bold,
),
SizedBox(
height: 5,
),
BodySmall(
text: "Room: Syncrow"),
],
),
Icon(Icons.edit_sharp)
],
),
),
),
),
],
),
Positioned(
top: 0,
left: 20,
child: CircleAvatar(
radius: 43,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 40,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 40,
backgroundColor:
ColorsManager.backgroundColor,
child: SvgPicture.asset(
Assets.sixSceneIcon,
fit: BoxFit.fill,
),
),
)),
),
],
),
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Device Management',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const SixSceneInfoPage()),
);
},
text: 'Device Information',
icon: Assets.infoIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
ShareSixScenePage(device: device!)),
);
},
text: 'Tap-to Run and Automation',
icon: Assets.tapRunIcon,
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Device Offline Notification',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onChanged: (p0) {},
isNotification: true,
onTap: () {},
text: 'Offline Notification',
icon: Assets.notificationIcon,
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Others',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(height: 5),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
ShareSixScenePage(device: device!)),
);
},
text: 'Share Device',
icon: Assets.shareIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
SixSceneCreateGroup(
device: device!)),
);
},
text: 'Create Group',
icon: Assets.createGroupIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
FaqSixScenePage(device: device!)),
);
},
text: 'Device FAQ',
icon: Assets.faqIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTapUpdate: () {
showDialog(
context: context,
builder: (context) {
return UpdateInfoDialog(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context).pop();
},
);
},
);
},
isUpdate: true,
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const SixSceneUpdatePage()),
);
},
text: 'Device Update',
icon: Assets.updateIcon,
),
],
),
),
const SizedBox(height: 20),
InkWell(
onTap: () {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const BodyMedium(
text: 'Remove Device',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: ColorsManager.red,
),
const SizedBox(height: 10),
const SizedBox(
width: 250,
child: Divider(
color: ColorsManager.dividerColor,
),
),
const SizedBox(height: 10),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
showDialog(
context: context,
builder: (context) {
return DisconnectDeviceDialog(
cancelTab: () {
Navigator.of(context)
.pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context)
.pop();
},
);
},
);
},
child: const BodyMedium(
text: 'Disconnect Device',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager
.textPrimaryColor,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
)
],
),
const SizedBox(height: 20),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
showDialog(
context: context,
builder: (context) {
return DisconnectWipeData(
cancelTab: () {
Navigator.of(context)
.pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context)
.pop();
},
);
},
);
},
child: const BodyMedium(
text:
'Disconnect Device and Wipe Data',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager
.textPrimaryColor,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
)
],
),
],
),
);
},
);
},
child: const Center(
child: BodyMedium(
text: 'Remove Device',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager.red,
),
),
),
],
),
);
},
),
),
);
}
}
class SettingWidget extends StatelessWidget {
final String? text;
final bool? isUpdate;
final bool? isNotification;
final String? icon;
final Function()? onTap;
final Function()? onTapUpdate;
final Function(bool)? onChanged;
const SettingWidget(
{super.key,
this.text,
this.icon,
this.onTap,
this.isUpdate,
this.onChanged,
this.isNotification = false,
this.onTapUpdate});
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
Expanded(
flex: 2,
child: Container(
padding: EdgeInsets.all(8),
decoration: const BoxDecoration(
color: ColorsManager.primaryColor,
borderRadius: BorderRadius.all(Radius.circular(20))),
child: SvgPicture.asset(
icon!,
fit: BoxFit.none,
height: 30,
),
),
),
const SizedBox(
width: 8,
),
Expanded(
flex: isUpdate == true ? 5 : 10,
child: BodyMedium(
text: text!,
fontSize: 15,
fontWeight: FontWeight.w400,
)),
],
),
),
isUpdate == true
? InkWell(
onTap: onTapUpdate,
child: BodyMedium(
text: '1 Update Available',
fontSize: 13,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blueColor,
),
)
: SizedBox(),
isNotification == false
? const Icon(
Icons.arrow_forward_ios,
color: ColorsManager.graysColor,
size: 20,
)
: Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: true,
onChanged: onChanged,
applyTheme: true,
),
),
],
),
);
}
}

View File

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class UpdateInfoDialog extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const UpdateInfoDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
BodyLarge(
text: 'Update Available',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.switchButton.withOpacity(0.6),
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'An update is available for your device. Version 2.1.0 includes new features and important fixes to enhance performance and security.',
textAlign: TextAlign.center,
)),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Remind me later',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Update Now',
style: TextStyle(
color:
ColorsManager.switchButton.withOpacity(0.6),
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class upDateNote extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const upDateNote({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
BodyLarge(
text: 'Update Note',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.switchButton.withOpacity(0.6),
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This update may take a long time. Make sure that the device is fully charged. The device will be unavailable during the update.',
textAlign: TextAlign.center,
)),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Start Update',
style: TextStyle(
color:
ColorsManager.switchButton.withOpacity(0.6),
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,345 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_update_note.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SixSceneUpdatePage extends StatelessWidget {
const SixSceneUpdatePage({super.key});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Update',
child: BlocProvider(
create: (context) =>
SixSceneBloc(sixSceneId: '')..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {},
child: Column(
children: [
// SizedBox(
// height: MediaQuery.of(context).size.height * 0.15,
// ),
DefaultContainer(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 50,
child: ListTile(
contentPadding: EdgeInsets.zero,
leading: SizedBox(
width: 200,
child: Row(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: const BoxDecoration(
color: ColorsManager
.primaryColor,
borderRadius:
BorderRadius.all(
Radius.circular(50))),
child: SvgPicture.asset(
Assets.checkUpdateIcon,
fit: BoxFit.fill,
height: 25,
),
),
const SizedBox(
width: 10,
),
InkWell(
onTap: () {},
child: const BodyMedium(
text: 'Automatic Update',
fontWeight: FontWeight.normal,
),
),
],
),
),
trailing: Container(
width: 100,
child: Row(
mainAxisAlignment:
MainAxisAlignment.end,
children: [
const BodyMedium(
text: 'Off',
fontColor: ColorsManager.textGray,
),
Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: true,
onChanged: (value) {},
applyTheme: true,
),
),
],
),
)),
),
],
),
),
const SizedBox(
height: 10,
),
UpdateSosContainerWithProgressBar(
sosDescription:
'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.',
sosVersion: 'SOS v2.0.5',
),
// const UpdatedContainer(
// sosVersion: 'SOS v1.0.13',
// sosDescription: 'SOS is up to date',
// ),
// const NewUpdateContainer(
// sosVersion: 'SOS v2.0.5',
// sosDescription:
// 'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.',
// ),
const SizedBox(
height: 15,
),
],
));
},
),
));
}
}
class UpdatedContainer extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const UpdatedContainer({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return DefaultContainer(
height: MediaQuery.of(context).size.height * 0.35,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.blackColor,
),
],
),
],
),
),
);
}
}
class NewUpdateContainer extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const NewUpdateContainer({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return DefaultContainer(
height: MediaQuery.of(context).size.height * 0.50,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
const BodyMedium(
text: 'New Update Available Now!',
fontColor: ColorsManager.blueColor,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
Container(
width: MediaQuery.of(context).size.width * 0.7,
child: BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: DefaultButton(
borderRadius: 25,
backgroundColor: ColorsManager.blueColor1,
height: 150,
onPressed: () {
showDialog(
context: context,
builder: (context) {
return upDateNote(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
Navigator.of(context).pop();
},
);
},
);
},
child: const BodyMedium(
text: 'Update Now',
fontColor: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w700,
textAlign: TextAlign.center,
),
),
)
],
),
],
),
),
);
}
}
class UpdateSosContainerWithProgressBar extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const UpdateSosContainerWithProgressBar({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
DefaultContainer(
height: MediaQuery.of(context).size.height * 0.50,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
BodyMedium(
text: 'New Update Available Now!',
fontColor: ColorsManager.blueColor,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
LinearPercentIndicator(
barRadius: Radius.circular(10),
width: 170.0,
animation: true,
animationDuration: 1000,
lineHeight: 5.0,
percent: 0.2,
linearStrokeCap: LinearStrokeCap.butt,
progressColor: ColorsManager.blueColor1,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: const BodyMedium(
text: 'Downloading Update please be patient',
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
),
],
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: const BodyMedium(
text:
'Please keep the power of the device connected during the upgrade process.',
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
);
}
}

View File

@ -0,0 +1,286 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/view/widgets/restart_status_dialog.dart';
import 'package:syncrow_app/features/scene/model/scene_settings_route_arguments.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/navigation/navigation_service.dart';
import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SelectSceneSixPage extends StatelessWidget {
SelectSceneSixPage({super.key});
final TextEditingController _searchController = TextEditingController();
final int? selectedSwitchIndex = 0;
final spaces = HomeCubit.getInstance().spaces;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: '')
..add(LoadScenes(
unit: spaces!.first,
unitId: spaces!.first.id,
showInDevice: false,
)),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensorBloc = BlocProvider.of<SixSceneBloc>(context);
return DefaultScaffold(
title: 'Select Scene',
actions: [_buildSaveButton(context, state, sensorBloc)],
child: state is SixSceneLoadingState
? _buildLoadingIndicator()
: _buildSceneContent(context, sensorBloc),
);
},
),
);
}
// Save button builder
Widget _buildSaveButton(
BuildContext context, SixSceneState state, SixSceneBloc sensorBloc) {
final bool canSave =
state is OptionSelectedState && state.hasSelectionChanged;
return GestureDetector(
onTap: canSave
? () {
print('object');
context.read<SixSceneBloc>().add(SaveSelectionEvent());
}
: null,
child: BodyMedium(
text: 'Save',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: canSave
? ColorsManager.slidingBlueColor
: ColorsManager.primaryTextColor,
),
);
}
// Loading indicator
Widget _buildLoadingIndicator() {
return const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
);
}
// Main scene content with search bar and grid
Widget _buildSceneContent(BuildContext context, SixSceneBloc sensorBloc) {
return Column(
children: [
_buildSearchBar(sensorBloc),
const SizedBox(height: 20),
Expanded(
child: _buildSceneGrid(sensorBloc),
),
],
);
}
// Search bar widget
Widget _buildSearchBar(SixSceneBloc sensorBloc) {
return TextFormField(
controller: _searchController,
onChanged: (value) {
sensorBloc.add(SearchScenesEvent(query: value));
},
decoration: InputDecoration(
hintText: 'Search',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
suffixIcon: 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),
),
),
);
}
// Scene grid builder
Widget _buildSceneGrid(SixSceneBloc sensorBloc) {
final scenes = sensorBloc.filteredScenes;
return GridView.builder(
itemCount: scenes.length + 1,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
mainAxisExtent: 120,
),
itemBuilder: (context, index) {
if (index == scenes.length) {
return InkWell(
onTap: () => Navigator.pushNamed(
NavigationService.navigatorKey.currentContext!,
Routes.sceneTasksRoute,
arguments: SceneSettingsRouteArguments(
sceneType: '',
sceneId: '',
sceneName: '',
),
),
child: CreateSceneItem(),
);
} else {
final scene = scenes[index];
return SceneItem(
id: scene.id,
value: sensorBloc.selectedSceneId == scene.id,
disablePlayButton: false,
onChanged: (isSelected) {
sensorBloc.selectedSceneId = isSelected ? scene.id : 'null';
sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
},
icon: scene.iconInBytes,
title: scene.name,
);
}
},
);
}
}
class SceneItem extends StatefulWidget {
final String id; // Unique ID for each scene
final Uint8List icon;
final String title;
final bool disablePlayButton;
final bool value;
final Function(bool) onChanged;
const SceneItem({
required this.id,
required this.icon,
required this.title,
this.disablePlayButton = false,
required this.value,
required this.onChanged,
});
@override
State<SceneItem> createState() => _SceneItemState();
}
class _SceneItemState extends State<SceneItem> {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 2,
spreadRadius: 1,
offset: Offset(0, 3),
),
],
),
padding: const EdgeInsets.all(16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (!widget.disablePlayButton)
Image.memory(
widget.icon,
height: 32,
width: 32,
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) => Image.asset(
Assets.assetsIconsLogo,
height: 32,
width: 32,
fit: BoxFit.fill),
),
BodyMedium(
text: widget.title,
style: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
CircularCheckbox(
value: widget.value,
onChanged: (isSelected) => widget.onChanged(isSelected!),
),
],
),
);
}
}
// Widget for the static "Create Scene" button
class CreateSceneItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 5,
spreadRadius: 2,
offset: Offset(0, 3),
),
],
),
padding: const EdgeInsets.all(16),
child: const Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(Icons.add_circle,
color: ColorsManager.grayButtonColors, size: 36),
BodyMedium(
text: 'Create Scene',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w400,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
);
}
}

View File

@ -0,0 +1,146 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/switches_card.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/resource_manager/color_manager.dart';
class SelectSwitchDialog extends StatefulWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const SelectSwitchDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
State<SelectSwitchDialog> createState() => _SelectSwitchDialogState();
}
class _SelectSwitchDialogState extends State<SelectSwitchDialog> {
int? selectedSwitchIndex = 0; // State variable to track selected switch
@override
Widget build(BuildContext context) {
return AlertDialog(
backgroundColor: ColorsManager.onPrimaryColor,
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(height: 10),
const BodyLarge(
text: 'Select Switch',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.primaryColor,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(color: ColorsManager.textGray),
),
const SizedBox(height: 20),
Row(
children: [
SwitchsCard(
switch1Down: selectedSwitchIndex == -1
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch1Up: selectedSwitchIndex == 1
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Down: selectedSwitchIndex == -2
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Up: selectedSwitchIndex == 2
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
onSwitch1UpTap: () {
setState(() => selectedSwitchIndex = 1);
},
onSwitch1DownTap: () {
setState(() => selectedSwitchIndex = -1);
},
onSwitch2UpTap: () {
setState(() => selectedSwitchIndex = 2);
},
onSwitch2DownTap: () {
setState(() => selectedSwitchIndex = -2);
},
),
],
),
const SizedBox(height: 20),
const Center(
child: Text(
'Please select one of the switches available to continue',
textAlign: TextAlign.center,
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right:
BorderSide(color: ColorsManager.textGray, width: 0.5),
top: BorderSide(color: ColorsManager.textGray, width: 1.0),
)),
child: SizedBox(
child: InkWell(
onTap: widget.cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textPrimaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(color: ColorsManager.textGray, width: 0.5),
top: BorderSide(color: ColorsManager.textGray, width: 1.0),
)),
child: InkWell(
onTap: selectedSwitchIndex == 0 ? () {} : widget.confirmTab,
child: Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Next',
style: TextStyle(
color: selectedSwitchIndex == 0
? ColorsManager.textPrimaryColor
.withOpacity(0.6)
: ColorsManager.primaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
],
)
],
),
);
}
}

View File

@ -0,0 +1,200 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/6_scene_setting/six_scene_settings.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/select_scene_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/select_switch_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/switches_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/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/generated/assets.dart';
class SixSceneScreen extends StatelessWidget {
final DeviceModel? device;
const SixSceneScreen({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: '6 Scene Switch',
actions: [
InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SixSceneSettings(device: device!)),
);
},
child: SvgPicture.asset(Assets.assetsIconsSettings)),
const SizedBox(
width: 10,
)
],
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: ListView(
children: [
SizedBox(
height: MediaQuery.sizeOf(context).height * 0.8,
child: Column(
children: [
SwitchsCard(
switch1Down: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch1Up: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch2Down: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch2Up: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
onSwitch1UpTap: () {
debugPrint("Switch 1 Up tapped");
},
onSwitch1DownTap: () {
debugPrint("Switch 1 Down tapped");
},
onSwitch2UpTap: () {
debugPrint("Switch 2 Up tapped");
},
onSwitch2DownTap: () {
debugPrint("Switch 2 Down tapped");
},
),
Flexible(
child: Row(
children: [
Expanded(
child: DefaultContainer(
onTap: () {
sensor.add(ChangeSwitchStatusEvent());
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46, maxWidth: 50),
child: SvgPicture.asset(
Assets.backlightIcon),
),
const SizedBox(
height: 15,
),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Backlight',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
const SizedBox(
width: 10,
),
Expanded(
child: DefaultContainer(
onTap: () {
showDialog(
context: context,
builder: (context) {
return SelectSwitchDialog(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
SelectSceneSixPage()),
);
},
);
},
);
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46, maxWidth: 50),
child: SvgPicture.asset(
Assets.addSceneIcon),
),
const SizedBox(
height: 15,
),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Add Scene',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
],
),
)
],
),
),
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,135 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SwitchsCard extends StatelessWidget {
final String switch1Up;
final String switch1Down;
final String switch2Up;
final String switch2Down;
final VoidCallback onSwitch1UpTap;
final VoidCallback onSwitch1DownTap;
final VoidCallback onSwitch2UpTap;
final VoidCallback onSwitch2DownTap;
SwitchsCard({
required this.switch1Down,
required this.switch1Up,
required this.switch2Down,
required this.switch2Up,
required this.onSwitch1UpTap,
required this.onSwitch1DownTap,
required this.onSwitch2UpTap,
required this.onSwitch2DownTap,
});
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: InkWell(
overlayColor: MaterialStateProperty.all(Colors.transparent),
onTap: () {},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10)),
),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: ColorsManager.onPrimaryColor,
boxShadow: [
BoxShadow(
color: Colors.white.withOpacity(0.1),
blurRadius: 24,
offset: const Offset(-2, -2),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.black.withOpacity(0.11),
blurRadius: 5,
offset: const Offset(2, 0),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.white.withOpacity(0.13),
blurRadius: 10,
offset: const Offset(5, 1),
blurStyle: BlurStyle.inner,
),
],
),
child: SizedBox(
height: 300,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
// Switch 1
_buildSwitchColumn(switch1Up, switch1Down,
onSwitch1UpTap, onSwitch1DownTap),
_buildDivider(),
// Switch 2
_buildSwitchColumn(switch2Up, switch2Down,
onSwitch2UpTap, onSwitch2DownTap),
],
),
),
),
),
),
],
),
),
);
}
Widget _buildSwitchColumn(
String switchUp,
String switchDown,
VoidCallback onUpTap,
VoidCallback onDownTap,
) {
return Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: onUpTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchUp),
),
),
InkWell(
onTap: onDownTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchDown),
),
),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 3,
color: ColorsManager.dividerColor,
);
}
}

View File

@ -0,0 +1,204 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_settings.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_select_scene_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_select_switch_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_switches_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/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/generated/assets.dart';
class FourSceneScreen extends StatelessWidget {
final DeviceModel? device;
const FourSceneScreen({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: '4 Scene Switch',
actions: [
InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => FourSceneSettings(device: device!)),
);
},
child: SvgPicture.asset(Assets.assetsIconsSettings)),
const SizedBox(
width: 10,
)
],
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial())
..add(FourSceneInitialInfo()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: ListView(
children: [
SizedBox(
height: MediaQuery.sizeOf(context).height * 0.8,
child: Column(
children: [
FourSwitchsCard(
switch1Down: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch1Up: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch2Down: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
switch2Up: sensor.switchStatus == true
? Assets.switchOn
: Assets.switchOff,
onSwitch1UpTap: () {
debugPrint("Switch 1 Up tapped");
},
onSwitch1DownTap: () {
debugPrint("Switch 1 Down tapped");
},
onSwitch2UpTap: () {
debugPrint("Switch 2 Up tapped");
},
onSwitch2DownTap: () {
debugPrint("Switch 2 Down tapped");
},
),
Flexible(
child: Row(
children: [
Expanded(
child: DefaultContainer(
onTap: () {
sensor.add(ChangeSwitchStatusEvent());
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46, maxWidth: 50),
child: SvgPicture.asset(
Assets.backlightIcon),
),
const SizedBox(
height: 15,
),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Backlight',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
const SizedBox(
width: 10,
),
Expanded(
child: DefaultContainer(
onTap: () {
showDialog(
context: context,
builder: (context) {
return FourSelectSwitchDialog(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
FourSelectSceneFourPage()),
);
},
);
},
);
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46, maxWidth: 50),
child: SvgPicture.asset(
Assets.addSceneIcon),
),
const SizedBox(
height: 15,
),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Add Scene',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
],
),
)
],
),
),
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,151 @@
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/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_question_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/question_page_four_scene.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FaqFourScenePage extends StatelessWidget {
final DeviceModel? device;
const FaqFourScenePage({super.key, this.device});
@override
Widget build(BuildContext context) {
TextEditingController _searchController = TextEditingController();
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitialQuestion()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
List<FourSceneQuestionModel> displayedQuestions = [];
if (state is FaqSearchState) {
displayedQuestions = state.filteredFaqQuestions;
} else if (state is FaqLoadedState) {
displayedQuestions = state.filteredFaqQuestions;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
// sensor.add(const SosInitial());
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
DefaultContainer(
padding: const EdgeInsets.all(5),
child: TextFormField(
controller: _searchController,
onChanged: (value) {
sensor.add(SearchFaqEvent(value));
},
decoration: InputDecoration(
hintText: 'Enter your questions',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
suffixIcon: 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),
),
),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.04,
),
BodyMedium(
text: _searchController.text.isEmpty
? 'Device Related FAQs'
: '${displayedQuestions.length} Help Topics',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
Expanded(
child: DefaultContainer(
child: ListView.builder(
shrinkWrap: true,
itemCount: displayedQuestions.length,
itemBuilder: (context, index) {
final faq = displayedQuestions[index];
return InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => QuestionPageFourScene(
questionModel: faq,
)),
);
},
child: SizedBox(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: BodyMedium(
fontSize: 14,
fontWeight: FontWeight.w400,
text: faq.question,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
),
],
),
),
const Divider(
color: ColorsManager.dividerColor,
),
],
),
),
);
},
)),
),
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,213 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_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/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';
class FourSceneCreateGroup extends StatelessWidget {
final DeviceModel? device;
const FourSceneCreateGroup({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Create Group',
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is LoadingNewSate
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: Padding(
padding: EdgeInsets.all(8.0),
child: Column(
children: [
const Padding(
padding: EdgeInsets.only(left: 25, right: 25),
child: BodySmall(
text:
'Devices in the same group can be controlled together',
fontColor: ColorsManager.primaryTextColor,
textAlign: TextAlign.center,
),
),
Flexible(
child: ListView.builder(
itemCount: sensor.groupDevices.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () {
BlocProvider.of<FourSceneBloc>(context).add(
RemoveDeviceFromGroup(
sensor.groupDevices[index],
Assets.addDevicesIcon));
},
child: DefaultContainer(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset(
sensor.groupDevices[index].icon!,
fit: BoxFit.contain,
),
const SizedBox(
width: 15,
),
BodyMedium(
text: sensor
.groupDevices[index].name!,
fontColor:
ColorsManager.primaryTextColor,
textAlign: TextAlign.center,
fontSize: 15,
),
],
),
BodyMedium(
text: sensor.groupDevices[index].dec!,
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 15,
),
],
),
)),
);
},
),
),
Flexible(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const BodyLarge(
text: 'Devices to be added',
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 12,
fontWeight: FontWeight.w700,
),
const SizedBox(
height: 5,
),
sensor.devices.isNotEmpty
? Expanded(
child: ListView.builder(
itemCount: sensor.devices.length,
itemBuilder: (context, index) {
final device = sensor.devices[index];
return GestureDetector(
onTap: () {
BlocProvider.of<FourSceneBloc>(
context)
.add(AddDeviceToGroup(device,
Assets.minusIcon));
},
child: DefaultContainer(
child: Padding(
padding:
const EdgeInsets.all(5.0),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset(
device.icon!,
fit: BoxFit.contain,
),
const SizedBox(
width: 15,
),
BodyMedium(
text: device.name!,
fontColor: ColorsManager
.primaryTextColor,
textAlign:
TextAlign.center,
fontSize: 15,
),
],
),
BodyMedium(
text: device.dec!,
fontColor: ColorsManager
.grayColor,
textAlign:
TextAlign.center,
fontSize: 15,
),
],
),
),
),
);
},
),
)
: const Column(
children: [
BodySmall(
text:
'Currently no devices available to create group',
fontColor: ColorsManager.grayColor,
textAlign: TextAlign.center,
fontSize: 12,
fontWeight: FontWeight.w400,
),
],
),
],
),
),
Spacer()
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,227 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class DisconnectDeviceDialog extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const DisconnectDeviceDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Disconnect Device',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.red,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This will disconnect your device from this Application')),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Disconnect',
style: TextStyle(
color: ColorsManager.red,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}
class DisconnectWipeData extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const DisconnectWipeData({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Disconnect and Wipe Data',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.red,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This will disconnect your device from this Application and wipe all the data')),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Disconnect',
style: TextStyle(
color: ColorsManager.red,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,132 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/six_scene_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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SixSceneInfoPage extends StatelessWidget {
final DeviceModel? device;
const SixSceneInfoPage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Information',
child: BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
batteryPercentage: 0, waterContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SixSceneInitial());
},
child: DefaultContainer(
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
const BodyLarge(
text: 'Virtual ID',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const BodySmall(
text: 'bf3575d0e0c8b6e0a6hybl',
fontColor: ColorsManager.primaryTextColor,
),
InkWell(
onTap: () {},
child: const Row(
children: [
Icon(
Icons.copy,
color: ColorsManager.blueColor,
),
BodyMedium(
text: 'Copy',
fontColor: ColorsManager.blueColor,
),
],
),
)
],
),
const Divider(
color: ColorsManager.dividerColor,
),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyLarge(
text: 'MAC',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: 'bf3575d0e0c8b6e0a6hybl',
fontColor: ColorsManager.primaryTextColor,
),
],
),
const Divider(
color: ColorsManager.dividerColor,
),
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyLarge(
text: 'Time Zone',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: 'Asia/Dubai',
fontColor: ColorsManager.primaryTextColor,
),
],
),
]),
)));
},
),
),
);
}
}

View File

@ -0,0 +1,175 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/location_setting_four_scene.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FourSceneProfilePage extends StatelessWidget {
final DeviceModel? device;
const FourSceneProfilePage({super.key, this.device});
@override
Widget build(BuildContext context) {
var spaces = HomeCubit.getInstance().spaces;
return DefaultScaffold(
title: 'Device Settings',
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: ListView(
children: [
CircleAvatar(
radius: 60,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 55,
backgroundColor: Colors.grey,
child: ClipOval(
child: SvgPicture.asset(
Assets.sosProfileIcon,
fit: BoxFit.fill,
),
),
),
),
const SizedBox(
height: 10,
),
SizedBox(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
IntrinsicWidth(
child: ConstrainedBox(
constraints:
const BoxConstraints(maxWidth: 200),
child: TextFormField(
maxLength: 30,
style: const TextStyle(
color: Colors.black,
),
textAlign: TextAlign.center,
focusNode: sensor.focusNode,
controller: sensor.nameController,
enabled: sensor.editName,
onEditingComplete: () {
// sensor.add(SaveNameEvent(context: context));
},
decoration: const InputDecoration(
hintText: "Your Name",
border: InputBorder.none,
fillColor: Colors.white10,
counterText: '',
),
),
),
),
const SizedBox(width: 5),
InkWell(
onTap: () {
sensor
.add(const ChangeNameEvent(value: true));
},
child: const Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: Icon(
Icons.edit_outlined,
size: 20,
color: ColorsManager.textPrimaryColor,
),
),
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Smart Device Information',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
padding: const EdgeInsets.all(20),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => LocationFourScenePage(
space: spaces!.first,
)),
);
},
child: const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(
child: Text('Location'),
),
Row(
children: [
SizedBox(
child: BodyMedium(
text: 'Syncroom',
fontColor: ColorsManager.textGray,
),
),
Icon(
Icons.arrow_forward_ios,
size: 15,
color: ColorsManager.textGray,
),
],
)
],
),
),
)
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,526 @@
import 'package:flutter/cupertino.dart';
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/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/faq_four_scene_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_create_group.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_delete_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_profile_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_update_dialog.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_update_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/share_four_scene_page.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_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';
class FourSceneSettings extends StatelessWidget {
final DeviceModel? device;
const FourSceneSettings({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Settings',
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: ListView(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10,
),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const FourSceneProfilePage(),
),
);
},
child: Stack(
children: [
const Column(
crossAxisAlignment:
CrossAxisAlignment.stretch,
children: [
SizedBox(height: 20),
DefaultContainer(
borderRadius:
BorderRadius.all(Radius.circular(30)),
child: Padding(
padding: EdgeInsets.all(10.0),
child: Padding(
padding: EdgeInsets.only(left: 90),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
BodyMedium(
text: '4 Scene Switch',
fontWeight: FontWeight.bold,
),
SizedBox(
height: 5,
),
BodySmall(
text: "Room: Syncrow"),
],
),
Icon(Icons.edit_sharp)
],
),
),
),
),
],
),
Positioned(
top: 0,
left: 20,
child: CircleAvatar(
radius: 43,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 40,
backgroundColor: Colors.white,
child: CircleAvatar(
radius: 40,
backgroundColor:
ColorsManager.backgroundColor,
child: SvgPicture.asset(
Assets.sixSceneIcon,
fit: BoxFit.fill,
),
),
)),
),
],
),
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Device Management',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onTap: () {
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) =>
// const FourSceneInfoPage()),
// );
},
text: 'Device Information',
icon: Assets.infoIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
ShareFourScenePage(
device: device!)),
);
},
text: 'Tap-to Run and Automation',
icon: Assets.tapRunIcon,
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Device Offline Notification',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onChanged: (p0) {},
isNotification: true,
onTap: () {},
text: 'Offline Notification',
icon: Assets.notificationIcon,
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Others',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(height: 5),
DefaultContainer(
child: Column(
children: [
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
ShareFourScenePage(
device: device!)),
);
},
text: 'Share Device',
icon: Assets.shareIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
FourSceneCreateGroup(
device: device!)),
);
},
text: 'Create Group',
icon: Assets.createGroupIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
FaqFourScenePage(device: device!)),
);
},
text: 'Device FAQ',
icon: Assets.faqIcon,
),
const Divider(
color: ColorsManager.dividerColor,
),
SettingWidget(
onTapUpdate: () {
showDialog(
context: context,
builder: (context) {
return UpdateInfoDialog(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context).pop();
},
);
},
);
},
isUpdate: true,
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const FourSceneUpdatePage()),
);
},
text: 'Device Update',
icon: Assets.updateIcon,
),
],
),
),
const SizedBox(height: 20),
InkWell(
onTap: () {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const BodyMedium(
text: 'Remove Device',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: ColorsManager.red,
),
const SizedBox(height: 10),
const SizedBox(
width: 250,
child: Divider(
color: ColorsManager.dividerColor,
),
),
const SizedBox(height: 10),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
showDialog(
context: context,
builder: (context) {
return DisconnectDeviceDialog(
cancelTab: () {
Navigator.of(context)
.pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context)
.pop();
},
);
},
);
},
child: const BodyMedium(
text: 'Disconnect Device',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager
.textPrimaryColor,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
)
],
),
const SizedBox(height: 20),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
showDialog(
context: context,
builder: (context) {
return DisconnectWipeData(
cancelTab: () {
Navigator.of(context)
.pop();
},
confirmTab: () {
// context
// .read<
// CreateSceneBloc>()
// .add(DeleteSceneEvent(
// sceneId: sceneId,
// unitUuid: HomeCubit
// .getInstance()
// .selectedSpace!
// .id!,
// ));
Navigator.of(context)
.pop();
},
);
},
);
},
child: const BodyMedium(
text:
'Disconnect Device and Wipe Data',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager
.textPrimaryColor,
),
),
const Icon(
Icons.keyboard_arrow_right,
color: ColorsManager.textGray,
)
],
),
],
),
);
},
);
},
child: const Center(
child: BodyMedium(
text: 'Remove Device',
fontWeight: FontWeight.w400,
fontSize: 15,
fontColor: ColorsManager.red,
),
),
),
],
),
);
},
),
),
);
}
}
class SettingWidget extends StatelessWidget {
final String? text;
final bool? isUpdate;
final bool? isNotification;
final String? icon;
final Function()? onTap;
final Function()? onTapUpdate;
final Function(bool)? onChanged;
const SettingWidget(
{super.key,
this.text,
this.icon,
this.onTap,
this.isUpdate,
this.onChanged,
this.isNotification = false,
this.onTapUpdate});
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
Expanded(
flex: 2,
child: Container(
padding: EdgeInsets.all(8),
decoration: const BoxDecoration(
color: ColorsManager.primaryColor,
borderRadius: BorderRadius.all(Radius.circular(20))),
child: SvgPicture.asset(
icon!,
fit: BoxFit.none,
height: 30,
),
),
),
const SizedBox(
width: 8,
),
Expanded(
flex: isUpdate == true ? 5 : 10,
child: BodyMedium(
text: text!,
fontSize: 15,
fontWeight: FontWeight.w400,
)),
],
),
),
isUpdate == true
? InkWell(
onTap: onTapUpdate,
child: BodyMedium(
text: '1 Update Available',
fontSize: 13,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blueColor,
),
)
: SizedBox(),
isNotification == false
? const Icon(
Icons.arrow_forward_ios,
color: ColorsManager.graysColor,
size: 20,
)
: Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: true,
onChanged: onChanged,
applyTheme: true,
),
),
],
),
);
}
}

View File

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class UpdateInfoDialog extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const UpdateInfoDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
BodyLarge(
text: 'Update Available',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.switchButton.withOpacity(0.6),
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'An update is available for your device. Version 2.1.0 includes new features and important fixes to enhance performance and security.',
textAlign: TextAlign.center,
)),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Remind me later',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Update Now',
style: TextStyle(
color:
ColorsManager.switchButton.withOpacity(0.6),
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class upDateNote extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const upDateNote({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(
height: 10,
),
BodyLarge(
text: 'Update Note',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.switchButton.withOpacity(0.6),
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
color: ColorsManager.textGray,
),
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20),
child: Column(
children: [
Center(
child: Text(
'This update may take a long time. Make sure that the device is fully charged. The device will be unavailable during the update.',
textAlign: TextAlign.center,
)),
],
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: SizedBox(
child: InkWell(
onTap: cancelTab,
child: const Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textGray,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(
color: ColorsManager.textGray,
width: 0.5,
),
top: BorderSide(
color: ColorsManager.textGray,
width: 1.0,
),
)),
child: InkWell(
onTap: confirmTab,
child: Padding(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: Text(
'Start Update',
style: TextStyle(
color:
ColorsManager.switchButton.withOpacity(0.6),
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
)),
))
],
)
],
),
);
}
}

View File

@ -0,0 +1,345 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_setting/four_scene_update_note.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FourSceneUpdatePage extends StatelessWidget {
const FourSceneUpdatePage({super.key});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Update',
child: BlocProvider(
create: (context) =>
FourSceneBloc(fourSceneId: '')..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {},
child: Column(
children: [
// SizedBox(
// height: MediaQuery.of(context).size.height * 0.15,
// ),
DefaultContainer(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 50,
child: ListTile(
contentPadding: EdgeInsets.zero,
leading: SizedBox(
width: 200,
child: Row(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: const BoxDecoration(
color: ColorsManager
.primaryColor,
borderRadius:
BorderRadius.all(
Radius.circular(50))),
child: SvgPicture.asset(
Assets.checkUpdateIcon,
fit: BoxFit.fill,
height: 25,
),
),
const SizedBox(
width: 10,
),
InkWell(
onTap: () {},
child: const BodyMedium(
text: 'Automatic Update',
fontWeight: FontWeight.normal,
),
),
],
),
),
trailing: Container(
width: 100,
child: Row(
mainAxisAlignment:
MainAxisAlignment.end,
children: [
const BodyMedium(
text: 'Off',
fontColor: ColorsManager.textGray,
),
Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: true,
onChanged: (value) {},
applyTheme: true,
),
),
],
),
)),
),
],
),
),
const SizedBox(
height: 10,
),
UpdateSosContainerWithProgressBar(
sosDescription:
'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.',
sosVersion: 'SOS v2.0.5',
),
// const UpdatedContainer(
// sosVersion: 'SOS v1.0.13',
// sosDescription: 'SOS is up to date',
// ),
// const NewUpdateContainer(
// sosVersion: 'SOS v2.0.5',
// sosDescription:
// 'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.',
// ),
const SizedBox(
height: 15,
),
],
));
},
),
));
}
}
class UpdatedContainer extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const UpdatedContainer({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return DefaultContainer(
height: MediaQuery.of(context).size.height * 0.35,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.blackColor,
),
],
),
],
),
),
);
}
}
class NewUpdateContainer extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const NewUpdateContainer({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return DefaultContainer(
height: MediaQuery.of(context).size.height * 0.50,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
const BodyMedium(
text: 'New Update Available Now!',
fontColor: ColorsManager.blueColor,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
Container(
width: MediaQuery.of(context).size.width * 0.7,
child: BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: DefaultButton(
borderRadius: 25,
backgroundColor: ColorsManager.blueColor1,
height: 150,
onPressed: () {
showDialog(
context: context,
builder: (context) {
return upDateNote(
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: () {
Navigator.of(context).pop();
},
);
},
);
},
child: const BodyMedium(
text: 'Update Now',
fontColor: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w700,
textAlign: TextAlign.center,
),
),
)
],
),
],
),
),
);
}
}
class UpdateSosContainerWithProgressBar extends StatelessWidget {
final String? sosVersion;
final String? sosDescription;
const UpdateSosContainerWithProgressBar({
this.sosVersion,
this.sosDescription,
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
DefaultContainer(
height: MediaQuery.of(context).size.height * 0.50,
child: Padding(
padding: const EdgeInsets.all(25),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SvgPicture.asset(
Assets.emptyUpdateIcon,
fit: BoxFit.fill,
),
BodyMedium(
text: 'New Update Available Now!',
fontColor: ColorsManager.blueColor,
),
BodyMedium(
text: sosVersion!,
fontColor: ColorsManager.primaryTextColor,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: BodyMedium(
text: sosDescription!,
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
LinearPercentIndicator(
barRadius: Radius.circular(10),
width: 170.0,
animation: true,
animationDuration: 1000,
lineHeight: 5.0,
percent: 0.2,
linearStrokeCap: LinearStrokeCap.butt,
progressColor: ColorsManager.blueColor1,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: const BodyMedium(
text: 'Downloading Update please be patient',
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
),
],
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: const BodyMedium(
text:
'Please keep the power of the device connected during the upgrade process.',
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
);
}
}

View File

@ -0,0 +1,202 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_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_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import '../../../../bloc/four_scene_bloc/four_scene_event.dart';
class LocationFourScenePage extends StatefulWidget {
final SpaceModel? space;
LocationFourScenePage({super.key, this.space});
@override
_LocationFourScenePageState createState() => _LocationFourScenePageState();
}
class _LocationFourScenePageState extends State<LocationFourScenePage> {
String _selectedOption = 'Conference Room';
bool _hasSelectionChanged = false;
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Location',
actions: [
InkWell(
onTap: _hasSelectionChanged
? () {
print('Save button clicked');
}
: null,
child: BodyMedium(
text: 'Save',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: _hasSelectionChanged
? ColorsManager.slidingBlueColor
: ColorsManager.primaryTextColor,
),
),
const SizedBox(width: 20),
],
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: '')
..add(FetchRoomsEvent(unit: widget.space!)),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
List<SubSpaceModel>? rooms = [];
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is FetchRoomsState) {
rooms = state.roomsList;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: ListView(
padding: const EdgeInsets.symmetric(vertical: 20),
children: [
const BodyMedium(
text: 'Smart Device Location',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(height: 5),
DefaultContainer(
padding: const EdgeInsets.all(20),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: rooms!.length,
itemBuilder: (context, index) {
final room = rooms![index];
return Column(
children: [
_buildCheckboxOption(
label: room.name!,
onTap: (v) {
setState(() {
_selectedOption = v;
_hasSelectionChanged = true;
});
},
),
if (index < rooms.length - 1) ...[
const SizedBox(height: 10),
const Divider(
color: ColorsManager.dividerColor,
),
const SizedBox(height: 10),
],
],
);
},
),
),
],
),
);
},
),
),
);
}
Widget _buildCheckboxOption(
{required String label, required Function(String) onTap}) {
return Padding(
padding: const EdgeInsets.only(bottom: 10, top: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BodyMedium(
text: label,
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w400),
),
CircularCheckbox(
value: _selectedOption == label,
onChanged: (bool? value) {
if (value == true) {
setState(() {
_selectedOption = label;
_hasSelectionChanged = true;
});
onTap(label);
}
},
),
],
),
);
}
}
class CircularCheckbox extends StatefulWidget {
final bool value;
final ValueChanged<bool?> onChanged;
CircularCheckbox({required this.value, required this.onChanged});
@override
_CircularCheckboxState createState() => _CircularCheckboxState();
}
class _CircularCheckboxState extends State<CircularCheckbox> {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
widget.onChanged(!widget.value);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: widget.value
? ColorsManager.primaryColorWithOpacity.withOpacity(0.01)
: Colors.grey,
width: 2.0,
),
color: widget.value
? ColorsManager.primaryColorWithOpacity
: Colors.transparent,
),
width: 24.0,
height: 24.0,
child: widget.value
? const Icon(
Icons.check,
color: Colors.white,
size: 16.0,
)
: null,
),
);
}
}

View File

@ -0,0 +1,149 @@
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/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_question_model.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class QuestionPageFourScene extends StatelessWidget {
final FourSceneQuestionModel? questionModel;
const QuestionPageFourScene({super.key, this.questionModel});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) =>
FourSceneBloc(fourSceneId: '')..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: Column(
children: [
DefaultContainer(
padding: EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BodyLarge(
text: questionModel!.question,
fontSize: 22,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
SizedBox(
height: 15,
),
BodyMedium(
text: questionModel!.answer,
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbUp,
fit: BoxFit.fill,
),
SizedBox(
width: 10,
),
BodyMedium(
text: 'Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
SizedBox(
height: 15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbDown,
fit: BoxFit.fill,
),
SizedBox(
width: 10,
),
BodyMedium(
text: 'Not Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
],
));
},
),
),
);
}
}

View File

@ -0,0 +1,103 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/four_scene_model.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class ShareFourScenePage extends StatelessWidget {
final DeviceModel? device;
const ShareFourScenePage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Share Device',
child: BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensor = BlocProvider.of<FourSceneBloc>(context);
FourSceneModel model = FourSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is LoadingNewSate
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const FourSceneInitial());
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const BodyLarge(
text: 'Sharing Method Not Supported',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
const BodyMedium(
text:
'Currently, you cannot use the specified method to share Bluetooth mesh devices Zigbee devices, infrared devices, Bluetooth Beacon Devices, and certain Bluetooth LE devices with other users.',
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
const SizedBox(
height: 10,
),
const BodyLarge(
text: 'Recommended Sharing Method',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
const BodyMedium(
text:
'If the recipient is a home member or a reliable user, tap Me > Home Management > Add Member and add the recipient to your home. Then, devices in the home can be shared with the recipient in bulk.',
fontSize: 14,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
),
Center(
child: SizedBox(
width: 250,
child: DefaultButton(
backgroundColor: ColorsManager.blueColor1,
borderRadius: 50,
onPressed: () {},
child: Text('Add Home Member')),
),
)
],
));
},
),
),
);
}
}

View File

@ -0,0 +1,286 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/four_scene_bloc/four_scene_state.dart';
import 'package:syncrow_app/features/devices/view/widgets/restart_status_dialog.dart';
import 'package:syncrow_app/features/scene/model/scene_settings_route_arguments.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_medium.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/navigation/navigation_service.dart';
import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FourSelectSceneFourPage extends StatelessWidget {
FourSelectSceneFourPage({super.key});
final TextEditingController _searchController = TextEditingController();
final int? selectedSwitchIndex = 0;
final spaces = HomeCubit.getInstance().spaces;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: '')
..add(LoadScenes(
unit: spaces!.first,
unitId: spaces!.first.id,
showInDevice: false,
)),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensorBloc = BlocProvider.of<FourSceneBloc>(context);
return DefaultScaffold(
title: 'Select Scene',
actions: [_buildSaveButton(context, state, sensorBloc)],
child: state is FourSceneLoadingState
? _buildLoadingIndicator()
: _buildSceneContent(context, sensorBloc),
);
},
),
);
}
// Save button builder
Widget _buildSaveButton(
BuildContext context, FourSceneState state, FourSceneBloc sensorBloc) {
final bool canSave =
state is OptionSelectedState && state.hasSelectionChanged;
return GestureDetector(
onTap: canSave
? () {
print('object');
context.read<FourSceneBloc>().add(SaveSelectionEvent());
}
: null,
child: BodyMedium(
text: 'Save',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: canSave
? ColorsManager.slidingBlueColor
: ColorsManager.primaryTextColor,
),
);
}
// Loading indicator
Widget _buildLoadingIndicator() {
return const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
);
}
// Main scene content with search bar and grid
Widget _buildSceneContent(BuildContext context, FourSceneBloc sensorBloc) {
return Column(
children: [
_buildSearchBar(sensorBloc),
const SizedBox(height: 20),
Expanded(
child: _buildSceneGrid(sensorBloc),
),
],
);
}
// Search bar widget
Widget _buildSearchBar(FourSceneBloc sensorBloc) {
return TextFormField(
controller: _searchController,
onChanged: (value) {
sensorBloc.add(SearchScenesEvent(query: value));
},
decoration: InputDecoration(
hintText: 'Search',
hintStyle: const TextStyle(
color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
suffixIcon: 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),
),
),
);
}
// Scene grid builder
Widget _buildSceneGrid(FourSceneBloc sensorBloc) {
final scenes = sensorBloc.filteredScenes;
return GridView.builder(
itemCount: scenes.length + 1,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
mainAxisExtent: 120,
),
itemBuilder: (context, index) {
if (index == scenes.length) {
return InkWell(
onTap: () => Navigator.pushNamed(
NavigationService.navigatorKey.currentContext!,
Routes.sceneTasksRoute,
arguments: SceneSettingsRouteArguments(
sceneType: '',
sceneId: '',
sceneName: '',
),
),
child: CreateSceneItem(),
);
} else {
final scene = scenes[index];
return SceneItem(
id: scene.id,
value: sensorBloc.selectedSceneId == scene.id,
disablePlayButton: false,
onChanged: (isSelected) {
sensorBloc.selectedSceneId = isSelected ? scene.id : 'null';
sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
},
icon: scene.iconInBytes,
title: scene.name,
);
}
},
);
}
}
class SceneItem extends StatefulWidget {
final String id; // Unique ID for each scene
final Uint8List icon;
final String title;
final bool disablePlayButton;
final bool value;
final Function(bool) onChanged;
const SceneItem({
required this.id,
required this.icon,
required this.title,
this.disablePlayButton = false,
required this.value,
required this.onChanged,
});
@override
State<SceneItem> createState() => _SceneItemState();
}
class _SceneItemState extends State<SceneItem> {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 2,
spreadRadius: 1,
offset: Offset(0, 3),
),
],
),
padding: const EdgeInsets.all(16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (!widget.disablePlayButton)
Image.memory(
widget.icon,
height: 32,
width: 32,
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) => Image.asset(
Assets.assetsIconsLogo,
height: 32,
width: 32,
fit: BoxFit.fill),
),
BodyMedium(
text: widget.title,
style: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
CircularCheckbox(
value: widget.value,
onChanged: (isSelected) => widget.onChanged(isSelected!),
),
],
),
);
}
}
// Widget for the static "Create Scene" button
class CreateSceneItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 5,
spreadRadius: 2,
offset: Offset(0, 3),
),
],
),
padding: const EdgeInsets.all(16),
child: const Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(Icons.add_circle,
color: ColorsManager.grayButtonColors, size: 36),
BodyMedium(
text: 'Create Scene',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w400,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
);
}
}

View File

@ -0,0 +1,145 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/switches_card.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/resource_manager/color_manager.dart';
class FourSelectSwitchDialog extends StatefulWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const FourSelectSwitchDialog({
super.key,
required this.cancelTab,
required this.confirmTab,
});
@override
State<FourSelectSwitchDialog> createState() => _FourSelectSwitchDialogState();
}
class _FourSelectSwitchDialogState extends State<FourSelectSwitchDialog> {
int? selectedSwitchIndex = 0; // State variable to track selected switch
@override
Widget build(BuildContext context) {
return AlertDialog(
backgroundColor: ColorsManager.onPrimaryColor,
contentPadding: EdgeInsets.zero,
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(height: 10),
const BodyLarge(
text: 'Select Switch',
fontWeight: FontWeight.w700,
fontColor: ColorsManager.primaryColor,
fontSize: 16,
),
const Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(color: ColorsManager.textGray),
),
const SizedBox(height: 20),
Row(
children: [
SwitchsCard(
switch1Down: selectedSwitchIndex == -1
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch1Up: selectedSwitchIndex == 1
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Down: selectedSwitchIndex == -2
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Up: selectedSwitchIndex == 2
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
onSwitch1UpTap: () {
setState(() => selectedSwitchIndex = 1);
},
onSwitch1DownTap: () {
setState(() => selectedSwitchIndex = -1);
},
onSwitch2UpTap: () {
setState(() => selectedSwitchIndex = 2);
},
onSwitch2DownTap: () {
setState(() => selectedSwitchIndex = -2);
},
),
],
),
const SizedBox(height: 20),
const Center(
child: Text(
'Please select one of the switches available to continue',
textAlign: TextAlign.center,
),
),
Row(
children: [
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
right:
BorderSide(color: ColorsManager.textGray, width: 0.5),
top: BorderSide(color: ColorsManager.textGray, width: 1.0),
)),
child: SizedBox(
child: InkWell(
onTap: widget.cancelTab,
child: const Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Cancel',
style: TextStyle(
color: ColorsManager.textPrimaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
),
Expanded(
child: Container(
decoration: const BoxDecoration(
border: Border(
left: BorderSide(color: ColorsManager.textGray, width: 0.5),
top: BorderSide(color: ColorsManager.textGray, width: 1.0),
)),
child: InkWell(
onTap: selectedSwitchIndex == 0 ? () {} : widget.confirmTab,
child: Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Next',
style: TextStyle(
color: selectedSwitchIndex == 0
? ColorsManager.textPrimaryColor
.withOpacity(0.6)
: ColorsManager.primaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
],
)
],
),
);
}
}

View File

@ -0,0 +1,131 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FourSwitchsCard extends StatelessWidget {
final String switch1Up;
final String switch1Down;
final String switch2Up;
final String switch2Down;
final VoidCallback onSwitch1UpTap;
final VoidCallback onSwitch1DownTap;
final VoidCallback onSwitch2UpTap;
final VoidCallback onSwitch2DownTap;
FourSwitchsCard({
required this.switch1Down,
required this.switch1Up,
required this.switch2Down,
required this.switch2Up,
required this.onSwitch1UpTap,
required this.onSwitch1DownTap,
required this.onSwitch2UpTap,
required this.onSwitch2DownTap,
});
@override
Widget build(BuildContext context) {
return Expanded(
flex: 4,
child: InkWell(
overlayColor: MaterialStateProperty.all(Colors.transparent),
onTap: () {},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10)),
),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: ColorsManager.onPrimaryColor,
boxShadow: [
BoxShadow(
color: Colors.white.withOpacity(0.1),
blurRadius: 24,
offset: const Offset(-2, -2),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.black.withOpacity(0.11),
blurRadius: 5,
offset: const Offset(2, 0),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.white.withOpacity(0.13),
blurRadius: 10,
offset: const Offset(5, 1),
blurStyle: BlurStyle.inner,
),
],
),
child: SizedBox(
height: 300,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_buildSwitchColumn(switch1Up, switch1Down, onSwitch1UpTap, onSwitch1DownTap),
_buildDivider(),
_buildSwitchColumn(switch2Up, switch2Down, onSwitch2UpTap, onSwitch2DownTap),
],
),
),
),
),
),
],
),
),
);
}
Widget _buildSwitchColumn(
String switchUp,
String switchDown,
VoidCallback onUpTap,
VoidCallback onDownTap,
) {
return Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: onUpTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchUp),
),
),
InkWell(
onTap: onDownTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchDown),
),
),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 3,
color: ColorsManager.dividerColor,
);
}
}

View File

@ -10,6 +10,7 @@ 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/ACs/acs_view.dart';
import 'package:syncrow_app/features/devices/view/widgets/curtains/curtain_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/door_sensor/door_sensor_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_scene_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/garage_door/garage_door_screen.dart'; import 'package:syncrow_app/features/devices/view/widgets/garage_door/garage_door_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_view.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/lights/light_interface.dart';
@ -87,7 +88,6 @@ class RoomPageSwitch extends StatelessWidget {
/// ///
/// The [device] parameter represents the device model. /// The [device] parameter represents the device model.
void showDeviceInterface(DeviceModel device, BuildContext context) { void showDeviceInterface(DeviceModel device, BuildContext context) {
switch (device.productType) { switch (device.productType) {
case DeviceType.AC: case DeviceType.AC:
Navigator.push( Navigator.push(
@ -213,6 +213,13 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
pageBuilder: (context, animation1, animation2) => pageBuilder: (context, animation1, animation2) =>
WaterLeakScreen(device: device))); WaterLeakScreen(device: device)));
case DeviceType.FourScene:
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
FourSceneScreen(device: device)));
break; break;
default: default:
} }

View File

@ -3,7 +3,8 @@ class Assets {
/// Assets for assetsFontsAftikaRegular /// Assets for assetsFontsAftikaRegular
/// assets/fonts/AftikaRegular.ttf /// assets/fonts/AftikaRegular.ttf
static const String assetsFontsAftikaRegular = "assets/fonts/AftikaRegular.ttf"; static const String assetsFontsAftikaRegular =
"assets/fonts/AftikaRegular.ttf";
/// Assets for assetsIcons3GangSwitch /// Assets for assetsIcons3GangSwitch
/// assets/icons/3GangSwitch.svg /// assets/icons/3GangSwitch.svg
@ -19,82 +20,98 @@ class Assets {
/// Assets for assetsIconsAutomatedClock /// Assets for assetsIconsAutomatedClock
/// assets/icons/automated_clock.svg /// assets/icons/automated_clock.svg
static const String assetsIconsAutomatedClock = "assets/icons/automated_clock.svg"; static const String assetsIconsAutomatedClock =
"assets/icons/automated_clock.svg";
static const String acSwitchIcon = "assets/icons/ac_switch_ic.svg"; static const String acSwitchIcon = "assets/icons/ac_switch_ic.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff
/// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff =
"assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff
/// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff =
"assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff
/// assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff =
"assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff
/// assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff =
"assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff
/// assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff =
"assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff
/// assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg /// assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff =
"assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff
/// assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff = static const String
assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff =
"assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg"; "assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff
/// assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg
static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff = static const String
assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff =
"assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg"; "assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff
/// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff =
"assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff
/// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff =
"assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff
/// assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff =
"assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff
/// assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff =
"assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff
/// assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff = static const String
assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff =
"assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg"; "assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff
/// assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg /// assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff = static const String
assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff =
"assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg"; "assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff
/// assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg /// assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg
static const String assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff = static const String
assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff =
"assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg"; "assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg";
/// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOnstlowpmdmOff /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOnstlowpmdmOff
@ -104,37 +121,44 @@ class Assets {
/// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn
/// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn =
"assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn
/// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn =
"assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn
/// assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn =
"assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn
/// assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn =
"assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn
/// assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn =
"assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn
/// assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg /// assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn =
"assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn
/// assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg /// assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg
static const String assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn = static const String
assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn =
"assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg"; "assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOnstlowpmdmOn /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOnstlowpmdmOn
@ -144,37 +168,44 @@ class Assets {
/// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn
/// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn =
"assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn
/// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn =
"assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn
/// assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn =
"assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn
/// assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn =
"assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn
/// assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn = static const String
assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn =
"assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg"; "assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn
/// assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg /// assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn = static const String
assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn =
"assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg"; "assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn
/// assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg /// assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg
static const String assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn = static const String
assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn =
"assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg"; "assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg";
/// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOnstlowpmdmOn /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOnstlowpmdmOn
@ -218,7 +249,8 @@ class Assets {
static const String assetsIconsCurtainsIconVerticalBlade = static const String assetsIconsCurtainsIconVerticalBlade =
"assets/icons/curtainsIcon/left_vertical_blade.svg"; "assets/icons/curtainsIcon/left_vertical_blade.svg";
static const String rightVerticalBlade = "assets/icons/curtainsIcon/right_vertical_blade.svg"; static const String rightVerticalBlade =
"assets/icons/curtainsIcon/right_vertical_blade.svg";
/// Assets for assetsIconsDashboard /// Assets for assetsIconsDashboard
/// assets/icons/dashboard.svg /// assets/icons/dashboard.svg
@ -228,7 +260,8 @@ class Assets {
/// Assets for assetsIconsDashboardFill /// Assets for assetsIconsDashboardFill
/// assets/icons/dashboard-fill.svg /// assets/icons/dashboard-fill.svg
static const String assetsIconsDashboardFill = "assets/icons/dashboard-fill.svg"; static const String assetsIconsDashboardFill =
"assets/icons/dashboard-fill.svg";
/// Assets for assetsIconsDevices /// Assets for assetsIconsDevices
/// assets/icons/Devices.svg /// assets/icons/Devices.svg
@ -244,7 +277,8 @@ class Assets {
/// Assets for assetsIconsDoorLockLinkage /// Assets for assetsIconsDoorLockLinkage
/// assets/icons/DoorLockLinkage.svg /// assets/icons/DoorLockLinkage.svg
static const String assetsIconsDoorLockLinkage = "assets/icons/DoorLockLinkage.svg"; static const String assetsIconsDoorLockLinkage =
"assets/icons/DoorLockLinkage.svg";
/// Assets for assetsIconsDoorLockLock /// Assets for assetsIconsDoorLockLock
/// assets/icons/DoorLockLock.svg /// assets/icons/DoorLockLock.svg
@ -252,15 +286,18 @@ class Assets {
/// Assets for assetsIconsDoorLockMembers /// Assets for assetsIconsDoorLockMembers
/// assets/icons/DoorLockMembers.svg /// assets/icons/DoorLockMembers.svg
static const String assetsIconsDoorLockMembers = "assets/icons/DoorLockMembers.svg"; static const String assetsIconsDoorLockMembers =
"assets/icons/DoorLockMembers.svg";
/// Assets for assetsIconsDoorLockPassword /// Assets for assetsIconsDoorLockPassword
/// assets/icons/DoorLockPassword.svg /// assets/icons/DoorLockPassword.svg
static const String assetsIconsDoorLockPassword = "assets/icons/DoorLockPassword.svg"; static const String assetsIconsDoorLockPassword =
"assets/icons/DoorLockPassword.svg";
/// Assets for assetsIconsDoorLockRecords /// Assets for assetsIconsDoorLockRecords
/// assets/icons/DoorLockRecords.svg /// assets/icons/DoorLockRecords.svg
static const String assetsIconsDoorLockRecords = "assets/icons/DoorLockRecords.svg"; static const String assetsIconsDoorLockRecords =
"assets/icons/DoorLockRecords.svg";
/// Assets for assetsIconsDoorlockAssetsBatteryIndicator /// Assets for assetsIconsDoorlockAssetsBatteryIndicator
/// assets/icons/doorlock-assets/BatteryIndicator.svg /// assets/icons/doorlock-assets/BatteryIndicator.svg
@ -281,7 +318,8 @@ class Assets {
/// assets/icons/doorlock-assets/lockIcon.svg /// assets/icons/doorlock-assets/lockIcon.svg
static const String assetsIconsDoorlockAssetsLockIcon = static const String assetsIconsDoorlockAssetsLockIcon =
"assets/icons/doorlock-assets/lockIcon.svg"; "assets/icons/doorlock-assets/lockIcon.svg";
static const String doorUnlockIcon = "assets/icons/doorlock-assets/door_un_look_ic.svg"; static const String doorUnlockIcon =
"assets/icons/doorlock-assets/door_un_look_ic.svg";
/// Assets for assetsIconsDoorlockAssetsMembersManagement /// Assets for assetsIconsDoorlockAssetsMembersManagement
/// assets/icons/doorlock-assets/members-management.svg /// assets/icons/doorlock-assets/members-management.svg
@ -369,11 +407,13 @@ class Assets {
/// Assets for assetsIconsLightSwitchOff /// Assets for assetsIconsLightSwitchOff
/// assets/icons/lightSwitchOff.svg /// assets/icons/lightSwitchOff.svg
static const String assetsIconsLightSwitchOff = "assets/icons/lightSwitchOff.svg"; static const String assetsIconsLightSwitchOff =
"assets/icons/lightSwitchOff.svg";
/// Assets for assetsIconsLightSwitchOn /// Assets for assetsIconsLightSwitchOn
/// assets/icons/lightSwitchOn.svg /// assets/icons/lightSwitchOn.svg
static const String assetsIconsLightSwitchOn = "assets/icons/lightSwitchOn.svg"; static const String assetsIconsLightSwitchOn =
"assets/icons/lightSwitchOn.svg";
/// Assets for assetsIconsLinkageIconsDoorLockAlarm /// Assets for assetsIconsLinkageIconsDoorLockAlarm
/// assets/icons/linkageIcons/doorLockAlarm.svg /// assets/icons/linkageIcons/doorLockAlarm.svg
@ -382,7 +422,8 @@ class Assets {
/// Assets for assetsIconsLinkTimeLimitedPasswordIcon /// Assets for assetsIconsLinkTimeLimitedPasswordIcon
/// assets/icons/timeLimitedPasswordIcon.svg /// assets/icons/timeLimitedPasswordIcon.svg
static const String timeLimitedPasswordIcon = "assets/icons/timeLimitedPasswordIcon.svg"; static const String timeLimitedPasswordIcon =
"assets/icons/timeLimitedPasswordIcon.svg";
/// Assets for assetsIconsoneTimePassword /// Assets for assetsIconsoneTimePassword
/// assets/icons/oneTimePassword.svg /// assets/icons/oneTimePassword.svg
@ -390,7 +431,8 @@ class Assets {
/// Assets for assetsIconsTimeLimitedPassword /// Assets for assetsIconsTimeLimitedPassword
/// assets/icons/timeLimitedPassword.svg /// assets/icons/timeLimitedPassword.svg
static const String timeLimitedPassword = "assets/icons/timeLimitedPassword.svg"; static const String timeLimitedPassword =
"assets/icons/timeLimitedPassword.svg";
/// Assets for assetsIconsNoValidPasswords /// Assets for assetsIconsNoValidPasswords
/// assets/icons/noValidPasswords.svg /// assets/icons/noValidPasswords.svg
@ -559,11 +601,13 @@ class Assets {
/// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// Assets for assetsIconsPresenceSensorAssetsParameterSettings
/// assets/icons/presence-sensor-assets/space_type_icon.svg /// assets/icons/presence-sensor-assets/space_type_icon.svg
static const String spaceTypeIcon = "assets/icons/presence-sensor-assets/space_type_icon.svg"; static const String spaceTypeIcon =
"assets/icons/presence-sensor-assets/space_type_icon.svg";
/// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// Assets for assetsIconsPresenceSensorAssetsParameterSettings
/// assets/icons/presence-sensor-assets/space_type_icon.svg /// assets/icons/presence-sensor-assets/space_type_icon.svg
static const String sensitivityIcon = "assets/icons/presence-sensor-assets/Sensitivity.svg"; static const String sensitivityIcon =
"assets/icons/presence-sensor-assets/Sensitivity.svg";
/// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// Assets for assetsIconsPresenceSensorAssetsParameterSettings
/// assets/icons/presence-sensor-assets/maximum_distance.svg /// assets/icons/presence-sensor-assets/maximum_distance.svg
@ -596,7 +640,8 @@ class Assets {
/// Assets for assetsIconsRoutinesFill /// Assets for assetsIconsRoutinesFill
/// assets/icons/Routines-fill.svg /// assets/icons/Routines-fill.svg
static const String assetsIconsRoutinesFill = "assets/icons/Routines-fill.svg"; static const String assetsIconsRoutinesFill =
"assets/icons/Routines-fill.svg";
/// Assets for assetsIconsScan /// Assets for assetsIconsScan
/// assets/icons/Scan.svg /// assets/icons/Scan.svg
@ -628,7 +673,8 @@ class Assets {
/// Assets for assetsIconsSustainability /// Assets for assetsIconsSustainability
/// assets/icons/sustainability.svg /// assets/icons/sustainability.svg
static const String assetsIconsSustainability = "assets/icons/sustainability.svg"; static const String assetsIconsSustainability =
"assets/icons/sustainability.svg";
/// Assets for assetsIconsUnlockingMethodsIconsFace /// Assets for assetsIconsUnlockingMethodsIconsFace
/// assets/icons/unlockingMethodsIcons/face.svg /// assets/icons/unlockingMethodsIcons/face.svg
@ -724,7 +770,8 @@ class Assets {
/// Assets for assetsImagesHorizintalBlade /// Assets for assetsImagesHorizintalBlade
/// assets/images/HorizintalBlade.png /// assets/images/HorizintalBlade.png
static const String assetsImagesHorizintalBlade = "assets/images/HorizintalBlade.png"; static const String assetsImagesHorizintalBlade =
"assets/images/HorizintalBlade.png";
/// Assets for assetsImagesLogo /// Assets for assetsImagesLogo
/// assets/images/Logo.svg /// assets/images/Logo.svg
@ -732,7 +779,8 @@ class Assets {
/// Assets for assetsImagesLogoHorizontal /// Assets for assetsImagesLogoHorizontal
/// assets/images/logo_horizontal.png /// assets/images/logo_horizontal.png
static const String assetsImagesLogoHorizontal = "assets/images/logo_horizontal.png"; static const String assetsImagesLogoHorizontal =
"assets/images/logo_horizontal.png";
/// Assets for assetsImagesPause /// Assets for assetsImagesPause
/// assets/images/Pause.png /// assets/images/Pause.png
@ -762,7 +810,8 @@ class Assets {
/// assets/images/Window.png /// assets/images/Window.png
static const String assetsImagesWindow = "assets/images/window_img.svg"; static const String assetsImagesWindow = "assets/images/window_img.svg";
static const String assetsSensitivityFunction = "assets/icons/functions_icons/sensitivity.svg"; static const String assetsSensitivityFunction =
"assets/icons/functions_icons/sensitivity.svg";
//assets/icons/functions_icons/sesitivity_operation_icon.svg //assets/icons/functions_icons/sesitivity_operation_icon.svg
static const String assetsSensitivityOperationIcon = static const String assetsSensitivityOperationIcon =
@ -770,59 +819,73 @@ class Assets {
//assets/icons/functions_icons/ac_power.svg //assets/icons/functions_icons/ac_power.svg
static const String assetsAcPower = "assets/icons/functions_icons/ac_power.svg"; static const String assetsAcPower =
"assets/icons/functions_icons/ac_power.svg";
//assets/icons/functions_icons/ac_power_off.svg //assets/icons/functions_icons/ac_power_off.svg
static const String assetsAcPowerOFF = "assets/icons/functions_icons/ac_power_off.svg"; static const String assetsAcPowerOFF =
"assets/icons/functions_icons/ac_power_off.svg";
//assets/icons/functions_icons/child_lock.svg //assets/icons/functions_icons/child_lock.svg
static const String assetsChildLock = "assets/icons/functions_icons/child_lock.svg"; static const String assetsChildLock =
"assets/icons/functions_icons/child_lock.svg";
//assets/icons/functions_icons/cooling.svg //assets/icons/functions_icons/cooling.svg
static const String assetsFreezing = "assets/icons/functions_icons/freezing.svg"; static const String assetsFreezing =
"assets/icons/functions_icons/freezing.svg";
//assets/icons/functions_icons/fan_speed.svg //assets/icons/functions_icons/fan_speed.svg
static const String assetsFanSpeed = "assets/icons/functions_icons/fan_speed.svg"; static const String assetsFanSpeed =
"assets/icons/functions_icons/fan_speed.svg";
//assets/icons/functions_icons/ac_cooling.svg //assets/icons/functions_icons/ac_cooling.svg
static const String assetsAcCooling = "assets/icons/functions_icons/ac_cooling.svg"; static const String assetsAcCooling =
"assets/icons/functions_icons/ac_cooling.svg";
//assets/icons/functions_icons/ac_heating.svg //assets/icons/functions_icons/ac_heating.svg
static const String assetsAcHeating = "assets/icons/functions_icons/ac_heating.svg"; static const String assetsAcHeating =
"assets/icons/functions_icons/ac_heating.svg";
//assets/icons/functions_icons/celsius_degrees.svg //assets/icons/functions_icons/celsius_degrees.svg
static const String assetsCelsiusDegrees = "assets/icons/functions_icons/celsius_degrees.svg"; static const String assetsCelsiusDegrees =
"assets/icons/functions_icons/celsius_degrees.svg";
//assets/icons/functions_icons/tempreture.svg //assets/icons/functions_icons/tempreture.svg
static const String assetsTempreture = "assets/icons/functions_icons/tempreture.svg"; static const String assetsTempreture =
"assets/icons/functions_icons/tempreture.svg";
//assets/icons/functions_icons/ac_fan_low.svg //assets/icons/functions_icons/ac_fan_low.svg
static const String assetsAcFanLow = "assets/icons/functions_icons/ac_fan_low.svg"; static const String assetsAcFanLow =
"assets/icons/functions_icons/ac_fan_low.svg";
//assets/icons/functions_icons/ac_fan_middle.svg //assets/icons/functions_icons/ac_fan_middle.svg
static const String assetsAcFanMiddle = "assets/icons/functions_icons/ac_fan_middle.svg"; static const String assetsAcFanMiddle =
"assets/icons/functions_icons/ac_fan_middle.svg";
//assets/icons/functions_icons/ac_fan_high.svg //assets/icons/functions_icons/ac_fan_high.svg
static const String assetsAcFanHigh = "assets/icons/functions_icons/ac_fan_high.svg"; static const String assetsAcFanHigh =
"assets/icons/functions_icons/ac_fan_high.svg";
//assets/icons/functions_icons/ac_fan_auto.svg //assets/icons/functions_icons/ac_fan_auto.svg
static const String assetsAcFanAuto = "assets/icons/functions_icons/ac_fan_auto.svg"; static const String assetsAcFanAuto =
"assets/icons/functions_icons/ac_fan_auto.svg";
//assets/icons/functions_icons/scene_child_lock.svg //assets/icons/functions_icons/scene_child_lock.svg
static const String assetsSceneChildLock = "assets/icons/functions_icons/scene_child_lock.svg"; static const String assetsSceneChildLock =
"assets/icons/functions_icons/scene_child_lock.svg";
//assets/icons/functions_icons/scene_child_unlock.svg //assets/icons/functions_icons/scene_child_unlock.svg
@ -831,15 +894,18 @@ class Assets {
//assets/icons/functions_icons/scene_refresh.svg //assets/icons/functions_icons/scene_refresh.svg
static const String assetsSceneRefresh = "assets/icons/functions_icons/scene_refresh.svg"; static const String assetsSceneRefresh =
"assets/icons/functions_icons/scene_refresh.svg";
//assets/icons/functions_icons/light_countdown.svg //assets/icons/functions_icons/light_countdown.svg
static const String assetsLightCountdown = "assets/icons/functions_icons/light_countdown.svg"; static const String assetsLightCountdown =
"assets/icons/functions_icons/light_countdown.svg";
//assets/icons/functions_icons/far_detection.svg //assets/icons/functions_icons/far_detection.svg
static const String assetsFarDetection = "assets/icons/functions_icons/far_detection.svg"; static const String assetsFarDetection =
"assets/icons/functions_icons/far_detection.svg";
//assets/icons/functions_icons/far_detection_function.svg //assets/icons/functions_icons/far_detection_function.svg
@ -848,11 +914,13 @@ class Assets {
//assets/icons/functions_icons/indicator.svg //assets/icons/functions_icons/indicator.svg
static const String assetsIndicator = "assets/icons/functions_icons/indicator.svg"; static const String assetsIndicator =
"assets/icons/functions_icons/indicator.svg";
//assets/icons/functions_icons/motion_detection.svg //assets/icons/functions_icons/motion_detection.svg
static const String assetsMotionDetection = "assets/icons/functions_icons/motion_detection.svg"; static const String assetsMotionDetection =
"assets/icons/functions_icons/motion_detection.svg";
//assets/icons/functions_icons/motionless_detection.svg //assets/icons/functions_icons/motionless_detection.svg
@ -861,15 +929,18 @@ class Assets {
//assets/icons/functions_icons/nobody_time.svg //assets/icons/functions_icons/nobody_time.svg
static const String assetsNobodyTime = "assets/icons/functions_icons/nobody_time.svg"; static const String assetsNobodyTime =
"assets/icons/functions_icons/nobody_time.svg";
//assets/icons/functions_icons/factory_reset.svg //assets/icons/functions_icons/factory_reset.svg
static const String assetsFactoryReset = "assets/icons/functions_icons/factory_reset.svg"; static const String assetsFactoryReset =
"assets/icons/functions_icons/factory_reset.svg";
//assets/icons/functions_icons/master_state.svg //assets/icons/functions_icons/master_state.svg
static const String assetsMasterState = "assets/icons/functions_icons/master_state.svg"; static const String assetsMasterState =
"assets/icons/functions_icons/master_state.svg";
//assets/icons/functions_icons/switch_alarm_sound.svg //assets/icons/functions_icons/switch_alarm_sound.svg
@ -878,7 +949,8 @@ class Assets {
//assets/icons/functions_icons/reset_off.svg //assets/icons/functions_icons/reset_off.svg
static const String assetsResetOff = "assets/icons/functions_icons/reset_off.svg"; static const String assetsResetOff =
"assets/icons/functions_icons/reset_off.svg";
//assets/icons/functions_icons/automation_functions/card_unlock.svg //assets/icons/functions_icons/automation_functions/card_unlock.svg
@ -952,7 +1024,8 @@ class Assets {
//assets/icons/functions_icons/automation_functions/motion.svg //assets/icons/functions_icons/automation_functions/motion.svg
static const String assetsMotion = "assets/icons/functions_icons/automation_functions/motion.svg"; static const String assetsMotion =
"assets/icons/functions_icons/automation_functions/motion.svg";
//assets/icons/functions_icons/automation_functions/current_temp.svg //assets/icons/functions_icons/automation_functions/current_temp.svg
@ -974,27 +1047,33 @@ class Assets {
static const String waterHeaterOn = "assets/icons/water_heater_on.svg"; static const String waterHeaterOn = "assets/icons/water_heater_on.svg";
static const String waterHeaterOff = "assets/icons/water_heater_off.svg"; static const String waterHeaterOff = "assets/icons/water_heater_off.svg";
static const String scheduleCelenderIcon = "assets/icons/schedule_celender_icon.svg"; static const String scheduleCelenderIcon =
static const String scheduleCirculateIcon = "assets/icons/schedule_circulate_icon.svg"; "assets/icons/schedule_celender_icon.svg";
static const String scheduleInchingIcon = "assets/icons/schedule_Inching_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 scheduleTimeIcon = "assets/icons/schedule_time_icon.svg";
static const String waterHeaterIcon = "assets/icons/water_heater_icon.svg"; static const String waterHeaterIcon = "assets/icons/water_heater_icon.svg";
static const String doorOpen = "assets/icons/opened_door.svg"; static const String doorOpen = "assets/icons/opened_door.svg";
static const String doorClose = "assets/icons/closed_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 doorNotificationSetting =
"assets/icons/door_notification_setting_icon.svg";
static const String doorRecordsIcon = "assets/icons/door_records_icon.svg"; static const String doorRecordsIcon = "assets/icons/door_records_icon.svg";
static const String doorSensorIcon = "assets/icons/door_sensor_icon.svg"; static const String doorSensorIcon = "assets/icons/door_sensor_icon.svg";
static const String closedGarageIcon = "assets/icons/closed_garage_door.svg"; static const String closedGarageIcon = "assets/icons/closed_garage_door.svg";
static const String openGarageIcon = "assets/icons/open_garage_door.svg"; static const String openGarageIcon = "assets/icons/open_garage_door.svg";
static const String garageCountdown = "assets/icons/garage_countdown.svg"; static const String garageCountdown = "assets/icons/garage_countdown.svg";
static const String garagePreferencesIcon = "assets/icons/garage_preferences_icon.svg"; static const String garagePreferencesIcon =
"assets/icons/garage_preferences_icon.svg";
static const String garageSchedule = "assets/icons/garage_schedule.svg"; static const String garageSchedule = "assets/icons/garage_schedule.svg";
static const String garageIcon = "assets/icons/garageIcon.svg"; static const String garageIcon = "assets/icons/garageIcon.svg";
static const String normalWaterLeak = "assets/icons/normal_water_leak.svg"; static const String normalWaterLeak = "assets/icons/normal_water_leak.svg";
static const String detectedWaterLeak = "assets/icons/detected_water_leak.svg"; static const String detectedWaterLeak =
"assets/icons/detected_water_leak.svg";
static const String waterLeakIcon = "assets/icons/waterleak_icon.svg"; static const String waterLeakIcon = "assets/icons/waterleak_icon.svg";
static const String leakDetectedIcon = "assets/icons/leak_detected.svg"; static const String leakDetectedIcon = "assets/icons/leak_detected.svg";
@ -1012,5 +1091,32 @@ class Assets {
static const String powerClampIcon = "assets/icons/power_clamp.svg"; static const String powerClampIcon = "assets/icons/power_clamp.svg";
static const String automationIcon = "assets/icons/automation_ic.svg"; static const String automationIcon = "assets/icons/automation_ic.svg";
static const String redSos = "assets/icons/red_sos.svg";
static const String greenSos = "assets/icons/green_sos.svg";
static const String emptyLog = "assets/icons/empty_log.svg";
static const String sosProfileIcon = "assets/icons/sos_profile_icon.svg";
static const String sosEditProfile = "assets/icons/edit_sos_icon.svg";
static const String thumbUp = "assets/icons/thumb_up.svg";
static const String thumbDown = "assets/icons/thumb_down.svg";
static const String shareIcon = "assets/icons/share_icon.svg";
static const String infoIcon = "assets/icons/info.svg";
static const String notificationIcon = "assets/icons/notification_icon.svg";
static const String faqIcon = "assets/icons/faq_icon.svg";
static const String updateIcon = "assets/icons/update_icon.svg";
static const String emptyUpdateIcon = "assets/icons/empty_update_icon.svg";
static const String checkUpdateIcon = "assets/icons/check_update_icon.svg";
static const String switchOn = "assets/icons/switch_on.svg";
static const String switchOff = "assets/icons/switch_off.svg";
static const String backlightIcon = "assets/icons/backlight_icon.svg";
static const String addSwitchIcon = "assets/icons/add_switch_icon.svg";
static const String addSceneIcon = "assets/icons/add_scene_icon.svg";
static const String removeSceneIcon = "assets/icons/remove_scene_icon.svg";
static const String tapRunIcon = "assets/icons/tap_run_icon.svg";
static const String createGroupIcon = "assets/icons/create_group_icon.svg";
static const String sixSceneIcon = "assets/icons/six_scene_icon.svg";
static const String minusIcon = "assets/icons/minus_icon.svg";
static const String addDevicesIcon = "assets/icons/add_devices_icon.svg";
//powerClampIcon //powerClampIcon
} }

View File

@ -65,7 +65,7 @@ class DevicesAPI {
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) => DevicesCategoryModel.fromJsonList(json), expectedResponseModel: (json) => DevicesCategoryModel.fromJsonList(json),
); );
return response; return response;
} }
@ -75,6 +75,7 @@ class DevicesAPI {
.replaceAll('{deviceUuid}', deviceId), .replaceAll('{deviceUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
print('json==#$json');
return json; return json;
}, },
); );
@ -121,6 +122,16 @@ class DevicesAPI {
return response; return response;
} }
static Future getDeviceInfo(String deviceId) async {
final response = await _httpService.get(
path: ApiEndpoints.deviceByUuid.replaceAll('{deviceUuid}', deviceId),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
});
return response;
}
static Future<List<DeviceModel>> getDeviceByGroupName( static Future<List<DeviceModel>> getDeviceByGroupName(
String unitId, String groupName) async { String unitId, String groupName) async {
final response = await _httpService.get( final response = await _httpService.get(

View File

@ -31,5 +31,8 @@ abstract class ColorsManager {
static const Color switchButton = Color(0xff023DFE); static const Color switchButton = Color(0xff023DFE);
static const Color grayBox = Color(0xffF5F5F5); static const Color grayBox = Color(0xffF5F5F5);
static const Color chart = Color(0xff023DFE); static const Color chart = Color(0xff023DFE);
static const Color blueColor = Color(0xff5481F3);
static const Color blueColor1 = Color(0xff0A7AFF);
static const Color grayButtonColors = Color(0xffCCCCCC);
} }
//background: #F5F5F5;023DFE //background: #F5F5F5;023DFE

View File

@ -56,6 +56,7 @@ enum DeviceType {
GarageDoor, GarageDoor,
WaterLeak, WaterLeak,
PC, PC,
FourScene,
Other, Other,
} }
@ -88,11 +89,14 @@ Map<String, DeviceType> devicesTypesMap = {
"GD": DeviceType.GarageDoor, "GD": DeviceType.GarageDoor,
"WL": DeviceType.WaterLeak, "WL": DeviceType.WaterLeak,
"PC": DeviceType.PC, "PC": DeviceType.PC,
"4S": DeviceType.FourScene,
}; };
Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = { Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
DeviceType.AC: [ DeviceType.AC: [
FunctionModel( FunctionModel(
code: 'switch', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'mode', code: 'mode',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -115,7 +119,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
// "range": ["low", "middle", "high", "auto"] // "range": ["low", "middle", "high", "auto"]
})), })),
FunctionModel( FunctionModel(
code: 'child_lock', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'child_lock',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
], ],
DeviceType.Gateway: [ DeviceType.Gateway: [
FunctionModel( FunctionModel(
@ -129,7 +135,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
"range": ["normal", "alarm"] "range": ["normal", "alarm"]
})), })),
FunctionModel( FunctionModel(
code: 'factory_reset', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'factory_reset',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'alarm_active', code: 'alarm_active',
type: functionTypesMap['String'], type: functionTypesMap['String'],
@ -139,7 +147,8 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
FunctionModel( FunctionModel(
code: 'sensitivity', code: 'sensitivity',
type: functionTypesMap['Integer'], 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: [ DeviceType.DoorLock: [
FunctionModel( FunctionModel(
@ -147,7 +156,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
type: functionTypesMap['Raw'], type: functionTypesMap['Raw'],
values: ValueModel.fromJson({})), values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'remote_no_dp_key', type: functionTypesMap['Raw'], values: ValueModel.fromJson({})), code: 'remote_no_dp_key',
type: functionTypesMap['Raw'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'normal_open_switch', code: 'normal_open_switch',
type: functionTypesMap['Boolean'], type: functionTypesMap['Boolean'],
@ -157,64 +168,87 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
FunctionModel( FunctionModel(
code: 'far_detection', code: 'far_detection',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'presence_time', code: 'presence_time',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: values: ValueModel.fromJson(
ValueModel.fromJson({"unit": "Min", "min": 0, "max": 65535, "scale": 0, "step": 1})), {"unit": "Min", "min": 0, "max": 65535, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'motion_sensitivity_value', code: 'motion_sensitivity_value',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'motionless_sensitivity', code: 'motionless_sensitivity',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'indicator', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'indicator',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
], ],
DeviceType.OneGang: [ DeviceType.OneGang: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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: [ DeviceType.TwoGang: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_2',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_2', code: 'countdown_2',
type: functionTypesMap['Integer'], 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: [ DeviceType.ThreeGang: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_2',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_3', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_3',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_2', code: 'countdown_2',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_3', code: 'countdown_3',
type: functionTypesMap['Integer'], 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: [ DeviceType.Curtain: [
FunctionModel( FunctionModel(
@ -226,15 +260,19 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
FunctionModel( FunctionModel(
code: 'percent_control', code: 'percent_control',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "%", "min": 0, "max": 100, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "%", "min": 0, "max": 100, "scale": 0, "step": 1})),
], ],
DeviceType.WH: [ DeviceType.WH: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'relay_status', code: 'relay_status',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -258,7 +296,9 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
], ],
DeviceType.DS: [ DeviceType.DS: [
FunctionModel( FunctionModel(
code: 'doorcontact_state', type: functionTypesMap['Raw'], values: ValueModel.fromJson({})), code: 'doorcontact_state',
type: functionTypesMap['Raw'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'battery_percentage', code: 'battery_percentage',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
@ -266,11 +306,14 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
], ],
DeviceType.OneTouch: [ DeviceType.OneTouch: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'relay_status', code: 'relay_status',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -292,17 +335,23 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
], ],
DeviceType.TowTouch: [ DeviceType.TowTouch: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_2',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_2', code: 'countdown_2',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'relay_status', code: 'relay_status',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -330,23 +379,32 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
], ],
DeviceType.ThreeTouch: [ DeviceType.ThreeTouch: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_2', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_2',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'switch_3', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_3',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_2', code: 'countdown_2',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'countdown_3', code: 'countdown_3',
type: functionTypesMap['Integer'], 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( FunctionModel(
code: 'relay_status', code: 'relay_status',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -380,19 +438,24 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
], ],
DeviceType.GarageDoor: [ DeviceType.GarageDoor: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'tr_timecon', code: 'tr_timecon',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 120, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 120, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'countdown_alarm', code: 'countdown_alarm',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'door_control_1', code: 'door_control_1',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -413,19 +476,24 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
DeviceType.WaterLeak: [], DeviceType.WaterLeak: [],
DeviceType.PC: [ DeviceType.PC: [
FunctionModel( FunctionModel(
code: 'switch_1', type: functionTypesMap['Boolean'], values: ValueModel.fromJson({})), code: 'switch_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({})),
FunctionModel( FunctionModel(
code: 'countdown_1', code: 'countdown_1',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'tr_timecon', code: 'tr_timecon',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 120, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 120, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'countdown_alarm', code: 'countdown_alarm',
type: functionTypesMap['Integer'], type: functionTypesMap['Integer'],
values: ValueModel.fromJson({"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})), values: ValueModel.fromJson(
{"unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1})),
FunctionModel( FunctionModel(
code: 'door_control_1', code: 'door_control_1',
type: functionTypesMap['Enum'], type: functionTypesMap['Enum'],
@ -443,6 +511,40 @@ Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
"range": ["unclosed_time", "close_time_alarm", "none"] "range": ["unclosed_time", "close_time_alarm", "none"]
})), })),
], ],
DeviceType.FourScene: [
FunctionModel(
code: 'scene_1',
type: functionTypesMap['Boolean'],
values: ValueModel.fromJson({
"range": ["scene"]
})),
FunctionModel(
code: 'scene_2',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson({
"range": ["scene"]
})),
FunctionModel(
code: 'scene_3',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson({
"range": ["scene"]
})),
FunctionModel(
code: 'scene_4',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson({
"range": ["scene"]
})),
FunctionModel(
code: 'scene_id_group_id',
type: functionTypesMap['Raw'],
values: ValueModel.fromJson({})),
FunctionModel(
code: 'switch_backlight',
type: functionTypesMap['Enum'],
values: ValueModel.fromJson({})),
]
}; };
enum TempModes { hot, cold, wind } enum TempModes { hot, cold, wind }
@ -588,7 +690,11 @@ List<Map<String, Object>> menuSections = [
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsMessages, 'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsMessages,
'page': null 'page': null
}, },
{'title': 'FAQs', 'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsFAQs, 'page': null}, {
'title': 'FAQs',
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsFAQs,
'page': null
},
{ {
'title': 'Help & Feedback', 'title': 'Help & Feedback',
'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsHelpAndFeedback, 'Icon': Assets.assetsIconsMenuIconsMessagesCenterIconsHelpAndFeedback,
@ -618,7 +724,11 @@ List<Map<String, Object>> menuSections = [
'title': 'Legal Information', 'title': 'Legal Information',
'color': const Color(0xFF001B72), 'color': const Color(0xFF001B72),
'buttons': [ 'buttons': [
{'title': 'About', 'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsAbout, 'page': null}, {
'title': 'About',
'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsAbout,
'page': null
},
{ {
'title': 'Privacy Policy', 'title': 'Privacy Policy',
'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsPrivacyPolicy, 'Icon': Assets.assetsIconsMenuIconsLeagalInfoIconsPrivacyPolicy,

View File

@ -704,6 +704,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.1" version: "2.2.1"
percent_indicator:
dependency: "direct main"
description:
name: percent_indicator
sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c
url: "https://pub.dev"
source: hosted
version: "4.2.3"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -46,6 +46,7 @@ dependencies:
device_info_plus: ^10.1.0 device_info_plus: ^10.1.0
fl_chart: ^0.69.0 fl_chart: ^0.69.0
firebase_database: ^10.5.7 firebase_database: ^10.5.7
percent_indicator: ^4.2.3
dev_dependencies: dev_dependencies: