react-native-timacare 3.3.10 → 3.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/commonjs/RNTimacare.js +1 -1
  2. package/lib/commonjs/RNTimacare.js.flow +2 -2
  3. package/lib/commonjs/RNTimacare.js.map +1 -1
  4. package/lib/commonjs/screens/camera/CCCDCameraScreen.js +1 -1
  5. package/lib/commonjs/screens/camera/CCCDCameraScreen.js.flow +257 -200
  6. package/lib/commonjs/screens/camera/CCCDCameraScreen.js.map +1 -1
  7. package/lib/commonjs/screens/nationalID/index.js +1 -1
  8. package/lib/commonjs/screens/nationalID/index.js.flow +4 -2
  9. package/lib/commonjs/screens/nationalID/index.js.map +1 -1
  10. package/lib/commonjs/screens/nationalIDBack/index.js +1 -1
  11. package/lib/commonjs/screens/nationalIDBack/index.js.flow +3 -1
  12. package/lib/commonjs/screens/nationalIDBack/index.js.map +1 -1
  13. package/lib/commonjs/screens/uploadVideo/index.js +1 -1
  14. package/lib/commonjs/screens/uploadVideo/index.js.flow +109 -61
  15. package/lib/commonjs/screens/uploadVideo/index.js.map +1 -1
  16. package/lib/commonjs/screens/uploadVideo/videoStore.js +1 -1
  17. package/lib/commonjs/screens/uploadVideo/videoStore.js.flow +4 -4
  18. package/lib/commonjs/screens/uploadVideo/videoStore.js.map +1 -1
  19. package/lib/module/RNTimacare.js +1 -1
  20. package/lib/module/RNTimacare.js.map +1 -1
  21. package/lib/module/screens/camera/CCCDCameraScreen.js +1 -1
  22. package/lib/module/screens/camera/CCCDCameraScreen.js.map +1 -1
  23. package/lib/module/screens/nationalID/index.js +1 -1
  24. package/lib/module/screens/nationalID/index.js.map +1 -1
  25. package/lib/module/screens/nationalIDBack/index.js +1 -1
  26. package/lib/module/screens/nationalIDBack/index.js.map +1 -1
  27. package/lib/module/screens/uploadVideo/index.js +1 -1
  28. package/lib/module/screens/uploadVideo/index.js.map +1 -1
  29. package/lib/module/screens/uploadVideo/videoStore.js +1 -1
  30. package/lib/module/screens/uploadVideo/videoStore.js.map +1 -1
  31. package/lib/typescript/RNTimacare.d.ts +1 -1
  32. package/lib/typescript/RNTimacare.d.ts.map +1 -1
  33. package/lib/typescript/screens/camera/CCCDCameraScreen.d.ts.map +1 -1
  34. package/lib/typescript/screens/nationalID/index.d.ts.map +1 -1
  35. package/lib/typescript/screens/nationalIDBack/index.d.ts.map +1 -1
  36. package/lib/typescript/screens/uploadVideo/index.d.ts.map +1 -1
  37. package/package.json +3 -2
  38. package/src/RNTimacare.tsx +2 -2
  39. package/src/screens/camera/CCCDCameraScreen.tsx +257 -200
  40. package/src/screens/nationalID/index.tsx +4 -2
  41. package/src/screens/nationalIDBack/index.tsx +3 -1
  42. package/src/screens/uploadVideo/index.tsx +109 -61
  43. package/src/screens/uploadVideo/videoStore.tsx +4 -4
@@ -1,2 +1,2 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.RNTimacare=RNTimacare;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _navigation=require("./navigation");var _reactNative=require("react-native");var _AppStore=_interopRequireDefault(require("./AppStore"));var _reactNativeFbsdkNext=require("react-native-fbsdk-next");var _jsxFileName="/Users/tima/Documents/Tima/tima-care-v2-sdk/src/RNTimacare.tsx";function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}function RNTimacare(props){(0,_react.useEffect)(function(){if(_reactNative.Platform.OS==='android'){_reactNativeFbsdkNext.Settings.initializeSDK();}_AppStore.default.getDeviceId();_AppStore.default.getPublicIp();_AppStore.default.getAppId();_AppStore.default.getDevicePayload();},[]);return _react.default.createElement(_navigation.PrimaryNavigator,(0,_extends2.default)({},props,{__self:this,__source:{fileName:_jsxFileName,lineNumber:18,columnNumber:10}}));}
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.RNTimacare=RNTimacare;var _react=_interopRequireWildcard(require("react"));var _navigation=require("./navigation");var _reactNative=require("react-native");var _AppStore=_interopRequireDefault(require("./AppStore"));var _reactNativeFbsdkNext=require("react-native-fbsdk-next");var _jsxFileName="/Users/tima/Documents/Tima/tima-care-v2-sdk/src/RNTimacare.tsx";function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}function RNTimacare(){(0,_react.useEffect)(function(){if(_reactNative.Platform.OS==='android'){_reactNativeFbsdkNext.Settings.initializeSDK();}_AppStore.default.getDeviceId();_AppStore.default.getPublicIp();_AppStore.default.getAppId();_AppStore.default.getDevicePayload();},[]);return _react.default.createElement(_navigation.PrimaryNavigator,{__self:this,__source:{fileName:_jsxFileName,lineNumber:18,columnNumber:10}});}
2
2
  //# sourceMappingURL=RNTimacare.js.map
@@ -5,7 +5,7 @@ import { Platform } from 'react-native';
5
5
  import appStore from './AppStore';
6
6
  import { Settings } from 'react-native-fbsdk-next';
7
7
 
8
- export function RNTimacare(props) {
8
+ export function RNTimacare() {
9
9
  useEffect(() => {
10
10
  if (Platform.OS === 'android') {
11
11
  Settings.initializeSDK();
@@ -15,5 +15,5 @@ export function RNTimacare(props) {
15
15
  appStore.getAppId();
16
16
  appStore.getDevicePayload();
17
17
  }, []);
18
- return <PrimaryNavigator {...props} />;
18
+ return <PrimaryNavigator />;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_navigation","_reactNative","_AppStore","_interopRequireDefault","_reactNativeFbsdkNext","_jsxFileName","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","RNTimacare","props","useEffect","Platform","OS","Settings","initializeSDK","appStore","getDeviceId","getPublicIp","getAppId","getDevicePayload","createElement","PrimaryNavigator","_extends2","__self","__source","fileName","lineNumber","columnNumber"],"sourceRoot":"../../src","sources":["RNTimacare.tsx"],"mappings":"0PACA,IAAAA,MAAA,CAAAC,uBAAA,CAAAC,OAAA,WACA,IAAAC,WAAA,CAAAD,OAAA,iBACA,IAAAE,YAAA,CAAAF,OAAA,iBACA,IAAAG,SAAA,CAAAC,sBAAA,CAAAJ,OAAA,gBACA,IAAAK,qBAAA,CAAAL,OAAA,4BAAmD,IAAAM,YAAA,2EAAAC,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,GAAAE,CAAA,KAAAF,OAAA,UAAAF,wBAAA,UAAAA,yBAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,IAAAF,CAAA,YAAAT,wBAAAS,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,MAAAQ,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAAC,MAAA,CAAAC,cAAA,EAAAD,MAAA,CAAAE,wBAAA,SAAAC,CAAA,IAAAd,CAAA,gBAAAc,CAAA,EAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,CAAAc,CAAA,OAAAI,CAAA,CAAAR,CAAA,CAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,CAAAc,CAAA,OAAAI,CAAA,GAAAA,CAAA,CAAAX,GAAA,EAAAW,CAAA,CAAAC,GAAA,EAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,CAAAM,CAAA,CAAAI,CAAA,EAAAV,CAAA,CAAAM,CAAA,EAAAd,CAAA,CAAAc,CAAA,UAAAN,CAAA,CAAAH,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,CAAAQ,CAAA,EAAAA,CAAA,EAE5C,QAAS,CAAAY,UAAUA,CAACC,KAAK,CAAE,CAChC,GAAAC,gBAAS,EAAC,UAAM,CACd,GAAIC,qBAAQ,CAACC,EAAE,GAAK,SAAS,CAAE,CAC7BC,8BAAQ,CAACC,aAAa,CAAC,CAAC,CAC1B,CACAC,iBAAQ,CAACC,WAAW,CAAC,CAAC,CACtBD,iBAAQ,CAACE,WAAW,CAAC,CAAC,CACtBF,iBAAQ,CAACG,QAAQ,CAAC,CAAC,CACnBH,iBAAQ,CAACI,gBAAgB,CAAC,CAAC,CAC7B,CAAC,CAAE,EAAE,CAAC,CACN,MAAO,CAAAzC,MAAA,CAAAe,OAAA,CAAA2B,aAAA,CAACvC,WAAA,CAAAwC,gBAAgB,IAAAC,SAAA,CAAA7B,OAAA,KAAKgB,KAAK,EAAAc,MAAA,MAAAC,QAAA,EAAAC,QAAA,CAAAvC,YAAA,CAAAwC,UAAA,IAAAC,YAAA,MAAG,CAAC,CACxC"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_navigation","_reactNative","_AppStore","_interopRequireDefault","_reactNativeFbsdkNext","_jsxFileName","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","RNTimacare","useEffect","Platform","OS","Settings","initializeSDK","appStore","getDeviceId","getPublicIp","getAppId","getDevicePayload","createElement","PrimaryNavigator","__self","__source","fileName","lineNumber","columnNumber"],"sourceRoot":"../../src","sources":["RNTimacare.tsx"],"mappings":"0KACA,IAAAA,MAAA,CAAAC,uBAAA,CAAAC,OAAA,WACA,IAAAC,WAAA,CAAAD,OAAA,iBACA,IAAAE,YAAA,CAAAF,OAAA,iBACA,IAAAG,SAAA,CAAAC,sBAAA,CAAAJ,OAAA,gBACA,IAAAK,qBAAA,CAAAL,OAAA,4BAAmD,IAAAM,YAAA,2EAAAC,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,GAAAE,CAAA,KAAAF,OAAA,UAAAF,wBAAA,UAAAA,yBAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,IAAAF,CAAA,YAAAT,wBAAAS,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,MAAAQ,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAAC,MAAA,CAAAC,cAAA,EAAAD,MAAA,CAAAE,wBAAA,SAAAC,CAAA,IAAAd,CAAA,gBAAAc,CAAA,EAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,CAAAc,CAAA,OAAAI,CAAA,CAAAR,CAAA,CAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,CAAAc,CAAA,OAAAI,CAAA,GAAAA,CAAA,CAAAX,GAAA,EAAAW,CAAA,CAAAC,GAAA,EAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,CAAAM,CAAA,CAAAI,CAAA,EAAAV,CAAA,CAAAM,CAAA,EAAAd,CAAA,CAAAc,CAAA,UAAAN,CAAA,CAAAH,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,CAAAQ,CAAA,EAAAA,CAAA,EAE5C,QAAS,CAAAY,UAAUA,CAAA,CAAG,CAC3B,GAAAC,gBAAS,EAAC,UAAM,CACd,GAAIC,qBAAQ,CAACC,EAAE,GAAK,SAAS,CAAE,CAC7BC,8BAAQ,CAACC,aAAa,CAAC,CAAC,CAC1B,CACAC,iBAAQ,CAACC,WAAW,CAAC,CAAC,CACtBD,iBAAQ,CAACE,WAAW,CAAC,CAAC,CACtBF,iBAAQ,CAACG,QAAQ,CAAC,CAAC,CACnBH,iBAAQ,CAACI,gBAAgB,CAAC,CAAC,CAC7B,CAAC,CAAE,EAAE,CAAC,CACN,MAAO,CAAAxC,MAAA,CAAAe,OAAA,CAAA0B,aAAA,CAACtC,WAAA,CAAAuC,gBAAgB,EAAAC,MAAA,MAAAC,QAAA,EAAAC,QAAA,CAAArC,YAAA,CAAAsC,UAAA,IAAAC,YAAA,KAAE,CAAC,CAC7B"}
@@ -1,2 +1,2 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=CCCDCameraScreen;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeVisionCamera=require("react-native-vision-camera");var _icons=require("../../assets/icons");var _MText=require("../../components/MText");var _imageEditor=_interopRequireDefault(require("@react-native-community/image-editor"));var _native=require("@react-navigation/native");var _reactNativeDeviceInfo=_interopRequireDefault(require("react-native-device-info"));var _reactNativePermissions=require("react-native-permissions");var _jsxFileName="/Users/tima/Documents/Tima/tima-care-v2-sdk/src/screens/camera/CCCDCameraScreen.tsx";function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var _Dimensions$get=_reactNative.Dimensions.get('window'),screenWidth=_Dimensions$get.width,screenHeight=_Dimensions$get.height;var frameWidth=screenWidth*0.85;var frameHeight=frameWidth*0.63;var frameLeft=(screenWidth-frameWidth)/2;var frameTop=(screenWidth*4/3-frameHeight)/2;function CCCDCameraScreen(props){var navigation=(0,_native.useNavigation)();var camera=(0,_react.useRef)(null);var device=(0,_reactNativeVisionCamera.useCameraDevice)('back');var _useState=(0,_react.useState)(true),_useState2=(0,_slicedToArray2.default)(_useState,2),cameraActive=_useState2[0],setCameraActive=_useState2[1];var _useState3=(0,_react.useState)(false),_useState4=(0,_slicedToArray2.default)(_useState3,2),passPermission=_useState4[0],setPassPermission=_useState4[1];var requestPermissions=function requestPermissions(){(0,_reactNativePermissions.request)(_reactNative.Platform.OS==='ios'?_reactNativePermissions.PERMISSIONS.IOS.CAMERA:_reactNativePermissions.PERMISSIONS.ANDROID.CAMERA).then(function(result){switch(result){case _reactNativePermissions.RESULTS.UNAVAILABLE:console.log('This feature is not available (on this device / in this context)');_reactNative.Alert.alert('Thông báo','Máy ảnh trên thiết bị không tương thích.\nVui lòng kiểm tra lại thiết bị!',[{text:'Đồng ý'}]);break;case _reactNativePermissions.RESULTS.DENIED:console.log('The permission has not been requested / is denied but requestable');_reactNative.Alert.alert('Thông báo','Bạn đã từ chối quyền máy ảnh. Vui lòng cấp quyền máy ảnh để tiếp tục!',[{text:'Đồng ý',onPress:function onPress(){if(_reactNative.Platform.OS==='ios'){(0,_reactNativePermissions.openSettings)();}else{requestPermissions();}}}]);break;case _reactNativePermissions.RESULTS.LIMITED:console.log('The permission is limited: some actions are possible');_reactNative.Alert.alert('Thông báo','Quyền máy ảnh bị hạn chế. Vui lòng kiểm tra lại để tiếp tục!',[{text:'Đồng ý',onPress:function onPress(){if(_reactNative.Platform.OS==='ios'){(0,_reactNativePermissions.openSettings)();}else{requestPermissions();}}}]);break;case _reactNativePermissions.RESULTS.GRANTED:console.log('The permission is granted');setPassPermission(true);break;case _reactNativePermissions.RESULTS.BLOCKED:console.log('The permission is denied and not requestable anymore');_reactNative.Alert.alert('Thông báo','Bạn đã từ chối quyền máy ảnh. Vui lòng cấp quyền máy ảnh để tiếp tục!',[{text:'Đồng ý'}]);break;}});};(0,_react.useEffect)(function(){requestPermissions();},[]);var takePicture=function _callee2(){var photo;return _regenerator.default.async(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:if(!(camera.current==null)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return _regenerator.default.awrap(camera.current.takePhoto({skipMetadata:true}));case 4:photo=_context2.sent;_reactNative.Image.getSize("file://"+photo.path,function _callee(width,height){var previewHeight,scaleX,scaleY,cropData,croppedUri;return _regenerator.default.async(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:previewHeight=screenWidth*4/3;scaleX=width/screenWidth;scaleY=height/previewHeight;cropData={offset:{x:frameLeft*scaleX,y:frameTop*scaleY},size:{width:frameWidth*scaleX,height:frameHeight*scaleY},displaySize:{width:frameWidth*scaleX,height:frameHeight*scaleY},resizeMode:'contain'};_context.prev=4;_context.next=7;return _regenerator.default.awrap(_imageEditor.default.cropImage("file://"+photo.path,cropData));case 7:croppedUri=_context.sent;setCameraActive(false);navigation.goBack();if(props.route.params.callback){props.route.params.callback(croppedUri.uri);}_context.next=16;break;case 13:_context.prev=13;_context.t0=_context["catch"](4);console.error(_context.t0);case 16:case"end":return _context.stop();}},null,null,[[4,13]],Promise);});case 6:case"end":return _context2.stop();}},null,null,null,Promise);};if(!device||!passPermission)return _react.default.createElement(_reactNative.View,{style:{flex:1,backgroundColor:'#000'},__self:this,__source:{fileName:_jsxFileName,lineNumber:166,columnNumber:12}});return _react.default.createElement(_reactNative.View,{style:styles.container,__self:this,__source:{fileName:_jsxFileName,lineNumber:168,columnNumber:5}},_react.default.createElement(_reactNative.View,{style:styles.topContainer,__self:this,__source:{fileName:_jsxFileName,lineNumber:169,columnNumber:7}},_react.default.createElement(_reactNative.TouchableOpacity,{onPress:function onPress(){navigation.goBack();},style:[{width:48,height:48,zIndex:1000,alignItems:'center'}],__self:this,__source:{fileName:_jsxFileName,lineNumber:170,columnNumber:9}},_react.default.createElement(_icons.IconBackWhite,{__self:this,__source:{fileName:_jsxFileName,lineNumber:178,columnNumber:11}}))),_react.default.createElement(_reactNativeVisionCamera.Camera,{style:styles.camera,device:device,isActive:cameraActive,photo:true,ref:camera,__self:this,__source:{fileName:_jsxFileName,lineNumber:181,columnNumber:7}}),_react.default.createElement(_reactNative.View,{style:styles.overlay,__self:this,__source:{fileName:_jsxFileName,lineNumber:188,columnNumber:7}},_react.default.createElement(_reactNative.View,{style:styles.darkOverlayTop,__self:this,__source:{fileName:_jsxFileName,lineNumber:189,columnNumber:9}}),_react.default.createElement(_reactNative.View,{style:styles.row,__self:this,__source:{fileName:_jsxFileName,lineNumber:190,columnNumber:9}},_react.default.createElement(_reactNative.View,{style:styles.darkOverlaySide,__self:this,__source:{fileName:_jsxFileName,lineNumber:191,columnNumber:11}}),_react.default.createElement(_reactNative.View,{style:styles.frameBorder,__self:this,__source:{fileName:_jsxFileName,lineNumber:192,columnNumber:11}}),_react.default.createElement(_reactNative.View,{style:styles.darkOverlaySide,__self:this,__source:{fileName:_jsxFileName,lineNumber:193,columnNumber:11}})),_react.default.createElement(_reactNative.View,{style:styles.darkOverlayBottom,__self:this,__source:{fileName:_jsxFileName,lineNumber:195,columnNumber:9}})),_react.default.createElement(_reactNative.View,{style:styles.captureButton,__self:this,__source:{fileName:_jsxFileName,lineNumber:197,columnNumber:7}},_react.default.createElement(_MText.MText,{style:{color:'#fff',marginBottom:16,textAlign:'center',paddingHorizontal:24},__self:this,__source:{fileName:_jsxFileName,lineNumber:198,columnNumber:9}},"Vui l\xF2ng \u0111\u1EB7t gi\u1EA5y t\u1EDD n\u1EB1m v\u1EEBa khung h\xECnh ch\u1EEF nh\u1EADt, ch\u1EE5p \u0111\u1EE7 \xE1nh s\xE1ng v\xE0 r\xF5 n\xE9t."),_react.default.createElement(_reactNative.TouchableOpacity,{onPress:takePicture,__self:this,__source:{fileName:_jsxFileName,lineNumber:209,columnNumber:9}},_react.default.createElement(_icons.TakePhotoSvg,{__self:this,__source:{fileName:_jsxFileName,lineNumber:210,columnNumber:11}}))));}var overlayColor='rgba(22, 22, 22, 0.7)';var styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:'#000'},camera:{flex:1},overlay:(0,_extends2.default)({},_reactNative.StyleSheet.absoluteFillObject,{justifyContent:'center',alignItems:'center'}),frameBorder:{width:frameWidth,height:frameHeight,borderColor:'#FDFDFD',borderWidth:2},row:{flexDirection:'row',alignItems:'center'},darkOverlayTop:{width:'100%',height:(screenHeight-frameHeight)/2,backgroundColor:overlayColor},darkOverlayBottom:{width:'100%',height:(screenHeight-frameHeight)/2,backgroundColor:overlayColor},darkOverlaySide:{width:(screenWidth-frameWidth)/2,height:frameHeight,backgroundColor:overlayColor},captureContainer:{position:'absolute',bottom:40,width:'100%',alignItems:'center'},captureButton:{position:'absolute',bottom:30,alignSelf:'center',flexDirection:'column',alignItems:'center'},topContainer:{position:'absolute',top:_reactNativeDeviceInfo.default.hasNotch()?60:24},textContainer:{position:'absolute',top:_reactNativeDeviceInfo.default.hasNotch()?60:24}});
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=CCCDCameraScreen;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeVisionCamera=require("react-native-vision-camera");var _icons=require("../../assets/icons");var _MText=require("../../components/MText");var _native=require("@react-navigation/native");var _reactNativeSafeAreaContext=require("react-native-safe-area-context");var _reactNativeImageManipulator=_interopRequireDefault(require("@oguzhnatly/react-native-image-manipulator"));var _jsxFileName="/Users/tima/Documents/Tima/tima-care-v2-sdk/src/screens/camera/CCCDCameraScreen.tsx",_this=this;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var _Dimensions$get=_reactNative.Dimensions.get('window'),screenWidth=_Dimensions$get.width,screenHeight=_Dimensions$get.height;var getImageSize=function getImageSize(uri){return new Promise(function(resolve,reject){_reactNative.Image.getSize(uri,function(width,height){return resolve({width:width,height:height});},function(err){return reject(err);});});};var clamp=function clamp(value,min,max){return Math.min(Math.max(value,min),max);};function CCCDCameraScreen(props){var _props$route2,_props$route2$params;var insets=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)();var navigation=(0,_native.useNavigation)();var camera=(0,_react.useRef)(null);var device=(0,_reactNativeVisionCamera.useCameraDevice)('back');var _useState=(0,_react.useState)(true),_useState2=(0,_slicedToArray2.default)(_useState,2),cameraActive=_useState2[0],setCameraActive=_useState2[1];var _useCameraPermission=(0,_reactNativeVisionCamera.useCameraPermission)(),hasPermission=_useCameraPermission.hasPermission,requestPermission=_useCameraPermission.requestPermission;var _useState3=(0,_react.useState)({width:screenWidth,height:screenHeight}),_useState4=(0,_slicedToArray2.default)(_useState3,2),previewLayout=_useState4[0],setPreviewLayout=_useState4[1];(0,_react.useEffect)(function(){if(!hasPermission)requestPermission();},[hasPermission,requestPermission]);var takePicture=function _callee(){var photo,_props$route,_props$route$params,imageUri,_await$getImageSize,width,height,previewWidth,previewHeight,_frameWidth,_frameHeight,_frameX,_frameY,scale,renderedWidth,renderedHeight,offsetX,offsetY,cropX,cropY,cropWidth,cropHeight,cropXInt,cropYInt,cropWidthInt,cropHeightInt,cropData,result;return _regenerator.default.async(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(!(camera.current==null)){_context.next=2;break;}return _context.abrupt("return");case 2:_context.next=4;return _regenerator.default.awrap(camera.current.takePhoto({skipMetadata:true}));case 4:photo=_context.sent;_context.prev=5;imageUri="file://"+photo.path;_context.next=9;return _regenerator.default.awrap(getImageSize(imageUri));case 9:_await$getImageSize=_context.sent;width=_await$getImageSize.width;height=_await$getImageSize.height;previewWidth=previewLayout.width||screenWidth;previewHeight=previewLayout.height||screenHeight;_frameWidth=previewWidth*0.85;_frameHeight=_frameWidth*0.63;_frameX=(previewWidth-_frameWidth)/2;_frameY=(previewHeight-_frameHeight)/2;scale=Math.max(previewWidth/width,previewHeight/height);renderedWidth=width*scale;renderedHeight=height*scale;offsetX=(renderedWidth-previewWidth)/2;offsetY=(renderedHeight-previewHeight)/2;cropX=(_frameX+offsetX)/scale;cropY=(_frameY+offsetY)/scale;cropWidth=_frameWidth/scale;cropHeight=_frameHeight/scale;cropXInt=Math.floor(clamp(cropX,0,Math.max(0,width-1)));cropYInt=Math.floor(clamp(cropY,0,Math.max(0,height-1)));cropWidthInt=Math.floor(clamp(cropWidth,1,Math.max(1,width-cropXInt)));cropHeightInt=Math.floor(clamp(cropHeight,1,Math.max(1,height-cropYInt)));cropData={offset:{x:cropXInt,y:cropYInt},size:{width:cropWidthInt,height:cropHeightInt}};_context.next=34;return _regenerator.default.awrap(_reactNativeImageManipulator.default.manipulate(imageUri,[{crop:{originX:cropXInt,originY:cropYInt,width:cropWidthInt,height:cropHeightInt}}],{format:'jpg',compress:1}));case 34:result=_context.sent;setCameraActive(false);navigation.goBack();if((_props$route=props.route)!=null&&(_props$route$params=_props$route.params)!=null&&_props$route$params.callback){props.route.params.callback(result==null?void 0:result.uri);}_context.next=43;break;case 40:_context.prev=40;_context.t0=_context["catch"](5);console.error(_context.t0);case 43:case"end":return _context.stop();}},null,null,[[5,40]],Promise);};if(!device||!hasPermission)return _react.default.createElement(_reactNative.View,{style:{flex:1,backgroundColor:'#000'},__self:this,__source:{fileName:_jsxFileName,lineNumber:136,columnNumber:12}});var frameWidth=previewLayout.width*0.85;var frameHeight=frameWidth*0.63;var frameX=(previewLayout.width-frameWidth)/2;var frameY=(previewLayout.height-frameHeight)/2;return _react.default.createElement(_reactNative.View,{style:$container,onLayout:function onLayout(e){var _e$nativeEvent$layout=e.nativeEvent.layout,width=_e$nativeEvent$layout.width,height=_e$nativeEvent$layout.height;if(width>0&&height>0)setPreviewLayout({width:width,height:height});},__self:this,__source:{fileName:_jsxFileName,lineNumber:144,columnNumber:5}},_react.default.createElement(_reactNativeVisionCamera.Camera,{style:{flex:1},device:device,isActive:cameraActive,photo:true,ref:camera,__self:this,__source:{fileName:_jsxFileName,lineNumber:151,columnNumber:7}}),_react.default.createElement(_reactNative.View,{style:$overlay,pointerEvents:"none",__self:this,__source:{fileName:_jsxFileName,lineNumber:158,columnNumber:7}},_react.default.createElement(_reactNative.View,{style:[$darkOverlayTop,{height:frameY}],__self:this,__source:{fileName:_jsxFileName,lineNumber:159,columnNumber:9}}),_react.default.createElement(_reactNative.View,{style:$row,__self:this,__source:{fileName:_jsxFileName,lineNumber:160,columnNumber:9}},_react.default.createElement(_reactNative.View,{style:[$darkOverlaySide,{width:frameX,height:frameHeight}],__self:this,__source:{fileName:_jsxFileName,lineNumber:161,columnNumber:11}}),_react.default.createElement(_reactNative.View,{style:[$frameBorder,{width:frameWidth,height:frameHeight}],__self:this,__source:{fileName:_jsxFileName,lineNumber:164,columnNumber:11}},_react.default.createElement(Corner,{style:{top:0,left:0,borderTopWidth:CORNER_WIDTH,borderLeftWidth:CORNER_WIDTH,borderColor:BORDER_COLOR},__self:this,__source:{fileName:_jsxFileName,lineNumber:168,columnNumber:13}}),_react.default.createElement(Corner,{style:{top:0,right:0,borderTopWidth:CORNER_WIDTH,borderRightWidth:CORNER_WIDTH,borderColor:BORDER_COLOR},__self:this,__source:{fileName:_jsxFileName,lineNumber:179,columnNumber:13}}),_react.default.createElement(Corner,{style:{bottom:0,left:0,borderBottomWidth:CORNER_WIDTH,borderLeftWidth:CORNER_WIDTH,borderColor:BORDER_COLOR},__self:this,__source:{fileName:_jsxFileName,lineNumber:190,columnNumber:13}}),_react.default.createElement(Corner,{style:{bottom:0,right:0,borderBottomWidth:CORNER_WIDTH,borderRightWidth:CORNER_WIDTH,borderColor:BORDER_COLOR},__self:this,__source:{fileName:_jsxFileName,lineNumber:201,columnNumber:13}})),_react.default.createElement(_reactNative.View,{style:[$darkOverlaySide,{width:frameX,height:frameHeight}],__self:this,__source:{fileName:_jsxFileName,lineNumber:211,columnNumber:11}})),_react.default.createElement(_reactNative.View,{style:[$darkOverlayBottom,{height:frameY}],__self:this,__source:{fileName:_jsxFileName,lineNumber:215,columnNumber:9}})),_react.default.createElement(_reactNative.View,{style:[$back,{top:insets.top+16}],__self:this,__source:{fileName:_jsxFileName,lineNumber:217,columnNumber:7}},_react.default.createElement(_reactNative.TouchableOpacity,{onPress:function onPress(){navigation.goBack();},style:{position:'absolute',left:0,width:48,height:48,zIndex:1000,alignItems:'center'},__self:this,__source:{fileName:_jsxFileName,lineNumber:218,columnNumber:9}},_react.default.createElement(_icons.IconBackWhite,{__self:this,__source:{fileName:_jsxFileName,lineNumber:231,columnNumber:11}})),_react.default.createElement(_MText.MText,{style:{textAlign:'center',zIndex:10,color:'#FFFFFF',fontSize:16},__self:this,__source:{fileName:_jsxFileName,lineNumber:233,columnNumber:9}},props!=null&&(_props$route2=props.route)!=null&&(_props$route2$params=_props$route2.params)!=null&&_props$route2$params.front?'Chụp CMND/ CCCD mặt trước':'Chụp CMND/ CCCD mặt sau')),_react.default.createElement(_reactNative.View,{style:{position:'absolute',bottom:24+insets.bottom,alignSelf:'center',flexDirection:'column',alignItems:'center'},__self:this,__source:{fileName:_jsxFileName,lineNumber:246,columnNumber:7}},_react.default.createElement(_MText.MText,{style:{color:'#fff',marginBottom:16,textAlign:'center',paddingHorizontal:24},__self:this,__source:{fileName:_jsxFileName,lineNumber:255,columnNumber:9}},"Vui l\xF2ng \u0111\u1EB7t gi\u1EA5y t\u1EDD n\u1EB1m v\u1EEBa khung h\xECnh ch\u1EEF nh\u1EADt, ch\u1EE5p \u0111\u1EE7 \xE1nh s\xE1ng v\xE0 r\xF5 n\xE9t."),_react.default.createElement(_reactNative.TouchableOpacity,{onPress:takePicture,__self:this,__source:{fileName:_jsxFileName,lineNumber:266,columnNumber:9}},_react.default.createElement(_icons.TakePhotoSvg,{__self:this,__source:{fileName:_jsxFileName,lineNumber:267,columnNumber:11}}))));}var CORNER_SIZE=20;var CORNER_WIDTH=2;var BORDER_COLOR='#FDFDFD';var Corner=function Corner(_ref){var style=_ref.style;return _react.default.createElement(_reactNative.View,{style:[style,{position:'absolute',width:CORNER_SIZE,height:CORNER_SIZE}],__self:_this,__source:{fileName:_jsxFileName,lineNumber:279,columnNumber:3}});};var overlayColor='rgba(22, 22, 22, 0.7)';var $back={position:'absolute',left:0,right:0};var $overlay=(0,_extends2.default)({},_reactNative.StyleSheet.absoluteFillObject,{justifyContent:'center',alignItems:'center'});var $container={flex:1,backgroundColor:'#000'};var $row={flexDirection:'row',alignItems:'center'};var $darkOverlayTop={width:'100%',backgroundColor:overlayColor};var $darkOverlayBottom={width:'100%',backgroundColor:overlayColor};var $darkOverlaySide={backgroundColor:overlayColor};var $frameBorder={};
2
2
  //# sourceMappingURL=CCCDCameraScreen.js.map
