Merge pull request #64 from SyncrowIOT/4_scene_&_6_scene_devices

4 scene & 6 scene devices
This commit is contained in:
mohammadnemer1
2024-12-02 11:25:19 +03:00
committed by GitHub
93 changed files with 9798 additions and 284 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,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_7077)">
<path d="M14.06 9.02L14.98 9.94L5.92 19H5V18.08L14.06 9.02ZM17.66 3C17.41 3 17.15 3.1 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C18.17 3.09 17.92 3 17.66 3ZM14.06 6.19L3 17.25V21H6.75L17.81 9.94L14.06 6.19Z" fill="#999999"/>
</g>
<defs>
<clipPath id="clip0_4487_7077">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 517 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,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,9 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38.0142 39.2553L35.3682 40H20.9308H19.9999H19.0691H1.24111C0.555643 40 0 39.4444 0 38.7589V1.24111C0 0.555643 0.555643 0 1.24111 0H19.0682H20.1226H20.9543H35.4255L38.2625 1.24111C38.9479 1.24111 39.5036 1.79675 39.5036 2.48221L39.2553 38.0142C39.2553 38.6997 38.6997 39.2553 38.0142 39.2553Z" fill="#E9E9E9"/>
<path d="M38.7589 0H35.0356C35.721 0 36.2767 0.555643 36.2767 1.24111V38.7589C36.2767 39.4444 35.721 40 35.0356 40H38.7589C39.4444 40 40 39.4444 40 38.7589V1.24111C40 0.555643 39.4444 0 38.7589 0Z" fill="#D1D1D1"/>
<path opacity="0.6" d="M12.0284 31.8319V33.3213C12.0284 34.0067 11.6087 34.5624 11.0909 34.5624H6.96594C6.44816 34.5624 6.02844 34.0067 6.02844 33.3213V31.8319C6.02844 31.1465 6.44816 30.5908 6.96594 30.5908H11.0909C11.6087 30.5908 12.0284 31.1465 12.0284 31.8319Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M12.0284 7.24111V8.73044C12.0284 9.4159 11.6087 9.97154 11.0909 9.97154H6.96594C6.44816 9.97154 6.02844 9.4159 6.02844 8.73044V7.24111C6.02844 6.55565 6.44816 6 6.96594 6H11.0909C11.6087 6 12.0284 6.55565 12.0284 7.24111Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M26.0285 31.8319V33.3213C26.0285 34.0067 26.4482 34.5624 26.966 34.5624H31.091C31.6088 34.5624 32.0285 34.0067 32.0285 33.3213V31.8319C32.0285 31.1465 31.6088 30.5908 31.091 30.5908H26.966C26.4482 30.5908 26.0285 31.1465 26.0285 31.8319Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M26.0285 7.24111V8.73044C26.0285 9.4159 26.4482 9.97154 26.966 9.97154H31.091C31.6088 9.97154 32.0285 9.4159 32.0285 8.73044V7.24111C32.0285 6.55565 31.6088 6 31.091 6H26.966C26.4482 6 26.0285 6.55565 26.0285 7.24111Z" fill="#023DFE" fill-opacity="0.5"/>
<path d="M19.0691 0H20.9308V40H19.0691V0Z" fill="#D1D1D1"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,67 @@
<svg width="92" height="97" viewBox="0 0 92 97" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d_4487_4172)">
<path d="M8.65399 9.63292C8.65399 8.1788 9.83279 7 11.2869 7H81.0593C82.5134 7 83.6922 8.1788 83.6922 9.63292V72.823C83.6922 74.2771 82.5134 75.4559 81.0593 75.4559H11.2869C9.83279 75.4559 8.65399 74.2771 8.65399 72.823V9.63292Z" fill="white"/>
</g>
<g filter="url(#filter1_d_4487_4172)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M81.0593 7.26329H11.2869C9.9782 7.26329 8.91728 8.32421 8.91728 9.63292V72.823C8.91728 74.1317 9.9782 75.1926 11.2869 75.1926H81.0593C82.368 75.1926 83.4289 74.1317 83.4289 72.823V9.63292C83.4289 8.32421 82.368 7.26329 81.0593 7.26329ZM11.2869 7C9.83279 7 8.65399 8.1788 8.65399 9.63292V72.823C8.65399 74.2771 9.83279 75.4559 11.2869 75.4559H81.0593C82.5134 75.4559 83.6922 74.2771 83.6922 72.823V9.63292C83.6922 8.1788 82.5134 7 81.0593 7H11.2869Z" fill="#E4E4E4"/>
</g>
<g filter="url(#filter2_d_4487_4172)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.1726 75.1923L46.1726 7.26294H46.4359L46.4359 75.1923H46.1726Z" fill="#E4E4E4"/>
</g>
<path d="M26.8888 18.4212C26.8895 18.4654 26.9031 18.5083 26.9279 18.5448C26.9527 18.5813 26.9876 18.6098 27.0284 18.6267C27.3928 18.7871 27.7009 19.0527 27.9133 19.3894C28.1257 19.7262 28.2325 20.1187 28.2202 20.5167C28.2116 21.0463 27.993 21.5509 27.6123 21.9194C27.2317 22.2878 26.7203 22.49 26.1907 22.4814C25.661 22.4728 25.1564 22.2541 24.788 21.8735C24.4195 21.4929 24.2174 20.9815 24.2259 20.4519C24.2265 20.0649 24.3394 19.6864 24.551 19.3625C24.7625 19.0385 25.0637 18.783 25.4178 18.6269C25.4586 18.6099 25.4935 18.5814 25.5183 18.5448C25.5431 18.5082 25.5567 18.4652 25.5574 18.421C25.5574 18.3847 25.5485 18.3489 25.5315 18.3167C25.5145 18.2846 25.4899 18.2572 25.4598 18.2368C25.4296 18.2165 25.395 18.2038 25.3589 18.2C25.3227 18.1962 25.2862 18.2013 25.2525 18.2149C24.7375 18.4381 24.3152 18.832 24.0567 19.3303C23.7982 19.8285 23.7193 20.4006 23.8334 20.9502C23.9474 21.4998 24.2473 21.9933 24.6826 22.3476C25.118 22.7019 25.6621 22.8953 26.2234 22.8953C26.7847 22.8953 27.3288 22.7019 27.7642 22.3476C28.1995 21.9933 28.4994 21.4998 28.6135 20.9502C28.7275 20.4006 28.6486 19.8285 28.3901 19.3303C28.1316 18.832 27.7093 18.4381 27.1943 18.2149C27.1606 18.2011 27.124 18.1959 27.0877 18.1997C27.0515 18.2035 27.0167 18.2161 26.9865 18.2365C26.9563 18.2569 26.9316 18.2844 26.9145 18.3166C26.8975 18.3489 26.8886 18.3848 26.8888 18.4212Z" fill="#6488FB"/>
<path d="M26.4447 17.7893C26.4447 17.6667 26.3453 17.5674 26.2228 17.5674C26.1002 17.5674 26.0009 17.6667 26.0009 17.7893V19.1207C26.0009 19.2433 26.1002 19.3426 26.2228 19.3426C26.3453 19.3426 26.4447 19.2433 26.4447 19.1207V17.7893Z" fill="#6488FB"/>
<path d="M26.8884 60.2491C26.8891 60.2932 26.9027 60.3362 26.9275 60.3727C26.9523 60.4092 26.9872 60.4377 27.028 60.4546C27.3924 60.6149 27.7006 60.8805 27.9129 61.2173C28.1253 61.5541 28.2322 61.9466 28.2198 62.3445C28.2112 62.8742 27.9926 63.3788 27.612 63.7472C27.2314 64.1157 26.72 64.3179 26.1903 64.3093C25.6606 64.3007 25.1561 64.082 24.7876 63.7014C24.4192 63.3208 24.217 62.8094 24.2256 62.2797C24.2261 61.8928 24.339 61.5143 24.5506 61.1904C24.7622 60.8664 25.0633 60.6108 25.4174 60.4548C25.4582 60.4378 25.4931 60.4093 25.5179 60.3727C25.5427 60.3361 25.5563 60.2931 25.557 60.2489C25.5571 60.2125 25.5482 60.1767 25.5312 60.1446C25.5141 60.1125 25.4895 60.0851 25.4594 60.0647C25.4293 60.0444 25.3946 60.0317 25.3585 60.0279C25.3223 60.024 25.2858 60.0291 25.2521 60.0427C24.7371 60.266 24.3148 60.6599 24.0563 61.1582C23.7979 61.6564 23.719 62.2285 23.833 62.7781C23.947 63.3276 24.2469 63.8212 24.6823 64.1755C25.1176 64.5297 25.6617 64.7232 26.223 64.7232C26.7843 64.7232 27.3285 64.5297 27.7638 64.1755C28.1991 63.8212 28.4991 63.3276 28.6131 62.7781C28.7271 62.2285 28.6482 61.6564 28.3897 61.1582C28.1312 60.6599 27.7089 60.266 27.194 60.0427C27.1602 60.029 27.1236 60.0238 27.0873 60.0276C27.0511 60.0313 27.0163 60.044 26.9861 60.0644C26.9559 60.0848 26.9312 60.1123 26.9142 60.1445C26.8971 60.1767 26.8883 60.2127 26.8884 60.2491Z" fill="#6488FB"/>
<path d="M26.4443 59.6167C26.4443 59.4941 26.3449 59.3948 26.2224 59.3948C26.0998 59.3948 26.0005 59.4941 26.0005 59.6167V60.9481C26.0005 61.0706 26.0998 61.17 26.2224 61.17C26.3449 61.17 26.4443 61.0706 26.4443 60.9481V59.6167Z" fill="#6488FB"/>
<path d="M65.9977 18.4212C65.9984 18.4654 66.0119 18.5083 66.0367 18.5448C66.0615 18.5813 66.0965 18.6098 66.1372 18.6267C66.5017 18.7871 66.8098 19.0527 67.0222 19.3894C67.2346 19.7262 67.3414 20.1187 67.3291 20.5167C67.3205 21.0463 67.1018 21.5509 66.7212 21.9194C66.3406 22.2878 65.8292 22.49 65.2996 22.4814C64.7699 22.4728 64.2653 22.2541 63.8969 21.8735C63.5284 21.4929 63.3262 20.9815 63.3348 20.4519C63.3353 20.0649 63.4483 19.6864 63.6598 19.3625C63.8714 19.0385 64.1726 18.783 64.5267 18.6269C64.5675 18.6099 64.6024 18.5814 64.6272 18.5448C64.652 18.5082 64.6656 18.4652 64.6663 18.421C64.6663 18.3847 64.6574 18.3489 64.6404 18.3167C64.6234 18.2846 64.5987 18.2572 64.5686 18.2368C64.5385 18.2165 64.5039 18.2038 64.4677 18.2C64.4316 18.1962 64.3951 18.2013 64.3614 18.2149C63.8464 18.4381 63.4241 18.832 63.1656 19.3303C62.9071 19.8285 62.8282 20.4006 62.9422 20.9502C63.0563 21.4998 63.3562 21.9933 63.7915 22.3476C64.2269 22.7019 64.771 22.8953 65.3323 22.8953C65.8936 22.8953 66.4377 22.7019 66.8731 22.3476C67.3084 21.9933 67.6083 21.4998 67.7223 20.9502C67.8363 20.4006 67.7575 19.8285 67.499 19.3303C67.2405 18.832 66.8182 18.4381 66.3032 18.2149C66.2695 18.2011 66.2328 18.1959 66.1966 18.1997C66.1603 18.2035 66.1256 18.2161 66.0954 18.2365C66.0652 18.2569 66.0405 18.2844 66.0234 18.3166C66.0064 18.3489 65.9975 18.3848 65.9977 18.4212Z" fill="#6488FB"/>
<path d="M65.5539 17.7893C65.5539 17.6667 65.4545 17.5674 65.332 17.5674C65.2094 17.5674 65.11 17.6667 65.11 17.7893V19.1207C65.11 19.2433 65.2094 19.3426 65.332 19.3426C65.4545 19.3426 65.5539 19.2433 65.5539 19.1207V17.7893Z" fill="#6488FB"/>
<path d="M65.9977 60.2491C65.9984 60.2932 66.0119 60.3362 66.0367 60.3727C66.0615 60.4092 66.0965 60.4377 66.1372 60.4546C66.5017 60.6149 66.8098 60.8805 67.0222 61.2173C67.2346 61.5541 67.3414 61.9466 67.3291 62.3445C67.3205 62.8742 67.1018 63.3788 66.7212 63.7472C66.3406 64.1157 65.8292 64.3179 65.2996 64.3093C64.7699 64.3007 64.2653 64.082 63.8969 63.7014C63.5284 63.3208 63.3262 62.8094 63.3348 62.2797C63.3353 61.8928 63.4483 61.5143 63.6598 61.1904C63.8714 60.8664 64.1726 60.6108 64.5267 60.4548C64.5675 60.4378 64.6024 60.4093 64.6272 60.3727C64.652 60.3361 64.6656 60.2931 64.6663 60.2489C64.6663 60.2125 64.6574 60.1767 64.6404 60.1446C64.6234 60.1125 64.5987 60.0851 64.5686 60.0647C64.5385 60.0444 64.5039 60.0317 64.4677 60.0279C64.4316 60.024 64.3951 60.0291 64.3614 60.0427C63.8464 60.266 63.4241 60.6599 63.1656 61.1582C62.9071 61.6564 62.8282 62.2285 62.9422 62.7781C63.0563 63.3276 63.3562 63.8212 63.7915 64.1755C64.2269 64.5297 64.771 64.7232 65.3323 64.7232C65.8936 64.7232 66.4377 64.5297 66.8731 64.1755C67.3084 63.8212 67.6083 63.3276 67.7223 62.7781C67.8363 62.2285 67.7575 61.6564 67.499 61.1582C67.2405 60.6599 66.8182 60.266 66.3032 60.0427C66.2695 60.029 66.2328 60.0238 66.1966 60.0276C66.1603 60.0313 66.1256 60.044 66.0954 60.0644C66.0652 60.0848 66.0405 60.1123 66.0234 60.1445C66.0064 60.1767 65.9975 60.2127 65.9977 60.2491Z" fill="#6488FB"/>
<path d="M65.5539 59.6167C65.5539 59.4941 65.4545 59.3948 65.332 59.3948C65.2094 59.3948 65.11 59.4941 65.11 59.6167V60.9481C65.11 61.0706 65.2094 61.17 65.332 61.17C65.4545 61.17 65.5539 61.0706 65.5539 60.9481V59.6167Z" fill="#6488FB"/>
<g opacity="0.5" filter="url(#filter3_f_4487_4172)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.2335 71.7696L10.2335 9.36938L10.4968 9.36938L10.4968 71.7696L10.2335 71.7696Z" fill="#D3D1D1"/>
</g>
<g opacity="0.5" filter="url(#filter4_f_4487_4172)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M81.8485 71.7696L81.8485 9.36938L82.1118 9.36938L82.1118 71.7696L81.8485 71.7696Z" fill="#D3D1D1"/>
</g>
<defs>
<filter id="filter0_d_4487_4172" x="0.653992" y="0" width="91.0382" height="84.4558" 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 dy="1"/>
<feGaussianBlur stdDeviation="4"/>
<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_4172"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_4172" result="shape"/>
</filter>
<filter id="filter1_d_4487_4172" x="0.653992" y="7" width="91.0382" height="89.4558" 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 dy="13"/>
<feGaussianBlur stdDeviation="4"/>
<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_4172"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_4172" result="shape"/>
</filter>
<filter id="filter2_d_4487_4172" x="42.1725" y="3.26294" width="8.26331" height="75.9294" 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_4172"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4487_4172" result="shape"/>
</filter>
<filter id="filter3_f_4487_4172" x="7.23352" y="6.36938" width="6.26331" height="68.4001" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="1.5" result="effect1_foregroundBlur_4487_4172"/>
</filter>
<filter id="filter4_f_4487_4172" x="78.8485" y="6.36938" width="6.26331" height="68.4001" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="1.5" result="effect1_foregroundBlur_4487_4172"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

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,12 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38.0142 39.2553L35.3682 40H20.9308H19.9999H19.0691H1.24111C0.555643 40 0 39.4444 0 38.7589V1.24111C0 0.555643 0.555643 0 1.24111 0H19.0682H20.1226H20.9543H35.4255L38.2625 1.24111C38.9479 1.24111 39.5036 1.79675 39.5036 2.48221L39.2553 38.0142C39.2553 38.6997 38.6997 39.2553 38.0142 39.2553Z" fill="#E9E9E9"/>
<path d="M38.7589 0H35.0356C35.721 0 36.2767 0.555643 36.2767 1.24111V38.7589C36.2767 39.4444 35.721 40 35.0356 40H38.7589C39.4444 40 40 39.4444 40 38.7589V1.24111C40 0.555643 39.4444 0 38.7589 0Z" fill="#D1D1D1"/>
<path opacity="0.6" d="M8.64062 31.8319V33.3213C8.64062 34.0067 8.22091 34.5624 7.70312 34.5624H3.57813C3.06034 34.5624 2.64062 34.0067 2.64062 33.3213V31.8319C2.64062 31.1465 3.06034 30.5908 3.57813 30.5908H7.70312C8.22091 30.5908 8.64062 31.1465 8.64062 31.8319Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M8.64062 7.24111V8.73044C8.64062 9.4159 8.22091 9.97154 7.70312 9.97154H3.57813C3.06034 9.97154 2.64062 9.4159 2.64062 8.73044V7.24111C2.64062 6.55565 3.06034 6 3.57813 6H7.70312C8.22091 6 8.64062 6.55565 8.64062 7.24111Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M27.6406 31.8319V33.3213C27.6406 34.0067 28.0603 34.5624 28.5781 34.5624H32.7031C33.2209 34.5624 33.6406 34.0067 33.6406 33.3213V31.8319C33.6406 31.1465 33.2209 30.5908 32.7031 30.5908H28.5781C28.0603 30.5908 27.6406 31.1465 27.6406 31.8319Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M27.6406 7.24111V8.73044C27.6406 9.4159 28.0603 9.97154 28.5781 9.97154H32.7031C33.2209 9.97154 33.6406 9.4159 33.6406 8.73044V7.24111C33.6406 6.55565 33.2209 6 32.7031 6H28.5781C28.0603 6 27.6406 6.55565 27.6406 7.24111Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M15.0625 31.8319V33.3213C15.0625 34.0067 15.4822 34.5624 16 34.5624H20.125C20.6428 34.5624 21.0625 34.0067 21.0625 33.3213V31.8319C21.0625 31.1465 20.6428 30.5908 20.125 30.5908H16C15.4822 30.5908 15.0625 31.1465 15.0625 31.8319Z" fill="#023DFE" fill-opacity="0.5"/>
<path opacity="0.6" d="M15.0625 7.24111V8.73044C15.0625 9.4159 15.4822 9.97154 16 9.97154H20.125C20.6428 9.97154 21.0625 9.4159 21.0625 8.73044V7.24111C21.0625 6.55565 20.6428 6 20.125 6H16C15.4822 6 15.0625 6.55565 15.0625 7.24111Z" fill="#023DFE" fill-opacity="0.5"/>
<path d="M23.125 0H24.9867V40H23.125V0Z" fill="#D1D1D1"/>
<path d="M11.1719 0H13.0335V40H11.1719V0Z" fill="#D1D1D1"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

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,23 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.9985 39.2627C14.8541 39.2627 10.0174 37.2559 6.37968 33.6118C2.74195 29.9678 0.738586 25.1228 0.738586 19.9694C0.738586 14.8159 2.74195 9.97091 6.37976 6.32685C10.0174 2.68278 14.8541 0.675903 19.9985 0.675903C25.143 0.675903 29.9796 2.68278 33.6174 6.32685C37.2552 9.97083 39.2585 14.8159 39.2585 19.9694C39.2585 25.1228 37.2552 29.9678 33.6174 33.6119C29.9797 37.2559 25.1431 39.2627 19.9985 39.2627Z" fill="#CBC4CC"/>
<path d="M19.9983 35.7306C28.688 35.7306 35.7323 28.674 35.7323 19.9692C35.7323 11.2644 28.688 4.20776 19.9983 4.20776C11.3087 4.20776 4.26434 11.2644 4.26434 19.9692C4.26434 28.674 11.3087 35.7306 19.9983 35.7306Z" fill="#F3F0F3"/>
<path d="M19.9986 33.2973C27.3468 33.2973 33.3037 27.3301 33.3037 19.9691C33.3037 12.6081 27.3468 6.64087 19.9986 6.64087C12.6504 6.64087 6.69354 12.6081 6.69354 19.9691C6.69354 27.3301 12.6504 33.2973 19.9986 33.2973Z" fill="#FD4755"/>
<path d="M19.9992 6.64087C19.4706 6.64087 18.9494 6.6729 18.4367 6.73321C25.0395 7.51056 30.1793 13.1494 30.1793 19.969C30.1793 26.7886 25.0395 32.4275 18.4367 33.2049C18.9494 33.2653 19.4706 33.2972 19.9992 33.2972C27.3357 33.2972 33.3043 27.3182 33.3043 19.969C33.3043 12.6198 27.3357 6.64087 19.9992 6.64087Z" fill="#FB2B3A"/>
<path d="M13.2348 12.9076C13.0732 12.9076 12.9123 12.8412 12.7966 12.7109C12.5816 12.469 12.6034 12.0987 12.8453 11.8837C14.8214 10.1277 17.3621 9.16064 19.9996 9.16064C20.3233 9.16064 20.5856 9.42299 20.5856 9.74658C20.5856 10.0702 20.3233 10.3325 19.9996 10.3325C17.6494 10.3325 15.3851 11.1946 13.6238 12.7597C13.5122 12.8588 13.3732 12.9076 13.2348 12.9076Z" fill="#FD8087"/>
<path d="M19.9998 30.777C19.6761 30.777 19.4138 30.5146 19.4138 30.191C19.4138 29.8674 19.6761 29.6051 19.9998 29.6051C22.2935 29.6051 24.5163 28.7794 26.2587 27.2801C26.5041 27.0691 26.8739 27.0967 27.085 27.3421C27.2961 27.5874 27.2684 27.9573 27.023 28.1684C25.0681 29.8506 22.5739 30.777 19.9998 30.777Z" fill="#FD8087"/>
<path d="M14.101 19.467C13.9653 19.4168 13.8165 19.3693 13.659 19.319C13.1803 19.166 12.4569 18.9348 12.2799 18.6045C12.1936 18.4435 12.1857 18.2752 12.2565 18.1045C12.3492 17.8809 12.5605 17.6956 12.808 17.6209C13.7419 17.3392 14.5903 18.0186 14.6085 18.0333C14.856 18.2396 15.224 18.2073 15.4318 17.9605C15.6403 17.713 15.6085 17.3433 15.361 17.1349C15.3073 17.0896 14.0247 16.0298 12.4694 16.499C11.8853 16.6752 11.401 17.1077 11.1739 17.6558C10.9681 18.1525 10.994 18.686 11.247 19.1581C11.6483 19.9067 12.6043 20.2122 13.3024 20.4352C13.4471 20.4815 13.5838 20.5251 13.6949 20.5662C14.3329 20.802 14.6576 21.1673 14.5858 21.5686C14.5138 21.9709 14.0422 22.3871 13.3774 22.3871C12.7361 22.3871 12.1174 22.1263 11.7221 21.6894C11.5051 21.4494 11.1345 21.431 10.8945 21.6479C10.6545 21.8651 10.636 22.2355 10.8531 22.4755C11.4667 23.154 12.4105 23.559 13.3774 23.559C14.542 23.559 15.5574 22.792 15.7393 21.775C15.8774 21.0029 15.5196 19.9911 14.101 19.467Z" fill="white"/>
<path d="M27.6301 19.467C27.4944 19.4169 27.3456 19.3694 27.1881 19.319C26.7093 19.166 25.9859 18.9348 25.8088 18.6045C25.7226 18.4435 25.7147 18.2753 25.7855 18.1045C25.8781 17.8809 26.0895 17.6956 26.337 17.6209C27.2692 17.3395 28.1166 18.0164 28.1374 18.0332C28.3849 18.2396 28.7529 18.2074 28.9607 17.9605C29.1692 17.713 29.1375 17.3434 28.89 17.1349C28.8363 17.0896 27.5537 16.0298 25.9984 16.499C25.4144 16.6752 24.9301 17.1077 24.7029 17.6559C24.497 18.1525 24.523 18.686 24.776 19.1581C25.1773 19.9067 26.1334 20.2122 26.8315 20.4353C26.9762 20.4816 27.1129 20.5252 27.224 20.5663C27.862 20.8021 28.1867 21.1674 28.1149 21.5687C28.0429 21.971 27.5712 22.3872 26.9063 22.3872C26.2652 22.3872 25.6464 22.1264 25.2512 21.6895C25.0341 21.4495 24.6636 21.4311 24.4236 21.648C24.1836 21.8652 24.165 22.2356 24.3822 22.4756C24.9958 23.1541 25.9395 23.5591 26.9063 23.5591C28.071 23.5591 29.0865 22.7921 29.2684 21.7751C29.4064 21.0029 29.0486 19.9912 27.6301 19.467Z" fill="white"/>
<path d="M20 16.3796C18.0236 16.3796 16.4158 17.99 16.4158 19.9693C16.4158 21.9487 18.0236 23.559 20 23.559C21.9763 23.559 23.5841 21.9487 23.5841 19.9693C23.5841 17.99 21.9763 16.3796 20 16.3796ZM20 22.3871C18.6699 22.3871 17.5877 21.3025 17.5877 19.9693C17.5877 18.6361 18.6699 17.5515 20 17.5515C21.3301 17.5515 22.4122 18.6361 22.4122 19.9693C22.4122 21.3025 21.3301 22.3871 20 22.3871Z" fill="white"/>
<path d="M3.84889 35.3784L1.80935 37.4216C1.58076 37.6507 1.58107 38.0216 1.81013 38.2502C1.92459 38.3644 2.07435 38.4215 2.22412 38.4215C2.37428 38.4215 2.52443 38.3641 2.63881 38.2495L4.67834 36.2062C4.90693 35.9772 4.90662 35.6062 4.67756 35.3777C4.44834 35.1491 4.07732 35.1494 3.84889 35.3784Z" fill="#F3F0F3"/>
<path d="M2.24993 32.4788C2.06414 32.2139 1.6986 32.1499 1.43383 32.3356L0.249534 33.1664C-0.0154664 33.3523 -0.079529 33.7177 0.106331 33.9826C0.220315 34.1452 0.401956 34.2321 0.586487 34.2321C0.702659 34.2321 0.820081 34.1976 0.922425 34.1258L2.10672 33.295C2.37172 33.1092 2.43579 32.7438 2.24993 32.4788Z" fill="#F3F0F3"/>
<path d="M7.57032 37.8098C7.30509 37.6245 6.93993 37.6892 6.75439 37.9544L5.96876 39.0784C5.78337 39.3436 5.84814 39.7089 6.11337 39.8943C6.21564 39.9657 6.33267 40 6.44853 40C6.63337 40 6.81532 39.9127 6.92931 39.7497L7.71493 38.6257C7.90032 38.3605 7.83556 37.9952 7.57032 37.8098Z" fill="#F3F0F3"/>
<path d="M36.1472 35.3782C35.9186 35.1492 35.5475 35.1488 35.3186 35.3774C35.0895 35.606 35.0892 35.977 35.3178 36.206L37.3573 38.2492C37.4718 38.3639 37.6218 38.4213 37.772 38.4213C37.9218 38.4213 38.0716 38.3642 38.186 38.25C38.415 38.0214 38.4154 37.6504 38.1868 37.4214L36.1472 35.3782Z" fill="#F3F0F3"/>
<path d="M39.7459 33.1664L38.5616 32.3356C38.2966 32.1499 37.9313 32.2139 37.7456 32.4788C37.5597 32.7438 37.6238 33.1092 37.8888 33.295L39.0731 34.1258C39.1755 34.1976 39.2927 34.2321 39.409 34.2321C39.5935 34.2321 39.7752 34.1451 39.8891 33.9826C40.0749 33.7177 40.0109 33.3523 39.7459 33.1664Z" fill="#F3F0F3"/>
<path d="M33.2416 37.9542C33.0562 37.689 32.691 37.6242 32.4256 37.8096C32.1604 37.9949 32.0956 38.3603 32.281 38.6255L33.0666 39.7495C33.1806 39.9125 33.3625 39.9998 33.5474 39.9998C33.6633 39.9998 33.7803 39.9655 33.8826 39.8941C34.1478 39.7087 34.2126 39.3434 34.0272 39.0782L33.2416 37.9542Z" fill="#F3F0F3"/>
<path d="M35.7325 4.79383C35.8826 4.79383 36.0328 4.73648 36.1472 4.62179L38.1867 2.57859C38.4153 2.34953 38.415 1.97859 38.1859 1.75C37.9567 1.52132 37.5857 1.52171 37.3573 1.75078L35.3178 3.79398C35.0892 4.02304 35.0895 4.39398 35.3186 4.62258C35.4329 4.73679 35.5827 4.79383 35.7325 4.79383Z" fill="#F3F0F3"/>
<path d="M37.7456 7.52093C37.8595 7.68351 38.0412 7.77038 38.2257 7.77038C38.3419 7.77038 38.4593 7.73593 38.5616 7.66413L39.7459 6.83335C40.0109 6.64749 40.075 6.2821 39.8891 6.01718C39.7034 5.75226 39.3378 5.68819 39.0731 5.87398L37.8888 6.70476C37.6238 6.89062 37.5597 7.25601 37.7456 7.52093Z" fill="#F3F0F3"/>
<path d="M33.8826 0.105655C33.6173 -0.0795792 33.2521 -0.0149698 33.0666 0.250265L32.281 1.37417C32.0956 1.63941 32.1604 2.00472 32.4256 2.19011C32.5279 2.26152 32.6449 2.29581 32.7608 2.29581C32.9456 2.29581 33.1276 2.20855 33.2416 2.0455L34.0272 0.921515C34.2125 0.656359 34.1477 0.291046 33.8826 0.105655Z" fill="#F3F0F3"/>
<path d="M2.63873 1.75078C2.41006 1.52171 2.03904 1.52132 1.81013 1.75C1.58107 1.97859 1.58076 2.34961 1.80935 2.57859L3.84889 4.62179C3.96334 4.73648 4.11342 4.79383 4.26357 4.79383C4.41334 4.79383 4.56318 4.73679 4.67756 4.62258C4.90662 4.39398 4.90693 4.02297 4.67834 3.79398L2.63873 1.75078Z" fill="#F3F0F3"/>
<path d="M0.249534 6.83335L1.43383 7.66413C1.53625 7.73593 1.65352 7.77038 1.76977 7.77038C1.9543 7.77038 2.13602 7.68343 2.24993 7.52093C2.43579 7.25601 2.37172 6.89062 2.10672 6.70476L0.922425 5.87398C0.657503 5.68819 0.292112 5.75226 0.106331 6.01718C-0.079529 6.2821 -0.0154664 6.64749 0.249534 6.83335Z" fill="#F3F0F3"/>
<path d="M6.92931 0.250204C6.74392 -0.0148744 6.37876 -0.0796401 6.11337 0.105673C5.84814 0.291063 5.78337 0.656376 5.96876 0.921611L6.75439 2.0456C6.86837 2.20856 7.05025 2.29591 7.23517 2.29591C7.35103 2.29591 7.46806 2.26161 7.57032 2.19021C7.83556 2.00481 7.90032 1.6395 7.71493 1.37427L6.92931 0.250204Z" fill="#F3F0F3"/>
</svg>

