@fto-consult/expo-ui 7.24.3 → 8.0.0

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 (47) hide show
  1. package/App.js +6 -3
  2. package/app.json +1 -0
  3. package/bin/create-app.js +13 -4
  4. package/copy-env-file.js +1 -1
  5. package/docs/navigation/drawerItems/index.js +16 -0
  6. package/docs/navigation/drawerSections.js +14 -0
  7. package/docs/screens/Datagrid/{Datagrid.js → index.js} +1 -1
  8. package/docs/screens/index.js +1 -0
  9. package/package.json +141 -139
  10. package/src/App.js +1 -1
  11. package/src/AppEntry/index.js +1 -0
  12. package/src/components/AppBar/BackAction.js +46 -0
  13. package/src/components/AppBar/Content.js +3 -3
  14. package/src/components/AppBar/index.js +8 -3
  15. package/src/components/Datagrid/Accordion/index.js +1 -0
  16. package/src/components/Datagrid/Common/Common.js +1 -1
  17. package/src/components/Datagrid/Test/index.js +1 -1
  18. package/src/components/Drawer/DrawerItems/index.js +1 -1
  19. package/src/components/Dropdown/index.js +30 -8
  20. package/src/components/ErrorBoundary/ErrorMessage.js +5 -5
  21. package/src/components/Form/Fields/SelectTableData/Component.js +2 -2
  22. package/src/components/Image/index.js +13 -15
  23. package/src/components/Link/index.js +2 -2
  24. package/src/components/SplashScreen/index.js +9 -1
  25. package/src/components/TableLink/index.js +2 -1
  26. package/src/components/TouchableRipple/index.js +38 -0
  27. package/src/components/TouchableRipple/index.web.js +22 -0
  28. package/src/context/Provider.js +0 -1
  29. package/src/layouts/AppBar/index.js +1 -1
  30. package/src/layouts/DatabaseStatistics/DatabaseStatistic.js +6 -11
  31. package/src/layouts/DatabaseStatistics/index.js +10 -4
  32. package/src/layouts/Screen/TableData.js +15 -5
  33. package/src/media/camera.js +13 -1
  34. package/src/media/camera.native.js +135 -2
  35. package/src/media/file-system/utils/FileSaver.native.js +62 -25
  36. package/src/media/file-system/utils/native/index.js +11 -1
  37. package/src/media/file-system/utils/web/index.js +21 -1
  38. package/src/media/index.js +27 -35
  39. package/src/media/utils.js +27 -0
  40. package/src/navigation/Drawer/items/index.js +1 -1
  41. package/src/navigation/animationTypes.js +48 -0
  42. package/src/navigation/index.js +11 -7
  43. package/src/screens/Auth/Profile.js +12 -0
  44. package/src/screens/Help/openLibraries.js +9 -9
  45. package/webpack.config.js +5 -0
  46. package/docs/drawerItems/index.js +0 -17
  47. package/docs/drawerItems/introduction.js +0 -8
@@ -6,38 +6,75 @@ import * as Sharing from 'expo-sharing';
6
6
  export const save = ({content,isBase64:isB64,share,directory,fileName,path})=>{
7
7
  path = defaultStr(path,directory,Directories.DOCUMENTS).trim().rtrim("/");
8
8
  share = defaultBool(share,true);
9
- let hasFound = false;
9
+ let foundDirectory = null,dirToMake = null;
10
10
  for(let i in Directories){
11
11
  if(path.includes(Directories[i].rtrim("/"))){
12
- hasFound = true;
12
+ foundDirectory = Directories[i];
13
13
  break;
14
14
  }
15
15
  }
16
- if(!hasFound){
16
+ if(!foundDirectory){
17
17
  path = Directories.DOCUMENTS;
18
+ } else {
19
+ dirToMake = path.split(foundDirectory)[1];
20
+ path = foundDirectory;
21
+ if(dirToMake){
22
+ const dd = [];
23
+ dirToMake = dirToMake.replaceAll("\\","/").trim().split("/").filter((d)=>{
24
+ d = d.trim().rtrim("/").ltrim("/");
25
+ if(d){
26
+ dd.push(d);
27
+ return true;
28
+ }
29
+ return false;
30
+ });
31
+ dirToMake = dd;
32
+ } else dirToMake = null;
18
33
  }
19
- path = p.join(path,fileName);
20
- const cb = (r,resolve)=>{
21
- setTimeout(()=>{
22
- if(share){
23
- Sharing.shareAsync(path);
24
- }
25
- },0);
26
- const r2 = {fileName,path,result:r};
27
- typeof resolve =='function' && resolve(r2);;
28
- return r2;
34
+ const success = ()=>{
35
+ path = p.join(path,fileName);
36
+ const cb = (r,resolve)=>{
37
+ setTimeout(()=>{
38
+ if(share){
39
+ Sharing.shareAsync(path);
40
+ }
41
+ },0);
42
+ const r2 = {fileName,path,result:r};
43
+ typeof resolve =='function' && resolve(r2);;
44
+ return r2;
45
+ }
46
+ if(isB64 || isBase64(content)){
47
+ return FileSystem.writeAsStringAsync(path,content,{ encoding: FileSystem.EncodingType.Base64 }).then(cb);
48
+ }
49
+ return new Promise((resolve,reject)=>{
50
+ const fr = new FileReader();
51
+ fr.onload = () => {
52
+ return FileSystem.writeAsStringAsync(path, fr.result.split(',')[1], { encoding: FileSystem.EncodingType.Base64 }).then((r)=>{
53
+ return cb(r,resolve);
54
+ }).catch(reject);
55
+ };
56
+ fr.onerror(reject);
57
+ fr.readAsDataURL(content);
58
+ });
29
59
  }
30
- if(isB64 || isBase64(content)){
31
- return FileSystem.writeAsStringAsync(path,content,{ encoding: FileSystem.EncodingType.Base64 }).then(cb);
60
+ if(Array.isArray(dirToMake) && dirToMake.length){
61
+ return new Promise((resolve,reject)=>{
62
+ const next = ()=>{
63
+ if(!dirToMake.length){
64
+ return success().then(resolve).catch(reject);
65
+ }
66
+ const dir = dirToMake.shift();
67
+ path = p.join(path,dir);
68
+ return FileSystem.makeDirectoryAsync(path,{ intermediates: true }).then(next).catch(reject);
69
+ }
70
+ return (typeof FileSystem.requestDirectoryPermissionsAsync == "function"? FileSystem.requestDirectoryPermissionsAsync: ()=>Promise.resolve(({directoryUri:path,granted:true})))(path).then(({directoryUri,granted})=>{
71
+ if(granted){
72
+ path = directoryUri;
73
+ return next();
74
+ }
75
+ return {message:`Accès au repertoire ${path} non autorisé par l'utilisateur`}
76
+ }).catch(reject);
77
+ });
32
78
  }
33
- return new Promise((resolve,reject)=>{
34
- const fr = new FileReader();
35
- fr.onload = () => {
36
- return FileSystem.writeAsStringAsync(path, fr.result.split(',')[1], { encoding: FileSystem.EncodingType.Base64 }).then((r)=>{
37
- return cb(r,resolve);
38
- }).catch(reject);
39
- };
40
- fr.onerror(reject);
41
- fr.readAsDataURL(content);
42
- });
79
+ return success();
43
80
  }
@@ -1,3 +1,4 @@
1
+ import { isNonNullString } from '$cutils';
1
2
  import * as FileSystem from 'expo-file-system';
2
3
  export * from "expo-file-system";
3
4
 
@@ -10,4 +11,13 @@ export const Directories = {
10
11
  }
11
12
  }
12
13
 
13
- export {FileSystem};
14
+ export {FileSystem};
15
+
16
+ export const deleteFile = (filePath,...options)=>{
17
+ if(!isNonNullString(filePath)){
18
+ return Promise.reject({message:`Impossible de supprimer le fichier de chemin invalide!! veuillez spécifier une chaine de caractère comme chemin de fichier à supprimer`,filePath})
19
+ }
20
+ return FileSystem.deleteAsync(filePath,...options);
21
+ }
22
+
23
+ export {deleteFile as delete};
@@ -1,5 +1,6 @@
1
1
  import { isAssets } from "../../../Assets/utils";
2
2
  import {isNonNullString} from "$cutils";
3
+ import {isElectron} from "$cplatform";
3
4
 
4
5
  export const readBlob = (asset)=>{
5
6
  const uri = isAssets(asset)? asset.uri :isNonNullString(asset)? asset : undefined;
@@ -31,4 +32,23 @@ export const readAsStringAsync = async (asset)=>{
31
32
  return readAs(asset);
32
33
  }
33
34
 
34
- export const Directories = {};
35
+ export const Directories = {};
36
+
37
+ export const deleteFile = (filePath,...options)=>{
38
+ if(!isNonNullString(filePath)){
39
+ return Promise.reject({message:`Impossible de supprimer le fichier de chemin invalide!! veuillez spécifier une chaine de caractère comme chemin de fichier à supprimer`,filePath})
40
+ }
41
+ if(!isElectron() || !window?.ELECTRON || !window.ELECTRON?.FILE || typeof ELECTRON.FILE?.deleteFile !=="function"){
42
+ return Promise.reject({message:`Impossible de supprimer le fichier dans cet environnement, cet environnement ne supporte pas la supression des fichier`});
43
+ }
44
+ return new Promise((resolve,reject)=>{
45
+ try {
46
+ ELECTRON.FILE.deleteFile(filePath,...options);
47
+ resolve(true);
48
+ } catch(e){
49
+ reject(e);
50
+ }
51
+ });
52
+ }
53
+
54
+ export {deleteFile as delete};
@@ -1,7 +1,8 @@
1
- import {isObj} from "$cutils";
1
+ import {isObj,isBase64} from "$cutils";
2
2
  import notify from "$enotify";
3
3
  import Camera from "./camera";
4
4
  import {isMobileNative} from "$platform";
5
+ import {getFilePickerOptions} from "./utils";
5
6
  import React from "react";
6
7
 
7
8
  let cameraRef = null;
@@ -26,9 +27,9 @@ export const MEDIA_TYPES = {
26
27
 
27
28
  export {ImagePicker};
28
29
 
29
- export function checkPermission (){
30
+ export function checkPermission (method){
30
31
  return new Promise((resolve,reject)=>{
31
- ImagePicker.requestMediaLibraryPermissionsAsync().then((r)=>{
32
+ (typeof method =="function" && method || ImagePicker.requestMediaLibraryPermissionsAsync)().then((r)=>{
32
33
  if(isObj(r) && (r.granted || r.status =='granted')){
33
34
  resolve(r);
34
35
  return true;
@@ -43,23 +44,24 @@ export function checkPermission (){
43
44
  })
44
45
  }
45
46
 
47
+ export * from "./utils";
48
+
49
+ const prepareImageResult = (result)=>{
50
+ if(!isObj(result)) return result;
51
+ result.dataURL = result.dataUrl = isBase64(result.base64) ? ('data:image/jpeg;base64,'+result.base64) : undefined;
52
+ return result;
53
+ }
54
+
46
55
  /**** @see : https://docs.expo.dev/versions/latest/sdk/imagepicker/#imagepickeroptions
47
56
  * form more options.
48
57
  */
49
58
  export const pickImageOrVideo = (options)=>{
50
59
  return checkPermission().then(()=>{
51
60
  return new Promise((resolve,reject)=>{
52
- ImagePicker.launchImageLibraryAsync(extendObj({},{
53
- allowsEditing : true,
54
- allowsMultipleSelection : false,///web only
55
- aspect : [4,3], //[number, number]An array with two entries [x, y] specifying the aspect ratio to maintain if the user is allowed to edit the image (by passing allowsEditing: true). This is only applicable on Android, since on iOS the crop rectangle is always a square.
56
- base64 : false, //Whether to also include the image data in Base64 format.
57
- exif : false, //Whether to also include the EXIF data for the image. On iOS the EXIF data does not include GPS tags in the camera case.
58
- mediaTypes : ImagePicker.MediaTypeOptions.All, //@see : https://docs.expo.dev/versions/latest/sdk/imagepicker/#mediatypeoptions
59
- quality : 1, //Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality.
60
- },options)).then((result)=>{
61
- if(!result.cancelled) resolve(result);
62
- else {
61
+ ImagePicker.launchImageLibraryAsync(getFilePickerOptions(options)).then((result)=>{
62
+ if(!result.cancelled) {
63
+ resolve(prepareImageResult(result));
64
+ } else {
63
65
  notify.warning("Opération annulée par l'utilisateur");
64
66
  reject(result);
65
67
  }
@@ -101,33 +103,23 @@ export {Camera};
101
103
  export async function canTakePhoto(){
102
104
  if(!isMobileNative()) return false;
103
105
  return true;
104
- const canTake = await Camera.isAvailableAsync();
105
- return canTake;
106
- return isMobileNative() || canTake;
107
106
  }
108
107
 
109
108
  export const takePhoto = (options)=>{
110
- console.log(cameraRef," is camera ref")
111
- if(!cameraRef){
112
- return Promise.reject({
113
- msg : "Camera non initialisée"
114
- })
115
- }
116
109
  return new Promise((resolve,reject)=>{
117
- (async ()=>{
118
- let takeP = await canTakePhoto();
119
- if(takeP){
120
- //const types = await Camera.getAvailableCameraTypesAsync();
121
- //console.log(types," is stypes hein")
122
- const permission = await Camera.requestCameraPermissionsAsync();
123
- if(permission.status === 'granted' || permission.granted){
124
- return cameraRef.takePictureAsync(options).then(resolve).catch(reject);
110
+ return checkPermission(ImagePicker.requestCameraPermissionsAsync).then((perm)=>{
111
+ options = {base64:true,...Object.assign({},options)}
112
+ return ImagePicker.launchCameraAsync({...getFilePickerOptions(options)}).then((result)=>{
113
+ if(!result.cancelled) {
114
+ resolve(prepareImageResult(result));
125
115
  } else {
126
- notify.error("Impossible d'utiliser l'appareil photo car vous avez interdit l'utilisation de votre camera.")
127
- reject(permission)
116
+ notify.warning("Opération annulée par l'utilisateur");
117
+ reject(result);
128
118
  }
129
- }
130
- })();
119
+ return null;
120
+ })
121
+ }).catch(reject);
131
122
  })
132
123
  }
133
124
 
125
+ export const takePicture = takePhoto;
@@ -0,0 +1,27 @@
1
+ import { extendObj } from "$cutils";
2
+ import * as ImagePicker from 'expo-image-picker';
3
+ /*** retourne les optiosn pour la sélection d'un fchier ou d'un audio */
4
+ export const getFilePickerOptions = (options)=>{
5
+ return extendObj({},{
6
+ allowsEditing : true,
7
+ allowsMultipleSelection : false,///web only
8
+ aspect : [4,3], //[number, number]An array with two entries [x, y] specifying the aspect ratio to maintain if the user is allowed to edit the image (by passing allowsEditing: true). This is only applicable on Android, since on iOS the crop rectangle is always a square.
9
+ base64 : false, //Whether to also include the image data in Base64 format.
10
+ exif : false, //Whether to also include the EXIF data for the image. On iOS the EXIF data does not include GPS tags in the camera case.
11
+ mediaTypes : ImagePicker.MediaTypeOptions.All, //@see : https://docs.expo.dev/versions/latest/sdk/imagepicker/#mediatypeoptions
12
+ quality : 1, //Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality.
13
+ },options);
14
+ }
15
+ /*** retourne les ooptions pour la capture d'une photo
16
+ @see : https://docs.expo.dev/versions/v49.0.0/sdk/camera/#camerapictureoptions,
17
+ */
18
+ export const getTakePhotoOptions = (options)=>{
19
+ const opts = extendObj({},{
20
+ base64 : false, //Whether to also include the image data in Base64 format.
21
+ quality : 0.8, //Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality.
22
+ },options);
23
+ if(typeof opts.height !=="number"){
24
+ delete opts.height;
25
+ }
26
+ return opts;
27
+ }
@@ -125,7 +125,7 @@ const useGetItems = (options)=>{
125
125
  });
126
126
  let hasCapture = false;
127
127
  const captureSide = {
128
- label : <RecordingButton/>,
128
+ label : (p)=><RecordingButton/>,
129
129
  style : [theme.styles.noPadding],
130
130
  labelProps : {style : [{flexShrink : 1},theme.styles.alignItemsFlexStart,theme.styles.w100]}
131
131
  };
@@ -0,0 +1,48 @@
1
+ import {isMobileNative,isAndroid,isIos} from "$cplatform";
2
+ import {CardStyleInterpolators,TransitionPresets} from "./Stack";
3
+ import Auth from "$cauth";
4
+ import { isNonNullString,isObj } from "$cutils";
5
+
6
+ const sessionKey = "screen-nav-animation-type";
7
+
8
+ //@see : https://reactnavigation.org/docs/stack-navigator/
9
+ export function getAnimationType (){
10
+ return prepareAnimType(Auth.getSessionData(sessionKey));
11
+ }
12
+ export const setAnimationType = (anim)=>{
13
+ return Auth.setSessionData(sessionKey,prepareAnimType(anim));
14
+ }
15
+
16
+ export const prepareAnimType = (animType)=>{
17
+ if(!isNonNullString(animType) || !animationTypes[animType]){
18
+ animType = isAndroid() ? "FadeFromBottomAndroid" : "DefaultTransition"
19
+ }
20
+ if(!TransitionPresets[animType]){
21
+ for(let i in TransitionPresets){
22
+ if(isObj(TransitionPresets[i])){
23
+ return i;
24
+ }
25
+ }
26
+ }
27
+ return animType;
28
+ }
29
+
30
+ /*** retourne l'animation courante */
31
+ export const getAnimation = ()=>{
32
+ const animType = getAnimationType();
33
+ return TransitionPresets[animType] || {};
34
+ }
35
+
36
+ export const animationTypes = isIos()? {
37
+ SlideFromRightIOS : {code:"SlideFromRightIOS",label:"Standard"},
38
+ ModalSlideFromBottomIOS : {code : "ModalSlideFromBottomIOS",label:"Navigation standard"},
39
+ //ModalPresentationIOS : {code : "ModalPresentationIOS",label : "Présentation modal, version iOS >=13"},
40
+ DefaultTransition : {code:"DefaultTransition",label:"Par défaut",default:true},
41
+ } : isAndroid() ? {
42
+ FadeFromBottomAndroid : {code:"FadeFromBottomAndroid",label:"Transition haut vers le bas"},
43
+ RevealFromBottomAndroid : {code : "RevealFromBottomAndroid",label : "Animation standard"},
44
+ ScaleFromCenterAndroid : {code:"ScaleFromCenterAndroid",label:"Transition vers le centre, version android > 10"},
45
+ DefaultTransition : {code:"DefaultTransition",label:"Par défaut",default:true}
46
+ } : {
47
+ DefaultTransition : {code:"DefaultTransition",label:"Par défaut",default:true},
48
+ };
@@ -6,7 +6,8 @@ import DrawerNavigator from "./Drawer";
6
6
  import useContext from "$econtext/hooks";
7
7
  import { MainNavigationProvider } from "./hooks";
8
8
  import {isWeb,isAndroid} from "$cplatform";
9
- import Stack,{CardStyleInterpolators} from "./Stack";
9
+ import Stack from "./Stack";
10
+ import { getAnimation } from "./animationTypes";
10
11
  import {extendObj,defaultObj} from "$cutils";
11
12
  import theme from "$theme";;
12
13
 
@@ -19,7 +20,7 @@ export * from "./utils";
19
20
  */
20
21
  export default function NavigationComponent (props){
21
22
  let {state,hasGetStarted,isLoading,onGetStart,initialRouteName,...rest} = props;
22
- const cardStyleInterpolator = isAndroid() ? CardStyleInterpolators.forFadeFromBottomAndroid : CardStyleInterpolators.forHorizontalIOS;
23
+ const cardStyleInterpolator = null;//getAnimation();
23
24
  const {navigation:{screens,screenOptions}} = useContext();
24
25
  const allScreens = initScreens({Factory:Stack,screens,ModalFactory:Stack});
25
26
  initialRouteName = sanitizeName(initialRouteName);
@@ -40,6 +41,7 @@ export default function NavigationComponent (props){
40
41
  animationEnabled : !isWeb(),
41
42
  detachPreviousScreen: !navigation.isFocused(),
42
43
  cardStyleInterpolator,
44
+ ...Object.assign({},getAnimation()),
43
45
  ...defaultObj(opt2),
44
46
  },sOptions);
45
47
  }
@@ -53,10 +55,10 @@ export default function NavigationComponent (props){
53
55
  initialRouteName={initialRouteName}
54
56
  screenOptions={getScreenOptions}
55
57
  >
56
- {drawerScreens.length ? <Stack.Group>
58
+ {<Stack.Group>
57
59
  {drawerScreens}
58
- </Stack.Group>:null}
59
- {stackScreens.length ? <Stack.Group
60
+ </Stack.Group>}
61
+ <Stack.Group
60
62
  key = {"MODAL-DRAWERS-SCREENS"}
61
63
  screenOptions={function(options){
62
64
  return getScreenOptions(options,{
@@ -67,10 +69,12 @@ export default function NavigationComponent (props){
67
69
  }}
68
70
  >
69
71
  {stackScreens}
70
- </Stack.Group>:null}
72
+ </Stack.Group>
71
73
  </Stack.Navigator> }
72
74
  </DrawerNavigator>
73
75
  </MainNavigationProvider>
74
76
  }
75
77
 
76
- export * from "$cnavigation";
78
+ export * from "$cnavigation";
79
+
80
+ export * from "./animationTypes";
@@ -14,6 +14,8 @@ import {isElectron} from "$cplatform";
14
14
  import {isValidUrl} from "$cutils";
15
15
  import {screenName} from "./utils";
16
16
  import notify from "$notify";
17
+ import {getAnimationType,setAnimationType,animationTypes} from "$enavigation/animationTypes"
18
+ import {isWeb} from "$cplatform";
17
19
 
18
20
  export default function UserProfileScreen({fields,...p}){
19
21
  const {auth:{profilePropsMutator}} = useContext();
@@ -32,6 +34,15 @@ export default function UserProfileScreen({fields,...p}){
32
34
  },
33
35
  ...defaultObj(fields?.avatar),
34
36
  },
37
+ animationType : {
38
+ type : "select",
39
+ label : "Transition entre les écrans",
40
+ items : animationTypes,
41
+ itemValue : ({item})=>item.code,
42
+ renderItem : ({item})=>item.label,
43
+ defaultValue : getAnimationType(),
44
+ required : true,
45
+ },
35
46
  })
36
47
  const p2 = {...p,fields};
37
48
  const props = typeof profilePropsMutator =='function'? extendObj({},p,profilePropsMutator(p2)) : p2;
@@ -104,6 +115,7 @@ export default function UserProfileScreen({fields,...p}){
104
115
  APP.trigger(APP.EVENTS.UPDATE_THEME,user.theme);
105
116
  APP.trigger(APP.EVENTS.AUTH_UPDATE_PROFILE,toSave);
106
117
  },100);
118
+ setAnimationType(data.animationType);
107
119
  if(typeof props.onSave ==='function' && props.onSave({...rest,data:toSave,response,goBack,navigate}) === false) return;
108
120
  if(props.navigateToHomeOnSave !== true && typeof goBack =='function' && !hasChangeRef.current){
109
121
  return goBack(true);
@@ -1,7 +1,7 @@
1
1
  module.exports = {
2
2
  "@fto-consult/expo-ui": {
3
3
  "name": "@fto-consult/expo-ui",
4
- "version": "7.23.1",
4
+ "version": "7.24.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/borispipo/expo-ui.git"
@@ -49,12 +49,12 @@ module.exports = {
49
49
  "license": "MIT"
50
50
  },
51
51
  "@fto-consult/common": {
52
- "version": "4.7.2",
52
+ "version": "4.8.33",
53
53
  "url": "https://github.com/borispipo/common#readme",
54
54
  "license": "ISC"
55
55
  },
56
56
  "@fto-consult/node-utils": {
57
- "version": "1.4.5",
57
+ "version": "1.4.7",
58
58
  "license": "MIT"
59
59
  },
60
60
  "@pchmn/expo-material3-theme": {
@@ -123,7 +123,7 @@ module.exports = {
123
123
  "license": "MIT"
124
124
  },
125
125
  "expo": {
126
- "version": "49.0.21",
126
+ "version": "49.0.22",
127
127
  "url": "https://github.com/expo/expo/tree/main/packages/expo",
128
128
  "license": "MIT"
129
129
  },
@@ -205,11 +205,6 @@ module.exports = {
205
205
  "version": "3.7.5",
206
206
  "license": "BSD-3-Clause"
207
207
  },
208
- "pdfmake": {
209
- "version": "0.2.9",
210
- "url": "http://pdfmake.org",
211
- "license": "MIT"
212
- },
213
208
  "process": {
214
209
  "version": "0.11.10",
215
210
  "url": "git://github.com/shtylman/node-process.git",
@@ -249,6 +244,11 @@ module.exports = {
249
244
  "url": "https://github.com/RonRadtke/react-native-blob-util",
250
245
  "license": "MIT"
251
246
  },
247
+ "react-native-gesture-handler": {
248
+ "version": "2.12.1",
249
+ "url": "https://github.com/software-mansion/react-native-gesture-handler#readme",
250
+ "license": "MIT"
251
+ },
252
252
  "react-native-get-random-values": {
253
253
  "version": "1.9.0",
254
254
  "license": "MIT"
package/webpack.config.js CHANGED
@@ -73,5 +73,10 @@ module.exports = async function(env, argv,opts) {
73
73
  }
74
74
  });
75
75
  }
76
+ config.resolve.fallback = {
77
+ ...Object.assign({},config.resolve.fallback),
78
+ crypto: require.resolve("crypto-browserify"),
79
+ stream: require.resolve("stream-browserify"),
80
+ }
76
81
  return config;
77
82
  };;
@@ -1,17 +0,0 @@
1
- import introduction from "./introduction";
2
-
3
- export default function(){
4
- return {
5
- introduction : {
6
- section : true,
7
- label :"Introduction",
8
- items : introduction,
9
- },
10
- components : {
11
- section : true,
12
- label : "Composants",
13
- icon : "",
14
- items : [],
15
- }
16
- }
17
- }
@@ -1,8 +0,0 @@
1
- import Introdoction from "../screens/Introduction";
2
- export default [
3
- {
4
- text : "Introduction",
5
- icon : "introduction",
6
- routeName : Introdoction.screenName,
7
- }
8
- ]