@@ -9,111 +9,48 @@ import {
9
9
  TouchableOpacity,
10
10
  View,
11
11
  } from 'react-native';
12
- import { Camera, useCameraDevice } from 'react-native-vision-camera';
12
+ import {
13
+ Camera,
14
+ useCameraDevice,
15
+ useCameraPermission,
16
+ } from 'react-native-vision-camera';
13
17
  import { IconBackWhite, TakePhotoSvg } from '../../assets/icons';
14
18
  import { MText } from '../../components/MText';
15
- import ImageEditor from '@react-native-community/image-editor';
16
- import { CommonActions, useNavigation } from '@react-navigation/native';
17
- import DeviceInfo from 'react-native-device-info';
18
- import {
19
- request,
20
- PERMISSIONS,
21
- RESULTS,
22
- openSettings,
23
- } from 'react-native-permissions';
19
+ import { useNavigation } from '@react-navigation/native';
20
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
21
+ import RNImageManipulator from '@oguzhnatly/react-native-image-manipulator';
24
22
 
25
23
  const { width: screenWidth, height: screenHeight } = Dimensions.get('window');
26
- const frameWidth = screenWidth * 0.85;
27
- const frameHeight = frameWidth * 0.63; // tỷ lệ giống CCCD
28
- const frameLeft = (screenWidth - frameWidth) / 2;
29
- const frameTop = ((screenWidth * 4) / 3 - frameHeight) / 2;
24
+
25
+ const getImageSize = (
26
+ uri: string
27
+ ): Promise<{ width: number; height: number }> =>
28
+ new Promise((resolve, reject) => {
29
+ Image.getSize(
30
+ uri,
31
+ (width, height) => resolve({ width, height }),
32
+ (err) => reject(err)
33
+ );
34
+ });
35
+
36
+ const clamp = (value: number, min: number, max: number) =>
37
+ Math.min(Math.max(value, min), max);
38
+
30
39
  export default function CCCDCameraScreen(props) {
40
+ const insets = useSafeAreaInsets();
31
41
  const navigation = useNavigation();
32
42
  const camera = useRef(null);
33
43
  const device = useCameraDevice('back');
34
44
  const [cameraActive, setCameraActive] = useState(true);
35
- const [passPermission, setPassPermission] = useState(false);
36
-
37
- const requestPermissions = () => {
38
- request(
39
- Platform.OS === 'ios'
40
- ? PERMISSIONS.IOS.CAMERA
41
- : PERMISSIONS.ANDROID.CAMERA
42
- ).then((result) => {
43
- switch (result) {
44
- case RESULTS.UNAVAILABLE:
45
- console.log(
46
- 'This feature is not available (on this device / in this context)'
47
- );
48
- Alert.alert(
49
- 'Thông báo',
50
- 'Máy ảnh trên thiết bị không tương thích.\nVui lòng kiểm tra lại thiết bị!',
51
- [{ text: 'Đồng ý' }]
52
- );
53
- break;
54
- case RESULTS.DENIED:
55
- console.log(
56
- 'The permission has not been requested / is denied but requestable'
57
- );
58
- Alert.alert(
59
- 'Thông báo',
60
- 'Bạn đã từ chối quyền máy ảnh. Vui lòng cấp quyền máy ảnh để tiếp tục!',
61
- [
62
- {
63
- text: 'Đồng ý',
64
- onPress: () => {
65
- if (Platform.OS === 'ios') {
66
- openSettings();
67
- } else {
68
- requestPermissions();
69
- }
70
- },
71
- },
72
- ]
73
- );
74
- break;
75
- case RESULTS.LIMITED:
76
- console.log('The permission is limited: some actions are possible');
77
- Alert.alert(
78
- 'Thông báo',
79
- 'Quyền máy ảnh bị hạn chế. Vui lòng kiểm tra lại để tiếp tục!',
80
- [
81
- {
82
- text: 'Đồng ý',
83
- onPress: () => {
84
- if (Platform.OS === 'ios') {
85
- openSettings();
86
- } else {
87
- requestPermissions();
88
- }
89
- },
90
- },
91
- ]
92
- );
93
- break;
94
- case RESULTS.GRANTED:
95
- console.log('The permission is granted');
96
- setPassPermission(true);
97
- break;
98
- case RESULTS.BLOCKED:
99
- console.log('The permission is denied and not requestable anymore');
100
- Alert.alert(
101
- 'Thông báo',
102
- 'Bạn đã từ chối quyền máy ảnh. Vui lòng cấp quyền máy ảnh để tiếp tục!',
103
- [
104
- {
105
- text: 'Đồng ý',
106
- },
107
- ]
108
- );
109
- break;
110
- }
111
- });
112
- };
45
+ const { hasPermission, requestPermission } = useCameraPermission();
46
+ const [previewLayout, setPreviewLayout] = useState({
47
+ width: screenWidth,
48
+ height: screenHeight,
49
+ });
113
50
 
114
51
  useEffect(() => {
115
- requestPermissions();
116
- }, []);
52
+ if (!hasPermission) requestPermission();
53
+ }, [hasPermission, requestPermission]);
117
54
 
