Compare commits

...

83 Commits

Author SHA1 Message Date
Jayesh jain
6d02fed861 Merge pull request #153 from WDI-Ideas/jayeshjain25
io api settings api
2024-07-30 11:30:37 +05:30
jayesh
24382bcb13 io api settings api 2024-07-30 11:29:02 +05:30
Jayesh jain
bb041cd950 Merge pull request #152 from WDI-Ideas/jayeshjain25
Merge pull request #151 from WDI-Ideas/main
2024-07-30 11:28:40 +05:30
Jayesh jain
58a5924409 Merge pull request #151 from WDI-Ideas/main
Merge pull request #150 from WDI-Ideas/jayeshjain25
2024-07-26 17:42:08 +05:30
Jayesh jain
b689450d13 Merge pull request #150 from WDI-Ideas/jayeshjain25
io api settings api
2024-07-26 17:41:33 +05:30
jayesh
23ceeed933 io api settings api 2024-07-26 17:41:05 +05:30
Jayesh jain
ce55da045f Merge pull request #149 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-26 17:30:55 +05:30
jayesh
6194bc3243 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-26 17:30:23 +05:30
Jayesh jain
9414370f8b Merge pull request #148 from WDI-Ideas/jayeshjain25
Merge pull request #147 from WDI-Ideas/main
2024-07-26 17:30:16 +05:30
jayesh
14a5e75db5 io api settings api 2024-07-26 17:29:39 +05:30
Jayesh jain
0c41162fd0 Merge pull request #147 from WDI-Ideas/main
Merge pull request #146 from WDI-Ideas/jayeshjain25
2024-07-26 16:58:03 +05:30
Jayesh jain
376fb1002c Merge pull request #146 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-26 16:57:08 +05:30
jayesh
481eeaaee7 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-26 16:56:03 +05:30
Jayesh jain
0de5e3eebc Merge pull request #145 from WDI-Ideas/jayeshjain25
Merge pull request #144 from WDI-Ideas/main
2024-07-26 16:55:34 +05:30
jayesh
285f9f1d81 io api settings api 2024-07-26 16:54:11 +05:30
kishan06
9a6031b0bf app icon added 2024-07-26 15:47:06 +05:30
Jayesh jain
a5fd8a994e Merge pull request #144 from WDI-Ideas/main
Merge pull request #143 from WDI-Ideas/jayeshjain25
2024-07-26 15:34:27 +05:30
Jayesh jain
e5aaf103da Merge pull request #143 from WDI-Ideas/jayeshjain25
io api settings api
2024-07-26 15:33:18 +05:30
jayesh
babe51c40c io api settings api 2024-07-26 15:32:29 +05:30
Jayesh jain
1ce957b21e Merge pull request #142 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-26 14:58:59 +05:30
jayesh
f6027abafc Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-26 14:58:02 +05:30
Jayesh jain
d15dd35d43 Merge pull request #141 from WDI-Ideas/jayeshjain25
Merge pull request #140 from WDI-Ideas/main
2024-07-26 14:57:52 +05:30
jayesh
b4a3247886 io api settings api 2024-07-26 14:56:51 +05:30
Jayesh jain
987de9ae3d Merge pull request #140 from WDI-Ideas/main
Merge pull request #139 from WDI-Ideas/jayeshjain25
2024-07-26 12:06:32 +05:30
Jayesh jain
a5e6584b8c Merge pull request #139 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-26 12:06:00 +05:30
jayesh
7ea9a4aace Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-26 12:04:56 +05:30
Jayesh jain
df9b615554 Merge pull request #138 from WDI-Ideas/jayeshjain25
Merge pull request #137 from WDI-Ideas/main
2024-07-26 12:04:43 +05:30
jayesh
2da07cba30 io api settings api 2024-07-26 12:03:47 +05:30
Jayesh jain
d4f0a0c47c Merge pull request #137 from WDI-Ideas/main
changes
2024-07-25 23:51:28 +05:30
Jayesh jain
3c224e1036 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App 2024-07-25 23:49:38 +05:30
Jayesh jain
47b6a7d72f changes 2024-07-25 23:49:31 +05:30
Jayesh jain
309e5c97f3 Merge pull request #136 from WDI-Ideas/jayeshjain25
Merge pull request #135 from WDI-Ideas/main
2024-07-25 23:35:35 +05:30
Jayesh jain
2b8988809c Merge pull request #135 from WDI-Ideas/main
changes
2024-07-25 23:35:02 +05:30
Jayesh jain
fe805f9f2e changes 2024-07-25 23:34:06 +05:30
Jayesh jain
cd13209831 Merge pull request #134 from WDI-Ideas/jayeshjain25
Merge pull request #133 from WDI-Ideas/main
2024-07-25 23:33:29 +05:30
Jayesh jain
36f079a5f6 Merge pull request #133 from WDI-Ideas/main
Merge pull request #132 from WDI-Ideas/jayeshjain25
2024-07-25 19:20:56 +05:30
Jayesh jain
59fd3f25be Merge pull request #132 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-25 19:20:26 +05:30
jayesh
5a3fcda3b7 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-25 19:19:58 +05:30
Jayesh jain
94f6741ca9 Merge pull request #131 from WDI-Ideas/jayeshjain25
Merge pull request #130 from WDI-Ideas/main
2024-07-25 19:19:51 +05:30
jayesh
9b44dc0cf3 io api settings api 2024-07-25 19:19:25 +05:30
Jayesh jain
bd630a64ee Merge pull request #130 from WDI-Ideas/main
Merge pull request #129 from WDI-Ideas/jayeshjain25
2024-07-25 19:18:57 +05:30
Jayesh jain
bc15d0b1b3 Merge pull request #129 from WDI-Ideas/jayeshjain25
Merge pull request #128 from WDI-Ideas/main
2024-07-23 18:57:14 +05:30
Jayesh jain
8c3d5c208e Merge pull request #128 from WDI-Ideas/main
Merge pull request #127 from WDI-Ideas/jayeshjain25
2024-07-23 18:56:40 +05:30
Jayesh jain
846d6cd5e7 Merge pull request #127 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-23 18:56:01 +05:30
jayesh
ac0bb9bb30 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-23 18:55:32 +05:30
Jayesh jain
8bd568de06 Merge pull request #126 from WDI-Ideas/jayeshjain25
Merge pull request #125 from WDI-Ideas/main
2024-07-23 18:55:23 +05:30
Jayesh jain
6b53fe95bc Merge pull request #125 from WDI-Ideas/main
Merge pull request #124 from WDI-Ideas/jayeshjain25
2024-07-23 18:54:43 +05:30
jayesh
07ffe7d842 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-23 18:54:21 +05:30
Jayesh jain
a2cd025a9b Merge pull request #124 from WDI-Ideas/jayeshjain25
Merge pull request #123 from WDI-Ideas/main
2024-07-23 18:54:07 +05:30
jayesh
1dd5cc60c2 icon update 2024-07-23 18:52:59 +05:30
Jayesh jain
f753eb9507 Merge pull request #123 from WDI-Ideas/main
Merge pull request #122 from WDI-Ideas/jayeshjain25
2024-07-23 13:16:53 +05:30
Jayesh jain
85165153f5 Merge pull request #122 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-23 13:16:16 +05:30
jayesh
b030ec5254 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-23 13:15:23 +05:30
Jayesh jain
a99a59469f Merge pull request #121 from WDI-Ideas/jayeshjain25
Merge pull request #120 from WDI-Ideas/main
2024-07-23 13:15:00 +05:30
jayesh
e4fab6ea81 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-23 13:14:27 +05:30
Jayesh jain
5e51933675 Merge pull request #120 from WDI-Ideas/main
Merge pull request #119 from WDI-Ideas/jayeshjain25
2024-07-23 13:14:17 +05:30
Jayesh jain
2ee69e270d Merge pull request #119 from WDI-Ideas/jayeshjain25
Merge pull request #118 from WDI-Ideas/main
2024-07-23 13:07:37 +05:30
jayesh
ae5c2fe0f0 new splash screen, deposit screen 2024-07-23 13:06:35 +05:30
Jayesh jain
ad2151513d Merge pull request #118 from WDI-Ideas/main
Merge pull request #117 from WDI-Ideas/jayeshjain25
2024-07-22 19:29:38 +05:30
Jayesh jain
4e823837d0 Merge pull request #117 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-22 19:29:06 +05:30
jayesh
5903e3279d Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-22 19:28:25 +05:30
Jayesh jain
b8759bc16f Merge pull request #116 from WDI-Ideas/jayeshjain25
Merge pull request #115 from WDI-Ideas/main
2024-07-22 19:28:16 +05:30
jayesh
726527ba13 new splash screen, deposit screen 2024-07-22 19:27:32 +05:30
Jayesh jain
8646015198 Merge pull request #115 from WDI-Ideas/main
Merge pull request #114 from WDI-Ideas/jayeshjain25
2024-07-22 18:41:48 +05:30
Jayesh jain
857702bfb0 Merge pull request #114 from WDI-Ideas/jayeshjain25
new splash screen, deposit screen
2024-07-22 18:41:11 +05:30
jayesh
3d7d6b8368 new splash screen, deposit screen 2024-07-22 18:40:32 +05:30
Jayesh jain
fe73681e09 Merge pull request #113 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-19 16:21:47 +05:30
jayesh
b6ac751a0d Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-19 16:21:16 +05:30
Jayesh jain
8099dc03da Merge pull request #112 from WDI-Ideas/jayeshjain25
Merge pull request #111 from WDI-Ideas/main
2024-07-19 16:21:08 +05:30
jayesh
4e768e6f6a api integration 2024-07-19 16:20:14 +05:30
Jayesh jain
22a98e6fd7 Merge pull request #111 from WDI-Ideas/main
Merge pull request #110 from WDI-Ideas/jayeshjain25
2024-07-18 18:52:02 +05:30
Jayesh jain
948777ee21 Merge pull request #110 from WDI-Ideas/jayeshjain25
api integration
2024-07-18 18:51:31 +05:30
jayesh
58703af212 api integration 2024-07-18 18:51:01 +05:30
Jayesh jain
195a9aab7a Merge pull request #109 from WDI-Ideas/jayeshjain25
Merge pull request #108 from WDI-Ideas/main
2024-07-18 18:50:50 +05:30
Jayesh jain
d91f14c5ca Merge pull request #108 from WDI-Ideas/main
Merge pull request #107 from WDI-Ideas/jayeshjain25
2024-07-17 19:15:24 +05:30
Jayesh jain
2def888574 Merge pull request #107 from WDI-Ideas/jayeshjain25
Jayeshjain25
2024-07-17 19:14:53 +05:30
jayesh
c3cfd64328 Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-17 19:14:25 +05:30
Jayesh jain
74f9b14645 Merge pull request #106 from WDI-Ideas/jayeshjain25
Merge pull request #105 from WDI-Ideas/main
2024-07-17 19:14:16 +05:30
jayesh
7ea696d96c Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25 2024-07-17 19:13:53 +05:30
Jayesh jain
bef5db2c79 Merge pull request #105 from WDI-Ideas/main
bug fixing
2024-07-17 19:13:46 +05:30
Jayesh jain
83f0f9c990 Merge pull request #104 from WDI-Ideas/jayeshjain25
Merge pull request #102 from WDI-Ideas/main
2024-07-17 19:13:19 +05:30
jayesh
fab01aa29a api integration 2024-07-17 19:12:26 +05:30
Jayesh jain
7fa9f4d6f8 Merge pull request #102 from WDI-Ideas/main
Merge pull request #101 from WDI-Ideas/jayeshjain25
2024-07-12 09:16:01 +05:30
206 changed files with 7402 additions and 1813 deletions

View File

@@ -14,7 +14,7 @@ package="com.example.tanami_app">
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/launcher_icon">
<activity
android:name=".MainActivity"
android:exported="true"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
assets/images/Vector.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#FFC107" d="M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z"/><path fill="#FF3D00" d="M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z"/><path fill="#4CAF50" d="M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z"/><path fill="#1976D2" d="M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z"/></svg>

After

Width:  |  Height:  |  Size: 988 B

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.81204 2.5H16.188C19.3978 2.5 22 5.16116 22 8.44374V9.18592L22.0002 9.20241L22 9.21891V14.5201L22.0002 14.5366L22 14.5531V15.5563C22 18.8388 19.3978 21.5 16.188 21.5H7.81204C4.60219 21.5 2 18.8388 2 15.5563V8.44374C2 5.16116 4.60219 2.5 7.81204 2.5ZM20.5464 8.44374V8.45916H17.3504L17.1673 8.46431C15.4101 8.56244 14.0147 10.0491 14.0147 11.8695C14.0159 13.7531 15.5084 15.2787 17.3499 15.2798H20.5464V15.5563C20.5464 18.0179 18.595 20.0135 16.188 20.0135H7.81204C5.40498 20.0135 3.45358 18.0179 3.45358 15.5563V8.44374C3.45358 5.98214 5.40498 3.98651 7.81204 3.98651H16.188C18.595 3.98651 20.5464 5.98214 20.5464 8.44374ZM17.3508 9.94567L20.5464 9.94567V13.7933H17.3504L17.2033 13.7874C16.2329 13.7102 15.4689 12.8811 15.4683 11.869C15.4683 10.8074 16.3109 9.94632 17.3508 9.94567ZM18.521 11.8084C18.521 11.3979 18.1956 11.0652 17.7942 11.0652H17.4921L17.3935 11.072C17.0388 11.1212 16.7653 11.4322 16.7653 11.8084C16.7653 12.2189 17.0907 12.5517 17.4921 12.5517H17.7942L17.8928 12.5449C18.2475 12.4957 18.521 12.1847 18.521 11.8084ZM13.0807 7.74062C13.0807 7.33013 12.7553 6.99736 12.3539 6.99736H7.12203L7.0234 7.00415C6.66866 7.05337 6.39524 7.36434 6.39524 7.74062C6.39524 8.15111 6.72063 8.48388 7.12203 8.48388H12.3539L12.4525 8.47709C12.8073 8.42788 13.0807 8.1169 13.0807 7.74062Z" fill="#363636"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +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 width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" rx="20" fill="#004717"/>
<path d="M19.38 26.5V15.42L17.08 15.96V14L20.46 12.5H22.04V26.5H19.38Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 244 B

View File

@@ -1,4 +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 width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" rx="20" fill="#004717"/>
<path d="M15.02 26.5V24.64C15.8733 23.9333 16.7 23.2333 17.5 22.54C18.3133 21.8467 19.0333 21.16 19.66 20.48C20.3 19.8 20.8067 19.14 21.18 18.5C21.5667 17.8467 21.76 17.2133 21.76 16.6C21.76 16.0267 21.6 15.52 21.28 15.08C20.9733 14.64 20.46 14.42 19.74 14.42C19.0067 14.42 18.4533 14.66 18.08 15.14C17.7067 15.62 17.52 16.2 17.52 16.88H15.04C15.0667 15.8533 15.2933 15 15.72 14.32C16.1467 13.6267 16.7133 13.1133 17.42 12.78C18.1267 12.4333 18.92 12.26 19.8 12.26C21.2267 12.26 22.3333 12.6533 23.12 13.44C23.92 14.2133 24.32 15.22 24.32 16.46C24.32 17.2333 24.14 17.9867 23.78 18.72C23.4333 19.4533 22.9733 20.16 22.4 20.84C21.8267 21.52 21.2067 22.16 20.54 22.76C19.8733 23.3467 19.2267 23.8933 18.6 24.4H24.66V26.5H15.02Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 905 B

After

Width:  |  Height:  |  Size: 899 B

View File

@@ -1,4 +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 width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="40" height="40" rx="20" fill="#004717"/>
<path d="M19.94 26.74C19.02 26.74 18.1867 26.58 17.44 26.26C16.6933 25.9267 16.0933 25.42 15.64 24.74C15.1867 24.06 14.9467 23.2067 14.92 22.18H17.44C17.4533 22.86 17.6733 23.4333 18.1 23.9C18.54 24.3533 19.1533 24.58 19.94 24.58C20.6867 24.58 21.26 24.3733 21.66 23.96C22.06 23.5467 22.26 23.0267 22.26 22.4C22.26 21.6667 21.9933 21.1133 21.46 20.74C20.94 20.3533 20.2667 20.16 19.44 20.16H18.4V18.06H19.46C20.14 18.06 20.7067 17.9 21.16 17.58C21.6133 17.26 21.84 16.7867 21.84 16.16C21.84 15.64 21.6667 15.2267 21.32 14.92C20.9867 14.6 20.52 14.44 19.92 14.44C19.2667 14.44 18.7533 14.6333 18.38 15.02C18.02 15.4067 17.82 15.88 17.78 16.44H15.28C15.3333 15.1467 15.78 14.1267 16.62 13.38C17.4733 12.6333 18.5733 12.26 19.92 12.26C20.88 12.26 21.6867 12.4333 22.34 12.78C23.0067 13.1133 23.5067 13.56 23.84 14.12C24.1867 14.68 24.36 15.3 24.36 15.98C24.36 16.7667 24.14 17.4333 23.7 17.98C23.2733 18.5133 22.74 18.8733 22.1 19.06C22.8867 19.22 23.5267 19.6067 24.02 20.22C24.5133 20.82 24.76 21.58 24.76 22.5C24.76 23.2733 24.5733 23.98 24.2 24.62C23.8267 25.26 23.28 25.7733 22.56 26.16C21.8533 26.5467 20.98 26.74 19.94 26.74Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,5 @@
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="42" cy="42" r="42" fill="#B5D0BD"/>
<circle cx="42" cy="42" r="27" fill="#066123"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M57.357 30.9319C58.6588 32.1745 58.6588 34.1891 57.357 35.4317L39.5792 52.4014C38.2775 53.644 36.1669 53.644 34.8652 52.4014L25.9763 43.9166C24.6746 42.674 24.6746 40.6594 25.9763 39.4168C27.2781 38.1742 29.3886 38.1742 30.6904 39.4168L37.2222 45.6517L52.643 30.9319C53.9447 29.6894 56.0553 29.6894 57.357 30.9319Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 579 B

View File

