wala_plus_with_dialog_removal
#22
wala_plus_with_dialog_removal into master_merge 1 day ago
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10.3315 5.33146C10.5145 5.1484 10.5145 4.8516 10.3315 4.66854C10.1484 4.48549 9.8516 4.48549 9.66854 4.66854L7.50009 6.83699L5.95644 5.29352C5.77337 5.11048 5.47657 5.11049 5.29352 5.29356C5.11048 5.47663 5.11049 5.77343 5.29356 5.95648L6.83718 7.49991L6.54354 7.79354C6.36049 7.9766 6.36049 8.2734 6.54354 8.45646C6.7266 8.63951 7.0234 8.63951 7.20646 8.45646L7.50013 8.16278L7.79364 8.45625C7.97671 8.6393 8.27351 8.63928 8.45655 8.45621C8.6396 8.27314 8.63958 7.97634 8.45651 7.79329L8.16305 7.49987L10.3315 5.33146Z" fill="#047857"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.53573 1.09375H7.46427C6.09508 1.09374 5.01965 1.09374 4.18001 1.20662C3.3196 1.3223 2.63694 1.5642 2.10057 2.10057C1.5642 2.63694 1.3223 3.3196 1.20662 4.18001C1.09374 5.01965 1.09374 6.09508 1.09375 7.46427V7.53573C1.09374 8.90492 1.09374 9.98035 1.20662 10.82C1.3223 11.6804 1.5642 12.3631 2.10057 12.8994C2.63694 13.4358 3.3196 13.6777 4.18001 13.7934C5.01965 13.9063 6.09507 13.9063 7.46425 13.9062H7.53573C8.90491 13.9063 9.98035 13.9063 10.82 13.7934C11.6804 13.6777 12.3631 13.4358 12.8994 12.8994C13.4358 12.3631 13.6777 11.6804 13.7934 10.82C13.9063 9.98035 13.9063 8.90493 13.9062 7.53575V7.46427C13.9063 6.09509 13.9063 5.01965 13.7934 4.18001C13.6777 3.3196 13.4358 2.63694 12.8994 2.10057C12.3631 1.5642 11.6804 1.3223 10.82 1.20662C9.98035 1.09374 8.90492 1.09374 7.53573 1.09375ZM2.76348 2.76348C3.09664 2.43033 3.54848 2.23746 4.30493 2.13576C5.07487 2.03225 6.08727 2.03125 7.5 2.03125C8.91273 2.03125 9.92513 2.03225 10.6951 2.13576C11.4515 2.23746 11.9034 2.43033 12.2365 2.76348C12.5697 3.09664 12.7625 3.54848 12.8642 4.30493C12.9678 5.07487 12.9688 6.08727 12.9688 7.5C12.9688 8.91273 12.9678 9.92513 12.8642 10.6951C12.7625 11.4515 12.5697 11.9034 12.2365 12.2365C11.9034 12.5697 11.4515 12.7625 10.6951 12.8642C9.92513 12.9678 8.91273 12.9688 7.5 12.9688C6.08727 12.9688 5.07487 12.9678 4.30493 12.8642C3.54848 12.7625 3.09664 12.5697 2.76348 12.2365C2.43033 11.9034 2.23746 11.4515 2.13576 10.6951C2.03225 9.92513 2.03125 8.91273 2.03125 7.5C2.03125 6.08727 2.03225 5.07487 2.13576 4.30493C2.23746 3.54848 2.43033 3.09664 2.76348 2.76348Z" fill="#047857"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.8331 11.6668C5.83305 11.7752 5.86321 11.8815 5.9202 11.9737C5.97718 12.066 6.05874 12.1405 6.15572 12.1889L7.3225 12.7723C7.41146 12.8167 7.51031 12.8377 7.60967 12.8332C7.70902 12.8287 7.80557 12.7989 7.89015 12.7466C7.97473 12.6943 8.04454 12.6212 8.09293 12.5343C8.14133 12.4474 8.16671 12.3496 8.16666 12.2502V8.16678C8.16679 7.87766 8.27427 7.5989 8.46827 7.38452L12.6821 2.72418C12.7576 2.64051 12.8073 2.53675 12.8251 2.42544C12.8429 2.31414 12.828 2.20007 12.7824 2.09702C12.7367 1.99396 12.6622 1.90635 12.5678 1.84477C12.4733 1.78318 12.3631 1.75027 12.2504 1.75H1.74938C1.63655 1.75004 1.52616 1.78279 1.43158 1.84429C1.33699 1.90579 1.26226 1.99339 1.21645 2.09648C1.17064 2.19958 1.15571 2.31375 1.17347 2.42516C1.19123 2.53656 1.24091 2.64043 1.3165 2.72418L5.53149 7.38452C5.72549 7.5989 5.83297 7.87766 5.8331 8.16678V11.6668Z" stroke-linecap="round" stroke="#202B33"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1001 B |
|
After Width: | Height: | Size: 559 B |
|
After Width: | Height: | Size: 190 B |
@ -0,0 +1,6 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11 6C11 7.65685 9.65685 9 8 9C6.34315 9 5 7.65685 5 6C5 4.34315 6.34315 3 8 3C9.65685 3 11 4.34315 11 6Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke="#26343D"/>
|
||||||
|
<path d="M2 20V16C1.9946 14.8394 2.32594 13.7021 2.95386 12.726C3.58179 11.7499 4.47934 10.9768 5.53775 10.5006C6.59616 10.0243 7.76999 9.86518 8.917 10.0426C10.064 10.22 11.1349 10.7262 12 11.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke="#26343D"/>
|
||||||
|
<path d="M19.5 11C19.5 12.3807 18.3807 13.5 17 13.5C15.6193 13.5 14.5 12.3807 14.5 11C14.5 9.61929 15.6193 8.5 17 8.5C18.3807 8.5 19.5 9.61929 19.5 11Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke="#26343D"/>
|
||||||
|
<path d="M12 21V18.5C12 17.1739 12.5268 15.9021 13.4645 14.9645C14.4021 14.0268 15.6739 13.5 17 13.5C18.3261 13.5 19.5979 14.0268 20.5355 14.9645C21.4732 15.9021 22 17.1739 22 18.5V21H12Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke="#26343D"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 9.1875C7.656 9.1875 6.5625 8.094 6.5625 6.75C6.5625 5.406 7.656 4.3125 9 4.3125C10.344 4.3125 11.4375 5.406 11.4375 6.75C11.4375 8.094 10.344 9.1875 9 9.1875ZM9 5.4375C8.27625 5.4375 7.6875 6.02625 7.6875 6.75C7.6875 7.47375 8.27625 8.0625 9 8.0625C9.72375 8.0625 10.3125 7.47375 10.3125 6.75C10.3125 6.02625 9.72375 5.4375 9 5.4375Z" fill="#737373"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.66722 13.5263C8.02722 13.872 8.50047 14.0625 8.99997 14.0625C9.49947 14.0625 9.97272 13.872 10.3327 13.5255C10.5082 13.3568 10.6882 13.1858 10.8705 13.0133C13.1174 10.8818 15.9149 8.22811 14.3692 4.51199C13.4805 2.37374 11.322 0.9375 8.99997 0.9375C6.67797 0.9375 4.52021 2.37374 3.63146 4.51199C2.09096 8.21474 4.86521 10.8555 7.09421 12.9773L7.11578 12.9978C7.30192 13.1753 7.48597 13.3508 7.66722 13.5263ZM4.67022 4.94399C5.38647 3.22049 7.12647 2.0625 8.99997 2.0625C10.8735 2.0625 12.6142 3.22049 13.3312 4.94399C14.5792 7.94549 12.3007 10.107 10.0965 12.1972C10.0547 12.237 10.0129 12.2766 9.97134 12.3162C9.83004 12.4504 9.69004 12.5834 9.55273 12.7155C9.40348 12.8588 9.20697 12.9375 8.99997 12.9375C8.79297 12.9375 8.59646 12.858 8.44871 12.7163C8.25971 12.5333 8.06623 12.3487 7.86973 12.162C5.68581 10.0831 3.42677 7.93263 4.67022 4.94399Z" fill="#737373"/>
|
||||||
|
<path d="M11.0385 17.0625H6.96142C4.53817 17.0625 3.32169 17.0625 2.72319 16.1745C2.66544 16.0882 2.61517 15.999 2.57392 15.909C2.11666 14.93 2.85295 13.8806 3.87139 12.429L3.87295 12.4267C4.05145 12.1725 4.40243 12.111 4.65668 12.2895C4.91093 12.468 4.97243 12.819 4.79393 13.0733C3.98468 14.2268 3.42443 15.072 3.59543 15.4373C3.61343 15.4763 3.63367 15.5115 3.65692 15.5468C3.92017 15.9375 5.12991 15.9375 6.96138 15.9375H11.0385C12.8699 15.9375 14.0797 15.9375 14.3437 15.546C14.3669 15.5115 14.3872 15.4762 14.4029 15.441C14.5754 15.072 14.0152 14.2268 13.2059 13.0733C13.0274 12.819 13.0889 12.468 13.3432 12.2895C13.5974 12.111 13.9484 12.1725 14.1269 12.4267C15.1462 13.8795 15.8827 14.9295 15.4244 15.9127C15.3847 15.999 15.3352 16.0882 15.2775 16.1737C14.6782 17.0625 13.4617 17.0625 11.0385 17.0625Z" fill="#737373"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="arrow-right">
|
||||||
|
<path id="Vector" d="M3.1245 7.5H11.8755M7.5 11.8755L11.8755 7.5L7.5 3.1245" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 337 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="arrow-up-right">
|
||||||
|
<path id="Vector" d="M14.166 14.166V5.834H5.834M14.166 5.834L5.834 14.166" stroke-width="1.7" stroke-linecap="round" stroke="#143F36"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 338 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="chevron-down">
|
||||||
|
<path id="Vector" d="M3 4.5L6 7.5L9 4.5" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 302 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="chevron-left">
|
||||||
|
<path id="Vector" d="M12.5 15L7.5 10L12.5 5" stroke-width="1.7" stroke-linecap="round" stroke="#202F32"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 306 B |
@ -0,0 +1,10 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="compass" clip-path="url(#clip0_0_24)">
|
||||||
|
<path id="Vector" d="M20.1674 11C20.1674 16.063 16.063 20.1674 11 20.1674C5.93698 20.1674 1.8326 16.063 1.8326 11C1.8326 5.93698 5.93698 1.8326 11 1.8326C16.063 1.8326 20.1674 5.93698 20.1674 11ZM14.8868 7.11281L13.233 12.0733C13.143 12.3433 12.9913 12.5887 12.79 12.79C12.5887 12.9913 12.3433 13.143 12.0733 13.233L7.11281 14.8868L8.76661 9.92628C8.85661 9.65623 9.00827 9.41084 9.20955 9.20955C9.41084 9.00827 9.65623 8.85661 9.92628 8.76661L14.8868 7.11281Z" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_0_24">
|
||||||
|
<rect width="22" height="22" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 845 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="heart">
|
||||||
|
<path id="Vector" d="M1.2495 5.93763C1.24951 5.24212 1.46051 4.56298 1.85463 3.9899C2.24875 3.41682 2.80744 2.97676 3.45693 2.72785C4.10641 2.47893 4.81612 2.43287 5.49233 2.59575C6.16855 2.75863 6.77944 3.12278 7.24434 3.64011C7.27708 3.67512 7.31667 3.70303 7.36064 3.72211C7.40462 3.74119 7.45204 3.75104 7.49998 3.75104C7.54792 3.75104 7.59534 3.74119 7.63932 3.72211C7.68329 3.70303 7.72288 3.67512 7.75563 3.64011C8.21906 3.11941 8.8301 2.7522 9.50741 2.58735C10.1847 2.42249 10.8962 2.46781 11.5471 2.71728C12.198 2.96674 12.7575 3.40851 13.1511 3.9838C13.5447 4.55909 13.7538 5.2406 13.7505 5.93763C13.7505 7.36889 12.8129 8.43765 11.8753 9.37516L8.44255 12.6958C8.32609 12.8296 8.18249 12.937 8.0213 13.011C7.86011 13.085 7.68502 13.1239 7.50766 13.125C7.3303 13.1261 7.15473 13.0895 6.99262 13.0175C6.83051 12.9456 6.68556 12.84 6.56741 12.7077L3.12464 9.37516C2.18707 8.43765 1.2495 7.37514 1.2495 5.93763Z" stroke-width="1.7" stroke-linecap="round" stroke="#202F32"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="heart">
|
||||||
|
<path id="Vector" d="M1.8326 8.70852C1.83262 7.68845 2.14208 6.69237 2.72012 5.85185C3.29816 5.01134 4.11758 4.36592 5.07016 4.00084C6.02273 3.63577 7.06365 3.56821 8.05542 3.8071C9.0472 4.04598 9.94318 4.58007 10.625 5.33882C10.6731 5.39017 10.7311 5.43111 10.7956 5.45909C10.8601 5.48708 10.9297 5.50152 11 5.50152C11.0703 5.50152 11.1398 5.48708 11.2043 5.45909C11.2688 5.43111 11.3269 5.39017 11.3749 5.33882C12.0546 4.57514 12.9508 4.03656 13.9442 3.79478C14.9376 3.55299 15.9811 3.61946 16.9357 3.98534C17.8904 4.35122 18.711 4.99915 19.2883 5.8429C19.8656 6.68666 20.1722 7.68621 20.1673 8.70852C20.1673 10.8077 18.7922 12.3752 17.4171 13.7502L12.3824 18.6205C12.2116 18.8167 12.001 18.9743 11.7646 19.0828C11.5282 19.1913 11.2714 19.2483 11.0112 19.25C10.7511 19.2516 10.4936 19.1979 10.2558 19.0924C10.0181 18.9869 9.80549 18.8319 9.6322 18.638L4.58281 13.7502C3.20771 12.3752 1.8326 10.8169 1.8326 8.70852Z" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 114.3 52">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #5e5f5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: #ec1f2d;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Layer_1-2" data-name="Layer 1">
|
||||||
|
<g>
|
||||||
|
<path fill="#5e5f5f" d="M15.74,25.46H3.99c-2.53,0-3.99-1.42-3.99-3.78v-11.01h3.31v9.33c0,1.56.4,2.39,2.84,2.39h9.59v3.07h0Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M17.2,29.26h-2.93v-2.66h2.93v2.66ZM21.88,21.03c0,1.21-.35,2.22-1.04,3.03-.78.94-1.87,1.4-3.24,1.4h-2.81v-3.07h2.1c1.11,0,1.68-.76,1.68-2.25v-5.07h3.31v5.96ZM21.67,29.26h-2.95v-2.66h2.95v2.66Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M27.6,25.46h-3.31v-14.79h3.31v14.79Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M39.98,25.46h-3.66c-.54,2.52-2.67,3.78-6.43,3.78v-2.59c2.17,0,3.26-1.01,3.26-3.03v-8.55h3.33v7.32h3.5v3.07h0ZM36.27,13.32h-2.93v-2.64h2.93v2.64Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M53.17,22.2c0,3.07-2.13,5.23-5.44,5.23-2.01,0-3.52-.67-4.49-1.97h-4.25v-3.07h3.28c0-3.28,1.94-5.37,5.34-5.37s5.55,2.04,5.55,5.18ZM49.89,22.31c0-1.81-.71-2.73-2.1-2.73h-.24c-1.21,0-2.03,1.08-2.03,2.59s.8,2.64,2.22,2.64c1.3,0,2.15-1.01,2.15-2.5h0Z"/>
|
||||||
|
<path fill="#ec1f2d" d="M104.69,0h-34.38c-5.31,0-9.61,4.17-9.61,9.32v33.36c0,5.15,4.3,9.32,9.61,9.32h34.38c5.31,0,9.61-4.17,9.61-9.32V9.32c0-5.15-4.3-9.32-9.61-9.32Z"/>
|
||||||
|
<path fill="#ffffff" d="M107.74,34.57l-.03,10.61-14.28-.04c-1.28,0-2.16-1.23-2.22-3.11,0-2.95-.9-5.86-2.69-8.25-3.37-4.51-8.12-8.12-14.29-10.8-1.52-.66-3.18-1-4.85-.99-1.32-.08-2.2-1.54-2.2-3.37v-10.57s14.09,0,14.09,0c1.27,0,2.28,1.27,2.34,3.15,0,2.05.58,4.07,1.72,5.79,3.85,5.77,8.76,10.4,15.33,13.26,1.52.66,3.18.99,4.85,1,1.32.08,2.22,1.5,2.22,3.32Z"/>
|
||||||
|
<path fill="#ffffff" d="M83.66,32.91c-.01.15-.02.3-.02.46v7.34s-.01,1.27-.01,1.27c-.07,1.88-1.12,3.19-2.39,3.19l-10.64-.04c-1.4,0-3.39.01-3.39.01l-.02-10.65c0-1.82.89-3.27,2.21-3.36h3.95s1.51,0,1.51,0h6.83c.92,0,1.7.75,1.98,1.78h0Z"/>
|
||||||
|
<path fill="#ffffff" d="M107.81,5.37l-.02,13.27c0,1.83-.85,3.33-2.17,3.41h-4s-1.34-.01-1.34-.01c-.09-.02-.19-.02-.28-.02h-6.81c-.9,0-1.67-.72-1.96-1.72.02-.16.03-.33.04-.51v-8.51c.06-1.89,1.12-3.22,2.39-3.22h9.73c2.94-.14,4.43-2.68,4.43-2.68h0Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M8.84,38.19c-.04-.99-.08-2.18-.08-3.37h-.04c-.26,1.05-.61,2.22-.94,3.18l-1.03,3.2h-1.49l-.9-3.18c-.28-.96-.57-2.13-.77-3.2h-.03c-.05,1.11-.09,2.38-.15,3.4l-.15,3.12h-1.77l.54-8.21h2.55l.83,2.74c.26.95.53,1.97.72,2.94h.04c.24-.95.53-2.03.8-2.95l.9-2.73h2.5l.46,8.21h-1.87l-.12-3.14h0Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M14.49,39.23l-.6,2.11h-1.98l2.59-8.21h2.51l2.62,8.21h-2.06l-.65-2.11h-2.42ZM16.63,37.84l-.53-1.74c-.15-.49-.3-1.1-.43-1.58h-.03c-.13.49-.25,1.11-.39,1.58l-.5,1.74h1.87Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M21.45,40.34l4.13-5.63v-.05h-4.13v-1.53h6.67v1.07l-4.04,5.55v.05h4.1v1.53h-6.74v-1h0Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M32.58,39.23l-.6,2.11h-1.98l2.59-8.21h2.51l2.62,8.21h-2.06l-.65-2.11h-2.42ZM34.73,37.84l-.53-1.74c-.15-.49-.3-1.1-.43-1.58h-.03c-.13.49-.25,1.11-.39,1.58l-.5,1.74h1.87Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M39.86,41.34v-3.36l-2.67-4.85h2.18l.87,1.97c.26.6.44,1.04.65,1.57h.03c.19-.51.39-.99.64-1.57l.85-1.97h2.15l-2.79,4.79v3.42h-1.91,0Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M46.54,39.23l-.6,2.11h-1.98l2.59-8.21h2.51l2.62,8.21h-2.06l-.65-2.11h-2.42ZM48.69,37.84l-.53-1.74c-.15-.49-.3-1.1-.43-1.58h-.03c-.13.49-.25,1.11-.39,1.58l-.5,1.74h1.87Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.02 94.61">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #5e5f5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #ec222e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Layer_1-2" data-name="Layer 1">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path fill="#5e5f5f" d="M16.59,77.8H4.53c-2.6,0-4.1-1.5-4.1-4v-11.65h3.4v9.88c0,1.65.41,2.52,2.91,2.52h9.85v3.25Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M18.09,81.83h-3.01v-2.81h3.01v2.81ZM22.89,73.12c0,1.29-.36,2.35-1.07,3.2-.8.99-1.92,1.48-3.32,1.48h-2.89v-3.25h2.16c1.14,0,1.72-.8,1.72-2.38v-5.36h3.4v6.31ZM22.67,81.83h-3.03v-2.81h3.03v2.81Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M28.76,77.8h-3.4v-15.65h3.4v15.65Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M41.48,77.8h-3.76c-.56,2.67-2.74,4-6.6,4v-2.74c2.23,0,3.35-1.07,3.35-3.2v-9.05h3.42v7.74h3.59v3.25ZM37.67,64.97h-3.01v-2.79h3.01v2.79Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M55.02,74.36c0,3.25-2.18,5.53-5.58,5.53-2.06,0-3.62-.7-4.61-2.09h-4.37v-3.25h3.37c0-3.47,1.99-5.68,5.48-5.68s5.7,2.16,5.7,5.48ZM51.64,74.48c0-1.92-.73-2.89-2.16-2.89h-.24c-1.24,0-2.09,1.14-2.09,2.74s.82,2.79,2.28,2.79c1.33,0,2.21-1.07,2.21-2.64Z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect fill="#ffffff" y="0" width="55.02" height="55.02" rx="9.86" ry="9.86"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#ec1f2d" d="M48.28,36.58l-.03,11.22-14.66-.04c-1.31,0-2.21-1.3-2.27-3.29h0c0-3.13-.93-6.2-2.76-8.73-3.46-4.77-8.33-8.59-14.67-11.43-1.56-.7-3.26-1.06-4.98-1.05h0c-1.35-.09-2.26-1.63-2.26-3.56v-11.19s14.46,0,14.46,0c1.31,0,2.34,1.34,2.4,3.33h0c0,2.17.59,4.31,1.77,6.13,3.95,6.11,9,11,15.74,14.03,1.56.7,3.26,1.05,4.98,1.06h0c1.35.09,2.28,1.58,2.28,3.52Z"/>
|
||||||
|
<path fill="#ec1f2d" d="M23.56,34.82c-.01.16-.02.32-.02.48v7.77s-.02,1.34-.02,1.34c-.07,1.99-1.15,3.37-2.45,3.37l-10.92-.05c-1.44,0-3.48.01-3.48.01l-.02-11.27c0-1.93.91-3.46,2.26-3.55h4.05s.26,0,.26,0h1.3s7.01,0,7.01,0c.94,0,1.75.79,2.03,1.88Z"/>
|
||||||
|
<path fill="#ec1f2d" d="M48.36,5.69l-.02,14.04c0,1.93-.88,3.52-2.23,3.61h-4.1s-1.38-.01-1.38-.01c-.1-.02-.19-.02-.29-.02h-6.99c-.93,0-1.72-.76-2.01-1.82.02-.17.03-.35.04-.54v-9.01c.06-2,1.15-3.41,2.45-3.41h9.99c3.02-.15,4.55-2.83,4.55-2.83Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#5e5f5f" d="M9.5,91.28c-.04-1.04-.08-2.31-.08-3.57h-.04c-.27,1.11-.63,2.35-.97,3.36l-1.06,3.39h-1.53l-.93-3.36c-.28-1.02-.58-2.26-.79-3.39h-.03c-.05,1.17-.09,2.51-.15,3.6l-.15,3.3h-1.82l.55-8.69h2.62l.85,2.9c.27,1.01.54,2.09.73,3.11h.04c.24-1.01.54-2.15.82-3.12l.93-2.89h2.56l.48,8.69h-1.92l-.13-3.32Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M15.3,92.38l-.62,2.23h-2.04l2.66-8.69h2.58l2.69,8.69h-2.11l-.67-2.23h-2.49ZM17.51,90.91l-.54-1.84c-.15-.52-.31-1.16-.44-1.68h-.03c-.13.52-.26,1.17-.4,1.68l-.52,1.84h1.92Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M22.45,93.55l4.24-5.95v-.05h-4.24v-1.62h6.85v1.13l-4.15,5.88v.05h4.21v1.62h-6.92v-1.06Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M33.88,92.38l-.62,2.23h-2.04l2.66-8.69h2.58l2.69,8.69h-2.11l-.67-2.23h-2.49ZM36.08,90.91l-.54-1.84c-.15-.52-.31-1.16-.44-1.68h-.03c-.13.52-.26,1.17-.4,1.68l-.52,1.84h1.92Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M41.35,94.61v-3.56l-2.75-5.13h2.24l.89,2.09c.27.63.45,1.1.67,1.66h.03c.19-.54.4-1.04.66-1.66l.88-2.09h2.2l-2.86,5.07v3.62h-1.96Z"/>
|
||||||
|
<path fill="#5e5f5f" d="M48.21,92.38l-.62,2.23h-2.04l2.66-8.69h2.58l2.69,8.69h-2.11l-.67-2.23h-2.49ZM50.41,90.91l-.54-1.84c-.15-.52-.31-1.16-.44-1.68h-.03c-.13.52-.26,1.17-.4,1.68l-.52,1.84h1.92Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.5 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="map-pin">
|
||||||
|
<path id="Vector" d="M9.9996 4.99997C9.9996 7.4967 7.23038 10.0969 6.30047 10.9C6.21384 10.9652 6.10839 11.0004 6 11.0004C5.89161 11.0004 5.78616 10.9652 5.69953 10.9C4.76962 10.0969 2.0004 7.4967 2.0004 4.99997C2.0004 3.93901 2.42179 2.9215 3.17186 2.17128C3.92193 1.42107 4.93924 0.9996 6 0.9996C7.06076 0.9996 8.07807 1.42107 8.82814 2.17128C9.57822 2.9215 9.9996 3.93901 9.9996 4.99997ZM7.49985 4.99997C7.49985 5.82847 6.82834 6.50011 6 6.50011C5.17166 6.50011 4.50015 5.82847 4.50015 4.99997C4.50015 4.17147 5.17166 3.49983 6 3.49983C6.82834 3.49983 7.49985 4.17147 7.49985 4.99997Z" stroke-linecap="round" stroke="#147D6B"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 826 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="search">
|
||||||
|
<path id="Vector" d="M15.7501 15.7501L12.4951 12.4951M14.25 8.25C14.25 11.5637 11.5637 14.25 8.25 14.25C4.93629 14.25 2.25 11.5637 2.25 8.25C2.25 4.93629 4.93629 2.25 8.25 2.25C11.5637 2.25 14.25 4.93629 14.25 8.25Z" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 472 B |
@ -0,0 +1,5 @@
|
|||||||
|
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="user-round">
|
||||||
|
<path id="Vector" d="M11 11.9167C13.5311 11.9167 15.5829 9.86464 15.5829 7.33333C15.5829 4.80203 13.5311 2.75 11 2.75C8.46895 2.75 6.41712 4.80203 6.41712 7.33333C6.41712 9.86464 8.46895 11.9167 11 11.9167ZM11 11.9167C12.9447 11.9167 14.8098 12.6893 16.1849 14.0646C17.5601 15.4398 18.3326 17.3051 18.3326 19.25M11 11.9167C9.05527 11.9167 7.1902 12.6893 5.81507 14.0646C4.43994 15.4398 3.6674 17.3051 3.6674 19.25" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 674 B |
@ -0,0 +1,6 @@
|
|||||||
|
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.8848 0.782465C11.6672 0.777969 11.077 0.780422 10.3952 0.783256L10.074 0.784571C9.25489 0.787826 8.36176 0.790261 7.8034 0.782363L3.41832 0.782363C3.30775 0.782363 3.09409 0.784794 2.86663 0.826585C2.65209 0.866 2.34887 0.953285 2.12257 1.17828C2.01295 1.28728 1.92531 1.4256 1.85771 1.5488C1.78696 1.67774 1.72248 1.81951 1.66613 1.95532C1.55744 2.2173 1.46792 2.48443 1.41557 2.64068L1.41079 2.65493L0.986568 3.88476C0.919741 4.06317 0.849387 4.33704 0.811103 4.61007C0.791433 4.75035 0.778628 4.90141 0.781624 5.04747C0.784495 5.18744 0.802226 5.35457 0.864472 5.50929C0.963954 5.75657 1.18158 6.01838 1.36007 6.20866C1.36856 6.21771 1.3771 6.22675 1.38569 6.23576C1.38552 6.24088 1.38544 6.24602 1.38544 6.25118L1.38544 9.41047C1.38543 10.2652 1.38541 10.9542 1.45827 11.496C1.5339 12.0586 1.69571 12.5322 2.0719 12.9084C2.4481 13.2846 2.92177 13.4465 3.48434 13.5221C4.0262 13.595 4.71515 13.5949 5.5699 13.5949L7.47919 13.5949C7.73807 13.5949 7.94794 13.3851 7.94794 13.1262C7.94794 12.8673 7.73807 12.6574 7.47919 12.6574L5.60419 12.6574C4.70705 12.6574 4.08136 12.6564 3.60926 12.593C3.15066 12.5313 2.9078 12.4185 2.73482 12.2455C2.56184 12.0726 2.44906 11.8297 2.38741 11.3711C2.32393 10.899 2.32294 10.2733 2.32294 9.37618L2.32294 6.97328C2.45051 7.03849 2.59529 7.10093 2.75359 7.15501C3.17457 7.29882 3.7203 7.39381 4.3406 7.31265C4.89853 7.23967 5.351 7.00851 5.70918 6.71013C6.09419 7.00458 6.70331 7.30587 7.47811 7.31657C8.04917 7.32446 8.56216 7.12979 8.95868 6.90312C9.08184 6.83271 9.19674 6.75753 9.30188 6.68132C9.77763 7.08237 10.6727 7.56818 11.9991 7.20432C13.5774 6.77137 14.083 5.75144 14.209 5.1425C14.2154 5.11127 14.2187 5.07946 14.2187 5.04757C14.2187 4.75732 14.1289 4.33991 13.9659 3.80861C13.7986 3.26346 13.5405 2.55589 13.1738 1.66657C13.1701 1.65753 13.166 1.6486 13.1618 1.63981C13.0956 1.50407 12.9647 1.3046 12.7653 1.13192C12.5616 0.95548 12.2655 0.790329 11.8848 0.782465ZM7.49106 6.37916C6.97962 6.3721 6.58006 6.18008 6.33319 6.00595C6.55391 5.67199 6.6951 5.33553 6.76663 5.07693C6.83564 4.82742 6.68931 4.5692 6.4398 4.50019C6.19028 4.43117 5.93206 4.5775 5.86305 4.82702C5.70947 5.3823 5.16544 6.25926 4.21899 6.38308C3.76402 6.4426 3.36434 6.37295 3.05665 6.26784C2.73842 6.15914 2.54601 6.02235 2.50231 5.98113C2.48528 5.96506 2.46707 5.9503 2.44784 5.93696C2.37021 5.88311 2.20722 5.74146 2.04383 5.56728C1.87113 5.38316 1.76292 5.23071 1.73421 5.15935C1.73421 5.15935 1.73024 5.14811 1.72656 5.12505C1.72269 5.10085 1.71976 5.0687 1.71893 5.02824C1.71725 4.94644 1.72447 4.84757 1.73952 4.74025C1.77015 4.52178 1.82659 4.31346 1.86579 4.21019C1.86748 4.20572 1.86911 4.20123 1.87067 4.19671L2.29773 2.95872L2.30261 2.94414C2.3555 2.78638 2.43617 2.5457 2.53206 2.3146C2.58103 2.19657 2.63099 2.0884 2.67962 1.99977C2.73141 1.90538 2.7681 1.85849 2.78357 1.8431C2.80747 1.81934 2.88262 1.77684 3.03603 1.74865C3.17652 1.72284 3.32038 1.71986 3.41832 1.71986L7.79347 1.71986C8.36231 1.72785 9.26287 1.7253 10.0778 1.72206L10.3974 1.72076C11.0847 1.71792 11.6606 1.71553 11.8655 1.71977C11.9719 1.72196 12.0657 1.76626 12.1515 1.84057C12.2347 1.91263 12.2907 1.99706 12.314 2.0407C12.6704 2.90597 12.9148 3.57905 13.0696 4.08359C13.214 4.55415 13.2701 4.84632 13.2797 5.00173C13.1969 5.33137 12.8878 5.98842 11.7511 6.30022C10.8759 6.54033 10.2955 6.26948 9.96995 6.01784C10.0887 5.82356 10.2297 5.52285 10.3667 5.09485C10.4456 4.84828 10.3097 4.58443 10.0631 4.50553C9.81653 4.42662 9.55268 4.56254 9.47378 4.8091C9.30754 5.32855 9.16081 5.54992 9.1304 5.58829C9.02102 5.71208 8.79354 5.91764 8.4934 6.08922C8.18993 6.2627 7.84298 6.38402 7.49106 6.37916Z" fill="#C2410C"/>
|
||||||
|
<path d="M3.88544 10.6262C3.88544 10.3673 4.0953 10.1574 4.35419 10.1574L6.85419 10.1574C7.11307 10.1574 7.32294 10.3673 7.32294 10.6262C7.32294 10.8851 7.11307 11.0949 6.85419 11.0949L4.35419 11.0949C4.0953 11.0949 3.88544 10.8851 3.88544 10.6262Z" fill="#C2410C"/>
|
||||||
|
<path d="M10.9167 10.6262C10.9167 10.281 11.1965 10.0012 11.5417 10.0012L11.5473 10.0012C11.8925 10.0012 12.1723 10.281 12.1723 10.6262C12.1723 10.9714 11.8925 11.2512 11.5473 11.2512L11.5417 11.2512C11.1965 11.2512 10.9167 10.9714 10.9167 10.6262Z" fill="#C2410C"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.5624 7.96748C10.1037 7.96748 8.90619 9.13055 8.90619 10.5835C8.90619 11.4113 9.32257 12.0297 9.75433 12.5247C9.9082 12.7011 10.0773 12.876 10.2353 13.0394C10.2951 13.1013 10.3536 13.1618 10.4088 13.2199C10.619 13.4408 10.7995 13.6441 10.9391 13.8516C11.0558 14.0251 11.2645 14.2195 11.5661 14.2195C11.8728 14.2195 12.0808 14.0193 12.1939 13.8391C12.3264 13.6278 12.5016 13.425 12.7082 13.2072C12.7757 13.1361 12.85 13.0599 12.9271 12.981C13.0706 12.8339 13.2237 12.677 13.3595 12.525C13.7946 12.038 14.2187 11.4281 14.2187 10.5835C14.2187 9.13055 13.0212 7.96748 11.5624 7.96748ZM9.84369 10.5835C9.84369 9.66465 10.605 8.90498 11.5624 8.90498C12.5199 8.90498 13.2812 9.66465 13.2812 10.5835C13.2812 11.0803 13.0441 11.4709 12.6604 11.9004C12.5358 12.0398 12.4117 12.1667 12.28 12.3015L12.2796 12.302C12.1992 12.3842 12.1159 12.4694 12.028 12.562C11.869 12.7297 11.7058 12.9111 11.5583 13.1097C11.4095 12.9183 11.2464 12.7402 11.0881 12.5738C11.0212 12.5034 10.956 12.436 10.8923 12.3701C10.7408 12.2134 10.5979 12.0656 10.4608 11.9084C10.0786 11.4703 9.84369 11.0692 9.84369 10.5835Z" fill="#C2410C"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 794 B |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
@ -0,0 +1,92 @@
|
|||||||
|
class GetMobileLoginInfoDependentModel {
|
||||||
|
int? iD;
|
||||||
|
String? dependentID;
|
||||||
|
String? depedentName;
|
||||||
|
String? dob;
|
||||||
|
int? channelID;
|
||||||
|
int? companyID;
|
||||||
|
String? deviceType;
|
||||||
|
String? deviceToken;
|
||||||
|
int? language;
|
||||||
|
int? gender;
|
||||||
|
int? loginType;
|
||||||
|
String? createdOn;
|
||||||
|
String? editedOn;
|
||||||
|
bool? businessCardPrivilege;
|
||||||
|
|
||||||
|
GetMobileLoginInfoDependentModel({
|
||||||
|
this.iD,
|
||||||
|
this.dependentID,
|
||||||
|
this.depedentName,
|
||||||
|
this.dob,
|
||||||
|
this.channelID,
|
||||||
|
this.companyID,
|
||||||
|
this.deviceType,
|
||||||
|
this.deviceToken,
|
||||||
|
this.language,
|
||||||
|
this.gender,
|
||||||
|
this.loginType,
|
||||||
|
this.createdOn,
|
||||||
|
this.editedOn,
|
||||||
|
this.businessCardPrivilege,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convenience aliases for existing logic
|
||||||
|
String? get nationalId => dependentID;
|
||||||
|
String? get birthDate => dob;
|
||||||
|
String? get employeeName => depedentName;
|
||||||
|
String? get dependentName => depedentName;
|
||||||
|
|
||||||
|
GetMobileLoginInfoDependentModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
iD = json['ID'];
|
||||||
|
dependentID = (json['DependentID'] ??
|
||||||
|
json['DEPENDENT_ID'] ??
|
||||||
|
json['P_DEP_NATIONAL_ID'] ??
|
||||||
|
json['NationalID'] ??
|
||||||
|
json['NationalId'] ??
|
||||||
|
json['EmployeeID'] ??
|
||||||
|
json['UserName'])
|
||||||
|
?.toString();
|
||||||
|
depedentName = (json['DepedentName'] ??
|
||||||
|
json['DependentName'] ??
|
||||||
|
json['P_DEPENDENT_NAME'] ??
|
||||||
|
json['EmployeeName'])
|
||||||
|
?.toString();
|
||||||
|
dob = (json['DOB'] ??
|
||||||
|
json['BirthDate'] ??
|
||||||
|
json['DateOfBirth'] ??
|
||||||
|
json['P_DEP_BIRTH_DATE'] ??
|
||||||
|
json['P_BIRTH_DATE'] ??
|
||||||
|
json['Birth_Date'])
|
||||||
|
?.toString();
|
||||||
|
channelID = json['ChannelID'] != null ? int.tryParse(json['ChannelID'].toString()) : null;
|
||||||
|
companyID = json['CompanyID'] != null ? int.tryParse(json['CompanyID'].toString()) : null;
|
||||||
|
deviceType = json['DeviceType']?.toString();
|
||||||
|
deviceToken = json['DeviceToken']?.toString();
|
||||||
|
language = json['Language'] != null ? int.tryParse(json['Language'].toString()) : null;
|
||||||
|
gender = json['Gender'] != null ? int.tryParse(json['Gender'].toString()) : null;
|
||||||
|
loginType = json['LoginType'] != null ? int.tryParse(json['LoginType'].toString()) : null;
|
||||||
|
createdOn = json['CreatedOn']?.toString();
|
||||||
|
editedOn = json['EditedOn']?.toString();
|
||||||
|
businessCardPrivilege = json['BusinessCardPrivilege'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['ID'] = iD;
|
||||||
|
data['DependentID'] = dependentID;
|
||||||
|
data['DepedentName'] = depedentName;
|
||||||
|
data['DOB'] = dob;
|
||||||
|
data['ChannelID'] = channelID;
|
||||||
|
data['CompanyID'] = companyID;
|
||||||
|
data['DeviceType'] = deviceType;
|
||||||
|
data['DeviceToken'] = deviceToken;
|
||||||
|
data['Language'] = language;
|
||||||
|
data['Gender'] = gender;
|
||||||
|
data['LoginType'] = loginType;
|
||||||
|
data['CreatedOn'] = createdOn;
|
||||||
|
data['EditedOn'] = editedOn;
|
||||||
|
data['BusinessCardPrivilege'] = businessCardPrivilege;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
class WalaPlusCategoryModel {
|
||||||
|
String? id;
|
||||||
|
String? image;
|
||||||
|
String? imageThumb;
|
||||||
|
String? name;
|
||||||
|
String? parentId;
|
||||||
|
|
||||||
|
String? countryNameAr;
|
||||||
|
String? countryNameEn;
|
||||||
|
|
||||||
|
WalaPlusCategoryModel({
|
||||||
|
this.id,
|
||||||
|
this.image,
|
||||||
|
this.imageThumb,
|
||||||
|
this.name,
|
||||||
|
this.parentId,
|
||||||
|
this.countryNameAr,
|
||||||
|
this.countryNameEn,
|
||||||
|
}) {
|
||||||
|
if ((image == null || image!.isEmpty) && id != null && id!.trim().isNotEmpty && id != "all" && id != "0") {
|
||||||
|
String cleanId = id!.trim();
|
||||||
|
if (cleanId.toLowerCase().endsWith('.png')) {
|
||||||
|
cleanId = cleanId.substring(0, cleanId.length - 4);
|
||||||
|
}
|
||||||
|
image = Uri.encodeFull("https://epharmacy.hmg.com/middleware/images/category/$cleanId.png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WalaPlusCategoryModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
id = (json['id'] ?? json['Id'] ?? json['ID'])?.toString();
|
||||||
|
name = (json['name'] ?? json['Name'] ?? json['category_name'] ?? json['categoryName'] ?? json['cat_name'] ?? json['CategoryName'])?.toString();
|
||||||
|
parentId = (json['parent_id'] ?? json['Parent_Id'] ?? json['parentId'])?.toString();
|
||||||
|
imageThumb = (json['image_thumb'] ?? json['Image_Thumb'] ?? json['imageThumb'])?.toString();
|
||||||
|
countryNameAr = (json['country_name_ar'] ?? json['countryNameAr'] ?? json['category_name_ar'] ?? json['categoryNameAr'] ?? json['cat_name_ar'] ?? json['name_ar'])?.toString();
|
||||||
|
countryNameEn = (json['country_name_en'] ?? json['countryNameEn'] ?? json['category_name_en'] ?? json['categoryNameEn'] ?? json['cat_name_en'] ?? json['name_en'])?.toString();
|
||||||
|
|
||||||
|
// Use category image URL from HMG middleware using ID from WalaPlus_Categories API:
|
||||||
|
// https://epharmacy.hmg.com/middleware/images/category/{id}.png
|
||||||
|
if (id != null && id!.trim().isNotEmpty && id != "all" && id != "0") {
|
||||||
|
String cleanId = id!.trim();
|
||||||
|
if (cleanId.toLowerCase().endsWith('.png')) {
|
||||||
|
cleanId = cleanId.substring(0, cleanId.length - 4);
|
||||||
|
}
|
||||||
|
image = Uri.encodeFull("https://epharmacy.hmg.com/middleware/images/category/$cleanId.png");
|
||||||
|
} else {
|
||||||
|
image = (json['image'] ?? json['Image'])?.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['id'] = id;
|
||||||
|
data['image'] = image;
|
||||||
|
data['image_thumb'] = imageThumb;
|
||||||
|
data['name'] = name;
|
||||||
|
data['parent_id'] = parentId;
|
||||||
|
data['country_name_ar'] = countryNameAr;
|
||||||
|
data['country_name_en'] = countryNameEn;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isMainCategory => parentId == null || parentId!.isEmpty;
|
||||||
|
bool get isSvg => (image ?? '').toLowerCase().contains('.svg');
|
||||||
|
|
||||||
|
String get categoryImageUrl {
|
||||||
|
if (id != null && id!.trim().isNotEmpty && id != "all" && id != "0") {
|
||||||
|
String cleanId = id!.trim();
|
||||||
|
if (cleanId.toLowerCase().endsWith('.png')) {
|
||||||
|
cleanId = cleanId.substring(0, cleanId.length - 4);
|
||||||
|
}
|
||||||
|
return Uri.encodeFull("https://epharmacy.hmg.com/middleware/images/category/$cleanId.png");
|
||||||
|
}
|
||||||
|
return image ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
class WalaPlusCityModel {
|
||||||
|
int? cityId;
|
||||||
|
String? cityNameAr;
|
||||||
|
String? cityNameEn;
|
||||||
|
String? countryNameAr;
|
||||||
|
String? countryNameEn;
|
||||||
|
|
||||||
|
WalaPlusCityModel({
|
||||||
|
this.cityId,
|
||||||
|
this.cityNameAr,
|
||||||
|
this.cityNameEn,
|
||||||
|
this.countryNameAr,
|
||||||
|
this.countryNameEn,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory WalaPlusCityModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
return WalaPlusCityModel(
|
||||||
|
cityId:
|
||||||
|
json['city_id'] is int
|
||||||
|
? json['city_id']
|
||||||
|
: int.tryParse(json['city_id']?.toString() ?? ''),
|
||||||
|
cityNameAr: json['city_name_ar']?.toString(),
|
||||||
|
cityNameEn: json['city_name_en']?.toString(),
|
||||||
|
countryNameAr: json['country_name_ar']?.toString(),
|
||||||
|
countryNameEn: json['country_name_en']?.toString(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'city_id': cityId,
|
||||||
|
'city_name_ar': cityNameAr,
|
||||||
|
'city_name_en': cityNameEn,
|
||||||
|
'country_name_ar': countryNameAr,
|
||||||
|
'country_name_en': countryNameEn,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
String getDisplayName(bool isAr) {
|
||||||
|
String? primary = isAr ? cityNameAr : cityNameEn;
|
||||||
|
if (primary != null && primary.trim().isNotEmpty) return primary.trim();
|
||||||
|
String? fallback = isAr ? cityNameEn : cityNameAr;
|
||||||
|
return fallback?.trim() ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isAllCities {
|
||||||
|
String en = (cityNameEn ?? '').trim().toLowerCase();
|
||||||
|
String ar = (cityNameAr ?? '').trim();
|
||||||
|
return en == 'all cities' || ar == 'جميع المدن';
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,139 @@
|
|||||||
|
class PatientInfoModel {
|
||||||
|
int? age;
|
||||||
|
String? dateOfBirth;
|
||||||
|
String? firstNameAr;
|
||||||
|
String? firstNameEn;
|
||||||
|
String? secondNameAr;
|
||||||
|
String? secondNameEn;
|
||||||
|
String? thirdNameAr;
|
||||||
|
String? thirdNameEn;
|
||||||
|
String? lastNameAr;
|
||||||
|
String? lastNameEn;
|
||||||
|
String? gender;
|
||||||
|
String? healthId;
|
||||||
|
String? idNumber;
|
||||||
|
String? idType;
|
||||||
|
bool? isHijri;
|
||||||
|
String? maritalStatus;
|
||||||
|
String? maritalStatusCode;
|
||||||
|
String? nationalDateOfBirth;
|
||||||
|
String? nationality;
|
||||||
|
String? nationalityCode;
|
||||||
|
String? occupation;
|
||||||
|
String? patientStatus;
|
||||||
|
String? placeOfBirth;
|
||||||
|
int? messageStatus;
|
||||||
|
String? errorEndUserMessage;
|
||||||
|
String? errorMessage;
|
||||||
|
|
||||||
|
PatientInfoModel({
|
||||||
|
this.age,
|
||||||
|
this.dateOfBirth,
|
||||||
|
this.firstNameAr,
|
||||||
|
this.firstNameEn,
|
||||||
|
this.secondNameAr,
|
||||||
|
this.secondNameEn,
|
||||||
|
this.thirdNameAr,
|
||||||
|
this.thirdNameEn,
|
||||||
|
this.lastNameAr,
|
||||||
|
this.lastNameEn,
|
||||||
|
this.gender,
|
||||||
|
this.healthId,
|
||||||
|
this.idNumber,
|
||||||
|
this.idType,
|
||||||
|
this.isHijri,
|
||||||
|
this.maritalStatus,
|
||||||
|
this.maritalStatusCode,
|
||||||
|
this.nationalDateOfBirth,
|
||||||
|
this.nationality,
|
||||||
|
this.nationalityCode,
|
||||||
|
this.occupation,
|
||||||
|
this.patientStatus,
|
||||||
|
this.placeOfBirth,
|
||||||
|
this.messageStatus,
|
||||||
|
this.errorEndUserMessage,
|
||||||
|
this.errorMessage,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory PatientInfoModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
return PatientInfoModel(
|
||||||
|
age: json['Age'],
|
||||||
|
dateOfBirth: json['DateOfBirth'],
|
||||||
|
firstNameAr: json['FirstNameAr'],
|
||||||
|
firstNameEn: json['FirstNameEn'],
|
||||||
|
secondNameAr: json['SecondNameAr'],
|
||||||
|
secondNameEn: json['SecondNameEn'],
|
||||||
|
thirdNameAr: json['ThirdNameAr'],
|
||||||
|
thirdNameEn: json['ThirdNameEn'],
|
||||||
|
lastNameAr: json['LastNameAr'],
|
||||||
|
lastNameEn: json['LastNameEn'],
|
||||||
|
gender: json['Gender'],
|
||||||
|
healthId: json['HealthId'],
|
||||||
|
idNumber: json['IdNumber'],
|
||||||
|
idType: json['IdType'],
|
||||||
|
isHijri: json['IsHijri'],
|
||||||
|
maritalStatus: json['MaritalStatus'],
|
||||||
|
maritalStatusCode: json['MaritalStatusCode'],
|
||||||
|
nationalDateOfBirth: json['NationalDateOfBirth'],
|
||||||
|
nationality: json['Nationality'],
|
||||||
|
nationalityCode: json['NationalityCode'],
|
||||||
|
occupation: json['Occupation'],
|
||||||
|
patientStatus: json['PatientStatus']?.toString(),
|
||||||
|
placeOfBirth: json['PlaceofBirth'],
|
||||||
|
messageStatus: json['MessageStatus'],
|
||||||
|
errorEndUserMessage: json['ErrorEndUserMessage'],
|
||||||
|
errorMessage: json['ErrorMessage'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'Age': age,
|
||||||
|
'DateOfBirth': dateOfBirth,
|
||||||
|
'FirstNameAr': firstNameAr,
|
||||||
|
'FirstNameEn': firstNameEn,
|
||||||
|
'SecondNameAr': secondNameAr,
|
||||||
|
'SecondNameEn': secondNameEn,
|
||||||
|
'ThirdNameAr': thirdNameAr,
|
||||||
|
'ThirdNameEn': thirdNameEn,
|
||||||
|
'LastNameAr': lastNameAr,
|
||||||
|
'LastNameEn': lastNameEn,
|
||||||
|
'Gender': gender,
|
||||||
|
'HealthId': healthId,
|
||||||
|
'IdNumber': idNumber,
|
||||||
|
'IdType': idType,
|
||||||
|
'IsHijri': isHijri,
|
||||||
|
'MaritalStatus': maritalStatus,
|
||||||
|
'MaritalStatusCode': maritalStatusCode,
|
||||||
|
'NationalDateOfBirth': nationalDateOfBirth,
|
||||||
|
'Nationality': nationality,
|
||||||
|
'NationalityCode': nationalityCode,
|
||||||
|
'Occupation': occupation,
|
||||||
|
'PatientStatus': patientStatus,
|
||||||
|
'PlaceofBirth': placeOfBirth,
|
||||||
|
'MessageStatus': messageStatus,
|
||||||
|
'ErrorEndUserMessage': errorEndUserMessage,
|
||||||
|
'ErrorMessage': errorMessage,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
String get fullNameAr {
|
||||||
|
List<String> parts = [
|
||||||
|
firstNameAr ?? '',
|
||||||
|
secondNameAr ?? '',
|
||||||
|
(thirdNameAr != null && thirdNameAr != '-') ? thirdNameAr! : '',
|
||||||
|
lastNameAr ?? '',
|
||||||
|
].where((s) => s.trim().isNotEmpty && s != '-').toList();
|
||||||
|
return parts.join(' ').trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
String get fullNameEn {
|
||||||
|
List<String> parts = [
|
||||||
|
firstNameEn ?? '',
|
||||||
|
secondNameEn ?? '',
|
||||||
|
(thirdNameEn != null && thirdNameEn != '-') ? thirdNameEn! : '',
|
||||||
|
lastNameEn ?? '',
|
||||||
|
].where((s) => s.trim().isNotEmpty && s != '-').toList();
|
||||||
|
return parts.join(' ').trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,390 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/offers_and_discounts_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/consts.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/generic_response_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/offers_and_discounts/wala_plus_retailer_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/mazaya/widgets/mazaya_bottom_nav.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/mazaya/widgets/wala_plus_retailer_grid.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||||
|
|
||||||
|
// Mazaya Saved tab - full-screen version of what was FavoriteMerchantsBottomSheet (a modal
|
||||||
|
// bottom sheet). Same fetch/search/pagination/toggle-favorite logic, now its own pushed route
|
||||||
|
// with the shared MazayaBottomNav instead of a dismissible sheet - matches Discover's "own
|
||||||
|
// route, fetches fresh on mount" pattern.
|
||||||
|
class SavedRetailersScreen extends StatefulWidget {
|
||||||
|
const SavedRetailersScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SavedRetailersScreen> createState() => _SavedRetailersScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SavedRetailersScreenState extends State<SavedRetailersScreen> {
|
||||||
|
List<WalaPlusRetailerModel> favoriteRetailers = <WalaPlusRetailerModel>[];
|
||||||
|
bool isLoading = true;
|
||||||
|
bool isLoadingMore = false;
|
||||||
|
bool hasMore = true;
|
||||||
|
bool _isFetchingPage = false;
|
||||||
|
int currentPage = 1;
|
||||||
|
int totalPages = 1;
|
||||||
|
final int pageSize = 10;
|
||||||
|
String searchQuery = "";
|
||||||
|
Timer? _debounceTimer;
|
||||||
|
final TextEditingController _searchController = TextEditingController();
|
||||||
|
final ScrollController _scrollController = ScrollController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_scrollController.addListener(_scrollListener);
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
if (mounted) fetchFavorites();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_debounceTimer?.cancel();
|
||||||
|
_scrollController.removeListener(_scrollListener);
|
||||||
|
_scrollController.dispose();
|
||||||
|
_searchController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _scrollListener() {
|
||||||
|
if (!_scrollController.hasClients) return;
|
||||||
|
double maxScroll = _scrollController.position.maxScrollExtent;
|
||||||
|
double currentScroll = _scrollController.position.pixels;
|
||||||
|
if (currentScroll >= maxScroll - 35) {
|
||||||
|
if (!isLoading && !isLoadingMore && !_isFetchingPage && hasMore) {
|
||||||
|
fetchNextPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String? _getUserReferenceForFavorites() {
|
||||||
|
String ref = OffersAndDiscountsApiClient().resolveUserReference();
|
||||||
|
if (ref.trim().isNotEmpty) return ref.trim();
|
||||||
|
String? userName = AppState().getUserName;
|
||||||
|
if (userName != null && userName.trim().isNotEmpty) return userName.trim();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> fetchFavorites({String? query}) async {
|
||||||
|
if (query != null) searchQuery = query;
|
||||||
|
setState(() {
|
||||||
|
isLoading = true;
|
||||||
|
currentPage = 1;
|
||||||
|
hasMore = true;
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
String? queryParam =
|
||||||
|
searchQuery.trim().isNotEmpty ? searchQuery.trim() : null;
|
||||||
|
String? userRef = _getUserReferenceForFavorites();
|
||||||
|
WalaPlusRetailersResponse? response = await OffersAndDiscountsApiClient()
|
||||||
|
.getWalaPlusRetailers(
|
||||||
|
categoryId: "",
|
||||||
|
page: 1,
|
||||||
|
perPage: pageSize,
|
||||||
|
offerType: null,
|
||||||
|
query: queryParam,
|
||||||
|
sortBy: null,
|
||||||
|
radius: null,
|
||||||
|
minDiscount: null,
|
||||||
|
context: null,
|
||||||
|
userReference: userRef,
|
||||||
|
);
|
||||||
|
favoriteRetailers = response?.retailers ?? <WalaPlusRetailerModel>[];
|
||||||
|
for (WalaPlusRetailerModel r in favoriteRetailers) {
|
||||||
|
r.isFavorite = true;
|
||||||
|
}
|
||||||
|
currentPage = 1;
|
||||||
|
totalPages = response?.pagesCount ?? 1;
|
||||||
|
hasMore =
|
||||||
|
currentPage < totalPages &&
|
||||||
|
(response?.retailers?.isNotEmpty ?? false);
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint("MazayaSavedScreen: error fetching favorites: $e");
|
||||||
|
favoriteRetailers = <WalaPlusRetailerModel>[];
|
||||||
|
} finally {
|
||||||
|
if (mounted) setState(() => isLoading = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> fetchNextPage() async {
|
||||||
|
if (isLoading || isLoadingMore || _isFetchingPage || !hasMore) return;
|
||||||
|
_isFetchingPage = true;
|
||||||
|
setState(() => isLoadingMore = true);
|
||||||
|
try {
|
||||||
|
int nextPage = currentPage + 1;
|
||||||
|
String? queryParam =
|
||||||
|
searchQuery.trim().isNotEmpty ? searchQuery.trim() : null;
|
||||||
|
String? userRef = _getUserReferenceForFavorites();
|
||||||
|
WalaPlusRetailersResponse? response = await OffersAndDiscountsApiClient()
|
||||||
|
.getWalaPlusRetailers(
|
||||||
|
categoryId: "",
|
||||||
|
page: nextPage,
|
||||||
|
perPage: pageSize,
|
||||||
|
offerType: null,
|
||||||
|
query: queryParam,
|
||||||
|
sortBy: null,
|
||||||
|
radius: null,
|
||||||
|
minDiscount: null,
|
||||||
|
context: null,
|
||||||
|
userReference: userRef,
|
||||||
|
);
|
||||||
|
List<WalaPlusRetailerModel> newRetailers =
|
||||||
|
response?.retailers ?? <WalaPlusRetailerModel>[];
|
||||||
|
if (newRetailers.isNotEmpty) {
|
||||||
|
for (WalaPlusRetailerModel r in newRetailers) {
|
||||||
|
r.isFavorite = true;
|
||||||
|
}
|
||||||
|
currentPage = nextPage;
|
||||||
|
totalPages = response?.pagesCount ?? totalPages;
|
||||||
|
hasMore = currentPage < totalPages;
|
||||||
|
favoriteRetailers.addAll(newRetailers);
|
||||||
|
} else {
|
||||||
|
hasMore = false;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint("MazayaSavedScreen: error fetching next page: $e");
|
||||||
|
} finally {
|
||||||
|
_isFetchingPage = false;
|
||||||
|
if (mounted) setState(() => isLoadingMore = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onSearchChanged(String query) {
|
||||||
|
_debounceTimer?.cancel();
|
||||||
|
searchQuery = query;
|
||||||
|
if (query.trim().isEmpty) {
|
||||||
|
fetchFavorites(query: "");
|
||||||
|
} else {
|
||||||
|
_debounceTimer = Timer(const Duration(milliseconds: 600), () {
|
||||||
|
fetchFavorites(query: query.trim());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _toggleFavorite(WalaPlusRetailerModel item) async {
|
||||||
|
String retailerId = item.id ?? "";
|
||||||
|
if (retailerId.isEmpty) return;
|
||||||
|
|
||||||
|
bool currentFav = item.isFavorite ?? true;
|
||||||
|
bool targetFav = !currentFav;
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
item.isFavorite = targetFav;
|
||||||
|
if (!targetFav) {
|
||||||
|
favoriteRetailers.removeWhere(
|
||||||
|
(WalaPlusRetailerModel r) => r.id == item.id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Utils.showLoading(context);
|
||||||
|
|
||||||
|
try {
|
||||||
|
GenericResponseModel? response;
|
||||||
|
String? userRef = _getUserReferenceForFavorites();
|
||||||
|
if (targetFav) {
|
||||||
|
response = await OffersAndDiscountsApiClient().addWalaPlusFavorite(
|
||||||
|
retailerId: retailerId,
|
||||||
|
context: context,
|
||||||
|
userReference: userRef,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
response = await OffersAndDiscountsApiClient().removeWalaPlusFavorite(
|
||||||
|
retailerId: retailerId,
|
||||||
|
context: context,
|
||||||
|
userReference: userRef,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
|
||||||
|
if (response != null && response.errorMessage == null) {
|
||||||
|
bool isAr = AppState().isArabic(context);
|
||||||
|
String msg =
|
||||||
|
isAr
|
||||||
|
? (targetFav
|
||||||
|
? LocaleKeys.favoriteAddedSuccess.tr()
|
||||||
|
: LocaleKeys.favoriteRemovedSuccess.tr())
|
||||||
|
: (response.wpFavoritesAddRemoveMessage ??
|
||||||
|
(targetFav
|
||||||
|
? LocaleKeys.favoriteAddedSuccess.tr()
|
||||||
|
: LocaleKeys.favoriteRemovedSuccess.tr()));
|
||||||
|
Utils.showToast(msg, isSuccess: true);
|
||||||
|
} else {
|
||||||
|
Utils.showToast(
|
||||||
|
response?.errorEndUserMessage ??
|
||||||
|
response?.errorMessage ??
|
||||||
|
LocaleKeys.favoriteError.tr(),
|
||||||
|
);
|
||||||
|
await fetchFavorites(query: _searchController.text);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
debugPrint("MazayaSavedScreen: error toggling favorite: $e");
|
||||||
|
Utils.showToast(LocaleKeys.favoriteError.tr());
|
||||||
|
await fetchFavorites(query: _searchController.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _openRetailer(WalaPlusRetailerModel item) async {
|
||||||
|
await Navigator.pushNamed(
|
||||||
|
context,
|
||||||
|
AppRoutes.retailerDetailsScreen,
|
||||||
|
arguments: item,
|
||||||
|
);
|
||||||
|
if (mounted) {
|
||||||
|
await fetchFavorites(query: _searchController.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
bool isAr = AppState().isArabic(context);
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: AppBarWidget(
|
||||||
|
context,
|
||||||
|
title: LocaleKeys.favoriteOffers.tr(),
|
||||||
|
showHomeButton: false,
|
||||||
|
// Reached from the Mazaya bottom nav - same as Discover, no back button for a
|
||||||
|
// dependent-login session since this is one of their root tabs, not a pushed screen.
|
||||||
|
showBackButton: false,
|
||||||
|
),
|
||||||
|
bottomNavigationBar: const MazayaBottomNav(currentTab: MazayaTab.saved),
|
||||||
|
body: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 70,
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
top: 14,
|
||||||
|
right: 16,
|
||||||
|
bottom: 14,
|
||||||
|
left: 16,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
border: Border.all(color: const Color(0xFFE8E8E8), width: 1.0),
|
||||||
|
boxShadow: <BoxShadow>[
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xFF000000).withOpacity(0.0314),
|
||||||
|
offset: const Offset(0, 2),
|
||||||
|
blurRadius: 5,
|
||||||
|
spreadRadius: 0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
LocaleKeys.search.tr().toText12(
|
||||||
|
isBold: true,
|
||||||
|
color: const Color(0xFF2A333C),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
TextField(
|
||||||
|
controller: _searchController,
|
||||||
|
onChanged: _onSearchChanged,
|
||||||
|
onSubmitted: (String val) {
|
||||||
|
_debounceTimer?.cancel();
|
||||||
|
fetchFavorites(query: val.trim());
|
||||||
|
},
|
||||||
|
textInputAction: TextInputAction.search,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
isDense: true,
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
hintText: LocaleKeys.searchItems.tr(),
|
||||||
|
hintStyle: const TextStyle(
|
||||||
|
color: Color(0xFFACAFB1),
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
height: 1.2,
|
||||||
|
),
|
||||||
|
border: InputBorder.none,
|
||||||
|
suffixIcon: ValueListenableBuilder<TextEditingValue>(
|
||||||
|
valueListenable: _searchController,
|
||||||
|
builder: (
|
||||||
|
BuildContext context,
|
||||||
|
TextEditingValue value,
|
||||||
|
Widget? child,
|
||||||
|
) {
|
||||||
|
if (value.text.isEmpty)
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
return InkWell(
|
||||||
|
child: const Icon(
|
||||||
|
Icons.clear,
|
||||||
|
size: 18,
|
||||||
|
color: Color(0xFF848486),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
_searchController.clear();
|
||||||
|
_onSearchChanged("");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
suffixIconConstraints: const BoxConstraints(
|
||||||
|
maxWidth: 24,
|
||||||
|
maxHeight: 28,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Color(0xFF2A333C),
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: RefreshIndicator(
|
||||||
|
onRefresh: () => fetchFavorites(query: _searchController.text),
|
||||||
|
color: MyColors.textMixColor,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
controller: _scrollController,
|
||||||
|
physics: const AlwaysScrollableScrollPhysics(
|
||||||
|
parent: BouncingScrollPhysics(),
|
||||||
|
),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 16,
|
||||||
|
vertical: 8,
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
WalaPlusRetailerGrid(
|
||||||
|
isLoading: isLoading,
|
||||||
|
retailers: favoriteRetailers,
|
||||||
|
isAr: isAr,
|
||||||
|
isLoadingMore: isLoadingMore,
|
||||||
|
onTapRetailer: _openRetailer,
|
||||||
|
onFavoriteTap: _toggleFavorite,
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,130 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/consts.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/mazaya/mazaya_discover_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/mazaya/saved_retailers_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/profile/family_members.dart';
|
||||||
|
|
||||||
|
enum MazayaTab { discover, saved, myFamily }
|
||||||
|
|
||||||
|
// Shared bottom nav for the Mazaya module (Discover / Saved / My Family). Each tab is its own
|
||||||
|
// screen, swapped in with zero-duration transition (see _onTabTapped) so switching tabs feels
|
||||||
|
// instant rather than like a new screen opening - not an IndexedStack shell, since each tab still
|
||||||
|
// needs to reload its own data fresh on every switch, not preserve state across tabs.
|
||||||
|
class MazayaBottomNav extends StatelessWidget {
|
||||||
|
final MazayaTab currentTab;
|
||||||
|
|
||||||
|
const MazayaBottomNav({Key? key, required this.currentTab}) : super(key: key);
|
||||||
|
|
||||||
|
static const Color _activeColor = Color(0xFF147D6B);
|
||||||
|
static const Color _inactiveColor = Color(0xFF78817F);
|
||||||
|
|
||||||
|
void _onTabTapped(BuildContext context, MazayaTab tab) {
|
||||||
|
if (tab == currentTab) return;
|
||||||
|
Widget targetScreen;
|
||||||
|
RouteSettings? settings;
|
||||||
|
switch (tab) {
|
||||||
|
case MazayaTab.discover:
|
||||||
|
targetScreen = const MazayaDiscoverScreen();
|
||||||
|
break;
|
||||||
|
case MazayaTab.saved:
|
||||||
|
targetScreen = const SavedRetailersScreen();
|
||||||
|
break;
|
||||||
|
case MazayaTab.myFamily:
|
||||||
|
targetScreen = const FamilyMembers();
|
||||||
|
settings = const RouteSettings(
|
||||||
|
arguments: <String, dynamic>{'fromMazaya': true},
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Navigator.pushReplacement(
|
||||||
|
context,
|
||||||
|
PageRouteBuilder<void>(
|
||||||
|
settings: settings,
|
||||||
|
pageBuilder:
|
||||||
|
(
|
||||||
|
BuildContext context,
|
||||||
|
Animation<double> animation,
|
||||||
|
Animation<double> secondaryAnimation,
|
||||||
|
) => targetScreen,
|
||||||
|
transitionDuration: Duration.zero,
|
||||||
|
reverseTransitionDuration: Duration.zero,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildItem(
|
||||||
|
BuildContext context, {
|
||||||
|
required MazayaTab tab,
|
||||||
|
required String svgAsset,
|
||||||
|
required String label,
|
||||||
|
}) {
|
||||||
|
bool isActive = tab == currentTab;
|
||||||
|
return Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => _onTabTapped(context, tab),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: <Widget>[
|
||||||
|
SvgPicture.asset(
|
||||||
|
svgAsset,
|
||||||
|
width: 22,
|
||||||
|
height: 22,
|
||||||
|
colorFilter: ColorFilter.mode(
|
||||||
|
isActive ? _activeColor : _inactiveColor,
|
||||||
|
BlendMode.srcIn,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 5),
|
||||||
|
label.toText11(
|
||||||
|
weight: isActive ? FontWeight.w600 : FontWeight.w400,
|
||||||
|
color: isActive ? _activeColor : _inactiveColor,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SafeArea(
|
||||||
|
top: false,
|
||||||
|
child: Container(
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
border: Border(top: BorderSide(color: Color(0xFFE8EAE4))),
|
||||||
|
),
|
||||||
|
padding: const EdgeInsets.only(top: 13, bottom: 9),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
_buildItem(
|
||||||
|
context,
|
||||||
|
tab: MazayaTab.discover,
|
||||||
|
svgAsset: "assets/icons/mazaya_compass.svg",
|
||||||
|
label: LocaleKeys.discover.tr(),
|
||||||
|
),
|
||||||
|
_buildItem(
|
||||||
|
context,
|
||||||
|
tab: MazayaTab.saved,
|
||||||
|
svgAsset: "assets/icons/mazaya_heart_outline.svg",
|
||||||
|
label: LocaleKeys.saved.tr(),
|
||||||
|
),
|
||||||
|
// My Family lets the account holder manage their dependents' Mazaya access - not
|
||||||
|
// applicable (and not shown) when a dependent is the one logged in.
|
||||||
|
if (!ApiConsts.isDependetLogin)
|
||||||
|
_buildItem(
|
||||||
|
context,
|
||||||
|
tab: MazayaTab.myFamily,
|
||||||
|
svgAsset: "assets/icons/mazaya_user_round.svg",
|
||||||
|
label: LocaleKeys.myFamily.tr(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||