Compare commits

...

55 Commits

Author SHA1 Message Date
poojapandeyx
1e47dd914a Merge pull request #103 from WDI-Ideas/pooja1
Pooja1
2024-07-12 19:45:48 +05:30
poojapandeyx
c60ca32d82 api integrated 2024-07-12 19:46:59 +05:30
poojapandeyx
a1692d81b2 register with mobile api body change 2024-07-12 11:58:03 +05:30
poojapandeyx
f657db89af register with mobile number change 2024-07-12 11:56:27 +05:30
Jayesh jain
925427a8ae Merge pull request #101 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-12 09:15:28 +05:30
jayesh
b02c960cc8 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-12 09:15:03 +05:30
Jayesh jain
0d50087d63 Merge pull request #100 from WDI-Ideas/jayeshjain25
Merge pull request #99 from WDI-Ideas/main
2024-07-12 09:14:56 +05:30
jayesh
2345ce8496 changes 2024-07-12 09:14:15 +05:30
Jayesh jain
ba9d545deb Merge pull request #99 from WDI-Ideas/main
Merge pull request #98 from WDI-Ideas/jayeshjain25
2024-07-11 20:19:38 +05:30
Jayesh jain
efb9f7c4c6 Merge pull request #98 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-11 20:19:07 +05:30
Jayesh jain
41ffd38c38 Merge pull request #97 from WDI-Ideas/jayeshjain25
Merge pull request #96 from WDI-Ideas/main
2024-07-11 20:18:29 +05:30
jayesh
40cfcc3f21 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-11 20:18:27 +05:30
Jayesh jain
58eb038b58 Merge pull request #96 from WDI-Ideas/main
api integration
2024-07-11 20:17:49 +05:30
jayesh
b4bc63a5b2 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-11 20:17:47 +05:30
Jayesh jain
9913f505ec Merge pull request #95 from WDI-Ideas/jayeshjain25
Merge pull request #91 from WDI-Ideas/main
2024-07-11 20:17:20 +05:30
jayesh
cd7861f041 deposit new ui 2024-07-11 20:16:37 +05:30
poojapandeyx
5063d1a2dd Merge pull request #94 from WDI-Ideas/pooja1
Pooja1
2024-07-11 19:46:42 +05:30
poojapandeyx
acf7f8980f otp flow 2024-07-11 19:36:40 +05:30
poojapandeyx
a24febc95d project structure 2024-07-11 11:05:57 +05:30
poojapandeyx
63f7c7ad94 get country api 2024-07-11 10:53:25 +05:30
poojapandeyx
f58c5cfb49 Merge pull request #92 from WDI-Ideas/pooja
Pooja
2024-07-11 10:52:18 +05:30
poojapandeyx
feb9aa2efd get country api 2024-07-11 10:51:29 +05:30
Jayesh jain
8ab2dd590f Merge pull request #91 from WDI-Ideas/main
Merge pull request #90 from WDI-Ideas/jayeshjain25
2024-07-10 20:36:33 +05:30
Jayesh jain
89c8bc1c5d Merge pull request #90 from WDI-Ideas/jayeshjain25
language localization
2024-07-10 20:35:46 +05:30
jayesh
6feefde6e2 language localization 2024-07-10 20:35:18 +05:30
poojapandeyx
be54cca41d get country api 2024-07-10 17:38:29 +05:30
poojapandeyx
da3a50e0b3 get country api 2024-07-10 17:37:12 +05:30
poojapandeyx
05e48ebbbe get country api 2024-07-10 17:34:49 +05:30
Jayesh jain
663d6726c0 Merge pull request #89 from WDI-Ideas/jayeshjain25
language localization
2024-07-10 07:33:08 +05:30
jayesh
815b58e552 language localization 2024-07-10 07:32:29 +05:30
Jayesh jain
0ab7bb6df0 Merge pull request #88 from WDI-Ideas/jayeshjain25
language localization
2024-07-09 14:57:07 +05:30
jayesh
11d0d3cf8b language localization 2024-07-09 14:56:23 +05:30
Jayesh jain
c830e4d09c Merge pull request #87 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-05 15:39:42 +05:30
jayesh
62199ed13a Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-05 15:39:11 +05:30
Jayesh jain
97e856c34a Merge pull request #86 from WDI-Ideas/jayeshjain25
Merge pull request #85 from WDI-Ideas/main
2024-07-05 15:38:55 +05:30
jayesh
03a5dcbdd9 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-05 15:38:05 +05:30
Jayesh jain
3e1077aad4 Merge pull request #85 from WDI-Ideas/main
bug fixing
2024-07-05 15:37:59 +05:30
Jayesh jain
3ada52d835 Merge pull request #84 from WDI-Ideas/jayeshjain25
Merge pull request #82 from WDI-Ideas/main
2024-07-05 15:37:25 +05:30
jayesh
1a6858d34f fingerprint auth added 2024-07-05 15:36:29 +05:30
harshmishraGithub
f009e1b680 Merge pull request #83 from WDI-Ideas/harsh_mishra
bug fixing
2024-07-04 11:05:58 +05:30
Harsh Mishra
481391561d bug fixing 2024-07-04 11:05:07 +05:30
Jayesh jain
388b02deb0 Merge pull request #82 from WDI-Ideas/main
Merge pull request #81 from WDI-Ideas/jayeshjain25
2024-07-03 18:51:25 +05:30
Jayesh jain
9ce5a9bfb4 Merge pull request #81 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-03 18:50:34 +05:30
jayesh
f4a1f2dfb3 fingerprint auth added 2024-07-03 18:50:05 +05:30
jayesh
d9c4711cef fingerprint auth added 2024-07-03 18:46:18 +05:30
meet2711
cc994f5e3b Merge pull request #80 from WDI-Ideas/meet
changes donee
2024-06-28 18:47:59 +05:30
meet2711
42776882e7 changes donee 2024-06-28 18:47:34 +05:30
meet2711
e656945376 Merge pull request #79 from WDI-Ideas/meet
changes done
2024-06-27 19:35:17 +05:30
meet2711
34b40aeb53 changes done 2024-06-27 19:34:54 +05:30
meet2711
c7b0be1ba3 Merge pull request #78 from WDI-Ideas/meet
text changes done
2024-06-26 19:33:14 +05:30
meet2711
3129d4c1de text changes done 2024-06-26 19:32:56 +05:30
meet2711
167afce823 Merge pull request #77 from WDI-Ideas/meet
changes done
2024-06-25 19:35:14 +05:30
meet2711
64797a4946 changes done 2024-06-25 19:34:44 +05:30
meet2711
495b70037a Merge pull request #76 from WDI-Ideas/meet
minor changes done
2024-06-24 19:27:39 +05:30
meet2711
e2f9d384cb minor changes done 2024-06-24 19:27:15 +05:30
188 changed files with 5063 additions and 2283 deletions

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"dart.flutterSdkPath": "D:\\pooja\\fluttersdk\\flutter_3.22.2\\flutter"
}

View File

@@ -1,5 +1,5 @@
package com.example.tanami_app
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.android.FlutterFragmentActivity
class MainActivity: FlutterActivity()
class MainActivity: FlutterFragmentActivity()

View File

@@ -0,0 +1,4 @@
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" width="40" height="40" rx="20" fill="#DBF1E4"/>
<path d="M19.88 26.5V15.42L17.58 15.96V14L20.96 12.5H22.54V26.5H19.88Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 252 B

View File

@@ -0,0 +1,4 @@
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" width="40" height="40" rx="20" fill="#DBF1E4"/>
<path d="M15.52 26.5V24.64C16.3733 23.9333 17.2 23.2333 18 22.54C18.8133 21.8467 19.5333 21.16 20.16 20.48C20.8 19.8 21.3067 19.14 21.68 18.5C22.0667 17.8467 22.26 17.2133 22.26 16.6C22.26 16.0267 22.1 15.52 21.78 15.08C21.4733 14.64 20.96 14.42 20.24 14.42C19.5067 14.42 18.9533 14.66 18.58 15.14C18.2067 15.62 18.02 16.2 18.02 16.88H15.54C15.5667 15.8533 15.7933 15 16.22 14.32C16.6467 13.6267 17.2133 13.1133 17.92 12.78C18.6267 12.4333 19.42 12.26 20.3 12.26C21.7267 12.26 22.8333 12.6533 23.62 13.44C24.42 14.2133 24.82 15.22 24.82 16.46C24.82 17.2333 24.64 17.9867 24.28 18.72C23.9333 19.4533 23.4733 20.16 22.9 20.84C22.3267 21.52 21.7067 22.16 21.04 22.76C20.3733 23.3467 19.7267 23.8933 19.1 24.4H25.16V26.5H15.52Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 905 B

View File

@@ -0,0 +1,4 @@
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" width="40" height="40" rx="20" fill="#DBF1E4"/>
<path d="M20.44 26.74C19.52 26.74 18.6867 26.58 17.94 26.26C17.1933 25.9267 16.5933 25.42 16.14 24.74C15.6867 24.06 15.4467 23.2067 15.42 22.18H17.94C17.9533 22.86 18.1733 23.4333 18.6 23.9C19.04 24.3533 19.6533 24.58 20.44 24.58C21.1867 24.58 21.76 24.3733 22.16 23.96C22.56 23.5467 22.76 23.0267 22.76 22.4C22.76 21.6667 22.4933 21.1133 21.96 20.74C21.44 20.3533 20.7667 20.16 19.94 20.16H18.9V18.06H19.96C20.64 18.06 21.2067 17.9 21.66 17.58C22.1133 17.26 22.34 16.7867 22.34 16.16C22.34 15.64 22.1667 15.2267 21.82 14.92C21.4867 14.6 21.02 14.44 20.42 14.44C19.7667 14.44 19.2533 14.6333 18.88 15.02C18.52 15.4067 18.32 15.88 18.28 16.44H15.78C15.8333 15.1467 16.28 14.1267 17.12 13.38C17.9733 12.6333 19.0733 12.26 20.42 12.26C21.38 12.26 22.1867 12.4333 22.84 12.78C23.5067 13.1133 24.0067 13.56 24.34 14.12C24.6867 14.68 24.86 15.3 24.86 15.98C24.86 16.7667 24.64 17.4333 24.2 17.98C23.7733 18.5133 23.24 18.8733 22.6 19.06C23.3867 19.22 24.0267 19.6067 24.52 20.22C25.0133 20.82 25.26 21.58 25.26 22.5C25.26 23.2733 25.0733 23.98 24.7 24.62C24.3267 25.26 23.78 25.7733 23.06 26.16C22.3533 26.5467 21.48 26.74 20.44 26.74Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,13 +1,13 @@
<svg width="393" height="852" viewBox="0 0 393 852" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_870_81037" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="-84" y="-145" width="539" height="1083">
<rect x="-83.6155" y="928.732" width="1073.61" height="520.354" transform="rotate(-89.0361 -83.6155 928.732)" fill="#D9D9D9"/>
<mask id="mask0_491_19657" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="-84" y="-145" width="539" height="1083">
<rect x="-83.6152" y="928.732" width="1073.61" height="520.354" transform="rotate(-89.0361 -83.6152 928.732)" fill="#D9D9D9"/>
</mask>
<g mask="url(#mask0_870_81037)">
<path d="M-235.912 890.946L-204.615 -68.0479L539.36 -43.7681C551.504 -43.3718 561.027 -33.206 560.63 -21.0622L530.769 893.955C530.372 906.099 520.207 915.622 508.063 915.226L-235.912 890.946Z" fill="#004717"/>
<g mask="url(#mask0_491_19657)">
<path d="M-235.912 890.946L-204.615 -68.0479L539.359 -43.7681C551.503 -43.3718 561.026 -33.206 560.63 -21.0622L530.768 893.955C530.372 906.099 520.206 915.622 508.062 915.226L-235.912 890.946Z" fill="#002F0F"/>
<g opacity="0.03">
<path d="M-27.2757 244.241C-21.9062 320.358 24.1712 450.218 69.6501 530.909C77.9484 545.66 92.0023 556.298 108.357 560.371L117.357 562.677C121.191 563.587 125.123 564.316 129.123 564.499C222.626 568.246 386.666 514.463 457.957 477.626C464.907 474.043 471.141 469.257 476.386 463.353L478.984 460.446C490.979 447.12 497.122 429.461 495.842 411.631C488.938 317.313 446.194 196.018 402.489 118.153C394.151 103.264 380.097 92.6263 363.566 88.458L358.577 87.1566C352.072 85.5009 345.431 84.9374 338.655 85.4663C224.698 94.8961 83.3372 140.438 7.1016 181.36C1.48167 184.38 -3.72658 188.323 -8.32792 192.827C-21.819 206.392 -28.6841 225.175 -27.3637 244.193" fill="#FBFBF6"/>
<path d="M-167.004 355.133C-161.634 431.25 -115.557 561.111 -70.078 641.802C-61.7797 656.552 -47.6769 667.1 -31.3706 671.263L-22.3713 673.57C-18.5369 674.479 -14.6049 675.209 -10.605 675.392C82.8981 679.139 246.938 625.355 318.229 588.518C325.179 584.935 331.413 580.149 336.658 574.245L339.256 571.338C351.251 558.013 357.394 540.353 356.114 522.524C349.21 428.206 306.466 306.911 262.761 229.045C254.423 214.157 240.369 203.519 223.838 199.351L218.849 198.049C212.344 196.393 205.703 195.83 198.927 196.359C84.9696 205.789 -56.3909 251.33 -132.626 292.253C-138.246 295.273 -143.455 299.215 -148.056 303.719C-161.547 317.284 -168.412 336.068 -167.092 355.085" fill="black"/>
<path d="M462.972 612.8C470.146 599.547 473.573 584.381 472.452 569.202C465.07 466.932 418.089 342.527 377.528 270.211C367.515 252.317 350.28 239.141 330.453 234.121L325.464 232.82C317.355 230.762 309.276 230.12 301.278 230.803C181.942 240.703 38.5989 288.435 -35.6527 328.217C-42.514 331.847 -48.8362 336.586 -54.3362 342.119C-70.6016 358.496 -78.9785 381.124 -77.3801 404.256C-71.5733 487.138 -21.6391 620.602 21.2433 696.623C31.217 714.378 48.3246 727.369 68.1523 732.389L77.1516 734.695C82.1891 735.906 86.884 736.699 91.5586 736.898C186.138 740.761 350.765 687.995 427.031 648.488C435.408 644.162 442.99 638.357 449.369 631.201L451.967 628.294C456.265 623.509 459.995 618.3 463.021 612.71M-44.4269 373.246C-42.0844 368.919 -39.1254 364.924 -35.5988 361.354C-32.0234 357.694 -27.8899 354.685 -23.5113 352.275C48.3945 313.672 187.212 267.57 302.841 257.996C307.946 257.611 313.197 258.006 318.411 259.313L323.4 260.614C336.322 263.878 347.537 272.397 354.072 284.094C393.252 353.914 438.536 473.67 445.689 571.736C446.681 585.68 441.816 599.717 432.37 610.226L429.772 613.133C425.572 617.737 420.686 621.504 415.252 624.392C343.315 661.58 182.061 713.373 93.1441 709.777C90.3569 709.668 87.3151 709.187 84.1066 708.383L75.1073 706.076C62.1856 702.813 51.1459 694.389 44.6015 682.919C-2.88587 598.577 -45.5659 472.537 -50.5777 401.859C-51.2824 391.802 -49.1119 381.902 -44.4269 373.246Z" fill="#747474"/>
<path d="M-27.2757 244.241C-21.9062 320.358 24.1712 450.218 69.6501 530.909C77.9484 545.66 92.0024 556.298 108.357 560.371L117.357 562.677C121.191 563.587 125.123 564.316 129.123 564.499C222.626 568.246 386.666 514.463 457.957 477.626C464.907 474.043 471.141 469.257 476.386 463.353L478.984 460.446C490.979 447.12 497.122 429.461 495.842 411.631C488.938 317.313 446.194 196.018 402.489 118.153C394.151 103.264 380.097 92.6263 363.566 88.458L358.577 87.1566C352.072 85.5009 345.431 84.9374 338.655 85.4663C224.698 94.8961 83.3372 140.438 7.10159 181.36C1.48167 184.38 -3.72657 188.323 -8.32793 192.827C-21.819 206.392 -28.6841 225.175 -27.3637 244.193" fill="#FBFBF6"/>
<path d="M-167.003 355.133C-161.634 431.25 -115.556 561.111 -70.0775 641.802C-61.7792 656.552 -47.6764 667.1 -31.3701 671.263L-22.3708 673.57C-18.5364 674.479 -14.6044 675.209 -10.6045 675.392C82.8986 679.139 246.938 625.355 318.23 588.518C325.179 584.935 331.413 580.149 336.659 574.245L339.257 571.338C351.252 558.013 357.395 540.353 356.115 522.524C349.21 428.206 306.467 306.911 262.761 229.045C254.423 214.157 240.369 203.519 223.838 199.351L218.849 198.049C212.345 196.393 205.704 195.83 198.927 196.359C84.9701 205.789 -56.3904 251.33 -132.626 292.253C-138.246 295.273 -143.454 299.215 -148.055 303.719C-161.547 317.284 -168.412 336.068 -167.091 355.085" fill="black"/>
<path d="M462.972 612.8C470.146 599.547 473.573 584.381 472.452 569.202C465.07 466.932 418.089 342.527 377.528 270.211C367.515 252.317 350.281 239.141 330.453 234.121L325.464 232.82C317.355 230.762 309.277 230.12 301.278 230.803C181.942 240.703 38.5991 288.435 -35.6525 328.217C-42.5137 331.847 -48.836 336.586 -54.3359 342.119C-70.6014 358.496 -78.9783 381.124 -77.3798 404.256C-71.5731 487.138 -21.6389 620.602 21.2436 696.623C31.2172 714.378 48.3248 727.369 68.1525 732.389L77.1518 734.695C82.1894 735.906 86.8842 736.699 91.5589 736.898C186.138 740.761 350.765 687.995 427.032 648.488C435.408 644.162 442.991 638.357 449.369 631.201L451.967 628.294C456.265 623.509 459.995 618.3 463.021 612.71M-44.4266 373.246C-42.0841 368.919 -39.1251 364.924 -35.5985 361.354C-32.0231 357.694 -27.8897 354.685 -23.5111 352.275C48.3947 313.672 187.212 267.57 302.841 257.996C307.946 257.611 313.198 258.006 318.411 259.313L323.4 260.614C336.322 263.878 347.538 272.397 354.073 284.094C393.252 353.914 438.537 473.67 445.689 571.736C446.682 585.68 441.816 599.717 432.371 610.226L429.772 613.133C425.572 617.737 420.686 621.504 415.252 624.392C343.316 661.58 182.061 713.373 93.1443 709.777C90.3571 709.668 87.3153 709.187 84.1069 708.383L75.1076 706.076C62.1858 702.813 51.1462 694.389 44.6017 682.919C-2.88562 598.577 -45.5657 472.537 -50.5774 401.859C-51.2822 391.802 -49.1117 381.902 -44.4266 373.246Z" fill="#747474"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 44 KiB

250
assets/language/ar.json Normal file
View File