After

Width:  |  Height:  |  Size: 8.0 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

@ -10,12 +10,12 @@
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
611C662010675536F855E5CA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
964EC64D4BABF3375BEBF6DE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
D31283674D2826D7EF8E56BC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */; }; CE9CA504D8FF2965F977B16B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 274C82CD6955A1499B0B1ECC /* Pods_Runner.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -42,24 +42,20 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
01BAAF935356ECBDD35AF0DB /* Pods-RunnerTests.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug-prod.xcconfig"; sourceTree = "<group>"; }; 064BE0B8B723A6E30728B215 /* Pods-RunnerTests.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release-prod.xcconfig"; sourceTree = "<group>"; };
12AD49A621BEBB053FD06115 /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = "<group>"; }; 0D60D6C4BBD804473BD9E4A0 /* Pods-RunnerTests.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile-prod.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
1F99043C7AC9BDABD8A4D41A /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"; sourceTree = "<group>"; }; 2688A8D4C03F1C4585B3EFE2 /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = "<group>"; };
210827A693936E5201C5E75C /* Pods-RunnerTests.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile-dev.xcconfig"; sourceTree = "<group>"; }; 274C82CD6955A1499B0B1ECC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
238CAAD9FFF9A0C9ED3CFAB2 /* Pods-RunnerTests.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile-prod.xcconfig"; sourceTree = "<group>"; };
25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
444D77D28A8CDF32047CD0AF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; 4F6A2F89436864C7EE769652 /* Pods-RunnerTests.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile-dev.xcconfig"; sourceTree = "<group>"; };
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54B9D4926B53AAFC49A54F19 /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = "<group>"; };
5DE3E6D1EADE3D3859FC1B69 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
949637473C534E1F68B19CC0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -67,16 +63,14 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9B82456986D7FA25420A224F /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = "<group>"; }; 9D1B204BC7CD29434FE9D537 /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"; sourceTree = "<group>"; };
A3D4DF5D9888DAC25E2380AA /* Pods-RunnerTests.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release-dev.xcconfig"; sourceTree = "<group>"; }; C33EAABFBF3F560A8EFB0BC0 /* Pods-RunnerTests.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release-dev.xcconfig"; sourceTree = "<group>"; };
AAC9129FD50E64509AD1B9AF /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; }; E0A467016A4C6B17ECA05534 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = "<group>"; };
BFD4DDED98208034B60B5311 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; E2512B7B8C737577EB9DB570 /* Pods-RunnerTests.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug-dev.xcconfig"; sourceTree = "<group>"; };
C41134CD2FDFC1A2BDF49283 /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = "<group>"; }; F5E8A17F8AB7D50983179FD3 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = "<group>"; };
C5DBBF9417E4F8A9A08DFF02 /* Pods-RunnerTests.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release-prod.xcconfig"; sourceTree = "<group>"; }; FA2359C69B2F150BE9833D5A /* Pods-RunnerTests.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug-prod.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug-prod.xcconfig"; sourceTree = "<group>"; };
D0F6245A5BF345FCC425515C /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = "<group>"; }; FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DFB6BB492A265F2BF6FDC8C0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; }; FC3EFA91747319965EF91609 /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = "<group>"; };
EE971EFEA60AEDFDB361D9A3 /* Pods-RunnerTests.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug-dev.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug-dev.xcconfig"; sourceTree = "<group>"; };
F323D632CA976B68DDB0E669 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -84,7 +78,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D31283674D2826D7EF8E56BC /* Pods_Runner.framework in Frameworks */, CE9CA504D8FF2965F977B16B /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -92,7 +86,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
611C662010675536F855E5CA /* Pods_RunnerTests.framework in Frameworks */, 964EC64D4BABF3375BEBF6DE /* Pods_RunnerTests.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -102,24 +96,18 @@
2F70EB4341A83C900EB253DC /* Pods */ = { 2F70EB4341A83C900EB253DC /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
BFD4DDED98208034B60B5311 /* Pods-Runner.debug.xcconfig */, FC3EFA91747319965EF91609 /* Pods-Runner.debug-prod.xcconfig */,
949637473C534E1F68B19CC0 /* Pods-Runner.release.xcconfig */, F5E8A17F8AB7D50983179FD3 /* Pods-Runner.debug-dev.xcconfig */,
444D77D28A8CDF32047CD0AF /* Pods-Runner.profile.xcconfig */, 54B9D4926B53AAFC49A54F19 /* Pods-Runner.release-prod.xcconfig */,
DFB6BB492A265F2BF6FDC8C0 /* Pods-RunnerTests.debug.xcconfig */, 2688A8D4C03F1C4585B3EFE2 /* Pods-Runner.release-dev.xcconfig */,
F323D632CA976B68DDB0E669 /* Pods-RunnerTests.release.xcconfig */, E0A467016A4C6B17ECA05534 /* Pods-Runner.profile-prod.xcconfig */,
AAC9129FD50E64509AD1B9AF /* Pods-RunnerTests.profile.xcconfig */, 9D1B204BC7CD29434FE9D537 /* Pods-Runner.profile-dev.xcconfig */,
9B82456986D7FA25420A224F /* Pods-Runner.debug-prod.xcconfig */, FA2359C69B2F150BE9833D5A /* Pods-RunnerTests.debug-prod.xcconfig */,
5DE3E6D1EADE3D3859FC1B69 /* Pods-Runner.debug-dev.xcconfig */, E2512B7B8C737577EB9DB570 /* Pods-RunnerTests.debug-dev.xcconfig */,
12AD49A621BEBB053FD06115 /* Pods-Runner.release-prod.xcconfig */, 064BE0B8B723A6E30728B215 /* Pods-RunnerTests.release-prod.xcconfig */,
C41134CD2FDFC1A2BDF49283 /* Pods-Runner.release-dev.xcconfig */, C33EAABFBF3F560A8EFB0BC0 /* Pods-RunnerTests.release-dev.xcconfig */,
D0F6245A5BF345FCC425515C /* Pods-Runner.profile-prod.xcconfig */, 0D60D6C4BBD804473BD9E4A0 /* Pods-RunnerTests.profile-prod.xcconfig */,
1F99043C7AC9BDABD8A4D41A /* Pods-Runner.profile-dev.xcconfig */, 4F6A2F89436864C7EE769652 /* Pods-RunnerTests.profile-dev.xcconfig */,
01BAAF935356ECBDD35AF0DB /* Pods-RunnerTests.debug-prod.xcconfig */,
EE971EFEA60AEDFDB361D9A3 /* Pods-RunnerTests.debug-dev.xcconfig */,
C5DBBF9417E4F8A9A08DFF02 /* Pods-RunnerTests.release-prod.xcconfig */,
A3D4DF5D9888DAC25E2380AA /* Pods-RunnerTests.release-dev.xcconfig */,
238CAAD9FFF9A0C9ED3CFAB2 /* Pods-RunnerTests.profile-prod.xcconfig */,
210827A693936E5201C5E75C /* Pods-RunnerTests.profile-dev.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
@ -132,11 +120,11 @@
path = RunnerTests; path = RunnerTests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
876D3217A8BBDAF41961161F /* Frameworks */ = { 61B46FA3FB0932D29E3C6E47 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */, 274C82CD6955A1499B0B1ECC /* Pods_Runner.framework */,
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */, FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -160,7 +148,7 @@
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */, 331C8082294A63A400263BE5 /* RunnerTests */,
2F70EB4341A83C900EB253DC /* Pods */, 2F70EB4341A83C900EB253DC /* Pods */,
876D3217A8BBDAF41961161F /* Frameworks */, 61B46FA3FB0932D29E3C6E47 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -195,7 +183,7 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = ( buildPhases = (
3B971DE531245D7FD2921C30 /* [CP] Check Pods Manifest.lock */, 73698F4EABFF3F9B7ADF4220 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */, 331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */, 331C807F294A63A400263BE5 /* Resources */,
C2B33A7265AF659D80692473 /* Frameworks */, C2B33A7265AF659D80692473 /* Frameworks */,
@ -214,7 +202,7 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
3DC878D0674AA34AEC9695FB /* [CP] Check Pods Manifest.lock */, BF71A0E0099ADA10FE9B580A /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
B07E4A152C9B8EA4001F6910 /* copy GoogleService.plist file to the correct location */, B07E4A152C9B8EA4001F6910 /* copy GoogleService.plist file to the correct location */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
@ -222,9 +210,9 @@
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
315A05630CF83C532DBBCBF2 /* [CP] Embed Pods Frameworks */,
3724F7A126D8469D5B04D144 /* [CP] Copy Pods Resources */,
4768286A3BADB12BBB8C6996 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, 4768286A3BADB12BBB8C6996 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
6CF71F42A45B39E9945C8410 /* [CP] Embed Pods Frameworks */,
14DF593CA13D27D3781140F6 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -296,24 +284,7 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
315A05630CF83C532DBBCBF2 /* [CP] Embed Pods Frameworks */ = { 14DF593CA13D27D3781140F6 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3724F7A126D8469D5B04D144 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -346,7 +317,42 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
}; };
3B971DE531245D7FD2921C30 /* [CP] Check Pods Manifest.lock */ = { 4768286A3BADB12BBB8C6996 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\n#!/bin/bash\nPATH=${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=$PODS_ROOT/FirebaseCrashlytics/upload-symbols --platform=ios --apple-project-path=${SRCROOT} --env-platform-name=${PLATFORM_NAME} --env-configuration=${CONFIGURATION} --env-project-dir=${PROJECT_DIR} --env-built-products-dir=${BUILT_PRODUCTS_DIR} --env-dwarf-dsym-folder-path=${DWARF_DSYM_FOLDER_PATH} --env-dwarf-dsym-file-name=${DWARF_DSYM_FILE_NAME} --env-infoplist-path=${INFOPLIST_PATH} --default-config=default\n";
};
6CF71F42A45B39E9945C8410 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
73698F4EABFF3F9B7ADF4220 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -368,46 +374,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
3DC878D0674AA34AEC9695FB /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
4768286A3BADB12BBB8C6996 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\n#!/bin/bash\nPATH=${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=$PODS_ROOT/FirebaseCrashlytics/upload-symbols --platform=ios --apple-project-path=${SRCROOT} --env-platform-name=${PLATFORM_NAME} --env-configuration=${CONFIGURATION} --env-project-dir=${PROJECT_DIR} --env-built-products-dir=${BUILT_PRODUCTS_DIR} --env-dwarf-dsym-folder-path=${DWARF_DSYM_FOLDER_PATH} --env-dwarf-dsym-file-name=${DWARF_DSYM_FILE_NAME} --env-infoplist-path=${INFOPLIST_PATH} --default-config=default\n";
};
9740EEB61CF901F6004384FC /* Run Script */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1; alwaysOutOfDate = 1;
@ -441,6 +407,28 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "# Get a reference to the destination location for the GoogleService-Info.plist\n# This is the default location where Firebase init code expects to find GoogleServices-Info.plist file.\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\n# We have named our Build Configurations as Debug-dev, Debug-prod etc.\n# Here, dev and prod are the scheme names. This kind of naming is required by Flutter for flavors to work.\n# We are using the $CONFIGURATION variable available in the XCode build environment to get the build configuration.\nif [ \"${CONFIGURATION}\" == \"Debug-prod\" ] || [ \"${CONFIGURATION}\" == \"Release-prod\" ] || [ \"${CONFIGURATION}\" == \"Profile-prod\" ] || [ \"${CONFIGURATION}\" == \"Release\" ]; then\ncp \"${PROJECT_DIR}/config/prod/GoogleService-Info.plist\" \"${PLIST_DESTINATION}/GoogleService-Info.plist\"\necho \"Production plist copied\"\nelif [ \"${CONFIGURATION}\" == \"Debug-dev\" ] || [ \"${CONFIGURATION}\" == \"Release-dev\" ] || [ \"${CONFIGURATION}\" == \"Profile-dev\" ] || [ \"${CONFIGURATION}\" == \"Debug\" ]; then\ncp \"${PROJECT_DIR}/config/dev/GoogleService-Info.plist\" \"${PLIST_DESTINATION}/GoogleService-Info.plist\"\necho \"Development plist copied\"\nfi\n"; shellScript = "# Get a reference to the destination location for the GoogleService-Info.plist\n# This is the default location where Firebase init code expects to find GoogleServices-Info.plist file.\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\n# We have named our Build Configurations as Debug-dev, Debug-prod etc.\n# Here, dev and prod are the scheme names. This kind of naming is required by Flutter for flavors to work.\n# We are using the $CONFIGURATION variable available in the XCode build environment to get the build configuration.\nif [ \"${CONFIGURATION}\" == \"Debug-prod\" ] || [ \"${CONFIGURATION}\" == \"Release-prod\" ] || [ \"${CONFIGURATION}\" == \"Profile-prod\" ] || [ \"${CONFIGURATION}\" == \"Release\" ]; then\ncp \"${PROJECT_DIR}/config/prod/GoogleService-Info.plist\" \"${PLIST_DESTINATION}/GoogleService-Info.plist\"\necho \"Production plist copied\"\nelif [ \"${CONFIGURATION}\" == \"Debug-dev\" ] || [ \"${CONFIGURATION}\" == \"Release-dev\" ] || [ \"${CONFIGURATION}\" == \"Profile-dev\" ] || [ \"${CONFIGURATION}\" == \"Debug\" ]; then\ncp \"${PROJECT_DIR}/config/dev/GoogleService-Info.plist\" \"${PLIST_DESTINATION}/GoogleService-Info.plist\"\necho \"Development plist copied\"\nfi\n";
}; };
BF71A0E0099ADA10FE9B580A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
@ -575,7 +563,7 @@
}; };
331C8088294A63A400263BE5 /* Debug-prod */ = { 331C8088294A63A400263BE5 /* Debug-prod */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 01BAAF935356ECBDD35AF0DB /* Pods-RunnerTests.debug-prod.xcconfig */; baseConfigurationReference = FA2359C69B2F150BE9833D5A /* Pods-RunnerTests.debug-prod.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -593,7 +581,7 @@
}; };
331C8089294A63A400263BE5 /* Release-prod */ = { 331C8089294A63A400263BE5 /* Release-prod */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = C5DBBF9417E4F8A9A08DFF02 /* Pods-RunnerTests.release-prod.xcconfig */; baseConfigurationReference = 064BE0B8B723A6E30728B215 /* Pods-RunnerTests.release-prod.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -609,7 +597,7 @@
}; };
331C808A294A63A400263BE5 /* Profile-prod */ = { 331C808A294A63A400263BE5 /* Profile-prod */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 238CAAD9FFF9A0C9ED3CFAB2 /* Pods-RunnerTests.profile-prod.xcconfig */; baseConfigurationReference = 0D60D6C4BBD804473BD9E4A0 /* Pods-RunnerTests.profile-prod.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -885,7 +873,7 @@
}; };
B07E4A0E2C9B8C45001F6910 /* Debug-dev */ = { B07E4A0E2C9B8C45001F6910 /* Debug-dev */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = EE971EFEA60AEDFDB361D9A3 /* Pods-RunnerTests.debug-dev.xcconfig */; baseConfigurationReference = E2512B7B8C737577EB9DB570 /* Pods-RunnerTests.debug-dev.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -987,7 +975,7 @@
}; };
B07E4A112C9B8C52001F6910 /* Release-dev */ = { B07E4A112C9B8C52001F6910 /* Release-dev */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = A3D4DF5D9888DAC25E2380AA /* Pods-RunnerTests.release-dev.xcconfig */; baseConfigurationReference = C33EAABFBF3F560A8EFB0BC0 /* Pods-RunnerTests.release-dev.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -1085,7 +1073,7 @@
}; };
B07E4A142C9B8C5C001F6910 /* Profile-dev */ = { B07E4A142C9B8C5C001F6910 /* Profile-dev */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 210827A693936E5201C5E75C /* Pods-RunnerTests.profile-dev.xcconfig */; baseConfigurationReference = 4F6A2F89436864C7EE769652 /* Pods-RunnerTests.profile-dev.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;

View File

@ -34,7 +34,7 @@ part 'home_state.dart';
class HomeCubit extends Cubit<HomeState> { class HomeCubit extends Cubit<HomeState> {
HomeCubit._() : super(HomeInitial()) { HomeCubit._() : super(HomeInitial()) {
checkIfNotificationPermissionGranted(); // checkIfNotificationPermissionGranted();
fetchUserInfo(); fetchUserInfo();
if (selectedSpace == null) { if (selectedSpace == null) {
fetchUnitsByUserId(); fetchUnitsByUserId();
@ -76,9 +76,12 @@ class HomeCubit extends Cubit<HomeState> {
selectedSpace = null; selectedSpace = null;
selectedRoom = null; selectedRoom = null;
pageIndex = 0; pageIndex = 0;
OneSignal.User.pushSubscription.removeObserver((stateChanges) => oneSignalSubscriptionObserver); // OneSignal.User.pushSubscription
OneSignal.Notifications.removePermissionObserver((permission) => oneSignalPermissionObserver); // .removeObserver((stateChanges) => oneSignalSubscriptionObserver);
OneSignal.Notifications.removeClickListener((event) => oneSignalClickListenerObserver); // OneSignal.Notifications.removePermissionObserver(
// (permission) => oneSignalPermissionObserver);
// OneSignal.Notifications.removeClickListener(
// (event) => oneSignalClickListenerObserver);
return super.close(); return super.close();
} }
@ -96,9 +99,9 @@ class HomeCubit extends Cubit<HomeState> {
var duration = const Duration(milliseconds: 300); var duration = const Duration(milliseconds: 300);
void oneSignalPermissionObserver; // void oneSignalPermissionObserver;
void oneSignalSubscriptionObserver; // void oneSignalSubscriptionObserver;
void oneSignalClickListenerObserver; // void oneSignalClickListenerObserver;
// selectSpace(SpaceModel space) async { // selectSpace(SpaceModel space) async {
// selectedSpace = space; // selectedSpace = space;
@ -120,31 +123,36 @@ class HomeCubit extends Cubit<HomeState> {
return; return;
} }
var userUuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? ''; var userUuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
'';
if (userUuid.isNotEmpty) { if (userUuid.isNotEmpty) {
await OneSignal.login(userUuid); await OneSignal.login(userUuid);
} }
//Enable push notifications //Enable push notifications
await OneSignal.User.pushSubscription.optIn(); await OneSignal.User.pushSubscription.optIn();
//this function will be called once a user is subscribed // //this function will be called once a user is subscribed
oneSignalSubscriptionObserver = OneSignal.User.pushSubscription.addObserver((state) async { // oneSignalSubscriptionObserver =
if (state.current.optedIn) { // OneSignal.User.pushSubscription.addObserver((state) async {
await _sendSubscriptionId(); // if (state.current.optedIn) {
} // await _sendSubscriptionId();
}); // }
// });
// Send the player id when a user allows notifications // // Send the player id when a user allows notifications
oneSignalPermissionObserver = OneSignal.Notifications.addPermissionObserver((state) async { // oneSignalPermissionObserver =
await _sendSubscriptionId(); // OneSignal.Notifications.addPermissionObserver((state) async {
}); // await _sendSubscriptionId();
// });
//check if the player id is sent, if not send it again // //check if the player id is sent, if not send it again
await _sendSubscriptionId(); // await _sendSubscriptionId();
oneSignalClickListenerObserver = OneSignal.Notifications.addClickListener((event) async { // oneSignalClickListenerObserver =
//Once the user clicks on the notification // OneSignal.Notifications.addClickListener((event) async {
}); // //Once the user clicks on the notification
// });
} catch (err) { } catch (err) {
debugPrint("******* Error"); debugPrint("******* Error");
debugPrint(err.toString()); debugPrint(err.toString());
@ -213,7 +221,8 @@ class HomeCubit extends Cubit<HomeState> {
//////////////////////////////////////// API //////////////////////////////////////// //////////////////////////////////////// API ////////////////////////////////////////
generateInvitation(SpaceModel unit) async { generateInvitation(SpaceModel unit) async {
try { try {
final invitationCode = await SpacesAPI.generateInvitationCode(unit.id, unit.community.uuid); final invitationCode =
await SpacesAPI.generateInvitationCode(unit.id, unit.community.uuid);
if (invitationCode.isNotEmpty) { if (invitationCode.isNotEmpty) {
Share.share('The invitation code is $invitationCode'); Share.share('The invitation code is $invitationCode');
CustomSnackBar.displaySnackBar( CustomSnackBar.displaySnackBar(
@ -229,7 +238,9 @@ class HomeCubit extends Cubit<HomeState> {
Future<bool> joinAUnit(String code) async { Future<bool> joinAUnit(String code) async {
try { try {
var userUuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? ''; var userUuid =
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
'';
Map<String, String> body = {'inviteCode': code}; Map<String, String> body = {'inviteCode': code};
final success = await SpacesAPI.joinUnit(userUuid, body); final success = await SpacesAPI.joinUnit(userUuid, body);
@ -265,7 +276,8 @@ class HomeCubit extends Cubit<HomeState> {
fetchRoomsByUnitId(SpaceModel space) async { fetchRoomsByUnitId(SpaceModel space) async {
emitSafe(GetSpaceRoomsLoading()); emitSafe(GetSpaceRoomsLoading());
try { try {
space.subspaces = await SpacesAPI.getSubSpaceBySpaceId(space.community.uuid, space.id); space.subspaces =
await SpacesAPI.getSubSpaceBySpaceId(space.community.uuid, space.id);
} catch (failure) { } catch (failure) {
emitSafe(GetSpaceRoomsError(failure.toString())); emitSafe(GetSpaceRoomsError(failure.toString()));
return; return;
@ -347,7 +359,8 @@ class HomeCubit extends Cubit<HomeState> {
size: 32, size: 32,
), ),
style: ButtonStyle( style: ButtonStyle(
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor), foregroundColor:
WidgetStateProperty.all(ColorsManager.textPrimaryColor),
), ),
onPressed: () { onPressed: () {
Navigator.pushNamed( Navigator.pushNamed(
@ -368,7 +381,8 @@ class HomeCubit extends Cubit<HomeState> {
NavigationService.navigatorKey.currentContext! NavigationService.navigatorKey.currentContext!
.read<SmartSceneSelectBloc>() .read<SmartSceneSelectBloc>()
.add(const SmartSceneClearEvent()); .add(const SmartSceneClearEvent());
BlocProvider.of<EffectPeriodBloc>(NavigationService.navigatorKey.currentState!.context) BlocProvider.of<EffectPeriodBloc>(
NavigationService.navigatorKey.currentState!.context)
.add(ResetEffectivePeriod()); .add(ResetEffectivePeriod());
NavigationService.navigatorKey.currentContext! NavigationService.navigatorKey.currentContext!
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
@ -381,7 +395,8 @@ class HomeCubit extends Cubit<HomeState> {
size: 28, size: 28,
), ),
style: ButtonStyle( style: ButtonStyle(
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor), foregroundColor:
WidgetStateProperty.all(ColorsManager.textPrimaryColor),
), ),
onPressed: () {}, onPressed: () {},
), ),
@ -414,7 +429,8 @@ class HomeCubit extends Cubit<HomeState> {
}; };
static var bottomNavItems = [ static var bottomNavItems = [
defaultBottomNavBarItem(icon: Assets.assetsIconsDashboard, label: 'Dashboard'), defaultBottomNavBarItem(
icon: Assets.assetsIconsDashboard, label: 'Dashboard'),
// defaultBottomNavBarItem(icon: Assets.assetsIconslayout, label: 'Layout'), // defaultBottomNavBarItem(icon: Assets.assetsIconslayout, label: 'Layout'),
defaultBottomNavBarItem(icon: Assets.assetsIconsDevices, label: 'Devices'), defaultBottomNavBarItem(icon: Assets.assetsIconsDevices, label: 'Devices'),
defaultBottomNavBarItem(icon: Assets.assetsIconsRoutines, label: 'Routine'), defaultBottomNavBarItem(icon: Assets.assetsIconsRoutines, label: 'Routine'),
@ -440,7 +456,8 @@ class HomeCubit extends Cubit<HomeState> {
void updateDevice(String deviceId) async { void updateDevice(String deviceId) async {
try { try {
final response = await DevicesAPI.firmwareDevice(deviceId: deviceId, firmwareVersion: '0'); final response = await DevicesAPI.firmwareDevice(
deviceId: deviceId, firmwareVersion: '0');
if (response['success'] ?? false) { if (response['success'] ?? false) {
CustomSnackBar.displaySnackBar('No updates available'); CustomSnackBar.displaySnackBar('No updates available');
} }
@ -448,7 +465,8 @@ class HomeCubit extends Cubit<HomeState> {
} }
} }
BottomNavigationBarItem defaultBottomNavBarItem({required String icon, required String label}) { BottomNavigationBarItem defaultBottomNavBarItem(
{required String icon, required String label}) {
return BottomNavigationBarItem( return BottomNavigationBarItem(
icon: SvgPicture.asset(icon), icon: SvgPicture.asset(icon),
activeIcon: SvgPicture.asset( activeIcon: SvgPicture.asset(

View File

@ -2,6 +2,7 @@ import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart'; import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/navigation/routing_constants.dart'; import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/context_extension.dart';

View File

@ -0,0 +1,394 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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_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_control_model.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/device_info_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/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
import 'package:syncrow_app/services/api/home_management_api.dart';
import 'package:syncrow_app/services/api/scene_api.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
class SixSceneBloc extends Bloc<SixSceneEvent, SixSceneState> {
final String sixSceneId;
SixSceneBloc({
required this.sixSceneId,
}) : super(const SixSceneState()) {
on<SixSceneInitial>(_fetchDeviceStatus);
on<ChangeSwitchStatusEvent>(changeSwitchStatus);
on<LoadScenes>(_onLoadScenes);
on<SearchScenesEvent>(searchScene);
on<SaveSelectionEvent>(_onSaveSelection);
on<SelectOptionEvent>(_onOptionSelected);
on<SexSceneSwitchInitial>(_fetchFourSceneSwitches);
on<AssignDeviceScene>(assignScene);
on<GetSceneBySwitchName>(getSceneByName);
on<SelectSceneEvent>(_selectScene);
on<SixSceneInitialInfo>(fetchDeviceInfo);
on<AssignRoomEvent>(_assignDevice);
on<FetchRoomsEvent>(_fetchRoomsAndDevices);
on<DeleteDeviceEvent>(deleteDevice);
on<ToggleEnableAlarmEvent>(_toggleLowBattery);
on<UnAssignSceneEvent>(_unAssignScene);
}
final TextEditingController nameController =
TextEditingController(text: deviceName);
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool closingReminder = false;
bool waterAlarm = false;
static String deviceName = '';
SixSceneModel deviceStatus = SixSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_5: '',
scene_6: '',
scene_id_group_id: '',
switch_backlight: false);
DeviceInfoModel deviceInfo = DeviceInfoModel(
activeTime: 0,
category: "",
categoryName: "",
createTime: 0,
gatewayId: "",
icon: "",
ip: "",
lat: "",
localKey: "",
lon: "",
model: "",
name: "",
nodeId: "",
online: false,
ownerId: "",
productName: "",
sub: false,
timeZone: "",
updateTime: 0,
uuid: "",
productUuid: "",
productType: "",
permissionType: "",
macAddress: "",
subspace: Subspace(
uuid: "",
createdAt: "",
updatedAt: "",
subspaceName: "",
),
);
bool enableAlarm = false;
void _toggleLowBattery(
ToggleEnableAlarmEvent event, Emitter<SixSceneState> emit) async {
emit(LoadingNewSate(device: deviceStatus));
try {
enableAlarm = event.isLowBatteryEnabled;
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
List<SubSpaceModel> roomsList = [];
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
void _assignDevice(AssignRoomEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
if (_hasSelectionChanged) {
await HomeManagementAPI.assignDeviceToRoom(
event.unit.community.uuid, event.unit.id, event.roomId, sixSceneId);
final devicesList = await DevicesAPI.getDevicesByRoomId(
communityUuid: event.unit.community.uuid,
spaceUuid: event.unit.id,
roomId: event.roomId);
List<String> allDevicesIds = [];
allDevices.forEach((element) {
allDevicesIds.add(element.uuid!);
});
await HomeCubit.getInstance().fetchUnitsByUserId();
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveSelectionSuccessState());
}
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
void _unAssignScene(
UnAssignSceneEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
if (_hasSelectionChanged) {
var response = await DevicesAPI.unAssignScenesDevice(
deviceUuid: event.switchSceneUuid);
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveSelectionSuccessState());
}
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
deleteDevice(DeleteDeviceEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
var response = await DevicesAPI.resetDevise(devicesUuid: sixSceneId);
add(const SixSceneInitialInfo());
CustomSnackBar.displaySnackBar('Reset Successfully');
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
//============================ fitch devise info and status =======================
/////////////////////////////////////////////////////////////////////////////////////
Future fetchDeviceInfo(
SixSceneInitialInfo event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
var response = await DevicesAPI.getDeviceInfo(sixSceneId);
deviceInfo = DeviceInfoModel.fromJson(response);
deviceName = deviceInfo.name;
emit(LoadingDeviceInfo(deviceInfo: deviceInfo));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
void _fetchDeviceStatus(
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,
);
add(const SexSceneSwitchInitial());
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
//============================ assign Scene =======================
/////////////////////////////////////////////////////////////////////////////////////
String selectedFormApiSceneId = '';
void getSceneByName(
GetSceneBySwitchName event, Emitter<SixSceneState> emit) async {
try {
// emit(SixSceneLoadingState());
final response = await DevicesAPI.getSceneBySwitchName(
deviceId: sixSceneId, switchName: event.switchName);
selectedFormApiSceneId = response['scene']['uuid'];
emit(SuccessState());
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
String selectedSceneId = '';
_selectScene(SelectSceneEvent event, Emitter<SixSceneState> emit) {
emit(SixSceneLoadingState());
if (event.isSelected == false) {
selectedSceneId = '';
selectedFormApiSceneId = '';
emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId));
} else {
selectedSceneId = event.selectedSceneId;
}
emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId));
}
List<SixSceneModel> fourScene = [];
void _fetchFourSceneSwitches(
SexSceneSwitchInitial event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
try {
var response = await DevicesAPI.getDeviceSceneInfo(sixSceneId);
Map<String, String> sceneTitles = {
"scene_1": '',
"scene_2": '',
"scene_3": '',
"scene_4": '',
"scene_5": '',
"scene_6": '',
};
for (var item in response) {
if (item["switchName"] != null) {
sceneTitles[item["switchName"]] = item["scene"]["name"] ?? '';
}
}
SixSceneModel deviceStatus = SixSceneModel(
scene_1: sceneTitles["scene_1"] ?? '',
scene_2: sceneTitles["scene_2"] ?? '',
scene_3: sceneTitles["scene_3"] ?? '',
scene_4: sceneTitles["scene_4"] ?? '',
scene_5: sceneTitles["scene_5"] ?? '',
scene_6: sceneTitles["scene_6"] ?? '',
scene_id_group_id: '',
switch_backlight: '',
);
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
return;
}
}
void assignScene(AssignDeviceScene event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
try {
if (event.sceneUuid == '') {
final response = await DevicesAPI.unAssignScenesDevice(
deviceUuid: sixSceneId, switchName: event.switchName);
} else {
final response = await DevicesAPI.postDeviceSceneInfo(
deviceId: sixSceneId,
sceneUuid: event.sceneUuid,
spaceUuid: event.unit!.id,
switchName: event.switchName);
}
emit(SaveSelectionSuccessState());
CustomSnackBar.displaySnackBar('Save Successfully');
} catch (e) {
emit(SixSceneFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
List<DeviceModel> allDevices = [];
bool switchStatus = true;
Future<void> changeSwitchStatus(
ChangeSwitchStatusEvent event, Emitter<SixSceneState> emit) async {
try {
emit(SixSceneLoadingState());
switchStatus = deviceStatus.switch_backlight;
switchStatus = !switchStatus;
final response = await DevicesAPI.controlDevice(
DeviceControlModel(
deviceId: sixSceneId,
code: 'switch_backlight',
value: switchStatus),
sixSceneId);
deviceStatus.switch_backlight = switchStatus;
Future.delayed(const Duration(milliseconds: 250), () {
add(const SexSceneSwitchInitial());
});
Future.delayed(const Duration(milliseconds: 250), () {
emit(ChangeSwitchState(isEnable: switchStatus));
emit(UpdateState(device: deviceStatus));
});
} catch (_) {
emit(const SixSceneFailedState(errorMessage: 'Something went wrong'));
}
}
Future<void> _onLoadScenes(
LoadScenes event, Emitter<SixSceneState> emit) async {
emit(SixSceneLoadingState());
try {
allScenes = await SceneApi.getScenesByUnitId(
event.unitId, event.unit.community.uuid,
showInDevice: event.showInDevice);
filteredScenes = allScenes;
emit(SceneLoaded(allScenes));
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(const SixSceneFailedState(errorMessage: 'Something went wrong'));
}
emit(SuccessState());
}
bool selecedScene = false;
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());
}
}
}

View File

@ -0,0 +1,177 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.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 GetSceneBySwitchName extends SixSceneEvent {
final String? switchName;
const GetSceneBySwitchName({this.switchName});
}
class SixSceneInitial extends SixSceneEvent {
const SixSceneInitial();
}
class SaveNameEvent extends SixSceneEvent {
const SaveNameEvent();
}
class UnAssignSceneEvent extends SixSceneEvent {
final String switchSceneUuid;
const UnAssignSceneEvent({required this.switchSceneUuid});
}
class SixSceneInitialInfo extends SixSceneEvent {
const SixSceneInitialInfo();
}
class SexSceneSwitchInitial extends SixSceneEvent {
const SexSceneSwitchInitial();
}
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 DeleteDeviceEvent 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 selectedSceneId;
final bool isSelected;
// final String unitId;
const SelectSceneEvent({
// required this.unitId,
required this.selectedSceneId,
required this.isSelected,
});
}
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;
const AddDeviceToGroup(this.device, this.icon);
}
class RemoveDeviceFromGroup extends SixSceneEvent {
final GroupDevicesModel device;
final String icon;
const RemoveDeviceFromGroup(this.device, this.icon);
}
class AssignDeviceScene extends SixSceneEvent {
final String? sceneUuid;
final String? switchName;
final SpaceModel? unit;
const AssignDeviceScene({
this.sceneUuid,
this.unit,
this.switchName,
});
}
class AssignRoomEvent extends SixSceneEvent {
final String roomId;
final SpaceModel unit;
final BuildContext context;
const AssignRoomEvent({
required this.roomId,
required this.unit,
required this.context,
});
@override
List<Object> get props => [
roomId,
unit,
context,
];
}
class ToggleUpdateEvent extends SixSceneEvent {
final bool? isUpdateEnabled;
const ToggleUpdateEvent({this.isUpdateEnabled});
}
class ToggleHelpfulEvent extends SixSceneEvent {
final bool? isHelpful;
const ToggleHelpfulEvent({this.isHelpful});
}

View File

@ -0,0 +1,125 @@
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/device_info_model.dart';
import 'package:syncrow_app/features/devices/model/six_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 SixSceneLoadingState extends SixSceneState {}
class SaveState 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 device;
const UpdateState({required this.device});
@override
List<Object> get props => [device];
}
class LoadingNewSate extends SixSceneState {
final SixSceneModel device;
const LoadingNewSate({required this.device});
@override
List<Object> get props => [device];
}
class NameEditingState extends SixSceneState {
final bool editName;
const NameEditingState({required this.editName});
}
class FaqLoadedState extends SixSceneState {
final List<SixSceneQuestionModel> filteredFaqQuestions;
const 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 SearchResultsState extends SixSceneState {}
class SuccessState extends SixSceneState {}
class SaveSelectionSuccessState extends SixSceneState {}
class OptionSelectedState extends SixSceneState {
final String selectedOption;
final bool hasSelectionChanged;
const OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}
class SceneSelectionUpdatedState extends SixSceneState {
final String selectedSceneId;
const SceneSelectionUpdatedState({required this.selectedSceneId});
}
class LoadingDeviceInfo extends SixSceneState {
final DeviceInfoModel deviceInfo;
const LoadingDeviceInfo({required this.deviceInfo});
@override
List<Object> get props => [deviceInfo];
}

View File

@ -0,0 +1,483 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_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_switch_model.dart';
import 'package:syncrow_app/features/devices/model/question_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.dart';
import 'package:syncrow_app/features/devices/model/status_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_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/home_management_api.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
class DeviceSettingBloc extends Bloc<DeviceSettingEvent, DeviceSettingState> {
final String deviceId;
DeviceSettingBloc({
required this.deviceId,
}) : super(const DeviceSettingState()) {
on<DeviceSettingInitial>(_fetchDeviceStatus);
on<DeviceSettingInitialInfo>(fetchDeviceInfo);
on<SaveNameEvent>(saveName);
on<ToggleNotificationEvent>(_toggleNotification);
on<ChangeNameEvent>(_changeName);
on<SearchFaqEvent>(_onSearchFaq);
on<FetchRoomsEvent>(_fetchRoomsAndDevices);
on<LoadSettings>(_onLoadSettings);
on<SearchSettingsEvent>(searchSetting);
on<AssignRoomEvent>(_assignDevice);
on<AddDeviceToGroup>(_addDeviceToGroup);
on<RemoveDeviceFromGroup>(_removeDeviceFromGroup);
on<DeviceSettingInitialQuestion>(_onDeviceSettingInitial);
on<FetchDeviceSetting>(_fetchDeviceSetting);
on<GetSettingBySwitchName>(getSettingByName);
on<SelectSettingEvent>(_selectSetting);
on<DeleteDeviceEvent>(deleteDevice);
on<ToggleEnableAlarmEvent>(_toggleLowBattery);
on<ToggleUpdateEvent>(_toggleUpdate);
on<ToggleHelpfulEvent>(_toggleHelpful);
on<SelectOptionEvent>(_onOptionSelected);
}
final TextEditingController nameController =
TextEditingController(text: deviceName);
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool closingReminder = false;
bool waterAlarm = false;
static String deviceName = '';
static String selectedRoomId = '';
bool selecedSetting = false;
bool enableAlarm = false;
List<FourSceneSwitchModel> fourSetting = [];
String _selectedOption = '';
bool _hasSelectionChanged = false;
FourSceneModelState deviceStatus = FourSceneModelState(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: false);
DeviceInfoModel deviceInfo = DeviceInfoModel(
activeTime: 0,
category: "",
categoryName: "",
createTime: 0,
gatewayId: "",
icon: "",
ip: "",
lat: "",
localKey: "",
lon: "",
model: "",
name: "",
nodeId: "",
online: false,
ownerId: "",
productName: "",
sub: false,
timeZone: "",
updateTime: 0,
uuid: "",
productUuid: "",
productType: "",
permissionType: "",
macAddress: "",
subspace: Subspace(
uuid: "",
createdAt: "",
updatedAt: "",
subspaceName: "",
),
);
//============================ get Setting and assign scene =======================
String selectedFormApiSettingId = '';
String selectedSettingId = '';
_selectSetting(SelectSettingEvent event, Emitter<DeviceSettingState> emit) {
emit(DeviceSettingLoadingState());
selectedSettingId = event.selectedSettingId;
emit(SettingSelectionUpdatedState(selectedSettingId: selectedSettingId));
}
void getSettingByName(
GetSettingBySwitchName event, Emitter<DeviceSettingState> emit) async {
// emit(DeviceSettingLoadingState());
try {
final response = await DevicesAPI.getSceneBySwitchName(
deviceId: deviceId, switchName: event.switchName);
selectedFormApiSettingId = response['scene']['uuid'];
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
}
}
void _fetchDeviceSetting(
FetchDeviceSetting event, Emitter<DeviceSettingState> emit) async {
emit(DeviceSettingLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(deviceId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = FourSceneModelState.fromJson(
statusModelList,
);
emit(UpdateState(device: deviceStatus));
Future.delayed(const Duration(milliseconds: 500));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
return;
}
}
//===================== fetch Device Status and info =======================
void _toggleLowBattery(
ToggleEnableAlarmEvent event, Emitter<DeviceSettingState> emit) async {
emit(LoadingNewSate(device: deviceStatus));
try {
enableAlarm = event.isLowBatteryEnabled;
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
}
}
void _fetchDeviceStatus(
DeviceSettingInitial event, Emitter<DeviceSettingState> emit) async {
emit(DeviceSettingLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(deviceId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = FourSceneModelState.fromJson(
statusModelList,
);
emit(SuccessState());
// add(const DeviceSettingSwitchInitial());
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
return;
}
}
Future fetchDeviceInfo(
DeviceSettingInitialInfo event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
var response = await DevicesAPI.getDeviceInfo(deviceId);
deviceInfo = DeviceInfoModel.fromJson(response);
deviceName = deviceInfo.name;
emit(LoadingDeviceInfo(deviceInfo: deviceInfo));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
}
}
void _onSearchFaq(SearchFaqEvent event, Emitter<DeviceSettingState> emit) {
emit(DeviceSettingLoadingState());
List<QuestionModel> _faqQuestions = faqQuestions.where((question) {
return question.question
.toLowerCase()
.contains(event.query.toLowerCase());
}).toList();
emit(FaqSearchState(filteredFaqQuestions: _faqQuestions));
}
//============================ assign Device ==================================
//////////////////////////////////////////////////////////////////////////////
void _toggleNotification(
ToggleNotificationEvent event, Emitter<DeviceSettingState> emit) async {
emit(LoadingNewSate(device: deviceStatus));
try {
enableAlarm = event.isClosingEnabled;
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
//========================= Question and faq ================================
final List<QuestionModel> faqQuestions = [
QuestionModel(
id: 1,
question:
'How does an 4 Setting Switch work? How long will an 4 Setting Switch persist?',
answer:
'Yes. In scenes with high detection requirements, we recommend that you choose phone or message notification in Automation.',
),
QuestionModel(
id: 2,
question: 'Does the 4 Setting Switch support sending notifications?',
answer:
'The SOS alarm will persist until it is manually turned off or after a set time.',
),
QuestionModel(
id: 3,
question:
'Why does the data statistics in the device panel not show the correct data?',
answer: 'Try restarting the device. If it persists, contact support.',
),
QuestionModel(
id: 4,
question:
'How long will the App show offline after a device (low-power devices and normal devices) is powered...',
answer:
'No, a network connection is required to send the alert to your contacts.',
),
];
bool? isHelpful;
void _toggleHelpful(
ToggleHelpfulEvent event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
isHelpful = event.isHelpful!;
emit(SaveState());
} catch (e) {
emit(
const DeviceSettingFailedState(errorMessage: 'Something went wrong'));
}
}
Future<void> _onDeviceSettingInitial(DeviceSettingInitialQuestion event,
Emitter<DeviceSettingState> emit) async {
emit(DeviceSettingLoadingState());
emit(FaqLoadedState(filteredFaqQuestions: faqQuestions));
}
List<DeviceModel> allDevices = [];
List<SubSpaceModel> roomsList = [];
bool switchStatus = true;
Future<void> _onLoadSettings(
LoadSettings event, Emitter<DeviceSettingState> emit) async {
emit(DeviceSettingLoadingState());
try {
if (event.unitId.isNotEmpty) {
// allSettings = await DevicesAPI.getDveByUnitId(
// event.unitId, event.unit.community.uuid,
// showInDevice: event.showInDevice);
filteredSettings = allSettings;
emit(SettingLoaded(allSettings));
} else {
emit(const DeviceSettingFailedState(errorMessage: 'Unit ID is empty'));
}
} catch (e) {
emit(
const DeviceSettingFailedState(errorMessage: 'Something went wrong'));
}
}
List<ScenesModel> allSettings = [];
List<ScenesModel> filteredSettings = [];
void searchSetting(
SearchSettingsEvent event, Emitter<DeviceSettingState> emit) {
emit(DeviceSettingLoadingState());
filteredSettings = event.query.isEmpty
? allSettings
: allSettings.where((scene) {
final sceneName = scene.name?.toLowerCase() ?? '';
return sceneName.contains(event.query.toLowerCase());
}).toList();
emit(SearchResultsState());
}
List<GroupDevicesModel> groupDevices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.minusIcon, name: '6 Setting Switch')
];
List<GroupDevicesModel> devices = [
GroupDevicesModel(
dec: 'Syncroom', icon: Assets.addDevicesIcon, name: '6 Setting Switch')
];
// Handler for AddDeviceToGroup
void _addDeviceToGroup(
AddDeviceToGroup event, Emitter<DeviceSettingState> 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<DeviceSettingState> emit) {
groupDevices.remove(event.device);
devices.add(event.device);
for (var device in groupDevices) {
device.icon = event.icon;
}
emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
}
//=========================== assign device to room ==========================
void _assignDevice(
AssignRoomEvent event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
if (_hasSelectionChanged) {
await HomeManagementAPI.assignDeviceToRoom(
event.unit.community.uuid, event.unit.id, event.roomId, deviceId);
final devicesList = await DevicesAPI.getDevicesByRoomId(
communityUuid: event.unit.community.uuid,
spaceUuid: event.unit.id,
roomId: event.roomId);
List<String> allDevicesIds = [];
allDevices.forEach((element) {
allDevicesIds.add(element.uuid!);
});
await HomeCubit.getInstance().fetchUnitsByUserId();
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveSelectionSuccessState());
}
} catch (e) {
emit(
const DeviceSettingFailedState(errorMessage: 'Something went wrong'));
return;
}
}
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(
const DeviceSettingFailedState(errorMessage: 'Something went wrong'));
return;
}
}
//============================ setting name ==================================
//////////////////////////////////////////////////////////////////////////////
void _changeName(ChangeNameEvent event, Emitter<DeviceSettingState> emit) {
emit(DeviceSettingLoadingState());
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
bool _validateInputs() {
final nameError = fullNameValidator(nameController.text);
if (nameError != null) {
CustomSnackBar.displaySnackBar(nameError);
return true;
}
return false;
}
String? fullNameValidator(String? value) {
if (value == null) return 'name is required';
final withoutExtraSpaces = value.replaceAll(RegExp(r"\s+"), ' ').trim();
if (withoutExtraSpaces.length < 2 || withoutExtraSpaces.length > 30) {
return 'name must be between 2 and 30 characters long';
}
if (RegExp(r"/[^ a-zA-Z0-9-\']/").hasMatch(withoutExtraSpaces)) {
return 'Only alphanumeric characters, space, dash and single quote are allowed';
}
return null;
}
Future<void> saveName(
SaveNameEvent event, Emitter<DeviceSettingState> emit) async {
if (_validateInputs()) return;
try {
add(const ChangeNameEvent(value: false));
isSaving = true;
emit(DeviceSettingLoadingState());
var response = await DevicesAPI.putDeviceName(
deviceId: deviceId, deviceName: nameController.text);
add(const DeviceSettingInitialInfo());
await HomeCubit.getInstance().fetchUnitsByUserId();
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveState());
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
} finally {
isSaving = false;
}
}
//====================== update device ==============================
bool enableUpdate = false;
void _toggleUpdate(
ToggleUpdateEvent event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
enableUpdate = event.isUpdateEnabled!;
emit(SaveState());
} catch (e) {
emit(
const DeviceSettingFailedState(errorMessage: 'Something went wrong'));
}
}
deleteDevice(
DeleteDeviceEvent event, Emitter<DeviceSettingState> emit) async {
try {
emit(DeviceSettingLoadingState());
var response = await DevicesAPI.resetDevise(devicesUuid: deviceId);
CustomSnackBar.displaySnackBar('Reset Successfully');
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(DeviceSettingFailedState(errorMessage: e.toString()));
return;
}
}
void _onOptionSelected(
SelectOptionEvent event, Emitter<DeviceSettingState> emit) {
emit(DeviceSettingLoadingState());
_selectedOption = event.selectedOption;
_hasSelectionChanged = true;
emit(OptionSelectedState(
selectedOption: _selectedOption,
hasSelectionChanged: _hasSelectionChanged));
}
}

View File

@ -0,0 +1,171 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.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 DeviceSettingEvent extends Equatable {
const DeviceSettingEvent();
@override
List<Object> get props => [];
}
class DeviceSettingInitialInfo extends DeviceSettingEvent {
const DeviceSettingInitialInfo();
}
class DeviceSettingInitial extends DeviceSettingEvent {
const DeviceSettingInitial();
}
class SaveNameEvent extends DeviceSettingEvent {
final String? deviceName;
const SaveNameEvent({this.deviceName});
}
class ToggleEnableAlarmEvent extends DeviceSettingEvent {
final bool isLowBatteryEnabled;
const ToggleEnableAlarmEvent(this.isLowBatteryEnabled);
@override
List<Object> get props => [isLowBatteryEnabled];
}
class ToggleNotificationEvent extends DeviceSettingEvent {
final bool isClosingEnabled;
const ToggleNotificationEvent(this.isClosingEnabled);
@override
List<Object> get props => [isClosingEnabled];
}
class DeleteDeviceEvent extends DeviceSettingEvent {}
class ChangeNameEvent extends DeviceSettingEvent {
final bool? value;
const ChangeNameEvent({this.value});
}
class SearchFaqEvent extends DeviceSettingEvent {
final String query;
const SearchFaqEvent(this.query);
}
class DeviceSettingInitialQuestion extends DeviceSettingEvent {
const DeviceSettingInitialQuestion();
}
// class ChangeSwitchStatusEvent extends DeviceSettingEvent {}
class FetchRoomsEvent extends DeviceSettingEvent {
final SpaceModel unit;
const FetchRoomsEvent({required this.unit});
@override
List<Object> get props => [unit];
}
class LoadSettings extends DeviceSettingEvent {
final String unitId;
final bool showInDevice;
final SpaceModel unit;
const LoadSettings(
{required this.unitId, required this.unit, this.showInDevice = false});
@override
List<Object> get props => [unitId, showInDevice];
}
class SelectSettingEvent extends DeviceSettingEvent {
final String selectedSettingId;
// final String unitId;
const SelectSettingEvent({
// required this.unitId,
required this.selectedSettingId,
});
}
class SearchSettingsEvent extends DeviceSettingEvent {
final String query;
const SearchSettingsEvent({
required this.query,
});
}
class SelectOptionEvent extends DeviceSettingEvent {
final dynamic selectedOption;
const SelectOptionEvent({
this.selectedOption,
});
}
class AddDeviceToGroup extends DeviceSettingEvent {
final GroupDevicesModel device;
final String icon;
const AddDeviceToGroup(this.device, this.icon);
}
class RemoveDeviceFromGroup extends DeviceSettingEvent {
final GroupDevicesModel device;
final String icon;
const RemoveDeviceFromGroup(this.device, this.icon);
}
class AssignRoomEvent extends DeviceSettingEvent {
final String roomId;
final SpaceModel unit;
final BuildContext context;
const AssignRoomEvent({
required this.roomId,
required this.unit,
required this.context,
});
@override
List<Object> get props => [
roomId,
unit,
context,
];
}
class FetchDeviceSetting extends DeviceSettingEvent {}
// class DeviceSettingSwitchInitial extends DeviceSettingEvent {
// const DeviceSettingSwitchInitial();
// }
class AssignDeviceSetting extends DeviceSettingEvent {
final String? sceneUuid;
final String? switchName;
final SpaceModel? unit;
const AssignDeviceSetting({
this.sceneUuid,
this.unit,
this.switchName,
});
}
class GetSettingBySwitchName extends DeviceSettingEvent {
final String? switchName;
const GetSettingBySwitchName({this.switchName});
}
class ToggleUpdateEvent extends DeviceSettingEvent {
final bool? isUpdateEnabled;
const ToggleUpdateEvent({this.isUpdateEnabled});
}
class ToggleHelpfulEvent extends DeviceSettingEvent {
final bool? isHelpful;
const ToggleHelpfulEvent({this.isHelpful});
}

View File

@ -0,0 +1,125 @@
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/question_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
class DeviceSettingState extends Equatable {
const DeviceSettingState();
@override
List<Object> get props => [];
}
class DeviceSettingLoadingState extends DeviceSettingState {}
class UpdateStateList extends DeviceSettingState {
final List<GroupDevicesModel> groupDevices;
final List<GroupDevicesModel> devices;
const UpdateStateList({required this.groupDevices, required this.devices});
}
class DeviceSettingFailedState extends DeviceSettingState {
final String errorMessage;
const DeviceSettingFailedState({required this.errorMessage});
@override
List<Object> get props => [errorMessage];
}
class UpdateState extends DeviceSettingState {
final FourSceneModelState device;
const UpdateState({required this.device});
@override
List<Object> get props => [device];
}
class LoadingNewSate extends DeviceSettingState {
final FourSceneModelState device;
const LoadingNewSate({required this.device});
@override
List<Object> get props => [device];
}
class NameEditingState extends DeviceSettingState {
final bool editName;
const NameEditingState({required this.editName});
}
class FaqLoadedState extends DeviceSettingState {
final List<QuestionModel> filteredFaqQuestions;
const FaqLoadedState({this.filteredFaqQuestions = const []});
}
class FaqSearchState extends DeviceSettingState {
final List<QuestionModel> filteredFaqQuestions;
const FaqSearchState({this.filteredFaqQuestions = const []});
}
class FetchRoomsState extends DeviceSettingState {
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 DeviceSettingState {
final bool isEnable;
const ChangeSwitchState({required this.isEnable});
}
class SettingLoaded extends DeviceSettingState {
final List<ScenesModel> scenes;
final String? loadingSettingId;
final Map<String, bool> loadingStates;
const SettingLoaded(this.scenes,
{this.loadingSettingId, this.loadingStates = const {}});
}
class SearchResultsState extends DeviceSettingState {}
class SaveState extends DeviceSettingState {}
class SuccessState extends DeviceSettingState {}
class SaveSelectionSuccessState extends DeviceSettingState {}
class OptionSelectedState extends DeviceSettingState {
final String selectedOption;
final bool hasSelectionChanged;
const OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}
class LoadingDeviceInfo extends DeviceSettingState {
final DeviceInfoModel deviceInfo;
const LoadingDeviceInfo({required this.deviceInfo});
@override
List<Object> get props => [deviceInfo];
}
class SettingSelectionUpdatedState extends DeviceSettingState {
final String selectedSettingId;
const SettingSelectionUpdatedState({required this.selectedSettingId});
}

View File

@ -0,0 +1,330 @@
import 'dart:async';
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_control_model.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_switch_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.dart';
import 'package:syncrow_app/features/devices/model/status_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/scene/model/scenes_model.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
import 'package:syncrow_app/services/api/scene_api.dart';
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
final String fourSceneId;
FourSceneBloc({
required this.fourSceneId,
}) : super(const FourSceneState()) {
on<FourSceneInitial>(_fetchDeviceStatus);
on<FourSceneInitialInfo>(fetchDeviceInfo);
on<ToggleNotificationEvent>(_toggleNotification);
on<ChangeSwitchStatusEvent>(changeSwitchStatus);
on<LoadScenes>(_onLoadScenes);
on<SearchScenesEvent>(searchScene);
on<SelectOptionEvent>(_onOptionSelected);
on<FetchDeviceScene>(_fetchDeviceScene);
on<FourSceneSwitchInitial>(_fetchFourSceneSwitches);
on<AssignDeviceScene>(assignScene);
on<GetSceneBySwitchName>(getSceneByName);
on<SelectSceneEvent>(_selectScene);
on<ToggleEnableAlarmEvent>(_toggleLowBattery);
}
final TextEditingController nameController =
TextEditingController(text: deviceName);
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool closingReminder = false;
bool waterAlarm = false;
static String deviceName = '';
static String selectedRoomId = '';
bool selecedScene = false;
bool enableAlarm = false;
List<FourSceneSwitchModel> fourScene = [];
String _selectedOption = '';
bool _hasSelectionChanged = false;
FourSceneModelState deviceStatus = FourSceneModelState(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: false);
DeviceInfoModel deviceInfo = DeviceInfoModel(
activeTime: 0,
category: "",
categoryName: "",
createTime: 0,
gatewayId: "",
icon: "",
ip: "",
lat: "",
localKey: "",
lon: "",
model: "",
name: "",
nodeId: "",
online: false,
ownerId: "",
productName: "",
sub: false,
timeZone: "",
updateTime: 0,
uuid: "",
productUuid: "",
productType: "",
permissionType: "",
macAddress: "",
subspace: Subspace(
uuid: "",
createdAt: "",
updatedAt: "",
subspaceName: "",
),
);
//============================ get Scene and assign scene =======================
String selectedFormApiSceneId = '';
String selectedSceneId = '';
_selectScene(SelectSceneEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
if (event.isSelected == false) {
selectedSceneId = '';
selectedFormApiSceneId = '';
emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId));
} else {
selectedSceneId = event.selectedSceneId;
}
emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId));
}
void getSceneByName(
GetSceneBySwitchName event, Emitter<FourSceneState> emit) async {
// emit(FourSceneLoadingState());
try {
final response = await DevicesAPI.getSceneBySwitchName(
deviceId: fourSceneId, switchName: event.switchName);
selectedFormApiSceneId = response['scene']['uuid'];
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
void _onOptionSelected(
SelectOptionEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
_selectedOption = event.selectedOption;
_hasSelectionChanged = true;
emit(OptionSelectedState(
selectedOption: _selectedOption,
hasSelectionChanged: _hasSelectionChanged));
}
void _fetchFourSceneSwitches(
FourSceneSwitchInitial event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
try {
var response = await DevicesAPI.getDeviceSceneInfo(fourSceneId);
Map<String, String> sceneTitles = {
"scene_1": '',
"scene_2": '',
"scene_3": '',
"scene_4": '',
};
for (var item in response) {
if (item["switchName"] != null) {
sceneTitles[item["switchName"]] = item["scene"]["name"] ?? '';
}
}
FourSceneModelState deviceStatus = FourSceneModelState(
scene_1: sceneTitles["scene_1"] ?? '',
scene_2: sceneTitles["scene_2"] ?? '',
scene_3: sceneTitles["scene_3"] ?? '',
scene_4: sceneTitles["scene_4"] ?? '',
scene_id_group_id: '',
switch_backlight: '',
);
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
void assignScene(
AssignDeviceScene event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
try {
if (event.sceneUuid == '') {
final response = await DevicesAPI.unAssignScenesDevice(
deviceUuid: fourSceneId, switchName: event.switchName);
} else {
final response = await DevicesAPI.postDeviceSceneInfo(
deviceId: fourSceneId,
sceneUuid: event.sceneUuid,
spaceUuid: event.unit!.id,
switchName: event.switchName);
}
emit(SaveSelectionSuccessState());
CustomSnackBar.displaySnackBar('Save Successfully');
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
void _fetchDeviceScene(
FetchDeviceScene 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 = FourSceneModelState.fromJson(
statusModelList,
);
emit(UpdateState(device: deviceStatus));
Future.delayed(const Duration(milliseconds: 500));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
//===================== fetch Device Status and info =======================
void _toggleLowBattery(
ToggleEnableAlarmEvent event, Emitter<FourSceneState> emit) async {
emit(LoadingNewSate(device: deviceStatus));
try {
enableAlarm = event.isLowBatteryEnabled;
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
void _fetchDeviceStatus(
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 = FourSceneModelState.fromJson(
statusModelList,
);
add(const FourSceneSwitchInitial());
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
Future fetchDeviceInfo(
FourSceneInitialInfo event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
var response = await DevicesAPI.getDeviceInfo(fourSceneId);
deviceInfo = DeviceInfoModel.fromJson(response);
deviceName = deviceInfo.name;
emit(LoadingDeviceInfo(deviceInfo: deviceInfo));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
//============================ assign Device ==================================
//////////////////////////////////////////////////////////////////////////////
void _toggleNotification(
ToggleNotificationEvent event, Emitter<FourSceneState> emit) async {
emit(LoadingNewSate(device: deviceStatus));
try {
enableAlarm = event.isClosingEnabled;
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
List<DeviceModel> allDevices = [];
List<SubSpaceModel> roomsList = [];
bool switchStatus = true;
Future<void> changeSwitchStatus(
ChangeSwitchStatusEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
switchStatus = deviceStatus.switch_backlight;
switchStatus = !switchStatus;
final response = await DevicesAPI.controlDevice(
DeviceControlModel(
deviceId: fourSceneId,
code: 'switch_backlight',
value: switchStatus),
fourSceneId);
deviceStatus.switch_backlight = switchStatus;
Future.delayed(const Duration(milliseconds: 200), () {
add(const FourSceneSwitchInitial());
});
Future.delayed(const Duration(milliseconds: 200), () {
emit(ChangeSwitchState(isEnable: switchStatus));
emit(UpdateState(device: deviceStatus));
});
} catch (_) {
add(const FourSceneInitial());
}
}
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);
filteredScenes = allScenes;
emit(SceneLoaded(allScenes));
} else {
emit(const FourSceneFailedState(errorMessage: 'Unit ID is empty'));
}
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
}
}
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());
}
}

View File

@ -0,0 +1,180 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.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 FourSceneInitialInfo extends FourSceneEvent {
const FourSceneInitialInfo();
}
class FourSceneInitial extends FourSceneEvent {
const FourSceneInitial();
}
class SaveNameEvent extends FourSceneEvent {
final String? deviceName;
const SaveNameEvent({this.deviceName});
}
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 DeleteDeviceEvent 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 selectedSceneId;
final bool isSelected;
// final String unitId;
const SelectSceneEvent({
// required this.unitId,
required this.selectedSceneId,
required this.isSelected,
});
}
class SearchScenesEvent extends FourSceneEvent {
final String query;
const SearchScenesEvent({
required this.query,
});
}
class SelectOptionEvent extends FourSceneEvent {
final dynamic selectedOption;
const SelectOptionEvent({
this.selectedOption,
});
}
class AddDeviceToGroup extends FourSceneEvent {
final GroupDevicesModel device;
final String icon;
const AddDeviceToGroup(this.device, this.icon);
}
class RemoveDeviceFromGroup extends FourSceneEvent {
final GroupDevicesModel device;
final String icon;
const RemoveDeviceFromGroup(this.device, this.icon);
}
class AssignRoomEvent extends FourSceneEvent {
final String roomId;
final SpaceModel unit;
final BuildContext context;
const AssignRoomEvent({
required this.roomId,
required this.unit,
required this.context,
});
@override
List<Object> get props => [
roomId,
unit,
context,
];
}
class FetchDeviceScene extends FourSceneEvent {}
class FourSceneSwitchInitial extends FourSceneEvent {
const FourSceneSwitchInitial();
}
class UnAssignSceneEvent extends FourSceneEvent {
final String deviceUuid;
final String switchName;
const UnAssignSceneEvent(
{required this.deviceUuid, required this.switchName});
}
class AssignDeviceScene extends FourSceneEvent {
final String? sceneUuid;
final String? switchName;
final SpaceModel? unit;
const AssignDeviceScene({
this.sceneUuid,
this.unit,
this.switchName,
});
}
class GetSceneBySwitchName extends FourSceneEvent {
final String? switchName;
const GetSceneBySwitchName({this.switchName});
}
class ToggleUpdateEvent extends FourSceneEvent {
final bool? isUpdateEnabled;
const ToggleUpdateEvent({this.isUpdateEnabled});
}
class ToggleHelpfulEvent extends FourSceneEvent {
final bool? isHelpful;
const ToggleHelpfulEvent({this.isHelpful});
}

View File

@ -0,0 +1,124 @@
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/question_model.dart';
import 'package:syncrow_app/features/devices/model/group_devices_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_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 FourSceneLoadingState 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 FourSceneModelState device;
const UpdateState({required this.device});
@override
List<Object> get props => [device];
}
class LoadingNewSate extends FourSceneState {
final FourSceneModelState device;
const LoadingNewSate({required this.device});
@override
List<Object> get props => [device];
}
class NameEditingState extends FourSceneState {
final bool editName;
const NameEditingState({required this.editName});
}
class FaqLoadedState extends FourSceneState {
final List<QuestionModel> filteredFaqQuestions;
const FaqLoadedState({this.filteredFaqQuestions = const []});
}
class FaqSearchState extends FourSceneState {
final List<QuestionModel> 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 SearchResultsState extends FourSceneState {}
class SaveState extends FourSceneState {}
class SaveSelectionSuccessState extends FourSceneState {}
class OptionSelectedState extends FourSceneState {
final String selectedOption;
final bool hasSelectionChanged;
const OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}
class LoadingDeviceInfo extends FourSceneState {
final DeviceInfoModel deviceInfo;
const LoadingDeviceInfo({required this.deviceInfo});
@override
List<Object> get props => [deviceInfo];
}
class SceneSelectionUpdatedState extends FourSceneState {
final String selectedSceneId;
const SceneSelectionUpdatedState({required this.selectedSceneId});
}

View File

@ -0,0 +1,422 @@
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/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/app_layout/model/community_model.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart';
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.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/question_model.dart';
import 'package:syncrow_app/features/devices/model/sos_model.dart';
import 'package:syncrow_app/features/devices/model/status_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/services/api/devices_api.dart';
import 'package:syncrow_app/services/api/home_management_api.dart';
import 'package:syncrow_app/services/api/spaces_api.dart';
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
class SosBloc extends Bloc<SosEvent, SosState> {
final String sosId;
SosBloc({
required this.sosId,
}) : super(const SosState()) {
on<SosInitial>(_fetchStatus);
on<ReportLogsInitial>(fetchLogsForLastMonth);
on<ToggleEnableAlarmEvent>(_toggleLowBattery);
on<ToggleClosingReminderEvent>(_toggleClosingReminder);
on<ChangeNameEvent>(_changeName);
on<SearchFaqEvent>(_onSearchFaq);
on<SosInitialQuestion>(_onSosInitial);
on<FetchRoomsEvent>(_fetchRoomsAndDevices);
on<SelectOptionEvent>(_onOptionSelected);
on<SaveSelectionEvent>(_onSaveSelection);
on<AssignRoomEvent>(_assignDevice);
on<SosInitialDeviseInfo>(fetchDeviceInfo);
on<SaveNameEvent>(saveName);
on<ToggleUpdateEvent>(_toggleUpdate);
on<ToggleHelpfulEvent>(_toggleHelpful);
}
final TextEditingController nameController =
TextEditingController(text: deviceName);
bool isSaving = false;
bool editName = false;
final FocusNode focusNode = FocusNode();
bool enableAlarm = false;
bool closingReminder = false;
SosModel deviceStatus =
SosModel(sosContactState: 'sos', batteryPercentage: 0);
DeviceInfoModel deviceInfo = DeviceInfoModel(
activeTime: 0,
category: "",
categoryName: "",
createTime: 0,
gatewayId: "",
icon: "",
ip: "",
lat: "",
localKey: "",
lon: "",
model: "",
name: "",
nodeId: "",
online: false,
ownerId: "",
productName: "",
sub: false,
timeZone: "",
updateTime: 0,
uuid: "",
productUuid: "",
productType: "",
permissionType: "",
macAddress: "",
subspace: Subspace(
uuid: "",
createdAt: "",
updatedAt: "",
subspaceName: "",
),
);
void _toggleLowBattery(
ToggleEnableAlarmEvent event, Emitter<SosState> emit) async {
emit(LoadingNewSate(sosSensor: deviceStatus));
try {
enableAlarm = event.isLowBatteryEnabled;
emit(UpdateState(sensor: deviceStatus));
await DevicesAPI.controlDevice(
DeviceControlModel(
deviceId: sosId,
code: 'low_battery',
value: enableAlarm,
),
sosId,
);
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
void _toggleClosingReminder(
ToggleClosingReminderEvent event, Emitter<SosState> emit) async {
emit(LoadingNewSate(sosSensor: deviceStatus));
try {
closingReminder = event.isClosingReminderEnabled;
emit(UpdateState(sensor: deviceStatus));
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []);
Future<void> fetchLogsForLastMonth(
ReportLogsInitial event, Emitter<SosState> 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(SosLoadingState());
var response = await DevicesAPI.getReportLogs(
startTime: startTime.toString(),
endTime: endTime.toString(),
deviceUuid: sosId,
code: 'sos',
);
recordGroups = response;
emit(UpdateState(sensor: deviceStatus));
} on DioException catch (e) {
final errorData = e.response!.data;
String errorMessage = errorData['message'];
emit(SosFailedState(errorMessage: e.toString()));
}
}
//========================= Device Info & Status =============================
static String deviceName = '';
fetchDeviceInfo(SosInitialDeviseInfo event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
var response = await DevicesAPI.getDeviceInfo(sosId);
deviceInfo = DeviceInfoModel.fromJson(response);
deviceName = deviceInfo.name;
emit(LoadingSosDeviceInfo(deviceInfo: deviceInfo));
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
void _fetchStatus(SosInitial event, Emitter<SosState> emit) async {
emit(SosLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(sosId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = SosModel.fromJson(
statusModelList,
);
emit(UpdateState(sensor: deviceStatus));
Future.delayed(const Duration(milliseconds: 500));
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
return;
}
}
//========================= assign & unassign devise to room =============================
List<DeviceModel> allDevices = [];
List<SubSpaceModel> roomsList = [];
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(const SosFailedState(errorMessage: 'Something went wrong'));
return;
}
}
String roomId = '';
SpaceModel unit =
SpaceModel(id: '', name: '', community: Community(uuid: '', name: ''));
String _selectedOption = '';
bool _hasSelectionChanged = false;
void _onOptionSelected(SelectOptionEvent event, Emitter<SosState> emit) {
emit(SosLoadingState());
_selectedOption = event.selectedOption;
_hasSelectionChanged = true;
emit(OptionSelectedState(
selectedOption: _selectedOption,
hasSelectionChanged: _hasSelectionChanged));
}
void _onSaveSelection(SaveSelectionEvent event, Emitter<SosState> emit) {
if (_hasSelectionChanged) {
_hasSelectionChanged = false;
add(AssignRoomEvent(roomId: roomId, unit: unit, context: event.context));
emit(SaveSelectionSuccessState());
var cubit = HomeCubit.getInstance();
cubit.updatePageIndex(1);
Navigator.pushReplacementNamed(event.context, Routes.homeRoute);
}
}
void _assignDevice(AssignRoomEvent event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
await HomeManagementAPI.assignDeviceToRoom(
event.unit.community.uuid, event.unit.id, event.roomId, sosId);
final devicesList = await DevicesAPI.getDevicesByRoomId(
communityUuid: event.unit.community.uuid,
spaceUuid: event.unit.id,
roomId: event.roomId);
List<String> allDevicesIds = [];
allDevices.forEach((element) {
allDevicesIds.add(element.uuid!);
});
await HomeCubit.getInstance().fetchUnitsByUserId();
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveSelectionSuccessState());
} catch (e) {
emit(const SosFailedState(errorMessage: 'Something went wrong'));
return;
}
}
void _unassignDevice(UnassignRoomEvent event, Emitter<SosState> emit) async {
try {
Map<String, bool> roomDevicesId = {};
emit(SosLoadingState());
await HomeManagementAPI.unAssignDeviceToRoom(
event.unit.community.uuid, event.unit.id, event.roomId, sosId);
final devicesList = await DevicesAPI.getDevicesByRoomId(
communityUuid: event.unit.community.uuid,
spaceUuid: event.unit.id,
roomId: event.roomId);
List<String> allDevicesIds = [];
allDevices.forEach((element) {
allDevicesIds.add(element.uuid!);
});
devicesList.forEach((e) {
if (allDevicesIds.contains(e.uuid!)) {
roomDevicesId[e.uuid!] = true;
} else {
roomDevicesId[e.uuid!] = false;
}
});
} catch (e) {
emit(const SosFailedState(errorMessage: 'Something went wrong'));
return;
}
}
Map<String, List<DeviceModel>> devicesByRoom = {};
//======================= setting name ======================================
Future<void> saveName(SaveNameEvent event, Emitter<SosState> emit) async {
if (_validateInputs()) return;
try {
add(const ChangeNameEvent(value: false));
isSaving = true;
emit(SosLoadingState());
var response = await DevicesAPI.putDeviceName(
deviceId: sosId, deviceName: nameController.text);
add(SosInitialDeviseInfo());
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveState());
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
} finally {
isSaving = false;
}
}
bool _validateInputs() {
final nameError = fullNameValidator(nameController.text);
if (nameError != null) {
CustomSnackBar.displaySnackBar(nameError);
return true;
}
return false;
}
String? fullNameValidator(String? value) {
if (value == null) return 'name is required';
final withoutExtraSpaces = value.replaceAll(RegExp(r"\s+"), ' ').trim();
if (withoutExtraSpaces.length < 2 || withoutExtraSpaces.length > 30) {
return 'name must be between 2 and 30 characters long';
}
if (RegExp(r"/[^ a-zA-Z0-9-\']/").hasMatch(withoutExtraSpaces)) {
return 'Only alphanumeric characters, space, dash and single quote are allowed';
}
return null;
}
void _changeName(ChangeNameEvent event, Emitter<SosState> emit) {
emit(SosLoadingState());
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
//============================== update setting ===============================
bool enableUpdate = false;
void _toggleUpdate(ToggleUpdateEvent event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
enableUpdate = event.isUpdateEnabled!;
emit(SaveState());
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
//============================ Question and faq ============================
final List<QuestionModel> faqQuestions = [
QuestionModel(
id: 1,
question: 'How does an SOS emergency button work?',
answer:
'The SOS emergency button sends an alert to your contacts when pressed.',
),
QuestionModel(
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.',
),
QuestionModel(
id: 3,
question: 'What should I do if the SOS button is unresponsive?',
answer: 'Try restarting the device. If it persists, contact support.',
),
QuestionModel(
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.',
),
QuestionModel(
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> _onSosInitial(
SosInitialQuestion event, Emitter<SosState> emit) async {
emit(SosLoadingState());
emit(FaqLoadedState(filteredFaqQuestions: faqQuestions));
}
void _onSearchFaq(SearchFaqEvent event, Emitter<SosState> emit) {
emit(SosLoadingState());
List<QuestionModel> _faqQuestions = faqQuestions.where((question) {
return question.question
.toLowerCase()
.contains(event.query.toLowerCase());
}).toList();
emit(FaqSearchState(filteredFaqQuestions: _faqQuestions));
}
bool isHelpful = false;
void _toggleHelpful(ToggleHelpfulEvent event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
isHelpful = event.isHelpful!;
emit(SaveState());
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
//===================== delete Device ===================================
deleteDevice(DeleteDeviceEvent event, Emitter<SosState> emit) async {
try {
emit(SosLoadingState());
var response = await DevicesAPI.resetDevise(devicesUuid: sosId);
add(SosInitialDeviseInfo());
add(const SosInitial());
CustomSnackBar.displaySnackBar('Reset Successfully');
} catch (e) {
emit(SosFailedState(errorMessage: e.toString()));
}
}
}

View File

@ -0,0 +1,131 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.dart';
abstract class SosEvent extends Equatable {
const SosEvent();
@override
List<Object> get props => [];
}
class DeleteDeviceEvent extends SosEvent {}
class SosInitialDeviseInfo extends SosEvent {}
class SosInitial extends SosEvent {
const SosInitial();
}
class ReportLogsInitial extends SosEvent {
const ReportLogsInitial();
}
class ToggleEnableAlarmEvent extends SosEvent {
final bool isLowBatteryEnabled;
const ToggleEnableAlarmEvent(this.isLowBatteryEnabled);
@override
List<Object> get props => [isLowBatteryEnabled];
}
class ToggleClosingReminderEvent extends SosEvent {
final bool isClosingReminderEnabled;
const ToggleClosingReminderEvent(this.isClosingReminderEnabled);
@override
List<Object> get props => [isClosingReminderEnabled];
}
class SaveNameEvent extends SosEvent {}
class ChangeNameEvent extends SosEvent {
final bool? value;
const ChangeNameEvent({this.value});
}
class SearchFaqEvent extends SosEvent {
final String query;
const SearchFaqEvent(this.query);
}
class SosInitialQuestion extends SosEvent {
const SosInitialQuestion();
}
class FetchRoomsEvent extends SosEvent {
final SpaceModel unit;
const FetchRoomsEvent({required this.unit});
@override
List<Object> get props => [unit];
}
class SelectOptionEvent extends SosEvent {
dynamic selectedOption;
SelectOptionEvent({
this.selectedOption,
});
}
class SaveSelectionEvent extends SosEvent {
BuildContext context;
SaveSelectionEvent({
required this.context,
});
}
class AssignRoomEvent extends SosEvent {
final String roomId;
final SpaceModel unit;
final BuildContext context;
const AssignRoomEvent({
required this.roomId,
required this.unit,
required this.context,
});
@override
List<Object> get props => [
roomId,
unit,
context,
];
}
class UnassignRoomEvent extends SosEvent {
final String roomId;
final String deviceId;
final SpaceModel unit;
const UnassignRoomEvent(
{required this.roomId, required this.deviceId, required this.unit});
@override
List<Object> get props => [roomId, unit];
}
class LoadingDeviceInfo extends SosEvent {
DeviceInfoModel deviceInfo;
LoadingDeviceInfo({required this.deviceInfo});
@override
List<Object> get props => [deviceInfo];
}
class ToggleUpdateEvent extends SosEvent {
final bool? isUpdateEnabled;
const ToggleUpdateEvent({this.isUpdateEnabled});
}
class ToggleHelpfulEvent extends SosEvent {
final bool? isHelpful;
const ToggleHelpfulEvent({this.isHelpful});
}

View File

@ -0,0 +1,93 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/device_info_model.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/question_model.dart';
import 'package:syncrow_app/features/devices/model/sos_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
class SosState extends Equatable {
const SosState();
@override
List<Object> get props => [];
}
class SosLoadingState extends SosState {}
class SaveState extends SosState {}
class LoadingSosDeviceInfo extends SosState {
final DeviceInfoModel? deviceInfo;
const LoadingSosDeviceInfo({this.deviceInfo});
}
class SosFailedState extends SosState {
final String errorMessage;
const SosFailedState({required this.errorMessage});
@override
List<Object> get props => [errorMessage];
}
class UpdateState extends SosState {
final SosModel sensor;
const UpdateState({required this.sensor});
@override
List<Object> get props => [sensor];
}
class LoadingNewSate extends SosState {
final SosModel sosSensor;
const LoadingNewSate({required this.sosSensor});
@override
List<Object> get props => [sosSensor];
}
class NameEditingState extends SosState {
final bool editName;
NameEditingState({required this.editName});
}
class FaqLoadedState extends SosState {
final List<QuestionModel> filteredFaqQuestions;
FaqLoadedState({this.filteredFaqQuestions = const []});
}
class FaqSearchState extends SosState {
final List<QuestionModel> filteredFaqQuestions;
const FaqSearchState({this.filteredFaqQuestions = const []});
}
class FetchRoomsState extends SosState {
final List<SubSpaceModel> roomsList;
final List<DeviceModel> devicesList;
const FetchRoomsState({required this.devicesList, required this.roomsList});
@override
List<Object> get props => [devicesList];
}
class OptionSelectedState extends SosState {
final String selectedOption;
final bool hasSelectionChanged;
OptionSelectedState({
required this.selectedOption,
required this.hasSelectionChanged,
});
@override
List<Object> get props => [selectedOption, hasSelectionChanged];
}
class SaveSelectionSuccessState extends SosState {
@override
List<Object> get props => [];
}

View File

@ -0,0 +1,149 @@
import 'dart:convert';
class DeviceInfoModel {
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;
DeviceInfoModel({
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 DeviceInfoModel.fromJson(Map<String, dynamic> json) {
return DeviceInfoModel(
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

@ -78,6 +78,12 @@ class DeviceModel {
tempIcon = Assets.waterLeakIcon; tempIcon = Assets.waterLeakIcon;
} else if (type == DeviceType.PC) { } else if (type == DeviceType.PC) {
tempIcon = Assets.powerClampIcon; tempIcon = Assets.powerClampIcon;
} else if (type == DeviceType.FourScene) {
tempIcon = Assets.fourSceneHomeIcon;
} else if (type == DeviceType.SixScene) {
tempIcon = Assets.sixSceneHomeIcon;
} else if (type == DeviceType.SOS) {
tempIcon = Assets.sosHomeIcon;
} else { } else {
tempIcon = Assets.assetsIconsLogo; tempIcon = Assets.assetsIconsLogo;
} }

View File

@ -0,0 +1,52 @@
import 'package:syncrow_app/features/devices/model/status_model.dart';
class FourSceneModelState {
dynamic scene_1;
dynamic scene_2;
dynamic scene_3;
dynamic scene_4;
dynamic scene_id_group_id;
dynamic switch_backlight;
FourSceneModelState({
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 FourSceneModelState.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 FourSceneModelState(
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,85 @@
class FourSceneSwitchModel {
final String switchName;
final DateTime createdAt;
final DateTime updatedAt;
final String deviceUuid;
final Scene scene;
FourSceneSwitchModel({
required this.switchName,
required this.createdAt,
required this.updatedAt,
required this.deviceUuid,
required this.scene,
});
factory FourSceneSwitchModel.fromJson(Map<String, dynamic> json) {
return FourSceneSwitchModel(
switchName: json['switchName'],
createdAt: DateTime.parse(json['createdAt']),
updatedAt: DateTime.parse(json['updatedAt']),
deviceUuid: json['deviceUuid'],
scene: Scene.fromJson(json['scene']),
);
}
}
class Scene {
final String uuid;
final String sceneTuyaId;
final String name;
final String status;
final String icon;
final String iconUuid;
final bool showInHome;
final String type;
final List<Action> actions;
Scene({
required this.uuid,
required this.sceneTuyaId,
required this.name,
required this.status,
required this.icon,
required this.iconUuid,
required this.showInHome,
required this.type,
required this.actions,
});
factory Scene.fromJson(Map<String, dynamic> json) {
return Scene(
uuid: json['uuid'],
sceneTuyaId: json['sceneTuyaId'],
name: json['name'],
status: json['status'],
icon: json['icon'],
iconUuid: json['iconUuid'],
showInHome: json['showInHome'],
type: json['type'],
actions: (json['actions'] as List)
.map((action) => Action.fromJson(action))
.toList(),
);
}
}
class Action {
final String actionExecutor;
final String entityId;
final Map<String, dynamic> executorProperty;
Action({
required this.actionExecutor,
required this.entityId,
required this.executorProperty,
});
factory Action.fromJson(Map<String, dynamic> json) {
return Action(
actionExecutor: json['actionExecutor'],
entityId: json['entityId'],
executorProperty: json['executorProperty'],
);
}
}

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,11 @@
class QuestionModel {
final int id;
final String question;
final String answer;
QuestionModel({
required this.id,
required this.question,
required this.answer,
});
}

View File

@ -0,0 +1,64 @@
import 'package:syncrow_app/features/devices/model/status_model.dart';
class SixSceneModel {
dynamic scene_1;
dynamic scene_2;
dynamic scene_3;
dynamic scene_4;
dynamic scene_5;
dynamic scene_6;
dynamic scene_id_group_id;
dynamic switch_backlight;
SixSceneModel({
required this.scene_1,
required this.scene_2,
required this.scene_3,
required this.scene_4,
required this.scene_5,
required this.scene_6,
required this.scene_id_group_id,
required this.switch_backlight,
});
factory SixSceneModel.fromJson(List<StatusModel> jsonList) {
late dynamic _scene_1;
late dynamic _scene_2;
late dynamic _scene_3;
late dynamic _scene_4;
late dynamic _scene_5;
late dynamic _scene_6;
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_5') {
_scene_5 = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'scene_6') {
_scene_6 = 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 SixSceneModel(
scene_1: _scene_1,
scene_2: _scene_2,
scene_3: _scene_3,
scene_4: _scene_4,
scene_5: _scene_5,
scene_6: _scene_6,
scene_id_group_id: _scene_id_group_id,
switch_backlight: _switch_backlight,
);
}
}

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 SosModel {
String sosContactState;
int batteryPercentage;
SosModel({
required this.sosContactState,
required this.batteryPercentage,
});
factory SosModel.fromJson(List<StatusModel> jsonList) {
late String _sosContactState;
late int _batteryPercentage;
for (int i = 0; i < jsonList.length; i++) {
if (jsonList[i].code == 'sos') {
_sosContactState = jsonList[i].value ?? '';
} else if (jsonList[i].code == 'battery_percentage') {
_batteryPercentage = jsonList[i].value ?? 0;
}
}
return SosModel(
sosContactState: _sosContactState,
batteryPercentage: _batteryPercentage,
);
}
}

View File

@ -0,0 +1,200 @@
// 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/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);
// return state is LoadingNewSate
// ? const Center(
// child: DefaultContainer(
// width: 50,
// height: 50,
// child: CircularProgressIndicator()),
// )
// : Padding(
// padding: const 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,
// ),
// ],
// ),
// ],
// ),
// ),
// const Spacer()
// ],
// ),
// );
// },
// ),
// ),
// );
// }
// }

View File

@ -0,0 +1,154 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/question_model.dart';
import 'package:syncrow_app/features/devices/view/device_settings/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 FaqSettingPage extends StatelessWidget {
final DeviceModel? device;
const FaqSettingPage({super.key, this.device});
@override
Widget build(BuildContext context) {
TextEditingController _searchController = TextEditingController();
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: device?.uuid ?? '')
..add(const DeviceSettingInitialQuestion()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final sensor = BlocProvider.of<DeviceSettingBloc>(context);
List<QuestionModel> displayedQuestions = [];
if (state is FaqSearchState) {
displayedQuestions = state.filteredFaqQuestions;
} else if (state is FaqLoadedState) {
displayedQuestions = state.filteredFaqQuestions;
}
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: 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,
),
const SizedBox(
height: 8,
),
displayedQuestions.isEmpty
? const SizedBox()
: 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) =>
QuestionPageSetting(
deviceId: device!.uuid,
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,
),
],
),
),
if (index !=
displayedQuestions.length -
1) // Exclude divider for the last item
const Divider(
color: ColorsManager.dividerColor,
),
],
),
),
);
},
)),
],
);
},
),
),
);
}
}

View File

@ -0,0 +1,141 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_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 SettingInfoPage extends StatelessWidget {
final DeviceModel? device;
const SettingInfoPage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Information',
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: device?.uuid ?? '')
..add(const DeviceSettingInitial())
..add(const DeviceSettingInitialInfo()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final _bloc = BlocProvider.of<DeviceSettingBloc>(context);
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
_bloc.add(const DeviceSettingInitial());
},
child: DefaultContainer(
child: Padding(
padding: const EdgeInsets.only(left: 5, right: 5),
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: [
SizedBox(
width:
MediaQuery.of(context).size.width * 0.61,
child: BodySmall(
text: _bloc.deviceInfo.productUuid,
fontColor: ColorsManager.primaryTextColor,
),
),
InkWell(
onTap: () {
Clipboard.setData(
ClipboardData(
text: _bloc.deviceInfo.productUuid,
),
);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Copied to Clipboard"),
),
);
},
child: const Row(
children: [
Icon(
Icons.copy,
color: ColorsManager.blueColor,
),
BodyMedium(
text: 'Copy',
fontColor: ColorsManager.blueColor,
),
],
),
)
],
),
const Divider(
color: ColorsManager.dividerColor,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const BodyLarge(
text: 'MAC',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: _bloc.deviceInfo.macAddress,
fontColor: ColorsManager.primaryTextColor,
),
],
),
const Divider(
color: ColorsManager.dividerColor,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const BodyLarge(
text: 'Time Zone',
fontSize: 15,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
BodySmall(
text: _bloc.deviceInfo.timeZone,
fontColor: ColorsManager.primaryTextColor,
),
],
),
]),
)));
},
),
),
);
}
}

View File

@ -0,0 +1,210 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.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 LocationSettingPage extends StatelessWidget {
final SpaceModel? space;
final String? deviceId;
const LocationSettingPage({
super.key,
this.space,
this.deviceId,
});
@override
Widget build(BuildContext context) {
String roomIdSelected = '';
return Scaffold(
body: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: deviceId ?? '')
..add(const DeviceSettingInitial())
..add(const DeviceSettingInitialInfo())
..add(FetchRoomsEvent(unit: space!)),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final _bloc = BlocProvider.of<DeviceSettingBloc>(context);
if (state is SaveSelectionSuccessState) {
Future.delayed(const Duration(microseconds: 500), () {
_bloc.add(const DeviceSettingInitialInfo());
Navigator.of(context).pop(true);
});
}
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: DefaultScaffold(
actions: [
BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final bool canSave = state is OptionSelectedState &&
state.hasSelectionChanged;
return InkWell(
onTap: canSave
? () {
context.read<DeviceSettingBloc>().add(
AssignRoomEvent(
context: context,
roomId: roomIdSelected,
unit: space!));
}
: null,
child: BodyMedium(
text: 'Save',
fontWeight: FontWeight.w700,
fontSize: 16,
fontColor: canSave
? ColorsManager.slidingBlueColor
: ColorsManager.primaryTextColor,
),
);
},
),
const SizedBox(width: 20),
],
child: ListView(
shrinkWrap: true,
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: _bloc.roomsList.length,
itemBuilder: (context, index) {
final fromRoom = _bloc.roomsList[index];
final isSelected = (state
is OptionSelectedState &&
state.selectedOption == fromRoom.id) ||
(state is! OptionSelectedState &&
fromRoom.id ==
_bloc.deviceInfo.subspace.uuid);
return Column(
children: [
_buildCheckboxOption(
label: fromRoom.name!,
isSelected: isSelected,
onTap: (label) {
context.read<DeviceSettingBloc>().add(
SelectOptionEvent(
selectedOption: fromRoom.id!,
),
);
roomIdSelected = fromRoom.id!;
},
),
if (index < _bloc.roomsList.length - 1) ...[
const SizedBox(height: 10),
const Divider(
color: ColorsManager.dividerColor,
),
const SizedBox(height: 10),
],
],
);
},
),
),
],
),
);
},
),
),
);
}
}
class CircularCheckbox extends StatefulWidget {
final bool value;
final ValueChanged<bool?> onChanged;
const CircularCheckbox(
{super.key, 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,
),
);
}
}
Widget _buildCheckboxOption({
required String label,
required bool isSelected,
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: isSelected,
onChanged: (bool? value) {
if (value == true) {
onTap(label);
}
},
),
],
),
);
}

View File

@ -0,0 +1,199 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/view/device_settings/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 SettingProfilePage extends StatelessWidget {
final DeviceModel? device;
const SettingProfilePage({super.key, this.device});
@override
Widget build(BuildContext context) {
var spaces = HomeCubit.getInstance().spaces;
return DefaultScaffold(
title: 'Device Settings',
leading: IconButton(
onPressed: () {
Navigator.of(context).pop(true);
},
icon: const Icon(Icons.arrow_back_ios)),
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: device?.uuid ?? '')
..add(const DeviceSettingInitial())
..add(const DeviceSettingInitialInfo()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final _bloc = BlocProvider.of<DeviceSettingBloc>(context);
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {
_bloc.add(const DeviceSettingInitial());
},
child: ListView(
children: [
CircleAvatar(
radius: device!.type != "SOS" ? 60 : 52,
backgroundColor: Colors.white,
child: device!.type == "SOS"
? ClipOval(
child: SvgPicture.asset(
Assets.sosHomeIcon,
fit: BoxFit.fitHeight,
height:
MediaQuery.of(context).size.height * 0.13,
))
: CircleAvatar(
radius: 55,
backgroundColor: ColorsManager.graysColor,
child: ClipOval(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Center(
child: SvgPicture.asset(
device!.type == "4S"
? Assets.fourSceneIcon
: Assets.sixSceneIcon,
fit: BoxFit.contain,
height: MediaQuery.of(context)
.size
.height *
0.08,
),
),
],
),
),
),
),
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: _bloc.focusNode,
controller: _bloc.nameController,
enabled: _bloc.editName,
onEditingComplete: () {
_bloc.add(const SaveNameEvent());
},
decoration: const InputDecoration(
hintText: "Your Name",
border: InputBorder.none,
fillColor: Colors.white10,
counterText: '',
),
),
),
),
const SizedBox(width: 5),
InkWell(
onTap: () {
_bloc.add(const ChangeNameEvent(value: true));
},
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: SvgPicture.asset(
Assets.sosEditProfile,
color: Colors.grey,
fit: BoxFit.contain,
height: MediaQuery.of(context).size.height *
0.02,
),
),
),
],
),
),
const SizedBox(height: 20),
const BodyMedium(
text: 'Smart Device Information',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(height: 7),
DefaultContainer(
padding: const EdgeInsets.all(20),
child: InkWell(
onTap: () async {
bool val = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => LocationSettingPage(
space: spaces!.first,
deviceId: device?.uuid ?? '',
)),
);
if (val == true) {
_bloc.add(const DeviceSettingInitialInfo());
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const SizedBox(
child: Text('Location'),
),
Row(
children: [
SizedBox(
child: BodyMedium(
text: _bloc
.deviceInfo.subspace.subspaceName,
fontColor: ColorsManager.textGray,
),
),
const Icon(
Icons.arrow_forward_ios,
size: 15,
color: ColorsManager.textGray,
),
],
)
],
),
),
)
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,142 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/model/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 QuestionPageSetting extends StatelessWidget {
final QuestionModel? questionModel;
final String? deviceId;
const QuestionPageSetting({super.key, this.questionModel, this.deviceId});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'FAQ',
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: deviceId!)
..add(const DeviceSettingInitial()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final sensor = BlocProvider.of<DeviceSettingBloc>(context);
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: Column(
children: [
DefaultContainer(
padding: const EdgeInsets.all(15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BodyLarge(
text: questionModel!.question,
fontSize: 22,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
const 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: sensor.isHelpful == true
? ColorsManager.grayColor
: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {
sensor.add(
const ToggleHelpfulEvent(isHelpful: true));
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbUp,
fit: BoxFit.fill,
),
const SizedBox(
width: 10,
),
const BodyMedium(
text: 'Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
const SizedBox(
height: 15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: sensor.isHelpful == false
? ColorsManager.grayColor
: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {
sensor.add(
const ToggleHelpfulEvent(isHelpful: false));
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbDown,
fit: BoxFit.fill,
),
const SizedBox(
width: 10,
),
const BodyMedium(
text: 'Not Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
],
);
},
),
),
);
}
}

View File

@ -0,0 +1,451 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/view/device_settings/faq_page.dart';
import 'package:syncrow_app/features/devices/view/device_settings/info_page.dart';
import 'package:syncrow_app/features/devices/view/device_settings/profile_page.dart';
import 'package:syncrow_app/features/devices/view/device_settings/share_Device_page.dart';
import 'package:syncrow_app/features/devices/view/device_settings/update_dialog.dart';
import 'package:syncrow_app/features/devices/view/device_settings/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/delete_device_dialogs.dart';
import 'package:syncrow_app/features/shared_widgets/setting_widget.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 SettingsPage extends StatelessWidget {
final DeviceModel? device;
const SettingsPage({super.key, this.device});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Settings',
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: device?.uuid ?? '')
..add(const DeviceSettingInitial())
..add(const DeviceSettingInitialInfo()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final _bloc = BlocProvider.of<DeviceSettingBloc>(context);
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: ListView(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10,
),
child: InkWell(
onTap: () async {
bool val = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SettingProfilePage(
device: device,
),
),
);
if (val == true) {
_bloc.add(const DeviceSettingInitialInfo());
}
},
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 20),
DefaultContainer(
borderRadius: const BorderRadius.all(
Radius.circular(30)),
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Padding(
padding:
const EdgeInsets.only(left: 90),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
SizedBox(
child: Text(
_bloc.deviceInfo.name,
style: const TextStyle(
fontSize: 16,
fontWeight:
FontWeight.w700,
color: ColorsManager
.grayColor,
),
overflow: TextOverflow
.ellipsis, // Adds ellipsis (...) when the text overflows.
maxLines:
1, // Restricts the text to a single line.
)),
const SizedBox(
height: 5,
),
BodySmall(
text: _bloc
.deviceInfo
.subspace
.subspaceName),
],
),
),
SvgPicture.asset(
Assets.editNameSetting,
fit: BoxFit.contain,
height: 30,
),
],
),
),
),
),
],
),
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: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
device!.type == "SOS"
? ClipOval(
child: SvgPicture.asset(
Assets.sosHomeIcon,
fit: BoxFit.contain,
height: 70,
),
)
: Padding(
padding: device!.type ==
"4S"
? const EdgeInsets.only(
top: 5)
: const EdgeInsets.only(
top: 0),
child: SizedBox(
height: 70,
child: SvgPicture.asset(
device!.type == "4S"
? Assets
.fourSceneIcon
: Assets
.sixSceneIcon,
fit: BoxFit.contain,
),
),
),
],
),
),
)),
),
],
),
),
),
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) => SettingInfoPage(
device: device!,
)),
);
},
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(
value: _bloc.enableAlarm,
onChanged: (p0) {
context
.read<DeviceSettingBloc>()
.add(ToggleEnableAlarmEvent(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) =>
ShareDevicePage(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) =>
FaqSettingPage(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: () {
Navigator.of(context).pop();
},
);
},
);
},
isUpdate: true,
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const UpdatePageSetting()),
);
},
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: () {
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: () {
_bloc.add(
DeleteDeviceEvent());
},
);
},
);
},
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,
),
),
),
],
);
},
),
),
);
}
}

View File

@ -0,0 +1,102 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/menu/view/widgets/manage_home/home_settings.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/helpers/custom_page_route.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class ShareDevicePage extends StatelessWidget {
final DeviceModel? device;
const ShareDevicePage({super.key, this.device});
@override
Widget build(BuildContext context) {
var spaces = HomeCubit.getInstance().spaces;
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);
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: [
SizedBox(
height: MediaQuery.of(context).size.height * 0.05,
),
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: () {
Navigator.of(context).push(CustomPageRoute(
builder: (context) => HomeSettingsView(
space: spaces!.first,
)));
},
child: const Text('Add Home Member')),
),
)
],
));
},
),
),
);
}
}

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 UpDateNoteSetting extends StatelessWidget {
final Function()? cancelTab;
final Function()? confirmTab;
const UpDateNoteSetting({
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,351 @@
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/device_settings_bloc/device_scene_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_event.dart';
import 'package:syncrow_app/features/devices/bloc/device_settings_bloc/device_scene_state.dart';
import 'package:syncrow_app/features/devices/view/device_settings/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 UpdatePageSetting extends StatelessWidget {
final String? deviceId;
const UpdatePageSetting({super.key, this.deviceId});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Device Update',
child: BlocProvider(
create: (context) => DeviceSettingBloc(deviceId: deviceId ?? '')
..add(const DeviceSettingInitial())
..add(const DeviceSettingInitialInfo()),
child: BlocBuilder<DeviceSettingBloc, DeviceSettingState>(
builder: (context, state) {
final _bloc = BlocProvider.of<DeviceSettingBloc>(context);
return state is DeviceSettingLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: RefreshIndicator(
onRefresh: () async {},
child: Column(
children: [
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: [
BodyMedium(
text: _bloc.enableUpdate
? 'true'
: 'Off',
fontColor: ColorsManager.textGray,
),
Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: _bloc.enableUpdate,
onChanged: (value) {
_bloc.add(ToggleUpdateEvent(
isUpdateEnabled: value));
},
applyTheme: true,
),
),
],
),
)),
),
],
),
),
const SizedBox(
height: 10,
),
const 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,
),
SizedBox(
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 UpDateNoteSetting(
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,
),
const 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: const 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,327 @@
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/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 SixSelectSceneFourPage extends StatelessWidget {
final String? switchSelected;
final String? deviceId;
SixSelectSceneFourPage({super.key, this.switchSelected, this.deviceId});
final TextEditingController _searchController = TextEditingController();
final int? selectedSwitchIndex = 0;
final spaces = HomeCubit.getInstance().spaces;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: deviceId!)
..add(LoadScenes(
unit: spaces!.first,
unitId: spaces!.first.id,
showInDevice: false,
))
..add(GetSceneBySwitchName(switchName: switchSelected)),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final sensorBloc = BlocProvider.of<SixSceneBloc>(context);
if (state is SaveSelectionSuccessState) {
Future.delayed(const Duration(milliseconds: 250), () {
Navigator.of(context).pop(true);
Navigator.of(context).pop(true);
});
}
return DefaultScaffold(
title: 'Select Scene',
actions: [_buildSaveButton(context, state, sensorBloc)],
child: _buildSceneContent(context, sensorBloc, state),
);
},
),
);
}
// Save button builder
Widget _buildSaveButton(
BuildContext context, SixSceneState state, SixSceneBloc sensorBloc) {
final bool canSave = state is SceneSelectionUpdatedState;
return GestureDetector(
onTap: canSave
? () {
context.read<SixSceneBloc>().add(AssignDeviceScene(
sceneUuid: sensorBloc.selectedSceneId,
switchName: switchSelected,
unit: spaces!.first));
}
: null,
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
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, SixSceneState state) {
return Column(
children: [
_buildSearchBar(sensorBloc),
const SizedBox(height: 20),
Expanded(
child: state is SixSceneLoadingState
? _buildLoadingIndicator()
: sensorBloc.filteredScenes.isEmpty
? const Center(
child: SizedBox(
child: BodySmall(text: 'No Scenes available'),
),
)
: _buildSceneGrid(sensorBloc, state),
),
],
);
}
// 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, SixSceneState state) {
final scenes = sensorBloc.filteredScenes;
return GridView.builder(
itemCount: scenes.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
mainAxisExtent: 120,
),
itemBuilder: (context, index) {
final scene = scenes[index];
bool isSelected = scene.id ==
(state is SceneSelectionUpdatedState
? state.selectedSceneId
: sensorBloc.selectedFormApiSceneId);
return SceneItem(
id: scene.id,
value: isSelected,
disablePlayButton: false,
onChanged: (isSelected) {
sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
sensorBloc.add(SelectSceneEvent(
selectedSceneId: scene.id, isSelected: isSelected));
},
icon: scene.iconInBytes,
title: scene.name,
);
// 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];
// bool isSelected = scene.id ==
// (state is SceneSelectionUpdatedState
// ? state.selectedSceneId
// : sensorBloc.selectedFormApiSceneId);
// return SceneItem(
// id: scene.id,
// value: isSelected,
// disablePlayButton: false,
// onChanged: (isSelected) {
// sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
// sensorBloc.add(SelectSceneEvent(unitId: scene.id));
// },
// icon: scene.iconInBytes,
// title: scene.name,
// );
// }
},
);
}
}
class SceneItem extends StatelessWidget {
final String id;
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
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: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (!disablePlayButton)
Image.memory(
icon,
height: 32,
width: 32,
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) => Image.asset(
Assets.assetsIconsLogo,
height: 32,
width: 32,
fit: BoxFit.fill),
),
],
),
CircularCheckbox(
value: value,
onChanged: (isSelected) => onChanged(isSelected!),
),
],
),
BodyMedium(
text: title,
style: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
);
}
}
// 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,177 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/six_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';
// ignore: must_be_immutable
class SelectSwitchDialog extends StatefulWidget {
final Function()? cancelTab;
final Function(String)? confirmTab;
String? switch1Title;
String? switch2Title;
String? switch3Title;
String? switch4Title;
String? switch5Title;
String? switch6Title;
SelectSwitchDialog(
{super.key,
required this.cancelTab,
required this.confirmTab,
this.switch1Title,
this.switch2Title,
this.switch3Title,
this.switch4Title,
this.switch5Title,
this.switch6Title});
@override
State<SelectSwitchDialog> createState() => _SelectSwitchDialogState();
}
class _SelectSwitchDialogState extends State<SelectSwitchDialog> {
String selectedSwitchName = '';
@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: [
SixSwitchsCardDialog(
switch1Title: widget.switch1Title,
switch2Title: widget.switch2Title,
switch3Title: widget.switch3Title,
switch4Title: widget.switch4Title,
switch5Title: widget.switch5Title,
switch6Title: widget.switch6Title,
switch1Down: selectedSwitchName == 'scene_4'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch1Up: selectedSwitchName == 'scene_1'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Down: selectedSwitchName == 'scene_5'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Up: selectedSwitchName == 'scene_2'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch3Up: selectedSwitchName == 'scene_3'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch3Down: selectedSwitchName == 'scene_6'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
onSwitch3DownTap: () {
setState(() => selectedSwitchName = 'scene_3');
},
onSwitch3UpTap: () {
setState(() => selectedSwitchName = 'scene_6');
},
onSwitch1UpTap: () {
setState(() => selectedSwitchName = 'scene_1');
},
onSwitch1DownTap: () {
setState(() => selectedSwitchName = 'scene_4');
},
onSwitch2UpTap: () {
setState(() => selectedSwitchName = 'scene_5');
},
onSwitch2DownTap: () {
setState(() => selectedSwitchName = 'scene_2');
},
),
],
),
const SizedBox(height: 20),
const Padding(
padding: EdgeInsets.only(bottom: 15, left: 5, right: 5, top: 10),
child: 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: selectedSwitchName == ''
? () {}
: () => widget.confirmTab!(selectedSwitchName),
child: Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Next',
style: TextStyle(
color: selectedSwitchName == ''
? ColorsManager.textPrimaryColor
.withOpacity(0.6)
: ColorsManager.primaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
],
)
],
),
);
}
}

View File

@ -0,0 +1,248 @@
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/device_settings/settings_page.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/six_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 BlocProvider(
create: (context) => SixSceneBloc(sixSceneId: device?.uuid ?? '')
..add(const SixSceneInitial())
..add(const SixSceneInitialInfo())
..add(const SexSceneSwitchInitial()),
child: BlocBuilder<SixSceneBloc, SixSceneState>(
builder: (context, state) {
final _bloc = BlocProvider.of<SixSceneBloc>(context);
SixSceneModel model = SixSceneModel(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_5: '',
scene_6: '',
scene_id_group_id: '',
switch_backlight: '',
);
if (state is LoadingNewSate) {
model = state.device;
} else if (state is UpdateState) {
model = state.device;
}
return DefaultScaffold(
title: _bloc.deviceInfo.name,
actions: [
InkWell(
onTap: () async {
var val = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SettingsPage(device: device!),
),
);
if (val == null) {
_bloc.add(const SixSceneInitialInfo());
_bloc.add(const SixSceneInitial());
_bloc.add(const SexSceneSwitchInitial());
}
},
child: SvgPicture.asset(Assets.assetsIconsSettings),
),
const SizedBox(width: 10),
],
child: state is SixSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: RefreshIndicator(
onRefresh: () async {
_bloc.add(const SixSceneInitial());
},
child: ListView(
children: [
SizedBox(
height: MediaQuery.sizeOf(context).height * 0.8,
child: Column(
children: [
SixSwitchsCardDialog(
switch1Title: model.scene_1,
switch2Title: model.scene_2,
switch3Title: model.scene_3,
switch4Title: model.scene_4,
switch5Title: model.scene_5,
switch6Title: model.scene_6,
switch1Down: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch1Up: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch2Down: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch2Up: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch3Up: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch3Down: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
onSwitch3DownTap: () {
debugPrint("onSwitch3DownTap");
},
onSwitch3UpTap: () {
debugPrint("onSwitch3UpTap");
},
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: () {
_bloc.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: () async {
var value = await showDialog(
context: context,
builder: (context) {
return SelectSwitchDialog(
switch1Title: model.scene_1,
switch2Title: model.scene_2,
switch3Title: model.scene_3,
switch4Title: model.scene_4,
switch5Title: model.scene_5,
switch6Title: model.scene_6,
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab: (v) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
SixSelectSceneFourPage(
deviceId: device!.uuid,
switchSelected: v,
),
),
);
},
);
},
);
if (value == true) {
Future.delayed(
const Duration(
milliseconds: 200), () {
_bloc.add(
const SexSceneSwitchInitial());
});
}
},
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,193 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SixSwitchsCardDialog extends StatelessWidget {
final String? switch1Title;
final String? switch2Title;
final String? switch3Title;
final String? switch4Title;
final String? switch5Title;
final String? switch6Title;
final String switch1Up;
final String switch1Down;
final String switch2Up;
final String switch2Down;
final String switch3Down;
final String switch3Up;
final VoidCallback onSwitch1UpTap;
final VoidCallback onSwitch1DownTap;
final VoidCallback onSwitch2UpTap;
final VoidCallback onSwitch2DownTap;
final VoidCallback onSwitch3DownTap;
final VoidCallback onSwitch3UpTap;
SixSwitchsCardDialog(
{required this.switch1Down,
required this.switch1Up,
required this.switch2Down,
required this.switch2Up,
required this.onSwitch1UpTap,
required this.onSwitch1DownTap,
required this.onSwitch2UpTap,
required this.onSwitch2DownTap,
required this.onSwitch3DownTap,
required this.onSwitch3UpTap,
required this.switch3Down,
this.switch1Title,
this.switch2Title,
this.switch3Title,
this.switch4Title,
this.switch5Title,
this.switch6Title,
required this.switch3Up});
@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(
switchUp: switch1Up,
switchDown: switch1Down,
onUpTap: onSwitch1UpTap,
onDownTap: onSwitch1DownTap,
titleDown: switch4Title!,
titleUp: switch1Title!),
_buildDivider(),
// Switch 2
_buildSwitchColumn(
switchUp: switch2Up,
switchDown: switch2Down,
onDownTap: onSwitch2UpTap,
onUpTap: onSwitch2DownTap,
titleDown: switch5Title!,
titleUp: switch2Title!),
_buildDivider(),
// Switch 3
_buildSwitchColumn(
switchUp: switch3Up,
switchDown: switch3Down,
onDownTap: onSwitch3UpTap,
onUpTap: onSwitch3DownTap,
titleDown: switch6Title!,
titleUp: switch3Title!),
],
),
),
),
),
),
],
),
),
);
}
Widget _buildSwitchColumn({
String switchUp = '',
String titleUp = '',
String titleDown = '',
String switchDown = '',
VoidCallback? onUpTap,
VoidCallback? onDownTap,
}) {
return Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
InkWell(
onTap: onUpTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchUp),
),
),
BodySmall(
text: titleUp,
)
],
),
Column(
children: [
InkWell(
onTap: onDownTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchDown),
),
),
BodySmall(
text: titleDown,
)
],
),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 3,
color: ColorsManager.dividerColor,
);
}
}

View File

@ -0,0 +1,234 @@
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/device_settings/settings_page.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 BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: device?.uuid ?? '')
..add(const FourSceneInitial())
..add(const FourSceneInitialInfo())
..add(const FourSceneSwitchInitial()),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final _bloc = BlocProvider.of<FourSceneBloc>(context);
FourSceneModelState model = FourSceneModelState(
scene_1: '',
scene_2: '',
scene_3: '',
scene_4: '',
scene_id_group_id: '',
switch_backlight: '',
);
if (state is LoadingNewSate) {
model = state.device;
} else if (state is UpdateState) {
model = state.device;
}
return DefaultScaffold(
title: _bloc.deviceInfo.name,
actions: [
InkWell(
onTap: () async {
var val = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SettingsPage(device: device!),
),
);
if (val == null) {
_bloc.add(const FourSceneInitial());
_bloc.add(const FourSceneInitialInfo());
_bloc.add(const FourSceneSwitchInitial());
}
},
child: SvgPicture.asset(Assets.assetsIconsSettings),
),
const SizedBox(width: 10),
],
child: state is FourSceneLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: RefreshIndicator(
onRefresh: () async {
_bloc.add(const FourSceneInitial());
},
child: ListView(
children: [
SizedBox(
height: MediaQuery.sizeOf(context).height * 0.8,
child: Column(
children: [
FourSwitchsCard(
title1: model.scene_1,
title2: model.scene_2,
title3: model.scene_3,
title4: model.scene_4,
switch1: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch2: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch3: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
switch4: _bloc.deviceStatus.switch_backlight
? Assets.switchOn
: Assets.switchOff,
onSwitch1UpTap: () {
debugPrint("Switch 1 Up tapped");
},
onSwitch2UpTap: () {
debugPrint("Switch 2 Up tapped");
},
onSwitch3DownTap: () {
debugPrint("onSwitch3DownTap");
},
onSwitch4DownTap: () {
debugPrint("onSwitch4DownTap");
},
),
Flexible(
child: Row(
children: [
Expanded(
child: DefaultContainer(
onTap: () {
_bloc.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: () async {
var value = await showDialog(
context: context,
builder: (context) {
return FourSelectSwitchDialog(
switch1Title: model.scene_1,
switch2Title: model.scene_2,
switch3Title: model.scene_3,
switch4Title: model.scene_4,
cancelTab: () {
Navigator.of(context).pop();
},
confirmTab:
(switchSelected) async {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
FourSelectSceneFourPage(
switchSelected:
switchSelected,
deviceId: device!.uuid,
),
),
);
},
);
},
);
if (value == true) {
Future.delayed(
const Duration(
milliseconds: 250), () {
_bloc.add(
const FourSceneSwitchInitial());
});
}
},
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,332 @@
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/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 FourSelectSceneFourPage extends StatelessWidget {
final String? switchSelected;
final String? deviceId;
FourSelectSceneFourPage({super.key, this.switchSelected, this.deviceId});
final TextEditingController _searchController = TextEditingController();
final int? selectedSwitchIndex = 0;
final spaces = HomeCubit.getInstance().spaces;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => FourSceneBloc(fourSceneId: deviceId!)
..add(LoadScenes(
unit: spaces!.first,
unitId: spaces!.first.id,
showInDevice: false,
))
..add(GetSceneBySwitchName(switchName: switchSelected)),
child: BlocBuilder<FourSceneBloc, FourSceneState>(
builder: (context, state) {
final sensorBloc = BlocProvider.of<FourSceneBloc>(context);
if (state is SaveSelectionSuccessState) {
Future.delayed(const Duration(milliseconds: 250), () {
Navigator.of(context).pop(true);
Navigator.of(context).pop(true);
});
}
return DefaultScaffold(
title: 'Select Scene',
actions: [_buildSaveButton(context, state, sensorBloc)],
child: _buildSceneContent(context, sensorBloc, state),
);
},
),
);
}
// Save button builder
Widget _buildSaveButton(
BuildContext context, FourSceneState state, FourSceneBloc sensorBloc) {
final bool canSave = state is SceneSelectionUpdatedState;
return GestureDetector(
onTap: canSave
? () {
context.read<FourSceneBloc>().add(AssignDeviceScene(
sceneUuid: sensorBloc.selectedSceneId,
switchName: switchSelected,
unit: spaces!.first));
}
: null,
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 15),
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, FourSceneState state) {
return Column(
children: [
_buildSearchBar(sensorBloc),
const SizedBox(height: 20),
Expanded(
child: state is FourSceneLoadingState
? _buildLoadingIndicator()
: sensorBloc.filteredScenes.isEmpty
? const Center(
child: SizedBox(
child: BodySmall(text: 'No Scenes available'),
),
)
: _buildSceneGrid(sensorBloc, state),
),
],
);
}
// 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, FourSceneState state) {
final scenes = sensorBloc.filteredScenes;
return GridView.builder(
itemCount: scenes.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
mainAxisExtent: 120,
),
itemBuilder: (context, index) {
final scene = scenes[index];
// Check if this scene is currently selected
bool isSelected = scene.id ==
(state is SceneSelectionUpdatedState
? state.selectedSceneId
: sensorBloc.selectedFormApiSceneId);
return SceneItem(
id: scene.id,
value: isSelected, // Pass isSelected to the SceneItem
disablePlayButton: false,
onChanged: (newSelection) {
// If selected, assign the scene
sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
sensorBloc.add(SelectSceneEvent(
selectedSceneId: scene.id, isSelected: newSelection));
},
icon: scene.iconInBytes,
title: scene.name,
);
},
);
}
}
class SceneItem extends StatelessWidget {
final String id;
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
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: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (!disablePlayButton)
Image.memory(
icon,
height: 32,
width: 32,
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) => Image.asset(
Assets.assetsIconsLogo,
height: 32,
width: 32,
fit: BoxFit.fill),
),
],
),
CircularCheckbox(
value: value,
onChanged: (isSelected) => onChanged(isSelected!),
),
],
),
BodyMedium(
text: title,
style: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
color: ColorsManager.secondaryTextColor),
textAlign: TextAlign.center,
),
],
),
);
}
}
// 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,
),
],
),
);
}
}
// 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];
// bool isSelected = scene.id ==
// (state is SceneSelectionUpdatedState
// ? state.selectedSceneId
// : sensorBloc.selectedFormApiSceneId);
// return SceneItem(
// id: scene.id,
// value: isSelected,
// disablePlayButton: false,
// onChanged: (isSelected) {
// sensorBloc.add(SelectOptionEvent(selectedOption: scene.id));
// sensorBloc.add(SelectSceneEvent(selectedSceneId: scene.id));
// },
// icon: scene.iconInBytes,
// title: scene.name,
// );
// }

View File

@ -0,0 +1,160 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/devices/view/widgets/four_scene_switch/four_switches_card_dialog.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(String)? confirmTab;
final String switch1Title;
final String switch2Title;
final String switch3Title;
final String switch4Title;
const FourSelectSwitchDialog(
{super.key,
required this.cancelTab,
required this.confirmTab,
required this.switch1Title,
required this.switch2Title,
required this.switch3Title,
required this.switch4Title});
@override
State<FourSelectSwitchDialog> createState() => _FourSelectSwitchDialogState();
}
class _FourSelectSwitchDialogState extends State<FourSelectSwitchDialog> {
String selectedSwitchName = ''; // 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: [
FourSwitchsCardDialog(
switch1Title: widget.switch1Title,
switch2Title: widget.switch2Title,
switch3Title: widget.switch3Title,
switch4Title: widget.switch4Title,
switch1Down: selectedSwitchName == 'scene_3'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch1Up: selectedSwitchName == 'scene_1'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Down: selectedSwitchName == 'scene_4'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
switch2Up: selectedSwitchName == 'scene_2'
? Assets.removeSceneIcon
: Assets.addSwitchIcon,
onSwitch1UpTap: () {
setState(() => selectedSwitchName = 'scene_1');
},
onSwitch1DownTap: () {
setState(() => selectedSwitchName = 'scene_3');
},
onSwitch2UpTap: () {
setState(() => selectedSwitchName = 'scene_4');
},
onSwitch2DownTap: () {
setState(() => selectedSwitchName = 'scene_2');
},
),
],
),
const SizedBox(height: 20),
const Padding(
padding: EdgeInsets.only(bottom: 15, left: 5, right: 5, top: 10),
child: 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: selectedSwitchName == ''
? () {}
: () => widget.confirmTab!(selectedSwitchName),
child: Padding(
padding: EdgeInsets.all(15),
child: Center(
child: Text(
'Next',
style: TextStyle(
color: selectedSwitchName == ''
? ColorsManager.textPrimaryColor
.withOpacity(0.6)
: ColorsManager.primaryColor,
fontSize: 14,
fontWeight: FontWeight.w400),
),
),
),
),
),
),
],
)
],
),
);
}
}

View File

@ -0,0 +1,165 @@
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 switch1;
final String title1;
final String switch3;
final String title3;
final String switch2;
final String title2;
final String switch4;
final String title4;
final VoidCallback onSwitch1UpTap;
final VoidCallback onSwitch4DownTap;
final VoidCallback onSwitch2UpTap;
final VoidCallback onSwitch3DownTap;
FourSwitchsCard({
required this.title1,
required this.title2,
required this.title3,
required this.title4,
required this.switch3,
required this.switch1,
required this.switch4,
required this.switch2,
required this.onSwitch1UpTap,
required this.onSwitch3DownTap,
required this.onSwitch2UpTap,
required this.onSwitch4DownTap,
});
@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(
switchUp: switch1,
switchDown: switch3,
onUpTap: onSwitch1UpTap,
onDownTap: onSwitch3DownTap,
titleDown: title3,
titleUp: title1),
_buildDivider(),
_buildSwitchColumn(
titleDown: title4,
titleUp: title2,
switchUp: switch2,
switchDown: switch4,
onUpTap: onSwitch2UpTap,
onDownTap: onSwitch4DownTap),
],
),
),
),
),
),
],
),
),
);
}
Widget _buildSwitchColumn({
String switchUp = '',
String switchDown = '',
String titleUp = '',
String titleDown = '',
VoidCallback? onUpTap,
VoidCallback? onDownTap,
}) {
return Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
InkWell(
onTap: onUpTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchUp),
),
),
Text(titleUp)
],
),
Column(
children: [
InkWell(
onTap: onDownTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchDown),
),
),
Text(titleDown)
],
),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 3,
color: ColorsManager.dividerColor,
);
}
}

View File

@ -0,0 +1,171 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class FourSwitchsCardDialog extends StatelessWidget {
final String? switch1Title;
final String? switch2Title;
final String? switch3Title;
final String? switch4Title;
final String switch1Up;
final String switch1Down;
final String switch2Up;
final String switch2Down;
final VoidCallback onSwitch1UpTap;
final VoidCallback onSwitch1DownTap;
final VoidCallback onSwitch2UpTap;
final VoidCallback onSwitch2DownTap;
FourSwitchsCardDialog({
required this.switch1Down,
required this.switch1Up,
required this.switch2Down,
required this.switch2Up,
required this.onSwitch1UpTap,
required this.onSwitch1DownTap,
required this.onSwitch2UpTap,
required this.onSwitch2DownTap,
this.switch1Title,
this.switch2Title,
this.switch3Title,
this.switch4Title,
});
@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(
switchUp: switch1Up,
switchDown: switch1Down,
onUpTap: onSwitch1UpTap,
onDownTap: onSwitch1DownTap,
titleDown: switch3Title!,
titleUp: switch1Title!),
_buildDivider(),
// Switch 2
_buildSwitchColumn(
switchUp: switch2Up,
switchDown: switch2Down,
onDownTap: onSwitch2UpTap,
onUpTap: onSwitch2DownTap,
titleDown: switch4Title!,
titleUp: switch2Title!),
],
),
),
),
),
),
],
),
),
);
}
Widget _buildSwitchColumn({
String switchUp = '',
String titleUp = '',
String titleDown = '',
String switchDown = '',
VoidCallback? onUpTap,
VoidCallback? onDownTap,
}) {
return Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
InkWell(
onTap: onUpTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchUp),
),
),
BodySmall(
text: titleUp,
)
],
),
Column(
children: [
InkWell(
onTap: onDownTap,
child: Container(
height: 20,
width: 20,
child: SvgPicture.asset(switchDown),
),
),
BodySmall(
text: titleDown,
)
],
),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 3,
color: ColorsManager.dividerColor,
);
}
}

View File

@ -36,7 +36,7 @@ class _RoomPageState extends State<RoomPage> {
final query = _searchController.text.toLowerCase(); final query = _searchController.text.toLowerCase();
setState(() { setState(() {
_filteredDevices = widget.room.devices! _filteredDevices = widget.room.devices!
.where((device) => device.type!.toLowerCase().contains(query)) .where((device) => device.name!.toLowerCase().contains(query))
.toList(); .toList();
}); });
} }
@ -51,7 +51,9 @@ class _RoomPageState extends State<RoomPage> {
decoration: InputDecoration( decoration: InputDecoration(
hintText: 'Search', hintText: 'Search',
hintStyle: const TextStyle( hintStyle: const TextStyle(
color: ColorsManager.textGray, fontSize: 16, fontWeight: FontWeight.w400), color: ColorsManager.textGray,
fontSize: 16,
fontWeight: FontWeight.w400),
prefixIcon: Container( prefixIcon: Container(
padding: const EdgeInsets.all(5.0), padding: const EdgeInsets.all(5.0),
margin: const EdgeInsets.all(10.0), margin: const EdgeInsets.all(10.0),

View File

@ -7,15 +7,18 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/6_scene_switch/six_scene_screen.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';
import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_Interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_Interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_touch/one_touch_screen.dart'; import 'package:syncrow_app/features/devices/view/widgets/one_touch/one_touch_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_page.dart'; import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/sos/sos_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_touch/three_touch_interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_touch/three_touch_interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_Interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_Interface.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_touch/two_touch_Interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/two_touch/two_touch_Interface.dart';
@ -65,7 +68,7 @@ class RoomPageSwitch extends StatelessWidget {
Flexible( Flexible(
child: FittedBox( child: FittedBox(
child: Text( child: Text(
device.type ?? "", device.name ?? "",
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
maxLines: 2, maxLines: 2,
style: context.bodyLarge.copyWith( style: context.bodyLarge.copyWith(
@ -87,7 +90,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 +215,27 @@ void showDeviceInterface(DeviceModel device, BuildContext context) {
pageBuilder: (context, animation1, animation2) => pageBuilder: (context, animation1, animation2) =>
WaterLeakScreen(device: device))); WaterLeakScreen(device: device)));
case DeviceType.SixScene:
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
SixSceneScreen(device: device)));
case DeviceType.FourScene:
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
FourSceneScreen(device: device)));
case DeviceType.SOS:
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) =>
SosScreen(device: device)));
break; break;
default: default:
} }

View File

@ -0,0 +1,113 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.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 AlarmManagementPage extends StatelessWidget {
final String sosId;
const AlarmManagementPage({super.key, required this.sosId});
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Alarm Settings',
child: BlocProvider(
create: (context) => SosBloc(sosId: ''),
child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) {
final _bloc = BlocProvider.of<SosBloc>(context);
return state is LoadingNewSate
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator()),
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 10,
),
const BodyMedium(
text: 'The Alarm Management',
fontWeight: FontWeight.w700,
fontSize: 12,
fontColor: ColorsManager.grayColor,
),
const SizedBox(
height: 5,
),
DefaultContainer(
child: Padding(
padding: const EdgeInsets.only(left: 10, right: 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 50,
child: ListTile(
contentPadding: EdgeInsets.zero,
leading: const BodyMedium(
text: 'SOS Alarm',
fontWeight: FontWeight.w400,
fontSize: 15,
),
trailing: Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: _bloc.enableAlarm,
onChanged: (value) {
context.read<SosBloc>().add(
ToggleEnableAlarmEvent(value));
},
applyTheme: true,
)),
),
),
const Divider(
color: ColorsManager.graysColor,
),
SizedBox(
height: 50,
child: ListTile(
contentPadding: EdgeInsets.zero,
leading: const BodyLarge(
text: 'Low Battery Reminder',
fontWeight: FontWeight.w400,
fontSize: 15,
),
trailing: Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: _bloc.closingReminder,
onChanged: (value) {
context.read<SosBloc>().add(
ToggleClosingReminderEvent(
value));
},
applyTheme: true,
)),
),
),
],
),
),
),
],
);
},
),
));
}
}

View File

@ -0,0 +1,230 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:intl/intl.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart';
import 'package:syncrow_app/features/devices/model/device_report_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_small.dart';
import 'package:syncrow_app/generated/assets.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SosRecordsScreen extends StatefulWidget {
final String sosId;
const SosRecordsScreen({super.key, required this.sosId});
@override
State<SosRecordsScreen> createState() => _SosRecordsScreenState();
}
class _SosRecordsScreenState extends State<SosRecordsScreen> {
int _selectedIndex = 0;
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Records',
child: BlocProvider(
create: (context) =>
SosBloc(sosId: widget.sosId)..add(const ReportLogsInitial()),
child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) {
final waterSensorBloc = BlocProvider.of<SosBloc>(context);
final Map<String, List<DeviceEvent>> groupedRecords = {};
if (state is LoadingNewSate) {
return const Center(
child: DefaultContainer(
width: 50, height: 50, child: CircularProgressIndicator()),
);
} else if (state is UpdateState) {
for (var record in waterSensorBloc.recordGroups.data!) {
final DateTime eventDateTime =
DateTime.fromMillisecondsSinceEpoch(record.eventTime!);
final String formattedDate =
DateFormat('EEEE, dd/MM/yyyy').format(eventDateTime);
if (groupedRecords.containsKey(formattedDate)) {
groupedRecords[formattedDate]!.add(record);
} else {
groupedRecords[formattedDate] = [record];
}
}
}
return DefaultTabController(
length: 2,
child: Column(
children: [
Container(
width: MediaQuery.of(context).size.width,
decoration: const ShapeDecoration(
color: ColorsManager.onPrimaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(30)),
),
),
child: TabBar(
onTap: (value) {
setState(() {
_selectedIndex = value;
});
},
indicatorColor: Colors.white,
dividerHeight: 0,
indicatorSize: TabBarIndicatorSize.tab,
indicator: const ShapeDecoration(
color: ColorsManager.slidingBlueColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
),
tabs: [
Tab(
child: Container(
padding: const EdgeInsets.symmetric(vertical: 10),
child: BodySmall(
text: 'Record',
style: context.bodySmall.copyWith(
color: _selectedIndex == 0
? Colors.white
: ColorsManager.blackColor,
fontSize: 12,
fontWeight: FontWeight.w400,
),
),
),
),
Tab(
child: Container(
padding: const EdgeInsets.symmetric(vertical: 10),
child: Text(
'Automation Log',
style: context.bodySmall.copyWith(
color: _selectedIndex == 1
? Colors.white
: ColorsManager.blackColor,
fontSize: 12,
fontWeight: FontWeight.w400,
),
),
),
),
],
),
),
Expanded(
child: TabBarView(
physics: const NeverScrollableScrollPhysics(),
children: [
groupedRecords.isEmpty
? Center(
child: SvgPicture.asset(
Assets.emptyLog,
fit: BoxFit.fill,
),
)
: ListView.builder(
itemCount: groupedRecords.length,
itemBuilder: (context, index) {
final String date =
groupedRecords.keys.elementAt(index);
final List<DeviceEvent> recordsForDate =
groupedRecords[date]!;
return Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
date,
style: const TextStyle(
color: ColorsManager.grayColor,
fontSize: 13,
fontWeight: FontWeight.w700,
),
),
),
DefaultContainer(
child: Column(
children: [
...recordsForDate
.asMap()
.entries
.map((entry) {
final int idx = entry.key;
final DeviceEvent record =
entry.value;
final DateTime eventDateTime =
DateTime
.fromMillisecondsSinceEpoch(
record.eventTime!);
final String formattedTime =
DateFormat('HH:mm:ss')
.format(eventDateTime);
return Column(
children: [
ListTile(
leading: SvgPicture.asset(
record.value == 'true'
? Assets
.leakDetectedIcon
: Assets
.leakNormalIcon,
height: 25,
width: 25,
),
title: const Text(
"SOS Alert Triggered",
style: const TextStyle(
fontWeight:
FontWeight.bold,
fontSize: 18,
),
),
subtitle:
Text(formattedTime),
),
if (idx !=
recordsForDate.length - 1)
const Divider(
color: ColorsManager
.graysColor,
),
],
);
}).toList(),
],
),
),
],
);
},
),
Container(
height: 10,
width: 20,
child: Center(
child: SvgPicture.asset(
Assets.emptyLog,
fit: BoxFit.fill,
),
),
),
],
),
),
],
),
);
},
),
),
);
}
}

View File

@ -0,0 +1,230 @@
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/sos_bloc/sos_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/sos_model.dart';
import 'package:syncrow_app/features/devices/view/device_settings/settings_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/sos/sos_alarm_management_page.dart';
import 'package:syncrow_app/features/devices/view/widgets/sos/sos_records_screen.dart';
import 'package:syncrow_app/features/shared_widgets/battery_bar.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/generated/assets.dart';
class SosScreen extends StatelessWidget {
final DeviceModel? device;
const SosScreen({super.key, this.device});
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => SosBloc(sosId: device?.uuid ?? '')
..add(const SosInitial())
..add(SosInitialDeviseInfo()),
child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) {
final sensor = BlocProvider.of<SosBloc>(context);
SosModel model = SosModel(
batteryPercentage: 0,
sosContactState: '',
);
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return DefaultScaffold(
title: sensor.deviceInfo.name,
actions: [
InkWell(
onTap: () async {
var val = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SettingsPage(device: device!),
),
);
if (val == null) {
sensor.add(SosInitialDeviseInfo());
sensor.add(const SosInitial());
}
},
child: SvgPicture.asset(Assets.assetsIconsSettings),
),
const SizedBox(width: 10),
],
child: state is SosLoadingState
? const Center(
child: DefaultContainer(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
: RefreshIndicator(
onRefresh: () async {
sensor.add(const SosInitial());
},
child: ListView(
children: [
SizedBox(
height: MediaQuery.sizeOf(context).height * 0.8,
child: Column(
children: [
BatteryBar(
batteryPercentage:
sensor.deviceStatus.batteryPercentage,
),
Expanded(
flex: 4,
child: InkWell(
overlayColor: MaterialStateProperty.all(
Colors.transparent),
onTap: () {
// Add functionality for the main SOS button here
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(890),
boxShadow: [
BoxShadow(
color:
Colors.white.withOpacity(0.1),
blurRadius: 24,
offset: const Offset(-5, -5),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.black
.withOpacity(0.11),
blurRadius: 25,
offset: const Offset(5, 5),
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: Colors.black
.withOpacity(0.13),
blurRadius: 30,
offset: const Offset(5, 5),
blurStyle: BlurStyle.inner,
),
],
),
child: SvgPicture.asset(
sensor.deviceStatus.sosContactState !=
'sos'
? Assets.redSos
: Assets.greenSos,
fit: BoxFit.fill,
),
),
],
),
),
),
Flexible(
child: Row(
children: [
Expanded(
child: DefaultContainer(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
SosRecordsScreen(
sosId: device!.uuid!),
),
);
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46,
maxWidth: 50,
),
child: SvgPicture.asset(
Assets.doorRecordsIcon),
),
const SizedBox(height: 15),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Records',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
const SizedBox(width: 10),
Expanded(
child: DefaultContainer(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
AlarmManagementPage(
sosId: device!.uuid!,
),
),
);
},
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 46,
maxWidth: 50,
),
child: SvgPicture.asset(Assets
.doorNotificationSetting),
),
const SizedBox(height: 15),
const Flexible(
child: FittedBox(
child: BodySmall(
text: 'Alarm Settings',
textAlign: TextAlign.center,
),
),
),
],
),
),
),
],
),
),
],
),
),
],
),
),
);
},
),
);
}
}

View File

@ -0,0 +1,377 @@
// 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/sos_bloc/sos_bloc.dart';
// import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart';
// import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart';
// import 'package:syncrow_app/features/devices/model/device_model.dart';
// import 'package:syncrow_app/features/devices/model/sos_model.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_profile_page.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/faq_sos_page.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/share_sos_page.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_info_page.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_update_page.dart';
// import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/update_dialog_sos.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/delete_device_dialogs.dart';
// import 'package:syncrow_app/features/shared_widgets/setting_widget.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 SosSettings extends StatelessWidget {
// final DeviceModel? device;
// const SosSettings({
// super.key,
// this.device,
// });
// @override
// Widget build(BuildContext context) {
// return DefaultScaffold(
// title: 'Device Settings',
// child: BlocProvider(
// create: (context) => SosBloc(sosId: device?.uuid ?? '')
// ..add(const SosInitial())
// ..add(SosInitialDeviseInfo()),
// child: BlocBuilder<SosBloc, SosState>(
// builder: (context, state) {
// final _bloc = BlocProvider.of<SosBloc>(context);
// SosModel model =
// SosModel(batteryPercentage: 0, sosContactState: 'normal');
// if (state is LoadingNewSate) {
// model = state.sosSensor;
// } else if (state is UpdateState) {
// model = state.sensor;
// }
// return state is SosLoadingState
// ? const Center(
// child: DefaultContainer(
// width: 50,
// height: 50,
// child: CircularProgressIndicator()),
// )
// : ListView(
// children: [
// Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 10,
// ),
// child: InkWell(
// onTap: () async {
// bool val = await Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) => SosProfilePage(
// device: device,
// ),
// ),
// );
// if (val == true) {
// _bloc.add(SosInitialDeviseInfo());
// _bloc.add(const SosInitial());
// }
// },
// child: Stack(
// children: [
// Column(
// crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [
// const SizedBox(height: 20),
// DefaultContainer(
// borderRadius: const BorderRadius.all(
// Radius.circular(30)),
// child: Padding(
// padding: const EdgeInsets.all(10.0),
// child: Padding(
// padding:
// const EdgeInsets.only(left: 90),
// child: Row(
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Column(
// crossAxisAlignment:
// CrossAxisAlignment.start,
// children: [
// BodyMedium(
// text: _bloc.deviceInfo.name,
// fontWeight: FontWeight.bold,
// ),
// const SizedBox(
// height: 5,
// ),
// BodySmall(
// text: _bloc.deviceInfo
// .subspace.subspaceName),
// ],
// ),
// const Icon(
// Icons.edit_outlined,
// color: ColorsManager.grayColor,
// ),
// ],
// ),
// ),
// ),
// ),
// ],
// ),
// Positioned(
// top: 0,
// left: 20,
// child: CircleAvatar(
// radius: 40,
// backgroundColor: Colors.white,
// child: CircleAvatar(
// radius: 40,
// backgroundColor:
// Colors.white.withOpacity(0),
// child: ClipOval(
// child: SvgPicture.asset(
// Assets.sosHomeIcon,
// fit: BoxFit.contain,
// height: 80,
// ),
// )),
// ),
// ),
// ],
// ),
// ),
// ),
// const SizedBox(height: 20),
// const BodyMedium(
// text: 'Device Management',
// fontWeight: FontWeight.w700,
// fontSize: 12,
// fontColor: ColorsManager.grayColor,
// ),
// DefaultContainer(
// child: SettingWidget(
// onTap: () {
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) =>
// SosInfoPage(device: device!)),
// );
// },
// text: 'Device Information',
// icon: Assets.infoIcon,
// ),
// ),
// const SizedBox(height: 20),
// const BodyMedium(
// text: 'Device Offline Notification',
// fontWeight: FontWeight.w700,
// fontSize: 12,
// fontColor: ColorsManager.grayColor,
// ),
// DefaultContainer(
// child: Column(
// children: [
// SettingWidget(
// value: _bloc.enableAlarm,
// onChanged: (p0) {
// context
// .read<SosBloc>()
// .add(ToggleEnableAlarmEvent(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) =>
// ShareSosPage(device: device!)),
// );
// },
// text: 'Share Device',
// icon: Assets.shareIcon,
// ),
// const Divider(
// color: ColorsManager.dividerColor,
// ),
// SettingWidget(
// onTap: () {
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) =>
// FaqSosPage(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: () {
// Navigator.of(context).pop();
// },
// );
// },
// );
// },
// isUpdate: true,
// onTap: () {
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) =>
// const SosUpdatePage()),
// );
// },
// 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: () {
// 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: () {
// _bloc.add(
// DeleteDeviceEvent());
// },
// );
// },
// );
// },
// 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,
// ),
// ),
// ),
// ],
// );
// },
// ),
// ),
// );
// }
// }

View File

@ -0,0 +1,58 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/devices/model/smart_door_model.dart';
import 'package:syncrow_app/generated/assets.dart';
class SosStatusBar extends StatelessWidget {
const SosStatusBar({
required this.smartDoorModel,
super.key,
});
final SmartDoorModel smartDoorModel;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(Assets.assetsIconsWifi),
Transform.rotate(
angle: 1.5708, // 90 degrees in radians (π/2 or 1.5708)
child: Icon(
_getBatteryIcon(smartDoorModel.residualElectricity),
color: _getBatteryColor(smartDoorModel.residualElectricity),
size: 30,
),
),
],
);
}
IconData _getBatteryIcon(int batteryLevel) {
// if (batteryState == BatteryState.charging) {
// return Icons.battery_charging_full;
// } else
if (batteryLevel >= 80) {
return Icons.battery_full;
} else if (batteryLevel >= 60) {
return Icons.battery_4_bar;
} else if (batteryLevel >= 40) {
return Icons.battery_3_bar;
} else if (batteryLevel >= 20) {
return Icons.battery_2_bar;
} else {
return Icons.battery_alert;
}
}
Color _getBatteryColor(int batteryLevel) {
if (batteryLevel >= 80) {
return Colors.green;
} else if (batteryLevel >= 40) {
return Colors.yellowAccent;
} else {
return Colors.red;
}
}
}

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,94 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SettingWidget extends StatelessWidget {
final String? text;
final bool? isUpdate;
final bool? value;
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.value,
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: const 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: const BodyMedium(
text: '1 Update Available',
fontSize: 13,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blueColor,
),
)
: const SizedBox(),
isNotification == false
? const Icon(
Icons.arrow_forward_ios,
color: ColorsManager.graysColor,
size: 20,
)
: Transform.scale(
scale: .8,
child: CupertinoSwitch(
value: value!,
onChanged: onChanged,
applyTheme: true,
),
),
],
),
);
}
}

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,38 @@ 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";
//powerClampIcon 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";
static const String fourSceneIcon = "assets/icons/four_scene_icon.svg";
static const String fourSceneHomeIcon =
"assets/icons/four_scene_home_icon.svg";
static const String sixSceneHomeIcon = "assets/icons/six_scene_home_icon.svg";
static const String editDeviceNameIcon =
"assets/icons/edit_device_name_icon.svg";
static const String sosHomeIcon = "assets/icons/sos_home_icon.svg";
static const String editNameSetting = "assets/icons/edit_name_setting.svg";
} }

View File

@ -213,4 +213,12 @@ abstract class ApiEndpoints {
'/device/report-logs/{deviceUuid}?code={code}&startTime={startTime}&endTime={endTime}'; '/device/report-logs/{deviceUuid}?code={code}&startTime={startTime}&endTime={endTime}';
static const String controlBatch = '/device/control/batch'; static const String controlBatch = '/device/control/batch';
static const String statusBatch = '/device/status/batch'; static const String statusBatch = '/device/status/batch';
static const String deviceScene = '/device/{deviceUuid}/scenes';
static const String fourSceneByName =
'/device/{deviceUuid}/scenes?switchName={switchName}';
static const String resetDevice = '/factory/reset/{deviceUuid}';
static const String unAssignScenesDevice =
'/device/{deviceUuid}/scenes?switchName={switchName}';
} }

View File

@ -31,6 +31,22 @@ class DevicesAPI {
} }
} }
static Future<Map<String, dynamic>> putDeviceName(
{required String deviceId, required String deviceName}) async {
try {
final response = await _httpService.put(
path: ApiEndpoints.deviceByUuid.replaceAll('{deviceUuid}', deviceId),
body: {"deviceName": deviceName},
expectedResponseModel: (json) {
return json;
},
);
return response;
} catch (e) {
rethrow;
}
}
static Future<Map<String, dynamic>> controlDevice( static Future<Map<String, dynamic>> controlDevice(
DeviceControlModel controlModel, String deviceId) async { DeviceControlModel controlModel, String deviceId) async {
try { try {
@ -121,6 +137,62 @@ class DevicesAPI {
return response; return response;
} }
static Future getDeviceSceneInfo(String deviceId) async {
final response = await _httpService.get(
path: ApiEndpoints.deviceScene.replaceAll('{deviceUuid}', deviceId),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
});
return response;
}
static Future getSceneBySwitchName(
{String? deviceId, String? switchName}) async {
final response = await _httpService.get(
path: ApiEndpoints.fourSceneByName
.replaceAll('{deviceUuid}', deviceId!)
.replaceAll('{switchName}', switchName!),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
});
return response;
}
static Future postDeviceSceneInfo({
String? switchName,
String? sceneUuid,
String? deviceId,
String? spaceUuid,
}) async {
final response = await _httpService.post(
path: ApiEndpoints.deviceScene.replaceAll('{deviceUuid}', deviceId!),
body: jsonEncode(
{
"switchName": switchName,
"sceneUuid": sceneUuid,
"spaceUuid": spaceUuid
},
),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
});
return response;
}
static Future getDeviceInfo(String deviceId) async {
final response = await _httpService.get(
path: ApiEndpoints.deviceByUuid.replaceAll('{deviceUuid}', deviceId),
showServerMessage: false,
expectedResponseModel: (json) {
print('object-*-*-*${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(
@ -439,4 +511,36 @@ class DevicesAPI {
); );
return response; return response;
} }
static Future resetDevise({
String? devicesUuid,
}) async {
final response = await _httpService.post(
path: ApiEndpoints.resetDevice.replaceAll('{deviceUuid}', devicesUuid!),
showServerMessage: false,
body: {
"devicesUuid": [devicesUuid]
},
expectedResponseModel: (json) {
return json;
},
);
return response;
}
static Future unAssignScenesDevice({
String? deviceUuid,
String? switchName,
}) async {
final response = await _httpService.delete(
path: ApiEndpoints.unAssignScenesDevice
.replaceAll('{deviceUuid}', deviceUuid!)
.replaceAll('{switchName}', switchName!),
showServerMessage: false,
expectedResponseModel: (json) {
return json;
},
);
return response;
}
} }

View File

@ -1,4 +1,3 @@
import 'dart:convert';
import 'package:syncrow_app/features/scene/model/create_automation_model.dart'; import 'package:syncrow_app/features/scene/model/create_automation_model.dart';
import 'package:syncrow_app/features/scene/model/create_scene_model.dart'; import 'package:syncrow_app/features/scene/model/create_scene_model.dart';

View File

@ -60,6 +60,8 @@ class SpacesAPI {
} }
} }
//factory/reset/{deviceUuid}
static Future<String> generateInvitationCode( static Future<String> generateInvitationCode(
String unitId, String communityId) async { String unitId, String communityId) 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,9 @@ enum DeviceType {
GarageDoor, GarageDoor,
WaterLeak, WaterLeak,
PC, PC,
FourScene,
SixScene,
SOS,
Other, Other,
} }
@ -88,11 +91,17 @@ 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,
"6S": DeviceType.SixScene,
"SOS": DeviceType.SOS,
}; };
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 +124,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 +140,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 +152,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 +161,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 +173,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 +265,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 +301,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 +311,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 +340,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 +384,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 +443,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 +481,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 +516,96 @@ 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({})),
],
DeviceType.SixScene: [
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_5',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson({
"range": ["scene"]
})),
FunctionModel(
code: 'scene_6',
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({})),
],
DeviceType.SOS: [
FunctionModel(
code: 'contact_state',
type: functionTypesMap['Raw'],
values: ValueModel.fromJson({})),
FunctionModel(
code: 'battery_percentage',
type: functionTypesMap['Integer'],
values: ValueModel.fromJson({})),
],
}; };
enum TempModes { hot, cold, wind } enum TempModes { hot, cold, wind }
@ -588,7 +751,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 +785,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

@ -5,7 +5,7 @@ description: This is the mobile application project, developed with Flutter for
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev publish_to: "none" # Remove this line if you wish to publish to pub.dev
version: 1.0.7+40 version: 1.0.9+45
environment: environment:
sdk: ">=3.0.6 <4.0.0" sdk: ">=3.0.6 <4.0.0"
@ -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: