Compare commits

...

10 Commits

88 changed files with 6245 additions and 1026 deletions

View File

@ -1,6 +1,8 @@
import React from 'react';
import RootStack from './src/navigation/RootStack';
import { NavigationContainer } from '@react-navigation/native';
import AsyncStorage from 'react-native';
function App() {
return (

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#2B3A51</color>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

1980
ios/Podfile.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@ -7,178 +7,168 @@
objects = {
/* Begin PBXBuildFile section */
018030A229AC497CBD97C525 /* NotoSans_SemiCondensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F5B97FA0433741E1A9BC333B /* NotoSans_SemiCondensed-Medium.ttf */; };
07F22F8FEFF241F989D8ECD1 /* NotoSans_ExtraCondensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2D5B8FBD021A4E7A8BC24C19 /* NotoSans_ExtraCondensed-BoldItalic.ttf */; };
08C81580077940A59B1FA1CC /* NotoSans_ExtraCondensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 350B2043EDCF4BAB8870796E /* NotoSans_ExtraCondensed-Light.ttf */; };
0C80B921A6F3F58F76C31292 /* libPods-mpaspor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-mpaspor.a */; };
10A6F9D7A4B443FE8CEB61A0 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 95EB6F2F20F24550A3DE73F2 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
C1234C1921EA4308B8BE3F42 /* NotoSans-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3E04D39223E34B76B5924912 /* NotoSans-Black.ttf */; };
D2EB77056AF547E49E63334F /* NotoSans-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 387647589F2E4609A2AAE3D2 /* NotoSans-BlackItalic.ttf */; };
AC26F11BBF524E72AF26FEA2 /* NotoSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C114C3F71AA04B778369EA89 /* NotoSans-Bold.ttf */; };
195ADAD5821241119A6BA3CC /* NotoSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9675AF4AE623457DA439469F /* NotoSans-BoldItalic.ttf */; };
3ACCF5CB2A4D48719A1D5FF0 /* NotoSans-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 540C63F381574B83AD80E694 /* NotoSans-ExtraBold.ttf */; };
569E5CC1E05D4B7185858CF1 /* NotoSans-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5B9C25EB27EB426CA307D054 /* NotoSans-ExtraBoldItalic.ttf */; };
EF09B3110E42468A8B63690B /* NotoSans-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6D0E0E916D894072B379D1A6 /* NotoSans-ExtraLight.ttf */; };
81111C0421CA4D8388D13B4B /* NotoSans-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0407698A36C645E89ECEE46A /* NotoSans-ExtraLightItalic.ttf */; };
87F1361A0FE547D093AB988B /* NotoSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89E495E1B8B1403DBE9B3C18 /* NotoSans-Italic.ttf */; };
24766699D92E461AB4D29DF3 /* NotoSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 981C1B1736F444ABA63EA8B3 /* NotoSans-Light.ttf */; };
C7974D91F6154C3F899A580B /* NotoSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9810080F44BB45AF9E271B95 /* NotoSans-LightItalic.ttf */; };
B8F925FC82104E83AA4E3B55 /* NotoSans-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BC657944C69C450F8CBDCE65 /* NotoSans-Medium.ttf */; };
35545FC9A957491FB97BEB0B /* NotoSans-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 306D5A08D36A4FD3A2D60AA6 /* NotoSans-MediumItalic.ttf */; };
DD09EA0B30064D56B063EEA6 /* NotoSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FB70298C3DDE435593072128 /* NotoSans-Regular.ttf */; };
ABC64905536D495199653037 /* NotoSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B4805B39BE79459DBF47199C /* NotoSans-SemiBold.ttf */; };
FED256B6C7D1407381944829 /* NotoSans-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9A4F5DBEC4C043D399F4AD09 /* NotoSans-SemiBoldItalic.ttf */; };
174B2A74F408417EB9D451D5 /* NotoSans_SemiCondensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C182B410FF2843ECA3C54FA5 /* NotoSans_SemiCondensed-BoldItalic.ttf */; };
18E2698ADBD9484FBAE1B3D4 /* NotoSans-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2BA758DFF5F34ACABB6EE75B /* NotoSans-Thin.ttf */; };
F2A33A19277E48F1AF8981DC /* NotoSans-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2B68B3AD2C4C407C91F69A1C /* NotoSans-ThinItalic.ttf */; };
B6F3D97F2CCE4E938805A5E9 /* NotoSans_Condensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 51B2BAA003544315B3E4617C /* NotoSans_Condensed-Black.ttf */; };
AF410E50367D439FBDED5409 /* NotoSans_Condensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 869814428B704007B4D0B145 /* NotoSans_Condensed-BlackItalic.ttf */; };
91E54F1E53FE4B6993CF5B4C /* NotoSans_Condensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7EF8E3D480F4077B28318E6 /* NotoSans_Condensed-Bold.ttf */; };
E534417E9EFF45A6BAE66C69 /* NotoSans_Condensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0070E7DA12E345B9BFDCAEAD /* NotoSans_Condensed-BoldItalic.ttf */; };
777C2162E0F44374ABC7321E /* NotoSans_Condensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5C1274B686464220BFCBE2D9 /* NotoSans_Condensed-ExtraBold.ttf */; };
31B29DD7B5524D23B348C975 /* NotoSans_Condensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B1BAB27ADCCE4EAFB01AF108 /* NotoSans_Condensed-ExtraBoldItalic.ttf */; };
195ADAD5821241119A6BA3CC /* NotoSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9675AF4AE623457DA439469F /* NotoSans-BoldItalic.ttf */; };
1B29E81E37A943E1A7E055B7 /* NotoSans_SemiCondensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B150E7DEFD7F476BA0B11D46 /* NotoSans_SemiCondensed-Black.ttf */; };
20444ECF33404AB4A5ABFB7E /* NotoSans_SemiCondensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89513AF6267E430A82A839F4 /* NotoSans_SemiCondensed-Light.ttf */; };
24766699D92E461AB4D29DF3 /* NotoSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 981C1B1736F444ABA63EA8B3 /* NotoSans-Light.ttf */; };
27F10B1EFED04299927B40A1 /* NotoSans_Condensed-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0C6D6EFE50AF468980A2BA9E /* NotoSans_Condensed-ExtraLight.ttf */; };
FEB5C32AB0AB4124AF18BB8A /* NotoSans_Condensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A7D6B4AB8DB546B58352462D /* NotoSans_Condensed-ExtraLightItalic.ttf */; };
2C17EEBBB81A453391C37368 /* NotoSans_ExtraCondensed-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7945520A406472284207CF7 /* NotoSans_ExtraCondensed-ExtraLight.ttf */; };
31B29DD7B5524D23B348C975 /* NotoSans_Condensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B1BAB27ADCCE4EAFB01AF108 /* NotoSans_Condensed-ExtraBoldItalic.ttf */; };
321DA40E7EE24B7690339BF7 /* NotoSans_Condensed-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4019D9A927784261B56E8BE1 /* NotoSans_Condensed-MediumItalic.ttf */; };
341576DE6218441AB77584B5 /* NotoSans_SemiCondensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C82157C4886244A2A6D7728E /* NotoSans_SemiCondensed-Thin.ttf */; };
35545FC9A957491FB97BEB0B /* NotoSans-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 306D5A08D36A4FD3A2D60AA6 /* NotoSans-MediumItalic.ttf */; };
3ACCF5CB2A4D48719A1D5FF0 /* NotoSans-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 540C63F381574B83AD80E694 /* NotoSans-ExtraBold.ttf */; };
4422DAB346B24BBBABD402A3 /* NotoSans_ExtraCondensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DD739AD811BA4F2CA5AECED9 /* NotoSans_ExtraCondensed-Regular.ttf */; };
4872248669114150ACF0D112 /* NotoSans_SemiCondensed-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 124F2DF781294D1DBDE6C49F /* NotoSans_SemiCondensed-ExtraLight.ttf */; };
4AED30DF2C1C480A87D87826 /* NotoSans_SemiCondensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 20DE3E556C0744C381959A7F /* NotoSans_SemiCondensed-Bold.ttf */; };
4CA356E2E8AC40DB9632B414 /* NotoSans_SemiCondensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F6B29F0B5B0422F915B82E3 /* NotoSans_SemiCondensed-ExtraBold.ttf */; };
4E12A87BCBF045F38321D834 /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEAD78DC746948D4991E047C /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf */; };
50291E8241334322BAD0EC3E /* NotoSans_Condensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1C5321370EBB45AE81411009 /* NotoSans_Condensed-Italic.ttf */; };
524060ADA38A436DA2CCC421 /* NotoSans_ExtraCondensed-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1E312E62C57E4916B811AE4A /* NotoSans_ExtraCondensed-LightItalic.ttf */; };
550678CC552C454BB78A27D4 /* NotoSans_SemiCondensed-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7C676367EB7B413C89B4A665 /* NotoSans_SemiCondensed-LightItalic.ttf */; };
569E5CC1E05D4B7185858CF1 /* NotoSans-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5B9C25EB27EB426CA307D054 /* NotoSans-ExtraBoldItalic.ttf */; };
58D77207B0C04ECB9B04DF2D /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FDC32FD5C6CE466E8B6950DB /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf */; };
59EF9D0696F24AF193023C6E /* NotoSans_SemiCondensed-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 99C0037E4ABE4114857454EA /* NotoSans_SemiCondensed-MediumItalic.ttf */; };
60C49B5715A64D76A83B175D /* NotoSans_Condensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 76FE0CF9610448C083902876 /* NotoSans_Condensed-Thin.ttf */; };
6B060C019EAE4BEDB54B3615 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0E72669D8E5A4AD2B67FD8B5 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf */; };
72FE3574D3744CDEAFE87EDF /* NotoSans_SemiCondensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5EE0CB7DD07B4E1C9151BE2B /* NotoSans_SemiCondensed-BlackItalic.ttf */; };
731251CB912C456899BC4BEA /* NotoSans_ExtraCondensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B46C4579A7CC4F5CB68265EA /* NotoSans_ExtraCondensed-Thin.ttf */; };
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
777C2162E0F44374ABC7321E /* NotoSans_Condensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5C1274B686464220BFCBE2D9 /* NotoSans_Condensed-ExtraBold.ttf */; };
78DEF4BA70F3419A907008A4 /* NotoSans_ExtraCondensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6A5C5E1ACFF34E758EB6D1F1 /* NotoSans_ExtraCondensed-SemiBold.ttf */; };
7A6D739510644C4AAAF7507C /* NotoSans_SemiCondensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D2C29BD9DEE14930930E3881 /* NotoSans_SemiCondensed-ExtraLightItalic.ttf */; };
81111C0421CA4D8388D13B4B /* NotoSans-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0407698A36C645E89ECEE46A /* NotoSans-ExtraLightItalic.ttf */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
83FA8B6B1E994367A1B4A9D4 /* NotoSans_SemiCondensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 457ABC5BB7C0482F8368D513 /* NotoSans_SemiCondensed-Italic.ttf */; };
87F1361A0FE547D093AB988B /* NotoSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89E495E1B8B1403DBE9B3C18 /* NotoSans-Italic.ttf */; };
89C7D639AA5F468BB1C3C886 /* NotoSans_Condensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E47D868B0184559BDF5E5E9 /* NotoSans_Condensed-Light.ttf */; };
8C3A47515132479EBB5A5343 /* NotoSans_Condensed-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 296396037F08461E99AF7AFC /* NotoSans_Condensed-LightItalic.ttf */; };
D246936E6D3342DFBDE60B9D /* NotoSans_Condensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9E1A51AD43A340808D96C36E /* NotoSans_Condensed-Medium.ttf */; };
321DA40E7EE24B7690339BF7 /* NotoSans_Condensed-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4019D9A927784261B56E8BE1 /* NotoSans_Condensed-MediumItalic.ttf */; };
E96DF032C63C49F29270AFE4 /* NotoSans_Condensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CE27CD0F1BD3480B9683B0BB /* NotoSans_Condensed-Regular.ttf */; };
B5E1D5B319704C05B9AFD373 /* NotoSans_Condensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5A7A06AE0711424EA2CC089F /* NotoSans_Condensed-SemiBold.ttf */; };
8D54BC8445F44CAD0C1809EB /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
91E54F1E53FE4B6993CF5B4C /* NotoSans_Condensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7EF8E3D480F4077B28318E6 /* NotoSans_Condensed-Bold.ttf */; };
9AE00D4B2514445A80F4DAB1 /* NotoSans_Condensed-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 71F8BFFE6F5246219F9DC0F7 /* NotoSans_Condensed-SemiBoldItalic.ttf */; };
60C49B5715A64D76A83B175D /* NotoSans_Condensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 76FE0CF9610448C083902876 /* NotoSans_Condensed-Thin.ttf */; };
B2371AE358064802BEA8028D /* NotoSans_Condensed-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 41D0B635E23947059D1CF2C6 /* NotoSans_Condensed-ThinItalic.ttf */; };
BED27059F5FA4CCFB349EFB7 /* NotoSans_ExtraCondensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E6EEE80D4B2F47BB8FA78157 /* NotoSans_ExtraCondensed-Black.ttf */; };
E1247B8B1EC945FA8573311F /* NotoSans_ExtraCondensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E7FC30F8FA1C44A1BDE3461A /* NotoSans_ExtraCondensed-BlackItalic.ttf */; };
B96E2647326440D78EC92098 /* NotoSans_ExtraCondensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2EBFAEEF25AA42BAB9EC869D /* NotoSans_ExtraCondensed-Bold.ttf */; };
07F22F8FEFF241F989D8ECD1 /* NotoSans_ExtraCondensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2D5B8FBD021A4E7A8BC24C19 /* NotoSans_ExtraCondensed-BoldItalic.ttf */; };
DF724662C2C34AEDB503B552 /* NotoSans_ExtraCondensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0A1AA61449FA4E698D9EAD0C /* NotoSans_ExtraCondensed-ExtraBold.ttf */; };
58D77207B0C04ECB9B04DF2D /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FDC32FD5C6CE466E8B6950DB /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf */; };
2C17EEBBB81A453391C37368 /* NotoSans_ExtraCondensed-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F7945520A406472284207CF7 /* NotoSans_ExtraCondensed-ExtraLight.ttf */; };
4E12A87BCBF045F38321D834 /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEAD78DC746948D4991E047C /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf */; };
AC3929E5C23C4B2C99BBBEB3 /* NotoSans_ExtraCondensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFA4940261534AA39B9CD270 /* NotoSans_ExtraCondensed-Italic.ttf */; };
08C81580077940A59B1FA1CC /* NotoSans_ExtraCondensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 350B2043EDCF4BAB8870796E /* NotoSans_ExtraCondensed-Light.ttf */; };
524060ADA38A436DA2CCC421 /* NotoSans_ExtraCondensed-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1E312E62C57E4916B811AE4A /* NotoSans_ExtraCondensed-LightItalic.ttf */; };
F61920A853A245C5937622A1 /* NotoSans_ExtraCondensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CC7766C9F8434BD3AE675547 /* NotoSans_ExtraCondensed-Medium.ttf */; };
A58DAD6D152C44EF83C41490 /* NotoSans_ExtraCondensed-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A7B6B69713B7467DA6395064 /* NotoSans_ExtraCondensed-MediumItalic.ttf */; };
4422DAB346B24BBBABD402A3 /* NotoSans_ExtraCondensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DD739AD811BA4F2CA5AECED9 /* NotoSans_ExtraCondensed-Regular.ttf */; };
78DEF4BA70F3419A907008A4 /* NotoSans_ExtraCondensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6A5C5E1ACFF34E758EB6D1F1 /* NotoSans_ExtraCondensed-SemiBold.ttf */; };
10A6F9D7A4B443FE8CEB61A0 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 95EB6F2F20F24550A3DE73F2 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf */; };
731251CB912C456899BC4BEA /* NotoSans_ExtraCondensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B46C4579A7CC4F5CB68265EA /* NotoSans_ExtraCondensed-Thin.ttf */; };
F0301FCDDE874061B8878B28 /* NotoSans_ExtraCondensed-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AE17D22089D441AC89F643BD /* NotoSans_ExtraCondensed-ThinItalic.ttf */; };
1B29E81E37A943E1A7E055B7 /* NotoSans_SemiCondensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B150E7DEFD7F476BA0B11D46 /* NotoSans_SemiCondensed-Black.ttf */; };
72FE3574D3744CDEAFE87EDF /* NotoSans_SemiCondensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5EE0CB7DD07B4E1C9151BE2B /* NotoSans_SemiCondensed-BlackItalic.ttf */; };
4AED30DF2C1C480A87D87826 /* NotoSans_SemiCondensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 20DE3E556C0744C381959A7F /* NotoSans_SemiCondensed-Bold.ttf */; };
174B2A74F408417EB9D451D5 /* NotoSans_SemiCondensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C182B410FF2843ECA3C54FA5 /* NotoSans_SemiCondensed-BoldItalic.ttf */; };
4CA356E2E8AC40DB9632B414 /* NotoSans_SemiCondensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F6B29F0B5B0422F915B82E3 /* NotoSans_SemiCondensed-ExtraBold.ttf */; };
6B060C019EAE4BEDB54B3615 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0E72669D8E5A4AD2B67FD8B5 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf */; };
4872248669114150ACF0D112 /* NotoSans_SemiCondensed-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 124F2DF781294D1DBDE6C49F /* NotoSans_SemiCondensed-ExtraLight.ttf */; };
7A6D739510644C4AAAF7507C /* NotoSans_SemiCondensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D2C29BD9DEE14930930E3881 /* NotoSans_SemiCondensed-ExtraLightItalic.ttf */; };
83FA8B6B1E994367A1B4A9D4 /* NotoSans_SemiCondensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 457ABC5BB7C0482F8368D513 /* NotoSans_SemiCondensed-Italic.ttf */; };
20444ECF33404AB4A5ABFB7E /* NotoSans_SemiCondensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89513AF6267E430A82A839F4 /* NotoSans_SemiCondensed-Light.ttf */; };
550678CC552C454BB78A27D4 /* NotoSans_SemiCondensed-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7C676367EB7B413C89B4A665 /* NotoSans_SemiCondensed-LightItalic.ttf */; };
018030A229AC497CBD97C525 /* NotoSans_SemiCondensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F5B97FA0433741E1A9BC333B /* NotoSans_SemiCondensed-Medium.ttf */; };
59EF9D0696F24AF193023C6E /* NotoSans_SemiCondensed-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 99C0037E4ABE4114857454EA /* NotoSans_SemiCondensed-MediumItalic.ttf */; };
A7A3E8B9A8244157A54A86C6 /* NotoSans_SemiCondensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 237308FB361841F095D4BC20 /* NotoSans_SemiCondensed-Regular.ttf */; };
F68D51A12F644FD493CB0CAB /* NotoSans_SemiCondensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D5EA710115547F7AF875F2E /* NotoSans_SemiCondensed-SemiBold.ttf */; };
A8FB27B3432C4526A458D01D /* NotoSans_SemiCondensed-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4B86F13B10EA4BD99225227A /* NotoSans_SemiCondensed-SemiBoldItalic.ttf */; };
341576DE6218441AB77584B5 /* NotoSans_SemiCondensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C82157C4886244A2A6D7728E /* NotoSans_SemiCondensed-Thin.ttf */; };
ABC64905536D495199653037 /* NotoSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B4805B39BE79459DBF47199C /* NotoSans-SemiBold.ttf */; };
AC26F11BBF524E72AF26FEA2 /* NotoSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C114C3F71AA04B778369EA89 /* NotoSans-Bold.ttf */; };
AC3929E5C23C4B2C99BBBEB3 /* NotoSans_ExtraCondensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFA4940261534AA39B9CD270 /* NotoSans_ExtraCondensed-Italic.ttf */; };
AF410E50367D439FBDED5409 /* NotoSans_Condensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 869814428B704007B4D0B145 /* NotoSans_Condensed-BlackItalic.ttf */; };
B2371AE358064802BEA8028D /* NotoSans_Condensed-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 41D0B635E23947059D1CF2C6 /* NotoSans_Condensed-ThinItalic.ttf */; };
B5E1D5B319704C05B9AFD373 /* NotoSans_Condensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5A7A06AE0711424EA2CC089F /* NotoSans_Condensed-SemiBold.ttf */; };
B6F3D97F2CCE4E938805A5E9 /* NotoSans_Condensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 51B2BAA003544315B3E4617C /* NotoSans_Condensed-Black.ttf */; };
B8F925FC82104E83AA4E3B55 /* NotoSans-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BC657944C69C450F8CBDCE65 /* NotoSans-Medium.ttf */; };
B96E2647326440D78EC92098 /* NotoSans_ExtraCondensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2EBFAEEF25AA42BAB9EC869D /* NotoSans_ExtraCondensed-Bold.ttf */; };
BED27059F5FA4CCFB349EFB7 /* NotoSans_ExtraCondensed-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E6EEE80D4B2F47BB8FA78157 /* NotoSans_ExtraCondensed-Black.ttf */; };
C1234C1921EA4308B8BE3F42 /* NotoSans-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3E04D39223E34B76B5924912 /* NotoSans-Black.ttf */; };
C1DC680E57CF4B7190F0A055 /* NotoSans_SemiCondensed-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C4CE3C41FDC54456A913D28E /* NotoSans_SemiCondensed-ThinItalic.ttf */; };
C7974D91F6154C3F899A580B /* NotoSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9810080F44BB45AF9E271B95 /* NotoSans-LightItalic.ttf */; };
D246936E6D3342DFBDE60B9D /* NotoSans_Condensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9E1A51AD43A340808D96C36E /* NotoSans_Condensed-Medium.ttf */; };
D2EB77056AF547E49E63334F /* NotoSans-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 387647589F2E4609A2AAE3D2 /* NotoSans-BlackItalic.ttf */; };
DD09EA0B30064D56B063EEA6 /* NotoSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FB70298C3DDE435593072128 /* NotoSans-Regular.ttf */; };
DF724662C2C34AEDB503B552 /* NotoSans_ExtraCondensed-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0A1AA61449FA4E698D9EAD0C /* NotoSans_ExtraCondensed-ExtraBold.ttf */; };
E1247B8B1EC945FA8573311F /* NotoSans_ExtraCondensed-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E7FC30F8FA1C44A1BDE3461A /* NotoSans_ExtraCondensed-BlackItalic.ttf */; };
E534417E9EFF45A6BAE66C69 /* NotoSans_Condensed-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0070E7DA12E345B9BFDCAEAD /* NotoSans_Condensed-BoldItalic.ttf */; };
E96DF032C63C49F29270AFE4 /* NotoSans_Condensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CE27CD0F1BD3480B9683B0BB /* NotoSans_Condensed-Regular.ttf */; };
EF09B3110E42468A8B63690B /* NotoSans-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6D0E0E916D894072B379D1A6 /* NotoSans-ExtraLight.ttf */; };
F0301FCDDE874061B8878B28 /* NotoSans_ExtraCondensed-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AE17D22089D441AC89F643BD /* NotoSans_ExtraCondensed-ThinItalic.ttf */; };
F2A33A19277E48F1AF8981DC /* NotoSans-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2B68B3AD2C4C407C91F69A1C /* NotoSans-ThinItalic.ttf */; };
F61920A853A245C5937622A1 /* NotoSans_ExtraCondensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CC7766C9F8434BD3AE675547 /* NotoSans_ExtraCondensed-Medium.ttf */; };
F68D51A12F644FD493CB0CAB /* NotoSans_SemiCondensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D5EA710115547F7AF875F2E /* NotoSans_SemiCondensed-SemiBold.ttf */; };
FEB5C32AB0AB4124AF18BB8A /* NotoSans_Condensed-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A7D6B4AB8DB546B58352462D /* NotoSans_Condensed-ExtraLightItalic.ttf */; };
FED256B6C7D1407381944829 /* NotoSans-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9A4F5DBEC4C043D399F4AD09 /* NotoSans-SemiBoldItalic.ttf */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
remoteInfo = mpaspor;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0070E7DA12E345B9BFDCAEAD /* NotoSans_Condensed-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-BoldItalic.ttf"; sourceTree = "<group>"; };
0407698A36C645E89ECEE46A /* NotoSans-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans-ExtraLightItalic.ttf"; sourceTree = "<group>"; };
0A1AA61449FA4E698D9EAD0C /* NotoSans_ExtraCondensed-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraBold.ttf"; sourceTree = "<group>"; };
0C6D6EFE50AF468980A2BA9E /* NotoSans_Condensed-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraLight.ttf"; sourceTree = "<group>"; };
0E72669D8E5A4AD2B67FD8B5 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; };
124F2DF781294D1DBDE6C49F /* NotoSans_SemiCondensed-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraLight.ttf"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* mpaspor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mpaspor.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = mpaspor/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = mpaspor/Info.plist; sourceTree = "<group>"; };
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = mpaspor/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
1C5321370EBB45AE81411009 /* NotoSans_Condensed-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Italic.ttf"; path = "../assets/fonts/NotoSans_Condensed-Italic.ttf"; sourceTree = "<group>"; };
1E312E62C57E4916B811AE4A /* NotoSans_ExtraCondensed-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-LightItalic.ttf"; sourceTree = "<group>"; };
20DE3E556C0744C381959A7F /* NotoSans_SemiCondensed-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Bold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Bold.ttf"; sourceTree = "<group>"; };
237308FB361841F095D4BC20 /* NotoSans_SemiCondensed-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Regular.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Regular.ttf"; sourceTree = "<group>"; };
296396037F08461E99AF7AFC /* NotoSans_Condensed-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-LightItalic.ttf"; sourceTree = "<group>"; };
2B68B3AD2C4C407C91F69A1C /* NotoSans-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-ThinItalic.ttf"; path = "../assets/fonts/NotoSans-ThinItalic.ttf"; sourceTree = "<group>"; };
2BA758DFF5F34ACABB6EE75B /* NotoSans-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Thin.ttf"; path = "../assets/fonts/NotoSans-Thin.ttf"; sourceTree = "<group>"; };
2D5B8FBD021A4E7A8BC24C19 /* NotoSans_ExtraCondensed-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-BoldItalic.ttf"; sourceTree = "<group>"; };
2E47D868B0184559BDF5E5E9 /* NotoSans_Condensed-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Light.ttf"; path = "../assets/fonts/NotoSans_Condensed-Light.ttf"; sourceTree = "<group>"; };
2EBFAEEF25AA42BAB9EC869D /* NotoSans_ExtraCondensed-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Bold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Bold.ttf"; sourceTree = "<group>"; };
306D5A08D36A4FD3A2D60AA6 /* NotoSans-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-MediumItalic.ttf"; path = "../assets/fonts/NotoSans-MediumItalic.ttf"; sourceTree = "<group>"; };
350B2043EDCF4BAB8870796E /* NotoSans_ExtraCondensed-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Light.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Light.ttf"; sourceTree = "<group>"; };
387647589F2E4609A2AAE3D2 /* NotoSans-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-BlackItalic.ttf"; path = "../assets/fonts/NotoSans-BlackItalic.ttf"; sourceTree = "<group>"; };
3B4392A12AC88292D35C810B /* Pods-mpaspor.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mpaspor.debug.xcconfig"; path = "Target Support Files/Pods-mpaspor/Pods-mpaspor.debug.xcconfig"; sourceTree = "<group>"; };
3E04D39223E34B76B5924912 /* NotoSans-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Black.ttf"; path = "../assets/fonts/NotoSans-Black.ttf"; sourceTree = "<group>"; };
4019D9A927784261B56E8BE1 /* NotoSans_Condensed-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-MediumItalic.ttf"; sourceTree = "<group>"; };
41D0B635E23947059D1CF2C6 /* NotoSans_Condensed-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ThinItalic.ttf"; sourceTree = "<group>"; };
457ABC5BB7C0482F8368D513 /* NotoSans_SemiCondensed-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Italic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Italic.ttf"; sourceTree = "<group>"; };
4B86F13B10EA4BD99225227A /* NotoSans_SemiCondensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
51B2BAA003544315B3E4617C /* NotoSans_Condensed-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Black.ttf"; path = "../assets/fonts/NotoSans_Condensed-Black.ttf"; sourceTree = "<group>"; };
540C63F381574B83AD80E694 /* NotoSans-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-ExtraBold.ttf"; path = "../assets/fonts/NotoSans-ExtraBold.ttf"; sourceTree = "<group>"; };
5709B34CF0A7D63546082F79 /* Pods-mpaspor.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mpaspor.release.xcconfig"; path = "Target Support Files/Pods-mpaspor/Pods-mpaspor.release.xcconfig"; sourceTree = "<group>"; };
5A7A06AE0711424EA2CC089F /* NotoSans_Condensed-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_Condensed-SemiBold.ttf"; sourceTree = "<group>"; };
5B9C25EB27EB426CA307D054 /* NotoSans-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans-ExtraBoldItalic.ttf"; sourceTree = "<group>"; };
5C1274B686464220BFCBE2D9 /* NotoSans_Condensed-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraBold.ttf"; sourceTree = "<group>"; };
5D5EA710115547F7AF875F2E /* NotoSans_SemiCondensed-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-SemiBold.ttf"; sourceTree = "<group>"; };
5DCACB8F33CDC322A6C60F78 /* libPods-mpaspor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-mpaspor.a"; sourceTree = BUILT_PRODUCTS_DIR; };
5EE0CB7DD07B4E1C9151BE2B /* NotoSans_SemiCondensed-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-BlackItalic.ttf"; sourceTree = "<group>"; };
6A5C5E1ACFF34E758EB6D1F1 /* NotoSans_ExtraCondensed-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-SemiBold.ttf"; sourceTree = "<group>"; };
6D0E0E916D894072B379D1A6 /* NotoSans-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-ExtraLight.ttf"; path = "../assets/fonts/NotoSans-ExtraLight.ttf"; sourceTree = "<group>"; };
71F8BFFE6F5246219F9DC0F7 /* NotoSans_Condensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = mpaspor/AppDelegate.swift; sourceTree = "<group>"; };
76FE0CF9610448C083902876 /* NotoSans_Condensed-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Thin.ttf"; path = "../assets/fonts/NotoSans_Condensed-Thin.ttf"; sourceTree = "<group>"; };
7C676367EB7B413C89B4A665 /* NotoSans_SemiCondensed-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-LightItalic.ttf"; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = mpaspor/LaunchScreen.storyboard; sourceTree = "<group>"; };
869814428B704007B4D0B145 /* NotoSans_Condensed-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-BlackItalic.ttf"; sourceTree = "<group>"; };
89513AF6267E430A82A839F4 /* NotoSans_SemiCondensed-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Light.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Light.ttf"; sourceTree = "<group>"; };
89E495E1B8B1403DBE9B3C18 /* NotoSans-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Italic.ttf"; path = "../assets/fonts/NotoSans-Italic.ttf"; sourceTree = "<group>"; };
8F6B29F0B5B0422F915B82E3 /* NotoSans_SemiCondensed-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraBold.ttf"; sourceTree = "<group>"; };
95EB6F2F20F24550A3DE73F2 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
9675AF4AE623457DA439469F /* NotoSans-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-BoldItalic.ttf"; path = "../assets/fonts/NotoSans-BoldItalic.ttf"; sourceTree = "<group>"; };
9810080F44BB45AF9E271B95 /* NotoSans-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-LightItalic.ttf"; path = "../assets/fonts/NotoSans-LightItalic.ttf"; sourceTree = "<group>"; };
981C1B1736F444ABA63EA8B3 /* NotoSans-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Light.ttf"; path = "../assets/fonts/NotoSans-Light.ttf"; sourceTree = "<group>"; };
99C0037E4ABE4114857454EA /* NotoSans_SemiCondensed-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-MediumItalic.ttf"; sourceTree = "<group>"; };
9A4F5DBEC4C043D399F4AD09 /* NotoSans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
9E1A51AD43A340808D96C36E /* NotoSans_Condensed-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Medium.ttf"; path = "../assets/fonts/NotoSans_Condensed-Medium.ttf"; sourceTree = "<group>"; };
A7B6B69713B7467DA6395064 /* NotoSans_ExtraCondensed-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-MediumItalic.ttf"; sourceTree = "<group>"; };
A7D6B4AB8DB546B58352462D /* NotoSans_Condensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; };
AE17D22089D441AC89F643BD /* NotoSans_ExtraCondensed-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ThinItalic.ttf"; sourceTree = "<group>"; };
AEAD78DC746948D4991E047C /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; };
AFA4940261534AA39B9CD270 /* NotoSans_ExtraCondensed-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Italic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Italic.ttf"; sourceTree = "<group>"; };
B150E7DEFD7F476BA0B11D46 /* NotoSans_SemiCondensed-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Black.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Black.ttf"; sourceTree = "<group>"; };
B1BAB27ADCCE4EAFB01AF108 /* NotoSans_Condensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; };
B46C4579A7CC4F5CB68265EA /* NotoSans_ExtraCondensed-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Thin.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Thin.ttf"; sourceTree = "<group>"; };
B4805B39BE79459DBF47199C /* NotoSans-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-SemiBold.ttf"; path = "../assets/fonts/NotoSans-SemiBold.ttf"; sourceTree = "<group>"; };
BC657944C69C450F8CBDCE65 /* NotoSans-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Medium.ttf"; path = "../assets/fonts/NotoSans-Medium.ttf"; sourceTree = "<group>"; };
C114C3F71AA04B778369EA89 /* NotoSans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Bold.ttf"; path = "../assets/fonts/NotoSans-Bold.ttf"; sourceTree = "<group>"; };
C182B410FF2843ECA3C54FA5 /* NotoSans_SemiCondensed-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-BoldItalic.ttf"; sourceTree = "<group>"; };
C4CE3C41FDC54456A913D28E /* NotoSans_SemiCondensed-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ThinItalic.ttf"; sourceTree = "<group>"; };
C82157C4886244A2A6D7728E /* NotoSans_SemiCondensed-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Thin.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Thin.ttf"; sourceTree = "<group>"; };
CC7766C9F8434BD3AE675547 /* NotoSans_ExtraCondensed-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Medium.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Medium.ttf"; sourceTree = "<group>"; };
CE27CD0F1BD3480B9683B0BB /* NotoSans_Condensed-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Regular.ttf"; path = "../assets/fonts/NotoSans_Condensed-Regular.ttf"; sourceTree = "<group>"; };
D2C29BD9DEE14930930E3881 /* NotoSans_SemiCondensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; };
DD739AD811BA4F2CA5AECED9 /* NotoSans_ExtraCondensed-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Regular.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Regular.ttf"; sourceTree = "<group>"; };
E6EEE80D4B2F47BB8FA78157 /* NotoSans_ExtraCondensed-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-Black.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Black.ttf"; sourceTree = "<group>"; };
E7FC30F8FA1C44A1BDE3461A /* NotoSans_ExtraCondensed-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-BlackItalic.ttf"; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
3E04D39223E34B76B5924912 /* NotoSans-Black.ttf */ = {isa = PBXFileReference; name = "NotoSans-Black.ttf"; path = "../assets/fonts/NotoSans-Black.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
387647589F2E4609A2AAE3D2 /* NotoSans-BlackItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-BlackItalic.ttf"; path = "../assets/fonts/NotoSans-BlackItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
C114C3F71AA04B778369EA89 /* NotoSans-Bold.ttf */ = {isa = PBXFileReference; name = "NotoSans-Bold.ttf"; path = "../assets/fonts/NotoSans-Bold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
9675AF4AE623457DA439469F /* NotoSans-BoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-BoldItalic.ttf"; path = "../assets/fonts/NotoSans-BoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
540C63F381574B83AD80E694 /* NotoSans-ExtraBold.ttf */ = {isa = PBXFileReference; name = "NotoSans-ExtraBold.ttf"; path = "../assets/fonts/NotoSans-ExtraBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
5B9C25EB27EB426CA307D054 /* NotoSans-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans-ExtraBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
6D0E0E916D894072B379D1A6 /* NotoSans-ExtraLight.ttf */ = {isa = PBXFileReference; name = "NotoSans-ExtraLight.ttf"; path = "../assets/fonts/NotoSans-ExtraLight.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
0407698A36C645E89ECEE46A /* NotoSans-ExtraLightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans-ExtraLightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
89E495E1B8B1403DBE9B3C18 /* NotoSans-Italic.ttf */ = {isa = PBXFileReference; name = "NotoSans-Italic.ttf"; path = "../assets/fonts/NotoSans-Italic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
981C1B1736F444ABA63EA8B3 /* NotoSans-Light.ttf */ = {isa = PBXFileReference; name = "NotoSans-Light.ttf"; path = "../assets/fonts/NotoSans-Light.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
9810080F44BB45AF9E271B95 /* NotoSans-LightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-LightItalic.ttf"; path = "../assets/fonts/NotoSans-LightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
BC657944C69C450F8CBDCE65 /* NotoSans-Medium.ttf */ = {isa = PBXFileReference; name = "NotoSans-Medium.ttf"; path = "../assets/fonts/NotoSans-Medium.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
306D5A08D36A4FD3A2D60AA6 /* NotoSans-MediumItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-MediumItalic.ttf"; path = "../assets/fonts/NotoSans-MediumItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
FB70298C3DDE435593072128 /* NotoSans-Regular.ttf */ = {isa = PBXFileReference; name = "NotoSans-Regular.ttf"; path = "../assets/fonts/NotoSans-Regular.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
B4805B39BE79459DBF47199C /* NotoSans-SemiBold.ttf */ = {isa = PBXFileReference; name = "NotoSans-SemiBold.ttf"; path = "../assets/fonts/NotoSans-SemiBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
9A4F5DBEC4C043D399F4AD09 /* NotoSans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans-SemiBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
2BA758DFF5F34ACABB6EE75B /* NotoSans-Thin.ttf */ = {isa = PBXFileReference; name = "NotoSans-Thin.ttf"; path = "../assets/fonts/NotoSans-Thin.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
2B68B3AD2C4C407C91F69A1C /* NotoSans-ThinItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans-ThinItalic.ttf"; path = "../assets/fonts/NotoSans-ThinItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
51B2BAA003544315B3E4617C /* NotoSans_Condensed-Black.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Black.ttf"; path = "../assets/fonts/NotoSans_Condensed-Black.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
869814428B704007B4D0B145 /* NotoSans_Condensed-BlackItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-BlackItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
F7EF8E3D480F4077B28318E6 /* NotoSans_Condensed-Bold.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Bold.ttf"; path = "../assets/fonts/NotoSans_Condensed-Bold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
0070E7DA12E345B9BFDCAEAD /* NotoSans_Condensed-BoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-BoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
5C1274B686464220BFCBE2D9 /* NotoSans_Condensed-ExtraBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
B1BAB27ADCCE4EAFB01AF108 /* NotoSans_Condensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
0C6D6EFE50AF468980A2BA9E /* NotoSans_Condensed-ExtraLight.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraLight.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
A7D6B4AB8DB546B58352462D /* NotoSans_Condensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
1C5321370EBB45AE81411009 /* NotoSans_Condensed-Italic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Italic.ttf"; path = "../assets/fonts/NotoSans_Condensed-Italic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
2E47D868B0184559BDF5E5E9 /* NotoSans_Condensed-Light.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Light.ttf"; path = "../assets/fonts/NotoSans_Condensed-Light.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
296396037F08461E99AF7AFC /* NotoSans_Condensed-LightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-LightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
9E1A51AD43A340808D96C36E /* NotoSans_Condensed-Medium.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Medium.ttf"; path = "../assets/fonts/NotoSans_Condensed-Medium.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
4019D9A927784261B56E8BE1 /* NotoSans_Condensed-MediumItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-MediumItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
CE27CD0F1BD3480B9683B0BB /* NotoSans_Condensed-Regular.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Regular.ttf"; path = "../assets/fonts/NotoSans_Condensed-Regular.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
5A7A06AE0711424EA2CC089F /* NotoSans_Condensed-SemiBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_Condensed-SemiBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
71F8BFFE6F5246219F9DC0F7 /* NotoSans_Condensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
76FE0CF9610448C083902876 /* NotoSans_Condensed-Thin.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-Thin.ttf"; path = "../assets/fonts/NotoSans_Condensed-Thin.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
41D0B635E23947059D1CF2C6 /* NotoSans_Condensed-ThinItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_Condensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_Condensed-ThinItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
E6EEE80D4B2F47BB8FA78157 /* NotoSans_ExtraCondensed-Black.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Black.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Black.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
E7FC30F8FA1C44A1BDE3461A /* NotoSans_ExtraCondensed-BlackItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-BlackItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
2EBFAEEF25AA42BAB9EC869D /* NotoSans_ExtraCondensed-Bold.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Bold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Bold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
2D5B8FBD021A4E7A8BC24C19 /* NotoSans_ExtraCondensed-BoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-BoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
0A1AA61449FA4E698D9EAD0C /* NotoSans_ExtraCondensed-ExtraBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
FDC32FD5C6CE466E8B6950DB /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
F7945520A406472284207CF7 /* NotoSans_ExtraCondensed-ExtraLight.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraLight.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
AEAD78DC746948D4991E047C /* NotoSans_ExtraCondensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
AFA4940261534AA39B9CD270 /* NotoSans_ExtraCondensed-Italic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Italic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Italic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
350B2043EDCF4BAB8870796E /* NotoSans_ExtraCondensed-Light.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Light.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Light.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
1E312E62C57E4916B811AE4A /* NotoSans_ExtraCondensed-LightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-LightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
CC7766C9F8434BD3AE675547 /* NotoSans_ExtraCondensed-Medium.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Medium.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Medium.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
A7B6B69713B7467DA6395064 /* NotoSans_ExtraCondensed-MediumItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-MediumItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
DD739AD811BA4F2CA5AECED9 /* NotoSans_ExtraCondensed-Regular.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Regular.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Regular.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
6A5C5E1ACFF34E758EB6D1F1 /* NotoSans_ExtraCondensed-SemiBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-SemiBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
95EB6F2F20F24550A3DE73F2 /* NotoSans_ExtraCondensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
B46C4579A7CC4F5CB68265EA /* NotoSans_ExtraCondensed-Thin.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-Thin.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-Thin.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
AE17D22089D441AC89F643BD /* NotoSans_ExtraCondensed-ThinItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_ExtraCondensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ThinItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
B150E7DEFD7F476BA0B11D46 /* NotoSans_SemiCondensed-Black.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Black.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Black.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
5EE0CB7DD07B4E1C9151BE2B /* NotoSans_SemiCondensed-BlackItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-BlackItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-BlackItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
20DE3E556C0744C381959A7F /* NotoSans_SemiCondensed-Bold.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Bold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Bold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
C182B410FF2843ECA3C54FA5 /* NotoSans_SemiCondensed-BoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-BoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-BoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
8F6B29F0B5B0422F915B82E3 /* NotoSans_SemiCondensed-ExtraBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-ExtraBold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
0E72669D8E5A4AD2B67FD8B5 /* NotoSans_SemiCondensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
124F2DF781294D1DBDE6C49F /* NotoSans_SemiCondensed-ExtraLight.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraLight.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
D2C29BD9DEE14930930E3881 /* NotoSans_SemiCondensed-ExtraLightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-ExtraLightItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ExtraLightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
457ABC5BB7C0482F8368D513 /* NotoSans_SemiCondensed-Italic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Italic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Italic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
89513AF6267E430A82A839F4 /* NotoSans_SemiCondensed-Light.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Light.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Light.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
7C676367EB7B413C89B4A665 /* NotoSans_SemiCondensed-LightItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-LightItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-LightItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
F5B97FA0433741E1A9BC333B /* NotoSans_SemiCondensed-Medium.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Medium.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Medium.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
99C0037E4ABE4114857454EA /* NotoSans_SemiCondensed-MediumItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-MediumItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-MediumItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
237308FB361841F095D4BC20 /* NotoSans_SemiCondensed-Regular.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Regular.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Regular.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
5D5EA710115547F7AF875F2E /* NotoSans_SemiCondensed-SemiBold.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-SemiBold.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-SemiBold.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
4B86F13B10EA4BD99225227A /* NotoSans_SemiCondensed-SemiBoldItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-SemiBoldItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-SemiBoldItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
C82157C4886244A2A6D7728E /* NotoSans_SemiCondensed-Thin.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-Thin.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Thin.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
C4CE3C41FDC54456A913D28E /* NotoSans_SemiCondensed-ThinItalic.ttf */ = {isa = PBXFileReference; name = "NotoSans_SemiCondensed-ThinItalic.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-ThinItalic.ttf"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
F5B97FA0433741E1A9BC333B /* NotoSans_SemiCondensed-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_SemiCondensed-Medium.ttf"; path = "../assets/fonts/NotoSans_SemiCondensed-Medium.ttf"; sourceTree = "<group>"; };
F7945520A406472284207CF7 /* NotoSans_ExtraCondensed-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-ExtraLight.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraLight.ttf"; sourceTree = "<group>"; };
F7EF8E3D480F4077B28318E6 /* NotoSans_Condensed-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_Condensed-Bold.ttf"; path = "../assets/fonts/NotoSans_Condensed-Bold.ttf"; sourceTree = "<group>"; };
FB70298C3DDE435593072128 /* NotoSans-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans-Regular.ttf"; path = "../assets/fonts/NotoSans-Regular.ttf"; sourceTree = "<group>"; };
FDC32FD5C6CE466E8B6950DB /* NotoSans_ExtraCondensed-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "NotoSans_ExtraCondensed-ExtraBoldItalic.ttf"; path = "../assets/fonts/NotoSans_ExtraCondensed-ExtraBoldItalic.ttf"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -193,76 +183,8 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
00E356F01AD99517003FC87E /* Supporting Files */ = {
isa = PBXGroup;
children = (
00E356F11AD99517003FC87E /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
13B07FAE1A68108700A75B9A /* mpaspor */ = {
isa = PBXGroup;
children = (
13B07FB51A68108700A75B9A /* Images.xcassets */,
761780EC2CA45674006654EE /* AppDelegate.swift */,
13B07FB61A68108700A75B9A /* Info.plist */,
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
);
name = mpaspor;
sourceTree = "<group>";
};
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
isa = PBXGroup;
children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
5DCACB8F33CDC322A6C60F78 /* libPods-mpaspor.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
);
name = Libraries;
sourceTree = "<group>";
};
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
13B07FAE1A68108700A75B9A /* mpaspor */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
BBD78D7AC51CEA395F1C20DB /* Pods */,
083C96CAD0EC48C5B831895C /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
usesTabs = 0;
};
83CBBA001A601CBA00E9B192 /* Products */ = {
isa = PBXGroup;
children = (
13B07F961A680F5B00A75B9A /* mpaspor.app */,
);
name = Products;
sourceTree = "<group>";
};
BBD78D7AC51CEA395F1C20DB /* Pods */ = {
isa = PBXGroup;
children = (
3B4392A12AC88292D35C810B /* Pods-mpaspor.debug.xcconfig */,
5709B34CF0A7D63546082F79 /* Pods-mpaspor.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
083C96CAD0EC48C5B831895C /* Resources */ = {
isa = "PBXGroup";
isa = PBXGroup;
children = (
3E04D39223E34B76B5924912 /* NotoSans-Black.ttf */,
387647589F2E4609A2AAE3D2 /* NotoSans-BlackItalic.ttf */,
@ -338,8 +260,68 @@
C4CE3C41FDC54456A913D28E /* NotoSans_SemiCondensed-ThinItalic.ttf */,
);
name = Resources;
sourceTree = "<group>";
path = "";
sourceTree = "<group>";
};
13B07FAE1A68108700A75B9A /* mpaspor */ = {
isa = PBXGroup;
children = (
13B07FB51A68108700A75B9A /* Images.xcassets */,
761780EC2CA45674006654EE /* AppDelegate.swift */,
13B07FB61A68108700A75B9A /* Info.plist */,
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
);
name = mpaspor;
sourceTree = "<group>";
};
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
isa = PBXGroup;
children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
5DCACB8F33CDC322A6C60F78 /* libPods-mpaspor.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
);
name = Libraries;
sourceTree = "<group>";
};
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
13B07FAE1A68108700A75B9A /* mpaspor */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
BBD78D7AC51CEA395F1C20DB /* Pods */,
083C96CAD0EC48C5B831895C /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
usesTabs = 0;
};
83CBBA001A601CBA00E9B192 /* Products */ = {
isa = PBXGroup;
children = (
13B07F961A680F5B00A75B9A /* mpaspor.app */,
);
name = Products;
sourceTree = "<group>";
};
BBD78D7AC51CEA395F1C20DB /* Pods */ = {
isa = PBXGroup;
children = (
3B4392A12AC88292D35C810B /* Pods-mpaspor.debug.xcconfig */,
5709B34CF0A7D63546082F79 /* Pods-mpaspor.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
@ -397,13 +379,6 @@
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
00E356EC1AD99517003FC87E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
13B07F8E1A680F5B00A75B9A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -482,6 +457,7 @@
A8FB27B3432C4526A458D01D /* NotoSans_SemiCondensed-SemiBoldItalic.ttf in Resources */,
341576DE6218441AB77584B5 /* NotoSans_SemiCondensed-Thin.ttf in Resources */,
C1DC680E57CF4B7190F0A055 /* NotoSans_SemiCondensed-ThinItalic.ttf in Resources */,
8D54BC8445F44CAD0C1809EB /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -573,14 +549,6 @@
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 13B07F861A680F5B00A75B9A /* mpaspor */;
targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
@ -705,7 +673,14 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
USE_HERMES = true;
};
name = Debug;
};
@ -770,7 +745,13 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
name = Release;

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:mpaspor.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

1459
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,9 @@
"test": "jest"
},
"dependencies": {
"@react-native-async-storage/async-storage": "^2.1.2",
"@react-native-async-storage/async-storage": "^2.2.0",
"@react-native-community/datetimepicker": "^8.3.0",
"@react-native-vector-icons/material-design-icons": "^12.0.1",
"@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6",
"@react-navigation/native-stack": "^7.3.10",
@ -32,7 +33,7 @@
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
"@react-native-community/cli": "15.0.1",
"@react-native-community/cli": "^15.0.1",
"@react-native-community/cli-platform-android": "15.0.1",
"@react-native-community/cli-platform-ios": "15.0.1",
"@react-native/babel-preset": "0.78.0",

View File

@ -0,0 +1,53 @@
import React from 'react';
import {StyleSheet, Text, View} from 'react-native';
import {Snackbar} from 'react-native-paper';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import Colors from '../../assets/styles/Colors';
type InfoToastProps = {
visible: boolean;
message: string;
onDismiss: () => void;
duration?: number;
};
const InfoToast = ({
visible,
message,
onDismiss,
duration = 2000,
}: InfoToastProps) => {
return (
<Snackbar
visible={visible}
onDismiss={onDismiss}
duration={duration}
style={styles.snackbar}>
<View style={styles.contentContainer}>
<Icon name="information" size={20} color="white" style={styles.icon} />
<Text style={styles.message}>{message}</Text>
</View>
</Snackbar>
);
};
const styles = StyleSheet.create({
snackbar: {
backgroundColor: Colors.secondary10.color,
borderRadius: 100,
margin: 16,
alignSelf: 'center',
},
contentContainer: {
flexDirection: 'row',
alignItems: 'center',
},
icon: {
marginRight: 8,
},
message: {
color: 'white',
},
});
export default InfoToast;

View File

@ -1,10 +1,14 @@
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import WaitingForPaymentIcon from '../../assets/icons/waiting_for_payment.svg';
import {StyleSheet, Text, View} from 'react-native';
import {Pressable, StyleSheet, Text, View} from 'react-native';
import FontFamily from '../../assets/styles/FontFamily';
import Colors from '../../assets/styles/Colors';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { useNavigation } from '@react-navigation/native';
type PassportAppointmentCardProps = {
navigate(arg0: string): void;
applicantName: string | undefined;
applicantCode: string | undefined;
appointmentDate: string | undefined;
@ -16,6 +20,7 @@ type PassportAppointmentCardProps = {
const renderStatusContent = (status: string | undefined) => {
let backgroundColor;
let IconComponent;
const navigation = useNavigation<PassportAppointmentCardProps>();
switch (status) {
case 'Permohonan Kadaluarsa':
@ -39,9 +44,10 @@ const renderStatusContent = (status: string | undefined) => {
return (
<>
{status === 'Sudah Terbayar' && (
<View style={styles.seeRequirementsWrapper}>
<Pressable style={styles.seeRequirementsWrapper}
onPress={() => navigation.navigate('SeeRequirements')}>
<Text style={styles.appointmentStatusText}>Lihat Persyaratan</Text>
</View>
</Pressable>
)}
<View style={[styles.appointmentStatusWrapper, {backgroundColor}]}>
<IconComponent />

View File

@ -1,25 +1,50 @@
import React from 'react';
import {StyleSheet, Text, View} from 'react-native';
import {StyleSheet, Pressable, Text, View} from 'react-native';
import Colors from '../../assets/styles/Colors';
import FontFamily from '../../assets/styles/FontFamily';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
const StepIndicator = ({currentStep, totalSteps, completedSteps}: any) => {
const StepIndicator = ({
currentStep,
totalSteps,
completedSteps,
onStepPress,
validationStatus,
}: any) => {
return (
<View style={styles.container}>
{[...Array(totalSteps)].map((_, index) => {
const stepNumber = index + 1;
const isCompleted = completedSteps.includes(stepNumber);
const isCurrent = currentStep === stepNumber;
const stepStatus = validationStatus[stepNumber];
const backgroundColor = isCompleted
const backgroundColorStyle =
stepStatus === 'completed'
? Colors.indicatorGreen.color
: stepStatus === 'invalid'
? Colors.indicatorOrange.color
: Colors.neutral100.color;
const indicatorLineBackgroundColorStyle = isCompleted
? Colors.secondary30.color
: Colors.neutral100.color;
const textColor = isCompleted
? Colors.neutral100.color
: isCurrent
? Colors.secondary30.color
: Colors.secondary50.color;
const borderColorStyle =
stepStatus === 'completed'
? Colors.indicatorGreen.color
: stepStatus === 'invalid'
? Colors.indicatorOrange.color
: isCurrent
? Colors.secondary30.color
: Colors.neutral100.color;
const textColorStyle =
isCompleted || stepStatus === 'invalid'
? Colors.neutral100.color
: isCurrent
? Colors.secondary30.color
: Colors.secondary50.color;
const textStyle = isCompleted
? FontFamily.notoSansBold
@ -29,36 +54,53 @@ const StepIndicator = ({currentStep, totalSteps, completedSteps}: any) => {
return (
<React.Fragment key={index}>
<View style={{alignItems: 'center'}}>
<View
style={[
styles.stepIndicatorContainer,
{
backgroundColor: backgroundColor,
borderColor: isCompleted
? Colors.secondary30.color
: Colors.neutral100.color,
},
]}>
<Text
style={{
includeFontPadding: false,
fontSize: 12,
color: textColor,
...textStyle,
}}>
{stepNumber}
</Text>
<Pressable
onPress={() => onStepPress?.(stepNumber)}
style={({pressed}) => ({
transform: [{scale: pressed ? 0.97 : 1}],
})}>
<View style={{alignItems: 'center'}}>
<View
style={[
styles.stepIndicatorContainer,
{
backgroundColor: backgroundColorStyle,
borderColor: borderColorStyle,
},
]}>
{stepStatus === 'completed' ? (
<Icon
name="check"
color={Colors.neutral100.color}
size={16}
/>
) : stepStatus === 'invalid' ? (
<Icon
name="alert-circle"
color={Colors.neutral100.color}
size={16}
/>
) : (
<Text
style={{
includeFontPadding: false,
fontSize: 12,
color: textColorStyle,
...textStyle,
}}>
{stepNumber}
</Text>
)}
</View>
</View>
</View>
</Pressable>
{index < totalSteps - 1 && (
<View
style={[
styles.stepIndicatorLine,
{
backgroundColor: isCompleted
? Colors.secondary30.color
: Colors.neutral100.color,
backgroundColor: indicatorLineBackgroundColorStyle,
},
]}
/>
@ -93,7 +135,7 @@ const styles = StyleSheet.create({
stepIndicatorLine: {
flex: 1,
height: 2,
}
},
});
export default StepIndicator;

View File

@ -7,7 +7,7 @@ import Colors from '../../assets/styles/Colors';
import FontFamily from '../../assets/styles/FontFamily';
import DateTimePicker from '@react-native-community/datetimepicker';
import {useState} from 'react';
import {Dropdown, SelectCountry} from 'react-native-element-dropdown';
import {Dropdown} from 'react-native-element-dropdown';
type DropdownItem = {
label: string;
@ -40,6 +40,10 @@ interface TextInputComponentProps {
isMultiline?: boolean;
isDropdownPressedSheet?: boolean;
handleDropdownPressed?: () => void;
countryValue?: string | null;
setCountryValue?: (country: string) => void;
value?: string;
onChangeText?: (text: string) => void;
}
const TextInputComponent = (props: TextInputComponentProps) => {
@ -61,6 +65,10 @@ const TextInputComponent = (props: TextInputComponentProps) => {
isMultiline = false,
isDropdownPressedSheet = false,
handleDropdownPressed,
countryValue,
setCountryValue,
value,
onChangeText,
} = props;
const [secureText, setSecureText] = useState(isPassword);
@ -68,7 +76,6 @@ const TextInputComponent = (props: TextInputComponentProps) => {
const [formattedDate, setFormattedDate] = useState<string>('');
const [showPicker, setShowPicker] = useState(false);
const [dropdownValue, setDropdownValue] = useState(null);
const [country, setCountry] = useState<string | null>(null);
const [searchQuery, setSearchQuery] = useState('');
const filteredItems = dropdownCountryItemData?.filter(item =>
@ -94,6 +101,7 @@ const TextInputComponent = (props: TextInputComponentProps) => {
date.getMonth() + 1,
).padStart(2, '0')}/${date.getFullYear()}`;
setFormattedDate(formatted);
onChangeText?.(formatted);
}
};
@ -118,7 +126,9 @@ const TextInputComponent = (props: TextInputComponentProps) => {
};
const renderLeftIcon = () => {
const selectedItem = filteredItems?.find(item => item.value === country);
const selectedItem = filteredItems?.find(
item => item.value === countryValue,
);
if (!selectedItem?.image?.uri) return null;
return (
@ -184,7 +194,10 @@ const TextInputComponent = (props: TextInputComponentProps) => {
)}
</View>
<Dropdown
style={[styles.dropdown, isDisabled && styles.outlineColorDisabled]}
style={[
styles.dropdown,
isDisabled && styles.outlineColorDisabledDropdown,
]}
placeholderStyle={styles.placeholderDropdownStyle}
selectedTextStyle={styles.selectedTextStyle}
iconStyle={styles.iconStyle}
@ -196,6 +209,7 @@ const TextInputComponent = (props: TextInputComponentProps) => {
value={dropdownValue}
onChange={item => {
setDropdownValue(item.value);
onChangeText?.(item.value);
}}
disable={isDisabled}
renderRightIcon={() => <Icon name="arrow-drop-down" size={20} />}
@ -253,7 +267,10 @@ const TextInputComponent = (props: TextInputComponentProps) => {
</View>
)}
<Dropdown
style={[styles.dropdown, isDisabled && styles.outlineColorDisabled]}
style={[
styles.dropdown,
isDisabled && styles.outlineColorDisabledDropdown,
]}
selectedTextStyle={styles.selectedTextStyle}
placeholderStyle={styles.placeholderDropdownStyle}
inputSearchStyle={styles.inputSearchStyle}
@ -263,14 +280,16 @@ const TextInputComponent = (props: TextInputComponentProps) => {
renderInputSearch={() =>
renderInputSearch(searchQuery, setSearchQuery)
}
value={country}
value={countryValue}
data={filteredItems ?? []}
valueField="value"
labelField="label"
placeholder={placeholder}
searchPlaceholder="Cari"
onChange={item => {
setCountry(item.value);
if (setCountryValue) {
setCountryValue(item.value);
}
}}
disable={isDisabled}
renderRightIcon={() => <Icon name="arrow-drop-down" size={20} />}
@ -298,11 +317,15 @@ const TextInputComponent = (props: TextInputComponentProps) => {
<TextInput
mode="outlined"
placeholder={placeholder}
style={[inputStyle, isDisabled && styles.outlineColorDisabled]}
style={[
inputStyle,
isDisabled && styles.outlineColorDisabledDropdown,
]}
theme={{roundness: 12}}
placeholderTextColor={Colors.primary60.color}
editable={false}
value={formattedDate}
value={value}
onChangeText={onChangeText}
right={
<TextInput.Icon
icon="menu-down"
@ -348,6 +371,8 @@ const TextInputComponent = (props: TextInputComponentProps) => {
}
multiline={isMultiline}
textColor="#48454E"
value={value}
onChangeText={onChangeText}
/>
{supportText && <Text style={[styles.supportText]}>{supportText}</Text>}
</View>
@ -442,6 +467,13 @@ const styles = StyleSheet.create({
borderRadius: 12,
borderColor: '#e3e3e5',
},
outlineColorDisabledDropdown: {
height: 58,
backgroundColor: '#F8F9FE',
borderWidth: 1,
borderRadius: 12,
borderColor: '#e3e3e5',
},
imageCountryStyle: {
width: 32,
height: 20,

View File

@ -17,9 +17,13 @@ const DialogLogout = (props: DialogLogoutProps) => {
<Portal>
<Dialog visible={visible} style={styles.container}>
<Dialog.Title style={styles.title}>
Apakah Anda yakin akan menutup akun?
Apakah Anda ingin keluar dari akun?
</Dialog.Title>
<View style={styles.content}>
<Text style={styles.desc}>
Anda akan keluar dari akun M-Paspor yang sekarang dan akan diarahkan
menuju halaman login.
</Text>
<Button
style={styles.buttonContained}
mode="contained"
@ -28,16 +32,16 @@ const DialogLogout = (props: DialogLogoutProps) => {
hideDialog();
onNavigate();
}}>
Ya, lanjut tutup akun
Ya, Lanjut Keluar Akun
</Button>
<Button
style={styles.buttonOutlined}
mode="outlined"
textColor={Colors.indicatorRed.color}
textColor={Colors.primary30.color}
onPress={() => {
hideDialog();
}}>
Tidak, jangan tutup akun
Tidak, Jangan Keluar
</Button>
</View>
</Dialog>
@ -56,7 +60,14 @@ const styles = StyleSheet.create({
},
title: {
fontSize: 22,
color: Colors.indicatorRed.color,
color: Colors.secondary30.color,
},
desc: {
fontSize: 14,
...FontFamily.notoSansRegular,
includeFontPadding: false,
lineHeight: 22,
color: Colors.primary30.color,
},
content: {
marginHorizontal: 24,
@ -71,9 +82,9 @@ const styles = StyleSheet.create({
color: Colors.primary30.color,
},
buttonContained: {
backgroundColor: Colors.indicatorRed.color,
backgroundColor: Colors.primary30.color,
},
buttonOutlined: {
borderColor: Colors.indicatorRed.color,
borderColor: Colors.primary30.color,
},
});

View File

@ -1,9 +1,4 @@
const countryData = [
{
value: '1',
label: 'Indonesia',
image: {uri: 'https://flagcdn.com/w320/id.png'},
},
{
value: '2',
label: 'United States',

View File

@ -101,26 +101,6 @@ const passportAppointmentData = [
},
{
id: '6',
applicantName: 'Nabila Khairunisa',
applicantCode: '1038000007773344',
appointmentDate: 'Rabu, 19 April 2025',
appointmentTime: '13:00 - 14:00 WIB',
serviceUnit: 'Kantor Imigrasi Bekasi',
status: 'Menunggu Pembayaran',
submissionDate: 'Senin, 14 April 2025 23:45',
serviceCode: 'EH-MK2YPQ',
applicationDetails: {
nationalIdNumber: '3271234560009120007',
gender: 'Wanita',
applicationType: 'Penggantian Paspor',
replacementReason: 'Hilang',
applicationPurpose: 'Kuliah di Luar Negeri',
passportType: 'PASPOR BIASA ELEKTRONIK 5 TAHUN',
fee: '650.000',
},
},
{
id: '7',
applicantName: 'Ayaka Haishima',
applicantCode: '1038000008885566',
appointmentDate: 'Selasa, 18 April 2025',
@ -139,6 +119,26 @@ const passportAppointmentData = [
fee: '350.000',
},
},
{
id: '7',
applicantName: 'Nabila Khairunisa',
applicantCode: '1038000007773344',
appointmentDate: 'Rabu, 19 April 2025',
appointmentTime: '13:00 - 14:00 WIB',
serviceUnit: 'Kantor Imigrasi Bekasi',
status: 'Menunggu Pembayaran',
submissionDate: 'Senin, 14 April 2025 23:45',
serviceCode: 'EH-MK2YPQ',
applicationDetails: {
nationalIdNumber: '3271234560009120007',
gender: 'Wanita',
applicationType: 'Penggantian Paspor',
replacementReason: 'Hilang',
applicationPurpose: 'Kuliah di Luar Negeri',
passportType: 'PASPOR BIASA ELEKTRONIK 5 TAHUN',
fee: '650.000',
},
},
];
export default passportAppointmentData;

View File

@ -25,8 +25,19 @@ function AccountVerificationScreen() {
const navigation = useNavigation<AccountVerificationScreenNavigationProp>();
const [otp, setOtp] = useState(Array(6).fill(''));
const [counter, setCounter] = useState(10);
const inputRefs = useRef<TextInput[]>([]);
useEffect(() => {
if (counter > 0) {
const timer = setTimeout(() => {
setCounter(counter - 1);
}, 1000);
return () => clearTimeout(timer);
}
}, [counter]);
const handleChange = (text: string, index: number) => {
const newOtp = [...otp];
newOtp[index] = text;
@ -87,10 +98,22 @@ function AccountVerificationScreen() {
))}
</View>
<Text style={styles.OTPTimeText}>
Kirim ulang kode OTP dalam 10 detik
Kirim ulang kode OTP dalam <Text>{counter}</Text> detik
</Text>
</View>
<Text style={styles.sendOTPText}>Kirim Ulang Kode OTP</Text>
<Pressable
disabled={counter !== 0 ? true : false}
onPress={() => setCounter(10)}
style={({pressed}) => ({
transform: [{scale: pressed ? 0.95 : 1}],
})}>
<Text
style={
counter !== 0 ? styles.sendOTPTextDisabled : styles.sendOTPText
}>
Kirim Ulang Kode OTP
</Text>
</Pressable>
<Button
mode="contained"
style={styles.accountVerificationButton}

View File

@ -46,6 +46,14 @@ const styles = StyleSheet.create({
...FontFamily.notoSansSemiBold,
fontSize: 12,
},
sendOTPTextDisabled: {
marginTop: 40,
marginHorizontal: 16,
textAlign: 'center',
color: Colors.neutral70.color,
...FontFamily.notoSansSemiBold,
fontSize: 12,
},
accountVerificationButton: {
marginHorizontal: 16,
marginTop: 16,

View File

@ -67,7 +67,7 @@ function HistoryScreen() {
return (
<View style={styles.container}>
{showNavBackAppBar ? (
{showNavBackAppBar ? (
<View style={styles.appBarNavBackContainer}>
<Icon
name="arrow-left"

View File

@ -242,8 +242,9 @@ const RenderContent = ({
appointmentDate={item.appointmentDate}
appointmentTime={item.appointmentTime}
serviceUnit={item.serviceUnit}
status={item.status}
/>
status={item.status} navigate={function (arg0: string): void {
throw new Error('Function not implemented.');
} } />
</Pressable>
)}
keyExtractor={item => item.id ?? ''}
@ -300,7 +301,7 @@ function HomeScreen(props: HomeScreenProps) {
<View style={styles.container}>
<View style={styles.appBarContainer}>
<Text style={styles.appBarTitle} numberOfLines={1} ellipsizeMode="tail">
Halo, Salwa Aisyah Adhani!
Halo, Salwa!
</Text>
<Icon
name="bell-outline"

View File

@ -59,7 +59,7 @@ const styles = StyleSheet.create({
},
serviceOptionContainer: {
alignItems: 'center',
marginHorizontal: 12,
marginHorizontal: 4,
},
serviceIcon: {
padding: 8,
@ -67,9 +67,9 @@ const styles = StyleSheet.create({
borderRadius: 4,
},
serviceDesc: {
width: 60,
maxWidth: 75,
textAlign: 'center',
fontSize: 10,
fontSize: 12,
marginTop: 8,
color: Colors.primary30.color,
...FontFamily.notoSansRegular,

View File

@ -10,13 +10,14 @@ import {
import styles from './styles';
import {Button} from 'react-native-paper';
import TextInputComponent from '../../components/TextInput';
import Icon from 'react-native-vector-icons/MaterialIcons';
import {useNavigation} from '@react-navigation/native';
import {NativeStackNavigationProp} from '@react-navigation/native-stack';
import {PassportAppointment, RootStackParamList} from '../../navigation/type';
import Colors from '../../../assets/styles/Colors';
import {getData, storeData} from '../../helper/asyncStorageHelper';
import passportAppointmentData from '../../data/History/PassportAppointmentData';
import Icon from 'react-native-vector-icons/MaterialIcons';
import MDIcons from 'react-native-vector-icons/MaterialCommunityIcons';
type LoginScreenNavigationProp = NativeStackNavigationProp<
RootStackParamList,
@ -24,7 +25,7 @@ type LoginScreenNavigationProp = NativeStackNavigationProp<
>;
function LoginScreen() {
const welcomeImage = require('../../../assets/images/welcomeImage.png');
const welcomeImage = require('../../../assets/images/welcome-image.jpg');
const navigation = useNavigation<LoginScreenNavigationProp>();
return (
@ -75,11 +76,11 @@ function LoginScreen() {
onPress={() => navigation.navigate('TermsAndConditions')}
style={({pressed}) => [{transform: [{scale: pressed ? 0.975 : 1}]}]}>
<View style={styles.termsAndConditionsContainer}>
<Icon
name="person"
<MDIcons
name="information-outline"
size={20}
color="#000"
style={styles.personIcon}
color="#237D96"
style={styles.informationIcon}
/>
<View style={styles.termsAndConditionsTextContainer}>
<Text style={styles.termsAndConditionsTitle}>

View File

@ -84,7 +84,7 @@ const styles = StyleSheet.create({
arrowRightIcon: {
marginRight: 20,
},
personIcon: {
informationIcon: {
marginLeft: 20,
},
});

View File

@ -29,18 +29,18 @@ function NavigationRouteScreen() {
const [routes] = useState([
{
key: 'home',
title: 'Home',
title: 'Beranda',
focusedIcon: 'home',
unfocusedIcon: 'home-outline',
},
{
key: 'history',
title: 'History',
title: 'Riwayat',
focusedIcon: 'history',
},
{
key: 'profile',
title: 'Profile',
title: 'Profil',
focusedIcon: 'account-circle',
unfocusedIcon: 'account-circle-outline',
},

View File

@ -1,41 +1,21 @@
import React, {useEffect, useState} from 'react';
import {BackHandler, StatusBar, Text, View} from 'react-native';
import styles from './styles';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
// React & React Native Core
import React, {RefObject, useEffect, useRef, useState} from 'react';
import {BackHandler, StatusBar, Text, ToastAndroid, View} from 'react-native';
// React Navigation
import {useNavigation} from '@react-navigation/native';
import Colors from '../../../assets/styles/Colors';
import RadioButtonOptionComponent from '../../components/RadioButtonOption';
import {RootStackParamList} from '../../navigation/type';
import {NativeStackNavigationProp} from '@react-navigation/native-stack';
// Third-Party Libraries
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import {PaperProvider} from 'react-native-paper';
// Components
import StepIndicator from '../../components/StepIndicator';
import RadioButtonOptionComponent from '../../components/RadioButtonOption';
import DialogApplicationPassport from '../../components/dialog/DialogApplicationPassport';
import DialogDontHaveYetPassport from '../../components/dialog/DialogDontHaveYetPassport';
import DialogLostOrDamagedPassport from '../../components/dialog/DialogLostOrDamagedPassport';
import passportAppointmentData from '../../data/History/PassportAppointmentData';
import Step7Completion from './steps/Step7Completion/Step7Completion';
import Step6Processing from './steps/Step6Processing/Step6Processing';
import Step5Verification from './steps/Step5Verification/Step5Verification';
import Step3Payment from './steps/Step3Payment/Step3Payment';
// Options Data
import passportForOptions from '../../data/Options/PassportForOptions';
import Step4DataConfirmationSubStep2 from './steps/Step4DataConfirmation/Step4DataConfirmationSubStep2';
import Step4DataConfirmationSubStep1 from './steps/Step4DataConfirmation/Step4DataConfirmationSubStep1';
import Step1PersonalInfoSubStep1 from './steps/Step1PersonalInfo/Step1PersonalInfoSubStep1';
import Step1PersonalInfoSubStep2 from './steps/Step1PersonalInfo/Step1PersonalInfoSubStep2';
import Step1PersonalInfoSubStep3 from './steps/Step1PersonalInfo/Step1PersonalInfoSubStep3';
import Step2SupportingDocsSubStep1 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep1';
import Step2SupportingDocsSubStep2 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep2';
import Step2SupportingDocsSubStep3 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep3';
import Step2SupportingDocsSubStep4 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep4';
import Step2SupportingDocsSubStep5 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep5';
import Step2SupportingDocsSubStep6 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep6';
import Step2SupportingDocsSubStep7 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep7';
import Step2SupportingDocsSubStep8 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep8';
import Step2SupportingDocsSubStep9 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep9';
import Step2SupportingDocsSubStep10 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep10';
import Step2SupportingDocsSubStep11 from './steps/Step2SupportingDocs/Step2SupportingDocsSubStep11';
import DialogCivilStatusDocumentsInfo from '../../components/dialog/DialogCivilStatusDocumentsInfo';
import DialogSubmitSuccess from '../../components/dialog/DialogSubmitSuccess';
import DialogFinalizationConfirmation from '../../components/dialog/DialogFinalizationConfirmation';
@ -45,12 +25,51 @@ import SheetEditData from '../../components/sheet/SheetEditData';
import SheetSearchLocation from '../../components/sheet/SheetSearchLocation';
import SheetSelectDate from '../../components/sheet/SheetSelectDate';
// Steps - Step Screens
import Step1VerifyNikSubStep1 from './steps/Step1VerifyNik/Step1VerifyNikSubStep1';
import Step1VerifyNikSubStep2 from './steps/Step1VerifyNik/Step1VerifyNikSubStep2';
import Step1VerifyNikSubStep3 from './steps/Step1VerifyNik/Step1VerifyNikSubStep3';
import Step2PassportApplicationQuestionnaireSubStep1 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep1';
import Step2PassportApplicationQuestionnaireSubStep2 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep2';
import Step2PassportApplicationQuestionnaireSubStep3 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep3';
import Step2PassportApplicationQuestionnaireSubStep4 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep4';
import Step2PassportApplicationQuestionnaireSubStep5 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep5';
import Step2PassportApplicationQuestionnaireSubStep6 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep6';
import Step2PassportApplicationQuestionnaireSubStep7 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep7';
import Step2PassportApplicationQuestionnaireSubStep8 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep8';
import Step2PassportApplicationQuestionnaireSubStep9 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep9';
import Step2PassportApplicationQuestionnaireSubStep10 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep10';
import Step2PassportApplicationQuestionnaireSubStep11 from './steps/Step2PassportApplicationQuestionnaire/Step2PassportApplicationQuestionnaireSubStep11';
import Step3UploadDocuments from './steps/Step3UploadDocuments/Step3UploadDocuments';
import Step4ApplicantAdditionalDataSubStep1 from './steps/Step4ApplicantAdditionalData/Step4ApplicantAdditionalDataSubStep1';
import Step4ApplicantAdditionalDataSubStep2 from './steps/Step4ApplicantAdditionalData/Step4ApplicantAdditionalDataSubStep2';
import Step5ApplicationTypeAndApplicantData from './steps/Step5ApplicationTypeAndApplicantData/Step5ApplicationTypeAndApplicantData';
import Step6ApplicationTypeAndApplicantData from './steps/Step6ApplicationTypeAndApplicantData/Step6ApplicationTypeAndApplicantData';
import Step7ApplicationFeeDetails from './steps/Step7ApplicationFeeDetails/Step7ApplicationFeeDetails';
// Navigation
import {RootStackParamList} from '../../navigation/type';
// Types
import {
StepValidationStatus,
StepValidationStatusSetter,
} from '../../../types/step';
// Data & Styles
import passportForOptions from '../../data/Options/PassportForOptions';
import Colors from '../../../assets/styles/Colors';
import styles from './styles';
import {changeStep} from '../../utils/stepNavigation';
import InfoToast from '../../components/InfoToast';
type RegularPassportScreenNavigationProp = NativeStackNavigationProp<
RootStackParamList,
'RegularPassport'
>;
type RenderApplicationStepsContentProps = {
navigation: any;
step: number;
subStep: number;
setStep: (step: number) => void;
@ -72,12 +91,18 @@ type RenderApplicationStepsContentProps = {
showEditDataSheet: () => void;
showSearchLocationSheet: () => void;
showSelectDateSheet: () => void;
selectedDestinationCountryOption: string;
setSelectedDestinationCountryOption: (val: string) => void;
stepValidationStatus: StepValidationStatus;
setStepValidationStatus: StepValidationStatusSetter;
editedCompletedRef: RefObject<Set<number>>;
};
const RenderApplicationStepsContent = (
props: RenderApplicationStepsContentProps,
) => {
const {
navigation,
step,
subStep,
setStep,
@ -86,6 +111,8 @@ const RenderApplicationStepsContent = (
setSelectedOption,
selectedPassportOption,
setSelectedPassportOption,
selectedDestinationCountryOption,
setSelectedDestinationCountryOption,
checkedOption,
setCheckedOption,
showDontHaveYetDialog,
@ -99,19 +126,30 @@ const RenderApplicationStepsContent = (
showEditDataSheet,
showSearchLocationSheet,
showSelectDateSheet,
setStepValidationStatus,
editedCompletedRef,
} = props;
if (step === 1) {
switch (subStep) {
case 1:
return <Step1PersonalInfoSubStep1 setSubStep={setSubStep} />;
return <Step1VerifyNikSubStep1 setSubStep={setSubStep} />;
case 2:
return <Step1PersonalInfoSubStep2 setSubStep={setSubStep} />;
return <Step1VerifyNikSubStep2 setSubStep={setSubStep} />;
case 3:
return (
<Step1PersonalInfoSubStep3
<Step1VerifyNikSubStep3
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
onSubStepValidation={isValid => {
setStepValidationStatus(prev => ({
...prev,
1: isValid ? 'completed' : 'invalid',
}));
}}
editedCompletedRef={editedCompletedRef}
/>
);
default:
@ -123,17 +161,20 @@ const RenderApplicationStepsContent = (
switch (subStep) {
case 1:
return (
<Step2SupportingDocsSubStep1
<Step2PassportApplicationQuestionnaireSubStep1
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
selectedPassportOption={selectedPassportOption}
setSelectedPassportOption={setSelectedPassportOption}
showDontHaveYetDialog={showDontHaveYetDialog}
editedCompletedRef={editedCompletedRef}
/>
);
case 2:
return (
<Step2SupportingDocsSubStep2
<Step2PassportApplicationQuestionnaireSubStep2
setSubStep={setSubStep}
selectedOption={selectedOption}
setSelectedOption={setSelectedOption}
@ -142,46 +183,89 @@ const RenderApplicationStepsContent = (
/>
);
case 3:
return <Step2SupportingDocsSubStep3 setSubStep={setSubStep} />;
return (
<Step2PassportApplicationQuestionnaireSubStep3
setSubStep={setSubStep}
/>
);
case 4:
return <Step2SupportingDocsSubStep4 setSubStep={setSubStep} />;
return (
<Step2PassportApplicationQuestionnaireSubStep4
setSubStep={setSubStep}
/>
);
case 5:
return <Step2SupportingDocsSubStep5 setSubStep={setSubStep} />;
return (
<Step2PassportApplicationQuestionnaireSubStep5
setSubStep={setSubStep}
/>
);
case 6:
return (
<Step2SupportingDocsSubStep6
<Step2PassportApplicationQuestionnaireSubStep6
setSubStep={setSubStep}
selectedOption={selectedOption}
setSelectedOption={setSelectedOption}
selectedPassportOption={selectedPassportOption}
/>
);
case 7:
return (
<Step2SupportingDocsSubStep7
<Step2PassportApplicationQuestionnaireSubStep7
setSubStep={setSubStep}
selectedOption={selectedOption}
setSelectedOption={setSelectedOption}
selectedDestinationCountryOption={selectedDestinationCountryOption}
setSelectedDestinationCountryOption={
setSelectedDestinationCountryOption
}
/>
);
case 8:
return <Step2SupportingDocsSubStep8 setSubStep={setSubStep} />;
return (
<Step2PassportApplicationQuestionnaireSubStep8
setSubStep={setSubStep}
/>
);
case 9:
return (
<Step2SupportingDocsSubStep9
<Step2PassportApplicationQuestionnaireSubStep9
setSubStep={setSubStep}
selectedOption={selectedOption}
setSelectedOption={setSelectedOption}
/>
);
case 10:
return <Step2SupportingDocsSubStep10 setSubStep={setSubStep} />;
case 11:
return (
<Step2SupportingDocsSubStep11
<Step2PassportApplicationQuestionnaireSubStep10
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
selectedDestinationCountryOption={selectedDestinationCountryOption}
onSubStepValidation={isValid => {
setStepValidationStatus(prev => ({
...prev,
2: isValid ? 'completed' : 'invalid',
}));
}}
editedCompletedRef={editedCompletedRef}
/>
);
case 11:
return (
<Step2PassportApplicationQuestionnaireSubStep11
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
selectedOption={selectedOption}
setSelectedOption={setSelectedOption}
onSubStepValidation={isValid => {
setStepValidationStatus(prev => ({
...prev,
2: isValid ? 'completed' : 'invalid',
}));
}}
editedCompletedRef={editedCompletedRef}
/>
);
default:
@ -193,18 +277,30 @@ const RenderApplicationStepsContent = (
switch (subStep) {
case 1:
return (
<Step4DataConfirmationSubStep1
<Step4ApplicantAdditionalDataSubStep1
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
checkedOption={checkedOption}
setCheckedOption={setCheckedOption}
editedCompletedRef={editedCompletedRef}
/>
);
case 2:
return (
<Step4DataConfirmationSubStep2
<Step4ApplicantAdditionalDataSubStep2
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
onSubStepValidation={isValid => {
setStepValidationStatus(prev => ({
...prev,
4: isValid ? 'completed' : 'invalid',
}));
}}
editedCompletedRef={editedCompletedRef}
/>
);
}
@ -212,27 +308,42 @@ const RenderApplicationStepsContent = (
switch (step) {
case 3:
return (
<Step3Payment
<Step3UploadDocuments
step={step}
setStep={setStep}
setSubStep={setSubStep}
setStepValidationStatus={setStepValidationStatus}
selectedPassportOption={selectedPassportOption}
showCivilStatusDocumentsInfoDialog={
showCivilStatusDocumentsInfoDialog
}
selectedDestinationCountryOption={selectedDestinationCountryOption}
onSubStepValidation={isValid => {
setStepValidationStatus(prev => ({
...prev,
3: isValid ? 'completed' : 'invalid',
}));
}}
editedCompletedRef={editedCompletedRef}
/>
);
case 5:
return (
<Step5Verification
<Step5ApplicationTypeAndApplicantData
setStep={setStep}
setSubStep={setSubStep}
passportAppointmentData={passportAppointmentData}
showEditDataSheet={showEditDataSheet}
navigation={navigation}
onSubStepValidation={() => {
setStepValidationStatus(prev => ({
...prev,
5: 'completed',
}));
}}
/>
);
case 6:
return (
<Step6Processing
<Step6ApplicationTypeAndApplicantData
showFinalizationConfirmationDialog={
showFinalizationConfirmationDialog
}
@ -243,9 +354,15 @@ const RenderApplicationStepsContent = (
);
case 7:
return (
<Step7Completion
<Step7ApplicationFeeDetails
showSubmitSuccessDialog={showSubmitSuccessDialog}
setLastCompletedSteps={setLastCompletedSteps}
onSubStepValidation={() => {
setStepValidationStatus(prev => ({
...prev,
7: 'completed',
}));
}}
/>
);
default:
@ -304,15 +421,36 @@ function RegularPassportScreen() {
// State management
const [selectedOption, setSelectedOption] = useState('');
const [selectedPassportOption, setSelectedPassportOption] = useState('');
const [
selectedDestinationCountryOption,
setSelectedDestinationCountryOption,
] = useState('');
const [checkedOption, setCheckedOption] = useState(false);
const [showApplicationStepsContent, setShowApplicationStepsContent] =
useState(false);
const [toastVisible, setToastVisible] = useState(false);
const [toastMessage, setToastMessage] = useState('');
const [step, setStep] = useState(1);
const [subStep, setSubStep] = useState(1);
const [completedSteps, setCompletedSteps] = useState<number[]>(
[...Array(step - 1)].map((_, i) => i + 1),
);
// Step status states
const [stepValidationStatus, setStepValidationStatus] = useState<{
[key: number]: 'completed' | 'incomplete' | 'invalid';
}>({
1: 'incomplete',
2: 'incomplete',
3: 'incomplete',
4: 'incomplete',
5: 'incomplete',
6: 'incomplete',
7: 'incomplete',
});
// Dialog visibility states
const [visible, setVisible] = useState(false);
const [visibleDontHaveYetDialog, setVisibleDontHaveYetDialog] =
@ -385,14 +523,27 @@ function RegularPassportScreen() {
const showSelectDateSheet = () => setVisibleSelectDateSheet(true);
const hideSelectDateSheet = () => setVisibleSelectDateSheet(false);
const editedCompletedRef = useRef<Set<number>>(new Set());
const stepTitles: {[key: number]: string} = {
1: 'Informasi Pribadi',
2: 'Dokumen Pendukung',
3: 'Pembayaran',
4: 'Konfirmasi Data',
5: 'Verifikasi',
6: 'Pemrosesan',
7: 'Selesai',
1: 'Verifikasi NIK',
2: 'Kuesioner Permohonan Paspor (PERDIM)',
3: 'Unggah Dokumen',
4: 'Data Tambahan Pemohon',
5: 'Jenis Permohonan dan Data Pemohon',
6: 'Jenis Permohonan dan Data Pemohon',
7: 'Rincian Biaya Permohonan',
};
const getStepTitle = (step: number, subStep: number) => {
if (step === 4) {
if (subStep === 1) {
return 'Data Tambahan Pemohon (1/2)';
} else if (subStep === 2) {
return 'Data Tambahan Pemohon (2/2)';
}
}
return stepTitles[step];
};
// Back handler for showing/hiding steps content
@ -430,17 +581,49 @@ function RegularPassportScreen() {
});
};
const showInfoToast = (msg: string) => {
setToastMessage(msg);
setToastVisible(true);
};
// Render steps or questionnaire
const renderApplicationStepsContent = showApplicationStepsContent ? (
<>
<View style={styles.applicationStepsContainer}>
<Text style={styles.stepTitle}>{stepTitles[step]}</Text>
<Text style={styles.stepTitle}>{getStepTitle(step, subStep)}</Text>
<StepIndicator
currentStep={step}
totalSteps={7}
completedSteps={completedSteps}
validationStatus={stepValidationStatus}
onStepPress={(targetStep: number) => {
const isCurrentStep7 = step === 7;
const isTargetStepIn1to6 = targetStep >= 1 && targetStep <= 6;
const toastMessage = isCurrentStep7
? 'Tak dapat kembali langkah terakhir.'
: !isTargetStepIn1to6
? 'Lengkapi langkah 1 6 dulu'
: null;
if (toastMessage) {
showInfoToast(toastMessage);
return;
}
changeStep({
currentStep: step,
targetStep: targetStep,
setStep,
setSubStep: () => setSubStep(1),
setStepValidationStatus,
editedCompletedRef,
});
}}
/>
<RenderApplicationStepsContent
navigation={navigation}
step={step}
subStep={subStep}
setStep={setStep}
@ -449,6 +632,10 @@ function RegularPassportScreen() {
setSelectedOption={setSelectedOption}
selectedPassportOption={selectedPassportOption}
setSelectedPassportOption={setSelectedPassportOption}
selectedDestinationCountryOption={selectedDestinationCountryOption}
setSelectedDestinationCountryOption={
setSelectedDestinationCountryOption
}
checkedOption={checkedOption}
setCheckedOption={setCheckedOption}
showDontHaveYetDialog={showDontHaveYetDialog}
@ -466,6 +653,9 @@ function RegularPassportScreen() {
showEditDataSheet={showEditDataSheet}
showSearchLocationSheet={showSearchLocationSheet}
showSelectDateSheet={showSelectDateSheet}
stepValidationStatus={stepValidationStatus}
setStepValidationStatus={setStepValidationStatus}
editedCompletedRef={editedCompletedRef}
/>
</View>
@ -473,7 +663,7 @@ function RegularPassportScreen() {
<DialogDontHaveYetPassport
visible={visibleDontHaveYetDialog}
onClose={hideDontHaveYetDialog}
onContinue={() => setSubStep(2)}
onContinue={() => setSubStep(6)}
/>
)}
@ -524,7 +714,19 @@ function RegularPassportScreen() {
visible={visibleFinalizationConfirmationDialog}
onClose={hideFinalizationConfirmationDialog}
onContinue={() => {
setStep(7);
setStepValidationStatus(prev => ({
...prev,
6: 'completed',
}));
const canProceedToStep7 = [1, 2, 3, 4, 5, 6].every(
s => stepValidationStatus[s] === 'completed',
);
!canProceedToStep7
? showInfoToast('Lengkapi semua langkah terlebih dahulu.')
: setStep(7);
hideFinalizationConfirmationDialog();
}}
/>
@ -605,6 +807,11 @@ function RegularPassportScreen() {
setShowApplicationStepsContent(true);
}}
/>
<InfoToast
visible={toastVisible}
message={toastMessage}
onDismiss={() => setToastVisible(false)}
/>
</PaperProvider>
</View>
);

View File

@ -4,13 +4,13 @@ import {Button} from 'react-native-paper';
import styles from '../styles';
import Colors from '../../../../../assets/styles/Colors';
type Step1PersonalInfoSubStep1Props = {
type Step1VerifyNikSubStep1Props = {
setSubStep: (val: number) => void;
};
const Step1PersonalInfoSubStep1 = ({
const Step1VerifyNikSubStep1 = ({
setSubStep,
}: Step1PersonalInfoSubStep1Props) => {
}: Step1VerifyNikSubStep1Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
@ -51,4 +51,4 @@ const Step1PersonalInfoSubStep1 = ({
);
};
export default Step1PersonalInfoSubStep1;
export default Step1VerifyNikSubStep1;

View File

@ -4,13 +4,13 @@ import {Button} from 'react-native-paper';
import styles from '../styles';
import Colors from '../../../../../assets/styles/Colors';
type Step1PersonalInfoSubStep2Props = {
type Step1VerifyNikSubStep2Props = {
setSubStep: (val: number) => void;
};
const Step1PersonalInfoSubStep2 = ({
const Step1VerifyNikSubStep2 = ({
setSubStep,
}: Step1PersonalInfoSubStep2Props) => {
}: Step1VerifyNikSubStep2Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
@ -45,4 +45,4 @@ const Step1PersonalInfoSubStep2 = ({
);
};
export default Step1PersonalInfoSubStep2;
export default Step1VerifyNikSubStep2;

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, {RefObject, useState} from 'react';
import {ScrollView, View} from 'react-native';
import {Button} from 'react-native-paper';
import styles from '../styles';
@ -6,16 +6,56 @@ import TextInputComponent from '../../../../components/TextInput';
import genderData from '../../../../data/DropdownData/GenderData';
import civilStatusData from '../../../../data/DropdownData/CivilStatusData';
import Colors from '../../../../../assets/styles/Colors';
import {changeStep} from '../../../../utils/stepNavigation';
import {StepValidationStatusSetter} from '../../../../../types/step';
type Step1PersonalInfoSubStep3Props = {
type Step1VerifyNikSubStep3Props = {
step: number;
setStep: (val: number) => void;
setSubStep: (val: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
onSubStepValidation: (isValid: boolean) => void;
editedCompletedRef: RefObject<Set<number>>;
};
const Step1PersonalInfoSubStep3 = ({
const Step1VerifyNikSubStep3 = ({
step,
setStep,
setSubStep,
}: Step1PersonalInfoSubStep3Props) => {
setStepValidationStatus,
onSubStepValidation,
editedCompletedRef,
}: Step1VerifyNikSubStep3Props) => {
const [fullName, setFullName] = useState('');
const [nik, setNik] = useState('');
const [birthDate, setBirthDate] = useState('');
const [gender, setGender] = useState('');
const [civilStatus, setCivilStatus] = useState('');
const onNextPress = () => {
const isFormValid =
fullName.trim() !== '' &&
nik.trim() !== '' &&
birthDate.trim() !== '' &&
gender.trim() !== '' &&
civilStatus.trim() !== '';
if (isFormValid) {
onSubStepValidation(true);
} else {
onSubStepValidation(false);
}
changeStep({
currentStep: step,
targetStep: 2,
setStep,
setSubStep: () => setSubStep(1),
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
@ -28,11 +68,15 @@ const Step1PersonalInfoSubStep3 = ({
title="Nama Lengkap Pemohon"
placeholder="Nama Lengkap Anda"
isRequired
value={fullName}
onChangeText={setFullName}
/>
<TextInputComponent
title="NIK"
placeholder="Nama NIK Anda"
isRequired
value={nik}
onChangeText={setNik}
/>
<View style={styles.subStepTextInputRowContainer}>
<View style={styles.subStepTextInputFlex}>
@ -41,6 +85,8 @@ const Step1PersonalInfoSubStep3 = ({
placeholder="DD/MM/YYYY"
isRequired
isDate
value={birthDate}
onChangeText={setBirthDate}
/>
</View>
<View style={styles.subStepTextInputFlex}>
@ -50,6 +96,8 @@ const Step1PersonalInfoSubStep3 = ({
isRequired
isDropdown
dropdownItemData={genderData}
value={gender}
onChangeText={setGender}
/>
</View>
</View>
@ -59,16 +107,15 @@ const Step1PersonalInfoSubStep3 = ({
isRequired
isDropdown
dropdownItemData={civilStatusData}
value={civilStatus}
onChangeText={setCivilStatus}
/>
</View>
<View style={styles.subStepButtonContainer}>
<Button
mode="contained"
onPress={() => {
setStep(2);
setSubStep(1);
}}
onPress={onNextPress}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
@ -86,4 +133,4 @@ const Step1PersonalInfoSubStep3 = ({
);
};
export default Step1PersonalInfoSubStep3;
export default Step1VerifyNikSubStep3;

View File

@ -1,40 +1,59 @@
import React from 'react';
import React, {RefObject, useRef} from 'react';
import {View, Pressable, Text} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import styles from '../styles';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import hasHadPassportBeforeOptions from '../../../../data/Options/HasHadPassportBeforeOptions';
import {Button} from 'react-native-paper';
import Colors from '../../../../../assets/styles/Colors';
import {changeStep} from '../../../../utils/stepNavigation';
import {StepValidationStatusSetter} from '../../../../../types/step';
type Step2SupportingDocsSubStep1Props = {
type Step2PassportApplicationQuestionnaireSubStep1Props = {
step: number;
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
selectedPassportOption: string;
setSelectedPassportOption: (value: string) => void;
showDontHaveYetDialog: () => void;
editedCompletedRef: RefObject<Set<number>>;
};
const Step2SupportingDocsSubStep1 = ({
const Step2PassportApplicationQuestionnaireSubStep1 = ({
step,
setStep,
setSubStep,
setStepValidationStatus,
selectedPassportOption,
setSelectedPassportOption,
showDontHaveYetDialog,
}: Step2SupportingDocsSubStep1Props) => {
editedCompletedRef,
}: Step2PassportApplicationQuestionnaireSubStep1Props) => {
const onBackPress = () => {
changeStep({
currentStep: step,
targetStep: 1,
setStep,
setSubStep: () => setSubStep(3),
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<View style={styles.subStepContainer}>
<Pressable
onPress={() => {
setStep(1);
setSubStep(3);
}}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={onBackPress}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -59,4 +78,4 @@ const Step2SupportingDocsSubStep1 = ({
);
};
export default Step2SupportingDocsSubStep1;
export default Step2PassportApplicationQuestionnaireSubStep1;

View File

@ -0,0 +1,126 @@
import React, {RefObject, useState} from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import Colors from '../../../../../assets/styles/Colors';
import familyRelationshipData from '../../../../data/DropdownData/FamilyRelationshipData';
import {changeStep} from '../../../../utils/stepNavigation';
import {StepValidationStatusSetter} from '../../../../../types/step';
type Step2PassportApplicationQuestionnaireSubStep10Props = {
step: number;
setStep: (step: number) => void;
setSubStep: (step: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
selectedDestinationCountryOption: string;
onSubStepValidation: (isValid: boolean) => void;
editedCompletedRef: RefObject<Set<number>>;
};
const Step2PassportApplicationQuestionnaireSubStep10 = (
props: Step2PassportApplicationQuestionnaireSubStep10Props,
) => {
const {
step,
setStep,
setSubStep,
setStepValidationStatus,
selectedDestinationCountryOption,
onSubStepValidation,
editedCompletedRef,
} = props;
const [relativeName, setRelativeName] = useState('');
const [relativePhone, setRelativePhone] = useState('');
const [relativeRelationship, setRelativeRelationship] = useState('');
const onNextPress = () => {
const isFormValid =
relativeName.trim() !== '' &&
relativePhone.trim() !== '' &&
relativeRelationship.trim() !== '';
if (selectedDestinationCountryOption === 'destination_country_not_set') {
if (isFormValid) {
onSubStepValidation(true);
}
changeStep({
currentStep: step,
targetStep: 3,
setStep,
setStepValidationStatus,
editedCompletedRef,
});
} else {
setSubStep(11);
}
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
selectedDestinationCountryOption === 'destination_country_not_set'
? setSubStep(7)
: setSubStep(9);
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
<Text style={styles.questionnaireData}>
Nomor telepon keluarga/kerabat terdekat Anda di Indonesia yang dapat
dihubungi
</Text>
<TextInputComponent
title="Nama Kerabat"
placeholder="Masukkan Nama Kerabat Anda"
isRequired
value={relativeName}
onChangeText={setRelativeName}
/>
<TextInputComponent
title="Nomor Telepon"
placeholder="Contoh: 08513456789"
isRequired
value={relativePhone}
onChangeText={setRelativePhone}
/>
<TextInputComponent
title="Keterangan Hubungan Keluarga"
placeholder="Pilih Hubungan"
isRequired
isDropdown
dropdownItemData={familyRelationshipData}
value={relativeRelationship}
onChangeText={setRelativeRelationship}
/>
</View>
<Button
mode="contained"
onPress={onNextPress}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
</Button>
</View>
</ScrollView>
);
};
export default Step2PassportApplicationQuestionnaireSubStep10;

View File

@ -1,6 +1,5 @@
import React from 'react';
import React, {RefObject, useState} from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import FontFamily from '../../../../../assets/styles/FontFamily';
@ -9,34 +8,71 @@ import destinationFamilyContactOptions from '../../../../data/Options/Destinatio
import familyRelationshipData from '../../../../data/DropdownData/FamilyRelationshipData';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import Colors from '../../../../../assets/styles/Colors';
import {changeStep} from '../../../../utils/stepNavigation';
import {StepValidationStatusSetter} from '../../../../../types/step';
type Step2SupportingDocsSubStep11Props = {
type Step2PassportApplicationQuestionnaireSubStep11Props = {
step: number;
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
selectedOption: string;
setSelectedOption: (value: string) => void;
onSubStepValidation: (isValid: boolean) => void;
editedCompletedRef: RefObject<Set<number>>;
};
const Step2SupportingDocsSubStep11 = ({
const Step2PassportApplicationQuestionnaireSubStep11 = ({
step,
setStep,
setSubStep,
setStepValidationStatus,
selectedOption,
setSelectedOption,
}: Step2SupportingDocsSubStep11Props) => {
onSubStepValidation,
editedCompletedRef,
}: Step2PassportApplicationQuestionnaireSubStep11Props) => {
const [relativeName, setRelativeName] = useState('');
const [phoneNumber, setPhoneNumber] = useState('');
const [relationship, setRelationship] = useState('');
const onNextPress = () => {
const isFormValid =
relativeName.trim() !== '' &&
phoneNumber.trim() !== '' &&
relationship.trim() !== '' &&
selectedOption.trim() !== '';
if (isFormValid) {
onSubStepValidation(true);
} else {
onSubStepValidation(false);
}
changeStep({
currentStep: step,
targetStep: 3,
setStep,
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(10)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => setSubStep(10)}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -56,11 +92,15 @@ const Step2SupportingDocsSubStep11 = ({
<TextInputComponent
title="Nama Kerabat"
placeholder="Masukkan Nama Kerabat Anda"
value={relativeName}
onChangeText={setRelativeName}
/>
<TextInputComponent
title="Nomor Telepon"
placeholder="Contoh: 08513456789"
value={phoneNumber}
onChangeText={setPhoneNumber}
/>
<TextInputComponent
@ -68,6 +108,8 @@ const Step2SupportingDocsSubStep11 = ({
placeholder="Pilih Hubungan"
isDropdown
dropdownItemData={familyRelationshipData}
value={relationship}
onChangeText={setRelationship}
/>
{destinationFamilyContactOptions.map(options => (
@ -84,10 +126,7 @@ const Step2SupportingDocsSubStep11 = ({
<Button
mode="contained"
onPress={() => {
setStep(3);
setSubStep(1);
}}
onPress={onNextPress}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
@ -97,4 +136,4 @@ const Step2SupportingDocsSubStep11 = ({
);
};
export default Step2SupportingDocsSubStep11;
export default Step2PassportApplicationQuestionnaireSubStep11;

View File

@ -7,7 +7,7 @@ import Colors from '../../../../../assets/styles/Colors';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import styles from '../styles';
type Step2SupportingDocsSubStep2Props = {
type Step2PassportApplicationQuestionnaireSubStep2Props = {
setSubStep: (step: number) => void;
selectedOption: string;
setSelectedOption: (value: string) => void;
@ -15,26 +15,30 @@ type Step2SupportingDocsSubStep2Props = {
showLostOrDamagedPassportDialog: () => void;
};
const Step2SupportingDocsSubStep2 = ({
const Step2PassportApplicationQuestionnaireSubStep2 = ({
setSubStep,
selectedOption,
setSelectedOption,
showPassportInfoDialog,
showLostOrDamagedPassportDialog,
}: Step2SupportingDocsSubStep2Props) => {
}: Step2PassportApplicationQuestionnaireSubStep2Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
setSubStep(1);
}}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{transform: [{scale: pressed ? 0.99 : 1}]},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -94,4 +98,4 @@ const Step2SupportingDocsSubStep2 = ({
);
};
export default Step2SupportingDocsSubStep2;
export default Step2PassportApplicationQuestionnaireSubStep2;

View File

@ -1,36 +1,36 @@
import React from 'react';
import {ScrollView, View, Pressable, Text} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep3Props = {
type Step2PassportApplicationQuestionnaireSubStep3Props = {
setSubStep: (step: number) => void;
};
const Step2SupportingDocsSubStep3 = ({
const Step2PassportApplicationQuestionnaireSubStep3 = ({
setSubStep,
}: Step2SupportingDocsSubStep3Props) => {
}: Step2PassportApplicationQuestionnaireSubStep3Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
setSubStep(2);
}}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepTextWrapper}>
<View style={[styles.subStepTextWrapper, {marginTop: 12}]}>
<Text style={styles.subStepTitle}>
Ambil/Upload Foto Paspor Lama Anda (Halaman 2 Paspor)
</Text>
@ -73,4 +73,4 @@ const Step2SupportingDocsSubStep3 = ({
);
};
export default Step2SupportingDocsSubStep3;
export default Step2PassportApplicationQuestionnaireSubStep3;

View File

@ -1,34 +1,36 @@
import React from 'react';
import {ScrollView, View, Pressable, Text} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep4Props = {
type Step2PassportApplicationQuestionnaireSubStep4Props = {
setSubStep: (step: number) => void;
};
const Step2SupportingDocsSubStep4 = ({
const Step2PassportApplicationQuestionnaireSubStep4 = ({
setSubStep,
}: Step2SupportingDocsSubStep4Props) => {
}: Step2PassportApplicationQuestionnaireSubStep4Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(3)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
setSubStep(3);
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepTextWrapper}>
<View style={[styles.subStepTextWrapper, {marginTop: 12}]}>
<Text style={styles.subStepTitle}>
Ambil/Upload Foto Paspor Lama Anda (Halaman 2 Paspor)
</Text>
@ -61,4 +63,4 @@ const Step2SupportingDocsSubStep4 = ({
);
};
export default Step2SupportingDocsSubStep4;
export default Step2PassportApplicationQuestionnaireSubStep4;

View File

@ -1,31 +1,34 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep5Props = {
type Step2PassportApplicationQuestionnaireSubStep5Props = {
setSubStep: (step: number) => void;
};
const Step2SupportingDocsSubStep5 = ({
const Step2PassportApplicationQuestionnaireSubStep5 = ({
setSubStep,
}: Step2SupportingDocsSubStep5Props) => {
}: Step2PassportApplicationQuestionnaireSubStep5Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(4)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
setSubStep(4);
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -61,4 +64,4 @@ const Step2SupportingDocsSubStep5 = ({
);
};
export default Step2SupportingDocsSubStep5;
export default Step2PassportApplicationQuestionnaireSubStep5;

View File

@ -1,36 +1,46 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import passportApplicationPurposeOptions from '../../../../data/Options/PassportApplicationPurposeOptions';
import styles from '../styles';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep6Props = {
type Step2PassportApplicationQuestionnaireSubStep6Props = {
setSubStep: (step: number) => void;
selectedOption: string;
setSelectedOption: (val: string) => void;
selectedPassportOption: string;
};
const Step2SupportingDocsSubStep6 = ({
setSubStep,
selectedOption,
setSelectedOption,
}: Step2SupportingDocsSubStep6Props) => {
const Step2PassportApplicationQuestionnaireSubStep6 = (
props: Step2PassportApplicationQuestionnaireSubStep6Props,
) => {
const {
setSubStep,
selectedOption,
setSelectedOption,
selectedPassportOption,
} = props;
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(5)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
selectedPassportOption === 'already'
? setSubStep(5)
: setSubStep(1);
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -61,4 +71,4 @@ const Step2SupportingDocsSubStep6 = ({
);
};
export default Step2SupportingDocsSubStep6;
export default Step2PassportApplicationQuestionnaireSubStep6;

View File

@ -0,0 +1,102 @@
import React, {useState} from 'react';
import {ScrollView, View, Pressable} from 'react-native';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import destinationCountryOptions from '../../../../data/Options/DestinationCountryOptions';
import Colors from '../../../../../assets/styles/Colors';
import countryData from '../../../../data/DropdownData/CountryData';
type Step2PassportApplicationQuestionnaireSubStep7Props = {
setSubStep: (step: number) => void;
selectedDestinationCountryOption: string;
setSelectedDestinationCountryOption: (val: string) => void;
};
const Step2PassportApplicationQuestionnaireSubStep7 = ({
setSubStep,
selectedDestinationCountryOption,
setSelectedDestinationCountryOption,
}: Step2PassportApplicationQuestionnaireSubStep7Props) => {
const [countryValue, setCountryValue] = useState<string | null>(null);
const handleCountrySelect = (value: string | null) => {
setCountryValue(value);
setSelectedDestinationCountryOption('');
};
const handleRadioSelect = (value: string) => {
if (value === 'destination_country_not_set') {
setSelectedDestinationCountryOption(value);
setCountryValue(null);
} else {
setSelectedDestinationCountryOption(value);
}
};
const isRadioButtonSelected = (value: string) => {
if (countryValue !== null) {
return '';
}
return selectedDestinationCountryOption === value ? value : '';
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => {
setSubStep(6);
setSelectedDestinationCountryOption('');
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
<TextInputComponent
title="Negara mana yang akan Anda tuju?"
placeholder="Masukkan negara tujuan"
isDropdownCountry
dropdownCountryItemData={countryData}
countryValue={countryValue}
setCountryValue={handleCountrySelect}
/>
{destinationCountryOptions.map(option => (
<RadioButtonOptionComponent
key={option.value}
label={option.label}
description={option.description}
value={option.value}
selectedValue={isRadioButtonSelected(option.value)}
onSelect={() => handleRadioSelect(option.value)}
/>
))}
</View>
<Button
mode="contained"
onPress={() => {
selectedDestinationCountryOption === 'destination_country_not_set'
? setSubStep(10)
: setSubStep(8);
}}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
</Button>
</View>
</ScrollView>
);
};
export default Step2PassportApplicationQuestionnaireSubStep7;

View File

@ -1,31 +1,32 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {ScrollView, View, Pressable} from 'react-native';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep8Props = {
type Step2PassportApplicationQuestionnaireSubStep8Props = {
setSubStep: (step: number) => void;
};
const Step2SupportingDocsSubStep8 = ({
const Step2PassportApplicationQuestionnaireSubStep8 = ({
setSubStep,
}: Step2SupportingDocsSubStep8Props) => {
}: Step2PassportApplicationQuestionnaireSubStep8Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(7)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => setSubStep(7)}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -50,4 +51,4 @@ const Step2SupportingDocsSubStep8 = ({
);
};
export default Step2SupportingDocsSubStep8;
export default Step2PassportApplicationQuestionnaireSubStep8;

View File

@ -1,36 +1,37 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import durationAbroadOptions from '../../../../data/Options/DurationAbroadOptions';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import Colors from '../../../../../assets/styles/Colors';
type Step2SupportingDocsSubStep9Props = {
type Step2PassportApplicationQuestionnaireSubStep9Props = {
setSubStep: (step: number) => void;
selectedOption: string;
setSelectedOption: (value: string) => void;
};
const Step2SupportingDocsSubStep9 = ({
const Step2PassportApplicationQuestionnaireSubStep9 = ({
setSubStep,
selectedOption,
setSelectedOption,
}: Step2SupportingDocsSubStep9Props) => {
}: Step2PassportApplicationQuestionnaireSubStep9Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(8)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={() => setSubStep(8)}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
@ -61,4 +62,4 @@ const Step2SupportingDocsSubStep9 = ({
);
};
export default Step2SupportingDocsSubStep9;
export default Step2PassportApplicationQuestionnaireSubStep9;

View File

@ -1,72 +0,0 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import Colors from '../../../../../assets/styles/Colors';
import familyRelationshipData from '../../../../data/DropdownData/FamilyRelationshipData';
type Step2SupportingDocsSubStep10Props = {
setSubStep: (step: number) => void;
};
const Step2SupportingDocsSubStep10 = ({
setSubStep,
}: Step2SupportingDocsSubStep10Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(9)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
<Text style={styles.questionnaireData}>
Nomor telepon keluarga/kerabat terdekat Anda di Indonesia yang dapat
dihubungi
</Text>
<TextInputComponent
title="Nama Kerabat"
placeholder="Masukkan Nama Kerabat Anda"
isRequired
/>
<TextInputComponent
title="Nomor Telepon"
placeholder="Contoh: 08513456789"
isRequired
/>
<TextInputComponent
title="Keterangan Hubungan Keluarga"
placeholder="Pilih Hubungan"
isRequired
isDropdown
dropdownItemData={familyRelationshipData}
/>
</View>
<Button
mode="contained"
onPress={() => setSubStep(11)}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
</Button>
</View>
</ScrollView>
);
};
export default Step2SupportingDocsSubStep10;

View File

@ -1,69 +0,0 @@
import React from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/Feather';
import {Button} from 'react-native-paper';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import RadioButtonOptionComponent from '../../../../components/RadioButtonOption';
import destinationCountryOptions from '../../../../data/Options/DestinationCountryOptions';
import Colors from '../../../../../assets/styles/Colors';
import countryData from '../../../../data/DropdownData/CountryData';
type Step2SupportingDocsSubStep7Props = {
setSubStep: (step: number) => void;
selectedOption: string;
setSelectedOption: (val: string) => void;
};
const Step2SupportingDocsSubStep7 = ({
setSubStep,
selectedOption,
setSelectedOption,
}: Step2SupportingDocsSubStep7Props) => {
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => setSubStep(6)}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
</Pressable>
<View style={styles.subStepQuestionnaireOptionContainer}>
<TextInputComponent
title="Negara mana yang akan Anda tuju?"
placeholder="Masukkan negara tujuan"
isDropdownCountry
dropdownCountryItemData={countryData}
/>
{destinationCountryOptions.map(option => (
<RadioButtonOptionComponent
key={option.value}
label={option.label}
description={option.description}
value={option.value}
selectedValue={selectedOption}
onSelect={value => setSelectedOption(value)}
/>
))}
</View>
<Button
mode="contained"
onPress={() => setSubStep(8)}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
</Button>
</View>
</ScrollView>
);
};
export default Step2SupportingDocsSubStep7;

View File

@ -1,4 +1,4 @@
import React, {useState} from 'react';
import React, {RefObject, useState} from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import styles from '../styles';
import Colors from '../../../../../assets/styles/Colors';
@ -7,6 +7,8 @@ import genderData from '../../../../data/DropdownData/GenderData';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import {Button} from 'react-native-paper';
import TextInputComponent from '../../../../components/TextInput';
import {changeStep} from '../../../../utils/stepNavigation';
import { StepValidationStatusSetter } from '../../../../../types/step';
interface BackButtonProps {
onPress: () => void;
@ -17,35 +19,51 @@ interface DocumentUploadSectionProps {
isRequired?: boolean;
isIcon?: boolean;
showDialogCivilStatusDocumentsInfo?: () => void;
onUploadSuccess?: () => void;
onDelete?: () => void;
}
interface Step3PaymentProps {
interface Step3UploadDocumentsProps {
step: number;
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
selectedPassportOption: string;
selectedDestinationCountryOption: string;
showCivilStatusDocumentsInfoDialog: () => void;
onSubStepValidation: (isValid: boolean) => void;
editedCompletedRef: RefObject<Set<number>>;
}
const BackButton = (props: BackButtonProps) => {
const {onPress} = props;
return (
<Pressable
onPress={onPress}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
})}
onPress={onPress}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
);
};
const DocumentUploadSection = (props: DocumentUploadSectionProps) => {
const {title, isRequired, isIcon, showDialogCivilStatusDocumentsInfo} = props;
const {
title,
isRequired,
isIcon,
showDialogCivilStatusDocumentsInfo,
onUploadSuccess,
onDelete,
} = props;
const [uploadedFileName, setUploadedFileName] = useState<string | null>(null);
const handleUpload = (p0: string) => {
@ -58,10 +76,12 @@ const DocumentUploadSection = (props: DocumentUploadSectionProps) => {
}
setUploadedFileName(fileName);
onUploadSuccess?.();
};
const handleDelete = () => {
setUploadedFileName(null);
onDelete?.();
};
return (
@ -132,32 +152,77 @@ const DocumentUploadSection = (props: DocumentUploadSectionProps) => {
);
};
const Step3Payment = (props: Step3PaymentProps) => {
const Step3UploadDocuments = (props: Step3UploadDocumentsProps) => {
const {
step,
setStep,
setSubStep,
setStepValidationStatus,
selectedPassportOption,
selectedDestinationCountryOption,
showCivilStatusDocumentsInfoDialog,
onSubStepValidation,
editedCompletedRef,
} = props;
const [isKTPUploaded, setIsKTPUploaded] = useState(false);
const [isFamilyCardUploaded, setIsFamilyCardUploaded] = useState(false);
const [isCivilStatusUploaded, setIsCivilStatusUploaded] = useState(false);
const [isOldPassportUploaded, setIsOldPassportUploaded] = useState(false);
const onBackPress = () => {
changeStep({
currentStep: step,
targetStep: 2,
setStep,
setSubStep: () =>
setSubStep(
selectedDestinationCountryOption === 'destination_country_not_set'
? 10
: 11,
),
setStepValidationStatus,
editedCompletedRef,
});
};
const onNextPress = () => {
const isFormValid =
isKTPUploaded &&
isFamilyCardUploaded &&
isCivilStatusUploaded &&
(selectedPassportOption !== 'already' || isOldPassportUploaded);
if (isFormValid) {
onSubStepValidation(true);
} else {
onSubStepValidation(false);
}
changeStep({
currentStep: step,
targetStep: 4,
setStep,
setSubStep: () => setSubStep(1),
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<BackButton
onPress={() => {
setStep(2);
setSubStep(11);
}}
/>
<BackButton onPress={onBackPress} />
<View style={{marginBottom: 16, gap: 4}}>
<View style={{marginTop: 12, marginBottom: 16, gap: 4}}>
<Text style={styles.subStepDesc}>
Layanan yang cocok untuk Anda adalah{' '}
{selectedPassportOption !== 'already' ? (
<Text style={{...FontFamily.notoSansBold}}>Paspor Baru</Text>
) : (
<Text style={{...FontFamily.notoSansBold}}>
Paspor Penggantian
</Text>
) : (
<Text style={{...FontFamily.notoSansBold}}>Paspor Baru</Text>
)}
. Silakan unggah kelengkapan dokumen berikut.
</Text>
@ -235,25 +300,39 @@ const Step3Payment = (props: Step3PaymentProps) => {
</View>
<View style={styles.subStepSectionButtonContainer}>
<DocumentUploadSection title="e-KTP" isRequired />
<DocumentUploadSection title="Kartu Keluarga" />
<DocumentUploadSection
title="e-KTP"
isRequired
onUploadSuccess={() => setIsKTPUploaded(true)}
onDelete={() => setIsKTPUploaded(false)}
/>
<DocumentUploadSection
title="Kartu Keluarga"
onUploadSuccess={() => setIsFamilyCardUploaded(true)}
onDelete={() => setIsFamilyCardUploaded(false)}
/>
<DocumentUploadSection
title="Akta kelahiran/ijazah/akta perkawinan/buku nikah/surat baptis"
isIcon
showDialogCivilStatusDocumentsInfo={
showCivilStatusDocumentsInfoDialog
}
onUploadSuccess={() => setIsCivilStatusUploaded(true)}
onDelete={() => setIsCivilStatusUploaded(false)}
/>
{selectedPassportOption !== 'already' && (
<DocumentUploadSection title="Paspor Lama" isRequired />
{selectedPassportOption === 'already' && (
<DocumentUploadSection
title="Paspor Lama"
isRequired
onUploadSuccess={() => setIsOldPassportUploaded(true)}
onDelete={() => setIsOldPassportUploaded(false)}
/>
)}
</View>
<Button
mode="contained"
onPress={() => {
setStep(4), setSubStep(1);
}}
onPress={onNextPress}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
@ -263,4 +342,4 @@ const Step3Payment = (props: Step3PaymentProps) => {
);
};
export default Step3Payment;
export default Step3UploadDocuments;

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, {RefObject} from 'react';
import {ScrollView, View, Pressable, Text} from 'react-native';
import {Checkbox, Button} from 'react-native-paper';
import Icon from 'react-native-vector-icons/MaterialIcons';
@ -9,30 +9,56 @@ import postalCodeData from '../../../../data/DropdownData/PostalCodeData';
import districtData from '../../../../data/DropdownData/DistrictData';
import cityData from '../../../../data/DropdownData/CityData';
import provinceData from '../../../../data/DropdownData/ProvinceData';
import {changeStep} from '../../../../utils/stepNavigation';
import { StepValidationStatusSetter } from '../../../../../types/step';
type Step4DataConfirmationSubStep1Props = {
type Step4ApplicantAdditionalDataSubStep1Props = {
step: number;
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
setStepValidationStatus: StepValidationStatusSetter;
checkedOption: boolean;
setCheckedOption: React.Dispatch<React.SetStateAction<boolean>>;
editedCompletedRef: RefObject<Set<number>>;
};
const Step4DataConfirmationSubStep1: React.FC<
Step4DataConfirmationSubStep1Props
> = ({setStep, setSubStep, checkedOption, setCheckedOption}) => {
const Step4ApplicantAdditionalDataSubStep1: React.FC<
Step4ApplicantAdditionalDataSubStep1Props
> = ({
step,
setStep,
setSubStep,
setStepValidationStatus,
checkedOption,
setCheckedOption,
editedCompletedRef,
}) => {
const onBackPress = () => {
changeStep({
currentStep: step,
targetStep: 3,
setStep,
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
onPress={() => {
setStep(3);
}}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{transform: [{scale: pressed ? 0.99 : 1}], marginBottom: 8},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 12,
})}
onPress={onBackPress}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<Text style={styles.subStepDesc}>
@ -162,4 +188,4 @@ const Step4DataConfirmationSubStep1: React.FC<
);
};
export default Step4DataConfirmationSubStep1;
export default Step4ApplicantAdditionalDataSubStep1;

View File

@ -1,6 +1,5 @@
import React from 'react';
import React, {RefObject, useState} from 'react';
import {ScrollView, View, Text, Pressable} from 'react-native';
import Icon from 'react-native-vector-icons/MaterialIcons';
import styles from '../styles';
import TextInputComponent from '../../../../components/TextInput';
import {Button} from 'react-native-paper';
@ -8,36 +7,118 @@ import Colors from '../../../../../assets/styles/Colors';
import jobData from '../../../../data/DropdownData/JobData';
import nationalityData from '../../../../data/DropdownData/NationalityData';
import {PassportAppointment} from '../../../../navigation/type';
import {
addData,
getData,
} from '../../../../helper/asyncStorageHelper';
import {addData, getData} from '../../../../helper/asyncStorageHelper';
import {changeStep} from '../../../../utils/stepNavigation';
import { StepValidationStatusSetter } from '../../../../../types/step';
const Step4DataConfirmationSubStep2 = ({
setStep,
setSubStep,
}: {
type Step4ApplicantAdditionalDataSubStep2Props = {
step: number;
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
}) => {
setStepValidationStatus: StepValidationStatusSetter;
onSubStepValidation: (isValid: boolean) => void;
editedCompletedRef: RefObject<Set<number>>;
};
const Step4ApplicantAdditionalDataSubStep2 = ({
step,
setStep,
setSubStep,
setStepValidationStatus,
onSubStepValidation,
editedCompletedRef,
}: Step4ApplicantAdditionalDataSubStep2Props) => {
const [job, setJob] = useState('');
const [phone, setPhone] = useState('');
const [motherName, setMotherName] = useState('');
const [motherNation, setMotherNation] = useState('');
const [motherAddress, setMotherAddress] = useState('');
const isFormValid =
job.trim() !== '' &&
phone.trim() !== '' &&
motherName.trim() !== '' &&
motherNation.trim() !== '' &&
motherAddress.trim() !== '';
const handleSaveDraft = async () => {
if (isFormValid) {
onSubStepValidation(true);
// Ambil data appointment yang sudah tersimpan
const storedAppointments: PassportAppointment[] =
(await getData('passportAppointments')) || [];
// Ambil ID terakhir dan hitung ID baru
const lastId = storedAppointments.length
? Math.max(...storedAppointments.map(item => Number(item.id)))
: 0;
const nextId = (lastId + 1).toString();
// Buat appointment baru dengan ID yang sudah dihitung
const newAppointment: PassportAppointment = {
id: nextId,
applicantName: 'Salwa Aisyah Adhani',
applicantCode: '1038000008887777',
appointmentDate: 'Selasa, 20 Mei 2025',
appointmentTime: '10:00-11:00 WIB',
serviceUnit: 'Kantor Imigrasi Depok',
status: 'Menunggu Pembayaran',
submissionDate: 'Kamis, 15 Mei 2025 21:30',
serviceCode: 'EH-LP7RNC',
applicationDetails: {
nationalIdNumber: '3271234560009123456',
gender: 'Wanita',
applicationType: 'Penggantian Paspor',
replacementReason: 'Penuh/Halaman Penuh',
applicationPurpose: 'Wisata/Liburan',
passportType: 'PASPOR ELEKTRONIK POLIKARBONAT 5 TAHUN',
fee: '650.000',
},
};
// Simpan appointment baru
await addData<PassportAppointment>(
'passportAppointments',
newAppointment,
);
const updatedAppointments = await getData('passportAppointments');
console.log('Data yang berhasil ditambahkan:', updatedAppointments);
} else {
onSubStepValidation(false);
}
changeStep({
currentStep: step,
targetStep: 5,
setStep,
setStepValidationStatus,
editedCompletedRef,
});
};
return (
<ScrollView>
<View style={styles.subStepContainer}>
<Pressable
style={({pressed}) => ({
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 12,
})}
onPress={() => {
setStep(4);
setSubStep(1);
}}
style={({pressed}) => [
styles.subStepButtonBackWrapper,
{
transform: [{scale: pressed ? 0.99 : 1}],
marginBottom: 8,
},
]}>
<Icon name="chevron-left" size={24} />
<Text style={styles.subStepButtonBackText}>Kembali</Text>
}}>
<Button
mode="contained"
icon="chevron-left"
textColor={Colors.neutral100.color}
style={styles.subStepButtonBackContainer}>
Kembali
</Button>
</Pressable>
<Text style={styles.subStepDesc}>
Data di bawah ini harus sesuai dengan keterangan pada KTP pemohon.
Data yang bertanda (
@ -59,11 +140,15 @@ const Step4DataConfirmationSubStep2 = ({
isRequired
isDropdown
dropdownItemData={jobData}
value={job}
onChangeText={setJob}
/>
<TextInputComponent
title="Nomor Telepon"
placeholder="Contoh: 08513456789"
isRequired
value={phone}
onChangeText={setPhone}
/>
</View>
@ -79,6 +164,8 @@ const Step4DataConfirmationSubStep2 = ({
title="Nama Ibu"
placeholder="Masukkan nama lengkap ibu"
isRequired
value={motherName}
onChangeText={setMotherName}
/>
<TextInputComponent
title="Kewarganegaraan Ibu"
@ -86,6 +173,8 @@ const Step4DataConfirmationSubStep2 = ({
isRequired
isDropdown
dropdownItemData={nationalityData}
value={motherNation}
onChangeText={setMotherNation}
/>
<TextInputComponent
title="Alamat Ibu"
@ -94,6 +183,8 @@ const Step4DataConfirmationSubStep2 = ({
supportText="0/100 karakter"
containerHeight={90}
isMultiline
value={motherAddress}
onChangeText={setMotherAddress}
/>
</View>
@ -153,49 +244,7 @@ const Step4DataConfirmationSubStep2 = ({
<Button
mode="contained"
onPress={async () => {
// Ambil data appointment yang sudah tersimpan
const storedAppointments: PassportAppointment[] =
(await getData('passportAppointments')) || [];
// Ambil ID terakhir dan hitung ID baru
const lastId = storedAppointments.length
? Math.max(...storedAppointments.map(item => Number(item.id)))
: 0;
const nextId = (lastId + 1).toString();
// Buat appointment baru dengan ID yang sudah dihitung
const newAppointment: PassportAppointment = {
id: nextId,
applicantName: 'Salwa Aisyah Adhani',
applicantCode: '1038000008887777',
appointmentDate: 'Selasa, 20 Mei 2025',
appointmentTime: '10:00-11:00 WIB',
serviceUnit: 'Kantor Imigrasi Depok',
status: 'Menunggu Pembayaran',
submissionDate: 'Kamis, 15 Mei 2025 21:30',
serviceCode: 'EH-LP7RNC',
applicationDetails: {
nationalIdNumber: '3271234560009123456',
gender: 'Wanita',
applicationType: 'Penggantian Paspor',
replacementReason: 'Penuh/Halaman Penuh',
applicationPurpose: 'Wisata/Liburan',
passportType: 'PASPOR ELEKTRONIK POLIKARBONAT 5 TAHUN',
fee: '650.000',
},
};
// Simpan appointment baru
await addData<PassportAppointment>(
'passportAppointments',
newAppointment,
);
const updatedAppointments = await getData('passportAppointments');
console.log('Data yang berhasil ditambahkan:', updatedAppointments);
setStep(5);
}}
onPress={handleSaveDraft}
style={[styles.subStepButtonContained, {marginBottom: 8}]}
textColor={Colors.neutral100.color}>
Simpan Draft
@ -205,4 +254,4 @@ const Step4DataConfirmationSubStep2 = ({
);
};
export default Step4DataConfirmationSubStep2;
export default Step4ApplicantAdditionalDataSubStep2;

View File

@ -7,19 +7,19 @@ import styles from '../styles';
import {getData} from '../../../../helper/asyncStorageHelper';
import {PassportAppointment} from '../../../../navigation/type';
type Step5VerificationProps = {
type Step5ApplicationTypeAndApplicantDataProps = {
setStep: (step: number) => void;
setSubStep: (subStep: number) => void;
passportAppointmentData: any[];
showEditDataSheet: () => void;
navigation: any;
onSubStepValidation: (isValid: boolean) => void;
};
const Step5Content = (props: Step5VerificationProps) => {
const {setStep, setSubStep, passportAppointmentData, showEditDataSheet} =
props;
const Step5ApplicationTypeAndApplicantData = (
props: Step5ApplicationTypeAndApplicantDataProps,
) => {
const {setStep, showEditDataSheet, navigation, onSubStepValidation} = props;
const [lastAppointment, setLastAppointment] =
useState<PassportAppointment>();
const [lastAppointment, setLastAppointment] = useState<PassportAppointment>();
useEffect(() => {
const fetchData = async () => {
@ -35,6 +35,18 @@ const Step5Content = (props: Step5VerificationProps) => {
fetchData();
}, []);
const onNextPress = () => {
onSubStepValidation(true);
setStep(6);
};
const onBackHomePress = () => {
navigation.reset({
index: 0,
routes: [{name: 'NavigationRoute'}],
});
};
return (
<View style={styles.subStepContainer}>
<Text style={styles.subStepDesc}>
@ -107,31 +119,34 @@ const Step5Content = (props: Step5VerificationProps) => {
<View style={[styles.subStepButtonContainer, {marginTop: 12}]}>
<Button
mode="contained"
onPress={() => setStep(6)}
onPress={onNextPress}
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}>
Lanjut
</Button>
<Button
mode="outlined"
onPress={() => {
setStep(4);
setSubStep(2);
}}
onPress={onBackHomePress}
style={styles.subStepButtonOutlined}
textColor={Colors.primary30.color}>
Kembali
Beranda
</Button>
</View>
</View>
);
};
const DetailRow = ({label, value}: {label: string; value: string | undefined}) => (
const DetailRow = ({
label,
value,
}: {
label: string;
value: string | undefined;
}) => (
<View style={styles.applicantDetailTextContentWrapper}>
<Text style={styles.applicantDetailTextTitle}>{label}</Text>
<Text style={styles.applicantDetailTextDesc}>{value}</Text>
</View>
);
export default Step5Content;
export default Step5ApplicationTypeAndApplicantData;

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, {useState} from 'react';
import {ScrollView, View, Text} from 'react-native';
import {Button, Divider} from 'react-native-paper';
import TextInputComponent from '../../../../components/TextInput';
@ -8,20 +8,23 @@ import FontFamily from '../../../../../assets/styles/FontFamily';
import arrivalDateGuidelinesData from '../../../../data/Steps/ArrivalDateGuidelinesData';
import passportTypeData from '../../../../data/DropdownData/PassportTypeData';
type Step6ProcessingProps = {
type Step6ApplicationTypeAndApplicantDataProps = {
showFinalizationConfirmationDialog: () => void;
showPassportTypeInfoDialog: () => void;
showSearchLocationSheet: () => void;
showSelectDateSheet: () => void;
};
const Step6Processing = (props: Step6ProcessingProps) => {
const Step6ApplicationTypeAndApplicantData = (
props: Step6ApplicationTypeAndApplicantDataProps,
) => {
const {
showFinalizationConfirmationDialog,
showPassportTypeInfoDialog,
showSearchLocationSheet,
showSelectDateSheet,
} = props;
return (
<ScrollView>
<View style={styles.subStepContainer}>
@ -106,4 +109,4 @@ const Step6Processing = (props: Step6ProcessingProps) => {
);
};
export default Step6Processing;
export default Step6ApplicationTypeAndApplicantData;

View File

@ -9,13 +9,15 @@ import termsAndConditionsData from '../../../../data/Steps/TermsAndContionsData'
import {PassportAppointment} from '../../../../navigation/type';
import {getData} from '../../../../helper/asyncStorageHelper';
type Step7CompletionProps = {
type Step7ApplicationFeeDetailsProps = {
showSubmitSuccessDialog: () => void;
setLastCompletedSteps: () => void;
onSubStepValidation: (isValid: boolean) => void;
};
const Step7Completion = (props: Step7CompletionProps) => {
const {showSubmitSuccessDialog, setLastCompletedSteps} = props;
const Step7ApplicationFeeDetails = (props: Step7ApplicationFeeDetailsProps) => {
const {showSubmitSuccessDialog, setLastCompletedSteps, onSubStepValidation} =
props;
const [lastAppointment, setLastAppointment] = useState<PassportAppointment>();
useEffect(() => {
@ -32,6 +34,12 @@ const Step7Completion = (props: Step7CompletionProps) => {
fetchData();
}, []);
const onNextPress = () => {
onSubStepValidation(true);
showSubmitSuccessDialog();
setLastCompletedSteps();
};
return (
<ScrollView>
<View style={[styles.subStepContainer, {paddingBottom: 0}]}>
@ -215,10 +223,7 @@ const Step7Completion = (props: Step7CompletionProps) => {
mode="contained"
style={styles.subStepButtonContained}
textColor={Colors.neutral100.color}
onPress={() => {
showSubmitSuccessDialog();
setLastCompletedSteps();
}}>
onPress={onNextPress}>
Kembali ke Halaman Utama
</Button>
</View>
@ -226,4 +231,4 @@ const Step7Completion = (props: Step7CompletionProps) => {
);
};
export default Step7Completion;
export default Step7ApplicationFeeDetails;

View File

@ -48,6 +48,10 @@ const styles = StyleSheet.create({
alignItems: 'center',
gap: 4,
},
subStepButtonBackContainer: {
alignSelf: 'flex-start',
backgroundColor: Colors.primary30.color,
},
subStepButtonBackText: {
...FontFamily.notoSansRegular,
includeFontPadding: false,

View File

@ -0,0 +1,53 @@
import {RefObject} from 'react';
export type StepStatus = 'completed' | 'incomplete' | 'invalid';
interface StepChangeParams {
currentStep: number;
targetStep: number;
setStep: (step: number) => void;
setSubStep?: (sub: number) => void;
setStepValidationStatus: React.Dispatch<
React.SetStateAction<Record<number, StepStatus>>
>;
editedCompletedRef: RefObject<Set<number>>;
}
export function changeStep({
currentStep,
targetStep,
setStep,
setSubStep,
setStepValidationStatus,
editedCompletedRef,
}: StepChangeParams) {
setStepValidationStatus(prev => {
const next = {...prev};
if (currentStep !== targetStep &&
editedCompletedRef.current?.has(currentStep)) {
next[currentStep] = 'completed';
editedCompletedRef.current.delete(currentStep);
}
if (prev[targetStep] === 'completed') {
editedCompletedRef.current?.add(targetStep);
}
next[targetStep] = 'incomplete';
if (targetStep > currentStep) {
for (let s = 1; s < targetStep; s++) {
if (next[s] !== 'completed') next[s] = 'invalid';
}
} else if (targetStep < currentStep) {
for (let s = currentStep; s > targetStep; s--) {
if (next[s] !== 'completed') next[s] = 'invalid';
}
}
return next;
});
setStep(targetStep);
if (setSubStep) setSubStep(1);
}

7
types/step.ts Normal file
View File

@ -0,0 +1,7 @@
export type StepStatus = 'incomplete' | 'completed' | 'invalid';
export type StepValidationStatus = Record<number, StepStatus>;
export type StepValidationStatusSetter = React.Dispatch<
React.SetStateAction<StepValidationStatus>
>;