@@ -0,0 +1,250 @@
{
"splashVersionText": "التطبيق: v.",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "تانامي تقدم",
"welcomeTitle2Text": "استثمر مع",
"welcomeTitle3Text": "ابدأ الاستثمار اليوم",
"welcomeDescription1Text": "الوصول إلى استثمارات خاصة عالمية حصرية من الدرجة الأولى",
"welcomeDescription2Text": "خبراء استثمار ذوو خبرة مع سجل حافل طويل الأمد",
"welcomeDescription3Text": "بمبلغ 1000 ريال سعودي فقط",
"loginText": "تسجيل الدخول",
"signUpText": "اشتراك",
"welcomeText": "مرحبا بعودتك!",
"pleaseEnterLoginDetails": "يرجى إدخال تفاصيل تسجيل الدخول الخاصة بك للبدء",
"toGetYourAccountPleaseSetYourInfo": "للحصول على حسابك، يرجى تحديد معلوماتك",
"countryOfResidence": "بلد الإقامة",
"chooseCountry": "اختر الدولة",
"phoneNumber": "رقم الهاتف",
"password": "كلمة المرور",
"enterPassword": "أدخل كلمة المرور",
"invalidPhoneNo": "رقم الهاتف غير صالح",
"enterPhoneNo": "أدخل رقم الهاتف",
"invalidPassword": "كلمة المرور غير صالحة",
"forgotPassword": "نسيت كلمة المرور",
"getStartedToday": "ابدأ اليوم",
"setupYourTanamiAccountToBegin": "قم بإعداد حساب تانامي الخاص بك لبدء الاستثمار في بضع خطوات بسيطة",
"step1": "الخطوة 1",
"step2": "الخطوة 2",
"step3": "الخطوة 3",
"enterYourCountryOfResidence": "أدخل بلد إقامتك ورقم هاتفك المحمول",
"enterNameEmailPassword": "أدخل اسمك، بريدك الإلكتروني وكلمة المرور",
"enterNameEmailUniquePassword": "أدخل اسمك وبريدك الإلكتروني واختر كلمة مرور فريدة",
"enableBiometricAuthentication": "قم بتمكين المصادقة البيومترية واختر رمز PIN فريد للوصول بسهولة",
"getStarted": "ابدأ",
"welcome": "أهلا بك!",
"selectYourCountryOfResidence": "حدد بلد إقامتك وأدخل رقم هاتفك المحمول",
"nextText": "التالي",
"backText": "رجوع",
"firstNameText": "الاسم الأول",
"lastNameText": "اسم العائلة",
"emailText": "البريد الإلكتروني",
"repeatPasswordText": "أعد إدخال كلمة المرور",
"min8CharactersSpecialCharctersText": "الحد الأدنى 8 أحرف، تتطلب أحرف خاصة",
"enterFirstName": "أدخل الاسم الأول",
"enterLastName": "أدخل اسم العائلة",
"enterEmail": "أدخل البريد الإلكتروني",
"cantBeEmptyText": "لا يمكن أن يكون فارغا",
"passwordMismatch": "عدم تطابق كلمة المرور",
"iAgreeToThe": "أوافق على",
"termsAndCondition": "الشروط والأحكام",
"andThe": " و",
"privacyPolicy": "سياسة الخصوصية",
"bahrainCountryText": "البحرين",
"kuwaitCountryText": "الكويت",
"omanCountryText": "عمان",
"qatarCountryText": "قطر",
"saudiArabiaCountryText": "المملكة العربية السعودية",
"uaeCountryText": "الإمارات العربية المتحدة",
"confirmSelectionText": "تأكيد الاختيار",
"portfolioText": "قيمة المحفظة",
"portfolio": "قيمة المحفظة: ",
"investmentamount": "مبلغ الاستثمار",
"currentval": "التقييم الحالي",
"totalreturn": "إجمالي العائد",
"disttodate": "التوزيعات حتى الآن",
"includeddocs": "وثائق الاستثمار",
"videosTitle": "فيديوهات",
"academyText": "الأكاديمية",
"exitText": "خروج",
"cancelText": "إلغاء",
"areYouSureYouWantToExitText": "هل أنت متأكد أنك تريد الخروج؟",
"faqTitle": "الأسئلة الشائعة:",
"unlockText": "افتح",
"tanamiAppIsLocked": "تطبيق تانامي مقفل",
"securityMssgText": "لأمانك، يمكنك استخدام تطبيق تانامي فقط عندما يكون مفتوحًا",
"faceIdText": "معرف الوجه",
"appAskPermissionText": "يطلب تطبيق تانامي الإذن لاستخدام معرف الوجه (أو بصمة الإصبع)",
"checkYourMessages": "تحقق من رسائلك",
"referToSameOtpMessage": "أدخل الكود المكون من 6 أرقام المرسل إلى هاتفك المحمول",
"resendSms": "إعادة إرسال الرسائل القصيرة",
"otpVerifiedSucessfully": "تم التحقق من OTP بنجاح!",
"otpVerifiedFailed": "فشل التحقق من OTP:",
"pinCode": "رمز PIN",
"createPinCode": "إنشاء رمز PIN",
"changePinCode": "تغيير رمز PIN",
"confirmPinCode": "تأكيد رمز PIN",
"incorrectPinCode": "رمز PIN غير صحيح. حاول مرة اخرى.",
"welcomeBackText": "مرحبا بعودتك",
"userYourAppPinToLoginEnterTanami": "استخدم رمز PIN لتسجيل الدخول إلى تانامي",
"forgotPinCode": "نسيت رمز PIN",
"notificationText": "إشعار",
"allowNotificationText": "السماح بالإشعار",
"toRestorePinYouWillBeLoggedOut": "لاستعادة رمز PIN ستتم تسجيل خروجك",
"allowText": "السماح",
"declineText": "رفض",
"almostHere": "تقريبًا هنا...",
"completeAcc": "أكمل ملف الحساب في 3 دقائق لبدء الاستثمار",
"restorePasswordText": "استعادة كلمة المرور",
"toRestorePasswordPleaseEnterPhoneNumber": "لاستعادة كلمة المرور، يرجى إدخال رقم الهاتف",
"createNewPasswordText": "إنشاء كلمة مرور جديدة",
"submitText": "إرسال",
"walletTitle": "رصيد المحفظة",
"walletText": "محفظة",
"day": "اليوم",
"filterTitle": "مرشحات",
"onHold": "قيد الانتظار",
"deposit": "إيداع",
"withdraw": "سحب",
"withdrawal": "انسحاب",
"yield": "عائد",
"refund": "استرداد",
"investment": " ",
"walletDetailsTitle": "تفاصيل",
"withdrawalScreenTitle": "أدخل تفاصيل البنك",
"depositScreenTitle": "إخطار الإيداع",
"status": "الحالة",
"paymentMethod": "طريقة الدفع",
"accountName": "اسم الحساب",
"accountHolderName": "اسم صاحب الحساب/المستفيد",
"iban": "رقم الحساب الدولي IBAN",
"beneficiaryAddress": "عنوان المستفيد",
"bankName": "اسم البنك",
"branchAddress": "عنوان الفرع",
"SWIFTcode": "رمز SWIFT/BIC",
"refid": "معرف المرجع",
"previewTitle": "تأكيد السحب",
"info": "تم استلام طلب السحب الخاص بك وهو قيد المعالجة حاليًا.",
"info1": "يرجى تأكيد مبلغ السحب والتحقق من دقة تفاصيل البنك الخاصة بك.",
"workingDays": "تختلف أوقات المعالجة من 3-7 أيام عمل",
"balance": "رصيد المحفظة",
"withdrawTitle": "انسحاب",
"depositTitle": "إيداع",
"withdrawDetails": "تفاصيل السحب",
"depositDetails": "تفاصيل الإيداع",
"required": "الحقول بعلامة * مطلوبة",
"withdrawAmt": "إجمالي مبلغ السحب:",
"depositAmt": "إجمالي مبلغ الإيداع:",
"info2": "يمكن أن يشمل الدفع رسوم التحويل من البنك الخاص بك",
"info3": "لإتمام الدفع، يرجى استخدام تفاصيل الدفع ومعرف المرجع في بنكك",
"next": "التالي",
"depositNoti": "إنشاء إشعار إيداع",
"payWithAppleText": "الدفع بواسطة Apple Pay",
"submit": "إرسال الطلب",
"Submit": "إرسال",
"submitDeposit": "إرسال الإيداع",
"cont": "استمر",
"later": "لاحقا",
"back": "العودة للتغيير",
"clear": "مسح الكل",
"bankTransfer": "التحويل المصرفي",
"amtTrans": "مبلغ المعاملة",
"date1": "الأحدث أولا",
"date2": "الأقدم أولا",
"all": "الكل",
"byDate": "حسب التاريخ",
"byAction": "حسب نوع الإجراء",
"byStatus": "حسب الحالة",
"settingsText": "الإعدادات",
"experiencedInvestorText": "مستثمر متمرس؟",
"removeInvestmentText": "إزالة حدود الاستثمار",
"upgradeText": "قم بترقية حالة المستثمر الخاصة بك اليوم في بضع خطوات بسيطة للسماح بالاستثمارات التي تزيد عن 200,000 ريال سعودي",
"generalText": "عام",
"notificationsText": "الإخطارات",
"languageText": "اللغة",
"englishText": "الإنجليزية",
"privacySettingsText": "إعدادات الخصوصية",
"biometricText": "معرف بيومتري",
"resetPasswordText": "إعادة تعيين كلمة المرور",
"resetPinCodeText": "إعادة تعيين رمز PIN",
"supportText": "الدعم",
"contactAdminText": "الاتصال بالمشرف",
"privacyPolicyText": "سياسة الخصوصية",
"termsAndConditionText": "الشروط والأحكام",
"faqText": "الأسئلة الشائعة",
"logoutText": "تسجيل خروج",
"deleteAccountText": "حذف الحساب",
"areYouSureWantToLogoutText": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
"noText": "لا",
"yesText": "نعم",
"pinUpdatedSucess": "تم تحديث رمز PIN بنجاح!",
"pinVerifiedSucess": "تم التحقق من رمز PIN بنجاح!",
"passwordUpdatedSucess": "تم تحديث كلمة المرور بنجاح!",
"changePasswordText": "تغيير كلمة المرور",
"newPasswordText": "كلمة المرور الجديدة",
"currentPsswordText": "كلمة المرور الحالية",
"byPhoneText": "عبر الهاتف",
"byEmailText": "بواسطة البريد الإلكتروني",
"weAreHereToHelp": "نحن هنا للمساعدة!",
"arabicText": "اللغة العربية",
"chooseTheLanguageText": "اختر اللغة",
"changingTheLanguageWillReloadApp": "سيؤدي تغيير اللغة إلى إعادة تحميل التطبيق",
"weAreSadToSeeYouGo": "نحن حزينون لرؤيتك تذهب :(",
"enterAdescription": "أدخل وصفا...",
"toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount": "لمساعدتنا على التحسين، يرجى إخبارنا لماذا تريد حذف حسابك",
"charactersLeft": "الأحرف المتبقية",
"iUnderstandAndAgreeThatmyDataWillBeDeleted": "أنا أفهم وأوافق على حذف بياناتي",
"noIWantToStay": "لا، أريد البقاء",
"pleaseEnteraDescription": "يرجى إدخال وصف",
"pleaseCheckThisField": "يرجى التحقق من هذا الحقل",
"weHaveReceivedYourRequestToDeleteAccount": "لقد تلقينا طلبك لحذف حسابك",
"theRequestWillBeProcessed": "سيتم معالجة الطلب في غضون 72 ساعة",
"closeText": "أغلق",
"investText": "استثمر",
"availableText": "متاح",
"closedText": "مغلق",
"completeYourVerification": "أكمل التحقق الخاص بك",
"verifyYourAccountInUnderMinutesToStartInvestingToday": "تحقق من حسابك في أقل من 10 دقائق لبدء الاستثمار اليوم!",
"closingDateText": "تاريخ الإغلاق",
"closedDateText": "تاريخ الإغلاق",
"fundedText": "ممول",
"sponsorNameText": "اسم الراعي",
"estimatedReturnText": "العائد المقدر",
"originalEstimatedReturnText": "العائد المقدر الأصلي",
"actualEstimatedReturnText": "العائد الفعلي",
"actualReturnToDate": "العائد الفعلي حتى الآن",
"holdingPeriodText": "فترة الحيازة",
"payoutDateText": "تاريخ الدفع",
"expectedExitDate": "تاريخ الخروج المتوقع",
"minimumInvestmentText": "الحد الأدنى للاستثمار",
"keyMeritsOfInvestmentText": "المزايا الرئيسية",
"investmentDetailsText": "تفاصيل الاستثمار",
"enterInvestmentAmountText": "أدخل مبلغ الاستثمار",
"thisIsUsdInvestmentOpportunityText": "هذه فرصة استثمارية بالدولار الأمريكي. سيتم تحويل الأموال إلى الدولار الأمريكي بسعر x عند التأكيد",
"choosePaymentMethodText": "اختر طريقة الدفع",
"balanceText": "الرصيد",
"applePayText": "Apple Pay",
"gPayText": "Gpay Pay",
"bankTransferText": "حول الأموال مباشرة من حسابك المصرفي إلى محفظة تانامي الخاصة بك.",
"instantTransferFundsApplePayText": "تحويل فوري للأموال باستخدام Apple Pay!",
"instantTransferFundsGpayPayText": "تحويل فوري للأموال باستخدام Gpay Pay!",
"retailInvestirCanInvestMaxText": "يمكن للمستثمرين التجزئة استثمار حد أقصى قدره 200,000 ريال سعودي في هذه الفرصة.",
"upgradeYourInvestorStatusToIncreaseText": "قم بترقية حالة المستثمر الخاصة بك لزيادة حد الاستثمار الخاص بك.",
"currentExchangeText": "سعر الصرف الحالي",
"feeText": "الرسوم",
"processingFees": "رسوم المعالجة",
"debitedAmountText": "المبلغ المخصوم",
"totalInvestmentAmountText": "إجمالي مبلغ الاستثمار",
"confirmInvestmentText": "تأكيد الاستثمار",
"paymentMethodText": "طريقة الدفع",
"totalDebitedAmountText": "إجمالي المبلغ المخصوم",
"unableToProcessTransactionText": "غير قادر على معالجة المعاملة",
"investmentOpportunityHasReachedMaxcapText": "وصلت فرصة الاستثمار إلى الحد الأقصى",
"backToInvestmentText": "العودة إلى الاستثمار",
"otpCheckIsFailedText": "فشل التحقق من OTP...",
"pleaseTryAgainText": "الرجاء المحاولة مرة أخرى",
"tryAgainText": "حاول مرة اخرى",
"investmentConfirmationText": "تأكيد الاستثمار",
"enterAmountText": "أدخل المبلغ",
"pleaseEnterAmountText": "الرجاء إدخال المبلغ"
}

250
assets/language/en.json Normal file
View File

@@ -0,0 +1,250 @@
{
"splashVersionText": "APP: v.",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "Tanami offers",
"welcomeTitle2Text": "Invest alongside",
"welcomeTitle3Text": "Start investing today",
"welcomeDescription1Text": "access to best-in-class, exclusive, global private investments",
"welcomeDescription2Text": "experienced investment experts with a long-standing track record",
"welcomeDescription3Text": "with only SAR 1,000",
"loginText": "Log In",
"signUpText": "Sign Up",
"welcomeText": "Welcome back!",
"pleaseEnterLoginDetails": "Please enter your login details to get started",
"toGetYourAccountPleaseSetYourInfo": "To get your account please set your info",
"countryOfResidence": "Country of residence",
"chooseCountry": "Choose country",
"phoneNumber": "Phone number",
"password": "Password",
"enterPassword": "Enter Password",
"invalidPhoneNo": "Invalid phone number",
"enterPhoneNo": "Enter phone number",
"invalidPassword": "Invalid password",
"forgotPassword": "Forgot password",
"getStartedToday": "Get started today",
"setupYourTanamiAccountToBegin": "Setup your Tanami account to begin investing in a few simple steps",
"step1": "Step 1",
"step2": "Step 2",
"step3": "Step 3",
"enterYourCountryOfResidence": "Enter your country of residence and mobile number",
"enterNameEmailPassword": "Enter your name, email and password",
"enterNameEmailUniquePassword": "Enter your name and email and choose a unique password",
"enableBiometricAuthentication": "Enable biometric authentication and select a unique pin code for easy access",
"getStarted": "Get started",
"welcome": "Welcome!",
"selectYourCountryOfResidence": "Select your country of residence and enter your mobile number",
"nextText": "Next",
"backText": "Back",
"firstNameText": "First Name",
"lastNameText": "Last Name",
"emailText": "Email",
"repeatPasswordText": "Repeat Password",
"min8CharactersSpecialCharctersText": "Min 8 characters, special characters required",
"enterFirstName": "Enter first name",
"enterLastName": "Enter last name",
"enterEmail": "Enter email",
"cantBeEmptyText": "Can't be empty",
"passwordMismatch": "Password mismatch",
"iAgreeToThe": "I agree to the",
"termsAndCondition": "Terms & Conditions",
"andThe": " and the",
"privacyPolicy": "Privacy Policy",
"bahrainCountryText": "Bahrain",
"kuwaitCountryText": "Kuwait",
"omanCountryText": "Oman",
"qatarCountryText": "Qatar",
"saudiArabiaCountryText": "Saudi Arabia",
"uaeCountryText": "United Arab Emirates",
"confirmSelectionText": "Confirm selection",
"portfolioText": "Portfolio Value",
"portfolio": "Portfolio Value: ",
"investmentamount": "Investment Amount",
"currentval": "Current valuation",
"totalreturn": "Total return",
"disttodate": "Distributions to date",
"includeddocs": "Investment Documents",
"videosTitle": "Videos",
"academyText": "Academy",
"exitText": "Exit",
"cancelText": "Cancel",
"areYouSureYouWantToExitText": "Are you sure you want to Exit?",
"faqTitle": "Frequently Asked Questions:",
"unlockText": "Unlock",
"tanamiAppIsLocked": "Tanami Capital is locked",
"securityMssgText": "For your security, you can only use Tanami Capital when it's unlocked",
"faceIdText": "Face Id",
"appAskPermissionText": "Tanami App ask permission to use Face ID (or Fingerprint)",
"checkYourMessages": "Check your messages",
"referToSameOtpMessage": "Enter the 6-digit code sent to your mobile",
"resendSms": "Resend SMS",
"otpVerifiedSucessfully": "OTP Verified Successfully!",
"otpVerifiedFailed": "OTP Verification Failed:",
"pinCode": "Pin Code",
"createPinCode": "Create Pin Code",
"changePinCode": "Change Pin Code",
"confirmPinCode": "Confirm Pin Code",
"incorrectPinCode": "Incorrect PIN. Please try again.",
"welcomeBackText": "Welcome back",
"userYourAppPinToLoginEnterTanami": "Use your app PIN to login to enter Tanami",
"forgotPinCode": "Forgot Pin Code",
"notificationText": "Notification",
"allowNotificationText": "Allow notification",
"toRestorePinYouWillBeLoggedOut": "To restore PIN you will be Logged out",
"allowText": "Allow",
"declineText": "Decline",
"almostHere": "Almost here...",
"completeAcc": "Complete account profile in 3 minutes to start investing",
"restorePasswordText": "Restore password",
"toRestorePasswordPleaseEnterPhoneNumber": "To restore password please enter phone number",
"createNewPasswordText": "Create new password",
"submitText": "Submit",
"walletTitle": "Wallet balance",
"walletText": "Wallet",
"day": "Today",
"filterTitle": "Filters",
"onHold": "On Hold",
"deposit": "Deposit",
"withdraw": "Withdraw",
"withdrawal": "Withdrawal",
"yield": "Yield",
"refund": "Refund",
"investment": "Investment",
"walletDetailsTitle": "Details",
"withdrawalScreenTitle": "Enter bank details",
"depositScreenTitle": "Deposit notification",
"status": "Status",
"paymentMethod": "Payment Method",
"accountName": "Account Name",
"accountHolderName": "Account Holder Name/Beneficiary Name",
"iban": "IBAN",
"beneficiaryAddress": "Beneficiary Address",
"bankName": "Bank Name",
"branchAddress": "Branch Address",
"SWIFTcode": "SWIFT/BIC code",
"refid": "Reference ID",
"previewTitle": "Withdrawal confirmation",
"info": "Your withdrawal request has been received and is currently being processed.",
"info1": "Please confirm the withdrawal amount and verify the accuracy of your bank details.",
"workingDays": "Processing times vary from 3-7 working days",
"balance": "Wallet Balance",
"withdrawTitle": "Withdrawal",
"depositTitle": "Deposit",
"withdrawDetails": "Withdrawal details",
"depositDetails": "Deposit details",
"required": "Fields with * are required",
"withdrawAmt": "Total Withdrawal amount:",
"depositAmt": "Total Deposit amount:",
"info2": "Payment can include transfer fee from your bank",
"info3": "To accomplish payment please use payment details and Reference ID in tour Bank",
"next": "Next",
"depositNoti": "Create deposit notification",
"payWithAppleText": "Pay with Apple Pay",
"submit": "Submit request",
"Submit": "Submit",
"submitDeposit": "Submit deposit",
"cont": "Continue",
"later": "Later",
"back": "Back to change",
"clear": "Clear All",
"bankTransfer": "Bank Transfer",
"amtTrans": "Amount of transaction",
"date1": "Newest first",
"date2": "Oldest first",
"all": "All",
"byDate": "By date",
"byAction": "By type of action",
"byStatus": "By status",
"settingsText": "Settings",
"experiencedInvestorText": "Experienced investor?",
"removeInvestmentText": "Remove investment thresholds",
"upgradeText": "Upgrade your investor status today in a few simple steps to allows investments higher than SAR 200,000",
"generalText": "General",
"notificationsText": "Notifications",
"languageText": "Language",
"englishText": "English",
"privacySettingsText": "Privacy Settings",
"biometricText": "Biometric ID",
"resetPasswordText": "Reset Password",
"resetPinCodeText": "Reset PIN-code",
"supportText": "Support",
"contactAdminText": "Contact Admin",
"privacyPolicyText": "Privacy Policy",
"termsAndConditionText": "Terms & Conditions",
"faqText": "FAQ",
"logoutText": "Log Out",
"deleteAccountText": "Delete account",
"areYouSureWantToLogoutText": "Are you sure you want to Logout?",
"noText": "No",
"yesText": "Yes",
"pinUpdatedSucess": "Pin updated Sucessfully !",
"pinVerifiedSucess": "Pin verified Sucessfully !",
"passwordUpdatedSucess": "Password updated Sucessfully !",
"changePasswordText": "Change Password",
"newPasswordText": "New Password",
"currentPsswordText": "Current Password",
"byPhoneText": "By phone",
"byEmailText": "By-mail",
"weAreHereToHelp": "We are here to help!",
"arabicText": "اللغة العربية",
"chooseTheLanguageText": "Choose the language",
"changingTheLanguageWillReloadApp": "Changing the language will reload the application",
"weAreSadToSeeYouGo": "We're sad to see you go :(",
"enterAdescription": "Enter a description...",
"toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount": "To help us improve, please let us know why you want to delete your account",
"charactersLeft": "characters left",
"iUnderstandAndAgreeThatmyDataWillBeDeleted": "I understand and agree that my data will be deleted",
"noIWantToStay": "No, i want to stay",
"pleaseEnteraDescription": "Please enter a description",
"pleaseCheckThisField": "Please check this field",
"weHaveReceivedYourRequestToDeleteAccount": "We have received your request to delete your account",
"theRequestWillBeProcessed": "The request will be processed within 72 hours",
"closeText": "Close",
"investText": "Invest",
"availableText": "Available",
"closedText": "Closed",
"completeYourVerification": "Complete your verification",
"verifyYourAccountInUnderMinutesToStartInvestingToday": "Verify your account in under 10 minutes to start investing today!",
"closingDateText": "Closing Date",
"closedDateText": "Closed Date",
"fundedText": "funded",
"sponsorNameText": "Sponsor name",
"estimatedReturnText": "Estimated return",
"originalEstimatedReturnText": "Original estimated return",
"actualEstimatedReturnText": "Actual return",
"actualReturnToDate": "Actual return to date",
"holdingPeriodText": "Holding period",
"payoutDateText": "Payout Date",
"expectedExitDate": "Expected Exit Date",
"minimumInvestmentText": "Minimum investment",
"keyMeritsOfInvestmentText": "Key Merits",
"investmentDetailsText": "Investment details",
"enterInvestmentAmountText": "Enter investment amount",
"thisIsUsdInvestmentOpportunityText": "This is a USD investment opportunity. Funds will be converted into USD at a rate of x upon confirmation",
"choosePaymentMethodText": "Choose payment method",
"balanceText": "Balance",
"applePayText": "Apple Pay",
"gPayText": "Gpay Pay",
"bankTransferText": "Directly transfer funds from your bank account into your Tanami wallet.",
"instantTransferFundsApplePayText": "Instant transfer of funds using Apple Pay!",
"instantTransferFundsGpayPayText": "Instant transfer of funds using Gpay Pay!",
"retailInvestirCanInvestMaxText": "Retail investors can invest a maximum of SAR 200,000 in this opportunity.",
"upgradeYourInvestorStatusToIncreaseText": "Upgrade your investor status to increase your investment limit.",
"currentExchangeText": "Current Exchange",
"feeText": "Fee",
"processingFees": "Processing fee",
"debitedAmountText": "Debited amount",
"totalInvestmentAmountText": "Total Investment amount",
"confirmInvestmentText": "Confirm investment",
"paymentMethodText": "Payment method",
"totalDebitedAmountText": "Total debited amount",
"unableToProcessTransactionText": "Unable to process transaction",
"investmentOpportunityHasReachedMaxcapText": "Investment opportunity has reached maximum capacity",
"backToInvestmentText": "Back to Investment",
"otpCheckIsFailedText": "OTP Check is failed...",
"pleaseTryAgainText": "Please try again",
"tryAgainText": "Try again",
"investmentConfirmationText": "Investment confirmation",
"enterAmountText": "Enter Amount",
"pleaseEnterAmountText": "Please Enter Amount"
}

3
devtools_options.yaml Normal file
View File

@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

File diff suppressed because one or more lines are too long

View File

@@ -26,6 +26,8 @@
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>NSFaceIDUsageDescription</key>
<string>Why is my app authenticating using face id?</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>

View File

@@ -0,0 +1,18 @@
class ResponseData<T> {
ResponseData(this.message, this.status, {this.data});
final T? data;
final String message;
final ResponseStatus status;
@override
String toString() => message;
}
enum ResponseStatus {
SUCCESS,
FAILED,
PRIVATE,
}

7
lib/Globalconst.dart Normal file
View File

@@ -0,0 +1,7 @@
class Globalconst {
static String token = "";
static String name = "";
static String phonenumber = "";
static String isdcode = "";
static String createdpin="";
}

View File

@@ -43,6 +43,8 @@ class RouteName {
static const String withdrawalConfirmation = 'withdrawalConfirmation';
static const String depositScreen = 'depositScreen';
static const String depositPreview = 'depositPreview';
static const String selectDepositMethodScreen = 'selectDepositMethodScreen';
static const String depositStepScreen = 'depositStepScreen';
//Biometric
static const String biometricScreen = 'biometricScreen';

View File

@@ -1,5 +1,6 @@
// router.dart
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/features/MainScreens/Academy/presentation/pages/academy_details_screen.dart';
@@ -8,12 +9,14 @@ import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/paymen
import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/payment/invest_payment_screen.dart';
import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/portfolio_details_screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/deposit_step_screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/select_deposit_method_screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/filter_screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/walletDetails.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/wallet_details.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/confirmation.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/preview.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawal_screen.dart';
import 'package:tanami_app/features/biometric/presentation/pages/biometric_screen.dart';
import 'package:tanami_app/features/changePassword/presentation/pages/change_password_screen.dart';
import 'package:tanami_app/features/contactAdmin/presentation/pages/contact_admin_screen.dart';
@@ -30,6 +33,8 @@ import 'package:tanami_app/features/welcome/presentation/pages/weclome_screen.da
import 'package:tanami_app/shared/components/no_internet.dart';
import '../../features/MainScreens/main_screen.dart';
import '../../features/countrySelection/bloc/GetCountry/get_country_bloc.dart';
import '../../features/countrySelection/bloc/GetCountry/get_country_event.dart';
import '../../features/forgotPassword/presentation/pages/restore_password_phone_verification_screen.dart';
import '../../features/login/presentation/pages/login_screen.dart';
import '../../features/register/presentation/pages/register_user_details_screen.dart';
@@ -49,6 +54,7 @@ final goRouter = GoRouter(
name: "splash",
path: RouteName.splashScreen,
builder: (context, state) {
context.read<GetCountryBlock>().add(GetCountry());
return const SplashScreen();
},
routes: [
@@ -208,6 +214,20 @@ final goRouter = GoRouter(
return const DepositScreen();
},
),
GoRoute(
name: RouteName.selectDepositMethodScreen,
path: RouteName.selectDepositMethodScreen,
builder: (context, state) {
return const SelectDepositMethodScreen();
},
),
GoRoute(
name: RouteName.depositStepScreen,
path: RouteName.depositStepScreen,
builder: (context, state) {
return const DepositStepScreen();
},
),
GoRoute(
name: RouteName.depositPreview,
path: RouteName.depositPreview,

View File

@@ -95,10 +95,12 @@ class AppColor {
//Wallet Color
static const Color onHoldTextColor = Color(0xFF0172CB);
static const Color depositListIconColor = Color(0xFF0FA4A4);
static const Color withdrawalListIconColor = Color(0xFFE6681F);
static const Color investmentListIconColor = Color(0xFF0172CB);
static const Color yieldListIconColor = Color(0xFF4C4AEF);
static const Color refundListIconColor = Color(0xFF0E9445);
//Security
static const Color permissionTextClr = Color(0xFF007AFF);
}

View File

@@ -129,7 +129,6 @@ class AppImages {
'assets/images/wallet_screen/search.png';
static const String walletFilterIcon =
'assets/images/wallet_screen/filter.png';
static const String depositListIcon =
'assets/images/wallet_screen/deposit_list.png';
static const String withdrawalListIcon =
@@ -140,4 +139,7 @@ class AppImages {
'assets/images/wallet_screen/yield_list.png';
static const String refundListIcon =
'assets/images/wallet_screen/refund_list.png';
static const String dStep1Icon = 'assets/images/wallet_screen/d_step_1.svg';
static const String dStep2Icon = 'assets/images/wallet_screen/d_step_2.svg';
static const String dStep3Icon = 'assets/images/wallet_screen/d_step_3.svg';
}

View File

@@ -1,72 +1,68 @@
class AppText {
//Splash
static const String splashVersionText = "APP: v.";
static const String splashCopyrightText = '© 2024 Tanami';
static const String splashVersionText = "splashVersionText";
static const String splashCopyrightText = "splashCopyrightText";
//Welcome
static const String welcomeTitle1Text = "Tanami offers";
static const String welcomeTitle2Text = "Invest alongside";
static const String welcomeTitle3Text = "Start investing today ";
static const String weclomeDescription1Text =
"access to best-in-class, exclusive, global private investments";
static const String weclomeDescription2Text =
"experienced investment experts with a long-standing track record";
static const String weclomeDescription3Text = "with only SAR 1,000";
static const String loginText = "Log In";
static const String signUpText = "Sign Up";
static const String welcomeTitle1Text = "welcomeTitle1Text";
static const String welcomeTitle2Text = "welcomeTitle2Text";
static const String welcomeTitle3Text = "welcomeTitle3Text";
static const String welcomeDescription1Text = "welcomeDescription1Text";
static const String welcomeDescription2Text = "welcomeDescription2Text";
static const String welcomeDescription3Text = "welcomeDescription3Text";
static const String loginText = "loginText";
static const String signUpText = "signUpText";
//Login
static const String welcomeText = "Welcome back!";
static const String pleaseEnterLoginDetails =
"Please enter your login details to get started";
static const String welcomeText = "welcomeText";
static const String pleaseEnterLoginDetails = "pleaseEnterLoginDetails";
static const String toGetYourAccountPleaseSetYourInfo =
"To get your account please set your info";
static const String countryOfResidence = "Country of residence";
static const String chooseCountry = "Choose country";
static const String phoneNumber = "Phone number";
static const String password = "Password";
static const String enterPassword = "Enter Password";
static const String invalidPhoneNo = "Invalid phone number";
static const String enterPhoneNo = "Enter phone number";
static const String invalidPassword = "Invalid password";
static const String forgotPassword = "Forgot password";
"toGetYourAccountPleaseSetYourInfo";
static const String countryOfResidence = "countryOfResidence";
static const String chooseCountry = "chooseCountry";
static const String phoneNumber = "phoneNumber";
static const String password = "password";
static const String enterPassword = "enterPassword";
static const String invalidPhoneNo = "invalidPhoneNo";
static const String enterPhoneNo = "enterPhoneNo";
static const String invalidPassword = "invalidPassword";
static const String forgotPassword = "forgotPassword";
//Register
static const String getStartedToday = "Get started today";
static const String getStartedToday = "getStartedToday";
static const String setupYourTanamiAccountToBegin =
"Setup your Tanami account to begin investing in a few simple steps";
static const String step1 = "Step 1";
static const String step2 = "Step 2";
static const String step3 = "Step 3";
"setupYourTanamiAccountToBegin";
static const String step1 = "step1";
static const String step2 = "step2";
static const String step3 = "step3";
static const String enterYourCountryOfResidence =
"Enter your country of residence and mobile number";
static const String enterNameEmailPassword =
"Enter your name, email and password";
"enterYourCountryOfResidence";
static const String enterNameEmailPassword = "enterNameEmailPassword";
static const String enterNameEmailUniquePassword =
"Enter your name and email and choose a unique password";
"enterNameEmailUniquePassword";
static const String enableBiometricAuthentication =
"Enable biometric authentication and select a unique pin code for easy access";
static const String getStarted = "Get started";
static const String welcome = "Welcome!";
"enableBiometricAuthentication";
static const String getStarted = "getStarted";
static const String welcome = "welcome";
static const String selectYourCountryOfResidence =
"Select your country of residence and enter your mobile number";
static const String nextText = "Next";
static const String backText = "Back";
static const String firstNameText = "First Name";
static const String lastNameText = "Last Name";
static const String emailText = "Email";
static const String repeatPasswordText = "Repeat Password";
"selectYourCountryOfResidence";
static const String nextText = "nextText";
static const String backText = "backText";
static const String firstNameText = "firstNameText";
static const String lastNameText = "lastNameText";
static const String emailText = "emailText";
static const String repeatPasswordText = "repeatPasswordText";
static const String min8CharactersSpecialCharctersText =
"Min 8 characters, special characters required";
static const String enterFirstName = "Enter first name";
static const String enterLastName = "Enter last name";
static const String enterEmail = "Enter email";
static const String cantBeEmptyText = "Can't be empty";
static const String passwordMismatch = "Password mismatch";
static const String iAgreeToThe = "I agree to the ";
static const String termsAndCondition = "Terms & Conditions";
static const String andThe = " and the";
static const String privacyPolicy = "Privacy Policy";
"min8CharactersSpecialCharctersText";
static const String enterFirstName = "enterFirstName";
static const String enterLastName = "enterLastName";
static const String enterEmail = "enterEmail";
static const String cantBeEmptyText = "cantBeEmptyText";
static const String passwordMismatch = "passwordMismatch";
static const String iAgreeToThe = "iAgreeToThe";
static const String termsAndCondition = "termsAndCondition";
static const String andThe = "andThe";
static const String privacyPolicy = "privacyPolicy";
//Country Name
static const String bahrainCountryText = "Bahrain";
@@ -75,232 +71,242 @@ class AppText {
static const String qatarCountryText = "Qatar";
static const String saudiArabiaCountryText = "Saudi Arabia";
static const String uaeCountryText = "United Arab Emirates";
static const String confirmSelectionText = "Confirm selection";
static const String confirmSelectionText = "confirmSelectionText";
//Portfolio
static const String portfolioText = "Portfolio Value";
static const String portfolio = "Portfolio Value: ";
static const String investmentamount = "Investment Amount";
static const String currentval = "Current valuation";
static const String totalreturn = "Total return";
static const String disttodate = "Distributions to date";
static const String includeddocs = "Included Documents";
static const String portfolioText = "portfolioText";
static const String portfolio = "portfolio";
static const String investmentamount = "investmentamount";
static const String currentval = "currentval";
static const String totalreturn = "totalreturn";
static const String disttodate = "disttodate";
static const String includeddocs = "includeddocs";
//Academy
static const String videosTitle = "Videos";
static const String academyText = "Academy";
static const String videosTitle = "videosTitle";
static const String academyText = "academyText";
//Dialog
static const String exitText = "Exit";
static const String cancelText = "Cancel";
static const String exitText = "exitText";
static const String cancelText = "cancelText";
static const String areYouSureYouWantToExitText =
"Are you sure you want to Exit?";
"areYouSureYouWantToExitText";
//FAQ
static const String faqTitle = "faqTitle";
//Security
static const String unlockText = "unlockText";
static const String tanamiAppIsLocked = "tanamiAppIsLocked";
static const String securityMssgText = "securityMssgText";
static const String faceIdText = "faceIdText";
static const String appAskPermissionText = "appAskPermissionText";
//OTP
static const String checkYourMessages = "Check your messages";
static const String referToSameOtpMessage =
"Enter the 6-digit code sent to your mobile";
static const String resendSms = "Resend SMS";
static const String otpVerifiedSucessfully = "OTP Verified Successfully!";
static const String otpVerifiedFailed = "OTP Verification Failed:";
static const String checkYourMessages = "checkYourMessages";
static const String referToSameOtpMessage = "referToSameOtpMessage";
static const String resendSms = "resendSms";
static const String otpVerifiedSucessfully = "otpVerifiedSucessfully";
static const String otpVerifiedFailed = "otpVerifiedFailed";
//Pin Code
static const String pinCode = "Pin Code";
static const String createPinCode = "Create Pin Code";
static const String changePinCode = "Change Pin Code";
static const String confirmPinCode = "Confirm Pin Code";
static const String incorrectPinCode = "Incorrect PIN. Please try again.";
static const String welcomeBackText = "Welcome back";
static const String pinCode = "pinCode";
static const String createPinCode = "createPinCode";
static const String changePinCode = "changePinCode";
static const String confirmPinCode = "confirmPinCode";
static const String incorrectPinCode = "incorrectPinCode";
static const String welcomeBackText = "welcomeBackText";
static const String userYourAppPinToLoginEnterTanami =
"Use your app PIN to login to enter Tanami";
static const String forgotPinCode = "Forgot Pin Code";
static const String notificationText = "Notification";
"userYourAppPinToLoginEnterTanami";
static const String forgotPinCode = "forgotPinCode";
static const String notificationText = "notificationText";
static const String allowNotificationText = "allowNotificationText";
static const String toRestorePinYouWillBeLoggedOut =
"To restore PIN you will be Logged out";
static const String allowText = "Allow";
static const String declineText = "Decline";
"toRestorePinYouWillBeLoggedOut";
static const String allowText = "allowText";
static const String declineText = "declineText";
//Forgot Password
static const String restorePasswordText = "Restore password";
static const String almostHere = "almostHere";
static const String completeAcc = "completeAcc";
//Forgot Password
static const String restorePasswordText = "restorePasswordText";
static const String toRestorePasswordPleaseEnterPhoneNumber =
"To restore password please enter phone number";
static const String createNewPasswordText = "Create new password";
static const String submitText = "Submit";
"toRestorePasswordPleaseEnterPhoneNumber";
static const String createNewPasswordText = "createNewPasswordText";
static const String submitText = "submitText";
//Wallet
static const String walletTitle = "Wallet balance";
static const String walletText = "Wallet";
static const String day = "Today";
static const String filterTitle = "Filters";
static const String onHold = "On Hold";
static const String deposit = "Deposit";
static const String withdrawal = "Withdrawal";
static const String yield = "Yield";
static const String refund = "Refund";
static const String investment = "Investment";
static const String walletDetailsTitle = "Details";
static const String withdrawalScreenTitle = 'Enter bank details';
static const String depositScreenTitle = 'Deposit notification';
static const String status = "Status";
static const String paymentMethod = "Payment Method";
static const String accountName = "Account Name";
static const String accountHolderName =
'Account Holder Name/Beneficiary Name';
static const String iban = "IBAN";
static const String beneficiaryAddress = "Beneficiary Address";
static const String bankName = "Bank Name";
static const String branchAddress = "Branch Address";
static const String SWIFTcode = "SWIFT/BIC code";
static const String refid = "Reference ID";
static const String previewTitle = "Withdrawal confirmation";
static const String info =
'Your withdrawal request has been received and is currently being processed.';
static const String info1 =
'Please confirm the withdrawal amount and verify the accuracy of your bank details.';
static const String workingDays =
'Processing times vary from 3-7 working days';
static const String balance = 'Wallet Balance';
static const String withdrawTitle = 'Withdrawal';
static const String depositTitle = 'Deposit';
static const String withdrawDetails = 'Withdrawal details';
static const String depositDetails = 'Deposit details';
static const String required = 'Fields with * are required';
static const String withdrawAmt = 'Total Withdrawal amount:';
static const String depositAmt = 'Total Deposit amount:';
static const String info2 = 'Payment can include transfer fee from your bank';
static const String info3 =
'To accomplish payment please use payment details and Reference ID in tour Bank';
static const String next = 'Next';
static const String depositNoti = 'Create deposit notification';
static const String submit = 'Submit request';
static const String Submit = 'Submit';
static const String submitDeposit = 'Submit deposit';
static const String cont = 'Continue';
static const String later = 'Later';
static const String back = 'Back to change';
static const String clear = 'Clear All';
static const String bankTransfer = 'Bank Transfer';
static const String amtTrans = 'Amount of transaction';
static const String date1 = 'Newest first';
static const String date2 = 'Oldest first';
static const String all = 'All';
static const String byDate = 'By date';
static const String byAction = 'By type of action';
static const String byStatus = 'By status';
static const String walletTitle = "walletTitle";
static const String walletText = "walletText";
static const String day = "day";
static const String filterTitle = "filterTitle";
static const String onHold = "onHold";
static const String deposit = "deposit";
static const String withdraw = "withdraw";
static const String withdrawal = "withdrawal";
static const String yield = "yield";
static const String refund = "refund";
static const String investment = "investment";
static const String walletDetailsTitle = "walletDetailsTitle";
static const String withdrawalScreenTitle = "withdrawalScreenTitle";
static const String depositScreenTitle = "depositScreenTitle";
static const String status = "status";
static const String paymentMethod = "paymentMethod";
static const String accountName = "accountName";
static const String accountHolderName = "accountHolderName";
static const String iban = "iban";
static const String beneficiaryAddress = "beneficiaryAddress";
static const String bankName = "bankName";
static const String branchAddress = "branchAddress";
static const String SWIFTcode = "SWIFTcode";
static const String refid = "refid";
static const String previewTitle = "previewTitle";
static const String info = "info";
static const String info1 = "info1";
static const String workingDays = "workingDays";
static const String balance = "balance";
static const String withdrawTitle = "withdrawTitle";
static const String depositTitle = "depositTitle";
static const String withdrawDetails = "withdrawDetails";
static const String depositDetails = "depositDetails";
static const String required = "required";
static const String withdrawAmt = "withdrawAmt";
static const String depositAmt = "depositAmt";
static const String info2 = "info2";
static const String info3 = "info3";
static const String next = "next";
static const String depositNoti = "depositNoti";
static const String payWithAppleText = "payWithAppleText";
static const String submit = "submit";
static const String Submit = "Submit";
static const String submitDeposit = "submitDeposit";
static const String cont = "cont";
static const String later = "later";
static const String back = "back";
static const String clear = "clear";
static const String bankTransfer = "bankTransfer";
static const String amtTrans = "amtTrans";
static const String date1 = "date1";
static const String date2 = "date2";
static const String all = "all";
static const String byDate = "byDate";
static const String byAction = "byAction";
static const String byStatus = "byStatus";
//Settings
static const String settingsText = "Settings";
static const String experiencedInvestorText = "Experienced investor?";
static const String upgradeText =
"Upgrade your investor status today in a few simple steps to allows investments higher than SAR 200,000";
static const String generalText = "General";
static const String notificationsText = "Notifications";
static const String languageText = "Language";
static const String settingsText = "settingsText";
static const String experiencedInvestorText = "experiencedInvestorText";
static const String removeInvestmentText = "removeInvestmentText";
static const String upgradeText = "upgradeText";
static const String generalText = "generalText";
static const String notificationsText = "notificationsText";
static const String languageText = "languageText";
static const String englishText = "English";
static const String privacySettingsText = "Privacy Settings";
static const String biometricText = "Biometric ID";
static const String resetPasswordText = "Reset Password";
static const String resetPinCodeText = "Reset PIN-code";
static const String supportText = "Support";
static const String contactAdminText = "Contact Admin";
static const String privacyPolicyText = "Privacy Policy";
static const String termsAndConditionText = "Terms & Conditions";
static const String faqText = "FAQ";
static const String logoutText = "Log Out";
static const String deleteAccountText = "Delete account";
static const String areYouSureWantToLogoutText =
"Are you sure you want to Logout?";
static const String noText = "No";
static const String yesText = "Yes";
static const String pinUpdatedSucess = "Pin updated Sucessfully !";
static const String pinVerifiedSucess = "Pin verified Sucessfully !";
static const String passwordUpdatedSucess = "Password updated Sucessfully !";
static const String changePasswordText = "Change Password";
static const String newPasswordText = "New Password";
static const String currentPsswordText = "Current Password";
static const String privacySettingsText = "privacySettingsText";
static const String biometricText = "biometricText";
static const String resetPasswordText = "resetPasswordText";
static const String resetPinCodeText = "resetPinCodeText";
static const String supportText = "supportText";
static const String contactAdminText = "contactAdminText";
static const String privacyPolicyText = "privacyPolicyText";
static const String termsAndConditionText = "termsAndConditionText";
static const String faqText = "faqText";
static const String logoutText = "logoutText";
static const String deleteAccountText = "deleteAccountText";
static const String areYouSureWantToLogoutText = "areYouSureWantToLogoutText";
static const String noText = "noText";
static const String yesText = "yesText";
static const String pinUpdatedSucess = "pinUpdatedSucess";
static const String pinVerifiedSucess = "pinVerifiedSucess";
static const String passwordUpdatedSucess = "passwordUpdatedSucess";
static const String changePasswordText = "changePasswordText";
static const String newPasswordText = "newPasswordText";
static const String currentPsswordText = "currentPsswordText";
//Contact Admin
static const String byPhoneText = "By phone";
static const String byEmailText = "By-mail";
static const String weAreHereToHelp = "We are here to help!";
static const String byPhoneText = "byPhoneText";
static const String byEmailText = "byEmailText";
static const String weAreHereToHelp = "weAreHereToHelp";
//Language Screen
static const String arabicText = "اللغة العربية";
static const String chooseTheLanguageText = "Choose the language";
static const String chooseTheLanguageText = "chooseTheLanguageText";
static const String changingTheLanguageWillReloadApp =
"Changing the language will reload the application";
"changingTheLanguageWillReloadApp";
//Delete Screen
static const String weAreSadToSeeYouGo = "We're sad to see you go :(";
static const String enterAdescription = "Enter a description...";
static const String weAreSadToSeeYouGo = "weAreSadToSeeYouGo";
static const String enterAdescription = "enterAdescription";
static const String toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount =
"To help us improve, please let us know why you want to delete your account";
static const String charactersLeft = "characters left";
"toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount";
static const String charactersLeft = "charactersLeft";
static const String iUnderstandAndAgreeThatmyDataWillBeDeleted =
"I understand and agree that my data will be deleted";
static const String noIWantToStay = "No, i want to stay";
static const String pleaseEnteraDescription = "Please enter a description";
static const String pleaseCheckThisField = "Please check this field";
"iUnderstandAndAgreeThatmyDataWillBeDeleted";
static const String noIWantToStay = "noIWantToStay";
static const String pleaseEnteraDescription = "pleaseEnteraDescription";
static const String pleaseCheckThisField = "pleaseCheckThisField";
static const String weHaveReceivedYourRequestToDeleteAccount =
"We have received your request to delete your account";
static const String theRequestWillBeProcessed =
"The request will be processed within 72 hours";
static const closeText = "Close";
"weHaveReceivedYourRequestToDeleteAccount";
static const String theRequestWillBeProcessed = "theRequestWillBeProcessed";
static const String closeText = "closeText";
//Invest
static const String investText = "Invest";
static const String availableText = "Available";
static const String closedText = "Closed";
static const String completeYourVerification = "Complete your verification";
static const String investText = "investText";
static const String availableText = "availableText";
static const String closedText = "closedText";
static const String completeYourVerification = "completeYourVerification";
static const String verifyYourAccountInUnderMinutesToStartInvestingToday =
"Verify your account in under 10 minutes to start investing today!";
static const String closingDateText = "Closing Date";
static const String fundedText = "funded";
static const String sponsorNameText = "Sponsor name";
static const String estimatedReturnText = "Estimated return";
static const String originalEstimatedReturnText = "Original estimated return";
static const String actualEstimatedReturnText = "Actual return";
static const String holdingPeriodText = "Holding period";
static const String payoutDateText = "Payout Date";
static const String minimumInvestmentText = "Minimum investment";
static const String keyMeritsOfInvestmentText = "Key Merits of Investment";
static const String investmentDetailsText = "Investment details";
static const String enterInvestmentAmountText = "Enter investment amount";
"verifyYourAccountInUnderMinutesToStartInvestingToday";
static const String closingDateText = "closingDateText";
static const String closedDateText = "closedDateText";
static const String fundedText = "fundedText";
static const String sponsorNameText = "sponsorNameText";
static const String estimatedReturnText = "estimatedReturnText";
static const String originalEstimatedReturnText =
"originalEstimatedReturnText";
static const String actualEstimatedReturnText = "actualEstimatedReturnText";
static const String actualReturnToDate = "actualReturnToDate";
static const String holdingPeriodText = "holdingPeriodText";
static const String payoutDateText = "payoutDateText";
static const String expectedExitDate = "expectedExitDate";
static const String minimumInvestmentText = "minimumInvestmentText";
static const String keyMeritsOfInvestmentText = "keyMeritsOfInvestmentText";
static const String investmentDetailsText = "investmentDetailsText";
static const String enterInvestmentAmountText = "enterInvestmentAmountText";
static const String thisIsUsdInvestmentOpportunityText =
"This is a USD investment opportunity. Funds will be converted into USD upon confirmation.";
static const String choosePaymentMethodText = "Choose payment method";
static const String balanceText = "Balance";
static const String applePayText = "Apple Pay";
static const String gPayText = "Gpay Pay";
static const String bankTransferText = "Directly transfer funds from your bank account into your Tanami wallet.";
"thisIsUsdInvestmentOpportunityText";
static const String choosePaymentMethodText = "choosePaymentMethodText";
static const String balanceText = "balanceText";
static const String applePayText = "applePayText";
static const String gPayText = "gPayText";
static const String bankTransferText = "bankTransferText";
static const String instantTransferFundsApplePayText =
"Instant transfer of funds using Apple Pay!";
"instantTransferFundsApplePayText";
static const String instantTransferFundsGpayPayText =
"Instant transfer of funds using Gpay Pay!";
"instantTransferFundsGpayPayText";
static const String retailInvestirCanInvestMaxText =
"Retail investors can invest a maximum of SAR 200,000 in this opportunity.";
"retailInvestirCanInvestMaxText";
static const String upgradeYourInvestorStatusToIncreaseText =
"Upgrade your investor status to increase your investment limit.";
static const String currentExchangeText = "Current Exchange";
static const String feeText = "Fee";
static const String debitedAmountText = "Debited amount";
static const String totalInvestmentAmountText = "Total Investment amount";
static const String confirmInvestmentText = "Confirm investment";
static const String paymentMethodText = "Payment method";
static const String totalDebitedAmountText = "Total debited amount";
"upgradeYourInvestorStatusToIncreaseText";
static const String currentExchangeText = "currentExchangeText";
static const String feeText = "feeText";
static const String processingFees = "processingFees";
static const String debitedAmountText = "debitedAmountText";
static const String totalInvestmentAmountText = "totalInvestmentAmountText";
static const String confirmInvestmentText = "confirmInvestmentText";
static const String paymentMethodText = "paymentMethodText";
static const String totalDebitedAmountText = "totalDebitedAmountText";
static const String unableToProcessTransactionText =
"Unable to process transaction";
"unableToProcessTransactionText";
static const String investmentOpportunityHasReachedMaxcapText =
"Investment opportunity has reached maximum capacity";
static const String backToInvestmentText = "Back to Investment";
static const String otpCheckIsFailedText = "OTP Check is failed...";
static const String pleaseTryAgainText = "Please try again";
static const String tryAgainText = "Try again";
static const String investmentConfirmationText = "Investment confirmation";
static const String enterAmountText = "Enter Amount";
static const String pleaseEnterAmountText = "Please Enter Amount";
//Wallet
static const String withdrawText = 'Withdraw';
"investmentOpportunityHasReachedMaxcapText";
static const String backToInvestmentText = "backToInvestmentText";
static const String otpCheckIsFailedText = "otpCheckIsFailedText";
static const String pleaseTryAgainText = "pleaseTryAgainText";
static const String tryAgainText = "tryAgainText";
static const String investmentConfirmationText = "investmentConfirmationText";
static const String enterAmountText = "enterAmountText";
static const String pleaseEnterAmountText = "pleaseEnterAmountText";
}

View File

@@ -1,5 +1,3 @@
// network_connectivity.dart
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
@@ -22,13 +20,17 @@ class NetworkConnectivity {
void initialize() {
_subscription = _connectivity.onConnectivityChanged
.listen((List<ConnectivityResult> result) {
String status = result.toString();
onStatusChange(status);
if (result.isNotEmpty) {
String status = result.toString();
onStatusChange(status);
if (result[0] == ConnectivityResult.wifi ||
result[0] == ConnectivityResult.mobile) {
if (goRouter.canPop()) {
goRouter.pop(true);
if (result[0] == ConnectivityResult.wifi ||
result[0] == ConnectivityResult.mobile) {
if (goRouter.canPop()) {
goRouter.pop(true);
}
} else {
goRouter.pushNamed(RouteName.noInternetScreen);
}
} else {
goRouter.pushNamed(RouteName.noInternetScreen);
@@ -42,7 +44,8 @@ class NetworkConnectivity {
Future<void> checkInternet() async {
final connectivityResult = await _connectivity.checkConnectivity();
if (connectivityResult[0] != ConnectivityResult.none) {
if (connectivityResult.isNotEmpty &&
connectivityResult[0] != ConnectivityResult.none) {
onStatusChange(connectivityResult.toString());
} else {
onStatusChange(connectivityResult.toString());

View File

@@ -18,3 +18,24 @@ List<String> countryFlag = [
AppImages.saudiArabiaflag,
AppImages.unitedArabEmiratesFlag,
];
List<String> isoCountryCode = [
"+973",
"+965",
"+968",
"+974",
"+966",
"+971",
];
/* List<String> countryFlag = [
AppImages.bahrainFlag,
// AppImages.kuwaitFlag,
// AppImages.omanFlag,
AppImages.qatarFlag,
AppImages.bahrainFlag,
AppImages.qatarFlag,
// AppImages.saudiArabiaflag,
// AppImages.unitedArabEmiratesFlag,
]; */

View File

@@ -0,0 +1,55 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class AppLocalizations {
final Locale locale;
AppLocalizations(this.locale);
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
}
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
late Map<String, String> _localizedStrings;
Future<bool> load() async {
String jsonString = await rootBundle
.loadString('assets/language/${locale.languageCode}.json');
Map<String, dynamic> jsonMap = json.decode(jsonString);
_localizedStrings = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
return true;
}
String translate(String key) {
return _localizedStrings[key] ?? key;
}
}
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
return ['en', 'ar'].contains(locale.languageCode);
}
@override
Future<AppLocalizations> load(Locale locale) async {
AppLocalizations localizations = AppLocalizations(locale);
await localizations.load();
return localizations;
}
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}

View File

@@ -0,0 +1,19 @@
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
class CommaTextInputFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
final text = newValue.text;
if (text.isEmpty) {
return newValue;
}
final newText = NumberFormat("#,##0", "en_US")
.format(int.parse(text.replaceAll(',', '')));
return newValue.copyWith(
text: newText,
selection: TextSelection.collapsed(offset: newText.length),
);
}
}

View File

@@ -4,6 +4,7 @@ import 'package:tanami_app/features/MainScreens/Academy/presentation/pages/acade
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class AcademyScreen extends StatefulWidget {
const AcademyScreen({super.key});
@@ -15,6 +16,7 @@ class AcademyScreen extends StatefulWidget {
class _AcademyScreenState extends State<AcademyScreen> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
appBar: AppBar(
@@ -24,7 +26,7 @@ class _AcademyScreenState extends State<AcademyScreen> {
scrolledUnderElevation: 0,
automaticallyImplyLeading: false,
title: TextWidget().text22W700(
AppText.academyText,
localizations.translate(AppText.academyText),
clr: AppColor.charcoalColor,
),
titleSpacing: 16,

View File

@@ -6,11 +6,14 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class AcademyDetailSection extends StatelessWidget {
const AcademyDetailSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
decoration: BoxDecoration(
color: AppColor.plainWhite,
@@ -59,7 +62,7 @@ class AcademyDetailSection extends StatelessWidget {
),
Gap(5.w),
TextWidget().text12W700(
'3 ${AppText.videosTitle}',
'3 ${localizations.translate(AppText.videosTitle)}',
clr: AppColor.academyCardTextColor,
),
],

View File

@@ -4,12 +4,14 @@ import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class AcademyVideoSection extends StatelessWidget {
const AcademyVideoSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
decoration: BoxDecoration(
color: Colors.white,
@@ -29,7 +31,7 @@ class AcademyVideoSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.videosTitle,
localizations.translate(AppText.videosTitle),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,

View File

@@ -12,9 +12,11 @@ class InvestPaymentBloc extends Bloc<InvestPaymentEvent, InvestPaymentState> {
return formKey;
}
InvestPaymentBloc() : super(const InvestPaymentState(isFormValid: false)) {
InvestPaymentBloc()
: super(const InvestPaymentState(isFormValid: false, amount: 0)) {
on<FormTextChanged>((event, emit) {
emit(state.copyWith(isFormValid: event.text.isNotEmpty));
final amount = double.tryParse(event.text.replaceAll(',', '')) ?? 0;
emit(state.copyWith(isFormValid: event.text.isNotEmpty, amount: amount));
});
}

View File

@@ -2,15 +2,23 @@ import 'package:equatable/equatable.dart';
class InvestPaymentState extends Equatable {
final bool isFormValid;
final double amount;
const InvestPaymentState({required this.isFormValid});
const InvestPaymentState({
required this.isFormValid,
required this.amount,
});
InvestPaymentState copyWith({bool? isFormValid}) {
InvestPaymentState copyWith({
bool? isFormValid,
double? amount,
}) {
return InvestPaymentState(
isFormValid: isFormValid ?? this.isFormValid,
amount: amount ?? this.amount,
);
}
@override
List<Object> get props => [isFormValid];
List<Object> get props => [isFormValid, amount];
}

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/invest_video_section.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/widgets/invest_video_section.dart';
import '../widgets/invest_detail_details_section.dart';
import '../widgets/invest_detail_image_carousel.dart';
@@ -37,7 +37,9 @@ class InvestDetailsLayout extends StatelessWidget {
),
child: Column(
children: [
InvestDetailCarouselView(),
InvestDetailCarouselView(
type: type,
),
InvestDetailDetailsSection(
type: type,
),
@@ -48,14 +50,12 @@ class InvestDetailsLayout extends StatelessWidget {
20.h,
),
const KeyInvestmentSection(),
Gap(
20.h,
),
const InvestIncludedDocumentsSection(),
Gap(
20.h,
),
const InvestVideoSection(),
type == "closed" ? const SizedBox() : Gap(20.h),
type == "closed"
? const SizedBox()
: const InvestIncludedDocumentsSection(),
type == "closed" ? const SizedBox() : Gap(20.h),
type == "closed" ? const SizedBox() : const InvestVideoSection(),
],
),
),

View File

@@ -7,6 +7,7 @@ import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/button_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/appbar_widget.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_bloc.dart';
import 'invest_details_layout.dart';
@@ -17,6 +18,7 @@ class InvestDetailsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
bottomNavigationBar: type == "closed"
@@ -26,7 +28,7 @@ class InvestDetailsScreen extends StatelessWidget {
width: 1.sw,
height: 65.h,
child: ButtonWidget().elevatedBtn(
text: AppText.investText,
text: localizations.translate(AppText.investText),
clr: AppColor.primaryColor2,
function: () {
goRouter.pushNamed(RouteName.investPaymentScreen);

View File

@@ -7,6 +7,7 @@ import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/widgets/kyc_card.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../bloc/tab_bloc.dart';
import '../bloc/tab_event.dart';
import '../bloc/tab_state.dart';
@@ -19,6 +20,7 @@ class InvestLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return DefaultTabController(
length: 2,
child: Scaffold(
@@ -26,9 +28,9 @@ class InvestLayout extends StatelessWidget {
body: Column(
children: [
TabBar(
tabs: const [
Tab(text: AppText.availableText),
Tab(text: AppText.closedText),
tabs: [
Tab(text: localizations.translate(AppText.availableText)),
Tab(text: localizations.translate(AppText.closedText)),
],
labelStyle: GoogleFonts.dmSans(
fontWeight: FontWeight.bold,
@@ -82,7 +84,7 @@ class AvailableItemsScreen extends StatelessWidget {
horizontal: 16,
vertical: 18,
),
child: kycCard())
child: kycCard(context))
: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
@@ -136,44 +138,36 @@ class ClosedItemsScreen extends StatelessWidget {
return ListView.builder(
itemCount: state.closedItems.length,
itemBuilder: (context, index) {
return index == 0
? Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 18,
return GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
pathParameters: {"type": "closed"});
},
child: Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 18,
),
decoration: BoxDecoration(
color: AppColor.plainWhite,
borderRadius: const BorderRadius.all(Radius.circular(20.0)),
boxShadow: [
BoxShadow(
color: AppColor.plainBlack.withOpacity(0.15),
spreadRadius: 2,
blurRadius: 10,
offset: const Offset(0, 3),
),
child: kycCard())
: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
pathParameters: {"type": "closed"});
},
child: Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 18,
),
decoration: BoxDecoration(
color: AppColor.plainWhite,
borderRadius:
const BorderRadius.all(Radius.circular(20.0)),
boxShadow: [
BoxShadow(
color: AppColor.plainBlack.withOpacity(0.15),
spreadRadius: 2,
blurRadius: 10,
offset: const Offset(0, 3),
),
],
),
child: Column(
children: [
InvestCarouselView(),
const InvestClosedDetailsSection(),
],
),
),
);
],
),
child: Column(
children: [
InvestCarouselView(),
const InvestClosedDetailsSection(),
],
),
),
);
},
);
},

View File

@@ -5,6 +5,7 @@ import 'package:tanami_app/features/MainScreens/Portfolio/presentation/bloc/caro
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
import 'invest_layout.dart';
@@ -18,6 +19,7 @@ class InvestScreen extends StatefulWidget {
class _InvestScreenState extends State<InvestScreen> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
appBar: AppBar(
@@ -27,7 +29,7 @@ class _InvestScreenState extends State<InvestScreen> {
scrolledUnderElevation: 0,
automaticallyImplyLeading: false,
title: TextWidget().text22W700(
AppText.investText,
localizations.translate(AppText.investText),
clr: AppColor.charcoalColor,
),
titleSpacing: 16,

View File

@@ -27,7 +27,7 @@ class ConfirmInvestmentScreen extends StatelessWidget {
),
),
),
body: ConfirmInvestmentLayout(),
body: const ConfirmInvestmentLayout(),
);
}
}

View File

@@ -6,6 +6,7 @@ import 'package:tanami_app/features/MainScreens/Invest/presentation/bloc/payment
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import 'invest_payment_layout.dart';
class InvestPaymentScreen extends StatelessWidget {
@@ -13,6 +14,7 @@ class InvestPaymentScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
appBar: AppBar(
@@ -21,7 +23,7 @@ class InvestPaymentScreen extends StatelessWidget {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.investmentDetailsText,
localizations.translate(AppText.investmentDetailsText),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,

View File

@@ -5,6 +5,7 @@ import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class InvestClosedDetailsSection extends StatelessWidget {
@@ -12,6 +13,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
Container(
@@ -71,7 +73,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
5.w,
),
TextWidget().text12W700(
"${AppText.closingDateText}: ",
"${localizations.translate(AppText.closedDateText)}: ",
clr: AppColor.plainBlack,
),
TextWidget().text12W500(
@@ -84,21 +86,21 @@ class InvestClosedDetailsSection extends StatelessWidget {
Gap(
10.h,
),
TextWidget()
.text22W900("SAR 1,478,000", clr: AppColor.investTextColor),
const Gap(8.0),
LinearProgressIndicator(
value: 1,
borderRadius: BorderRadius.circular(2),
minHeight: 8.0,
backgroundColor: AppColor.txtBorderColor,
valueColor: const AlwaysStoppedAnimation<Color>(
AppColor.investTextColor),
),
const Gap(8.0),
TextWidget().text11W700("100% ${AppText.fundedText}",
clr: AppColor.portoflioCardTextColor),
const Gap(8.0),
// TextWidget()
// .text22W900("SAR 1,478,000", clr: AppColor.investTextColor),
// const Gap(8.0),
// LinearProgressIndicator(
// value: 1,
// borderRadius: BorderRadius.circular(2),
// minHeight: 8.0,
// backgroundColor: AppColor.txtBorderColor,
// valueColor: const AlwaysStoppedAnimation<Color>(
// AppColor.investTextColor),
// ),
// const Gap(8.0),
// TextWidget().text11W700("100% ${AppText.fundedText}",
// clr: AppColor.portoflioCardTextColor),
// const Gap(8.0),
TextWidget().text14W400(
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
clr: Colors.grey,
@@ -127,7 +129,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.sponsorNameText}:",
"${localizations.translate(AppText.sponsorNameText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -142,28 +144,6 @@ class InvestClosedDetailsSection extends StatelessWidget {
SizedBox(
height: 8.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 200.w,
child: TextWidget().text14W500(
"${AppText.originalEstimatedReturnText}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
),
TextWidget().text14W700(
'20.0%',
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
],
),
SizedBox(
height: 8.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -171,7 +151,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.actualEstimatedReturnText}:",
"${localizations.translate(AppText.actualReturnToDate)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -193,7 +173,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.holdingPeriodText}:",
"${localizations.translate(AppText.holdingPeriodText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -213,7 +193,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
"${AppText.payoutDateText}:",
"${localizations.translate(AppText.expectedExitDate)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),

View File

@@ -4,6 +4,7 @@ import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class InvestDetailDetailsSection extends StatelessWidget {
@@ -12,6 +13,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
Container(
@@ -28,24 +30,30 @@ class InvestDetailDetailsSection extends StatelessWidget {
Gap(
10.h,
),
TextWidget()
.text22W900("SAR 1,478,000", clr: AppColor.investTextColor),
const Gap(8.0),
LinearProgressIndicator(
value: type == "closed" ? 1 : 0.6,
borderRadius: BorderRadius.circular(2),
minHeight: 8.0,
backgroundColor: AppColor.txtBorderColor,
valueColor: const AlwaysStoppedAnimation<Color>(
AppColor.investTextColor),
),
const Gap(8.0),
TextWidget().text11W700(
type == "closed"
? "100% ${AppText.fundedText}"
: "60% ${AppText.fundedText}",
clr: AppColor.portoflioCardTextColor),
const Gap(8.0),
type == "closed"
? const SizedBox()
: TextWidget().text22W900("SAR 1,478,000",
clr: AppColor.investTextColor),
type == "closed" ? const SizedBox() : const Gap(8.0),
type == "closed"
? const SizedBox()
: LinearProgressIndicator(
value: type == "closed" ? 1 : 0.6,
borderRadius: BorderRadius.circular(2),
minHeight: 8.0,
backgroundColor: AppColor.txtBorderColor,
valueColor: const AlwaysStoppedAnimation<Color>(
AppColor.investTextColor),
),
type == "closed" ? const SizedBox() : const Gap(8.0),
type == "closed"
? const SizedBox()
: TextWidget().text11W700(
type == "closed"
? "100% ${localizations.translate(AppText.fundedText)}"
: "60% ${localizations.translate(AppText.fundedText)}",
clr: AppColor.portoflioCardTextColor),
type == "closed" ? const SizedBox() : const Gap(8.0),
TextWidget().text14W400(
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
clr: Colors.grey,
@@ -75,7 +83,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.sponsorNameText}:",
"${localizations.translate(AppText.sponsorNameText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -87,29 +95,9 @@ class InvestDetailDetailsSection extends StatelessWidget {
)
],
),
SizedBox(
height: 8.h,
),
type == "closed" ? const SizedBox() : SizedBox(height: 8.h),
type == "closed"
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 200.w,
child: TextWidget().text14W500(
"${AppText.originalEstimatedReturnText}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
),
TextWidget().text14W700(
'20.0%',
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
],
)
? const SizedBox()
: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -117,7 +105,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.estimatedReturnText}:",
"${localizations.translate(AppText.estimatedReturnText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -142,7 +130,9 @@ class InvestDetailDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.actualEstimatedReturnText}:",
type == "closed"
? "${localizations.translate(AppText.actualReturnToDate)}:"
: "${localizations.translate(AppText.actualEstimatedReturnText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -170,7 +160,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.holdingPeriodText}:",
"${localizations.translate(AppText.holdingPeriodText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -191,7 +181,9 @@ class InvestDetailDetailsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
"${AppText.payoutDateText}:",
type == "closed"
? "${localizations.translate(AppText.expectedExitDate)}:"
: "${localizations.translate(AppText.payoutDateText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -207,7 +199,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
"${AppText.minimumInvestmentText}:",
"${localizations.translate(AppText.minimumInvestmentText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),

View File

@@ -7,6 +7,7 @@ import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_bloc.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_event.dart';
@@ -21,12 +22,15 @@ final List imgList = [
];
class InvestDetailCarouselView extends StatelessWidget {
final String type;
final CarouselController _controller = CarouselController();
InvestDetailCarouselView({super.key});
InvestDetailCarouselView({super.key, required this.type});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
height: 190.h,
decoration: const BoxDecoration(
@@ -135,7 +139,9 @@ class InvestDetailCarouselView extends StatelessWidget {
5.w,
),
TextWidget().text11W500(
'${AppText.closingDateText} Jul 10 2025',
type == "closed"
? '${localizations.translate(AppText.closedDateText)} Jul 10 2025'
: '${localizations.translate(AppText.closingDateText)} Jul 10 2025',
clr: AppColor.plainBlack,
),
],

View File

@@ -5,6 +5,7 @@ import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class InvestDetailsSection extends StatelessWidget {
@@ -12,6 +13,7 @@ class InvestDetailsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
Container(
@@ -71,7 +73,7 @@ class InvestDetailsSection extends StatelessWidget {
5.w,
),
TextWidget().text12W700(
"${AppText.closingDateText}: ",
"${localizations.translate(AppText.closingDateText)}: ",
clr: AppColor.plainBlack,
),
TextWidget().text12W500(
@@ -96,7 +98,8 @@ class InvestDetailsSection extends StatelessWidget {
AppColor.investTextColor),
),
const Gap(8.0),
TextWidget().text11W700("60% ${AppText.fundedText}",
TextWidget().text11W700(
"60% ${localizations.translate(AppText.fundedText)}",
clr: AppColor.portoflioCardTextColor),
const Gap(8.0),
TextWidget().text14W400(
@@ -127,7 +130,7 @@ class InvestDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.sponsorNameText}:",
"${localizations.translate(AppText.sponsorNameText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -149,7 +152,7 @@ class InvestDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.estimatedReturnText}:",
"${localizations.translate(AppText.estimatedReturnText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -171,7 +174,7 @@ class InvestDetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
"${AppText.holdingPeriodText}:",
"${localizations.translate(AppText.holdingPeriodText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -191,7 +194,7 @@ class InvestDetailsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
"${AppText.minimumInvestmentText}:",
"${localizations.translate(AppText.minimumInvestmentText)}:",
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),

View File

@@ -6,12 +6,14 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class InvestIncludedDocumentsSection extends StatelessWidget {
const InvestIncludedDocumentsSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
width: double.infinity,
decoration: BoxDecoration(
@@ -32,7 +34,7 @@ class InvestIncludedDocumentsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text15W700(
AppText.includeddocs,
localizations.translate(AppText.includeddocs),
clr: AppColor.plainBlack,
),
Gap(

View File

@@ -4,12 +4,14 @@ import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class InvestVideoSection extends StatelessWidget {
const InvestVideoSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
decoration: BoxDecoration(
color: Colors.white,
@@ -29,7 +31,7 @@ class InvestVideoSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.videosTitle,
localizations.translate(AppText.videosTitle),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,
@@ -84,6 +86,4 @@ class InvestVideoSection extends StatelessWidget {
List videos = [
'assets/images/academy_screen/vd_bg.jpg',
'assets/images/academy_screen/vd_bg.jpg',
'assets/images/academy_screen/vd_bg.jpg'
];

View File

@@ -7,12 +7,14 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class KeyInvestmentSection extends StatelessWidget {
const KeyInvestmentSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 5),
@@ -34,7 +36,7 @@ class KeyInvestmentSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text15W700(
AppText.keyMeritsOfInvestmentText,
localizations.translate(AppText.keyMeritsOfInvestmentText),
clr: AppColor.plainBlack,
),
Gap(

View File

@@ -6,7 +6,10 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
Widget kycCard() {
import '../../../../../core/utils/language/localizations_delegate.dart';
Widget kycCard(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
clipBehavior: Clip.antiAlias,
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
@@ -42,11 +45,12 @@ Widget kycCard() {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
AppText.completeYourVerification,
localizations.translate(AppText.completeYourVerification),
clr: AppColor.languageTextColor,
),
TextWidget().text11W500(
AppText.verifyYourAccountInUnderMinutesToStartInvestingToday,
localizations.translate(AppText
.verifyYourAccountInUnderMinutesToStartInvestingToday),
clr: AppColor.languageTextColor,
),
],

View File

@@ -5,6 +5,7 @@ import '../../../../../../core/routes/route_name.dart';
import '../../../../../../core/routes/routes.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../shared/components/button_widget.dart';
class ConfirmInvestBottomSection extends StatelessWidget {
@@ -14,6 +15,7 @@ class ConfirmInvestBottomSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
@@ -27,7 +29,7 @@ class ConfirmInvestBottomSection extends StatelessWidget {
goRouter.pushNamed(RouteName.otpScreen,
pathParameters: {"fromScreen": "confirm-investment"});
},
text: AppText.investText,
text: localizations.translate(AppText.investText),
clr: AppColor.primaryColor2,
),
);

View File

@@ -5,11 +5,14 @@ import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
class ConfirmInvestTopSection extends StatelessWidget {
const ConfirmInvestTopSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -67,32 +70,36 @@ class ConfirmInvestTopSection extends StatelessWidget {
),
),
),
child: const Column(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(12.0),
padding: const EdgeInsets.all(12.0),
child: Column(
children: [
InvestmentDetailRow(
label: AppText.investmentamount,
label: localizations
.translate(AppText.investmentamount),
value: 'SAR 1,000',
subTitle: "\$ 267,00",
),
SizedBox(height: 8.0),
const SizedBox(height: 8.0),
InvestmentDetailRow(
label: AppText.paymentMethod,
label:
localizations.translate(AppText.paymentMethod),
value: 'Wallet',
subTitle: "",
),
SizedBox(height: 8.0),
const SizedBox(height: 8.0),
InvestmentDetailRow(
label: AppText.currentExchangeText,
label: localizations
.translate(AppText.currentExchangeText),
value: 'SAR 1 = USD 0.27',
subTitle: "",
),
SizedBox(height: 8.0),
const SizedBox(height: 8.0),
InvestmentDetailRow(
label: '${AppText.totalDebitedAmountText}:',
label:
'${localizations.translate(AppText.totalDebitedAmountText)}:',
value: 'SAR 1,000',
subTitle: "",
),

View File

@@ -1,13 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import '../../../../../../core/routes/routes.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_images.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../shared/components/button_widget.dart';
import '../../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../../../../countrySelection/bloc/choose_country_state.dart';
import '../../bloc/payment/invest_payment_bloc.dart';
import '../../bloc/payment/invest_payment_state.dart';
@@ -16,42 +22,99 @@ class InvestPayBottomSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
BlocBuilder<InvestPaymentBloc, InvestPaymentState>(
builder: (context, state) {
return Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
function: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.confirmInvestScreen);
}
},
text: AppText.nextText,
clr: state.isFormValid
? AppColor.primaryColor2
: AppColor.inactiveBtnColor),
return BlocBuilder<RadioBloc, RadioState>(
builder: (context, radioState) {
int selectedIndex = 0;
if (radioState is RadioSelectionChanged) {
selectedIndex = radioState.selectedIndex;
}
return selectedIndex == 1
? InkWell(
onTap: () {
goRouter.pushNamed(RouteName.walletDetails,
pathParameters: {
"type": 'confirm-investment',
});
},
child: Container(
margin: const EdgeInsets.all(10.0),
height: 65.h,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: state.isFormValid
? AppColor.plainBlack
: AppColor.inactiveBtnColor),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
AppImages.applePayIcon,
color: AppColor.plainWhite,
height: 32,
width: 32,
),
const Gap(5),
Text(
localizations
.translate(AppText.payWithAppleText),
style: GoogleFonts.dmSans(
color: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
),
)
: Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
function: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.otpScreen,
pathParameters: {
"fromScreen": "confirm-investment"
});
}
},
text: localizations
.translate(AppText.confirmInvestmentText),
clr: state.isFormValid
? AppColor.primaryColor2
: AppColor.inactiveBtnColor),
);
},
);
},
),
const Gap(5),
ButtonWidget().textBorderBtn(
borderClr: AppColor.txtBorderColor,
clr: AppColor.plainWhite,
function: () {
goRouter.pop();
},
text: AppText.backText,
),
// const Gap(5),
// ButtonWidget().textBorderBtn(
// borderClr: AppColor.txtBorderColor,
// clr: AppColor.plainWhite,
// function: () {
// goRouter.pop();
// },
// text: AppText.backText,
// ),
],
);
}

View File

@@ -8,15 +8,17 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../countrySelection/presentation/bloc/choose_country_bloc.dart';
import '../../../../../countrySelection/presentation/bloc/choose_country_event.dart';
import '../../../../../countrySelection/presentation/bloc/choose_country_state.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../../../../countrySelection/bloc/choose_country_event.dart';
import '../../../../../countrySelection/bloc/choose_country_state.dart';
class InvestPayMethodSection extends StatelessWidget {
const InvestPayMethodSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final radioBloc = context.read<RadioBloc>();
return Padding(
padding: const EdgeInsets.fromLTRB(16.0, 0.0, 16.0, 0.0),
@@ -30,7 +32,8 @@ class InvestPayMethodSection extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text15W700(AppText.choosePaymentMethodText,
TextWidget().text15W700(
localizations.translate(AppText.choosePaymentMethodText),
clr: AppColor.plainBlack),
const Gap(16),
GestureDetector(
@@ -88,7 +91,9 @@ class InvestPayMethodSection extends StatelessWidget {
const Gap(5),
SvgPicture.asset(AppImages.walletIcon),
const Gap(5),
TextWidget().text14W700(AppText.walletText,
TextWidget().text14W700(
localizations
.translate(AppText.walletText),
clr: AppColor.textLabelColor),
],
),
@@ -98,7 +103,8 @@ class InvestPayMethodSection extends StatelessWidget {
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balanceText}: ',
text:
'${localizations.translate(AppText.balanceText)}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.0,
@@ -116,11 +122,11 @@ class InvestPayMethodSection extends StatelessWidget {
],
),
),
const Icon(
Icons.arrow_forward,
color: Colors.grey,
size: 15,
)
// const Icon(
// Icons.arrow_forward,
// color: Colors.grey,
// size: 15,
// )
],
),
],
@@ -196,7 +202,9 @@ class InvestPayMethodSection extends StatelessWidget {
const Gap(5),
SvgPicture.asset(AppImages.applePayIcon),
const Gap(5),
TextWidget().text14W700(AppText.applePayText,
TextWidget().text14W700(
localizations
.translate(AppText.applePayText),
clr: AppColor.textLabelColor),
],
),
@@ -206,7 +214,8 @@ class InvestPayMethodSection extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(12),
child: TextWidget().text14W500(
AppText.instantTransferFundsApplePayText,
localizations.translate(
AppText.instantTransferFundsApplePayText),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),

View File

@@ -7,15 +7,21 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart';
import '../../../../../../shared/components/text_from_field_widget.dart';
import '../../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../../../../countrySelection/bloc/choose_country_state.dart';
import '../../bloc/payment/invest_payment_bloc.dart';
import '../../bloc/payment/invest_payment_event.dart';
import '../../bloc/payment/invest_payment_state.dart';
class InvestPayTopSection extends StatelessWidget {
const InvestPayTopSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final investPaymentBloc = context.read<InvestPaymentBloc>();
return Padding(
@@ -23,7 +29,8 @@ class InvestPayTopSection extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text15W700(AppText.enterInvestmentAmountText,
TextWidget().text15W700(
localizations.translate(AppText.enterInvestmentAmountText),
clr: AppColor.plainBlack),
const Gap(16.0),
Container(
@@ -107,8 +114,9 @@ class InvestPayTopSection extends StatelessWidget {
.amountController
.text
.isEmpty) {
return AppText
.pleaseEnterAmountText;
return localizations.translate(
AppText
.pleaseEnterAmountText);
}
return null;
},
@@ -118,11 +126,15 @@ class InvestPayTopSection extends StatelessWidget {
.add(FormTextChanged(
text: value));
},
inputFormatters: [
CommaTextInputFormatter()
],
texttype: TextInputType.number,
textEditingController:
investPaymentBloc
.amountController,
hintText: AppText.enterAmountText,
hintText: localizations.translate(
AppText.enterAmountText),
suffixIcon: const SizedBox(),
),
],
@@ -134,26 +146,38 @@ class InvestPayTopSection extends StatelessWidget {
],
),
),
const Padding(
padding: EdgeInsets.all(12.0),
child: Column(
children: [
InvestmentDetailRow(
label: AppText.currentExchangeText,
value: 'SAR 1 = USD 0.267',
),
SizedBox(height: 8.0),
InvestmentDetailRow(
label: AppText.feeText,
value: '3%',
),
SizedBox(height: 8.0),
InvestmentDetailRow(
label: '${AppText.totalInvestmentAmountText}:',
value: 'SAR 1000',
),
],
),
BlocBuilder<RadioBloc, RadioState>(
builder: (context, radioState) {
int selectedIndex = 0;
if (radioState is RadioSelectionChanged) {
selectedIndex = radioState.selectedIndex;
}
return selectedIndex == 0
? const SizedBox()
: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: [
// InvestmentDetailRow(
// label: AppText.currentExchangeText,
// value: 'SAR 1 = USD 0.267',
// ),
// SizedBox(height: 8.0),
InvestmentDetailRow(
label: localizations
.translate(AppText.processingFees),
value: '3%',
),
const SizedBox(height: 8.0),
InvestmentDetailRow(
label:
'${localizations.translate(AppText.totalInvestmentAmountText)}:',
value: 'SAR 1000',
),
],
),
);
},
)
],
),
@@ -162,37 +186,46 @@ class InvestPayTopSection extends StatelessWidget {
),
),
const Gap(24),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
width: 24,
height: 24,
AppImages.orangenInfoIcon,
),
const Gap(8),
Column(
BlocBuilder<InvestPaymentBloc, InvestPaymentState>(
builder: (context, state) {
if (state.amount >= 200000) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 0.8.sw,
child: TextWidget().text12W500(
AppText.retailInvestirCanInvestMaxText,
clr: AppColor.infoTextColor,
),
Image.asset(
width: 24,
height: 24,
AppImages.orangenInfoIcon,
),
SizedBox(
width: 0.8.sw,
child: TextWidget().text12W700(
AppText.upgradeYourInvestorStatusToIncreaseText,
clr: AppColor.infoTextColor,
txtDec: TextDecoration.underline,
decClr: AppColor.infoTextColor,
),
const Gap(8),
Column(
children: [
SizedBox(
width: 0.8.sw,
child: TextWidget().text12W500(
localizations.translate(
AppText.retailInvestirCanInvestMaxText),
clr: AppColor.infoTextColor,
),
),
SizedBox(
width: 0.8.sw,
child: TextWidget().text12W700(
localizations.translate(
AppText.upgradeYourInvestorStatusToIncreaseText),
clr: AppColor.infoTextColor,
txtDec: TextDecoration.underline,
decClr: AppColor.infoTextColor,
),
),
],
),
],
),
],
),
);
} else {
return const SizedBox();
}
}),
const Gap(15),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -206,7 +239,8 @@ class InvestPayTopSection extends StatelessWidget {
SizedBox(
width: 0.8.sw,
child: TextWidget().text12W500(
AppText.thisIsUsdInvestmentOpportunityText,
localizations
.translate(AppText.thisIsUsdInvestmentOpportunityText),
clr: AppColor.languageTextColor,
),
),

View File

@@ -4,6 +4,7 @@ import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../shared/components/text_widget.dart';
class InvestmentOverSubscribedDialog extends StatelessWidget {
@@ -11,6 +12,7 @@ class InvestmentOverSubscribedDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return AlertDialog(
backgroundColor: AppColor.plainWhite,
shape: RoundedRectangleBorder(
@@ -29,7 +31,7 @@ class InvestmentOverSubscribedDialog extends StatelessWidget {
},
),
TextWidget().text17W700(
AppText.unableToProcessTransactionText,
localizations.translate(AppText.unableToProcessTransactionText),
clr: AppColor.textLabelColor,
),
],
@@ -38,7 +40,8 @@ class InvestmentOverSubscribedDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
TextWidget().text15W500(
AppText.investmentOpportunityHasReachedMaxcapText,
localizations
.translate(AppText.investmentOpportunityHasReachedMaxcapText),
clr: AppColor.hintTextColor,
),
const Gap(20),
@@ -48,7 +51,8 @@ class InvestmentOverSubscribedDialog extends StatelessWidget {
goRouter.pop();
goRouter.pop();
},
child: TextWidget().text14W500(AppText.backToInvestmentText,
child: TextWidget().text14W500(
localizations.translate(AppText.backToInvestmentText),
textDecoration: TextDecoration.underline,
clr: AppColor.otpTextColor),
),

View File

@@ -9,12 +9,14 @@ import 'package:tanami_app/features/MainScreens/Portfolio/presentation/widgets/p
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class PortfolioLayout extends StatelessWidget {
const PortfolioLayout({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
body: CustomScrollView(
@@ -43,7 +45,7 @@ class PortfolioLayout extends StatelessWidget {
child: Row(
children: [
TextWidget().text12W700(
AppText.portfolio,
localizations.translate(AppText.portfolio),
clr: const Color(0xFF888888),
),
TextWidget().text14W700(
@@ -70,12 +72,10 @@ class PortfolioLayout extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W700(
AppText.portfolioText,
localizations.translate(AppText.portfolioText),
clr: const Color(0xFFC9D9CB),
),
Gap(
8.h,
),
Gap(8.h),
TextWidget().text28W700(
'SAR 178,000',
),

View File

@@ -4,6 +4,7 @@ import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class DetailsSection extends StatelessWidget {
@@ -11,6 +12,7 @@ class DetailsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
Container(
@@ -56,7 +58,7 @@ class DetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
AppText.investmentamount,
localizations.translate(AppText.investmentamount),
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -69,10 +71,10 @@ class DetailsSection extends StatelessWidget {
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
TextWidget().text11W400(
' \$ 26,700',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// ' \$ 26,700',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -87,7 +89,7 @@ class DetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
AppText.currentval,
localizations.translate(AppText.currentval),
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -100,10 +102,10 @@ class DetailsSection extends StatelessWidget {
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
TextWidget().text11W400(
' \$ 26,700',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// ' \$ 26,700',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -118,7 +120,7 @@ class DetailsSection extends StatelessWidget {
SizedBox(
width: 150.w,
child: TextWidget().text14W500(
AppText.disttodate,
localizations.translate(AppText.disttodate),
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),
@@ -131,14 +133,14 @@ class DetailsSection extends StatelessWidget {
],
),
SizedBox(
height: 22.h,
height: 8.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.totalreturn,
localizations.translate(AppText.totalreturn),
clr: AppColor.portoflioCardTextColor,
txtAlign: TextAlign.start,
),

View File

@@ -8,6 +8,7 @@ import '../../../../../core/routes/routes.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class ExitedCard extends StatelessWidget {
@@ -19,6 +20,7 @@ class ExitedCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.all(10.0),
child: GestureDetector(
@@ -112,7 +114,7 @@ class ExitedCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.investmentamount,
localizations.translate(AppText.investmentamount),
clr: AppColor.portoflioCardTextColor,
),
Column(
@@ -122,10 +124,10 @@ class ExitedCard extends StatelessWidget {
portfolioModel.investmentAmountSAR,
clr: AppColor.plainBlack,
),
TextWidget().text11W400(
'\$ ${portfolioModel.investmentAmountUSD}',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// '\$ ${portfolioModel.investmentAmountUSD}',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -138,7 +140,7 @@ class ExitedCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.currentval,
localizations.translate(AppText.currentval),
clr: AppColor.portoflioCardTextColor,
),
Column(
@@ -148,10 +150,10 @@ class ExitedCard extends StatelessWidget {
portfolioModel.currentValuationSAR,
clr: AppColor.plainBlack,
),
TextWidget().text11W400(
'\$ ${portfolioModel.currentValuationUSD}',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// '\$ ${portfolioModel.currentValuationUSD}',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -164,7 +166,7 @@ class ExitedCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.totalreturn,
localizations.translate(AppText.totalreturn),
clr: AppColor.portoflioCardTextColor,
),
TextWidget().text14W700(

View File

@@ -6,12 +6,14 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class IncludedDocumentsSection extends StatelessWidget {
const IncludedDocumentsSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
width: double.infinity,
decoration: BoxDecoration(
@@ -32,7 +34,7 @@ class IncludedDocumentsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text15W700(
AppText.includeddocs,
localizations.translate(AppText.includeddocs),
clr: AppColor.plainBlack,
),
Gap(

View File

@@ -8,6 +8,7 @@ import '../../../../../core/routes/routes.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class PendingCard extends StatelessWidget {
@@ -19,6 +20,7 @@ class PendingCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.all(10.0),
child: GestureDetector(
@@ -112,7 +114,7 @@ class PendingCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.investmentamount,
localizations.translate(AppText.investmentamount),
clr: AppColor.portoflioCardTextColor,
),
Column(
@@ -122,10 +124,10 @@ class PendingCard extends StatelessWidget {
portfolioModel.investmentAmountSAR,
clr: AppColor.plainBlack,
),
TextWidget().text11W400(
' \$ ${portfolioModel.investmentAmountUSD}',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// ' \$ ${portfolioModel.investmentAmountUSD}',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -138,7 +140,7 @@ class PendingCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.currentval,
localizations.translate(AppText.currentval),
clr: AppColor.portoflioCardTextColor,
),
Column(
@@ -148,10 +150,10 @@ class PendingCard extends StatelessWidget {
portfolioModel.currentValuationSAR,
clr: AppColor.plainBlack,
),
TextWidget().text11W400(
' \$ ${portfolioModel.currentValuationUSD}',
clr: AppColor.plainBlack,
),
// TextWidget().text11W400(
// ' \$ ${portfolioModel.currentValuationUSD}',
// clr: AppColor.plainBlack,
// ),
],
)
],
@@ -164,7 +166,7 @@ class PendingCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
AppText.totalreturn,
localizations.translate(AppText.totalreturn),
clr: const Color(0xFF535353),
),
TextWidget().text14W700(

View File

@@ -19,7 +19,7 @@ class SettingsLayout extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
kycCard(),
kycCard(context),
const Gap(15),
const GeneralSettingsSection(),
const Gap(15),

View File

@@ -3,6 +3,7 @@ import 'package:tanami_app/features/MainScreens/Settings/presentation/pages/sett
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class SettingsScreen extends StatefulWidget {
@@ -15,6 +16,7 @@ class SettingsScreen extends StatefulWidget {
class _SettingsScreenState extends State<SettingsScreen> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
appBar: AppBar(
@@ -24,12 +26,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
automaticallyImplyLeading: false,
centerTitle: true,
title: TextWidget().text22W700(
AppText.settingsText,
localizations.translate(AppText.settingsText),
clr: AppColor.charcoalColor,
),
titleSpacing: 16,
),
body: SettingsLayout(),
body: const SettingsLayout(),
);
}
}

View File

@@ -9,6 +9,7 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/bloc/toggle/toggle_bloc.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/toggle_widget.dart';
import 'settings_list_tile_item.dart';
@@ -17,6 +18,7 @@ class GeneralSettingsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
@@ -25,7 +27,7 @@ class GeneralSettingsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
AppText.generalText,
localizations.translate(AppText.generalText),
clr: AppColor.hintTextColor,
),
const Gap(5),
@@ -33,11 +35,25 @@ class GeneralSettingsSection extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextWidget().text14W600(
AppText.notificationText,
localizations.translate(AppText.allowNotificationText),
clr: AppColor.textLabelColor,
),
BlocProvider(
create: (_) => ToggleBloc(),
create: (_) => ToggleBloc("notification"),
child: const CustomToggle(),
)
],
),
const Gap(15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextWidget().text14W600(
localizations.translate(AppText.biometricText),
clr: AppColor.textLabelColor,
),
BlocProvider(
create: (_) => ToggleBloc("biometric"),
child: const CustomToggle(),
)
],
@@ -48,8 +64,8 @@ class GeneralSettingsSection extends StatelessWidget {
goRouter.pushNamed(RouteName.languageChangeScreen);
},
icon: AppImages.languageIcon,
title: AppText.languageText,
trailing: AppText.englishText,
title: localizations.translate(AppText.languageText),
trailing: localizations.translate(AppText.englishText),
),
const Gap(10),
const Divider(

View File

@@ -6,7 +6,10 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
Widget kycCard() {
import '../../../../../core/utils/language/localizations_delegate.dart';
Widget kycCard(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
@@ -49,11 +52,11 @@ Widget kycCard() {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
AppText.experiencedInvestorText,
localizations.translate(AppText.removeInvestmentText),
clr: AppColor.kycCardTextColor,
),
TextWidget().text11W500(
AppText.upgradeText,
localizations.translate(AppText.upgradeText),
clr: AppColor.kycCardTextColor,
),
],

View File

@@ -1,15 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/bloc/toggle/toggle_bloc.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/routes/route_name.dart';
import '../../../../../core/routes/routes.dart';
import '../../../../../shared/components/toggle_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import 'settings_list_tile_item.dart';
class PrivacySettingsSection extends StatelessWidget {
@@ -17,6 +15,7 @@ class PrivacySettingsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
@@ -25,24 +24,10 @@ class PrivacySettingsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
AppText.privacySettingsText,
localizations.translate(AppText.privacySettingsText),
clr: AppColor.hintTextColor,
),
const Gap(5),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextWidget().text14W600(
AppText.biometricText,
clr: AppColor.textLabelColor,
),
BlocProvider(
create: (_) => ToggleBloc(),
child: const CustomToggle(),
)
],
),
const Gap(12),
SettingsListItem(
onTapFunc: () {
goRouter.pushNamed(
@@ -50,7 +35,7 @@ class PrivacySettingsSection extends StatelessWidget {
);
},
icon: AppImages.resetPasswordIcon,
title: AppText.resetPasswordText,
title: localizations.translate(AppText.resetPasswordText),
trailing: "",
),
const Gap(8),
@@ -61,7 +46,7 @@ class PrivacySettingsSection extends StatelessWidget {
});
},
icon: AppImages.resetPinIcon,
title: AppText.resetPinCodeText,
title: localizations.translate(AppText.resetPinCodeText),
trailing: "",
),
const Gap(10),

View File

@@ -7,6 +7,7 @@ import 'package:tanami_app/core/routes/routes.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/button_widget.dart';
import '../../../../../shared/components/log_out_dialog.dart';
@@ -15,6 +16,7 @@ class SettingsBottomSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
const Gap(36),
@@ -29,12 +31,12 @@ class SettingsBottomSection extends StatelessWidget {
function: () {
buildprofilelogoutdialog(context);
},
text: AppText.logoutText,
text: localizations.translate(AppText.logoutText),
clr: AppColor.primaryColor2,
),
),
const Gap(5),
Container(
SizedBox(
width: 1.sw,
height: 56.h,
child: ButtonWidget().textBorderBtn(
@@ -43,7 +45,7 @@ class SettingsBottomSection extends StatelessWidget {
function: () {
goRouter.pushNamed(RouteName.deleteAccountScreen);
},
text: AppText.deleteAccountText,
text: localizations.translate(AppText.deleteAccountText),
clr: AppColor.plainWhite,
),
),

View File

@@ -4,6 +4,8 @@ import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class SettingsListItem extends StatelessWidget {
final String icon;
final String title;
@@ -20,6 +22,7 @@ class SettingsListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
padding: const EdgeInsets.symmetric(
vertical: 8.0,
@@ -32,7 +35,7 @@ class SettingsListItem extends StatelessWidget {
onTap: onTapFunc,
leading: SvgPicture.asset(icon),
title: Text(
title,
localizations.translate(title),
style: GoogleFonts.dmSans(
fontSize: 14,
fontWeight: FontWeight.w600,
@@ -41,11 +44,14 @@ class SettingsListItem extends StatelessWidget {
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(trailing,
style: GoogleFonts.dmSans(
fontSize: 15,
fontWeight: FontWeight.w500,
color: AppColor.plainBlack)),
Text(
localizations.translate(trailing),
style: GoogleFonts.dmSans(
fontSize: 15,
fontWeight: FontWeight.w500,
color: AppColor.plainBlack,
),
),
const Gap(10),
const Icon(Icons.arrow_forward_ios, size: 16.0),
],

View File

@@ -7,6 +7,7 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import 'settings_list_tile_item.dart';
class SupportSettingsSection extends StatelessWidget {
@@ -14,6 +15,7 @@ class SupportSettingsSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
@@ -22,7 +24,7 @@ class SupportSettingsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
AppText.supportText,
localizations.translate(AppText.supportText),
clr: AppColor.hintTextColor,
),
const Gap(8),

View File

@@ -13,9 +13,18 @@ class DepositPaymentBloc
return formKey;
}
DepositPaymentBloc() : super(const DepositPaymentState(isFormValid: false)) {
DepositPaymentBloc()
: super(const DepositPaymentState(isFormValid: false, amount: '0')) {
on<FormTextChanged>((event, emit) {
emit(state.copyWith(isFormValid: event.text.isNotEmpty));
final isFormValid = event.text.isNotEmpty;
emit(state.copyWith(
isFormValid: isFormValid,
amount: event.text.isEmpty ? "0" : event.text));
});
// Ensure the listener is added in the constructor
amountController.addListener(() {
add(FormTextChanged(text: amountController.text));
});
}

View File

@@ -2,15 +2,17 @@ import 'package:equatable/equatable.dart';
class DepositPaymentState extends Equatable {
final bool isFormValid;
final String amount;
const DepositPaymentState({required this.isFormValid});
const DepositPaymentState({required this.isFormValid, this.amount = '0'});
DepositPaymentState copyWith({bool? isFormValid}) {
DepositPaymentState copyWith({bool? isFormValid, String? amount}) {
return DepositPaymentState(
isFormValid: isFormValid ?? this.isFormValid,
amount: amount ?? this.amount,
);
}
@override
List<Object> get props => [isFormValid];
List<Object> get props => [isFormValid, amount];
}

View File

@@ -1,60 +1,111 @@
// ignore: file_names
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../../../../../core/routes/route_name.dart';
import '../../../../../../core/routes/routes.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_images.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart';
import '../../../../../../shared/components/text_widget.dart';
import '../../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../../../../countrySelection/bloc/choose_country_state.dart';
import '../../bloc/deposit/deposit_payment_bloc.dart';
import '../../bloc/deposit/deposit_payment_event.dart';
import '../../bloc/deposit/deposit_payment_state.dart';
import '../../widgets/deposit_pay_method_section.dart';
class DepositLayout extends StatelessWidget {
const DepositLayout({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final depositPaymentBloc = context.read<DepositPaymentBloc>();
int selectedIndex = 0;
return Scaffold(
bottomNavigationBar: BlocBuilder<DepositPaymentBloc, DepositPaymentState>(
builder: (context, state) {
return Padding(
padding: MediaQuery.of(context).viewInsets,
child: GestureDetector(
onTap: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.depositPreview);
}
},
child: Container(
margin: const EdgeInsets.all(10.0),
height: 65.h,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: state.isFormValid
? AppColor.primaryColor2
: AppColor.inactiveBtnColor),
child: Center(
child: Text(
AppText.depositNoti,
style: GoogleFonts.dmSans(
color: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
return BlocBuilder<RadioBloc, RadioState>(
builder: (context, radioState) {
if (radioState is RadioSelectionChanged) {
selectedIndex = radioState.selectedIndex;
}
return Padding(
padding: MediaQuery.of(context).viewInsets,
child: GestureDetector(
onTap: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.depositPreview);
}
},
child: selectedIndex == 1
? Container(
margin: const EdgeInsets.all(10.0),
height: 65.h,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: state.isFormValid
? AppColor.plainBlack
: AppColor.inactiveBtnColor),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
AppImages.applePayIcon,
color: AppColor.plainWhite,
height: 32,
width: 32,
),
const Gap(5),
Text(
localizations
.translate(AppText.payWithAppleText),
style: GoogleFonts.dmSans(
color: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
)
: Container(
margin: const EdgeInsets.all(10.0),
height: 65.h,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: state.isFormValid
? AppColor.primaryColor2
: AppColor.inactiveBtnColor),
child: Center(
child: Text(
localizations.translate(AppText.next),
style: GoogleFonts.dmSans(
color: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
),
),
),
),
),
);
},
);
},
),
@@ -65,83 +116,60 @@ class DepositLayout extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balance}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.sp,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: 'SAR 178,000',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.bold,
),
),
],
),
),
SizedBox(
height: 20.h,
),
Container(
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
spreadRadius: 2,
blurRadius: 10,
offset: const Offset(0, 5),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Color(0xFF0FA4A4)),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Image.asset(
'assets/images/wallet_screen/deposit_list.png',
height: 36.h,
// RichText(
// text: TextSpan(
// children: [
// TextSpan(
// text: '${localizations.translate(AppText.balance)}: ',
// style: GoogleFonts.dmSans(
// color: Colors.grey,
// fontSize: 12.sp,
// fontWeight: FontWeight.bold,
// ),
// ),
// TextSpan(
// text: 'SAR 178,000',
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 14.sp,
// fontWeight: FontWeight.bold,
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 20.h,
// ),
BlocBuilder<DepositPaymentBloc, DepositPaymentState>(
builder: (context, state) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(12.0),
child: selectedIndex == 1
? Row(children: [
SvgPicture.asset(AppImages.applePayIcon),
const Gap(5),
TextWidget().text14W700(
localizations
.translate(AppText.applePayText),
clr: AppColor.textLabelColor),
])
: Row(
children: [
SvgPicture.asset(AppImages.walletIcon),
const Gap(5),
TextWidget().text14W700(
localizations
.translate(AppText.bankTransfer),
clr: AppColor.textLabelColor),
],
),
),
),
SizedBox(
width: 12.w,
),
Text(
AppText.depositTitle,
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 17.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
Container(
decoration: BoxDecoration(
color: const Color(0xFFD8D8D8).withOpacity(0.4),
),
child: Padding(
Padding(
padding: const EdgeInsets.symmetric(
vertical: 16.0, horizontal: 12.0),
child: Row(
@@ -152,7 +180,7 @@ class DepositLayout extends StatelessWidget {
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 15.sp,
fontWeight: FontWeight.w700,
fontWeight: FontWeight.w400,
),
),
SizedBox(
@@ -161,16 +189,22 @@ class DepositLayout extends StatelessWidget {
SizedBox(
width: 280.w,
child: TextFormField(
inputFormatters: [
CommaTextInputFormatter(),
FilteringTextInputFormatter.deny(
RegExp(r'\s')),
LengthLimitingTextInputFormatter(20),
],
validator: (value) {
if (depositPaymentBloc
.amountController.text.isEmpty) {
return AppText.pleaseEnterAmountText;
return localizations.translate(
AppText.pleaseEnterAmountText);
}
return null;
},
onChanged: (value) {
context
.read<DepositPaymentBloc>()
depositPaymentBloc
.add(FormTextChanged(text: value));
},
controller: depositPaymentBloc.amountController,
@@ -226,85 +260,78 @@ class DepositLayout extends StatelessWidget {
color: Colors.red, width: 1),
),
),
inputFormatters: [
FilteringTextInputFormatter.deny(
RegExp(r'\s')),
LengthLimitingTextInputFormatter(20),
],
),
),
],
),
),
),
Container(
decoration: BoxDecoration(
color: const Color(0xFFD8D8D8).withOpacity(0.4),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(22.r),
bottomRight: Radius.circular(22.r),
),
border: const Border(
top: BorderSide(color: Color(0xFFD8D8D8), width: 2.0),
),
),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 16.0, horizontal: 12.0),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Fee',
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
Text(
'3%',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
// Container(
// decoration: BoxDecoration(
// color: const Color(0xFFD8D8D8).withOpacity(0.4),
// borderRadius: BorderRadius.only(
// bottomLeft: Radius.circular(22.r),
// bottomRight: Radius.circular(22.r),
// ),
// border: const Border(
// top: BorderSide(
// color: Color(0xFFD8D8D8), width: 2.0),
// ),
// ),
// child: Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 16.0, horizontal: 12.0),
// child: Column(
// children: [
// Row(
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text(
// localizations
// .translate(AppText.processingFees),
// style: GoogleFonts.dmSans(
// color: const Color(0xFF535353),
// fontSize: 14.sp,
// fontWeight: FontWeight.w500,
// ),
// ),
// Text(
// '3%',
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 14.sp,
// fontWeight: FontWeight.w700,
// ),
// ),
// ],
// ),
// ],
// ),
// ),
// ),
const Gap(15),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
localizations
.translate("Total : SAR ${state.amount}"),
style: GoogleFonts.dmSans(
color: const Color(0xFF066123),
fontSize: 16.sp,
fontWeight: FontWeight.w700,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Total Deposit amount:',
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
Text(
'SAR 253',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
),
],
),
),
],
),
),
],
),
],
);
},
),
const Gap(30),
const DepositPayMethodSection(),
const Gap(16),
// const Gap(30),
// const DepositPayMethodSection(),
// const Gap(16),
],
),
),

View File

@@ -6,17 +6,14 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_bloc.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart';
class DepositScreen extends StatefulWidget {
import '../../../../../../core/utils/language/localizations_delegate.dart';
class DepositScreen extends StatelessWidget {
const DepositScreen({super.key});
@override
State<DepositScreen> createState() => _DepositScreenState();
}
class _DepositScreenState extends State<DepositScreen> {
int selectedIndex = 0;
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
@@ -25,7 +22,7 @@ class _DepositScreenState extends State<DepositScreen> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.depositScreenTitle,
localizations.translate(AppText.deposit),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,

View File

@@ -0,0 +1,161 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../shared/components/button_widget.dart';
class DepositStepScreen extends StatelessWidget {
const DepositStepScreen({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: Colors.white,
bottomNavigationBar: Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
function: () {
goRouter.pushNamed(RouteName.depositScreen);
},
text: localizations.translate(AppText.next),
clr: AppColor.primaryColor2,
),
),
appBar: AppBar(
backgroundColor: Colors.white,
elevation: 0,
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
localizations.translate(AppText.bankTransfer),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
fontWeight: FontWeight.w700,
),
),
actions: const [
Icon(
Icons.info,
color: Color(0xFF363636),
),
Gap(10)
],
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 20),
decoration: ShapeDecoration(
color: const Color(0xFFF6F6F6),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(22),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: 0.8.sw,
child: Text(
'In order for you to complete a bank transfer, you need will need to create a deposit notification and transfer funds from your wallet, directly into your bank account.',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 14,
fontWeight: FontWeight.w500,
),
),
),
const Spacer(),
const Icon(
Icons.close,
color: Color(0xFF363636),
)
],
),
),
const Gap(16),
TextWidget().text15W700("Please complete the below steps",
clr: AppColor.plainBlack),
const Gap(16),
Padding(
padding: const EdgeInsets.all(16.0),
child: ListView(
shrinkWrap: true,
children: [
Row(
children: [
SvgPicture.asset(AppImages.dStep1Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
"Insert the amount you would like to transfer.",
clr: const Color(0xFF363636),
txtAlign: TextAlign.start,
),
)
],
),
const Gap(24),
Row(
children: [
SvgPicture.asset(AppImages.dStep2Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
"Copy the bank details of your Tanami account shown on the next page. Make sure to keep note of the reference ID.",
clr: const Color(0xFF363636),
txtAlign: TextAlign.start,
),
)
],
),
const Gap(24),
Row(
children: [
SvgPicture.asset(AppImages.dStep3Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
"Insert the amount you would like to transfer.",
clr: const Color(0xFF363636),
txtAlign: TextAlign.start,
),
)
],
),
],
),
),
const Spacer(),
TextWidget().text13W500(
"Tanami will notify you upon receipt of your funds and it will appear in your wallet balance 3-4 business days after initiating the transfer.",
clr: const Color(0xFF888888),
fontStyle: FontStyle.italic),
],
),
),
);
}
}

View File

@@ -3,8 +3,10 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
class DepositPreview extends StatefulWidget {
const DepositPreview({super.key});
@@ -14,23 +16,14 @@ class DepositPreview extends StatefulWidget {
}
class _DepositPreviewState extends State<DepositPreview> {
List titles = [
AppText.accountHolderName,
AppText.iban,
AppText.beneficiaryAddress,
AppText.bankName,
AppText.branchAddress,
AppText.SWIFTcode,
AppText.refid,
];
List values = [
'Name Surname',
'DE 1234 5678 9012 3456',
'Hohenzollernring 58, 95444',
'Name Bank',
'Hohenzollernring 58, 95444',
'BC12345',
'FRYU FHDU 1234',
'Tanami Capital W.L.L',
'100000480779',
'BH 23 BBKU 00100 00048 0779',
'BBKUBHBM',
'Bank of Bahrain and Kuwait B.S.C',
'43 Government Avenue, Manama, Kingdom of Bahrain',
'BH00600000',
];
List titles2 = [
@@ -47,6 +40,16 @@ class _DepositPreviewState extends State<DepositPreview> {
];
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List titles = [
localizations.translate("Account Name"),
localizations.translate("Account No."),
localizations.translate("IBAN"),
localizations.translate("SWIFT Code"),
localizations.translate("Bank Name"),
localizations.translate("Bank Address"),
localizations.translate("Client ID"),
];
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
@@ -55,7 +58,7 @@ class _DepositPreviewState extends State<DepositPreview> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.depositScreenTitle,
localizations.translate("Deposit confirmation"),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -69,299 +72,312 @@ class _DepositPreviewState extends State<DepositPreview> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balance}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.sp,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: 'SAR 178,000 ',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.bold,
),
),
],
),
),
SizedBox(
height: 20.h,
),
Container(
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
spreadRadius: 2,
blurRadius: 10,
offset: const Offset(0, 5),
),
],
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Color(0xFF0FA4A4)),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Image.asset(
'assets/images/wallet_screen/deposit_list.png',
height: 36.h,
),
),
),
SizedBox(
width: 12.w,
),
Text(
AppText.depositTitle,
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 17.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(22.r),
bottomRight: Radius.circular(22.r),
),
color: const Color(0xFFD8D8D8).withOpacity(0.4),
),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 16.0, horizontal: 12.0),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: titles2.length,
itemBuilder: (context, index) {
return Padding(
padding:
const EdgeInsets.symmetric(vertical: 5.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
titles2[index],
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
(index == 0)
? Column(
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
Text(
'SAR 55,000',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
Text(
'\$ 14,685',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
],
)
: Text(
values2[index],
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
),
);
},
),
),
),
],
),
),
SizedBox(
height: 20.h,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: const Color(0xFFEEF6FB),
border: Border.all(color: const Color(0xFF90D4FF)),
boxShadow: const [
BoxShadow(
color: Color(0xFFB0D3EF),
spreadRadius: 1,
blurRadius: 10,
offset: Offset(0, 3),
),
],
),
// RichText(
// text: TextSpan(
// children: [
// TextSpan(
// text: '${localizations.translate(AppText.balance)}: ',
// style: GoogleFonts.dmSans(
// color: Colors.grey,
// fontSize: 12.sp,
// fontWeight: FontWeight.bold,
// ),
// ),
// TextSpan(
// text: 'SAR 178,000 ',
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 14.sp,
// fontWeight: FontWeight.bold,
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 20.h,
// ),
// Container(
// width: double.infinity,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(22.r),
// color: Colors.white,
// boxShadow: [
// BoxShadow(
// color: Colors.black.withOpacity(0.15),
// spreadRadius: 2,
// blurRadius: 10,
// offset: const Offset(0, 5),
// ),
// ],
// ),
// child: Column(
// children: [
// Padding(
// padding: const EdgeInsets.all(12.0),
// child: Row(
// children: [
// Container(
// decoration: const BoxDecoration(
// shape: BoxShape.circle,
// color: Color(0xFF0FA4A4)),
// child: Padding(
// padding: const EdgeInsets.all(12.0),
// child: Image.asset(
// 'assets/images/wallet_screen/deposit_list.png',
// height: 36.h,
// ),
// ),
// ),
// SizedBox(
// width: 12.w,
// ),
// Text(
// localizations.translate (AppText.depositTitle),
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 17.sp,
// fontWeight: FontWeight.w700,
// ),
// ),
// ],
// ),
// ),
// Container(
// decoration: BoxDecoration(
// borderRadius: BorderRadius.only(
// bottomLeft: Radius.circular(22.r),
// bottomRight: Radius.circular(22.r),
// ),
// color: const Color(0xFFD8D8D8).withOpacity(0.4),
// ),
// child: Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 16.0, horizontal: 12.0),
// child: ListView.builder(
// physics: const NeverScrollableScrollPhysics(),
// shrinkWrap: true,
// itemCount: titles2.length,
// itemBuilder: (context, index) {
// return Padding(
// padding:
// const EdgeInsets.symmetric(vertical: 5.0),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text(
// titles2[index],
// style: GoogleFonts.dmSans(
// color: const Color(0xFF535353),
// fontSize: 14.sp,
// fontWeight: FontWeight.w500,
// ),
// ),
// (index == 0)
// ? Column(
// crossAxisAlignment:
// CrossAxisAlignment.end,
// children: [
// Text(
// 'SAR 55,000',
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 14.sp,
// fontWeight: FontWeight.w700,
// ),
// ),
// Text(
// '\$ 14,685',
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 11.sp,
// fontWeight: FontWeight.w400,
// ),
// ),
// ],
// )
// : Text(
// values2[index],
// style: GoogleFonts.dmSans(
// color: Colors.black,
// fontSize: 14.sp,
// fontWeight: FontWeight.w700,
// ),
// ),
// ],
// ),
// );
// },
// ),
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 20.h,
// ),
// Container(
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(22.r),
// color: const Color(0xFFEEF6FB),
// border: Border.all(color: const Color(0xFF90D4FF)),
// boxShadow: const [
// BoxShadow(
// color: Color(0xFFB0D3EF),
// spreadRadius: 1,
// blurRadius: 10,
// offset: Offset(0, 3),
// ),
// ],
// ),
// child: Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 12.0, horizontal: 16.0),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// Image.asset(
// 'assets/images/wallet_screen/info.png',
// height: 25.h,
// ),
// SizedBox(
// width: 10.w,
// ),
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text(
// AppText.depositScreenTitle,
// style: GoogleFonts.dmSans(
// color: const Color(0xFF015698),
// fontSize: 14.sp,
// fontWeight: FontWeight.w700,
// ),
// ),
// const Gap(4),
// SizedBox(
// width: 280.w,
// child: Text(
// AppText.info3,
// style: GoogleFonts.dmSans(
// color: const Color(0xFF015698),
// fontSize: 12.sp,
// fontWeight: FontWeight.w500,
// ),
// ),
// ),
// ],
// ),
// ),
// ],
// ),
// ),
// ),
// SizedBox(
// height: 20.h,
// ),
Card(
color: AppColor.plainWhite,
elevation: 5,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 16.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
'assets/images/wallet_screen/info.png',
height: 25.h,
Text(
localizations.translate(AppText.depositDetails),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
width: 10.w,
height: 10.h,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.depositScreenTitle,
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
const Gap(4),
SizedBox(
width: 280.w,
child: Text(
AppText.info3,
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
),
),
],
),
const Divider(
color: Color(0xFFE3E3E3),
),
SizedBox(
height: 10.h,
),
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
itemCount: titles.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
titles[index],
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 8.h,
),
SizedBox(
width: 0.8.sw,
child: Text(
values[index],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w400,
),
),
),
],
),
// Image.asset(
// 'assets/images/wallet_screen/copy.png',
// height: 25.h,
// )
],
),
(index != titles.length - 1)
? Column(
children: [
SizedBox(
height: 12.h,
),
Divider(
color: const Color(0xFFE3E3E3),
height: 2.h),
SizedBox(
height: 12.h,
),
],
)
: SizedBox(
height: 10.h,
),
],
);
},
)
],
),
),
),
SizedBox(
height: 20.h,
),
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.depositDetails,
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 10.h,
),
const Divider(
color: Color(0xFFE3E3E3),
),
SizedBox(
height: 10.h,
),
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
itemCount: titles.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
titles[index],
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 8.h,
),
Text(
values[index],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w400,
),
),
],
),
Image.asset(
'assets/images/wallet_screen/copy.png',
height: 25.h,
)
],
),
(index != titles.length - 1)
? Column(
children: [
SizedBox(
height: 12.h,
),
Divider(
color: const Color(0xFFE3E3E3),
height: 2.h),
SizedBox(
height: 12.h,
),
],
)
: SizedBox(
height: 10.h,
),
],
);
},
)
],
),
],
),
),
@@ -374,6 +390,8 @@ class _DepositPreviewState extends State<DepositPreview> {
onTap: () {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
},
child: Container(
margin: const EdgeInsets.all(10.0),
@@ -387,7 +405,7 @@ class _DepositPreviewState extends State<DepositPreview> {
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Center(
child: Text(
AppText.submitDeposit,
localizations.translate(AppText.depositNoti),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,
@@ -399,19 +417,19 @@ class _DepositPreviewState extends State<DepositPreview> {
),
),
const Gap(10),
GestureDetector(
onTap: () {
goRouter.pop();
},
child: Center(
child: TextWidget().text14W700(
AppText.back,
clr: const Color(0xFF363636),
textDecoration: TextDecoration.underline,
),
),
),
const Gap(20),
// GestureDetector(
// onTap: () {
// goRouter.pop();
// },
// child: Center(
// child: TextWidget().text14W700(
// localizations.translate(AppText.back),
// clr: const Color(0xFF363636),
// textDecoration: TextDecoration.underline,
// ),
// ),
// ),
// const Gap(20),
],
),
);

View File

@@ -0,0 +1,68 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../shared/components/button_widget.dart';
import '../../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../widgets/deposit_pay_method_section.dart';
class SelectDepositMethodScreen extends StatelessWidget {
const SelectDepositMethodScreen({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final radioBloc = context.read<RadioBloc>();
return Scaffold(
backgroundColor: Colors.white,
bottomNavigationBar: Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
function: () {
if (radioBloc.selectedCountry == 0) {
goRouter.pushNamed(RouteName.depositStepScreen);
} else {
goRouter.pushNamed(RouteName.depositScreen);
}
},
text: localizations.translate(AppText.next),
clr: AppColor.primaryColor2,
),
),
appBar: AppBar(
backgroundColor: Colors.white,
elevation: 0,
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
localizations.translate(AppText.deposit),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
fontWeight: FontWeight.w700,
),
),
),
body: const Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
DepositPayMethodSection(),
],
),
),
);
}
}

View File

@@ -6,6 +6,8 @@ import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class FilterScreen extends StatefulWidget {
const FilterScreen({super.key});
@@ -14,13 +16,6 @@ class FilterScreen extends StatefulWidget {
}
class _FilterScreenState extends State<FilterScreen> {
List actions = [
AppText.deposit,
AppText.withdrawal,
AppText.yield,
AppText.refund,
AppText.investment,
];
List selected = [
false,
false,
@@ -32,6 +27,14 @@ class _FilterScreenState extends State<FilterScreen> {
int statusIndex = 0;
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List actions = [
localizations.translate(AppText.deposit),
localizations.translate(AppText.withdrawal),
localizations.translate(AppText.yield),
localizations.translate(AppText.refund),
localizations.translate(AppText.investment),
];
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
@@ -40,7 +43,7 @@ class _FilterScreenState extends State<FilterScreen> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.filterTitle,
localizations.translate(AppText.filterTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -54,7 +57,7 @@ class _FilterScreenState extends State<FilterScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.byDate,
localizations.translate(AppText.byDate),
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 12.sp,
@@ -76,7 +79,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(3),
Text(
AppText.date1,
localizations.translate(AppText.date1),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 14.sp,
@@ -100,7 +103,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(3),
Text(
AppText.date2,
localizations.translate(AppText.date2),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 14.sp,
@@ -111,7 +114,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(10),
Text(
AppText.byAction,
localizations.translate(AppText.byAction),
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 12.sp,
@@ -166,7 +169,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(10),
Text(
AppText.byStatus,
localizations.translate(AppText.byStatus),
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 12.sp,
@@ -188,7 +191,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(3),
Text(
AppText.all,
localizations.translate(AppText.all),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 14.sp,
@@ -212,7 +215,7 @@ class _FilterScreenState extends State<FilterScreen> {
),
const Gap(3),
Text(
AppText.onHold,
localizations.translate(AppText.onHold),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 14.sp,
@@ -233,7 +236,7 @@ class _FilterScreenState extends State<FilterScreen> {
});
},
child: TextWidget().text14W700(
AppText.clear,
localizations.translate(AppText.clear),
clr: const Color(0xFF363636),
textDecoration: TextDecoration.underline,
),
@@ -257,7 +260,7 @@ class _FilterScreenState extends State<FilterScreen> {
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Center(
child: Text(
AppText.Submit,
localizations.translate(AppText.Submit),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,

View File

@@ -6,6 +6,8 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class KYCScreen extends StatefulWidget {
const KYCScreen({super.key});
@@ -22,6 +24,7 @@ class _KYCScreenState extends State<KYCScreen> {
];
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
@@ -47,7 +50,7 @@ class _KYCScreenState extends State<KYCScreen> {
height: 24.h,
),
Text(
'Almost here...',
localizations.translate(AppText.almostHere),
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 17.sp,
@@ -60,7 +63,7 @@ class _KYCScreenState extends State<KYCScreen> {
SizedBox(
width: 280.w,
child: Text(
'Complete account profile in 3 minutes to start investing',
localizations.translate(AppText.completeAcc),
textAlign: TextAlign.center,
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
@@ -128,11 +131,7 @@ class _KYCScreenState extends State<KYCScreen> {
height: 70.h,
),
GestureDetector(
onTap: () {
// goRouter.pushNamed(RouteName.otpScreen, pathParameters: {
// "fromScreen": 'withdrawal',
// });
},
onTap: () {},
child: Container(
margin: const EdgeInsets.all(12.0),
height: 56.h,
@@ -145,7 +144,7 @@ class _KYCScreenState extends State<KYCScreen> {
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Center(
child: Text(
AppText.cont,
localizations.translate(AppText.cont),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,
@@ -160,7 +159,7 @@ class _KYCScreenState extends State<KYCScreen> {
height: 10.h,
),
TextWidget().text14W700(
AppText.later,
localizations.translate(AppText.later),
clr: const Color(0xFF363636),
textDecoration: TextDecoration.underline,
)

View File

@@ -1,447 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_text.dart';
class WalletScreen extends StatefulWidget {
const WalletScreen({super.key});
@override
State<WalletScreen> createState() => _WalletScreenState();
}
class _WalletScreenState extends State<WalletScreen> {
List data = [
{
'title': AppText.deposit,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': AppText.withdrawal,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
{
'title': AppText.investment,
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': AppText.yield,
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '+ \$100,00',
'onHold': false,
},
{
'title': AppText.refund,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
];
@override
void initState() {
// TODO: implement initState
// _savebottomsheet();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
elevation: 0,
scrolledUnderElevation: 0.0,
automaticallyImplyLeading: false,
toolbarHeight: 260.h,
titleSpacing: 22.w,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.walletTitle,
style: GoogleFonts.dmSans(
color: const Color(0xFF343434),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 4.h,
),
Text(
'SAR 178,000',
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 28.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 80.h,
)
],
),
flexibleSpace: FlexibleSpaceBar(
background: Stack(
children: [
Image.asset(
'assets/images/wallet_screen/bg.png', // Replace with your image asset
fit: BoxFit.fitWidth,
alignment: Alignment.topCenter,
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius:
const BorderRadius.all(Radius.circular(20.0)),
),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0, vertical: 20.0),
child: IntrinsicHeight(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.depositScreen);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/deposit.png',
height: 20.h,
),
),
),
Text(
'Deposit',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 12.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
const VerticalDivider(
color: Colors.black,
width: 20.0,
),
GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.withdrawalScreen);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/withdraw.png',
height: 20.h,
),
),
),
Text(
'Withdraw',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 12.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
],
),
),
),
),
),
)
],
),
),
backgroundColor: Colors
.transparent, // Make the AppBar transparent to show the background image
),
body: Padding(
padding: const EdgeInsets.fromLTRB(18.0, 10.0, 18.0, 0.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
AppText.day,
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 11.sp,
fontWeight: FontWeight.w500,
),
),
Row(
children: [
Container(
decoration: const BoxDecoration(
color: Color(0xFFF6F6F6),
borderRadius: BorderRadius.all(Radius.circular(12.0)),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/search.png',
height: 20.h,
),
),
),
SizedBox(
width: 5.w,
),
GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.filterScreen);
},
child: Container(
decoration: const BoxDecoration(
color: Color(0xFFF6F6F6),
borderRadius: BorderRadius.all(Radius.circular(12.0)),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/filter.png',
height: 20.h,
),
),
),
),
],
),
],
),
SizedBox(
height: 10.h,
),
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: data.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.walletDetails,
pathParameters: {
"type": data[index]['title'],
});
},
child: Container(
height: 92.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: const Color(0xFFF6F6F6),
),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
children: [
getIcon(data[index]['title']),
SizedBox(width: 12.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
data[index]['title'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
(data[index]['subTitle'] != '')
? Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
data[index]['subTitle'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w400,
),
),
SizedBox(height: 4.h),
],
)
: Container(),
Text(
data[index]['dateTime'],
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 11.sp,
fontWeight: FontWeight.w500,
),
),
],
),
Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(data[index]['onHold'])
? Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
AppText.onHold,
style: GoogleFonts.dmSans(
color: const Color(0xFF0172CB),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
],
)
: Container(),
Text(
data[index]['value'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
(data[index]['subValue'] != '')
? Text(
data[index]['subValue'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
)
: Container(),
],
),
],
),
),
),
),
);
},
),
)
],
),
),
);
}
Widget getIcon(String title) {
if (title == 'Deposit') {
return Container(
decoration: const BoxDecoration(
shape: BoxShape.circle, color: Color(0xFF0FA4A4)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/deposit_list.png',
height: 25.h,
),
),
);
} else if (title == 'Withdrawal') {
return Container(
decoration: const BoxDecoration(
shape: BoxShape.circle, color: Color(0xFFE6681F)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/withdraw_list.png',
height: 25.h),
),
);
} else if (title == 'Investment') {
return Container(
decoration: const BoxDecoration(
shape: BoxShape.circle, color: Color(0xFF0172CB)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/invest_list.png',
height: 25.h),
),
);
} else if (title == 'Yield') {
return Container(
decoration: const BoxDecoration(
shape: BoxShape.circle, color: Color(0xFF4C4AEF)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/yield_list.png',
height: 25.h),
),
);
} else {
return Container(
decoration: const BoxDecoration(
shape: BoxShape.circle, color: Color(0xFF0E9445)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/refund_list.png',
height: 25.h),
),
);
}
}
}