@@ -0,0 +1,10 @@
<svg width="300" height="28" viewBox="0 0 300 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M148 14L287 14" stroke="#066123" stroke-opacity="0.46" stroke-dasharray="4 4"/>
<path d="M12 14L151 14" stroke="#066123" stroke-opacity="0.5" stroke-dasharray="4 4"/>
<rect width="28" height="28" rx="14" fill="#004717"/>
<path d="M13.228 18.5V11.852L11.848 12.176V11L13.876 10.1H14.824V18.5H13.228Z" fill="white"/>
<rect x="136" width="28" height="28" rx="14" fill="#D8D8D8"/>
<path d="M147.112 18.5V17.384C147.624 16.96 148.12 16.54 148.6 16.124C149.088 15.708 149.52 15.296 149.896 14.888C150.28 14.48 150.584 14.084 150.808 13.7C151.04 13.308 151.156 12.928 151.156 12.56C151.156 12.216 151.06 11.912 150.868 11.648C150.684 11.384 150.376 11.252 149.944 11.252C149.504 11.252 149.172 11.396 148.948 11.684C148.724 11.972 148.612 12.32 148.612 12.728H147.124C147.14 12.112 147.276 11.6 147.532 11.192C147.788 10.776 148.128 10.468 148.552 10.268C148.976 10.06 149.452 9.956 149.98 9.956C150.836 9.956 151.5 10.192 151.972 10.664C152.452 11.128 152.692 11.732 152.692 12.476C152.692 12.94 152.584 13.392 152.368 13.832C152.16 14.272 151.884 14.696 151.54 15.104C151.196 15.512 150.824 15.896 150.424 16.256C150.024 16.608 149.636 16.936 149.26 17.24H152.896V18.5H147.112Z" fill="white"/>
<rect x="272" width="28" height="28" rx="14" fill="#D8D8D8"/>
<path d="M285.564 18.644C285.012 18.644 284.512 18.548 284.064 18.356C283.616 18.156 283.256 17.852 282.984 17.444C282.712 17.036 282.568 16.524 282.552 15.908H284.064C284.072 16.316 284.204 16.66 284.46 16.94C284.724 17.212 285.092 17.348 285.564 17.348C286.012 17.348 286.356 17.224 286.596 16.976C286.836 16.728 286.956 16.416 286.956 16.04C286.956 15.6 286.796 15.268 286.476 15.044C286.164 14.812 285.76 14.696 285.264 14.696H284.64V13.436H285.276C285.684 13.436 286.024 13.34 286.296 13.148C286.568 12.956 286.704 12.672 286.704 12.296C286.704 11.984 286.6 11.736 286.392 11.552C286.192 11.36 285.912 11.264 285.552 11.264C285.16 11.264 284.852 11.38 284.628 11.612C284.412 11.844 284.292 12.128 284.268 12.464H282.768C282.8 11.688 283.068 11.076 283.572 10.628C284.084 10.18 284.744 9.956 285.552 9.956C286.128 9.956 286.612 10.06 287.004 10.268C287.404 10.468 287.704 10.736 287.904 11.072C288.112 11.408 288.216 11.78 288.216 12.188C288.216 12.66 288.084 13.06 287.82 13.388C287.564 13.708 287.244 13.924 286.86 14.036C287.332 14.132 287.716 14.364 288.012 14.732C288.308 15.092 288.456 15.548 288.456 16.1C288.456 16.564 288.344 16.988 288.12 17.372C287.896 17.756 287.568 18.064 287.136 18.296C286.712 18.528 286.188 18.644 285.564 18.644Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,10 @@
<svg width="300" height="28" viewBox="0 0 300 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M148 14L287 14" stroke="#066123" stroke-opacity="0.46" stroke-dasharray="4 4"/>
<path d="M12 14L151 14" stroke="#066123" stroke-opacity="0.8" stroke-dasharray="4 4"/>
<rect width="28" height="28" rx="14" fill="#004717"/>
<path d="M13.228 18.5V11.852L11.848 12.176V11L13.876 10.1H14.824V18.5H13.228Z" fill="white"/>
<rect x="136" width="28" height="28" rx="14" fill="#004717"/>
<path d="M147.112 18.5V17.384C147.624 16.96 148.12 16.54 148.6 16.124C149.088 15.708 149.52 15.296 149.896 14.888C150.28 14.48 150.584 14.084 150.808 13.7C151.04 13.308 151.156 12.928 151.156 12.56C151.156 12.216 151.06 11.912 150.868 11.648C150.684 11.384 150.376 11.252 149.944 11.252C149.504 11.252 149.172 11.396 148.948 11.684C148.724 11.972 148.612 12.32 148.612 12.728H147.124C147.14 12.112 147.276 11.6 147.532 11.192C147.788 10.776 148.128 10.468 148.552 10.268C148.976 10.06 149.452 9.956 149.98 9.956C150.836 9.956 151.5 10.192 151.972 10.664C152.452 11.128 152.692 11.732 152.692 12.476C152.692 12.94 152.584 13.392 152.368 13.832C152.16 14.272 151.884 14.696 151.54 15.104C151.196 15.512 150.824 15.896 150.424 16.256C150.024 16.608 149.636 16.936 149.26 17.24H152.896V18.5H147.112Z" fill="white"/>
<rect x="272" width="28" height="28" rx="14" fill="#D8D8D8"/>
<path d="M285.564 18.644C285.012 18.644 284.512 18.548 284.064 18.356C283.616 18.156 283.256 17.852 282.984 17.444C282.712 17.036 282.568 16.524 282.552 15.908H284.064C284.072 16.316 284.204 16.66 284.46 16.94C284.724 17.212 285.092 17.348 285.564 17.348C286.012 17.348 286.356 17.224 286.596 16.976C286.836 16.728 286.956 16.416 286.956 16.04C286.956 15.6 286.796 15.268 286.476 15.044C286.164 14.812 285.76 14.696 285.264 14.696H284.64V13.436H285.276C285.684 13.436 286.024 13.34 286.296 13.148C286.568 12.956 286.704 12.672 286.704 12.296C286.704 11.984 286.6 11.736 286.392 11.552C286.192 11.36 285.912 11.264 285.552 11.264C285.16 11.264 284.852 11.38 284.628 11.612C284.412 11.844 284.292 12.128 284.268 12.464H282.768C282.8 11.688 283.068 11.076 283.572 10.628C284.084 10.18 284.744 9.956 285.552 9.956C286.128 9.956 286.612 10.06 287.004 10.268C287.404 10.468 287.704 10.736 287.904 11.072C288.112 11.408 288.216 11.78 288.216 12.188C288.216 12.66 288.084 13.06 287.82 13.388C287.564 13.708 287.244 13.924 286.86 14.036C287.332 14.132 287.716 14.364 288.012 14.732C288.308 15.092 288.456 15.548 288.456 16.1C288.456 16.564 288.344 16.988 288.12 17.372C287.896 17.756 287.568 18.064 287.136 18.296C286.712 18.528 286.188 18.644 285.564 18.644Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,10 @@
<svg width="300" height="28" viewBox="0 0 300 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M148 14L287 14" stroke="#066123" stroke-opacity="0.8" stroke-dasharray="4 4"/>
<path d="M12 14L151 14" stroke="#066123" stroke-opacity="0.8" stroke-dasharray="4 4"/>
<rect width="28" height="28" rx="14" fill="#004717"/>
<path d="M13.228 18.5V11.852L11.848 12.176V11L13.876 10.1H14.824V18.5H13.228Z" fill="white"/>
<rect x="136" width="28" height="28" rx="14" fill="#004717"/>
<path d="M147.112 18.5V17.384C147.624 16.96 148.12 16.54 148.6 16.124C149.088 15.708 149.52 15.296 149.896 14.888C150.28 14.48 150.584 14.084 150.808 13.7C151.04 13.308 151.156 12.928 151.156 12.56C151.156 12.216 151.06 11.912 150.868 11.648C150.684 11.384 150.376 11.252 149.944 11.252C149.504 11.252 149.172 11.396 148.948 11.684C148.724 11.972 148.612 12.32 148.612 12.728H147.124C147.14 12.112 147.276 11.6 147.532 11.192C147.788 10.776 148.128 10.468 148.552 10.268C148.976 10.06 149.452 9.956 149.98 9.956C150.836 9.956 151.5 10.192 151.972 10.664C152.452 11.128 152.692 11.732 152.692 12.476C152.692 12.94 152.584 13.392 152.368 13.832C152.16 14.272 151.884 14.696 151.54 15.104C151.196 15.512 150.824 15.896 150.424 16.256C150.024 16.608 149.636 16.936 149.26 17.24H152.896V18.5H147.112Z" fill="white"/>
<rect x="272" width="28" height="28" rx="14" fill="#004717"/>
<path d="M285.564 18.644C285.012 18.644 284.512 18.548 284.064 18.356C283.616 18.156 283.256 17.852 282.984 17.444C282.712 17.036 282.568 16.524 282.552 15.908H284.064C284.072 16.316 284.204 16.66 284.46 16.94C284.724 17.212 285.092 17.348 285.564 17.348C286.012 17.348 286.356 17.224 286.596 16.976C286.836 16.728 286.956 16.416 286.956 16.04C286.956 15.6 286.796 15.268 286.476 15.044C286.164 14.812 285.76 14.696 285.264 14.696H284.64V13.436H285.276C285.684 13.436 286.024 13.34 286.296 13.148C286.568 12.956 286.704 12.672 286.704 12.296C286.704 11.984 286.6 11.736 286.392 11.552C286.192 11.36 285.912 11.264 285.552 11.264C285.16 11.264 284.852 11.38 284.628 11.612C284.412 11.844 284.292 12.128 284.268 12.464H282.768C282.8 11.688 283.068 11.076 283.572 10.628C284.084 10.18 284.744 9.956 285.552 9.956C286.128 9.956 286.612 10.06 287.004 10.268C287.404 10.468 287.704 10.736 287.904 11.072C288.112 11.408 288.216 11.78 288.216 12.188C288.216 12.66 288.084 13.06 287.82 13.388C287.564 13.708 287.244 13.924 286.86 14.036C287.332 14.132 287.716 14.364 288.012 14.732C288.308 15.092 288.456 15.548 288.456 16.1C288.456 16.564 288.344 16.988 288.12 17.372C287.896 17.756 287.568 18.064 287.136 18.296C286.712 18.528 286.188 18.644 285.564 18.644Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,23 @@
<svg width="123" height="32" viewBox="0 0 123 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_699_21034)">
<path d="M47.5693 0.91821C48.4315 0.784938 49.7546 0.577627 50.3194 0.533203L50.4978 0.710899C50.3938 1.54014 49.814 4.72386 49.6208 5.49387L49.0707 5.67156C48.8329 5.21252 47.8518 3.28748 47.4801 2.25093L44.0462 2.39901V8.45546C44.0462 14.8821 44.1503 15.4448 44.1949 16.0964L47.2869 16.9256L46.945 17.9918C45.3841 17.9918 43.7935 17.9622 42.2178 17.9622C40.642 17.9622 38.9176 17.9918 37.223 17.9918L37.5352 16.9256L40.0772 16.0964C40.1515 15.3115 40.1515 14.2602 40.1515 9.31432V2.41381L36.9257 2.26573C36.3013 3.25787 35.4391 4.48693 34.7405 5.37541L34.1161 5.50868C34.0715 4.8127 34.1161 1.42168 34.2648 0.696091L34.5026 0.548011C34.9634 0.548011 36.5094 0.829362 37.0743 0.933018H47.5247L47.5693 0.91821Z" fill="#002F0F"/>
<path d="M56.9354 10.1438C57.0098 8.23357 55.7313 7.75972 54.8543 7.75972C54.3043 7.75972 53.8583 7.89299 53.6056 8.01145C53.4569 9.18128 53.1893 10.4696 53.011 10.9582L52.7434 11.1952C52.4609 11.1655 50.796 9.92168 50.3798 8.663C51.3609 7.80414 53.0258 6.93047 54.3489 6.45662C55.0475 6.19007 55.553 6.04199 56.0881 6.04199C59.5964 6.04199 60.5329 8.42607 60.5329 9.98091C60.5329 11.8467 60.5031 14.0531 60.4883 15.5783C60.6369 15.8597 61.4991 16.4816 62.4357 16.763L62.3019 17.3108C61.9897 17.5922 61.0532 18.2437 59.6707 18.2437C58.0355 18.2437 57.2327 17.5182 56.9949 16.9406H56.9354C55.5827 17.8735 54.7502 18.2882 53.888 18.2882C51.6731 18.2882 50.3203 16.452 50.3203 14.8972C50.3203 13.7569 50.7068 13.135 51.4947 12.6908C52.3271 12.1725 55.1664 11.2692 56.876 10.7953L56.9057 10.129L56.9354 10.1438ZM55.8949 16.1558C56.207 16.1558 56.3854 16.0522 56.653 15.9041C56.8165 15.7708 56.8611 15.5635 56.8611 15.2822L56.9206 12.0688C56.2962 12.3354 55.5232 12.6611 54.9435 13.0313C54.3637 13.4164 54.111 13.831 54.111 14.3493C54.111 15.6968 55.1219 16.1558 55.9097 16.1558" fill="#002F0F"/>
<path d="M64.9329 8.66261L63.5505 8.07029L63.8329 7.19662C64.2789 6.88566 68.0101 6.0268 68.6939 6.05641L68.4412 7.92221L68.4858 7.95183C69.9426 6.88566 71.2359 6.05641 72.3359 6.05641C75.2496 6.05641 76.1861 8.41088 76.1861 10.173V15.7112C76.1861 16.0518 76.3645 16.1999 76.751 16.3628L78.1037 16.9255L77.8362 17.9916C76.6618 17.9916 75.4725 17.962 74.2982 17.962C73.2279 17.962 72.1873 17.9916 71.1021 17.9916L71.3102 16.9255L72.3211 16.1702C72.3508 15.5039 72.4251 13.9194 72.4251 10.9578C72.4251 9.16608 71.7264 8.42568 70.5521 8.42568C69.898 8.42568 69.3034 8.70704 68.679 9.22531V16.1702L70.0021 16.9255L69.7939 17.9916C68.7534 17.962 67.7425 17.962 66.7019 17.962C65.5573 17.962 64.4127 17.9916 63.2383 17.9916L63.5059 16.9255L64.8586 16.1702C64.8883 15.8593 64.9181 13.3715 64.9181 10.6617V8.66261H64.9329Z" fill="#002F0F"/>
<path d="M85.8339 10.1438C85.9082 8.23357 84.6298 7.75972 83.7527 7.75972C83.2027 7.75972 82.7716 7.89299 82.504 8.01145C82.3405 9.18128 82.0878 10.4696 81.9094 10.9582L81.6418 11.1952C81.3594 11.1655 79.6944 9.92168 79.2782 8.663C80.2593 7.80414 81.9243 6.93047 83.2621 6.45662C83.9608 6.19007 84.4514 6.04199 85.0014 6.04199C88.5097 6.04199 89.4462 8.42607 89.4462 9.98091C89.4462 11.8467 89.4164 14.0531 89.3867 15.5783C89.5502 15.8597 90.3976 16.4816 91.3341 16.763L91.2003 17.3108C90.8881 17.5922 89.9516 18.2437 88.5691 18.2437C86.9339 18.2437 86.1312 17.5182 85.8933 16.9406H85.8339C84.4811 17.8735 83.6486 18.2882 82.7865 18.2882C80.5715 18.2882 79.2188 16.452 79.2188 14.8972C79.2188 13.7569 79.6053 13.135 80.3931 12.6908C81.2256 12.1725 84.05 11.2692 85.7744 10.7953L85.8041 10.129L85.8339 10.1438ZM84.7933 16.1558C85.1055 16.1558 85.2838 16.0522 85.5514 15.9041C85.7149 15.7708 85.7595 15.5635 85.7595 15.2822L85.819 12.0688C85.1947 12.3354 84.4217 12.6611 83.8419 13.0313C83.2622 13.4164 83.0094 13.831 83.0094 14.3493C83.0094 15.6968 84.0203 16.1558 84.8082 16.1558" fill="#002F0F"/>
<path d="M93.9056 8.633L92.5231 8.07029L92.8056 7.19662C93.2515 6.88566 96.9976 6.0268 97.6368 6.05641L97.399 7.92221L97.4584 7.95183C99.0193 6.88566 100.09 6.05641 101.532 6.05641C103.122 6.05641 104.103 7.09297 104.52 8.05549C106.11 6.87085 107.507 6.05641 108.726 6.05641C111.61 6.05641 112.502 8.47011 112.502 10.0694V15.8445C112.502 16.1258 112.74 16.2591 113.052 16.4368L114.375 16.9255L114.108 17.9916C112.963 17.9916 111.789 17.962 110.629 17.962C109.559 17.962 108.474 17.9916 107.359 17.9916L107.597 16.9255L108.667 16.1406C108.697 15.4447 108.771 13.7862 108.771 11.2244C108.771 8.66261 107.493 8.38126 106.868 8.38126C105.991 8.38126 105.441 8.79588 104.847 9.25493C104.98 9.74359 105.084 10.2323 105.084 10.943V16.1554L106.482 16.9403L106.214 18.0064C105.233 18.0064 104.237 17.9768 103.226 17.9768C102.111 17.9768 100.967 18.0064 99.8221 18.0064L100 16.9699L101.279 16.1702C101.309 15.7556 101.338 14.0675 101.338 10.869C101.338 8.8255 100.194 8.51453 99.391 8.51453C98.8409 8.51453 98.3058 8.69223 97.6517 9.21051C97.6517 11.0171 97.6517 15.8445 97.6814 16.1702L98.9747 16.9551L98.7369 18.0212C97.726 18.0212 96.7152 17.9916 95.6895 17.9916C94.5448 17.9916 93.3704 18.0212 92.2109 18.0212L92.3893 16.9847L93.8461 16.1851C93.8759 15.8741 93.9056 14.2452 93.9056 10.6913V8.67742V8.633Z" fill="#002F0F"/>
<path d="M115.638 6.85616C116.025 6.75251 118.418 6.18981 120.663 6.02692V11.4466C120.663 14.3934 120.693 15.7706 120.722 16.2296L122.491 16.896L122.224 17.9769C121.049 17.9769 119.964 17.9473 118.76 17.9473C117.645 17.9473 116.471 17.9769 115.326 17.9769L115.564 16.896L116.857 16.2296C116.857 15.43 116.917 13.4901 116.917 11.3874V8.45542L115.386 7.77426L115.653 6.84136L115.638 6.85616ZM118.805 0.355469C119.325 0.533164 120.336 1.67338 120.722 2.39897L120.648 2.70993C120.336 3.40591 119.251 4.44247 118.745 4.75343L118.433 4.82747C117.705 4.44247 116.842 3.45033 116.486 2.78397L116.56 2.47301C117.051 1.67338 117.957 0.7849 118.537 0.429509L118.805 0.355469Z" fill="#002F0F"/>
<path d="M39.8536 31.5263C39.3185 31.2153 38.9022 30.7711 38.6049 30.1936C38.3225 29.616 38.1738 28.9497 38.1738 28.1649C38.1738 27.38 38.3225 26.7137 38.6049 26.151C38.8874 25.5735 39.3036 25.144 39.8536 24.8331C40.3888 24.5221 41.028 24.374 41.7415 24.374C42.2024 24.374 42.6483 24.4481 43.0497 24.5813C43.4659 24.7146 43.8227 24.9219 44.1349 25.1737C44.2241 25.2477 44.2835 25.3217 44.3281 25.3958C44.3579 25.4698 44.3876 25.5735 44.3876 25.6771C44.3876 25.8252 44.343 25.9585 44.2538 26.0621C44.1646 26.1658 44.0605 26.225 43.9416 26.225C43.793 26.225 43.6592 26.1806 43.5105 26.0769C43.2132 25.8548 42.9308 25.6919 42.6632 25.6031C42.3956 25.5142 42.1132 25.4698 41.801 25.4698C41.0726 25.4698 40.5077 25.6919 40.1361 26.151C39.7644 26.61 39.5712 27.2764 39.5712 28.1649C39.5712 29.0533 39.7644 29.7345 40.1361 30.1936C40.5077 30.6526 41.0726 30.8747 41.801 30.8747C42.0983 30.8747 42.3807 30.8303 42.6483 30.7414C42.901 30.6526 43.1983 30.4897 43.5254 30.2824C43.5997 30.238 43.674 30.2084 43.7335 30.1787C43.8078 30.1491 43.8822 30.1343 43.9565 30.1343C44.0754 30.1343 44.1795 30.1936 44.2687 30.2972C44.3579 30.4009 44.4025 30.5341 44.4025 30.6822C44.4025 30.7859 44.3876 30.8747 44.343 30.9636C44.3133 31.0376 44.2389 31.1116 44.1497 31.1857C43.8376 31.4522 43.4659 31.6447 43.0646 31.778C42.6632 31.9113 42.2172 31.9853 41.7564 31.9853C41.0429 31.9853 40.4036 31.8372 39.8685 31.5263" fill="#002F0F"/>
<path d="M59.0463 31.3631C59.0463 31.5259 58.9869 31.6592 58.8531 31.7777C58.7193 31.8961 58.5706 31.9406 58.4071 31.9406C58.2882 31.9406 58.1841 31.911 58.0949 31.8517C57.9909 31.7925 57.9166 31.7036 57.8571 31.5704L57.2179 30.1636H53.5015L52.8623 31.5704C52.8028 31.6888 52.7285 31.7925 52.6245 31.8517C52.5204 31.911 52.4163 31.9406 52.2974 31.9406C52.1339 31.9406 51.9852 31.8813 51.8515 31.7777C51.7177 31.674 51.6582 31.5259 51.6582 31.3631C51.6582 31.2742 51.6731 31.1854 51.7177 31.0817L54.6313 24.8328C54.6908 24.6995 54.7948 24.581 54.9286 24.507C55.0624 24.4329 55.1962 24.4033 55.3448 24.4033C55.4935 24.4033 55.6273 24.4329 55.7611 24.507C55.8949 24.581 55.9841 24.6847 56.0435 24.8328L58.972 31.0817C59.0166 31.1706 59.0315 31.2594 59.0315 31.3631M56.7422 29.1123L55.3448 25.9878L53.9475 29.1123H56.7422Z" fill="#002F0F"/>
<path d="M67.0143 31.7779C66.8954 31.6594 66.8359 31.4817 66.8359 31.2744V25.1143C66.8359 24.907 66.8954 24.7589 67.0143 24.6404C67.1333 24.522 67.2968 24.4775 67.49 24.4775H70.0915C70.8942 24.4775 71.5037 24.6848 71.9497 25.0699C72.3956 25.4697 72.6186 26.0176 72.6186 26.7432C72.6186 27.4687 72.3956 28.0166 71.9497 28.4165C71.5037 28.8163 70.8793 29.0236 70.0915 29.0236H68.2036V31.2892C68.2036 31.4965 68.1441 31.6742 68.0252 31.7927C67.9062 31.9111 67.7279 31.9704 67.5197 31.9704C67.3116 31.9704 67.1481 31.9111 67.0292 31.7927M69.928 27.987C70.8645 27.987 71.3402 27.5872 71.3402 26.7728C71.3402 25.9583 70.8645 25.5437 69.928 25.5437H68.2036V27.987H69.928Z" fill="#002F0F"/>
<path d="M80.7643 31.7774C80.6454 31.6589 80.5859 31.4812 80.5859 31.2887V25.099C80.5859 24.8917 80.6454 24.7288 80.7643 24.6103C80.8832 24.4919 81.0468 24.4326 81.2549 24.4326C81.463 24.4326 81.6265 24.4919 81.7603 24.6103C81.8792 24.7288 81.9387 24.8917 81.9387 25.099V31.2887C81.9387 31.496 81.8792 31.6589 81.7603 31.7774C81.6414 31.9106 81.463 31.9699 81.2549 31.9699C81.0468 31.9699 80.8832 31.9106 80.7643 31.7774Z" fill="#002F0F"/>
<path d="M92.2704 31.7632C92.1515 31.6448 92.092 31.4819 92.092 31.2746V25.5883H90.1744C89.7433 25.5883 89.5352 25.4106 89.5352 25.0256C89.5352 24.6406 89.7433 24.4629 90.1744 24.4629H95.3921C95.8084 24.4629 96.0314 24.6554 96.0314 25.0256C96.0314 25.3958 95.8232 25.5883 95.3921 25.5883H93.4745V31.2746C93.4745 31.4819 93.415 31.6448 93.2961 31.7632C93.1772 31.8817 93.0137 31.9409 92.8056 31.9409C92.5974 31.9409 92.4191 31.8817 92.3001 31.7632" fill="#002F0F"/>
<path d="M109.484 31.3631C109.484 31.5259 109.424 31.6592 109.291 31.7777C109.157 31.8961 109.008 31.9406 108.845 31.9406C108.726 31.9406 108.622 31.911 108.532 31.8517C108.428 31.7925 108.354 31.7036 108.295 31.5704L107.655 30.1636H103.939L103.3 31.5704C103.24 31.6888 103.166 31.7925 103.062 31.8517C102.958 31.911 102.854 31.9406 102.735 31.9406C102.571 31.9406 102.423 31.8813 102.289 31.7777C102.155 31.674 102.096 31.5259 102.096 31.3631C102.096 31.2742 102.111 31.1854 102.155 31.0817L105.069 24.8328C105.128 24.6995 105.232 24.581 105.366 24.507C105.5 24.4329 105.634 24.4033 105.782 24.4033C105.931 24.4033 106.065 24.4329 106.199 24.507C106.332 24.581 106.422 24.6847 106.496 24.8328L109.424 31.0817C109.469 31.1706 109.484 31.2594 109.484 31.3631ZM107.195 29.1123L105.797 25.9878L104.4 29.1123H107.195Z" fill="#002F0F"/>
<path d="M117.437 31.7329C117.318 31.6145 117.273 31.4664 117.273 31.2739V25.099C117.273 24.8917 117.333 24.7288 117.452 24.6103C117.571 24.4919 117.734 24.4326 117.942 24.4326C118.15 24.4326 118.329 24.4919 118.448 24.6103C118.567 24.7288 118.626 24.8917 118.626 25.099V30.7852H121.599C122.016 30.7852 122.239 30.9777 122.239 31.3479C122.239 31.7181 122.03 31.9106 121.599 31.9106H117.913C117.705 31.9106 117.556 31.8514 117.437 31.7477" fill="#002F0F"/>
<path d="M25.6429 6.13049C25.6875 5.89356 25.6429 5.65664 25.524 5.46413C24.8996 4.472 22.8333 1.37714 20.5589 0.103652C20.2913 -0.0592359 20.0981 -0.044428 19.4143 0.296155C16.0398 2.32485 6.09483 8.5738 6.09483 8.5738C4.25152 9.74363 0.624349 11.7723 0 14.571C0.252713 15.3559 1.54601 17.3697 3.6569 18.584C4.13259 18.658 4.34071 18.6728 5.79752 17.9917L13.483 14.808C13.483 17.5919 13.0667 22.1231 13.2748 25.9732C13.2748 25.9732 14.9992 28.7571 16.7682 29.69C16.7682 29.69 17.2588 30.1046 18.3886 29.2309C21.0792 27.1282 21.4508 25.7362 21.7482 24.7737C22.7144 20.4498 25.1969 8.35169 25.6578 6.11568" fill="#002F0F"/>
</g>
<defs>
<clipPath id="clip0_699_21034">
<rect width="122.462" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 268 KiB

View File

