Commit 71e7f49b by tungnq

IMPORTANT : Đã bổ sung camera vào màn profile

parent f5753f42
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<application <application
android:name=".MainApplication" android:name=".MainApplication"
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) needs access to your Camera.</string>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
"react-native-tab-view": "^3.0.1", "react-native-tab-view": "^3.0.1",
"react-native-touch-id": "^4.4.1", "react-native-touch-id": "^4.4.1",
"react-native-vector-icons": "^8.1.0", "react-native-vector-icons": "^8.1.0",
"react-native-vision-camera": "^4.7.2",
"react-native-webview": "^13.12.2", "react-native-webview": "^13.12.2",
"react-redux": "^7.2.4", "react-redux": "^7.2.4",
"redux": "^4.1.0", "redux": "^4.1.0",
......
import React from 'react';
import { StyleSheet, Text, View, Image, TouchableOpacity } from 'react-native';
import { Camera } from 'react-native-vision-camera';
const CameraScreen = ({
avatarUri,
openCamera, // () => void
showCamera, // boolean
cameraRef, // React.RefObject<Camera>
device, // CameraDevice | undefined
onToggleCameraPosition, // () => void (thay cho setUseFront)
onTakePhoto, // () => void
onCloseCamera, // () => void (thay cho setShowCamera(false))
}) => {
return (
<View style={{ flex: 1 }}>
{/* Avatar */}
<View style={{ alignItems: 'center', marginTop: 16 }}>
{avatarUri ? (
<Image source={{ uri: avatarUri }} style={{ width: 120, height: 120, borderRadius: 60 }} />
) : (
<View style={{ width: 120, height: 120, borderRadius: 60, backgroundColor: '#eee' }} />
)}
<TouchableOpacity onPress={openCamera} style={styles.pickBtn}>
<Text style={styles.pickBtnText}>Chn nh</Text>
</TouchableOpacity>
</View>
{/* Overlay Camera */}
{showCamera && (
<View style={styles.overlay}>
{device ? (
<>
<Camera
ref={cameraRef}
style={StyleSheet.absoluteFill}
device={device}
isActive={showCamera}
photo // cần để dùng takePhoto()
/>
<View style={styles.controls}>
<TouchableOpacity style={styles.smallBtn} onPress={onToggleCameraPosition}>
<Text style={styles.btnText}>Đổi cam</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.shutter} onPress={onTakePhoto} />
<TouchableOpacity style={styles.smallBtn} onPress={onCloseCamera}>
<Text style={styles.btnText}>Đóng</Text>
</TouchableOpacity>
</View>
</>
) : (
<View style={[styles.overlay, styles.center]}>
<Text style={{ color: '#fff' }}>Không tìm thy camera</Text>
<TouchableOpacity style={[styles.smallBtn, { marginTop: 16 }]} onPress={onCloseCamera}>
<Text style={styles.btnText}>Đóng</Text>
</TouchableOpacity>
</View>
)}
</View>
)}
</View>
);
};
export default CameraScreen;
const styles = StyleSheet.create({
overlay: {
position: 'absolute', top: 0, left: 0, right: 0, bottom: 0,
backgroundColor: 'black',
},
controls: {
position: 'absolute', bottom: 30, left: 0, right: 0,
flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center',
},
shutter: {
width: 68, height: 68, borderRadius: 34,
borderWidth: 4, borderColor: '#fff',
backgroundColor: 'rgba(255,255,255,0.2)',
},
smallBtn: {
paddingHorizontal: 12, paddingVertical: 8,
borderRadius: 8, backgroundColor: 'rgba(255,255,255,0.2)',
},
btnText: { color: '#fff', fontWeight: '600' },
pickBtn: {
marginTop: 12, padding: 8, backgroundColor: '#2e6ef7', borderRadius: 8,
},
pickBtnText: { color: '#fff', fontWeight: '600' },
center: { justifyContent: 'center', alignItems: 'center' },
});
import React, {useState} from 'react'; import React, { useRef, useState } from 'react';
import {Text, View, StyleSheet} from 'react-native'; import { Platform } from 'react-native';
import ProfileView from './view'; import ProfileView from './view';
import { useCameraDevice, useCameraPermission } from 'react-native-vision-camera';
const Profile = props => { const Profile = () => {
const [user, setUser] = useState({ // --- mock profile ---
const [user] = useState({
name: 'Phạm Minh Quân', name: 'Phạm Minh Quân',
role: 'Trợ lý bộ môn thuộc trường', role: 'Trợ lý bộ môn thuộc trường',
code: '80578', code: '80578',
...@@ -24,7 +26,7 @@ const Profile = props => { ...@@ -24,7 +26,7 @@ const Profile = props => {
workCommencementDate: '20/03/2025', workCommencementDate: '20/03/2025',
}); });
// States cho các TextField trong form // --- form states ---
const [phoneNumber, setPhoneNumber] = useState(''); const [phoneNumber, setPhoneNumber] = useState('');
const [oldTeacherCode, setOldTeacherCode] = useState(''); const [oldTeacherCode, setOldTeacherCode] = useState('');
const [workPlace, setWorkPlace] = useState(''); const [workPlace, setWorkPlace] = useState('');
...@@ -58,16 +60,45 @@ const Profile = props => { ...@@ -58,16 +60,45 @@ const Profile = props => {
const [salaryIncreaseMilestone, setSalaryIncreaseMilestone] = useState(''); const [salaryIncreaseMilestone, setSalaryIncreaseMilestone] = useState('');
const [lecturerTitle, setLecturerTitle] = useState(''); const [lecturerTitle, setLecturerTitle] = useState('');
// --- radio group ---
const [selectedValue2, setSelectedValue2] = useState('1'); const [selectedValue2, setSelectedValue2] = useState('1');
const options2 = [ const options2 = [
{label: 'Cơ chế', value: '1'}, { label: 'Cơ chế', value: '1' },
{label: 'Biên hữu', value: '2'}, { label: 'Biên hữu', value: '2' },
]; ];
const onValueChange2 = (v) => setSelectedValue2(v);
const onValueChange2 = value => {
setSelectedValue2(value); // --- camera logic (container) ---
const [showCamera, setShowCamera] = useState(false);
const [avatarUri, setAvatarUri] = useState(null);
const [useFront, setUseFront] = useState(false);
const cameraRef = useRef(null);
const device = useCameraDevice(useFront ? 'front' : 'back');
const { hasPermission, requestPermission } = useCameraPermission();
const openCamera = async () => {
if (!hasPermission) {
const ok = await requestPermission();
if (!ok) return;
}
setShowCamera(true);
}; };
const onTakePhoto = async () => {
if (!cameraRef.current) return;
const photo = await cameraRef.current.takePhoto({
qualityPrioritization: 'balanced',
flash: 'off',
});
const uri = Platform.OS === 'android' ? 'file://' + photo.path : photo.path;
setAvatarUri(uri);
setShowCamera(false);
};
const onToggleCameraPosition = () => setUseFront((v) => !v);
const onCloseCamera = () => setShowCamera(false);
// --- save handler ---
const handleSave = () => { const handleSave = () => {
const formData = { const formData = {
phoneNumber, phoneNumber,
...@@ -103,84 +134,68 @@ const Profile = props => { ...@@ -103,84 +134,68 @@ const Profile = props => {
currentSalaryCoefficient, currentSalaryCoefficient,
salaryIncreaseMilestone, salaryIncreaseMilestone,
lecturerTitle, lecturerTitle,
avatarUri,
}; };
console.log('Profile Form Data:', formData); console.log('Profile Form Data:', formData);
// TODO: Implement save logic // TODO: call API save
}; };
// ❗ Chỉ MỘT return: truyền mọi thứ xuống View
return ( return (
<ProfileView <ProfileView
// profile
dataProfile={user} dataProfile={user}
// camera props (UI sẽ dùng để hiển thị)
avatarUri={avatarUri}
onPressSelectImage={openCamera}
showCamera={showCamera}
cameraRef={cameraRef}
device={device}
onToggleCameraPosition={onToggleCameraPosition}
onTakePhoto={onTakePhoto}
onCloseCamera={onCloseCamera}
// radio
selectedValue2={selectedValue2} selectedValue2={selectedValue2}
options2={options2} options2={options2}
onValueChange2={onValueChange2} onValueChange2={onValueChange2}
// TextField states
phoneNumber={phoneNumber} // form states
setPhoneNumber={setPhoneNumber} phoneNumber={phoneNumber} setPhoneNumber={setPhoneNumber}
oldTeacherCode={oldTeacherCode} oldTeacherCode={oldTeacherCode} setOldTeacherCode={setOldTeacherCode}
setOldTeacherCode={setOldTeacherCode} workPlace={workPlace} setWorkPlace={setWorkPlace}
workPlace={workPlace} position={position} setPosition={setPosition}
setWorkPlace={setWorkPlace} extraDuty={extraDuty} setExtraDuty={setExtraDuty}
position={position} laborType={laborType} setLaborType={setLaborType}
setPosition={setPosition} employmentType={employmentType} setEmploymentType={setEmploymentType}
extraDuty={extraDuty} appointmentDecision={appointmentDecision} setAppointmentDecision={setAppointmentDecision}
setExtraDuty={setExtraDuty} appointmentDate={appointmentDate} setAppointmentDate={setAppointmentDate}
laborType={laborType} issuingAgency={issuingAgency} setIssuingAgency={setIssuingAgency}
setLaborType={setLaborType} jobBeforeRecruitment={jobBeforeRecruitment} setJobBeforeRecruitment={setJobBeforeRecruitment}
employmentType={employmentType} allowanceSeniorityDate={allowanceSeniorityDate} setAllowanceSeniorityDate={setAllowanceSeniorityDate}
setEmploymentType={setEmploymentType} workAllowancePercent={workAllowancePercent} setWorkAllowancePercent={setWorkAllowancePercent}
appointmentDecision={appointmentDecision} teacherAllowancePercent={teacherAllowancePercent} setTeacherAllowancePercent={setTeacherAllowancePercent}
setAppointmentDecision={setAppointmentDecision} teacherType={teacherType} setTeacherType={setTeacherType}
appointmentDate={appointmentDate} academicUnit={academicUnit} setAcademicUnit={setAcademicUnit}
setAppointmentDate={setAppointmentDate} subjectDepartment={subjectDepartment} setSubjectDepartment={setSubjectDepartment}
issuingAgency={issuingAgency} employmentStatus={employmentStatus} setEmploymentStatus={setEmploymentStatus}
setIssuingAgency={setIssuingAgency} workStartDate={workStartDate} setWorkStartDate={setWorkStartDate}
jobBeforeRecruitment={jobBeforeRecruitment} currentContractType={currentContractType} setCurrentContractType={setCurrentContractType}
setJobBeforeRecruitment={setJobBeforeRecruitment} contractStartDate={contractStartDate} setContractStartDate={setContractStartDate}
allowanceSeniorityDate={allowanceSeniorityDate} contractEndDate={contractEndDate} setContractEndDate={setContractEndDate}
setAllowanceSeniorityDate={setAllowanceSeniorityDate} currentContractNumber={currentContractNumber} setCurrentContractNumber={setCurrentContractNumber}
workAllowancePercent={workAllowancePercent} contractEffectiveDate={contractEffectiveDate} setContractEffectiveDate={setContractEffectiveDate}
setWorkAllowancePercent={setWorkAllowancePercent} fullTimeWorkStartDate={fullTimeWorkStartDate} setFullTimeWorkStartDate={setFullTimeWorkStartDate}
teacherAllowancePercent={teacherAllowancePercent} lastClassificationDate={lastClassificationDate} setLastClassificationDate={setLastClassificationDate}
setTeacherAllowancePercent={setTeacherAllowancePercent} currentWorkAllowancePercent={currentWorkAllowancePercent} setCurrentWorkAllowancePercent={setCurrentWorkAllowancePercent}
teacherType={teacherType} salaryGrade={salaryGrade} setSalaryGrade={setSalaryGrade}
setTeacherType={setTeacherType} currentSalaryLevel={currentSalaryLevel} setCurrentSalaryLevel={setCurrentSalaryLevel}
academicUnit={academicUnit} currentSalaryCoefficient={currentSalaryCoefficient} setCurrentSalaryCoefficient={setCurrentSalaryCoefficient}
setAcademicUnit={setAcademicUnit} salaryIncreaseMilestone={salaryIncreaseMilestone} setSalaryIncreaseMilestone={setSalaryIncreaseMilestone}
subjectDepartment={subjectDepartment} lecturerTitle={lecturerTitle} setLecturerTitle={setLecturerTitle}
setSubjectDepartment={setSubjectDepartment}
employmentStatus={employmentStatus} // actions
setEmploymentStatus={setEmploymentStatus}
workStartDate={workStartDate}
setWorkStartDate={setWorkStartDate}
currentContractType={currentContractType}
setCurrentContractType={setCurrentContractType}
contractStartDate={contractStartDate}
setContractStartDate={setContractStartDate}
contractEndDate={contractEndDate}
setContractEndDate={setContractEndDate}
currentContractNumber={currentContractNumber}
setCurrentContractNumber={setCurrentContractNumber}
contractEffectiveDate={contractEffectiveDate}
setContractEffectiveDate={setContractEffectiveDate}
fullTimeWorkStartDate={fullTimeWorkStartDate}
setFullTimeWorkStartDate={setFullTimeWorkStartDate}
lastClassificationDate={lastClassificationDate}
setLastClassificationDate={setLastClassificationDate}
currentWorkAllowancePercent={currentWorkAllowancePercent}
setCurrentWorkAllowancePercent={setCurrentWorkAllowancePercent}
salaryGrade={salaryGrade}
setSalaryGrade={setSalaryGrade}
currentSalaryLevel={currentSalaryLevel}
setCurrentSalaryLevel={setCurrentSalaryLevel}
currentSalaryCoefficient={currentSalaryCoefficient}
setCurrentSalaryCoefficient={setCurrentSalaryCoefficient}
salaryIncreaseMilestone={salaryIncreaseMilestone}
setSalaryIncreaseMilestone={setSalaryIncreaseMilestone}
lecturerTitle={lecturerTitle}
setLecturerTitle={setLecturerTitle}
// Handlers
onSave={handleSave} onSave={handleSave}
/> />
); );
......
...@@ -59,5 +59,13 @@ const styles = StyleSheet.create({ ...@@ -59,5 +59,13 @@ const styles = StyleSheet.create({
sizedBox: { sizedBox: {
width: 15, width: 15,
}, },
overlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'black' },
controls: { position: 'absolute', bottom: 30, left: 0, right: 0, flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center' },
shutter: { width: 68, height: 68, borderRadius: 34, borderWidth: 4, borderColor: '#fff', backgroundColor: 'rgba(255,255,255,0.2)' },
smallBtn: { paddingHorizontal: 12, paddingVertical: 8, borderRadius: 8, backgroundColor: 'rgba(255,255,255,0.2)' },
btnText: { color: '#fff', fontWeight: '600' },
absoluteFill: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 },
center: { justifyContent: 'center', alignItems: 'center' },
}); });
export default styles; export default styles;
...@@ -2,24 +2,35 @@ import React from 'react'; ...@@ -2,24 +2,35 @@ import React from 'react';
import { import {
Text, Text,
View, View,
TouchableOpacity,
StyleSheet,
Image, Image,
ScrollView, ScrollView,
TouchableOpacity,
} from 'react-native'; } from 'react-native';
import styles from './style'; import styles from './style';
import Header from '../../components/Header/Header'; import Header from '../../components/Header/Header';
import R from '../../assets/R'; import R from '../../assets/R';
import Button from '../../components/Button'; import Button from '../../components/Button';
import TextField from '../../components/Input/TextField'; import TextField from '../../components/Input/TextField';
import RadioButton from '../../components/RadioButton/RadioButton';
import RadioGroup from '../../components/RadioButton/RadioGroup'; import RadioGroup from '../../components/RadioButton/RadioGroup';
import {
Camera,
} from 'react-native-vision-camera'
const ProfileView = props => { const ProfileView = props => {
const { const {
dataProfile, dataProfile,
selectedValue2,
options2, // camera
avatarUri,
onPressSelectImage,
showCamera,
cameraRef,
device,
onToggleCameraPosition,
onTakePhoto,
onCloseCamera,
selectedValue2,
options2,
onValueChange2, onValueChange2,
// TextField states // TextField states
phoneNumber, phoneNumber,
...@@ -90,573 +101,629 @@ const ProfileView = props => { ...@@ -90,573 +101,629 @@ const ProfileView = props => {
onSave, onSave,
} = props; } = props;
console.log(dataProfile?.name);
return (
<View style={styles.container}>
<Header title={'Hồ sơ giảng viên'} isBack />
<ScrollView showsVerticalScrollIndicator={false} vertical>
<View style={styles.body}>
<View style={styles.headerBody}>
<View style={styles.headerLeft}>
<View style={styles.boxCamera}>
<View style={styles.containerImage}>
<Image source={R.images.iconCamera} style={styles.image} />
</View>
<View style={styles.containerButton}>
<Button
title="Chọn ảnh"
onPress={() => {}}
backgroundColor={R.colors.blue}
textColor={R.colors.white}
height={30}
borderRadius={10}
fontSize={R.sizes.sm}
fontWeight={'600'}
fontFamily={R.fonts.fontMedium}
paddingHorizontal={15}
paddingVertical={3}
/>
</View>
</View>
</View>
<View style={styles.headerRight}>
<Text
style={[ const renderButtonCamera = () => {
styles.text, return (
{ <Button
lineHeight: 19, title="Chọn ảnh"
fontSize: R.fontsize.fontsSizeTitle, onPress={onPressSelectImage}
fontWeight: '600', backgroundColor={R.colors.blue}
fontFamily: R.fonts.fontMedium, textColor={R.colors.white}
color: R.colors.blue, height={30}
}, borderRadius={10}
]}> fontSize={R.sizes.sm}
{dataProfile?.name || 'Không có dữ liệu'} fontWeight={'600'}
</Text> fontFamily={R.fonts.fontMedium}
<Text paddingHorizontal={15}
style={[styles.text, {fontSize: R.fontsize.fontsSizeSubTitle}]}> paddingVertical={3}
{dataProfile?.role || 'Không có dữ liệu'} />
</Text> );
<Text };
style={[
styles.text, const renderHeaderBody = () => {
{ return (
lineHeight: 24, <View style={styles.headerBody}>
color: R.colors.blue, <View style={styles.headerLeft}>
fontWeight: '600', <View style={styles.boxCamera}>
fontFamily: R.fonts.fontMedium, <View style={styles.containerImage}>
}, {avatarUri ? (
]}> <Image source={{ uri: avatarUri }} style={styles.image} />
Mã CBGV:{' '} ) : (
<Text <Image source={R.images.iconCamera} style={styles.image} />
style={[ )}
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.code || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
Email:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.email || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
TK chng thc:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.authCredential || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
Đơn v công tác:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.department || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
B môn:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.teachingUnit || 'Không có dữ liệu'}
</Text>
</Text>
</View> </View>
<View style={styles.containerButton}>{renderButtonCamera()}</View>
</View> </View>
<View style={styles.bodyProfile}> </View>
<View style={styles.containerInput}>
<TextField
title={'Số điện thoại'}
value={phoneNumber}
onChangeText={setPhoneNumber}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'Mã CBGV cũ'}
value={oldTeacherCode}
onChangeText={setOldTeacherCode}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Nơi công tác'}
value={workPlace}
onChangeText={setWorkPlace}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Chức vụ'}
value={position}
onChangeText={setPosition}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Vị trí kiêm nhiệm '}
value={extraDuty}
onChangeText={setExtraDuty}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Loại lao động'}
value={laborType}
onChangeText={setLaborType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'Loại biên chế'}
value={employmentType}
onChangeText={setEmploymentType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Quyết định bổ nhiệm'}
value={appointmentDecision}
onChangeText={setAppointmentDecision}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'Ngày bổ nhiệm'}
value={appointmentDate}
onChangeText={setAppointmentDate}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Cơ quan ban hành QĐ'}
value={issuingAgency}
onChangeText={setIssuingAgency}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
width={'100%'}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}> <View style={styles.headerRight}>
<TextField <Text
title={'Công việc trước khi tuyển dụng'} style={[
value={jobBeforeRecruitment} styles.text,
onChangeText={setJobBeforeRecruitment} {
color={R.colors.black} lineHeight: 19,
fontSize={R.sizes.sm} fontSize: R.fontsize.fontsSizeTitle,
fontSizeTitle={R.sizes.sm} fontWeight: '600',
width={'100%'} fontFamily: R.fonts.fontMedium,
containerBackgroundColor={R.colors.white} color: R.colors.blue,
/> },
</View> ]}>
{dataProfile?.name || 'Không có dữ liệu'}
</Text>
<Text style={[styles.text, {fontSize: R.fontsize.fontsSizeSubTitle}]}>
{dataProfile?.role || 'Không có dữ liệu'}
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
Mã CBGV:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.code || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
Email:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.email || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
TK chng thc:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.authCredential || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
Đơn v công tác:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.department || 'Không có dữ liệu'}
</Text>
</Text>
<Text
style={[
styles.text,
{
lineHeight: 24,
color: R.colors.blue,
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
},
]}>
B môn:{' '}
<Text
style={[
styles.text,
{fontWeight: '600', fontFamily: R.fonts.fontMedium},
]}>
{dataProfile?.teachingUnit || 'Không có dữ liệu'}
</Text>
</Text>
</View>
</View>
);
};
<View style={[styles.containerInput]}> const renderBody = () => {
<RadioGroup return (
options={options2} <View style={styles.bodyProfile}>
selectedValue={selectedValue2} <View style={styles.containerInput}>
onValueChange={onValueChange2} <TextField
disabled={false} title={'Số điện thoại'}
size={20} value={phoneNumber}
backgroundBoxColor={R.colors.blue} onChangeText={setPhoneNumber}
borderBoxColor={R.colors.black} color={R.colors.black}
direction={'row'} fontSize={R.sizes.sm}
marginBtnAndLabel={10} fontSizeTitle={R.sizes.sm}
justifyContent={'space-around'} containerBackgroundColor={R.colors.white}
editable={true} width={'48%'}
containerWidth={'100%'} />
/> <View style={styles.sizedBox}></View>
</View> <TextField
title={'Mã CBGV cũ'}
value={oldTeacherCode}
onChangeText={setOldTeacherCode}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Nơi công tác'}
value={workPlace}
onChangeText={setWorkPlace}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Chức vụ'}
value={position}
onChangeText={setPosition}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
width={'100%'}
title={'Vị trí kiêm nhiệm '}
value={extraDuty}
onChangeText={setExtraDuty}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Loại lao động'}
value={laborType}
onChangeText={setLaborType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'Loại biên chế'}
value={employmentType}
onChangeText={setEmploymentType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Quyết định bổ nhiệm'}
value={appointmentDecision}
onChangeText={setAppointmentDecision}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'Ngày bổ nhiệm'}
value={appointmentDate}
onChangeText={setAppointmentDate}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Cơ quan ban hành QĐ'}
value={issuingAgency}
onChangeText={setIssuingAgency}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
width={'100%'}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Ngày hưởng PCTN'} title={'Công việc trước khi tuyển dụng'}
value={allowanceSeniorityDate} value={jobBeforeRecruitment}
onChangeText={setAllowanceSeniorityDate} onChangeText={setJobBeforeRecruitment}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} width={'100%'}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
/> />
</View> </View>
<View style={styles.containerInput}>
<TextField
title={'PCTN công tác(%)'}
value={workAllowancePercent}
onChangeText={setWorkAllowancePercent}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'PCTN nhà giáo(%)'}
value={teacherAllowancePercent}
onChangeText={setTeacherAllowancePercent}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={[styles.containerInput]}>
<TextField <RadioGroup
title={'Loại CBGV'} options={options2}
value={teacherType} selectedValue={selectedValue2}
onChangeText={setTeacherType} onValueChange={onValueChange2}
color={R.colors.black} disabled={false}
fontSize={R.sizes.sm} size={20}
fontSizeTitle={R.sizes.sm} backgroundBoxColor={R.colors.blue}
width={'100%'} borderBoxColor={R.colors.black}
containerBackgroundColor={R.colors.white} direction={'row'}
/> marginBtnAndLabel={10}
</View> justifyContent={'space-around'}
editable={true}
containerWidth={'100%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Đơn vị sinh hoạt chuyên môn'} title={'Ngày hưởng PCTN'}
value={academicUnit} value={allowanceSeniorityDate}
onChangeText={setAcademicUnit} onChangeText={setAllowanceSeniorityDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} width={'100%'}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
/> />
</View> </View>
<View style={styles.containerInput}>
<TextField
title={'PCTN công tác(%)'}
value={workAllowancePercent}
onChangeText={setWorkAllowancePercent}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
<View style={styles.sizedBox}></View>
<TextField
title={'PCTN nhà giáo(%)'}
value={teacherAllowancePercent}
onChangeText={setTeacherAllowancePercent}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Bộ môn sinh hoạt chuyên môn'} title={'Loại CBGV'}
value={subjectDepartment} value={teacherType}
onChangeText={setSubjectDepartment} onChangeText={setTeacherType}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} width={'100%'}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
/> />
</View> </View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Trạng thái làm việc'} title={'Đơn vị sinh hoạt chuyên môn'}
value={employmentStatus} value={academicUnit}
onChangeText={setEmploymentStatus} onChangeText={setAcademicUnit}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} width={'100%'}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
/> />
</View> </View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Ngày bắt đầu làm việc'} title={'Bộ môn sinh hoạt chuyên môn'}
value={workStartDate} value={subjectDepartment}
onChangeText={setWorkStartDate} onChangeText={setSubjectDepartment}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} width={'100%'}
width={'48%'} containerBackgroundColor={R.colors.white}
/> />
<View style={styles.sizedBox}></View> </View>
<TextField
title={'Loại hđ hiện hành'}
value={currentContractType}
onChangeText={setCurrentContractType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Ngày BĐ HĐ hiện hành'} title={'Trạng thái làm việc'}
value={contractStartDate} value={employmentStatus}
onChangeText={setContractStartDate} onChangeText={setEmploymentStatus}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} width={'100%'}
width={'48%'} containerBackgroundColor={R.colors.white}
/> />
<View style={styles.sizedBox}></View> </View>
<TextField
title={'Ngày KT HĐ hiện hành'}
value={contractEndDate}
onChangeText={setContractEndDate}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Số hợp đồng hiện hành'} title={'Ngày bắt đầu làm việc'}
value={currentContractNumber} value={workStartDate}
onChangeText={setCurrentContractNumber} onChangeText={setWorkStartDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} containerBackgroundColor={R.colors.white}
containerBackgroundColor={R.colors.white} width={'48%'}
/> />
</View> <View style={styles.sizedBox}></View>
<TextField
title={'Loại hđ hiện hành'}
value={currentContractType}
onChangeText={setCurrentContractType}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Ngày HL HĐ hiện hành'} title={'Ngày BĐ HĐ hiện hành'}
value={contractEffectiveDate} value={contractStartDate}
onChangeText={setContractEffectiveDate} onChangeText={setContractStartDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
width={'48%'} width={'48%'}
/> />
<View style={styles.sizedBox}></View> <View style={styles.sizedBox}></View>
<TextField <TextField
title={'Ngày BĐ làm việc CT'} title={'Ngày KT HĐ hiện hành'}
value={fullTimeWorkStartDate} value={contractEndDate}
onChangeText={setFullTimeWorkStartDate} onChangeText={setContractEndDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
width={'48%'} width={'48%'}
/> />
</View> </View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Thời điểm xếp BL cuối'} title={'Số hợp đồng hiện hành'}
value={lastClassificationDate} value={currentContractNumber}
onChangeText={setLastClassificationDate} onChangeText={setCurrentContractNumber}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} width={'100%'}
width={'48%'} containerBackgroundColor={R.colors.white}
/> />
<View style={styles.sizedBox}></View> </View>
<TextField
title={'(%) PCTNVK hiện hành'}
value={currentWorkAllowancePercent}
onChangeText={setCurrentWorkAllowancePercent}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Ngạch lương'} title={'Ngày HL HĐ hiện hành'}
value={salaryGrade} value={contractEffectiveDate}
onChangeText={setSalaryGrade} onChangeText={setContractEffectiveDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} containerBackgroundColor={R.colors.white}
containerBackgroundColor={R.colors.white} width={'48%'}
/> />
</View> <View style={styles.sizedBox}></View>
<TextField
title={'Ngày BĐ làm việc CT'}
value={fullTimeWorkStartDate}
onChangeText={setFullTimeWorkStartDate}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Bậc lương hiện hành'} title={'Thời điểm xếp BL cuối'}
value={currentSalaryLevel} value={lastClassificationDate}
onChangeText={setCurrentSalaryLevel} onChangeText={setLastClassificationDate}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
width={'48%'} width={'48%'}
/> />
<View style={styles.sizedBox}></View> <View style={styles.sizedBox}></View>
<TextField <TextField
title={'Hệ số lương hiện hành'} title={'(%) PCTNVK hiện hành'}
value={currentSalaryCoefficient} value={currentWorkAllowancePercent}
onChangeText={setCurrentSalaryCoefficient} onChangeText={setCurrentWorkAllowancePercent}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
width={'48%'} width={'48%'}
/> />
</View> </View>
<View style={styles.containerInput}>
<TextField
title={'Mốc nâng lương'}
value={salaryIncreaseMilestone}
onChangeText={setSalaryIncreaseMilestone}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
width={'48%'}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}> <View style={styles.containerInput}>
<TextField <TextField
title={'Chức danh giảng viên'} title={'Ngạch lương'}
value={lecturerTitle} value={salaryGrade}
onChangeText={setLecturerTitle} onChangeText={setSalaryGrade}
color={R.colors.black} color={R.colors.black}
fontSize={R.sizes.sm} fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm} fontSizeTitle={R.sizes.sm}
width={'100%'} width={'100%'}
containerBackgroundColor={R.colors.white} containerBackgroundColor={R.colors.white}
/> />
</View> </View>
<Button <View style={styles.containerInput}>
title={'Lưu'} <TextField
onPress={onSave} title={'Bậc lương hiện hành'}
backgroundColor={R.colors.blue} value={currentSalaryLevel}
textColor={R.colors.white} onChangeText={setCurrentSalaryLevel}
fontSize={R.sizes.sm} color={R.colors.black}
paddingHorizontal={15} fontSize={R.sizes.sm}
paddingVertical={5} fontSizeTitle={R.sizes.sm}
borderRadius={10} containerBackgroundColor={R.colors.white}
fontSizeTitle={R.sizes.sm} width={'48%'}
/> />
</View> <View style={styles.sizedBox}></View>
<TextField
title={'Hệ số lương hiện hành'}
value={currentSalaryCoefficient}
onChangeText={setCurrentSalaryCoefficient}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
containerBackgroundColor={R.colors.white}
width={'48%'}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Mốc nâng lương'}
value={salaryIncreaseMilestone}
onChangeText={setSalaryIncreaseMilestone}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
width={'48%'}
containerBackgroundColor={R.colors.white}
/>
</View>
<View style={styles.containerInput}>
<TextField
title={'Chức danh giảng viên'}
value={lecturerTitle}
onChangeText={setLecturerTitle}
color={R.colors.black}
fontSize={R.sizes.sm}
fontSizeTitle={R.sizes.sm}
width={'100%'}
containerBackgroundColor={R.colors.white}
/>
</View>
<Button
title={'Lưu'}
onPress={onSave}
backgroundColor={R.colors.blue}
textColor={R.colors.white}
fontSize={R.sizes.sm}
paddingHorizontal={15}
paddingVertical={5}
borderRadius={10}
fontSizeTitle={R.sizes.sm}
/>
</View>
);
};
return (
<View style={styles.container}>
<Header title={'Hồ sơ giảng viên'} isBack />
<ScrollView showsVerticalScrollIndicator={false} vertical>
<View style={styles.body}>
{renderHeaderBody()}
{renderBody()}
</View> </View>
</ScrollView> </ScrollView>
{/* Overlay Camera - chỉ UI, mọi handler/state nhận từ props */}
{showCamera && (
<View style={styles.overlay}>
{device ? (
<>
<Camera
ref={cameraRef}
style={styles.absoluteFill}
device={device}
isActive={showCamera}
photo
/>
<View style={styles.controls}>
<TouchableOpacity style={styles.smallBtn} onPress={onToggleCameraPosition}>
<Text style={styles.btnText}>Đổi cam</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.shutter} onPress={onTakePhoto} />
<TouchableOpacity style={styles.smallBtn} onPress={onCloseCamera}>
<Text style={styles.btnText}>Đóng</Text>
</TouchableOpacity>
</View>
</>
) : (
<View style={[styles.overlay, styles.center]}>
<Text style={{ color: '#fff' }}>Không tìm thy camera</Text>
<TouchableOpacity style={[styles.smallBtn, { marginTop: 16 }]} onPress={onCloseCamera}>
<Text style={styles.btnText}>Đóng</Text>
</TouchableOpacity>
</View>
)}
</View>
)}
</View> </View>
); );
}; };
......
...@@ -7361,6 +7361,11 @@ react-native-vector-icons@^8.1.0: ...@@ -7361,6 +7361,11 @@ react-native-vector-icons@^8.1.0:
prop-types "^15.7.2" prop-types "^15.7.2"
yargs "^16.1.1" yargs "^16.1.1"
react-native-vision-camera@^4.7.2:
version "4.7.2"
resolved "https://registry.yarnpkg.com/react-native-vision-camera/-/react-native-vision-camera-4.7.2.tgz#e4bd8f3d893a3f5fa9d8224ce28b8ef00d171bc1"
integrity sha512-C+5PvlSunN6I4aYplSask+v3jfhgduZumIVw6H6lG+Afpf8boIcG3uFSsSfVgj+hxI7fx6qM6bsciEhzgxEUYg==
react-native-webview@^13.12.2: react-native-webview@^13.12.2:
version "13.15.0" version "13.15.0"
resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz" resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment