AC devices page implemented
AC Cubit Add New Devices Cubit Arch will be used Devices Cubit (for devices categories, and devices page) { AC cubit, Lights cubit. ... } Replaced AssetsManager with Assets Class (auto generated)
3
assets/icons/coldMode.svg
Normal file
After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
3
assets/icons/fan-0.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="42" height="13" viewBox="0 0 42 13" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M9.38086 12L8.31152 9.37793H3.00879L1.93945 12H0.218262L4.80322 1.021H6.51709L11.1021 12H9.38086ZM3.55811 8.0083H7.76221L5.66016 2.8667L3.55811 8.0083ZM16.1895 12.1978L16.1675 12.1904C14.7905 12.1904 13.6992 11.7803 12.8936 10.96C12.0879 10.1396 11.6851 9.03857 11.6851 7.65674V1.01367H13.2598V7.65674C13.2598 8.61377 13.5308 9.36328 14.0728 9.90527C14.6147 10.4473 15.3179 10.7183 16.1821 10.7183C17.0317 10.7183 17.7275 10.4473 18.2695 9.90527C18.8115 9.36328 19.0825 8.61621 19.0825 7.66406V1.021H20.6719V7.66406C20.6719 9.03125 20.269 10.1299 19.4634 10.96C18.6577 11.7852 17.5664 12.1978 16.1895 12.1978ZM29.6411 2.42725H26.4038V12H24.8071V2.42725H21.5698V1.021H29.6411V2.42725ZM35.5781 12.1978C33.8887 12.1978 32.519 11.6631 31.4692 10.5938C30.4243 9.5293 29.9019 8.16943 29.9019 6.51416C29.9019 4.86377 30.4243 3.50635 31.4692 2.44189C32.519 1.37256 33.8887 0.837891 35.5781 0.837891C37.2773 0.837891 38.6543 1.37256 39.709 2.44189C40.7637 3.51123 41.291 4.86865 41.291 6.51416C41.291 8.16455 40.7637 9.52441 39.709 10.5938C38.6543 11.6631 37.2773 12.1978 35.5781 12.1978ZM35.5928 2.31006L35.6074 2.32471C34.4355 2.32471 33.4614 2.7251 32.6851 3.52588C31.9087 4.32178 31.5205 5.31787 31.5205 6.51416C31.5205 7.72021 31.9087 8.72363 32.6851 9.52441C33.4614 10.3252 34.4331 10.7256 35.6001 10.7256C36.7769 10.7256 37.751 10.3252 38.5225 9.52441C39.2939 8.72363 39.6797 7.72021 39.6797 6.51416C39.6797 5.30811 39.2915 4.30713 38.5151 3.51123C37.7388 2.71045 36.7646 2.31006 35.5928 2.31006Z" fill="#2F66D3"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
12
assets/icons/fan-1.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M22.7139 13.5297C22.4113 14.7063 22.1357 15.466 22.1357 15.466L22.0954 15.5735C21.3261 15.0635 20.4232 14.7922 19.5002 14.7937C19.1842 14.794 18.8689 14.8255 18.559 14.8878L18.5052 14.787C18.5052 14.787 18.1691 14.081 17.5707 13.0591C17.5689 13.0591 17.5672 13.0584 17.5659 13.0572C17.5647 13.0559 17.564 13.0542 17.564 13.0524C16.8145 9.85279 15.2829 6.88908 13.1066 4.4268C11.6544 2.8805 12.0376 1.76449 12.6561 1.08546C13.1447 0.573977 13.7959 0.248354 14.4982 0.16441C25.4704 -1.43567 23.8635 9.06567 22.7139 13.5297Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M26.3443 37.9141C25.8558 38.4256 25.2045 38.7512 24.5022 38.8352C13.5099 40.442 15.1436 29.8868 16.2933 25.4429V25.4362C16.5958 24.2731 16.8647 23.5336 16.8647 23.5336L16.9051 23.426C17.6744 23.936 18.5772 24.2073 19.5002 24.2059C19.8163 24.2056 20.1315 24.174 20.4414 24.1118L20.4885 24.2126C20.4885 24.2126 20.8246 24.9253 21.4364 25.9606C22.1889 29.1551 23.7203 32.1138 25.8939 34.5728C27.3461 36.1191 26.9628 37.2351 26.3443 37.9141Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M24.2063 19.4998C24.2067 21.7365 22.6329 23.6645 20.4414 24.1118C20.1315 24.174 19.8162 24.2056 19.5001 24.2059C17.2634 24.2064 15.3354 22.6325 14.8881 20.441C14.8258 20.1311 14.7943 19.8159 14.7939 19.4998C14.7935 17.2631 16.3674 15.3352 18.5589 14.8878C18.8688 14.8256 19.184 14.794 19.5001 14.7937C21.7343 14.7939 23.6609 16.3638 24.1122 18.5519V18.5586C24.1744 18.8685 24.206 19.1837 24.2063 19.4998Z" fill="#ECF0F1"/>
|
||||||
|
<path d="M17.4833 20.1727C17.112 20.1727 16.8109 19.8716 16.8109 19.5003C16.8109 18.0148 18.0151 16.8106 19.5006 16.8106C19.8719 16.8106 20.173 17.1117 20.173 17.483C20.173 17.8544 19.8719 18.1554 19.5006 18.1554C18.7578 18.1554 18.1557 18.7575 18.1557 19.5003C18.1557 19.8716 17.8547 20.1727 17.4833 20.1727Z" fill="white"/>
|
||||||
|
<path d="M25.4703 22.7201C25.4636 22.7134 25.4636 22.7134 25.4569 22.7134C24.2871 22.4042 23.5341 22.1352 23.5341 22.1352L23.4265 22.0949C23.9365 21.3256 24.2078 20.4228 24.2064 19.4998C24.2061 19.1837 24.1745 18.8685 24.1123 18.5586V18.5519L24.2131 18.5115C24.2131 18.5115 24.9258 18.1754 25.9611 17.5636C29.1557 16.8111 32.1144 15.2798 34.5734 13.1062C36.1197 11.6541 37.2358 12.0373 37.9148 12.6558C38.4263 13.1443 38.7519 13.7956 38.8359 14.4979C40.436 25.4631 29.9278 23.8563 25.4703 22.7201Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M14.794 19.4998C14.7944 19.8159 14.8259 20.1311 14.8882 20.441L14.7806 20.4881C14.7806 20.4881 14.0612 20.8242 13.0259 21.436C13.0205 21.4412 13.0131 21.4436 13.0057 21.4427C9.82491 22.2017 6.87912 23.7299 4.42702 25.8934C2.8807 27.3455 1.76467 26.9623 1.08563 26.3438C0.57414 25.8553 0.248513 25.204 0.164567 24.5017C-1.43553 13.5365 9.05924 15.1366 13.5234 16.2795C13.5301 16.2862 13.5301 16.2862 13.5368 16.2862C14.7066 16.5887 15.4664 16.8644 15.4664 16.8644L15.5739 16.9047C15.0639 17.674 14.7926 18.5768 14.794 19.4998Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M37.3567 27.6817C37.3718 28.3895 37.1414 29.0808 36.7046 29.6381C30.0622 38.546 23.7626 29.9204 21.4364 25.9606C20.8246 24.9252 20.4885 24.2126 20.4885 24.2126L20.4414 24.1118C21.6641 23.8608 22.7374 23.1356 23.4265 22.0948L23.534 22.1352C23.534 22.1352 24.287 22.4041 25.4568 22.7134C25.4636 22.7134 25.4636 22.7134 25.4703 22.7201C28.2537 24.4304 31.4139 25.4322 34.6742 25.6379C36.7987 25.7051 37.3164 26.7606 37.3567 27.6817Z" fill="#2F66D3"/>
|
||||||
|
<path d="M18.559 14.8878C17.3356 15.137 16.2616 15.8627 15.5739 16.9047L15.4664 16.8644C15.4664 16.8644 14.7066 16.5887 13.5368 16.2862C13.5301 16.2862 13.5301 16.2862 13.5234 16.2795C10.74 14.5692 7.5798 13.5674 4.31944 13.3617C2.19494 13.2944 1.67726 12.2389 1.63692 11.3179C1.62186 10.61 1.85229 9.91874 2.28907 9.36148C8.93822 0.446776 15.2512 9.09929 17.564 13.0524C17.564 13.0561 17.567 13.0591 17.5707 13.0591C18.169 14.081 18.5052 14.7869 18.5052 14.7869L18.559 14.8878Z" fill="#2F66D3"/>
|
||||||
|
<path d="M16.9051 23.4261L16.8647 23.5336C16.8647 23.5336 16.5958 24.2732 16.2933 25.4362V25.443C14.5699 28.2335 13.5629 31.4067 13.362 34.6804C13.2948 36.7981 12.2325 37.3158 11.3182 37.3628C10.6101 37.379 9.91852 37.1484 9.36176 36.7107C0.467092 30.0886 9.03905 23.7891 13.0057 21.4428C13.0131 21.4437 13.0205 21.4412 13.0259 21.436C14.0612 20.8243 14.7806 20.4881 14.7806 20.4881L14.8882 20.441C15.1374 21.6644 15.863 22.7384 16.9051 23.4261Z" fill="#2F66D3"/>
|
||||||
|
<path d="M25.9611 17.5635C24.9258 18.1753 24.2131 18.5115 24.2131 18.5115L24.1123 18.5518C23.8603 17.3314 23.1351 16.2605 22.0953 15.5735L22.1357 15.4659C22.1357 15.4659 22.4113 14.7062 22.7139 13.5297C24.4272 10.7453 25.4292 7.58221 25.6317 4.3192C25.6989 2.20145 26.7612 1.68378 27.6755 1.63672C28.3836 1.62059 29.0752 1.85113 29.6319 2.28885C38.5468 8.93118 29.921 15.2374 25.9611 17.5635Z" fill="#2F66D3"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
12
assets/icons/fan-2.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M22.7139 13.5297C22.4113 14.7063 22.1357 15.466 22.1357 15.466L22.0954 15.5735C21.3261 15.0635 20.4232 14.7922 19.5002 14.7937C19.1842 14.794 18.8689 14.8255 18.559 14.8878L18.5052 14.787C18.5052 14.787 18.1691 14.081 17.5707 13.0591C17.5689 13.0591 17.5672 13.0584 17.5659 13.0572C17.5647 13.0559 17.564 13.0542 17.564 13.0524C16.8145 9.85279 15.2829 6.88908 13.1066 4.4268C11.6544 2.8805 12.0376 1.76449 12.6561 1.08546C13.1447 0.573977 13.7959 0.248354 14.4982 0.16441C25.4704 -1.43567 23.8635 9.06567 22.7139 13.5297Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M26.3443 37.9141C25.8558 38.4256 25.2045 38.7512 24.5022 38.8352C13.5099 40.442 15.1436 29.8868 16.2933 25.4429V25.4362C16.5958 24.2731 16.8647 23.5336 16.8647 23.5336L16.9051 23.426C17.6744 23.936 18.5772 24.2073 19.5002 24.2059C19.8163 24.2056 20.1315 24.174 20.4414 24.1118L20.4885 24.2126C20.4885 24.2126 20.8246 24.9253 21.4364 25.9606C22.1889 29.1551 23.7203 32.1138 25.8939 34.5728C27.3461 36.1191 26.9628 37.2351 26.3443 37.9141Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M24.2063 19.4998C24.2067 21.7365 22.6329 23.6645 20.4414 24.1118C20.1315 24.174 19.8162 24.2056 19.5001 24.2059C17.2634 24.2064 15.3354 22.6325 14.8881 20.441C14.8258 20.1311 14.7943 19.8159 14.7939 19.4998C14.7935 17.2631 16.3674 15.3352 18.5589 14.8878C18.8688 14.8256 19.184 14.794 19.5001 14.7937C21.7343 14.7939 23.6609 16.3638 24.1122 18.5519V18.5586C24.1744 18.8685 24.206 19.1837 24.2063 19.4998Z" fill="#ECF0F1"/>
|
||||||
|
<path d="M17.4833 20.1727C17.112 20.1727 16.8109 19.8716 16.8109 19.5003C16.8109 18.0148 18.0151 16.8106 19.5006 16.8106C19.8719 16.8106 20.173 17.1117 20.173 17.483C20.173 17.8544 19.8719 18.1554 19.5006 18.1554C18.7578 18.1554 18.1557 18.7575 18.1557 19.5003C18.1557 19.8716 17.8547 20.1727 17.4833 20.1727Z" fill="white"/>
|
||||||
|
<path d="M25.4703 22.7201C25.4636 22.7134 25.4636 22.7134 25.4568 22.7134C24.287 22.4042 23.534 22.1352 23.534 22.1352L23.4265 22.0949C23.9365 21.3256 24.2078 20.4228 24.2063 19.4998C24.206 19.1837 24.1745 18.8685 24.1122 18.5586V18.5519L24.2131 18.5115C24.2131 18.5115 24.9257 18.1754 25.9611 17.5636C29.1556 16.8111 32.1143 15.2798 34.5734 13.1062C36.1197 11.6541 37.2357 12.0373 37.9147 12.6558C38.4262 13.1443 38.7519 13.7956 38.8358 14.4979C40.4359 25.4631 29.9277 23.8563 25.4703 22.7201Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M14.794 19.4998C14.7944 19.8159 14.8259 20.1311 14.8882 20.441L14.7806 20.4881C14.7806 20.4881 14.0612 20.8242 13.0259 21.436C13.0205 21.4412 13.0131 21.4436 13.0057 21.4427C9.82491 22.2017 6.87912 23.7299 4.42702 25.8934C2.8807 27.3455 1.76467 26.9623 1.08563 26.3438C0.57414 25.8553 0.248513 25.204 0.164567 24.5017C-1.43553 13.5365 9.05924 15.1366 13.5234 16.2795C13.5301 16.2862 13.5301 16.2862 13.5368 16.2862C14.7066 16.5887 15.4664 16.8644 15.4664 16.8644L15.5739 16.9047C15.0639 17.674 14.7926 18.5768 14.794 19.4998Z" fill="#678BFE" fill-opacity="0.25"/>
|
||||||
|
<path d="M37.3567 27.6817C37.3718 28.3895 37.1414 29.0808 36.7046 29.6381C30.0622 38.546 23.7626 29.9204 21.4364 25.9606C20.8246 24.9252 20.4885 24.2126 20.4885 24.2126L20.4414 24.1118C21.6641 23.8608 22.7374 23.1356 23.4265 22.0948L23.534 22.1352C23.534 22.1352 24.287 22.4041 25.4568 22.7134C25.4636 22.7134 25.4636 22.7134 25.4703 22.7201C28.2537 24.4304 31.4139 25.4322 34.6742 25.6379C36.7987 25.7051 37.3164 26.7606 37.3567 27.6817Z" fill="#2F66D3"/>
|
||||||
|
<path d="M18.559 14.8878C17.3356 15.137 16.2616 15.8627 15.5739 16.9047L15.4664 16.8644C15.4664 16.8644 14.7066 16.5887 13.5368 16.2862C13.5301 16.2862 13.5301 16.2862 13.5234 16.2795C10.74 14.5692 7.5798 13.5674 4.31944 13.3617C2.19494 13.2944 1.67726 12.2389 1.63692 11.3179C1.62186 10.61 1.85229 9.91874 2.28907 9.36148C8.93822 0.446776 15.2512 9.09929 17.564 13.0524C17.564 13.0561 17.567 13.0591 17.5707 13.0591C18.169 14.081 18.5052 14.7869 18.5052 14.7869L18.559 14.8878Z" fill="#2F66D3"/>
|
||||||
|
<path d="M16.9051 23.4261L16.8647 23.5336C16.8647 23.5336 16.5958 24.2732 16.2933 25.4362V25.443C14.5699 28.2335 13.5629 31.4067 13.362 34.6804C13.2948 36.7981 12.2325 37.3158 11.3182 37.3628C10.6101 37.379 9.91852 37.1484 9.36176 36.7107C0.467092 30.0886 9.03905 23.7891 13.0057 21.4428C13.0131 21.4437 13.0205 21.4412 13.0259 21.436C14.0612 20.8243 14.7806 20.4881 14.7806 20.4881L14.8882 20.441C15.1374 21.6644 15.863 22.7384 16.9051 23.4261Z" fill="#2F66D3"/>
|
||||||
|
<path d="M25.9611 17.5635C24.9258 18.1753 24.2131 18.5115 24.2131 18.5115L24.1123 18.5518C23.8603 17.3314 23.1351 16.2605 22.0953 15.5735L22.1357 15.4659C22.1357 15.4659 22.4113 14.7062 22.7139 13.5297C24.4272 10.7453 25.4292 7.58221 25.6317 4.3192C25.6989 2.20145 26.7612 1.68378 27.6755 1.63672C28.3836 1.62059 29.0752 1.85113 29.6319 2.28885C38.5468 8.93118 29.921 15.2374 25.9611 17.5635Z" fill="#2F66D3"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
12
assets/icons/fan-3.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M22.7138 13.5297C22.4113 14.7063 22.1356 15.466 22.1356 15.466L22.0953 15.5735C21.326 15.0635 20.4232 14.7922 19.5002 14.7937C19.1841 14.794 18.8688 14.8255 18.5589 14.8878L18.5052 14.787C18.5052 14.787 18.169 14.081 17.5706 13.0591C17.5689 13.0591 17.5671 13.0584 17.5659 13.0572C17.5646 13.0559 17.5639 13.0542 17.5639 13.0524C16.8144 9.85279 15.2829 6.88908 13.1065 4.4268C11.6543 2.8805 12.0375 1.76449 12.6561 1.08546C13.1446 0.573977 13.7959 0.248354 14.4982 0.16441C25.4703 -1.43567 23.8635 9.06567 22.7138 13.5297Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M26.3443 37.9141C25.8558 38.4256 25.2045 38.7512 24.5022 38.8352C13.5099 40.442 15.1436 29.8868 16.2933 25.4429V25.4362C16.5958 24.2731 16.8647 23.5336 16.8647 23.5336L16.9051 23.426C17.6744 23.936 18.5772 24.2073 19.5002 24.2059C19.8163 24.2056 20.1315 24.174 20.4414 24.1118L20.4885 24.2126C20.4885 24.2126 20.8246 24.9253 21.4364 25.9606C22.1889 29.1551 23.7203 32.1138 25.8939 34.5728C27.3461 36.1191 26.9628 37.2351 26.3443 37.9141Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M24.2064 19.4998C24.2068 21.7365 22.6329 23.6645 20.4414 24.1118C20.1315 24.174 19.8163 24.2056 19.5002 24.2059C17.2635 24.2064 15.3355 22.6325 14.8881 20.441C14.8259 20.1311 14.7943 19.8159 14.794 19.4998C14.7935 17.2631 16.3674 15.3352 18.5589 14.8878C18.8688 14.8256 19.1841 14.794 19.5002 14.7937C21.7344 14.7939 23.6609 16.3638 24.1122 18.5519V18.5586C24.1745 18.8685 24.206 19.1837 24.2064 19.4998Z" fill="#ECF0F1"/>
|
||||||
|
<path d="M17.4833 20.1727C17.112 20.1727 16.8109 19.8716 16.8109 19.5003C16.8109 18.0148 18.0151 16.8106 19.5006 16.8106C19.8719 16.8106 20.173 17.1117 20.173 17.483C20.173 17.8544 19.8719 18.1554 19.5006 18.1554C18.7578 18.1554 18.1557 18.7575 18.1557 19.5003C18.1557 19.8716 17.8547 20.1727 17.4833 20.1727Z" fill="white"/>
|
||||||
|
<path d="M25.4703 22.7201C25.4636 22.7134 25.4636 22.7134 25.4568 22.7134C24.287 22.4042 23.534 22.1352 23.534 22.1352L23.4265 22.0949C23.9365 21.3256 24.2078 20.4228 24.2063 19.4998C24.206 19.1837 24.1745 18.8685 24.1122 18.5586V18.5519L24.2131 18.5115C24.2131 18.5115 24.9257 18.1754 25.9611 17.5636C29.1556 16.8111 32.1143 15.2798 34.5734 13.1062C36.1197 11.6541 37.2357 12.0373 37.9147 12.6558C38.4262 13.1443 38.7519 13.7956 38.8358 14.4979C40.4359 25.4631 29.9277 23.8563 25.4703 22.7201Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M14.794 19.4998C14.7944 19.8159 14.8259 20.1311 14.8882 20.441L14.7806 20.4881C14.7806 20.4881 14.0612 20.8242 13.0259 21.436C13.0205 21.4412 13.0131 21.4436 13.0057 21.4427C9.82491 22.2017 6.87912 23.7299 4.42702 25.8934C2.8807 27.3455 1.76467 26.9623 1.08563 26.3438C0.57414 25.8553 0.248513 25.204 0.164567 24.5017C-1.43553 13.5365 9.05924 15.1366 13.5234 16.2795C13.5301 16.2862 13.5301 16.2862 13.5368 16.2862C14.7066 16.5887 15.4664 16.8644 15.4664 16.8644L15.5739 16.9047C15.0639 17.674 14.7926 18.5768 14.794 19.4998Z" fill="#023DFE" fill-opacity="0.6"/>
|
||||||
|
<path d="M37.3567 27.6817C37.3718 28.3895 37.1414 29.0808 36.7046 29.6381C30.0622 38.546 23.7626 29.9204 21.4364 25.9606C20.8246 24.9252 20.4885 24.2126 20.4885 24.2126L20.4414 24.1118C21.6641 23.8608 22.7374 23.1356 23.4265 22.0948L23.534 22.1352C23.534 22.1352 24.287 22.4041 25.4568 22.7134C25.4636 22.7134 25.4636 22.7134 25.4703 22.7201C28.2537 24.4304 31.4139 25.4322 34.6742 25.6379C36.7987 25.7051 37.3164 26.7606 37.3567 27.6817Z" fill="#2F66D3"/>
|
||||||
|
<path d="M18.559 14.8878C17.3356 15.137 16.2616 15.8627 15.5739 16.9047L15.4664 16.8644C15.4664 16.8644 14.7066 16.5887 13.5368 16.2862C13.5301 16.2862 13.5301 16.2862 13.5234 16.2795C10.74 14.5692 7.5798 13.5674 4.31944 13.3617C2.19494 13.2944 1.67726 12.2389 1.63692 11.3179C1.62186 10.61 1.85229 9.91874 2.28907 9.36148C8.93822 0.446776 15.2512 9.09929 17.564 13.0524C17.564 13.0561 17.567 13.0591 17.5707 13.0591C18.169 14.081 18.5052 14.7869 18.5052 14.7869L18.559 14.8878Z" fill="#2F66D3"/>
|
||||||
|
<path d="M16.9051 23.4261L16.8647 23.5336C16.8647 23.5336 16.5958 24.2732 16.2933 25.4362V25.443C14.5699 28.2335 13.5629 31.4067 13.362 34.6804C13.2948 36.7981 12.2325 37.3158 11.3182 37.3628C10.6101 37.379 9.91852 37.1484 9.36176 36.7107C0.467092 30.0886 9.03905 23.7891 13.0057 21.4428C13.0131 21.4437 13.0205 21.4412 13.0259 21.436C14.0612 20.8243 14.7806 20.4881 14.7806 20.4881L14.8882 20.441C15.1374 21.6644 15.863 22.7384 16.9051 23.4261Z" fill="#2F66D3"/>
|
||||||
|
<path d="M25.9611 17.5635C24.9258 18.1753 24.2131 18.5115 24.2131 18.5115L24.1123 18.5518C23.8603 17.3314 23.1351 16.2605 22.0953 15.5735L22.1357 15.4659C22.1357 15.4659 22.4113 14.7062 22.7139 13.5297C24.4272 10.7453 25.4292 7.58221 25.6317 4.3192C25.6989 2.20145 26.7612 1.68378 27.6755 1.63672C28.3836 1.62059 29.0752 1.85113 29.6319 2.28885C38.5468 8.93118 29.921 15.2374 25.9611 17.5635Z" fill="#2F66D3"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
3
assets/icons/minus.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="24" height="2" viewBox="0 0 24 2" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M24 1H0" stroke="#D5D5D5" stroke-width="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 155 B |
3
assets/icons/plus.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M12 0L12 24M24 12H0" stroke="#D5D5D5" stroke-width="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 169 B |
16
assets/icons/sunnyMode.svg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M19.4998 30.5313C25.5923 30.5313 30.5313 25.5923 30.5313 19.4998C30.5313 13.4072 25.5923 8.46826 19.4998 8.46826C13.4072 8.46826 8.46826 13.4072 8.46826 19.4998C8.46826 25.5923 13.4072 30.5313 19.4998 30.5313Z" fill="#FFD347"/>
|
||||||
|
<path d="M19.5 4.33029C19.1745 4.33029 18.9106 4.06651 18.9106 3.74095V0.589342C18.9106 0.263783 19.1745 0 19.5 0C19.8255 0 20.0893 0.263783 20.0893 0.589342V3.74103C20.0893 4.06651 19.8255 4.33029 19.5 4.33029Z" fill="#FFD347"/>
|
||||||
|
<path d="M11.621 6.44169C11.4173 6.44169 11.2193 6.33604 11.1101 6.14698L9.53437 3.41759C9.37166 3.13576 9.46817 2.77531 9.75009 2.61253C10.032 2.44998 10.3924 2.54626 10.5551 2.82825L12.1309 5.55764C12.2936 5.83948 12.1971 6.19992 11.9152 6.3627C11.8223 6.41625 11.721 6.44169 11.621 6.44169Z" fill="#FFD347"/>
|
||||||
|
<path d="M5.85181 12.2099C5.75187 12.2099 5.65048 12.1844 5.55771 12.1308L2.82832 10.5551C2.54648 10.3923 2.44989 10.0319 2.6126 9.74999C2.7753 9.46808 3.13575 9.37164 3.41766 9.53427L6.14705 11.11C6.42888 11.2727 6.52547 11.6332 6.36277 11.9151C6.25354 12.1042 6.05549 12.2099 5.85181 12.2099Z" fill="#FFD347"/>
|
||||||
|
<path d="M3.74095 20.0893H0.589342C0.263859 20.0893 0 19.8255 0 19.5C0 19.1744 0.263859 18.9106 0.589342 18.9106H3.74103C4.06651 18.9106 4.33037 19.1744 4.33037 19.5C4.33037 19.8255 4.06644 20.0893 3.74095 20.0893Z" fill="#FFD347"/>
|
||||||
|
<path d="M3.12338 29.5447C2.91969 29.5447 2.72165 29.439 2.61249 29.25C2.44979 28.9681 2.5463 28.6077 2.82821 28.4449L5.5576 26.8692C5.83944 26.7066 6.19988 26.8029 6.36266 27.0849C6.52536 27.3667 6.42885 27.7272 6.14694 27.8899L3.41755 29.4657C3.3247 29.5193 3.22331 29.5447 3.12338 29.5447Z" fill="#FFD347"/>
|
||||||
|
<path d="M10.0442 36.4665C9.94423 36.4665 9.84285 36.4411 9.75007 36.3875C9.46823 36.2248 9.37165 35.8643 9.53435 35.5824L11.1101 32.853C11.2728 32.5711 11.6333 32.4747 11.9152 32.6373C12.197 32.8 12.2936 33.1604 12.1309 33.4424L10.5551 36.1718C10.4459 36.3608 10.2479 36.4665 10.0442 36.4665Z" fill="#FFD347"/>
|
||||||
|
<path d="M19.5 39C19.1745 39 18.9106 38.7362 18.9106 38.4106V35.259C18.9106 34.9334 19.1745 34.6696 19.5 34.6696C19.8255 34.6696 20.0893 34.9334 20.0893 35.259V38.4106C20.0893 38.7362 19.8255 39 19.5 39Z" fill="#FFD347"/>
|
||||||
|
<path d="M28.9559 36.4665C28.7522 36.4665 28.5541 36.3609 28.445 36.1718L26.8692 33.4424C26.7065 33.1606 26.803 32.8002 27.0849 32.6374C27.3668 32.4748 27.7272 32.5711 27.89 32.8531L29.4658 35.5825C29.6285 35.8643 29.5319 36.2248 29.25 36.3875C29.1572 36.4411 29.0559 36.4665 28.9559 36.4665Z" fill="#FFD347"/>
|
||||||
|
<path d="M35.8766 29.5447C35.7766 29.5447 35.6753 29.5193 35.5825 29.4657L32.8531 27.8899C32.5713 27.7272 32.4747 27.3667 32.6374 27.0848C32.8001 26.8029 33.1605 26.7065 33.4424 26.8691L36.1718 28.4449C36.4537 28.6076 36.5503 28.968 36.3875 29.2499C36.2783 29.439 36.0803 29.5447 35.8766 29.5447Z" fill="#FFD347"/>
|
||||||
|
<path d="M38.4107 20.0893H35.259C34.9335 20.0893 34.6697 19.8255 34.6697 19.5C34.6697 19.1744 34.9335 18.9106 35.259 18.9106H38.4107C38.7362 18.9106 39 19.1744 39 19.5C39 19.8255 38.7362 20.0893 38.4107 20.0893Z" fill="#FFD347"/>
|
||||||
|
<path d="M33.1483 12.2099C32.9446 12.2099 32.7465 12.1042 32.6374 11.9152C32.4747 11.6333 32.5712 11.2729 32.8531 11.1101L35.5825 9.53435C35.8643 9.37179 36.2248 9.46808 36.3876 9.75007C36.5503 10.0319 36.4538 10.3923 36.1718 10.5551L33.4425 12.1309C33.3496 12.1844 33.2482 12.2099 33.1483 12.2099Z" fill="#FFD347"/>
|
||||||
|
<path d="M27.379 6.44169C27.2791 6.44169 27.1777 6.41625 27.0849 6.36263C26.8031 6.19992 26.7065 5.83948 26.8692 5.55757L28.445 2.82818C28.6077 2.54626 28.9681 2.44983 29.25 2.61246C29.5319 2.77516 29.6284 3.13561 29.4657 3.41752L27.89 6.14691C27.7807 6.33604 27.5826 6.44169 27.379 6.44169Z" fill="#FFD347"/>
|
||||||
|
<path d="M19.5 8.46878C19.1007 8.46878 18.7064 8.49057 18.3181 8.53185C23.8547 9.12165 28.1674 13.8069 28.1674 19.4999C28.1674 25.1929 23.8546 29.8783 18.3181 30.4681C18.7064 30.5095 19.1006 30.5311 19.5 30.5311C25.5924 30.5311 30.5312 25.5923 30.5312 19.4999C30.5312 13.4075 25.5925 8.46878 19.5 8.46878Z" fill="#FFBE31"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.0 KiB |
67
assets/icons/windyMode.svg
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<svg width="39" height="31" viewBox="0 0 39 31" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M28.1585 1.82262C25.7283 -0.60754 21.7888 -0.60754 19.3585 1.82262C17.4147 3.7665 17.4147 6.919 19.3585 8.86288C20.1361 9.64044 21.1551 10.0292 22.1755 10.0292C23.159 10.0292 24.1439 9.66636 24.9106 8.94203C23.6815 10.1289 22.0917 10.7216 20.5038 10.7215C18.8791 10.7215 17.2551 10.1015 16.0165 8.86288C15.9479 8.79437 15.8787 8.72661 15.8088 8.65978C12.1757 5.18335 6.40266 5.3184 2.847 8.87405L0.936233 10.7848C-0.311996 12.033 -0.311996 14.0568 0.936233 15.3049C2.18446 16.5532 4.20818 16.5532 5.45633 15.3049L6.20338 14.558C8.43785 12.3235 11.8217 11.6518 14.7108 12.932C14.7582 12.953 14.8046 12.974 14.8497 12.9952C18.8807 14.8823 23.734 17.2477 28.1586 12.823C30.9646 10.0167 31.1964 4.86049 28.1585 1.82262Z" fill="url(#paint0_linear_145_703)"/>
|
||||||
|
<path d="M19.8533 3.7253C19.25 4.32857 18.7965 5.19827 18.5833 6.10797C18.3529 7.0913 18.6357 8.13559 19.3476 8.85189C19.3513 8.85556 19.3549 8.85923 19.3586 8.86282C20.1361 9.64037 21.1551 10.0292 22.1755 10.0292C22.9578 10.0292 23.7405 9.79874 24.414 9.34038C24.6243 9.19463 24.8186 9.03488 24.9908 8.86274C26.4095 7.44406 26.4095 5.14398 24.9908 3.7253C23.5721 2.30661 21.272 2.30661 19.8533 3.7253Z" fill="url(#paint1_linear_145_703)"/>
|
||||||
|
<path d="M19.1125 8.59622C19.1912 8.68707 19.2723 8.77654 19.3586 8.86287C20.1361 9.64043 21.1551 10.0292 22.1755 10.0292C23.1591 10.0292 24.1439 9.66635 24.9106 8.94202C23.6815 10.1288 22.0917 10.7216 20.5038 10.7215C18.8791 10.7215 17.2551 10.1015 16.0165 8.86287C15.948 8.79436 15.8787 8.7266 15.8089 8.65977C15.786 8.6379 15.7621 8.61786 15.739 8.5963H3.13875C3.04018 8.68684 2.94238 8.7786 2.84694 8.87404L0.936172 10.7848C-0.312057 12.033 -0.312057 14.0568 0.936172 15.3049C2.18433 16.5531 4.20812 16.5531 5.45627 15.3049L6.20331 14.5579C8.43779 12.3235 11.8216 11.6518 14.7107 12.932C14.7582 12.953 14.8045 12.974 14.8496 12.9952C18.8806 14.8823 23.734 17.2476 28.1586 12.823C29.285 11.6965 29.9955 10.1911 30.2474 8.5963H19.1125V8.59622Z" fill="url(#paint2_linear_145_703)"/>
|
||||||
|
<path d="M36.8077 8.44603C34.3774 6.01587 30.4378 6.01587 28.0077 8.44603C26.0638 10.3899 26.0638 13.5424 28.0077 15.4863C28.7852 16.2639 29.8042 16.6526 30.8246 16.6526C31.8082 16.6526 32.7931 16.2898 33.5597 15.5654C32.3306 16.7523 30.7407 17.3449 29.1529 17.3449C27.5282 17.3449 25.9042 16.7249 24.6656 15.4863C24.5971 15.4178 24.5278 15.35 24.4579 15.2832C20.8247 11.8068 15.0517 11.9418 11.4961 15.4975L9.5853 17.4082C8.33707 18.6564 14.8524 21.1814 14.8524 21.1814C17.0869 18.9469 20.4707 18.2752 23.3599 19.5554C23.4073 19.5764 23.4536 19.5974 23.4987 19.6186C27.5297 21.5058 32.3831 23.8711 36.8077 19.4464C39.6138 16.6402 39.8456 11.484 36.8077 8.44603Z" fill="url(#paint3_linear_145_703)"/>
|
||||||
|
<path d="M28.5024 10.3488C27.8991 10.952 27.4456 11.8217 27.2324 12.7314C27.002 13.7147 27.2848 14.7591 27.9968 15.4754C28.0004 15.479 28.004 15.4827 28.0077 15.4863C28.7852 16.2638 29.8042 16.6526 30.8246 16.6526C31.6069 16.6526 32.3896 16.4222 33.0631 15.9639C33.2735 15.8181 33.4677 15.6584 33.6399 15.4862C35.0586 14.0675 35.0586 11.7675 33.6399 10.3488C32.2212 8.93009 29.9211 8.93009 28.5024 10.3488Z" fill="url(#paint4_linear_145_703)"/>
|
||||||
|
<path d="M27.7617 15.2197C27.8403 15.3106 27.9214 15.4 28.0077 15.4863C28.7852 16.2639 29.8042 16.6526 30.8246 16.6526C31.8082 16.6526 32.7931 16.2898 33.5597 15.5654C32.3306 16.7523 30.7407 17.3449 29.1529 17.3449C27.5282 17.3449 25.9042 16.7249 24.6656 15.4863C24.5971 15.4178 24.5278 15.35 24.4579 15.2832C24.435 15.2613 24.4111 15.2413 24.3881 15.2197H11.7879C11.6893 15.3103 11.5915 15.402 11.4961 15.4975L9.5853 17.4082C8.33707 18.6564 14.8524 21.1814 14.8524 21.1814C17.0869 18.9469 20.4707 18.2752 23.3599 19.5554C23.4073 19.5764 23.4536 19.5974 23.4987 19.6186C27.5297 21.5058 32.3831 23.8711 36.8077 19.4464C37.9342 18.3199 38.6447 16.8145 38.8965 15.2197H27.7617Z" fill="url(#paint5_linear_145_703)"/>
|
||||||
|
<path d="M26.5398 16.7826C25.8604 16.4758 25.2236 16.0445 24.6655 15.4863C24.597 15.4178 24.5277 15.35 24.4578 15.2832C20.8247 11.8068 15.0517 11.9418 11.496 15.4975L9.58524 17.4082C8.33701 18.6565 14.8524 21.1814 14.8524 21.1814C17.0868 18.9469 20.4707 18.2752 23.3598 19.5554C23.4072 19.5764 23.4536 19.5974 23.4987 19.6186C24.4704 20.0735 25.49 20.556 26.5398 20.9647V16.7826Z" fill="url(#paint6_linear_145_703)"/>
|
||||||
|
<path d="M20.6489 27.9475C18.8131 30.8522 14.9702 31.7188 12.0645 29.8832C9.74075 28.4137 9.04739 25.3387 10.5159 23.0151C11.1033 22.0857 12.0124 21.4822 13.0079 21.2578C13.9667 21.0416 15.0072 21.1787 15.9146 21.7168C14.4546 20.8288 12.7737 20.6007 11.2239 20.9501C9.63935 21.3074 8.19115 22.2698 7.25546 23.7504C7.20369 23.8323 7.15176 23.9132 7.0977 23.9937C6.38018 25.0756 5.47033 25.9542 4.44226 26.6161C2.75975 27.6993 0.51144 26.77 0.0712751 24.818C-0.280948 23.2561 0.708199 21.719 2.26935 21.3637C3.26935 21.1361 4.23043 20.7043 5.08713 20.0677C5.12881 20.0375 5.16926 20.0066 5.2088 19.976C8.72583 17.2478 12.9395 13.8732 18.229 17.2161C21.5837 19.3368 22.9445 24.3151 20.6489 27.9475Z" fill="url(#paint7_linear_145_703)"/>
|
||||||
|
<path d="M12.1287 27.9178C11.4075 27.4621 10.7738 26.7133 10.3658 25.8728C9.92473 24.9643 9.97084 23.8833 10.5078 23.028C10.5106 23.0236 10.5133 23.0193 10.5161 23.0149C11.1035 22.0853 12.0121 21.482 13.0074 21.2575C13.7705 21.0855 14.5847 21.138 15.3425 21.4371C15.5798 21.533 15.8044 21.6461 16.0103 21.7762C17.7062 22.8481 18.2122 25.0919 17.1403 26.7878C16.0685 28.4838 13.8247 28.9897 12.1287 27.9178Z" fill="url(#paint8_linear_145_703)"/>
|
||||||
|
<path d="M10.5001 21.1607C9.20332 21.6193 8.04708 22.499 7.25538 23.7503C7.20361 23.8322 7.15169 23.9131 7.09762 23.9936C6.3801 25.0755 5.47025 25.9541 4.44218 26.616C2.75968 27.6992 0.511364 26.7699 0.0711991 24.8179C-0.0835009 24.1318 0.347258 23.4502 1.03343 23.2955L10.5001 21.1607Z" fill="url(#paint9_linear_145_703)"/>
|
||||||
|
<path d="M9.74707 25.7143C9.76175 27.3496 10.5795 28.9442 12.0645 29.8828C14.9697 31.7189 18.8128 30.8523 20.6489 27.9471C21.6051 26.4342 21.9249 24.688 21.7325 23.0117L9.74707 25.7143Z" fill="url(#paint10_linear_145_703)"/>
|
||||||
|
<path d="M30.8942 24.4466C29.4577 24.4466 28.0928 24.2788 26.8609 23.9771C26.0553 23.7799 25.5744 24.8563 26.2615 25.3207C27.499 26.1572 29.1198 26.6642 30.8942 26.6642C32.6685 26.6642 34.2893 26.1572 35.5268 25.3207C36.2139 24.8563 35.733 23.7799 34.9274 23.9771C33.6955 24.2789 32.3306 24.4466 30.8942 24.4466Z" fill="url(#paint11_linear_145_703)"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_145_703" x1="12.1446" y1="3.52539" x2="18.8967" y2="17.0296" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EAF6FF"/>
|
||||||
|
<stop offset="1" stop-color="#B3DAFE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_145_703" x1="21.5595" y1="5.67889" x2="25.9494" y2="10.0688" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_145_703" x1="15.1237" y1="11.2006" x2="15.1237" y2="15.3247" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_145_703" x1="21.6101" y1="9.74068" x2="28.3622" y2="23.2449" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EAF6FF"/>
|
||||||
|
<stop offset="1" stop-color="#B3DAFE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_145_703" x1="30.2085" y1="12.3023" x2="34.5985" y2="16.6922" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint5_linear_145_703" x1="24.1614" y1="17.5182" x2="24.1614" y2="21.1579" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_145_703" x1="21.2143" y1="15.9361" x2="16.3202" y2="20.9832" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8AC9FE" stop-opacity="0"/>
|
||||||
|
<stop offset="0.1534" stop-color="#85C2F3" stop-opacity="0.153"/>
|
||||||
|
<stop offset="0.4248" stop-color="#78AED5" stop-opacity="0.425"/>
|
||||||
|
<stop offset="0.7796" stop-color="#628FA5" stop-opacity="0.78"/>
|
||||||
|
<stop offset="1" stop-color="#537983"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_145_703" x1="9.33026" y1="20.6623" x2="14.3901" y2="29.3324" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EAF6FF"/>
|
||||||
|
<stop offset="1" stop-color="#B3DAFE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint8_linear_145_703" x1="12.3275" y1="25.9717" x2="15.9937" y2="23.3646" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint9_linear_145_703" x1="5.45256" y1="23.7317" x2="6.19238" y2="27.0138" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_145_703" x1="15.9184" y1="25.3941" x2="16.8484" y2="29.5199" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#8FCBFE" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#8AC9FE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_145_703" x1="30.8942" y1="23.8348" x2="30.8942" y2="26.6684" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#EAF6FF"/>
|
||||||
|
<stop offset="1" stop-color="#B3DAFE"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
@ -1 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
44
ios/Podfile
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Uncomment this line to define a global platform for your project
|
||||||
|
# platform :ios, '12.0'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def flutter_root
|
||||||
|
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
|
||||||
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
|
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.foreach(generated_xcode_build_settings_path) do |line|
|
||||||
|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
||||||
|
return matches[1].strip if matches
|
||||||
|
end
|
||||||
|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
|
||||||
|
end
|
||||||
|
|
||||||
|
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
||||||
|
|
||||||
|
flutter_ios_podfile_setup
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
use_modular_headers!
|
||||||
|
|
||||||
|
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
||||||
|
target 'RunnerTests' do
|
||||||
|
inherit! :search_paths
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
installer.pods_project.targets.each do |target|
|
||||||
|
flutter_additional_ios_build_settings(target)
|
||||||
|
end
|
||||||
|
end
|
217
ios/Podfile.lock
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
PODS:
|
||||||
|
- Firebase/Analytics (10.20.0):
|
||||||
|
- Firebase/Core
|
||||||
|
- Firebase/Core (10.20.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseAnalytics (~> 10.20.0)
|
||||||
|
- Firebase/CoreOnly (10.20.0):
|
||||||
|
- FirebaseCore (= 10.20.0)
|
||||||
|
- Firebase/Crashlytics (10.20.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseCrashlytics (~> 10.20.0)
|
||||||
|
- firebase_analytics (10.8.6):
|
||||||
|
- Firebase/Analytics (= 10.20.0)
|
||||||
|
- firebase_core
|
||||||
|
- Flutter
|
||||||
|
- firebase_core (2.25.4):
|
||||||
|
- Firebase/CoreOnly (= 10.20.0)
|
||||||
|
- Flutter
|
||||||
|
- firebase_crashlytics (3.4.15):
|
||||||
|
- Firebase/Crashlytics (= 10.20.0)
|
||||||
|
- firebase_core
|
||||||
|
- Flutter
|
||||||
|
- FirebaseAnalytics (10.20.0):
|
||||||
|
- FirebaseAnalytics/AdIdSupport (= 10.20.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.30910.0, >= 2.30908.0)
|
||||||
|
- FirebaseAnalytics/AdIdSupport (10.20.0):
|
||||||
|
- FirebaseCore (~> 10.0)
|
||||||
|
- FirebaseInstallations (~> 10.0)
|
||||||
|
- GoogleAppMeasurement (= 10.20.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/Network (~> 7.11)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- FirebaseCore (10.20.0):
|
||||||
|
- FirebaseCoreInternal (~> 10.0)
|
||||||
|
- GoogleUtilities/Environment (~> 7.12)
|
||||||
|
- GoogleUtilities/Logger (~> 7.12)
|
||||||
|
- FirebaseCoreExtension (10.21.0):
|
||||||
|
- FirebaseCore (~> 10.0)
|
||||||
|
- FirebaseCoreInternal (10.21.0):
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
||||||
|
- FirebaseCrashlytics (10.20.0):
|
||||||
|
- FirebaseCore (~> 10.5)
|
||||||
|
- FirebaseInstallations (~> 10.0)
|
||||||
|
- FirebaseSessions (~> 10.5)
|
||||||
|
- GoogleDataTransport (~> 9.2)
|
||||||
|
- GoogleUtilities/Environment (~> 7.8)
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- PromisesObjC (~> 2.1)
|
||||||
|
- FirebaseInstallations (10.21.0):
|
||||||
|
- FirebaseCore (~> 10.0)
|
||||||
|
- GoogleUtilities/Environment (~> 7.8)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||||
|
- PromisesObjC (~> 2.1)
|
||||||
|
- FirebaseSessions (10.21.0):
|
||||||
|
- FirebaseCore (~> 10.5)
|
||||||
|
- FirebaseCoreExtension (~> 10.0)
|
||||||
|
- FirebaseInstallations (~> 10.0)
|
||||||
|
- GoogleDataTransport (~> 9.2)
|
||||||
|
- GoogleUtilities/Environment (~> 7.10)
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- PromisesSwift (~> 2.1)
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- flutter_localization (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- flutter_secure_storage (6.0.0):
|
||||||
|
- Flutter
|
||||||
|
- GoogleAppMeasurement (10.20.0):
|
||||||
|
- GoogleAppMeasurement/AdIdSupport (= 10.20.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/Network (~> 7.11)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- GoogleAppMeasurement/AdIdSupport (10.20.0):
|
||||||
|
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.20.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/Network (~> 7.11)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- GoogleAppMeasurement/WithoutAdIdSupport (10.20.0):
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 7.11)
|
||||||
|
- GoogleUtilities/Network (~> 7.11)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 7.11)"
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- GoogleDataTransport (9.3.0):
|
||||||
|
- GoogleUtilities/Environment (~> 7.7)
|
||||||
|
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||||
|
- PromisesObjC (< 3.0, >= 1.2)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (7.12.0):
|
||||||
|
- GoogleUtilities/Environment
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Network
|
||||||
|
- GoogleUtilities/Environment (7.12.0):
|
||||||
|
- PromisesObjC (< 3.0, >= 1.2)
|
||||||
|
- GoogleUtilities/Logger (7.12.0):
|
||||||
|
- GoogleUtilities/Environment
|
||||||
|
- GoogleUtilities/MethodSwizzler (7.12.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Network (7.12.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- "GoogleUtilities/NSData+zlib"
|
||||||
|
- GoogleUtilities/Reachability
|
||||||
|
- "GoogleUtilities/NSData+zlib (7.12.0)"
|
||||||
|
- GoogleUtilities/Reachability (7.12.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/UserDefaults (7.12.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- nanopb (2.30909.1):
|
||||||
|
- nanopb/decode (= 2.30909.1)
|
||||||
|
- nanopb/encode (= 2.30909.1)
|
||||||
|
- nanopb/decode (2.30909.1)
|
||||||
|
- nanopb/encode (2.30909.1)
|
||||||
|
- path_provider_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- PromisesObjC (2.3.1)
|
||||||
|
- PromisesSwift (2.3.1):
|
||||||
|
- PromisesObjC (= 2.3.1)
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- sqflite (0.0.3):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- url_launcher_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`)
|
||||||
|
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||||
|
- firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- flutter_localization (from `.symlinks/plugins/flutter_localization/ios`)
|
||||||
|
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
||||||
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
|
||||||
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
|
|
||||||
|
SPEC REPOS:
|
||||||
|
trunk:
|
||||||
|
- Firebase
|
||||||
|
- FirebaseAnalytics
|
||||||
|
- FirebaseCore
|
||||||
|
- FirebaseCoreExtension
|
||||||
|
- FirebaseCoreInternal
|
||||||
|
- FirebaseCrashlytics
|
||||||
|
- FirebaseInstallations
|
||||||
|
- FirebaseSessions
|
||||||
|
- GoogleAppMeasurement
|
||||||
|
- GoogleDataTransport
|
||||||
|
- GoogleUtilities
|
||||||
|
- nanopb
|
||||||
|
- PromisesObjC
|
||||||
|
- PromisesSwift
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
firebase_analytics:
|
||||||
|
:path: ".symlinks/plugins/firebase_analytics/ios"
|
||||||
|
firebase_core:
|
||||||
|
:path: ".symlinks/plugins/firebase_core/ios"
|
||||||
|
firebase_crashlytics:
|
||||||
|
:path: ".symlinks/plugins/firebase_crashlytics/ios"
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
flutter_localization:
|
||||||
|
:path: ".symlinks/plugins/flutter_localization/ios"
|
||||||
|
flutter_secure_storage:
|
||||||
|
:path: ".symlinks/plugins/flutter_secure_storage/ios"
|
||||||
|
path_provider_foundation:
|
||||||
|
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
sqflite:
|
||||||
|
:path: ".symlinks/plugins/sqflite/darwin"
|
||||||
|
url_launcher_ios:
|
||||||
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
Firebase: 10c8cb12fb7ad2ae0c09ffc86cd9c1ab392a0031
|
||||||
|
firebase_analytics: 9c600045bfb4d16dd78593d18f32c99bb77e5001
|
||||||
|
firebase_core: a46c312d8bae4defa3d009b2aa7b5b413aeb394e
|
||||||
|
firebase_crashlytics: 3054fbdd2b4a4a91f25a15e57c9f1bd2a9ed81ae
|
||||||
|
FirebaseAnalytics: a2731bf3670747ce8f65368b118d18aa8e368246
|
||||||
|
FirebaseCore: 28045c1560a2600d284b9c45a904fe322dc890b6
|
||||||
|
FirebaseCoreExtension: 1c044fd46e95036cccb29134757c499613f3f564
|
||||||
|
FirebaseCoreInternal: 43c1788eaeee9d1b97caaa751af567ce11010d00
|
||||||
|
FirebaseCrashlytics: 81530595edb6d99f1918f723a6c33766a24a4c86
|
||||||
|
FirebaseInstallations: 390ea1d10a4d02b20c965cbfd527ee9b3b412acb
|
||||||
|
FirebaseSessions: 80c2bbdd28166267b3d132debe5f7531efdb00bc
|
||||||
|
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||||
|
flutter_localization: f43b18844a2b3d2c71fd64f04ffd6b1e64dd54d4
|
||||||
|
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
|
||||||
|
GoogleAppMeasurement: bb3c564c3efb933136af0e94899e0a46167466a8
|
||||||
|
GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe
|
||||||
|
GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34
|
||||||
|
nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
|
||||||
|
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
||||||
|
PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
|
||||||
|
PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265
|
||||||
|
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
|
||||||
|
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||||
|
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
|
||||||
|
|
||||||
|
COCOAPODS: 1.15.2
|
@ -8,12 +8,14 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
|
611C662010675536F855E5CA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
D31283674D2826D7EF8E56BC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -42,10 +44,16 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||||
|
25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||||
|
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
|
444D77D28A8CDF32047CD0AF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
|
949637473C534E1F68B19CC0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
@ -53,8 +61,10 @@
|
|||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; 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>"; };
|
||||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
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>"; };
|
||||||
|
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>"; };
|
||||||
|
F323D632CA976B68DDB0E669 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -62,12 +72,52 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
D31283674D2826D7EF8E56BC /* Pods_Runner.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C2B33A7265AF659D80692473 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
611C662010675536F855E5CA /* Pods_RunnerTests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
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 */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
||||||
|
);
|
||||||
|
path = RunnerTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
876D3217A8BBDAF41961161F /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
25B37F5982CD6994FABA2CC1 /* Pods_Runner.framework */,
|
||||||
|
490AAF90B8FBFCC5BA996845 /* Pods_RunnerTests.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -79,14 +129,6 @@
|
|||||||
name = Flutter;
|
name = Flutter;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
|
||||||
);
|
|
||||||
path = RunnerTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
97C146E51CF9000F007C117D = {
|
97C146E51CF9000F007C117D = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -94,6 +136,8 @@
|
|||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||||
|
2F70EB4341A83C900EB253DC /* Pods */,
|
||||||
|
876D3217A8BBDAF41961161F /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@ -128,9 +172,10 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
3B971DE531245D7FD2921C30 /* [CP] Check Pods Manifest.lock */,
|
||||||
331C807D294A63A400263BE5 /* Sources */,
|
331C807D294A63A400263BE5 /* Sources */,
|
||||||
331C807E294A63A400263BE5 /* Frameworks */,
|
|
||||||
331C807F294A63A400263BE5 /* Resources */,
|
331C807F294A63A400263BE5 /* Resources */,
|
||||||
|
C2B33A7265AF659D80692473 /* Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -146,12 +191,14 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
3DC878D0674AA34AEC9695FB /* [CP] Check Pods Manifest.lock */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
315A05630CF83C532DBBCBF2 /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -169,7 +216,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = YES;
|
BuildIndependentTargetsInParallel = YES;
|
||||||
LastUpgradeCheck = 1430;
|
LastUpgradeCheck = 1510;
|
||||||
ORGANIZATIONNAME = "";
|
ORGANIZATIONNAME = "";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
331C8080294A63A400263BE5 = {
|
331C8080294A63A400263BE5 = {
|
||||||
@ -223,6 +270,23 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase 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;
|
||||||
|
};
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@ -239,6 +303,50 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||||
};
|
};
|
||||||
|
3B971DE531245D7FD2921C30 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
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-RunnerTests-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;
|
||||||
|
};
|
||||||
|
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;
|
||||||
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@ -377,7 +485,7 @@
|
|||||||
};
|
};
|
||||||
331C8088294A63A400263BE5 /* Debug */ = {
|
331C8088294A63A400263BE5 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
|
baseConfigurationReference = DFB6BB492A265F2BF6FDC8C0 /* Pods-RunnerTests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@ -395,7 +503,7 @@
|
|||||||
};
|
};
|
||||||
331C8089294A63A400263BE5 /* Release */ = {
|
331C8089294A63A400263BE5 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
|
baseConfigurationReference = F323D632CA976B68DDB0E669 /* Pods-RunnerTests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@ -411,7 +519,7 @@
|
|||||||
};
|
};
|
||||||
331C808A294A63A400263BE5 /* Profile */ = {
|
331C808A294A63A400263BE5 /* Profile */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
|
baseConfigurationReference = AAC9129FD50E64509AD1B9AF /* Pods-RunnerTests.profile.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1430"
|
LastUpgradeVersion = "1510"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
3
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
@ -4,4 +4,7 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
|
||||||
|
<device id="retina6_12" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
<!--Flutter View Controller-->
|
<!--Flutter View Controller-->
|
||||||
@ -14,13 +16,14 @@
|
|||||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||||
</layoutGuides>
|
</layoutGuides>
|
||||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</view>
|
</view>
|
||||||
</viewController>
|
</viewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
|
<point key="canvasLocation" x="-16" y="-40"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
</document>
|
</document>
|
||||||
|
@ -3,12 +3,12 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
|
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
|
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
|
||||||
import 'package:syncrow_app/features/layout/view/layout_view.dart';
|
|
||||||
import 'package:syncrow_app/features/menu/view/menu_view.dart';
|
import 'package:syncrow_app/features/menu/view/menu_view.dart';
|
||||||
import 'package:syncrow_app/features/scene/view/scene_view.dart';
|
import 'package:syncrow_app/features/scene/view/scene_view.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
|
import '../../../generated/assets.dart';
|
||||||
|
|
||||||
part 'nav_state.dart';
|
part 'nav_state.dart';
|
||||||
|
|
||||||
class NavCubit extends Cubit<NavState> {
|
class NavCubit extends Cubit<NavState> {
|
||||||
@ -27,16 +27,16 @@ class NavCubit extends Cubit<NavState> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var bottomNavItems = [
|
var bottomNavItems = [
|
||||||
defaultBottomNavBarItem(icon: IconsManager.dashboard, label: 'Dashboard'),
|
defaultBottomNavBarItem(icon: Assets.iconsDashboard, label: 'Dashboard'),
|
||||||
defaultBottomNavBarItem(icon: IconsManager.layout, label: 'Layout'),
|
// defaultBottomNavBarItem(icon: Assets.iconslayout, label: 'Layout'),
|
||||||
defaultBottomNavBarItem(icon: IconsManager.devices, label: 'Devices'),
|
defaultBottomNavBarItem(icon: Assets.iconsDevices, label: 'Devices'),
|
||||||
defaultBottomNavBarItem(icon: IconsManager.routine, label: 'Routine'),
|
defaultBottomNavBarItem(icon: Assets.iconsRoutines, label: 'Routine'),
|
||||||
defaultBottomNavBarItem(icon: IconsManager.menu, label: 'Menu'),
|
defaultBottomNavBarItem(icon: Assets.iconsMenu, label: 'Menu'),
|
||||||
];
|
];
|
||||||
|
|
||||||
final List<Widget> pages = [
|
final List<Widget> pages = [
|
||||||
const DashboardView(),
|
const DashboardView(),
|
||||||
const LayoutPage(),
|
// const LayoutPage(),
|
||||||
const DevicesViewBody(),
|
const DevicesViewBody(),
|
||||||
const SceneView(),
|
const SceneView(),
|
||||||
const MenuView(),
|
const MenuView(),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
import '../../../shared_widgets/text_widgets/body_large.dart';
|
import '../../../shared_widgets/text_widgets/body_large.dart';
|
||||||
|
|
||||||
class AppBarHomeDropdown extends StatelessWidget {
|
class AppBarHomeDropdown extends StatelessWidget {
|
||||||
@ -22,7 +22,7 @@ class AppBarHomeDropdown extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
SvgPicture.asset(
|
SvgPicture.asset(
|
||||||
IconsManager.home,
|
Assets.iconsHome,
|
||||||
width: 25,
|
width: 25,
|
||||||
height: 25,
|
height: 25,
|
||||||
colorFilter: const ColorFilter.mode(
|
colorFilter: const ColorFilter.mode(
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
|
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
|
||||||
class AppBody extends StatelessWidget {
|
class AppBody extends StatelessWidget {
|
||||||
const AppBody({
|
const AppBody({
|
||||||
@ -18,7 +19,7 @@ class AppBody extends StatelessWidget {
|
|||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
image: DecorationImage(
|
image: DecorationImage(
|
||||||
image: AssetImage(
|
image: AssetImage(
|
||||||
ImageManager.background,
|
Assets.imagesBackground,
|
||||||
),
|
),
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
opacity: 0.4,
|
opacity: 0.4,
|
||||||
|
@ -35,7 +35,3 @@ class DefaultNavBar extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DefaultBottomNavBarItem extends BottomNavigationBarItem {
|
|
||||||
DefaultBottomNavBarItem({required super.icon});
|
|
||||||
}
|
|
||||||
|
@ -4,7 +4,7 @@ import 'package:gap/gap.dart';
|
|||||||
import 'package:syncrow_app/features/dashboard/view/widgets/card_title.dart';
|
import 'package:syncrow_app/features/dashboard/view/widgets/card_title.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/united_text.dart';
|
import 'package:syncrow_app/features/shared_widgets/united_text.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||||
|
|
||||||
class CarbonEmission extends StatelessWidget {
|
class CarbonEmission extends StatelessWidget {
|
||||||
@ -38,7 +38,7 @@ class CarbonEmission extends StatelessWidget {
|
|||||||
SizedBox.square(
|
SizedBox.square(
|
||||||
dimension: 30,
|
dimension: 30,
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
IconsManager.CO2,
|
Assets.iconsCO2,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -68,7 +68,7 @@ class CarbonEmission extends StatelessWidget {
|
|||||||
SizedBox.square(
|
SizedBox.square(
|
||||||
dimension: 30,
|
dimension: 30,
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
IconsManager.sustainability,
|
Assets.iconsSustainability,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:syncrow_app/features/dashboard/view/widgets/card_title.dart';
|
import 'package:syncrow_app/features/dashboard/view/widgets/card_title.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/united_text.dart';
|
import 'package:syncrow_app/features/shared_widgets/united_text.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
|
||||||
class Consumption extends StatelessWidget {
|
class Consumption extends StatelessWidget {
|
||||||
const Consumption({
|
const Consumption({
|
||||||
super.key,
|
super.key,
|
||||||
@ -54,7 +55,7 @@ class Consumption extends StatelessWidget {
|
|||||||
SizedBox.square(
|
SizedBox.square(
|
||||||
dimension: 60,
|
dimension: 60,
|
||||||
child: Image.asset(
|
child: Image.asset(
|
||||||
ImageManager.testDash2,
|
Assets.imagesTestDash2,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:syncrow_app/features/dashboard/view/widgets/energy_usage_header.dart';
|
import 'package:syncrow_app/features/dashboard/view/widgets/energy_usage_header.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
|
|
||||||
class EnergyUsage extends StatelessWidget {
|
class EnergyUsage extends StatelessWidget {
|
||||||
const EnergyUsage({
|
const EnergyUsage({
|
||||||
@ -23,7 +23,7 @@ class EnergyUsage extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
const EnergyUsageHeader(),
|
const EnergyUsageHeader(),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Image.asset(ImageManager.testDash),
|
child: Image.asset(Assets.imagesTestDash),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:syncrow_app/features/dashboard/view/widgets/live_monitor_widget.dart';
|
import 'package:syncrow_app/features/dashboard/view/widgets/live_monitor_widget.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
|
||||||
class LiveMonitorTab extends StatelessWidget {
|
class LiveMonitorTab extends StatelessWidget {
|
||||||
const LiveMonitorTab({
|
const LiveMonitorTab({
|
||||||
super.key,
|
super.key,
|
||||||
@ -14,21 +15,21 @@ class LiveMonitorTab extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: LiveMonitorWidget(
|
child: LiveMonitorWidget(
|
||||||
image: IconsManager.active,
|
image: Assets.iconsActive,
|
||||||
title: StringsManager.active,
|
title: StringsManager.active,
|
||||||
value: '10.00w',
|
value: '10.00w',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: LiveMonitorWidget(
|
child: LiveMonitorWidget(
|
||||||
image: IconsManager.voltMeter,
|
image: Assets.iconsVoltMeter,
|
||||||
title: StringsManager.current,
|
title: StringsManager.current,
|
||||||
value: '12.1 A',
|
value: '12.1 A',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: LiveMonitorWidget(
|
child: LiveMonitorWidget(
|
||||||
image: IconsManager.frequency,
|
image: Assets.iconsFrequency,
|
||||||
title: StringsManager.frequency,
|
title: StringsManager.frequency,
|
||||||
value: '50 Hz',
|
value: '50 Hz',
|
||||||
),
|
),
|
||||||
|
57
lib/features/devices/bloc/ac_cubit.dart
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||||
|
|
||||||
|
part 'ac_state.dart';
|
||||||
|
|
||||||
|
class AcCubit extends Cubit<AcState> {
|
||||||
|
AcCubit() : super(AcInitial());
|
||||||
|
|
||||||
|
static AcCubit get(context) => BlocProvider.of(context);
|
||||||
|
|
||||||
|
bool areAllACsOff() {
|
||||||
|
for (var ac in DevicesCubit.categories[0].devices) {
|
||||||
|
if (ac.status) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void turnAllACsOff() {
|
||||||
|
for (var ac in DevicesCubit.categories[0].devices) {
|
||||||
|
ac.status = false;
|
||||||
|
}
|
||||||
|
emit(SwitchACsOff());
|
||||||
|
}
|
||||||
|
|
||||||
|
void turnAllACsOn() {
|
||||||
|
for (var ac in DevicesCubit.categories[0].devices) {
|
||||||
|
ac.status = true;
|
||||||
|
}
|
||||||
|
emit(SwitchACsOn());
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTempToAll(double temperature) {
|
||||||
|
for (var ac in DevicesCubit.categories[0].devices) {
|
||||||
|
ac.temperature = temperature;
|
||||||
|
}
|
||||||
|
emit(ACsTempChanged());
|
||||||
|
}
|
||||||
|
|
||||||
|
double averageTempForAll() {
|
||||||
|
double allTemp = 0;
|
||||||
|
for (var ac in DevicesCubit.categories[0].devices) {
|
||||||
|
allTemp += ac.temperature;
|
||||||
|
}
|
||||||
|
emit(ACsTempChanged());
|
||||||
|
|
||||||
|
double averageTemp = allTemp / DevicesCubit.categories[0].devices.length;
|
||||||
|
|
||||||
|
averageTemp = (averageTemp * 2).round() / 2;
|
||||||
|
|
||||||
|
return averageTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// implement the fan speed and temp mode change
|
||||||
|
}
|
16
lib/features/devices/bloc/ac_state.dart
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
part of 'ac_cubit.dart';
|
||||||
|
|
||||||
|
@immutable
|
||||||
|
abstract class AcState {}
|
||||||
|
|
||||||
|
class AcInitial extends AcState {}
|
||||||
|
|
||||||
|
class SwitchACsOff extends AcState {}
|
||||||
|
|
||||||
|
class SwitchACsOn extends AcState {}
|
||||||
|
|
||||||
|
class ACsTempChanged extends AcState {}
|
||||||
|
|
||||||
|
class ACsFanSpeedChanged extends AcState {}
|
||||||
|
|
||||||
|
class ACsTempModeChanged extends AcState {}
|
@ -1,99 +1,130 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/curtain_view.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/door_view.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/gateway_view.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/screens_view.dart';
|
||||||
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
|
|
||||||
import '../model/device_category_model.dart';
|
import '../model/device_category_model.dart';
|
||||||
|
import '../view/widgets/ac_view.dart';
|
||||||
|
import '../view/widgets/lights_view.dart';
|
||||||
|
|
||||||
part 'devices_state.dart';
|
part 'devices_state.dart';
|
||||||
|
|
||||||
class DevicesCubit extends Cubit<DevicesState> {
|
class DevicesCubit extends Cubit<DevicesState> {
|
||||||
DevicesCubit() : super(DevicesInitial()) {
|
DevicesCubit() : super(DevicesInitial()) {
|
||||||
getCategories();
|
// getCategories();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ACSwitchValue = false;
|
/// separate the cubit into different cubits based on devices type
|
||||||
bool lightsSwitchValue = false;
|
static bool ACSwitchValue = false;
|
||||||
bool doorSwitchValue = false;
|
static bool lightsSwitchValue = false;
|
||||||
bool curtainSwitchValue = false;
|
static bool doorSwitchValue = false;
|
||||||
bool screensSwitchValue = false;
|
static bool curtainSwitchValue = false;
|
||||||
bool gatewaySwitchValue = false;
|
static bool screensSwitchValue = false;
|
||||||
|
static bool gatewaySwitchValue = false;
|
||||||
|
|
||||||
void changeSwitchValue(DeviceType device) {
|
void changeCategorySwitchValue(DevicesCategoryModel category) {
|
||||||
switch (device) {
|
category.switchValue = !category.switchValue;
|
||||||
case DeviceType.AC:
|
emit(CategorySwitchChanged());
|
||||||
ACSwitchValue = !ACSwitchValue;
|
print('${category.name} switch value: ${category.switchValue} ');
|
||||||
break;
|
|
||||||
case DeviceType.Lights:
|
|
||||||
lightsSwitchValue = !lightsSwitchValue;
|
|
||||||
break;
|
|
||||||
case DeviceType.Door:
|
|
||||||
doorSwitchValue = !doorSwitchValue;
|
|
||||||
break;
|
|
||||||
case DeviceType.Curtain:
|
|
||||||
curtainSwitchValue = !curtainSwitchValue;
|
|
||||||
break;
|
|
||||||
case DeviceType.Screens:
|
|
||||||
screensSwitchValue = !screensSwitchValue;
|
|
||||||
break;
|
|
||||||
case DeviceType.Gateway:
|
|
||||||
gatewaySwitchValue = !gatewaySwitchValue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
emit(DevicesSuccess());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DevicesCubit get(context) => BlocProvider.of(context);
|
static DevicesCubit get(context) => BlocProvider.of(context);
|
||||||
|
|
||||||
var categories = <DevicesCategoryModel>[];
|
static var categories = <DevicesCategoryModel>[
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [
|
||||||
|
ACModel(
|
||||||
|
name: "Living Room AC",
|
||||||
|
id: '0',
|
||||||
|
status: false,
|
||||||
|
temperature: 20,
|
||||||
|
fanSpeed: 0,
|
||||||
|
tempMode: 0,
|
||||||
|
),
|
||||||
|
ACModel(
|
||||||
|
name: "Master Bedroom AC",
|
||||||
|
id: '1',
|
||||||
|
status: false,
|
||||||
|
temperature: 20,
|
||||||
|
fanSpeed: 0,
|
||||||
|
tempMode: 0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
icon: Assets.iconsAC,
|
||||||
|
name: 'ACs',
|
||||||
|
switchValue: ACSwitchValue,
|
||||||
|
type: DeviceType.AC,
|
||||||
|
page: const ACView(),
|
||||||
|
),
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [],
|
||||||
|
icon: Assets.iconsLight,
|
||||||
|
name: 'Lights',
|
||||||
|
switchValue: lightsSwitchValue,
|
||||||
|
type: DeviceType.Lights,
|
||||||
|
page: const LightsView(),
|
||||||
|
),
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [],
|
||||||
|
icon: Assets.iconsDoorLock,
|
||||||
|
name: 'Doors',
|
||||||
|
switchValue: doorSwitchValue,
|
||||||
|
type: DeviceType.Door,
|
||||||
|
page: const DoorView(),
|
||||||
|
),
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [],
|
||||||
|
icon: Assets.iconsCurtain,
|
||||||
|
name: 'Curtains',
|
||||||
|
switchValue: curtainSwitchValue,
|
||||||
|
type: DeviceType.Curtain,
|
||||||
|
page: const CurtainView(),
|
||||||
|
),
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [],
|
||||||
|
icon: Assets.iconsScreen,
|
||||||
|
name: 'Screens',
|
||||||
|
switchValue: screensSwitchValue,
|
||||||
|
type: DeviceType.Screens,
|
||||||
|
page: const ScreensView(),
|
||||||
|
),
|
||||||
|
DevicesCategoryModel(
|
||||||
|
devices: [],
|
||||||
|
icon: Assets.iconsGateway,
|
||||||
|
name: 'Gateway',
|
||||||
|
switchValue: gatewaySwitchValue,
|
||||||
|
type: DeviceType.Gateway,
|
||||||
|
page: const GateWayView(),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
Future<List<DevicesCategoryModel>> getCategories() async {
|
Widget? get chosenCategory {
|
||||||
emit(DevicesLoading());
|
for (var category in categories) {
|
||||||
await Future.delayed(const Duration(seconds: 2));
|
if (category.isSelected) {
|
||||||
emit(DevicesSuccess());
|
return category.page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return categories = [
|
void updateCategory(int index) {
|
||||||
DevicesCategoryModel(
|
for (var i = 0; i < categories.length; i++) {
|
||||||
devices: [],
|
if (i == index) {
|
||||||
icon: IconsManager.ac,
|
categories[i].isSelected = true;
|
||||||
name: 'ACs',
|
} else {
|
||||||
switchValue: false,
|
categories[i].isSelected = false;
|
||||||
type: DeviceType.AC,
|
}
|
||||||
),
|
}
|
||||||
DevicesCategoryModel(
|
emit(DevicesCategoryChanged());
|
||||||
devices: [],
|
}
|
||||||
icon: IconsManager.light,
|
|
||||||
name: 'Lights',
|
static void clearCategoriesSelection() {
|
||||||
switchValue: false,
|
for (var category in categories) {
|
||||||
type: DeviceType.Lights,
|
category.isSelected = false;
|
||||||
),
|
}
|
||||||
DevicesCategoryModel(
|
|
||||||
devices: [],
|
|
||||||
icon: IconsManager.doorLock,
|
|
||||||
name: 'Doors',
|
|
||||||
switchValue: false,
|
|
||||||
type: DeviceType.Door,
|
|
||||||
),
|
|
||||||
DevicesCategoryModel(
|
|
||||||
devices: [],
|
|
||||||
icon: IconsManager.curtain,
|
|
||||||
name: 'Curtains',
|
|
||||||
switchValue: false,
|
|
||||||
type: DeviceType.Curtain,
|
|
||||||
),
|
|
||||||
DevicesCategoryModel(
|
|
||||||
devices: [],
|
|
||||||
icon: IconsManager.screen,
|
|
||||||
name: 'Screens',
|
|
||||||
switchValue: false,
|
|
||||||
type: DeviceType.Screens,
|
|
||||||
),
|
|
||||||
DevicesCategoryModel(
|
|
||||||
devices: [],
|
|
||||||
icon: IconsManager.gateway,
|
|
||||||
name: 'Gateway',
|
|
||||||
switchValue: false,
|
|
||||||
type: DeviceType.Gateway,
|
|
||||||
),
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,3 +12,13 @@ class DevicesSuccess extends DevicesState {}
|
|||||||
class DevicesFailure extends DevicesState {}
|
class DevicesFailure extends DevicesState {}
|
||||||
|
|
||||||
class ChangeIndex extends DevicesState {}
|
class ChangeIndex extends DevicesState {}
|
||||||
|
|
||||||
|
class DevicesCategoryChanged extends DevicesState {}
|
||||||
|
|
||||||
|
class CategorySwitchChanged extends DevicesState {}
|
||||||
|
|
||||||
|
class SwitchACsOff extends DevicesState {}
|
||||||
|
|
||||||
|
class SwitchACsOn extends DevicesState {}
|
||||||
|
|
||||||
|
class SetACsTemp extends DevicesState {}
|
||||||
|
19
lib/features/devices/model/ac_model.dart
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
class ACModel {
|
||||||
|
final String name;
|
||||||
|
final String id;
|
||||||
|
late bool status;
|
||||||
|
late double temperature;
|
||||||
|
|
||||||
|
late int fanSpeed;
|
||||||
|
|
||||||
|
late int tempMode;
|
||||||
|
|
||||||
|
ACModel({
|
||||||
|
required this.name,
|
||||||
|
required this.id,
|
||||||
|
required this.status,
|
||||||
|
required this.temperature,
|
||||||
|
required this.fanSpeed,
|
||||||
|
required this.tempMode,
|
||||||
|
});
|
||||||
|
}
|
@ -1,16 +1,23 @@
|
|||||||
import 'device_model.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
import 'ac_model.dart';
|
||||||
|
|
||||||
class DevicesCategoryModel {
|
class DevicesCategoryModel {
|
||||||
final String name;
|
final String name;
|
||||||
final String icon;
|
final String icon;
|
||||||
|
|
||||||
final bool switchValue;
|
final Widget page;
|
||||||
final List<DeviceModel> devices;
|
|
||||||
|
bool switchValue;
|
||||||
|
final List<ACModel> devices;
|
||||||
|
|
||||||
final DeviceType type;
|
final DeviceType type;
|
||||||
|
bool isSelected;
|
||||||
|
|
||||||
DevicesCategoryModel(
|
DevicesCategoryModel(
|
||||||
{required this.type,
|
{this.isSelected = false,
|
||||||
|
required this.page,
|
||||||
|
required this.type,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.icon,
|
required this.icon,
|
||||||
required this.switchValue,
|
required this.switchValue,
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
class DeviceModel {
|
|
||||||
final String name;
|
|
||||||
final String imageUrl;
|
|
||||||
final String description;
|
|
||||||
final String category;
|
|
||||||
final String id;
|
|
||||||
|
|
||||||
DeviceModel(
|
|
||||||
{required this.name,
|
|
||||||
required this.imageUrl,
|
|
||||||
required this.description,
|
|
||||||
required this.category,
|
|
||||||
required this.id});
|
|
||||||
}
|
|
75
lib/features/devices/view/widgets/a_c_control_unit.dart
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
|
||||||
|
class ACControlUnit extends StatefulWidget {
|
||||||
|
const ACControlUnit({
|
||||||
|
super.key,
|
||||||
|
required this.model,
|
||||||
|
});
|
||||||
|
|
||||||
|
final ACModel model;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ACControlUnit> createState() => _ACControlUnitState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ACControlUnitState extends State<ACControlUnit> {
|
||||||
|
var fanSpeeds = [
|
||||||
|
Assets.iconsFan0,
|
||||||
|
Assets.iconsFan1,
|
||||||
|
Assets.iconsFan2,
|
||||||
|
Assets.iconsFan3,
|
||||||
|
];
|
||||||
|
|
||||||
|
var tempModes = [
|
||||||
|
Assets.iconsSunnyMode,
|
||||||
|
Assets.iconsColdMode,
|
||||||
|
Assets.iconsWindyMode,
|
||||||
|
];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
widget.model.fanSpeed =
|
||||||
|
widget.model.fanSpeed == 3 ? 0 : widget.model.fanSpeed + 1;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: DefaultContainer(
|
||||||
|
height: 55,
|
||||||
|
child: Center(
|
||||||
|
child: SvgPicture.asset(fanSpeeds[widget.model.fanSpeed]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
widget.model.tempMode =
|
||||||
|
widget.model.tempMode == 2 ? 0 : widget.model.tempMode + 1;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: DefaultContainer(
|
||||||
|
height: 55,
|
||||||
|
child: Center(
|
||||||
|
child: SvgPicture.asset(tempModes[widget.model.tempMode]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
72
lib/features/devices/view/widgets/ac_view.dart
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/bloc/ac_cubit.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/a_c_control_unit.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/devices_temp_widget.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/universal_a_c_switch.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/view/widgets/universal_a_c_temp.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/devices_default_switch.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||||
|
|
||||||
|
class ACView extends StatelessWidget {
|
||||||
|
const ACView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocProvider(
|
||||||
|
create: (context) => AcCubit(),
|
||||||
|
child: BlocBuilder<AcCubit, AcState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
// universal AC controller
|
||||||
|
const Gap(10),
|
||||||
|
const BodySmall(text: "All ACs"),
|
||||||
|
const Gap(5),
|
||||||
|
const UniversalACSwitch(),
|
||||||
|
const Gap(10),
|
||||||
|
const UniversalACTemp(),
|
||||||
|
const Gap(10),
|
||||||
|
|
||||||
|
// other ACs controller
|
||||||
|
ListView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
padding: const EdgeInsets.all(0),
|
||||||
|
itemCount: DevicesCubit.categories[0].devices.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
BodySmall(
|
||||||
|
text:
|
||||||
|
DevicesCubit.categories[0].devices[index].name),
|
||||||
|
const Gap(5),
|
||||||
|
DevicesDefaultSwitch(
|
||||||
|
model: DevicesCubit.categories[0].devices[index],
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
DevicesTempWidget(
|
||||||
|
model: DevicesCubit.categories[0].devices[index],
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
ACControlUnit(
|
||||||
|
model: DevicesCubit.categories[0].devices[index],
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
10
lib/features/devices/view/widgets/curtain_view.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class CurtainView extends StatelessWidget {
|
||||||
|
const CurtainView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Placeholder();
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||||
|
|
||||||
class DevicesModeTab extends StatelessWidget {
|
class DevicesModeTab extends StatelessWidget {
|
||||||
@ -30,7 +30,7 @@ class DevicesModeTab extends StatelessWidget {
|
|||||||
height: 30,
|
height: 30,
|
||||||
width: 25,
|
width: 25,
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
IconsManager.winter,
|
Assets.iconsWinter,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -58,7 +58,7 @@ class DevicesModeTab extends StatelessWidget {
|
|||||||
height: 30,
|
height: 30,
|
||||||
width: 25,
|
width: 25,
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
IconsManager.summer,
|
Assets.iconsSummer,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
74
lib/features/devices/view/widgets/devices_temp_widget.dart
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
|
||||||
|
import 'package:syncrow_app/utils/context_extension.dart';
|
||||||
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
|
||||||
|
class DevicesTempWidget extends StatefulWidget {
|
||||||
|
const DevicesTempWidget({
|
||||||
|
super.key,
|
||||||
|
required this.model,
|
||||||
|
});
|
||||||
|
|
||||||
|
final ACModel model;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<DevicesTempWidget> createState() => _DevicesTempWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DevicesTempWidgetState extends State<DevicesTempWidget> {
|
||||||
|
// double temp = widget.model.temperature;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return DefaultContainer(
|
||||||
|
height: 60,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox.square(
|
||||||
|
dimension: 24,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
// temp = temp - .5;
|
||||||
|
widget.model.temperature = widget.model.temperature - .5;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
Assets.iconsMinus,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BodyLarge(
|
||||||
|
text: "${widget.model.temperature}° C",
|
||||||
|
style: context.bodyLarge.copyWith(
|
||||||
|
color: ColorsManager.primaryColor.withOpacity(0.6),
|
||||||
|
fontSize: 23,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox.square(
|
||||||
|
dimension: 24,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
// temp = temp + .5
|
||||||
|
widget.model.temperature = widget.model.temperature + .5;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
Assets.iconsPlus,
|
||||||
|
height: 24,
|
||||||
|
width: 24,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
import 'package:syncrow_app/features/devices/view/widgets/categories_view.dart';
|
import 'package:syncrow_app/features/devices/view/widgets/categories_view.dart';
|
||||||
|
|
||||||
import '../../bloc/devices_cubit.dart';
|
import '../../bloc/devices_cubit.dart';
|
||||||
import 'no_devices_view.dart';
|
|
||||||
|
|
||||||
class DevicesViewBody extends StatelessWidget {
|
class DevicesViewBody extends StatelessWidget {
|
||||||
const DevicesViewBody({
|
const DevicesViewBody({
|
||||||
@ -13,17 +12,15 @@ class DevicesViewBody extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (context) => DevicesCubit(),
|
create: (context) => DevicesCubit(),
|
||||||
child: BlocBuilder<DevicesCubit, DevicesState>(
|
child: BlocBuilder<DevicesCubit, DevicesState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return state is DevicesLoading
|
return state is DevicesLoading
|
||||||
? const Center(child: CircularProgressIndicator())
|
? const Center(child: CircularProgressIndicator())
|
||||||
: state is DevicesSuccess
|
: DevicesCubit.get(context).chosenCategory ??
|
||||||
? DevicesCubit.get(context).categories.isEmpty
|
const CategoriesView();
|
||||||
? const NoDevicesView()
|
},
|
||||||
: const CategoriesView()
|
),
|
||||||
: const Center(child: Text('Error'));
|
);
|
||||||
},
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
lib/features/devices/view/widgets/door_view.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class DoorView extends StatelessWidget {
|
||||||
|
const DoorView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Placeholder();
|
||||||
|
}
|
||||||
|
}
|
10
lib/features/devices/view/widgets/gateway_view.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class GateWayView extends StatelessWidget {
|
||||||
|
const GateWayView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Placeholder();
|
||||||
|
}
|
||||||
|
}
|
10
lib/features/devices/view/widgets/lights_view.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class LightsView extends StatelessWidget {
|
||||||
|
const LightsView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Placeholder();
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/default_text_button.dart';
|
import 'package:syncrow_app/features/shared_widgets/default_text_button.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
|
|
||||||
class NoDevicesView extends StatelessWidget {
|
class NoDevicesView extends StatelessWidget {
|
||||||
const NoDevicesView({
|
const NoDevicesView({
|
||||||
@ -15,7 +15,7 @@ class NoDevicesView extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
ImageManager.boxEmpty,
|
Assets.imagesBoxEmpty,
|
||||||
opacity: const AlwaysStoppedAnimation(0.5),
|
opacity: const AlwaysStoppedAnimation(0.5),
|
||||||
scale: 1,
|
scale: 1,
|
||||||
width: 140,
|
width: 140,
|
||||||
|
10
lib/features/devices/view/widgets/screens_view.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ScreensView extends StatelessWidget {
|
||||||
|
const ScreensView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Placeholder();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/custom_switch.dart';
|
import 'package:syncrow_app/features/shared_widgets/custom_switch.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||||
@ -13,51 +14,60 @@ class Switches extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return GridView.builder(
|
return BlocBuilder<DevicesCubit, DevicesState>(
|
||||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
builder: (context, state) {
|
||||||
crossAxisCount: 2,
|
return GridView.builder(
|
||||||
crossAxisSpacing: 10,
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
mainAxisSpacing: 10,
|
crossAxisCount: 2,
|
||||||
childAspectRatio: 1.5,
|
crossAxisSpacing: 10,
|
||||||
),
|
mainAxisSpacing: 10,
|
||||||
padding: const EdgeInsets.only(top: 10),
|
childAspectRatio: 1.5,
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
|
||||||
shrinkWrap: true,
|
|
||||||
itemCount: DevicesCubit.get(context).categories.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
return DefaultContainer(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
SvgPicture.asset(
|
|
||||||
DevicesCubit.get(context).categories[index].icon,
|
|
||||||
fit: BoxFit.contain,
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
width: 30,
|
|
||||||
height: 20,
|
|
||||||
child: CustomSwitch(
|
|
||||||
value: DevicesCubit.get(context)
|
|
||||||
.categories[index]
|
|
||||||
.switchValue,
|
|
||||||
onChanged: (value) => DevicesCubit.get(context)
|
|
||||||
.changeSwitchValue(
|
|
||||||
DevicesCubit.get(context).categories[index].type),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
BodyLarge(
|
|
||||||
text: DevicesCubit.get(context).categories[index].name,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
|
padding: const EdgeInsets.only(top: 10),
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: DevicesCubit.categories.length,
|
||||||
|
itemBuilder: (_, index) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: () => DevicesCubit.get(context).updateCategory(index),
|
||||||
|
child: DefaultContainer(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
DevicesCubit.categories[index].icon,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 30,
|
||||||
|
height: 20,
|
||||||
|
child: CustomSwitch(
|
||||||
|
// value: DevicesCubit
|
||||||
|
// .categories[index]
|
||||||
|
// .switchValue,
|
||||||
|
//
|
||||||
|
// onChanged: (value) => DevicesCubit.get(context)
|
||||||
|
// .changeSwitchValue( DevicesCubit
|
||||||
|
// .categories[index]
|
||||||
|
// .switchValue),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
BodyLarge(
|
||||||
|
text: DevicesCubit.categories[index].name,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
70
lib/features/devices/view/widgets/universal_a_c_switch.dart
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../../../../utils/resource_manager/color_manager.dart';
|
||||||
|
import '../../../shared_widgets/text_widgets/body_medium.dart';
|
||||||
|
import '../../bloc/ac_cubit.dart';
|
||||||
|
|
||||||
|
class UniversalACSwitch extends StatelessWidget {
|
||||||
|
const UniversalACSwitch({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
bool acsStatus = AcCubit.get(context).areAllACsOff();
|
||||||
|
|
||||||
|
//TODO: Move these to String Manager "ON" and "OFF"
|
||||||
|
return Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
AcCubit.get(context).turnAllACsOn();
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 60,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: acsStatus ? ColorsManager.primaryColor : Colors.white,
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(15),
|
||||||
|
bottomLeft: Radius.circular(15),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: BodyMedium(
|
||||||
|
text: "ON",
|
||||||
|
fontColor: acsStatus ? Colors.white : null,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
AcCubit.get(context).turnAllACsOff();
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 60,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: acsStatus ? Colors.white : ColorsManager.primaryColor,
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
topRight: Radius.circular(15),
|
||||||
|
bottomRight: Radius.circular(15),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: BodyMedium(
|
||||||
|
text: "OFF",
|
||||||
|
fontColor: acsStatus ? null : Colors.white,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
59
lib/features/devices/view/widgets/universal_a_c_temp.dart
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/bloc/ac_cubit.dart';
|
||||||
|
import 'package:syncrow_app/utils/context_extension.dart';
|
||||||
|
|
||||||
|
import '../../../../generated/assets.dart';
|
||||||
|
import '../../../../utils/resource_manager/color_manager.dart';
|
||||||
|
import '../../../shared_widgets/default_container.dart';
|
||||||
|
import '../../../shared_widgets/text_widgets/body_large.dart';
|
||||||
|
|
||||||
|
class UniversalACTemp extends StatelessWidget {
|
||||||
|
const UniversalACTemp({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
double averageTemp = AcCubit.get(context).averageTempForAll();
|
||||||
|
return DefaultContainer(
|
||||||
|
height: 60,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox.square(
|
||||||
|
dimension: 24,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
AcCubit.get(context).setTempToAll(averageTemp + .5);
|
||||||
|
},
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
Assets.iconsMinus,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BodyLarge(
|
||||||
|
text: "${AcCubit.get(context).averageTempForAll()}° C",
|
||||||
|
style: context.bodyLarge.copyWith(
|
||||||
|
color: ColorsManager.primaryColor.withOpacity(0.6),
|
||||||
|
fontSize: 23,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox.square(
|
||||||
|
dimension: 24,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
AcCubit.get(context).setTempToAll(averageTemp + .5);
|
||||||
|
},
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
Assets.iconsPlus,
|
||||||
|
height: 24,
|
||||||
|
width: 24,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -8,13 +8,14 @@ class LayoutPage extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (context) => LayoutCubit(),
|
create: (context) => LayoutCubit(),
|
||||||
child: BlocBuilder<LayoutCubit, LayoutState>(
|
child: BlocBuilder<LayoutCubit, LayoutState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return const Center(
|
return const Center(
|
||||||
child: Text('Layout Page'),
|
child: Text('Layout Page'),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
));
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:syncrow_app/features/menu/bloc/menu_cubit.dart';
|
import 'package:syncrow_app/features/menu/bloc/menu_cubit.dart';
|
||||||
import 'package:syncrow_app/features/menu/view/widgets/menu_list.dart';
|
import 'package:syncrow_app/features/menu/view/widgets/menu_list.dart';
|
||||||
|
import 'package:syncrow_app/features/menu/view/widgets/profile_tab.dart';
|
||||||
|
|
||||||
class MenuView extends StatelessWidget {
|
class MenuView extends StatelessWidget {
|
||||||
const MenuView({super.key});
|
const MenuView({super.key});
|
||||||
@ -15,10 +16,12 @@ class MenuView extends StatelessWidget {
|
|||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
physics: const BouncingScrollPhysics(),
|
physics: const BouncingScrollPhysics(),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: MenuCubit.of(context)
|
children: [
|
||||||
.menuLists
|
const ProfileTab(),
|
||||||
.map((list) => MenuList(listModel: list))
|
...MenuCubit.of(context)
|
||||||
.toList(),
|
.menuLists
|
||||||
|
.map((list) => MenuList(listModel: list))
|
||||||
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -19,6 +19,7 @@ class MenuList extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
children: [
|
children: [
|
||||||
|
const Gap(5),
|
||||||
BodySmall(
|
BodySmall(
|
||||||
text: listModel.label!,
|
text: listModel.label!,
|
||||||
),
|
),
|
||||||
|
55
lib/features/menu/view/widgets/profile_tab.dart
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||||
|
|
||||||
|
import '../../../shared_widgets/syncrow_logo.dart';
|
||||||
|
|
||||||
|
class ProfileTab extends StatelessWidget {
|
||||||
|
const ProfileTab({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return const Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 10),
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
Gap(20),
|
||||||
|
DefaultContainer(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
BodyMedium(
|
||||||
|
text: "Karim",
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
BodySmall(text: "Syncrow Account")
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 20,
|
||||||
|
top: 0,
|
||||||
|
child: CircleAvatar(
|
||||||
|
radius: 38,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
child: CircleAvatar(
|
||||||
|
radius: 37,
|
||||||
|
backgroundColor: Colors.grey,
|
||||||
|
child: SyncrowLogo(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -13,6 +13,7 @@ class SceneCubit extends Cubit<SceneState> {
|
|||||||
|
|
||||||
void getScenes() {
|
void getScenes() {
|
||||||
emit(SceneLoading());
|
emit(SceneLoading());
|
||||||
|
//TODO: remove this it's causing the Bad State because its being after the cubit is closed
|
||||||
Future.delayed(const Duration(seconds: 5), () {
|
Future.delayed(const Duration(seconds: 5), () {
|
||||||
emit(SceneSuccess());
|
emit(SceneSuccess());
|
||||||
});
|
});
|
||||||
|
@ -6,7 +6,7 @@ import 'package:syncrow_app/features/shared_widgets/default_container.dart';
|
|||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/title_medium.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
|
||||||
|
|
||||||
class SceneView extends StatelessWidget {
|
class SceneView extends StatelessWidget {
|
||||||
@ -51,7 +51,7 @@ class SceneView extends StatelessWidget {
|
|||||||
Image.asset(
|
Image.asset(
|
||||||
height: 50,
|
height: 50,
|
||||||
width: 50,
|
width: 50,
|
||||||
IconsManager.summerMode,
|
Assets.iconsHot1,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
const Icon(
|
const Icon(
|
||||||
@ -79,6 +79,7 @@ class SceneView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
child: DefaultContainer(
|
child: DefaultContainer(
|
||||||
child: Column(
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@ -87,7 +88,7 @@ class SceneView extends StatelessWidget {
|
|||||||
Image.asset(
|
Image.asset(
|
||||||
height: 50,
|
height: 50,
|
||||||
width: 50,
|
width: 50,
|
||||||
IconsManager.winterMode,
|
Assets.iconsWinter1,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
const Icon(
|
const Icon(
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:syncrow_app/features/shared_widgets/default_text_button.dart';
|
import 'package:syncrow_app/features/shared_widgets/default_text_button.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
|
|
||||||
class SceneViewNoScenes extends StatelessWidget {
|
class SceneViewNoScenes extends StatelessWidget {
|
||||||
const SceneViewNoScenes({
|
const SceneViewNoScenes({
|
||||||
@ -17,7 +17,7 @@ class SceneViewNoScenes extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
ImageManager.automation,
|
Assets.imagesAutomation,
|
||||||
scale: 1,
|
scale: 1,
|
||||||
opacity: const AlwaysStoppedAnimation(.5),
|
opacity: const AlwaysStoppedAnimation(.5),
|
||||||
width: 140,
|
width: 140,
|
||||||
|
@ -2,10 +2,14 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
class CustomSwitch extends StatefulWidget {
|
class CustomSwitch extends StatefulWidget {
|
||||||
final bool value;
|
// final bool value;
|
||||||
final ValueChanged<bool> onChanged;
|
// final ValueChanged<bool> onChanged;
|
||||||
|
|
||||||
const CustomSwitch({super.key, required this.value, required this.onChanged});
|
const CustomSwitch({
|
||||||
|
super.key,
|
||||||
|
// required this.value,
|
||||||
|
// required this.onChanged,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_CustomSwitchState createState() => _CustomSwitchState();
|
_CustomSwitchState createState() => _CustomSwitchState();
|
||||||
@ -16,14 +20,20 @@ class _CustomSwitchState extends State<CustomSwitch>
|
|||||||
Animation? _circleAnimation;
|
Animation? _circleAnimation;
|
||||||
AnimationController? _animationController;
|
AnimationController? _animationController;
|
||||||
|
|
||||||
|
bool value = false;
|
||||||
|
|
||||||
|
void onChange(bool customValue){
|
||||||
|
value = customValue ;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_animationController = AnimationController(
|
_animationController = AnimationController(
|
||||||
vsync: this, duration: const Duration(milliseconds: 100));
|
vsync: this, duration: const Duration(milliseconds: 100));
|
||||||
_circleAnimation = AlignmentTween(
|
_circleAnimation = AlignmentTween(
|
||||||
begin: widget.value ? Alignment.centerRight : Alignment.centerLeft,
|
begin: value ? Alignment.centerRight : Alignment.centerLeft,
|
||||||
end: widget.value ? Alignment.centerLeft : Alignment.centerRight)
|
end: value ? Alignment.centerLeft : Alignment.centerRight)
|
||||||
.animate(CurvedAnimation(
|
.animate(CurvedAnimation(
|
||||||
parent: _animationController!, curve: Curves.linear));
|
parent: _animationController!, curve: Curves.linear));
|
||||||
}
|
}
|
||||||
@ -35,12 +45,14 @@ class _CustomSwitchState extends State<CustomSwitch>
|
|||||||
builder: (context, child) {
|
builder: (context, child) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
_animationController!.isCompleted
|
setState(() {
|
||||||
? _animationController!.reverse()
|
_animationController!.isCompleted
|
||||||
: _animationController!.forward();
|
? _animationController!.reverse()
|
||||||
widget.value == false
|
: _animationController!.forward();
|
||||||
? widget.onChanged(true)
|
value == false
|
||||||
: widget.onChanged(false);
|
? onChange(true)
|
||||||
|
: onChange(false);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
width: 45.0,
|
width: 45.0,
|
||||||
@ -54,13 +66,9 @@ class _CustomSwitchState extends State<CustomSwitch>
|
|||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(2.0),
|
padding: const EdgeInsets.all(2.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
alignment: widget.value
|
alignment: value
|
||||||
? ((Directionality.of(context) == TextDirection.rtl)
|
|
||||||
? Alignment.centerRight
|
? Alignment.centerRight
|
||||||
: Alignment.centerLeft)
|
: Alignment.centerLeft,
|
||||||
: ((Directionality.of(context) == TextDirection.rtl)
|
|
||||||
? Alignment.centerLeft
|
|
||||||
: Alignment.centerRight),
|
|
||||||
child: Container(
|
child: Container(
|
||||||
width: 20.0,
|
width: 20.0,
|
||||||
height: 20.0,
|
height: 20.0,
|
||||||
|
@ -4,13 +4,19 @@ class DefaultContainer extends StatelessWidget {
|
|||||||
const DefaultContainer({
|
const DefaultContainer({
|
||||||
super.key,
|
super.key,
|
||||||
required this.child,
|
required this.child,
|
||||||
|
this.height,
|
||||||
|
this.width,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final double? height;
|
||||||
|
final double? width;
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
|
height: height,
|
||||||
|
width: width,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
|
83
lib/features/shared_widgets/devices_default_switch.dart
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/model/ac_model.dart';
|
||||||
|
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
|
||||||
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
|
|
||||||
|
class DevicesDefaultSwitch extends StatefulWidget {
|
||||||
|
const DevicesDefaultSwitch({
|
||||||
|
super.key,
|
||||||
|
required this.model,
|
||||||
|
});
|
||||||
|
|
||||||
|
final ACModel model;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<DevicesDefaultSwitch> createState() => _DevicesDefaultSwitchState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DevicesDefaultSwitchState extends State<DevicesDefaultSwitch> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
// isOn = !isOn;
|
||||||
|
widget.model.status = !widget.model.status;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 60,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: widget.model.status
|
||||||
|
? ColorsManager.primaryColor
|
||||||
|
: Colors.white,
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(15),
|
||||||
|
bottomLeft: Radius.circular(15),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: BodyMedium(
|
||||||
|
text: "ON",
|
||||||
|
fontColor: widget.model.status ? Colors.white : null,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
widget.model.status = !widget.model.status;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 60,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: widget.model.status
|
||||||
|
? Colors.white
|
||||||
|
: ColorsManager.primaryColor,
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
topRight: Radius.circular(15),
|
||||||
|
bottomRight: Radius.circular(15),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: BodyMedium(
|
||||||
|
text: "OFF",
|
||||||
|
fontColor: widget.model.status ? null : Colors.white,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
|
|
||||||
class SyncrowLogo extends StatelessWidget {
|
class SyncrowLogo extends StatelessWidget {
|
||||||
const SyncrowLogo({
|
const SyncrowLogo({
|
||||||
@ -14,7 +14,7 @@ class SyncrowLogo extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Image.asset(isDark ? ImageManager.blackLogo : ImageManager.whiteLogo,
|
return Image.asset(isDark ? Assets.imagesBlackLogo : Assets.imagesWhiteLogo,
|
||||||
scale: 1, width: width);
|
scale: 1, width: width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ class BodyLarge extends StatelessWidget {
|
|||||||
this.style,
|
this.style,
|
||||||
this.height,
|
this.height,
|
||||||
this.fontWeight,
|
this.fontWeight,
|
||||||
|
this.fontColor,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String text;
|
final String text;
|
||||||
@ -22,11 +23,17 @@ class BodyLarge extends StatelessWidget {
|
|||||||
|
|
||||||
final FontWeight? fontWeight;
|
final FontWeight? fontWeight;
|
||||||
|
|
||||||
|
final Color? fontColor;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => CustomText(
|
Widget build(BuildContext context) => CustomText(
|
||||||
text,
|
text,
|
||||||
style: style ?? context.bodyLarge.copyWith(height: height ?? 1.5),
|
|
||||||
textAlign: textAlign,
|
textAlign: textAlign,
|
||||||
fontWeight: fontWeight,
|
style: style ??
|
||||||
|
context.bodyLarge.copyWith(
|
||||||
|
height: height ?? 1.5,
|
||||||
|
fontWeight: fontWeight,
|
||||||
|
color: fontColor,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
|
||||||
|
|
||||||
class CustomText extends StatelessWidget {
|
class CustomText extends StatelessWidget {
|
||||||
const CustomText(this.text,
|
const CustomText(this.text,
|
||||||
@ -31,10 +30,7 @@ class CustomText extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return SelectableText(
|
return SelectableText(
|
||||||
text,
|
text,
|
||||||
style: style!.copyWith(
|
style: style,
|
||||||
fontSize: fontSize,
|
|
||||||
color: fontColor ?? ColorsManager.textPrimaryColor,
|
|
||||||
fontWeight: fontWeight),
|
|
||||||
textAlign: textAlign,
|
textAlign: textAlign,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
minLines: minLines,
|
minLines: minLines,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:syncrow_app/features/splash/view/widgets/user_agreement_dialog.dart';
|
import 'package:syncrow_app/features/splash/view/widgets/user_agreement_dialog.dart';
|
||||||
|
import 'package:syncrow_app/generated/assets.dart';
|
||||||
import 'package:syncrow_app/navigation/routing_constants.dart';
|
import 'package:syncrow_app/navigation/routing_constants.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
|
||||||
|
|
||||||
class SplashView extends StatelessWidget {
|
class SplashView extends StatelessWidget {
|
||||||
const SplashView({super.key});
|
const SplashView({super.key});
|
||||||
@ -28,7 +28,7 @@ class SplashView extends StatelessWidget {
|
|||||||
builder: (context) => const UserAgreementDialog(),
|
builder: (context) => const UserAgreementDialog(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Image.asset(ImageManager.blackLogo)),
|
child: Image.asset(Assets.imagesBlackLogo)),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -2,20 +2,51 @@
|
|||||||
class Assets {
|
class Assets {
|
||||||
Assets._();
|
Assets._();
|
||||||
|
|
||||||
|
static const String assetsIconsHome = 'assets/icons/home.svg';
|
||||||
static const String fontsAftikaRegular = 'assets/fonts/AftikaRegular.ttf';
|
static const String fontsAftikaRegular = 'assets/fonts/AftikaRegular.ttf';
|
||||||
static const String iconsDashboard = 'assets/icons/dashboard-fill.svg';
|
static const String iconsAC = 'assets/icons/AC.svg';
|
||||||
static const String iconsDashboardFill = 'assets/icons/dashboard.svg';
|
static const String iconsActive = 'assets/icons/active.svg';
|
||||||
|
static const String iconsCO2 = 'assets/icons/CO2.svg';
|
||||||
|
static const String iconsColdMode = 'assets/icons/coldMode.svg';
|
||||||
|
static const String iconsCurtain = 'assets/icons/Curtain.svg';
|
||||||
|
static const String iconsDashboard = 'assets/icons/dashboard.svg';
|
||||||
|
static const String iconsDashboardFill = 'assets/icons/dashboard-fill.svg';
|
||||||
static const String iconsDevices = 'assets/icons/Devices.svg';
|
static const String iconsDevices = 'assets/icons/Devices.svg';
|
||||||
static const String iconsDevicesFill = 'assets/icons/Devices-fill.svg';
|
static const String iconsDevicesFill = 'assets/icons/Devices-fill.svg';
|
||||||
static const String iconsHome = 'assets/icons/home.svg';
|
static const String iconsDoorLock = 'assets/icons/doorLock.svg';
|
||||||
|
static const String iconsFan0 = 'assets/icons/fan-0.svg';
|
||||||
|
static const String iconsFan1 = 'assets/icons/fan-1.svg';
|
||||||
|
static const String iconsFan2 = 'assets/icons/fan-2.svg';
|
||||||
|
static const String iconsFan3 = 'assets/icons/fan-3.svg';
|
||||||
|
static const String iconsFrequency = 'assets/icons/frequency.svg';
|
||||||
|
static const String iconsGateway = 'assets/icons/Gateway.svg';
|
||||||
|
static const String iconsHome = 'assets/icons/home.jpg';
|
||||||
|
static const String iconsHome2 = 'assets/icons/home-2.svg';
|
||||||
|
static const String iconsHot1 = 'assets/icons/hot1.jpg';
|
||||||
static const String iconsLayout = 'assets/icons/Layout.svg';
|
static const String iconsLayout = 'assets/icons/Layout.svg';
|
||||||
static const String iconsLayoutFill = 'assets/icons/Layout-fill.svg';
|
static const String iconsLayoutFill = 'assets/icons/Layout-fill.svg';
|
||||||
|
static const String iconsLight = 'assets/icons/Light.svg';
|
||||||
static const String iconsMenu = 'assets/icons/Menu.svg';
|
static const String iconsMenu = 'assets/icons/Menu.svg';
|
||||||
static const String iconsMenuFill = 'assets/icons/Menu-fill.svg';
|
static const String iconsMenuFill = 'assets/icons/Menu-fill.svg';
|
||||||
|
static const String iconsMinus = 'assets/icons/minus.svg';
|
||||||
|
static const String iconsPlus = 'assets/icons/plus.svg';
|
||||||
static const String iconsRoutineFill = 'assets/icons/Routine-fill.svg';
|
static const String iconsRoutineFill = 'assets/icons/Routine-fill.svg';
|
||||||
static const String iconsRoutines = 'assets/icons/Routines.svg';
|
static const String iconsRoutines = 'assets/icons/Routines.svg';
|
||||||
|
static const String iconsScreen = 'assets/icons/Screen.svg';
|
||||||
|
static const String iconsSummer = 'assets/icons/Summer.svg';
|
||||||
|
static const String iconsSummerMode = 'assets/icons/summer_mode.svg';
|
||||||
|
static const String iconsSunnyMode = 'assets/icons/sunnyMode.svg';
|
||||||
|
static const String iconsSustainability = 'assets/icons/sustainability.svg';
|
||||||
|
static const String iconsVoltMeter = 'assets/icons/volt-meter.svg';
|
||||||
|
static const String iconsWindyMode = 'assets/icons/windyMode.svg';
|
||||||
|
static const String iconsWinter = 'assets/icons/Winter.svg';
|
||||||
|
static const String iconsWinter1 = 'assets/icons/winter1.jpg';
|
||||||
|
static const String iconsWinterMode = 'assets/icons/Winter_mode.svg';
|
||||||
static const String imagesAutomation = 'assets/images/automation.jpg';
|
static const String imagesAutomation = 'assets/images/automation.jpg';
|
||||||
|
static const String imagesBackground = 'assets/images/Background.png';
|
||||||
static const String imagesBlackLogo = 'assets/images/black-logo.png';
|
static const String imagesBlackLogo = 'assets/images/black-logo.png';
|
||||||
static const String imagesBoxEmpty = 'assets/images/box-empty.jpg';
|
static const String imagesBoxEmpty = 'assets/images/box-empty.jpg';
|
||||||
|
static const String imagesTestDash = 'assets/images/test_dash.png';
|
||||||
|
static const String imagesTestDash2 = 'assets/images/test_dash2.png';
|
||||||
static const String imagesWhiteLogo = 'assets/images/white-logo.png';
|
static const String imagesWhiteLogo = 'assets/images/white-logo.png';
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// ignore_for_file: avoid_print
|
// ignore_for_file: avoid_print
|
||||||
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
|
||||||
|
|
||||||
class MyBlocObserver extends BlocObserver {
|
class MyBlocObserver extends BlocObserver {
|
||||||
@override
|
@override
|
||||||
@ -24,6 +25,9 @@ class MyBlocObserver extends BlocObserver {
|
|||||||
@override
|
@override
|
||||||
void onClose(BlocBase bloc) {
|
void onClose(BlocBase bloc) {
|
||||||
super.onClose(bloc);
|
super.onClose(bloc);
|
||||||
|
if (bloc is DevicesCubit) {
|
||||||
|
DevicesCubit.clearCategoriesSelection();
|
||||||
|
}
|
||||||
print('onClose -- ${bloc.runtimeType}');
|
print('onClose -- ${bloc.runtimeType}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
|
|
||||||
class CacheHelper {
|
|
||||||
static late SharedPreferences sharedPreferences;
|
|
||||||
|
|
||||||
static init() async {
|
|
||||||
sharedPreferences = await SharedPreferences.getInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
static Object? getData({
|
|
||||||
required String key,
|
|
||||||
}) async {
|
|
||||||
return sharedPreferences.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future setData({
|
|
||||||
required String key,
|
|
||||||
required value,
|
|
||||||
}) async {
|
|
||||||
if (value is String) return await sharedPreferences.setString(key, value);
|
|
||||||
if (value is int) return await sharedPreferences.setInt(key, value);
|
|
||||||
if (value is bool) return await sharedPreferences.setBool(key, value);
|
|
||||||
return await sharedPreferences.setDouble(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static dynamic removeData({
|
|
||||||
required String key,
|
|
||||||
}) async {
|
|
||||||
return sharedPreferences.remove(key);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,125 +0,0 @@
|
|||||||
// import 'dart:io';
|
|
||||||
// import 'dart:math';
|
|
||||||
// import 'package:dio/dio.dart';
|
|
||||||
// import 'package:file_picker/file_picker.dart';
|
|
||||||
// import 'package:flutter/material.dart';
|
|
||||||
// import 'package:flutter/services.dart';
|
|
||||||
//
|
|
||||||
// import 'package:path_provider/path_provider.dart';
|
|
||||||
//
|
|
||||||
// class FileHelper {
|
|
||||||
// static Future<Map<String, Uint8List>> takePicture() async {
|
|
||||||
// try {
|
|
||||||
// XFile? pickedImage = await ImagePicker().pickImage(source: ImageSource.camera);
|
|
||||||
// if (pickedImage != null) {
|
|
||||||
// final fileTemp = File(pickedImage.path);
|
|
||||||
// final bytes = fileTemp.readAsBytesSync();
|
|
||||||
// return {pickedImage.path: bytes};
|
|
||||||
// } else {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// } on PlatformException catch (_) {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static Future<Map<String, Uint8List>> pickFile({bool gallery = false}) async {
|
|
||||||
// try {
|
|
||||||
// FilePickerResult? pickedFile;
|
|
||||||
// XFile? pickedFromGallery;
|
|
||||||
// if (gallery) {
|
|
||||||
// final picker = ImagePicker();
|
|
||||||
// pickedFromGallery =
|
|
||||||
// await picker.pickImage(source: ImageSource.gallery, requestFullMetadata: false);
|
|
||||||
// } else {
|
|
||||||
// pickedFile = await FilePicker.platform.pickFiles(
|
|
||||||
// allowedExtensions: ['png', 'jpg', 'jpeg', 'pdf'],
|
|
||||||
// type: FileType.custom,
|
|
||||||
// withReadStream: true,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// if (pickedFile != null) {
|
|
||||||
// String path = pickedFile.files.single.path ?? '';
|
|
||||||
// final fileTemp = File(path);
|
|
||||||
// final bytes = fileTemp.readAsBytesSync();
|
|
||||||
// if (path.isEmpty) {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// return {path: bytes};
|
|
||||||
// } else if (pickedFromGallery != null) {
|
|
||||||
// String path = pickedFromGallery.path;
|
|
||||||
// final fileTemp = File(path);
|
|
||||||
// final bytes = fileTemp.readAsBytesSync();
|
|
||||||
// if (path.isEmpty) {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// return {path: bytes};
|
|
||||||
// } else {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// } on PlatformException catch (_) {
|
|
||||||
// return {};
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Future<String> downloadFile(String url) async {
|
|
||||||
// String filePath;
|
|
||||||
// try {
|
|
||||||
// filePath = await _prepareSaveDir(url);
|
|
||||||
// await HTTPService()
|
|
||||||
// .downloadRequest(path: url, savePath: filePath, expectedResponseModel: (json) {});
|
|
||||||
// } catch (err) {
|
|
||||||
// CustomSnackBar.displaySnackBar('Something went wrong please try again!');
|
|
||||||
// return '';
|
|
||||||
// }
|
|
||||||
// return filePath;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// String getRandomString(int length) {
|
|
||||||
// const chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
|
|
||||||
// Random rnd = Random();
|
|
||||||
//
|
|
||||||
// return String.fromCharCodes(
|
|
||||||
// Iterable.generate(length, (_) => chars.codeUnitAt(rnd.nextInt(chars.length))));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Future<String> _prepareSaveDir(String url) async {
|
|
||||||
// try {
|
|
||||||
// final localPath = (await _findLocalPath(url))!;
|
|
||||||
//
|
|
||||||
// final savedDir = Directory(localPath);
|
|
||||||
// bool hasExisted = await savedDir.exists();
|
|
||||||
// if (!hasExisted) {
|
|
||||||
// await File(savedDir.path).create();
|
|
||||||
// }
|
|
||||||
// return savedDir.path;
|
|
||||||
// } catch (err) {
|
|
||||||
// return '';
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Future<String?> _findLocalPath(String url) async {
|
|
||||||
// String fileName = getRandomString(10);
|
|
||||||
// String fileNameWithExtension = url.contains('pdf') ? '$fileName.pdf' : '$fileName.jpeg';
|
|
||||||
//
|
|
||||||
// if (Platform.isAndroid) {
|
|
||||||
// return "/sdcard/download/$fileNameWithExtension";
|
|
||||||
// } else {
|
|
||||||
// var directory = await getApplicationDocumentsDirectory();
|
|
||||||
// return '${directory.path}${Platform.pathSeparator}$fileNameWithExtension';
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static Future<Uint8List?> fetchPdfContent(final String url) async {
|
|
||||||
// try {
|
|
||||||
// final Response<List<int>> response = await Dio().get<List<int>>(
|
|
||||||
// url,
|
|
||||||
// options: Options(responseType: ResponseType.bytes),
|
|
||||||
// );
|
|
||||||
// return Uint8List.fromList(response.data ?? []);
|
|
||||||
// } catch (e) {
|
|
||||||
// debugPrint(e.toString());
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
@ -1,90 +0,0 @@
|
|||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
|
|
||||||
class SharedPreferencesHelper {
|
|
||||||
// isRegistered flag to know if the user has entered his fullname and email or not (is he registered or not)
|
|
||||||
static bool? isRegistered;
|
|
||||||
|
|
||||||
// flags to detect the mode {regular, onboarding, demo}
|
|
||||||
static bool? isDemo;
|
|
||||||
static bool? isOnBoarding;
|
|
||||||
|
|
||||||
// isDemoAndUseToken flag to use the user token in the header of the request in the demo experience, instead of "Demo" header in situations (1. openning the profile request 2. updating th user data -registeration- request)
|
|
||||||
static bool? isDemoAndUseToken;
|
|
||||||
|
|
||||||
// addedFirstProperty flag to detect if the user has added his first property or not
|
|
||||||
static bool? addedFirstProperty;
|
|
||||||
|
|
||||||
// stores the user id value
|
|
||||||
static String? userIdValue;
|
|
||||||
|
|
||||||
// stores the phone number value
|
|
||||||
static String? phoneNumber;
|
|
||||||
|
|
||||||
//stores the country code of the user phone
|
|
||||||
static String? countryCode;
|
|
||||||
|
|
||||||
// static Future<bool?> getIsDemoValue() async {
|
|
||||||
// isDemo = await readBoolFromSP(KeyConstants.isDemoFlag) ?? false;
|
|
||||||
// return isDemo;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static Future<bool?> getIsOnboardingValue() async {
|
|
||||||
// isOnBoarding = await readBoolFromSP(KeyConstants.isOnboardingFlag);
|
|
||||||
// return isOnBoarding;
|
|
||||||
// }
|
|
||||||
|
|
||||||
static saveStringToSP(String key, String value) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.setString(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static saveBoolToSP(String key, bool value) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.setBool(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static saveIntToSP(String key, int value) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.setInt(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static saveDoubleToSP(String key, double value) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.setDouble(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static saveStringListToSP(String key, List<String> value) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.setStringList(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<String> readStringFromSP(String key) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
String value = prefs.getString(key) ?? '';
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<bool?> readBoolFromSP(String key) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
bool? value = prefs.getBool(key);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<int> readIntFromSP(String key) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
int value = prefs.getInt(key) ?? 0;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<List<String>> readStringListFromSP(String key) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
List<String>? value = prefs.getStringList(key) ?? [];
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<bool> removeValueFromSP(String key) async {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
await prefs.remove(key);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
|
||||||
|
|
||||||
class URLLauncher {
|
|
||||||
static Future<void> sendWhatsapp(
|
|
||||||
{String phoneNumber = '971581497062',
|
|
||||||
String text = 'Hi%2C%20I%20would%20like%20to',
|
|
||||||
String from = ''}) async {
|
|
||||||
Uri launchUri;
|
|
||||||
launchUri = Uri.parse("whatsapp://send?phone=%2B$phoneNumber&text=$text");
|
|
||||||
// Launch the App
|
|
||||||
try {
|
|
||||||
// SegmentEvents.sendTrackEvent(SegmentEventModel(
|
|
||||||
// eventName: 'Whatsapp opened', properties: {'From': from}));
|
|
||||||
//
|
|
||||||
// if (await canLaunchUrl(launchUri) == false) {
|
|
||||||
// CustomSnackBar.displaySnackBar('Could not open whatsapp');
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
await launch(
|
|
||||||
launchUri.toString(),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
await launchUrl(
|
|
||||||
launchUri,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
// CustomSnackBar.displaySnackBar('Could not open whatsapp');
|
|
||||||
throw 'Could not launch $phoneNumber';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<void> sendEmail(
|
|
||||||
{required String email, String subject = '', body = ''}) async {
|
|
||||||
String? encodeQueryParameters(Map<String, String> params) {
|
|
||||||
return params.entries
|
|
||||||
.map((MapEntry<String, String> e) =>
|
|
||||||
'${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}')
|
|
||||||
.join('&');
|
|
||||||
}
|
|
||||||
|
|
||||||
final emailLaunchUri = Uri(
|
|
||||||
scheme: 'mailto',
|
|
||||||
path: email,
|
|
||||||
query: encodeQueryParameters(<String, String>{
|
|
||||||
subject: body,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
try {
|
|
||||||
bool canLaunch = await canLaunchUrl(emailLaunchUri);
|
|
||||||
if (canLaunch) {
|
|
||||||
await launchUrl(emailLaunchUri);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
throw 'Could not launch $emailLaunchUri';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<void> launch(String url) async {
|
|
||||||
Uri parsedUrl = Uri.parse(url);
|
|
||||||
try {
|
|
||||||
bool canLaunch = await canLaunchUrl(parsedUrl);
|
|
||||||
if (canLaunch) {
|
|
||||||
await launchUrl(
|
|
||||||
parsedUrl,
|
|
||||||
// mode: LaunchMode.externalApplication,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
throw 'Url launcher error: ${err.toString()}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
abstract class ImageManager {
|
|
||||||
static const String base = 'assets/images';
|
|
||||||
|
|
||||||
static const String whiteLogo = '$base/white-logo.png';
|
|
||||||
static const String blackLogo = '$base/black-logo.png';
|
|
||||||
static const String boxEmpty = '$base/box-empty.jpg';
|
|
||||||
static const String automation = '$base/automation.jpg';
|
|
||||||
static const String background = '$base/Background.png';
|
|
||||||
static const String testDash = '$base/test_dash.png';
|
|
||||||
static const String testDash2 = '$base/test_dash2.png';
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class IconsManager {
|
|
||||||
static const String base = 'assets/icons';
|
|
||||||
|
|
||||||
static const String home = '$base/home-2.svg';
|
|
||||||
|
|
||||||
static const String dashboardFill = '$base/dashboard-fill.svg';
|
|
||||||
static const String dashboard = '$base/dashboard.svg';
|
|
||||||
|
|
||||||
static const String devices = '$base/Devices.svg';
|
|
||||||
static const String devicesFill = '$base/Devices-fill.svg';
|
|
||||||
|
|
||||||
static const String routine = '$base/Routines.svg';
|
|
||||||
static const String routineFill = '$base/Routine-fill.svg';
|
|
||||||
|
|
||||||
static const String menu = '$base/Menu.svg';
|
|
||||||
static const String menuFill = '$base/Menu-fill.svg';
|
|
||||||
|
|
||||||
static const String layout = '$base/Layout.svg';
|
|
||||||
static const String layoutFill = '$base/Layout-fill.svg';
|
|
||||||
static const String frequency = '$base/frequency.svg';
|
|
||||||
static const String winter = '$base/Winter.svg';
|
|
||||||
static const String active = '$base/active.svg';
|
|
||||||
static const String voltMeter = '$base/volt-meter.svg';
|
|
||||||
static const String summer = '$base/Summer.svg';
|
|
||||||
static const String CO2 = '$base/CO2.svg';
|
|
||||||
static const String sustainability = '$base/sustainability.svg';
|
|
||||||
static const String ac = '$base/AC.svg';
|
|
||||||
static const String curtain = '$base/Curtain.svg';
|
|
||||||
static const String doorLock = '$base/Door Lock.svg';
|
|
||||||
static const String gateway = '$base/Gateway.svg';
|
|
||||||
static const String light = '$base/Light.svg';
|
|
||||||
static const String summerMode = '$base/Hot 1.jpg';
|
|
||||||
static const String winterMode = '$base/Winter 1.jpg';
|
|
||||||
static const String screen = '$base/Screen.svg';
|
|
||||||
}
|
|
48
pubspec.lock
@ -381,6 +381,30 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.7"
|
version: "0.6.7"
|
||||||
|
leak_tracker:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: leak_tracker
|
||||||
|
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.0.0"
|
||||||
|
leak_tracker_flutter_testing:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: leak_tracker_flutter_testing
|
||||||
|
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
|
leak_tracker_testing:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: leak_tracker_testing
|
||||||
|
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -393,26 +417,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
|
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.16"
|
version: "0.12.16+1"
|
||||||
material_color_utilities:
|
material_color_utilities:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: material_color_utilities
|
name: material_color_utilities
|
||||||
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
|
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.0"
|
version: "0.8.0"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
|
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.0"
|
version: "1.11.0"
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -433,10 +457,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
|
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.3"
|
version: "1.9.0"
|
||||||
path_parsing:
|
path_parsing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -786,6 +810,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.1.4"
|
||||||
|
vm_service:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: vm_service
|
||||||
|
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "13.0.0"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -46,6 +46,7 @@ flutter:
|
|||||||
- assets/images/
|
- assets/images/
|
||||||
- assets/icons/
|
- assets/icons/
|
||||||
- assets/fonts/
|
- assets/fonts/
|
||||||
|
- assets/
|
||||||
fonts:
|
fonts:
|
||||||
- family: Aftika
|
- family: Aftika
|
||||||
fonts:
|
fonts:
|
||||||
|