@@ -1,17 +1,17 @@
{
"splashVersionText": "التطبيق: v.",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "تانامي تقدم",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "يوفر Tanami الوصول إلى",
"welcomeTitle2Text": "استثمر مع",
"welcomeTitle3Text": "ابدأ الاستثمار اليوم",
"welcomeDescription1Text": "الوصول إلى استثمارات خاصة عالمية حصرية من الدرجة الأولى",
"welcomeDescription2Text": "خبراء استثمار ذوو خبرة مع سجل حافل طويل الأمد",
"welcomeDescription3Text": "بمبلغ 1000 ريال سعودي فقط",
"welcomeTitle3Text": "بمبلغ 1,000 ريال سعودي فقط",
"welcomeDescription1Text": "استثمارات خاصة عالمية حصرية",
"welcomeDescription2Text": "خبراء الاستثمار ذوي الخبرة مع سجل حافل طويل الأمد",
"welcomeDescription3Text": "ابدأ الاستثمار اليوم",
"loginText": "تسجيل الدخول",
"signUpText": "اشتراك",
"welcomeText": "مرحبا بعودتك!",
"pleaseEnterLoginDetails": "يرجى إدخال تفاصيل تسجيل الدخول الخاصة بك للبدء",
"toGetYourAccountPleaseSetYourInfo": "للحصول على حسابك، يرجى تحديد معلوماتك",
"toGetYourAccountPleaseSetYourInfo": "للحصول على حسابك، يرجى تحديد معلوماتك",
"countryOfResidence": "بلد الإقامة",
"chooseCountry": "اختر الدولة",
"phoneNumber": "رقم الهاتف",
@@ -108,11 +108,11 @@
"withdrawal": "انسحاب",
"yield": "عائد",
"refund": "استرداد",
"investment": " ",
"investment": "استثمار",
"walletDetailsTitle": "تفاصيل",
"withdrawalScreenTitle": "أدخل تفاصيل البنك",
"depositScreenTitle": "إخطار الإيداع",
"status": "الحالة",
"status": "الحالة",
"paymentMethod": "طريقة الدفع",
"accountName": "اسم الحساب",
"accountHolderName": "اسم صاحب الحساب/المستفيد",
@@ -223,10 +223,10 @@
"choosePaymentMethodText": "اختر طريقة الدفع",
"balanceText": "الرصيد",
"applePayText": "Apple Pay",
"gPayText": "Gpay Pay",
"gPayText": "جوجل الدفع",
"bankTransferText": "حول الأموال مباشرة من حسابك المصرفي إلى محفظة تانامي الخاصة بك.",
"instantTransferFundsApplePayText": "تحويل فوري للأموال باستخدام Apple Pay!",
"instantTransferFundsGpayPayText": "تحويل فوري للأموال باستخدام Gpay Pay!",
"instantTransferFundsGpayPayText": "تحويل فوري للأموال باستخدام Google Pay!",
"retailInvestirCanInvestMaxText": "يمكن للمستثمرين التجزئة استثمار حد أقصى قدره 200,000 ريال سعودي في هذه الفرصة.",
"upgradeYourInvestorStatusToIncreaseText": "قم بترقية حالة المستثمر الخاصة بك لزيادة حد الاستثمار الخاص بك.",
"currentExchangeText": "سعر الصرف الحالي",
@@ -245,6 +245,90 @@
"tryAgainText": "حاول مرة اخرى",
"investmentConfirmationText": "تأكيد الاستثمار",
"enterAmountText": "أدخل المبلغ",
"pleaseEnterAmountText": "الرجاء إدخال المبلغ"
"pleaseEnterAmountText": "الرجاء إدخال المبلغ",
"authenticationFailedText" : "المصادقة فشلت",
"pleaseAuthenticateToAccessTheApp" : "يرجى المصادقة للوصول إلى التطبيق",
"masterPinAddedSucessfullyText" : "تمت إضافة الدبوس الرئيسي بنجاح",
"passwordChangedSucessfully" : "تم تغيير الرقم السري بنجاح!",
"passwordResetSucessful" : "تمت إعادة تعيين كلمة المرور بنجاح!",
"otpSendSuccessfulText" : "تم إرسال OTP بنجاح!",
"successfulText" : "ناجح !",
"portfolioBottomText" : "مَلَفّ",
"inOrderForYouToCompleteBankTransfers" : "لكي تتمكن من إكمال التحويل المصرفي، ستحتاج إلى إنشاء إشعار إيداع وتحويل الأموال من محفظتك مباشرة إلى حسابك المصرفي.",
"tanamiWillNotifyUponReceiptFunds" : "سوف يقوم Tanami بإخطارك عند استلام أموالك وسيظهر في رصيد محفظتك بعد 3-4 أيام عمل من بدء التحويل.",
"pleaseCompleteTheBelowSteps" : "يرجى إكمال الخطوات أدناه",
"insertTheAmountYouWouldLikeToTransfer" : "أدخل المبلغ الذي ترغب في تحويله.",
"copyTheBankDetailsYourTanamiAccountShownNextPage" : "انسخ التفاصيل المصرفية لحساب Tanami الخاص بك والموضحة في الصفحة التالية. تأكد من ملاحظة المعرف المرجعي.",
"transferTheFundsDirectlyFromYourBankAccount": "تحويل الأموال مباشرة من حسابك المصرفي.",
"copyTheBankDetailsOfYourTanamiAccount" : "انسخ التفاصيل المصرفية لحساب Tanami الخاص بك. تأكد من ملاحظة المعرف المرجعي/معرف العميل.",
"youAreAllSet" : "أنت جاهز تمامًا!",
"depositNotificationCreated" : "تم إنشاء إشعار الإيداع!",
"amountDeposited" : "المبلغ المودع",
"pleaseEnsureTheFundsAreTransferredFromBank" : "يرجى التأكد من تحويل الأموال من البنك الذي تتعامل معه خلال 14 يومًا من إنشاء إشعار الإيداع.",
"manageDepositNotifications" : "إدارة إشعارات الإيداع",
"accountNo" : "رقم الحساب",
"swiftCode" :"رمز السرعة",
"bankAddress" : "عنوان البنك",
"clientId" : "معرف العميل",
"bankDetails" : "التفاصيل المصرفية",
"addBankDetails" : "إضافة تفاصيل البنك",
"updateBankDetails" : "تحديث تفاصيل البنك",
"yourAccountDetails" : "تفاصيل حسابك",
"gettingStarted": "البدء",
"knowledgeAndEducation": "المعرفة والتعليم",
"complianceSecurityAndSupport": "الامتثال والأمان والدعم",
"getStartedTitle1": "كيف أبدأ في استخدام تطبيقكم؟",
"geStartedDesc1": "لبدء الاستخدام، قم بتنزيل تطبيق Tanami من متجر التطبيقات أو متجر Google Play. اتبع التعليمات على الشاشة لإنشاء حساب وإكمال عملية التسجيل. بمجرد إعداد حسابك، يمكنك استكشاف خيارات الاستثمار لدينا.",
"getStartedTitle2": "كم من المال أحتاج للبدء في الاستثمار عبر تطبيقكم؟",
"geStartedDesc2": "يختلف الحد الأدنى لمبلغ الاستثمار حسب الفرصة الاستثمارية المحددة. ستجد الحد الأدنى لمبلغ الاستثمار ضمن صفحة كل فرصة استثمارية.",
"getStartedTitle3": "كم يستغرق فتح حساب والبدء في الاستثمار؟",
"geStartedDesc3": "يمكن عادةً إكمال عملية فتح الحساب عبر الإنترنت في غضون بضع دقائق. بمجرد الموافقة على حسابك، يمكنك البدء في استكشاف والاستثمار في الأصول البديلة عبر تطبيقنا. ومع ذلك، يرجى ملاحظة أن متطلبات التحقق الإضافية أو تمويل الحساب قد تكون ضرورية، مما قد يؤثر على الجدول الزمني.",
"investmentTitle1": "ما هي أنواع الفرص الاستثمارية المتاحة عبر تطبيقكم؟",
"investmentDesc1": "يوفر تطبيقنا مجموعة من خيارات الاستثمار البديلة، بما في ذلك صناديق الأسهم الخاصة، صناديق رأس المال الاستثماري، صناديق الاستثمار العقاري، صناديق البنية التحتية، صناديق الدين الخاص، والمزيد. يمكنك اختيار الاستثمارات بناءً على تحملك للمخاطر وأهدافك الاستثمارية.",
"investmentTitle2": "كيف تختارون الفرص الاستثمارية البديلة المتاحة على تطبيقكم؟",
"investmentDesc2": "يقوم فريقنا من المتخصصين الاستثماريين ذوي الخبرة بإجراء عمليات تدقيق وبحث شاملة لتحديد واختيار مجموعة من الفرص الاستثمارية البديلة. نأخذ في الاعتبار عوامل مثل سجل الأداء، ممارسات إدارة المخاطر، خبرة مديري الصناديق، والتوافق مع فلسفتنا الاستثمارية.",
"investmentTitle3": "هل الاستثمارات البديلة مناسبة للجميع؟",
"investmentDesc3": "قد لا تكون الاستثمارات البديلة مناسبة لجميع المستثمرين. فهي أقل سيولة من الأسهم والسندات التقليدية، وقد تتضمن مخاطر أعلى مقارنة بالاستثمارات التقليدية. من المهم مراعاة تحملك للمخاطر وأهدافك الاستثمارية بعناية قبل الاستثمار. نوصي بالتشاور مع مستشار مالي لتحديد ما إذا كانت الاستثمارات البديلة تتماشى مع استراتيجيتك الاستثمارية العامة.",
"investmentTitle4": "كيف أختار الاستثمارات عبر تطبيقكم؟",
"investmentDesc4": "يوفر تطبيقنا معلومات شاملة حول كل فرصة استثمارية، بما في ذلك تاريخ الأداء، ملف المخاطر، والتفاصيل ذات الصلة. يمكنك مراجعة الاستثمارات المتاحة، إجراء الأبحاث، وتحليل البيانات لاتخاذ قرارات مستنيرة. نقدم أيضًا مقالات قصيرة وفيديوهات حول أنواع الاستثمارات المختلفة في منطقة المعرفة لدينا.",
"investmentTitle5": "كم مرة يتم تحديث أو تجديد خيارات الاستثمار؟",
"investmentDesc5": "نقوم بمراجعة وتحليل الفرص الاستثمارية بانتظام لضمان مجموعة متنوعة وديناميكية لمستخدمينا. قد يختلف تكرار التحديثات حسب ظروف السوق وتوافر الفرص الاستثمارية الجديدة. يمكنك توقع تطور عروضنا بمرور الوقت.",
"investmentTitle6": "ما هي فوائد الاستثمار في الأصول البديلة عبر تطبيقكم؟",
"investmentDesc6": "يوفر الاستثمار في الأصول البديلة عبر تطبيقنا العديد من الفوائد، بما في ذلك الوصول إلى فرص استثمارية فريدة في فئات الأصول ذات العائد المرتفع جنبًا إلى جنب مع مديري الصف الأول عالميًا. يتم اختيار فرص الاستثمار بواسطة خبراء استثماريين متمرسين يستهدفون الاستثمارات ذات العوائد المعدلة حسب المخاطر الأعلى. تلتزم Tanami بالشفافية والتوافق التام مع المستثمرين ولا تتلقى رسوم توظيف للاستثمارات المدرجة على المنصة. من خلال تطبيقنا المتطور، نسعى لتوفير تجربة استثمارية سلسة ومجزية لمستخدمينا.",
"investmentTitle7": "هل تقدمون أي ضمانات للأداء للاستثمارات التي تتم عبر تطبيقكم؟",
"investmentDesc7": "نحن لا نقدم ضمانات أداء للاستثمارات لأنها تخضع لتقلبات السوق والمخاطر الكامنة. الأداء السابق ليس مؤشراً على النتائج المستقبلية. نشجع المستخدمين على مراجعة بيانات الأداء التاريخية، ومراعاة تحملهم للمخاطر، وإجراء العناية الواجبة الشاملة قبل اتخاذ قرارات الاستثمار.",
"investmentTitle8": "هل يمكنني الوصول إلى حساب الاستثمار الخاص بي وإجراء المعاملات عبر التطبيق في أي وقت؟",
"investmentDesc8": "نعم، يوفر تطبيقنا وصولاً على مدار الساعة طوال أيام الأسبوع إلى حساب الاستثمار الخاص بك. يمكنك عرض محفظتك، وتتبع الأداء، وإجراء المعاملات في أي وقت يناسبك. تم تصميم تطبيقنا لتقديم واجهة سلسة وسهلة الاستخدام لإدارة استثماراتك البديلة.",
"investmentTitle9": "كيف يمكنني البقاء على اطلاع بأداء وأخبار استثماراتي؟",
"investmentDesc9": "نعم، يوفر تطبيقنا ميزة تتبع المحفظة التي تتيح لك مراقبة أداء استثماراتك في الوقت الفعلي. يمكنك عرض قيمة محفظتك، وتتبع عوائد الاستثمار الفردية، وتقييم الأداء العام لاستثماراتك البديلة. يمكنك أيضًا تخصيص تفضيلاتك لتلقي تحديثات الأخبار، والرؤى السوقية، والإعلانات المتعلقة بالاستثمار.",
"investmentTitle10": "ما هي أنواع التقارير والبيانات التي يمكنني توقعها من تطبيقكم؟",
"investmentDesc10": "يوفر تطبيقنا تقارير وبيانات دورية تلخص أداء محفظة استثماراتك، والمعاملات، والممتلكات. يمكنك الوصول إلى هذه التقارير داخل التطبيق أو تنزيلها لسجلاتك.",
"investmentTitle11": "ما هي الرسوم المرتبطة باستخدام تطبيقكم والاستثمار في الأصول البديلة؟",
"investmentDesc11": "يختلف هيكل الرسوم لدينا حسب الفرصة الاستثمارية المحددة. نحن شفافون بشأن رسومنا، ويمكنك العثور على معلومات مفصلة عنها في التطبيق وفي الشروط والأحكام لكل فرصة استثمارية. تلتزم Tanami بالتماشي التام مع المستثمرين ولا تتلقى رسوم توظيف للاستثمارات المدرجة على المنصة.",
"investmentTitle12": "هل يمكنني سحب استثماراتي في أي وقت؟",
"investmentDesc12": "قد تختلف سيولة الاستثمارات البديلة حسب الفرصة الاستثمارية المحددة. قد تحتوي بعض الاستثمارات على فترات قفل محددة أو قيود على الاسترداد. يوفر تطبيقنا معلومات حول شروط السيولة المرتبطة بكل استثمار، مما يتيح لك اتخاذ قرارات مستنيرة.",
"investmentTitle13": "هل هناك أي غرامات أو رسوم على السحوبات المبكرة أو التصفية؟",
"investmentDesc13": "قد تحتوي بعض الاستثمارات البديلة على شروط محددة بشأن السحوبات المبكرة أو التصفية. قد تختلف هذه الشروط حسب المنتج الاستثماري وسياسات الصندوق الأساسي. من المهم مراجعة الشروط والأحكام لكل استثمار قبل الالتزام.",
"knowledgeTitle1": "ما هو مستوى المعرفة أو الخبرة الاستثمارية التي أحتاجها لاستخدام تطبيقكم؟",
"knowledgeDesc1": "تم تصميم تطبيقنا ليكون سهل الاستخدام ومتاحًا للمستثمرين ذوي مستويات الخبرة المختلفة. سواء كنت مستثمرًا متمرسًا أو جديدًا على الاستثمارات البديلة، يوفر تطبيقنا موارد تعليمية، وتقارير تدقيق، ودعم معرفي آخر لمساعدتك في اتخاذ قرارات مستنيرة.",
"knowledgeTitle2": "هل تقدمون أي موارد تعليمية حول الاستثمارات البديلة؟",
"knowledgeDesc2": "بالتأكيد! نحن نؤمن بتمكين المستثمرين بالمعرفة. يوفر تطبيقنا موارد تعليمية مثل المقالات، والأدلة، والفيديوهات التي تغطي جوانب مختلفة من الاستثمارات البديلة، واستراتيجيات إدارة المخاطر، والرؤى السوقية. هذه الموارد متاحة في منطقة المعرفة لدينا وهي مصممة لتعزيز فهمك لمشهد الاستثمار.",
"knowledgeTitle3": "هل تقدمون أي نصائح استثمارية أو توصيات مخصصة؟",
"knowledgeDesc3": "في الوقت الحالي، لا نقدم أي توصيات استثمارية لأي من مستثمرينا. من المهم إجراء أبحاثك الخاصة، ومراجعة تفاصيل الفرص والمستندات، واستشارة مستشار مالي قبل اتخاذ قرارات الاستثمار.",
"securityTitle1": "هل هناك أي قيود على من يمكنه استخدام تطبيقكم والاستثمار في الأصول البديلة؟",
"securityDesc1": "قد تكون هناك بعض المتطلبات الأهلية أو القيود القانونية حسب ولايتك القضائية. قبل استخدام تطبيقنا والاستثمار في أي من فرصنا، سنطلب منك إكمال نموذج معرفة عميلك (KYC) بالتفصيل. نوصي أيضًا بمراجعة والامتثال للشروط والأحكام الموضحة في تطبيقنا واللوائح ذات الصلة في بلد إقامتك.",
"securityTitle2": "هل هناك أي قيود على التوافر الجغرافي لتطبيقكم وحلول الاستثمار الخاصة بكم؟",
"securityDesc2": "يتوفر تطبيقنا وحلول الاستثمار في ولايات قضائية مختارة. يرجى الرجوع إلى الشروط والأحكام الخاصة بتطبيقنا أو الاتصال بفريق الدعم لدينا للتحقق مما إذا كانت خدماتنا متاحة في بلدك أو منطقتك.",
"securityTitle3": "هل هناك أي آثار ضريبية مرتبطة بالاستثمار في الأصول البديلة؟",
"securityDesc3": "قد يكون للاستثمارات البديلة آثار ضريبية تختلف حسب الاستثمار المحدد والولاية القضائية الخاصة بك. نوصي باستشارة محترف ضرائب لفهم ومعالجة أي اعتبارات ضريبية تتعلق باستثماراتك البديلة.",
"securityTitle4": "ما مدى أمان معلوماتي الشخصية والمالية؟",
"securityDesc4": "نحن نولي أولوية قصوى لأمان بياناتك. يستخدم تطبيقنا بروتوكولات تشفير قياسية لحماية معلوماتك الشخصية والمالية. نلتزم أيضًا بسياسات خصوصية صارمة ونمتثل للأنظمة ذات الصلة لضمان سرية وسلامة بياناتك.",
"securityTitle5": "كيف يمكنني الحصول على الدعم إذا كان لدي أسئلة أو واجهت مشاكل؟",
"securityDesc5": "لدينا فريق دعم عملاء مخصص لمساعدتك. يمكنك الاتصال بنا من خلال قسم الاتصال داخل التطبيق، أو عبر البريد الإلكتروني، أو الهاتف. نسعى لتقديم دعم سريع ومفيد لمعالجة أي أسئلة أو مخاوف قد تكون لديك.",
"websiteText" : "موقع إلكتروني",
"toRestorePasswordYouWillBeLoggedOut" : "لاستعادة كلمة المرور، سيتم تسجيل خروجك من التطبيق",
"noDataAvailable" : "لا تتوافر بيانات",
"payWithGpayText": "ادفع باستخدام Google Pay"
}

View File