View File

@@ -1,28 +1,19 @@
// ignore: file_names
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/button_widget.dart';
import 'package:ticket_widget/ticket_widget.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../shared/components/button_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class WalletDetails extends StatelessWidget {
final String type;
WalletDetails({super.key, required this.type});
final List titles = [
AppText.status,
AppText.paymentMethod,
AppText.accountName,
AppText.iban,
AppText.beneficiaryAddress,
AppText.bankName,
AppText.branchAddress,
AppText.SWIFTcode,
AppText.refid,
];
final List values = [
'On hold',
'Google/Apple Pay',
@@ -37,6 +28,7 @@ class WalletDetails extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return (type == 'confirm-investment')
? WillPopScope(
onWillPop: () async => false,
@@ -56,9 +48,9 @@ class WalletDetails extends StatelessWidget {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
// goRouter.pop();
},
text: AppText.closeText,
text: localizations.translate(AppText.closeText),
clr: AppColor.primaryColor2,
),
),
@@ -73,7 +65,7 @@ class WalletDetails extends StatelessWidget {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
// goRouter.pop();
},
icon: const Icon(
Icons.close_sharp,
@@ -84,7 +76,7 @@ class WalletDetails extends StatelessWidget {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.investmentConfirmationText,
localizations.translate(AppText.investmentConfirmationText),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -126,7 +118,7 @@ class WalletDetails extends StatelessWidget {
height: 16.h,
),
Text(
AppText.investment,
localizations.translate(AppText.investment),
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
@@ -166,20 +158,20 @@ class WalletDetails extends StatelessWidget {
fontWeight: FontWeight.w900,
),
),
Text(
"+ \$100.00",
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
),
// Text(
// "+ \$100.00",
// style: GoogleFonts.dmSans(
// color: const Color(0xFF363636),
// fontSize: 12.sp,
// fontWeight: FontWeight.w500,
// ),
// ),
],
),
SizedBox(
height: 33.h,
),
_buildBody(),
_buildBody(localizations),
],
),
),
@@ -196,7 +188,7 @@ class WalletDetails extends StatelessWidget {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.walletDetailsTitle,
localizations.translate(AppText.walletDetailsTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -209,7 +201,10 @@ class WalletDetails extends StatelessWidget {
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: (type == 'Yield' || type == 'Refund')
color: (type == 'Yield' ||
type == 'Refund' ||
type == 'عائد' ||
type == 'استرداد')
? Colors.white
: Colors.transparent,
boxShadow: [
@@ -221,7 +216,10 @@ class WalletDetails extends StatelessWidget {
),
],
),
child: (type == 'Yield' || type == 'Refund')
child: (type == 'Yield' ||
type == 'Refund' ||
type == 'عائد' ||
type == 'استرداد')
? Padding(
padding: const EdgeInsets.fromLTRB(20.0, 30, 20, 10),
child: Column(
@@ -290,7 +288,7 @@ class WalletDetails extends StatelessWidget {
SizedBox(
height: 35.h,
),
_buildBody(),
_buildBody(localizations),
],
),
)
@@ -383,7 +381,7 @@ class WalletDetails extends StatelessWidget {
SizedBox(
height: 33.h,
),
_buildBody(),
_buildBody(localizations),
],
),
),
@@ -455,12 +453,25 @@ class WalletDetails extends StatelessWidget {
}
}
Widget _buildBody() {
if (type == 'Yield') {
Widget _buildBody(AppLocalizations localizations) {
final List titles = [
localizations.translate(AppText.status),
localizations.translate(AppText.paymentMethod),
localizations.translate(AppText.accountName),
localizations.translate(AppText.iban),
localizations.translate(AppText.beneficiaryAddress),
localizations.translate(AppText.bankName),
localizations.translate(AppText.branchAddress),
localizations.translate(AppText.SWIFTcode),
localizations.translate(AppText.refid),
];
if (type == 'Yield' || type == "عائد") {
return Container();
} else if (type == 'Refund') {
} else if (type == 'Refund' || type == 'استرداد') {
return Container();
} else if (type == 'Investment' || type == "confirm-investment") {
} else if (type == 'Investment' ||
type == "confirm-investment" ||
type == "استثمار") {
return Container(
width: double.infinity,
decoration: const BoxDecoration(
@@ -477,7 +488,7 @@ class WalletDetails extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
AppText.paymentMethod,
localizations.translate(AppText.paymentMethodText),
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,

View File

@@ -0,0 +1,300 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/routes/route_name.dart';
import '../../../../../core/routes/routes.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class WalletLayout extends StatelessWidget {
const WalletLayout({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List data = [
{
'title': localizations.translate(AppText.deposit),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': localizations.translate(AppText.withdrawal),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
{
'title': localizations.translate(AppText.investment),
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': localizations.translate(AppText.yield),
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '+ \$100,00',
'onHold': false,
},
{
'title': localizations.translate(AppText.refund),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
];
return Scaffold(
backgroundColor: AppColor.plainWhite,
body: Padding(
padding: const EdgeInsets.fromLTRB(18.0, 10.0, 18.0, 0.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
localizations.translate(AppText.day),
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 11.sp,
fontWeight: FontWeight.w500,
),
),
Row(
children: [
Container(
decoration: const BoxDecoration(
color: Color(0xFFF6F6F6),
borderRadius: BorderRadius.all(Radius.circular(12.0)),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/search.png',
height: 20.h,
),
),
),
SizedBox(
width: 5.w,
),
GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.filterScreen);
},
child: Container(
decoration: const BoxDecoration(
color: Color(0xFFF6F6F6),
borderRadius: BorderRadius.all(Radius.circular(12.0)),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/filter.png',
height: 20.h,
),
),
),
),
],
),
],
),
SizedBox(
height: 10.h,
),
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: data.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.walletDetails,
pathParameters: {
"type": data[index]['title'],
});
},
child: Container(
height: 92.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: const Color(0xFFF6F6F6),
),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
children: [
getIcon(data[index]['title']),
SizedBox(width: 12.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
data[index]['title'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
(data[index]['subTitle'] != '')
? Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
data[index]['subTitle'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w400,
),
),
SizedBox(height: 4.h),
],
)
: Container(),
Text(
data[index]['dateTime'],
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 11.sp,
fontWeight: FontWeight.w500,
),
),
],
),
const Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(data[index]['onHold'])
? Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
localizations
.translate(AppText.onHold),
style: GoogleFonts.dmSans(
color: const Color(0xFF0172CB),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
],
)
: Container(),
Text(
data[index]['value'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(height: 4.h),
(data[index]['subValue'] != '')
? Text(
data[index]['subValue'],
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
)
: Container(),
],
),
],
),
),
),
),
);
},
),
)
],
),
),
);
}
}
Widget getIcon(String title) {
if (title == 'Deposit' || title == 'إيداع') {
return Container(
decoration:
const BoxDecoration(shape: BoxShape.circle, color: Color(0xFF0FA4A4)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/deposit_list.png',
height: 25.h,
),
),
);
} else if (title == 'Withdrawal' || title == 'انسحاب') {
return Container(
decoration:
const BoxDecoration(shape: BoxShape.circle, color: Color(0xFFE6681F)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/withdraw_list.png',
height: 25.h),
),
);
} else if (title == 'Investment' || title == 'استثمار') {
return Container(
decoration:
const BoxDecoration(shape: BoxShape.circle, color: Color(0xFF0172CB)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/invest_list.png',
height: 25.h),
),
);
} else if (title == 'Yield' || title == 'عائد') {
return Container(
decoration:
const BoxDecoration(shape: BoxShape.circle, color: Color(0xFF4C4AEF)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/yield_list.png',
height: 25.h),
),
);
} else {
return Container(
decoration:
const BoxDecoration(shape: BoxShape.circle, color: Color(0xFF0E9445)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('assets/images/wallet_screen/refund_list.png',
height: 25.h),
),
);
}
}

