Compare commits
190 Commits
icon_setti
...
SP-1477-FE
Author | SHA1 | Date | |
---|---|---|---|
a7080248cb | |||
25893e3bbd | |||
c90f0874c2 | |||
214ec78a95 | |||
ed9f98e653 | |||
a37236c8d2 | |||
1f1a8a7208 | |||
e7efd2b3a1 | |||
2b0e504f05 | |||
a656d5981e | |||
3f49a18130 | |||
a51c4d9679 | |||
caeed8e73f | |||
dc5ac9be5b | |||
5c9b30895f | |||
06b14a3964 | |||
3c92ea3047 | |||
73d28a1800 | |||
5493ca6fb0 | |||
7005d8ba83 | |||
cb79627038 | |||
1cff69d496 | |||
60df77efad | |||
9e84048f81 | |||
99adb1c286 | |||
f2412aa867 | |||
e4768c95aa | |||
f25b4dbf6d | |||
9eff9ab371 | |||
a2e68d6194 | |||
94c94b170f | |||
253cf15559 | |||
443eea9421 | |||
87a2c08f64 | |||
dd66e7c747 | |||
7af61d2f65 | |||
f37eacb0ee | |||
c7dcc297aa | |||
aefe5ad081 | |||
8d9af8519d | |||
b1d52937c9 | |||
5fedf37421 | |||
ccde857c29 | |||
b2a8086e0e | |||
408e78962c | |||
dcdbc02ca0 | |||
31025e9176 | |||
8219de6821 | |||
fbdf3817ab | |||
17422edd0d | |||
4c8f2c72df | |||
fb867e5df3 | |||
9472390284 | |||
731ba0f3d6 | |||
56407c6426 | |||
02d61ca0bb | |||
99ee4b9878 | |||
19edd0a275 | |||
ef5e7c3154 | |||
80dd0f696f | |||
a64a41548f | |||
0d50aa68fa | |||
88aac86b10 | |||
0673548745 | |||
c2fc8fa0ae | |||
cbf10bbf78 | |||
d95588ce84 | |||
7e2e591d71 | |||
2ec81bda9c | |||
3b0f51473c | |||
13757d89ee | |||
d3068b8e14 | |||
7c5d7e1dda | |||
0a97a4867d | |||
6e55b488aa | |||
22789234fe | |||
8393ec353a | |||
0b45d61b25 | |||
450b773921 | |||
3f7f7ce49f | |||
2dc4e16a75 | |||
cd41720244 | |||
67209961b4 | |||
9098276223 | |||
36dfe2c85e | |||
efed5f55a7 | |||
9897c19dad | |||
48733fd65e | |||
4ca4086bd3 | |||
4da1b16b18 | |||
1189b52c57 | |||
c578d63134 | |||
457b7c2c51 | |||
4ae04cf2af | |||
d72253e3de | |||
790479effb | |||
827585815b | |||
de024994c9 | |||
bcc4ba98ff | |||
df0f1c6c94 | |||
1f62cadcec | |||
ee01a89d21 | |||
31cc210560 | |||
f779445d17 | |||
c76548a17f | |||
f960a553ca | |||
55c1a30f10 | |||
90812f78e8 | |||
b1368bf4d7 | |||
de9c51998c | |||
763e39ef12 | |||
cc9ddffa44 | |||
7a22bb4bc8 | |||
cff8c4728c | |||
8be05fbd91 | |||
33d2bbc91f | |||
f81880a704 | |||
fc3f215dba | |||
66eadd2567 | |||
2ac8128eff | |||
2e92861b7a | |||
6f02459ad8 | |||
d9ef6de71a | |||
4e506652f8 | |||
51b1438d0e | |||
80d92de625 | |||
bb50918f04 | |||
f24a32ec7b | |||
e55ff17148 | |||
4527ec15ee | |||
946f806a71 | |||
3406a7eba1 | |||
a7aa165317 | |||
c5474c1b10 | |||
7ffc67651c | |||
db9ab530ea | |||
efe68ecb1a | |||
b365f7e347 | |||
6733c4f4ab | |||
3d17c588c5 | |||
9f02ce8a31 | |||
fe55d0a914 | |||
60dfb1607a | |||
6c2c866969 | |||
b4f990e7a9 | |||
4b0270a70d | |||
777bd549ca | |||
1be6d71e89 | |||
f1bb454429 | |||
ec7b351a82 | |||
b547a126ed | |||
faf294bb10 | |||
391d6349cc | |||
9c873fb0c5 | |||
e9615cd351 | |||
52f6be3db0 | |||
34536e6584 | |||
7d51ca1f12 | |||
ff31c54e7b | |||
944de7b373 | |||
ab4f8c593d | |||
977fd12721 | |||
e4a3d4c50b | |||
29f82945a6 | |||
87a4a88417 | |||
dcccc4db3a | |||
36e5df38ee | |||
7571e35a70 | |||
995fd8d0a6 | |||
b7b48006af | |||
ea202812cd | |||
79f224f481 | |||
80d2651370 | |||
7071f50d49 | |||
13a4bf25b3 | |||
f6a12f2e92 | |||
5d32fc1213 | |||
bfd9c557ce | |||
5c65bac076 | |||
489789da0a | |||
d025da6daf | |||
5a7ed3ec7c | |||
1558996891 | |||
ef232e9cd5 | |||
a1b8c79ce4 | |||
70d8bae19d | |||
021f40b8b3 | |||
13f244ff19 | |||
bcc31d53a1 | |||
3adb84125a |
5
.env.dev
@ -1,2 +1,5 @@
|
||||
ENV_NAME=development
|
||||
BASE_URL=https://syncrow-dev.azurewebsites.net
|
||||
BASE_URL=https://syncrow-dev.azurewebsites.net
|
||||
PROJECT_ID=0e62577c-06fa-41b9-8a92-99a21fbaf51c
|
||||
CLIENT_ID=c024573d191a327ce74db7d4502fdc29
|
||||
CLIENT_SECRET=fec6ccbc33664f94a3b84a45c7cceef3f3ebd1613ef4307db8946ede530cd1ed
|
@ -1,2 +1,3 @@
|
||||
ENV_NAME=production
|
||||
BASE_URL=https://syncrow-staging.azurewebsites.net
|
||||
BASE_URL=https://syncrow-staging.azurewebsites.net
|
||||
PROJECT_ID=bcda711e-9fc2-4168-a05e-171b4026d1ff
|
||||
|
@ -1,2 +1,3 @@
|
||||
ENV_NAME=staging
|
||||
BASE_URL=https://syncrow-staging.azurewebsites.net
|
||||
BASE_URL=https://syncrow-staging.azurewebsites.net
|
||||
PROJECT_ID=bcda711e-9fc2-4168-a05e-171b4026d1ff
|
||||
|
3
.gitignore
vendored
@ -5,9 +5,11 @@
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.build/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
.swiftpm/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
@ -40,3 +42,4 @@ app.*.map.json
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
/android/app/.cxx/
|
||||
|
@ -1,5 +1,5 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
ext.kotlin_version = '1.9.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
@ -1,3 +1,6 @@
|
||||
org.gradle.jvmargs=-Xmx4G
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
#Wed Apr 03 23:37:40 EET 2024
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
@ -23,7 +23,7 @@ pluginManagement {
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
id "com.android.application" version '8.3.0' apply false
|
||||
// START: FlutterFire Configuration
|
||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||
id "com.google.firebase.crashlytics" version "2.8.1" apply false
|
||||
|
5
assets/icons/add_devices_icon.svg
Normal 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 |
5
assets/icons/add_scene_icon.svg
Normal 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 |
10
assets/icons/add_switch_icon.svg
Normal 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 |
10
assets/icons/backlight_icon.svg
Normal 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 |
28
assets/icons/bathroom.svg
Normal file
@ -0,0 +1,28 @@
|
||||
<svg width="21" height="25" viewBox="0 0 21 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.9628 0C15.5449 0 14.3965 1.15256 14.3965 2.56632C14.3965 2.78191 14.5748 2.96018 14.7903 2.96018C15.0059 2.96018 15.1842 2.78191 15.1842 2.56632C15.1842 1.58374 15.9844 0.787724 16.9628 0.787724C17.9454 0.787724 18.7414 1.58789 18.7414 2.56632V15.1782C18.7414 15.3938 18.9197 15.5721 19.1353 15.5721C19.3509 15.5721 19.5291 15.3938 19.5291 15.1782V2.56632C19.5291 1.15256 18.3766 0 16.9628 0Z" fill="#C3BEC6"/>
|
||||
<path d="M6.95808 7.69098H5.2168V3.41654C5.2168 3.18852 5.40336 3.00195 5.63139 3.00195H6.54349C6.77152 3.00195 6.95808 3.18852 6.95808 3.41654V7.69098Z" fill="#A7CCF9"/>
|
||||
<path d="M6.53841 3.00195H5.63875C5.58485 3.00195 5.53096 3.01439 5.48535 3.03097C5.6429 3.09316 5.75069 3.24242 5.75069 3.42069V7.69098H6.95715V3.42069C6.95715 3.19267 6.77059 3.00195 6.53841 3.00195Z" fill="#8CBDF9"/>
|
||||
<path d="M5.21973 4.34912H6.96101V5.13685H5.21973V4.34912Z" fill="#4C5E71"/>
|
||||
<path d="M3.47957 7.69102H1.73828V2.54594C1.73828 2.31791 1.92485 2.13135 2.15287 2.13135H3.06497C3.293 2.13135 3.47957 2.31791 3.47957 2.54594V7.69102Z" fill="#A7DDA7"/>
|
||||
<path d="M3.06185 2.13525H2.16219C2.10829 2.13525 2.05439 2.14769 2.00879 2.16428C2.16633 2.22646 2.27413 2.37572 2.27413 2.55399V7.69078H3.48059V2.55399C3.48059 2.32182 3.29402 2.13525 3.06185 2.13525Z" fill="#8ACE9B"/>
|
||||
<path d="M1.73828 3.479H3.47957V4.26673H1.73828V3.479Z" fill="#4C5E71"/>
|
||||
<path d="M11.3064 15.1788C11.3064 14.2004 10.5021 13.4127 9.51952 13.4417H7.47559V15.3695H11.3064V15.1788Z" fill="#EABC73"/>
|
||||
<path d="M15.2205 24.7462L14.7852 23.0049V22.582H16.9618V24.9991H15.2329L15.2205 24.7462Z" fill="#C3BEC6"/>
|
||||
<path d="M5.6512 24.7462L6.08652 23.0049V22.582H3.91406V24.9991H5.64291L5.6512 24.7462Z" fill="#C3BEC6"/>
|
||||
<path d="M20.0045 16.3267H0.871094V16.9195L1.87855 21.6334C2.04853 22.4336 2.75749 23.0099 3.57838 23.0099H17.2931C18.114 23.0099 18.8229 22.4377 18.9929 21.6334L20.0045 16.9195V16.3267Z" fill="#E2DFE2"/>
|
||||
<path d="M18.7983 16.3267V16.9195L17.7867 21.6334C17.6168 22.4336 16.9078 23.0099 16.0869 23.0099H17.2934C18.1143 23.0099 18.8232 22.4377 18.9932 21.6334L20.0048 16.9195V16.3267H18.7983Z" fill="#D3CED5"/>
|
||||
<path d="M0.870642 16.9195C0.389716 16.9195 0 16.5298 0 16.0489C0 15.5679 0.389716 15.1782 0.870642 15.1782H20.004C20.485 15.1782 20.8747 15.5679 20.8747 16.0489C20.8747 16.5298 20.485 16.9195 20.004 16.9195H0.870642Z" fill="#F4F2F4"/>
|
||||
<path d="M20.0053 15.1782H18.7988C19.2798 15.1782 19.6695 15.5679 19.6695 16.0489C19.6695 16.5298 19.2798 16.9195 18.7988 16.9195H20.0053C20.4862 16.9195 20.8759 16.5298 20.8759 16.0489C20.8759 15.5679 20.4862 15.1782 20.0053 15.1782Z" fill="#E2DFE2"/>
|
||||
<path d="M19.5466 19.0509L19.7124 18.2632H1.15527L1.32526 19.0509H19.5466Z" fill="#C3BEC6"/>
|
||||
<path d="M5.22175 13.4424C4.2599 13.4424 3.48047 14.2218 3.48047 15.1837V19.9681C3.48047 20.2085 3.67533 20.4034 3.91579 20.4034H7.39421C7.63468 20.4034 7.82953 20.2085 7.82953 19.9681V15.2168C7.82953 14.2674 8.57165 13.4673 9.52107 13.4424H5.22175Z" fill="#EFD27C"/>
|
||||
<path d="M3.48047 16.9214H7.82954V18.6627H3.48047V16.9214Z" fill="#EAA96A"/>
|
||||
<path d="M16.5265 4.3072C16.5265 3.34535 15.7471 2.56592 14.7852 2.56592C13.8234 2.56592 13.0439 3.34535 13.0439 4.3072V4.80471H16.5224L16.5265 4.3072Z" fill="#E2DFE2"/>
|
||||
<path d="M14.785 2.56592C14.5735 2.56592 14.3704 2.60323 14.1797 2.67371C14.843 2.91832 15.3157 3.55679 15.3157 4.3072V4.80471H16.5221V4.3072C16.5263 3.34535 15.7468 2.56592 14.785 2.56592Z" fill="#D3CED5"/>
|
||||
<path d="M16.5268 6.0489C17.0077 6.0489 17.3974 5.65919 17.3974 5.17826C17.3974 4.69733 17.0077 4.30762 16.5268 4.30762H13.0484C12.5675 4.30762 12.1777 4.69733 12.1777 5.17826C12.1777 5.65919 12.5675 6.0489 13.0484 6.0489H16.5268Z" fill="#F4F2F4"/>
|
||||
<path d="M16.5268 4.30762H15.3203C15.8012 4.30762 16.191 4.69733 16.191 5.17826C16.191 5.65919 15.8012 6.0489 15.3203 6.0489H16.5268C17.0077 6.0489 17.3974 5.65919 17.3974 5.17826C17.3974 4.69733 17.0077 4.30762 16.5268 4.30762Z" fill="#E2DFE2"/>
|
||||
<path d="M13.0491 9.05046C12.8335 9.05046 12.6553 8.87218 12.6553 8.65659V7.78595C12.6553 7.57036 12.8335 7.39209 13.0491 7.39209C13.2647 7.39209 13.443 7.57036 13.443 7.78595V8.65659C13.443 8.87218 13.2647 9.05046 13.0491 9.05046Z" fill="#A7CCF9"/>
|
||||
<path d="M14.7845 9.05046C14.5689 9.05046 14.3906 8.87218 14.3906 8.65659V7.78595C14.3906 7.57036 14.5689 7.39209 14.7845 7.39209C15.0001 7.39209 15.1783 7.57036 15.1783 7.78595V8.65659C15.1783 8.87218 15.0042 9.05046 14.7845 9.05046Z" fill="#A7CCF9"/>
|
||||
<path d="M16.5277 9.05046C16.3121 9.05046 16.1338 8.87218 16.1338 8.65659V7.78595C16.1338 7.57036 16.3121 7.39209 16.5277 7.39209C16.7432 7.39209 16.9215 7.57036 16.9215 7.78595V8.65659C16.9215 8.87218 16.7432 9.05046 16.5277 9.05046Z" fill="#A7CCF9"/>
|
||||
<path d="M8.28354 9.09236H0.414592C0.186566 9.09236 0 8.90579 0 8.67777V7.76567C0 7.53764 0.186566 7.35107 0.414592 7.35107H8.28354C8.51157 7.35107 8.69813 7.53764 8.69813 7.76567V8.67777C8.69813 8.90579 8.51157 9.09236 8.28354 9.09236Z" fill="#EAA96A"/>
|
||||
<path d="M8.2758 7.35107H7.06934C7.30151 7.35107 7.48807 7.53764 7.48807 7.76981V8.66948C7.48807 8.90165 7.30151 9.08821 7.06934 9.08821H8.2758C8.50797 9.08821 8.69453 8.90165 8.69453 8.66948V7.76981C8.69868 7.54179 8.50797 7.35107 8.2758 7.35107Z" fill="#E5935D"/>
|
||||
</svg>
|
After Width: | Height: | Size: 5.2 KiB |
33
assets/icons/bedroom.svg
Normal file
@ -0,0 +1,33 @@
|
||||
<svg width="25" height="20" viewBox="0 0 25 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.91701 6.80859H2.18457V10.1036H2.91701V6.80859Z" fill="#78A7AF"/>
|
||||
<path d="M3.52837 11.1936V10.1333C3.52837 9.98345 3.40576 9.86084 3.2559 9.86084H1.84766C1.69781 9.86084 1.5752 9.98345 1.5752 10.1333V11.1936H3.52837Z" fill="#ABCCD3"/>
|
||||
<path d="M4.40077 7.0244C4.53906 7.0244 4.62153 6.91546 4.58398 6.78235L3.7531 3.83726C3.71555 3.70415 3.57165 3.59521 3.43332 3.59521H1.67048C1.53215 3.59521 1.38825 3.70415 1.3507 3.83726L0.519819 6.78235C0.482269 6.91546 0.564693 7.0244 0.703026 7.0244H4.40077Z" fill="#FCC96C"/>
|
||||
<path opacity="0.1" d="M1.59445 6.78235L2.42533 3.83726C2.46288 3.70415 2.60678 3.59521 2.74512 3.59521H1.67048C1.53215 3.59521 1.38825 3.70415 1.3507 3.83726L0.519819 6.78235C0.482269 6.91546 0.564693 7.0244 0.703026 7.0244H1.77761C1.63933 7.0244 1.5569 6.91546 1.59445 6.78235Z" fill="black"/>
|
||||
<path d="M22.8164 6.80859H22.084V10.1036H22.8164V6.80859Z" fill="#78A7AF"/>
|
||||
<path d="M23.4249 11.1936V10.1333C23.4249 9.98345 23.3022 9.86084 23.1524 9.86084H21.7441C21.5943 9.86084 21.4717 9.98345 21.4717 10.1333V11.1936H23.4249Z" fill="#ABCCD3"/>
|
||||
<path d="M24.2973 7.02445C24.4356 7.02445 24.518 6.91551 24.4805 6.7824L23.6496 3.83726C23.612 3.7041 23.4681 3.59521 23.3298 3.59521H21.5669C21.4286 3.59521 21.2847 3.7041 21.2471 3.83726L20.4163 6.7824C20.3788 6.91551 20.4612 7.02445 20.5996 7.02445H24.2973Z" fill="#FCC96C"/>
|
||||
<path opacity="0.1" d="M21.5628 6.7824L22.3936 3.83726C22.4312 3.7041 22.5751 3.59521 22.7134 3.59521H21.5669C21.4286 3.59521 21.2847 3.7041 21.2471 3.83726L20.4163 6.7824C20.3788 6.91551 20.4612 7.02445 20.5996 7.02445H21.7461C21.6077 7.02445 21.5253 6.91551 21.5628 6.7824Z" fill="black"/>
|
||||
<path d="M3.39173 15.325C3.39173 15.1866 3.50492 15.0734 3.64325 15.0734H3.83798V13.7245C3.83798 13.3095 4.17754 12.97 4.59254 12.97H5.28821V11.048C5.28455 11.0479 5.28113 11.0469 5.27747 11.0469H0.25152C0.113186 11.0469 0 11.1601 0 11.2984V15.8435C0 15.9819 0.113186 16.095 0.25152 16.095H3.39178L3.39173 15.325Z" fill="#CB7C52"/>
|
||||
<path d="M4.59249 12.97H5.28821V11.048C5.28455 11.0479 5.28113 11.0469 5.27747 11.0469H0.25152C0.113186 11.0469 0 11.1601 0 11.2984V13.03H4.2984C4.38892 12.9914 4.48829 12.97 4.59249 12.97Z" fill="#FFBB4A"/>
|
||||
<path opacity="0.1" d="M1.08587 15.8435V11.2984C1.08587 11.1601 1.19905 11.0469 1.33739 11.0469H0.25152C0.113186 11.0469 0 11.1601 0 11.2984V15.8435C0 15.9819 0.113186 16.095 0.25152 16.095H1.33739C1.19905 16.095 1.08587 15.9818 1.08587 15.8435Z" fill="black"/>
|
||||
<path d="M2.76563 12.3745C2.66895 12.3745 2.57471 12.3355 2.50635 12.2676C2.43848 12.1992 2.39941 12.105 2.39941 12.0088C2.39941 11.9121 2.43848 11.8179 2.50635 11.7495C2.57471 11.6816 2.66895 11.6426 2.76563 11.6426C2.86183 11.6426 2.95607 11.6816 3.02443 11.7495C3.0923 11.8179 3.13185 11.9121 3.13185 12.0088C3.13185 12.105 3.09235 12.1992 3.02443 12.2676C2.95607 12.3355 2.86183 12.3745 2.76563 12.3745Z" fill="white"/>
|
||||
<path d="M24.7476 11.0469H19.7216C19.7089 11.0469 19.6968 11.0488 19.6846 11.0506V12.97H20.3803C20.7953 12.97 21.1348 13.3095 21.1348 13.7245V15.0734H21.3296C21.4679 15.0734 21.5811 15.1866 21.5811 15.3249V16.095H24.7476C24.886 16.095 24.9992 15.9819 24.9992 15.8435V11.2984C24.9991 11.1601 24.8859 11.0469 24.7476 11.0469Z" fill="#CB7C52"/>
|
||||
<path d="M24.7476 11.0469H19.7216C19.7089 11.0469 19.6968 11.0488 19.6846 11.0506V12.97H20.3803C20.4845 12.97 20.5839 12.9914 20.6744 13.03H24.9991V11.2984C24.9991 11.1601 24.8859 11.0469 24.7476 11.0469Z" fill="#FFBB4A"/>
|
||||
<path d="M22.2354 12.375C22.1392 12.375 22.0449 12.3355 21.9766 12.2676C21.9087 12.1992 21.8691 12.105 21.8691 12.0083C21.8691 11.9121 21.9087 11.8179 21.9766 11.7495C22.0449 11.6816 22.1392 11.6426 22.2354 11.6426C22.332 11.6426 22.4263 11.6816 22.4946 11.7495C22.5625 11.8179 22.6021 11.9121 22.6021 12.0083C22.6021 12.105 22.5625 12.1992 22.4946 12.2676C22.4263 12.3355 22.332 12.375 22.2354 12.375Z" fill="white"/>
|
||||
<path d="M19.9184 13.1712V9.67632C19.9184 9.53799 19.8052 9.4248 19.6669 9.4248H5.33257C5.19424 9.4248 5.08105 9.53799 5.08105 9.67632V13.1712H19.9184Z" fill="#FF9F3D"/>
|
||||
<path opacity="0.1" d="M6.1636 13.1712V9.67632C6.1636 9.53799 6.27679 9.4248 6.41512 9.4248H5.33257C5.19424 9.4248 5.08105 9.53799 5.08105 9.67632V13.1712H6.1636Z" fill="black"/>
|
||||
<path d="M11.9437 13.171V12.0422C11.9437 11.6272 11.6041 11.2876 11.1891 11.2876H7.27702C6.86207 11.2876 6.52246 11.6272 6.52246 12.0422V13.171H11.9437Z" fill="white"/>
|
||||
<path d="M18.636 13.171V12.0422C18.636 11.6272 18.2965 11.2876 17.8815 11.2876H13.9694C13.5544 11.2876 13.2148 11.6272 13.2148 12.0422V13.171H18.636Z" fill="white"/>
|
||||
<path d="M21.3677 15.2937V13.7253C21.3677 13.3103 21.0282 12.9707 20.6132 12.9707H4.38444C3.96944 12.9707 3.62988 13.3103 3.62988 13.7253V15.2937H21.3677Z" fill="#FFCFAB"/>
|
||||
<path opacity="0.1" d="M5.00365 15.2937V13.7253C5.00365 13.3103 5.34321 12.9707 5.75821 12.9707H4.38444C3.96944 12.9707 3.62988 13.3103 3.62988 13.7253V15.2937H5.00365Z" fill="black"/>
|
||||
<path d="M5.16518 19.1609C5.30352 19.1609 5.4167 19.0477 5.4167 18.9094V17.5694C5.4167 17.4311 5.52989 17.3179 5.66822 17.3179H19.3331C19.4714 17.3179 19.5846 17.4311 19.5846 17.5694V18.9094C19.5846 19.0477 19.6978 19.1609 19.8361 19.1609H21.5643C21.7026 19.1609 21.8158 19.0477 21.8158 18.9094V15.3257C21.8158 15.1874 21.7026 15.0742 21.5643 15.0742H3.43707C3.29873 15.0742 3.18555 15.1874 3.18555 15.3257V18.9094C3.18555 19.0477 3.29873 19.1609 3.43707 19.1609H5.16518Z" fill="#FF9F3D"/>
|
||||
<g opacity="0.1">
|
||||
<path d="M4.28118 18.9089V15.3253C4.28118 15.1869 4.39437 15.0737 4.5327 15.0737H3.43511C3.29678 15.0737 3.18359 15.1869 3.18359 15.3253V18.9089C3.18359 19.0472 3.29678 19.1604 3.43511 19.1604H4.5327C4.39437 19.1604 4.28118 19.0472 4.28118 18.9089Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M18.0893 6.21186C18.0893 6.35019 17.9761 6.46338 17.8378 6.46338H7.16265C7.02432 6.46338 6.91113 6.35019 6.91113 6.21186V0.617731C6.91113 0.479397 7.02432 0.366211 7.16265 0.366211H17.8378C17.9761 0.366211 18.0893 0.479397 18.0893 0.617731V6.21186Z" fill="#B1E8FF"/>
|
||||
<path opacity="0.1" d="M8.01238 6.21186V0.617731C8.01238 0.479397 8.12557 0.366211 8.2639 0.366211H7.16265C7.02432 0.366211 6.91113 0.479397 6.91113 0.617731V6.21191C6.91113 6.35024 7.02432 6.46343 7.16265 6.46343H8.2639C8.12557 6.46333 8.01238 6.35019 8.01238 6.21186Z" fill="black"/>
|
||||
<path d="M12.2235 2.33252L9.83887 6.46284H14.6082L12.2235 2.33252Z" fill="#86D5B5"/>
|
||||
<path d="M12.7314 6.46345H17.8379C17.9763 6.46345 18.0894 6.35027 18.0894 6.21193V5.80025L15.6018 1.4917L12.7314 6.46345Z" fill="#FCC96C"/>
|
||||
<path d="M17.8388 6.82956H7.16364C6.823 6.82956 6.5459 6.55245 6.5459 6.21182V0.61774C6.5459 0.277106 6.823 0 7.16364 0H17.8388C18.1794 0 18.4565 0.277106 18.4565 0.61774V6.21192C18.4565 6.55245 18.1794 6.82956 17.8388 6.82956ZM7.27839 6.09712H17.7241V0.73244H7.27839V6.09712Z" fill="#CB7C52"/>
|
||||
<path d="M9.31653 3.35424C9.8144 3.35424 10.218 2.95063 10.218 2.45276C10.218 1.95488 9.8144 1.55127 9.31653 1.55127C8.81865 1.55127 8.41504 1.95488 8.41504 2.45276C8.41504 2.95063 8.81865 3.35424 9.31653 3.35424Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 6.9 KiB |
10
assets/icons/cancel_icon.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_7302_4118)">
|
||||
<path d="M11.1049 10.0001L19.7712 1.33381C20.0763 1.02869 20.0763 0.534007 19.7712 0.228929C19.4661 -0.0761485 18.9714 -0.0761876 18.6663 0.228929L9.99999 8.89524L1.33372 0.228929C1.0286 -0.0761876 0.533915 -0.0761876 0.228837 0.228929C-0.0762401 0.534046 -0.0762792 1.02873 0.228837 1.33381L8.89511 10.0001L0.228837 18.6664C-0.0762792 18.9715 -0.0762792 19.4662 0.228837 19.7713C0.381376 19.9238 0.581337 20.0001 0.781297 20.0001C0.981258 20.0001 1.18118 19.9238 1.33376 19.7713L9.99999 11.105L18.6663 19.7713C18.8188 19.9238 19.0188 20.0001 19.2187 20.0001C19.4187 20.0001 19.6186 19.9238 19.7712 19.7713C20.0763 19.4662 20.0763 18.9715 19.7712 18.6664L11.1049 10.0001Z" fill="#999999"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_7302_4118">
|
||||
<rect width="20" height="20" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 939 B |
22
assets/icons/check_update_icon.svg
Normal 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 |
3
assets/icons/create_group_icon.svg
Normal 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 |
13
assets/icons/dyi.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.6477 18.1286L14.5695 16.9625L14.5381 16.5231L16.7995 14.2617L17.2592 14.2729L18.4253 15.351L18.531 15.6845L16.0777 18.1378L15.6477 18.1286Z" fill="#9DE4FB"/>
|
||||
<path d="M21.0627 1.25136C21.36 0.954133 21.36 0.467791 21.0627 0.170566C20.5522 -0.0791971 19.9499 -0.0533175 19.4627 0.239367L17.8536 1.206C16.9222 1.76553 16.4706 2.86478 16.7228 3.92175C16.9226 4.75917 16.6735 5.64059 16.0645 6.24964L16.6364 6.30048C17.2244 5.86531 17.9823 5.71853 18.7089 5.88914C19.131 5.98821 19.5596 5.97283 19.9571 5.85876L20.2488 5.31134L19.4473 4.50975C19.3068 4.36927 19.226 4.18001 19.2217 3.98137L19.21 3.44029C19.2055 3.23013 19.287 3.02719 19.4356 2.8785L21.0627 1.25136Z" fill="#9DE4FB"/>
|
||||
<path d="M6.73692 15.5776C5.0442 17.2704 3.21412 15.8824 1.26475 17.8318C0.124481 18.972 -0.210539 20.6126 0.259592 22.0469C0.259836 22.0463 0.26008 22.0458 0.260276 22.0453L0.554425 22.3394C1.20913 22.5533 1.91218 22.4551 2.61679 22.3364L2.69584 22.0944L2.3972 21.7957C2.26219 21.6607 2.18631 21.4776 2.18631 21.2866V20.2244C2.18631 20.0335 2.26219 19.8504 2.3972 19.7154L3.1483 18.9643C3.28331 18.8292 3.46647 18.7534 3.65739 18.7534H4.71958C4.91055 18.7534 5.09366 18.8292 5.22868 18.9642L5.52644 19.262L5.92421 19.0998C6.02919 18.4761 5.98173 17.3544 6.61944 16.3753L6.73692 15.5776Z" fill="#9DE4FB"/>
|
||||
<path d="M24.7746 3.88015C24.4774 3.58292 23.9911 3.58292 23.6938 3.88015L22.0483 5.5257C21.9105 5.66345 21.7257 5.74397 21.531 5.751L21.0555 5.76814C20.8416 5.77585 20.6341 5.69426 20.4827 5.54289L20.2504 5.31065C19.7111 5.63151 19.0563 5.74455 18.4163 5.59431C17.5859 5.39938 16.7146 5.61887 16.1028 6.20975C16.0904 6.22274 16.0788 6.23627 16.066 6.24901C15.861 6.45405 6.762 15.553 6.73842 15.5766C6.72137 15.5937 6.70399 15.6096 6.68675 15.626C5.67012 16.6895 5.75328 18.0817 5.63155 18.8046C5.60572 18.958 5.5709 19.1104 5.52793 19.261L5.98122 19.7143C6.11623 19.8493 6.19211 20.0325 6.19211 20.2234V21.2856C6.19211 21.4765 6.11623 21.6597 5.98122 21.7947L5.23012 22.5458C5.09511 22.6808 4.91195 22.7567 4.72102 22.7567H3.65884C3.46786 22.7567 3.28475 22.6808 3.14974 22.5458L2.69729 22.0933C1.90097 22.3186 1.04929 22.3015 0.261719 22.0442C0.463043 22.6591 0.811197 23.2365 1.30853 23.72C2.87869 25.2466 5.40669 25.2743 7.008 23.7803C9.10421 21.8246 7.64269 19.9312 9.36784 18.206C9.3922 18.1817 18.4983 9.0756 18.7037 8.87018C19.3169 8.25708 20.2038 8.02787 21.048 8.22602C22.096 8.47202 23.184 8.01327 23.7391 7.08932L24.7057 5.48024C24.9985 4.99297 25.0244 4.39066 24.7746 3.88015Z" fill="#7BD9EC"/>
|
||||
<path d="M7.84826 17.0949C7.70162 16.9482 7.70162 16.7105 7.84826 16.5639L17.1039 7.30818C17.2505 7.1616 17.4883 7.1616 17.6349 7.30818C17.7816 7.45487 17.7816 7.69257 17.6349 7.83925L8.37928 17.0949C8.23259 17.2416 7.99489 17.2415 7.84826 17.0949Z" fill="#9DE4FB"/>
|
||||
<path d="M15.6484 18.1282L18.4261 15.3506L24.5753 21.0359C25.1252 21.5442 25.1421 22.4078 24.6126 22.9373L23.2352 24.3147C22.7057 24.8442 21.8421 24.8273 21.3338 24.2774L15.6484 18.1282Z" fill="#F9BC66"/>
|
||||
<path d="M14.5721 16.9625L17.2618 14.2729L7.34683 5.10596L5.40527 7.04756L14.5721 16.9625Z" fill="#43B5C3"/>
|
||||
<path d="M1.59863 8.09863L3.72729 5.96998L5.7503 7.99299L3.62165 10.1216L1.59863 8.09863Z" fill="#43B5C3"/>
|
||||
<path d="M9.69327 2.70391C9.56329 2.50937 9.41045 2.32582 9.23437 2.15736L7.91231 0.892578L7.6668 0.914844C6.58571 1.58352 6.19688 2.19393 3.02331 5.30428C2.76827 5.55931 2.76827 5.9728 3.02331 6.22784L5.59853 8.80306C5.84185 9.04637 6.23639 9.04637 6.47971 8.80306L9.11616 6.1666C9.56646 5.7163 9.73868 5.06438 9.59102 4.44492C9.45323 3.86669 9.50674 3.4134 9.68766 3.03946C9.71652 2.9798 9.69327 2.70391 9.69327 2.70391Z" fill="#9DE4FB"/>
|
||||
<path d="M12.4915 1.11902C11.0321 -0.0662658 9.32021 -0.113826 7.66602 0.915305L9.10219 2.28927C9.33872 2.51555 9.5333 2.76907 9.68692 3.03988C10.1761 2.00879 11.5877 1.66479 12.3709 1.55175C12.5824 1.52123 12.6575 1.25374 12.4915 1.11902Z" fill="#7BD9EC"/>
|
||||
<path d="M0.996513 7.33135L0.189263 8.1386C-0.0630877 8.39095 -0.0630877 8.8001 0.189263 9.05245L2.75301 11.6162C3.00536 11.8685 3.4145 11.8685 3.66685 11.6162L4.4741 10.8089C4.72645 10.5566 4.72645 10.1474 4.4741 9.8951L1.91036 7.33135C1.65801 7.079 1.24886 7.079 0.996513 7.33135Z" fill="#7BD9EC"/>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
10
assets/icons/edit_name_setting.svg
Normal 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 |
4
assets/icons/edit_name_sos_icon.svg
Normal 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 |
4
assets/icons/edit_sos_icon.svg
Normal 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 |
16
assets/icons/empty_log.svg
Normal 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 |
15
assets/icons/empty_routines.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.5419 20.2424C11.1182 19.3486 10.0545 18.9678 9.16647 19.3935L1.38334 23.1268C0.591819 23.3098 0 24.0197 0 24.8727V33.8466C0 34.8381 0.797668 35.6413 1.78229 35.6413C2.76668 35.6413 3.56412 34.8381 3.56412 33.8466V27.6644L9.16647 30.3516C9.41376 30.4704 9.67449 30.5264 9.93112 30.5264C10.5974 30.5264 11.2359 30.1484 11.5419 29.5025C11.9643 28.6076 11.5875 27.5367 10.699 27.1103L6.03295 24.8725L10.699 22.6346C11.5877 22.2085 11.9643 21.1376 11.5419 20.2424Z" fill="#D5D5D5"/>
|
||||
<path d="M20.6084 17.6894C20.8655 17.6894 21.1257 17.6334 21.3737 17.5146L32.0481 12.3951C32.9366 11.9685 33.3141 10.8974 32.891 10.0024C32.4682 9.10864 31.4052 8.72813 30.5156 9.15359L19.8408 14.2736C18.9522 14.6999 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.7706 81.0494 14.6997 80.1606 14.2733L69.4856 9.1529C68.5982 8.72721 67.5345 9.10726 67.1105 10.0018C66.6875 10.8967 67.0645 11.9676 67.9533 12.3944Z" fill="#D5D5D5"/>
|
||||
<path d="M81.539 34.8099C82.4275 34.3837 82.8046 33.3128 82.3815 32.4177C81.9587 31.5232 80.8946 31.1424 80.0065 31.5695L73.167 34.8509L51.7477 24.577V16.5765C51.7477 15.5846 50.9503 14.7818 49.9659 14.7818C48.9817 14.7818 48.1841 15.5848 48.1841 16.5765V24.6096L26.8346 34.85L20.6999 31.9073C19.8093 31.481 18.7482 31.8612 18.3244 32.7564C17.9016 33.6514 18.2787 34.7225 19.1672 35.1489L25.8031 38.3319V61.6684L19.0593 64.9031C18.1707 65.3295 17.7939 66.4001 18.2165 67.2955C18.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.3022 49.9659 83.3022C50.9503 83.3022 51.7477 82.499 51.7477 81.5075V75.4233L73.1657 65.1501L79.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.5175 82.0735 65.4467 81.1849 65.0201L74.1977 61.6687V38.3319L81.539 34.8099ZM70.634 62.3879L51.7479 71.4467V49.0994L70.634 40.0402V62.3879ZM29.4788 61.8939C29.4472 61.8269 29.4053 61.7691 29.3668 61.7081V40.0404L48.1841 49.0663V71.4141L29.6409 62.5198C29.6239 62.3086 29.5745 62.0964 29.4788 61.8939ZM50.0003 27.7151L69.0207 36.8383L50.0003 45.9611L30.9799 36.8383L50.0003 27.7151Z" fill="#D5D5D5"/>
|
||||
<path d="M78.6271 82.486L67.9525 87.6062C67.0639 88.0328 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.9656 69.485 90.8477L80.1598 85.7273C81.0483 85.3009 81.4252 84.2295 81.0025 83.3346C80.579 82.4401 79.5149 82.0616 78.6271 82.486Z" fill="#D5D5D5"/>
|
||||
<path d="M57.2782 92.7266L51.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.3468L42.723 92.7266C41.8335 92.3023 40.7713 92.6807 40.3475 93.5759C39.9246 94.4709 40.3015 95.5413 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.5413 60.077 94.4709 59.6541 93.5759C59.2304 92.6807 58.166 92.3032 57.2782 92.7266Z" fill="#D5D5D5"/>
|
||||
<path d="M32.0476 87.6061L21.3728 82.4859C20.4863 82.0605 19.4217 82.4394 18.9975 83.3343C18.5749 84.2293 18.9517 85.3006 19.8403 85.727L30.5153 90.8474C30.7622 90.9653 31.0233 91.0213 31.2802 91.0213C31.946 91.0213 32.5847 90.6438 32.8903 89.9977C33.3132 89.1036 32.9361 88.0328 32.0476 87.6061Z" fill="#D5D5D5"/>
|
||||
<path d="M11.5419 70.4974C11.1182 69.6029 10.0545 69.224 9.16647 69.6488L3.56412 72.3355V65.6178C3.56412 64.6265 2.76668 63.823 1.78229 63.823C0.797668 63.823 0 64.6265 0 65.6178V74.5919C0 74.8162 0.0457694 75.0284 0.120686 75.2263C0.156892 75.8784 0.53193 76.4651 1.12215 76.7486L9.16647 80.6073C9.41376 80.7254 9.67449 80.7818 9.93112 80.7818C10.5974 80.7818 11.2359 80.4038 11.5419 79.7582C11.9643 78.8632 11.5875 77.7924 10.699 77.3655L6.03295 75.1281L10.699 72.8903C11.5877 72.4637 11.9643 71.3923 11.5419 70.4974Z" fill="#D5D5D5"/>
|
||||
<path d="M1.78229 56.8226C2.76668 56.8226 3.56412 56.0193 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.0193 0.797896 56.8226 1.78229 56.8226Z" fill="#D5D5D5"/>
|
||||
<path d="M98.6173 23.1268L90.8342 19.3935C89.9443 18.9667 88.8825 19.3479 88.4589 20.2424C88.0363 21.1378 88.4132 22.2084 89.3017 22.6351L93.9677 24.8729L89.3017 27.1108C88.4132 27.5371 88.0363 28.6078 88.4589 29.503C88.7645 30.1488 89.4032 30.5268 90.0691 30.5268C90.3262 30.5268 90.5873 30.4709 90.8342 30.3521L96.4365 27.6649V33.847C96.4365 34.8385 97.234 35.6418 98.2184 35.6418C99.2027 35.6418 100 34.8385 100 33.847V24.8731C100 24.0197 99.4088 23.3098 98.6173 23.1268Z" fill="#D5D5D5"/>
|
||||
<path d="M98.2184 42.642C97.2337 42.642 96.4365 43.4455 96.4365 44.4367V55.0267C96.4365 56.0187 97.234 56.8214 98.2184 56.8214C99.2027 56.8214 100 56.0184 100 55.0267V44.4367C100 43.4455 99.203 42.642 98.2184 42.642Z" fill="#D5D5D5"/>
|
||||
<path d="M98.2184 63.8228C97.2337 63.8228 96.4365 64.6263 96.4365 65.6175V72.3352L90.8342 69.6485C89.9443 69.2231 88.8825 69.6022 88.4589 70.4971C88.0363 71.3921 88.4132 72.4634 89.3017 72.8898L93.9677 75.1277L89.3017 77.3651C88.4132 77.7919 88.0363 78.8628 88.4589 79.7577C88.7645 80.4034 89.4032 80.7814 90.0691 80.7814C90.3262 80.7814 90.5873 80.7249 90.8342 80.6068L98.8785 76.7481C99.4687 76.4646 99.8438 75.8779 99.88 75.2258C99.9546 75.0279 100 74.8157 100 74.5914V65.6173C100 64.6263 99.203 63.8228 98.2184 63.8228Z" fill="#D5D5D5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 6.0 KiB |
9
assets/icons/empty_update_icon.svg
Normal 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 |
3
assets/icons/faq_icon.svg
Normal 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 |
9
assets/icons/four_scene_home_icon.svg
Normal 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 |
67
assets/icons/four_scene_icon.svg
Normal 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 |
38
assets/icons/green_sos.svg
Normal 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
@ -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 |
4
assets/icons/minus_icon.svg
Normal 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 |
3
assets/icons/notification_icon.svg
Normal 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 |
18
assets/icons/offToggleSwitchSmall.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<svg width="47" height="37" viewBox="0 0 47 37" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="6" y="1" width="41" height="25" rx="12.5" fill="#E9E9E9"/>
|
||||
<g filter="url(#filter0_d_6419_4507)">
|
||||
<circle cx="18.5" cy="13.5" r="10.5" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_6419_4507" x="0" y="0" width="37" height="37" 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="5"/>
|
||||
<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.15 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6419_4507"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6419_4507" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 965 B |
39
assets/icons/office.svg
Normal file
@ -0,0 +1,39 @@
|
||||
<svg width="25" height="23" viewBox="0 0 25 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M23.9152 9.49653V6.93262H17.4302C17.2913 6.93262 17.1787 7.04521 17.1787 7.18413V9.49653H23.9152Z" fill="#FED402"/>
|
||||
<path d="M23.7237 6.88413H18.3818L18.2641 6.93296H17.4302C17.2913 6.93296 17.1787 7.04556 17.1787 7.18447V8.19053H23.9152V6.93296L23.7514 6.88135C23.7422 6.88257 23.7332 6.88413 23.7237 6.88413Z" fill="#FE6C55"/>
|
||||
<path d="M10.4375 6.52441H11.9465V8.08906H10.4375V6.52441Z" fill="#918291"/>
|
||||
<path d="M13.959 9.49687V8.79409C13.959 8.37739 13.6212 8.03955 13.2044 8.03955H9.18032C8.76362 8.03955 8.42578 8.37734 8.42578 8.79409V9.49687H13.959Z" fill="#A79BA7"/>
|
||||
<path d="M10.0266 9.448V8.79409C10.0266 8.37739 10.3644 8.03955 10.7812 8.03955H9.18032C8.76362 8.03955 8.42578 8.37734 8.42578 8.79409V9.448H10.0266Z" fill="#918291"/>
|
||||
<path d="M15.7282 6.20679H6.65918C6.52437 6.20679 6.41504 6.09746 6.41504 5.96265V0.610352C6.41504 0.475537 6.52437 0.366211 6.65918 0.366211H15.7282C15.863 0.366211 15.9724 0.475537 15.9724 0.610352V5.96265C15.9724 6.09751 15.8631 6.20679 15.7282 6.20679Z" fill="#EAF6FF"/>
|
||||
<path d="M8.4271 5.95527V0.617725C8.4271 0.478809 8.5397 0.366211 8.67861 0.366211H6.66655C6.52764 0.366211 6.41504 0.478809 6.41504 0.617725V5.95532C6.41504 6.09424 6.52764 6.20684 6.66655 6.20684H8.67861C8.5397 6.20679 8.4271 6.09419 8.4271 5.95527Z" fill="#D8ECFE"/>
|
||||
<path d="M15.718 6.573H6.66362C6.323 6.573 6.0459 6.2959 6.0459 5.95527V0.617724C6.0459 0.2771 6.323 0 6.66362 0H15.7253C16.0619 0 16.3356 0.273779 16.3356 0.610351V5.95527C16.3357 6.2959 16.0585 6.573 15.718 6.573ZM6.77832 5.84058H15.6032V0.732422H6.77832V5.84058Z" fill="#A79BA7"/>
|
||||
<path d="M1.88359 8.06533V7.69912H1.2311C1.01699 7.69912 0.842773 7.52495 0.842773 7.31079V6.80776C0.842773 6.59365 1.01694 6.41943 1.2311 6.41943H1.88355V5.68701H1.2311C0.613135 5.68701 0.110352 6.1898 0.110352 6.80776V7.31079C0.110352 7.92876 0.613086 8.43154 1.2311 8.43154H1.92603C1.89858 8.31377 1.88359 8.19131 1.88359 8.06533Z" fill="#EAF6FF"/>
|
||||
<path d="M2.65684 9.49746H4.33486C4.82593 9.20913 5.15581 8.67593 5.15581 8.06533V5.93115C5.15581 5.79634 5.04648 5.68701 4.91167 5.68701H1.83594V8.06533C1.83594 8.67593 2.16582 9.20913 2.65684 9.49746Z" fill="#EAF6FF"/>
|
||||
<path d="M2.57842 9.44863H3.83784C3.3896 9.15146 3.09346 8.64341 3.09346 8.06533V5.68701H1.83594V8.06533C1.83594 8.64282 2.13101 9.15127 2.57842 9.44863Z" fill="#D8ECFE"/>
|
||||
<path d="M17.1787 8.19141H19.6977V9.44897H17.1787V8.19141Z" fill="#FAC600"/>
|
||||
<path d="M19.9492 6.93262H17.4302C17.2913 6.93262 17.1787 7.04521 17.1787 7.18413V8.19019H19.6977V7.18413C19.6977 7.04521 19.8103 6.93262 19.9492 6.93262Z" fill="#FD544D"/>
|
||||
<path d="M24.7477 6.93384H18.2627V5.92778C18.2627 5.78887 18.3753 5.67627 18.5142 5.67627H24.7477C24.8866 5.67627 24.9992 5.78887 24.9992 5.92778V6.68232C24.9992 6.82124 24.8866 6.93384 24.7477 6.93384Z" fill="#00C27A"/>
|
||||
<path d="M20.6018 5.67627H18.5142C18.3753 5.67627 18.2627 5.78887 18.2627 5.92778V6.93384H20.3502V5.92778C20.3502 5.78887 20.4629 5.67627 20.6018 5.67627Z" fill="#09A755"/>
|
||||
<path d="M2.26367 10.7251H14.0313V15.6865H2.26367V10.7251Z" fill="#FFBD86"/>
|
||||
<path d="M2.31348 10.7734H3.56406V15.686H2.31348V10.7734Z" fill="#F6A96C"/>
|
||||
<path d="M13.9854 10.7241V13.5457L14.1291 13.5945H22.5894L22.7364 13.5457V10.7241H13.9854Z" fill="#EA9B58"/>
|
||||
<path d="M13.9854 10.7729H15.5196V13.5457H13.9854V10.7729Z" fill="#D88A55"/>
|
||||
<path d="M18.9885 12.519H17.6807C17.4784 12.519 17.3145 12.3551 17.3145 12.1528C17.3145 11.9506 17.4784 11.7866 17.6807 11.7866H18.9885C19.1908 11.7866 19.3547 11.9506 19.3547 12.1528C19.3547 12.3551 19.1908 12.519 18.9885 12.519Z" fill="#D88A55"/>
|
||||
<path d="M13.9854 13.5464V16.3191L14.0939 16.3679H22.6279L22.7364 16.3191V13.5464H13.9854Z" fill="#F6A96C"/>
|
||||
<path d="M13.9854 13.5464H15.5196V16.3191H13.9854V13.5464Z" fill="#EA9B58"/>
|
||||
<path d="M18.9885 15.291H17.6807C17.4784 15.291 17.3145 15.1271 17.3145 14.9248C17.3145 14.7226 17.4784 14.5586 17.6807 14.5586H18.9885C19.1908 14.5586 19.3547 14.7226 19.3547 14.9248C19.3547 15.1271 19.1908 15.291 18.9885 15.291Z" fill="#D88A55"/>
|
||||
<path d="M22.7364 16.3188H13.9854V19.7856C13.9854 19.9245 14.0979 20.0371 14.2369 20.0371H22.7364V16.3188Z" fill="#EA9B58"/>
|
||||
<path d="M15.5196 19.7856V16.3188H13.9854V19.7856C13.9854 19.9245 14.0979 20.0371 14.2369 20.0371H15.7711C15.6322 20.0371 15.5196 19.9245 15.5196 19.7856Z" fill="#D88A55"/>
|
||||
<path d="M18.9885 18.064H17.6807C17.4784 18.064 17.3145 17.9 17.3145 17.6978C17.3145 17.4955 17.4784 17.3315 17.6807 17.3315H18.9885C19.1908 17.3315 19.3547 17.4955 19.3547 17.6978C19.3547 17.9 19.1908 18.064 18.9885 18.064Z" fill="#D88A55"/>
|
||||
<path d="M0.804688 10.7251V21.773C0.804688 21.912 0.917285 22.0246 1.0562 22.0246H2.06226C2.20117 22.0246 2.31377 21.912 2.31377 21.773V10.7251H0.804688Z" fill="#A79BA7"/>
|
||||
<path d="M1.4647 21.773V10.7251H0.804688V21.773C0.804688 21.912 0.917285 22.0246 1.0562 22.0246H1.71621C1.5773 22.0246 1.4647 21.912 1.4647 21.773Z" fill="#918291"/>
|
||||
<path d="M22.6875 10.7251V21.773C22.6875 21.912 22.8001 22.0246 22.939 22.0246H23.9451C24.084 22.0246 24.1966 21.912 24.1966 21.773V10.7251H22.6875Z" fill="#A79BA7"/>
|
||||
<path d="M23.3475 21.773V10.7251H22.6875V21.773C22.6875 21.912 22.8001 22.0246 22.939 22.0246H23.599C23.4601 22.0246 23.3475 21.912 23.3475 21.773Z" fill="#918291"/>
|
||||
<path d="M24.7485 9.44873H0.251514C0.112598 9.44873 0 9.56133 0 9.70024V10.522C0 10.6609 0.112598 10.7735 0.251514 10.7735H24.7485C24.8874 10.7735 25 10.6609 25 10.522V9.70024C25 9.56133 24.8874 9.44873 24.7485 9.44873Z" fill="#F6A96C"/>
|
||||
<path d="M3.41797 10.522V9.70024C3.41797 9.56133 3.53057 9.44873 3.66948 9.44873H0.251514C0.112598 9.44873 0 9.56133 0 9.70024V10.522C0 10.6609 0.112598 10.7735 0.251514 10.7735H3.66948C3.53057 10.7735 3.41797 10.6609 3.41797 10.522Z" fill="#EA9B58"/>
|
||||
<path d="M14.3078 2.30615H10.5352C10.3329 2.30615 10.1689 2.14219 10.1689 1.93994C10.1689 1.7377 10.3329 1.57373 10.5352 1.57373H14.3078C14.5101 1.57373 14.674 1.7377 14.674 1.93994C14.674 2.14219 14.5101 2.30615 14.3078 2.30615Z" fill="#0593FC"/>
|
||||
<path d="M9.37915 2.30566H8.07129C7.86904 2.30566 7.70508 2.1417 7.70508 1.93945C7.70508 1.73721 7.86904 1.57324 8.07129 1.57324H9.37915C9.5814 1.57324 9.74536 1.73721 9.74536 1.93945C9.74536 2.1417 9.5814 2.30566 9.37915 2.30566Z" fill="#0593FC"/>
|
||||
<path d="M14.3078 3.61475H13.1006C12.8983 3.61475 12.7344 3.45078 12.7344 3.24854C12.7344 3.04629 12.8983 2.88232 13.1006 2.88232H14.3078C14.5101 2.88232 14.674 3.04629 14.674 3.24854C14.674 3.45078 14.5101 3.61475 14.3078 3.61475Z" fill="#0593FC"/>
|
||||
<path d="M11.7936 3.61426H8.07129C7.86904 3.61426 7.70508 3.45029 7.70508 3.24805C7.70508 3.0458 7.86904 2.88184 8.07129 2.88184H11.7936C11.9959 2.88184 12.1598 3.0458 12.1598 3.24805C12.1598 3.45029 11.9959 3.61426 11.7936 3.61426Z" fill="#0593FC"/>
|
||||
<path d="M10.2846 4.92236H8.07129C7.86904 4.92236 7.70508 4.7584 7.70508 4.55615C7.70508 4.35391 7.86904 4.18994 8.07129 4.18994H10.2846C10.4868 4.18994 10.6508 4.35391 10.6508 4.55615C10.6508 4.7584 10.4868 4.92236 10.2846 4.92236Z" fill="#0593FC"/>
|
||||
</svg>
|
After Width: | Height: | Size: 6.9 KiB |
29
assets/icons/parlour.svg
Normal file
@ -0,0 +1,29 @@
|
||||
<svg width="25" height="22" viewBox="0 0 25 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.05824 9.95946C8.90674 9.92645 8.73888 9.90869 8.55508 9.90869H3.02024C2.03877 9.90869 1.51074 10.4155 1.51074 11.0408V14.9798L9.56141 15.483L9.05824 9.95946Z" fill="#D273B3"/>
|
||||
<path d="M10.0646 11.0403C10.0646 10.5321 9.71578 10.1022 9.05824 9.95898V14.602C9.05824 14.8104 8.88928 14.9793 8.68087 14.9793H4.02658C4.02658 14.4711 3.58802 14.0412 2.93048 13.898V14.9793H1.51074V16.659H10.5677C10.5677 16.659 10.0646 11.6656 10.0646 11.0403Z" fill="#CA59A6"/>
|
||||
<path d="M18.1152 5.37996L17.6121 0H1.88812C1.67971 0 1.51074 0.168963 1.51074 0.377375V5.37996H18.1152Z" fill="#FFE07D"/>
|
||||
<path d="M17.6104 0V5.37996H18.1135L18.6167 1.5095V0.377375C18.6167 0.168963 18.4477 0 18.2393 0H17.6104Z" fill="#FFC250"/>
|
||||
<path d="M17.6121 2.07861C16.0781 2.99101 15.0219 3.81972 15.0219 3.81972C15.0219 3.81972 13.1458 2.57202 11.989 2.57202C9.76353 2.57202 8.06293 5.37954 1.51074 5.37954V5.88271L18.1152 6.38587L17.6121 2.07861Z" fill="#FFF0AF"/>
|
||||
<path d="M17.2347 5.88339H1.51074V6.51235C1.51074 6.72076 1.67971 6.88973 1.88812 6.88973H18.241C18.4495 6.88973 18.6184 6.72076 18.6184 6.51235V1.50977C18.2658 1.69886 17.929 1.89081 17.6121 2.07935V5.50607C17.6121 5.71443 17.4431 5.88339 17.2347 5.88339Z" fill="#FFE07D"/>
|
||||
<path d="M17.611 9.95946C17.4595 9.92645 17.2916 9.90869 17.1078 9.90869H11.573C10.5915 9.90869 10.0635 10.4155 10.0635 11.0408V14.9798L18.1141 15.483L17.611 9.95946Z" fill="#D273B3"/>
|
||||
<path d="M17.611 9.95898V14.602C17.611 14.8104 17.442 14.9793 17.2336 14.9793H10.0635V16.659H18.6173C18.6173 16.659 18.6173 11.6656 18.6173 11.0403C18.6173 10.5321 18.2685 10.1022 17.611 9.95898Z" fill="#CA59A6"/>
|
||||
<path d="M16.1014 16.489L14.5836 15.9858H10.9613C10.3775 15.9858 10.0635 16.2873 10.0635 16.6592V16.9922L18.1147 17.4953L16.1014 16.489Z" fill="#DA8BC1"/>
|
||||
<path d="M16.1015 16.4888V16.6146C16.1015 16.823 15.9325 16.9919 15.7241 16.9919H10.0635V18.5014H18.6173V16.4888H16.1015Z" fill="#D273B3"/>
|
||||
<path d="M9.0573 15.9858H4.02563L3.52246 17.4953H9.56046L9.0573 15.9858Z" fill="#DA8BC1"/>
|
||||
<path d="M10.0646 16.6592C10.0646 16.2873 9.7505 15.9858 9.16678 15.9858H9.05824V16.6148C9.05824 16.8232 8.88928 16.9922 8.68087 16.9922H4.02658V15.9858H1.51074V18.5017H10.5677C10.5677 18.5017 10.0646 17.0311 10.0646 16.6592Z" fill="#D273B3"/>
|
||||
<path d="M19.1203 12.9785C18.9688 12.9455 18.801 12.9277 18.6172 12.9277C17.6357 12.9277 17.1077 13.4346 17.1077 14.0599V18.2504H3.019L2.01267 12.9785C1.86116 12.9455 1.69331 12.9277 1.5095 12.9277C0.528023 12.9277 0 13.4346 0 14.0599V19.5084L19.6235 20.0115L19.1203 12.9785Z" fill="#DA8BC1"/>
|
||||
<path d="M3.02001 18.25C3.02001 18.25 3.02001 14.6847 3.02001 14.0594C3.02001 13.5512 2.67121 13.1212 2.01367 12.978V17.9984L3.02001 18.25Z" fill="#DA8BC1"/>
|
||||
<path d="M19.1203 12.978V19.1305C19.1203 19.3389 18.9514 19.5079 18.743 19.5079H0V20.1368C0 20.3452 0.168963 20.5142 0.377375 20.5142H19.7493C19.9577 20.5142 20.1267 20.3452 20.1267 20.1368V14.0594C20.1267 13.5512 19.7779 13.1212 19.1203 12.978Z" fill="#D273B3"/>
|
||||
<path d="M10.2412 20.0115C8.73172 20.0115 6.03877 20.0115 4.52927 20.0115C3.01977 20.0115 2.5166 19.4172 2.5166 19.0051C2.5166 18.7272 2.74187 18.502 3.01977 18.502H11.7507C12.0286 18.502 12.2539 18.7272 12.2539 19.0051C12.2539 19.4172 11.7507 20.0115 10.2412 20.0115Z" fill="#D273B3"/>
|
||||
<path d="M20.1267 18.25H14.4951C15.2643 19.2151 16.9145 19.8487 18.8263 19.8487C19.277 19.8487 19.7132 19.8116 20.1267 19.7422V18.25Z" fill="#D273B3"/>
|
||||
<path d="M3.90931 18.1172L2.92104 21.2378C2.85809 21.4365 2.96819 21.6486 3.16689 21.7115C3.36559 21.7745 3.57767 21.6644 3.64057 21.4657L4.62884 18.345L3.90931 18.1172Z" fill="#DCE6EB"/>
|
||||
<path d="M9.13379 18.345L10.1221 21.4657C10.185 21.6644 10.3971 21.7744 10.5957 21.7115C10.7944 21.6486 10.9045 21.4365 10.8416 21.2378L9.85332 18.1172L9.13379 18.345Z" fill="#DCE6EB"/>
|
||||
<path d="M11.2477 17.4956H2.51684C2.23894 17.4956 2.01367 17.7209 2.01367 17.9988C2.01367 18.0778 2.03234 18.1635 2.07289 18.2504C2.07289 18.2504 7.89574 18.6026 9.38607 18.6026C10.8955 18.6026 11.2477 17.4956 11.2477 17.4956Z" fill="#E0BBA4"/>
|
||||
<path d="M11.2481 17.4956C11.2481 17.4956 10.8959 18.2504 9.38642 18.2504C7.89609 18.2504 3.63402 18.2504 2.07324 18.2504C2.24412 18.6168 2.80656 19.0051 4.02669 19.0051H9.73859C9.73859 19.0051 11.7513 18.4108 11.7513 17.9988C11.7513 17.7209 11.526 17.4956 11.2481 17.4956Z" fill="#CF9875"/>
|
||||
<path d="M15.9337 18.1172L14.9455 21.2378C14.8825 21.4365 14.9926 21.6486 15.1913 21.7115C15.39 21.7745 15.6021 21.6644 15.665 21.4657L16.6533 18.345L15.9337 18.1172Z" fill="#DCE6EB"/>
|
||||
<path d="M21.2432 17.5306L22.4893 21.4653C22.5522 21.664 22.7643 21.774 22.9629 21.7111C23.1616 21.6482 23.2717 21.4361 23.2088 21.2374L21.9627 17.3027L21.2432 17.5306Z" fill="#DCE6EB"/>
|
||||
<path d="M21.3791 16.4893L23.786 7.40723C23.2671 7.46846 22.8111 7.79472 22.5903 8.27755L19.6694 14.6637C19.3009 15.4694 18.4963 15.9862 17.6104 15.9862L21.3791 16.4893Z" fill="#FFE07D"/>
|
||||
<path d="M24.2456 7.39551H23.9652C23.9054 7.39551 23.8465 7.39994 23.7881 7.40683L20.6881 14.1845C20.3144 15.0017 20.1277 15.4717 19.4238 15.9857L21.3812 16.4889L24.7274 7.56985C24.5968 7.46117 24.4291 7.39551 24.2456 7.39551Z" fill="#FFC250"/>
|
||||
<path d="M21.4367 17.4869C22.9619 16.5631 24.1083 13.6303 24.1083 8.9209L21.4815 14.6639C21.113 15.4697 20.3084 15.9864 19.4224 15.9864C19.0923 15.9864 17.611 15.9864 17.611 15.9864H14.583C13.9515 15.9864 13.5979 16.7167 13.9916 17.2106C14.5624 17.7568 16.1091 18.3398 18.0209 18.3398C19.3581 18.3398 20.5673 18.0134 21.4367 17.4869Z" fill="#E0BBA4"/>
|
||||
<path d="M24.7265 7.56982L24.1089 8.92017C23.7576 13.438 22.4593 16.0592 20.9341 16.983C20.0648 17.5095 18.8555 17.8359 17.5183 17.8359C15.6065 17.8359 14.4859 17.4952 13.9922 17.2099C14.7613 18.175 16.4116 18.8423 18.3234 18.8423C19.6606 18.8423 20.8699 18.5158 21.7392 17.9893C23.4525 16.9516 24.8794 13.7722 24.9994 8.16859C25.0045 7.92828 24.8974 7.71212 24.7265 7.56982Z" fill="#CF9875"/>
|
||||
</svg>
|
After Width: | Height: | Size: 5.8 KiB |
3
assets/icons/password_unvisibility.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="17" height="8" viewBox="0 0 17 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.1551 2.33183C15.4564 2.0013 15.6902 1.64372 15.8445 1.26438C15.9791 0.93308 15.7945 0.564752 15.4321 0.441634C15.0698 0.318517 14.6666 0.487195 14.5319 0.818495C14.2555 1.49824 13.533 2.13013 12.4974 2.59786C11.3781 3.10342 9.9584 3.38183 8.50002 3.38183C7.04165 3.38183 5.62204 3.10342 4.50267 2.59786C3.4671 2.13017 2.74455 1.49829 2.46811 0.818581C2.33341 0.487323 1.93051 0.318601 1.56797 0.441762C1.20557 0.56488 1.02099 0.933251 1.15569 1.26455C1.30993 1.64384 1.54371 2.00138 1.84496 2.33187L0.205067 3.83074C-0.0683557 4.08065 -0.0683557 4.48579 0.205067 4.73569C0.341779 4.86065 0.520918 4.9231 0.700103 4.9231C0.879288 4.9231 1.05847 4.86065 1.19514 4.73569L2.87865 3.19694C3.33414 3.49453 3.85618 3.75417 4.43008 3.96875L3.77375 6.02617C3.66551 6.36545 3.87875 6.72068 4.24993 6.81961C4.31534 6.83706 4.38129 6.84533 4.44619 6.84533C4.74941 6.84533 5.02883 6.66386 5.11798 6.38439L5.76259 4.36365C6.40253 4.50861 7.08297 4.60375 7.78919 4.64214V6.76146C7.78919 7.11486 8.10266 7.40137 8.48931 7.40137C8.87597 7.40137 9.18944 7.11486 9.18944 6.76146V4.64338C9.90329 4.60575 10.5911 4.51011 11.2375 4.3637L11.8821 6.38443C11.9713 6.6639 12.2507 6.84538 12.5539 6.84538C12.6188 6.84538 12.6848 6.83706 12.7502 6.81965C13.1214 6.72072 13.3346 6.36549 13.2263 6.02621L12.57 3.96879C13.1438 3.75421 13.6659 3.49458 14.1214 3.19698L15.8049 4.73574C15.9416 4.86069 16.1207 4.92314 16.2999 4.92314C16.479 4.92314 16.6582 4.86065 16.7949 4.73574C17.0684 4.48583 17.0684 4.08069 16.7949 3.83078L15.1551 2.33183Z" fill="#D5D5D5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
assets/icons/password_visibility.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="15" height="13" viewBox="0 0 15 13" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.6809 10.3829C14.394 10.5298 14.0409 10.4175 13.8928 10.1291H13.8928C12.9943 8.37829 10.609 5.86828 7.49997 5.86828C4.71173 5.86828 2.23389 7.93348 1.10719 10.1291C0.958976 10.4164 0.606008 10.5299 0.318459 10.3821C0.0309393 10.2344 -0.0828497 9.88216 0.0644257 9.5944C1.35894 7.06664 4.20568 4.69641 7.49997 4.69641C11.257 4.69641 13.9478 7.6657 14.9355 9.5944C15.083 9.88245 14.969 10.2355 14.6809 10.3829ZM0.227668 4.08996L1.53267 5.26723C1.77437 5.48528 2.14474 5.46346 2.36022 5.22463C2.57695 4.98434 2.55791 4.61385 2.31762 4.39708L1.01262 3.21981C0.772414 3.00311 0.401926 3.02209 0.18507 3.26241C-0.0316681 3.5027 -0.0126251 3.87319 0.227668 4.08996ZM13.4672 5.26723L14.7722 4.08996C15.0125 3.87319 15.0316 3.5027 14.8148 3.26241C14.598 3.02215 14.2276 3.00305 13.9873 3.21981L12.6823 4.39708C12.442 4.61382 12.423 4.98434 12.6397 5.22463C12.8554 5.46372 13.2258 5.48502 13.4672 5.26723ZM7.49994 2.93127C7.82356 2.93127 8.08588 2.66892 8.08588 2.34533V0.585937C8.08588 0.262354 7.82356 0 7.49994 0C7.17633 0 6.914 0.262354 6.914 0.585937V2.34533C6.91403 2.66895 7.17636 2.93127 7.49994 2.93127ZM10.3784 9.86136C10.3784 11.4509 9.0871 12.7441 7.49997 12.7441C5.91284 12.7441 4.62158 11.4509 4.62158 9.86136C4.62158 8.2718 5.91284 6.97857 7.49997 6.97857C9.0871 6.97857 10.3784 8.2718 10.3784 9.86136ZM9.20651 9.86136C9.20651 8.91797 8.44099 8.15045 7.5 8.15045C6.55901 8.15045 5.79346 8.91797 5.79346 9.86136C5.79346 10.8047 6.55899 11.5723 7.49997 11.5723C8.44096 11.5723 9.20651 10.8047 9.20651 9.86136Z" fill="#D5D5D5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
38
assets/icons/red_sos.svg
Normal 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 |
3
assets/icons/remove_scene_icon.svg
Normal 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 |
10
assets/icons/save_routines_icon.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_7302_4149)">
|
||||
<path d="M19.9969 4.94279C19.986 4.83232 19.943 4.72146 19.8674 4.62924C19.8382 4.59358 20.1367 4.89431 15.4141 0.17176C15.3015 0.0591838 15.1487 8.30277e-05 14.9996 0.00012209C14.6443 0.00012209 2.11177 0.00012209 1.75779 0.00012209C0.788544 0.00012209 0 0.788666 0 1.75791V18.2421C0 19.2113 0.788544 19.9998 1.75779 19.9998H18.2419C19.2112 19.9998 19.9997 19.2113 19.9997 18.2421C19.9998 4.01624 20.0013 4.98771 19.9969 4.94279ZM13.4764 1.17198V5.00005C13.4764 5.32314 13.2136 5.58598 12.8905 5.58598H12.1483V1.17198H13.4764ZM10.9765 1.17198V5.58598H5.54684C5.22376 5.58598 4.96091 5.32314 4.96091 5.00005V1.17198H10.9765ZM13.4764 12.539H4.96091V11.7968C4.96091 11.4738 5.22376 11.2109 5.54684 11.2109H12.8905C13.2136 11.2109 13.4764 11.4738 13.4764 11.7968V12.539ZM4.96091 18.828V13.7109H13.4764V18.828H4.96091ZM18.8279 18.2421C18.8279 18.5651 18.5651 18.828 18.242 18.828H14.6483C14.6483 18.0641 14.6483 12.6676 14.6483 11.7968C14.6483 10.8276 13.8597 10.039 12.8905 10.039H5.54684C4.57759 10.039 3.78905 10.8276 3.78905 11.7968V18.828H1.75783C1.43475 18.828 1.1719 18.5651 1.1719 18.2421V1.75791C1.1719 1.43483 1.43475 1.17198 1.75783 1.17198H3.78905V5.00005C3.78905 5.9693 4.57759 6.75784 5.54684 6.75784H12.8905C13.8597 6.75784 14.6483 5.9693 14.6483 5.00005V1.17198H14.7571L18.8279 5.24278V18.2421Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_7302_4149">
|
||||
<rect width="20" height="20" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
assets/icons/share_icon.svg
Normal 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 |
12
assets/icons/six_scene_home_icon.svg
Normal 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 |
34
assets/icons/six_scene_icon.svg
Normal 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 |
23
assets/icons/sos_home_icon.svg
Normal 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 |
6
assets/icons/sos_profile_icon.svg
Normal 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 |
4
assets/icons/switch_off.svg
Normal 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 |
4
assets/icons/switch_on.svg
Normal 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 |
3
assets/icons/tap_run_icon.svg
Normal 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 |
10
assets/icons/thumb_down.svg
Normal 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
@ -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 |
18
assets/icons/toggleSwitchSmall.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<svg width="47" height="37" viewBox="0 0 47 37" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect y="1" width="41" height="25" rx="12.5" fill="#023DFE" fill-opacity="0.7"/>
|
||||
<g filter="url(#filter0_d_6689_981)">
|
||||
<circle cx="28.5" cy="13.5" r="10.5" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_6689_981" x="10" y="0" width="37" height="37" 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="5"/>
|
||||
<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.15 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6689_981"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6689_981" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 975 B |
3
assets/icons/update_icon.svg
Normal 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 |
10
assets/icons/verification_icon.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg width="107" height="100" viewBox="0 0 107 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M36.8625 65.1775C39.1819 62.9069 40.625 59.7444 40.625 56.25C40.625 49.3575 35.0175 43.75 28.125 43.75C21.2325 43.75 15.625 49.3575 15.625 56.25C15.625 59.7444 17.0681 62.9069 19.3875 65.1775C15.2348 67.9887 12.5 72.7435 12.5 78.125V84.375C12.5 86.1008 13.8992 87.5 15.625 87.5H40.625C42.3508 87.5 43.75 86.1008 43.75 84.375V78.125C43.75 72.7435 41.0152 67.9887 36.8625 65.1775ZM28.125 50C31.5712 50 34.375 52.8038 34.375 56.25C34.375 59.6962 31.5712 62.5 28.125 62.5C24.6788 62.5 21.875 59.6962 21.875 56.25C21.875 52.8038 24.6788 50 28.125 50ZM37.5 81.25H18.75V78.125C18.75 72.9556 22.9556 68.75 28.125 68.75C33.2944 68.75 37.5 72.9556 37.5 78.125V81.25Z" fill="#D5D5D5"/>
|
||||
<path d="M72.291 62.5C74.0169 62.5 75.416 61.1009 75.416 59.375C75.416 57.6491 74.0169 56.25 72.291 56.25C70.5651 56.25 69.166 57.6491 69.166 59.375C69.166 61.1009 70.5651 62.5 72.291 62.5Z" fill="#D5D5D5"/>
|
||||
<path d="M84.791 62.5C86.5169 62.5 87.916 61.1009 87.916 59.375C87.916 57.6491 86.5169 56.25 84.791 56.25C83.0651 56.25 81.666 57.6491 81.666 59.375C81.666 61.1009 83.0651 62.5 84.791 62.5Z" fill="#D5D5D5"/>
|
||||
<path d="M59.791 62.5C61.5169 62.5 62.916 61.1009 62.916 59.375C62.916 57.6491 61.5169 56.25 59.791 56.25C58.0651 56.25 56.666 57.6491 56.666 59.375C56.666 61.1009 58.0651 62.5 59.791 62.5Z" fill="#D5D5D5"/>
|
||||
<path d="M84.791 68.75H59.791C58.0652 68.75 56.666 70.1492 56.666 71.875C56.666 73.6008 58.0652 75 59.791 75H84.791C86.5168 75 87.916 73.6008 87.916 71.875C87.916 70.1492 86.5168 68.75 84.791 68.75Z" fill="#D5D5D5"/>
|
||||
<path d="M84.791 81.25H59.791C58.0652 81.25 56.666 82.6492 56.666 84.375C56.666 86.1008 58.0652 87.5 59.791 87.5H84.791C86.5168 87.5 87.916 86.1008 87.916 84.375C87.916 82.6492 86.5168 81.25 84.791 81.25Z" fill="#D5D5D5"/>
|
||||
<path d="M93.2507 16.5405C92.0305 15.3199 90.0517 15.3199 88.8315 16.5403L78.5411 26.8307L74.5007 22.7903C73.2805 21.5699 71.3017 21.5699 70.0813 22.7903C68.8609 24.0107 68.8609 25.9892 70.0813 27.2097L76.3313 33.4597C76.9415 34.0701 77.7413 34.3751 78.5411 34.3751C79.3409 34.3751 80.1407 34.0701 80.7507 33.4599L93.2507 20.9599C94.4711 19.7395 94.4711 17.7609 93.2507 16.5405Z" fill="#D5D5D5"/>
|
||||
<path d="M81.6667 0C67.8817 0 56.6667 11.215 56.6667 25H9.375C4.20563 25 0 29.2056 0 34.375V90.625C0 95.7944 4.20563 100 9.375 100H91.0417C96.211 100 100.417 95.7944 100.417 90.625V41.5165C104.304 37.1085 106.667 31.3254 106.667 25C106.667 11.215 95.4517 0 81.6667 0ZM94.1667 90.625C94.1667 92.3481 92.7648 93.75 91.0417 93.75H9.375C7.65188 93.75 6.25 92.3481 6.25 90.625V34.375C6.25 32.6519 7.65188 31.25 9.375 31.25H57.4577C60.24 42.0206 70.039 50 81.6667 50C86.2173 50 90.4873 48.7773 94.1667 46.644V90.625ZM81.6667 43.75C71.3279 43.75 62.9167 35.3387 62.9167 25C62.9167 14.6613 71.3279 6.25 81.6667 6.25C92.0054 6.25 100.417 14.6613 100.417 25C100.417 35.3387 92.0054 43.75 81.6667 43.75Z" fill="#D5D5D5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
# platform :ios, '12.0'
|
||||
platform :ios, '15.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
276
ios/Podfile.lock
@ -1,155 +1,153 @@
|
||||
PODS:
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- Firebase/Analytics (10.25.0):
|
||||
- Firebase/Analytics (11.6.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (10.25.0):
|
||||
- Firebase/Core (11.6.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAnalytics (~> 10.25.0)
|
||||
- Firebase/CoreOnly (10.25.0):
|
||||
- FirebaseCore (= 10.25.0)
|
||||
- Firebase/Crashlytics (10.25.0):
|
||||
- FirebaseAnalytics (~> 11.6.0)
|
||||
- Firebase/CoreOnly (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- Firebase/Crashlytics (11.6.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseCrashlytics (~> 10.25.0)
|
||||
- Firebase/Database (10.25.0):
|
||||
- FirebaseCrashlytics (~> 11.6.0)
|
||||
- Firebase/Database (11.6.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseDatabase (~> 10.25.0)
|
||||
- firebase_analytics (10.8.7):
|
||||
- Firebase/Analytics (= 10.25.0)
|
||||
- FirebaseDatabase (~> 11.6.0)
|
||||
- firebase_analytics (11.4.0):
|
||||
- Firebase/Analytics (= 11.6.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (2.32.0):
|
||||
- Firebase/CoreOnly (= 10.25.0)
|
||||
- firebase_core (3.10.0):
|
||||
- Firebase/CoreOnly (= 11.6.0)
|
||||
- Flutter
|
||||
- firebase_crashlytics (3.4.16):
|
||||
- Firebase/Crashlytics (= 10.25.0)
|
||||
- firebase_crashlytics (4.3.0):
|
||||
- Firebase/Crashlytics (= 11.6.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_database (10.5.7):
|
||||
- Firebase/Database (= 10.25.0)
|
||||
- firebase_database (11.3.0):
|
||||
- Firebase/Database (= 11.6.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseAnalytics (10.25.0):
|
||||
- FirebaseAnalytics/AdIdSupport (= 10.25.0)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||
- GoogleUtilities/Network (~> 7.11)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- FirebaseAnalytics/AdIdSupport (10.25.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- GoogleAppMeasurement (= 10.25.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||
- GoogleUtilities/Network (~> 7.11)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- FirebaseAppCheckInterop (10.29.0)
|
||||
- FirebaseCore (10.25.0):
|
||||
- FirebaseCoreInternal (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.12)
|
||||
- GoogleUtilities/Logger (~> 7.12)
|
||||
- FirebaseCoreExtension (10.29.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseCoreInternal (10.29.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
||||
- FirebaseCrashlytics (10.25.0):
|
||||
- FirebaseCore (~> 10.5)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- FirebaseRemoteConfigInterop (~> 10.23)
|
||||
- FirebaseSessions (~> 10.5)
|
||||
- GoogleDataTransport (~> 9.2)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- PromisesObjC (~> 2.1)
|
||||
- FirebaseDatabase (10.25.0):
|
||||
- FirebaseAppCheckInterop (~> 10.17)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseSharedSwift (~> 10.0)
|
||||
- GoogleUtilities/UserDefaults (~> 7.13)
|
||||
- FirebaseAnalytics (11.6.0):
|
||||
- FirebaseAnalytics/AdIdSupport (= 11.6.0)
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Network (~> 8.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- FirebaseAnalytics/AdIdSupport (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleAppMeasurement (= 11.6.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Network (~> 8.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- FirebaseAppCheckInterop (11.6.0)
|
||||
- FirebaseCore (11.6.0):
|
||||
- FirebaseCoreInternal (~> 11.6.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/Logger (~> 8.0)
|
||||
- FirebaseCoreExtension (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseCoreInternal (11.6.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- FirebaseCrashlytics (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- FirebaseRemoteConfigInterop (~> 11.0)
|
||||
- FirebaseSessions (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- FirebaseDatabase (11.6.0):
|
||||
- FirebaseAppCheckInterop (~> 11.0)
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseSharedSwift (~> 11.0)
|
||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||
- leveldb-library (~> 1.22)
|
||||
- FirebaseInstallations (10.29.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||
- PromisesObjC (~> 2.1)
|
||||
- FirebaseRemoteConfigInterop (10.29.0)
|
||||
- FirebaseSessions (10.29.0):
|
||||
- FirebaseCore (~> 10.5)
|
||||
- FirebaseCoreExtension (~> 10.0)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- GoogleDataTransport (~> 9.2)
|
||||
- GoogleUtilities/Environment (~> 7.13)
|
||||
- GoogleUtilities/UserDefaults (~> 7.13)
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- FirebaseInstallations (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- FirebaseRemoteConfigInterop (11.6.0)
|
||||
- FirebaseSessions (11.6.0):
|
||||
- FirebaseCore (~> 11.6.0)
|
||||
- FirebaseCoreExtension (~> 11.6.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 8.0)
|
||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesSwift (~> 2.1)
|
||||
- FirebaseSharedSwift (10.29.0)
|
||||
- FirebaseSharedSwift (11.6.0)
|
||||
- Flutter (1.0.0)
|
||||
- flutter_secure_storage (6.0.0):
|
||||
- Flutter
|
||||
- GoogleAppMeasurement (10.25.0):
|
||||
- GoogleAppMeasurement/AdIdSupport (= 10.25.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||
- GoogleUtilities/Network (~> 7.11)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- GoogleAppMeasurement/AdIdSupport (10.25.0):
|
||||
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.25.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||
- GoogleUtilities/Network (~> 7.11)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- GoogleAppMeasurement/WithoutAdIdSupport (10.25.0):
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||
- GoogleUtilities/Network (~> 7.11)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- GoogleDataTransport (9.4.1):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.13.3):
|
||||
- GoogleAppMeasurement (11.6.0):
|
||||
- GoogleAppMeasurement/AdIdSupport (= 11.6.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Network (~> 8.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleAppMeasurement/AdIdSupport (11.6.0):
|
||||
- GoogleAppMeasurement/WithoutAdIdSupport (= 11.6.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Network (~> 8.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleAppMeasurement/WithoutAdIdSupport (11.6.0):
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||
- GoogleUtilities/Network (~> 8.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleDataTransport (10.1.0):
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- GoogleUtilities/AppDelegateSwizzler (8.0.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Environment (7.13.3):
|
||||
- GoogleUtilities/Environment (8.0.2):
|
||||
- GoogleUtilities/Privacy
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.13.3):
|
||||
- GoogleUtilities/Logger (8.0.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/MethodSwizzler (7.13.3):
|
||||
- GoogleUtilities/MethodSwizzler (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Network (7.13.3):
|
||||
- GoogleUtilities/Network (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.13.3)":
|
||||
- "GoogleUtilities/NSData+zlib (8.0.2)":
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Privacy (7.13.3)
|
||||
- GoogleUtilities/Reachability (7.13.3):
|
||||
- GoogleUtilities/Privacy (8.0.2)
|
||||
- GoogleUtilities/Reachability (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/UserDefaults (7.13.3):
|
||||
- GoogleUtilities/UserDefaults (8.0.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- image_picker_ios (0.0.1):
|
||||
- Flutter
|
||||
- leveldb-library (1.22.5)
|
||||
- nanopb (2.30910.0):
|
||||
- nanopb/decode (= 2.30910.0)
|
||||
- nanopb/encode (= 2.30910.0)
|
||||
- nanopb/decode (2.30910.0)
|
||||
- nanopb/encode (2.30910.0)
|
||||
- leveldb-library (1.22.6)
|
||||
- nanopb (3.30910.0):
|
||||
- nanopb/decode (= 3.30910.0)
|
||||
- nanopb/encode (= 3.30910.0)
|
||||
- nanopb/decode (3.30910.0)
|
||||
- nanopb/encode (3.30910.0)
|
||||
- onesignal_flutter (5.2.0):
|
||||
- Flutter
|
||||
- OneSignalXCFramework (= 5.2.0)
|
||||
@ -291,42 +289,42 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
||||
Firebase: 0312a2352584f782ea56f66d91606891d4607f06
|
||||
firebase_analytics: 3a9263fedec72970e6bd30a7132bbdd386de2c14
|
||||
firebase_core: a626d00494efa398e7c54f25f1454a64c8abf197
|
||||
firebase_crashlytics: 0b7cb41f5fb3b6889d0fb408cfce3cc7a4247061
|
||||
firebase_database: 2713033e426b176d4fe5e7195f3d19aa1b549a91
|
||||
FirebaseAnalytics: ec00fe8b93b41dc6fe4a28784b8e51da0647a248
|
||||
FirebaseAppCheckInterop: 6a1757cfd4067d8e00fccd14fcc1b8fd78cfac07
|
||||
FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483
|
||||
FirebaseCoreExtension: 705ca5b14bf71d2564a0ddc677df1fc86ffa600f
|
||||
FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934
|
||||
FirebaseCrashlytics: 4b96efb0ce73b38b2a85e8b8bd1bd8f63f09d015
|
||||
FirebaseDatabase: faa489a42f5f868d23a55dd442d6e2099348458e
|
||||
FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd
|
||||
FirebaseRemoteConfigInterop: 6efda51fb5e2f15b16585197e26eaa09574e8a4d
|
||||
FirebaseSessions: dbd14adac65ce996228652c1fc3a3f576bdf3ecc
|
||||
FirebaseSharedSwift: 20530f495084b8d840f78a100d8c5ee613375f6e
|
||||
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
|
||||
Firebase: 374a441a91ead896215703a674d58cdb3e9d772b
|
||||
firebase_analytics: 07bd7cfbac54bfcdccf2bb2530f9a65486f7ef3f
|
||||
firebase_core: feb37e79f775c2bd08dd35e02d83678291317e10
|
||||
firebase_crashlytics: 609a5f6f4a2f5af9e40a68182e0c1be3ca2a02f6
|
||||
firebase_database: adc9efd0b70cdc8d1e6f3c9f6bb054a625c4f45d
|
||||
FirebaseAnalytics: 7114c698cac995602e3b1b96663473e50d54d6e7
|
||||
FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b
|
||||
FirebaseCore: 48b0dd707581cf9c1a1220da68223fb0a562afaa
|
||||
FirebaseCoreExtension: 2d77d6430c16cf43ca2b04608302ed02b3598361
|
||||
FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2
|
||||
FirebaseCrashlytics: b21c665fb50138766480bce73ebdb1aa30f7f300
|
||||
FirebaseDatabase: ce3a83a39ab50559a85c5add54f6f285544433b8
|
||||
FirebaseInstallations: efc0946fc756e4d22d8113f7c761948120322e8c
|
||||
FirebaseRemoteConfigInterop: e75e348953352a000331eb77caf01e424248e176
|
||||
FirebaseSessions: 9529d14180868e29a8da164b3a729c036204918b
|
||||
FirebaseSharedSwift: a4e5dfca3e210633bb3a3dfb94176c019211948b
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
|
||||
GoogleAppMeasurement: 9abf64b682732fed36da827aa2a68f0221fd2356
|
||||
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
|
||||
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
|
||||
GoogleAppMeasurement: 6a9e6317b6a6d810ad03d4a66564ca6c4c5818a3
|
||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||
leveldb-library: e8eadf9008a61f9e1dde3978c086d2b6d9b9dc28
|
||||
nanopb: 438bc412db1928dac798aa6fd75726007be04262
|
||||
leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19
|
||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||
onesignal_flutter: 5ce68a29861960168e81101cb1bd685d264361de
|
||||
OneSignalXCFramework: bdf74fdc06888f9466dc21e826fe1549ed143095
|
||||
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
|
||||
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
|
||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
|
||||
PODFILE CHECKSUM: 4243bd7f9184f79552dd731a7c9d5cad03bd2706
|
||||
PODFILE CHECKSUM: deba6d843ff3cf709e6e9051ce6601a587b24105
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
COCOAPODS: 1.16.2
|
||||
|
@ -10,12 +10,12 @@
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||
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 */; };
|
||||
964EC64D4BABF3375BEBF6DE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
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 */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -42,24 +42,20 @@
|
||||
/* End PBXCopyFilesBuildPhase 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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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; };
|
||||
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>"; };
|
||||
274C82CD6955A1499B0B1ECC /* 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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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; };
|
||||
@ -67,16 +63,14 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
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>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -84,7 +78,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D31283674D2826D7EF8E56BC /* Pods_Runner.framework in Frameworks */,
|
||||
CE9CA504D8FF2965F977B16B /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -92,7 +86,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
611C662010675536F855E5CA /* Pods_RunnerTests.framework in Frameworks */,
|
||||
964EC64D4BABF3375BEBF6DE /* Pods_RunnerTests.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -102,24 +96,18 @@
|
||||
2F70EB4341A83C900EB253DC /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
BFD4DDED98208034B60B5311 /* Pods-Runner.debug.xcconfig */,
|
||||
949637473C534E1F68B19CC0 /* Pods-Runner.release.xcconfig */,
|
||||
444D77D28A8CDF32047CD0AF /* Pods-Runner.profile.xcconfig */,
|
||||
DFB6BB492A265F2BF6FDC8C0 /* Pods-RunnerTests.debug.xcconfig */,
|
||||
F323D632CA976B68DDB0E669 /* Pods-RunnerTests.release.xcconfig */,
|
||||
AAC9129FD50E64509AD1B9AF /* Pods-RunnerTests.profile.xcconfig */,
|
||||
9B82456986D7FA25420A224F /* Pods-Runner.debug-prod.xcconfig */,
|
||||
5DE3E6D1EADE3D3859FC1B69 /* Pods-Runner.debug-dev.xcconfig */,
|
||||
12AD49A621BEBB053FD06115 /* Pods-Runner.release-prod.xcconfig */,
|
||||
C41134CD2FDFC1A2BDF49283 /* Pods-Runner.release-dev.xcconfig */,
|
||||
D0F6245A5BF345FCC425515C /* Pods-Runner.profile-prod.xcconfig */,
|
||||
1F99043C7AC9BDABD8A4D41A /* Pods-Runner.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 */,
|
||||
FC3EFA91747319965EF91609 /* Pods-Runner.debug-prod.xcconfig */,
|
||||
F5E8A17F8AB7D50983179FD3 /* Pods-Runner.debug-dev.xcconfig */,
|
||||
54B9D4926B53AAFC49A54F19 /* Pods-Runner.release-prod.xcconfig */,
|
||||
2688A8D4C03F1C4585B3EFE2 /* Pods-Runner.release-dev.xcconfig */,
|
||||
E0A467016A4C6B17ECA05534 /* Pods-Runner.profile-prod.xcconfig */,
|
||||
9D1B204BC7CD29434FE9D537 /* Pods-Runner.profile-dev.xcconfig */,
|
||||
FA2359C69B2F150BE9833D5A /* Pods-RunnerTests.debug-prod.xcconfig */,
|
||||
E2512B7B8C737577EB9DB570 /* Pods-RunnerTests.debug-dev.xcconfig */,
|
||||
064BE0B8B723A6E30728B215 /* Pods-RunnerTests.release-prod.xcconfig */,
|
||||
C33EAABFBF3F560A8EFB0BC0 /* Pods-RunnerTests.release-dev.xcconfig */,
|
||||
0D60D6C4BBD804473BD9E4A0 /* Pods-RunnerTests.profile-prod.xcconfig */,
|
||||
4F6A2F89436864C7EE769652 /* Pods-RunnerTests.profile-dev.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
@ -132,11 +120,11 @@
|
||||
path = RunnerTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
876D3217A8BBDAF41961161F /* Frameworks */ = {
|
||||
61B46FA3FB0932D29E3C6E47 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */,
|
||||
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */,
|
||||
274C82CD6955A1499B0B1ECC /* Pods_Runner.framework */,
|
||||
FB51EC18BE9E4FD7A688D262 /* Pods_RunnerTests.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@ -160,7 +148,7 @@
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||
2F70EB4341A83C900EB253DC /* Pods */,
|
||||
876D3217A8BBDAF41961161F /* Frameworks */,
|
||||
61B46FA3FB0932D29E3C6E47 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -195,7 +183,7 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||
buildPhases = (
|
||||
3B971DE531245D7FD2921C30 /* [CP] Check Pods Manifest.lock */,
|
||||
73698F4EABFF3F9B7ADF4220 /* [CP] Check Pods Manifest.lock */,
|
||||
331C807D294A63A400263BE5 /* Sources */,
|
||||
331C807F294A63A400263BE5 /* Resources */,
|
||||
C2B33A7265AF659D80692473 /* Frameworks */,
|
||||
@ -214,7 +202,7 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
3DC878D0674AA34AEC9695FB /* [CP] Check Pods Manifest.lock */,
|
||||
BF71A0E0099ADA10FE9B580A /* [CP] Check Pods Manifest.lock */,
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
B07E4A152C9B8EA4001F6910 /* copy GoogleService.plist file to the correct location */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
@ -222,9 +210,9 @@
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
315A05630CF83C532DBBCBF2 /* [CP] Embed Pods Frameworks */,
|
||||
3724F7A126D8469D5B04D144 /* [CP] Copy Pods Resources */,
|
||||
4768286A3BADB12BBB8C6996 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
|
||||
6CF71F42A45B39E9945C8410 /* [CP] Embed Pods Frameworks */,
|
||||
14DF593CA13D27D3781140F6 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -296,24 +284,7 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
315A05630CF83C532DBBCBF2 /* [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;
|
||||
};
|
||||
3724F7A126D8469D5B04D144 /* [CP] Copy Pods Resources */ = {
|
||||
14DF593CA13D27D3781140F6 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -346,7 +317,42 @@
|
||||
shellPath = /bin/sh;
|
||||
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;
|
||||
buildActionMask = 2147483647;
|
||||
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";
|
||||
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 */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
@ -441,6 +407,28 @@
|
||||
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";
|
||||
};
|
||||
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 */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@ -559,6 +547,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -575,7 +564,7 @@
|
||||
};
|
||||
331C8088294A63A400263BE5 /* Debug-prod */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 01BAAF935356ECBDD35AF0DB /* Pods-RunnerTests.debug-prod.xcconfig */;
|
||||
baseConfigurationReference = FA2359C69B2F150BE9833D5A /* Pods-RunnerTests.debug-prod.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -593,7 +582,7 @@
|
||||
};
|
||||
331C8089294A63A400263BE5 /* Release-prod */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = C5DBBF9417E4F8A9A08DFF02 /* Pods-RunnerTests.release-prod.xcconfig */;
|
||||
baseConfigurationReference = 064BE0B8B723A6E30728B215 /* Pods-RunnerTests.release-prod.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -609,7 +598,7 @@
|
||||
};
|
||||
331C808A294A63A400263BE5 /* Profile-prod */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 238CAAD9FFF9A0C9ED3CFAB2 /* Pods-RunnerTests.profile-prod.xcconfig */;
|
||||
baseConfigurationReference = 0D60D6C4BBD804473BD9E4A0 /* Pods-RunnerTests.profile-prod.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -751,6 +740,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -781,6 +771,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -868,6 +859,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -885,7 +877,7 @@
|
||||
};
|
||||
B07E4A0E2C9B8C45001F6910 /* Debug-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = EE971EFEA60AEDFDB361D9A3 /* Pods-RunnerTests.debug-dev.xcconfig */;
|
||||
baseConfigurationReference = E2512B7B8C737577EB9DB570 /* Pods-RunnerTests.debug-dev.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -971,6 +963,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -987,7 +980,7 @@
|
||||
};
|
||||
B07E4A112C9B8C52001F6910 /* Release-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = A3D4DF5D9888DAC25E2380AA /* Pods-RunnerTests.release-dev.xcconfig */;
|
||||
baseConfigurationReference = C33EAABFBF3F560A8EFB0BC0 /* Pods-RunnerTests.release-dev.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -1069,6 +1062,7 @@
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Syncrow;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -1085,7 +1079,7 @@
|
||||
};
|
||||
B07E4A142C9B8C5C001F6910 /* Profile-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 210827A693936E5201C5E75C /* Pods-RunnerTests.profile-dev.xcconfig */;
|
||||
baseConfigurationReference = 4F6A2F89436864C7EE769652 /* Pods-RunnerTests.profile-dev.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import UIKit
|
||||
import Flutter
|
||||
|
||||
@UIApplicationMain
|
||||
@main
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
|
@ -38,5 +38,10 @@
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>sms</string>
|
||||
<string>tel</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'dart:io';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
@ -6,12 +7,13 @@ import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:onesignal_flutter/onesignal_flutter.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:syncrow_app/features/app_layout/model/permission_model.dart';
|
||||
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
|
||||
import 'package:syncrow_app/features/app_layout/view/widgets/app_bar_home_dropdown.dart';
|
||||
import 'package:syncrow_app/features/auth/model/project_model.dart';
|
||||
import 'package:syncrow_app/features/auth/model/user_model.dart';
|
||||
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||
import 'package:syncrow_app/features/devices/model/room_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
|
||||
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
|
||||
import 'package:syncrow_app/features/menu/view/menu_view.dart';
|
||||
import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart';
|
||||
@ -20,32 +22,40 @@ import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_e
|
||||
import 'package:syncrow_app/features/scene/bloc/smart_scene/smart_scene_select_dart_bloc.dart';
|
||||
import 'package:syncrow_app/features/scene/enum/create_scene_enum.dart';
|
||||
import 'package:syncrow_app/features/scene/model/scene_settings_route_arguments.dart';
|
||||
import 'package:syncrow_app/features/scene/view/scene_view.dart';
|
||||
import 'package:syncrow_app/features/scene/view/routines_view.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
import 'package:syncrow_app/navigation/navigation_service.dart';
|
||||
import 'package:syncrow_app/navigation/routing_constants.dart';
|
||||
import 'package:syncrow_app/services/api/devices_api.dart';
|
||||
import 'package:syncrow_app/services/api/profile_api.dart';
|
||||
import 'package:syncrow_app/services/api/spaces_api.dart';
|
||||
import 'package:syncrow_app/utils/constants/temp_const.dart';
|
||||
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
|
||||
part 'home_state.dart';
|
||||
|
||||
class HomeCubit extends Cubit<HomeState> {
|
||||
HomeCubit._() : super(HomeInitial()) {
|
||||
checkIfNotificationPermissionGranted();
|
||||
fetchUserInfo();
|
||||
if (selectedSpace == null) {
|
||||
fetchUnitsByUserId();
|
||||
// .then((value) {
|
||||
// if (selectedSpace != null) {
|
||||
// fetchRoomsByUnitId(selectedSpace!);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
// checkIfNotificationPermissionGranted();
|
||||
fetchUserInfo().then(
|
||||
(value) {
|
||||
if (selectedSpace == null) {
|
||||
fetchUnitsByUserId();
|
||||
fetchPermissions();
|
||||
|
||||
// .then((value) {
|
||||
// if (selectedSpace != null) {
|
||||
// fetchRoomsByUnitId(selectedSpace!);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
static UserModel? user;
|
||||
|
||||
List<PermissionModel>? permissionModel = [];
|
||||
|
||||
static HomeCubit? _instance;
|
||||
static HomeCubit getInstance() {
|
||||
// If an instance already exists, return it
|
||||
@ -55,14 +65,90 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
Future fetchUserInfo() async {
|
||||
try {
|
||||
var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
|
||||
emit(HomeLoading());
|
||||
var uuid =
|
||||
await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
|
||||
user = await ProfileApi().fetchUserInfo(uuid);
|
||||
emit(HomeUserInfoLoaded(user!)); // Emit state after fetching user info
|
||||
project = user?.project;
|
||||
|
||||
emit(HomeUserInfoLoaded(user!));
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static bool manageSupSpace = false;
|
||||
static bool manageScene = false;
|
||||
static bool manageDeviceLocation = false;
|
||||
static bool visitorPasswordManagement = false;
|
||||
String errorMsg = '';
|
||||
|
||||
Future<void> fetchPermissions() async {
|
||||
try {
|
||||
emit(HomeLoading());
|
||||
final response = await ProfileApi().fetchPermissions(user!.role!.uuid);
|
||||
permissionModel = PermissionModel.fromJsonList(response);
|
||||
hasViewPermission();
|
||||
emit(PermissionsRoleLoaded(permissionModel!));
|
||||
} catch (e) {
|
||||
emit(HomeError(e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
void hasViewPermission() {
|
||||
emit(HomeLoading());
|
||||
|
||||
manageSupSpace = hasPermission(
|
||||
permissionModel!,
|
||||
'SPACE_MANAGEMENT',
|
||||
'MANAGE_SPACE',
|
||||
'ASSIGN_USER_TO_SPACE',
|
||||
);
|
||||
manageScene = hasPermission(
|
||||
permissionModel!,
|
||||
'AUTOMATION_MANAGEMENT',
|
||||
'MANAGE_SCENES',
|
||||
'UPDATE',
|
||||
);
|
||||
manageDeviceLocation = hasPermission(
|
||||
permissionModel!,
|
||||
'DEVICE_MANAGEMENT',
|
||||
'MANAGE_DEVICE',
|
||||
'LOCATION_UPDATE',
|
||||
);
|
||||
visitorPasswordManagement = hasPermission(
|
||||
permissionModel!,
|
||||
'VISITOR_PASSWORD_MANAGEMENT',
|
||||
'MANAGE_VISITOR_PASSWORD',
|
||||
'VIEW',
|
||||
);
|
||||
emit(HomePermissionUpdated());
|
||||
}
|
||||
|
||||
bool hasPermission(List<PermissionModel> permissions, String mainTitle,
|
||||
String subTitle, String finalTitle) {
|
||||
try {
|
||||
final mainOption = permissions.firstWhere(
|
||||
(perm) => perm.title == mainTitle,
|
||||
);
|
||||
|
||||
final subOption = mainOption.subOptions.firstWhere(
|
||||
(sub) => sub.title == subTitle,
|
||||
);
|
||||
|
||||
if (subOption.subOptions == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final finalOption = subOption.subOptions!.firstWhere(
|
||||
(finalSub) => finalSub.title == finalTitle,
|
||||
);
|
||||
return finalOption.isChecked == true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void emitSafe(HomeState newState) {
|
||||
final cubit = this;
|
||||
if (!cubit.isClosed) {
|
||||
@ -76,19 +162,24 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
selectedSpace = null;
|
||||
selectedRoom = null;
|
||||
pageIndex = 0;
|
||||
OneSignal.User.pushSubscription.removeObserver((stateChanges) => oneSignalSubscriptionObserver);
|
||||
OneSignal.Notifications.removePermissionObserver((permission) => oneSignalPermissionObserver);
|
||||
OneSignal.Notifications.removeClickListener((event) => oneSignalClickListenerObserver);
|
||||
// OneSignal.User.pushSubscription
|
||||
// .removeObserver((stateChanges) => oneSignalSubscriptionObserver);
|
||||
// OneSignal.Notifications.removePermissionObserver(
|
||||
// (permission) => oneSignalPermissionObserver);
|
||||
// OneSignal.Notifications.removeClickListener(
|
||||
// (event) => oneSignalClickListenerObserver);
|
||||
return super.close();
|
||||
}
|
||||
|
||||
static HomeCubit get(context) => BlocProvider.of(context);
|
||||
|
||||
List<SpaceModel>? spaces;
|
||||
List<SpaceModel> spaces = [];
|
||||
|
||||
SpaceModel? selectedSpace;
|
||||
|
||||
RoomModel? selectedRoom;
|
||||
SubSpaceModel? selectedRoom;
|
||||
|
||||
Project? project;
|
||||
|
||||
PageController devicesPageController = PageController();
|
||||
|
||||
@ -96,9 +187,9 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
var duration = const Duration(milliseconds: 300);
|
||||
|
||||
void oneSignalPermissionObserver;
|
||||
void oneSignalSubscriptionObserver;
|
||||
void oneSignalClickListenerObserver;
|
||||
// void oneSignalPermissionObserver;
|
||||
// void oneSignalSubscriptionObserver;
|
||||
// void oneSignalClickListenerObserver;
|
||||
|
||||
// selectSpace(SpaceModel space) async {
|
||||
// selectedSpace = space;
|
||||
@ -120,31 +211,36 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
return;
|
||||
}
|
||||
|
||||
var userUuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? '';
|
||||
var userUuid =
|
||||
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
|
||||
'';
|
||||
if (userUuid.isNotEmpty) {
|
||||
await OneSignal.login(userUuid);
|
||||
}
|
||||
//Enable push notifications
|
||||
await OneSignal.User.pushSubscription.optIn();
|
||||
|
||||
//this function will be called once a user is subscribed
|
||||
oneSignalSubscriptionObserver = OneSignal.User.pushSubscription.addObserver((state) async {
|
||||
if (state.current.optedIn) {
|
||||
await _sendSubscriptionId();
|
||||
}
|
||||
});
|
||||
// //this function will be called once a user is subscribed
|
||||
// oneSignalSubscriptionObserver =
|
||||
// OneSignal.User.pushSubscription.addObserver((state) async {
|
||||
// if (state.current.optedIn) {
|
||||
// await _sendSubscriptionId();
|
||||
// }
|
||||
// });
|
||||
|
||||
// Send the player id when a user allows notifications
|
||||
oneSignalPermissionObserver = OneSignal.Notifications.addPermissionObserver((state) async {
|
||||
await _sendSubscriptionId();
|
||||
});
|
||||
// // Send the player id when a user allows notifications
|
||||
// oneSignalPermissionObserver =
|
||||
// OneSignal.Notifications.addPermissionObserver((state) async {
|
||||
// await _sendSubscriptionId();
|
||||
// });
|
||||
|
||||
//check if the player id is sent, if not send it again
|
||||
await _sendSubscriptionId();
|
||||
// //check if the player id is sent, if not send it again
|
||||
// await _sendSubscriptionId();
|
||||
|
||||
oneSignalClickListenerObserver = OneSignal.Notifications.addClickListener((event) async {
|
||||
//Once the user clicks on the notification
|
||||
});
|
||||
// oneSignalClickListenerObserver =
|
||||
// OneSignal.Notifications.addClickListener((event) async {
|
||||
// //Once the user clicks on the notification
|
||||
// });
|
||||
} catch (err) {
|
||||
debugPrint("******* Error");
|
||||
debugPrint(err.toString());
|
||||
@ -172,8 +268,10 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
if (index == 0) {
|
||||
unselectRoom();
|
||||
} else if (index == 1) {
|
||||
unselectRoom1();
|
||||
} else {
|
||||
selectedRoom = selectedSpace!.rooms![index - 1];
|
||||
selectedRoom = selectedSpace!.subspaces[index - 2];
|
||||
emitSafe(RoomSelected(selectedRoom!));
|
||||
}
|
||||
}
|
||||
@ -187,8 +285,10 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
if (index <= 0) {
|
||||
unselectRoom();
|
||||
} else if (index == 1) {
|
||||
unselectRoom1();
|
||||
} else {
|
||||
selectedRoom = selectedSpace!.rooms![index - 1];
|
||||
selectedRoom = selectedSpace!.subspaces[index - 2];
|
||||
emitSafe(RoomSelected(selectedRoom!));
|
||||
}
|
||||
}
|
||||
@ -210,10 +310,28 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
emitSafe(RoomUnSelected());
|
||||
}
|
||||
|
||||
unselectRoom1() {
|
||||
// selectedRoom = null;
|
||||
devicesPageController.animateToPage(
|
||||
1,
|
||||
duration: duration,
|
||||
curve: Curves.linear,
|
||||
);
|
||||
|
||||
roomsPageController.animateToPage(
|
||||
1,
|
||||
duration: duration,
|
||||
curve: Curves.linear,
|
||||
);
|
||||
|
||||
emitSafe(RoomUnSelected());
|
||||
}
|
||||
|
||||
//////////////////////////////////////// API ////////////////////////////////////////
|
||||
generateInvitation(String unitId) async {
|
||||
generateInvitation(SpaceModel unit) async {
|
||||
try {
|
||||
final invitationCode = await SpacesAPI.generateInvitationCode(unitId);
|
||||
final invitationCode = await SpacesAPI.generateInvitationCode(unit.id,
|
||||
unit.community.uuid, project?.uuid ?? TempConst.projectIdDev);
|
||||
if (invitationCode.isNotEmpty) {
|
||||
Share.share('The invitation code is $invitationCode');
|
||||
CustomSnackBar.displaySnackBar(
|
||||
@ -229,10 +347,12 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
Future<bool> joinAUnit(String code) async {
|
||||
try {
|
||||
var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ?? '';
|
||||
Map<String, String> body = {'userUuid': uuid, 'inviteCode': code};
|
||||
var userUuid =
|
||||
await const FlutterSecureStorage().read(key: UserModel.userUuidKey) ??
|
||||
'';
|
||||
Map<String, String> body = {'inviteCode': code};
|
||||
|
||||
final success = await SpacesAPI.joinUnit(body);
|
||||
final success = await SpacesAPI.joinUnit(userUuid, body);
|
||||
if (success) {
|
||||
await fetchUnitsByUserId();
|
||||
CustomSnackBar.displaySnackBar('Done successfully');
|
||||
@ -247,16 +367,17 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
fetchUnitsByUserId() async {
|
||||
emitSafe(GetSpacesLoading());
|
||||
try {
|
||||
spaces = await SpacesAPI.getUnitsByUserId();
|
||||
spaces = await SpacesAPI.getSpacesByUserId();
|
||||
emitSafe(GetSpacesSuccess(spaces));
|
||||
} catch (failure) {
|
||||
emitSafe(GetSpacesError("No units found"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (spaces != null && spaces!.isNotEmpty) {
|
||||
selectedSpace = spaces!.first;
|
||||
if (spaces.isNotEmpty) {
|
||||
selectedSpace = spaces.first;
|
||||
await fetchRoomsByUnitId(selectedSpace!);
|
||||
emitSafe(GetSpacesSuccess(spaces!));
|
||||
emitSafe(GetSpacesSuccess(spaces));
|
||||
} else {
|
||||
emitSafe(GetSpacesError("No spaces found"));
|
||||
}
|
||||
@ -265,48 +386,74 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
fetchRoomsByUnitId(SpaceModel space) async {
|
||||
emitSafe(GetSpaceRoomsLoading());
|
||||
try {
|
||||
space.rooms = await SpacesAPI.getRoomsBySpaceId(space.id!);
|
||||
space.subspaces = await SpacesAPI.getSubSpaceBySpaceId(
|
||||
space.community.uuid,
|
||||
space.id,
|
||||
project?.uuid ?? TempConst.projectIdDev);
|
||||
} catch (failure) {
|
||||
emitSafe(GetSpaceRoomsError(failure.toString()));
|
||||
return;
|
||||
}
|
||||
if (space.rooms != null && space.rooms!.isNotEmpty) {
|
||||
emitSafe(GetSpaceRoomsSuccess(space.rooms!));
|
||||
if (space.subspaces.isNotEmpty) {
|
||||
emitSafe(GetSpaceRoomsSuccess(space.subspaces));
|
||||
} else {
|
||||
emitSafe(GetSpaceRoomsError("No rooms found"));
|
||||
}
|
||||
}
|
||||
|
||||
activationCode(activationCode) async {
|
||||
try {
|
||||
emitSafe(GetSpaceRoomsLoading());
|
||||
var uuid =
|
||||
await const FlutterSecureStorage().read(key: UserModel.userUuidKey);
|
||||
var res = await SpacesAPI.activationCodeSpace(
|
||||
activationCode: activationCode, userUuid: uuid);
|
||||
|
||||
if (res['success'] == true) {
|
||||
fetchUserInfo();
|
||||
fetchUnitsByUserId();
|
||||
}
|
||||
emitSafe(GetSpacesSuccess(spaces!));
|
||||
|
||||
return res['success'];
|
||||
} on DioException catch (e) {
|
||||
final errorMessage = e.response?.data['error']['message'];
|
||||
errorMsg = e.response?.data['error']['message'];
|
||||
emitSafe(ActivationError(errMessage: errorMsg));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////// Nav ///////////////////////////////////////
|
||||
|
||||
static int pageIndex = 0;
|
||||
|
||||
static Map<String, List<Widget>> appBarActions = {
|
||||
'Dashboard': [
|
||||
// IconButton(
|
||||
// icon: const Icon(
|
||||
// Icons.add,
|
||||
// size: 25,
|
||||
// ),
|
||||
// style: ButtonStyle(
|
||||
// foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
// ),
|
||||
// onPressed: () {
|
||||
// Navigator.push(
|
||||
// NavigationService.navigatorKey.currentContext!,
|
||||
// CustomPageRoute(
|
||||
// builder: (context) => CurtainView(
|
||||
// curtain: DeviceModel(
|
||||
// name: "Curtain",
|
||||
// status: [StatusModel(code: "awd", value: 1)],
|
||||
// productType: DeviceType.Curtain,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
],
|
||||
// 'Dashboard': [
|
||||
// // IconButton(
|
||||
// // icon: const Icon(
|
||||
// // Icons.add,
|
||||
// // size: 25,
|
||||
// // ),
|
||||
// // style: ButtonStyle(
|
||||
// // foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
// // ),
|
||||
// // onPressed: () {
|
||||
// // Navigator.push(
|
||||
// // NavigationService.navigatorKey.currentContext!,
|
||||
// // CustomPageRoute(
|
||||
// // builder: (context) => CurtainView(
|
||||
// // curtain: DeviceModel(
|
||||
// // name: "Curtain",
|
||||
// // status: [StatusModel(code: "awd", value: 1)],
|
||||
// // productType: DeviceType.Curtain,
|
||||
// // ),
|
||||
// // ),
|
||||
// // ),
|
||||
// // );
|
||||
// // },
|
||||
// // ),
|
||||
// ],
|
||||
'Devices': [
|
||||
//TODO: to be checked
|
||||
// IconButton(
|
||||
@ -341,65 +488,70 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
// ),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.add,
|
||||
size: 32,
|
||||
),
|
||||
style: ButtonStyle(
|
||||
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pushNamed(
|
||||
NavigationService.navigatorKey.currentContext!,
|
||||
Routes.sceneTasksRoute,
|
||||
arguments: SceneSettingsRouteArguments(
|
||||
sceneType: '',
|
||||
sceneId: '',
|
||||
sceneName: '',
|
||||
),
|
||||
);
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const ClearTaskListEvent());
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const SceneTypeEvent(CreateSceneEnum.none));
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<SmartSceneSelectBloc>()
|
||||
.add(const SmartSceneClearEvent());
|
||||
BlocProvider.of<EffectPeriodBloc>(NavigationService.navigatorKey.currentState!.context)
|
||||
.add(ResetEffectivePeriod());
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const ClearTabToRunSetting());
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
size: 28,
|
||||
),
|
||||
style: ButtonStyle(
|
||||
foregroundColor: WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
),
|
||||
onPressed: () {},
|
||||
),
|
||||
manageScene
|
||||
? IconButton(
|
||||
icon: const Icon(
|
||||
Icons.add,
|
||||
size: 32,
|
||||
),
|
||||
style: ButtonStyle(
|
||||
foregroundColor:
|
||||
WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pushNamed(
|
||||
NavigationService.navigatorKey.currentContext!,
|
||||
Routes.sceneTasksRoute,
|
||||
arguments: SceneSettingsRouteArguments(
|
||||
sceneType: '',
|
||||
sceneId: '',
|
||||
sceneName: '',
|
||||
),
|
||||
);
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const ClearTaskListEvent());
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const SceneTypeEvent(CreateSceneEnum.none));
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<SmartSceneSelectBloc>()
|
||||
.add(const SmartSceneClearEvent());
|
||||
BlocProvider.of<EffectPeriodBloc>(
|
||||
NavigationService.navigatorKey.currentState!.context)
|
||||
.add(ResetEffectivePeriod());
|
||||
NavigationService.navigatorKey.currentContext!
|
||||
.read<CreateSceneBloc>()
|
||||
.add(const ClearTabToRunSetting());
|
||||
},
|
||||
)
|
||||
: const SizedBox(),
|
||||
// IconButton(
|
||||
// icon: const Icon(
|
||||
// Icons.more_vert,
|
||||
// size: 28,
|
||||
// ),
|
||||
// style: ButtonStyle(
|
||||
// foregroundColor:
|
||||
// WidgetStateProperty.all(ColorsManager.textPrimaryColor),
|
||||
// ),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
],
|
||||
'Menu': [
|
||||
IconButton(
|
||||
icon: SvgPicture.asset(
|
||||
Assets.assetsIconsScan,
|
||||
height: 20,
|
||||
width: 20,
|
||||
),
|
||||
onPressed: () {},
|
||||
),
|
||||
// IconButton(
|
||||
// icon: SvgPicture.asset(
|
||||
// Assets.assetsIconsScan,
|
||||
// height: 20,
|
||||
// width: 20,
|
||||
// ),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
],
|
||||
};
|
||||
|
||||
static Map<String, Widget?> appBarLeading = {
|
||||
'Dashboard': const AppBarHomeDropdown(),
|
||||
// 'Dashboard': const AppBarHomeDropdown(),
|
||||
'Devices': const AppBarHomeDropdown(),
|
||||
'Routine': const AppBarHomeDropdown(),
|
||||
'Menu': Padding(
|
||||
@ -414,7 +566,7 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
};
|
||||
|
||||
static var bottomNavItems = [
|
||||
defaultBottomNavBarItem(icon: Assets.assetsIconsDashboard, label: 'Dashboard'),
|
||||
// defaultBottomNavBarItem(icon: Assets.assetsIconsDashboard, label: 'Dashboard'),
|
||||
// defaultBottomNavBarItem(icon: Assets.assetsIconslayout, label: 'Layout'),
|
||||
defaultBottomNavBarItem(icon: Assets.assetsIconsDevices, label: 'Devices'),
|
||||
defaultBottomNavBarItem(icon: Assets.assetsIconsRoutines, label: 'Routine'),
|
||||
@ -422,13 +574,13 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
];
|
||||
|
||||
final List<Widget> pages = [
|
||||
const DashboardView(),
|
||||
// const DashboardView(),
|
||||
// const LayoutPage(),
|
||||
BlocProvider(
|
||||
create: (context) => DevicesCubit.getInstance(),
|
||||
child: const DevicesViewBody(),
|
||||
),
|
||||
const SceneView(),
|
||||
const RoutinesView(),
|
||||
const MenuView(),
|
||||
];
|
||||
|
||||
@ -440,7 +592,8 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
|
||||
void updateDevice(String deviceId) async {
|
||||
try {
|
||||
final response = await DevicesAPI.firmwareDevice(deviceId: deviceId, firmwareVersion: '0');
|
||||
final response = await DevicesAPI.firmwareDevice(
|
||||
deviceId: deviceId, firmwareVersion: '0');
|
||||
if (response['success'] ?? false) {
|
||||
CustomSnackBar.displaySnackBar('No updates available');
|
||||
}
|
||||
@ -448,7 +601,8 @@ class HomeCubit extends Cubit<HomeState> {
|
||||
}
|
||||
}
|
||||
|
||||
BottomNavigationBarItem defaultBottomNavBarItem({required String icon, required String label}) {
|
||||
BottomNavigationBarItem defaultBottomNavBarItem(
|
||||
{required String icon, required String label}) {
|
||||
return BottomNavigationBarItem(
|
||||
icon: SvgPicture.asset(icon),
|
||||
activeIcon: SvgPicture.asset(
|
||||
@ -461,3 +615,28 @@ BottomNavigationBarItem defaultBottomNavBarItem({required String icon, required
|
||||
label: label,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// class PermissionUtils {
|
||||
// // Check if the "VIEW" permission exists in "MANAGE_SUBSPACE"
|
||||
// static bool hasViewPermission(List<dynamic> permissions) {
|
||||
// return _hasPermission(permissions, 'MANAGE_SUBSPACE', 'VIEW');
|
||||
// }
|
||||
|
||||
// // Generalized permission checker
|
||||
// static bool _hasPermission(
|
||||
// List<dynamic> permissions, String mainTitle, String subTitle) {
|
||||
// final mainOption = permissions.firstWhere(
|
||||
// (perm) => perm['title'] == mainTitle,
|
||||
// orElse: () => null,
|
||||
// );
|
||||
// if (mainOption != null) {
|
||||
// final subOption = mainOption['subOptions'].firstWhere(
|
||||
// (sub) => sub['title'] == subTitle,
|
||||
// orElse: () => null,
|
||||
// );
|
||||
// return subOption != null && subOption['isChecked'] == true;
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
@ -15,8 +15,8 @@ class HomeError extends HomeState {
|
||||
|
||||
class HomeSuccess extends HomeState {}
|
||||
|
||||
///specific states
|
||||
//get spaces
|
||||
class ActivationSuccess extends HomeState {}
|
||||
|
||||
class GetSpacesLoading extends HomeLoading {}
|
||||
|
||||
class GetSpacesSuccess extends HomeSuccess {
|
||||
@ -32,8 +32,14 @@ class GetSpacesError extends HomeError {
|
||||
//get rooms
|
||||
class GetSpaceRoomsLoading extends HomeLoading {}
|
||||
|
||||
class ActivationError extends HomeLoading {
|
||||
final String errMessage;
|
||||
|
||||
ActivationError({this.errMessage = ''});
|
||||
}
|
||||
|
||||
class GetSpaceRoomsSuccess extends HomeSuccess {
|
||||
final List<RoomModel> rooms;
|
||||
final List<SubSpaceModel> rooms;
|
||||
|
||||
GetSpaceRoomsSuccess(this.rooms);
|
||||
}
|
||||
@ -50,7 +56,7 @@ class SpaceSelected extends HomeState {
|
||||
}
|
||||
|
||||
class RoomSelected extends HomeState {
|
||||
final RoomModel room;
|
||||
final SubSpaceModel room;
|
||||
|
||||
RoomSelected(this.room);
|
||||
}
|
||||
@ -58,9 +64,16 @@ class RoomSelected extends HomeState {
|
||||
class RoomUnSelected extends HomeState {}
|
||||
|
||||
class NavChangePage extends HomeState {}
|
||||
// Define new state classes
|
||||
|
||||
class HomePermissionUpdated extends HomeState {}
|
||||
|
||||
class HomeUserInfoLoaded extends HomeState {
|
||||
final UserModel user;
|
||||
|
||||
HomeUserInfoLoaded(this.user);
|
||||
}
|
||||
|
||||
class PermissionsRoleLoaded extends HomeState {
|
||||
final List<PermissionModel> permissionModel;
|
||||
PermissionsRoleLoaded(this.permissionModel);
|
||||
}
|
||||
|
27
lib/features/app_layout/model/community_model.dart
Normal file
@ -0,0 +1,27 @@
|
||||
class Community {
|
||||
final String uuid;
|
||||
final String name;
|
||||
final String description;
|
||||
|
||||
Community({
|
||||
required this.uuid,
|
||||
required this.name,
|
||||
this.description = '',
|
||||
});
|
||||
|
||||
factory Community.fromJson(Map<String, dynamic> json) {
|
||||
return Community(
|
||||
uuid: json['uuid'] ?? '',
|
||||
name: json['name'] ?? 'Unnamed Community',
|
||||
description: json['description'] ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'uuid': uuid,
|
||||
'name': name,
|
||||
'description': description,
|
||||
};
|
||||
}
|
||||
}
|
39
lib/features/app_layout/model/permission_model.dart
Normal file
@ -0,0 +1,39 @@
|
||||
class PermissionModel {
|
||||
final String title;
|
||||
final List<PermissionAttributes> subOptions;
|
||||
|
||||
PermissionModel({required this.title, required this.subOptions});
|
||||
|
||||
factory PermissionModel.fromJson(Map<String, dynamic> json) {
|
||||
return PermissionModel(
|
||||
title: json['title'],
|
||||
subOptions: (json['subOptions'] as List)
|
||||
.map((e) => PermissionAttributes.fromJson(e))
|
||||
.toList(),
|
||||
);
|
||||
}
|
||||
|
||||
static List<PermissionModel> fromJsonList(List<dynamic> jsonList) {
|
||||
return jsonList.map((json) => PermissionModel.fromJson(json)).toList();
|
||||
}
|
||||
}
|
||||
|
||||
class PermissionAttributes {
|
||||
final String title;
|
||||
final List<PermissionAttributes>? subOptions;
|
||||
final bool? isChecked;
|
||||
|
||||
PermissionAttributes({required this.title, this.subOptions, this.isChecked});
|
||||
|
||||
factory PermissionAttributes.fromJson(Map<String, dynamic> json) {
|
||||
return PermissionAttributes(
|
||||
title: json['title'],
|
||||
isChecked: json['isChecked'],
|
||||
subOptions: json['subOptions'] != null
|
||||
? (json['subOptions'] as List)
|
||||
.map((e) => PermissionAttributes.fromJson(e))
|
||||
.toList()
|
||||
: null,
|
||||
);
|
||||
}
|
||||
}
|
@ -1,37 +1,53 @@
|
||||
import 'package:syncrow_app/features/devices/model/room_model.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
import 'package:syncrow_app/features/app_layout/model/community_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
|
||||
|
||||
class SpaceModel {
|
||||
final String? id;
|
||||
final String? name;
|
||||
final SpaceType type;
|
||||
late List<RoomModel>? rooms;
|
||||
final String id;
|
||||
final String name;
|
||||
final Community community;
|
||||
late List<SubSpaceModel> subspaces;
|
||||
|
||||
SpaceModel({
|
||||
required this.type,
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.rooms,
|
||||
required this.community,
|
||||
this.subspaces = const [], // Default to an empty list
|
||||
});
|
||||
|
||||
/// Converts the instance into JSON format.
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'name': name,
|
||||
'rooms': rooms,
|
||||
'spaceName': name,
|
||||
'community': community.toJson(),
|
||||
'subspaces': subspaces.map((room) => room.toJson()).toList(),
|
||||
};
|
||||
}
|
||||
|
||||
/// Factory constructor to create an instance from JSON.
|
||||
factory SpaceModel.fromJson(Map<String, dynamic> json) {
|
||||
// Extract and log each part of space data
|
||||
final id = json['uuid'] ?? '';
|
||||
final name = json['spaceName'] ?? 'Unnamed Space';
|
||||
final communityJson = json['community'] ?? {};
|
||||
|
||||
return SpaceModel(
|
||||
id: json['uuid'],
|
||||
name: json['name'],
|
||||
type: spaceTypesMap[json['type']]!,
|
||||
rooms: [],
|
||||
id: id,
|
||||
name: name,
|
||||
community: Community.fromJson(
|
||||
communityJson), // Ensure Community is created correctly
|
||||
subspaces: (json['subspaces'] as List<dynamic>?)
|
||||
?.map((item) => SubSpaceModel.fromJson(item))
|
||||
.toList() ??
|
||||
[],
|
||||
);
|
||||
}
|
||||
|
||||
/// Helper method to parse a list of SpaceModel from JSON.
|
||||
static List<SpaceModel> fromJsonList(List<dynamic> jsonList) {
|
||||
return jsonList.map((item) => SpaceModel.fromJson(item)).toList();
|
||||
return jsonList.map((item) {
|
||||
final spaceData = item['space']; // Extract the `space` object
|
||||
return SpaceModel.fromJson(spaceData); // Pass to SpaceModel.fromJson
|
||||
}).toList();
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,10 @@ class AppLayout extends StatelessWidget {
|
||||
child: BlocBuilder<HomeCubit, HomeState>(
|
||||
builder: (context, state) {
|
||||
return DefaultScaffold(
|
||||
appBar: HomeCubit.getInstance().spaces != null ? const DefaultAppBar() : null,
|
||||
appBar: HomeCubit.getInstance().spaces != null &&
|
||||
HomeCubit.getInstance().spaces!.isNotEmpty
|
||||
? const DefaultAppBar()
|
||||
: null,
|
||||
bottomNavBar: const DefaultNavBar(),
|
||||
child: const AppBody(),
|
||||
);
|
||||
|
@ -12,62 +12,65 @@ class AppBarHomeDropdown extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<HomeCubit, HomeState>(
|
||||
builder: (context, state) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
child: DropdownButton(
|
||||
icon: const Icon(
|
||||
Icons.expand_more,
|
||||
color: ColorsManager.textPrimaryColor,
|
||||
size: 16,
|
||||
),
|
||||
underline: const SizedBox.shrink(),
|
||||
padding: EdgeInsets.zero,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
value: HomeCubit.getInstance().selectedSpace!.id,
|
||||
items: HomeCubit.getInstance().spaces!.map((space) {
|
||||
return DropdownMenuItem(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
value: space.id,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
Assets.assetsIconsHome,
|
||||
width: 25,
|
||||
height: 25,
|
||||
colorFilter: const ColorFilter.mode(
|
||||
ColorsManager.textPrimaryColor,
|
||||
BlendMode.srcIn,
|
||||
return HomeCubit.getInstance().spaces != null || HomeCubit.getInstance().spaces!.isNotEmpty
|
||||
? BlocBuilder<HomeCubit, HomeState>(
|
||||
builder: (context, state) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
child: DropdownButton(
|
||||
icon: const Icon(
|
||||
Icons.expand_more,
|
||||
color: ColorsManager.textPrimaryColor,
|
||||
size: 16,
|
||||
),
|
||||
underline: const SizedBox.shrink(),
|
||||
padding: EdgeInsets.zero,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
value: HomeCubit.getInstance().selectedSpace?.id ?? '',
|
||||
items: HomeCubit.getInstance().spaces!.map((space) {
|
||||
return DropdownMenuItem(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
value: space.id,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
Assets.assetsIconsHome,
|
||||
width: 25,
|
||||
height: 25,
|
||||
colorFilter: const ColorFilter.mode(
|
||||
ColorsManager.textPrimaryColor,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
Flexible(
|
||||
child: BodyMedium(
|
||||
text: space.name,
|
||||
style: context.bodyMedium.copyWith(
|
||||
fontSize: 15,
|
||||
color: ColorsManager.textPrimaryColor,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
Flexible(
|
||||
child: BodyMedium(
|
||||
text: space.name ?? "??",
|
||||
style: context.bodyMedium.copyWith(
|
||||
fontSize: 15,
|
||||
color: ColorsManager.textPrimaryColor,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
onChanged: (value) {
|
||||
if (value != null) {
|
||||
HomeCubit.getInstance().changeSelectedSpace(HomeCubit.getInstance()
|
||||
.spaces!
|
||||
.firstWhere((element) => element.id == value));
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
onChanged: (value) {
|
||||
if (value != null) {
|
||||
HomeCubit.getInstance().changeSelectedSpace(
|
||||
HomeCubit.getInstance().spaces!.firstWhere((element) => element.id == value));
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
)
|
||||
: Container();
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,10 @@
|
||||
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/app_layout/model/space_model.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
|
||||
class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
@ -19,10 +22,23 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
backgroundColor: Colors.transparent,
|
||||
leadingWidth: 200,
|
||||
toolbarHeight: Constants.appBarHeight,
|
||||
leading: HomeCubit.getInstance().spaces!.isNotEmpty
|
||||
? HomeCubit.appBarLeading[HomeCubit.bottomNavItems[HomeCubit.pageIndex].label]!
|
||||
leading: InkWell(
|
||||
onTap: () {
|
||||
final spaces = HomeCubit.getInstance().spaces!;
|
||||
showSpaceBottomSheet(context, spaces);
|
||||
},
|
||||
child: HomeCubit.getInstance().spaces!.isNotEmpty
|
||||
? AbsorbPointer(
|
||||
absorbing: true,
|
||||
child: HomeCubit.appBarLeading[HomeCubit
|
||||
.bottomNavItems[HomeCubit.pageIndex].label]!,
|
||||
)
|
||||
: null,
|
||||
),
|
||||
actions: HomeCubit.manageScene
|
||||
? HomeCubit.appBarActions[
|
||||
HomeCubit.bottomNavItems[HomeCubit.pageIndex].label]
|
||||
: null,
|
||||
actions: HomeCubit.appBarActions[HomeCubit.bottomNavItems[HomeCubit.pageIndex].label],
|
||||
));
|
||||
},
|
||||
);
|
||||
@ -31,3 +47,83 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
@override
|
||||
Size get preferredSize => Size.fromHeight(Constants.appBarHeight);
|
||||
}
|
||||
|
||||
void showSpaceBottomSheet(BuildContext context, List<SpaceModel> spaces) {
|
||||
showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return StatefulBuilder(
|
||||
builder: (BuildContext context, StateSetter setModalState) {
|
||||
String? selectedSpaceId = HomeCubit.getInstance().selectedSpace?.id;
|
||||
final bool shouldLimitHeight = spaces.length > 5;
|
||||
return Container(
|
||||
constraints: shouldLimitHeight
|
||||
? BoxConstraints(
|
||||
maxHeight: MediaQuery.of(context).size.height * 0.5,
|
||||
)
|
||||
: const BoxConstraints(),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
Container(
|
||||
decoration: const BoxDecoration(color: Colors.black12),
|
||||
height: 5,
|
||||
width: 50,
|
||||
),
|
||||
ListView.separated(
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemCount: spaces.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
final space = spaces[index];
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 30, right: 30),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(space.name),
|
||||
],
|
||||
),
|
||||
Radio<String>(
|
||||
value: space.id,
|
||||
groupValue: selectedSpaceId,
|
||||
onChanged: (String? newValue) {
|
||||
if (newValue != null) {
|
||||
setModalState(() {
|
||||
selectedSpaceId = newValue;
|
||||
});
|
||||
HomeCubit.getInstance().changeSelectedSpace(
|
||||
spaces.firstWhere((s) => s.id == newValue),
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (BuildContext context, int index) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 50),
|
||||
child: const Divider(
|
||||
color: Colors.grey,
|
||||
thickness: 0.5,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:syncrow_app/features/auth/model/login_with_email_model.dart';
|
||||
import 'package:syncrow_app/features/auth/model/signup_model.dart';
|
||||
@ -204,6 +205,7 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
const FlutterSecureStorage().write(
|
||||
key: UserModel.userUuidKey,
|
||||
value: Token.decodeToken(token.accessToken)['uuid'].toString());
|
||||
|
||||
user = UserModel.fromToken(token);
|
||||
emailController.clear();
|
||||
passwordController.clear();
|
||||
@ -216,10 +218,24 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
signUp() async {
|
||||
emit(AuthLoginLoading());
|
||||
final response;
|
||||
|
||||
final clientId = dotenv.env['CLIENT_ID'] ?? '';
|
||||
final clientSecret = dotenv.env['CLIENT_SECRET'] ?? '';
|
||||
|
||||
try {
|
||||
List<String> userFullName = fullName.split(' ');
|
||||
|
||||
final clientToken = await AuthenticationAPI.fetchClientToken(
|
||||
clientId: clientId,
|
||||
clientSecret: clientSecret,
|
||||
);
|
||||
|
||||
final accessToken = clientToken['accessToken'];
|
||||
|
||||
response = await AuthenticationAPI.signUp(
|
||||
accessToken: accessToken,
|
||||
model: SignUpModel(
|
||||
hasAcceptedAppAgreement: true,
|
||||
email: email.toLowerCase(),
|
||||
password: signUpPassword,
|
||||
firstName: userFullName[0],
|
||||
@ -237,26 +253,34 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
}
|
||||
}
|
||||
|
||||
sendOtp() async {
|
||||
sendOtp({bool? isforget}) async {
|
||||
try {
|
||||
emit(AuthLoading());
|
||||
await AuthenticationAPI.sendOtp(
|
||||
body: {'email': email, 'type': 'VERIFICATION'});
|
||||
await AuthenticationAPI.sendOtp(body: {
|
||||
'email': email,
|
||||
'type': isforget == true ? 'PASSWORD' : 'VERIFICATION'
|
||||
});
|
||||
emit(AuthSignUpSuccess());
|
||||
} catch (_) {
|
||||
emit(AuthLoginError(message: 'Something went wrong'));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
|
||||
// emit(AuthLoginError(message: 'Something went wrong'));
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> reSendOtp() async {
|
||||
Future<bool> reSendOtp({bool? forget}) async {
|
||||
try {
|
||||
emit(AuthLoading());
|
||||
await AuthenticationAPI.sendOtp(
|
||||
body: {'email': email, 'type': 'VERIFICATION'});
|
||||
await AuthenticationAPI.sendOtp(body: {
|
||||
'email': email,
|
||||
'type': forget == true ? 'PASSWORD' : 'VERIFICATION'
|
||||
});
|
||||
emit(ResendOtpSuccess());
|
||||
return true;
|
||||
} catch (_) {
|
||||
emit(AuthLoginError(message: 'Something went wrong'));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
|
||||
// emit(AuthLoginError(message: 'Something went wrong'));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -264,8 +288,11 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
verifyOtp(bool isForgotPass) async {
|
||||
emit(AuthLoginLoading());
|
||||
try {
|
||||
final response = await AuthenticationAPI.verifyPassCode(
|
||||
body: {'email': email, 'type': 'VERIFICATION', 'otpCode': otpCode});
|
||||
final response = await AuthenticationAPI.verifyPassCode(body: {
|
||||
'email': email,
|
||||
'type': isForgotPass == true ? 'PASSWORD' : 'VERIFICATION',
|
||||
'otpCode': otpCode
|
||||
});
|
||||
if (response['statusCode'] == 200) {
|
||||
if (!isForgotPass) {
|
||||
emailController.text = email;
|
||||
@ -273,11 +300,13 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
await login();
|
||||
}
|
||||
emit(AuthOtpSuccess());
|
||||
} else {
|
||||
emit(AuthLoginError(message: 'Something went wrong'));
|
||||
}
|
||||
// else {
|
||||
// emit(AuthLoginError(message: 'Something went wrong'));
|
||||
// }
|
||||
} catch (failure) {
|
||||
emit(AuthLoginError(message: 'Something went wrong'));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
//emit(AuthLoginError(message: 'Something went wrong'));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -292,7 +321,9 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
(Route route) => false,
|
||||
);
|
||||
} catch (failure) {
|
||||
emit(AuthLogoutError(message: 'Something went wrong'));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
|
||||
// emit(AuthLogoutError(message: 'Something went wrong'));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -333,17 +364,22 @@ class AuthCubit extends Cubit<AuthState> {
|
||||
emit(AuthTokenError(message: "Something went wrong"));
|
||||
}
|
||||
} catch (_) {
|
||||
emit(AuthTokenError(message: "Something went wrong"));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
|
||||
// emit(AuthTokenError(message: "Something went wrong"));
|
||||
}
|
||||
}
|
||||
|
||||
sendToForgetPassword({required String password}) async {
|
||||
try {
|
||||
emit(AuthForgetPassLoading());
|
||||
await AuthenticationAPI.forgetPassword(email: email, password: password);
|
||||
|
||||
await AuthenticationAPI.forgetPassword(
|
||||
email: email, password: password, otpCode: otpCode);
|
||||
emit(AuthForgetPassSuccess());
|
||||
} catch (_) {
|
||||
emit(AuthForgetPassError(message: 'Something went wrong'));
|
||||
emit(AuthErrorStatusWithoutMsg());
|
||||
// emit(AuthForgetPassError(message: 'Something went wrong'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -52,9 +52,6 @@ class AuthTokenError extends AuthError {
|
||||
AuthTokenError({required super.message, super.code});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//ForgetPassword log states
|
||||
class AuthForgetPassLoading extends AuthLoading {}
|
||||
|
||||
@ -64,3 +61,6 @@ class AuthForgetPassError extends AuthError {
|
||||
AuthForgetPassError({required super.message, super.code});
|
||||
}
|
||||
|
||||
class AuthErrorStatusWithoutMsg extends AuthState {
|
||||
AuthErrorStatusWithoutMsg();
|
||||
}
|
||||
|
27
lib/features/auth/model/project_model.dart
Normal file
@ -0,0 +1,27 @@
|
||||
class Project {
|
||||
final String uuid;
|
||||
final String name;
|
||||
final String description;
|
||||
|
||||
const Project({
|
||||
required this.uuid,
|
||||
required this.name,
|
||||
required this.description,
|
||||
});
|
||||
|
||||
factory Project.fromJson(Map<String, dynamic> json) {
|
||||
return Project(
|
||||
uuid: json['uuid'] as String,
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'uuid': uuid,
|
||||
'name': name,
|
||||
'description': description,
|
||||
};
|
||||
}
|
||||
}
|
@ -3,10 +3,12 @@ class SignUpModel {
|
||||
final String password;
|
||||
final String firstName;
|
||||
final String lastName;
|
||||
final bool hasAcceptedAppAgreement;
|
||||
|
||||
SignUpModel(
|
||||
{required this.email,
|
||||
required this.password,
|
||||
required this.hasAcceptedAppAgreement,
|
||||
required this.firstName,
|
||||
required this.lastName});
|
||||
|
||||
@ -15,7 +17,8 @@ class SignUpModel {
|
||||
email: json['email'],
|
||||
password: json['password'],
|
||||
firstName: json['firstName'],
|
||||
lastName: json['lastName']);
|
||||
lastName: json['lastName'],
|
||||
hasAcceptedAppAgreement: true);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
@ -24,6 +27,7 @@ class SignUpModel {
|
||||
'password': password,
|
||||
'firstName': firstName,
|
||||
'lastName': lastName,
|
||||
"hasAcceptedAppAgreement": hasAcceptedAppAgreement
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:syncrow_app/features/auth/model/project_model.dart';
|
||||
import 'package:syncrow_app/features/auth/model/token.dart';
|
||||
|
||||
class UserModel {
|
||||
@ -14,7 +14,14 @@ class UserModel {
|
||||
final bool? isEmailVerified;
|
||||
final String? regionName;
|
||||
final String? timeZone;
|
||||
final String? regionUuid;
|
||||
final bool? isAgreementAccepted;
|
||||
final bool? hasAcceptedWebAgreement;
|
||||
final DateTime? webAgreementAcceptedAt;
|
||||
final bool? hasAcceptedAppAgreement;
|
||||
final DateTime? appAgreementAcceptedAt;
|
||||
final Role? role;
|
||||
final Project? project;
|
||||
|
||||
UserModel({
|
||||
required this.uuid,
|
||||
@ -24,10 +31,16 @@ class UserModel {
|
||||
required this.profilePicture,
|
||||
required this.phoneNumber,
|
||||
required this.isEmailVerified,
|
||||
required this.regionUuid,
|
||||
required this.isAgreementAccepted,
|
||||
required this.regionName, // Add this line
|
||||
required this.timeZone, // Add this line
|
||||
|
||||
required this.regionName,
|
||||
required this.timeZone,
|
||||
required this.hasAcceptedWebAgreement,
|
||||
required this.webAgreementAcceptedAt,
|
||||
required this.hasAcceptedAppAgreement,
|
||||
required this.appAgreementAcceptedAt,
|
||||
required this.role,
|
||||
required this.project,
|
||||
});
|
||||
|
||||
factory UserModel.fromJson(Map<String, dynamic> json) {
|
||||
@ -40,26 +53,47 @@ class UserModel {
|
||||
phoneNumber: json['phoneNumber'],
|
||||
isEmailVerified: json['isEmailVerified'],
|
||||
isAgreementAccepted: json['isAgreementAccepted'],
|
||||
regionName: json['region']?['regionName'], // Extract regionName
|
||||
timeZone: json['timeZone']?['timeZoneOffset'], // Extract regionName
|
||||
regionName: json['region']?['regionName'],
|
||||
timeZone: json['timeZone']?['timeZoneOffset'],
|
||||
regionUuid: json['region']?['uuid'],
|
||||
hasAcceptedWebAgreement: json['hasAcceptedWebAgreement'],
|
||||
webAgreementAcceptedAt: json['webAgreementAcceptedAt'] != null
|
||||
? DateTime.parse(json['webAgreementAcceptedAt'])
|
||||
: null,
|
||||
hasAcceptedAppAgreement: json['hasAcceptedAppAgreement'],
|
||||
appAgreementAcceptedAt: json['appAgreementAcceptedAt'] != null
|
||||
? DateTime.parse(json['appAgreementAcceptedAt'])
|
||||
: null,
|
||||
role: json['role'] != null ? Role.fromJson(json['role']) : null,
|
||||
project:
|
||||
json['project'] != null ? Project.fromJson(json['project']) : null,
|
||||
);
|
||||
}
|
||||
//uuid to json
|
||||
//from token
|
||||
factory UserModel.fromToken(Token token) {
|
||||
|
||||
factory UserModel.fromToken(Token token) {
|
||||
Map<String, dynamic> tempJson = Token.decodeToken(token.accessToken);
|
||||
return UserModel(
|
||||
uuid: tempJson['uuid'].toString(),
|
||||
email: tempJson['email'],
|
||||
lastName: tempJson['lastName'],
|
||||
firstName:tempJson['firstName'] ,
|
||||
profilePicture: UserModel.decodeBase64Image(tempJson['profilePicture']),
|
||||
phoneNumber: null,
|
||||
isEmailVerified: null,
|
||||
isAgreementAccepted: null,
|
||||
regionName: tempJson['region']?['regionName'],
|
||||
timeZone: tempJson['timezone']?['timeZoneOffset'],
|
||||
);
|
||||
uuid: tempJson['uuid'].toString(),
|
||||
email: tempJson['email'],
|
||||
lastName: tempJson['lastName'],
|
||||
firstName: tempJson['firstName'],
|
||||
profilePicture: UserModel.decodeBase64Image(tempJson['profilePicture']),
|
||||
phoneNumber: null,
|
||||
isEmailVerified: null,
|
||||
isAgreementAccepted: null,
|
||||
regionUuid: null,
|
||||
regionName: tempJson['region']?['regionName'],
|
||||
timeZone: tempJson['timezone']?['timeZoneOffset'],
|
||||
hasAcceptedWebAgreement: tempJson['hasAcceptedWebAgreement'],
|
||||
webAgreementAcceptedAt: tempJson['webAgreementAcceptedAt'] != null
|
||||
? DateTime.parse(tempJson['webAgreementAcceptedAt'])
|
||||
: null,
|
||||
hasAcceptedAppAgreement: tempJson['hasAcceptedAppAgreement'],
|
||||
appAgreementAcceptedAt: tempJson['appAgreementAcceptedAt'] != null
|
||||
? DateTime.parse(tempJson['appAgreementAcceptedAt'])
|
||||
: null,
|
||||
role: tempJson['role'] != null ? Role.fromJson(tempJson['role']) : null,
|
||||
project: null);
|
||||
}
|
||||
|
||||
static Uint8List? decodeBase64Image(String? base64String) {
|
||||
@ -71,14 +105,57 @@ class UserModel {
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': uuid,
|
||||
'uuid': uuid,
|
||||
'email': email,
|
||||
'lastName': lastName,
|
||||
'firstName': firstName,
|
||||
'photoUrl': profilePicture,
|
||||
'lastName': lastName,
|
||||
'profilePicture':
|
||||
profilePicture != null ? base64.encode(profilePicture!) : null,
|
||||
'phoneNumber': phoneNumber,
|
||||
'isEmailVerified': isEmailVerified,
|
||||
'regionUuid': regionUuid,
|
||||
'isAgreementAccepted': isAgreementAccepted,
|
||||
'regionName': regionName,
|
||||
'timeZone': timeZone,
|
||||
'hasAcceptedWebAgreement': hasAcceptedWebAgreement,
|
||||
'webAgreementAcceptedAt': webAgreementAcceptedAt?.toIso8601String(),
|
||||
'hasAcceptedAppAgreement': hasAcceptedAppAgreement,
|
||||
'appAgreementAcceptedAt': appAgreementAcceptedAt?.toIso8601String(),
|
||||
'role': role?.toJson(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class Role {
|
||||
final String? uuid;
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
final String? type;
|
||||
|
||||
Role({
|
||||
required this.uuid,
|
||||
required this.createdAt,
|
||||
required this.updatedAt,
|
||||
required this.type,
|
||||
});
|
||||
|
||||
factory Role.fromJson(Map<String, dynamic> json) {
|
||||
return Role(
|
||||
uuid: json['uuid'],
|
||||
createdAt:
|
||||
json['createdAt'] != null ? DateTime.parse(json['createdAt']) : null,
|
||||
updatedAt:
|
||||
json['updatedAt'] != null ? DateTime.parse(json['updatedAt']) : null,
|
||||
type: json['type'],
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'uuid': uuid,
|
||||
'createdAt': createdAt?.toIso8601String(),
|
||||
'updatedAt': updatedAt?.toIso8601String(),
|
||||
'type': type,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,9 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/styles_manager.dart';
|
||||
|
||||
class checkEmailPage extends StatelessWidget {
|
||||
const checkEmailPage({super.key});
|
||||
class CheckEmailPage extends StatelessWidget {
|
||||
final bool? forget;
|
||||
const CheckEmailPage({super.key, this.forget});
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final formKey = AuthCubit.get(context).checkEmailFormKey;
|
||||
@ -34,8 +35,8 @@ class checkEmailPage extends StatelessWidget {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const OtpView(
|
||||
isForgetPage: true,
|
||||
builder: (context) => OtpView(
|
||||
isForgetPage: forget!,
|
||||
),
|
||||
));
|
||||
}
|
||||
@ -149,7 +150,7 @@ class checkEmailPage extends StatelessWidget {
|
||||
AuthCubit.get(context).showValidationMessage = true;
|
||||
if (formKey.currentState!.validate()) {
|
||||
if ((state is! AuthLoading)) {
|
||||
AuthCubit.get(context).sendOtp();
|
||||
AuthCubit.get(context).sendOtp(isforget: forget);
|
||||
FocusScope.of(context).unfocus();
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/styles_manager.dart';
|
||||
|
||||
|
||||
class CreateNewPasswordPage extends StatelessWidget {
|
||||
const CreateNewPasswordPage({super.key,});
|
||||
|
||||
|
@ -31,8 +31,7 @@ class LoginView extends StatelessWidget {
|
||||
// content: Text(state.message),
|
||||
// ),
|
||||
// );
|
||||
}
|
||||
else if (state is AuthLoginSuccess) {
|
||||
} else if (state is AuthLoginSuccess) {
|
||||
Navigator.popAndPushNamed(context, Routes.homeRoute);
|
||||
}
|
||||
},
|
||||
@ -96,8 +95,8 @@ class LoginView extends StatelessWidget {
|
||||
height: 20,
|
||||
),
|
||||
const LoginForm(),
|
||||
const LoginDivider(),
|
||||
const LoginWithGoogleFacebook(),
|
||||
// const LoginDivider(),
|
||||
// const LoginWithGoogleFacebook(),
|
||||
const DontHaveAnAccount(),
|
||||
],
|
||||
),
|
||||
|
@ -374,20 +374,25 @@ class _OtpViewState extends State<OtpView> {
|
||||
return;
|
||||
}
|
||||
if ((state is! AuthLoading)) {
|
||||
bool success = await AuthCubit.get(context)
|
||||
.reSendOtp();
|
||||
bool success =
|
||||
await AuthCubit.get(context)
|
||||
.reSendOtp(
|
||||
forget:
|
||||
widget.isForgetPage);
|
||||
FocusScope.of(context).unfocus();
|
||||
if(success){
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => SuccessDialog(
|
||||
key: ValueKey('SuccessDialog'),
|
||||
message: 'New OTP sent!',));
|
||||
if (success) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) =>const SuccessDialog(
|
||||
key: ValueKey(
|
||||
'SuccessDialog'),
|
||||
message: 'New OTP sent!',
|
||||
));
|
||||
}
|
||||
Future.delayed(Duration(seconds: 2),
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
});
|
||||
// Future.delayed(Duration(seconds: 2),
|
||||
// () {
|
||||
// Navigator.of(context).pop();
|
||||
// });
|
||||
}
|
||||
},
|
||||
),
|
||||
|
@ -3,12 +3,15 @@ import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart';
|
||||
import 'package:syncrow_app/features/menu/bloc/privacy_policy.dart';
|
||||
import 'package:syncrow_app/features/menu/bloc/user_agreement.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/default_button.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
||||
import 'package:syncrow_app/generated/assets.dart';
|
||||
import 'package:syncrow_app/navigation/routing_constants.dart';
|
||||
import 'package:syncrow_app/utils/context_extension.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/styles_manager.dart';
|
||||
@ -202,6 +205,93 @@ class SignUpView extends StatelessWidget {
|
||||
hint: "At least 8 characters"),
|
||||
),
|
||||
const SizedBox(height: 40),
|
||||
Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16.0),
|
||||
child: Text.rich(
|
||||
TextSpan(
|
||||
text:
|
||||
'By signing up you agree to our ',
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium!
|
||||
.copyWith(
|
||||
fontSize: 16,
|
||||
color: ColorsManager
|
||||
.onPrimaryColor,
|
||||
),
|
||||
children: [
|
||||
WidgetSpan(
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(
|
||||
builder: (context) =>
|
||||
const UserAgreement(),
|
||||
));
|
||||
},
|
||||
child: BodyMedium(
|
||||
text: 'Terms & Conditions',
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
decoration:
|
||||
TextDecoration
|
||||
.underline,
|
||||
decorationColor:
|
||||
ColorsManager
|
||||
.onPrimaryColor,
|
||||
color: ColorsManager
|
||||
.onPrimaryColor,
|
||||
fontSize: 16),
|
||||
),
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: ' and ',
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium!
|
||||
.copyWith(
|
||||
fontSize: 16,
|
||||
color: ColorsManager
|
||||
.onPrimaryColor,
|
||||
)),
|
||||
WidgetSpan(
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(
|
||||
builder: (context) =>
|
||||
const PrivacyPolicy(),
|
||||
));
|
||||
},
|
||||
child: BodyMedium(
|
||||
text: 'Privacy Policy',
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall
|
||||
?.copyWith(
|
||||
decoration:
|
||||
TextDecoration
|
||||
.underline,
|
||||
decorationColor:
|
||||
Colors.white,
|
||||
color: ColorsManager
|
||||
.onPrimaryColor,
|
||||
fontSize: 16),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 40),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
@ -10,12 +10,17 @@ class ForgetPassword extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool isforget = true;
|
||||
return Row(
|
||||
children: [
|
||||
const Spacer(),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.push(context, MaterialPageRoute(builder: (context) => const checkEmailPage(),));
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => CheckEmailPage(forget: isforget),
|
||||
));
|
||||
},
|
||||
child: BodyMedium(
|
||||
text: "Forgot Password?",
|
||||
|
@ -2,6 +2,7 @@ import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.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/utils/context_extension.dart';
|
||||
|
||||
|
19
lib/features/common/bloc/project_cubit.dart
Normal file
@ -0,0 +1,19 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
|
||||
class ProjectCubit extends Cubit<String?> {
|
||||
final FlutterSecureStorage storage;
|
||||
static const String projectKey = "selected_project_uuid";
|
||||
|
||||
ProjectCubit(this.storage) : super(null);
|
||||
|
||||
Future<void> setProjectUUID(String newUUID) async {
|
||||
await storage.write(key: projectKey, value: newUUID);
|
||||
emit(newUUID);
|
||||
}
|
||||
|
||||
Future<void> clearProjectUUID() async {
|
||||
await storage.delete(key: projectKey);
|
||||
emit(null);
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@ import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||
|
||||
import 'widgets/energy_usage.dart';
|
||||
// import 'widgets/energy_usage.dart';
|
||||
|
||||
class DashboardView extends StatelessWidget {
|
||||
const DashboardView({super.key});
|
||||
@ -29,7 +29,7 @@ class DashboardView extends StatelessWidget {
|
||||
),
|
||||
const LiveMonitorTab(),
|
||||
const SizedBox(height: 10),
|
||||
const EnergyUsage(),
|
||||
// const EnergyUsage(),
|
||||
Container(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
constraints: const BoxConstraints(
|
||||
|
@ -1,178 +1,178 @@
|
||||
import 'package:fl_chart/fl_chart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncrow_app/features/dashboard/view/widgets/energy_usage_header.dart';
|
||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
// import 'package:fl_chart/fl_chart.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:syncrow_app/features/dashboard/view/widgets/energy_usage_header.dart';
|
||||
// import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||
// import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||
|
||||
class EnergyUsage extends StatelessWidget {
|
||||
const EnergyUsage({
|
||||
super.key,
|
||||
});
|
||||
// class EnergyUsage extends StatelessWidget {
|
||||
// const EnergyUsage({
|
||||
// super.key,
|
||||
// });
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const EnergyUsageHeader(),
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxHeight: 150,
|
||||
minHeight: 150,
|
||||
),
|
||||
child: LineChart(
|
||||
LineChartData(
|
||||
gridData: FlGridData(
|
||||
show: true,
|
||||
drawHorizontalLine: true,
|
||||
horizontalInterval: 2,
|
||||
drawVerticalLine: false,
|
||||
getDrawingHorizontalLine: (value) {
|
||||
return FlLine(
|
||||
color: Colors.grey.withOpacity(.5),
|
||||
strokeWidth: 1,
|
||||
);
|
||||
},
|
||||
),
|
||||
titlesData: FlTitlesData(
|
||||
show: true,
|
||||
rightTitles: AxisTitles(
|
||||
sideTitles: SideTitles(
|
||||
showTitles: true,
|
||||
interval: 1,
|
||||
getTitlesWidget: leftTitleWidgets,
|
||||
reservedSize: 25,
|
||||
),
|
||||
),
|
||||
topTitles: const AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
bottomTitles: AxisTitles(
|
||||
sideTitles: SideTitles(
|
||||
showTitles: true,
|
||||
reservedSize: 30,
|
||||
interval: 12,
|
||||
getTitlesWidget: (value, meta) {
|
||||
switch (value.toInt()) {
|
||||
case 0:
|
||||
return SideTitleWidget(
|
||||
axisSide: meta.axisSide,
|
||||
child: const BodySmall(text: '1'),
|
||||
);
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return DecoratedBox(
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.white,
|
||||
// borderRadius: BorderRadius.circular(15),
|
||||
// ),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
|
||||
// child: Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.start,
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// const EnergyUsageHeader(),
|
||||
// ConstrainedBox(
|
||||
// constraints: const BoxConstraints(
|
||||
// maxHeight: 150,
|
||||
// minHeight: 150,
|
||||
// ),
|
||||
// child: LineChart(
|
||||
// LineChartData(
|
||||
// gridData: FlGridData(
|
||||
// show: true,
|
||||
// drawHorizontalLine: true,
|
||||
// horizontalInterval: 2,
|
||||
// drawVerticalLine: false,
|
||||
// getDrawingHorizontalLine: (value) {
|
||||
// return FlLine(
|
||||
// color: Colors.grey.withOpacity(.5),
|
||||
// strokeWidth: 1,
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// titlesData: FlTitlesData(
|
||||
// show: true,
|
||||
// rightTitles: AxisTitles(
|
||||
// sideTitles: SideTitles(
|
||||
// showTitles: true,
|
||||
// interval: 1,
|
||||
// getTitlesWidget: leftTitleWidgets,
|
||||
// reservedSize: 25,
|
||||
// ),
|
||||
// ),
|
||||
// topTitles: const AxisTitles(
|
||||
// sideTitles: SideTitles(showTitles: false),
|
||||
// ),
|
||||
// bottomTitles: AxisTitles(
|
||||
// sideTitles: SideTitles(
|
||||
// showTitles: true,
|
||||
// reservedSize: 30,
|
||||
// interval: 12,
|
||||
// getTitlesWidget: (value, meta) {
|
||||
// switch (value.toInt()) {
|
||||
// case 0:
|
||||
// return SideTitleWidget(
|
||||
// axisSide: meta.axisSide,
|
||||
// child: const BodySmall(text: '1'),
|
||||
// );
|
||||
|
||||
case 11:
|
||||
return SideTitleWidget(
|
||||
axisSide: meta.axisSide,
|
||||
child: const BodySmall(text: '28'),
|
||||
);
|
||||
default:
|
||||
return Container();
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
leftTitles: const AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
),
|
||||
minX: 0,
|
||||
maxX: 11,
|
||||
minY: 0,
|
||||
maxY: 6,
|
||||
lineBarsData: [
|
||||
LineChartBarData(
|
||||
spots: const [
|
||||
FlSpot(0, 3),
|
||||
FlSpot(2.6, 2),
|
||||
FlSpot(4.9, 5),
|
||||
FlSpot(6.8, 3.1),
|
||||
FlSpot(8, 4),
|
||||
FlSpot(9.5, 3),
|
||||
FlSpot(11, 4),
|
||||
],
|
||||
isCurved: true,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
ColorsManager.primaryColor,
|
||||
ColorsManager.primaryColor.withOpacity(0.3),
|
||||
],
|
||||
),
|
||||
barWidth: 5,
|
||||
isStrokeCapRound: true,
|
||||
dotData: const FlDotData(
|
||||
show: false,
|
||||
),
|
||||
belowBarData: BarAreaData(
|
||||
show: true,
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
ColorsManager.primaryColor.withOpacity(0.5),
|
||||
ColorsManager.primaryColor.withOpacity(0.1),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
// case 11:
|
||||
// return SideTitleWidget(
|
||||
// axisSide: meta.axisSide,
|
||||
// child: const BodySmall(text: '28'),
|
||||
// );
|
||||
// default:
|
||||
// return Container();
|
||||
// }
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// leftTitles: const AxisTitles(
|
||||
// sideTitles: SideTitles(showTitles: false),
|
||||
// ),
|
||||
// ),
|
||||
// minX: 0,
|
||||
// maxX: 11,
|
||||
// minY: 0,
|
||||
// maxY: 6,
|
||||
// lineBarsData: [
|
||||
// LineChartBarData(
|
||||
// spots: const [
|
||||
// FlSpot(0, 3),
|
||||
// FlSpot(2.6, 2),
|
||||
// FlSpot(4.9, 5),
|
||||
// FlSpot(6.8, 3.1),
|
||||
// FlSpot(8, 4),
|
||||
// FlSpot(9.5, 3),
|
||||
// FlSpot(11, 4),
|
||||
// ],
|
||||
// isCurved: true,
|
||||
// gradient: LinearGradient(
|
||||
// colors: [
|
||||
// ColorsManager.primaryColor,
|
||||
// ColorsManager.primaryColor.withOpacity(0.3),
|
||||
// ],
|
||||
// ),
|
||||
// barWidth: 5,
|
||||
// isStrokeCapRound: true,
|
||||
// dotData: const FlDotData(
|
||||
// show: false,
|
||||
// ),
|
||||
// belowBarData: BarAreaData(
|
||||
// show: true,
|
||||
// gradient: LinearGradient(
|
||||
// colors: [
|
||||
// ColorsManager.primaryColor.withOpacity(0.5),
|
||||
// ColorsManager.primaryColor.withOpacity(0.1),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget leftTitleWidgets(double value, TitleMeta meta) {
|
||||
String text;
|
||||
switch (value.toInt()) {
|
||||
case 1:
|
||||
text = '1K';
|
||||
break;
|
||||
case 3:
|
||||
text = '3k';
|
||||
break;
|
||||
case 5:
|
||||
text = '5k';
|
||||
break;
|
||||
default:
|
||||
return Container();
|
||||
}
|
||||
// Widget leftTitleWidgets(double value, TitleMeta meta) {
|
||||
// String text;
|
||||
// switch (value.toInt()) {
|
||||
// case 1:
|
||||
// text = '1K';
|
||||
// break;
|
||||
// case 3:
|
||||
// text = '3k';
|
||||
// break;
|
||||
// case 5:
|
||||
// text = '5k';
|
||||
// break;
|
||||
// default:
|
||||
// return Container();
|
||||
// }
|
||||
|
||||
return Center(child: BodySmall(text: text));
|
||||
}
|
||||
// return Center(child: BodySmall(text: text));
|
||||
// }
|
||||
|
||||
Widget bottomTitleWidgets(double value, TitleMeta meta) {
|
||||
// const style = TextStyle(
|
||||
// fontWeight: FontWeight.bold,
|
||||
// fontSize: 16,
|
||||
// );
|
||||
// Widget text;
|
||||
// switch (value.toInt()) {
|
||||
// case 2:
|
||||
// text = const Text('MAR', style: style);
|
||||
// break;
|
||||
// case 5:
|
||||
// text = const Text('JUN', style: style);
|
||||
// break;
|
||||
// case 8:
|
||||
// text = const Text('SEP', style: style);
|
||||
// break;
|
||||
// default:
|
||||
// text = const Text('', style: style);
|
||||
// break;
|
||||
// }
|
||||
// Widget bottomTitleWidgets(double value, TitleMeta meta) {
|
||||
// // const style = TextStyle(
|
||||
// // fontWeight: FontWeight.bold,
|
||||
// // fontSize: 16,
|
||||
// // );
|
||||
// // Widget text;
|
||||
// // switch (value.toInt()) {
|
||||
// // case 2:
|
||||
// // text = const Text('MAR', style: style);
|
||||
// // break;
|
||||
// // case 5:
|
||||
// // text = const Text('JUN', style: style);
|
||||
// // break;
|
||||
// // case 8:
|
||||
// // text = const Text('SEP', style: style);
|
||||
// // break;
|
||||
// // default:
|
||||
// // text = const Text('', style: style);
|
||||
// // break;
|
||||
// // }
|
||||
|
||||
return SideTitleWidget(
|
||||
axisSide: meta.axisSide,
|
||||
child: const BodySmall(text: 'Feb'),
|
||||
);
|
||||
}
|
||||
}
|
||||
// return SideTitleWidget(
|
||||
// axisSide: meta.axisSide,
|
||||
// child: const BodySmall(text: 'Feb'),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
401
lib/features/devices/bloc/6_scene_switch_bloc/6_scene_bloc.dart
Normal file
@ -0,0 +1,401 @@
|
||||
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/auth/model/project_model.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/constants/temp_const.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());
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
|
||||
event.unit.community.uuid, event.unit.id, project?.uuid ?? TempConst.projectIdDev);
|
||||
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) {
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
await HomeManagementAPI.assignDeviceToRoom(
|
||||
event.unit.community.uuid, event.unit.id, event.roomId, sixSceneId, project?.uuid ?? TempConst.projectIdDev);
|
||||
final devicesList = await DevicesAPI.getDevicesByRoomId(
|
||||
communityUuid: event.unit.community.uuid,
|
||||
spaceUuid: event.unit.id,
|
||||
roomId: event.roomId,
|
||||
projectId: project?.uuid ?? TempConst.projectIdDev);
|
||||
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 {
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
allScenes = await SceneApi.getScenesByUnitId(
|
||||
event.unitId, event.unit.community.uuid, project?.uuid ?? TempConst.projectIdDev,
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
177
lib/features/devices/bloc/6_scene_switch_bloc/6_scene_event.dart
Normal 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});
|
||||
}
|
125
lib/features/devices/bloc/6_scene_switch_bloc/6_scene_state.dart
Normal 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];
|
||||
}
|
@ -14,6 +14,7 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
final String acId;
|
||||
AcStatusModel deviceStatus = AcStatusModel(
|
||||
countdown1: 0,
|
||||
uuid: '',
|
||||
acSwitch: true,
|
||||
modeString: 'hot',
|
||||
@ -26,7 +27,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
bool allAcsPage = false;
|
||||
bool allAcsOn = true;
|
||||
bool allTempSame = true;
|
||||
int globalTemp = 25;
|
||||
int globalTemp = 250;
|
||||
Timer? _timer;
|
||||
|
||||
ACsBloc({required this.acId}) : super(AcsInitialState()) {
|
||||
@ -41,6 +42,12 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
on<IncreaseAllTemp>(_increaseAllTemp);
|
||||
on<DecreaseAllTemp>(_decreaseAllTemp);
|
||||
on<AcUpdated>(_onAcUpdated);
|
||||
on<OnClose>(_onClose);
|
||||
on<GetCounterEvent>(_getCounterValue);
|
||||
on<SetCounterValue>(_setCounterValue);
|
||||
on<TickTimer>(_onTickTimer);
|
||||
|
||||
// on<SetTimeOutValue>(_setTimeOutAlarm);
|
||||
}
|
||||
|
||||
void _fetchAcsStatus(AcsInitial event, Emitter<AcsState> emit) async {
|
||||
@ -61,11 +68,10 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
}
|
||||
deviceStatus =
|
||||
AcStatusModel.fromJson(response['productUuid'], statusModelList);
|
||||
deviceStatus = AcStatusModel.fromJson(response['productUuid'], statusModelList);
|
||||
emit(GetAcStatusState(acStatusModel: deviceStatus));
|
||||
Future.delayed(const Duration(milliseconds: 500));
|
||||
// _listenToChanges();
|
||||
_listenToChanges(acId);
|
||||
}
|
||||
} catch (e) {
|
||||
emit(AcsFailedState(errorMessage: e.toString()));
|
||||
@ -73,29 +79,38 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
}
|
||||
}
|
||||
|
||||
_listenToChanges() {
|
||||
StreamSubscription<DatabaseEvent>? _streamSubscription;
|
||||
|
||||
void _listenToChanges(acId) {
|
||||
try {
|
||||
_streamSubscription?.cancel();
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$acId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
stream.listen((DatabaseEvent event) {
|
||||
_streamSubscription = stream.listen((DatabaseEvent event) {
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
List<StatusModel> statusList = [];
|
||||
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList
|
||||
.add(StatusModel(code: element['code'], value: element['value']));
|
||||
statusList.add(StatusModel(code: element['code'], value: element['value']));
|
||||
});
|
||||
|
||||
deviceStatus =
|
||||
AcStatusModel.fromJson(usersMap['productUuid'], statusList);
|
||||
|
||||
add(AcUpdated());
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
_streamSubscription?.cancel();
|
||||
_streamSubscription = null;
|
||||
return super.close();
|
||||
}
|
||||
|
||||
_onAcUpdated(AcUpdated event, Emitter<AcsState> emit) {
|
||||
emit(GetAcStatusState(acStatusModel: deviceStatus));
|
||||
}
|
||||
@ -107,15 +122,16 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
HomeCubit.getInstance().selectedSpace?.id ?? '', 'AC');
|
||||
|
||||
for (int i = 0; i < devicesList.length; i++) {
|
||||
_listenToChanges(devicesList[i].uuid);
|
||||
var response =
|
||||
await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
|
||||
List<StatusModel> statusModelList = [];
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
}
|
||||
deviceStatusList.add(
|
||||
AcStatusModel.fromJson(response['productUuid'], statusModelList));
|
||||
deviceStatusList.add(AcStatusModel.fromJson(devicesList[i].uuid ?? '', statusModelList));
|
||||
}
|
||||
|
||||
_setAllAcsTempsAndSwitches();
|
||||
}
|
||||
|
||||
@ -124,10 +140,11 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (allAcsPage) {
|
||||
emit(AcsLoadingState());
|
||||
for (AcStatusModel ac in deviceStatusList) {
|
||||
if (ac.uuid == event.productId) {
|
||||
if (ac.uuid == event.deviceId) {
|
||||
ac.acSwitch = acSwitchValue;
|
||||
}
|
||||
}
|
||||
|
||||
_setAllAcsTempsAndSwitches();
|
||||
_emitAcsStatus(emit);
|
||||
} else {
|
||||
@ -136,8 +153,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
emit(AcModifyingState(acStatusModel: deviceStatus));
|
||||
}
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: event.deviceId, code: 'switch', value: acSwitchValue);
|
||||
await _runDeBouncerForOneDevice(deviceId: event.deviceId, code: 'switch', value: acSwitchValue);
|
||||
}
|
||||
|
||||
void _changeAllAcSwitch(ChangeAllSwitch event, Emitter<AcsState> emit) async {
|
||||
@ -198,8 +214,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
deviceStatus.childLock = lockValue;
|
||||
emit(AcModifyingState(acStatusModel: deviceStatus));
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: acId, code: 'child_lock', value: lockValue);
|
||||
await _runDeBouncerForOneDevice(deviceId: acId, code: 'child_lock', value: lockValue);
|
||||
}
|
||||
|
||||
void _increaseCoolTo(IncreaseCoolToTemp event, Emitter<AcsState> emit) async {
|
||||
@ -215,7 +230,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (allAcsPage) {
|
||||
emit(AcsLoadingState());
|
||||
for (AcStatusModel ac in deviceStatusList) {
|
||||
if (ac.uuid == event.productId) {
|
||||
if (ac.uuid == event.deviceId) {
|
||||
ac.tempSet = value;
|
||||
}
|
||||
}
|
||||
@ -227,8 +242,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
emit(AcModifyingState(acStatusModel: deviceStatus));
|
||||
}
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: event.deviceId, code: 'temp_set', value: value);
|
||||
await _runDeBouncerForOneDevice(deviceId: event.deviceId, code: 'temp_set', value: value);
|
||||
}
|
||||
|
||||
void _decreaseCoolTo(DecreaseCoolToTemp event, Emitter<AcsState> emit) async {
|
||||
@ -244,7 +258,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (allAcsPage) {
|
||||
emit(AcsLoadingState());
|
||||
for (AcStatusModel ac in deviceStatusList) {
|
||||
if (ac.uuid == event.productId) {
|
||||
if (ac.uuid == event.deviceId) {
|
||||
ac.tempSet = value;
|
||||
}
|
||||
}
|
||||
@ -256,8 +270,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
emit(AcModifyingState(acStatusModel: deviceStatus));
|
||||
}
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: event.deviceId, code: 'temp_set', value: value);
|
||||
await _runDeBouncerForOneDevice(deviceId: event.deviceId, code: 'temp_set', value: value);
|
||||
}
|
||||
|
||||
void _changeAcMode(ChangeAcMode event, Emitter<AcsState> emit) async {
|
||||
@ -265,7 +278,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (allAcsPage) {
|
||||
emit(AcsLoadingState());
|
||||
for (AcStatusModel ac in deviceStatusList) {
|
||||
if (ac.uuid == event.productId) {
|
||||
if (ac.uuid == event.deviceId) {
|
||||
ac.modeString = getACModeString(tempMode);
|
||||
ac.acMode = AcStatusModel.getACMode(getACModeString(tempMode));
|
||||
}
|
||||
@ -279,9 +292,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
}
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: event.deviceId,
|
||||
code: 'mode',
|
||||
value: getACModeString(tempMode));
|
||||
deviceId: event.deviceId, code: 'mode', value: getACModeString(tempMode));
|
||||
}
|
||||
|
||||
void _changeFanSpeed(ChangeFanSpeed event, Emitter<AcsState> emit) async {
|
||||
@ -292,25 +303,21 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (allAcsPage) {
|
||||
emit(AcsLoadingState());
|
||||
for (AcStatusModel ac in deviceStatusList) {
|
||||
if (ac.uuid == event.productId) {
|
||||
if (ac.uuid == event.deviceId) {
|
||||
ac.fanSpeedsString = getNextFanSpeedKey(fanSpeed);
|
||||
ac.acFanSpeed =
|
||||
AcStatusModel.getFanSpeed(getNextFanSpeedKey(fanSpeed));
|
||||
ac.acFanSpeed = AcStatusModel.getFanSpeed(getNextFanSpeedKey(fanSpeed));
|
||||
}
|
||||
}
|
||||
_emitAcsStatus(emit);
|
||||
} else {
|
||||
emit(AcChangeLoading(acStatusModel: deviceStatus));
|
||||
deviceStatus.fanSpeedsString = getNextFanSpeedKey(fanSpeed);
|
||||
deviceStatus.acFanSpeed =
|
||||
AcStatusModel.getFanSpeed(getNextFanSpeedKey(fanSpeed));
|
||||
deviceStatus.acFanSpeed = AcStatusModel.getFanSpeed(getNextFanSpeedKey(fanSpeed));
|
||||
emit(AcModifyingState(acStatusModel: deviceStatus));
|
||||
}
|
||||
|
||||
await _runDeBouncerForOneDevice(
|
||||
deviceId: event.deviceId,
|
||||
code: 'level',
|
||||
value: getNextFanSpeedKey(fanSpeed));
|
||||
deviceId: event.deviceId, code: 'level', value: getNextFanSpeedKey(fanSpeed));
|
||||
}
|
||||
|
||||
String getACModeString(TempModes value) {
|
||||
@ -329,17 +336,15 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
allAcsOn = true;
|
||||
allTempSame = true;
|
||||
if (deviceStatusList.isNotEmpty) {
|
||||
int temp = deviceStatusList[0].tempSet;
|
||||
deviceStatusList.firstWhere((element) {
|
||||
int temp = deviceStatusList.first.tempSet;
|
||||
for (var element in deviceStatusList) {
|
||||
if (!element.acSwitch) {
|
||||
allAcsOn = false;
|
||||
}
|
||||
if (element.tempSet != temp) {
|
||||
allTempSame = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
if (allTempSame) {
|
||||
globalTemp = temp;
|
||||
}
|
||||
@ -355,8 +360,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
for (int i = 0; i < deviceStatusList.length; i++) {
|
||||
try {
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: devicesList[i].uuid, code: code, value: value),
|
||||
DeviceControlModel(deviceId: devicesList[i].uuid, code: code, value: value),
|
||||
devicesList[i].uuid ?? '');
|
||||
} catch (_) {
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
@ -378,10 +382,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
_timer = Timer(const Duration(seconds: 1), () async {
|
||||
try {
|
||||
final response = await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: allAcsPage ? deviceId : acId,
|
||||
code: code,
|
||||
value: value),
|
||||
DeviceControlModel(deviceId: allAcsPage ? deviceId : acId, code: code, value: value),
|
||||
allAcsPage ? deviceId : acId);
|
||||
|
||||
if (!response['success']) {
|
||||
@ -398,8 +399,7 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
if (value >= 20 && value <= 30) {
|
||||
return true;
|
||||
} else {
|
||||
emit(const AcsFailedState(
|
||||
errorMessage: 'The temperature must be between 20 and 30'));
|
||||
emit(const AcsFailedState(errorMessage: 'The temperature must be between 20 and 30'));
|
||||
emit(GetAllAcsStatusState(
|
||||
allAcsStatues: deviceStatusList,
|
||||
allAcs: devicesList,
|
||||
@ -418,4 +418,74 @@ class ACsBloc extends Bloc<AcsEvent, AcsState> {
|
||||
allTempSame: allTempSame,
|
||||
temp: globalTemp));
|
||||
}
|
||||
|
||||
void _setCounterValue(SetCounterValue event, Emitter<AcsState> emit) async {
|
||||
emit(AcsLoadingState());
|
||||
int seconds = 0;
|
||||
try {
|
||||
seconds = event.seconds;
|
||||
final response = await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(deviceId: acId, code: 'countdown_time', value: event.duration), acId);
|
||||
|
||||
if (response['success'] ?? false) {
|
||||
deviceStatus.countdown1 = seconds;
|
||||
} else {
|
||||
emit(const AcsFailedState(errorMessage: 'Something went wrong'));
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
emit(AcsFailedState(errorMessage: e.toString()));
|
||||
return;
|
||||
}
|
||||
if (event.duration > 0) {
|
||||
_onStartTimer(seconds);
|
||||
} else {
|
||||
_timer?.cancel();
|
||||
emit(TimerRunComplete());
|
||||
}
|
||||
}
|
||||
|
||||
void _getCounterValue(GetCounterEvent event, Emitter<AcsState> emit) async {
|
||||
emit(AcsLoadingState());
|
||||
var response = await DevicesAPI.getDeviceStatus(acId);
|
||||
List<StatusModel> statusModelList = [];
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
}
|
||||
deviceStatus = AcStatusModel.fromJson(response['productUuid'], statusModelList);
|
||||
deviceStatus.countdown1;
|
||||
var duration;
|
||||
if (deviceStatus.countdown1 == 5) {
|
||||
duration = const Duration(minutes: 30);
|
||||
var countNum = duration.inSeconds;
|
||||
_onStartTimer(countNum);
|
||||
} else if (deviceStatus.countdown1 > 5) {
|
||||
duration = Duration(minutes: deviceStatus.countdown1 * 6);
|
||||
var countNum = duration.inSeconds;
|
||||
_onStartTimer(countNum);
|
||||
} else {
|
||||
_timer?.cancel();
|
||||
emit(TimerRunComplete());
|
||||
}
|
||||
}
|
||||
|
||||
void _onStartTimer(int seconds) {
|
||||
_timer?.cancel();
|
||||
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||
add(TickTimer(remainingTime: seconds - timer.tick));
|
||||
});
|
||||
}
|
||||
|
||||
void _onTickTimer(TickTimer event, Emitter<AcsState> emit) {
|
||||
if (event.remainingTime > 0) {
|
||||
emit(TimerRunInProgress(event.remainingTime));
|
||||
} else {
|
||||
_timer?.cancel();
|
||||
emit(TimerRunComplete());
|
||||
}
|
||||
}
|
||||
|
||||
void _onClose(OnClose event, Emitter<AcsState> emit) {
|
||||
_timer?.cancel(); // Cancel the timer
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,8 @@ class AcSwitch extends AcsEvent {
|
||||
final bool acSwitch;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const AcSwitch({required this.acSwitch, this.deviceId = '', this.productId = ''});
|
||||
const AcSwitch(
|
||||
{required this.acSwitch, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [acSwitch, deviceId, productId];
|
||||
@ -35,7 +36,8 @@ class IncreaseCoolToTemp extends AcsEvent {
|
||||
final double value;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const IncreaseCoolToTemp({required this.value, this.deviceId = '', this.productId = ''});
|
||||
const IncreaseCoolToTemp(
|
||||
{required this.value, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [value, deviceId];
|
||||
@ -46,7 +48,8 @@ class DecreaseCoolToTemp extends AcsEvent {
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
|
||||
const DecreaseCoolToTemp({required this.value, this.deviceId = '', this.productId = ''});
|
||||
const DecreaseCoolToTemp(
|
||||
{required this.value, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [value, deviceId];
|
||||
@ -56,7 +59,8 @@ class ChangeAcMode extends AcsEvent {
|
||||
final TempModes tempModes;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const ChangeAcMode({required this.tempModes, this.deviceId = '', this.productId = ''});
|
||||
const ChangeAcMode(
|
||||
{required this.tempModes, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [tempModes, deviceId, productId];
|
||||
@ -67,7 +71,8 @@ class ChangeFanSpeed extends AcsEvent {
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
|
||||
const ChangeFanSpeed({required this.fanSpeeds, this.deviceId = '', this.productId = ''});
|
||||
const ChangeFanSpeed(
|
||||
{required this.fanSpeeds, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [fanSpeeds, deviceId, productId];
|
||||
@ -104,3 +109,52 @@ class DecreaseAllTemp extends AcsEvent {
|
||||
@override
|
||||
List<Object> get props => [value];
|
||||
}
|
||||
|
||||
class SetCounterValue extends AcsEvent {
|
||||
final int duration;
|
||||
final String deviceCode;
|
||||
final int seconds;
|
||||
const SetCounterValue(
|
||||
{required this.duration,
|
||||
required this.deviceCode,
|
||||
required this.seconds});
|
||||
@override
|
||||
List<Object> get props => [duration, deviceCode, seconds];
|
||||
}
|
||||
|
||||
class SetTimeOutValue extends AcsEvent {
|
||||
final Duration duration;
|
||||
final String deviceCode;
|
||||
const SetTimeOutValue({required this.duration, required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [duration, deviceCode];
|
||||
}
|
||||
|
||||
class StartTimer extends AcsEvent {
|
||||
final int duration;
|
||||
|
||||
const StartTimer(this.duration);
|
||||
|
||||
@override
|
||||
List<Object> get props => [duration];
|
||||
}
|
||||
|
||||
class TickTimer extends AcsEvent {
|
||||
final int remainingTime;
|
||||
|
||||
const TickTimer({required this.remainingTime});
|
||||
|
||||
@override
|
||||
List<Object> get props => [remainingTime];
|
||||
}
|
||||
|
||||
class StopTimer extends AcsEvent {}
|
||||
|
||||
class GetCounterEvent extends AcsEvent {
|
||||
final String deviceCode;
|
||||
const GetCounterEvent({required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [deviceCode];
|
||||
}
|
||||
|
||||
class OnClose extends AcsEvent {}
|
||||
|
@ -63,3 +63,22 @@ class AcsFailedState extends AcsState {
|
||||
@override
|
||||
List<Object> get props => [errorMessage];
|
||||
}
|
||||
|
||||
class UpdateTimerState extends AcsState {
|
||||
final int seconds;
|
||||
const UpdateTimerState({required this.seconds});
|
||||
|
||||
@override
|
||||
List<Object> get props => [seconds];
|
||||
}
|
||||
|
||||
class TimerRunInProgress extends AcsState {
|
||||
final int remainingTime;
|
||||
|
||||
const TimerRunInProgress(this.remainingTime);
|
||||
|
||||
@override
|
||||
List<Object> get props => [remainingTime];
|
||||
}
|
||||
|
||||
class TimerRunComplete extends AcsState {}
|
||||
|
@ -1,3 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:firebase_database/firebase_database.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/ceiling_bloc/ceiling_sensor_event.dart';
|
||||
@ -5,6 +8,7 @@ import 'package:syncrow_app/features/devices/bloc/ceiling_bloc/ceiling_sensor_st
|
||||
import 'package:syncrow_app/features/devices/model/ceiling_sensor_model.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/status_model.dart';
|
||||
import 'package:syncrow_app/services/api/devices_api.dart';
|
||||
|
||||
@ -17,6 +21,7 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
||||
on<InitialEvent>(_fetchCeilingSensorStatus);
|
||||
on<ChangeValueEvent>(_changeValue);
|
||||
on<CeilingSensorUpdated>(_onCeilingSensorUpdated);
|
||||
on<ReportLogsInitial>(fetchLogsForLastMonth);
|
||||
}
|
||||
|
||||
void _fetchCeilingSensorStatus(
|
||||
@ -30,35 +35,49 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
||||
}
|
||||
deviceStatus = CeilingSensorModel.fromJson(statusModelList);
|
||||
emit(UpdateState(ceilingSensorModel: deviceStatus));
|
||||
// _listenToChanges();
|
||||
_listenToChanges();
|
||||
} catch (e) {
|
||||
emit(FailedState(error: e.toString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_listenToChanges() {
|
||||
StreamSubscription<DatabaseEvent>? _streamSubscription;
|
||||
Timer? _timer;
|
||||
|
||||
void _listenToChanges() {
|
||||
try {
|
||||
_streamSubscription?.cancel();
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$deviceId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
stream.listen((DatabaseEvent event) {
|
||||
_streamSubscription = stream.listen((DatabaseEvent event) async {
|
||||
if (_timer != null) {
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
List<StatusModel> statusList = [];
|
||||
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList
|
||||
.add(StatusModel(code: element['code'], value: element['value']));
|
||||
});
|
||||
|
||||
deviceStatus = CeilingSensorModel.fromJson(statusList);
|
||||
add(CeilingSensorUpdated());
|
||||
if (!isClosed) {
|
||||
add(CeilingSensorUpdated());
|
||||
}
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
_streamSubscription?.cancel();
|
||||
_streamSubscription = null;
|
||||
return super.close();
|
||||
}
|
||||
|
||||
_onCeilingSensorUpdated(
|
||||
CeilingSensorUpdated event, Emitter<CeilingSensorState> emit) {
|
||||
emit(UpdateState(ceilingSensorModel: deviceStatus));
|
||||
@ -72,11 +91,49 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
||||
DeviceControlModel(
|
||||
deviceId: deviceId, code: event.code, value: event.value),
|
||||
deviceId);
|
||||
|
||||
if (response['success'] ?? false) {
|
||||
deviceStatus.sensitivity = event.value;
|
||||
}
|
||||
if (event.type == 'Sensitivity') {
|
||||
deviceStatus.sensitivity = event.value;
|
||||
} else if (event.type == 'Maximum Distance') {
|
||||
deviceStatus.movingMaxDis = event.value;
|
||||
} else if (event.type == 'Nobody Time') {
|
||||
deviceStatus.nobodyTime = event.value;
|
||||
} else if (event.type == 'Space Type') {
|
||||
deviceStatus.spaceType = SpaceTypes.values.firstWhere(
|
||||
(e) => e.name == event.value,
|
||||
orElse: () => SpaceTypes.none,
|
||||
);
|
||||
}
|
||||
} //scene
|
||||
emit(UpdateState(ceilingSensorModel: deviceStatus));
|
||||
} catch (_) {}
|
||||
emit(UpdateState(ceilingSensorModel: deviceStatus));
|
||||
}
|
||||
|
||||
DeviceReport recordGroups =
|
||||
DeviceReport(startTime: '0', endTime: '0', data: []);
|
||||
|
||||
Future<void> fetchLogsForLastMonth(
|
||||
ReportLogsInitial event, Emitter<CeilingSensorState> 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(LoadingInitialState());
|
||||
var response = await DevicesAPI.getReportLogs(
|
||||
startTime: startTime.toString(),
|
||||
endTime: endTime.toString(),
|
||||
deviceUuid: deviceId,
|
||||
code: 'presence_state',
|
||||
);
|
||||
recordGroups = response;
|
||||
// print('---${jsonEncode(recordGroups.data.first.)}');
|
||||
emit(FitchData());
|
||||
} on DioException catch (e) {
|
||||
final errorData = e.response!.data;
|
||||
String errorMessage = errorData['message'];
|
||||
emit(FailedState(error: errorMessage));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,10 +14,16 @@ class InitialEvent extends CeilingSensorEvent {}
|
||||
class CeilingSensorUpdated extends CeilingSensorEvent {}
|
||||
|
||||
class ChangeValueEvent extends CeilingSensorEvent {
|
||||
final int value;
|
||||
final dynamic value;
|
||||
final String code;
|
||||
const ChangeValueEvent({required this.value, required this.code});
|
||||
final String type;
|
||||
|
||||
const ChangeValueEvent({required this.value, required this.code,required this.type});
|
||||
|
||||
@override
|
||||
List<Object> get props => [value, code];
|
||||
List<Object> get props => [value, code,type];
|
||||
}
|
||||
|
||||
class ReportLogsInitial extends CeilingSensorEvent {
|
||||
const ReportLogsInitial();
|
||||
}
|
||||
|
@ -10,6 +10,8 @@ class CeilingSensorState extends Equatable {
|
||||
|
||||
class InitialState extends CeilingSensorState {}
|
||||
|
||||
class FitchData extends CeilingSensorState {}
|
||||
|
||||
class LoadingInitialState extends CeilingSensorState {}
|
||||
|
||||
class UpdateState extends CeilingSensorState {
|
||||
|
@ -1,3 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'package:firebase_database/firebase_database.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/curtain_bloc/curtain_event.dart';
|
||||
@ -30,6 +32,7 @@ class CurtainBloc extends Bloc<CurtainEvent, CurtainState> {
|
||||
on<InitialWizardEvent>(_fetchWizardStatus);
|
||||
on<GroupAllOffEvent>(_groupAllOff);
|
||||
on<GroupAllOnEvent>(_groupAllOn);
|
||||
on<UpdateCurtainEvent>(_updateCurtain);
|
||||
}
|
||||
|
||||
Future<void> _onOpenCurtain(
|
||||
@ -161,7 +164,10 @@ class CurtainBloc extends Bloc<CurtainEvent, CurtainState> {
|
||||
void _fetchStatus(InitCurtain event, Emitter<CurtainState> emit) async {
|
||||
try {
|
||||
emit(CurtainLoadingState());
|
||||
_listenToChanges(curtainId);
|
||||
|
||||
var response = await DevicesAPI.getDeviceStatus(curtainId);
|
||||
|
||||
List<StatusModel> statusModelList = [];
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
@ -169,7 +175,6 @@ class CurtainBloc extends Bloc<CurtainEvent, CurtainState> {
|
||||
openPercentage = double.tryParse(statusModelList[1].value.toString())!;
|
||||
curtainWidth = 270 - (openPercentage / 100) * curtainOpeningSpace;
|
||||
blindHeight = 310 - (openPercentage / 100) * blindOpeningSpace;
|
||||
|
||||
emit(CurtainsOpening(
|
||||
curtainWidth: curtainWidth,
|
||||
blindHeight: blindHeight,
|
||||
@ -181,6 +186,76 @@ class CurtainBloc extends Bloc<CurtainEvent, CurtainState> {
|
||||
}
|
||||
}
|
||||
|
||||
StreamSubscription<DatabaseEvent>? _streamSubscription;
|
||||
|
||||
void _listenToChanges(curtainId) {
|
||||
try {
|
||||
_streamSubscription?.cancel();
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$curtainId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
_streamSubscription = stream.listen((DatabaseEvent event) {
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
List<StatusModel> statusList = [];
|
||||
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList
|
||||
.add(StatusModel(code: element['code'], value: element['value']));
|
||||
});
|
||||
openPercentage = double.tryParse(statusList[1].value.toString())!;
|
||||
curtainWidth = 270 - (openPercentage / 100) * curtainOpeningSpace;
|
||||
blindHeight = 310 - (openPercentage / 100) * blindOpeningSpace;
|
||||
add(UpdateCurtainEvent());
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
_streamSubscription?.cancel();
|
||||
_streamSubscription = null;
|
||||
return super.close();
|
||||
}
|
||||
|
||||
// _listenToChanges(curtainId) {
|
||||
// try {
|
||||
// print('curtainId=$curtainId');
|
||||
// DatabaseReference ref =
|
||||
// FirebaseDatabase.instance.ref('device-status/$curtainId');
|
||||
// Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
// stream.listen((DatabaseEvent event) async {
|
||||
// if (_timer != null) {
|
||||
// await Future.delayed(const Duration(seconds: 2));
|
||||
// }
|
||||
// Map<dynamic, dynamic> usersMap =
|
||||
// event.snapshot.value as Map<dynamic, dynamic>;
|
||||
// List<StatusModel> statusModelList = [];
|
||||
// for (var status in usersMap['status']) {
|
||||
// statusModelList.add(StatusModel.fromJson(status));
|
||||
// print('statusModelList==${statusModelList}');
|
||||
// }
|
||||
|
||||
// openPercentage = double.tryParse(statusModelList[1].value.toString())!;
|
||||
// curtainWidth = 270 - (openPercentage / 100) * curtainOpeningSpace;
|
||||
// blindHeight = 310 - (openPercentage / 100) * blindOpeningSpace;
|
||||
// add(UpdateCurtainEvent());
|
||||
// });
|
||||
// } catch (_) {}
|
||||
// }
|
||||
|
||||
_updateCurtain(UpdateCurtainEvent event, Emitter<CurtainState> emit) {
|
||||
curtainWidth = 270 - (openPercentage / 100) * curtainOpeningSpace;
|
||||
blindHeight = 310 - (openPercentage / 100) * blindOpeningSpace;
|
||||
emit(CurtainsOpening(
|
||||
curtainWidth: curtainWidth,
|
||||
blindHeight: blindHeight,
|
||||
openPercentage: openPercentage,
|
||||
));
|
||||
}
|
||||
|
||||
List<GroupCurtainModel> groupList = [];
|
||||
bool allSwitchesOn = true;
|
||||
List<DeviceModel> devicesList = [];
|
||||
|
@ -33,6 +33,7 @@ class InitCurtain extends CurtainEvent {}
|
||||
class PauseCurtain extends CurtainEvent {}
|
||||
class useCurtainEvent extends CurtainEvent {}
|
||||
class InitialWizardEvent extends CurtainEvent {}
|
||||
class UpdateCurtainEvent extends CurtainEvent {}
|
||||
|
||||
|
||||
class ChangeFirstWizardSwitchStatusEvent extends CurtainEvent {
|
||||
|
@ -2,13 +2,18 @@ import 'dart:async';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
|
||||
import 'package:syncrow_app/features/auth/model/project_model.dart';
|
||||
|
||||
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_state.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_category_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_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/utils/constants/temp_const.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
|
||||
class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
DeviceManagerBloc() : super(DeviceManagerState.initial()) {
|
||||
@ -25,11 +30,16 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
|
||||
static List<DevicesCategoryModel>? allCategories;
|
||||
|
||||
Future<void> _onFetchAllDevices(FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
|
||||
Future<void> _onFetchAllDevices(
|
||||
FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
|
||||
emit(state.copyWith(loading: true));
|
||||
try {
|
||||
final allDevices = await HomeManagementAPI.fetchDevicesByUnitId();
|
||||
emit(state.copyWith(devices: allDevices, loading: false));
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
final allDevices = await HomeManagementAPI.fetchDevicesByUnitId(
|
||||
project?.uuid ?? TempConst.projectIdDev);
|
||||
emit(state.copyWith(
|
||||
devices: _getOnlyImplementedDevices(allDevices), loading: false));
|
||||
} catch (e) {
|
||||
emit(state.copyWith(error: e.toString(), loading: false));
|
||||
}
|
||||
@ -39,21 +49,31 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
FetchDevicesByRoomId event, Emitter<DeviceManagerState> emit) async {
|
||||
emit(state.copyWith(loading: true));
|
||||
try {
|
||||
final devices = await DevicesAPI.getDevicesByRoomId(event.roomId);
|
||||
emit(state.copyWith(devices: devices, loading: false));
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
final devices = await DevicesAPI.getDevicesByRoomId(
|
||||
communityUuid: event.unit.community.uuid,
|
||||
spaceUuid: event.unit.id,
|
||||
roomId: event.roomId,
|
||||
projectId: project?.uuid ?? TempConst.projectIdDev);
|
||||
|
||||
emit(state.copyWith(
|
||||
devices: _getOnlyImplementedDevices(devices), loading: false));
|
||||
} catch (e) {
|
||||
emit(state.copyWith(error: e.toString(), loading: false));
|
||||
}
|
||||
}
|
||||
|
||||
void _onSelectCategory(SelectCategory event, Emitter<DeviceManagerState> emit) {
|
||||
void _onSelectCategory(
|
||||
SelectCategory event, Emitter<DeviceManagerState> emit) {
|
||||
for (var i = 0; i < allCategories!.length; i++) {
|
||||
allCategories![i].isSelected = i == event.index;
|
||||
}
|
||||
emit(state.copyWith(categoryChanged: true));
|
||||
}
|
||||
|
||||
void _onUnselectAllCategories(UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
|
||||
void _onUnselectAllCategories(
|
||||
UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
|
||||
for (var category in allCategories!) {
|
||||
category.isSelected = false;
|
||||
}
|
||||
@ -97,7 +117,8 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
_updateDevicesStatus(category, emit);
|
||||
}
|
||||
|
||||
void _onTurnOnOffDevice(TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
|
||||
void _onTurnOnOffDevice(
|
||||
TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
|
||||
var device = event.device;
|
||||
device.isOnline = !device.isOnline!;
|
||||
DevicesCategoryModel category = allCategories!.firstWhere((category) {
|
||||
@ -120,7 +141,8 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
emit(state.copyWith(categoryChanged: true)); // Set category changed state
|
||||
}
|
||||
|
||||
void _updateDevicesStatus(DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
|
||||
void _updateDevicesStatus(
|
||||
DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
|
||||
if (category.devices != null && category.devices!.isNotEmpty) {
|
||||
bool? tempStatus = category.devices![0].isOnline;
|
||||
for (var device in category.devices!) {
|
||||
@ -140,9 +162,27 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
|
||||
try {
|
||||
final deviceFunctions = await DevicesAPI.deviceFunctions(event.deviceId);
|
||||
|
||||
emit(state.copyWith(functionsLoading: false, deviceFunctions: deviceFunctions));
|
||||
emit(state.copyWith(
|
||||
functionsLoading: false, deviceFunctions: deviceFunctions));
|
||||
} catch (e) {
|
||||
emit(state.copyWith(functionsLoading: false, error: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
List<DeviceModel> _getOnlyImplementedDevices(List<DeviceModel> devices) {
|
||||
const allowedDeviceTypes = {
|
||||
DeviceType.AC,
|
||||
DeviceType.DoorLock,
|
||||
DeviceType.Gateway,
|
||||
DeviceType.WallSensor,
|
||||
DeviceType.CeilingSensor,
|
||||
DeviceType.ThreeGang,
|
||||
DeviceType.OneGang,
|
||||
DeviceType.TwoGang
|
||||
};
|
||||
|
||||
return devices
|
||||
.where((device) => allowedDeviceTypes.contains(device.productType))
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
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/device_category_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
@ -15,8 +16,9 @@ class FetchAllDevices extends DeviceManagerEvent {}
|
||||
|
||||
class FetchDevicesByRoomId extends DeviceManagerEvent {
|
||||
final String roomId;
|
||||
final SpaceModel unit;
|
||||
|
||||
const FetchDevicesByRoomId(this.roomId);
|
||||
const FetchDevicesByRoomId(this.roomId, this.unit);
|
||||
|
||||
@override
|
||||
List<Object> get props => [roomId];
|
||||
|
@ -0,0 +1,496 @@
|
||||
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/auth/model/project_model.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/constants/temp_const.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());
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
if (_hasSelectionChanged) {
|
||||
await HomeManagementAPI.assignDeviceToRoom(
|
||||
event.unit.community.uuid,
|
||||
event.unit.id,
|
||||
event.roomId,
|
||||
deviceId,
|
||||
project?.uuid ?? TempConst.projectIdDev);
|
||||
final devicesList = await DevicesAPI.getDevicesByRoomId(
|
||||
communityUuid: event.unit.community.uuid,
|
||||
spaceUuid: event.unit.id,
|
||||
roomId: event.roomId,
|
||||
projectId: project?.uuid ?? TempConst.projectIdDev);
|
||||
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());
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
|
||||
event.unit.community.uuid,
|
||||
event.unit.id,
|
||||
project?.uuid ?? TempConst.projectIdDev);
|
||||
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));
|
||||
}
|
||||
}
|
@ -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});
|
||||
}
|
@ -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});
|
||||
}
|
@ -1,10 +1,14 @@
|
||||
// ignore_for_file: constant_identifier_names, unused_import
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:firebase_database/firebase_database.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/space_model.dart';
|
||||
import 'package:syncrow_app/features/auth/model/project_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_category_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_model.dart';
|
||||
@ -19,18 +23,28 @@ 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/network_exception.dart';
|
||||
import 'package:syncrow_app/services/api/spaces_api.dart';
|
||||
import 'package:syncrow_app/utils/constants/temp_const.dart';
|
||||
import 'package:syncrow_app/utils/resource_manager/constants.dart';
|
||||
part 'devices_state.dart';
|
||||
|
||||
class DevicesCubit extends Cubit<DevicesState> {
|
||||
Future<void> _initializeDevices(SpaceModel selectedSpace) async {
|
||||
// Fetch devices for each room in the selected space
|
||||
for (var room in selectedSpace.subspaces) {
|
||||
await fetchDevicesByRoomId(selectedSpace, room.id!);
|
||||
}
|
||||
|
||||
// Fetch groups based on the selected space ID
|
||||
await fetchGroups(selectedSpace.id);
|
||||
await fetchAllDevices(selectedSpace);
|
||||
}
|
||||
|
||||
DevicesCubit._() : super(DevicesInitial()) {
|
||||
if (HomeCubit.getInstance().selectedSpace != null &&
|
||||
HomeCubit.getInstance().spaces!.isNotEmpty) {
|
||||
// fetchGroups(HomeCubit.getInstance().selectedSpace!.id!);
|
||||
for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) {
|
||||
fetchDevicesByRoomId(room.id!);
|
||||
}
|
||||
fetchGroups(HomeCubit.getInstance().selectedSpace?.id ?? '');
|
||||
final selectedSpace = HomeCubit.getInstance().selectedSpace;
|
||||
final spaces = HomeCubit.getInstance().spaces;
|
||||
|
||||
if (selectedSpace != null && spaces != null && spaces.isNotEmpty) {
|
||||
_initializeDevices(selectedSpace);
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,6 +66,43 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
}
|
||||
}
|
||||
|
||||
Timer? _timer;
|
||||
|
||||
final Map<String, StreamSubscription<DatabaseEvent>> _deviceSubscriptions =
|
||||
{};
|
||||
|
||||
void _listenToChanges(deviceId) {
|
||||
try {
|
||||
if (_deviceSubscriptions.containsKey(deviceId)) {
|
||||
_deviceSubscriptions[deviceId]?.cancel();
|
||||
_deviceSubscriptions.remove(deviceId);
|
||||
}
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$deviceId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
final subscription = stream.listen((DatabaseEvent event) async {
|
||||
if (_timer != null) {
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
// print('object-----${usersMap['status']}');
|
||||
List<StatusModel> statusList = [];
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList
|
||||
.add(StatusModel(code: element['code'], value: element['value']));
|
||||
});
|
||||
emitSafe(GetDevicesLoading());
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceId);
|
||||
if (deviceIndex != -1) {
|
||||
allDevices[deviceIndex].status = statusList;
|
||||
}
|
||||
emitSafe(GetDevicesSuccess(allDevices));
|
||||
});
|
||||
_deviceSubscriptions[deviceId] = subscription;
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
static DevicesCubit get(context) => BlocProvider.of(context);
|
||||
|
||||
List<DevicesCategoryModel>? allCategories;
|
||||
@ -87,10 +138,10 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
return const DoorsListView();
|
||||
case DeviceType.Curtain:
|
||||
return const CurtainListView();
|
||||
// case DeviceType.ThreeGang:
|
||||
// return const ThreeGangSwitchesView();
|
||||
// case DeviceType.Gateway:
|
||||
// return const GateWayView();
|
||||
// case DeviceType.ThreeGang:
|
||||
// return const ThreeGangSwitchesView();
|
||||
// case DeviceType.Gateway:
|
||||
// return const GateWayView();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
@ -101,18 +152,6 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
}
|
||||
|
||||
// Getter to retrieve all devices from HomeCubit
|
||||
List<DeviceModel> get allDevices {
|
||||
List<DeviceModel> devices = [];
|
||||
if (HomeCubit.getInstance().selectedSpace != null &&
|
||||
HomeCubit.getInstance().selectedSpace!.rooms != null) {
|
||||
for (var room in HomeCubit.getInstance().selectedSpace!.rooms!) {
|
||||
if (room.devices != null) {
|
||||
devices.addAll(room.devices!);
|
||||
}
|
||||
}
|
||||
}
|
||||
return devices;
|
||||
}
|
||||
|
||||
// DevicesCategoryModel? get chosenCategory {
|
||||
// for (var category in allCategories!) {
|
||||
@ -260,36 +299,36 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
}
|
||||
|
||||
///////////////////////// API CALLS //////////////////////////
|
||||
deviceControl(DeviceControlModel control, String deviceId) async {
|
||||
emitSafe(DeviceControlLoading(
|
||||
code: control.code,
|
||||
));
|
||||
try {
|
||||
var response = await DevicesAPI.controlDevice(control, deviceId);
|
||||
// deviceControl(DeviceControlModel control, String deviceId) async {
|
||||
// emitSafe(DeviceControlLoading(
|
||||
// code: control.code,
|
||||
// ));
|
||||
// try {
|
||||
// var response = await DevicesAPI.controlDevice(control, deviceId);
|
||||
|
||||
if (response['success'] ?? false) {
|
||||
emitSafe(DeviceControlSuccess(code: control.code));
|
||||
//this delay is to give tuya server time to update the status
|
||||
Future.delayed(const Duration(milliseconds: 400), () {
|
||||
fetchDevicesStatues(
|
||||
deviceId,
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.rooms!
|
||||
.indexOf(HomeCubit.getInstance().selectedRoom!),
|
||||
code: control.code);
|
||||
});
|
||||
} else {
|
||||
emitSafe(DeviceControlError('Failed to control the device'));
|
||||
}
|
||||
} catch (failure) {
|
||||
emitSafe(DeviceControlError(failure.toString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// if (response['success'] ?? false) {
|
||||
// emitSafe(DeviceControlSuccess(code: control.code));
|
||||
// //this delay is to give tuya server time to update the status
|
||||
// // Future.delayed(const Duration(milliseconds: 400), () {
|
||||
// fetchDevicesStatues(
|
||||
// deviceId,
|
||||
// HomeCubit.getInstance()
|
||||
// .selectedSpace!
|
||||
// .subspaces
|
||||
// .indexOf(HomeCubit.getInstance().selectedRoom!),
|
||||
// code: control.code);
|
||||
// // });
|
||||
// } else {
|
||||
// emitSafe(DeviceControlError('Failed to control the device'));
|
||||
// }
|
||||
// } catch (failure) {
|
||||
// emitSafe(DeviceControlError(failure.toString()));
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
fetchGroups(String spaceId) async {
|
||||
emitSafe(DevicesCategoriesLoading());
|
||||
emitSafe(GetDevicesLoading());
|
||||
try {
|
||||
allCategories = await DevicesAPI.fetchGroups(spaceId);
|
||||
} catch (e) {
|
||||
@ -303,20 +342,29 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
}
|
||||
}
|
||||
|
||||
fetchDevicesByRoomId(String? roomId) async {
|
||||
fetchDevicesByRoomId(SpaceModel? unit, String? roomId) async {
|
||||
if (roomId == null) return;
|
||||
|
||||
emitSafe(GetDevicesLoading());
|
||||
int roomIndex =
|
||||
HomeCubit.getInstance().selectedSpace!.rooms!.indexWhere((element) => element.id == roomId);
|
||||
int roomIndex = HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces
|
||||
.indexWhere((element) => element.id == roomId);
|
||||
try {
|
||||
HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices =
|
||||
await DevicesAPI.getDevicesByRoomId(roomId);
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces[roomIndex].devices =
|
||||
await DevicesAPI.getDevicesByRoomId(
|
||||
communityUuid: unit!.community.uuid,
|
||||
spaceUuid: unit.id,
|
||||
roomId: roomId,
|
||||
projectId: project?.uuid ?? TempConst.projectIdDev);
|
||||
} catch (e) {
|
||||
emitSafe(GetDevicesError(e.toString()));
|
||||
return;
|
||||
}
|
||||
final devices = HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices;
|
||||
final devices =
|
||||
HomeCubit.getInstance().selectedSpace!.subspaces[roomIndex].devices;
|
||||
emitSafe(GetDevicesSuccess(devices));
|
||||
|
||||
//get status for each device
|
||||
@ -333,7 +381,7 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
emitSafe(GetDeviceStatusLoading(code: code));
|
||||
int deviceIndex = HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.rooms![roomIndex]
|
||||
.subspaces[roomIndex]
|
||||
.devices!
|
||||
.indexWhere((element) => element.uuid == deviceUuid);
|
||||
List<StatusModel> statuses = [];
|
||||
@ -346,8 +394,11 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
emitSafe(GetDeviceStatusError(e.toString()));
|
||||
return;
|
||||
}
|
||||
HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices![deviceIndex].status =
|
||||
statuses;
|
||||
HomeCubit.getInstance()
|
||||
.selectedSpace!
|
||||
.subspaces[roomIndex]
|
||||
.devices![deviceIndex]
|
||||
.status = statuses;
|
||||
emitSafe(GetDeviceStatusSuccess(code: code));
|
||||
}
|
||||
|
||||
@ -396,8 +447,365 @@ class DevicesCubit extends Cubit<DevicesState> {
|
||||
// emitSafe(LightBrightnessChanged(value));
|
||||
// }
|
||||
// }
|
||||
// List<DeviceModel> _fetchedDevices = [];
|
||||
|
||||
// List<DeviceModel> get allDevices => _fetchedDevices;
|
||||
List<DeviceModel> allDevices = [];
|
||||
|
||||
Future<void> fetchAllDevices(SpaceModel? unit) async {
|
||||
emitSafe(GetDevicesLoading());
|
||||
try {
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
final devices = await DevicesAPI.getAllDevices(
|
||||
communityUuid: unit!.community.uuid,
|
||||
spaceUuid: unit.id,
|
||||
projectId: project?.uuid ?? TempConst.projectIdDev);
|
||||
allDevices = devices;
|
||||
for (var deviceId in allDevices) {
|
||||
if (deviceId.type == "3G" ||
|
||||
deviceId.type == "2G" ||
|
||||
deviceId.type == "1G" ||
|
||||
deviceId.type == "3GT" ||
|
||||
deviceId.type == "2GT" ||
|
||||
deviceId.type == "1GT" ||
|
||||
deviceId.type == "WH" ||
|
||||
deviceId.type == "CUR" ||
|
||||
deviceId.type == "AC") {
|
||||
_listenToChanges(deviceId.uuid);
|
||||
}
|
||||
}
|
||||
emitSafe(GetDevicesSuccess(allDevices));
|
||||
} catch (e) {
|
||||
emitSafe(GetDevicesError(e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
bool isDeviceOn(DeviceModel device) {
|
||||
final switchStatuses = device.status.where(
|
||||
(s) => (s.code?.startsWith('switch') ?? false),
|
||||
);
|
||||
final anySwitchFalse = switchStatuses.any((s) => s.value == false);
|
||||
return !anySwitchFalse;
|
||||
}
|
||||
|
||||
void updateDeviceStatus(String deviceId, bool newToggleStatus) {
|
||||
emitSafe(GetDevicesLoading());
|
||||
|
||||
// Create a fresh copy of the device list.
|
||||
final updatedDevices = List<DeviceModel>.from(allDevices);
|
||||
|
||||
for (int i = 0; i < updatedDevices.length; i++) {
|
||||
final device = updatedDevices[i];
|
||||
if (device.uuid == deviceId) {
|
||||
updatedDevices[i] = DeviceModel(
|
||||
activeTime: device.activeTime,
|
||||
localKey: device.localKey,
|
||||
model: device.model,
|
||||
name: device.name,
|
||||
icon: device.icon,
|
||||
categoryName: device.categoryName,
|
||||
type: device.type,
|
||||
isOnline: device.isOnline,
|
||||
status: device.status, // Make sure to keep the same status list
|
||||
productName: device.productName,
|
||||
timeZone: device.timeZone,
|
||||
updateTime: device.updateTime,
|
||||
uuid: device.uuid,
|
||||
productUuid: device.productUuid,
|
||||
productType: device.productType,
|
||||
subspace: device.subspace,
|
||||
toggleStatus: newToggleStatus,
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
emit(GetDevicesSuccess(updatedDevices));
|
||||
}
|
||||
|
||||
Future<void> threeGangToggle(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
final switches = ['switch_1', 'switch_2', 'switch_3'];
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
final targetState = anySwitchOff ? true : false;
|
||||
|
||||
for (final switchCode in switches) {
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == switchCode);
|
||||
if (statusIndex != -1) {
|
||||
final currentValue = device.status[statusIndex].value ?? false;
|
||||
|
||||
if (!targetState && !currentValue) {
|
||||
continue;
|
||||
}
|
||||
final controlRequest = DeviceControlModel(
|
||||
code: switchCode, value: targetState, deviceId: deviceUuid);
|
||||
final response =
|
||||
await DevicesAPI.controlDevice(controlRequest, deviceUuid);
|
||||
if (response['success'] != true) {
|
||||
throw Exception('Failed to toggle $switchCode');
|
||||
}
|
||||
|
||||
device.status[statusIndex].value = targetState;
|
||||
}
|
||||
}
|
||||
device.toggleStatus = device.status.every(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == true),
|
||||
);
|
||||
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> towGangToggle(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
final switches = [
|
||||
'switch_1',
|
||||
'switch_2',
|
||||
];
|
||||
for (final switchCode in switches) {
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == switchCode);
|
||||
if (statusIndex != -1) {
|
||||
final toggledValue = control.value;
|
||||
final controlRequest = DeviceControlModel(
|
||||
code: switchCode, value: toggledValue, deviceId: deviceUuid);
|
||||
final response =
|
||||
await DevicesAPI.controlDevice(controlRequest, deviceUuid);
|
||||
|
||||
device.status[statusIndex].value = response['result'];
|
||||
}
|
||||
}
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
device.toggleStatus = !anySwitchOff;
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> towGTGangToggle(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
final switches = [
|
||||
'switch_1',
|
||||
'switch_2',
|
||||
];
|
||||
for (final switchCode in switches) {
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == switchCode);
|
||||
if (statusIndex != -1) {
|
||||
final toggledValue = control.value;
|
||||
final controlRequest = DeviceControlModel(
|
||||
code: switchCode, value: toggledValue, deviceId: deviceUuid);
|
||||
final response =
|
||||
await DevicesAPI.controlDevice(controlRequest, deviceUuid);
|
||||
|
||||
device.status[statusIndex].value = response['result'];
|
||||
}
|
||||
}
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
device.toggleStatus = !anySwitchOff;
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> oneGangToggle(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
|
||||
final statusIndex = device.status.indexWhere((s) => s.code == 'switch_1');
|
||||
if (statusIndex != -1) {
|
||||
final toggledValue = control.value;
|
||||
final controlRequest = DeviceControlModel(
|
||||
code: 'switch_1', value: toggledValue, deviceId: deviceUuid);
|
||||
final response =
|
||||
await DevicesAPI.controlDevice(controlRequest, deviceUuid);
|
||||
if (response['result'] != true) {
|
||||
throw Exception('Failed to toggle switch_1');
|
||||
}
|
||||
device.status[statusIndex].value = response['result'];
|
||||
}
|
||||
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
device.toggleStatus = !anySwitchOff;
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> oneGTGangToggle(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
|
||||
final statusIndex = device.status.indexWhere((s) => s.code == 'switch_1');
|
||||
if (statusIndex != -1) {
|
||||
final currentValue = device.status[statusIndex].value ?? false;
|
||||
final toggledValue = !currentValue;
|
||||
final controlRequest = DeviceControlModel(
|
||||
code: 'switch_1', value: toggledValue, deviceId: deviceUuid);
|
||||
final response =
|
||||
await DevicesAPI.controlDevice(controlRequest, deviceUuid);
|
||||
if (response['result'] != true) {
|
||||
throw Exception('Failed to toggle switch_1');
|
||||
}
|
||||
device.status[statusIndex].value = response['result'];
|
||||
}
|
||||
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) => (s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
device.toggleStatus = !anySwitchOff;
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> deviceControl(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final response = await DevicesAPI.controlDevice(control, deviceUuid);
|
||||
if (response['success'] == true) {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex != -1) {
|
||||
final device = allDevices[deviceIndex];
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == control.code);
|
||||
if (statusIndex != -1) {
|
||||
device.status[statusIndex].value = control.value;
|
||||
}
|
||||
final anySwitchOff = device.status.any(
|
||||
(s) =>
|
||||
(s.code?.startsWith('switch_') ?? false) && (s.value == false),
|
||||
);
|
||||
device.toggleStatus = !anySwitchOff;
|
||||
allDevices[deviceIndex] = device;
|
||||
}
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} else {
|
||||
emit(DeviceControlError('Failed to control the device'));
|
||||
}
|
||||
} catch (failure) {
|
||||
emit(DeviceControlError(failure.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> changeCurtainSwitch(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
final isOpen = control.value == "open";
|
||||
final newValue = isOpen ? 0 : 100;
|
||||
final response = await DevicesAPI.deviceBatchController(
|
||||
code: 'percent_control',
|
||||
devicesUuid: [deviceUuid],
|
||||
value: newValue,
|
||||
);
|
||||
if (response['success'] == true) {
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == 'percent_control');
|
||||
if (statusIndex != -1) {
|
||||
device.status[statusIndex].value = newValue;
|
||||
}
|
||||
allDevices[deviceIndex] = device;
|
||||
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} else {
|
||||
emit(DeviceControlError('Failed to toggle curtain.'));
|
||||
}
|
||||
} catch (error) {
|
||||
emit(DeviceControlError(error.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> changeGarageSwitch(
|
||||
DeviceControlModel control, String deviceUuid) async {
|
||||
emit(SwitchControlLoading(code: control.code));
|
||||
try {
|
||||
final deviceIndex = allDevices.indexWhere((d) => d.uuid == deviceUuid);
|
||||
if (deviceIndex == -1) {
|
||||
throw Exception('Device not found');
|
||||
}
|
||||
final device = allDevices[deviceIndex];
|
||||
final isOpen = control.value == "open";
|
||||
final newValue = isOpen ? 0 : 100;
|
||||
final response = await DevicesAPI.deviceBatchController(
|
||||
code: 'percent_control',
|
||||
devicesUuid: [deviceUuid],
|
||||
value: newValue,
|
||||
);
|
||||
if (response['success'] == true) {
|
||||
final statusIndex =
|
||||
device.status.indexWhere((s) => s.code == 'percent_control');
|
||||
if (statusIndex != -1) {
|
||||
device.status[statusIndex].value = newValue;
|
||||
}
|
||||
allDevices[deviceIndex] = device;
|
||||
emit(DeviceControlSuccess(code: control.code));
|
||||
} else {
|
||||
emit(DeviceControlError('Failed to toggle curtain.'));
|
||||
}
|
||||
} catch (error) {
|
||||
emit(DeviceControlError(error.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum LightMode {
|
||||
|
@ -34,6 +34,7 @@ class GetDeviceStatusError extends DevicesState {
|
||||
}
|
||||
|
||||
class GetDevicesLoading extends DevicesState {}
|
||||
class RoomLoading extends DevicesState {}
|
||||
|
||||
class GetDevicesSuccess extends DevicesState {
|
||||
GetDevicesSuccess(this.devices);
|
||||
@ -55,10 +56,16 @@ class DeviceSwitchChanged extends DevicesState {}
|
||||
class DeviceSelected extends DevicesState {}
|
||||
|
||||
// Device Control
|
||||
class DeviceControlLoading extends DevicesState {
|
||||
final String? code;
|
||||
// class DeviceControlLoading extends DevicesState {
|
||||
// final String? code;
|
||||
|
||||
DeviceControlLoading({this.code});
|
||||
// DeviceControlLoading({this.code});
|
||||
// }
|
||||
class SwitchControlLoading extends DevicesState {
|
||||
final String? code;
|
||||
final String? deviceId;
|
||||
|
||||
SwitchControlLoading({this.deviceId, this.code});
|
||||
}
|
||||
|
||||
class DeviceControlSuccess extends DevicesState {
|
||||
|
@ -21,7 +21,6 @@ class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
on<ToggleClosingReminderEvent>(_toggleClosingReminder);
|
||||
on<ToggleDoorAlarmEvent>(_toggleDoorAlarm);
|
||||
}
|
||||
Timer? _timer;
|
||||
bool lowBattery = false;
|
||||
bool closingReminder = false;
|
||||
bool doorAlarm = false;
|
||||
@ -42,7 +41,7 @@ class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
);
|
||||
emit(UpdateState(doorSensor: deviceStatus));
|
||||
Future.delayed(const Duration(milliseconds: 500));
|
||||
// _listenToChanges();
|
||||
_listenToChanges();
|
||||
} catch (e) {
|
||||
emit(DoorSensorFailedState(errorMessage: e.toString()));
|
||||
return;
|
||||
@ -126,9 +125,8 @@ class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
try {
|
||||
emit(DoorSensorLoadingState());
|
||||
var response = await DevicesAPI.getReportLogs(
|
||||
startTime:
|
||||
startTime.toString(),
|
||||
endTime: endTime.toString(),
|
||||
startTime: startTime.toString(),
|
||||
endTime: endTime.toString(),
|
||||
deviceUuid: DSId,
|
||||
code: 'doorcontact_state',
|
||||
);
|
||||
@ -140,24 +138,27 @@ class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
}
|
||||
}
|
||||
|
||||
_listenToChanges() {
|
||||
// real-time database
|
||||
Timer? _timer;
|
||||
StreamSubscription<DatabaseEvent>? _streamSubscription;
|
||||
void _listenToChanges() {
|
||||
try {
|
||||
_streamSubscription?.cancel();
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$DSId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
stream.listen((DatabaseEvent event) async {
|
||||
_streamSubscription = stream.listen((DatabaseEvent event) async {
|
||||
if (_timer != null) {
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
List<StatusModel> statusList = [];
|
||||
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList.add(StatusModel(code: element['code'], value: true));
|
||||
statusList
|
||||
.add(StatusModel(code: element['code'], value: element['value']));
|
||||
});
|
||||
|
||||
deviceStatus = DoorSensorModel.fromJson(statusList);
|
||||
if (!isClosed) {
|
||||
add(
|
||||
@ -167,4 +168,11 @@ class DoorSensorBloc extends Bloc<DoorSensorEvent, DoorSensorState> {
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
_streamSubscription?.cancel();
|
||||
_streamSubscription = null;
|
||||
return super.close();
|
||||
}
|
||||
}
|
||||
|
365
lib/features/devices/bloc/four_scene_bloc/four_scene_bloc.dart
Normal file
@ -0,0 +1,365 @@
|
||||
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/auth/model/project_model.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/constants/temp_const.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,
|
||||
);
|
||||
// _listenToChanges();
|
||||
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 {
|
||||
Project? project = HomeCubit.getInstance().project;
|
||||
|
||||
if (event.unitId.isNotEmpty) {
|
||||
allScenes = await SceneApi.getScenesByUnitId(
|
||||
event.unitId, event.unit.community.uuid, project?.uuid ?? TempConst.projectIdDev,
|
||||
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());
|
||||
}
|
||||
// Real-time database
|
||||
// Timer? _timer;
|
||||
// _listenToChanges() {
|
||||
// try {
|
||||
// DatabaseReference ref =
|
||||
// FirebaseDatabase.instance.ref('device-status/$fourSceneId');
|
||||
// Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
// stream.listen((DatabaseEvent event) async {
|
||||
// if (_timer != null) {
|
||||
// await Future.delayed(const Duration(seconds: 2));
|
||||
// }
|
||||
// Map<dynamic, dynamic> usersMap =
|
||||
// event.snapshot.value as Map<dynamic, dynamic>;
|
||||
// List<StatusModel> statusList = [];
|
||||
|
||||
// usersMap['status'].forEach((element) {
|
||||
// statusList.add(StatusModel(code: element['code'], value: true));
|
||||
// });
|
||||
|
||||
// deviceStatus = FourSceneModelState.fromJson(statusList);
|
||||
// // if (!isClosed) {
|
||||
// // add(
|
||||
// // DoorSensorSwitch(switchD: deviceStatus.doorContactState),
|
||||
// // );
|
||||
// // }
|
||||
// });
|
||||
// } catch (_) {}
|
||||
// }
|
||||
}
|