@@ -1,12 +1,12 @@
{
"splashVersionText": "APP: v.",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "Tanami offers",
"splashCopyrightText": "© 2024 Tanami",
"welcomeTitle1Text": "Tanami offers access to",
"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",
"welcomeTitle3Text": "With only SAR 1,000",
"welcomeDescription1Text": "Exclusive, Global Private Investments",
"welcomeDescription2Text": "Experienced Investment Experts with a long-standing track record",
"welcomeDescription3Text": "Start Investing Today ",
"loginText": "Log In",
"signUpText": "Sign Up",
"welcomeText": "Welcome back!",
@@ -79,7 +79,7 @@
"resendSms": "Resend SMS",
"otpVerifiedSucessfully": "OTP Verified Successfully!",
"otpVerifiedFailed": "OTP Verification Failed:",
"pinCode": "Pin Code",
"pinCode": "Pin Code",
"createPinCode": "Create Pin Code",
"changePinCode": "Change Pin Code",
"confirmPinCode": "Confirm Pin Code",
@@ -110,10 +110,10 @@
"refund": "Refund",
"investment": "Investment",
"walletDetailsTitle": "Details",
"withdrawalScreenTitle": "Enter bank details",
"withdrawalScreenTitle": "Enter bank details",
"depositScreenTitle": "Deposit notification",
"status": "Status",
"paymentMethod": "Payment Method",
"paymentMethod": "Payment Method",
"accountName": "Account Name",
"accountHolderName": "Account Holder Name/Beneficiary Name",
"iban": "IBAN",
@@ -139,6 +139,7 @@
"next": "Next",
"depositNoti": "Create deposit notification",
"payWithAppleText": "Pay with Apple Pay",
"payWithGpayText": "Pay with Google Pay",
"submit": "Submit request",
"Submit": "Submit",
"submitDeposit": "Submit deposit",
@@ -223,10 +224,10 @@
"choosePaymentMethodText": "Choose payment method",
"balanceText": "Balance",
"applePayText": "Apple Pay",
"gPayText": "Gpay Pay",
"gPayText": "Google 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!",
"instantTransferFundsGpayPayText": "Instant transfer of funds using Google 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",
@@ -245,6 +246,89 @@
"tryAgainText": "Try again",
"investmentConfirmationText": "Investment confirmation",
"enterAmountText": "Enter Amount",
"pleaseEnterAmountText": "Please Enter Amount"
}
"pleaseEnterAmountText": "Please Enter Amount",
"authenticationFailedText" : "Authentication failed",
"pleaseAuthenticateToAccessTheApp" : "Please authenticate to access the app",
"masterPinAddedSucessfullyText" : "Master pin added sucessfully",
"passwordChangedSucessfully" : "Password changed successfully!",
"passwordResetSucessful" : "Password reset successful!",
"otpSendSuccessfulText" : "OTP send successful !",
"successfulText" : "successful !",
"portfolioBottomText" : "Portfolio",
"inOrderForYouToCompleteBankTransfers" : "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.",
"tanamiWillNotifyUponReceiptFunds" : "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.",
"pleaseCompleteTheBelowSteps" : "Please complete the below steps",
"insertTheAmountYouWouldLikeToTransfer" : "Insert the amount you would like to transfer.",
"copyTheBankDetailsYourTanamiAccountShownNextPage" : "Copy the bank details of your Tanami account shown on the next page. Make sure to keep note of the reference ID.",
"transferTheFundsDirectlyFromYourBankAccount": "Transfer the funds directly from your bank account.",
"copyTheBankDetailsOfYourTanamiAccount" : "Copy the bank details of your Tanami account. Make sure to keep note of the Reference ID/ Client ID.",
"youAreAllSet" : "You're all set!",
"depositNotificationCreated" : "Deposit Notification Created!",
"amountDeposited" : "Amount Deposited",
"pleaseEnsureTheFundsAreTransferredFromBank" : "Please ensure the funds are transferred from your bank within 14 days of creating the deposit notification.",
"manageDepositNotifications" : "Manage Deposit Notifications",
"accountNo" : "Account No.",
"swiftCode" :"SWIFT Code",
"bankAddress" : "Bank Address",
"clientId" : "Client ID",
"bankDetails" : "Bank details",
"addBankDetails" : "Add bank details",
"updateBankDetails" : "Update bank details",
"yourAccountDetails" : "Your account Details",
"gettingStarted" : "Getting Started",
"knowledgeAndEducation" : "Knowledge and Education",
"complianceSecurityAndSupport": "Compliance, Security and Support",
"getStartedTitle1" : "How do I get started with your app?",
"geStartedDesc1" : "To get started, simply download the Tanami app from the App Store or Google Play Store. Follow the on-screen instructions to create an account and complete the registration process. Once your account is set up, you can explore our investment options.",
"getStartedTitle2" : "How much money do I need to start investing through your app?",
"geStartedDesc2" : "The minimum investment amount varies depending on the specific investment opportunity. You will find the minimum investment amount within the page of each investment opportunity.",
"getStartedTitle3" : "How long does it take to open an account and start investing?",
"geStartedDesc3" : "The account opening process can typically be completed online within a few minutes. Once your account is approved, you can start exploring and investing in alternative assets through our app. However, please note that additional verification requirements or account funding may be necessary, which may affect the timeline.",
"investmentTitle1" : "What types of investment opportunities are available through your app?",
"investmentDesc1" : "Our app offers a range of alternative investment options, including private equity funds, venture capital funds, real estate investment funds, infrastructure funds, private debt funds, and more. You can choose investments based on your risk tolerance and investment goals.",
"investmentTitle2" : "How do you select the alternative investment opportunities available on your app?",
"investmentDesc2" : "Our team of experienced investment professionals conducts extensive due diligence and research to identify and select a range of alternative investment opportunities. We consider factors such as performance track record, risk management practices, fund managers' expertise, and alignment with our investment philosophy.",
"investmentTitle3" : "Are alternative investments suitable for everyone?",
"investmentDesc3" : "Alternative investments may not be suitable for all investors. They are less liquid than traditional stocks and bonds, and may involve higher risks compared to traditional investments, and it is important to carefully consider your risk tolerance and investment objectives before investing. We recommend consulting with a financial advisor to determine if alternative investments align with your overall investment strategy.",
"investmentTitle4" : "How do I select investments through your app?",
"investmentDesc4" : "Our app provides comprehensive information about each investment opportunity, including performance history, risk profile, and relevant details. You can review the available investments, conduct research, and analyse the data to make informed decisions. We also offer short articles and videos about different types of investments in our Knowledge Zone.",
"investmentTitle5" : "How often are the investment options updated or refreshed?",
"investmentDesc5" : "We regularly review and analyze investment opportunities to ensure a diverse and dynamic selection for our users. The frequency of updates may vary depending on market conditions and the availability of new investment opportunities. You can expect our offerings to evolve over time.",
"investmentTitle6" : "What are the benefits of investing in alternative assets through your app?",
"investmentDesc6" : "Investing in alternative assets through our app offers several benefits, including access to unique investment opportunities in higher return asset classes alongside world class managers globally. Investment opportunities are vetted by seasoned investment experts that target investments with the highest risk-adjusted returns. Tanami is committed to transparency and total alignment with investors and does not receive placement fees for investments listed on the platform. Through our cutting-edge app, we strive to provide a seamless and rewarding investing experience for our users.",
"investmentTitle7" : "Do you offer any performance guarantees for the investments made through your app?",
"investmentDesc7" : "We do not provide performance guarantees for investments as they are subject to market fluctuations and inherent risks. Past performance is not indicative of future results. We encourage users to review historical performance data, consider their risk tolerance, and conduct thorough due diligence before making investment decisions.",
"investmentTitle8" : "Can I access my investment account and make transactions through the app at any time?",
"investmentDesc8" : "Yes, our app provides 24/7 access to your investment account. You can view your portfolio, track performance, and make transactions at your convenience. Our app is designed to offer a seamless and user-friendly interface for managing your alternative investments.",
"investmentTitle9" : "How can I stay updated on the performance and news related to my investments?",
"investmentDesc9" : "Yes, our app offers a portfolio tracking feature that allows you to monitor the performance of your investments in real-time. You can view your portfolio's value, track individual investment returns, and assess the overall performance of your alternative investments. You can also customize your preferences to receive news updates, market insights, and investment-related announcements.",
"investmentTitle10" : "What types of reporting and statements can I expect from your app?",
"investmentDesc10" : "Our app provides regular reports and statements that summarize your investment portfolio's performance, transactions, and holdings. You can access these reports within the app or download them for your records.",
"investmentTitle11" : "What are the fees associated with using your app and investing in alternative assets?",
"investmentDesc11" : "Our fee structure varies depending on the specific investment opportunity. We are transparent about our fees, and you can find detailed information about them in the app and in the terms and conditions of each investment opportunity. Tanami is committed to total alignment with investors and does not receive placement fees for investments listed on the platform.",
"investmentTitle12" : "Can I withdraw my investments at any time?",
"investmentDesc12" : "The liquidity of alternative investments may vary depending on the specific investment opportunity. Some investments may have specific lock-up periods or redemption restrictions. Our app provides information about the liquidity terms associated with each investment, allowing you to make informed decisions.",
"investmentTitle13" : "Are there any penalties or fees for early withdrawals or liquidation?",
"investmentDesc13" : "Some alternative investments may have specific terms regarding early withdrawals or liquidation. These terms can vary depending on the investment product and the underlying fund's policies. It is important to review the terms and conditions of each investment before making a commitment.",
"knowledgeTitle1" : "What level of investment knowledge or experience do I need to use your app?",
"knowledgeDesc1" : "Our app is designed to be user-friendly and accessible to investors with varying levels of experience. Whether you are a seasoned investor or new to alternative investments, our app provides educational resources, due diligence reports, and other knowledge support to help you make informed decisions.",
"knowledgeTitle2" : "Do you provide any educational resources on alternative investments?",
"knowledgeDesc2" : "Absolutely! We believe in empowering investors with knowledge. Our app offers educational resources such as articles, guides, and videos that cover various aspects of alternative investments, risk management strategies, and market insights. These resources are available in our Knowledge Zone and are designed to enhance your understanding of the investment landscape.",
"knowledgeTitle3" : "Do you provide any investment advice or personalized recommendations?",
"knowledgeDesc3" : "At the moment, we do not provide any investment recommendations to any of our investors. It is important to conduct your own research, review opportunity details and documents, and/or consult with a financial advisor before making investment decisions.",
"securityTitle1" : "Are there any restrictions on who can use your app and invest in alternative assets?",
"securityDesc1" : "There may be certain eligibility requirements or legal restrictions depending on your jurisdiction. Before using our app and investing in any of our opportunities, we will ask you to complete a detailed Know Your Customer (KYC) form. We also recommend reviewing and complying with the terms and conditions outlined in our app and relevant regulations in your country of residence.",
"securityTitle2" : "Are there any restrictions on the geographic availability of your app and investment solutions?",
"securityDesc2" : "Our app and investment solutions are available in select jurisdictions. Please refer to our app's terms and conditions or contact our support team to verify if our services are available in your country or region.",
"securityTitle3" : "Are there any tax implications associated with investing in alternative assets?",
"securityDesc3" : "Alternative investments may have tax implications that vary depending on the specific investment and your jurisdiction. We recommend consulting with a tax professional to understand and address any tax considerations related to your alternative investments.",
"securityTitle4" : "How secure is my personal and financial information?",
"securityDesc4" : "We prioritize the security of your data. Our app employs industry-standard encryption protocols to protect your personal and financial information. We also adhere to strict privacy policies and comply with relevant regulations to ensure the confidentiality and integrity of your data.",
"securityTitle5" : "How can I get support if I have questions or encounter issues?",
"securityDesc5" : "We have a dedicated customer support team available to assist you. You can reach out to us through our in-app contact section, email, or phone. We strive to provide timely and helpful support to address any questions or concerns you may have.",
"websiteText" : "website",
"toRestorePasswordYouWillBeLoggedOut" : "To restore password you will be logged out of the app",
"noDataAvailable" : "No Data Available"
}

View File

@@ -0,0 +1,37 @@
{
"provider": "google_pay",
"data": {
"environment": "TEST",
"apiVersion": 2,
"apiVersionMinor": 0,
"allowedPaymentMethods": [
{
"type": "CARD",
"tokenizationSpecification": {
"type": "PAYMENT_GATEWAY",
"parameters": {
"gateway": "example",
"gatewayMerchantId": "gatewayMerchantId"
}
},
"parameters": {
"allowedCardNetworks": ["VISA", "MASTERCARD"],
"allowedAuthMethods": ["PAN_ONLY", "CRYPTOGRAM_3DS"],
"billingAddressRequired": true,
"billingAddressParameters": {
"format": "FULL",
"phoneNumberRequired": true
}
}
}
],
"merchantInfo": {
"merchantId": "01234567890123456789",
"merchantName": "Example Merchant Name"
},
"transactionInfo": {
"countryCode": "US",
"currencyCode": "USD"
}
}
}

View File

@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '12.0'
platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
@@ -30,11 +30,10 @@ flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
# target 'RunnerTests' do
# inherit! :search_paths
# end
end
post_install do |installer|

146
ios/Podfile.lock Normal file
View File