View File

@@ -0,0 +1,172 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import 'wallet_layout.dart';
class WalletScreen extends StatefulWidget {
const WalletScreen({super.key});
@override
State<WalletScreen> createState() => _WalletScreenState();
}
class _WalletScreenState extends State<WalletScreen> {
@override
void initState() {
// _savebottomsheet();
super.initState();
}
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
elevation: 0,
scrolledUnderElevation: 0.0,
automaticallyImplyLeading: false,
toolbarHeight: 260.h,
titleSpacing: 22.w,
title: Padding(
padding: const EdgeInsets.only(left: 40.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
localizations.translate(AppText.walletTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF343434),
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
Gap(8.h),
Text(
'SAR 178,000',
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 28.sp,
fontWeight: FontWeight.w700,
),
),
Gap(80.h)
],
),
),
flexibleSpace: FlexibleSpaceBar(
background: Stack(
children: [
Image.asset(
'assets/images/wallet_screen/bg.png', // Replace with your image asset
fit: BoxFit.fitWidth,
alignment: Alignment.topCenter,
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius:
const BorderRadius.all(Radius.circular(20.0)),
),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0, vertical: 20.0),
child: IntrinsicHeight(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: () {
goRouter.pushNamed(
RouteName.selectDepositMethodScreen);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/deposit.png',
height: 20.h,
),
),
),
Text(
localizations.translate(AppText.deposit),
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 12.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
const VerticalDivider(
color: Colors.black,
width: 20.0,
),
GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.withdrawalScreen);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/wallet_screen/withdraw.png',
height: 20.h,
),
),
),
Text(
localizations.translate(AppText.withdraw),
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 12.sp,
fontWeight: FontWeight.w700,
),
),
],
),
),
],
),
),
),
),
),
)
],
),
),
backgroundColor: Colors
.transparent, // Make the AppBar transparent to show the background image
),
body: const WalletLayout(),
);
}
}

View File