118
55
  const takePicture = async () => {
119
56
  if (camera.current == null) return;
@@ -122,79 +59,199 @@ export default function CCCDCameraScreen(props) {
122
59
  skipMetadata: true,
123
60
  });
124
61
 
125
- Image.getSize(`file://${photo.path}`, async (width, height) => {
126
- const previewHeight = (screenWidth * 4) / 3; // Tỷ lệ khung preview camera
62
+ try {
63
+ const imageUri = `file://${photo.path}`;
64
+ const { width, height } = await getImageSize(imageUri);
65
+ const previewWidth = previewLayout.width || screenWidth;
66
+ const previewHeight = previewLayout.height || screenHeight;
67
+
68
+ const frameWidth = previewWidth * 0.85;
69
+ const frameHeight = frameWidth * 0.63; // tỷ lệ giống CCCD
70
+ const frameX = (previewWidth - frameWidth) / 2;
71
+ const frameY = (previewHeight - frameHeight) / 2;
72
+
73
+ // Tính scale dựa trên `resizeMode="cover"` mặc định của Vision Camera phủ kín màn hình
74
+ const scale = Math.max(previewWidth / width, previewHeight / height);
75
+
76
+ // Kích thước của ảnh nếu được hiển thị và zoom lên để cover màn hình
77
+ const renderedWidth = width * scale;
78
+ const renderedHeight = height * scale;
79
+
80
+ // Độ phân giải của các phần bị tràn ra khỏi màn hình (do cover)
81
+ const offsetX = (renderedWidth - previewWidth) / 2;
82
+ const offsetY = (renderedHeight - previewHeight) / 2;
83
+
84
+ // Tính tọa độ vùng cần crop trên ảnh gốc dựa vào toạ độ của khung UI
85
+ const cropX = (frameX + offsetX) / scale;
86
+ const cropY = (frameY + offsetY) / scale;
87
+ const cropWidth = frameWidth / scale;
88
+ const cropHeight = frameHeight / scale;
127
89
 
128
- // Tính scale giữa ảnh thật khung preview
129
- const scaleX = width / screenWidth;
130
- const scaleY = height / previewHeight;
90
+ const cropXInt = Math.floor(clamp(cropX, 0, Math.max(0, width - 1)));
91
+ const cropYInt = Math.floor(clamp(cropY, 0, Math.max(0, height - 1)));
92
+ const cropWidthInt = Math.floor(
93
+ clamp(cropWidth, 1, Math.max(1, width - cropXInt))
94
+ );
95
+ const cropHeightInt = Math.floor(
96
+ clamp(cropHeight, 1, Math.max(1, height - cropYInt))
97
+ );
131
98
 
132
- // Tính tọa độ vùng cần crop trên ảnh gốc
133
99
  const cropData = {
134
100
  offset: {
135
- x: frameLeft * scaleX,
136
- y: frameTop * scaleY,
101
+ x: cropXInt,
102
+ y: cropYInt,
137
103
  },
138
104
  size: {
139
- width: frameWidth * scaleX,
140
- height: frameHeight * scaleY,
105
+ width: cropWidthInt,
106
+ height: cropHeightInt,
141
107
  },
142
- displaySize: {
143
- width: frameWidth * scaleX,
144
- height: frameHeight * scaleY,
145
- },
146
- resizeMode: 'contain',
147
108
  };
148
109
 
149
- try {
150
- const croppedUri = await ImageEditor.cropImage(
151
- `file://${photo.path}`,
152
- cropData
153
- );
154
- setCameraActive(false);
155
- navigation.goBack();
156
- if (props.route.params.callback) {
157
- props.route.params.callback(croppedUri.uri);
158
- }
159
- } catch (err) {
160
- console.error(err);
110
+ const result = await RNImageManipulator.manipulate(
111
+ imageUri,
112
+ [
113
+ {
114
+ crop: {
115
+ originX: cropXInt,
116
+ originY: cropYInt,
117
+ width: cropWidthInt,
118
+ height: cropHeightInt,
119
+ },
120
+ },
121
+ ],
122
+ { format: 'jpg', compress: 1 }
123
+ );
124
+ setCameraActive(false);
125
+ navigation.goBack();
126
+
127
+ if (props.route?.params?.callback) {
128
+ props.route.params.callback(result?.uri);
161
129
  }
162
- });
130
+ } catch (err) {
131
+ console.error(err);
132
+ }
163
133
  };