@@ -0,0 +1,146 @@
PODS:
- connectivity_plus (0.0.1):
- Flutter
- FlutterMacOS
- device_info_plus (0.0.1):
- Flutter
- Firebase/CoreOnly (10.25.0):
- FirebaseCore (= 10.25.0)
- firebase_core (2.32.0):
- Firebase/CoreOnly (= 10.25.0)
- Flutter
- FirebaseCore (10.25.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.12)
- GoogleUtilities/Logger (~> 7.12)
- FirebaseCoreInternal (10.29.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- Flutter (1.0.0)
- flutter_jailbreak_detection (1.0.0):
- Flutter
- IOSSecuritySuite
- flutter_localization (0.0.1):
- Flutter
- flutter_secure_storage (6.0.0):
- Flutter
- GoogleUtilities/Environment (7.13.3):
- GoogleUtilities/Privacy
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.13.3):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- "GoogleUtilities/NSData+zlib (7.13.3)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (7.13.3)
- IOSSecuritySuite (2.1.0)
- local_auth_darwin (0.0.1):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- permission_handler_apple (9.3.0):
- Flutter
- PromisesObjC (2.4.0)
- secure_application (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- sms_autofill (0.0.1):
- Flutter
- sqflite (0.0.3):
- Flutter
- FlutterMacOS
- url_launcher_ios (0.0.1):
- Flutter
DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- Flutter (from `Flutter`)
- flutter_jailbreak_detection (from `.symlinks/plugins/flutter_jailbreak_detection/ios`)
- flutter_localization (from `.symlinks/plugins/flutter_localization/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- secure_application (from `.symlinks/plugins/secure_application/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sms_autofill (from `.symlinks/plugins/sms_autofill/ios`)
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
SPEC REPOS:
trunk:
- Firebase
- FirebaseCore
- FirebaseCoreInternal
- GoogleUtilities
- IOSSecuritySuite
- PromisesObjC
EXTERNAL SOURCES:
connectivity_plus:
:path: ".symlinks/plugins/connectivity_plus/darwin"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
Flutter:
:path: Flutter
flutter_jailbreak_detection:
:path: ".symlinks/plugins/flutter_jailbreak_detection/ios"
flutter_localization:
:path: ".symlinks/plugins/flutter_localization/ios"
flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios"
local_auth_darwin:
:path: ".symlinks/plugins/local_auth_darwin/darwin"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
secure_application:
:path: ".symlinks/plugins/secure_application/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sms_autofill:
:path: ".symlinks/plugins/sms_autofill/ios"
sqflite:
:path: ".symlinks/plugins/sqflite/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
SPEC CHECKSUMS:
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
Firebase: 0312a2352584f782ea56f66d91606891d4607f06
firebase_core: a626d00494efa398e7c54f25f1454a64c8abf197
FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483
FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_jailbreak_detection: c5bf66ff6c0c4230769b6ba0bd63eb6ac4148a76
flutter_localization: f43b18844a2b3d2c71fd64f04ffd6b1e64dd54d4
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
IOSSecuritySuite: 45e8531b05ffa72b5661cbdb5b5b5648a8de1a84
local_auth_darwin: 4d56c90c2683319835a61274b57620df9c4520ab
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
secure_application: 27d424e8c2e770f63e38e280b5a51f921aa9b0c8
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sms_autofill: c461043483362c3f1709ee76eaae6eb570b31686
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
PODFILE CHECKSUM: 43a9c63a5ae3ced395468a38a1d1f52a168ba9f5
COCOAPODS: 1.15.2

View File

@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
086333DCEBE30744A8B72799 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EEDFFE82DF84F0A9977AFF8 /* Pods_Runner.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
@@ -40,14 +41,18 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0CE95444FD6E656EA60BAB64 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
182DD8010AE0B1F861314BE9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
4EEDFFE82DF84F0A9977AFF8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
884C9A80C1736AD2EB38D444 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -62,6 +67,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
086333DCEBE30744A8B72799 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -76,6 +82,16 @@
path = RunnerTests;
sourceTree = "<group>";
};
3C47D009CCFEBBCC155D80D9 /* Pods */ = {
isa = PBXGroup;
children = (
884C9A80C1736AD2EB38D444 /* Pods-Runner.debug.xcconfig */,
0CE95444FD6E656EA60BAB64 /* Pods-Runner.release.xcconfig */,
182DD8010AE0B1F861314BE9 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -94,6 +110,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
3C47D009CCFEBBCC155D80D9 /* Pods */,
9CDE7EA15007B060D5AF313C /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -121,6 +139,14 @@
path = Runner;
sourceTree = "<group>";
};
9CDE7EA15007B060D5AF313C /* Frameworks */ = {
isa = PBXGroup;
children = (
4EEDFFE82DF84F0A9977AFF8 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -145,12 +171,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
AFB70CB9889F1047B6B2F5A5 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
51B0BF3A5629B47C8A34FE1F /* [CP] Embed Pods Frameworks */,
A7D67757570BD1DB843A9A8F /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -238,6 +267,23 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
51B0BF3A5629B47C8A34FE1F /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -253,6 +299,45 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
A7D67757570BD1DB843A9A8F /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
AFB70CB9889F1047B6B2F5A5 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -361,17 +446,29 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Tanami;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp;
MARKETING_VERSION = 1;
PRODUCT_BUNDLE_IDENTIFIER = com.wdi.tanami;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
@@ -386,9 +483,14 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
@@ -403,7 +505,12 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
@@ -418,7 +525,12 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
@@ -427,7 +539,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -484,7 +596,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -540,18 +652,30 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Tanami;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp;
MARKETING_VERSION = 1;
PRODUCT_BUNDLE_IDENTIFIER = com.wdi.tanami;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@@ -562,17 +686,29 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Tanami;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.tanamiApp;
MARKETING_VERSION = 1;
PRODUCT_BUNDLE_IDENTIFIER = com.wdi.tanami;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;

View File

@@ -4,4 +4,7 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
@@ -24,6 +26,8 @@
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>NSFaceIDUsageDescription</key>
@@ -43,9 +47,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

View File

@@ -3,5 +3,8 @@ class Globalconst {
static String name = "";
static String phonenumber = "";
static String isdcode = "";
static String createdpin="";
static String createdpin = "";
static String firstName = "";
static String lastName = "";
static String languageSelected = "en";
}

View File

@@ -45,6 +45,7 @@ class RouteName {
static const String depositPreview = 'depositPreview';
static const String selectDepositMethodScreen = 'selectDepositMethodScreen';
static const String depositStepScreen = 'depositStepScreen';
static const String depositCompleteScreen = 'depositCompleteScreen';
//Biometric
static const String biometricScreen = 'biometricScreen';
@@ -77,4 +78,13 @@ class RouteName {
static const String investDetailScreen = "investDetailScreen";
static const String investPaymentScreen = "investPaymentScreen";
static const String confirmInvestScreen = "confirmInvestScreen";
//Bank Details
static const String addBankDetailsScreen = "addBankDetailsScreen";
//Vimeo
static const String vimeoScreen = "vimeoScreen";
//PDF
static const String pdfReaderScreen = "pdfReaderScreen";
}

View File

@@ -1,6 +1,5 @@
// 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';
@@ -31,15 +30,17 @@ import 'package:tanami_app/features/register/presentation/pages/register_step_sc
import 'package:tanami_app/features/securePin/presentation/pages/pin_screen.dart';
import 'package:tanami_app/features/welcome/presentation/pages/weclome_screen.dart';
import 'package:tanami_app/shared/components/no_internet.dart';
import 'package:tanami_app/shared/components/read_pdf.dart';
import '../../features/MainScreens/Wallet/presentation/pages/deposit/deposit_completed_screen.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/bankDetails/presentation/pages/add_bank_details_screen.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';
import '../../features/securePin/presentation/pages/confirm_pin_screen.dart';
import '../../features/splash/presentation/pages/splash_screen.dart';
import '../../shared/components/viemo_screen.dart';
/* CREATED BY - JAYESH JAIN
DATE - 24-05-2024
@@ -54,8 +55,8 @@ final goRouter = GoRouter(
name: "splash",
path: RouteName.splashScreen,
builder: (context, state) {
context.read<GetCountryBlock>().add(GetCountry());
return const SplashScreen();
// context.read<GetCountryBlock>().add(GetCountry());
return const SplashScreen(); //const MainScreen();
},
routes: [
GoRoute(
@@ -141,6 +142,13 @@ final goRouter = GoRouter(
return const AcademyDetailsScreen();
},
),
GoRoute(
name: RouteName.addBankDetailsScreen,
path: RouteName.addBankDetailsScreen,
builder: (context, state) {
return const AddBankDetails();
},
),
GoRoute(
name: RouteName.pinScreen,
path: "${RouteName.pinScreen}/:fromScreen",
@@ -228,6 +236,13 @@ final goRouter = GoRouter(
return const DepositStepScreen();
},
),
GoRoute(
name: RouteName.depositCompleteScreen,
path: RouteName.depositCompleteScreen,
builder: (context, state) {
return const DepositeCompleteScreen();
},
),
GoRoute(
name: RouteName.depositPreview,
path: RouteName.depositPreview,
@@ -265,10 +280,11 @@ final goRouter = GoRouter(
),
GoRoute(
name: RouteName.investDetailScreen,
path: "${RouteName.investDetailScreen}/:type",
path: "${RouteName.investDetailScreen}/:type/:id",
builder: (context, state) {
return InvestDetailsScreen(
type: state.pathParameters["type"]!,
id: state.pathParameters["id"]!,
);
},
),
@@ -300,6 +316,25 @@ final goRouter = GoRouter(
return const FAQScreen();
},
),
GoRoute(
name: RouteName.vimeoScreen,
path: "${RouteName.vimeoScreen}/:videoUrl",
builder: (context, state) {
return VimeoScreen(
videoUrl: state.pathParameters["videoUrl"]!,
);
},
),
GoRoute(
name: RouteName.pdfReaderScreen,
path: "${RouteName.pdfReaderScreen}/:title/:pdfUrl",
builder: (context, state) {
return ReadPDF(
title: state.pathParameters["title"]!,
pdfUrl: state.pathParameters["pdfUrl"]!,
);
},
),
],
),
],

View File

@@ -6,6 +6,8 @@ class AppImages {
"assets/images/welcome_screen/svg/Tanami_Capital_Splash_Logo.svg";
//Welcome
static const String welcomeLogo1 =
"assets/images/welcome_screen/Tanami_Capital_Logo.svg";
static const String welcomeLogo =
"assets/images/welcome_screen/svg/Tanami_Capital_Logo.svg";
static const String firstWelcome =
@@ -116,6 +118,10 @@ class AppImages {
'assets/images/invest_screen/svg/time_square.svg';
static const String applePayIcon =
'assets/images/invest_screen/svg/apple_pay.svg';
static const String googlePayIcon =
'assets/images/invest_screen/svg/google_pay.svg';
static const String walletSettingsIcon =
'assets/images/settings_screen/svg/wallet_settings.svg';
//No Internet
static const String noInternetImage =
@@ -142,4 +148,12 @@ class AppImages {
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';
static const String dStepCount1Icon =
'assets/images/wallet_screen/deposit_step_complete_1.svg';
static const String dStep2CountIcon =
'assets/images/wallet_screen/deposit_step_complete_2.svg';
static const String dStep3CountIcon =
'assets/images/wallet_screen/deposit_step_complete_3.svg';
static const String depositCheckIcon =
'assets/images/wallet_screen/deposit_check.svg';
}

View File

@@ -27,6 +27,19 @@ class AppText {
static const String enterPhoneNo = "enterPhoneNo";
static const String invalidPassword = "invalidPassword";
static const String forgotPassword = "forgotPassword";
static const String passwordLength =
"Password must be between 8 and 20 characters long.";
static const String passwordLowerCase =
"Password must contain at least one lower-case letter.";
static const String passwordUpperCase =
"Password must contain at least one upper-case letter.";
static const String passwordDigit =
"Password must contain at least one digit.";
static const String passwordSpecialCharacter =
"Password must contain at least one special character (!@#\$%&*()-+=^).";
static const String authenticationFailedText = "authenticationFailedText";
static const String pleaseAuthenticateToAccessTheApp =
"pleaseAuthenticateToAccessTheApp";
//Register
static const String getStartedToday = "getStartedToday";
@@ -63,6 +76,7 @@ class AppText {
static const String termsAndCondition = "termsAndCondition";
static const String andThe = "andThe";
static const String privacyPolicy = "privacyPolicy";
static const String successfulText = "successfulText";
//Country Name
static const String bahrainCountryText = "Bahrain";
@@ -81,6 +95,7 @@ class AppText {
static const String totalreturn = "totalreturn";
static const String disttodate = "disttodate";
static const String includeddocs = "includeddocs";
static const String portfolioBottomText = "portfolioBottomText";
//Academy
static const String videosTitle = "videosTitle";
@@ -94,6 +109,58 @@ class AppText {
//FAQ
static const String faqTitle = "faqTitle";
static const String gettingStarted = "gettingStarted";
static const String knowledgeAndEducation = "knowledgeAndEducation";
static const String complianceSecurityAndSupport =
"complianceSecurityAndSupport";
static const String getStartedTitle1 = "getStartedTitle1";
static const String geStartedDesc1 = "geStartedDesc1";
static const String getStartedTitle2 = "getStartedTitle2";
static const String geStartedDesc2 = "geStartedDesc2";
static const String getStartedTitle3 = "getStartedTitle3";
static const String geStartedDesc3 = "geStartedDesc3";
static const String investmentTitle1 = "investmentTitle1";
static const String investmentDesc1 = "investmentDesc1";
static const String investmentTitle2 = "investmentTitle2";
static const String investmentDesc2 = "investmentDesc2";
static const String investmentTitle3 = "investmentTitle3";
static const String investmentDesc3 = "investmentDesc3";
static const String investmentTitle4 = "investmentTitle4";
static const String investmentDesc4 = "investmentDesc4";
static const String investmentTitle5 = "investmentTitle5";
static const String investmentDesc5 = "investmentDesc5";
static const String investmentTitle6 = "investmentTitle6";
static const String investmentDesc6 = "investmentDesc6";
static const String investmentTitle7 = "investmentTitle7";
static const String investmentDesc7 = "investmentDesc7";
static const String investmentTitle8 = "investmentTitle8";
static const String investmentDesc8 = "investmentDesc8";
static const String investmentTitle9 = "investmentTitle9";
static const String investmentDesc9 = "investmentDesc9";
static const String investmentTitle10 = "investmentTitle10";
static const String investmentDesc10 = "investmentDesc10";
static const String investmentTitle11 = "investmentTitle11";
static const String investmentDesc11 = "investmentDesc11";
static const String investmentTitle12 = "investmentTitle12";
static const String investmentDesc12 = "investmentDesc12";
static const String investmentTitle13 = "investmentTitle13";
static const String investmentDesc13 = "investmentDesc13";
static const String knowledgeTitle1 = "knowledgeTitle1";
static const String knowledgeDesc1 = "knowledgeDesc1";
static const String knowledgeTitle2 = "knowledgeTitle2";
static const String knowledgeDesc2 = "knowledgeDesc2";
static const String knowledgeTitle3 = "knowledgeTitle3";
static const String knowledgeDesc3 = "knowledgeDesc3";
static const String securityTitle1 = "securityTitle1";
static const String securityDesc1 = "securityDesc1";
static const String securityTitle2 = "securityTitle2";
static const String securityDesc2 = "securityDesc2";
static const String securityTitle3 = "securityTitle3";
static const String securityDesc3 = "securityDesc3";
static const String securityTitle4 = "securityTitle4";
static const String securityDesc4 = "securityDesc4";
static const String securityTitle5 = "securityTitle5";
static const String securityDesc5 = "securityDesc5";
//Security
static const String unlockText = "unlockText";
@@ -108,6 +175,7 @@ class AppText {
static const String resendSms = "resendSms";
static const String otpVerifiedSucessfully = "otpVerifiedSucessfully";
static const String otpVerifiedFailed = "otpVerifiedFailed";
static const String otpSendSuccessfulText = "otpSendSuccessfulText";
//Pin Code
static const String pinCode = "pinCode";
@@ -125,17 +193,22 @@ class AppText {
"toRestorePinYouWillBeLoggedOut";
static const String allowText = "allowText";
static const String declineText = "declineText";
static const String masterPinAddedSucessfullyText =
"masterPinAddedSucessfullyText";
static const String toRestorePasswordYouWillBeLoggedOut =
"toRestorePasswordYouWillBeLoggedOut";
//Forgot Password
static const String almostHere = "almostHere";
static const String completeAcc = "completeAcc";
//Forgot Password
static const String restorePasswordText = "restorePasswordText";
static const String toRestorePasswordPleaseEnterPhoneNumber =
"toRestorePasswordPleaseEnterPhoneNumber";
static const String createNewPasswordText = "createNewPasswordText";
static const String submitText = "submitText";
static const String passwordChangedSucessfully = "passwordChangedSucessfully";
static const String passwordResetSucessful = "passwordResetSucessful";
//Wallet
static const String walletTitle = "walletTitle";
@@ -179,6 +252,7 @@ class AppText {
static const String next = "next";
static const String depositNoti = "depositNoti";
static const String payWithAppleText = "payWithAppleText";
static const String payWithGpayText = "payWithGpayText";
static const String submit = "submit";
static const String Submit = "Submit";
static const String submitDeposit = "submitDeposit";
@@ -194,6 +268,32 @@ class AppText {
static const String byDate = "byDate";
static const String byAction = "byAction";
static const String byStatus = "byStatus";
static const String inOrderForYouToCompleteBankTransfers =
"inOrderForYouToCompleteBankTransfers";
static const String tanamiWillNotifyUponReceiptFunds =
"tanamiWillNotifyUponReceiptFunds";
static const String pleaseCompleteTheBelowSteps =
"pleaseCompleteTheBelowSteps";
static const String insertTheAmountYouWouldLikeToTransfer =
"insertTheAmountYouWouldLikeToTransfer";
static const String copyTheBankDetailsYourTanamiAccountShownNextPage =
"copyTheBankDetailsYourTanamiAccountShownNextPage";
static const String transferTheFundsDirectlyFromYourBankAccount =
"transferTheFundsDirectlyFromYourBankAccount";
static const String copyTheBankDetailsOfYourTanamiAccount =
"copyTheBankDetailsOfYourTanamiAccount";
static const String youAreAllSet = "youAreAllSet";
static const String depositNotificationCreated = "depositNotificationCreated";
static const String amountDeposited = "amountDeposited";
static const String pleaseEnsureTheFundsAreTransferredFromBank =
"pleaseEnsureTheFundsAreTransferredFromBank";
static const String manageDepositNotifications = "manageDepositNotifications";
static const String accountNo = "accountNo";
static const String swiftCode = "swiftCode";
static const String bankAddress = "bankAddress";
static const String clientId = "clientId";
static const String updateBankDetails = "updateBankDetails";
static const String yourAccountDetails = "yourAccountDetails";
//Settings
static const String settingsText = "settingsText";
@@ -224,6 +324,9 @@ class AppText {
static const String changePasswordText = "changePasswordText";
static const String newPasswordText = "newPasswordText";
static const String currentPsswordText = "currentPsswordText";
static const String bankDetails = "bankDetails";
static const String addBankDetails = "addBankDetails";
static const String websiteText = "websiteText";
//Contact Admin
static const String byPhoneText = "byPhoneText";
@@ -309,4 +412,5 @@ class AppText {
static const String investmentConfirmationText = "investmentConfirmationText";
static const String enterAmountText = "enterAmountText";
static const String pleaseEnterAmountText = "pleaseEnterAmountText";
static const String noDataAvailable = "noDataAvailable";
}

View File

@@ -1,17 +1,4 @@
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
List<String> title = [
AppText.step1,
AppText.step2,
AppText.step3,
];
List<String> description = [
AppText.enterYourCountryOfResidence,
AppText.enterNameEmailPassword,
AppText.enableBiometricAuthentication,
];
List<String> stepImage = [
AppImages.step1Image,

View File

@@ -0,0 +1,16 @@
import 'package:intl/intl.dart';
class DateTimeFormatter {
String formatDate(String dateString) {
// Parse the input date string
DateTime dateTime = DateTime.parse(dateString);
// Define the output format
DateFormat formatter = DateFormat('MMM dd yyyy');
// Format the date
String formattedDate = formatter.format(dateTime);
return formattedDate;
}
}

View File

@@ -0,0 +1,15 @@
import 'package:device_info_plus/device_info_plus.dart';
class DeviceInfoData {
final deviceInfoPlugin = DeviceInfoPlugin();
Future<String> getDeviceId() async {
var dataV = await deviceInfoPlugin.androidInfo;
return dataV.id.toString();
}
// Future<String> getIOSDeviceId() async {
// var dataV = await deviceInfoPlugin.iosInfo;
// return dataV..toString();
// }
}

View File

@@ -0,0 +1,31 @@
class PhoneNumberHintGenerator {
String formatPhoneNumber(String code, int length) {
switch (code) {
case "+973":
return "000 000 00";
case "+965":
return "0000 0000";
case "+968":
return "000 00 000";
case "+974":
return "000 000 00";
case "+966":
return "000 000 000";
case "+971":
return "00 000 0000";
default:
return List.generate(length, (index) => '0').join('');
}
}
// Map of country codes to phone number lengths
final Map<String, int> countryPhoneLengths = {
"+973": 8, // Bahrain
"+965": 8, // Kuwait
"+968": 8, // Oman
"+974": 8, // Qatar
"+966": 9, // Saudi Arabia
"+971": 9, // United Arab Emirates
"+91": 10,
};
}

View File

@@ -1,21 +1,19 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class SecureStorageService {
final FlutterSecureStorage _storage = const FlutterSecureStorage(
aOptions: AndroidOptions(
encryptedSharedPreferences: true,
),
);
import 'package:shared_preferences/shared_preferences.dart';
class SharedPreferenceLocalData {
Future<void> write(String key, String value) async {
await _storage.write(key: key, value: value);
final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString(key, value);
}
Future<String?> read(String key) async {
return await _storage.read(key: key);
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(key);
}
Future<void> delete(String key) async {
await _storage.delete(key: key);
}
// Future<void> delete(String key) async {
// await _storage.delete(key: key);
// }
}

View File

@@ -0,0 +1,12 @@
import 'package:intl/intl.dart';
class TextConverter {
String formattedTextToNumber(String numberString) {
// Convert the string to a double
double number = double.parse(numberString);
// Format the number with commas
final formatter = NumberFormat("#,###", "en_US");
return formatter.format(number);
}
}

View File

@@ -16,4 +16,15 @@ class CommaTextInputFormatter extends TextInputFormatter {
selection: TextSelection.collapsed(offset: newText.length),
);
}
String getInitials(String name) {
List<String> words = name.split(' ');
String initials = '';
for (var word in words) {
if (word.isNotEmpty) {
initials += word[0].toUpperCase();
}
}
return initials;
}
}

View File

@@ -17,3 +17,12 @@ void launchEmail(String email) async {
throw 'Could not launch $url';
}
}
void launchWebsiteUrl(String websiteUrl) async {
final url = websiteUrl;
if (await canLaunchUrl(Uri.parse(url))) {
await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication);
} else {
throw 'Could not launch $url';
}
}

View File

@@ -13,7 +13,7 @@ class AcademyLayout extends StatelessWidget {
body: ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) {
return academyCard(data[index]);
return academyCard(data[index], context);
},
),
);

View File

@@ -3,12 +3,16 @@ 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/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/routes/route_name.dart';
import '../../../../../core/routes/routes.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
Widget academyCard(dynamic data, BuildContext context) {
var localizations = AppLocalizations.of(context);
Widget academyCard(dynamic data) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
child: GestureDetector(
@@ -79,7 +83,7 @@ Widget academyCard(dynamic data) {
5.w,
),
TextWidget().text12W700(
'${data['videos']} videos',
'${data['videos']} ${localizations.translate(AppText.videosTitle)}',
clr: AppColor.academyCardTextColor,
),
],

View File

@@ -0,0 +1,517 @@
class AvailableIOModel {
int? statusCode;
Data? data;
String? message;
bool? success;
AvailableIOModel({this.statusCode, this.data, this.message, this.success});
AvailableIOModel.fromJson(Map<String, dynamic> json) {
statusCode = json['statusCode'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
message = json['message'];
success = json['success'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['statusCode'] = statusCode;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = message;
data['success'] = success;
return data;
}
}
class Data {
int? totalItems;
List<Rows>? rows;
int? totalPages;
int? currentPage;
Data({this.totalItems, this.rows, this.totalPages, this.currentPage});
Data.fromJson(Map<String, dynamic> json) {
totalItems = json['totalItems'];
if (json['rows'] != null) {
rows = <Rows>[];
json['rows'].forEach((v) {
rows!.add(Rows.fromJson(v));
});
}
totalPages = json['totalPages'];
currentPage = json['currentPage'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['totalItems'] = totalItems;
if (rows != null) {
data['rows'] = rows!.map((v) => v.toJson()).toList();
}
data['totalPages'] = totalPages;
data['currentPage'] = currentPage;
return data;
}
}
class Rows {
int? id;
String? ioId;
int? investmentTypeXid;
int? sponsorXid;
int? ioStatusXid;
String? investmentNameEnglish;
String? investmentNameArabic;
String? descriptionEnglish;
String? descriptionArabic;
String? goalAmount;
String? closingDate;
String? holdingPeriod;
String? expectedReturn;
String? originalValuation;
String? currentValuation;
String? iSIN;
String? investmentDetails;
String? comment;
bool? isInvestedAmount;
String? amountInvested;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Sponsor? sponsor;
IoStatus? ioStatus;
InvestmentType? investmentType;
List<ArtifactsImage>? artifactsImage;
List<MinInvestmentAmt>? minInvestmentAmt;
Rows(
{this.id,
this.ioId,
this.investmentTypeXid,
this.sponsorXid,
this.ioStatusXid,
this.investmentNameEnglish,
this.investmentNameArabic,
this.descriptionEnglish,
this.descriptionArabic,
this.goalAmount,
this.closingDate,
this.holdingPeriod,
this.expectedReturn,
this.originalValuation,
this.currentValuation,
this.iSIN,
this.investmentDetails,
this.comment,
this.isInvestedAmount,
this.amountInvested,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt,
this.sponsor,
this.ioStatus,
this.investmentType,
this.artifactsImage,
this.minInvestmentAmt});
Rows.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioId = json['io_id'];
investmentTypeXid = json['investmentType_xid'];
sponsorXid = json['sponsor_xid'];
ioStatusXid = json['ioStatus_xid'];
investmentNameEnglish = json['investmentNameEnglish'];
investmentNameArabic = json['investmentNameArabic'];
descriptionEnglish = json['descriptionEnglish'];
descriptionArabic = json['descriptionArabic'];
goalAmount = json['goalAmount'];
closingDate = json['closingDate'];
holdingPeriod = json['holdingPeriod'];
expectedReturn = json['expectedReturn'];
originalValuation = json['originalValuation'];
currentValuation = json['currentValuation'];
iSIN = json['ISIN'];
investmentDetails = json['InvestmentDetails'];
comment = json['comment'];
isInvestedAmount = json['isInvestedAmount'];
amountInvested = json['amountInvested'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
sponsor =
json['sponsor'] != null ? Sponsor.fromJson(json['sponsor']) : null;
ioStatus =
json['ioStatus'] != null ? IoStatus.fromJson(json['ioStatus']) : null;
investmentType = json['investmentType'] != null
? InvestmentType.fromJson(json['investmentType'])
: null;
if (json['artifactsImage'] != null) {
artifactsImage = <ArtifactsImage>[];
json['artifactsImage'].forEach((v) {
artifactsImage!.add(ArtifactsImage.fromJson(v));
});
}
if (json['minInvestmentAmt'] != null) {
minInvestmentAmt = <MinInvestmentAmt>[];
json['minInvestmentAmt'].forEach((v) {
minInvestmentAmt!.add(MinInvestmentAmt.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_id'] = ioId;
data['investmentType_xid'] = investmentTypeXid;
data['sponsor_xid'] = sponsorXid;
data['ioStatus_xid'] = ioStatusXid;
data['investmentNameEnglish'] = investmentNameEnglish;
data['investmentNameArabic'] = investmentNameArabic;
data['descriptionEnglish'] = descriptionEnglish;
data['descriptionArabic'] = descriptionArabic;
data['goalAmount'] = goalAmount;
data['closingDate'] = closingDate;
data['holdingPeriod'] = holdingPeriod;
data['expectedReturn'] = expectedReturn;
data['originalValuation'] = originalValuation;
data['currentValuation'] = currentValuation;
data['ISIN'] = iSIN;
data['InvestmentDetails'] = investmentDetails;
data['comment'] = comment;
data['isInvestedAmount'] = isInvestedAmount;
data['amountInvested'] = amountInvested;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
if (sponsor != null) {
data['sponsor'] = sponsor!.toJson();
}
if (ioStatus != null) {
data['ioStatus'] = ioStatus!.toJson();
}
if (investmentType != null) {
data['investmentType'] = investmentType!.toJson();
}
if (artifactsImage != null) {
data['artifactsImage'] = artifactsImage!.map((v) => v.toJson()).toList();
}
if (minInvestmentAmt != null) {
data['minInvestmentAmt'] =
minInvestmentAmt!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Sponsor {
int? id;
String? sponsorName;
String? sponsorNameArabic;
String? email;
Null profile;
Null address;
Null mobileNo;
Null bankName;
Null accountNumber;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Sponsor(
{this.id,
this.sponsorName,
this.sponsorNameArabic,
this.email,
this.profile,
this.address,
this.mobileNo,
this.bankName,
this.accountNumber,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
Sponsor.fromJson(Map<String, dynamic> json) {
id = json['id'];
sponsorName = json['sponsorName'];
sponsorNameArabic = json['sponsorNameArabic'];
email = json['email'];
profile = json['profile'];
address = json['address'];
mobileNo = json['mobileNo'];
bankName = json['bankName'];
accountNumber = json['accountNumber'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['sponsorName'] = sponsorName;
data['sponsorNameArabic'] = sponsorNameArabic;
data['email'] = email;
data['profile'] = profile;
data['address'] = address;
data['mobileNo'] = mobileNo;
data['bankName'] = bankName;
data['accountNumber'] = accountNumber;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class IoStatus {
int? id;
String? statusAdmin;
String? statusInvest;
String? statusPortfolio;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
IoStatus(
{this.id,
this.statusAdmin,
this.statusInvest,
this.statusPortfolio,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
IoStatus.fromJson(Map<String, dynamic> json) {
id = json['id'];
statusAdmin = json['statusAdmin'];
statusInvest = json['statusInvest'];
statusPortfolio = json['statusPortfolio'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['statusAdmin'] = statusAdmin;
data['statusInvest'] = statusInvest;
data['statusPortfolio'] = statusPortfolio;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class InvestmentType {
int? id;
String? investmentTypeName;
String? investmentTypeNameArabic;
String? note;
String? noteArabic;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
InvestmentType(
{this.id,
this.investmentTypeName,
this.investmentTypeNameArabic,
this.note,
this.noteArabic,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
InvestmentType.fromJson(Map<String, dynamic> json) {
id = json['id'];
investmentTypeName = json['investmentTypeName'];
investmentTypeNameArabic = json['investmentTypeNameArabic'];
note = json['note'];
noteArabic = json['noteArabic'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['investmentTypeName'] = investmentTypeName;
data['investmentTypeNameArabic'] = investmentTypeNameArabic;
data['note'] = note;
data['noteArabic'] = noteArabic;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class ArtifactsImage {
int? id;
int? ioXid;
String? artifactName;
String? artifactPathName;
int? displayOrder;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
ArtifactsImage(
{this.id,
this.ioXid,
this.artifactName,
this.artifactPathName,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
ArtifactsImage.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
artifactName = json['artifactName'];
artifactPathName = json['artifactPathName'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['artifactName'] = artifactName;
data['artifactPathName'] = artifactPathName;
data['displayOrder'] = displayOrder;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class MinInvestmentAmt {
int? id;
int? ioXid;
int? countryXid;
String? minInvestmentAmt;
String? maxInvestmentAmt;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
MinInvestmentAmt(
{this.id,
this.ioXid,
this.countryXid,
this.minInvestmentAmt,
this.maxInvestmentAmt,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
MinInvestmentAmt.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
countryXid = json['country_xid'];
minInvestmentAmt = json['minInvestmentAmt'];
maxInvestmentAmt = json['maxInvestmentAmt'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['country_xid'] = countryXid;
data['minInvestmentAmt'] = minInvestmentAmt;
data['maxInvestmentAmt'] = maxInvestmentAmt;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}

View File

@@ -0,0 +1,519 @@
class ClosedIOModel {
int? statusCode;
Data? data;
String? message;
bool? success;
ClosedIOModel({this.statusCode, this.data, this.message, this.success});
ClosedIOModel.fromJson(Map<String, dynamic> json) {
statusCode = json['statusCode'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
success = json['success'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['statusCode'] = this.statusCode;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = this.message;
data['success'] = this.success;
return data;
}
}
class Data {
int? totalItems;
List<Rows>? rows;
int? totalPages;
int? currentPage;
Data({this.totalItems, this.rows, this.totalPages, this.currentPage});
Data.fromJson(Map<String, dynamic> json) {
totalItems = json['totalItems'];
if (json['rows'] != null) {
rows = <Rows>[];
json['rows'].forEach((v) {
rows!.add(new Rows.fromJson(v));
});
}
totalPages = json['totalPages'];
currentPage = json['currentPage'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItems'] = this.totalItems;
if (this.rows != null) {
data['rows'] = this.rows!.map((v) => v.toJson()).toList();
}
data['totalPages'] = this.totalPages;
data['currentPage'] = this.currentPage;
return data;
}
}
class Rows {
int? id;
String? ioId;
int? investmentTypeXid;
int? sponsorXid;
int? ioStatusXid;
String? investmentNameEnglish;
String? investmentNameArabic;
String? descriptionEnglish;
String? descriptionArabic;
String? goalAmount;
String? closingDate;
String? holdingPeriod;
String? expectedReturn;
String? originalValuation;
String? currentValuation;
String? iSIN;
String? investmentDetails;
String? comment;
bool? isInvestedAmount;
String? amountInvested;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
Sponsor? sponsor;
IoStatus? ioStatus;
InvestmentType? investmentType;
List<ArtifactsImage>? artifactsImage;
List<MinInvestmentAmt>? minInvestmentAmt;
Rows(
{this.id,
this.ioId,
this.investmentTypeXid,
this.sponsorXid,
this.ioStatusXid,
this.investmentNameEnglish,
this.investmentNameArabic,
this.descriptionEnglish,
this.descriptionArabic,
this.goalAmount,
this.closingDate,
this.holdingPeriod,
this.expectedReturn,
this.originalValuation,
this.currentValuation,
this.iSIN,
this.investmentDetails,
this.comment,
this.isInvestedAmount,
this.amountInvested,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt,
this.sponsor,
this.ioStatus,
this.investmentType,
this.artifactsImage,
this.minInvestmentAmt});
Rows.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioId = json['io_id'];
investmentTypeXid = json['investmentType_xid'];
sponsorXid = json['sponsor_xid'];
ioStatusXid = json['ioStatus_xid'];
investmentNameEnglish = json['investmentNameEnglish'];
investmentNameArabic = json['investmentNameArabic'];
descriptionEnglish = json['descriptionEnglish'];
descriptionArabic = json['descriptionArabic'];
goalAmount = json['goalAmount'];
closingDate = json['closingDate'];
holdingPeriod = json['holdingPeriod'];
expectedReturn = json['expectedReturn'];
originalValuation = json['originalValuation'];
currentValuation = json['currentValuation'];
iSIN = json['ISIN'];
investmentDetails = json['InvestmentDetails'];
comment = json['comment'];
isInvestedAmount = json['isInvestedAmount'];
amountInvested = json['amountInvested'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
sponsor =
json['sponsor'] != null ? new Sponsor.fromJson(json['sponsor']) : null;
ioStatus = json['ioStatus'] != null
? new IoStatus.fromJson(json['ioStatus'])
: null;
investmentType = json['investmentType'] != null
? new InvestmentType.fromJson(json['investmentType'])
: null;
if (json['artifactsImage'] != null) {
artifactsImage = <ArtifactsImage>[];
json['artifactsImage'].forEach((v) {
artifactsImage!.add(new ArtifactsImage.fromJson(v));
});
}
if (json['minInvestmentAmt'] != null) {
minInvestmentAmt = <MinInvestmentAmt>[];
json['minInvestmentAmt'].forEach((v) {
minInvestmentAmt!.add(new MinInvestmentAmt.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['io_id'] = this.ioId;
data['investmentType_xid'] = this.investmentTypeXid;
data['sponsor_xid'] = this.sponsorXid;
data['ioStatus_xid'] = this.ioStatusXid;
data['investmentNameEnglish'] = this.investmentNameEnglish;
data['investmentNameArabic'] = this.investmentNameArabic;
data['descriptionEnglish'] = this.descriptionEnglish;
data['descriptionArabic'] = this.descriptionArabic;
data['goalAmount'] = this.goalAmount;
data['closingDate'] = this.closingDate;
data['holdingPeriod'] = this.holdingPeriod;
data['expectedReturn'] = this.expectedReturn;
data['originalValuation'] = this.originalValuation;
data['currentValuation'] = this.currentValuation;
data['ISIN'] = this.iSIN;
data['InvestmentDetails'] = this.investmentDetails;
data['comment'] = this.comment;
data['isInvestedAmount'] = this.isInvestedAmount;
data['amountInvested'] = this.amountInvested;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
if (this.sponsor != null) {
data['sponsor'] = this.sponsor!.toJson();
}
if (this.ioStatus != null) {
data['ioStatus'] = this.ioStatus!.toJson();
}
if (this.investmentType != null) {
data['investmentType'] = this.investmentType!.toJson();
}
if (this.artifactsImage != null) {
data['artifactsImage'] =
this.artifactsImage!.map((v) => v.toJson()).toList();
}
if (this.minInvestmentAmt != null) {
data['minInvestmentAmt'] =
this.minInvestmentAmt!.map((v) => v.toJson()).toList();
}
return data;
}
}
class ArtifactsImage {
int? id;
int? ioXid;
String? artifactName;
String? artifactPathName;
int? displayOrder;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
ArtifactsImage(
{this.id,
this.ioXid,
this.artifactName,
this.artifactPathName,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
ArtifactsImage.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
artifactName = json['artifactName'];
artifactPathName = json['artifactPathName'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['io_xid'] = this.ioXid;
data['artifactName'] = this.artifactName;
data['artifactPathName'] = this.artifactPathName;
data['displayOrder'] = this.displayOrder;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
return data;
}
}
class Sponsor {
int? id;
String? sponsorName;
String? sponsorNameArabic;
String? email;
Null? profile;
Null? address;
Null? mobileNo;
Null? bankName;
Null? accountNumber;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
Sponsor(
{this.id,
this.sponsorName,
this.sponsorNameArabic,
this.email,
this.profile,
this.address,
this.mobileNo,
this.bankName,
this.accountNumber,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
Sponsor.fromJson(Map<String, dynamic> json) {
id = json['id'];
sponsorName = json['sponsorName'];
sponsorNameArabic = json['sponsorNameArabic'];
email = json['email'];
profile = json['profile'];
address = json['address'];
mobileNo = json['mobileNo'];
bankName = json['bankName'];
accountNumber = json['accountNumber'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['sponsorName'] = this.sponsorName;
data['sponsorNameArabic'] = this.sponsorNameArabic;
data['email'] = this.email;
data['profile'] = this.profile;
data['address'] = this.address;
data['mobileNo'] = this.mobileNo;
data['bankName'] = this.bankName;
data['accountNumber'] = this.accountNumber;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
return data;
}
}
class IoStatus {
int? id;
String? statusAdmin;
String? statusInvest;
String? statusPortfolio;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
IoStatus(
{this.id,
this.statusAdmin,
this.statusInvest,
this.statusPortfolio,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
IoStatus.fromJson(Map<String, dynamic> json) {
id = json['id'];
statusAdmin = json['statusAdmin'];
statusInvest = json['statusInvest'];
statusPortfolio = json['statusPortfolio'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['statusAdmin'] = this.statusAdmin;
data['statusInvest'] = this.statusInvest;
data['statusPortfolio'] = this.statusPortfolio;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
return data;
}
}
class InvestmentType {
int? id;
String? investmentTypeName;
String? investmentTypeNameArabic;
String? note;
String? noteArabic;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
InvestmentType(
{this.id,
this.investmentTypeName,
this.investmentTypeNameArabic,
this.note,
this.noteArabic,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
InvestmentType.fromJson(Map<String, dynamic> json) {
id = json['id'];
investmentTypeName = json['investmentTypeName'];
investmentTypeNameArabic = json['investmentTypeNameArabic'];
note = json['note'];
noteArabic = json['noteArabic'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['investmentTypeName'] = this.investmentTypeName;
data['investmentTypeNameArabic'] = this.investmentTypeNameArabic;
data['note'] = this.note;
data['noteArabic'] = this.noteArabic;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
return data;
}
}
class MinInvestmentAmt {
int? id;
int? ioXid;
int? countryXid;
String? minInvestmentAmt;
String? maxInvestmentAmt;
bool? isActive;
Null? createdBy;
Null? modifiedBy;
String? createdAt;
String? updatedAt;
Null? deletedAt;
MinInvestmentAmt(
{this.id,
this.ioXid,
this.countryXid,
this.minInvestmentAmt,
this.maxInvestmentAmt,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
MinInvestmentAmt.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
countryXid = json['country_xid'];
minInvestmentAmt = json['minInvestmentAmt'];
maxInvestmentAmt = json['maxInvestmentAmt'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['io_xid'] = this.ioXid;
data['country_xid'] = this.countryXid;
data['minInvestmentAmt'] = this.minInvestmentAmt;
data['maxInvestmentAmt'] = this.maxInvestmentAmt;
data['isActive'] = this.isActive;
data['createdBy'] = this.createdBy;
data['modifiedBy'] = this.modifiedBy;
data['createdAt'] = this.createdAt;
data['updatedAt'] = this.updatedAt;
data['deletedAt'] = this.deletedAt;
return data;
}
}

View File

@@ -0,0 +1,760 @@
class DetailIOModel {
int? statusCode;
Data? data;
String? message;
bool? success;
DetailIOModel({this.statusCode, this.data, this.message, this.success});
DetailIOModel.fromJson(Map<String, dynamic> json) {
statusCode = json['statusCode'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
message = json['message'];
success = json['success'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['statusCode'] = statusCode;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = message;
data['success'] = success;
return data;
}
}
class Data {
int? id;
String? ioId;
int? investmentTypeXid;
int? sponsorXid;
int? ioStatusXid;
String? investmentNameEnglish;
String? investmentNameArabic;
String? descriptionEnglish;
String? descriptionArabic;
String? goalAmount;
String? closingDate;
String? holdingPeriod;
String? expectedReturn;
String? originalValuation;
String? currentValuation;
String? iSIN;
String? investmentDetails;
String? comment;
bool? isInvestedAmount;
String? amountInvested;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Sponsor? sponsor;
IoStatus? ioStatus;
InvestmentType? investmentType;
List<Documents>? documents;
List<ArtifactsVideo>? artifactsVideo;
List<ArtifactsImage>? artifactsImage;
List<MinInvestmentAmt>? minInvestmentAmt;
List<KeyMerits>? keyMerits;
Data(
{this.id,
this.ioId,
this.investmentTypeXid,
this.sponsorXid,
this.ioStatusXid,
this.investmentNameEnglish,
this.investmentNameArabic,
this.descriptionEnglish,
this.descriptionArabic,
this.goalAmount,
this.closingDate,
this.holdingPeriod,
this.expectedReturn,
this.originalValuation,
this.currentValuation,
this.iSIN,
this.investmentDetails,
this.comment,
this.isInvestedAmount,
this.amountInvested,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt,
this.sponsor,
this.ioStatus,
this.investmentType,
this.documents,
this.artifactsVideo,
this.artifactsImage,
this.minInvestmentAmt,
this.keyMerits});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioId = json['io_id'];
investmentTypeXid = json['investmentType_xid'];
sponsorXid = json['sponsor_xid'];
ioStatusXid = json['ioStatus_xid'];
investmentNameEnglish = json['investmentNameEnglish'];
investmentNameArabic = json['investmentNameArabic'];
descriptionEnglish = json['descriptionEnglish'];
descriptionArabic = json['descriptionArabic'];
goalAmount = json['goalAmount'];
closingDate = json['closingDate'];
holdingPeriod = json['holdingPeriod'];
expectedReturn = json['expectedReturn'];
originalValuation = json['originalValuation'];
currentValuation = json['currentValuation'];
iSIN = json['ISIN'];
investmentDetails = json['InvestmentDetails'];
comment = json['comment'];
isInvestedAmount = json['isInvestedAmount'];
amountInvested = json['amountInvested'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
sponsor =
json['sponsor'] != null ? Sponsor.fromJson(json['sponsor']) : null;
ioStatus =
json['ioStatus'] != null ? IoStatus.fromJson(json['ioStatus']) : null;
investmentType = json['investmentType'] != null
? InvestmentType.fromJson(json['investmentType'])
: null;
if (json['documents'] != null) {
documents = <Documents>[];
json['documents'].forEach((v) {
documents!.add(Documents.fromJson(v));
});
}
if (json['artifactsVideo'] != null) {
artifactsVideo = <ArtifactsVideo>[];
json['artifactsVideo'].forEach((v) {
artifactsVideo!.add(ArtifactsVideo.fromJson(v));
});
}
if (json['artifactsImage'] != null) {
artifactsImage = <ArtifactsImage>[];
json['artifactsImage'].forEach((v) {
artifactsImage!.add(ArtifactsImage.fromJson(v));
});
}
if (json['minInvestmentAmt'] != null) {
minInvestmentAmt = <MinInvestmentAmt>[];
json['minInvestmentAmt'].forEach((v) {
minInvestmentAmt!.add(MinInvestmentAmt.fromJson(v));
});
}
if (json['keyMerits'] != null) {
keyMerits = <KeyMerits>[];
json['keyMerits'].forEach((v) {
keyMerits!.add(KeyMerits.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_id'] = ioId;
data['investmentType_xid'] = investmentTypeXid;
data['sponsor_xid'] = sponsorXid;
data['ioStatus_xid'] = ioStatusXid;
data['investmentNameEnglish'] = investmentNameEnglish;
data['investmentNameArabic'] = investmentNameArabic;
data['descriptionEnglish'] = descriptionEnglish;
data['descriptionArabic'] = descriptionArabic;
data['goalAmount'] = goalAmount;
data['closingDate'] = closingDate;
data['holdingPeriod'] = holdingPeriod;
data['expectedReturn'] = expectedReturn;
data['originalValuation'] = originalValuation;
data['currentValuation'] = currentValuation;
data['ISIN'] = iSIN;
data['InvestmentDetails'] = investmentDetails;
data['comment'] = comment;
data['isInvestedAmount'] = isInvestedAmount;
data['amountInvested'] = amountInvested;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
if (sponsor != null) {
data['sponsor'] = sponsor!.toJson();
}
if (ioStatus != null) {
data['ioStatus'] = ioStatus!.toJson();
}
if (investmentType != null) {
data['investmentType'] = investmentType!.toJson();
}
if (documents != null) {
data['documents'] = documents!.map((v) => v.toJson()).toList();
}
if (artifactsVideo != null) {
data['artifactsVideo'] = artifactsVideo!.map((v) => v.toJson()).toList();
}
if (artifactsImage != null) {
data['artifactsImage'] = artifactsImage!.map((v) => v.toJson()).toList();
}
if (minInvestmentAmt != null) {
data['minInvestmentAmt'] =
minInvestmentAmt!.map((v) => v.toJson()).toList();
}
if (keyMerits != null) {
data['keyMerits'] = keyMerits!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Sponsor {
int? id;
String? sponsorName;
String? sponsorNameArabic;
String? email;
Null profile;
Null address;
Null mobileNo;
Null bankName;
Null accountNumber;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Sponsor(
{this.id,
this.sponsorName,
this.sponsorNameArabic,
this.email,
this.profile,
this.address,
this.mobileNo,
this.bankName,
this.accountNumber,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
Sponsor.fromJson(Map<String, dynamic> json) {
id = json['id'];
sponsorName = json['sponsorName'];
sponsorNameArabic = json['sponsorNameArabic'];
email = json['email'];
profile = json['profile'];
address = json['address'];
mobileNo = json['mobileNo'];
bankName = json['bankName'];
accountNumber = json['accountNumber'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['sponsorName'] = sponsorName;
data['sponsorNameArabic'] = sponsorNameArabic;
data['email'] = email;
data['profile'] = profile;
data['address'] = address;
data['mobileNo'] = mobileNo;
data['bankName'] = bankName;
data['accountNumber'] = accountNumber;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class IoStatus {
int? id;
String? statusAdmin;
String? statusInvest;
String? statusPortfolio;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
IoStatus(
{this.id,
this.statusAdmin,
this.statusInvest,
this.statusPortfolio,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
IoStatus.fromJson(Map<String, dynamic> json) {
id = json['id'];
statusAdmin = json['statusAdmin'];
statusInvest = json['statusInvest'];
statusPortfolio = json['statusPortfolio'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['statusAdmin'] = statusAdmin;
data['statusInvest'] = statusInvest;
data['statusPortfolio'] = statusPortfolio;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class InvestmentType {
int? id;
String? investmentTypeName;
String? investmentTypeNameArabic;
String? note;
String? noteArabic;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
InvestmentType(
{this.id,
this.investmentTypeName,
this.investmentTypeNameArabic,
this.note,
this.noteArabic,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
InvestmentType.fromJson(Map<String, dynamic> json) {
id = json['id'];
investmentTypeName = json['investmentTypeName'];
investmentTypeNameArabic = json['investmentTypeNameArabic'];
note = json['note'];
noteArabic = json['noteArabic'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['investmentTypeName'] = investmentTypeName;
data['investmentTypeNameArabic'] = investmentTypeNameArabic;
data['note'] = note;
data['noteArabic'] = noteArabic;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class Documents {
int? id;
int? ioXid;
String? documentType;
String? documentName;
String? documentPath;
int? displayOrder;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Documents(
{this.id,
this.ioXid,
this.documentType,
this.documentName,
this.documentPath,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
Documents.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
documentType = json['documentType'];
documentName = json['documentName'];
documentPath = json['documentPath'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['documentType'] = documentType;
data['documentName'] = documentName;
data['documentPath'] = documentPath;
data['displayOrder'] = displayOrder;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class ArtifactsVideo {
int? id;
int? ioXid;
String? artifactName;
String? artifactStreamingURL;
int? displayOrder;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
ArtifactsVideo(
{this.id,
this.ioXid,
this.artifactName,
this.artifactStreamingURL,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
ArtifactsVideo.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
artifactName = json['artifactName'];
artifactStreamingURL = json['artifactStreamingURL'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['artifactName'] = artifactName;
data['artifactStreamingURL'] = artifactStreamingURL;
data['displayOrder'] = displayOrder;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class ArtifactsImage {
int? id;
int? ioXid;
String? artifactName;
String? artifactPathName;
int? displayOrder;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
ArtifactsImage(
{this.id,
this.ioXid,
this.artifactName,
this.artifactPathName,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
ArtifactsImage.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
artifactName = json['artifactName'];
artifactPathName = json['artifactPathName'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['artifactName'] = artifactName;
data['artifactPathName'] = artifactPathName;
data['displayOrder'] = displayOrder;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class MinInvestmentAmt {
int? id;
int? ioXid;
int? countryXid;
String? minInvestmentAmt;
String? maxInvestmentAmt;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
MinInvestmentAmt(
{this.id,
this.ioXid,
this.countryXid,
this.minInvestmentAmt,
this.maxInvestmentAmt,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
MinInvestmentAmt.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
countryXid = json['country_xid'];
minInvestmentAmt = json['minInvestmentAmt'];
maxInvestmentAmt = json['maxInvestmentAmt'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['country_xid'] = countryXid;
data['minInvestmentAmt'] = minInvestmentAmt;
data['maxInvestmentAmt'] = maxInvestmentAmt;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}
class KeyMerits {
int? id;
int? ioXid;
int? iconXid;
String? meritsHeader;
String? meritsHeaderArabic;
String? meritsDescription;
String? meritsDescriptionArabic;
int? displayOrder;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Icon? icon;
KeyMerits(
{this.id,
this.ioXid,
this.iconXid,
this.meritsHeader,
this.meritsHeaderArabic,
this.meritsDescription,
this.meritsDescriptionArabic,
this.displayOrder,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt,
this.icon});
KeyMerits.fromJson(Map<String, dynamic> json) {
id = json['id'];
ioXid = json['io_xid'];
iconXid = json['icon_xid'];
meritsHeader = json['meritsHeader'];
meritsHeaderArabic = json['meritsHeaderArabic'];
meritsDescription = json['meritsDescription'];
meritsDescriptionArabic = json['meritsDescriptionArabic'];
displayOrder = json['displayOrder'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
icon = json['icon'] != null ? Icon.fromJson(json['icon']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['io_xid'] = ioXid;
data['icon_xid'] = iconXid;
data['meritsHeader'] = meritsHeader;
data['meritsHeaderArabic'] = meritsHeaderArabic;
data['meritsDescription'] = meritsDescription;
data['meritsDescriptionArabic'] = meritsDescriptionArabic;
data['displayOrder'] = displayOrder;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
if (icon != null) {
data['icon'] = icon!.toJson();
}
return data;
}
}
class Icon {
int? id;
String? iconName;
String? iconFilePath;
bool? isActive;
Null createdBy;
Null modifiedBy;
String? createdAt;
String? updatedAt;
Null deletedAt;
Icon(
{this.id,
this.iconName,
this.iconFilePath,
this.isActive,
this.createdBy,
this.modifiedBy,
this.createdAt,
this.updatedAt,
this.deletedAt});
Icon.fromJson(Map<String, dynamic> json) {
id = json['id'];
iconName = json['iconName'];
iconFilePath = json['iconFilePath'];
isActive = json['isActive'];
createdBy = json['createdBy'];
modifiedBy = json['modifiedBy'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
deletedAt = json['deletedAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['iconName'] = iconName;
data['iconFilePath'] = iconFilePath;
data['isActive'] = isActive;
data['createdBy'] = createdBy;
data['modifiedBy'] = modifiedBy;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
data['deletedAt'] = deletedAt;
return data;
}
}

View File

@@ -0,0 +1,23 @@
import '../../../../../Api_Helper/base_manager.dart';
import '../../../../../shared/api/api_endpoints.dart';
import '../../../../../shared/api/network_api_services.dart';
class IOApi {
Future<ResponseData> availableIOAPI() async {
String url = ApiEndpoints.availableIOApi;
final response = await NetworkApiService().get(url);
return response;
}
Future<ResponseData> closedIOAPI() async {
String url = ApiEndpoints.closedIOApi;
final response = await NetworkApiService().get(url);
return response;
}
Future<ResponseData> iODetailsAPI(int id) async {
String url = "${ApiEndpoints.detailsIOApi}$id";
final response = await NetworkApiService().get(url);
return response;
}
}

View File

@@ -0,0 +1,34 @@
// video_bloc.dart
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/detail_io_model.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/repository/io_api.dart';
import '../../../../../../Api_Helper/base_manager.dart';
import '../../../../../../Globalconst.dart';
import 'io_details_event.dart';
import 'io_details_state.dart';
class IODetailsBloc extends Bloc<IODetailsEvent, IODetailsState> {
final int id;
IODetailsBloc({required this.id}) : super(IODetailsStateInitial()) {
on<IODetailsEvent>(mapEventToState);
}
Future<void> mapEventToState(
IODetailsEvent event, Emitter<IODetailsState> emit) async {
emit(IODetailsStateLoading());
try {
ResponseData response = await IOApi().iODetailsAPI(id);
if (response.status == ResponseStatus.SUCCESS) {
DetailIOModel detailIOModel = DetailIOModel.fromJson(response.data);
emit(IODetailsStateLoaded(detailIOModel));
}
} catch (e) {
emit(IODetailsError(Globalconst.languageSelected == "en"
? 'Oops Something went wrong'
: "تبا شيء ما حدث بشكل خاطئ"));
}
}
}

View File

@@ -0,0 +1,16 @@
// video_event.dart
import 'package:equatable/equatable.dart';
abstract class IODetailsEvent extends Equatable {
const IODetailsEvent();
@override
List<Object> get props => [];
}
class FetchIODetailsData extends IODetailsEvent {
const FetchIODetailsData();
@override
List<Object> get props => [];
}

View File

@@ -0,0 +1,32 @@
// video_state.dart
import 'package:equatable/equatable.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/detail_io_model.dart';
abstract class IODetailsState extends Equatable {
const IODetailsState();
@override
List<Object> get props => [];
}
class IODetailsStateInitial extends IODetailsState {}
class IODetailsStateLoading extends IODetailsState {}
class IODetailsStateLoaded extends IODetailsState {
final DetailIOModel detailIOModel;
const IODetailsStateLoaded(this.detailIOModel);
@override
List<Object> get props => [detailIOModel];
}
class IODetailsError extends IODetailsState {
final String message;
const IODetailsError(this.message);
@override
List<Object> get props => [message];
}

View File

@@ -1,25 +1,52 @@
import 'package:bloc/bloc.dart';
import 'dart:developer';
import 'package:bloc/bloc.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/available_io_model.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/closed_io_model.dart';
import '../../../../../Api_Helper/base_manager.dart';
import '../../domain/repository/io_api.dart';
import 'tab_event.dart';
import 'tab_state.dart';
class TabBloc extends Bloc<TabEvent, TabState> {
TabBloc() : super(const TabState()) {
TabBloc() : super(TabState(AvailableIOModel(), ClosedIOModel(), false, '')) {
on<LoadAvailableItems>(_onLoadAvailableItems);
on<LoadClosedItems>(_onLoadClosedItems);
}
void _onLoadAvailableItems(LoadAvailableItems event, Emitter<TabState> emit) {
// Simulate fetching available items
final availableItems =
List<String>.generate(10, (index) => 'Available Item $index');
emit(state.copyWith(availableItems: availableItems));
Future<void> _onLoadAvailableItems(
LoadAvailableItems event, Emitter<TabState> emit) async {
emit(state.copyWith(loading: true));
try {
ResponseData response = await IOApi().availableIOAPI();
log(response.data.toString());
if (response.status == ResponseStatus.SUCCESS) {
AvailableIOModel availableIOModel =
AvailableIOModel.fromJson(response.data);
emit(state.copyWith(availableItems: availableIOModel, loading: false));
} else {
emit(state.copyWith(errorMessage: response.message, loading: false));
}
} catch (e) {
emit(state.copyWith(
errorMessage: 'Failed to fetch available items: $e', loading: false));
}
}
void _onLoadClosedItems(LoadClosedItems event, Emitter<TabState> emit) {
// Simulate fetching closed items
final closedItems =
List<String>.generate(10, (index) => 'Closed Item $index');
emit(state.copyWith(closedItems: closedItems));
void _onLoadClosedItems(LoadClosedItems event, Emitter<TabState> emit) async {
emit(state.copyWith(loading: true));
try {
ResponseData response = await IOApi().closedIOAPI();
if (response.status == ResponseStatus.SUCCESS) {
ClosedIOModel closedIOModel = ClosedIOModel.fromJson(response.data);
emit(state.copyWith(closedItems: closedIOModel, loading: false));
} else {
emit(state.copyWith(errorMessage: response.message, loading: false));
}
} catch (e) {
emit(state.copyWith(
errorMessage: 'Failed to fetch available items: $e', loading: false));
}
}
}

View File

@@ -1,24 +1,36 @@
import 'package:equatable/equatable.dart';
class TabState extends Equatable {
final List<String> availableItems;
final List<String> closedItems;
import '../../domain/model/available_io_model.dart';
import '../../domain/model/closed_io_model.dart';
const TabState({
this.availableItems = const [],
this.closedItems = const [],
});
class TabState extends Equatable {
final AvailableIOModel availableItems;
final ClosedIOModel closedItems;
final bool loading;
final String errorMessage;
const TabState(
this.availableItems,
this.closedItems,
this.loading,
this.errorMessage,
);
TabState copyWith({
List<String>? availableItems,
List<String>? closedItems,
AvailableIOModel? availableItems,
ClosedIOModel? closedItems,
bool? loading,
String? errorMessage,
}) {
return TabState(
availableItems: availableItems ?? this.availableItems,
closedItems: closedItems ?? this.closedItems,
availableItems ?? this.availableItems,
closedItems ?? this.closedItems,
loading ?? this.loading,
errorMessage ?? this.errorMessage,
);
}
@override
List<Object> get props => [availableItems, closedItems];
List<Object> get props =>
[availableItems, closedItems, loading, errorMessage];
}

View File

@@ -1,9 +1,12 @@
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/features/MainScreens/Invest/presentation/bloc/io_invest/io_details_state.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/widgets/invest_video_section.dart';
import '../bloc/io_invest/io_details_bloc.dart';
import '../widgets/invest_detail_details_section.dart';
import '../widgets/invest_detail_image_carousel.dart';
import '../widgets/invest_included_documents_section.dart';
@@ -17,49 +20,71 @@ class InvestDetailsLayout extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.plainWhite,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0),
child: Column(
children: [
Container(
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),
body:
BlocBuilder<IODetailsBloc, IODetailsState>(builder: (context, state) {
if (state is IODetailsStateLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is IODetailsStateLoaded) {
return SingleChildScrollView(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0),
child: Column(
children: [
Container(
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: [
InvestDetailCarouselView(
type: type,
child: Column(
children: [
InvestDetailCarouselView(
type: type,
detailIOModel: state.detailIOModel,
),
InvestDetailDetailsSection(
type: type,
detailIOModel: state.detailIOModel,
),
],
),
InvestDetailDetailsSection(
type: type,
),
],
),
),
Gap(
20.h,
),
KeyInvestmentSection(
keyMerits: state.detailIOModel.data!.keyMerits!,
),
type == "closed" ? const SizedBox() : Gap(20.h),
type == "closed"
? const SizedBox()
: InvestIncludedDocumentsSection(
documentsList: state.detailIOModel.data!.documents!,
),
type == "closed" ? const SizedBox() : Gap(20.h),
type == "closed"
? const SizedBox()
: InvestVideoSection(
artifactsVideoList:
state.detailIOModel.data!.artifactsVideo!,
),
],
),
Gap(
20.h,
),
const KeyInvestmentSection(),
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(),
],
),
),
),
),
);
} else {
return const Center(child: Text('Something went wrong!'));
}
}),
);
}
}

View File

@@ -5,6 +5,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_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/bloc/io_invest/io_details_bloc.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/bloc/io_invest/io_details_event.dart';
import 'package:tanami_app/shared/components/button_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
@@ -14,7 +16,12 @@ import 'invest_details_layout.dart';
class InvestDetailsScreen extends StatelessWidget {
final String type;
const InvestDetailsScreen({super.key, required this.type});
final String id;
const InvestDetailsScreen({
super.key,
required this.type,
required this.id,
});
@override
Widget build(BuildContext context) {
@@ -45,6 +52,10 @@ class InvestDetailsScreen extends StatelessWidget {
// Create an instance of the OnboardingBloc
create: (context) => CarouselBloc(),
),
BlocProvider(
create: (context) => IODetailsBloc(id: int.parse(id))
..add(const FetchIODetailsData()),
)
],
child: InvestDetailsLayout(
type: type,

View File

@@ -5,13 +5,19 @@ import 'package:tanami_app/core/routes/route_name.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/features/MainScreens/Invest/domain/model/closed_io_model.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/widgets/kyc_card.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../Api_Helper/base_manager.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../domain/model/available_io_model.dart';
import '../../domain/repository/io_api.dart';
import '../bloc/tab_bloc.dart';
import '../bloc/tab_event.dart';
import '../bloc/tab_state.dart';
import '../widgets/invest_closed_details_section.dart';
import '../widgets/invest_closed_image_carousel.dart';
import '../widgets/invest_details_section.dart';
import '../widgets/invest_image_carousel.dart';
@@ -63,113 +69,203 @@ class InvestLayout extends StatelessWidget {
}
}
class AvailableItemsScreen extends StatelessWidget {
class AvailableItemsScreen extends StatefulWidget {
const AvailableItemsScreen({super.key});
@override
State<AvailableItemsScreen> createState() => _AvailableItemsScreenState();
}
class _AvailableItemsScreenState extends State<AvailableItemsScreen> {
bool isLoading = true;
AvailableIOModel availableIOModel = AvailableIOModel();
@override
void initState() {
apiCalls();
super.initState();
}
Future<void> apiCalls() async {
try {
ResponseData response = await IOApi().availableIOAPI();
if (response.status == ResponseStatus.SUCCESS) {
availableIOModel = AvailableIOModel.fromJson(response.data);
setState(() {
isLoading = false;
});
} else {
setState(() {
isLoading = false;
});
}
} catch (e) {}
}
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
context.read<TabBloc>().add(LoadAvailableItems());
return BlocBuilder<TabBloc, TabState>(
builder: (context, state) {
if (state.availableItems.isEmpty) {
if (isLoading) {
return const Center(child: CircularProgressIndicator());
}
return ListView.builder(
itemCount: state.availableItems.length,
itemBuilder: (context, index) {
return index == 0
? Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 18,
),
child: kycCard(context))
: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
pathParameters: {"type": "available"});
},
child: Container(
} else if (availableIOModel.data!.rows!.isEmpty) {
return Center(
child: TextWidget().text15W700(
localizations.translate(AppText.noDataAvailable),
clr: AppColor.plainBlack));
} else {
return ListView.builder(
itemCount: availableIOModel.data!.rows!.length + 1,
itemBuilder: (context, index) {
return index == 0
? 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(context))
: GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
pathParameters: {
"type": "available",
"id": availableIOModel.data!.rows![index - 1].id!
.toString()
});
},
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(
rows: availableIOModel.data!.rows![index - 1],
),
InvestDetailsSection(
availableIOModel:
availableIOModel.data!.rows![index - 1],
),
],
),
),
child: Column(
children: [
InvestCarouselView(),
const InvestDetailsSection(),
],
),
),
);
},
);
);
},
);
}
},
);
}
}
class ClosedItemsScreen extends StatelessWidget {
class ClosedItemsScreen extends StatefulWidget {
const ClosedItemsScreen({super.key});
@override
State<ClosedItemsScreen> createState() => _ClosedItemsScreenState();
}
class _ClosedItemsScreenState extends State<ClosedItemsScreen> {
bool isLoading = true;
ClosedIOModel closedIOModel = ClosedIOModel();
@override
void initState() {
apiCalls();
super.initState();
}
Future<void> apiCalls() async {
try {
ResponseData response = await IOApi().closedIOAPI();
if (response.status == ResponseStatus.SUCCESS) {
closedIOModel = ClosedIOModel.fromJson(response.data);
setState(() {
isLoading = false;
});
} else {
setState(() {
isLoading = false;
});
}
} catch (e) {}
}
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
context.read<TabBloc>().add(LoadClosedItems());
return BlocBuilder<TabBloc, TabState>(
builder: (context, state) {
if (state.closedItems.isEmpty) {
if (isLoading) {
return const Center(child: CircularProgressIndicator());
} else if (closedIOModel.data!.rows!.isEmpty) {
return Center(
child: TextWidget().text15W700(
localizations.translate(AppText.noDataAvailable),
clr: AppColor.plainBlack));
} else {
return ListView.builder(
itemCount: closedIOModel.data!.rows!.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
goRouter.pushNamed(RouteName.investDetailScreen,
pathParameters: {
"type": "closed",
"id": closedIOModel.data!.rows![index].id!.toString()
});
},
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: [
InvestClosedCarouselView(
rows: closedIOModel.data!.rows![index],
),
InvestClosedDetailsSection(
closedIoModel: closedIOModel.data!.rows![index],
),
],
),
),
);
},
);
}
return ListView.builder(
itemCount: state.closedItems.length,
itemBuilder: (context, index) {
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: Column(
children: [
InvestCarouselView(),
const InvestClosedDetailsSection(),
],
),
),
);
},
);
},
);
}

View File

@@ -7,6 +7,7 @@ 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 '../bloc/tab_event.dart';
import 'invest_layout.dart';
class InvestScreen extends StatefulWidget {
@@ -37,9 +38,8 @@ class _InvestScreenState extends State<InvestScreen> {
body: MultiBlocProvider(
providers: [
BlocProvider(
// Create an instance of the OnboardingBloc
create: (context) => TabBloc(),
),
// Create an instance of the OnboardingBloc
create: (context) => TabBloc()),
BlocProvider(
// Create an instance of the OnboardingBloc
create: (context) => CarouselBloc(),

View File

@@ -5,11 +5,14 @@ import 'package:tanami_app/core/styles/app_color.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/date_time_formatter/date_time_formatter.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/text_widget.dart';
import '../../domain/model/closed_io_model.dart';
class InvestClosedDetailsSection extends StatelessWidget {
const InvestClosedDetailsSection({super.key});
final Rows closedIoModel;
const InvestClosedDetailsSection({super.key, required this.closedIoModel});
@override
Widget build(BuildContext context) {
@@ -32,7 +35,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextWidget().text17W700(
'Multi Family Residental',
closedIoModel.investmentNameEnglish!,
clr: AppColor.plainBlack,
),
Container(
@@ -46,7 +49,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
),
child: Center(
child: TextWidget().text12W700(
"Real estate",
closedIoModel.investmentType!.investmentTypeName!,
clr: AppColor.selectedItemColor,
)),
)
@@ -77,7 +80,8 @@ class InvestClosedDetailsSection extends StatelessWidget {
clr: AppColor.plainBlack,
),
TextWidget().text12W500(
'Jul 10 2025',
DateTimeFormatter()
.formatDate(closedIoModel.closingDate!),
clr: AppColor.plainBlack,
),
],
@@ -86,23 +90,8 @@ 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().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.',
closedIoModel.descriptionEnglish!,
clr: Colors.grey,
txtAlign: TextAlign.start,
maxLine: 2,
@@ -135,7 +124,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'Silverlake',
closedIoModel.sponsor!.sponsorName!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
)
@@ -157,7 +146,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'22.5%',
"",
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -179,7 +168,7 @@ class InvestClosedDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'24 Months',
closedIoModel.holdingPeriod!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -198,7 +187,8 @@ class InvestClosedDetailsSection extends StatelessWidget {
txtAlign: TextAlign.start,
),
TextWidget().text14W700(
'August 1, 2027',
DateTimeFormatter()
.formatDate(closedIoModel.closingDate!),
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),

View File

@@ -0,0 +1,146 @@
import 'package:carousel_slider/carousel_slider.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/shared/api/api_endpoints.dart';
import '../../../../../Globalconst.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/date_time_formatter/date_time_formatter.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';
import '../../../Portfolio/presentation/bloc/carousel/carousel_state.dart';
import '../../domain/model/closed_io_model.dart';
class InvestClosedCarouselView extends StatelessWidget {
final CarouselController _controller = CarouselController();
final Rows rows;
InvestClosedCarouselView({super.key, required this.rows});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
height: 220.h,
padding: const EdgeInsets.symmetric(
horizontal: 15,
vertical: 15,
),
decoration: BoxDecoration(
color: AppColor.plainWhite, borderRadius: BorderRadius.circular(20)),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: CarouselSlider(
items: rows.artifactsImage!
.map(
(item) => Image.network(
"${ApiEndpoints.base}${item.artifactPathName!}",
fit: BoxFit.cover,
width: double.infinity,
alignment: Alignment.topCenter,
),
)
.toList(),
carouselController: _controller,
options: CarouselOptions(
scrollPhysics: const BouncingScrollPhysics(),
autoPlay: true,
aspectRatio: 2,
viewportFraction: 1,
onPageChanged: (index, reason) {
context.read<CarouselBloc>().add(PageChanged(index));
}),
),
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(bottom: 17.0),
child: BlocBuilder<CarouselBloc, CarouselState>(
builder: (context, state) {
int currentIndex = 0;
if (state is CarouselPageState) {
currentIndex = state.currentIndex;
}
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: rows.artifactsImage!.asMap().entries.map((entry) {
return GestureDetector(
onTap: () => _controller.animateToPage(entry.key),
child: Container(
width: 20.w,
height: 7.h,
margin: const EdgeInsets.symmetric(horizontal: 3.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: (currentIndex == entry.key)
? AppColor.plainWhite
: AppColor.smokeGrayColor,
),
),
);
}).toList(),
);
},
),
),
),
Positioned(
top: 20,
left: 20,
child: Container(
padding:
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
color: const Color(0xFFE4F5E9),
borderRadius: BorderRadius.circular(30.0),
),
child: TextWidget().text11W700(
Globalconst.languageSelected == "ar"
? rows.investmentType!.investmentTypeNameArabic!
: rows.investmentType!.investmentTypeName!,
clr: AppColor.selectedItemColor,
),
),
),
Positioned(
top: 20,
right: 20,
child: Container(
padding:
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(30.0),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Image.asset(
AppImages.portfolioClock,
height: 15.h,
),
Gap(
5.w,
),
TextWidget().text11W500(
'${localizations.translate(AppText.closedDateText)} ${DateTimeFormatter().formatDate(rows.closingDate!)}',
clr: AppColor.plainBlack,
),
],
),
),
)
],
),
);
}
}

View File

@@ -2,14 +2,20 @@ 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/core/utils/date_time_formatter/date_time_formatter.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/detail_io_model.dart';
import '../../../../../Globalconst.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../core/utils/text_converter/text_converter.dart';
import '../../../../../shared/components/text_widget.dart';
class InvestDetailDetailsSection extends StatelessWidget {
final String type;
const InvestDetailDetailsSection({super.key, required this.type});
final DetailIOModel detailIOModel;
const InvestDetailDetailsSection(
{super.key, required this.type, required this.detailIOModel});
@override
Widget build(BuildContext context) {
@@ -24,7 +30,9 @@ class InvestDetailDetailsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text17W700(
'Multi Family Residental',
Globalconst.languageSelected == "ar"
? detailIOModel.data!.investmentNameArabic!
: detailIOModel.data!.investmentNameEnglish!,
clr: AppColor.plainBlack,
),
Gap(
@@ -32,13 +40,18 @@ class InvestDetailDetailsSection extends StatelessWidget {
),
type == "closed"
? const SizedBox()
: TextWidget().text22W900("SAR 1,478,000",
: TextWidget().text22W900(
"USD ${TextConverter().formattedTextToNumber(detailIOModel.data!.goalAmount!)}",
clr: AppColor.investTextColor),
type == "closed" ? const SizedBox() : const Gap(8.0),
type == "closed"
? const SizedBox()
: LinearProgressIndicator(
value: type == "closed" ? 1 : 0.6,
value: type == "closed"
? 1
: (double.parse(
detailIOModel.data!.amountInvested!) /
double.parse(detailIOModel.data!.goalAmount!)),
borderRadius: BorderRadius.circular(2),
minHeight: 8.0,
backgroundColor: AppColor.txtBorderColor,
@@ -51,11 +64,13 @@ class InvestDetailDetailsSection extends StatelessWidget {
: TextWidget().text11W700(
type == "closed"
? "100% ${localizations.translate(AppText.fundedText)}"
: "60% ${localizations.translate(AppText.fundedText)}",
: "${(double.parse(detailIOModel.data!.amountInvested!) / double.parse(detailIOModel.data!.goalAmount!)) * 100}% ${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.',
Globalconst.languageSelected == "ar"
? detailIOModel.data!.descriptionArabic!
: detailIOModel.data!.descriptionEnglish!,
clr: Colors.grey,
txtAlign: TextAlign.start,
)
@@ -89,7 +104,9 @@ class InvestDetailDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'Silverlake',
Globalconst.languageSelected == "ar"
? detailIOModel.data!.sponsor!.sponsorNameArabic!
: detailIOModel.data!.sponsor!.sponsorName!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
)
@@ -111,7 +128,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'20.0%',
detailIOModel.data!.expectedReturn!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -138,7 +155,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'22.5%',
'',
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -166,7 +183,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'24 Months',
detailIOModel.data!.holdingPeriod!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -188,7 +205,8 @@ class InvestDetailDetailsSection extends StatelessWidget {
txtAlign: TextAlign.start,
),
TextWidget().text14W700(
'August 1, 2027',
DateTimeFormatter()
.formatDate(detailIOModel.data!.closingDate!),
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -204,7 +222,7 @@ class InvestDetailDetailsSection extends StatelessWidget {
txtAlign: TextAlign.start,
),
TextWidget().text14W700(
'SAR 1,000',
'BHR ${TextConverter().formattedTextToNumber(detailIOModel.data!.minInvestmentAmt![0].minInvestmentAmt!)}',
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),

View File

@@ -3,30 +3,29 @@ 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/Globalconst.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/utils/date_time_formatter/date_time_formatter.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/api/api_endpoints.dart';
import '../../../../../shared/components/text_widget.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_bloc.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_event.dart';
import '../../../Portfolio/presentation/bloc/carousel/carousel_state.dart';
final List imgList = [
{'id': 1, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 2, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 3, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 4, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 5, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
];
import '../../domain/model/detail_io_model.dart';
class InvestDetailCarouselView extends StatelessWidget {
final String type;
final DetailIOModel detailIOModel;
final CarouselController _controller = CarouselController();
InvestDetailCarouselView({super.key, required this.type});
InvestDetailCarouselView(
{super.key, required this.type, required this.detailIOModel});
@override
Widget build(BuildContext context) {
@@ -48,10 +47,10 @@ class InvestDetailCarouselView extends StatelessWidget {
topRight: Radius.circular(20.0),
),
child: CarouselSlider(
items: imgList
items: detailIOModel.data!.artifactsImage!
.map(
(item) => Image.asset(
item['img_path'],
(item) => Image.network(
"${ApiEndpoints.base}${item.artifactPathName!}",
fit: BoxFit.cover,
width: double.infinity,
alignment: Alignment.topCenter,
@@ -81,7 +80,10 @@ class InvestDetailCarouselView extends StatelessWidget {
}
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: imgList.asMap().entries.map((entry) {
children: detailIOModel.data!.artifactsImage!
.asMap()
.entries
.map((entry) {
return GestureDetector(
onTap: () => _controller.animateToPage(entry.key),
child: Container(
@@ -113,7 +115,10 @@ class InvestDetailCarouselView extends StatelessWidget {
borderRadius: BorderRadius.circular(30.0),
),
child: TextWidget().text11W700(
'Asset Class',
Globalconst.languageSelected == "ar"
? detailIOModel
.data!.investmentType!.investmentTypeNameArabic!
: detailIOModel.data!.investmentType!.investmentTypeName!,
clr: AppColor.selectedItemColor,
),
),
@@ -140,8 +145,8 @@ class InvestDetailCarouselView extends StatelessWidget {
),
TextWidget().text11W500(
type == "closed"
? '${localizations.translate(AppText.closedDateText)} Jul 10 2025'
: '${localizations.translate(AppText.closingDateText)} Jul 10 2025',
? '${localizations.translate(AppText.closedDateText)} ${DateTimeFormatter().formatDate(detailIOModel.data!.closingDate!)}'
: '${localizations.translate(AppText.closingDateText)} ${DateTimeFormatter().formatDate(detailIOModel.data!.closingDate!)}',
clr: AppColor.plainBlack,
),
],

View File

@@ -1,15 +1,18 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/Globalconst.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/features/MainScreens/Invest/domain/model/available_io_model.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../core/utils/text_converter/text_converter.dart';
import '../../../../../shared/components/text_widget.dart';
class InvestDetailsSection extends StatelessWidget {
const InvestDetailsSection({super.key});
final Rows availableIOModel;
const InvestDetailsSection({super.key, required this.availableIOModel});
@override
Widget build(BuildContext context) {
@@ -31,66 +34,79 @@ class InvestDetailsSection extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextWidget().text17W700(
'Multi Family Residental',
clr: AppColor.plainBlack,
SizedBox(
width: 0.5.sw,
child: TextWidget().text17W700(
Globalconst.languageSelected == "ar"
? availableIOModel.investmentNameArabic!
: availableIOModel.investmentNameEnglish!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.start),
),
Container(
height: 28,
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 6),
decoration: ShapeDecoration(
color: const Color(0xFFE4F5E9),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4)),
),
child: Center(
child: TextWidget().text11W700(
"Real estate",
clr: AppColor.selectedItemColor,
)),
)
// Container(
// height: 28,
// padding: const EdgeInsets.symmetric(
// horizontal: 12, vertical: 6),
// decoration: ShapeDecoration(
// color: const Color(0xFFE4F5E9),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(4)),
// ),
// child: Center(
// child: TextWidget().text11W700(
// Globalconst.languageSelected == "ar"
// ? availableIOModel
// .investmentType!.investmentTypeNameArabic!
// : availableIOModel
// .investmentType!.investmentTypeName!,
// clr: AppColor.selectedItemColor,
// )),
// )
],
),
Gap(10.h),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12.0, vertical: 5.0),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFE4F5E9)),
borderRadius: BorderRadius.circular(14.0),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Image.asset(
AppImages.portfolioClock,
height: 20.h,
),
Gap(
5.w,
),
TextWidget().text12W700(
"${localizations.translate(AppText.closingDateText)}: ",
clr: AppColor.plainBlack,
),
TextWidget().text12W500(
'Jul 10 2025',
clr: AppColor.plainBlack,
),
],
),
),
// Gap(10.h),
// Container(
// padding: const EdgeInsets.symmetric(
// horizontal: 12.0, vertical: 5.0),
// decoration: BoxDecoration(
// color: Colors.white,
// border: Border.all(color: const Color(0xFFE4F5E9)),
// borderRadius: BorderRadius.circular(14.0),
// ),
// child: Row(
// mainAxisSize: MainAxisSize.min,
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// Image.asset(
// AppImages.portfolioClock,
// height: 20.h,
// ),
// Gap(
// 5.w,
// ),
// TextWidget().text12W700(
// "${localizations.translate(AppText.closingDateText)}: ",
// clr: AppColor.plainBlack,
// ),
// TextWidget().text12W500(
// DateTimeFormatter()
// .formatDate(availableIOModel.closingDate!),
// clr: AppColor.plainBlack,
// ),
// ],
// ),
// ),
Gap(
10.h,
),
TextWidget()
.text22W900("SAR 1,478,000", clr: AppColor.investTextColor),
TextWidget().text22W900(
"USD ${TextConverter().formattedTextToNumber(availableIOModel.goalAmount!)}",
clr: AppColor.investTextColor),
const Gap(8.0),
LinearProgressIndicator(
value: 0.6,
value: (double.parse(availableIOModel.amountInvested!) /
double.parse(availableIOModel.goalAmount!)),
borderRadius: BorderRadius.circular(2),
minHeight: 8.0,
backgroundColor: AppColor.txtBorderColor,
@@ -99,11 +115,13 @@ class InvestDetailsSection extends StatelessWidget {
),
const Gap(8.0),
TextWidget().text11W700(
"60% ${localizations.translate(AppText.fundedText)}",
"${(double.parse(availableIOModel.amountInvested!) / double.parse(availableIOModel.goalAmount!)) * 100}% ${localizations.translate(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.',
Globalconst.languageSelected == "ar"
? availableIOModel.descriptionArabic!
: availableIOModel.descriptionEnglish!,
clr: Colors.grey,
txtAlign: TextAlign.start,
maxLine: 2,
@@ -136,7 +154,9 @@ class InvestDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'Silverlake',
Globalconst.languageSelected == "ar"
? availableIOModel.sponsor!.sponsorNameArabic!
: availableIOModel.sponsor!.sponsorName ?? "",
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
)
@@ -158,7 +178,7 @@ class InvestDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'20.0%',
availableIOModel.expectedReturn!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -180,7 +200,7 @@ class InvestDetailsSection extends StatelessWidget {
),
),
TextWidget().text14W700(
'24 Months',
availableIOModel.holdingPeriod!,
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),
@@ -199,7 +219,7 @@ class InvestDetailsSection extends StatelessWidget {
txtAlign: TextAlign.start,
),
TextWidget().text14W700(
'SAR 1,000',
'BHD ${TextConverter().formattedTextToNumber(availableIOModel.minInvestmentAmt![0].minInvestmentAmt!)}',
clr: AppColor.plainBlack,
txtAlign: TextAlign.end,
),

View File

@@ -4,43 +4,45 @@ 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/shared/api/api_endpoints.dart';
import '../../../../../Globalconst.dart';
import '../../../../../core/styles/app_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/date_time_formatter/date_time_formatter.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';
import '../../../Portfolio/presentation/bloc/carousel/carousel_state.dart';
final List imgList = [
{'id': 1, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 2, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 3, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 4, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
{'id': 5, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
];
import '../../domain/model/available_io_model.dart';
class InvestCarouselView extends StatelessWidget {
final CarouselController _controller = CarouselController();
final Rows rows;
InvestCarouselView({super.key});
InvestCarouselView({super.key, required this.rows});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Container(
height: 220.h,
height: 190.h,
padding: const EdgeInsets.symmetric(
horizontal: 15,
vertical: 15,
),
decoration: BoxDecoration(
color: AppColor.plainWhite, borderRadius: BorderRadius.circular(20)),
child: Column(
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: CarouselSlider(
items: imgList
items: rows.artifactsImage!
.map(
(item) => Image.asset(
item['img_path'],
(item) => Image.network(
"${ApiEndpoints.base}${item.artifactPathName!}",
fit: BoxFit.cover,
width: double.infinity,
alignment: Alignment.topCenter,
@@ -58,34 +60,85 @@ class InvestCarouselView extends StatelessWidget {
}),
),
),
const Gap(6),
BlocBuilder<CarouselBloc, CarouselState>(
builder: (context, state) {
int currentIndex = 0;
if (state is CarouselPageState) {
currentIndex = state.currentIndex;
}
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: imgList.asMap().entries.map((entry) {
return GestureDetector(
onTap: () => _controller.animateToPage(entry.key),
child: Container(
width: 20.w,
height: 8.h,
margin: const EdgeInsets.symmetric(horizontal: 3.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: (currentIndex == entry.key)
? AppColor.primaryColor
: AppColor.pinFillColor,
),
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(bottom: 17.0),
child: BlocBuilder<CarouselBloc, CarouselState>(
builder: (context, state) {
int currentIndex = 0;
if (state is CarouselPageState) {
currentIndex = state.currentIndex;
}
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: rows.artifactsImage!.asMap().entries.map((entry) {
return GestureDetector(
onTap: () => _controller.animateToPage(entry.key),
child: Container(
width: 20.w,
height: 7.h,
margin: const EdgeInsets.symmetric(horizontal: 3.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: (currentIndex == entry.key)
? AppColor.plainWhite
: AppColor.smokeGrayColor,
),
),
);
}).toList(),
);
}).toList(),
);
},
},
),
),
),
Positioned(
top: 20,
left: 5,
child: Container(
padding:
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
color: const Color(0xFFE4F5E9),
borderRadius: BorderRadius.circular(30.0),
),
child: TextWidget().text11W700(
Globalconst.languageSelected == "ar"
? rows.investmentType!.investmentTypeNameArabic!
: rows.investmentType!.investmentTypeName!,
clr: AppColor.selectedItemColor,
),
),
),
Positioned(
top: 20,
right: 10,
child: Container(
padding:
const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(30.0),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Image.asset(
AppImages.portfolioClock,
height: 15.h,
),
Gap(
5.w,
),
TextWidget().text11W500(
'${localizations.translate(AppText.closingDateText)} ${DateTimeFormatter().formatDate(rows.closingDate!)}',
clr: AppColor.plainBlack,
),
],
),
),
)
],
),
);

View File

@@ -1,15 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.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_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/api/api_endpoints.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../domain/model/detail_io_model.dart';
class InvestIncludedDocumentsSection extends StatelessWidget {
const InvestIncludedDocumentsSection({super.key});
final List<Documents> documentsList;
const InvestIncludedDocumentsSection(
{super.key, required this.documentsList});
@override
Widget build(BuildContext context) {
@@ -48,51 +54,64 @@ class InvestIncludedDocumentsSection extends StatelessWidget {
crossAxisSpacing: 10.w,
crossAxisCount: 2, // Number of columns
children: List.generate(
6,
documentsList.length,
(index) {
return Center(
child: Container(
decoration: const BoxDecoration(
color: AppColor.documentCardBgColor,
borderRadius: BorderRadius.all(Radius.circular(10.0)),
),
padding: const EdgeInsets.all(15.0),
child: Column(
children: [
Row(
children: [
Image.asset(
AppImages.documentIcon,
height: 16.sp,
),
Gap(
7.w,
),
TextWidget().text12W700("Filename.pdf",
clr: AppColor.plainBlack),
],
),
Gap(
20.h,
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: InkWell(
onTap: () {
//https://www.orimi.com/pdf-test.pdf
goRouter.pushNamed(RouteName.pdfReaderScreen,
pathParameters: {
"pdfUrl":
"${ApiEndpoints.base}${documentsList[index].documentPath}",
"title": documentsList[index].documentName!,
});
},
child: Container(
decoration: const BoxDecoration(
color: AppColor.documentCardBgColor,
borderRadius: BorderRadius.all(Radius.circular(10.0)),
),
padding: const EdgeInsets.all(15.0),
child: Column(
children: [
Row(
children: [
TextWidget().text12W700("512 Mb",
clr: AppColor.portoflioCardTextColor),
Image.asset(
AppImages.documentIcon,
height: 16.sp,
),
Gap(
7.w,
),
Image.asset(
AppImages.donwloadIcon,
height: 20.sp,
),
TextWidget().text12W700(
documentsList[index].documentName!,
clr: AppColor.plainBlack),
],
),
),
],
Gap(
20.h,
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
// TextWidget().text12W700("512 Mb",
// clr: AppColor.portoflioCardTextColor),
Gap(
7.w,
),
Image.asset(
AppImages.donwloadIcon,
height: 20.sp,
),
],
),
),
],
),
),
),
);

View File

@@ -1,13 +1,17 @@
import 'package:flutter/material.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_images.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../domain/model/detail_io_model.dart';
class InvestVideoSection extends StatelessWidget {
const InvestVideoSection({super.key});
List<ArtifactsVideo> artifactsVideoList;
InvestVideoSection({super.key, required this.artifactsVideoList});
@override
Widget build(BuildContext context) {
@@ -44,34 +48,42 @@ class InvestVideoSection extends StatelessWidget {
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: videos.length,
itemCount: artifactsVideoList.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(bottom: 18.0),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(18.0),
),
child: Stack(
children: [
Image.asset(
videos[index],
fit: BoxFit.cover,
height: 160.h,
width: 1.sw,
),
Positioned(
bottom: 0.0,
child: Image.asset(
AppImages.academyCardOverlay,
return InkWell(
onTap: () {
goRouter.pushNamed(RouteName.vimeoScreen, pathParameters: {
"videoUrl":
artifactsVideoList[index].artifactStreamingURL!
});
},
child: Padding(
padding: const EdgeInsets.only(bottom: 18.0),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(18.0),
),
child: Stack(
children: [
Image.asset(
"assets/images/academy_screen/vd_bg.jpg",
fit: BoxFit.cover,
height: 160.h,
width: 1.sw,
),
),
Positioned.fill(
child: Image.asset(
AppImages.videoPlayIcon,
Positioned(
bottom: 0.0,
child: Image.asset(
AppImages.academyCardOverlay,
),
),
)
],
Positioned.fill(
child: Image.asset(
AppImages.videoPlayIcon,
),
)
],
),
),
),
);
@@ -83,7 +95,3 @@ class InvestVideoSection extends StatelessWidget {
);
}
}
List videos = [
'assets/images/academy_screen/vd_bg.jpg',
];

View File

@@ -2,15 +2,19 @@ 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:tanami_app/Globalconst.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/shared/api/api_endpoints.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/styles/app_text.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../domain/model/detail_io_model.dart';
class KeyInvestmentSection extends StatelessWidget {
const KeyInvestmentSection({super.key});
final List<KeyMerits> keyMerits;
const KeyInvestmentSection({super.key, required this.keyMerits});
@override
Widget build(BuildContext context) {
@@ -43,7 +47,7 @@ class KeyInvestmentSection extends StatelessWidget {
16.h,
),
ListView.builder(
itemCount: 4,
itemCount: keyMerits.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (ctx, index) {
@@ -52,9 +56,13 @@ class KeyInvestmentSection extends StatelessWidget {
bottom: 12,
),
child: investmentSectionCardText(
imageList[index],
"Nunc vulputate libero et velit interdumb aenfoao",
"ac aliquet odio mattis.",
"${ApiEndpoints.base}${keyMerits[index].icon!.iconFilePath}",
Globalconst.languageSelected == "ar"
? keyMerits[index].meritsHeaderArabic!
: keyMerits[index].meritsHeader!,
Globalconst.languageSelected == "ar"
? keyMerits[index].meritsDescriptionArabic!
: keyMerits[index].meritsDescription!,
),
);
})
@@ -80,7 +88,7 @@ Widget investmentSectionCardText(
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(icon),
SvgPicture.network(icon),
const Gap(8),
Expanded(
child: Column(

View File

@@ -0,0 +1,11 @@
import '../../../../../Api_Helper/base_manager.dart';
import '../../../../../shared/api/api_endpoints.dart';
import '../../../../../shared/api/network_api_services.dart';
class SettingsApi {
Future<ResponseData> updateNotification() async {
String url = ApiEndpoints.updateNotificationApi;
final response = await NetworkApiService().post(url, {});
return response;
}
}

View File

@@ -3,10 +3,12 @@ import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/features/MainScreens/Settings/presentation/widgets/support_settings_section.dart';
import '../widgets/add_bank_details_section.dart';
import '../widgets/general_settings_section.dart';
import '../widgets/kyc_card.dart';
import '../widgets/privacy_settings_section.dart';
import '../widgets/settings_bottom_section.dart';
import '../widgets/user_account_section.dart';
class SettingsLayout extends StatelessWidget {
const SettingsLayout({super.key});
@@ -19,10 +21,14 @@ class SettingsLayout extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const UserAccountSection(),
const Gap(15),
kycCard(context),
const Gap(15),
const GeneralSettingsSection(),
const Gap(15),
const BankDetailsSection(),
const Gap(15),
const PrivacySettingsSection(),
const Gap(15),
const SupportSettingsSection(),

View File

@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:gap/gap.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_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/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import 'settings_list_tile_item.dart';
class BankDetailsSection extends StatelessWidget {
const BankDetailsSection({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W600(
localizations.translate(AppText.addBankDetails),
clr: AppColor.hintTextColor,
),
const Gap(8),
SettingsListItem(
onTapFunc: () {
goRouter.pushNamed(RouteName.addBankDetailsScreen);
},
icon: AppImages.walletSettingsIcon,
title: AppText.bankDetails,
trailing: "",
),
const Gap(10),
const Divider(
color: AppColor.academyCardTextColor,
),
],
),
);
}
}

View File

@@ -11,6 +11,8 @@ import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
import '../../../../../shared/components/toggle_widget.dart';
import '../../../../languageChange/presentation/bloc/text_bloc/text_bloc.dart';
import '../../../../languageChange/presentation/bloc/text_bloc/text_state.dart';
import 'settings_list_tile_item.dart';
class GeneralSettingsSection extends StatelessWidget {
@@ -59,14 +61,16 @@ class GeneralSettingsSection extends StatelessWidget {
],
),
const Gap(12),
SettingsListItem(
onTapFunc: () {
goRouter.pushNamed(RouteName.languageChangeScreen);
},
icon: AppImages.languageIcon,
title: localizations.translate(AppText.languageText),
trailing: localizations.translate(AppText.englishText),
),
BlocBuilder<TextLanguageBloc, TextState>(builder: (context, state) {
return SettingsListItem(
onTapFunc: () {
goRouter.pushNamed(RouteName.languageChangeScreen);
},
icon: AppImages.languageIcon,
title: localizations.translate(AppText.languageText),
trailing: state.text,
);
}),
const Gap(10),
const Divider(
color: AppColor.academyCardTextColor,
@@ -76,3 +80,6 @@ class GeneralSettingsSection extends StatelessWidget {
);
}
}
// Globalconst.languageSelected == "en"
// ? "English"
// ,

View File

@@ -0,0 +1,122 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../Globalconst.dart';
import '../../../../../core/utils/language/localizations_delegate.dart';
class UserAccountSection extends StatelessWidget {
const UserAccountSection({super.key});
@override
Widget build(BuildContext context) {
String getInitials(String name) {
List<String> words = name.split(' ');
String initials = '';
for (var word in words) {
if (word.isNotEmpty) {
initials += word[0].toUpperCase();
}
}
return initials;
}
var localizations = AppLocalizations.of(context);
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 1.sw,
padding: const EdgeInsets.only(
left: 12,
top: 12,
bottom: 12,
right: 12,
),
decoration: ShapeDecoration(
color: const Color(0xFFF6F6F6),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(22),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: SizedBox(
height: 61,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 41,
height: 41,
padding: const EdgeInsets.all(8),
decoration: ShapeDecoration(
color: const Color(0xFFDAEEE0),
shape: RoundedRectangleBorder(
side: const BorderSide(
width: 1, color: Color(0xFF709C81)),
borderRadius: BorderRadius.circular(22),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TextWidget().text15W500(
getInitials(
"${Globalconst.firstName} ${Globalconst.lastName}"),
clr: const Color(0xFF066123),
)
],
),
),
const Gap(12),
Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
Globalconst.firstName.isEmpty
? "User"
: "${Globalconst.firstName} ${Globalconst.lastName}",
clr: const Color(0xFF191B1E),
),
const Gap(4),
TextWidget().text11W500(
localizations
.translate(AppText.yourAccountDetails),
clr: const Color(0xFF8D8D8D),
),
],
),
const Spacer(),
const Icon(
Icons.arrow_forward_ios_outlined,
color: Color(0xFF363636),
)
],
),
),
),
],
),
)
],
),
);
}
}

View File

@@ -0,0 +1,199 @@
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/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 DepositeCompleteScreen extends StatelessWidget {
const DepositeCompleteScreen({super.key});
@override
Widget build(BuildContext context) {
var localizations = AppLocalizations.of(context);
return Scaffold(
backgroundColor: Colors.white,
bottomNavigationBar: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
function: () {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
},
text: localizations.translate(AppText.closeText),
clr: AppColor.primaryColor2,
),
),
InkWell(
onTap: () {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
},
child: Container(
width: 1.sw,
height: 56.h,
margin: const EdgeInsets.only(
bottom: 16,
left: 16,
right: 16,
),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 16),
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: const BorderSide(width: 1, color: Color(0xFFE3E3E3)),
borderRadius: BorderRadius.circular(30),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TextWidget().text14W700(
localizations
.translate(AppText.manageDepositNotifications),
clr: AppColor.textLabelColor,
textDecoration: TextDecoration.underline),
],
),
),
)
],
),
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: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(child: SvgPicture.asset(AppImages.dStep3CountIcon)),
const Gap(15),
Center(
child: TextWidget().text14W400(
localizations.translate(AppText.youAreAllSet),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.center),
),
const Gap(50),
Stack(
alignment: Alignment.topCenter,
children: [
Padding(
padding: const EdgeInsets.only(top: 45),
child: Container(
width: 1.sw,
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
color: AppColor.plainWhite,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(22),
),
shadows: const [
BoxShadow(
color: Color(0x14000000),
blurRadius: 8,
offset: Offset(-2, -2),
spreadRadius: 0.50,
),
BoxShadow(
color: Color(0x3391978E),
blurRadius: 8,
offset: Offset(2, 2),
spreadRadius: 4,
)
],
),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Align(
alignment: Alignment.topRight,
child: TextWidget().text12W400('17th of June, 2024',
clr: const Color(0xFF787878)),
),
const Gap(25),
TextWidget().text20W700(
localizations.translate(
AppText.depositNotificationCreated),
clr: AppColor.plainBlack),
const Gap(18),
TextWidget().text12W400(
localizations.translate(AppText.amountDeposited),
clr: AppColor.plainBlack),
const Gap(8),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
margin: const EdgeInsets.only(top: 2),
child: TextWidget().text15W400("SAR",
clr: AppColor.investTextColor),
),
const Gap(5),
TextWidget().text32W700("1000",
clr: AppColor.investTextColor),
],
),
const Gap(40),
],
),
),
),
),
Positioned(
child: SvgPicture.asset(AppImages.depositCheckIcon),
),
],
),
const Gap(50),
TextWidget().text14W400(
localizations.translate(
AppText.pleaseEnsureTheFundsAreTransferredFromBank),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),
],
),
),
);
}
}

View File

@@ -1,4 +1,7 @@
// ignore: file_names
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -6,6 +9,7 @@ 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:pay/pay.dart';
import '../../../../../../core/routes/route_name.dart';
import '../../../../../../core/routes/routes.dart';
@@ -26,6 +30,13 @@ class DepositLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
const paymentItems = [
PaymentItem(
label: 'Total',
amount: '99.99',
status: PaymentItemStatus.final_price,
)
];
var localizations = AppLocalizations.of(context);
final depositPaymentBloc = context.read<DepositPaymentBloc>();
int selectedIndex = 0;
@@ -42,7 +53,11 @@ class DepositLayout extends StatelessWidget {
child: GestureDetector(
onTap: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.depositPreview);
if (selectedIndex == 1) {
} else if (selectedIndex == 2) {
} else {
goRouter.pushNamed(RouteName.depositPreview);
}
}
},
child: selectedIndex == 1
@@ -81,28 +96,43 @@ class DepositLayout extends StatelessWidget {
),
),
)
: 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,
: selectedIndex == 2
? GooglePayButton(
paymentConfiguration:
PaymentConfiguration.fromJsonString(
jsonEncode(JsonAssets.gpayAsset)),
paymentItems: paymentItems,
type: GooglePayButtonType.pay,
margin: const EdgeInsets.only(top: 15.0),
onPaymentResult: (paymentResult) {
log(paymentResult.toString());
},
loadingIndicator: const Center(
child: CircularProgressIndicator(),
),
)
: 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,
),
),
),
),
),
),
),
);
},
@@ -147,45 +177,25 @@ class DepositLayout extends StatelessWidget {
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),
],
),
Center(
child: SvgPicture.asset(AppImages.dStepCount1Icon)),
const Gap(30),
Center(
child: TextWidget().text14W500(
localizations.translate(
AppText.insertTheAmountYouWouldLikeToTransfer),
clr: AppColor.textLabelColor),
),
const Gap(30),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 16.0, horizontal: 12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'SAR',
style: GoogleFonts.dmSans(
color: const Color(0xFF363636),
fontSize: 15.sp,
fontWeight: FontWeight.w400,
),
),
SizedBox(
width: 12.w,
),
TextWidget().text15W400("SAR",
clr: AppColor.textLabelColor),
Gap(12.w),
SizedBox(
width: 280.w,
child: TextFormField(
@@ -310,21 +320,21 @@ class DepositLayout extends StatelessWidget {
// ),
// ),
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,
),
),
],
),
// 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,
// ),
// ),
// ],
// ),
],
);
},
@@ -339,3 +349,9 @@ class DepositLayout extends StatelessWidget {
);
}
}
class JsonAssets {
JsonAssets._();
static const String gpayAsset = 'assets/payment/google_pay_config.json';
}

View File

@@ -1,8 +1,10 @@
import 'package:dotted_line/dotted_line.dart';
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/Globalconst.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';
@@ -51,107 +53,99 @@ class DepositStepScreen extends StatelessWidget {
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),
)
],
),
),
TextWidget().text14W500(
localizations
.translate(AppText.inOrderForYouToCompleteBankTransfers),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start),
const Gap(16),
TextWidget().text15W700("Please complete the below steps",
TextWidget().text15W700(
localizations.translate(AppText.pleaseCompleteTheBelowSteps),
clr: AppColor.plainBlack),
const Gap(16),
Padding(
padding: const EdgeInsets.all(16.0),
child: ListView(
shrinkWrap: true,
children: [
Row(
Stack(
children: [
Positioned(
left: Globalconst.languageSelected == "en" ? 35.w : 0.w,
right: Globalconst.languageSelected == "en" ? 0.w : 35.w,
top: 40.h,
child: DottedLine(
direction: Axis.vertical,
alignment: WrapAlignment.center,
lineLength: 150,
lineThickness: 1.0,
dashLength: 4.0,
dashColor: const Color(0xFF066123).withOpacity(0.46),
dashRadius: 0.0,
dashGapLength: 4.0,
dashGapRadius: 0.0,
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: ListView(
shrinkWrap: true,
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,
),
)
Row(
children: [
SvgPicture.asset(AppImages.dStep1Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
localizations.translate(AppText
.insertTheAmountYouWouldLikeToTransfer),
clr: const Color(0xFF363636),
txtAlign: TextAlign.start,
),
)
],
),
const Gap(24),
Row(
children: [
SvgPicture.asset(AppImages.dStep2Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
localizations.translate(AppText
.copyTheBankDetailsYourTanamiAccountShownNextPage),
clr: const Color(0xFF363636),
txtAlign: TextAlign.start,
),
)
],
),
const Gap(24),
Row(
children: [
SvgPicture.asset(AppImages.dStep3Icon),
const Gap(16),
Expanded(
child: TextWidget().text14W400(
localizations.translate(AppText
.insertTheAmountYouWouldLikeToTransfer),
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(),
const Gap(36),
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),
localizations
.translate(AppText.tanamiWillNotifyUponReceiptFunds),
clr: AppColor.plainBlack,
fontStyle: FontStyle.italic),
],
),

View File

@@ -1,11 +1,15 @@
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_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/styles/app_images.dart';
import '../../../../../../core/utils/language/localizations_delegate.dart';
class DepositPreview extends StatefulWidget {
@@ -42,13 +46,13 @@ class _DepositPreviewState extends State<DepositPreview> {
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"),
localizations.translate(AppText.accountName),
localizations.translate(AppText.accountNo),
localizations.translate(AppText.iban),
localizations.translate(AppText.swiftCode),
localizations.translate(AppText.bankName),
localizations.translate(AppText.bankAddress),
localizations.translate(AppText.clientId),
];
return Scaffold(
backgroundColor: Colors.white,
@@ -58,7 +62,7 @@ class _DepositPreviewState extends State<DepositPreview> {
scrolledUnderElevation: 0.0,
centerTitle: true,
title: Text(
localizations.translate("Deposit confirmation"),
localizations.translate(AppText.deposit),
style: GoogleFonts.dmSans(
color: const Color(0xFF272727),
fontSize: 20.sp,
@@ -72,215 +76,15 @@ class _DepositPreviewState extends State<DepositPreview> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 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,
// ),
Center(child: SvgPicture.asset(AppImages.dStep2CountIcon)),
const Gap(30),
TextWidget().text14W400(
localizations
.translate(AppText.copyTheBankDetailsOfYourTanamiAccount),
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),
const Gap(10),
Card(
color: AppColor.plainWhite,
elevation: 5,
@@ -388,10 +192,7 @@ class _DepositPreviewState extends State<DepositPreview> {
children: [
GestureDetector(
onTap: () {
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pop();
goRouter.pushNamed(RouteName.depositCompleteScreen);
},
child: Container(
margin: const EdgeInsets.all(10.0),

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