@@ -5,6 +5,8 @@ import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:ticket_widget/ticket_widget.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
class WithdrawalConfirmation extends StatefulWidget {
const WithdrawalConfirmation({super.key});
@@ -13,16 +15,6 @@ class WithdrawalConfirmation extends StatefulWidget {
}
class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
final List titles = [
AppText.paymentMethod,
AppText.accountName,
AppText.iban,
AppText.beneficiaryAddress,
AppText.bankName,
AppText.branchAddress,
AppText.SWIFTcode,
AppText.refid,
];
final List values = [
'Google/Apple Pay',
'Name Surname',
@@ -36,6 +28,17 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final List titles = [
localizations.translate(AppText.paymentMethod),
localizations.translate(AppText.accountName),
localizations.translate(AppText.iban),
localizations.translate(AppText.beneficiaryAddress),
localizations.translate(AppText.bankName),
localizations.translate(AppText.branchAddress),
localizations.translate(AppText.SWIFTcode),
localizations.translate(AppText.refid),
];
return WillPopScope(
onWillPop: () async => false,
child: Scaffold(
@@ -47,7 +50,7 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.previewTitle,
localizations.translate(AppText.previewTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -90,7 +93,7 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.info,
localizations.translate(AppText.info),
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 14.sp,
@@ -101,7 +104,7 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
height: 4.h,
),
Text(
AppText.workingDays,
localizations.translate(AppText.workingDays),
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 12.sp,
@@ -162,7 +165,7 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
height: 16.h,
),
Text(
AppText.withdrawal,
localizations.translate(AppText.withdrawal),
style: GoogleFonts.dmSans(
color: const Color(0xFF191B1E),
fontSize: 14.sp,
@@ -273,7 +276,7 @@ class _WithdrawalConfirmationState extends State<WithdrawalConfirmation> {
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Center(
child: Text(
'Close',
localizations.translate(AppText.closeText),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,

View File

@@ -6,6 +6,8 @@ import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
class WithdrawalPreview extends StatefulWidget {
const WithdrawalPreview({super.key});
@@ -16,13 +18,14 @@ class WithdrawalPreview extends StatefulWidget {
class _WithdrawalPreviewState extends State<WithdrawalPreview> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List titles = [
AppText.accountHolderName,
AppText.iban,
AppText.beneficiaryAddress,
AppText.bankName,
AppText.branchAddress,
AppText.SWIFTcode,
localizations.translate(AppText.accountHolderName),
localizations.translate(AppText.iban),
localizations.translate(AppText.beneficiaryAddress),
localizations.translate(AppText.bankName),
localizations.translate(AppText.branchAddress),
localizations.translate(AppText.SWIFTcode),
];
List values = [
'Name Surname',
@@ -40,7 +43,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.previewTitle,
localizations.translate(AppText.previewTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -67,7 +70,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
),
Expanded(
child: Text(
AppText.info1,
localizations.translate(AppText.info1),
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 12.sp,
@@ -84,7 +87,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balance}: ',
text: '${localizations.translate(AppText.balance)}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.sp,
@@ -141,7 +144,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
width: 12.w,
),
Text(
AppText.withdrawTitle,
localizations.translate(AppText.withdrawTitle),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 17.sp,
@@ -167,7 +170,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
AppText.withdrawAmt,
localizations.translate(AppText.withdrawAmt),
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,
@@ -222,7 +225,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
),
Expanded(
child: Text(
AppText.info2,
localizations.translate(AppText.info2),
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 12.sp,
@@ -242,7 +245,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.withdrawDetails,
localizations.translate(AppText.withdrawDetails),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,
@@ -330,7 +333,7 @@ class _WithdrawalPreviewState extends State<WithdrawalPreview> {
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Center(
child: Text(
AppText.submit,
localizations.translate(AppText.submit),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,

View File

@@ -7,6 +7,9 @@ import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart';
class WithdrawalScreen extends StatefulWidget {
const WithdrawalScreen({super.key});
@@ -17,13 +20,14 @@ class WithdrawalScreen extends StatefulWidget {
class _WithdrawalScreenState extends State<WithdrawalScreen> {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List titles = [
'${AppText.accountHolderName} *',
'${AppText.iban} *',
AppText.beneficiaryAddress,
AppText.bankName,
AppText.branchAddress,
AppText.SWIFTcode,
'${localizations.translate(AppText.accountHolderName)} *',
'${localizations.translate(AppText.iban)} *',
localizations.translate(AppText.beneficiaryAddress),
localizations.translate(AppText.bankName),
localizations.translate(AppText.branchAddress),
localizations.translate(AppText.SWIFTcode),
];
return Scaffold(
backgroundColor: Colors.white,
@@ -33,7 +37,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.withdrawalScreenTitle,
localizations.translate(AppText.withdrawalScreenTitle),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -51,7 +55,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balance}: ',
text: '${localizations.translate(AppText.balance)}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.sp,
@@ -108,7 +112,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
width: 12.w,
),
Text(
AppText.withdrawTitle,
localizations.translate(AppText.withdrawTitle),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 17.sp,
@@ -129,81 +133,110 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 16.0, horizontal: 12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
child: Column(
children: [
Text(
'SAR',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 15.sp,
fontWeight: FontWeight.w700,
),
),
SizedBox(
width: 12.w,
),
SizedBox(
width: 280.w,
child: TextFormField(
cursorColor: Colors.black,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.w400,
),
decoration: InputDecoration(
hintText: '1000',
hintStyle: GoogleFonts.dmSans(
color: const Color(0xFFC6C6C6),
fontSize: 16.sp,
fontWeight: FontWeight.w400,
),
labelStyle:
const TextStyle(color: Colors.black),
contentPadding: const EdgeInsets.symmetric(
vertical: 15, horizontal: 10),
filled: true,
fillColor: Colors.white,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
disabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.red, width: 1),
),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.red, width: 1),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'SAR',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 15.sp,
fontWeight: FontWeight.w700,
),
),
inputFormatters: [
FilteringTextInputFormatter.deny(
RegExp(r'\s')),
LengthLimitingTextInputFormatter(20),
],
),
SizedBox(
width: 12.w,
),
SizedBox(
width: 280.w,
child: TextFormField(
cursorColor: Colors.black,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.w400,
),
decoration: InputDecoration(
hintText: '1000',
hintStyle: GoogleFonts.dmSans(
color: const Color(0xFFC6C6C6),
fontSize: 16.sp,
fontWeight: FontWeight.w400,
),
labelStyle:
const TextStyle(color: Colors.black),
contentPadding:
const EdgeInsets.symmetric(
vertical: 15, horizontal: 10),
filled: true,
fillColor: Colors.white,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
disabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.white, width: 1),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.red, width: 1),
),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Colors.red, width: 1),
),
),
inputFormatters: [
CommaTextInputFormatter(),
FilteringTextInputFormatter.deny(
RegExp(r'\s')),
LengthLimitingTextInputFormatter(20),
],
),
),
],
),
const Gap(12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
localizations
.translate(AppText.processingFees),
style: GoogleFonts.dmSans(
color: const Color(0xFF535353),
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
Text(
'BHD 0.500',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
),
),
],
),
],
),
@@ -215,51 +248,51 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
SizedBox(
height: 20.h,
),
Container(
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
color: const Color(0xFFEEF6FB),
border: Border.all(color: const Color(0xFF90D4FF)),
boxShadow: const [
BoxShadow(
color: Color(0xFFB0D3EF),
spreadRadius: 1,
blurRadius: 10,
offset: Offset(0, 3),
),
],
),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 16.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
'assets/images/wallet_screen/info.png',
height: 25.h,
),
Gap(
10.w,
),
Expanded(
child: Text(
AppText.info2,
style: GoogleFonts.dmSans(
color: const Color(0xFF015698),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
),
),
],
),
),
),
SizedBox(
height: 20.h,
),
// Container(
// width: double.infinity,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(22.r),
// color: const Color(0xFFEEF6FB),
// border: Border.all(color: const Color(0xFF90D4FF)),
// boxShadow: const [
// BoxShadow(
// color: Color(0xFFB0D3EF),
// spreadRadius: 1,
// blurRadius: 10,
// offset: Offset(0, 3),
// ),
// ],
// ),
// child: Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 12.0, horizontal: 16.0),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// Image.asset(
// 'assets/images/wallet_screen/info.png',
// height: 25.h,
// ),
// Gap(
// 10.w,
// ),
// Expanded(
// child: Text(
// AppText.info2,
// style: GoogleFonts.dmSans(
// color: const Color(0xFF015698),
// fontSize: 12.sp,
// fontWeight: FontWeight.w500,
// ),
// ),
// ),
// ],
// ),
// ),
// ),
// SizedBox(
// height: 20.h,
// ),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
@@ -284,7 +317,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppText.withdrawDetails,
localizations.translate(AppText.withdrawDetails),
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 15.sp,
@@ -295,7 +328,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
height: 3.h,
),
Text(
AppText.required,
localizations.translate(AppText.required),
style: GoogleFonts.dmSans(
color: const Color(0xFF8D8D8D),
fontSize: 14.sp,
@@ -423,7 +456,7 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
),
child: Center(
child: Text(
AppText.next,
localizations.translate(AppText.next),
style: GoogleFonts.dmSans(
color: Colors.white,
fontSize: 14.sp,

View File

@@ -7,15 +7,17 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_bloc.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_event.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_state.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../countrySelection/bloc/choose_country_bloc.dart';
import '../../../../countrySelection/bloc/choose_country_event.dart';
import '../../../../countrySelection/bloc/choose_country_state.dart';
class DepositPayMethodSection extends StatelessWidget {
const DepositPayMethodSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final radioBloc = context.read<RadioBloc>();
return BlocBuilder<RadioBloc, RadioState>(
builder: (context, state) {
@@ -25,7 +27,8 @@ class DepositPayMethodSection extends StatelessWidget {
}
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
TextWidget().text15W700(AppText.choosePaymentMethodText,
TextWidget().text15W700(
localizations.translate(AppText.choosePaymentMethodText),
clr: AppColor.plainBlack),
const Gap(16),
GestureDetector(
@@ -83,7 +86,8 @@ class DepositPayMethodSection extends StatelessWidget {
const Gap(5),
SvgPicture.asset(AppImages.walletIcon),
const Gap(5),
TextWidget().text14W700(AppText.bankTransfer,
TextWidget().text14W700(
localizations.translate(AppText.bankTransfer),
clr: AppColor.textLabelColor),
],
),
@@ -93,7 +97,7 @@ class DepositPayMethodSection extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(12),
child: TextWidget().text14W500(
AppText.bankTransferText,
localizations.translate(AppText.bankTransferText),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),
@@ -160,7 +164,8 @@ class DepositPayMethodSection extends StatelessWidget {
const Gap(5),
SvgPicture.asset(AppImages.applePayIcon),
const Gap(5),
TextWidget().text14W700(AppText.applePayText,
TextWidget().text14W700(
localizations.translate(AppText.applePayText),
clr: AppColor.textLabelColor),
],
),
@@ -170,7 +175,8 @@ class DepositPayMethodSection extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(12.0),
child: TextWidget().text14W500(
AppText.instantTransferFundsApplePayText,
localizations
.translate(AppText.instantTransferFundsApplePayText),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),
@@ -180,7 +186,6 @@ class DepositPayMethodSection extends StatelessWidget {
),
),
),
// const Gap(16),
]);
},
);

View File

@@ -9,6 +9,7 @@ import '../../../../../core/routes/routes.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
class WalletListSection extends StatelessWidget {
@@ -16,6 +17,50 @@ class WalletListSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
List data = [
{
'title': localizations.translate(AppText.deposit),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': localizations.translate(AppText.withdrawal),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
{
'title': localizations.translate(AppText.investment),
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': localizations.translate(AppText.yield),
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '+ \$100,00',
'onHold': false,
},
{
'title': localizations.translate(AppText.refund),
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
];
return Expanded(
child: ListView.builder(
shrinkWrap: true,
@@ -75,7 +120,10 @@ class WalletListSection extends StatelessWidget {
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W700(AppText.onHold,
TextWidget().text14W700(
localizations.translate(
AppText.onHold,
),
clr: AppColor.onHoldTextColor),
Gap(4.h),
],
@@ -154,46 +202,3 @@ Widget getIcon(String title) {
);
}
}
List data = [
{
'title': AppText.deposit,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': AppText.withdrawal,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
{
'title': AppText.investment,
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': false,
},
{
'title': AppText.yield,
'subTitle': 'Name of Investment',
'dateTime': '10/04/2024 22:04',
'value': '+ SAR 100,000',
'subValue': '+ \$100,00',
'onHold': false,
},
{
'title': AppText.refund,
'subTitle': '',
'dateTime': '10/04/2024 22:04',
'value': '- SAR 100,000',
'subValue': '',
'onHold': true,
},
];

View File

@@ -4,7 +4,7 @@ import 'package:tanami_app/features/MainScreens/Academy/presentation/pages/acade
import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/invest_screen.dart';
import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/portfolio_screen.dart';
import 'package:tanami_app/features/MainScreens/Settings/presentation/pages/settings_Screen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/walletScreen.dart';
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart';
import 'package:tanami_app/shared/components/common_bottom_navigation.dart';
import '../../shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart';
@@ -27,8 +27,8 @@ class MainScreen extends StatelessWidget {
const MainScreen({super.key});
@override
Widget build(BuildContext context) {
context.read<BottomNavigationBloc>().add(TabChanged(1));
final PageController pageController = PageController(initialPage: 1);
context.read<BottomNavigationBloc>().add(TabChanged(2));
final PageController pageController = PageController(initialPage: 2);
return BlocBuilder<BottomNavigationBloc, BottomNavigationState>(
builder: (context, state) {

View File

@@ -0,0 +1,57 @@
import 'dart:io';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:local_auth/local_auth.dart';
import 'biometric_event.dart';
import 'biometric_state.dart';
class BiometricBloc extends Bloc<BiometricEvent, BiometricState> {
final LocalAuthentication localAuthentication;
BiometricBloc(this.localAuthentication) : super(BiometricInitial()) {
on<CheckBiometricEvent>(_onCheckBiometric);
on<AuthenticateBiometricEvent>(_onAuthenticateBiometric);
}
Future<void> _onCheckBiometric(
CheckBiometricEvent event, Emitter<BiometricState> emit) async {
emit(BiometricChecking());
bool canAuthenticate = await localAuthentication.canCheckBiometrics;
emit(BiometricChecked(canAuthenticate));
}
Future<void> _onAuthenticateBiometric(
AuthenticateBiometricEvent event, Emitter<BiometricState> emit) async {
emit(BiometricAuthenticating());
try {
bool authenticated = false;
if (Platform.isIOS) {
authenticated = await localAuthentication.authenticate(
localizedReason: 'Please authenticate to access the app',
options: const AuthenticationOptions(
useErrorDialogs: true,
stickyAuth: true,
biometricOnly: true,
),
);
} else if (Platform.isAndroid) {
authenticated = await localAuthentication.authenticate(
localizedReason: 'Please authenticate to access the app',
options: const AuthenticationOptions(
useErrorDialogs: true,
stickyAuth: true,
),
);
}
if (authenticated) {
emit(BiometricAuthenticated());
} else {
emit(BiometricFailed('Authentication failed'));
}
} catch (e) {
emit(BiometricFailed(e.toString()));
}
}
}

View File

@@ -0,0 +1,5 @@
abstract class BiometricEvent {}
class CheckBiometricEvent extends BiometricEvent {}
class AuthenticateBiometricEvent extends BiometricEvent {}

View File

@@ -0,0 +1,21 @@
abstract class BiometricState {}
class BiometricInitial extends BiometricState {}
class BiometricChecking extends BiometricState {}
class BiometricChecked extends BiometricState {
final bool canAuthenticate;
BiometricChecked(this.canAuthenticate);
}
class BiometricAuthenticating extends BiometricState {}
class BiometricAuthenticated extends BiometricState {}
class BiometricFailed extends BiometricState {
final String message;
BiometricFailed(this.message);
}

View File

@@ -1,10 +1,17 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../../../core/routes/route_name.dart';
import '../../../../core/routes/routes.dart';
import '../../../../core/styles/app_images.dart';
import '../../../../shared/components/device_locked_dialog.dart';
import '../bloc/biometric_bloc.dart';
import '../bloc/biometric_event.dart';
import '../bloc/biometric_state.dart';
class BiometricLayout extends StatelessWidget {
const BiometricLayout({super.key});
@@ -19,31 +26,46 @@ class BiometricLayout extends StatelessWidget {
}
return Scaffold(
backgroundColor: Colors.white,
body: SizedBox(
width: 1.sw,
height: 1.sh,
child: Stack(
children: [
Positioned.fill(
child: SvgPicture.asset(
height: 1.sh,
width: 1.sw,
AppImages.biometricBg,
fit: BoxFit.cover,
),
),
Positioned.fill(
child: Align(
alignment: Alignment.center,
child: Image.asset(
biometricImage,
width: 133,
height: 155,
body: BlocConsumer<BiometricBloc, BiometricState>(
listener: (context, state) {
if (state is BiometricChecked && state.canAuthenticate) {
context.read<BiometricBloc>().add(AuthenticateBiometricEvent());
} else if (state is BiometricFailed) {
deviceLockedDialog(context);
} else if (state is BiometricAuthenticated) {
goRouter.goNamed(RouteName.pinScreen, pathParameters: {
"fromScreen": "LoginedInUser",
});
}
},
builder: (context, state) {
return SizedBox(
width: 1.sw,
height: 1.sh,
child: Stack(
children: [
Positioned.fill(
child: SvgPicture.asset(
height: 1.sh,
width: 1.sw,
AppImages.biometricBg,
fit: BoxFit.cover,
),
),
),
Positioned.fill(
child: Align(
alignment: Alignment.center,
child: Image.asset(
biometricImage,
width: 133,
height: 155,
),
),
),
],
),
],
),
);
},
),
);
}

View File

@@ -5,6 +5,7 @@ import 'package:google_fonts/google_fonts.dart';
import '../../../../core/styles/app_color.dart';
import '../../../../core/styles/app_text.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../bloc/change_password_bloc.dart';
import 'change_password_layout.dart';
@@ -13,6 +14,7 @@ class ChangePasswordScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
appBar: AppBar(
@@ -21,7 +23,7 @@ class ChangePasswordScreen extends StatelessWidget {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
AppText.changePasswordText,
localizations.translate(AppText.changePasswordText),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,

View File

@@ -8,6 +8,7 @@ import 'package:tanami_app/shared/components/toast_message.dart';
import '../../../../core/routes/routes.dart';
import '../../../../core/styles/app_color.dart';
import '../../../../core/styles/app_text.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../../../../shared/components/button_widget.dart';
import '../bloc/change_password_bloc.dart';
import '../bloc/change_password_event.dart';
@@ -20,6 +21,7 @@ class RestorePasswordBottomSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -77,7 +79,7 @@ class RestorePasswordBottomSection extends StatelessWidget {
)
: null;
},
text: AppText.submitText,
text: localizations.translate(AppText.submitText),
clr: isButtonEnabled
? AppColor.primaryColor2
: AppColor.inactiveBtnColor,
@@ -92,7 +94,7 @@ class RestorePasswordBottomSection extends StatelessWidget {
function: () {
goRouter.pop();
},
text: AppText.cancelText,
text: localizations.translate(AppText.cancelText),
),
const Gap(10),
],

View File

@@ -6,6 +6,7 @@ import 'package:tanami_app/core/styles/app_text.dart';
import '../../../../core/routes/route_name.dart';
import '../../../../core/routes/routes.dart';
import '../../../../core/styles/app_color.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../../../../shared/components/bloc/password_field/password_visibility_bloc.dart';
import '../../../../shared/components/button_widget.dart';
import '../../../../shared/components/form_label_textfield.dart';
@@ -17,6 +18,7 @@ class RestorePasswordForm extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
final restorePasswordBloc = context.read<ChangePasswordBloc>();
// Reset fields when the screen is built
@@ -37,8 +39,8 @@ class RestorePasswordForm extends StatelessWidget {
BlocProvider(
create: (_) => PasswordVisibilityBloc(),
child: FormLabelTextField(
hintText: AppText.enterPassword,
title: AppText.currentPsswordText,
hintText: localizations.translate(AppText.enterPassword),
title: localizations.translate(AppText.currentPsswordText),
type: AppText.password.toLowerCase(),
textEditingController:
restorePasswordBloc.currentPasswordTextField,
@@ -48,8 +50,8 @@ class RestorePasswordForm extends StatelessWidget {
BlocProvider(
create: (_) => PasswordVisibilityBloc(),
child: FormLabelTextField(
hintText: AppText.enterPassword,
title: AppText.newPasswordText,
hintText: localizations.translate(AppText.enterPassword),
title: localizations.translate(AppText.newPasswordText),
type: AppText.password.toLowerCase(),
textEditingController: restorePasswordBloc.passwordTextField,
),
@@ -58,8 +60,8 @@ class RestorePasswordForm extends StatelessWidget {
BlocProvider(
create: (_) => PasswordVisibilityBloc(),
child: FormLabelTextField(
hintText: AppText.enterPassword,
title: AppText.repeatPasswordText,
hintText: localizations.translate(AppText.enterPassword),
title: localizations.translate(AppText.repeatPasswordText),
type: AppText.password.toLowerCase(),
textEditingController:
restorePasswordBloc.repeatPasswordTextField,
@@ -73,7 +75,8 @@ class RestorePasswordForm extends StatelessWidget {
goRouter.pushNamed(
RouteName.forgotPasswordPhoneVerificationScreen);
},
text: TextWidget().text15W400(AppText.forgotPassword,
text: TextWidget().text15W400(
localizations.translate(AppText.forgotPassword),
clr: AppColor.forgotPassButtonColor,
textDecoration: TextDecoration.underline),
),

View File

@@ -19,8 +19,8 @@ class ContactAdminScreen extends StatelessWidget {
),
body: ListView(
children: [
topSection(),
bottomSection(),
topSection(context),
bottomSection(context),
],
),
);

View File

@@ -6,9 +6,11 @@ import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/core/utils/url_launcher/url_launcher.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../../../../shared/components/text_widget.dart';
Widget bottomSection() {
Widget bottomSection(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.all(22.0),
child: Column(
@@ -16,7 +18,7 @@ Widget bottomSection() {
const Gap(50.0),
contactOption(
icon: AppImages.byPhoneIcon,
title: AppText.byPhoneText,
title: localizations.translate(AppText.byPhoneText),
subtitle: '+973 12345678',
onTap: () {
launchPhone('+973 12345678');
@@ -25,7 +27,7 @@ Widget bottomSection() {
const Gap(16.0),
contactOption(
icon: AppImages.byMailIcon,
title: AppText.byEmailText,
title: localizations.translate(AppText.byEmailText),
subtitle: 'info@tanamicapital.com',
onTap: () {
launchEmail('info@tanamicapital.com');

View File

@@ -5,9 +5,11 @@ import 'package:gap/gap.dart';
import '../../../../core/styles/app_color.dart';
import '../../../../core/styles/app_images.dart';
import '../../../../core/styles/app_text.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../../../../shared/components/text_widget.dart';
Widget topSection() {
Widget topSection(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Column(
children: [
const Gap(85),
@@ -18,7 +20,7 @@ Widget topSection() {
),
const Gap(24),
TextWidget().text17W700(
AppText.weAreHereToHelp,
localizations.translate(AppText.weAreHereToHelp),
clr: AppColor.textLabelColor,
),
const Gap(10),

View File

@@ -0,0 +1,27 @@
import 'package:bloc/bloc.dart';
import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_event.dart';
import '../../../../Api_Helper/base_manager.dart';
import '../../domain/model/get_country_model.dart';
import '../../repositories/get_country_api.dart';
import 'get_country_state.dart';
class GetCountryBlock extends Bloc<GetCountryEvent, GetCountryState> {
GetCountryBlock() : super(CountryInitial()) {
on<GetCountry>(mapEventToState);
}
Future<void> mapEventToState(
GetCountry event, Emitter<GetCountryState> emit) async {
emit(CountryLoading());
try {
ResponseData response = await GetCountryAPI().getcountryAPI();
if (response.status == ResponseStatus.SUCCESS) {
GetCountryModel countryModel = GetCountryModel.fromJson(response.data);
emit(CountryLoaded(countryModel));
}
print("//");
} catch (e) {
emit(CountryError("Oops Something went wrong"));
}
}
}

View File

@@ -0,0 +1,9 @@
abstract class GetCountryEvent {
const GetCountryEvent();
get props => [];
}
class GetCountry extends GetCountryEvent {
GetCountry();
}

View File

@@ -0,0 +1,21 @@
import '../../domain/model/get_country_model.dart';
abstract class GetCountryState {}
// Define states
//enum GetCountryState { initial, loading, success, failure, error }
class CountryInitial extends GetCountryState {}
class CountryLoading extends GetCountryState {}
class CountryLoaded extends GetCountryState {
final GetCountryModel countryModel;
CountryLoaded(this.countryModel);
}
class CountryError extends GetCountryState {
final String message;
CountryError(this.message);
}

View File

@@ -0,0 +1,71 @@
class GetCountryModel {
List<Data>? data;
GetCountryModel({this.data});
GetCountryModel.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) {
data = <Data>[];
json['data'].forEach((v) {
data!.add(Data.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (this.data != null) {
data['data'] = this.data!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Data {
String? id;
String? countryName;
String? countryCode;
String? isdCode;
String? flagIcon;
Null currencyXid;
bool? isActive;
Null createdBy;
Null modifiedBy;
Data(
{this.id,
this.countryName,
this.countryCode,
this.isdCode,
this.flagIcon,
this.currencyXid,
this.isActive,
this.createdBy,
this.modifiedBy});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
countryName = json['countryName'];
countryCode = json['countryCode'];
isdCode = json['isdCode'];
flagIcon = json['flagIcon'];
currencyXid = json['currency_xid'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['countryName'] = countryName;
data['countryCode'] = countryCode;
data['isdCode'] = isdCode;
data['flagIcon'] = flagIcon;
data['currency_xid'] = currencyXid;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
return data;
}
}

View File

@@ -5,6 +5,7 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/appbar_widget.dart';
import '../../../../core/styles/app_color.dart';
import '../../../../core/utils/language/localizations_delegate.dart';
import '../../../../shared/components/button_widget.dart';
import '../widgets/country_selection_list.dart';
@@ -13,6 +14,7 @@ class ChooseCountryLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: AppColor.plainWhite,
bottomNavigationBar: Container(
@@ -25,15 +27,16 @@ class ChooseCountryLayout extends StatelessWidget {
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
function: () {
print("//");
goRouter.pop();
},
text: AppText.confirmSelectionText,
text: localizations.translate(AppText.confirmSelectionText),
clr: AppColor.primaryColor2,
),
),
appBar: const AppBarWidget(
appBar: AppBarWidget(
height: 75,
titleTxt: AppText.chooseCountry,
titleTxt: localizations.translate(AppText.chooseCountry),
),
body: const CountrySelectionList(),
);

View File

@@ -1,13 +1,18 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/utils/constant/country_flag_data.dart';
import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_bloc.dart';
import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_event.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../bloc/choose_country_bloc.dart';
import '../bloc/choose_country_event.dart';
import '../bloc/choose_country_state.dart';
import '../../../../shared/api/api_endpoints.dart';
import '../../bloc/GetCountry/get_country_state.dart';
import '../../bloc/choose_country_bloc.dart';
import '../../bloc/choose_country_event.dart';
import '../../bloc/choose_country_state.dart';
class CountrySelectionList extends StatelessWidget {
const CountrySelectionList({super.key});
@@ -15,6 +20,7 @@ class CountrySelectionList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final radioBloc = context.read<RadioBloc>();
return BlocBuilder<RadioBloc, RadioState>(
builder: (context, state) {
int selectedIndex = -1;
@@ -22,35 +28,87 @@ class CountrySelectionList extends StatelessWidget {
selectedIndex = state.selectedIndex;
}
return Column(
children: List<Widget>.generate(countryFlag.length, (int index) {
return ListTile(
title: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
countryFlag[index],
width: 24,
height: 24,
return BlocConsumer<GetCountryBlock, GetCountryState>(
listener: (context, state) {
if (state is CountryLoaded) {
const SnackBar(content: Text("Successfully fetch"));
} else if (state is CountryError) {
const SnackBar(content: Text("error while fetching data"));
Future.delayed(const Duration(milliseconds: 3), () {
context.read<GetCountryBlock>().add(GetCountry());
});
} else {
const SnackBar(content: Text(" not fetch"));
}
}, builder: (context, state) {
print(state);
if (state is CountryLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is CountryLoaded) {
return ListView.builder(
itemCount: state.countryModel.data?.length ?? 0,
itemBuilder: (context, index) {
var country = state.countryModel.data![index];
print("${ApiEndpoints.base}${country.flagIcon}");
return ListTile(
title: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 24.h,
width: 24.w,
child: ClipRRect(
borderRadius:
const BorderRadius.all(Radius.circular(100)),
child: CachedNetworkImage(
maxHeightDiskCache: 200,
maxWidthDiskCache: 200,
cacheKey: country.countryName,
key: UniqueKey(),
imageUrl:
"${ApiEndpoints.base}${country.flagIcon}",
height: 24.h,
width: 24.w,
placeholder: (context, url) => SizedBox(
height: 24.h,
width: 24.w,
child: const CircularProgressIndicator(),
),
errorWidget: (context, url, error) =>
const Icon(Icons.error),
fit: BoxFit.cover),
),
),
/* Image.asset(
countryFlag[index],
width: 24,
height: 24,
), */
const Gap(10),
TextWidget().text14W500(country.countryName.toString(),
clr: AppColor.charcoalColor),
],
),
const Gap(10),
TextWidget().text14W500(countryName[index],
clr: AppColor.charcoalColor),
],
),
leading: Radio<int>(
activeColor: AppColor.radioActiveColor,
value: index,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
leading: Radio<int>(
activeColor: AppColor.radioActiveColor,
value: index,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
);
},
);
}),
);
} else if (state is CountryError) {
return Center(child: Text(state.message));
} else {
return const Center(
child: Text('Press button to fetch country data'));
}
});
},
);
}

View File

@@ -0,0 +1,15 @@
import '../../../Api_Helper/base_manager.dart';
import '../../../shared/api/api_endpoints.dart';
import '../../../shared/api/network_api_services.dart';
class GetCountryAPI {
GetCountryAPI();
Future<ResponseData> getcountryAPI() async {
String url=ApiEndpoints.getcountryurl;
final response = await NetworkApiService().get(
url,
);
return response;
}
}

Some files were not shown because too many files have changed in this diff Show More