@fto-consult/expo-ui 7.24.3 → 8.0.1
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.
- package/App.js +6 -3
- package/app.json +1 -0
- package/bin/create-app.js +14 -11
- package/copy-env-file.js +1 -1
- package/docs/navigation/drawerItems/index.js +16 -0
- package/docs/navigation/drawerSections.js +14 -0
- package/docs/screens/Datagrid/{Datagrid.js → index.js} +1 -1
- package/docs/screens/index.js +1 -0
- package/package.json +141 -139
- package/src/App.js +1 -1
- package/src/AppEntry/index.js +1 -0
- package/src/components/AppBar/BackAction.js +46 -0
- package/src/components/AppBar/Content.js +3 -3
- package/src/components/AppBar/index.js +8 -3
- package/src/components/Datagrid/Accordion/index.js +1 -0
- package/src/components/Datagrid/Common/Common.js +1 -1
- package/src/components/Datagrid/Test/index.js +1 -1
- package/src/components/Drawer/DrawerItems/index.js +1 -1
- package/src/components/Dropdown/index.js +30 -8
- package/src/components/ErrorBoundary/ErrorMessage.js +5 -5
- package/src/components/Form/Fields/SelectTableData/Component.js +2 -2
- package/src/components/Image/index.js +13 -15
- package/src/components/Link/index.js +2 -2
- package/src/components/SplashScreen/index.js +9 -1
- package/src/components/TableLink/index.js +2 -1
- package/src/components/TouchableRipple/index.js +38 -0
- package/src/components/TouchableRipple/index.web.js +22 -0
- package/src/context/Provider.js +0 -1
- package/src/layouts/AppBar/index.js +1 -1
- package/src/layouts/DatabaseStatistics/DatabaseStatistic.js +6 -11
- package/src/layouts/DatabaseStatistics/index.js +10 -4
- package/src/layouts/Screen/TableData.js +15 -5
- package/src/media/camera.js +13 -1
- package/src/media/camera.native.js +135 -2
- package/src/media/file-system/utils/FileSaver.native.js +62 -25
- package/src/media/file-system/utils/native/index.js +11 -1
- package/src/media/file-system/utils/web/index.js +21 -1
- package/src/media/index.js +27 -35
- package/src/media/utils.js +27 -0
- package/src/navigation/Drawer/items/index.js +1 -1
- package/src/navigation/animationTypes.js +48 -0
- package/src/navigation/index.js +11 -7
- package/src/screens/Auth/Profile.js +12 -0
- package/src/screens/Help/openLibraries.js +9 -9
- package/webpack.config.js +5 -0
- package/docs/drawerItems/index.js +0 -17
- 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
|
9
|
+
let foundDirectory = null,dirToMake = null;
|
10
10
|
for(let i in Directories){
|
11
11
|
if(path.includes(Directories[i].rtrim("/"))){
|
12
|
-
|
12
|
+
foundDirectory = Directories[i];
|
13
13
|
break;
|
14
14
|
}
|
15
15
|
}
|
16
|
-
if(!
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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(
|
31
|
-
return
|
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
|
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};
|
package/src/media/index.js
CHANGED
@@ -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(
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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.
|
127
|
-
reject(
|
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 :
|
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
|
+
};
|
package/src/navigation/index.js
CHANGED
@@ -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
|
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 =
|
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
|
-
{
|
58
|
+
{<Stack.Group>
|
57
59
|
{drawerScreens}
|
58
|
-
</Stack.Group
|
59
|
-
|
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
|
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.
|
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.
|
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.
|
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.
|
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
|
-
}
|