offer screen
|
|
@ -1,6 +1,10 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
||||
<application
|
||||
android:label="proxibuy"
|
||||
android:label="Proxibuy"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="62" height="62" viewBox="0 0 62 62" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M45.2084 31C48.9767 31 52.5906 32.4969 55.2552 35.1615C57.9198 37.8261 59.4167 41.44 59.4167 45.2083C59.4167 48.9766 57.9198 52.5905 55.2552 55.2551C52.5906 57.9197 48.9767 59.4166 45.2084 59.4166C41.4401 59.4166 37.8262 57.9197 35.1616 55.2551C32.497 52.5905 31.0001 48.9766 31.0001 45.2083C31.0001 41.44 32.497 37.8261 35.1616 35.1615C37.8262 32.4969 41.4401 31 45.2084 31ZM45.2084 36.1666L44.9759 36.1873C44.7178 36.2345 44.4802 36.3591 44.2947 36.5446C44.1092 36.7301 43.9846 36.9677 43.9374 37.2258L43.9167 37.4583V43.9166H37.4532L37.2207 43.9399C36.9627 43.9871 36.725 44.1117 36.5395 44.2972C36.354 44.4827 36.2294 44.7203 36.1822 44.9784L36.1616 45.2109L36.1822 45.4434C36.2294 45.7015 36.354 45.9391 36.5395 46.1246C36.725 46.3101 36.9627 46.4347 37.2207 46.4819L37.4532 46.5026H43.9167V52.9687L43.9374 53.2011C43.9846 53.4592 44.1092 53.6968 44.2947 53.8824C44.4802 54.0679 44.7178 54.1925 44.9759 54.2397L45.2084 54.2603L45.4409 54.2397C45.699 54.1925 45.9366 54.0679 46.1221 53.8824C46.3076 53.6968 46.4323 53.4592 46.4794 53.2011L46.5001 52.9687V46.5H52.9687L53.2012 46.4819C53.4593 46.4347 53.6969 46.3101 53.8825 46.1246C54.068 45.9391 54.1926 45.7015 54.2397 45.4434L54.2604 45.2109L54.2397 44.9784C54.1924 44.72 54.0674 44.4821 53.8814 44.2965C53.6954 44.111 53.4572 43.9866 53.1987 43.9399L52.9662 43.9192H46.5001V37.4609L46.4794 37.2284C46.4327 36.9698 46.3083 36.7317 46.1228 36.5457C45.9372 36.3596 45.6994 36.2346 45.4409 36.1873L45.2084 36.1666ZM35.973 6.46865C36.9858 6.46857 37.981 6.73312 38.8601 7.23609C39.7391 7.73905 40.4715 8.46299 40.9847 9.33615L43.0875 12.9192H48.4376C50.6638 12.9192 52.799 13.8034 54.3734 15.3774C55.9479 16.9514 56.8327 19.0862 56.8334 21.3125V33.0925C55.6815 31.9856 54.3776 31.0487 52.961 30.3102L52.9584 21.3125C52.9584 20.1135 52.4821 18.9636 51.6343 18.1158C50.7865 17.268 49.6366 16.7916 48.4376 16.7916H41.9792C41.6415 16.7918 41.3096 16.7037 41.0164 16.536C40.7232 16.3684 40.479 16.127 40.3078 15.8358L37.6418 11.2969C37.4709 11.0061 37.2271 10.7649 36.9344 10.5973C36.6417 10.4297 36.3103 10.3413 35.973 10.3411H26.1486C25.8659 10.3413 25.5866 10.4034 25.3305 10.523C25.0743 10.6426 24.8474 10.8168 24.6657 11.0334L24.4978 11.2659L21.6742 15.8668C21.5011 16.1492 21.2584 16.3825 20.9694 16.5444C20.6804 16.7064 20.3548 16.7915 20.0235 16.7916H13.5652C12.9713 16.7913 12.3831 16.908 11.8343 17.135C11.2855 17.3621 10.7869 17.695 10.3668 18.1149C9.94671 18.5347 9.61348 19.0332 9.38612 19.5818C9.15877 20.1305 9.04175 20.7186 9.04175 21.3125V45.8541C9.04175 48.3497 11.0671 50.375 13.5626 50.375H29.2253C29.6722 51.7519 30.2897 53.0539 31.0569 54.25H13.5626C11.3359 54.25 9.20035 53.3654 7.62583 51.7909C6.05131 50.2164 5.16675 48.0809 5.16675 45.8541V21.3125C5.16675 19.0858 6.05131 16.9503 7.62583 15.3757C9.20035 13.8012 11.3359 12.9166 13.5626 12.9166H18.9359L21.1963 9.23798C21.7161 8.39121 22.4442 7.69181 23.3112 7.20654C24.1781 6.72126 25.155 6.46633 26.1486 6.46606L35.973 6.46865ZM31.0001 20.6666C33.4579 20.6657 35.8529 21.4438 37.8408 22.8891C39.8288 24.3345 41.3075 26.3728 42.0645 28.7111C40.7694 28.9591 39.5354 29.3458 38.3626 29.8711C37.7901 28.1169 36.6102 26.6246 35.0354 25.6628C33.4606 24.7011 31.5942 24.333 29.7722 24.6248C27.9501 24.9167 26.2921 25.8493 25.0964 27.2548C23.9008 28.6603 23.2461 30.4464 23.2501 32.2916C23.2501 35.9858 25.8334 39.0729 29.2899 39.8531C28.8777 41.0812 28.6089 42.3529 28.4891 43.6428C25.6988 43.0174 23.2368 41.3857 21.5737 39.0595C19.9105 36.7334 19.1629 33.876 19.4736 31.0334C19.7842 28.1908 21.1315 25.5624 23.2579 23.6504C25.3842 21.7385 28.1406 20.6772 31.0001 20.6692" fill="#BDBDBC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 8C0 4.22876 0 2.34315 1.17157 1.17157C2.34315 0 4.22876 0 8 0H24C27.7712 0 29.6569 0 30.8284 1.17157C32 2.34315 32 4.22876 32 8V24C32 27.7712 32 29.6569 30.8284 30.8284C29.6569 32 27.7712 32 24 32H8C4.22876 32 2.34315 32 1.17157 30.8284C0 29.6569 0 27.7712 0 24V8Z" fill="#5F5F5F"/>
|
||||
<path d="M18 21.28L13.6533 16.9333C13.14 16.42 13.14 15.58 13.6533 15.0666L18 10.72" stroke="#EAEAE9" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 591 B |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9 17.0625C4.5525 17.0625 0.9375 13.4475 0.9375 9C0.9375 4.5525 4.5525 0.9375 9 0.9375C13.4475 0.9375 17.0625 4.5525 17.0625 9C17.0625 13.4475 13.4475 17.0625 9 17.0625ZM9 2.0625C5.175 2.0625 2.0625 5.175 2.0625 9C2.0625 12.825 5.175 15.9375 9 15.9375C12.825 15.9375 15.9375 12.825 15.9375 9C15.9375 5.175 12.825 2.0625 9 2.0625Z" fill="#5F5F5F"/>
|
||||
<path d="M11.7822 11.9476C11.6847 11.9476 11.5872 11.9251 11.4972 11.8651L9.17224 10.4776C8.59474 10.1326 8.16724 9.37507 8.16724 8.70757V5.63257C8.16724 5.32507 8.42224 5.07007 8.72974 5.07007C9.03724 5.07007 9.29224 5.32507 9.29224 5.63257V8.70757C9.29224 8.97757 9.51724 9.37507 9.74974 9.51007L12.0747 10.8976C12.3447 11.0551 12.4272 11.4001 12.2697 11.6701C12.1572 11.8501 11.9697 11.9476 11.7822 11.9476Z" fill="#5F5F5F"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 889 B |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.4721 2.45044C10.8542 2.40168 11.3571 2.53011 12.0239 3.15747C12.6942 3.79172 12.8525 4.28883 12.8256 4.6731C12.7968 5.08353 12.5494 5.51206 12.1039 5.98267L12.103 5.98364L6.63031 11.7766L6.62347 11.7834C6.57128 11.8406 6.4676 11.9206 6.32953 11.9944C6.19324 12.0673 6.06442 12.112 5.9809 12.1272L3.83539 12.4934V12.4944C3.58243 12.538 3.41401 12.4674 3.31781 12.3762C3.22145 12.2846 3.14232 12.1194 3.17035 11.8635L3.41547 9.71313C3.42668 9.62902 3.46657 9.49571 3.53363 9.35181C3.60116 9.20699 3.67622 9.09361 3.7309 9.0354L3.72992 9.03442L9.20355 3.24341C9.64904 2.77292 10.0639 2.50264 10.4721 2.45044Z" stroke="#2196F3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.92667 3.8667C8.06643 4.7606 8.49907 5.58279 9.15668 6.2042C9.81428 6.82561 10.6596 7.21105 11.56 7.30003M2 15.1667H14" stroke="#2196F3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.05558 10.7526C7.45808 10.7526 6.15308 9.45508 6.15308 7.85008C6.15308 6.24508 7.45808 4.95508 9.05558 4.95508C10.6531 4.95508 11.9581 6.25258 11.9581 7.85758C11.9581 9.46258 10.6531 10.7526 9.05558 10.7526ZM9.05558 6.08008C8.08058 6.08008 7.27808 6.87508 7.27808 7.85758C7.27808 8.84008 8.07308 9.63508 9.05558 9.63508C10.0381 9.63508 10.8331 8.84008 10.8331 7.85758C10.8331 6.87508 10.0306 6.08008 9.05558 6.08008Z" fill="#A1A0A0"/>
|
||||
<path d="M9.05592 17.195C7.94592 17.195 6.82842 16.775 5.95842 15.9425C3.74592 13.8125 1.30092 10.415 2.22342 6.3725C3.05592 2.705 6.25842 1.0625 9.05592 1.0625C9.05592 1.0625 9.05592 1.0625 9.06342 1.0625C11.8609 1.0625 15.0634 2.705 15.8959 6.38C16.8109 10.4225 14.3659 13.8125 12.1534 15.9425C11.2834 16.775 10.1659 17.195 9.05592 17.195ZM9.05592 2.1875C6.87342 2.1875 4.06842 3.35 3.32592 6.62C2.51592 10.1525 4.73592 13.1975 6.74592 15.125C8.04342 16.3775 10.0759 16.3775 11.3734 15.125C13.3759 13.1975 15.5959 10.1525 14.8009 6.62C14.0509 3.35 11.2384 2.1875 9.05592 2.1875Z" fill="#A1A0A0"/>
|
||||
</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 d="M1.71753 5.83498V13.1325C1.71753 14.5575 2.73003 15.1425 3.96003 14.4375L5.72253 13.4325C6.10503 13.215 6.74253 13.1925 7.14003 13.395L11.0775 15.3675C11.475 15.5625 12.1125 15.5475 12.495 15.33L15.7425 13.47C16.155 13.23 16.5 12.645 16.5 12.165V4.86748C16.5 3.44248 15.4875 2.85748 14.2575 3.56248L12.495 4.56748C12.1125 4.78498 11.475 4.80748 11.0775 4.60498L7.14003 2.63998C6.74253 2.44498 6.10503 2.45998 5.72253 2.67748L2.47503 4.53748C2.05503 4.77748 1.71753 5.36248 1.71753 5.83498Z" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.42004 3V12.75" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M11.7975 4.96497V15" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 858 B |
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1.55254 3.45C2.15254 0.855 6.06004 0.855 6.65254 3.45C7.00504 4.9725 6.03754 6.2625 5.19754 7.065C4.58254 7.65 3.61504 7.6425 3.00004 7.065C2.16754 6.2625 1.20004 4.9725 1.55254 3.45Z" stroke="#9D9D9B"/>
|
||||
<path d="M11.3025 12.45C11.9025 9.855 15.8325 9.855 16.4325 12.45C16.785 13.9725 15.8175 15.2625 14.97 16.065C14.355 16.65 13.38 16.6425 12.765 16.065C11.9175 15.2625 10.95 13.9725 11.3025 12.45Z" stroke="#9D9D9B"/>
|
||||
<path d="M9.00002 3.75H11.01C12.3975 3.75 13.0425 5.4675 12 6.3825L6.00752 11.625C4.96502 12.5325 5.61002 14.25 6.99002 14.25H9.00002" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.11478 4.125H4.12345" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M13.8645 13.125H13.8732" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 933 B |
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.0807 17.2569H7.03073C3.32573 17.2569 1.75073 15.6744 1.75073 11.9769V8.60938C1.75073 8.30187 2.00573 8.04688 2.31323 8.04688C2.62073 8.04688 2.87573 8.30187 2.87573 8.60938V11.9769C2.87573 15.0444 3.96323 16.1319 7.03073 16.1319H11.0732C14.1407 16.1319 15.2282 15.0444 15.2282 11.9769V8.60938C15.2282 8.30187 15.4832 8.04688 15.7907 8.04688C16.0982 8.04688 16.3532 8.30187 16.3532 8.60938V11.9769C16.3607 15.6744 14.7782 17.2569 11.0807 17.2569Z" fill="#A1A0A0"/>
|
||||
<path d="M9.05567 9.75684C8.23067 9.75684 7.48066 9.43434 6.94816 8.84184C6.41566 8.24934 6.16817 7.47684 6.25067 6.65184L6.75317 1.64184C6.78317 1.35684 7.02317 1.13184 7.31567 1.13184H10.8182C11.1107 1.13184 11.3507 1.34934 11.3807 1.64184L11.8832 6.65184C11.9657 7.47684 11.7182 8.24934 11.1857 8.84184C10.6307 9.43434 9.88067 9.75684 9.05567 9.75684ZM7.81817 2.25684L7.36817 6.76434C7.31567 7.26684 7.46567 7.73934 7.78067 8.08434C8.41817 8.78934 9.69317 8.78934 10.3307 8.08434C10.6457 7.73184 10.7957 7.25934 10.7432 6.76434L10.2932 2.25684H7.81817Z" fill="#A1A0A0"/>
|
||||
<path d="M13.7882 9.75684C12.2657 9.75684 10.9082 8.52684 10.7507 7.01184L10.2257 1.75434C10.2107 1.59684 10.2632 1.43934 10.3682 1.31934C10.4732 1.19934 10.6232 1.13184 10.7882 1.13184H13.0757C15.2807 1.13184 16.3082 2.05434 16.6157 4.31934L16.8257 6.40434C16.9157 7.28934 16.6457 8.12934 16.0682 8.76684C15.4907 9.40434 14.6807 9.75684 13.7882 9.75684ZM11.4107 2.25684L11.8757 6.89934C11.9732 7.83684 12.8432 8.63184 13.7882 8.63184C14.3582 8.63184 14.8682 8.41434 15.2357 8.01684C15.5957 7.61934 15.7607 7.08684 15.7082 6.51684L15.4982 4.45434C15.2657 2.75934 14.7182 2.25684 13.0757 2.25684H11.4107Z" fill="#A1A0A0"/>
|
||||
<path d="M4.28568 9.75684C3.39318 9.75684 2.58318 9.40434 2.00568 8.76684C1.42818 8.12934 1.15818 7.28934 1.24818 6.40434L1.45068 4.34184C1.76568 2.05434 2.79318 1.13184 4.99818 1.13184H7.28568C7.44318 1.13184 7.59318 1.19934 7.70568 1.31934C7.81818 1.43934 7.86318 1.59684 7.84818 1.75434L7.32318 7.01184C7.16568 8.52684 5.80818 9.75684 4.28568 9.75684ZM4.99818 2.25684C3.35568 2.25684 2.80818 2.75184 2.56818 4.46934L2.36568 6.51684C2.30568 7.08684 2.47818 7.61934 2.83818 8.01684C3.19818 8.41434 3.70818 8.63184 4.28568 8.63184C5.23068 8.63184 6.10818 7.83684 6.19818 6.89934L6.66318 2.25684H4.99818Z" fill="#A1A0A0"/>
|
||||
<path d="M10.9307 17.2568H7.18066C6.87316 17.2568 6.61816 17.0018 6.61816 16.6943V14.8193C6.61816 13.2443 7.48066 12.3818 9.05566 12.3818C10.6307 12.3818 11.4932 13.2443 11.4932 14.8193V16.6943C11.4932 17.0018 11.2382 17.2568 10.9307 17.2568ZM7.74316 16.1318H10.3682V14.8193C10.3682 13.8743 10.0007 13.5068 9.05566 13.5068C8.11066 13.5068 7.74316 13.8743 7.74316 14.8193V16.1318Z" fill="#A1A0A0"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1.55566 1.65283H2.86067C3.67067 1.65283 4.30817 2.35033 4.24067 3.15283L3.61816 10.6228C3.51316 11.8453 4.48066 12.8953 5.71066 12.8953H13.6982C14.7782 12.8953 15.7232 12.0103 15.8057 10.9378L16.2107 5.31284C16.3007 4.06784 15.3557 3.05533 14.1032 3.05533H4.42067" stroke="#A1A0A0" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.2432 16.6528C12.7609 16.6528 13.1807 16.2331 13.1807 15.7153C13.1807 15.1976 12.7609 14.7778 12.2432 14.7778C11.7254 14.7778 11.3057 15.1976 11.3057 15.7153C11.3057 16.2331 11.7254 16.6528 12.2432 16.6528Z" stroke="#A1A0A0" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.24316 16.6528C6.76093 16.6528 7.18066 16.2331 7.18066 15.7153C7.18066 15.1976 6.76093 14.7778 6.24316 14.7778C5.7254 14.7778 5.30566 15.1976 5.30566 15.7153C5.30566 16.2331 5.7254 16.6528 6.24316 16.6528Z" stroke="#A1A0A0" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.80566 6.15283H15.8057" stroke="#A1A0A0" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.63348 2.77983L8.61199 4.73684C8.74542 5.00927 9.10124 5.27057 9.40147 5.32061L11.175 5.61527C12.3092 5.8043 12.5761 6.62714 11.7588 7.43885L10.38 8.81766C10.1465 9.05117 10.0186 9.5015 10.0909 9.82397L10.4856 11.5308C10.797 12.8818 10.0798 13.4044 8.88442 12.6983L7.22207 11.7143C6.92184 11.5364 6.42703 11.5364 6.12125 11.7143L4.45889 12.6983C3.26912 13.4044 2.54636 12.8762 2.8577 11.5308L3.25244 9.82397C3.32472 9.5015 3.19684 9.05117 2.96334 8.81766L1.58453 7.43885C0.772814 6.62714 1.03412 5.8043 2.1683 5.61527L3.94184 5.32061C4.23651 5.27057 4.59233 5.00927 4.72576 4.73684L5.70427 2.77983C6.238 1.71792 7.10531 1.71792 7.63348 2.77983Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 775 B |
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="18" height="19" viewBox="0 0 18 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9 17.1667C5.3775 17.1667 2.4375 14.2267 2.4375 10.6042C2.4375 6.98175 5.3775 4.04175 9 4.04175C12.6225 4.04175 15.5625 6.98175 15.5625 10.6042" stroke="#5F5F5F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9 6.66675V10.4167" stroke="#5F5F5F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.75 2.16675H11.25" stroke="#5F5F5F" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M14.25 13.4167V16.4167" stroke="#5F5F5F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 13.4167V16.4167" stroke="#5F5F5F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 827 B |
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="53" height="53" viewBox="0 0 53 53" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M39.8098 37.1015C39.4631 37.1015 39.1381 36.9932 38.8348 36.7765C38.1198 36.2348 37.9681 35.2165 38.5098 34.5015C41.9115 29.9732 41.9115 23.6465 38.5098 19.1182C37.9681 18.4032 38.1198 17.3848 38.8348 16.8432C39.5498 16.3015 40.5681 16.4532 41.1098 17.1682C45.3565 22.8448 45.3565 30.7748 41.1098 36.4515C40.7848 36.8848 40.3081 37.1015 39.8098 37.1015Z" fill="#176BAD"/>
|
||||
<path d="M43.7748 42.5181C43.4281 42.5181 43.1031 42.4098 42.7998 42.1931C42.0848 41.6514 41.9331 40.6331 42.4748 39.9181C48.2598 32.2048 48.2598 21.4148 42.4748 13.7014C41.9331 12.9864 42.0848 11.9681 42.7998 11.4264C43.5148 10.8848 44.5331 11.0364 45.0748 11.7514C51.7264 20.6131 51.7264 33.0064 45.0748 41.8681C44.7714 42.3014 44.2731 42.5181 43.7748 42.5181Z" fill="#176BAD"/>
|
||||
<path opacity="0.4" d="M34.9348 16.8648V36.7548C34.9348 40.4815 33.5914 43.2765 31.1864 44.6198C30.2114 45.1615 29.1281 45.4215 28.0014 45.4215C26.2681 45.4215 24.4048 44.8365 22.4981 43.6448L16.1714 39.6798C15.7381 39.4198 15.2398 39.2681 14.7414 39.2681H12.7264V14.3515H14.7414C15.2398 14.3515 15.7381 14.1998 16.1714 13.9398L22.4981 9.97479C25.6614 8.00312 28.7598 7.65645 31.1864 8.99979C33.5914 10.3431 34.9348 13.1381 34.9348 16.8648Z" fill="#176BAD"/>
|
||||
<path d="M12.7265 14.3516V39.2682H11.6432C6.39986 39.2682 3.51819 36.3866 3.51819 31.1432V22.4766C3.51819 17.2332 6.39986 14.3516 11.6432 14.3516H12.7265Z" fill="#176BAD"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,268 @@
|
|||
<svg width="305" height="295" viewBox="0 0 305 295" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_6230_1375)">
|
||||
<path d="M169.105 15.0022C127.884 23.1588 106.765 69.9138 40.2006 111.571C-26.3634 153.228 -11.6524 315.778 93.51 289.269C193.72 263.925 198.381 265.964 264.071 268.295C346.074 271.208 299.902 -10.633 169.105 15.0022Z" fill="url(#paint0_linear_6230_1375)"/>
|
||||
<path d="M57.0965 83.6058C76.4685 68.1664 92.6361 41.2204 83.4599 15.2939C74.2837 -10.6325 55.3486 37.7247 40.0549 53.7467C18.0612 77.0513 16.6046 115.941 57.0965 83.6058Z" fill="url(#paint1_linear_6230_1375)"/>
|
||||
<path d="M295.824 292.183H9.17621V294.222H295.824V292.183Z" fill="#C8D3FB"/>
|
||||
<path opacity="0.5" d="M229.842 59.718L235.377 79.964L253.73 70.0595L248.486 90.3054L269.315 90.888L254.604 105.745L272.373 116.814L252.273 122.349L262.178 140.702L241.932 135.458L241.349 156.287L226.492 141.576L215.423 159.346L209.888 139.245L191.535 149.15L196.779 128.904L175.95 128.321L190.661 113.464L172.891 102.395L192.992 96.8599L183.087 78.5074L203.333 83.751L203.916 62.9224L218.773 77.4878L229.842 59.718Z" fill="#C8D3FB"/>
|
||||
<path d="M195.322 108.95L195.759 105.745L202.022 106.619L201.585 109.823L195.322 108.95Z" fill="white"/>
|
||||
<path d="M204.935 112.737L208.14 112.882C208.14 113.61 208.285 114.193 208.722 114.776C209.159 115.213 209.596 115.504 210.179 115.65C210.907 115.795 211.49 115.504 211.927 115.067C212.509 114.63 212.801 113.756 212.946 112.737C213.092 111.717 212.946 110.989 212.655 110.406C212.218 109.823 211.781 109.532 211.053 109.387C210.179 109.241 209.305 109.532 208.431 110.26L205.955 109.532L208.868 101.084L217.316 102.249L216.879 105.163L210.907 104.289L210.033 107.056C210.762 106.765 211.49 106.765 212.218 106.765C213.675 106.91 214.694 107.639 215.568 108.804C216.442 109.969 216.733 111.426 216.442 113.028C216.296 114.339 215.714 115.504 214.694 116.524C213.383 117.834 211.781 118.417 209.888 118.126C208.285 117.834 207.12 117.252 206.246 116.378C205.372 115.213 204.935 114.047 204.935 112.737Z" fill="white"/>
|
||||
<path d="M224.89 102.832C226.492 103.123 227.658 103.851 228.386 105.162C229.26 106.619 229.551 108.949 228.968 112.154C228.531 115.358 227.658 117.543 226.347 118.708C225.327 119.728 224.016 120.165 222.268 119.873C220.666 119.582 219.501 118.854 218.627 117.397C217.753 115.941 217.607 113.756 218.044 110.551C218.481 107.493 219.355 105.308 220.666 103.997C221.977 102.977 223.288 102.686 224.89 102.832ZM224.599 105.599C224.162 105.599 223.871 105.599 223.579 105.891C223.288 106.036 222.997 106.473 222.705 107.056C222.414 107.784 222.123 109.241 221.831 111.134C221.54 113.028 221.394 114.484 221.54 115.212C221.686 115.941 221.831 116.523 222.123 116.815C222.414 117.106 222.705 117.252 223.142 117.397C223.579 117.397 223.871 117.397 224.162 117.106C224.453 116.96 224.744 116.523 225.036 115.941C225.327 115.212 225.618 113.756 225.91 111.862C226.201 109.969 226.347 108.512 226.201 107.784C226.055 107.056 225.91 106.473 225.618 106.182C225.327 105.745 224.89 105.599 224.599 105.599Z" fill="white"/>
|
||||
<path d="M231.882 108.221C232.027 106.765 232.61 105.745 233.338 105.017C234.066 104.434 235.086 104.143 236.106 104.289C237.271 104.434 238.145 104.871 238.727 105.745C239.31 106.619 239.456 107.639 239.164 109.241C239.019 110.697 238.436 111.717 237.708 112.445C236.979 113.028 235.96 113.319 234.94 113.173C233.775 113.028 232.901 112.591 232.318 111.717C231.882 110.843 231.736 109.678 231.882 108.221ZM234.358 108.513C234.212 109.532 234.212 110.406 234.358 110.697C234.503 110.989 234.795 111.134 235.086 111.28C235.377 111.28 235.669 111.28 235.96 110.989C236.251 110.697 236.542 109.969 236.688 108.804C236.834 107.784 236.834 107.056 236.688 106.619C236.542 106.328 236.251 106.182 235.96 106.036C235.669 106.036 235.377 106.036 235.086 106.328C234.795 106.765 234.503 107.347 234.358 108.513ZM236.106 122.204L233.775 121.913L245.136 105.599L247.467 105.891L236.106 122.204ZM241.786 118.563C241.932 117.106 242.514 116.087 243.243 115.358C243.971 114.776 244.99 114.484 246.01 114.63C247.175 114.776 248.049 115.213 248.486 116.087C249.069 116.961 249.214 117.98 248.923 119.582C248.777 121.039 248.195 122.204 247.467 122.787C246.738 123.369 245.719 123.661 244.699 123.515C243.534 123.369 242.66 122.787 242.077 122.058C241.786 121.184 241.64 120.019 241.786 118.563ZM244.262 118.854C244.116 119.874 244.116 120.602 244.262 121.039C244.408 121.33 244.699 121.476 244.99 121.621C245.282 121.621 245.573 121.621 245.864 121.33C246.156 121.039 246.447 120.311 246.593 119.145C246.738 118.126 246.738 117.252 246.593 116.961C246.447 116.669 246.156 116.524 245.864 116.378C245.573 116.378 245.282 116.378 244.99 116.669C244.699 117.106 244.408 117.834 244.262 118.854Z" fill="white"/>
|
||||
<path opacity="0.5" d="M48.9397 125.699L61.466 135.895L68.6031 121.33L74.4292 136.478L87.8294 127.447L85.3533 143.469L101.375 142.304L91.1795 154.83L105.745 161.967L90.5968 167.794L99.6274 181.194L83.7511 178.718L84.7707 194.74L72.2444 184.689L65.1074 199.109L59.2812 184.107L45.881 192.992L48.5028 177.115L32.3351 178.135L42.5309 165.609L27.9655 158.472L43.1136 152.646L34.083 139.245L49.9593 141.867L48.9397 125.699Z" fill="#C8D3FB"/>
|
||||
<path d="M49.3768 172.163L48.2115 169.978L52.5812 167.793L53.7464 169.978L49.3768 172.163Z" fill="white"/>
|
||||
<path d="M57.0965 170.124L59.1356 168.813C59.4269 169.25 59.8639 169.542 60.3009 169.687C60.7378 169.833 61.1748 169.833 61.6117 169.542C62.0487 169.25 62.34 168.959 62.4857 168.376C62.6313 167.794 62.4857 167.211 62.0487 166.483C61.6117 165.755 61.3204 165.318 60.7378 165.172C60.3009 165.026 59.7182 165.026 59.2813 165.318C58.6987 165.609 58.2617 166.192 57.9704 167.066L56.0769 167.794L54.0377 161.239L59.8639 158.181L60.8835 160.22L56.6595 162.405L57.3878 164.589C57.8247 164.152 58.2617 163.716 58.6987 163.424C59.7182 162.987 60.7378 162.842 61.7574 163.133C62.777 163.424 63.6509 164.298 64.2335 165.318C64.6705 166.337 64.9618 167.211 64.6705 168.231C64.3792 169.687 63.6509 170.707 62.34 171.435C61.3204 172.018 60.3009 172.163 59.2813 171.872C58.553 171.581 57.6791 171.144 57.0965 170.124Z" fill="white"/>
|
||||
<path d="M65.2531 154.976C66.4183 154.393 67.4379 154.393 68.4575 154.83C69.7684 155.413 70.9336 156.724 71.9532 158.909C73.1184 161.093 73.5554 162.841 73.2641 164.152C73.1184 165.317 72.3901 166.046 71.2249 166.628C70.0597 167.211 69.0401 167.211 67.8749 166.774C66.7096 166.337 65.5444 164.88 64.5248 162.696C63.3596 160.511 62.9226 158.763 63.2139 157.452C63.5052 156.432 64.2335 155.559 65.2531 154.976ZM66.2727 156.869C65.9813 157.015 65.8357 157.161 65.69 157.452C65.5444 157.743 65.5444 158.18 65.69 158.617C65.8357 159.2 66.2727 160.219 67.0009 161.676C67.7292 162.987 68.3118 163.861 68.6031 164.298C69.0401 164.735 69.3314 165.026 69.6227 165.026C69.914 165.026 70.2053 165.026 70.4966 164.88C70.7879 164.735 70.9336 164.589 71.0792 164.298C71.2249 164.006 71.2249 163.57 71.0792 163.133C70.9336 162.55 70.4966 161.53 69.7684 160.074C69.0401 158.763 68.4575 157.889 68.1662 157.452C67.7292 157.015 67.4379 156.724 67.1466 156.724C66.8553 156.724 66.564 156.724 66.2727 156.869Z" fill="white"/>
|
||||
<path d="M72.0988 155.122C71.5162 154.102 71.3706 153.228 71.5162 152.5C71.6619 151.772 72.2445 151.189 72.9728 150.752C73.8467 150.315 74.575 150.315 75.3032 150.461C76.0315 150.752 76.6141 151.335 77.1967 152.354C77.7794 153.374 77.925 154.248 77.7794 154.976C77.6337 155.704 77.0511 156.287 76.3228 156.724C75.4489 157.161 74.7206 157.161 73.9923 157.015C73.2641 156.87 72.5358 156.287 72.0988 155.122ZM73.701 154.248C74.138 154.976 74.4293 155.413 74.7206 155.559C75.0119 155.704 75.1576 155.704 75.4489 155.559C75.7402 155.413 75.8858 155.268 75.8858 154.976C75.8858 154.685 75.7402 154.102 75.3032 153.374C74.8663 152.646 74.575 152.209 74.2837 152.063C73.9923 151.917 73.8467 151.917 73.5554 152.063C73.2641 152.209 73.2641 152.354 73.1184 152.646C73.1184 152.937 73.4097 153.52 73.701 154.248ZM80.9837 162.113L79.3816 162.987L79.2359 147.694L80.8381 146.82L80.9837 162.113ZM83.0229 157.307C82.4403 156.287 82.2946 155.413 82.4403 154.685C82.5859 153.957 83.1686 153.374 83.8968 152.937C84.6251 152.5 85.499 152.5 86.0816 152.646C86.8099 152.937 87.3925 153.52 87.9752 154.539C88.5578 155.559 88.7034 156.433 88.5578 157.161C88.4121 157.889 87.8295 158.472 87.1012 158.909C86.373 159.346 85.499 159.346 84.7708 159.2C84.1881 158.909 83.4599 158.326 83.0229 157.307ZM84.6251 156.287C85.0621 157.015 85.3534 157.452 85.6447 157.598C85.936 157.744 86.0816 157.744 86.373 157.598C86.6643 157.452 86.8099 157.307 86.8099 157.015C86.8099 156.724 86.6643 156.141 86.2273 155.413C85.7903 154.685 85.499 154.248 85.2077 154.102C84.9164 153.957 84.7708 153.957 84.4794 154.102C84.1881 154.248 84.0425 154.394 84.0425 154.685C84.1881 155.122 84.3338 155.559 84.6251 156.287Z" fill="white"/>
|
||||
<path opacity="0.5" d="M180.902 184.98L184.398 200.711L198.964 193.865L194.157 209.305L210.179 210.616L198.381 221.54L211.635 230.716L195.905 234.212L202.751 248.777L187.311 243.825L186 259.992L175.076 248.049L165.9 261.449L162.404 245.573L147.839 252.564L152.791 237.125L136.624 235.814L148.567 224.89L135.167 215.714L151.043 212.218L144.052 197.652L159.491 202.459L160.802 186.437L171.726 198.235L180.902 184.98Z" fill="#C8D3FB"/>
|
||||
<path d="M152.354 221.686L152.791 219.209L157.598 220.083L157.161 222.56L152.354 221.686Z" fill="white"/>
|
||||
<path d="M159.637 224.89L162.113 225.182C162.113 225.764 162.259 226.201 162.405 226.638C162.696 227.075 162.987 227.221 163.424 227.367C164.007 227.512 164.444 227.367 164.881 226.93C165.318 226.638 165.609 226.056 165.755 225.182C165.9 224.453 165.9 223.725 165.609 223.288C165.318 222.851 164.881 222.56 164.298 222.414C163.57 222.269 162.842 222.414 162.259 222.997L160.365 222.269L162.842 215.86L169.25 217.171L168.813 219.501L164.152 218.627L163.278 220.666C163.861 220.521 164.444 220.521 165.026 220.521C166.046 220.666 166.92 221.249 167.502 222.269C168.085 223.143 168.231 224.308 168.085 225.619C167.939 226.638 167.357 227.512 166.629 228.24C165.609 229.26 164.298 229.551 162.842 229.26C161.676 228.969 160.802 228.532 160.22 227.804C159.637 227.075 159.491 226.056 159.637 224.89Z" fill="white"/>
|
||||
<path d="M175.513 218.045C176.678 218.336 177.698 218.919 178.135 219.938C178.718 221.103 178.863 222.997 178.426 225.327C177.989 227.804 177.261 229.406 176.096 230.28C175.222 231.008 174.202 231.299 172.891 231.008C171.581 230.717 170.707 230.134 170.124 228.969C169.541 227.804 169.541 226.056 169.978 223.58C170.415 221.249 171.144 219.501 172.309 218.627C173.183 218.19 174.202 217.899 175.513 218.045ZM175.076 220.084C174.785 220.084 174.494 220.084 174.202 220.23C173.911 220.375 173.62 220.667 173.474 221.103C173.183 221.686 172.891 222.706 172.6 224.308C172.309 225.764 172.163 226.784 172.163 227.367C172.163 227.949 172.309 228.386 172.454 228.532C172.6 228.823 172.891 228.969 173.183 228.969C173.474 228.969 173.765 228.969 174.057 228.823C174.348 228.677 174.639 228.386 174.785 227.949C175.076 227.367 175.368 226.347 175.659 224.745C175.95 223.288 176.096 222.269 176.096 221.686C176.096 221.103 175.95 220.666 175.805 220.521C175.659 220.375 175.368 220.23 175.076 220.084Z" fill="white"/>
|
||||
<path d="M180.611 222.414C180.903 221.249 181.194 220.521 181.922 220.084C182.505 219.647 183.233 219.501 184.107 219.647C184.981 219.793 185.564 220.23 186 220.812C186.437 221.395 186.437 222.414 186.292 223.434C186 224.599 185.709 225.327 184.981 225.764C184.398 226.201 183.67 226.347 182.796 226.201C181.922 226.056 181.34 225.619 180.903 225.036C180.466 224.453 180.466 223.58 180.611 222.414ZM182.505 222.851C182.359 223.725 182.359 224.308 182.505 224.599C182.65 224.89 182.796 225.036 183.087 225.036C183.379 225.036 183.524 225.036 183.816 224.89C184.107 224.599 184.253 224.162 184.398 223.288C184.544 222.414 184.544 221.832 184.398 221.54C184.253 221.249 184.107 221.103 183.816 221.103C183.524 221.103 183.379 221.103 183.087 221.249C182.942 221.395 182.65 221.977 182.505 222.851ZM183.379 233.484L181.631 233.193L191.098 221.103L192.846 221.395L183.379 233.484ZM187.894 230.862C188.185 229.697 188.477 228.969 189.205 228.532C189.787 228.095 190.516 227.949 191.39 228.095C192.264 228.241 192.846 228.677 193.283 229.26C193.72 229.843 193.72 230.862 193.575 231.882C193.283 233.047 192.992 233.775 192.264 234.212C191.681 234.649 190.953 234.795 190.079 234.649C189.205 234.504 188.622 234.067 188.185 233.484C187.748 232.901 187.748 232.028 187.894 230.862ZM189.788 231.154C189.642 232.028 189.642 232.61 189.788 232.901C189.933 233.193 190.079 233.338 190.37 233.338C190.661 233.338 190.807 233.338 191.098 233.193C191.39 232.901 191.535 232.464 191.681 231.591C191.827 230.717 191.827 230.134 191.681 229.843C191.535 229.551 191.39 229.406 191.098 229.406C190.807 229.406 190.661 229.406 190.37 229.551C190.224 229.843 189.933 230.425 189.788 231.154Z" fill="white"/>
|
||||
<path d="M49.8138 292.037H50.8334L49.3768 259.993H48.3572L49.8138 292.037Z" fill="#312890"/>
|
||||
<path d="M25.9265 258.099C25.9265 255.915 40.3462 255.769 44.7159 255.769C49.0855 255.769 63.5052 255.915 63.5052 258.099C63.5052 260.284 49.2311 260.43 44.7159 260.43C40.3462 260.43 25.9265 260.284 25.9265 258.099ZM44.7159 256.789C35.1027 256.789 28.8395 257.517 27.2373 258.099C28.6939 258.682 35.1027 259.41 44.7159 259.41C54.329 259.41 60.5922 258.682 62.1944 258.099C60.5922 257.517 54.329 256.789 44.7159 256.789Z" fill="#312890"/>
|
||||
<path d="M62.34 241.349C63.2139 243.534 63.6509 246.01 63.6509 248.486C63.6509 258.973 55.0573 267.567 44.5701 267.567C34.083 267.567 25.4894 258.973 25.4894 248.486C25.4894 246.01 25.9264 243.534 26.8003 241.349H62.34Z" fill="#C8D3FB"/>
|
||||
<path d="M26.946 241.349C26.946 242.951 34.8114 244.116 44.7159 244.116C54.4747 244.116 62.4857 242.806 62.4857 241.349C62.4857 239.747 54.6204 238.582 44.7159 238.582C34.957 238.582 26.946 239.892 26.946 241.349Z" fill="#BFCBF1"/>
|
||||
<path d="M28.6938 241.349C28.6938 242.514 35.8309 243.388 44.7158 243.388C53.6007 243.388 60.7378 242.514 60.7378 241.349C60.7378 240.183 53.6007 239.31 44.7158 239.31C35.8309 239.31 28.6938 240.329 28.6938 241.349Z" fill="#835F59"/>
|
||||
<path opacity="0.42" d="M28.6939 247.904C28.6939 246.447 31.0244 246.447 30.8787 247.904C30.7331 251.254 31.17 254.75 33.6462 257.226C34.6657 258.245 33.0635 259.848 32.044 258.828C29.2765 255.769 28.5483 251.837 28.6939 247.904Z" fill="white"/>
|
||||
<path d="M44.7159 260.43C49.0855 260.43 63.5052 260.285 63.5052 258.1H62.4857C62.4857 257.954 62.4857 257.954 62.4857 257.954C61.9031 258.537 55.3486 259.411 44.7159 259.411C34.0831 259.411 27.5287 258.537 26.946 257.954V258.1H25.9265C25.9265 260.285 40.3462 260.43 44.7159 260.43Z" fill="#312890"/>
|
||||
<path d="M66.1271 292.037L67.1466 291.891L63.214 258.391H62.1944L66.1271 292.037Z" fill="#312890"/>
|
||||
<path d="M24.1786 292.037L27.5286 258.536H26.509L23.159 291.891L24.1786 292.037Z" fill="#312890"/>
|
||||
<path d="M41.9484 292.037L42.531 259.993H41.5114L40.9288 292.037H41.9484Z" fill="#312890"/>
|
||||
<path d="M28.6938 241.35C28.6938 242.224 32.4809 242.952 38.0157 243.243C38.307 243.243 38.5983 243.243 39.0353 243.243C39.4723 243.243 39.9092 243.243 40.4918 243.243C40.7831 243.243 41.0745 243.243 41.5114 243.243C42.2397 243.243 42.968 243.243 43.6962 243.243C43.9875 243.243 44.4245 243.243 44.7158 243.243C46.1724 243.243 47.6289 243.243 48.9398 243.098C49.2311 243.098 49.6681 243.098 49.9594 243.098C56.2225 242.806 60.5921 242.078 60.5921 241.204C60.5921 240.33 56.8051 239.602 51.4159 239.311C51.1246 239.311 50.6876 239.311 50.3963 239.311C48.7941 239.165 47.0463 239.165 45.2984 239.165H44.2789C43.1136 239.165 42.094 239.165 41.0745 239.165C40.7832 239.165 40.4918 239.165 40.0549 239.165C39.4723 239.165 39.0353 239.165 38.4527 239.311C38.1614 239.311 37.7244 239.311 37.4331 239.311C32.3352 239.893 28.6938 240.622 28.6938 241.35Z" fill="#C8D3FB"/>
|
||||
<path d="M44.4245 222.851C43.6963 222.414 43.1136 221.831 42.531 221.394C41.6571 220.52 40.4919 219.21 40.4919 218.044C40.4919 217.025 41.5114 216.733 42.2397 217.462C42.8223 218.044 43.1136 218.773 43.6963 219.501C44.2789 220.229 45.2984 220.957 46.318 221.249C47.6289 219.355 47.9202 216.588 47.4833 214.257C46.9006 211.49 45.1528 207.703 42.531 204.062C42.2397 205.081 41.6571 205.955 41.2201 206.538C40.7832 207.412 39.9092 209.014 38.8897 209.305C37.8701 209.596 37.7244 208.722 37.8701 207.994V207.849V207.703C37.8701 207.703 37.8701 207.557 38.0157 207.557C38.5984 206.538 39.181 205.372 39.7636 204.353C40.2005 203.479 40.3462 202.605 40.6375 201.731C38.307 199.109 35.394 196.779 32.3352 195.468C32.9178 196.779 33.3548 198.235 33.7918 199.546C34.2287 200.857 35.2483 203.77 34.2287 205.081C33.9374 205.372 33.3548 205.664 32.9178 205.372C32.1896 204.935 32.3352 203.479 32.3352 202.896C32.3352 201.294 32.3352 199.838 31.7526 198.381C31.3156 197.07 30.5874 195.759 29.7134 194.594C27.6743 194.157 25.6351 194.011 23.596 194.594C24.1786 195.177 24.7612 195.759 24.7612 196.633C24.9069 197.361 24.4699 199.109 23.4503 199.109C22.1394 199.255 22.1394 196.196 21.9938 195.031C20.8285 195.468 19.6633 196.051 18.4981 196.779C16.4589 198.09 15.0024 199.838 13.8371 201.731V201.877C14.2741 205.081 18.3524 206.246 20.8285 207.557C21.5568 207.994 24.4699 209.305 24.1786 210.47C24.0329 211.053 23.0133 211.053 22.4307 211.053C21.1198 210.762 20.1003 209.888 19.0807 209.014C16.8959 207.266 14.7111 205.664 12.8176 203.479C10.7784 207.849 10.3414 212.801 10.3414 216.588C10.3414 216.588 10.4871 216.588 10.6327 216.588C12.0893 217.17 13.6915 217.462 15.2937 217.316C16.3133 217.17 17.3328 217.025 18.3524 217.17C19.2263 217.316 20.5372 218.336 19.5176 219.21C18.6437 219.938 16.8959 219.792 16.0219 219.647C14.1284 219.355 12.2349 218.773 10.6327 217.899C10.6327 218.918 10.7784 219.938 10.924 220.666C11.5067 224.307 13.6915 227.658 16.7502 229.551C17.7698 230.279 18.935 230.716 20.1003 231.153C22.2851 229.26 24.0329 227.075 25.0525 224.162C25.4895 222.997 26.2177 219.792 27.9656 219.938C28.6939 219.938 29.2765 220.957 29.4221 221.54C29.7134 222.705 28.9852 223.725 28.4026 224.599C27.5286 225.91 26.5091 227.075 25.6351 228.24C24.7612 229.405 23.8873 230.716 23.0134 231.881C25.1982 232.173 27.383 232.027 29.2765 231.445C32.4809 230.425 35.8309 227.075 34.0831 223.725C37.1418 224.162 41.3658 224.599 44.4245 222.851ZM16.3133 213.82C16.1676 213.82 16.1676 213.82 16.3133 213.82C16.0219 213.966 15.8763 213.966 15.7306 213.82L15.585 213.675C15.2937 213.529 15.0024 212.946 15.0024 212.655C15.0024 212.509 15.0024 212.509 15.0024 212.509C15.0024 212.364 14.8567 212.072 14.8567 211.927C14.8567 211.49 15.148 210.907 15.7306 210.907C16.4589 211.053 17.0415 211.781 17.1872 212.364C17.1872 212.946 16.8959 213.529 16.3133 213.82ZM37.1418 214.549C36.8505 214.986 36.1222 214.986 35.8309 214.694C35.394 214.257 35.2483 213.675 35.394 213.092C35.394 212.946 35.5396 212.946 35.5396 212.946C35.9766 212.801 36.7048 212.655 37.1418 213.092C37.7244 213.383 37.4331 214.112 37.1418 214.549Z" fill="url(#paint2_linear_6230_1375)"/>
|
||||
<path d="M71.6619 204.062C73.4098 204.79 75.1576 205.227 77.0512 205.373C78.0707 201.877 77.9251 198.09 77.4881 194.449C76.1772 195.759 74.7207 196.925 72.9728 197.799C71.5163 198.527 69.0402 199.692 67.7293 198.09C67.5836 197.944 67.5836 197.799 67.7293 197.653C69.1858 196.488 71.0793 196.633 72.6815 196.051C74.4294 195.468 76.1772 194.449 77.3425 192.992C77.3425 192.701 77.1968 192.409 77.1968 192.118C76.9055 189.351 76.3229 186.729 75.8859 184.107C75.8859 184.107 75.8859 184.253 75.7403 184.253C75.449 184.69 75.012 185.709 74.4294 185.855C73.8468 186.001 73.7011 185.272 73.7011 184.835C73.8468 184.107 74.575 183.67 74.8663 182.942C75.012 182.505 75.1576 182.214 75.3033 181.777C74.8663 179.592 74.4294 177.553 73.8468 175.368C73.8468 175.222 73.7011 175.222 73.5554 175.222C71.5163 175.513 69.3315 175.805 67.2923 176.096C64.9618 178.427 63.3597 181.048 63.0683 184.398C62.9227 185.272 63.651 190.225 61.3205 189.642C58.99 189.059 60.0096 184.544 60.5922 183.087C61.3205 180.757 62.4857 178.718 63.9423 176.679C59.1357 177.553 54.4747 179.009 50.1051 181.34C48.5029 184.69 48.6486 188.185 50.8334 191.535C51.2704 192.264 53.8921 195.614 51.853 196.051C50.1051 196.342 48.6486 192.846 48.3573 191.535C47.9203 189.496 48.2116 187.457 48.3573 185.564C48.5029 184.398 48.6486 183.233 49.0855 182.068C49.0855 182.068 48.9399 182.068 48.9399 182.214C45.7355 184.107 42.5311 186.583 41.6572 190.516C41.2202 192.264 41.2202 194.012 41.3659 195.614C42.2398 196.779 43.1137 197.944 44.1333 199.109C45.1529 200.129 46.4638 200.712 47.629 201.44C48.5029 202.023 49.9595 203.916 48.6486 204.79C47.629 205.518 45.5898 204.644 44.5703 204.207C44.1333 204.062 43.6963 203.916 43.405 203.625C43.2594 213.966 52.2899 208.577 52.2899 208.723C52.2899 218.19 61.9031 218.19 67.7293 216.005C67.1467 215.86 66.564 215.714 65.9814 215.714C64.8162 215.568 63.651 215.423 62.4857 215.277C61.1748 214.986 59.427 214.258 59.7183 212.655C60.0096 211.199 61.7575 212.364 62.4857 212.801C64.8162 214.112 67.438 215.277 70.2054 215.131C70.4967 214.986 70.788 214.84 71.0793 214.549C73.1185 213.092 74.8663 211.199 76.0316 209.014C73.7011 209.014 71.5163 208.723 69.1858 208.431C67.5836 208.14 64.9618 207.703 64.0879 205.955C63.9423 205.81 64.0879 205.518 64.3792 205.518C66.4184 205.373 68.1662 205.955 69.9141 206.829C71.9533 207.849 74.1381 208.431 76.4685 208.14C76.7598 207.557 76.9055 206.975 77.1968 206.392C77.1968 206.392 77.1968 206.392 77.1968 206.247C75.3033 206.101 73.5554 205.518 71.8076 204.936C71.225 204.353 71.3706 203.916 71.6619 204.062ZM68.1662 184.69C68.1662 184.544 68.1662 184.544 68.3119 184.544C68.4576 184.107 68.7489 183.816 69.1858 183.67C70.4967 183.524 71.3706 184.981 70.2054 185.855C69.7684 186.146 69.1858 186.438 68.7489 186.146C68.1662 185.855 68.0206 185.127 68.1662 184.69ZM56.5139 209.888C56.0769 210.179 55.64 210.325 55.203 209.888C55.0574 209.742 55.0574 209.597 55.203 209.451C55.203 209.16 55.3487 208.723 55.4943 208.431C55.7856 208.14 56.3683 208.14 56.6596 208.577C57.0965 209.16 56.8052 209.742 56.5139 209.888ZM57.5335 189.642C57.3878 190.225 57.0965 191.244 56.5139 191.535C55.7856 191.972 55.4943 190.953 55.3487 190.37V190.225C55.0574 189.642 54.9117 188.914 54.9117 188.331C55.0574 187.311 55.9313 187.166 56.8052 187.603C57.5335 188.04 57.6791 188.914 57.5335 189.642ZM64.6705 199.692C64.3792 200.129 63.7966 200.129 63.3597 199.983C62.777 199.692 62.4857 199.109 62.6314 198.527C62.6314 198.236 62.9227 198.236 63.0683 198.236C63.3597 197.799 63.9423 197.653 64.3792 198.09C64.8162 198.527 65.1075 199.255 64.6705 199.692Z" fill="url(#paint3_linear_6230_1375)"/>
|
||||
<path d="M26.0721 244.408C26.6547 245.428 26.946 246.593 27.2373 247.758C24.9069 248.632 22.4307 248.632 19.9546 248.632C20.8285 247.758 21.4112 246.739 21.8481 245.573C22.2851 244.554 22.8677 242.952 21.8481 242.223C21.8481 242.223 21.7025 242.223 21.5568 242.223C20.8285 243.243 20.9742 244.408 20.6829 245.428C20.3916 246.447 19.809 247.758 18.7894 248.487C18.6437 248.487 18.3524 248.487 18.2068 248.487C16.4589 248.341 14.5654 248.195 12.8176 248.05C12.8176 248.05 12.8176 248.05 12.9632 248.05C13.2545 247.904 13.8371 247.613 13.9828 247.176C13.9828 246.884 13.5458 246.739 13.2545 246.739C12.8176 246.884 12.5263 247.321 12.0893 247.467C11.798 247.613 11.5067 247.758 11.361 247.758C9.90448 247.613 8.44794 247.321 7.13705 247.176C6.99139 247.176 6.99139 247.03 6.99139 247.03C7.13705 245.719 7.13705 244.263 7.2827 242.952C8.73924 241.349 10.3414 240.184 12.5263 239.893C13.1089 239.747 16.4589 239.893 15.8763 238.582C15.2937 237.125 12.3806 237.999 11.5067 238.436C10.0501 239.019 8.73924 239.893 7.42836 240.912C7.86532 237.854 8.44794 234.795 9.75882 231.882C11.9436 230.717 14.2741 230.717 16.6046 231.882C17.0415 232.173 19.5177 233.63 19.6633 232.319C19.809 231.154 17.3328 230.425 16.4589 230.28C15.148 230.134 13.8371 230.425 12.5263 230.571C11.798 230.717 10.9241 230.862 10.3414 231.154C10.3414 231.154 10.3414 231.154 10.3414 231.008C11.5067 228.823 12.9632 226.784 15.4393 225.91C16.6046 225.473 17.6242 225.473 18.7894 225.473C19.6633 225.91 20.3916 226.493 21.2655 227.075C21.9938 227.658 22.4307 228.386 23.0134 229.26C23.4503 229.843 24.7612 230.717 25.3438 229.843C25.7808 229.115 25.0525 227.949 24.7612 227.367C24.6156 227.075 24.4699 226.93 24.3243 226.638C31.17 226.056 28.1113 232.028 28.1113 232.028C34.3744 231.445 34.957 237.562 33.6461 241.495C33.5005 241.058 33.5005 240.767 33.3548 240.33C33.2092 239.602 33.0635 238.873 32.9179 238.145C32.6265 237.417 32.0439 236.252 31.0243 236.543C30.1504 236.689 30.8787 237.854 31.17 238.291C32.1896 239.747 33.0635 241.349 33.0635 243.097C32.9179 243.243 32.9179 243.534 32.7722 243.68C31.8983 244.991 30.733 246.302 29.2765 247.176C29.1308 245.719 28.8395 244.263 28.5482 242.952C28.2569 241.932 27.82 240.33 26.6547 239.893C26.5091 239.893 26.3634 239.893 26.3634 240.039C26.3634 241.349 26.8004 242.515 27.5286 243.534C28.4026 244.845 28.8395 246.156 28.6939 247.613C28.4026 247.758 27.9656 248.05 27.6743 248.195C27.383 247.03 27.0917 245.865 26.5091 244.845C26.3634 244.117 25.9264 244.117 26.0721 244.408ZM13.1089 243.097C12.9632 243.097 12.9632 243.097 13.1089 243.097C12.6719 243.243 12.5263 243.534 12.5263 243.826C12.5263 244.699 13.5458 245.136 13.9828 244.408C14.1285 244.117 14.2741 243.68 14.1285 243.389C13.8371 243.097 13.4002 242.952 13.1089 243.097ZM29.2765 234.504C29.4221 234.212 29.4221 233.921 29.2765 233.63C29.1308 233.484 29.1308 233.63 28.9852 233.63C28.6939 233.63 28.5482 233.775 28.4026 233.921C28.1113 234.212 28.2569 234.504 28.5482 234.649C28.8395 234.941 29.1308 234.649 29.2765 234.504ZM15.8763 236.252C16.3133 236.106 16.8959 235.96 17.0415 235.523C17.1872 235.086 16.6046 234.941 16.1676 234.795C16.1676 234.795 16.1676 234.795 16.022 234.795C15.585 234.649 15.148 234.504 14.7111 234.649C14.1285 234.795 13.9828 235.378 14.2741 235.815C14.8567 236.252 15.4393 236.252 15.8763 236.252ZM22.8677 240.184C23.159 239.893 23.159 239.602 23.0134 239.31C22.8677 239.019 22.4307 238.873 21.9938 238.873C21.8481 238.873 21.8481 239.019 21.8481 239.165C21.5568 239.456 21.5568 239.747 21.8481 240.039C22.1394 240.33 22.5764 240.476 22.8677 240.184Z" fill="#6A6AE8"/>
|
||||
<path d="M80.2556 222.268C79.6729 222.268 78.9447 222.123 78.362 222.123C77.0512 221.977 75.3033 222.268 74.2837 221.394C74.1381 221.249 74.1381 221.103 74.2837 220.957C76.3229 219.355 78.5077 221.103 80.5469 221.249C80.8382 219.646 80.8382 217.899 80.6925 216.442C80.5469 215.277 80.2556 214.112 79.9642 212.946C78.799 214.549 77.7794 216.296 76.1772 217.462C75.5946 217.899 73.9924 219.501 73.1185 218.918C72.2446 218.19 73.8468 217.17 74.2837 216.879C76.3229 215.568 78.2164 214.257 79.6729 212.364C78.9447 210.762 77.7794 209.596 76.0316 208.722C74.8663 208.14 73.5555 207.703 72.3902 207.557C72.6815 209.596 72.3902 212.509 70.4967 213.092C69.1858 213.383 68.3119 211.927 68.3119 210.762C68.1663 209.305 69.0402 208.14 70.2054 207.266C68.1662 206.975 66.2727 207.12 64.3792 207.266C64.0879 207.266 63.651 207.266 63.3597 207.411V207.557C62.4857 209.305 61.3205 211.344 61.1748 213.529C61.1748 214.257 61.4662 215.277 61.0292 216.005C60.4466 217.17 59.1357 216.151 58.99 215.277C58.6987 213.675 59.427 211.49 60.0096 209.888C60.3009 209.159 60.4466 208.577 60.7379 207.848C58.4074 208.285 56.0769 209.159 54.0378 210.616C53.3095 211.053 52.7269 211.635 52.1443 212.218C51.853 214.257 51.9986 216.296 52.7269 218.19C53.3095 219.501 54.7661 221.977 53.3095 223.433C52.2899 224.453 51.7073 222.56 51.5617 221.831C50.8334 219.501 50.6877 216.879 50.5421 214.403C49.5225 215.859 48.6486 217.462 48.066 219.209C47.4833 220.812 46.9007 222.56 46.6094 224.453C47.7747 225.327 49.2312 225.618 50.6877 226.492C51.2704 226.784 52.5812 227.657 51.9986 228.531C50.6877 230.571 47.9203 228.24 46.3181 226.492C46.1725 228.094 46.7551 229.405 47.7747 230.571C50.2508 233.047 54.0378 233.921 56.9509 231.59C56.8052 234.503 58.99 236.979 61.9031 236.542C62.9227 236.397 63.7966 235.814 64.5249 235.231C63.7966 235.231 63.214 235.377 62.4857 235.377C61.6118 235.377 60.1553 235.231 59.864 234.212C59.5726 233.192 60.4466 233.192 61.0292 233.484C61.7575 233.775 62.3401 234.212 63.214 234.212C64.2336 234.212 65.2532 233.921 66.1271 233.484C67.1467 232.173 68.3119 231.007 69.7684 230.279C70.3511 229.988 70.9337 229.697 71.5163 229.551C70.3511 229.405 68.6032 229.26 68.1662 228.094C67.438 226.201 70.3511 226.201 71.225 226.347C72.5359 226.492 73.7011 226.929 75.012 227.075C76.0316 227.22 77.1968 227.075 78.2164 226.784C78.362 226.638 78.6534 226.492 78.799 226.347C79.236 224.744 79.8186 223.579 80.2556 222.268ZM57.6791 223.579C57.0965 223.579 56.8052 222.851 56.8052 222.414C56.8052 221.977 56.8052 221.394 57.0965 220.957V220.812C57.2422 220.52 57.3878 220.083 57.8248 219.938C58.1161 219.792 58.4074 219.938 58.5531 220.229C58.99 220.666 59.1357 221.54 58.99 222.123C58.8444 222.705 58.4074 223.579 57.6791 223.579ZM64.8162 216.879C64.5249 216.296 64.6705 215.568 65.2532 215.131H65.3988C65.8358 214.84 66.5641 214.84 66.8554 215.422C67.1467 216.005 66.8554 216.879 66.2727 217.316C65.6901 217.607 65.1075 217.462 64.8162 216.879ZM63.651 229.551C63.3597 230.134 62.4857 230.425 62.0488 229.842C61.7575 229.405 61.6118 228.823 61.9031 228.386C61.7575 228.24 61.7575 228.094 61.9031 227.949C62.777 227.22 64.3792 228.386 63.651 229.551Z" fill="#6A6AE8"/>
|
||||
<path d="M48.9398 243.388C49.2311 243.388 49.668 243.388 49.9593 243.388C50.2506 242.368 50.6876 241.349 51.1246 240.329C51.2702 240.038 51.4159 239.746 51.5615 239.601C54.0377 234.503 57.5334 230.279 61.903 226.783C62.34 226.346 61.7573 225.764 61.1747 226.055C56.6594 229.551 53.0181 234.066 50.542 239.164C50.542 239.31 50.3963 239.455 50.3963 239.601C49.8137 240.766 49.3767 242.077 48.9398 243.388Z" fill="#312890"/>
|
||||
<path d="M43.6963 243.534C43.9876 243.534 44.4246 243.534 44.7159 243.534C44.8615 242.078 45.1528 240.767 45.2985 239.456C45.7354 237.125 46.1724 234.649 46.755 232.319C47.9203 227.367 49.2312 222.414 50.542 217.462C51.8529 212.656 53.1638 207.849 56.2226 203.771C56.6595 203.188 55.7856 202.751 55.3486 203.334C52.4355 207.266 51.1247 211.782 49.8138 216.443C48.3572 221.977 46.9007 227.512 45.5898 233.047C45.1528 235.232 44.7159 237.271 44.2789 239.456C44.1333 240.767 43.8419 242.078 43.6963 243.534Z" fill="#312890"/>
|
||||
<path d="M31.8982 220.811C33.2091 223.433 34.2287 226.201 35.1026 228.968C35.2483 229.405 35.3939 229.696 35.3939 230.133C36.2678 233.192 36.9961 236.396 37.4331 239.601C37.5787 240.912 37.87 242.077 38.0157 243.388C38.307 243.388 38.5983 243.388 39.0353 243.388C38.8896 242.077 38.744 240.766 38.4526 239.601C38.0157 236.688 37.4331 233.92 36.7048 231.153C36.5591 230.57 36.4135 230.133 36.2678 229.551C35.3939 226.346 34.2287 223.288 32.6265 220.375C32.4808 219.646 31.6069 220.229 31.8982 220.811Z" fill="#312890"/>
|
||||
<path d="M22.722 235.959C25.3438 234.211 27.8199 232.464 30.4417 230.861C31.8983 229.987 33.3548 229.259 34.957 229.842C35.1027 229.842 35.2483 229.987 35.394 230.133C35.8309 230.424 36.2679 230.716 36.7049 231.007C37.1418 231.444 37.5788 232.027 38.0157 232.609C39.181 234.503 39.7636 236.979 40.0549 239.309C40.2006 240.62 40.3462 241.931 40.3462 243.242C40.6375 243.242 40.9288 243.242 41.3658 243.242C41.2201 241.931 41.2201 240.474 41.0745 239.164C40.6375 235.814 39.7636 232.609 37.5788 230.424C37.1418 229.987 36.7049 229.696 36.2679 229.405C35.8309 229.113 35.5396 228.968 35.1027 228.822C34.0831 228.531 32.9178 228.385 31.7526 228.822C30.2961 229.405 28.8395 230.57 27.5286 231.444C25.7808 232.609 23.8873 233.774 22.1394 235.085C21.7025 235.522 22.1394 236.251 22.722 235.959Z" fill="#312890"/>
|
||||
<path d="M79.8186 219.209C84.9164 216.587 89.2861 225.472 90.4513 228.968C92.1992 234.357 92.6361 240.475 92.6361 240.766C92.6361 240.912 92.4905 241.057 92.3448 241.057C92.1992 241.057 91.9079 240.912 91.9079 240.766C91.9079 240.62 91.6165 234.503 89.723 229.114C88.7035 226.055 84.3338 217.607 80.1099 219.792C75.4489 222.268 73.9924 232.318 73.5554 237.562L72.8271 237.416C73.2641 232.172 74.7207 221.831 79.8186 219.209Z" fill="#1C0A76"/>
|
||||
<path d="M64.8161 234.649L71.0793 292.619H51.416L52.4355 286.793L53.8921 236.105L59.8639 235.96L64.8161 234.649Z" fill="url(#paint4_linear_6230_1375)"/>
|
||||
<path d="M111.134 282.569L114.921 292.474L71.0793 292.619L67.001 284.754L64.8162 234.649L107.347 238.873L111.134 282.569Z" fill="url(#paint5_linear_6230_1375)"/>
|
||||
<path d="M67.0009 284.754L71.0792 292.619L60.1551 291.017L59.5725 235.96L64.8161 234.649L67.0009 284.754Z" fill="#D35600"/>
|
||||
<path d="M96.7143 239.748C97.4426 239.748 97.8795 240.33 97.8795 241.058C97.8795 241.787 97.2969 242.369 96.7143 242.369C95.986 242.369 95.5491 241.787 95.5491 241.058C95.4034 240.33 95.986 239.748 96.7143 239.748Z" fill="#1C0A76"/>
|
||||
<path d="M75.8858 238.436C76.7598 238.436 77.488 239.164 77.488 240.038C77.488 240.912 76.9054 241.64 76.0315 241.64C75.1576 241.64 74.4293 240.912 74.4293 240.038C74.2836 239.018 75.0119 238.436 75.8858 238.436Z" fill="#1C0A76"/>
|
||||
<path d="M89.5773 219.209C92.9273 221.54 94.0926 226.346 94.9665 229.988C96.423 235.668 97.0057 240.766 97.0057 241.203C97.0057 241.349 96.86 241.494 96.7143 241.494C96.5687 241.494 96.2774 241.349 96.2774 241.203C96.2774 241.058 95.4035 235.377 94.2382 229.696C94.0926 229.114 92.4904 222.559 89.286 220.083C87.6838 218.772 85.3533 219.355 83.1685 220.52C77.1967 224.016 76.3228 239.747 76.3228 239.892C76.3228 240.038 76.1771 240.184 75.8858 240.184C75.7401 240.184 75.5945 240.038 75.5945 239.892C75.5945 239.164 76.4684 223.433 82.8772 219.792C85.2077 218.335 87.6838 217.898 89.5773 219.209Z" fill="#1C0A76"/>
|
||||
<path d="M91.6166 255.768C94.2384 256.351 96.4232 258.099 97.5884 260.429L80.9838 270.625C79.6729 268.44 79.236 265.818 79.9642 263.197C81.2751 257.807 86.5187 254.603 91.6166 255.768Z" fill="#4135B0"/>
|
||||
<path d="M98.7536 267.712C97.4427 272.955 92.1992 276.306 87.1013 274.995C86.5186 274.849 86.0817 274.703 85.6447 274.412L99.0449 266.255C98.8993 266.692 98.7536 267.275 98.7536 267.712Z" fill="#4135B0"/>
|
||||
<path d="M272.956 241.349L273.102 292.037L199.255 292.328L199.109 241.495L272.956 241.349Z" fill="url(#paint6_linear_6230_1375)"/>
|
||||
<path d="M289.316 241.172L272.129 241.24L272.33 292.073L289.518 292.005L289.316 241.172Z" fill="#D35600"/>
|
||||
<path d="M285.628 253.584H282.424C281.55 253.584 280.676 252.564 280.676 251.253C280.676 249.942 281.404 248.923 282.424 248.923H285.628C286.502 248.923 287.376 249.942 287.376 251.253C287.376 252.419 286.648 253.584 285.628 253.584Z" fill="url(#paint7_linear_6230_1375)"/>
|
||||
<path d="M216.151 251.836H208.286C207.703 251.836 207.266 251.253 207.266 250.379C207.266 249.651 207.703 248.923 208.286 248.923H216.151C216.734 248.923 217.17 249.505 217.17 250.379C217.17 251.108 216.734 251.836 216.151 251.836Z" fill="url(#paint8_linear_6230_1375)"/>
|
||||
<path d="M216.151 257.371H208.286C207.703 257.371 207.266 256.788 207.266 255.914C207.266 255.186 207.703 254.458 208.286 254.458H216.151C216.734 254.458 217.17 255.04 217.17 255.914C217.17 256.788 216.734 257.371 216.151 257.371Z" fill="url(#paint9_linear_6230_1375)"/>
|
||||
<path d="M266.779 202.081L209.828 202.257L209.949 241.438L266.9 241.262L266.779 202.081Z" fill="#6A6AE8"/>
|
||||
<path d="M279.435 201.998L266.18 202.05L266.335 241.231L279.59 241.179L279.435 201.998Z" fill="#312890"/>
|
||||
<path d="M276.597 211.49H274.121C273.393 211.49 272.81 210.616 272.81 209.742C272.81 208.722 273.393 207.994 274.121 207.994H276.597C277.326 207.994 277.908 208.868 277.908 209.742C277.908 210.761 277.326 211.49 276.597 211.49Z" fill="url(#paint10_linear_6230_1375)"/>
|
||||
<path d="M222.997 210.18H216.879C216.442 210.18 216.151 209.743 216.005 209.014C216.005 208.432 216.297 207.849 216.734 207.849H222.851C223.288 207.849 223.725 208.286 223.725 209.014C223.725 209.743 223.434 210.18 222.997 210.18Z" fill="url(#paint11_linear_6230_1375)"/>
|
||||
<path d="M222.997 214.55H216.879C216.442 214.55 216.151 214.113 216.005 213.384C216.005 212.802 216.297 212.219 216.734 212.219H222.851C223.288 212.219 223.579 212.656 223.725 213.384C223.871 214.113 223.434 214.55 222.997 214.55Z" fill="url(#paint12_linear_6230_1375)"/>
|
||||
<path d="M260.138 174.348V202.168L219.792 202.314L219.647 174.348H260.138Z" fill="url(#paint13_linear_6230_1375)"/>
|
||||
<path d="M269.116 174.185L259.649 174.222L259.758 202.042L269.225 202.005L269.116 174.185Z" fill="#D35600"/>
|
||||
<path d="M267.13 181.048H265.382C264.799 181.048 264.508 180.465 264.508 179.737C264.508 179.009 264.945 178.426 265.382 178.426H267.13C267.712 178.426 268.004 179.009 268.004 179.737C268.004 180.465 267.567 181.048 267.13 181.048Z" fill="url(#paint14_linear_6230_1375)"/>
|
||||
<path d="M228.968 180.029H224.599C224.307 180.029 224.016 179.738 224.016 179.301C224.016 178.864 224.307 178.573 224.599 178.573H228.968C229.26 178.573 229.551 178.864 229.551 179.301C229.551 179.738 229.26 180.029 228.968 180.029Z" fill="url(#paint15_linear_6230_1375)"/>
|
||||
<path d="M228.968 183.088H224.599C224.307 183.088 224.016 182.797 224.016 182.36C224.016 181.923 224.307 181.631 224.599 181.631H228.968C229.26 181.631 229.551 181.923 229.551 182.36C229.551 182.797 229.26 183.088 228.968 183.088Z" fill="url(#paint16_linear_6230_1375)"/>
|
||||
<path d="M179.155 159.2C177.261 150.169 171.872 144.198 170.124 142.741C167.211 140.265 159.055 140.556 155.705 147.256C152.354 154.102 151.189 158.18 152.063 170.415C152.937 182.65 163.133 224.599 163.133 233.775C163.133 242.951 182.214 241.932 181.194 228.823C180.174 215.714 181.34 169.542 179.155 159.2Z" fill="#6A6AE8"/>
|
||||
<path d="M151.772 161.822C151.917 155.704 153.228 152.208 155.704 147.256C157.598 143.469 160.948 141.721 164.007 141.284C164.152 141.284 164.444 141.284 164.589 141.284C164.735 141.284 164.881 141.284 165.172 141.284C165.755 141.284 166.191 141.284 166.628 141.43C167.211 141.576 167.794 141.721 168.376 141.867C168.668 142.013 168.959 142.013 169.105 142.158C169.25 142.158 169.396 142.304 169.396 142.304C169.687 142.45 169.833 142.595 169.978 142.741C170.124 142.887 170.27 142.887 170.415 143.032C170.561 143.032 170.561 143.178 170.707 143.324C170.707 143.324 170.707 143.324 170.852 143.469L170.998 143.615C170.998 143.615 170.998 143.615 171.144 143.761L171.289 143.906C171.289 143.906 171.289 143.906 171.435 144.052C171.581 144.343 171.872 144.489 172.018 144.78C172.018 144.78 172.018 144.926 172.163 144.926C172.309 145.071 172.309 145.071 172.455 145.217L172.6 145.363C172.746 145.508 172.746 145.508 172.892 145.654C172.892 145.654 172.892 145.8 173.037 145.8C173.329 146.091 173.474 146.382 173.766 146.819C173.766 146.819 173.766 146.965 173.911 146.965C174.057 147.111 174.057 147.256 174.202 147.402L174.348 147.548C174.494 147.693 174.494 147.839 174.639 147.985L174.785 148.13C175.076 148.567 175.368 149.004 175.513 149.441C175.513 149.441 175.513 149.587 175.659 149.587C175.805 149.732 175.805 149.878 175.95 150.024C175.95 150.169 176.096 150.169 176.096 150.315C176.242 150.461 176.242 150.606 176.387 150.752L176.533 150.898C176.679 151.189 176.824 151.335 176.97 151.626C177.116 151.917 177.261 152.063 177.261 152.354C177.261 152.5 177.261 152.5 177.407 152.645C177.553 152.791 177.553 153.082 177.698 153.228C177.698 153.374 177.844 153.374 177.844 153.519C177.989 153.665 177.989 153.956 178.135 154.102C178.135 154.248 178.135 154.248 178.281 154.393C178.426 154.685 178.426 154.976 178.572 155.267C178.718 155.559 178.718 155.85 178.863 156.141C178.863 156.287 178.863 156.287 179.009 156.432C179.009 156.578 179.155 156.869 179.155 157.015C179.155 157.161 179.155 157.161 179.3 157.306C179.3 157.452 179.446 157.743 179.446 157.889C179.446 158.035 179.446 158.035 179.592 158.18C179.737 158.472 179.737 158.763 179.883 159.054C179.883 159.2 180.029 159.346 180.029 159.637V159.783C180.029 159.928 180.029 160.074 180.029 160.219C180.029 160.365 180.029 160.365 180.029 160.511C180.029 160.656 180.029 160.802 180.029 160.948C180.029 161.093 180.029 161.093 180.029 161.239C180.029 161.385 180.029 161.53 180.029 161.676C180.029 161.822 180.029 161.822 180.029 161.967C180.029 162.113 180.029 162.404 180.029 162.55V162.696C180.029 163.278 180.174 163.861 180.174 164.443V164.589C180.174 164.88 180.174 165.172 180.174 165.317C180.174 165.463 180.174 165.463 180.174 165.609C180.174 165.9 180.174 166.191 180.174 166.337C180.174 166.483 180.174 166.483 180.174 166.628C180.174 166.92 180.174 167.211 180.174 167.502C180.174 167.502 180.174 167.648 180.174 167.793C180.174 168.085 180.174 168.522 180.174 168.959C180.174 170.124 180.32 171.435 180.32 172.746C180.32 172.746 180.32 172.746 180.32 172.891C180.32 173.328 180.32 173.765 180.32 174.057C180.32 174.057 180.32 174.057 180.32 174.202C180.32 174.639 180.32 175.076 180.32 175.513C172.163 181.339 158.181 181.194 158.617 185.272C158.763 187.166 164.735 226.929 165.463 228.531C165.609 228.677 164.444 234.357 163.133 234.357C163.133 234.066 163.133 233.921 163.133 233.629C163.133 224.599 153.228 183.815 152.063 170.852C152.063 170.707 152.063 170.415 152.063 170.27C151.917 168.376 151.772 166.628 151.772 165.026C151.626 164.006 151.626 162.841 151.772 161.822Z" fill="#3B31A1"/>
|
||||
<path d="M135.022 159.346C138.517 150.315 144.926 144.198 146.965 142.595C150.315 139.974 158.472 140.119 160.657 146.965C162.842 153.811 163.278 157.889 160.22 170.124C157.161 182.505 145.509 224.453 143.906 233.775C142.304 242.951 124.971 235.668 127.011 222.268C129.195 207.266 130.943 169.833 135.022 159.346Z" fill="#6A6AE8"/>
|
||||
<path d="M153.957 177.553C149.733 176.824 143.033 175.659 141.43 176.242C138.226 177.261 135.75 180.029 135.604 183.525C135.604 187.603 129.341 226.201 129.341 226.493C128.758 225.91 127.739 225.182 126.719 224.162C126.719 223.579 126.719 222.997 126.865 222.414C129.05 207.557 130.943 169.979 134.876 159.492C138.08 151.335 143.615 145.509 146.091 143.324C146.383 143.033 146.528 142.887 146.82 142.741C150.17 140.12 158.326 140.265 160.511 147.111C162.696 153.957 163.133 158.035 160.074 170.27C159.928 170.853 159.2 172.892 158.618 174.785C158.035 176.679 155.996 177.99 153.957 177.553Z" fill="#3B31A1"/>
|
||||
<path d="M192.118 114.63C189.642 111.28 187.02 108.949 179.009 101.521C178.718 101.229 178.426 100.792 178.135 100.501C172.309 94.238 167.794 85.6444 166.628 84.4792C162.259 80.5465 150.024 82.1487 154.102 94.238C157.743 105.162 173.765 121.912 181.776 123.66C184.835 124.388 190.37 121.475 191.535 118.999C191.098 118.708 192.846 115.504 192.118 114.63Z" fill="#D35600"/>
|
||||
<path d="M214.84 98.4623C219.21 97.5884 223.725 98.8993 224.308 95.2579C224.745 92.0535 223.434 89.7231 221.395 87.6839C221.103 87.2469 219.21 85.9361 218.481 86.2274C216.879 86.81 214.986 88.8491 212.801 91.4709C209.597 95.2579 189.933 104.725 184.253 109.241C177.99 114.193 183.087 126.137 187.166 123.661C193.283 119.728 210.47 99.3362 214.84 98.4623Z" fill="#FFD2A7"/>
|
||||
<path d="M150.606 64.5249C151.48 70.6423 143.906 73.1185 143.906 73.1185C143.324 68.6032 138.08 65.9814 136.478 60.4465C134.73 54.6204 138.226 48.5029 146.382 48.7942C151.189 48.7942 149.878 58.2617 150.606 64.5249Z" fill="#1C0A76"/>
|
||||
<path d="M144.052 82.0032C139.682 82.5858 131.817 84.4793 129.487 88.7033C127.156 92.7816 128.904 132.254 131.817 158.18C131.817 158.18 167.648 173.328 180.466 157.015C180.466 157.015 171.581 90.4512 166.483 84.3337C162.259 79.0901 148.422 81.4206 144.052 82.0032Z" fill="url(#paint17_linear_6230_1375)"/>
|
||||
<path d="M143.178 82.1487C143.178 82.1487 158.326 103.269 160.074 104.871C160.074 104.871 159.491 86.8096 159.2 81.4204L143.178 82.1487Z" fill="url(#paint18_linear_6230_1375)"/>
|
||||
<path d="M145.946 73.2639C145.8 72.5356 145.654 71.953 145.654 71.953C145.654 71.953 154.248 65.1072 155.413 72.0986L145.946 73.2639Z" fill="url(#paint19_linear_6230_1375)"/>
|
||||
<path d="M155.122 86.5185L157.744 81.5662C157.744 81.5662 155.122 79.8184 155.413 75.0118C156.287 63.3594 145.654 71.9531 145.654 71.9531C145.654 71.9531 147.548 81.5662 144.052 82.0032L155.122 86.5185Z" fill="#FFD2A7"/>
|
||||
<path d="M155.122 84.1882C149.15 84.9165 149.441 77.4881 149.15 76.0316C148.859 74.7207 145.654 71.8076 145.654 71.8076C145.654 71.8076 147.548 81.4208 144.052 81.8578L155.122 86.373L156.724 83.46C156.287 83.8969 155.704 84.1882 155.122 84.1882Z" fill="#FFBC8E"/>
|
||||
<path d="M128.321 112.445L142.159 101.083L137.789 114.338C135.022 122.64 134.876 131.817 137.935 140.119C141.867 151.043 151.189 163.132 172.746 162.695C157.161 168.813 131.963 158.18 131.963 158.18C130.361 145.654 128.904 125.699 128.321 112.445Z" fill="#D35600"/>
|
||||
<path d="M158.326 55.2026L161.239 68.6028C161.822 72.5355 157.598 76.4682 153.374 77.0508C149.15 77.6334 145.363 74.866 144.78 70.7876V70.4963C144.78 70.4963 140.411 70.7876 139.828 66.2724C139.246 61.9027 142.45 63.2136 142.45 63.2136L142.159 61.3201C141.867 59.1353 143.469 57.0961 145.654 56.8048L158.326 55.2026Z" fill="#FFD2A7"/>
|
||||
<path d="M142.45 63.2136L142.159 61.1745C141.867 59.1353 143.324 57.0961 145.509 56.9505L147.693 56.6592V56.8048L149.733 72.0985C150.024 74.7203 152.937 76.4682 155.559 76.0312C156.433 75.8855 157.889 75.1573 158.472 74.7203C156.724 76.1768 155.122 76.7595 153.52 76.9051C149.296 77.4877 145.509 74.7203 144.926 70.642V70.3507C144.926 70.3507 140.556 70.642 139.974 66.1267C139.245 61.9027 142.45 63.2136 142.45 63.2136Z" fill="#FFBC8E"/>
|
||||
<path d="M156.433 79.9639C156.724 83.0226 155.122 86.3727 155.122 86.3727C155.122 86.3727 156.87 85.3531 158.763 87.2466C159.637 88.1205 160.365 88.1205 160.365 88.1205C160.365 88.1205 160.365 85.6444 159.2 80.9834L156.433 79.9639Z" fill="#C8D3FB"/>
|
||||
<path d="M114.193 116.524C116.232 112.882 128.613 89.5775 129.632 88.4123C133.419 83.897 145.8 84.0426 143.324 96.5689C140.993 107.93 133.419 121.476 125.7 124.243C122.786 125.263 116.815 123.224 115.504 120.893C115.212 120.165 113.61 117.543 114.193 116.524Z" fill="url(#paint20_linear_6230_1375)"/>
|
||||
<path d="M124.971 125.263C117.689 126.719 97.1514 123.078 92.4904 124.098C90.0143 124.68 91.3252 117.106 93.51 117.543C98.4623 118.563 114.047 113.465 121.476 112.737C127.739 112.3 129.924 124.243 124.971 125.263Z" fill="#FFD2A7"/>
|
||||
<path d="M145.946 79.8186C147.839 82.8773 155.267 86.5187 155.267 86.5187C155.267 86.5187 153.083 86.0817 150.898 88.9948C150.024 90.1601 148.567 90.597 148.567 90.597C148.567 90.597 143.906 87.1013 143.324 82.1491L145.946 79.8186Z" fill="#C8D3FB"/>
|
||||
<path d="M147.111 55.3485C147.111 55.3485 150.461 58.6985 155.85 57.3877C161.239 56.0768 162.113 58.9899 162.113 58.9899C162.113 58.9899 163.424 48.6484 155.85 46.0266C148.422 43.4049 144.635 48.7941 144.635 48.7941L147.111 55.3485Z" fill="#1C0A76"/>
|
||||
<path d="M82.2946 109.095L87.6839 106.036L88.1208 106.91L85.3534 108.512L83.4599 109.677C82.8773 110.114 82.586 110.988 83.0229 111.717L91.1796 126.282C91.6165 127.01 92.4904 127.302 93.0731 127.01L97.734 124.243L98.7536 125.991L93.51 129.195C92.9274 129.632 92.0535 129.195 91.6165 128.467L82.0033 111.28C81.5664 110.406 81.712 109.532 82.2946 109.095Z" fill="#1C0A76"/>
|
||||
<path d="M82.586 110.843L92.1992 128.03C92.6361 128.758 93.3644 129.05 94.0927 128.758C94.0927 128.758 94.0927 128.758 94.2383 128.758L101.958 124.097C102.541 123.66 102.832 122.786 102.395 122.058L92.7818 104.871C92.3448 104.143 91.4709 103.851 90.8883 104.143L83.0229 108.658C83.0229 108.658 83.0229 108.658 82.8773 108.658C82.2947 109.241 82.149 110.114 82.586 110.843Z" fill="#6A6AE8"/>
|
||||
<path d="M87.3925 107.638C87.8295 107.347 88.4121 107.493 88.7034 107.93C88.9947 108.367 88.8491 108.949 88.4121 109.241C87.9751 109.532 87.3925 109.386 87.1012 108.949C86.8099 108.512 86.9555 107.93 87.3925 107.638Z" fill="#1C0A76"/>
|
||||
<path d="M90.7426 124.68C91.1796 124.097 91.4709 122.932 90.8883 122.495C90.7426 122.495 90.7426 122.35 90.5969 122.35C90.8883 122.058 91.3252 121.767 91.4709 121.33C92.0535 120.456 92.3448 118.999 91.1796 118.708C90.5969 118.563 90.16 118.708 89.5774 118.854C90.0143 118.126 90.3056 117.252 89.8687 116.378C89.4317 114.921 88.2665 115.212 87.2469 115.795C87.8295 114.776 88.7034 113.319 87.2469 112.882C86.373 112.736 85.3534 113.028 84.6251 113.319C83.4599 113.61 82.4403 114.193 81.5664 114.776C81.5664 114.776 81.5664 114.776 81.4207 114.921C81.2751 114.921 81.1294 115.067 80.9838 115.212C80.4011 116.378 80.4011 118.126 82.0033 118.271C82.4403 118.271 82.8773 118.271 83.3142 118.271C82.4403 118.999 82.0033 119.728 82.586 120.747C83.1686 121.767 84.3338 121.767 85.499 121.476C85.3534 122.058 85.2077 122.786 85.6447 123.223C85.936 123.66 86.5186 123.66 87.1012 123.515C86.9556 123.66 86.9556 123.806 86.9556 123.806C87.2469 125.845 89.5774 126.282 90.7426 124.68Z" fill="#FFD2A7"/>
|
||||
<path d="M119.145 285.774C123.515 284.171 124.68 277.471 125.117 273.393L131.526 275.724C131.526 275.724 128.904 282.569 129.924 287.23C130.943 291.891 129.487 291.454 129.487 291.454H109.823C109.823 291.6 114.775 287.376 119.145 285.774Z" fill="#FFD2A7"/>
|
||||
<path d="M109.386 292.183H129.487C129.487 292.183 130.215 292.474 130.506 290.872C130.652 290.143 130.797 290.144 130.506 288.104C130.506 287.667 130.361 287.376 130.361 286.939C128.467 287.085 125.554 285.628 125.554 285.628C124.68 283.443 121.767 282.424 121.039 283.589C119.873 285.628 117.252 286.065 115.504 286.648C111.717 287.959 110.697 289.415 109.823 290.872C109.532 291.6 109.386 292.183 109.386 292.183Z" fill="#1C0A76"/>
|
||||
<path d="M109.386 292.183H129.487C129.487 292.183 130.215 292.474 130.506 290.872H109.969C109.532 291.6 109.386 292.183 109.386 292.183Z" fill="#1C0A76"/>
|
||||
<path d="M128.03 220.521C122.204 225.327 124.826 259.702 121.913 282.424C121.913 282.424 128.613 283.88 132.837 282.132C132.837 282.132 143.906 241.932 143.906 232.61C143.906 216.151 134.293 215.423 128.03 220.521Z" fill="#6A6AE8"/>
|
||||
<path d="M183.961 286.21C179.446 284.754 181.485 277.617 181.048 273.539L174.639 275.869C174.639 275.869 174.057 283.006 173.183 287.813C172.163 292.474 173.62 292.037 173.62 292.037L193.866 291.891C193.72 291.891 188.331 287.813 183.961 286.21Z" fill="#FFD2A7"/>
|
||||
<path d="M183.961 286.21C182.65 285.773 182.359 284.899 181.485 283.588C180.903 282.714 179.446 284.317 178.572 286.064C178.572 286.064 175.076 287.521 173.183 286.938C173.183 287.23 173.037 287.521 173.037 287.958C172.018 292.619 173.474 292.182 173.474 292.182L193.72 292.036C192.701 288.104 188.185 287.521 183.961 286.21Z" fill="#1C0A76"/>
|
||||
<path d="M172.746 290.871C172.892 292.328 173.474 292.036 173.474 292.036L193.72 291.891C193.72 291.891 193.574 291.454 193.283 290.726L172.746 290.871Z" fill="#1C0A76"/>
|
||||
<path d="M180.028 227.657C183.815 231.881 181.485 260.284 182.505 280.967C182.505 280.967 175.659 283.006 171.726 281.258C171.726 281.258 160.948 241.64 163.278 233.338C166.483 222.268 174.931 222.123 180.028 227.657Z" fill="#6A6AE8"/>
|
||||
<path d="M163.279 233.193C163.715 231.445 164.444 229.988 165.026 228.823C165.026 229.406 172.455 264.363 173.329 281.55C172.892 281.55 172.6 281.404 172.309 281.259C172.163 281.259 171.872 281.113 171.726 280.967C171.726 280.967 168.231 268.004 165.463 254.75C163.715 245.719 162.405 236.689 163.279 233.193Z" fill="#3B31A1"/>
|
||||
<path d="M128.03 220.521C128.758 219.938 129.632 219.355 130.361 218.918C129.632 222.123 126.573 235.086 126.719 244.408C127.01 254.749 124.971 279.511 124.097 282.715C122.786 282.569 121.767 282.278 121.767 282.278C124.826 259.556 122.204 225.327 128.03 220.521Z" fill="#3B31A1"/>
|
||||
<path d="M231.59 89.1405L229.405 92.3449L226.201 96.8602L226.055 97.0058C225.91 97.2971 225.618 97.2971 225.327 97.1515L224.745 96.7145L222.705 95.258L221.54 94.5297L220.812 94.0927L211.49 87.5383C211.199 87.3926 211.199 87.1013 211.344 86.81L216.879 78.9447C217.025 78.6534 217.316 78.6534 217.607 78.799L217.753 78.9447L218.481 79.3817L219.647 80.2556L222.56 82.2947L223.288 82.7317L224.453 83.46L224.599 83.6056L226.929 85.2078L231.736 88.5579C231.736 88.5579 231.736 88.8492 231.59 89.1405Z" fill="url(#paint21_linear_6230_1375)"/>
|
||||
<path d="M218.918 85.9362C217.899 87.3927 218.19 89.5775 219.792 90.5971C221.249 91.6167 223.434 91.3254 224.453 89.7232C225.473 88.2666 225.181 86.0818 223.579 85.0623C221.977 84.0427 219.938 84.4796 218.918 85.9362Z" fill="url(#paint22_linear_6230_1375)"/>
|
||||
<mask id="mask0_6230_1375" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="218" y="84" width="8" height="8">
|
||||
<path d="M218.918 85.9362C217.899 87.3927 218.19 89.5775 219.792 90.5971C221.249 91.6167 223.434 91.3254 224.453 89.7232C225.473 88.2666 225.181 86.0818 223.579 85.0623C221.977 84.0427 219.938 84.4796 218.918 85.9362Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_6230_1375)">
|
||||
<path d="M219.209 87.2467H219.355C219.355 87.2467 219.355 87.2467 219.501 87.3923C219.501 87.3923 219.501 87.3923 219.501 87.538V87.3923V87.2467C219.501 87.2467 219.355 87.101 219.355 87.2467C219.209 87.101 219.209 87.101 219.209 87.2467C219.209 87.101 219.209 87.101 219.209 87.2467Z" fill="#C8D3FB"/>
|
||||
<path d="M218.627 86.2272C218.627 86.3728 218.627 86.3728 218.627 86.2272C218.772 86.5185 218.627 86.5185 218.627 86.6641C218.627 86.8098 218.627 86.9554 218.627 87.1011C218.627 87.1011 218.772 87.2467 218.772 87.3924C218.772 87.538 218.627 87.3924 218.481 87.3924C218.336 87.3924 218.336 87.538 218.19 87.6837C218.19 87.975 218.044 88.2663 218.044 88.412C218.044 88.5576 218.044 88.5576 218.044 88.7033C218.044 88.8489 218.19 88.8489 218.19 88.9946C218.19 89.1402 217.899 89.2859 218.044 89.5772C218.044 89.7229 218.336 89.7228 218.481 89.7228C218.627 89.7228 218.772 89.7229 218.772 89.8685C218.918 90.0142 218.918 90.0142 218.918 90.1598C218.918 90.3055 219.064 90.3055 219.209 90.3055C219.209 90.3055 219.209 90.3055 219.355 90.3055C219.501 90.3055 219.646 90.3055 219.646 90.4511L219.792 90.5968H219.938C219.938 90.5968 219.938 90.5968 219.938 90.4511C220.083 90.3055 220.083 90.3055 220.229 90.3055V90.1598L220.083 90.0142C220.083 90.0142 220.083 90.0142 220.083 89.8685C220.083 89.7229 220.229 89.8685 220.229 89.7228C220.229 89.7228 220.229 89.7228 220.375 89.7228C220.375 89.7228 220.52 89.7229 220.52 89.5772C220.229 89.4315 219.792 89.2859 219.792 88.9946V88.8489C219.646 88.5576 219.646 88.7033 219.501 88.5576C219.355 88.412 219.355 88.412 219.355 88.2663C219.355 88.1207 219.355 87.975 219.355 87.8293C219.355 87.6837 219.355 87.3924 219.355 87.2467C219.209 87.1011 219.064 87.2467 219.064 86.9554V86.8098V86.6641C219.064 86.5185 219.064 86.5185 219.209 86.3728C219.355 86.2271 219.501 86.0815 219.501 85.9358C219.501 85.7902 219.501 85.6445 219.355 85.6445C219.355 85.6445 219.355 85.6445 219.209 85.6445C219.209 85.6445 219.209 85.6445 219.064 85.6445C219.064 85.6445 219.064 85.7902 218.918 85.7902C218.627 86.2272 218.627 86.0815 218.627 86.2272Z" fill="#C8D3FB"/>
|
||||
<path d="M220.521 90.597C220.666 90.597 220.666 90.4513 220.812 90.4513H220.957C220.957 90.4513 220.957 90.3057 220.812 90.3057H220.666C220.666 90.3057 220.666 90.3057 220.521 90.3057C220.521 90.3057 220.375 90.3057 220.229 90.3057C220.229 90.3057 220.229 90.3057 220.084 90.3057C220.084 90.3057 220.084 90.4513 219.938 90.4513H219.792C219.647 90.4513 219.647 90.597 219.647 90.597L219.792 90.7426C219.938 90.7426 219.938 90.7426 219.938 90.597C220.375 90.7426 220.375 90.597 220.521 90.597Z" fill="#C8D3FB"/>
|
||||
<path d="M221.54 90.3056C221.54 90.4513 221.686 90.4513 221.686 90.4513C221.686 90.5969 221.977 90.7426 221.831 90.8882C221.831 90.8882 221.831 90.8882 221.686 91.0339H221.54C221.394 91.0339 221.394 90.8882 221.249 90.8882C221.249 90.8882 221.249 90.8882 221.103 90.8882C221.103 90.8882 221.103 90.8882 220.957 90.8882H220.812V91.0339C220.812 91.0339 220.812 91.0339 220.957 91.0339H221.103C221.103 91.0339 221.249 90.8882 221.249 91.0339C221.249 91.0339 221.249 91.0339 221.394 91.0339C221.394 91.0339 221.54 91.0339 221.54 91.1796C221.54 91.1796 221.54 91.1796 221.54 91.3252L221.686 91.4709L221.54 91.6165V91.7622C221.54 91.9078 221.831 91.9078 221.831 91.9078C222.123 91.9078 222.414 91.7622 222.705 91.6165C222.851 91.4709 222.996 91.4709 223.142 91.4709C223.288 91.4709 223.433 91.3252 223.579 91.3252C223.725 91.1796 223.725 91.1796 223.725 91.0339C223.725 91.0339 223.725 91.0339 223.725 90.8882C223.725 90.7426 223.579 90.5969 223.579 90.5969C223.579 90.4513 223.433 90.4513 223.433 90.3056C223.433 90.16 223.579 90.0143 223.87 90.0143L224.016 89.8687C224.016 89.723 224.016 89.723 224.016 89.5774C224.016 89.4317 224.016 89.286 224.016 89.286C224.016 89.1404 224.162 89.1404 224.307 89.1404C224.453 89.1404 224.453 88.9947 224.453 88.8491C224.453 88.7034 224.453 88.5578 224.453 88.5578V88.4121C224.453 88.2665 224.453 88.1208 224.599 88.1208C224.744 87.9752 225.036 87.8295 224.89 87.5382C224.744 87.3925 224.599 87.3925 224.453 87.5382V87.6839L224.307 87.8295C224.162 87.8295 224.162 87.8295 224.016 87.9752C223.87 87.9752 223.725 88.1208 223.725 88.2665C223.725 88.4121 223.725 88.4121 223.579 88.5578C223.579 88.5578 223.433 88.5578 223.288 88.7034C223.142 88.7034 222.996 88.8491 222.996 88.9947C222.996 89.1404 223.142 89.286 223.142 89.286L223.288 89.4317L223.433 89.5774V89.723C223.433 89.8687 223.433 90.0143 223.579 90.16C223.579 90.16 223.579 90.3056 223.725 90.3056C223.87 90.4513 223.725 90.4513 223.725 90.4513C223.579 90.5969 223.579 90.5969 223.725 90.7426C223.725 90.8882 223.725 90.8882 223.725 91.0339C223.725 91.1796 223.725 91.1796 223.579 91.1796V91.0339C223.579 90.8882 223.579 90.8882 223.579 90.7426C223.579 90.5969 223.433 90.5969 223.433 90.5969C223.433 90.5969 223.433 90.5969 223.288 90.4513C223.142 90.4513 223.142 90.5969 222.996 90.5969C222.851 90.5969 222.705 90.5969 222.559 90.5969C222.414 90.5969 222.414 90.4513 222.268 90.4513H222.123C221.977 90.4513 221.831 90.5969 221.831 90.5969C221.54 90.16 221.54 90.16 221.54 90.3056Z" fill="#C8D3FB"/>
|
||||
<path d="M219.938 87.6836C219.792 87.8292 219.938 87.9749 219.938 88.1206C220.083 88.2662 220.229 88.4119 220.375 88.5575L220.52 88.7032L220.666 88.8488C220.666 88.8488 220.666 88.8488 220.666 88.9945C220.666 88.9945 220.666 89.1401 220.812 89.1401H220.957C220.957 89.1401 221.103 89.1401 221.103 89.2858C221.249 89.2858 221.249 89.2858 221.394 89.2858C221.54 89.4314 221.686 89.4314 221.831 89.2858C221.977 89.1401 221.977 88.9945 221.977 88.7032V88.5575C221.977 88.5575 221.977 88.4119 222.123 88.4119C222.123 88.4119 222.123 88.4119 222.123 88.2662V88.1206C221.977 87.9749 221.977 88.1206 221.831 87.9749H221.686C221.54 87.8292 221.54 87.6836 221.54 87.5379C221.54 87.3923 221.686 87.2466 221.686 87.101C221.686 86.9553 221.831 86.9553 221.977 86.9553V86.8097C221.977 86.664 222.123 86.664 222.123 86.5184C222.123 86.5184 222.268 86.5184 222.268 86.3727C222.268 86.227 221.977 86.2271 221.977 86.2271C221.831 86.2271 221.831 86.227 221.686 86.3727C221.54 86.5184 221.54 86.664 221.249 86.664C221.249 86.8097 221.103 86.8097 220.957 86.8097C220.812 86.8097 220.812 86.8097 220.666 86.9553L220.52 87.101C220.52 87.2466 220.52 87.3923 220.375 87.3923C220.229 87.6836 219.938 87.5379 219.938 87.6836Z" fill="#C8D3FB"/>
|
||||
<path d="M220.666 86.5188C220.666 86.6644 220.666 86.6644 220.666 86.5188C220.666 86.6644 220.666 86.6644 220.666 86.6644C220.812 86.6644 220.812 86.6644 220.812 86.5188V86.3731H220.957C221.103 86.3731 221.103 86.0818 220.957 86.0818H220.812C220.812 86.0818 220.812 86.0818 220.666 86.2274C220.666 86.2274 220.666 86.2274 220.521 86.2274C220.812 86.3731 220.666 86.5188 220.666 86.5188Z" fill="#C8D3FB"/>
|
||||
<path d="M219.646 84.771C219.501 84.9167 219.501 85.208 219.646 85.3536V85.4993C219.792 85.4993 219.938 85.4993 220.083 85.4993C220.229 85.4993 220.666 85.6449 220.52 85.3536C220.52 85.0623 220.666 85.208 220.812 85.208C220.957 85.208 220.812 85.0623 220.812 85.0623C220.812 84.9167 220.812 84.9167 220.957 84.771C221.103 84.771 221.249 84.771 221.394 84.771C221.54 84.771 221.54 84.771 221.686 84.6254C221.394 84.4797 221.103 84.4797 220.812 84.6254C220.666 84.6254 220.52 84.6254 220.375 84.771C220.083 84.6254 219.938 84.771 219.646 84.771Z" fill="#C8D3FB"/>
|
||||
<path d="M222.414 84.6249C222.56 84.6249 222.56 84.7706 222.705 84.7706H222.851C222.997 84.7706 222.997 84.9163 222.997 85.0619C222.997 85.2076 223.142 85.3532 223.288 85.4989C223.434 85.4989 223.579 85.4989 223.725 85.6445C223.87 85.7902 223.87 85.7902 224.016 85.9358C224.016 86.0815 224.162 86.2271 224.307 86.0815C224.307 86.0815 224.307 86.0815 224.307 85.9358C224.307 85.9358 224.307 85.9358 224.453 85.7902C224.453 85.7902 224.453 85.7902 224.599 85.6445C224.599 85.4989 224.599 85.4989 224.599 85.3532C224.89 85.2076 223.87 84.6249 223.725 84.6249C223.434 84.4793 223.142 84.3336 222.851 84.3336C222.705 84.3336 222.414 84.188 222.414 84.188C222.123 84.4793 222.268 84.6249 222.414 84.6249Z" fill="#C8D3FB"/>
|
||||
</g>
|
||||
<path d="M213.384 86.3733L218.045 89.5777L217.753 90.0146L213.092 86.8103L213.384 86.3733Z" fill="url(#paint23_linear_6230_1375)"/>
|
||||
<path d="M213.966 85.4993L218.627 88.7037L218.336 89.1406L213.675 85.7906L213.966 85.4993Z" fill="url(#paint24_linear_6230_1375)"/>
|
||||
<path opacity="0.34" d="M226.347 84.771L225.036 94.5298L224.744 96.7146L222.705 95.2581L223.288 90.8885L223.434 90.1602L224.016 85.4993L224.308 83.3145V83.4601L226.347 84.771Z" fill="white"/>
|
||||
<path opacity="0.34" d="M223.142 82.5861L222.851 84.7709L222.56 87.684L221.977 91.1797L221.686 94.5298L220.957 94.0928L221.394 91.1797L221.977 86.3731L222.123 84.6253L222.56 82.1492L223.142 82.5861Z" fill="white"/>
|
||||
<path opacity="0.34" d="M217.899 78.9448L218.481 79.3818L217.025 91.3254L216.297 90.7428L217.899 78.9448Z" fill="white"/>
|
||||
<path d="M218.19 80.4013L220.666 82.1492C220.812 82.2948 220.812 82.4405 220.812 82.5862L219.792 84.0427C219.647 84.1883 219.501 84.1883 219.355 84.1883L216.879 82.4405C216.734 82.2948 216.734 82.1492 216.734 82.0035L217.753 80.547C217.899 80.2557 218.045 80.2557 218.19 80.4013Z" fill="url(#paint25_linear_6230_1375)"/>
|
||||
<path d="M213.238 92.0532C213.238 92.0532 212.218 85.9357 215.423 85.3531C218.481 84.7705 216.734 87.2466 216.297 87.9749C214.986 89.8684 217.17 92.0532 217.17 92.0532H213.238Z" fill="#FFD2A7"/>
|
||||
<path d="M107.93 124.971C108.075 124.971 108.075 124.971 108.221 124.971C107.93 125.7 107.784 126.428 107.638 127.156C107.493 127.739 107.347 128.467 107.201 129.05C107.056 129.632 107.056 130.069 106.91 130.652C106.91 130.652 106.91 130.652 106.91 130.798C106.765 131.38 106.765 131.963 106.619 132.4C106.473 132.982 106.473 133.419 106.473 133.711C106.473 133.856 106.473 134.002 106.473 134.002C106.473 134.148 106.328 134.293 106.036 134.293C105.891 134.293 105.745 134.148 105.745 134.002C105.745 133.856 105.745 133.565 105.891 132.982C105.891 132.545 106.036 131.817 106.182 131.089C106.182 130.943 106.182 130.943 106.182 130.798C106.328 130.361 106.328 129.778 106.473 129.341C106.619 128.613 106.765 127.885 106.91 127.156C107.056 126.428 107.201 125.7 107.493 124.971H107.93Z" fill="#1C0A76"/>
|
||||
<path d="M124.243 131.38L123.515 131.525C123.515 131.089 123.515 130.652 123.515 130.215C123.515 130.069 123.515 129.778 123.515 129.486C123.515 129.049 123.515 128.612 123.369 128.175C123.369 127.738 123.223 127.302 123.223 126.865C123.223 126.428 123.078 125.845 123.078 125.408C122.932 124.097 122.641 122.786 122.204 121.475V121.33C121.476 118.999 120.602 116.814 119.145 115.504C118.854 115.212 118.563 114.921 118.126 114.775C117.689 114.484 117.252 114.338 116.669 114.338H116.523C116.232 114.338 116.086 114.338 115.795 114.484C115.504 114.484 115.358 114.63 115.067 114.775C115.067 114.775 115.067 114.775 114.921 114.775C114.63 114.63 114.339 114.484 114.047 114.338C114.339 114.193 114.484 114.047 114.776 113.901H114.921C114.921 113.901 115.067 113.901 115.067 113.756C115.358 113.61 115.795 113.464 116.086 113.464C116.086 113.464 116.232 113.464 116.378 113.464H116.523C116.96 113.464 117.397 113.61 117.689 113.756C117.834 113.756 117.98 113.901 118.271 114.047C121.476 115.795 122.932 120.747 123.66 125.408C123.66 125.845 123.806 126.428 123.806 126.865C123.806 127.302 123.952 127.884 123.952 128.321C123.952 128.758 123.952 129.049 124.097 129.486C124.243 130.215 124.243 130.797 124.243 131.38Z" fill="#1C0A76"/>
|
||||
<path d="M141.867 130.797L141.576 177.989L142.45 183.378L124.097 182.65L131.963 129.049L136.332 130.36L141.867 130.797Z" fill="url(#paint26_linear_6230_1375)"/>
|
||||
<path d="M131.963 129.049L128.176 175.513L124.097 182.65L83.4599 181.048L87.2469 172.163L92.1992 131.525L131.963 129.049Z" fill="url(#paint27_linear_6230_1375)"/>
|
||||
<path d="M136.769 130.36L134.439 181.485L124.097 182.65L128.176 175.513L131.963 129.049L136.769 130.36Z" fill="#1C0A76"/>
|
||||
<path d="M103.123 133.856C103.123 134.584 102.541 135.021 101.958 135.021C101.375 135.021 100.793 134.439 100.793 133.856C100.793 133.128 101.375 132.691 101.958 132.691C102.686 132.691 103.123 133.274 103.123 133.856Z" fill="#1C0A76"/>
|
||||
<path d="M122.787 133.565C122.787 134.439 122.058 135.021 121.33 135.021C120.602 135.021 119.874 134.293 120.019 133.565C120.019 132.691 120.747 132.108 121.476 132.108C122.204 132.108 122.932 132.836 122.787 133.565Z" fill="#1C0A76"/>
|
||||
<path d="M103.706 124.534C103.997 124.534 104.143 124.534 104.434 124.534C103.997 126.282 103.56 128.03 103.269 129.486C103.123 129.923 103.123 130.36 102.978 130.797C102.832 131.526 102.686 132.254 102.541 132.691C102.395 133.419 102.249 133.856 102.249 133.856C102.249 134.002 102.104 134.147 101.812 134.147C101.667 134.147 101.521 134.002 101.521 133.856C101.521 133.71 101.521 133.273 101.667 132.545C101.812 132.108 101.812 131.38 101.958 130.797C101.958 130.36 102.104 129.923 102.249 129.486C102.832 128.176 103.269 126.428 103.706 124.534Z" fill="#1C0A76"/>
|
||||
<path d="M121.767 133.419C121.767 133.565 121.621 133.71 121.476 133.71C121.33 133.71 121.184 133.565 121.184 133.419C121.184 133.419 121.184 132.982 121.184 132.254C121.184 131.671 121.039 130.797 121.039 129.778C121.039 129.05 120.893 128.321 120.747 127.447C120.747 126.865 120.602 126.282 120.456 125.7C119.728 121.621 118.271 117.106 115.65 115.358L115.504 115.212C115.358 115.067 115.213 115.067 115.067 114.921C114.776 114.775 114.484 114.63 114.193 114.484C114.047 114.484 113.902 114.338 113.756 114.338C113.465 114.193 113.173 114.047 112.736 114.047C112.445 113.902 112.008 113.901 111.717 113.901C110.989 113.901 110.26 114.047 109.678 114.484C109.241 114.775 108.949 115.067 108.658 115.504C108.221 115.649 107.784 115.649 107.347 115.795C107.93 115.067 108.512 114.484 109.386 113.901C110.406 113.173 111.571 113.028 112.882 113.319C113.319 113.465 113.756 113.61 114.193 113.756C114.339 113.902 114.63 113.902 114.776 114.047C114.921 114.193 115.213 114.193 115.358 114.338C115.504 114.338 115.504 114.484 115.65 114.484C115.795 114.484 115.795 114.63 115.941 114.63C118.708 116.669 120.165 121.33 120.893 125.408C121.039 125.991 121.039 126.573 121.184 127.01C121.33 127.884 121.476 128.758 121.476 129.487C121.621 130.506 121.621 131.38 121.621 131.963C121.767 132.837 121.767 133.274 121.767 133.419Z" fill="#1C0A76"/>
|
||||
<path d="M110.552 125.117C110.697 125.117 110.989 125.117 111.134 125.117C110.989 126.428 110.843 127.593 110.697 128.467C110.697 129.195 110.552 129.778 110.552 130.215C110.552 130.943 110.552 131.38 110.552 131.38C110.552 131.525 110.406 131.671 110.26 131.671C110.115 131.671 109.969 131.525 109.969 131.38C109.969 131.234 109.969 130.797 109.969 130.215C109.969 129.778 109.969 129.195 110.115 128.467C110.26 127.593 110.406 126.428 110.552 125.117Z" fill="#1C0A76"/>
|
||||
<path d="M125.991 128.03L125.263 128.175C125.263 127.739 125.117 127.302 125.117 126.719C125.117 126.282 124.971 125.845 124.826 125.262C123.952 121.038 122.35 115.504 119.145 114.047C118.708 113.901 118.271 113.756 117.834 113.756C117.543 113.756 117.397 113.901 117.106 113.901C116.815 114.047 116.669 114.047 116.523 114.193C116.378 114.338 116.232 114.484 116.086 114.484C115.941 114.63 115.795 114.775 115.65 114.921L115.504 114.775C115.358 114.63 115.213 114.63 115.067 114.484C115.067 114.484 115.067 114.484 114.921 114.484C115.067 114.338 115.213 114.193 115.358 114.047C115.504 113.901 115.65 113.901 115.65 113.756C115.795 113.61 116.087 113.464 116.232 113.319C116.232 113.319 116.232 113.319 116.378 113.319C117.106 112.882 117.834 112.736 118.708 112.882C119 112.882 119.145 113.027 119.437 113.173C122.932 114.775 124.68 120.456 125.408 124.825C125.554 125.408 125.554 125.845 125.7 126.428C125.845 127.156 125.845 127.593 125.991 128.03Z" fill="#1C0A76"/>
|
||||
<path d="M147.256 125.845H142.45L138.371 125.117L134.876 154.393L150.898 153.665L149.732 148.858L147.256 125.845Z" fill="#C8D3FB"/>
|
||||
<path d="M90.0144 148.713L87.3926 157.889L134.876 154.393L137.789 147.839L138.372 125.117L92.0535 130.943L90.0144 148.713Z" fill="#C8D3FB"/>
|
||||
<path d="M137.789 147.839L134.876 154.393L143.761 152.645L142.741 125.845L138.371 125.117L137.789 147.839Z" fill="#6A6AE8"/>
|
||||
<path d="M106.765 130.652C106.182 130.652 105.891 131.38 105.891 132.254C105.891 133.128 106.473 133.71 106.91 133.565C107.493 133.565 107.784 132.836 107.784 131.963C107.784 131.234 107.202 130.652 106.765 130.652Z" fill="#1C0A76"/>
|
||||
<path d="M123.515 128.176C122.787 128.176 122.35 129.195 122.35 130.215C122.35 131.235 122.932 131.963 123.66 131.963C124.389 131.963 124.826 131.089 124.826 130.069C124.826 128.904 124.243 128.176 123.515 128.176Z" fill="#1C0A76"/>
|
||||
<path d="M107.93 124.971C107.784 125.554 108.075 124.243 107.93 124.971C107.784 125.699 107.784 126.573 107.638 127.156C107.493 127.884 107.493 128.467 107.347 129.049C107.347 129.632 107.201 130.215 107.201 130.652C107.201 130.797 107.201 130.797 107.201 130.943C107.201 131.671 107.056 132.108 107.056 132.108C107.056 132.254 106.91 132.399 106.765 132.399H106.619C106.473 132.399 106.473 132.254 106.473 132.108C106.473 131.963 106.473 131.526 106.619 130.797C106.619 130.797 106.619 130.797 106.619 130.652C106.619 130.215 106.765 129.778 106.765 129.049C106.765 128.467 106.91 127.739 107.056 127.01C107.201 126.282 107.201 125.554 107.347 124.825L107.93 124.971Z" fill="#1C0A76"/>
|
||||
<path d="M123.952 130.069C123.952 130.215 123.806 130.36 123.661 130.36C123.515 130.36 123.515 130.36 123.515 130.36L123.369 130.215C123.369 130.215 123.369 130.069 123.369 129.778C123.369 129.487 123.224 129.05 123.224 128.613C123.224 128.176 123.078 127.739 122.932 127.302C122.787 126.865 122.787 126.282 122.641 125.845C121.767 121.912 120.019 116.378 116.96 114.775C116.815 114.775 116.815 114.63 116.669 114.63C116.669 114.63 116.669 114.63 116.523 114.63C116.232 114.484 116.086 114.338 115.795 114.338C115.65 114.338 115.504 114.193 115.213 114.193C115.213 114.193 115.213 114.193 115.067 114.193C114.776 114.047 114.339 114.047 114.047 114.047C113.465 114.047 113.028 114.047 112.591 114.193C112.299 114.338 112.008 114.484 111.717 114.63C111.571 114.775 111.571 114.775 111.426 114.921C111.134 115.067 110.697 115.067 110.26 115.212C110.552 114.775 110.989 114.484 111.28 114.193C111.28 114.193 111.426 114.193 111.426 114.047C111.717 113.756 112.154 113.61 112.591 113.465C113.61 113.173 114.776 113.319 116.086 113.756H116.232C116.523 113.902 116.669 114.047 116.96 114.047C117.689 114.338 118.271 114.921 118.854 115.649C120.165 117.106 121.184 119.291 121.913 121.476V121.621C122.35 122.932 122.641 124.243 122.932 125.408C123.078 125.991 123.078 126.428 123.224 126.865C123.369 127.302 123.369 127.739 123.515 128.176C123.661 128.758 123.661 129.195 123.661 129.487C123.806 129.778 123.952 129.923 123.952 130.069Z" fill="#1C0A76"/>
|
||||
<path d="M167.065 0H213.966C217.753 0 220.666 3.05874 220.666 6.7001V32.4809C220.666 36.2679 217.607 39.181 213.966 39.181H184.689L174.494 51.4159C173.765 52.4355 172.163 51.8529 172.163 50.6877L175.222 39.181H167.065C163.278 39.181 160.365 36.1223 160.365 32.4809V6.7001C160.22 3.05874 163.278 0 167.065 0Z" fill="url(#paint28_linear_6230_1375)"/>
|
||||
<path d="M167.794 7.28271V9.17622H194.885V7.28271H167.794Z" fill="white"/>
|
||||
<path d="M167.794 12.9631V14.8566H216.734V12.9631H167.794Z" fill="white"/>
|
||||
<path d="M167.794 18.6436V20.5371H213.238V18.6436H167.794Z" fill="white"/>
|
||||
<path d="M197.653 9.17622H205.955L206.101 7.28271H197.653V9.17622Z" fill="white"/>
|
||||
<path d="M167.794 24.033V25.9265H194.885V24.033H167.794Z" fill="white"/>
|
||||
<path d="M167.794 29.7134V31.6069H216.734V29.7134H167.794Z" fill="white"/>
|
||||
<path d="M197.653 25.9265H205.955L206.101 24.033H197.653V25.9265Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_6230_1375" x1="-66.078" y1="263.314" x2="380.863" y2="72.3614" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_6230_1375" x1="-123.624" y1="128.619" x2="323.31" y2="-62.3312" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_6230_1375" x1="10.3776" y1="212.893" x2="47.6905" y2="212.893" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#6A6AE8"/>
|
||||
<stop offset="1" stop-color="#312890"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_6230_1375" x1="40.993" y1="195.956" x2="77.8305" y2="195.956" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#6A6AE8"/>
|
||||
<stop offset="1" stop-color="#312890"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_6230_1375" x1="51.471" y1="263.69" x2="71.1486" y2="263.69" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_6230_1375" x1="64.7706" y1="263.648" x2="114.909" y2="263.648" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear_6230_1375" x1="199.077" y1="266.818" x2="273.066" y2="266.818" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint7_linear_6230_1375" x1="280.82" y1="251.174" x2="287.366" y2="251.174" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint8_linear_6230_1375" x1="207.168" y1="250.392" x2="217.15" y2="250.392" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint9_linear_6230_1375" x1="207.183" y1="256.005" x2="217.167" y2="256.005" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint10_linear_6230_1375" x1="272.892" y1="209.73" x2="277.941" y2="209.73" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint11_linear_6230_1375" x1="216.086" y1="209.127" x2="223.785" y2="209.127" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint12_linear_6230_1375" x1="216.097" y1="213.456" x2="223.798" y2="213.456" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint13_linear_6230_1375" x1="219.659" y1="188.271" x2="260.195" y2="188.271" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint14_linear_6230_1375" x1="264.442" y1="179.7" x2="268.028" y2="179.7" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint15_linear_6230_1375" x1="224.091" y1="179.272" x2="229.56" y2="179.272" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint16_linear_6230_1375" x1="224.1" y1="182.346" x2="229.57" y2="182.346" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint17_linear_6230_1375" x1="153.431" y1="167.35" x2="155.616" y2="76.3157" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint18_linear_6230_1375" x1="160.046" y1="93.1355" x2="143.142" y2="93.1355" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint19_linear_6230_1375" x1="173.713" y1="67.8287" x2="120.759" y2="74.6629" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="1.09e-06" stop-color="#FFD000"/>
|
||||
<stop offset="1" stop-color="#FF7400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint20_linear_6230_1375" x1="127.381" y1="166.725" x2="129.566" y2="75.691" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint21_linear_6230_1375" x1="214.273" y1="82.8675" x2="228.855" y2="93.0759" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFAE00"/>
|
||||
<stop offset="1" stop-color="#FF7800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint22_linear_6230_1375" x1="218.247" y1="87.8898" x2="224.995" y2="87.8898" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#6A6AE8"/>
|
||||
<stop offset="1" stop-color="#312890"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint23_linear_6230_1375" x1="213.19" y1="86.5823" x2="217.842" y2="89.8388" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint24_linear_6230_1375" x1="213.856" y1="85.6297" x2="218.507" y2="88.8863" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint25_linear_6230_1375" x1="217.289" y1="81.169" x2="220.347" y2="83.3099" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="#D3DBEB"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint26_linear_6230_1375" x1="124.103" y1="156.211" x2="142.397" y2="156.211" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#6A6AE8"/>
|
||||
<stop offset="1" stop-color="#312890"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint27_linear_6230_1375" x1="83.4197" y1="155.854" x2="131.904" y2="155.854" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#6A6AE8"/>
|
||||
<stop offset="1" stop-color="#312890"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint28_linear_6230_1375" x1="160.259" y1="25.9927" x2="220.673" y2="25.9927" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#312890"/>
|
||||
<stop offset="1" stop-color="#6A6AE8"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_6230_1375">
|
||||
<rect width="305" height="294.076" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 76 KiB |
|
|
@ -1,10 +1,8 @@
|
|||
// lib/core/config/app_colors.dart
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppColors {
|
||||
AppColors._();
|
||||
|
||||
// رنگهای اصلی
|
||||
static const Color primary = Color.fromARGB(255, 23, 107, 173);
|
||||
static const Color unselected = Color.fromARGB(255, 186, 222, 251);
|
||||
static const Color border = Color.fromARGB(255, 14, 63, 102);
|
||||
|
|
@ -13,8 +11,7 @@ class AppColors {
|
|||
static const Color confirm = Color.fromARGB(255, 69, 159, 73);
|
||||
static const Color unselectedBorder = Color.fromARGB(255, 233, 245, 254);
|
||||
static const Color hint = Color.fromARGB(255, 112, 112, 110);
|
||||
|
||||
// رنگهای دیگر
|
||||
static const Color grey = Color(0xFFBDBDBD);
|
||||
static const Color white = Color(0xFFFFFFFF);
|
||||
static const Color selectedImg = Color.fromARGB(255, 76, 175, 80);
|
||||
static const Color singleOfferType = Color.fromARGB(255, 244, 67, 54);
|
||||
static const Color countdown = Color.fromARGB(255, 54, 124, 57);
|
||||
}
|
||||
|
|
@ -66,9 +66,15 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/Vector.svg
|
||||
SvgGenImage get vector => const SvgGenImage('assets/icons/Vector.svg');
|
||||
|
||||
/// File path: assets/icons/addImg.svg
|
||||
SvgGenImage get addImg => const SvgGenImage('assets/icons/addImg.svg');
|
||||
|
||||
/// File path: assets/icons/arayesh.svg
|
||||
SvgGenImage get arayesh => const SvgGenImage('assets/icons/arayesh.svg');
|
||||
|
||||
/// File path: assets/icons/back.svg
|
||||
SvgGenImage get back => const SvgGenImage('assets/icons/back.svg');
|
||||
|
||||
/// File path: assets/icons/backArrow.svg
|
||||
SvgGenImage get backArrow => const SvgGenImage('assets/icons/backArrow.svg');
|
||||
|
||||
|
|
@ -78,6 +84,10 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/clock.svg
|
||||
SvgGenImage get clock => const SvgGenImage('assets/icons/clock.svg');
|
||||
|
||||
/// File path: assets/icons/clockProduct.svg
|
||||
SvgGenImage get clockProduct =>
|
||||
const SvgGenImage('assets/icons/clockProduct.svg');
|
||||
|
||||
/// File path: assets/icons/coffeeshop.svg
|
||||
SvgGenImage get coffeeshop =>
|
||||
const SvgGenImage('assets/icons/coffeeshop.svg');
|
||||
|
|
@ -85,6 +95,9 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/digital.svg
|
||||
SvgGenImage get digital => const SvgGenImage('assets/icons/digital.svg');
|
||||
|
||||
/// File path: assets/icons/edit.svg
|
||||
SvgGenImage get edit => const SvgGenImage('assets/icons/edit.svg');
|
||||
|
||||
/// File path: assets/icons/error.svg
|
||||
SvgGenImage get error => const SvgGenImage('assets/icons/error.svg');
|
||||
|
||||
|
|
@ -98,9 +111,15 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/kafsh.svg
|
||||
SvgGenImage get kafsh => const SvgGenImage('assets/icons/kafsh.svg');
|
||||
|
||||
/// File path: assets/icons/location.svg
|
||||
SvgGenImage get location => const SvgGenImage('assets/icons/location.svg');
|
||||
|
||||
/// File path: assets/icons/logo.svg
|
||||
SvgGenImage get logo => const SvgGenImage('assets/icons/logo.svg');
|
||||
|
||||
/// File path: assets/icons/map.svg
|
||||
SvgGenImage get map => const SvgGenImage('assets/icons/map.svg');
|
||||
|
||||
/// File path: assets/icons/notification.svg
|
||||
SvgGenImage get notification =>
|
||||
const SvgGenImage('assets/icons/notification.svg');
|
||||
|
|
@ -111,10 +130,23 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/resturan.svg
|
||||
SvgGenImage get resturan => const SvgGenImage('assets/icons/resturan.svg');
|
||||
|
||||
/// File path: assets/icons/routing.svg
|
||||
SvgGenImage get routing => const SvgGenImage('assets/icons/routing.svg');
|
||||
|
||||
/// File path: assets/icons/scan-barcode.svg
|
||||
SvgGenImage get scanBarcode =>
|
||||
const SvgGenImage('assets/icons/scan-barcode.svg');
|
||||
|
||||
/// File path: assets/icons/shop.svg
|
||||
SvgGenImage get shop => const SvgGenImage('assets/icons/shop.svg');
|
||||
|
||||
/// File path: assets/icons/shopping-cart.svg
|
||||
SvgGenImage get shoppingCart =>
|
||||
const SvgGenImage('assets/icons/shopping-cart.svg');
|
||||
|
||||
/// File path: assets/icons/star.svg
|
||||
SvgGenImage get star => const SvgGenImage('assets/icons/star.svg');
|
||||
|
||||
/// File path: assets/icons/tala.svg
|
||||
SvgGenImage get tala => const SvgGenImage('assets/icons/tala.svg');
|
||||
|
||||
|
|
@ -128,6 +160,14 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/tickPb.svg
|
||||
SvgGenImage get tickPb => const SvgGenImage('assets/icons/tickPb.svg');
|
||||
|
||||
/// File path: assets/icons/timer-pause.svg
|
||||
SvgGenImage get timerPause =>
|
||||
const SvgGenImage('assets/icons/timer-pause.svg');
|
||||
|
||||
/// File path: assets/icons/volume-high.svg
|
||||
SvgGenImage get volumeHigh =>
|
||||
const SvgGenImage('assets/icons/volume-high.svg');
|
||||
|
||||
/// List of all assets
|
||||
List<SvgGenImage> get values => [
|
||||
arrowRight2,
|
||||
|
|
@ -146,31 +186,47 @@ class $AssetsIconsGen {
|
|||
tria,
|
||||
tshirt,
|
||||
vector,
|
||||
addImg,
|
||||
arayesh,
|
||||
back,
|
||||
backArrow,
|
||||
cinama,
|
||||
clock,
|
||||
clockProduct,
|
||||
coffeeshop,
|
||||
digital,
|
||||
edit,
|
||||
error,
|
||||
fastfood,
|
||||
globalSearch,
|
||||
kafsh,
|
||||
location,
|
||||
logo,
|
||||
map,
|
||||
notification,
|
||||
pooshak,
|
||||
resturan,
|
||||
routing,
|
||||
scanBarcode,
|
||||
shop,
|
||||
shoppingCart,
|
||||
star,
|
||||
tala,
|
||||
teria,
|
||||
tickCircle,
|
||||
tickPb,
|
||||
timerPause,
|
||||
volumeHigh,
|
||||
];
|
||||
}
|
||||
|
||||
class $AssetsImagesGen {
|
||||
const $AssetsImagesGen();
|
||||
|
||||
/// File path: assets/images/empty home.svg
|
||||
SvgGenImage get emptyHome =>
|
||||
const SvgGenImage('assets/images/empty home.svg');
|
||||
|
||||
/// File path: assets/images/onboarding1.png
|
||||
AssetGenImage get onboarding1 =>
|
||||
const AssetGenImage('assets/images/onboarding1.png');
|
||||
|
|
@ -192,7 +248,8 @@ class $AssetsImagesGen {
|
|||
const AssetGenImage('assets/images/userinfo.png');
|
||||
|
||||
/// List of all assets
|
||||
List<AssetGenImage> get values => [
|
||||
List<dynamic> get values => [
|
||||
emptyHome,
|
||||
onboarding1,
|
||||
onboarding2,
|
||||
onboarding3,
|
||||
|
|
|
|||
|
|
@ -1,57 +1,240 @@
|
|||
|
||||
// تعریف یک قرارداد که هم منبع داده واقعی و هم ساختگی از آن پیروی کنند
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
import 'package:proxibuy/data/models/working_hours.dart';
|
||||
|
||||
abstract class OfferDataSource {
|
||||
Future<List<OfferModel>> getNearbyOffers();
|
||||
Future<OfferModel?> getOfferById(String id); // <<<<<<< جدید
|
||||
}
|
||||
|
||||
|
||||
// پیادهسازی منبع داده ساختگی
|
||||
class MockOfferDataSource implements OfferDataSource {
|
||||
final List<OfferModel> _mockOffers = [
|
||||
OfferModel(
|
||||
id: '1',
|
||||
storeName: 'روچیک (Ruchik)',
|
||||
title: 'چیزبرگر',
|
||||
discount: '۲۰٪',
|
||||
imageUrls: [
|
||||
'https://picsum.photos/seed/food/400/200',
|
||||
'https://picsum.photos/seed/burger1/400/400',
|
||||
'https://picsum.photos/seed/burger2/400/400',
|
||||
],
|
||||
category: 'فستفود',
|
||||
distanceInMeters: 130,
|
||||
expiryTime: DateTime.now().add(const Duration(hours: 2, minutes: 30, seconds: 10)),
|
||||
rating: 4.8,
|
||||
workingHours: [
|
||||
WorkingHours(
|
||||
day: 'شنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'یکشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'دوشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'سهشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'چهارشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'پنجشنبه',
|
||||
shifts: [
|
||||
Shift(openAt: '۱۰ صبح', closeAt: '۱ ظهر'),
|
||||
Shift(openAt: '۵ عصر', closeAt: '۱۱ شب'),
|
||||
],
|
||||
),
|
||||
WorkingHours(day: 'جمعه', shifts: []),
|
||||
],
|
||||
discountType: 'رفیقبازی',
|
||||
isOpen: false,
|
||||
address: 'چهارباغ پایین ',
|
||||
ratingCount: 340,
|
||||
latitude: 32.660,
|
||||
longitude: 51.670,
|
||||
originalPrice: 150000,
|
||||
finalPrice: 120000,
|
||||
),
|
||||
OfferModel(
|
||||
id: '2',
|
||||
storeName: 'کاخ سرهنگ',
|
||||
title: 'عصرانه',
|
||||
discount: '۲۰% ',
|
||||
imageUrls: [
|
||||
'https://picsum.photos/seed/food/400/200',
|
||||
'https://picsum.photos/seed/burger1/400/400',
|
||||
'https://picsum.photos/seed/burger2/400/400',
|
||||
],
|
||||
category: 'رستوران',
|
||||
distanceInMeters: 130,
|
||||
expiryTime: DateTime.now().add(const Duration(hours: 5)),
|
||||
rating: 4.8,
|
||||
workingHours: [
|
||||
WorkingHours(
|
||||
day: 'شنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'یکشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'دوشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'سهشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'چهارشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'پنجشنبه',
|
||||
shifts: [
|
||||
Shift(openAt: '۱۰ صبح', closeAt: '۱ ظهر'),
|
||||
Shift(openAt: '۵ عصر', closeAt: '۱۱ شب'),
|
||||
],
|
||||
),
|
||||
WorkingHours(day: 'جمعه', shifts: []), // تعطیل
|
||||
],
|
||||
discountType: 'رفیقبازی',
|
||||
isOpen: true,
|
||||
address: 'چهارباغ پایین ',
|
||||
ratingCount: 340,
|
||||
latitude: 32.660,
|
||||
longitude: 51.670,
|
||||
originalPrice: 150000,
|
||||
finalPrice: 120000,
|
||||
),
|
||||
OfferModel(
|
||||
id: '3',
|
||||
storeName: 'روچیک (Ruchik)',
|
||||
title: 'چیزبرگر',
|
||||
discount: '۲۰٪',
|
||||
imageUrls: [
|
||||
'https://picsum.photos/seed/food/400/200',
|
||||
'https://picsum.photos/seed/burger1/400/400',
|
||||
'https://picsum.photos/seed/burger2/400/400',
|
||||
],
|
||||
category: 'فستفود',
|
||||
distanceInMeters: 130,
|
||||
expiryTime: DateTime.now().add(const Duration(hours: 5)),
|
||||
rating: 4.8,
|
||||
workingHours: [
|
||||
WorkingHours(
|
||||
day: 'شنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'یکشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'دوشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'سهشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'چهارشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'پنجشنبه',
|
||||
shifts: [
|
||||
Shift(openAt: '۱۰ صبح', closeAt: '۱ ظهر'),
|
||||
Shift(openAt: '۵ عصر', closeAt: '۱۱ شب'),
|
||||
],
|
||||
),
|
||||
WorkingHours(day: 'جمعه', shifts: []), // تعطیل
|
||||
],
|
||||
discountType: 'رفیقبازی',
|
||||
isOpen: true,
|
||||
address: 'چهارباغ پایین ',
|
||||
ratingCount: 340,
|
||||
latitude: 32.660,
|
||||
longitude: 51.670,
|
||||
originalPrice: 150000,
|
||||
finalPrice: 120000,
|
||||
),
|
||||
OfferModel(
|
||||
id: '4',
|
||||
storeName: 'روچیک (Ruchik)',
|
||||
title: 'چیزبرگر',
|
||||
discount: '۲۰٪',
|
||||
imageUrls: [
|
||||
'https://picsum.photos/seed/food/400/200',
|
||||
'https://picsum.photos/seed/burger1/400/400',
|
||||
'https://picsum.photos/seed/burger2/400/400',
|
||||
],
|
||||
category: 'فستفود',
|
||||
distanceInMeters: 130,
|
||||
expiryTime: DateTime.now().add(const Duration(hours: 5)),
|
||||
rating: 4.8,
|
||||
workingHours: [
|
||||
WorkingHours(
|
||||
day: 'شنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'یکشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'دوشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'سهشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'چهارشنبه',
|
||||
shifts: [Shift(openAt: '۱۰ صبح', closeAt: '۱۰ شب')],
|
||||
),
|
||||
WorkingHours(
|
||||
day: 'پنجشنبه',
|
||||
shifts: [
|
||||
Shift(openAt: '۱۰ صبح', closeAt: '۱ ظهر'),
|
||||
Shift(openAt: '۵ عصر', closeAt: '۱۱ شب'),
|
||||
],
|
||||
),
|
||||
WorkingHours(day: 'جمعه', shifts: []),
|
||||
],
|
||||
discountType: 'رفیقبازی',
|
||||
isOpen: false,
|
||||
address: 'چهارباغ پایین ',
|
||||
ratingCount: 340,
|
||||
latitude: 32.660,
|
||||
longitude: 51.670,
|
||||
originalPrice: 150000,
|
||||
finalPrice: 120000,
|
||||
),
|
||||
];
|
||||
|
||||
@override
|
||||
Future<List<OfferModel>> getNearbyOffers() async {
|
||||
// شبیهسازی یک تاخیر ۲ ثانیهای شبکه
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
|
||||
// برگرداندن لیستی از دادههای هاردکد شده و ساختگی
|
||||
return const [
|
||||
OfferModel(
|
||||
id: '1',
|
||||
storeName: 'رستوران شاندیز',
|
||||
title: 'چلوکباب کوبیده مخصوص',
|
||||
discount: '۲۰٪ تخفیف',
|
||||
imageUrl: 'https://picsum.photos/seed/picsum/200/300',
|
||||
category: 'رستوران',
|
||||
distanceInMeters: 350,
|
||||
),
|
||||
OfferModel(
|
||||
id: '2',
|
||||
storeName: 'کافه کتاب',
|
||||
title: 'نوشیدنی گرم به همراه کیک روز',
|
||||
discount: '۱۵٪ تخفیف',
|
||||
imageUrl: 'https://picsum.photos/seed/coffee/200/300',
|
||||
category: 'کافه',
|
||||
distanceInMeters: 800,
|
||||
),
|
||||
OfferModel(
|
||||
id: '3',
|
||||
storeName: 'فروشگاه پوشاک خانواده',
|
||||
title: 'تمام اجناس فصل',
|
||||
discount: 'تا ۵۰٪ تخفیف',
|
||||
imageUrl: 'https://picsum.photos/seed/fashion/200/300',
|
||||
category: 'پوشاک',
|
||||
distanceInMeters: 1200,
|
||||
),
|
||||
OfferModel(
|
||||
id: '4',
|
||||
storeName: 'پیتزا هات',
|
||||
title: 'پیتزا پپرونی دو نفره',
|
||||
discount: 'خرید یکی، دوتا ببر',
|
||||
imageUrl: 'https://picsum.photos/seed/pizza/200/300',
|
||||
category: 'فست فود',
|
||||
distanceInMeters: 550,
|
||||
),
|
||||
];
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
return _mockOffers;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<OfferModel?> getOfferById(String id) async {
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
try {
|
||||
return _mockOffers.firstWhere((offer) => offer.id == id);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,67 @@
|
|||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/data/models/working_hours.dart';
|
||||
|
||||
class OfferModel extends Equatable {
|
||||
final String id;
|
||||
final String storeName;
|
||||
final String title;
|
||||
final String discount; // e.g., "۵۰٪ تخفیف" or "با خرید یکی، دوتا ببر"
|
||||
final String imageUrl;
|
||||
final String category; // e.g., "رستوران", "پوشاک"
|
||||
final double distanceInMeters;
|
||||
final String discount;
|
||||
final List<String> imageUrls;
|
||||
final String category;
|
||||
final int distanceInMeters;
|
||||
final DateTime expiryTime;
|
||||
final String address;
|
||||
final List<WorkingHours> workingHours;
|
||||
final String discountType;
|
||||
final bool isOpen;
|
||||
final double rating;
|
||||
final int ratingCount;
|
||||
final double latitude;
|
||||
final double longitude;
|
||||
final double originalPrice;
|
||||
final double finalPrice;
|
||||
|
||||
const OfferModel({
|
||||
required this.id,
|
||||
required this.storeName,
|
||||
required this.title,
|
||||
required this.discount,
|
||||
required this.imageUrl,
|
||||
required this.imageUrls,
|
||||
required this.category,
|
||||
required this.distanceInMeters,
|
||||
required this.expiryTime,
|
||||
required this.address,
|
||||
required this.workingHours,
|
||||
required this.discountType,
|
||||
required this.isOpen,
|
||||
required this.rating,
|
||||
required this.ratingCount,
|
||||
required this.latitude,
|
||||
required this.longitude,
|
||||
required this.originalPrice,
|
||||
required this.finalPrice,
|
||||
});
|
||||
|
||||
// این تابع بعدا برای اتصال به API واقعی استفاده خواهد شد
|
||||
factory OfferModel.fromJson(Map<String, dynamic> json) {
|
||||
return OfferModel(
|
||||
id: json['id'],
|
||||
storeName: json['storeName'],
|
||||
title: json['title'],
|
||||
discount: json['discount'],
|
||||
imageUrl: json['imageUrl'],
|
||||
category: json['category'],
|
||||
distanceInMeters: json['distanceInMeters'].toDouble(),
|
||||
);
|
||||
}
|
||||
String get coverImageUrl =>
|
||||
imageUrls.isNotEmpty ? imageUrls.first : 'https://via.placeholder.com/400x200.png?text=No+Image';
|
||||
|
||||
@override
|
||||
List<Object?> get props => [id, storeName, title, discount, imageUrl, category, distanceInMeters];
|
||||
List<Object?> get props => [
|
||||
id,
|
||||
title,
|
||||
storeName,
|
||||
rating,
|
||||
ratingCount,
|
||||
latitude,
|
||||
longitude,
|
||||
];
|
||||
|
||||
String get distanceAsString {
|
||||
if (distanceInMeters < 1000) {
|
||||
return "$distanceInMeters متر";
|
||||
} else {
|
||||
final distanceInKm = (distanceInMeters / 1000).toStringAsFixed(1);
|
||||
return "$distanceInKm کیلومتر";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
class Shift extends Equatable {
|
||||
final String openAt;
|
||||
final String closeAt;
|
||||
|
||||
const Shift({required this.openAt, required this.closeAt});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [openAt, closeAt];
|
||||
}
|
||||
|
||||
class WorkingHours extends Equatable {
|
||||
final String day;
|
||||
final List<Shift> shifts;
|
||||
|
||||
const WorkingHours({required this.day, required this.shifts});
|
||||
|
||||
bool get isOpen => shifts.isNotEmpty;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [day, shifts];
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import 'package:proxibuy/data/models/datasources/offer_data_source.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
|
||||
class OfferRepository {
|
||||
final OfferDataSource _offerDataSource;
|
||||
|
||||
OfferRepository({required OfferDataSource offerDataSource})
|
||||
: _offerDataSource = offerDataSource;
|
||||
|
||||
Future<List<OfferModel>> fetchOffers({required List<String> selectedCategories}) async {
|
||||
final allOffers = await _offerDataSource.getNearbyOffers();
|
||||
|
||||
if (selectedCategories.isEmpty) {
|
||||
return allOffers;
|
||||
}
|
||||
|
||||
final filteredOffers = allOffers
|
||||
.where((offer) => selectedCategories.contains(offer.category))
|
||||
.toList();
|
||||
|
||||
return filteredOffers;
|
||||
}
|
||||
Future<OfferModel?> fetchOfferById(String id) async {
|
||||
// در آینده این متد میتواند یک درخواست API برای گرفتن اطلاعات یک محصول خاص ارسال کند
|
||||
return _offerDataSource.getOfferById(id);
|
||||
}
|
||||
}
|
||||
183
lib/main.dart
|
|
@ -1,15 +1,20 @@
|
|||
// lib/main.dart
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_animate/flutter_animate.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:proxibuy/data/models/datasources/offer_data_source.dart';
|
||||
import 'package:proxibuy/data/repositories/offer_repository.dart';
|
||||
import 'package:proxibuy/presentation/auth/bloc/auth_bloc.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_bloc.dart';
|
||||
import 'core/config/app_colors.dart'; // از کلاس رنگ خودمان استفاده میکنیم
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_bloc.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_event.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_bloc.dart'; // ✅ مسیر BLoC آفر
|
||||
import 'core/config/app_colors.dart';
|
||||
import 'presentation/pages/onboarding_page.dart';
|
||||
|
||||
void main() {
|
||||
|
||||
Animate.restartOnHotReload = true;
|
||||
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
||||
|
|
@ -18,102 +23,104 @@ class MyApp extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// استفاده از MultiBlocProvider برای ارائه تمام BLoC ها
|
||||
return MultiBlocProvider(
|
||||
return MultiRepositoryProvider(
|
||||
providers: [
|
||||
BlocProvider(
|
||||
create: (context) => OfferBloc(dataSource: MockOfferDataSource()),
|
||||
),
|
||||
BlocProvider(
|
||||
create: (context) => AuthBloc(),
|
||||
RepositoryProvider<OfferRepository>(
|
||||
create: (context) => OfferRepository(
|
||||
offerDataSource: MockOfferDataSource(),
|
||||
),
|
||||
),
|
||||
],
|
||||
child: MaterialApp(
|
||||
title: 'تخفیف یاب', // نام اپ
|
||||
debugShowCheckedModeBanner: false,
|
||||
|
||||
// ===== تنظیمات زبان فارسی و راستچین =====
|
||||
localizationsDelegates: const [
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
child: MultiBlocProvider(
|
||||
providers: [
|
||||
BlocProvider<AuthBloc>(
|
||||
create: (context) => AuthBloc(),
|
||||
),
|
||||
BlocProvider<NotificationPreferencesBloc>(
|
||||
create: (context) => NotificationPreferencesBloc()..add(LoadCategories()),
|
||||
),
|
||||
BlocProvider<OffersBloc>(
|
||||
create: (context) => OffersBloc(
|
||||
offerRepository: context.read<OfferRepository>(),
|
||||
),
|
||||
),
|
||||
],
|
||||
supportedLocales: const [
|
||||
Locale('fa'), // فارسی
|
||||
],
|
||||
locale: const Locale('fa'),
|
||||
child: MaterialApp(
|
||||
title: 'Proxibuy',
|
||||
debugShowCheckedModeBanner: false,
|
||||
|
||||
// ===== تعریف تم به روش مدرن =====
|
||||
theme: ThemeData(
|
||||
fontFamily: 'Dana', // فونت وزیرمتن که قبلا تعریف کردیم
|
||||
scaffoldBackgroundColor: Colors.white,
|
||||
localizationsDelegates: const [
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
],
|
||||
supportedLocales: const [
|
||||
Locale('fa'),
|
||||
],
|
||||
locale: const Locale('fa'),
|
||||
|
||||
// ۱. تعریف ColorScheme به عنوان منبع اصلی رنگها
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: AppColors.primary, // رنگ اصلی شما
|
||||
primary: AppColors.primary,
|
||||
// background: AppColors.,
|
||||
surface: Colors.white,
|
||||
),
|
||||
|
||||
// ۲. تعریف تم برای ویجتهای خاص
|
||||
appBarTheme: const AppBarTheme(
|
||||
backgroundColor: AppColors.primary,
|
||||
foregroundColor: Colors.grey, // رنگ آیکون و متن روی AppBar
|
||||
elevation: 0,
|
||||
),
|
||||
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
filled: true, // <--- ۱. این خط اضافه شد
|
||||
fillColor: Colors.white, // <--- ۲. این خط اضافه شد
|
||||
floatingLabelBehavior: FloatingLabelBehavior.always,
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), // <--- ۳. این خط برای پدینگ داخلی بهتر اضافه شد
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.border), // رنگ بوردر در حالت عادی
|
||||
theme: ThemeData(
|
||||
fontFamily: 'Dana',
|
||||
scaffoldBackgroundColor: Colors.white,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: AppColors.primary,
|
||||
primary: AppColors.primary,
|
||||
surface: Colors.white,
|
||||
),
|
||||
enabledBorder: OutlineInputBorder( // استایل بوردر در حالت فعال ولی بدون فوکوس
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.border),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.primary, width: 2),
|
||||
),
|
||||
labelStyle: const TextStyle(color: Colors.black),
|
||||
hintStyle: TextStyle(color: Colors.black.withOpacity(0.8)),
|
||||
),
|
||||
|
||||
outlinedButtonTheme: OutlinedButtonThemeData( // <--- تم دکمه گوگل
|
||||
style: OutlinedButton.styleFrom(
|
||||
appBarTheme: const AppBarTheme(
|
||||
backgroundColor: AppColors.primary,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
side: const BorderSide(color: AppColors.grey),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
textStyle: const TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
color: Colors.black
|
||||
elevation: 0,
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
filled: true,
|
||||
fillColor: Colors.white,
|
||||
floatingLabelBehavior: FloatingLabelBehavior.always,
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20),
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.border),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.border),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: AppColors.primary, width: 2),
|
||||
),
|
||||
labelStyle: const TextStyle(color: Colors.black),
|
||||
hintStyle: TextStyle(color: Colors.black.withOpacity(0.8)),
|
||||
),
|
||||
outlinedButtonTheme: OutlinedButtonThemeData(
|
||||
style: OutlinedButton.styleFrom(
|
||||
foregroundColor: Colors.black, // رنگ متن دکمه Outlined
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
side: const BorderSide(color: Colors.grey),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
textStyle: const TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.button,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
textStyle: const TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.button,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
textStyle: const TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
home: const OnboardingPage(),
|
||||
),
|
||||
home: const OnboardingPage(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,40 +1,43 @@
|
|||
// lib/presentation/bloc/auth/auth_bloc.dart
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:async';
|
||||
|
||||
part 'auth_event.dart';
|
||||
part 'auth_state.dart';
|
||||
|
||||
class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
||||
AuthBloc() : super(AuthInitial()) {
|
||||
|
||||
// مدیریت رویداد ارسال کد
|
||||
on<SendOtpEvent>((event, emit) async {
|
||||
on<SendOTPEvent>((event, emit) async {
|
||||
emit(AuthLoading());
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
if (event.phoneNumber.endsWith('0000')) {
|
||||
emit(const AuthFailure('شماره وارد شده نامعتبر است.'));
|
||||
} else {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (event.phoneNumber.isNotEmpty) {
|
||||
emit(AuthCodeSentSuccess());
|
||||
} else {
|
||||
emit(AuthFailure('شماره موبایل معتبر نیست.'));
|
||||
}
|
||||
});
|
||||
|
||||
// مدیریت رویداد تایید کد
|
||||
on<VerifyOtpEvent>((event, emit) async {
|
||||
on<VerifyOTPEvent>((event, emit) async {
|
||||
emit(AuthLoading());
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
if (event.otpCode == '12345') { // یک کد جادویی برای تست
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (event.otp == '12345') {
|
||||
emit(AuthVerified());
|
||||
} else {
|
||||
emit(const AuthFailure('کد وارد شده صحیح نمیباشد.'));
|
||||
emit(AuthFailure('کد تایید صحیح نمیباشد.'));
|
||||
}
|
||||
});
|
||||
on<UpdateUserInfoEvent>((event, emit) async {
|
||||
|
||||
on<SaveUserInfoEvent>((event, emit) async {
|
||||
emit(AuthLoading());
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
// در اینجا منطق واقعی ذخیره در سرور یا دیتابیس قرار میگیرد
|
||||
print('User Info Saved: Name=${event.name}, Gender=${event.gender}');
|
||||
emit(UserInfoUpdateSuccess());
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
|
||||
print('User info to save: Name: ${event.name}, Gender: ${event.gender}');
|
||||
|
||||
if (event.name.trim().isEmpty) {
|
||||
emit(AuthFailure('لطفاً نام خود را وارد کنید.'));
|
||||
} else {
|
||||
emit(UserInfoSaved());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,32 +1,24 @@
|
|||
// lib/presentation/bloc/auth/auth_event.dart
|
||||
|
||||
part of 'auth_bloc.dart';
|
||||
|
||||
abstract class AuthEvent extends Equatable {
|
||||
const AuthEvent();
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
@immutable
|
||||
abstract class AuthEvent {}
|
||||
|
||||
// برای ارسال اولیه کد
|
||||
class SendOtpEvent extends AuthEvent {
|
||||
class SendOTPEvent extends AuthEvent {
|
||||
final String phoneNumber;
|
||||
const SendOtpEvent(this.phoneNumber);
|
||||
@override
|
||||
List<Object> get props => [phoneNumber];
|
||||
|
||||
SendOTPEvent({required this.phoneNumber});
|
||||
}
|
||||
|
||||
// برای تایید کد وارد شده
|
||||
class VerifyOtpEvent extends AuthEvent {
|
||||
final String otpCode;
|
||||
const VerifyOtpEvent(this.otpCode);
|
||||
@override
|
||||
List<Object> get props => [otpCode];
|
||||
class VerifyOTPEvent extends AuthEvent {
|
||||
final String otp;
|
||||
|
||||
VerifyOTPEvent({required this.otp});
|
||||
}
|
||||
|
||||
class UpdateUserInfoEvent extends AuthEvent {
|
||||
class SaveUserInfoEvent extends AuthEvent {
|
||||
final String name;
|
||||
final String gender;
|
||||
const UpdateUserInfoEvent({required this.name, required this.gender});
|
||||
@override
|
||||
List<Object> get props => [name, gender];
|
||||
}
|
||||
|
||||
SaveUserInfoEvent({required this.name, required this.gender});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,20 +1,21 @@
|
|||
// lib/presentation/bloc/auth/auth_state.dart
|
||||
|
||||
part of 'auth_bloc.dart';
|
||||
|
||||
abstract class AuthState extends Equatable {
|
||||
const AuthState();
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
@immutable
|
||||
abstract class AuthState {}
|
||||
|
||||
class AuthInitial extends AuthState {} // وضعیت اولیه
|
||||
class AuthLoading extends AuthState {} // در حال پردازش (برای همه رویدادها)
|
||||
class AuthCodeSentSuccess extends AuthState {} // کد با موفقیت ارسال شد
|
||||
class AuthVerified extends AuthState {} // کد با موفقیت تایید شد و کاربر وارد شد
|
||||
class AuthFailure extends AuthState { // بروز خطا
|
||||
class AuthInitial extends AuthState {}
|
||||
|
||||
class AuthLoading extends AuthState {}
|
||||
|
||||
class AuthCodeSentSuccess extends AuthState {}
|
||||
|
||||
class AuthVerified extends AuthState {}
|
||||
|
||||
class UserInfoSaved extends AuthState {}
|
||||
|
||||
class AuthFailure extends AuthState {
|
||||
final String message;
|
||||
const AuthFailure(this.message);
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
class UserInfoUpdateSuccess extends AuthState {}
|
||||
|
||||
AuthFailure(this.message);
|
||||
}
|
||||
|
|
@ -13,7 +13,6 @@ class NotificationPreferencesBloc
|
|||
|
||||
void _onLoadCategories(
|
||||
LoadCategories event, Emitter<NotificationPreferencesState> emit) {
|
||||
// Mock data, replace with API call later
|
||||
final categories = [
|
||||
CategoryEntity(id: 1, name: 'تریا', icon: Assets.icons.teria),
|
||||
CategoryEntity(id: 2, name: 'پوشاک', icon: Assets.icons.pooshak),
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/domain/entities/category_entity.dart';
|
||||
|
||||
|
|
@ -20,6 +21,7 @@ class NotificationPreferencesState extends Equatable {
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
List<Object> get props => [categories, selectedCategoryIds];
|
||||
}
|
||||
|
|
@ -1,24 +1,30 @@
|
|||
// lib/presentation/bloc/offer/offer_bloc.dart
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/data/models/datasources/offer_data_source.dart';
|
||||
import '../../../../data/models/offer_model.dart';
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:proxibuy/data/repositories/offer_repository.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_event.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_state.dart';
|
||||
|
||||
part 'offer_event.dart';
|
||||
part 'offer_state.dart';
|
||||
|
||||
class OfferBloc extends Bloc<OfferEvent, OfferState> {
|
||||
final OfferDataSource dataSource;
|
||||
class OffersBloc extends Bloc<OffersEvent, OffersState> {
|
||||
final OfferRepository _offerRepository;
|
||||
|
||||
OfferBloc({required this.dataSource}) : super(OfferInitial()) {
|
||||
on<FetchNearbyOffers>((event, emit) async {
|
||||
emit(OfferLoading());
|
||||
try {
|
||||
final offers = await dataSource.getNearbyOffers();
|
||||
emit(OfferSuccess(offers));
|
||||
} catch (e) {
|
||||
emit(OfferFailure('متاسفانه خطایی رخ داد: ${e.toString()}'));
|
||||
}
|
||||
});
|
||||
OffersBloc({required OfferRepository offerRepository})
|
||||
: _offerRepository = offerRepository,
|
||||
super(OffersInitial()) {
|
||||
on<OffersFetchRequested>(_onFetchRequested);
|
||||
}
|
||||
|
||||
Future<void> _onFetchRequested(
|
||||
OffersFetchRequested event,
|
||||
Emitter<OffersState> emit,
|
||||
) async {
|
||||
emit(OffersLoadInProgress());
|
||||
try {
|
||||
final offers = await _offerRepository.fetchOffers(
|
||||
selectedCategories: event.selectedCategories,
|
||||
);
|
||||
emit(OffersLoadSuccess(offers));
|
||||
} catch (e) {
|
||||
emit(OffersLoadFailure(e.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,19 @@
|
|||
// lib/presentation/bloc/offer/offer_event.dart
|
||||
part of 'offer_bloc.dart';
|
||||
|
||||
abstract class OfferEvent extends Equatable {
|
||||
const OfferEvent();
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class OffersEvent extends Equatable {
|
||||
const OffersEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class FetchNearbyOffers extends OfferEvent {}
|
||||
class OffersFetchRequested extends OffersEvent {
|
||||
// ✅ ۱. یک فیلد برای نگهداری دستهبندیها اضافه کنید
|
||||
final List<String> selectedCategories;
|
||||
|
||||
const OffersFetchRequested({required this.selectedCategories});
|
||||
|
||||
@override
|
||||
List<Object> get props => [selectedCategories];
|
||||
}
|
||||
|
|
@ -1,23 +1,33 @@
|
|||
// lib/presentation/bloc/offer/offer_state.dart
|
||||
part of 'offer_bloc.dart';
|
||||
|
||||
abstract class OfferState extends Equatable {
|
||||
const OfferState();
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
|
||||
abstract class OffersState extends Equatable {
|
||||
const OffersState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class OfferInitial extends OfferState {}
|
||||
class OfferLoading extends OfferState {}
|
||||
class OfferSuccess extends OfferState {
|
||||
class OffersInitial extends OffersState {}
|
||||
|
||||
class OffersLoadInProgress extends OffersState {}
|
||||
|
||||
class OffersLoadSuccess extends OffersState {
|
||||
final List<OfferModel> offers;
|
||||
const OfferSuccess(this.offers);
|
||||
|
||||
const OffersLoadSuccess(this.offers);
|
||||
|
||||
@override
|
||||
List<Object> get props => [offers];
|
||||
}
|
||||
class OfferFailure extends OfferState {
|
||||
final String message;
|
||||
const OfferFailure(this.message);
|
||||
|
||||
class OffersLoadFailure extends OffersState {
|
||||
final String error;
|
||||
|
||||
const OffersLoadFailure(this.error);
|
||||
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
List<Object> get props => [error];
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/widgets/offer_card.dart';
|
||||
import 'package:proxibuy/presentation/pages/product_detail_page.dart'; // <-- این خط را اضافه کن
|
||||
|
||||
class CategoryOffersRow extends StatelessWidget {
|
||||
final String categoryTitle;
|
||||
final List<OfferModel> offers;
|
||||
|
||||
const CategoryOffersRow({
|
||||
super.key,
|
||||
required this.categoryTitle,
|
||||
required this.offers,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
|
||||
child: Text(
|
||||
categoryTitle,
|
||||
style: Theme.of(context).textTheme.headlineSmall?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 300,
|
||||
child: ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
itemCount: offers.length,
|
||||
itemBuilder: (context, index) {
|
||||
final offer = offers[index];
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 12.0),
|
||||
child: OfferCard(
|
||||
offer: offer,
|
||||
width: 320,
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) {
|
||||
return ProductDetailPage(offerId: offer.id,);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
// const SizedBox(height: 16),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,54 +1,162 @@
|
|||
// lib/presentation/widgets/offer_card.dart
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:proxibuy/core/gen/assets.gen.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
|
||||
class OfferCard extends StatelessWidget {
|
||||
class OfferCard extends StatefulWidget {
|
||||
final OfferModel offer;
|
||||
const OfferCard({super.key, required this.offer});
|
||||
final VoidCallback? onTap;
|
||||
final double width;
|
||||
|
||||
const OfferCard({
|
||||
super.key,
|
||||
required this.offer,
|
||||
this.onTap,
|
||||
this.width = 150,
|
||||
});
|
||||
|
||||
@override
|
||||
State<OfferCard> createState() => _OfferCardState();
|
||||
}
|
||||
|
||||
class _OfferCardState extends State<OfferCard> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
elevation: 4,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
offer.storeName,
|
||||
style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
offer.title,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red.shade100,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
child: Text(
|
||||
offer.discount,
|
||||
style: TextStyle(
|
||||
color: Colors.red.shade800,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'فاصله: ${offer.distanceInMeters.toInt()} متر',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
],
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return SizedBox(
|
||||
width: 270,
|
||||
child: GestureDetector(
|
||||
onTap: widget.onTap,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Stack(children: [_buildOfferImage()]),
|
||||
_buildInfoContainer(textTheme),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildOfferImage() {
|
||||
return ClipRRect(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(12),
|
||||
topRight: Radius.circular(12),
|
||||
),
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: widget.offer.coverImageUrl,
|
||||
height: 140,
|
||||
width: double.infinity,
|
||||
fit: BoxFit.cover,
|
||||
placeholder:
|
||||
(context, url) => Container(
|
||||
height: 140,
|
||||
color: Colors.grey[300],
|
||||
child: const Center(child: CircularProgressIndicator()),
|
||||
),
|
||||
errorWidget:
|
||||
(context, url, error) => Container(
|
||||
height: 140,
|
||||
color: Colors.grey[300],
|
||||
child: const Icon(Icons.broken_image, color: Colors.grey),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildInfoContainer(TextTheme textTheme) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(12),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: const BorderRadius.only(
|
||||
bottomLeft: Radius.circular(12),
|
||||
bottomRight: Radius.circular(12),
|
||||
),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.2),
|
||||
spreadRadius: 2,
|
||||
blurRadius: 5,
|
||||
offset: const Offset(0, 3),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.shop.path),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
widget.offer.storeName,
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.shoppingCart.path),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
widget.offer.title,
|
||||
style: textTheme.bodySmall,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
|
||||
// ================== شروع تغییرات ==================
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.location.path),
|
||||
const SizedBox(width: 4),
|
||||
// ویجت Flexible باعث میشود که آدرس، فضای باقیمانده را پر کند
|
||||
// و در صورت طولانی بودن، کوتاه شود.
|
||||
Flexible(
|
||||
child: Text(
|
||||
widget.offer.address,
|
||||
style: textTheme.bodySmall,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis, // نمایش سه نقطه در انتهای متن طولانی
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
// این بخش همیشه به طور کامل نمایش داده میشود
|
||||
Text(
|
||||
'(${widget.offer.distanceInMeters.toString()}متر تا تخفیف)',
|
||||
style: textTheme.bodySmall,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
const SizedBox(height: 10),
|
||||
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.routing.path),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
'نوع تخفیف : ${widget.offer.discount} ${widget.offer.discountType}',
|
||||
style: const TextStyle(color: Color.fromARGB(255, 183, 28, 28),fontSize: 14),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
// lib/presentation/pages/login_page.dart
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:country_picker/country_picker.dart';
|
||||
|
|
@ -19,11 +20,16 @@ class _LoginPageState extends State<LoginPage> {
|
|||
Country _selectedCountry = Country.parse('IR');
|
||||
bool _keepSignedIn = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_phoneController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
// ۱. حل مشکل چپچینی با Directionality
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: Scaffold(
|
||||
|
|
@ -43,7 +49,6 @@ class _LoginPageState extends State<LoginPage> {
|
|||
),
|
||||
),
|
||||
const SizedBox(height: 48),
|
||||
|
||||
TextField(
|
||||
readOnly: true,
|
||||
controller: TextEditingController(
|
||||
|
|
@ -67,7 +72,6 @@ class _LoginPageState extends State<LoginPage> {
|
|||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
TextField(
|
||||
controller: _phoneController,
|
||||
keyboardType: TextInputType.phone,
|
||||
|
|
@ -76,8 +80,6 @@ class _LoginPageState extends State<LoginPage> {
|
|||
decoration: InputDecoration(
|
||||
labelText: "شماره موبایل",
|
||||
hintText: "- - - - - - - - - -",
|
||||
// --- تغییر اصلی اینجاست ---
|
||||
// prefixIcon با suffix جایگزین شد تا در سمت چپ قرار گیرد
|
||||
suffix: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 2.0),
|
||||
child: Text(
|
||||
|
|
@ -90,21 +92,18 @@ class _LoginPageState extends State<LoginPage> {
|
|||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: _keepSignedIn,
|
||||
onChanged:
|
||||
(value) =>
|
||||
setState(() => _keepSignedIn = value ?? false),
|
||||
onChanged: (value) =>
|
||||
setState(() => _keepSignedIn = value ?? false),
|
||||
activeColor: AppColors.primary,
|
||||
),
|
||||
Text("مرا به خاطر بسپار", style: textTheme.bodyMedium),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
|
||||
BlocConsumer<AuthBloc, AuthState>(
|
||||
listener: (context, state) {
|
||||
if (state is AuthFailure) {
|
||||
|
|
@ -116,11 +115,12 @@ class _LoginPageState extends State<LoginPage> {
|
|||
);
|
||||
}
|
||||
if (state is AuthCodeSentSuccess) {
|
||||
final fullPhoneNumber =
|
||||
"0${_phoneController.text}";
|
||||
Navigator.push(context, MaterialPageRoute(
|
||||
builder: (_) => OtpPage(phoneNumber: fullPhoneNumber)
|
||||
));
|
||||
final fullPhoneNumber = "0${_phoneController.text}";
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (_) =>
|
||||
OtpPage(phoneNumber: fullPhoneNumber)));
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
|
|
@ -137,8 +137,6 @@ class _LoginPageState extends State<LoginPage> {
|
|||
},
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
// ۲. افزودن بخش "ادامه با" و دکمه گوگل
|
||||
Row(
|
||||
children: [
|
||||
const Expanded(child: Divider()),
|
||||
|
|
@ -196,8 +194,8 @@ class _LoginPageState extends State<LoginPage> {
|
|||
}
|
||||
|
||||
void _sendOtp() {
|
||||
final fullPhoneNumber =
|
||||
"+${_selectedCountry.phoneCode}${_phoneController.text}";
|
||||
context.read<AuthBloc>().add(SendOtpEvent(fullPhoneNumber));
|
||||
context
|
||||
.read<AuthBloc>()
|
||||
.add(SendOTPEvent(phoneNumber: _phoneController.text));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,24 +2,21 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:proxibuy/core/config/app_colors.dart';
|
||||
import 'package:proxibuy/core/gen/assets.gen.dart';
|
||||
import 'package:proxibuy/data/models/datasources/offer_data_source.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_bloc.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_event.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_state.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_bloc.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_event.dart';
|
||||
import 'package:proxibuy/presentation/pages/offers_page.dart';
|
||||
import 'package:proxibuy/presentation/widgets/category_selection_card.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class NotificationPreferencesPage extends StatelessWidget {
|
||||
const NotificationPreferencesPage({Key? key}) : super(key: key);
|
||||
const NotificationPreferencesPage({super.key});
|
||||
|
||||
static Route<void> route() {
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => BlocProvider(
|
||||
create: (context) =>
|
||||
NotificationPreferencesBloc()..add(LoadCategories()),
|
||||
child: const NotificationPreferencesPage(),
|
||||
),
|
||||
builder: (_) => const NotificationPreferencesPage(),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -84,14 +81,15 @@ class NotificationPreferencesPage extends StatelessWidget {
|
|||
),
|
||||
const SizedBox(height: 24),
|
||||
Expanded(
|
||||
child: BlocBuilder<NotificationPreferencesBloc,
|
||||
NotificationPreferencesState>(
|
||||
child: BlocBuilder<
|
||||
NotificationPreferencesBloc,
|
||||
NotificationPreferencesState
|
||||
>(
|
||||
builder: (context, state) {
|
||||
if (state.categories.isEmpty) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
|
||||
// START OF CHANGE: Replacing GridView with Wrap
|
||||
const double sidePadding = 24.0;
|
||||
const double crossAxisSpacing = 16.0;
|
||||
const int crossAxisCount = 3;
|
||||
|
|
@ -111,73 +109,106 @@ class NotificationPreferencesPage extends StatelessWidget {
|
|||
alignment: WrapAlignment.center,
|
||||
spacing: crossAxisSpacing,
|
||||
runSpacing: mainAxisSpacing,
|
||||
children: state.categories.map((category) {
|
||||
final isSelected =
|
||||
state.selectedCategoryIds.contains(category.id);
|
||||
return SizedBox(
|
||||
width: itemWidth,
|
||||
height: itemHeight,
|
||||
child: CategorySelectionCard(
|
||||
name: category.name,
|
||||
icon: category.icon,
|
||||
isSelected: isSelected,
|
||||
showSelectableIndicator:
|
||||
state.selectedCategoryIds.isNotEmpty,
|
||||
onTap: () {
|
||||
context
|
||||
.read<NotificationPreferencesBloc>()
|
||||
.add(ToggleCategorySelection(category.id));
|
||||
},
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
children:
|
||||
state.categories.map((category) {
|
||||
final isSelected = state.selectedCategoryIds
|
||||
.contains(category.id);
|
||||
return SizedBox(
|
||||
width: itemWidth,
|
||||
height: itemHeight,
|
||||
child: CategorySelectionCard(
|
||||
name: category.name,
|
||||
icon: category.icon,
|
||||
isSelected: isSelected,
|
||||
showSelectableIndicator:
|
||||
state.selectedCategoryIds.isNotEmpty,
|
||||
onTap: () {
|
||||
context
|
||||
.read<NotificationPreferencesBloc>()
|
||||
.add(
|
||||
ToggleCategorySelection(category.id),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
);
|
||||
// END OF CHANGE
|
||||
},
|
||||
),
|
||||
),
|
||||
BlocBuilder<NotificationPreferencesBloc,
|
||||
NotificationPreferencesState>(
|
||||
BlocBuilder<
|
||||
NotificationPreferencesBloc,
|
||||
NotificationPreferencesState
|
||||
>(
|
||||
builder: (context, state) {
|
||||
final isEnabled = state.selectedCategoryIds.isNotEmpty;
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
child: isEnabled
|
||||
? ElevatedButton(
|
||||
onPressed: isEnabled
|
||||
? () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => BlocProvider(
|
||||
create: (context) => OfferBloc(
|
||||
dataSource:
|
||||
MockOfferDataSource()),
|
||||
child: const OffersPage(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
: null,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.confirm,
|
||||
foregroundColor: Colors.white,
|
||||
disabledBackgroundColor: Colors.grey,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
child:
|
||||
isEnabled
|
||||
? ElevatedButton(
|
||||
onPressed:
|
||||
isEnabled
|
||||
? () async {
|
||||
final selectedCategoryNames =
|
||||
state.categories
|
||||
.where(
|
||||
(cat) => state
|
||||
.selectedCategoryIds
|
||||
.contains(cat.id),
|
||||
)
|
||||
.map((cat) => cat.name)
|
||||
.toList();
|
||||
|
||||
final prefs =
|
||||
await SharedPreferences.getInstance();
|
||||
await prefs.setStringList(
|
||||
'user_selected_categories',
|
||||
selectedCategoryNames,
|
||||
);
|
||||
|
||||
if (context.mounted) {
|
||||
context.read<OffersBloc>().add(
|
||||
OffersFetchRequested(
|
||||
selectedCategories:
|
||||
selectedCategoryNames,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!context.mounted) return;
|
||||
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder:
|
||||
(context) => const OffersPage(
|
||||
showDialogsOnLoad: true,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
: null,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.confirm,
|
||||
foregroundColor: Colors.white,
|
||||
disabledBackgroundColor: Colors.grey,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: const Text(
|
||||
'اعمال',
|
||||
style: TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
child: const Text(
|
||||
'اعمال',
|
||||
style: TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
)
|
||||
: const SizedBox(),
|
||||
);
|
||||
},
|
||||
),
|
||||
|
|
@ -187,4 +218,4 @@ class NotificationPreferencesPage extends StatelessWidget {
|
|||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,69 +1,263 @@
|
|||
// lib/presentation/pages/offers_page.dart
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_animate/flutter_animate.dart'; // <-- این خط را اضافه کن
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:proxibuy/core/config/app_colors.dart';
|
||||
import 'package:proxibuy/core/gen/assets.gen.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_bloc.dart';
|
||||
import 'package:proxibuy/presentation/notification_preferences/bloc/notification_preferences_event.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_bloc.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/widgets/offer_card.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_event.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/offer_state.dart';
|
||||
import 'package:proxibuy/presentation/offer/bloc/widgets/category_offers_row.dart';
|
||||
import 'package:proxibuy/presentation/pages/notification_preferences_page.dart';
|
||||
import 'package:proxibuy/presentation/widgets/gps_dialog.dart';
|
||||
import 'package:proxibuy/presentation/widgets/notification_permission_dialog.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class OffersPage extends StatefulWidget {
|
||||
const OffersPage({super.key});
|
||||
final bool showDialogsOnLoad;
|
||||
|
||||
const OffersPage({super.key, this.showDialogsOnLoad = false});
|
||||
|
||||
@override
|
||||
State<OffersPage> createState() => _OffersPageState();
|
||||
}
|
||||
|
||||
class _OffersPageState extends State<OffersPage> {
|
||||
List<String> _selectedCategories = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await showGPSDialog(context);
|
||||
if (mounted) {
|
||||
context.read<OfferBloc>().add(FetchNearbyOffers());
|
||||
}
|
||||
});
|
||||
_loadOffersAndPreferences();
|
||||
|
||||
if (widget.showDialogsOnLoad) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
if (mounted) {
|
||||
await showGPSDialog(context);
|
||||
}
|
||||
if (mounted) {
|
||||
await showNotificationPermissionDialog(context);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadOffersAndPreferences() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final savedCategories =
|
||||
prefs.getStringList('user_selected_categories') ?? [];
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_selectedCategories = savedCategories;
|
||||
});
|
||||
context.read<OffersBloc>().add(
|
||||
OffersFetchRequested(selectedCategories: savedCategories),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildFavoriteCategoriesSection() {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
const Text(
|
||||
'دستهبندیهای مورد علاقه شما',
|
||||
style: TextStyle(fontSize: 19, fontWeight: FontWeight.bold),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
final result = await Navigator.of(context).push<bool>(
|
||||
MaterialPageRoute(
|
||||
builder:
|
||||
(_) => BlocProvider.value(
|
||||
value:
|
||||
context.read<NotificationPreferencesBloc>()
|
||||
..add(LoadCategories()),
|
||||
child: const NotificationPreferencesPage(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
if (result == true) {
|
||||
_loadOffersAndPreferences();
|
||||
}
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
// چون asset مربوط به ویرایش وجود نداشت، از آیکون فلاتر استفاده شد
|
||||
const Icon(Icons.edit, size: 18, color: AppColors.primary),
|
||||
const SizedBox(width: 4),
|
||||
const Text('ویرایش'),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const Divider(height: 1),
|
||||
const SizedBox(height: 12),
|
||||
if (_selectedCategories.isEmpty)
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(bottom: 8.0),
|
||||
child: Text(
|
||||
'شما هنوز دستهبندی مورد علاقه خود را انتخاب نکردهاید.',
|
||||
style: TextStyle(color: Colors.grey),
|
||||
),
|
||||
)
|
||||
else
|
||||
Wrap(
|
||||
spacing: 8.0,
|
||||
runSpacing: 8.0,
|
||||
children:
|
||||
_selectedCategories.map((category) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12.0,
|
||||
vertical: 6.0,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
child: Text(category),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('تخفیفهای اطراف من'),
|
||||
),
|
||||
body: BlocBuilder<OfferBloc, OfferState>(
|
||||
builder: (context, state) {
|
||||
if (state is OfferLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
if (state is OfferSuccess) {
|
||||
return ListView.builder(
|
||||
itemCount: state.offers.length,
|
||||
itemBuilder: (context, index) {
|
||||
final offer = state.offers[index];
|
||||
return OfferCard(offer: offer);
|
||||
},
|
||||
);
|
||||
}
|
||||
if (state is OfferFailure) {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(state.message),
|
||||
const SizedBox(height: 16),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.read<OfferBloc>().add(FetchNearbyOffers());
|
||||
},
|
||||
child: const Text('تلاش مجدد'),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return const Center(child: Text('برای شروع، صفحه را رفرش کنید'));
|
||||
},
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
backgroundColor: Colors.white,
|
||||
automaticallyImplyLeading: false,
|
||||
title: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 15.0,
|
||||
vertical: 0.0,
|
||||
),
|
||||
child: Assets.icons.logoWithName.svg(height: 40, width: 200),
|
||||
),
|
||||
actions: [
|
||||
IconButton(onPressed: () {}, icon: Assets.icons.notification.svg()),
|
||||
IconButton(onPressed: () {}, icon: Assets.icons.scanBarcode.svg()),
|
||||
const SizedBox(width: 8),
|
||||
],
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [_buildFavoriteCategoriesSection(), const OffersView()],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class OffersView extends StatelessWidget {
|
||||
const OffersView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<OffersBloc, OffersState>(
|
||||
builder: (context, state) {
|
||||
if (state is OffersLoadInProgress || state is OffersInitial) {
|
||||
return const SizedBox(
|
||||
height: 300,
|
||||
child: Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
}
|
||||
if (state is OffersLoadSuccess) {
|
||||
if (state.offers.isEmpty) {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
child: Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(height: 85),
|
||||
SvgPicture.asset(Assets.images.emptyHome.path),
|
||||
const SizedBox(height: 60),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
await Geolocator.openLocationSettings();
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.confirm,
|
||||
foregroundColor: Colors.white,
|
||||
disabledBackgroundColor: Colors.grey,
|
||||
padding: const EdgeInsets.symmetric(vertical: 12,horizontal: 125),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
child: const Text(
|
||||
'فعالسازی GPS',
|
||||
style: TextStyle(
|
||||
fontFamily: 'Dana',
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
const Text('جستوجوی تصادفی')
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final groupedOffers = groupBy(
|
||||
state.offers,
|
||||
(OfferModel offer) => offer.category,
|
||||
);
|
||||
final categories = groupedOffers.keys.toList();
|
||||
|
||||
return ListView.builder(
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
padding: const EdgeInsets.only(top: 16),
|
||||
itemCount: categories.length,
|
||||
itemBuilder: (context, index) {
|
||||
final category = categories[index];
|
||||
final offersForCategory = groupedOffers[category]!;
|
||||
|
||||
return CategoryOffersRow(
|
||||
categoryTitle: category,
|
||||
offers: offersForCategory,
|
||||
)
|
||||
.animate()
|
||||
.fade(duration: 500.ms)
|
||||
.slideY(begin: 0.3, duration: 400.ms, curve: Curves.easeOut);
|
||||
},
|
||||
);
|
||||
}
|
||||
if (state is OffersLoadFailure) {
|
||||
return SizedBox(
|
||||
height: 200,
|
||||
child: Center(child: Text("خطا در بارگذاری: ${state.error}")),
|
||||
);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +1,12 @@
|
|||
// lib/presentation/pages/onboarding_page.dart
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:proxibuy/presentation/auth/bloc/auth_bloc.dart';
|
||||
import 'package:proxibuy/presentation/pages/login_page.dart';
|
||||
import 'dart:ui'; // برای استفاده از ImageFilter
|
||||
import '../../core/config/app_colors.dart';
|
||||
import '../../core/gen/assets.gen.dart';
|
||||
import '../../domain/entities/onboarding_entity.dart';
|
||||
import '../widgets/onboarding_indicator_painter.dart';
|
||||
import 'offers_page.dart';
|
||||
|
||||
// دادههای مربوط به هر صفحه آنبوردینگ (بدون تغییر)
|
||||
final List<OnboardingEntity> onboardingPages = [
|
||||
OnboardingEntity(
|
||||
imagePath: Assets.images.onboarding1.path,
|
||||
|
|
@ -75,7 +70,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
} else {
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => BlocProvider( // یک BLoC جدید برای صفحه لاگین فراهم میکنیم
|
||||
builder: (context) => BlocProvider(
|
||||
create: (context) => AuthBloc(),
|
||||
child: const LoginPage(),
|
||||
),
|
||||
|
|
@ -89,9 +84,8 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
return Scaffold(
|
||||
body: Stack(
|
||||
children: [
|
||||
// لایه اول: نمایش عکسها با PageView (تمام صفحه)
|
||||
Directionality(
|
||||
textDirection: TextDirection.ltr, // <--- این خط کلیدی است
|
||||
textDirection: TextDirection.ltr,
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
itemCount: onboardingPages.length,
|
||||
|
|
@ -107,7 +101,6 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
),
|
||||
),
|
||||
|
||||
// لایه سوم: دکمه بازگشت
|
||||
if (_currentPage > 0)
|
||||
Positioned(
|
||||
top: 50,
|
||||
|
|
@ -122,15 +115,11 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
},
|
||||
),
|
||||
),
|
||||
|
||||
// لایه چهارم: محتوای اصلی (دکمه، ایندیکیتور و متن)
|
||||
Positioned(
|
||||
top: 580, // فاصله از پایین صفحه
|
||||
left: 24,
|
||||
right: 24,
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
bottom: 250,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: SizedBox(
|
||||
width: 80,
|
||||
height: 80,
|
||||
child: Stack(
|
||||
|
|
@ -166,9 +155,14 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),),
|
||||
Positioned(
|
||||
bottom: 85,
|
||||
left: 24,
|
||||
right: 24,
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 40),
|
||||
// بخش عنوان و توضیحات
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
|
@ -181,8 +175,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20,
|
||||
color:
|
||||
AppColors
|
||||
.white, // متن سفید برای خوانایی روی گرادیانت
|
||||
Colors.white
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
|
@ -190,7 +183,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
onboardingPages[_currentPage].description,
|
||||
textAlign: TextAlign.right,
|
||||
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
|
||||
color: AppColors.white.withOpacity(0.8), // کمی شفاف
|
||||
color: Colors.white.withOpacity(0.8),
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// lib/presentation/pages/otp_page.dart
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
|
|
@ -18,22 +18,21 @@ class OtpPage extends StatefulWidget {
|
|||
|
||||
class _OtpPageState extends State<OtpPage> {
|
||||
final List<FocusNode> _focusNodes = List.generate(5, (_) => FocusNode());
|
||||
final List<TextEditingController> _controllers = List.generate(
|
||||
5,
|
||||
(_) => TextEditingController(),
|
||||
);
|
||||
final List<TextEditingController> _controllers =
|
||||
List.generate(5, (_) => TextEditingController());
|
||||
late final OtpTimerHelper _otpTimer;
|
||||
|
||||
bool _hasError = false;
|
||||
String? _errorMessage;
|
||||
|
||||
// ۱. افزودن متغیر وضعیت برای کنترل دکمه
|
||||
bool _isOtpComplete = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_otpTimer = OtpTimerHelper()..startTimer();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
FocusScope.of(context).requestFocus(_focusNodes[0]);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
@ -48,6 +47,136 @@ class _OtpPageState extends State<OtpPage> {
|
|||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(backgroundColor: Colors.transparent, elevation: 0),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Center(child: Assets.icons.logo.svg(height: 160)),
|
||||
const SizedBox(height: 40),
|
||||
Text(
|
||||
"کد یکبار مصرف",
|
||||
style: textTheme.headlineMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Text(
|
||||
"کد تایید به شماره ${widget.phoneNumber} ارسال شد.",
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
color: Colors.grey,
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 15,),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.vector.path),
|
||||
const SizedBox(width: 4),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text("ویرایش شماره همراه",style: TextStyle(color: AppColors.active),),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
_buildOtpFields(),
|
||||
const SizedBox(height: 15),
|
||||
if (_errorMessage != null)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 16.0),
|
||||
child: Center(
|
||||
child: Text(
|
||||
_errorMessage!,
|
||||
style: const TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
else
|
||||
const SizedBox(height: 32),
|
||||
|
||||
BlocConsumer<AuthBloc, AuthState>(
|
||||
listener: (context, state) {
|
||||
if (state is AuthFailure) {
|
||||
setState(() {
|
||||
_hasError = true;
|
||||
_errorMessage = state.message;
|
||||
});
|
||||
}
|
||||
if (state is AuthVerified) {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => const UserInfoPage(),
|
||||
),
|
||||
(route) => false,
|
||||
);
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is AuthLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
onPressed: _isOtpComplete ? _verifyOtp : null,
|
||||
child: const Text("ورود"),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
Assets.icons.clock.path,
|
||||
colorFilter: const ColorFilter.mode(
|
||||
Colors.grey,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
ValueListenableBuilder<bool>(
|
||||
valueListenable: _otpTimer.canResend,
|
||||
builder: (context, canResend, child) {
|
||||
return canResend
|
||||
? TextButton(
|
||||
onPressed: _resendOtp,
|
||||
child: const Text("ارسال مجدد کد",style: TextStyle(color: AppColors.active),),
|
||||
)
|
||||
: ValueListenableBuilder<int>(
|
||||
valueListenable: _otpTimer.remainingSeconds,
|
||||
builder: (context, seconds, child) => Text(
|
||||
"${_otpTimer.formatTime()} تا دریافت مجدد",
|
||||
style: const TextStyle(color: Colors.grey),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildOtpFields() {
|
||||
return Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
|
|
@ -73,21 +202,20 @@ class _OtpPageState extends State<OtpPage> {
|
|||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
borderSide: BorderSide(
|
||||
color:
|
||||
_hasError
|
||||
? Colors.red
|
||||
: (Theme.of(context)
|
||||
.inputDecorationTheme
|
||||
.enabledBorder
|
||||
?.borderSide
|
||||
.color ??
|
||||
AppColors.grey),
|
||||
color: _hasError
|
||||
? Colors.red
|
||||
: (Theme.of(context)
|
||||
.inputDecorationTheme
|
||||
.enabledBorder
|
||||
?.borderSide
|
||||
.color ??
|
||||
Colors.grey),
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
borderSide: BorderSide(
|
||||
color: _hasError ? Colors.red : AppColors.primary,
|
||||
color: _hasError ? Colors.red : AppColors.active,
|
||||
width: 2,
|
||||
),
|
||||
),
|
||||
|
|
@ -105,8 +233,6 @@ class _OtpPageState extends State<OtpPage> {
|
|||
if (value.isEmpty && index > 0) {
|
||||
FocusScope.of(context).requestFocus(_focusNodes[index - 1]);
|
||||
}
|
||||
|
||||
// ۲. بهروزرسانی وضعیت کامل بودن کد
|
||||
final otpCode = _controllers.map((c) => c.text).join();
|
||||
setState(() {
|
||||
_isOtpComplete = otpCode.length == 5;
|
||||
|
|
@ -119,162 +245,10 @@ class _OtpPageState extends State<OtpPage> {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(backgroundColor: Colors.transparent, elevation: 0),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
children: [
|
||||
Center(child: Assets.icons.logo.svg(height: 160)),
|
||||
|
||||
const SizedBox(height: 40),
|
||||
|
||||
Text(
|
||||
"کد یکبار مصرف",
|
||||
style: textTheme.headlineMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
|
||||
const SizedBox(height: 12),
|
||||
|
||||
// --- تغییر اصلی: افزودن دکمه ویرایش شماره ---
|
||||
Text(
|
||||
"کد تایید به شماره ${widget.phoneNumber} ارسال شد.",
|
||||
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
color: Colors.grey,
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.vector.path),
|
||||
Center(
|
||||
child: TextButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text("ویرایش شماره همراه"),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
_buildOtpFields(),
|
||||
const SizedBox(height: 15),
|
||||
|
||||
if (_errorMessage != null)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 16.0),
|
||||
child: Center(
|
||||
child: Text(
|
||||
_errorMessage!,
|
||||
style: const TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
else
|
||||
const SizedBox(height: 40),
|
||||
|
||||
BlocConsumer<AuthBloc, AuthState>(
|
||||
listener: (context, state) {
|
||||
if (state is AuthLoading) {
|
||||
setState(() {
|
||||
_hasError = false;
|
||||
_errorMessage = null;
|
||||
});
|
||||
} else if (state is AuthFailure) {
|
||||
setState(() {
|
||||
_hasError = true;
|
||||
_errorMessage = state.message;
|
||||
});
|
||||
} else if (state is AuthVerified) {
|
||||
if (state is AuthVerified) {
|
||||
// این بخش را از کامنت خارج کنید
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => const UserInfoPage(),
|
||||
),
|
||||
(route) => false,
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is AuthLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
// ۳. شرطی کردن دکمه "ورود"
|
||||
onPressed: _isOtpComplete ? _verifyOtp : null,
|
||||
child: const Text("ورود"),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
Assets.icons.clock.path,
|
||||
colorFilter: const ColorFilter.mode(
|
||||
Colors.grey,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
ValueListenableBuilder<bool>(
|
||||
valueListenable: _otpTimer.canResend,
|
||||
builder: (context, canResend, child) {
|
||||
return canResend
|
||||
? TextButton(
|
||||
onPressed: _resendOtp,
|
||||
child: const Text("ارسال مجدد کد"),
|
||||
)
|
||||
: ValueListenableBuilder<int>(
|
||||
valueListenable: _otpTimer.remainingSeconds,
|
||||
builder:
|
||||
(context, seconds, child) => Text(
|
||||
"${_otpTimer.formatTime()} تا دریافت مجدد",
|
||||
style: const TextStyle(
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _verifyOtp() {
|
||||
final otpCode = _controllers.map((c) => c.text).join();
|
||||
// یک بررسی اضافه میکنیم که اگر دکمه فعال بود حتما کد کامل باشد
|
||||
if (otpCode.length == 5) {
|
||||
context.read<AuthBloc>().add(VerifyOtpEvent(otpCode));
|
||||
context.read<AuthBloc>().add(VerifyOTPEvent(otp: otpCode));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -282,8 +256,12 @@ class _OtpPageState extends State<OtpPage> {
|
|||
setState(() {
|
||||
_hasError = false;
|
||||
_errorMessage = null;
|
||||
for (var controller in _controllers) {
|
||||
controller.clear();
|
||||
}
|
||||
_isOtpComplete = false;
|
||||
});
|
||||
context.read<AuthBloc>().add(SendOtpEvent(widget.phoneNumber));
|
||||
context.read<AuthBloc>().add(SendOTPEvent(phoneNumber: widget.phoneNumber));
|
||||
_otpTimer.resetTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,476 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:maps_launcher/maps_launcher.dart';
|
||||
import 'package:proxibuy/core/config/app_colors.dart';
|
||||
import 'package:proxibuy/core/gen/assets.gen.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
import 'package:proxibuy/data/repositories/offer_repository.dart';
|
||||
import 'package:proxibuy/presentation/product_detail/bloc/product_detail_bloc.dart';
|
||||
import 'package:proxibuy/presentation/product_detail/bloc/product_detail_event.dart';
|
||||
import 'package:proxibuy/presentation/product_detail/bloc/product_detail_state.dart';
|
||||
import 'package:slide_countdown/slide_countdown.dart';
|
||||
|
||||
class ProductDetailPage extends StatelessWidget {
|
||||
final String offerId;
|
||||
|
||||
const ProductDetailPage({super.key, required this.offerId});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocProvider(
|
||||
create: (context) => ProductDetailBloc(
|
||||
offerRepository: context.read<OfferRepository>(),
|
||||
)..add(ProductDetailFetchRequested(offerId: offerId)),
|
||||
child: Scaffold(
|
||||
body: BlocBuilder<ProductDetailBloc, ProductDetailState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProductDetailLoadInProgress || state is ProductDetailInitial) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
if (state is ProductDetailLoadFailure) {
|
||||
return Center(child: Text('خطا: ${state.error}'));
|
||||
}
|
||||
if (state is ProductDetailLoadSuccess) {
|
||||
return ProductDetailView(offer: state.offer);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ProductDetailView extends StatefulWidget {
|
||||
final OfferModel offer;
|
||||
|
||||
const ProductDetailView({super.key, required this.offer});
|
||||
|
||||
@override
|
||||
State<ProductDetailView> createState() => _ProductDetailViewState();
|
||||
}
|
||||
|
||||
class _ProductDetailViewState extends State<ProductDetailView> {
|
||||
late List<String> imageList;
|
||||
late String selectedImage;
|
||||
final String _uploadKey = 'upload_image';
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
imageList = List.from(widget.offer.imageUrls)..add(_uploadKey);
|
||||
selectedImage = imageList.first;
|
||||
}
|
||||
|
||||
void _launchMaps(double lat, double lon, String title) {
|
||||
MapsLauncher.launchCoordinates(lat, lon, title);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: SingleChildScrollView(
|
||||
child: Stack(
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
_buildMainImage(context),
|
||||
const SizedBox(height: 52.5),
|
||||
_buildProductInfo(),
|
||||
],
|
||||
),
|
||||
Positioned(
|
||||
top: 400 - 52.5,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: _buildThumbnailList(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildMainImage(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 400,
|
||||
width: double.infinity,
|
||||
child: AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
transitionBuilder: (child, animation) {
|
||||
return FadeTransition(opacity: animation, child: child);
|
||||
},
|
||||
child: Image.network(
|
||||
selectedImage,
|
||||
key: ValueKey<String>(selectedImage),
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
height: 400,
|
||||
loadingBuilder: (context, child, progress) {
|
||||
return progress == null
|
||||
? child
|
||||
: const Center(child: CircularProgressIndicator());
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 40,
|
||||
left: 16,
|
||||
child: GestureDetector(
|
||||
child: SvgPicture.asset(Assets.icons.back.path),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildThumbnailList() {
|
||||
return Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: Container(
|
||||
height: 105,
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: ListView.separated(
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
itemCount: imageList.length,
|
||||
separatorBuilder: (_, __) => const SizedBox(width: 8),
|
||||
itemBuilder: (context, index) {
|
||||
final img = imageList[index];
|
||||
if (img == _uploadKey) {
|
||||
return _buildUploadButton();
|
||||
}
|
||||
final isSelected = selectedImage == img;
|
||||
return _buildThumbnail(img, isSelected);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildThumbnail(String img, bool isSelected) {
|
||||
const grayscaleMatrix = <double>[
|
||||
0.2126, 0.7152, 0.0722, 0, 0,
|
||||
0.2126, 0.7152, 0.0722, 0, 0,
|
||||
0.2126, 0.7152, 0.0722, 0, 0,
|
||||
0, 0, 0, 1, 0,
|
||||
];
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () => setState(() => selectedImage = img),
|
||||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: isSelected ? AppColors.selectedImg : Colors.transparent,
|
||||
width: 2.5,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.15),
|
||||
blurRadius: 7,
|
||||
spreadRadius: 0,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: ColorFiltered(
|
||||
colorFilter: ColorFilter.matrix(isSelected ? <double>[
|
||||
1, 0, 0, 0, 0,
|
||||
0, 1, 0, 0, 0,
|
||||
0, 0, 1, 0, 0,
|
||||
0, 0, 0, 1, 0,
|
||||
] : grayscaleMatrix),
|
||||
child: Image.network(img, width: 90, height: 90, fit: BoxFit.cover),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildUploadButton() {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
print("Upload image tapped!");
|
||||
},
|
||||
child: Container(
|
||||
width: 90,
|
||||
height: 90,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[200],
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(color: Colors.grey.shade400, width: 1.5),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(9.0),
|
||||
child: SvgPicture.asset(Assets.icons.addImg.path),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildProductInfo() {
|
||||
final remainingDuration = widget.offer.expiryTime.isAfter(DateTime.now())
|
||||
? widget.offer.expiryTime.difference(DateTime.now())
|
||||
: Duration.zero;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24.0).copyWith(bottom: 24.0, top: 24.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(Assets.icons.shop.path, height: 30),
|
||||
const SizedBox(width: 6),
|
||||
Text(widget.offer.storeName, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
_buildInfoRow(icon: Assets.icons.location, text: widget.offer.address),
|
||||
const SizedBox(height: 12),
|
||||
ExpandableInfoRow(
|
||||
icon: Assets.icons.clock,
|
||||
titleWidget: Row(
|
||||
children: [
|
||||
Text(
|
||||
widget.offer.isOpen ? "باز است" : "بسته است",
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
color: widget.offer.isOpen ? Colors.green.shade700 : Colors.red.shade700,
|
||||
fontWeight: FontWeight.normal,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
children: widget.offer.workingHours.map((wh) => Padding(
|
||||
padding: const EdgeInsets.only(right: 10.0, bottom: 8.0, top: 4.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(wh.day, style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold)),
|
||||
wh.isOpen
|
||||
? Text(wh.shifts.map((s) => '${s.openAt} - ${s.closeAt}').join(' | '), style: const TextStyle(fontSize: 15, color: AppColors.hint))
|
||||
: const Text('تعطیل', style: TextStyle(fontSize: 15, color: Colors.red)),
|
||||
],
|
||||
),
|
||||
)).toList(),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () => _launchMaps(widget.offer.latitude, widget.offer.longitude, widget.offer.storeName),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(4.0),
|
||||
child: Row(
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
Assets.icons.map.path,
|
||||
width: 25,
|
||||
height: 25,
|
||||
colorFilter: const ColorFilter.mode(AppColors.button, BlendMode.srcIn),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
const Text('مسیر فروشگاه روی نقشه', style: TextStyle(fontSize: 17, color: AppColors.button)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Container(
|
||||
width: 60,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: const BoxDecoration(
|
||||
color: AppColors.selectedImg,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(8), topRight: Radius.circular(8)),
|
||||
),
|
||||
child: Center(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(widget.offer.rating.toString(), style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 11)),
|
||||
const SizedBox(width: 2),
|
||||
SvgPicture.asset(Assets.icons.star.path, colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 30,
|
||||
width: 60,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[200],
|
||||
borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(8), bottomRight: Radius.circular(8)),
|
||||
),
|
||||
child: Center(child: Text('${widget.offer.ratingCount} نفر', style: const TextStyle(color: Colors.black, fontSize: 11, fontWeight: FontWeight.bold))),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 11),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.singleOfferType,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
child: Text("تخفیف ${widget.offer.discountType}", style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 14)),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Text('(${widget.offer.discount})', style: const TextStyle(fontSize: 16, color: AppColors.singleOfferType, fontWeight: FontWeight.normal)),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
widget.offer.originalPrice.toStringAsFixed(0),
|
||||
style: TextStyle(fontSize: 16, color: Colors.grey.shade600, decoration: TextDecoration.lineThrough),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 1),
|
||||
Text('${widget.offer.finalPrice.toStringAsFixed(0)} تومان', style: const TextStyle(color: AppColors.singleOfferType, fontSize: 22, fontWeight: FontWeight.bold)),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
_buildInfoRow(icon: Assets.icons.timerPause, text: "مهلت استفاده از تخفیف"),
|
||||
const SizedBox(height: 10),
|
||||
if (remainingDuration > Duration.zero)
|
||||
Column(
|
||||
children: [
|
||||
Localizations.override(
|
||||
context: context,
|
||||
locale: const Locale('en'),
|
||||
child: SlideCountdown(
|
||||
duration: remainingDuration,
|
||||
slideDirection: SlideDirection.up,
|
||||
separator: ':',
|
||||
style: const TextStyle(
|
||||
fontSize: 85,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppColors.countdown,
|
||||
),
|
||||
separatorStyle: const TextStyle(
|
||||
fontSize: 40,
|
||||
color: AppColors.countdown,
|
||||
),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
),
|
||||
shouldShowDays: (duration) => duration.inDays > 0,
|
||||
),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 60.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("ثانیه", style: TextStyle(fontSize: 14, color: AppColors.selectedImg)),
|
||||
Text("دقیقه", style: TextStyle(fontSize: 14, color: AppColors.selectedImg)),
|
||||
Text("ساعت", style: TextStyle(fontSize: 14, color: AppColors.selectedImg)),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildInfoRow({required SvgGenImage icon, required String text}) {
|
||||
return Row(
|
||||
children: [
|
||||
SvgPicture.asset(icon.path, width: 22, height: 22, colorFilter: ColorFilter.mode(Colors.grey.shade600, BlendMode.srcIn)),
|
||||
const SizedBox(width: 6),
|
||||
Expanded(child: Text(text, style: const TextStyle(fontSize: 16, color: AppColors.hint))),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ExpandableInfoRow extends StatefulWidget {
|
||||
final SvgGenImage icon;
|
||||
final Widget titleWidget;
|
||||
final List<Widget> children;
|
||||
|
||||
const ExpandableInfoRow({
|
||||
super.key,
|
||||
required this.icon,
|
||||
required this.titleWidget,
|
||||
this.children = const [],
|
||||
});
|
||||
|
||||
@override
|
||||
State<ExpandableInfoRow> createState() => _ExpandableInfoRowState();
|
||||
}
|
||||
|
||||
class _ExpandableInfoRowState extends State<ExpandableInfoRow> {
|
||||
bool _isExpanded = false;
|
||||
|
||||
void _toggleExpand() {
|
||||
if (widget.children.isNotEmpty) {
|
||||
setState(() {
|
||||
_isExpanded = !_isExpanded;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: _toggleExpand,
|
||||
child: Row(
|
||||
children: [
|
||||
SvgPicture.asset(widget.icon.path, width: 22, height: 22, colorFilter: ColorFilter.mode(Colors.grey.shade600, BlendMode.srcIn)),
|
||||
const SizedBox(width: 6),
|
||||
Expanded(child: widget.titleWidget),
|
||||
if (widget.children.isNotEmpty)
|
||||
AnimatedRotation(
|
||||
turns: _isExpanded ? 0.5 : 0,
|
||||
duration: const Duration(milliseconds: 200),
|
||||
child: const Icon(Icons.keyboard_arrow_down, color: Colors.black),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
AnimatedCrossFade(
|
||||
firstChild: Container(),
|
||||
secondChild: Column(children: widget.children),
|
||||
crossFadeState: _isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,6 @@ import 'package:proxibuy/presentation/auth/bloc/auth_bloc.dart';
|
|||
import 'package:proxibuy/presentation/pages/notification_preferences_page.dart';
|
||||
import '../../core/config/app_colors.dart';
|
||||
import '../../core/gen/assets.gen.dart';
|
||||
import 'offers_page.dart'; // صفحه اصلی بعد از ورود
|
||||
|
||||
class UserInfoPage extends StatefulWidget {
|
||||
const UserInfoPage({super.key});
|
||||
|
|
@ -16,7 +15,7 @@ class UserInfoPage extends StatefulWidget {
|
|||
|
||||
class _UserInfoPageState extends State<UserInfoPage> {
|
||||
final _nameController = TextEditingController();
|
||||
String _selectedGender = 'مرد'; // مقدار پیشفرض
|
||||
String _selectedGender = 'مرد';
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
|
|
@ -24,7 +23,6 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
super.dispose();
|
||||
}
|
||||
|
||||
// ویجت برای ساخت دکمههای رادیویی جنسیت
|
||||
Widget _buildGenderRadio(String title, String value) {
|
||||
return InkWell(
|
||||
onTap: () => setState(() => _selectedGender = value),
|
||||
|
|
@ -34,9 +32,8 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
Radio<String>(
|
||||
value: value,
|
||||
groupValue: _selectedGender,
|
||||
onChanged:
|
||||
(newValue) => setState(() => _selectedGender = newValue!),
|
||||
activeColor: AppColors.active,
|
||||
onChanged: (newValue) => setState(() => _selectedGender = newValue!),
|
||||
activeColor: AppColors.primary,
|
||||
),
|
||||
Text(title, style: const TextStyle(color: Colors.grey)),
|
||||
],
|
||||
|
|
@ -51,19 +48,17 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
return Scaffold(
|
||||
body: Stack(
|
||||
children: [
|
||||
// لایه پسزمینه: عکس
|
||||
Positioned.fill(
|
||||
child: Image.asset(
|
||||
Assets.images.userinfo.path, // یک عکس پسزمینه دلخواه
|
||||
Assets.images.userinfo.path,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
|
||||
// لایه رویی: باتم شیت ثابت
|
||||
DraggableScrollableSheet(
|
||||
initialChildSize: 0.50, // ارتفاع اولیه باتم شیت (۶۵٪ صفحه)
|
||||
minChildSize: 0.50, // حداقل ارتفاع
|
||||
maxChildSize: 0.50, // حداکثر ارتفاع هنگام اسکرول
|
||||
initialChildSize: 0.50,
|
||||
minChildSize: 0.50,
|
||||
maxChildSize: 0.50,
|
||||
builder: (context, scrollController) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
|
|
@ -81,15 +76,15 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
width: 50,
|
||||
height: 5,
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.grey.withOpacity(0.5),
|
||||
color:Colors.grey.withOpacity(0.5),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 40),
|
||||
// فیلد نام و نام خانوادگی
|
||||
const SizedBox(height: 40),
|
||||
TextField(
|
||||
controller: _nameController,
|
||||
textAlign: TextAlign.right,
|
||||
decoration: const InputDecoration(
|
||||
labelText: "دوست داری با چه اسمی صدات کنیم؟",
|
||||
labelStyle: TextStyle(
|
||||
|
|
@ -97,15 +92,11 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
fontSize: 20,
|
||||
),
|
||||
hintText: "مثلا نام کوچک شما",
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 15,
|
||||
color: Colors.grey
|
||||
)
|
||||
hintStyle: TextStyle(fontSize: 15, color: Colors.grey),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
|
||||
// بخش انتخاب جنسیت
|
||||
Text(
|
||||
"جنسیت",
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
|
|
@ -119,24 +110,22 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
children: [
|
||||
_buildGenderRadio('مرد', 'مرد'),
|
||||
_buildGenderRadio('زن', 'زن'),
|
||||
_buildGenderRadio('تمایلی به پاسخ ندارم', 'تمایلی به پاسخ ندارم'),
|
||||
_buildGenderRadio('تمایلی به پاسخ ندارم', 'نامشخص'),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 70),
|
||||
|
||||
// دکمه ادامه
|
||||
BlocConsumer<AuthBloc, AuthState>(
|
||||
listener: (context, state) {
|
||||
if (state is UserInfoUpdateSuccess) {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (_) => const OffersPage()),
|
||||
(route) => false,
|
||||
);
|
||||
} else if (state is AuthFailure) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(state.message), backgroundColor: Colors.red)
|
||||
);
|
||||
}
|
||||
if (state is UserInfoSaved) {
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(builder: (_) => const NotificationPreferencesPage()),
|
||||
);
|
||||
} else if (state is AuthFailure) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(state.message), backgroundColor: Colors.red),
|
||||
);
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is AuthLoading) {
|
||||
|
|
@ -145,25 +134,23 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
return SizedBox(
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
// ۱. تغییر رنگ دکمه به سبز
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.confirm,
|
||||
backgroundColor: AppColors.confirm,
|
||||
foregroundColor: Colors.white,
|
||||
),
|
||||
onPressed: () {
|
||||
context.read<AuthBloc>().add(UpdateUserInfoEvent(
|
||||
name: _nameController.text,
|
||||
gender: _selectedGender,
|
||||
));
|
||||
context.read<AuthBloc>().add(SaveUserInfoEvent(
|
||||
name: _nameController.text,
|
||||
gender: _selectedGender,
|
||||
));
|
||||
},
|
||||
child: const Text("اعمال"),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
|
||||
const SizedBox(height: 9),
|
||||
|
||||
// ۲. افزودن دکمه رد کردن
|
||||
|
||||
Center(
|
||||
child: TextButton(
|
||||
onPressed: () {
|
||||
|
|
@ -185,4 +172,4 @@ class _UserInfoPageState extends State<UserInfoPage> {
|
|||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
import 'package:proxibuy/data/repositories/offer_repository.dart';
|
||||
import 'package:proxibuy/presentation/product_detail/bloc/product_detail_event.dart';
|
||||
import 'package:proxibuy/presentation/product_detail/bloc/product_detail_state.dart';
|
||||
|
||||
|
||||
class ProductDetailBloc extends Bloc<ProductDetailEvent, ProductDetailState> {
|
||||
final OfferRepository _offerRepository;
|
||||
|
||||
ProductDetailBloc({required OfferRepository offerRepository})
|
||||
: _offerRepository = offerRepository,
|
||||
super(ProductDetailInitial()) {
|
||||
on<ProductDetailFetchRequested>(_onFetchRequested);
|
||||
}
|
||||
|
||||
Future<void> _onFetchRequested(
|
||||
ProductDetailFetchRequested event,
|
||||
Emitter<ProductDetailState> emit,
|
||||
) async {
|
||||
emit(ProductDetailLoadInProgress());
|
||||
try {
|
||||
// از ریپازیتوری میخواهیم که محصول با این ID را به ما بدهد
|
||||
final offer = await _offerRepository.fetchOfferById(event.offerId);
|
||||
if (offer != null) {
|
||||
emit(ProductDetailLoadSuccess(offer));
|
||||
} else {
|
||||
emit(const ProductDetailLoadFailure('محصول مورد نظر یافت نشد.'));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ProductDetailLoadFailure(e.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class ProductDetailEvent extends Equatable {
|
||||
const ProductDetailEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
// این ایونت زمانی فراخوانی میشود که بخواهیم جزئیات یک محصول را دریافت کنیم
|
||||
class ProductDetailFetchRequested extends ProductDetailEvent {
|
||||
final String offerId;
|
||||
|
||||
const ProductDetailFetchRequested({required this.offerId});
|
||||
|
||||
@override
|
||||
List<Object> get props => [offerId];
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
import 'package:equatable/equatable.dart';
|
||||
import 'package:proxibuy/data/models/offer_model.dart';
|
||||
|
||||
abstract class ProductDetailState extends Equatable {
|
||||
const ProductDetailState();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class ProductDetailInitial extends ProductDetailState {}
|
||||
|
||||
class ProductDetailLoadInProgress extends ProductDetailState {}
|
||||
|
||||
class ProductDetailLoadSuccess extends ProductDetailState {
|
||||
final OfferModel offer;
|
||||
|
||||
const ProductDetailLoadSuccess(this.offer);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [offer];
|
||||
}
|
||||
|
||||
class ProductDetailLoadFailure extends ProductDetailState {
|
||||
final String error;
|
||||
|
||||
const ProductDetailLoadFailure(this.error);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [error];
|
||||
}
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
// lib/presentation/widgets/gps_dialog.dart
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
|
|
@ -8,7 +7,7 @@ import 'package:proxibuy/core/gen/assets.gen.dart';
|
|||
Future<void> showGPSDialog(BuildContext context) async {
|
||||
bool isLocationEnabled = await Geolocator.isLocationServiceEnabled();
|
||||
if (!isLocationEnabled) {
|
||||
showDialog(
|
||||
await showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
|
|
@ -42,7 +41,7 @@ Future<void> showGPSDialog(BuildContext context) async {
|
|||
const Text(
|
||||
"برای اینکه بتونیم تخفیفهای اطرافت رو سریع بهت اطلاع بدیم، اجازه بده به موقعیت مکانیت دسترسی داشته باشیم.",
|
||||
style: TextStyle(
|
||||
color: AppColors.hint,
|
||||
color: AppColors.hint,
|
||||
fontSize: 16,
|
||||
),
|
||||
textAlign: TextAlign.start,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,123 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:proxibuy/core/config/app_colors.dart';
|
||||
import 'package:proxibuy/core/gen/assets.gen.dart';
|
||||
|
||||
Future<void> showNotificationPermissionDialog(BuildContext context) async {
|
||||
final status = await Permission.notification.status;
|
||||
if (status.isGranted) {
|
||||
return;
|
||||
}
|
||||
|
||||
await showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext dialogContext) {
|
||||
return Dialog(
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
|
||||
elevation: 10,
|
||||
backgroundColor: Colors.white,
|
||||
child: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
alignment: Alignment.topCenter,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 50,
|
||||
left: 20,
|
||||
right: 20,
|
||||
bottom: 20,
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
const Text(
|
||||
"دسترسی به اعلانها",
|
||||
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
const Text(
|
||||
"وقتی یه تخفیف جذاب از فروشگاههای مورد علاقهات فعال بشه، با یه اعلان فورا خبرت میکنیم. فقط کافیه اجازه ارسال اعلان رو بدی.",
|
||||
style: TextStyle(
|
||||
color: AppColors.hint,
|
||||
fontSize: 16,
|
||||
height: 1.5,
|
||||
),
|
||||
textAlign: TextAlign.start,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () => Navigator.of(dialogContext).pop(),
|
||||
child: Text(
|
||||
"الان نه",
|
||||
style: TextStyle(
|
||||
color: AppColors.primary,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.primary,
|
||||
foregroundColor: Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: const BorderSide(color: AppColors.border),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 45,
|
||||
vertical: 7,
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
final result =
|
||||
await Permission.notification.request();
|
||||
if (result.isGranted) {
|
||||
Navigator.of(dialogContext).pop();
|
||||
} else {
|
||||
openAppSettings();
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"فعالسازی",
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: -40,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
blurRadius: 8,
|
||||
offset: const Offset(0, 4),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: CircleAvatar(
|
||||
backgroundColor: Colors.white,
|
||||
radius: 40,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12.0),
|
||||
child: SvgPicture.asset(Assets.icons.volumeHigh.path),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
|
@ -7,9 +7,17 @@
|
|||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <flutter_localization/flutter_localization_plugin.h>
|
||||
#include <maps_launcher/maps_launcher_plugin.h>
|
||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||
|
||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||
g_autoptr(FlPluginRegistrar) flutter_localization_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterLocalizationPlugin");
|
||||
flutter_localization_plugin_register_with_registrar(flutter_localization_registrar);
|
||||
g_autoptr(FlPluginRegistrar) maps_launcher_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "MapsLauncherPlugin");
|
||||
maps_launcher_plugin_register_with_registrar(maps_launcher_registrar);
|
||||
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
|
||||
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
flutter_localization
|
||||
maps_launcher
|
||||
url_launcher_linux
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
|
|
|
|||
|
|
@ -7,10 +7,18 @@ import Foundation
|
|||
|
||||
import flutter_localization
|
||||
import geolocator_apple
|
||||
import maps_launcher
|
||||
import path_provider_foundation
|
||||
import shared_preferences_foundation
|
||||
import sqflite_darwin
|
||||
import url_launcher_macos
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
FlutterLocalizationPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalizationPlugin"))
|
||||
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
||||
MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin"))
|
||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||
}
|
||||
|
|
|
|||
276
pubspec.lock
|
|
@ -121,6 +121,30 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.10.1"
|
||||
cached_network_image:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cached_network_image
|
||||
sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.1"
|
||||
cached_network_image_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_platform_interface
|
||||
sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.1"
|
||||
cached_network_image_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_web
|
||||
sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -154,7 +178,7 @@ packages:
|
|||
source: hosted
|
||||
version: "4.10.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
|
|
@ -278,6 +302,14 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_animate:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_animate
|
||||
sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.2"
|
||||
flutter_bloc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -286,6 +318,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.1.1"
|
||||
flutter_cache_manager:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_cache_manager
|
||||
sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.1"
|
||||
flutter_gen:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -331,6 +371,14 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_shaders:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_shaders
|
||||
sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -533,6 +581,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
maps_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: maps_launcher
|
||||
sha256: dac4c609720211fa6336b5903d917fe45e545c6b5665978efc3db2a3f436b1ae
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0+1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -573,6 +629,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
octo_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: octo_image
|
||||
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -597,6 +661,30 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.17"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -621,6 +709,62 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
pausable_timer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pausable_timer
|
||||
sha256: "6ef1a95441ec3439de6fb63f39a011b67e693198e7dae14e20675c3c00e86074"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0+3"
|
||||
permission_handler:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: permission_handler
|
||||
sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.0.0+1"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "13.0.1"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_apple
|
||||
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.4.7"
|
||||
permission_handler_html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_html
|
||||
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3+5"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
permission_handler_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_windows
|
||||
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -685,8 +829,16 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
shared_preferences:
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.28.0"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5"
|
||||
|
|
@ -762,6 +914,14 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
slide_countdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: slide_countdown
|
||||
sha256: "363914f96389502467d4dc9c0f26e88f93df3d8e37de2d5ff05b16d981fe973d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -778,6 +938,46 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
sqflite:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite
|
||||
sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
sqflite_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_android
|
||||
sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
sqflite_common:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_common
|
||||
sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.5"
|
||||
sqflite_darwin:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_darwin
|
||||
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
sqflite_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_platform_interface
|
||||
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -810,6 +1010,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: synchronized
|
||||
sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -858,6 +1066,70 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.2"
|
||||
url_launcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.16"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.3"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.2"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.4"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -42,6 +42,13 @@ dependencies:
|
|||
flutter_gen: ^5.10.0
|
||||
country_picker: ^2.0.27
|
||||
geolocator: ^14.0.1
|
||||
permission_handler: ^12.0.0+1
|
||||
cached_network_image: ^3.4.1
|
||||
collection: ^1.19.1
|
||||
shared_preferences: ^2.5.3
|
||||
flutter_animate: ^4.5.2
|
||||
maps_launcher: ^3.0.0+1
|
||||
slide_countdown: ^2.0.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
|
|||
|
|
@ -8,10 +8,19 @@
|
|||
|
||||
#include <flutter_localization/flutter_localization_plugin_c_api.h>
|
||||
#include <geolocator_windows/geolocator_windows.h>
|
||||
#include <maps_launcher/maps_launcher_plugin.h>
|
||||
#include <permission_handler_windows/permission_handler_windows_plugin.h>
|
||||
#include <url_launcher_windows/url_launcher_windows.h>
|
||||
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
FlutterLocalizationPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FlutterLocalizationPluginCApi"));
|
||||
GeolocatorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("GeolocatorWindows"));
|
||||
MapsLauncherPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("MapsLauncherPlugin"));
|
||||
PermissionHandlerWindowsPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
|
||||
UrlLauncherWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@
|
|||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
flutter_localization
|
||||
geolocator_windows
|
||||
maps_launcher
|
||||
permission_handler_windows
|
||||
url_launcher_windows
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
|
|
|
|||