Add Eazy Passport screen and add passport application flow until step 5 'Verifikasi'
This commit is contained in:
@ -24,7 +24,7 @@ const StepIndicator = ({currentStep, totalSteps, completedSteps}: any) => {
|
|||||||
const textStyle = isCompleted
|
const textStyle = isCompleted
|
||||||
? FontFamily.notoSansBold
|
? FontFamily.notoSansBold
|
||||||
: isCurrent
|
: isCurrent
|
||||||
? FontFamily.notoSansRegular
|
? FontFamily.notoSansSemiBold
|
||||||
: FontFamily.notoSansRegular;
|
: FontFamily.notoSansRegular;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -87,7 +87,7 @@ const TextInputComponent: React.FC<TextInputComponentProps> = ({
|
|||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
<Dropdown
|
<Dropdown
|
||||||
style={styles.dropdown}
|
style={[styles.dropdown, isDisabled && styles.outlineColorDisabled]}
|
||||||
placeholderStyle={styles.placeholderDropdownStyle}
|
placeholderStyle={styles.placeholderDropdownStyle}
|
||||||
selectedTextStyle={styles.selectedTextStyle}
|
selectedTextStyle={styles.selectedTextStyle}
|
||||||
iconStyle={styles.iconStyle}
|
iconStyle={styles.iconStyle}
|
||||||
@ -100,6 +100,7 @@ const TextInputComponent: React.FC<TextInputComponentProps> = ({
|
|||||||
onChange={item => {
|
onChange={item => {
|
||||||
setGenderValue(item.value);
|
setGenderValue(item.value);
|
||||||
}}
|
}}
|
||||||
|
disable={isDisabled}
|
||||||
renderRightIcon={() => <Icon name="arrow-drop-down" size={20} />}
|
renderRightIcon={() => <Icon name="arrow-drop-down" size={20} />}
|
||||||
renderItem={renderDropdownItem}
|
renderItem={renderDropdownItem}
|
||||||
/>
|
/>
|
||||||
@ -114,18 +115,19 @@ const TextInputComponent: React.FC<TextInputComponentProps> = ({
|
|||||||
{title && <Text style={styles.title}>{title}</Text>}
|
{title && <Text style={styles.title}>{title}</Text>}
|
||||||
{isRequired && <Text style={styles.required}>*</Text>}
|
{isRequired && <Text style={styles.required}>*</Text>}
|
||||||
</View>
|
</View>
|
||||||
<Pressable onPress={() => setShowPicker(true)}>
|
<Pressable onPress={() => !isDisabled && setShowPicker(true)}>
|
||||||
<TextInput
|
<TextInput
|
||||||
mode="outlined"
|
mode="outlined"
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
style={inputStyle}
|
style={[inputStyle, isDisabled && styles.outlineColorDisabled]}
|
||||||
theme={{roundness: 12}}
|
theme={{roundness: 12}}
|
||||||
placeholderTextColor={Colors.primary60.color}
|
placeholderTextColor={Colors.primary60.color}
|
||||||
editable={false}
|
editable={false}
|
||||||
value={formattedDate}
|
value={formattedDate}
|
||||||
right={<TextInput.Icon icon="calendar" color='#48454E' />}
|
right={<TextInput.Icon icon="calendar" color="#48454E" />}
|
||||||
multiline={false}
|
multiline={false}
|
||||||
textColor='#48454E'
|
textColor="#48454E"
|
||||||
|
disabled={isDisabled}
|
||||||
/>
|
/>
|
||||||
</Pressable>
|
</Pressable>
|
||||||
{showPicker && (
|
{showPicker && (
|
||||||
@ -151,7 +153,7 @@ const TextInputComponent: React.FC<TextInputComponentProps> = ({
|
|||||||
<TextInput
|
<TextInput
|
||||||
mode="outlined"
|
mode="outlined"
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
style={inputStyle}
|
style={[inputStyle, isDisabled && styles.outlineColorDisabled]}
|
||||||
theme={{roundness: 12}}
|
theme={{roundness: 12}}
|
||||||
placeholderTextColor={Colors.primary60.color}
|
placeholderTextColor={Colors.primary60.color}
|
||||||
activeOutlineColor={Colors.primary10.color}
|
activeOutlineColor={Colors.primary10.color}
|
||||||
@ -167,7 +169,7 @@ const TextInputComponent: React.FC<TextInputComponentProps> = ({
|
|||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
multiline={isMultiline}
|
multiline={isMultiline}
|
||||||
textColor='#48454E'
|
textColor="#48454E"
|
||||||
/>
|
/>
|
||||||
{supportText && <Text style={[styles.supportText]}>{supportText}</Text>}
|
{supportText && <Text style={[styles.supportText]}>{supportText}</Text>}
|
||||||
</View>
|
</View>
|
||||||
@ -243,6 +245,12 @@ const styles = StyleSheet.create({
|
|||||||
includeFontPadding: false,
|
includeFontPadding: false,
|
||||||
color: Colors.neutral70.color,
|
color: Colors.neutral70.color,
|
||||||
},
|
},
|
||||||
|
outlineColorDisabled: {
|
||||||
|
backgroundColor: '#F8F9FE',
|
||||||
|
borderWidth: 1,
|
||||||
|
borderRadius: 12,
|
||||||
|
borderColor: '#e3e3e5',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default TextInputComponent;
|
export default TextInputComponent;
|
||||||
|
79
src/components/dialog/DialogApplicationPassport.tsx
Normal file
79
src/components/dialog/DialogApplicationPassport.tsx
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {View, Text, StyleSheet} from 'react-native';
|
||||||
|
import {Portal, Dialog, Button} from 'react-native-paper';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
import FontFamily from '../../../assets/styles/FontFamily';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
visible: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
onContinue: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const DialogApplicationPassport = (props: Props) => {
|
||||||
|
const {visible, onClose, onContinue} = props;
|
||||||
|
return (
|
||||||
|
<Portal>
|
||||||
|
<Dialog visible={visible} style={styles.dialogContainer}>
|
||||||
|
<Dialog.Title style={styles.dialogTitle}>Pemberitahuan</Dialog.Title>
|
||||||
|
<View style={styles.dialogContentContainer}>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Permohonan paspor anak diwajibkan untuk didampingi oleh orang
|
||||||
|
tua/wali yang sah pada saat datang ke Kantor Imigrasi untuk
|
||||||
|
pelaksanaan wawancara dan pengambilan foto sidik jari.
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonAgree}
|
||||||
|
mode="contained"
|
||||||
|
textColor={Colors.neutral100.color}
|
||||||
|
onPress={onContinue}>
|
||||||
|
Lanjut
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonDontAgree}
|
||||||
|
mode="outlined"
|
||||||
|
textColor={Colors.primary30.color}
|
||||||
|
onPress={onClose}>
|
||||||
|
Kembali
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Dialog>
|
||||||
|
</Portal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
dialogContainer: {
|
||||||
|
backgroundColor: 'white',
|
||||||
|
elevation: 0,
|
||||||
|
shadowColor: 'transparent',
|
||||||
|
borderRadius: 20,
|
||||||
|
},
|
||||||
|
dialogTitle: {
|
||||||
|
fontSize: 22,
|
||||||
|
color: Colors.secondary30.color,
|
||||||
|
},
|
||||||
|
dialogContentContainer: {
|
||||||
|
marginHorizontal: 24,
|
||||||
|
marginBottom: 24,
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
dialogDesc: {
|
||||||
|
fontSize: 14,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
},
|
||||||
|
buttonAgree: {
|
||||||
|
backgroundColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
buttonDontAgree: {
|
||||||
|
borderColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default DialogApplicationPassport;
|
84
src/components/dialog/DialogDontHaveYetPassport.tsx
Normal file
84
src/components/dialog/DialogDontHaveYetPassport.tsx
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import {StyleSheet, Text, View} from 'react-native';
|
||||||
|
import {Dialog, Portal, Button} from 'react-native-paper';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
import FontFamily from '../../../assets/styles/FontFamily';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
visible: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
onContinue: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const DialogDontHaveYetPassport = (props: Props) => {
|
||||||
|
const {visible, onClose, onContinue} = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Portal>
|
||||||
|
<Dialog visible={visible} style={styles.dialogContainer}>
|
||||||
|
<Dialog.Title style={styles.dialogTitle}>Peringatan</Dialog.Title>
|
||||||
|
<View style={styles.dialogContentContainer}>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Apabila Anda sudah memiliki paspor atau sudah pernah mengajukan
|
||||||
|
permohonan paspor pada Kantor Imigrasi namun Anda memilih permohonan
|
||||||
|
paspor baru, maka data anda akan{' '}
|
||||||
|
<Text style={styles.dialogDescRed}>tertolak</Text> oleh sistem dan{' '}
|
||||||
|
<Text style={styles.dialogDescRed}>
|
||||||
|
pembayaran yang telah masuk kas negara tidak dapat dikembalikan.
|
||||||
|
</Text>
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Silakan menghubungi hotline atau datang langsung ke Kantor Imigrasi
|
||||||
|
terdekat untuk informasi dan arahan lebih lanjut.
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonContinue}
|
||||||
|
mode="contained"
|
||||||
|
textColor={Colors.neutral100.color}
|
||||||
|
onPress={() => {
|
||||||
|
onClose();
|
||||||
|
onContinue();
|
||||||
|
}}>
|
||||||
|
Lanjut
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Dialog>
|
||||||
|
</Portal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
dialogContainer: {
|
||||||
|
backgroundColor: 'white',
|
||||||
|
elevation: 0,
|
||||||
|
shadowColor: 'transparent',
|
||||||
|
borderRadius: 20,
|
||||||
|
},
|
||||||
|
dialogTitle: {
|
||||||
|
fontSize: 22,
|
||||||
|
color: Colors.secondary30.color,
|
||||||
|
},
|
||||||
|
dialogContentContainer: {
|
||||||
|
marginHorizontal: 24,
|
||||||
|
marginBottom: 24,
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
dialogDesc: {
|
||||||
|
fontSize: 14,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
},
|
||||||
|
dialogDescRed: {
|
||||||
|
...FontFamily.notoSansBold,
|
||||||
|
color: Colors.indicatorRed.color,
|
||||||
|
includeFontPadding: false,
|
||||||
|
},
|
||||||
|
buttonContinue: {
|
||||||
|
backgroundColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default DialogDontHaveYetPassport;
|
125
src/components/dialog/DialogLostOrDamagedPassport.tsx
Normal file
125
src/components/dialog/DialogLostOrDamagedPassport.tsx
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {View, Text, StyleSheet} from 'react-native';
|
||||||
|
import {Portal, Dialog, Button} from 'react-native-paper';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
import FontFamily from '../../../assets/styles/FontFamily';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
visible: boolean;
|
||||||
|
onBackToHome: () => void;
|
||||||
|
onBackToFirstStep: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const DialogLostOrDamagedPassport = (props: Props) => {
|
||||||
|
const {visible, onBackToHome, onBackToFirstStep} = props;
|
||||||
|
return (
|
||||||
|
<Portal>
|
||||||
|
<Dialog visible={visible} style={styles.dialogContainer}>
|
||||||
|
<Dialog.Title style={styles.dialogTitle}>Pemberitahuan</Dialog.Title>
|
||||||
|
<View style={styles.dialogContentContainer}>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Silakan langsung datang ke Kantor Imigrasi terdekat untuk melakukan
|
||||||
|
permohonan penggantian paspor hilang atau rusak dengan membawa
|
||||||
|
dokumen sebagai berikut:
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
1. Untuk Paspor Hilang
|
||||||
|
</Text>
|
||||||
|
<View style={styles.dialogBulletPointWrapper}>
|
||||||
|
<Text style={styles.dialogDesc}>• e-КТР</Text>
|
||||||
|
<Text style={styles.dialogDesc}>• Kartu Keluarga</Text>
|
||||||
|
<View style={styles.dialogLongBulletPointWrapper}>
|
||||||
|
<Text>•</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Akta kelahiran/ijazah/akta perkawinan/buku nikah/surat baptis
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
• Surat kehilangan dari Kepolisian
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
<View>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
2. Untuk Paspor Rusak
|
||||||
|
</Text>
|
||||||
|
<View style={styles.dialogBulletPointWrapper}>
|
||||||
|
<Text style={styles.dialogDesc}>• e-КТР</Text>
|
||||||
|
<Text style={styles.dialogDesc}>• Kartu Keluarga</Text>
|
||||||
|
<View style={styles.dialogLongBulletPointWrapper}>
|
||||||
|
<Text>•</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Akta kelahiran/ijazah/akta perkawinan/buku nikah/surat baptis
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<Text style={styles.dialogDesc}>• Paspor lama</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
Harap membawa semua dokumen asli dan fotokopi dalam kertas A4.
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonContained}
|
||||||
|
mode="contained"
|
||||||
|
textColor={Colors.neutral100.color}
|
||||||
|
onPress={onBackToHome}>
|
||||||
|
Kembali ke Beranda
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonOutlined}
|
||||||
|
mode="outlined"
|
||||||
|
textColor={Colors.primary30.color}
|
||||||
|
onPress={onBackToFirstStep}>
|
||||||
|
Kembali ke Tahap Awal
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Dialog>
|
||||||
|
</Portal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
dialogContainer: {
|
||||||
|
backgroundColor: 'white',
|
||||||
|
elevation: 0,
|
||||||
|
shadowColor: 'transparent',
|
||||||
|
borderRadius: 20,
|
||||||
|
},
|
||||||
|
dialogTitle: {
|
||||||
|
fontSize: 22,
|
||||||
|
color: Colors.secondary30.color,
|
||||||
|
},
|
||||||
|
dialogContentContainer: {
|
||||||
|
marginHorizontal: 24,
|
||||||
|
marginBottom: 24,
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
dialogDesc: {
|
||||||
|
fontSize: 14,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
},
|
||||||
|
dialogBulletPointWrapper: {
|
||||||
|
marginStart: 8,
|
||||||
|
gap: 6,
|
||||||
|
marginTop: 8,
|
||||||
|
},
|
||||||
|
dialogLongBulletPointWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
gap: 6,
|
||||||
|
},
|
||||||
|
buttonContained: {
|
||||||
|
backgroundColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
buttonOutlined: {
|
||||||
|
borderColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default DialogLostOrDamagedPassport;
|
91
src/components/dialog/DialogPassportInfo.tsx
Normal file
91
src/components/dialog/DialogPassportInfo.tsx
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import {StyleSheet, Text, View} from 'react-native';
|
||||||
|
import {Dialog, Portal, Button} from 'react-native-paper';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
import FontFamily from '../../../assets/styles/FontFamily';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
visible: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const DialogPassportInfo = (props: Props) => {
|
||||||
|
const {visible, onClose} = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Portal>
|
||||||
|
<Dialog visible={visible} style={styles.dialogContainer}>
|
||||||
|
<View style={styles.dialogContentContainer}>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Keterangan di dalamnya menjadi tidak jelas atau memberi kesan yang
|
||||||
|
tidak pantas lagi sebagai dokumen resmi (pasal 36 ayat (1) huruf
|
||||||
|
(d.2) Permenkumham RI no 8 tahun 2014 ttg Paspor Biasa dan SPLP)
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.dialogDesc}>Informasi Keadaan Paspor:</Text>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
1. Keadaan Baik
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Paspor masih dalam keadaan baik atau sangat baik, tanpa ada
|
||||||
|
kerusakan apapun.
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
2. Keadaan Rusak
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Paspor ada kerusakan (contoh: tersobek, terbakar, dll) dan bagian
|
||||||
|
data diri tidak dapat terbaca.
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.dialogDesc, {...FontFamily.notoSansBold}]}>
|
||||||
|
3. Hilang
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.dialogDesc}>
|
||||||
|
Paspor hilang dan tidak dapat ditemukan karena suatu keadaan
|
||||||
|
(tertinggal, dicuri, dan lain-lain).
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<Button
|
||||||
|
style={styles.buttonContinue}
|
||||||
|
mode="contained"
|
||||||
|
textColor={Colors.neutral100.color}
|
||||||
|
onPress={() => {
|
||||||
|
onClose();
|
||||||
|
}}>
|
||||||
|
Lanjut
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Dialog>
|
||||||
|
</Portal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
dialogContainer: {
|
||||||
|
backgroundColor: 'white',
|
||||||
|
elevation: 0,
|
||||||
|
shadowColor: 'transparent',
|
||||||
|
borderRadius: 20,
|
||||||
|
},
|
||||||
|
dialogContentContainer: {
|
||||||
|
marginHorizontal: 24,
|
||||||
|
marginBottom: 24,
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
dialogDesc: {
|
||||||
|
fontSize: 14,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
},
|
||||||
|
dialogDescRed: {
|
||||||
|
...FontFamily.notoSansBold,
|
||||||
|
color: Colors.indicatorRed.color,
|
||||||
|
includeFontPadding: false,
|
||||||
|
},
|
||||||
|
buttonContinue: {
|
||||||
|
backgroundColor: Colors.primary30.color,
|
||||||
|
marginTop: 12,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default DialogPassportInfo;
|
14
src/data/DropdownData/DestinationCountryData.tsx
Normal file
14
src/data/DropdownData/DestinationCountryData.tsx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const destinationCountryData = [
|
||||||
|
{label: 'Japan', value: '1'},
|
||||||
|
{label: 'South Korea', value: '2'},
|
||||||
|
{label: 'Thailand', value: '3'},
|
||||||
|
{label: 'Singapore', value: '4'},
|
||||||
|
{label: 'Australia', value: '5'},
|
||||||
|
{label: 'United States', value: '6'},
|
||||||
|
{label: 'United Kingdom', value: '7'},
|
||||||
|
{label: 'France', value: '8'},
|
||||||
|
{label: 'Germany', value: '9'},
|
||||||
|
{label: 'Canada', value: '10'},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default destinationCountryData;
|
13
src/data/DropdownData/FamilyRelationshipData.tsx
Normal file
13
src/data/DropdownData/FamilyRelationshipData.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const familyRelationshipData = [
|
||||||
|
{label: 'Suami/Istri', value: '1'},
|
||||||
|
{label: 'Ayah', value: '2'},
|
||||||
|
{label: 'Ibu', value: '3'},
|
||||||
|
{label: 'Kakak/Adik', value: '4'},
|
||||||
|
{label: 'Anak', value: '5'},
|
||||||
|
{label: 'Tante', value: '6'},
|
||||||
|
{label: 'Paman', value: '7'},
|
||||||
|
{label: 'Saudara', value: '8'},
|
||||||
|
{label: 'Keluarga/Kerabat Lainnya', value: '9'},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default familyRelationshipData;
|
@ -1,12 +1,119 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {Text, View} from 'react-native';
|
import {ScrollView, StatusBar, Text, View} from 'react-native';
|
||||||
import styles from './styles';
|
import styles from './styles';
|
||||||
|
import {RootStackParamList} from '../../navigation/type';
|
||||||
|
import {NativeStackNavigationProp} from '@react-navigation/native-stack';
|
||||||
|
import {useNavigation} from '@react-navigation/native';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||||
|
|
||||||
|
type EazyPassportScreenNavigationProp = NativeStackNavigationProp<
|
||||||
|
RootStackParamList,
|
||||||
|
'EazyPassport'
|
||||||
|
>;
|
||||||
|
|
||||||
function EazyPassportScreen() {
|
function EazyPassportScreen() {
|
||||||
|
const navigation = useNavigation<EazyPassportScreenNavigationProp>();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<ScrollView>
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<Text>Eazy Passport Screen</Text>
|
<StatusBar
|
||||||
|
backgroundColor={Colors.secondary30.color}
|
||||||
|
barStyle="light-content"
|
||||||
|
/>
|
||||||
|
<View style={styles.appBarContainer}>
|
||||||
|
<Icon
|
||||||
|
name="arrow-left"
|
||||||
|
size={24}
|
||||||
|
style={styles.appBarIcon}
|
||||||
|
color={Colors.neutral100.color}
|
||||||
|
onPress={() => navigation.goBack()}
|
||||||
|
/>
|
||||||
|
<Text style={styles.appBarTitle}>Eazy Passport</Text>
|
||||||
</View>
|
</View>
|
||||||
|
<View style={styles.textContainer}>
|
||||||
|
<Text style={styles.textDesc}>
|
||||||
|
Layanan Eazy Passport yaitu pelayanan paspor yang dilaksanakan di
|
||||||
|
luar kantor dan menuju lokasi pemohon dengan menggunakan mobil
|
||||||
|
layanan paspor keliling dan/atau mobile unit Surat Perjalanan
|
||||||
|
Republik Indonesia (SPRI).
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.textDesc}>
|
||||||
|
Ketentuan dan prosedur pemberian layanan paspor dalam pelaksanaan
|
||||||
|
Layanan Eazy Passport adalah sebagai berikut:
|
||||||
|
</Text>
|
||||||
|
<View style={{gap: 4}}>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>1.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Layanan Eazy Passport melayani minimal 50 (lima puluh)
|
||||||
|
permohonan per hari;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>2.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Keluarga dari para pegawai di lingkungan Perkantoran Pemerintah/
|
||||||
|
TNI /POLRI / BUMN/BUMD/Swasta dan institusi pendidikan dapat
|
||||||
|
diberikan pelayanan paspor dalam pelaksanaan Layanan Eazy
|
||||||
|
Passport;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>3.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Layanan Eazy Passport hanya melayani pembuatan paspor baru dan
|
||||||
|
penggantian paspor karena habis masa berlaku dan halaman penuh,
|
||||||
|
tidak melayani penggantian paspor karena hilang atau rusak;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>4.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Jadwal layanan ditentukan oleh Kantor Imigrasi setempat dan
|
||||||
|
dilayani di hari kerja (pukul 08.00 s/d 16.00 waktu setempat)
|
||||||
|
atau di luar jam/hari kerja;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>5.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Pelaksanaan input data dan pengambilan biometrik dilakukan
|
||||||
|
dengan mobile unit SPRI baik secara online atau offline;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>6.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Proses penyelesaian paspor 4 (empat) hari kerja setelah pemohon
|
||||||
|
melakukan pembayaran PNBP sesuai dengan jenis paspor yang
|
||||||
|
dipilih;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>7.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Pemohon Layanan Eazy Passport dapat diberikan layanan percepatan
|
||||||
|
paspor selesai pada hari yang sama dengan syarat pembayaran PNBP
|
||||||
|
dilakukan sebelum pukul 13.00 waktu setempat;
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', gap: 6}}>
|
||||||
|
<Text style={styles.textDesc}>8.</Text>
|
||||||
|
<Text style={[styles.textDesc, {flex: 1}]}>
|
||||||
|
Pengambilan paspor yang sudah dicetak pada Kantor Imigrasi dapat
|
||||||
|
diambil langsung oleh pemohon paspor, diambil oleh perwakilan
|
||||||
|
instansi/kantor/komunitas sebagaimana tersebut pada angka 1
|
||||||
|
dengan melampirkan surat kuasa/ surat perintah dari
|
||||||
|
pimpinan/para pemohon atau dikirim melalui jasa PT. Pos
|
||||||
|
Indonesia.
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</ScrollView>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,36 @@
|
|||||||
import {StyleSheet} from 'react-native';
|
import {StyleSheet} from 'react-native';
|
||||||
|
import FontFamily from '../../../assets/styles/FontFamily';
|
||||||
|
import Colors from '../../../assets/styles/Colors';
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
alignContent: 'center',
|
|
||||||
alignItems: 'center',
|
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
justifyContent: 'center',
|
},
|
||||||
|
textContainer: {
|
||||||
|
gap: 8,
|
||||||
|
margin: 16
|
||||||
|
},
|
||||||
|
textDesc: {
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
fontSize: 12,
|
||||||
|
includeFontPadding: false,
|
||||||
|
textAlign: 'justify',
|
||||||
|
},
|
||||||
|
appBarTitle: {
|
||||||
|
color: Colors.neutral100.color,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
fontSize: 22,
|
||||||
|
marginStart: 16,
|
||||||
|
},
|
||||||
|
appBarIcon: {
|
||||||
|
marginLeft: 16,
|
||||||
|
},
|
||||||
|
appBarContainer: {
|
||||||
|
height: 64,
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: Colors.secondary30.color,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -45,6 +45,12 @@ const styles = StyleSheet.create({
|
|||||||
color: Colors.primary30.color,
|
color: Colors.primary30.color,
|
||||||
includeFontPadding: false,
|
includeFontPadding: false,
|
||||||
},
|
},
|
||||||
|
questionnaireDataSecondary: {
|
||||||
|
...FontFamily.notoSansBold,
|
||||||
|
fontSize: 12,
|
||||||
|
color: Colors.secondary30.color,
|
||||||
|
includeFontPadding: false,
|
||||||
|
},
|
||||||
dialogContainer: {
|
dialogContainer: {
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
@ -90,7 +96,9 @@ const styles = StyleSheet.create({
|
|||||||
backgroundColor: Colors.neutral100.color,
|
backgroundColor: Colors.neutral100.color,
|
||||||
padding: 16,
|
padding: 16,
|
||||||
},
|
},
|
||||||
nationalIdImage: {
|
documentImage: {
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
marginVertical: 16,
|
marginVertical: 16,
|
||||||
height: 350,
|
height: 350,
|
||||||
backgroundColor: Colors.primary70.color,
|
backgroundColor: Colors.primary70.color,
|
||||||
@ -99,10 +107,10 @@ const styles = StyleSheet.create({
|
|||||||
subStepButtonContainer: {
|
subStepButtonContainer: {
|
||||||
gap: 16,
|
gap: 16,
|
||||||
},
|
},
|
||||||
subStepButtonActive: {
|
subStepButtonContained: {
|
||||||
backgroundColor: Colors.primary30.color,
|
backgroundColor: Colors.primary30.color,
|
||||||
},
|
},
|
||||||
subStepButtonInActive: {
|
subStepButtonOutlined: {
|
||||||
borderColor: Colors.primary30.color,
|
borderColor: Colors.primary30.color,
|
||||||
},
|
},
|
||||||
subStepTextWrapper: {
|
subStepTextWrapper: {
|
||||||
@ -121,15 +129,15 @@ const styles = StyleSheet.create({
|
|||||||
...FontFamily.notoSansRegular,
|
...FontFamily.notoSansRegular,
|
||||||
lineHeight: 20,
|
lineHeight: 20,
|
||||||
},
|
},
|
||||||
nationalIdImageContainer: {
|
documentImageContainer: {
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
},
|
},
|
||||||
nationalIdImageCropped: {
|
documentImageCropped: {
|
||||||
marginBottom: 16,
|
marginBottom: 16,
|
||||||
width: 225,
|
width: 225,
|
||||||
height: 140,
|
height: 140,
|
||||||
backgroundColor: Colors.primary70.color,
|
backgroundColor: Colors.primary70.color,
|
||||||
borderRadius: 20,
|
borderRadius: 8,
|
||||||
},
|
},
|
||||||
subStepTextInputContainer: {
|
subStepTextInputContainer: {
|
||||||
gap: 16,
|
gap: 16,
|
||||||
@ -159,6 +167,100 @@ const styles = StyleSheet.create({
|
|||||||
padding: 16,
|
padding: 16,
|
||||||
marginVertical: 16,
|
marginVertical: 16,
|
||||||
gap: 16,
|
gap: 16,
|
||||||
|
backgroundColor: Colors.neutral100.color,
|
||||||
|
},
|
||||||
|
documentImageSupportText: {
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
color: Colors.neutral100.color,
|
||||||
|
includeFontPadding: false,
|
||||||
|
fontSize: 14,
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
textInputBulletTextWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
gap: 6,
|
||||||
|
},
|
||||||
|
textInputSupportText: {
|
||||||
|
fontSize: 10,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
color: '#8F9098',
|
||||||
|
},
|
||||||
|
sectionButtonWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
buttonContainedSecondary: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: Colors.secondary30.color,
|
||||||
|
},
|
||||||
|
subStepSectionButtonContainer: {
|
||||||
|
marginBottom: 24,
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
subStepSectionButtonTextTitle: {
|
||||||
|
marginBottom: 8,
|
||||||
|
fontSize: 12,
|
||||||
|
includeFontPadding: false,
|
||||||
|
...FontFamily.notoSansBold,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
subStepSectionButtonTextWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
},
|
||||||
|
subStepCheckWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
gap: 8,
|
||||||
|
},
|
||||||
|
applicantDetailContentContainer: {
|
||||||
|
borderRadius: 16,
|
||||||
|
backgroundColor: Colors.neutral100.color,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: Colors.primary70.color,
|
||||||
|
marginVertical: 12,
|
||||||
|
padding: 16,
|
||||||
|
gap: 8,
|
||||||
|
},
|
||||||
|
applicantDetailTextContentWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
gap: 8,
|
||||||
|
},
|
||||||
|
applicantDetailTopContentWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
applicantDetailIconContentWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
gap: 16,
|
||||||
|
},
|
||||||
|
applicantDetailTextTitle: {
|
||||||
|
fontSize: 12,
|
||||||
|
...FontFamily.notoSansRegular,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
applicantDetailTextDesc: {
|
||||||
|
fontSize: 12,
|
||||||
|
...FontFamily.notoSansBold,
|
||||||
|
includeFontPadding: false,
|
||||||
|
color: Colors.primary30.color,
|
||||||
|
flex: 1.2,
|
||||||
|
},
|
||||||
|
applicantDetailContentChildContainer: {
|
||||||
|
padding: 16,
|
||||||
|
borderWidth: 1,
|
||||||
|
marginVertical: 8,
|
||||||
|
borderColor: Colors.primary70.color,
|
||||||
|
borderRadius: 8,
|
||||||
|
gap: 12,
|
||||||
|
},
|
||||||
|
applicantDetailBottomContentWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user