Compare commits
10 Commits
ac6dae7d17
...
6fe3884879
Author | SHA1 | Date | |
---|---|---|---|
6fe3884879 | |||
e399376c0a | |||
0cd9e1500b | |||
91e93d4c10 | |||
e2b74911f2 | |||
711bd2f852 | |||
e8c61edeb0 | |||
081a637463 | |||
a077d93029 | |||
06b8f2ab80 |
2
App.tsx
@ -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 (
|
||||
|
1335
android/app/src/main/assets/index.android.bundle
Normal file
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 208 B |
After Width: | Height: | Size: 186 B |
After Width: | Height: | Size: 489 B |
After Width: | Height: | Size: 100 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 141 B |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 134 B |
After Width: | Height: | Size: 334 B |
After Width: | Height: | Size: 201 B |
After Width: | Height: | Size: 483 B |
After Width: | Height: | Size: 167 B |
After Width: | Height: | Size: 502 B |
After Width: | Height: | Size: 266 B |
After Width: | Height: | Size: 728 B |
After Width: | Height: | Size: 207 B |
After Width: | Height: | Size: 645 B |
After Width: | Height: | Size: 332 B |
After Width: | Height: | Size: 928 B |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 22 KiB |
@ -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>
|
BIN
assets/images/welcome-image.jpg
Normal file
After Width: | Height: | Size: 167 KiB |
1980
ios/Podfile.lock
Normal 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;
|
||||
|
10
ios/mpaspor.xcworkspace/contents.xcworkspacedata
generated
Normal 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
@ -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",
|
||||
|
53
src/components/InfoToast.tsx
Normal 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;
|
@ -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 />
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
},
|
||||
});
|
||||
|
@ -1,9 +1,4 @@
|
||||
const countryData = [
|
||||
{
|
||||
value: '1',
|
||||
label: 'Indonesia',
|
||||
image: {uri: 'https://flagcdn.com/w320/id.png'},
|
||||
},
|
||||
{
|
||||
value: '2',
|
||||
label: 'United States',
|
||||
|
@ -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;
|
||||
|
@ -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}
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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}>
|
||||
|
@ -84,7 +84,7 @@ const styles = StyleSheet.create({
|
||||
arrowRightIcon: {
|
||||
marginRight: 20,
|
||||
},
|
||||
personIcon: {
|
||||
informationIcon: {
|
||||
marginLeft: 20,
|
||||
},
|
||||
});
|
||||
|
@ -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',
|
||||
},
|
||||
|
@ -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>
|
||||
);
|
||||
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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,
|
||||
|
53
src/utils/stepNavigation.ts
Normal 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
@ -0,0 +1,7 @@
|
||||
export type StepStatus = 'incomplete' | 'completed' | 'invalid';
|
||||
|
||||
export type StepValidationStatus = Record<number, StepStatus>;
|
||||
|
||||
export type StepValidationStatusSetter = React.Dispatch<
|
||||
React.SetStateAction<StepValidationStatus>
|
||||
>;
|