164
134
 
165
- if (!device || !passPermission)
135
+ if (!device || !hasPermission)
166
136
  return <View style={{ flex: 1, backgroundColor: '#000' }} />;
137
+
138
+ const frameWidth = previewLayout.width * 0.85;
139
+ const frameHeight = frameWidth * 0.63;
140
+ const frameX = (previewLayout.width - frameWidth) / 2;
141
+ const frameY = (previewLayout.height - frameHeight) / 2;
142
+
167
143
  return (
168
- <View style={styles.container}>
169
- <View style={styles.topContainer}>
170
- <TouchableOpacity
171
- onPress={() => {
172
- navigation.goBack();
173
- }}
174
- style={[
175
- { width: 48, height: 48, zIndex: 1000, alignItems: 'center' },
176
- ]}
177
- >
178
- <IconBackWhite />
179
- </TouchableOpacity>
180
- </View>
144
+ <View
145
+ style={$container}
146
+ onLayout={(e) => {
147
+ const { width, height } = e.nativeEvent.layout;
148
+ if (width > 0 && height > 0) setPreviewLayout({ width, height });
149
+ }}
150
+ >
181
151
  <Camera
182
- style={styles.camera}
152
+ style={{ flex: 1 }}
183
153
  device={device}
184
154
  isActive={cameraActive}
185
155
  photo={true}
186
156
  ref={camera}
187
157
  />
188
- <View style={styles.overlay}>
189
- <View style={styles.darkOverlayTop} />
190
- <View style={styles.row}>
191
- <View style={styles.darkOverlaySide} />
192
- <View style={styles.frameBorder} />
193
- <View style={styles.darkOverlaySide} />
158
+ <View style={$overlay} pointerEvents="none">
159
+ <View style={[$darkOverlayTop, { height: frameY }]} />
160
+ <View style={$row}>
161
+ <View
162
+ style={[$darkOverlaySide, { width: frameX, height: frameHeight }]}
163
+ />
164
+ <View
165
+ style={[$frameBorder, { width: frameWidth, height: frameHeight }]}
166
+ >
167
+ {/* Top Left */}
168
+ <Corner
169
+ style={{
170
+ top: 0,
171
+ left: 0,
172
+ borderTopWidth: CORNER_WIDTH,
173
+ borderLeftWidth: CORNER_WIDTH,
174
+ borderColor: BORDER_COLOR,
175
+ }}
176
+ />
177
+
178
+ {/* Top Right */}
179
+ <Corner
180
+ style={{
181
+ top: 0,
182
+ right: 0,
183
+ borderTopWidth: CORNER_WIDTH,
184
+ borderRightWidth: CORNER_WIDTH,
185
+ borderColor: BORDER_COLOR,
186
+ }}
187
+ />
188
+
189
+ {/* Bottom Left */}
190
+ <Corner
191
+ style={{
192
+ bottom: 0,
193
+ left: 0,
194
+ borderBottomWidth: CORNER_WIDTH,
195
+ borderLeftWidth: CORNER_WIDTH,
196
+ borderColor: BORDER_COLOR,
197
+ }}
198
+ />
199
+
200
+ {/* Bottom Right */}
201
+ <Corner
202
+ style={{
203
+ bottom: 0,
204
+ right: 0,
205
+ borderBottomWidth: CORNER_WIDTH,
206
+ borderRightWidth: CORNER_WIDTH,
207
+ borderColor: BORDER_COLOR,
208
+ }}
209
+ />
210
+ </View>
211
+ <View
212
+ style={[$darkOverlaySide, { width: frameX, height: frameHeight }]}
213
+ />
194
214
  </View>
195
- <View style={styles.darkOverlayBottom} />
215
+ <View style={[$darkOverlayBottom, { height: frameY }]} />
216
+ </View>
217
+ <View style={[$back, { top: insets.top + 16 }]}>
218
+ <TouchableOpacity
219
+ onPress={() => {
220
+ navigation.goBack();
221
+ }}
222
+ style={{
223
+ position: 'absolute',
224
+ left: 0,
225
+ width: 48,
226
+ height: 48,
227
+ zIndex: 1000,
228
+ alignItems: 'center',
229
+ }}
230
+ >
231
+ <IconBackWhite />
232
+ </TouchableOpacity>
233
+ <MText
234
+ style={{
235
+ textAlign: 'center',
236
+ zIndex: 10,
237
+ color: '#FFFFFF',
238
+ fontSize: 16,
239
+ }}
240
+ >
241
+ {props?.route?.params?.front
242
+ ? 'Chụp CMND/ CCCD mặt trước'
243
+ : 'Chụp CMND/ CCCD mặt sau'}
244
+ </MText>
196
245
  </View>
197
- <View style={styles.captureButton}>
246
+ <View
247
+ style={{
248
+ position: 'absolute',
249
+ bottom: 24 + insets.bottom,
250
+ alignSelf: 'center',
251
+ flexDirection: 'column',
252
+ alignItems: 'center',
253
+ }}
254
+ >
198
255
  <MText
199
256
  style={{
200
257
  color: '#fff',
@@ -214,59 +271,59 @@ export default function CCCDCameraScreen(props) {
214
271
  );
215
272
  }
216
273
 
274
+ const CORNER_SIZE = 20;
275
+ const CORNER_WIDTH = 2;
276
+ const BORDER_COLOR = '#FDFDFD';
277
+
278
+ const Corner = ({ style }: { style: ViewStyle }) => (
279
+ <View
280
+ style={[
281
+ style,
282
+ {
283
+ position: 'absolute',
284
+ width: CORNER_SIZE,
285
+ height: CORNER_SIZE,
286
+ },
287
+ ]}
288
+ />
289
+ );
290
+
217
291
  const overlayColor = 'rgba(22, 22, 22, 0.7)';
218
- const styles = StyleSheet.create({
219
- container: { flex: 1, backgroundColor: '#000' },
220
- camera: { flex: 1 },
221
- overlay: {
222
- ...StyleSheet.absoluteFillObject,
223
- justifyContent: 'center',
224
- alignItems: 'center',
225
- },
226
- frameBorder: {
227
- width: frameWidth,
228
- height: frameHeight,
229
- borderColor: '#FDFDFD',
230
- borderWidth: 2,
231
- },
232
- row: {
233
- flexDirection: 'row',
234
- alignItems: 'center',
235
- },
236
- darkOverlayTop: {
237
- width: '100%',
238
- height: (screenHeight - frameHeight) / 2,
239
- backgroundColor: overlayColor,
240
- },
241
- darkOverlayBottom: {
242
- width: '100%',
243
- height: (screenHeight - frameHeight) / 2,
244
- backgroundColor: overlayColor,
245
- },
246
- darkOverlaySide: {
247
- width: (screenWidth - frameWidth) / 2,
248
- height: frameHeight,
249
- backgroundColor: overlayColor,
250
- },
251
- captureContainer: {
252
- position: 'absolute',
253
- bottom: 40,
254
- width: '100%',
255
- alignItems: 'center',
256
- },
257
- captureButton: {
258
- position: 'absolute',
259
- bottom: 30,
260
- alignSelf: 'center',
261
- flexDirection: 'column',
262
- alignItems: 'center',
263
- },
264
- topContainer: {
265
- position: 'absolute',
266
- top: DeviceInfo.hasNotch() ? 60 : 24,
267
- },
268
- textContainer: {
269
- position: 'absolute',
270
- top: DeviceInfo.hasNotch() ? 60 : 24,
271
- },
272
- });
292
+ const $back: ViewStyle = {
293
+ position: 'absolute',
294
+ left: 0,
295
+ right: 0,
296
+ };
297
+
298
+ const $overlay: ViewStyle = {
299
+ ...StyleSheet.absoluteFillObject,
300
+ justifyContent: 'center',
301
+ alignItems: 'center',
302
+ };
303
+
304
+ const $container: ViewStyle = {
305
+ flex: 1,
306
+ backgroundColor: '#000',
307
+ };
308
+
309
+ const $row: ViewStyle = {
310
+ flexDirection: 'row',
311
+ alignItems: 'center',
312
+ };
313
+
314
+ const $darkOverlayTop: ViewStyle = {
315
+ width: '100%',
316
+ backgroundColor: overlayColor,
317
+ };
318
+
319
+ const $darkOverlayBottom: ViewStyle = {
320
+ width: '100%',
321
+ backgroundColor: overlayColor,
322
+ };
323
+ const $darkOverlaySide: ViewStyle = {
324
+ backgroundColor: overlayColor,
325
+ };
326
+ const $frameBorder: ViewStyle = {
327
+ // borderColor: '#FDFDFD',
328
+ // borderWidth: 2,
329
+ };