@fto-consult/expo-ui 8.79.0 → 8.81.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.
@@ -5,11 +5,11 @@ module.exports = (opts)=>{
5
5
  const dir = path.resolve(__dirname);
6
6
  const isDev = String(process.env.NODE_ENV).toLowerCase() !="production";
7
7
  const projectRoot = typeof opts.projectRoot =='string' && fs.existsSync(opts.projectRoot.trim()) && opts.projectRoot.trim() || process.cwd();
8
- const assets = path.resolve(dir,"assets");
9
8
  opts = typeof opts =='object' && opts ? opts : {};
10
9
  opts.platform = "expo";
11
- opts.assets = opts.assets || opts.alias && typeof opts.alias =='object' && opts.alias.$assets || assets;
12
10
  opts.projectRoot = opts.projectRoot || projectRoot;
11
+ const assets = fs.existsSync(path.resolve(opts.projectRoot,"assets")) ? path.resolve(opts.projectRoot,"assets") : path.resolve(dir,"assets");
12
+ opts.assets = opts.assets || opts.alias && typeof opts.alias =='object' && opts.alias.$assets || assets;
13
13
  opts.withPouchDB = opts.withPouchDB !== false && opts.withPouchdb !== false ? true : false;
14
14
  delete opts.withPouchdb;
15
15
  const expoUI = require("./expo-ui-path")();
@@ -33,6 +33,8 @@
33
33
  "react-native-view-shot": "3.8.0",
34
34
  "expo-intent-launcher": "~10.11.0",
35
35
  "expo-image-manipulator": "~11.8.0",
36
- "expo-document-picker": "~11.10.1"
36
+ "expo-document-picker": "~11.10.1",
37
+ "react-native-web": "~0.19.6",
38
+ "react-dom": "18.2.0"
37
39
  };
38
40
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fto-consult/expo-ui",
3
- "version": "8.79.0",
3
+ "version": "8.81.0",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "react-native-paper-doc": "https://github.com/callstack/react-native-paper/tree/main/docs/docs/guides",
6
6
  "scripts": {
@@ -48,7 +48,7 @@
48
48
  "delete-node-modules": "rimraf ./**/node_modules",
49
49
  "dev": "npx expo start --no-dev --minify -c",
50
50
  "modifier-url-remote-git": "git remote set-url origin 'https://borispipo@github.com/borispipo/smart-eneo.git'",
51
- "update": "npm i @fto-consult/common@latest react-native-web react-native-big-list@latest apexcharts@latest file-saver@latest google-libphonenumber@latest react-native-iphone-x-helper@latest react-native-mime-types@latest react-native-paper@latest react-native-paper-dates@latest react-virtuoso@latest tippy.js@latest xlsx@latest && npm run update-apexchart && npm run find-licenses"
51
+ "update": "npm i @fto-consult/common@latest react-native-big-list@latest apexcharts@latest file-saver@latest google-libphonenumber@latest react-native-iphone-x-helper@latest react-native-mime-types@latest react-native-paper@latest react-native-paper-dates@latest react-virtuoso@latest tippy.js@latest xlsx@latest && npm run update-apexchart && npm run find-licenses"
52
52
  },
53
53
  "bin": {
54
54
  "expo-ui": "bin/index.js"
@@ -81,13 +81,11 @@
81
81
  "jsbarcode": "^3.11.6",
82
82
  "prop-types": "^15.8.1",
83
83
  "react-content-loader": "^6.2.1",
84
- "react-dom": "^18.2.0",
85
84
  "react-native-big-list": "^1.6.1",
86
85
  "react-native-iphone-x-helper": "^1.3.1",
87
86
  "react-native-mime-types": "^2.5.0",
88
87
  "react-native-paper": "^5.12.3",
89
88
  "react-native-paper-dates": "^0.22.7",
90
- "react-native-web": "^0.19.11",
91
89
  "react-virtuoso": "^4.7.10",
92
90
  "readable-stream": "^4.5.2",
93
91
  "sanitize-filename": "^1.6.3",
@@ -5,6 +5,7 @@ import BackHandler from "$ecomponents/BackHandler";
5
5
  import * as Linking from 'expo-linking';
6
6
  import APP from "$capp";
7
7
  import {AppStateService,trackIDLE,stop as stopIDLE} from "$capp/idle";
8
+ import {Provider as DrawerProvider} from "$ecomponents/Drawer";
8
9
  import { NavigationContainer} from '@react-navigation/native';
9
10
  import {navigationRef} from "$cnavigation"
10
11
  import NetInfo from '$cutils/NetInfo';
@@ -299,6 +300,7 @@ function App({init:initApp,initialRouteName:appInitialRouteName,children}) {
299
300
  /> : myChildren}
300
301
  </ErrorBoundary>
301
302
  </Portal.Host>
303
+ <DrawerProvider testID="RN_DrawerProviderRight"/>
302
304
  </PaperProvider>
303
305
  </AppEntryRootView>
304
306
  </SafeAreaProvider>
package/src/auth/Login.js CHANGED
@@ -144,10 +144,10 @@ export default function LoginComponent(props){
144
144
  if(cS !== false && beforeSubmit(args) !== false){
145
145
  Preloader.open("vérification ...");
146
146
  setIsLoading(nextButtonRef,true);
147
- return auth.signIn(data).then((a)=>{
148
- if(typeof onSuccesRef.current =='function' && onSuccesRef.current(a)=== false) return;
147
+ return auth.signIn(data).then((result)=>{
148
+ if(typeof onSuccesRef.current =='function' && onSuccesRef.current({data,result})=== false) return;
149
149
  if(isFunction(onSuccess)){
150
- onSuccess(data);
150
+ onSuccess({data,result});
151
151
  } else {
152
152
  navigate("Home");
153
153
  }
@@ -171,6 +171,34 @@ export default function LoginComponent(props){
171
171
  appBarProps = {appBarProps}
172
172
  onSuccess = {onSuccess}
173
173
  auth = {auth}
174
+ formName = {formName}
175
+ /***
176
+ * permet de connecter un utilisatgeur au backend
177
+ * @param {object} data, la données liée à l'utilisateur à connecter
178
+ * @param {object} options, les options de connexion
179
+ * @return {object}, la données résultat à la fonction de connexion de l'utilisateur
180
+ */
181
+ signIn = {(data,options,...rest)=>{
182
+ options = defaultObj(options);
183
+ if(!isObj(data) || !Object.size(data,true)){
184
+ data = getData();
185
+ }
186
+ Preloader.open("Connexion ...");
187
+ return auth.signIn(data,...rest).then((result)=>{
188
+ if(typeof options.onSuccess === "function"){
189
+ if(options.onSuccess({data,result}) === false) return;
190
+ } else if(typeof options.callback === "function" && options.callback({data,result}) === false){
191
+ return;
192
+ }
193
+ if(isFunction(onSuccess) && onSuccess({data,result}) === false){
194
+ } else {
195
+ navigate("Home");
196
+ }
197
+ return result;
198
+ }).finally(()=>{
199
+ Preloader.close();
200
+ });
201
+ }}
174
202
  mediaQueryUpdateStyle={mediaQueryUpdateStyle}
175
203
  />
176
204
  const callArgs = {
@@ -221,7 +221,7 @@ export default class DatagridAccordionComponent extends Datagrid {
221
221
  return this.props.hasScrollViewParent ? true : false;
222
222
  }
223
223
  bindResizeEvents(){
224
- return true;
224
+ return false;
225
225
  }
226
226
  getPageSize (){
227
227
  return INFINITE_SCROLL_PAGE_SIZE;
@@ -0,0 +1,409 @@
1
+ import DrawerLayout from './DrawerLayout';
2
+ import {isIos} from "$cplatform";
3
+ import React from "$react";
4
+ import PropTypes from "prop-types";
5
+ import {defaultObj,isObj,isNonNullString} from "$cutils";
6
+ import theme,{Colors} from "$theme";
7
+ import Dimensions,{isDesktopMedia} from "$cplatform/dimensions";
8
+ import {open} from "$epreloader";
9
+ import {DRAWER_POSITIONS,DRAWER_TYPES,MINIMIZED_WIDTH,getDrawerWidth} from './utils';
10
+ import {closeDrawer} from './DrawerItems/utils';
11
+ import {DrawerContext} from "./context";
12
+ import NavigationView from "./NavigationView";
13
+ import { canBeMinimizedOrPermanent } from './utils';
14
+ import { useSession } from './hooks';
15
+
16
+ const canHandleExtra = x=> true;
17
+
18
+
19
+ const DrawerComponent = React.forwardRef((props,ref)=>{
20
+ let {position,permanent,onDrawerSlide,sessionName,content,
21
+ drawerItemsContainerProps,contentContainerStyle,drawerItemsProps,minimizable,
22
+ minimized,drawerItems,hideStatusBar,overlayColor, onDrawerMinimize,onDrawerToggleMinimize,
23
+ onDrawerOpen,onDrawerClose,onDrawerToggle,header,headerProps,toggleIconProps,
24
+ permanentToggleIcon,minimizedToggleIcon,temporaryToggleIcon,withMinimizedIcon,
25
+ isItemActive,onPageResize,navigationViewRef,children:customChildren,testID,drawerType,...restP} = props;
26
+ const isPortal = !!restP.isPortal;
27
+ const children = React.useMemo(()=>customChildren,[customChildren]);
28
+ testID = defaultStr(testID,"RN_DrawerComponent")
29
+ const session = useSession(sessionName);
30
+ sessionName = session.sessionName;
31
+ const sessionValue = session.get();
32
+ const drawerRef = React.useRef(null);
33
+ const onSlideCallbackRef = React.useRef(null);
34
+ drawerItemsContainerProps = defaultObj(drawerItemsContainerProps);
35
+ position = defaultStr(position);
36
+ position = DRAWER_POSITIONS[position] || (isNonNullString(sessionValue.position) && DRAWER_POSITIONS[sessionValue.position]? DRAWER_POSITIONS[sessionValue.position]:undefined) || DRAWER_POSITIONS.left
37
+ const isLeftPosition = position === DRAWER_POSITIONS.left ? true : false;
38
+ drawerType = defaultStr(drawerType).toLowerCase() || isNonNullString(sessionValue.drawerType) && DRAWER_TYPES[sessionValue.drawerType]? DRAWER_TYPES[sessionValue.drawerType] : "";
39
+ if(!DRAWER_TYPES[drawerType]){
40
+ drawerType = isIos()? DRAWER_TYPES.slide : DRAWER_TYPES.front;
41
+ }
42
+ overlayColor = Colors.isValid(overlayColor)?overlayColor:undefined;
43
+ if(!overlayColor){
44
+ overlayColor = theme.colors.backdrop;// drawerType === DRAWER_TYPES.front ? 'black' : '#00000000';
45
+ }
46
+ let drawerWidth = getDrawerWidth();
47
+ const isDesktop = isDesktopMedia();
48
+ const _canBeMinimizedOrPermanent = canBeMinimizedOrPermanent();
49
+ permanent = _canBeMinimizedOrPermanent ? (sessionValue.permanent !== undefined ? sessionValue.permanent : permanent) : false;
50
+ minimized = _canBeMinimizedOrPermanent ? (sessionValue.minimized !== undefined ? sessionValue.minimized: minimized) : false;
51
+ if(permanent === undefined){
52
+ permanent = canBeMinimizedOrPermanent()? true : false;
53
+ }
54
+ if(minimized === undefined){
55
+ minimized = false;
56
+ }
57
+ const [state,_setState] = React.useState({
58
+ minimized,
59
+ permanent,
60
+ });
61
+ if(sessionValue.permanent ===undefined){
62
+ session.set(state);
63
+ }
64
+ const setState = (s,s2)=>{
65
+ s = typeof s =='object' && s ? s : {};
66
+ s2 = typeof s2 =='object' && s2 ? s2 : {};
67
+ s2 = {...state,...s,...s2};
68
+ session.set(s2);
69
+ return _setState(s2);
70
+ }
71
+
72
+ const [context] = React.useState({});
73
+
74
+
75
+ const callbackRef = React.useRef(null);
76
+ const callback = callbackRef.current;
77
+ callbackRef.current = null;
78
+ ///permet de minimiser le drawer
79
+ context.minimize = (callback)=>{
80
+ if(!Dimensions.isDesktopMedia() || isMinimized){
81
+ return typeof callback =='function'? callback(context.getState()) : null;
82
+ }
83
+ callbackRef.current = callback;
84
+ setState({minimized:true});
85
+ }
86
+ /*** permet de restaurer le drawer */
87
+ context.restore = (callback)=>{
88
+ if(!Dimensions.isDesktopMedia() || !context.isMinimized() || !context.isPermanent()){
89
+ return typeof callback =='function'? callback(context.getState()) : null;
90
+ }
91
+ callbackRef.current = callback;
92
+ setState({minimized:false,permanent:true});
93
+ }
94
+ const checkToggleBtn = (cb)=>{
95
+ if(!Dimensions.isDesktopMedia() && drawerRef?.current?.isPermanent()){
96
+ setState({permanent:false});
97
+ if(typeof cb ==='function'){
98
+ cb(getDrawerState());
99
+ }
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+
105
+ context.toggleMinimized = (minimized,s2)=>{
106
+ if(!checkToggleBtn()) return;
107
+ if(!Dimensions.isDesktopMedia() || typeof minimized !== 'boolean' || !drawerRef.current || !drawerRef.current.isOpen()) return;
108
+ if(!minimizable === false) return;
109
+ let nS = {minimized};
110
+ if(isObj(s2)){
111
+ nS = {...s2,...nS};
112
+ }
113
+ setState(nS);
114
+ }
115
+ context.getPosition = ()=>position;
116
+ context.hasLeftPositon = ()=> position === DRAWER_POSITIONS.left;
117
+ context.hasRightPosition = ()=> position === DRAWER_POSITIONS.right;
118
+ context.isLeftPosition = ()=> isLeftPosition;
119
+ context.canToggle = x=> canHandleExtra() ? true : permanent? false : true;
120
+ context.canMinimize = x => minimizable !== false && canBeMinimizedOrPermanent() ? true : false;
121
+ context.togglePermanent = (x,cb)=>{
122
+ if(typeof x !== "boolean") return;
123
+ if(!checkToggleBtn(cb)) return;
124
+ const isPerm = drawerRef?.current?.isPermanent();
125
+ if(x && ! isPerm || !x && isPerm){
126
+ setState({permanent:x});
127
+ }
128
+ if(typeof cb =="function"){
129
+ cb(getDrawerState());
130
+ }
131
+ }
132
+
133
+ let {permanent:isPermanent,minimized:isMinimized} = session.get();
134
+ if(isPortal){
135
+ isPermanent = false;
136
+ }
137
+ if(_canBeMinimizedOrPermanent && isPermanent){
138
+ overlayColor = 'transparent';
139
+ if(isMinimized){
140
+ drawerWidth = MINIMIZED_WIDTH;
141
+ }
142
+ restP.drawerLockMode = "locked-open";
143
+ } else {
144
+ isPermanent = false;
145
+ isMinimized = false;
146
+ restP.drawerLockMode = "unlocked";
147
+ drawerWidth = drawerWidth;
148
+ }
149
+ context.isMinimizable = ()=>{
150
+ return minimizable !== false && canBeMinimizedOrPermanent() ? true : false;
151
+ }
152
+ context.isMinimized = ()=>{
153
+ return minimizable !== false && canBeMinimizedOrPermanent() && isDesktopMedia() && session.get("minimized")? true : false;
154
+ }
155
+ const hasContext = ()=>drawerRef && isObj(drawerRef?.current) && Object.size(drawerRef?.current,true);
156
+ context.canBeMinimizedOrPermanent = canBeMinimizedOrPermanent;
157
+ context.isPermanent = x=>{
158
+ if(!drawerRef.current || !drawerRef.current.isOpen()) return false;
159
+ return canBeMinimizedOrPermanent() && session.get('permanent') ? true : false;
160
+ }
161
+ const prevMinimized = React.usePrevious(isMinimized);
162
+ React.useEffect(()=>{
163
+ if(prevMinimized === isMinimized || !Dimensions.isDesktopMedia()) return;
164
+ const args = getDrawerState();
165
+ if(isMinimized && onDrawerMinimize){
166
+ onDrawerMinimize(args);
167
+ }
168
+ if(onDrawerToggleMinimize){
169
+ onDrawerToggleMinimize(args);
170
+ }
171
+ if(typeof callback =='function'){
172
+ callback(args);
173
+ }
174
+ session.set("minimized",isMinimized);
175
+ },[isMinimized])
176
+ const prevIsDesktop = React.usePrevious(isDesktop);
177
+ React.useEffect(()=>{
178
+ if(!drawerRef.current) return;
179
+ if(isDesktopMedia() && isPermanent){
180
+ drawerRef.current.openDrawer();
181
+ }
182
+ if(prevIsDesktop !== isDesktopMedia() && typeof onPageResize ==='function'){
183
+ onPageResize(getDrawerState());
184
+ }
185
+ },[isDesktop])
186
+ const getDrawerState = context.getState = (args)=>{
187
+ const isOpen = drawerRef.current && drawerRef.current.isOpen ? drawerRef.current.isOpen () : false;
188
+ return {
189
+ ...session.get(),context:drawerRef.current,permanent:isPermanent,
190
+ sessionName,
191
+ minimized : isMinimized,
192
+ permanent : isPermanent,
193
+ isPermanent,
194
+ isMinimized,
195
+ isClosed : !isOpen, closed:!isOpen,isOpen ,opened:isOpen,status: isOpen ? 'open':'closed',
196
+ ...defaultObj(args),
197
+ }
198
+ }
199
+ const customOnToggle = (args)=>{
200
+ args = getDrawerState(args);
201
+ if(onDrawerToggle){
202
+ onDrawerToggle(args)
203
+ }
204
+ if(typeof callback =='function'){
205
+ callback(args);
206
+ }
207
+ }
208
+ toggleIconProps = defaultObj(toggleIconProps);
209
+ headerProps = defaultObj(headerProps);
210
+
211
+ const getDrawerRef = x=> drawerRef;
212
+ ///lorsque le drawer est en mode permanent, l'icone par défaut est l'icon devant le dépingler du mode permanent
213
+ const backIcon = "window-close";//isLeftPosition ? "arrow-left" : "arrow-right";
214
+ const chevronIcon = isLeftPosition ? "chevron-left":"chevron-right";
215
+ context.temporaryToggleIcon = temporaryToggleIcon = React.isValidElement(temporaryToggleIcon)? temporaryToggleIcon : backIcon;
216
+ context.permanentToggleIcon = permanentToggleIcon = React.isValidElement(permanentToggleIcon)? permanentToggleIcon : chevronIcon;
217
+ context.minimizedToggleIcon = minimizedToggleIcon = React.isValidElement(minimizedToggleIcon)? minimizedToggleIcon : chevronIcon//MENU_ICON;
218
+
219
+ let toggleIconTooltip = null;
220
+ let toggleIcon = null, mobileToggleIconTooltip = "Cliquez pour "+(open?'Masquer':'Afficher')+ " le drawer";
221
+ if(!isPermanent){
222
+ toggleIconTooltip = mobileToggleIconTooltip;
223
+ toggleIcon = temporaryToggleIcon;
224
+ } else {
225
+ if(isMinimized){
226
+ toggleIconTooltip = "Cliquez pour restaurer le drawer dans son status précédent";
227
+ if(withMinimizedIcon !== false){
228
+ toggleIcon = minimizedToggleIcon;
229
+ }
230
+ } else {
231
+ toggleIcon = permanentToggleIcon;
232
+ toggleIconTooltip = 'Cliquer pour minimiser le drawer.\n si vous souhaitez passer le drawer en mode affichage temporaire, faite un long click (pressez le pour longtemps) sur ce bouton. ';
233
+ }
234
+ }
235
+ return (
236
+ <DrawerContext.Provider
237
+ value={{
238
+ ...context,
239
+ context,
240
+ drawerRef,
241
+ session,
242
+ hasContext,
243
+ close : (cb,force) =>closeDrawer(drawerRef,cb,force),
244
+ sessionName,
245
+ isItemActive : (opts)=>{
246
+ if(isItemActive){
247
+ return isItemActive(opts);
248
+ }
249
+ return false;
250
+ },getState:getDrawerState,getDrawerRef
251
+ }}>
252
+ <DrawerLayout
253
+ testID = {`${testID}_DrawerLayout`}
254
+ {...restP}
255
+ permanent = {isPermanent}
256
+ onDrawerSlide={onDrawerSlide}
257
+ onDrawerOpen = {(a)=>{
258
+ if(drawerRef.current){
259
+ drawerRef.current.drawerShown = true;
260
+ }
261
+ if(onDrawerOpen){
262
+ onDrawerOpen({context:drawerRef.current})
263
+ }
264
+ customOnToggle({...getDrawerState(),closed:false, isClosed : false,isOpen:true,opened:true,status:'open'});
265
+ }}
266
+ onDrawerClose = {()=>{
267
+ if(drawerRef.current){
268
+ drawerRef.current.drawerShown = false;
269
+ }
270
+ if(typeof onSlideCallbackRef.current ==='function'){
271
+ //close();
272
+ onSlideCallbackRef.current();
273
+ }
274
+ onSlideCallbackRef.current = undefined;
275
+ if(onDrawerClose){
276
+ onDrawerClose({context:drawerRef.current})
277
+ }
278
+ customOnToggle({...getDrawerState(),isClosed : true, closed:true,isOpen : false ,opened:false,status:'closed'})
279
+ }}
280
+ ref={(el)=>{
281
+ drawerRef.current = el;
282
+ if(drawerRef.current){
283
+ Object.map(context,(v,i)=>{
284
+ if(drawerRef.current[i] === undefined){
285
+ drawerRef.current[i] = v;
286
+ }
287
+ });
288
+ drawerRef.current.open = drawerRef.current.openDrawer;
289
+ drawerRef.current.runAfterSlide = (cb,force)=>{
290
+ if(!permanent){
291
+ //force !== true ? open() : false;
292
+ onSlideCallbackRef.current = cb;
293
+ return drawerRef.current.closeDrawer();
294
+ }
295
+ if(typeof cb =='function'){
296
+ cb(getDrawerState());
297
+ }
298
+ }
299
+ drawerRef.current.close = drawerRef.current.runAfterSlide;
300
+ drawerRef.current.isOpen = context.isOpen = typeof drawerRef.current.isOpen =='function'? drawerRef.current.isOpen.bind(drawerRef.current) : x=> drawerRef && drawerRef.current ? drawerRef.current.drawerShown : false;
301
+ drawerRef.current.isClosed = context.isClosed = x => !drawerRef.current.isOpen();
302
+ context.toggle = drawerRef.current.toggleDrawer = drawerRef.current.toggle = cb =>{
303
+ if(!checkToggleBtn(cb)) return;
304
+ if(isPermanent || isMinimized) {
305
+ if(typeof cb ==='function'){
306
+ cb(getDrawerState());
307
+ }
308
+ return;
309
+ }
310
+ callbackRef.current = cb;
311
+ if(drawerRef.current.isOpen()){
312
+ drawerRef.current.closeDrawer();
313
+ } else {
314
+ drawerRef.current.openDrawer();
315
+ }
316
+ }
317
+ drawerRef.current.getState = getDrawerState;
318
+ }
319
+ React.setRef(ref,drawerRef.current);
320
+ }}
321
+ drawerWidth={drawerWidth}
322
+ keyboardDismissMode="on-drag"
323
+ drawerPosition={position}
324
+ drawerType={drawerType}
325
+ hideStatusBar = {defaultBool(hideStatusBar,true)}
326
+ overlayColor = {overlayColor}
327
+ renderNavigationView={(opts)=>{
328
+ const cArgs = {...getDrawerState()}
329
+ const h = typeof header === 'function'? header(cArgs) : header;
330
+ const c = typeof content =='function'? content (cArgs) : content;
331
+ return <NavigationView
332
+ opts = {opts}
333
+ ref = {navigationViewRef}
334
+ {...{context,toggleIcon,toggleIconTooltip,header:h,content:c,isPermanent,drawerItemsProps,drawerType,drawerItems,drawerRef,setState,toggleIconProps,isLeftPosition,drawerWidth,minimizable,headerProps,isMinimized,drawerItemsContainerProps}}
335
+ />
336
+ }}
337
+ contentContainerStyle={[
338
+ {paddingBottom:30},
339
+ contentContainerStyle
340
+ ]
341
+ }>
342
+ {children}
343
+ </DrawerLayout>
344
+ </DrawerContext.Provider>
345
+ );
346
+ })
347
+
348
+ export default DrawerComponent;
349
+
350
+
351
+
352
+
353
+ const iconType = PropTypes.oneOfType([
354
+ PropTypes.node,
355
+ PropTypes.string,
356
+ ]);
357
+
358
+ DrawerComponent.propTypes = {
359
+ ...defaultObj(DrawerLayout.propTypes),
360
+ position : PropTypes.oneOf(Object.keys(DRAWER_POSITIONS)),
361
+ minimizable : PropTypes.bool,
362
+ permanent : PropTypes.bool,
363
+ minimized : PropTypes.bool,
364
+ bindResizeEvent : PropTypes.bool,
365
+ children : PropTypes.node,
366
+ onMount : PropTypes.func,
367
+ onUnmount : PropTypes.func,
368
+ onDrawerOpen : PropTypes.func,
369
+ onDrawerClose : PropTypes.func,
370
+ onDrawerSlide : PropTypes.func,
371
+ onDrawerToggle : PropTypes.func,
372
+ drawerItemsProps : PropTypes.object,
373
+ drawerItems : PropTypes.oneOfType([
374
+ PropTypes.array,
375
+ PropTypes.node,
376
+ PropTypes.element,
377
+ PropTypes.elementType,
378
+ PropTypes.func
379
+ ]),
380
+ isItemActive : PropTypes.func,///vérifie si un item est actif où pas
381
+ permanent : PropTypes.bool,
382
+ onDrawerToggle : PropTypes.func,
383
+ onDrawerToggleMinimize : PropTypes.func,
384
+ onDrawerMinimize : PropTypes.func,
385
+ children : PropTypes.oneOfType([
386
+ PropTypes.func,
387
+ PropTypes.node,
388
+ ]),
389
+ /*** le header à afficher sur le drawer */
390
+ header : PropTypes.oneOfType([
391
+ PropTypes.node,
392
+ PropTypes.func,
393
+ ]),
394
+ headerProps : PropTypes.object,//les props à passer drawerHeader
395
+ onDrawerClose : PropTypes.func,
396
+ onDrawerClose : PropTypes.func,
397
+ onDrawerOpen : PropTypes.func,
398
+ /***l'icone toggle lorsque le drawer est en mode temporaire, dont mobile */
399
+ temporaryToggleIcon : iconType,
400
+ //l'icone du button toggle lorsque le drawer est en mode permament
401
+ permanentToggleIcon : iconType,
402
+ //l'icone de toggle lorsque le drawer est en mode persistant
403
+ persistentToggleIcon : iconType,
404
+ minimizedToggleIcon : iconType, //l'icone du drawer lorsque celui si est en mode minimisté
405
+ /*** si l'icone minimisé est affiché lorsque le drawer est en mode minimisé */
406
+ withMinimizedIcon : PropTypes.bool,
407
+ }
408
+
409
+ DrawerComponent.displayName = "DrawerComponent";
@@ -2,7 +2,7 @@ import {isNonNullString,defaultStr,uniqid} from "$cutils";
2
2
  import PropTypes from "prop-types"
3
3
  import _DrawerItem from "./_DrawerItem";
4
4
  import {navigate,setActiveRoute} from "$cnavigation";
5
- import { useDrawer } from "../Provider";
5
+ import { useDrawer } from "../context";
6
6
  import { setActiveItem,getOnPressAction,closeDrawer as nCloseDrawer,previousActiveItemRef,activeItemRef} from "./utils";
7
7
  import {useIsScreenFocused} from "$enavigation/hooks";
8
8
  import React from "$react";
@@ -7,7 +7,7 @@ import PropTypes from "prop-types";
7
7
  import Divider from "$ecomponents/Divider";
8
8
  import View from "$ecomponents/View";
9
9
  import Auth from "$cauth";
10
- import { useDrawer } from '../Provider';
10
+ import { useDrawer } from '../context';
11
11
 
12
12
  export * from "./utils";
13
13
 
@@ -8,6 +8,7 @@ import {
8
8
  TouchableWithoutFeedback,
9
9
  I18nManager,
10
10
  } from 'react-native';
11
+ import { Portal } from 'react-native-paper';
11
12
  import PropTypes from "prop-types";
12
13
  import View from "$ecomponents/View";
13
14
  import {defaultStr} from "$cutils";
@@ -37,6 +38,7 @@ export default class DrawerLayout extends React.PureComponent {
37
38
 
38
39
  constructor(props) {
39
40
  super(props);
41
+ const isPortal = !! props.isPortal;
40
42
  this._panResponder = PanResponder.create({
41
43
  onMoveShouldSetPanResponder: this._shouldSetPanResponder,
42
44
  onPanResponderGrant: this._panResponderGrant,
@@ -45,14 +47,17 @@ export default class DrawerLayout extends React.PureComponent {
45
47
  onPanResponderRelease: this._panResponderRelease,
46
48
  onPanResponderTerminate: () => {},
47
49
  });
48
- const drawerShown = props.permanent? true : false;
50
+ const drawerShown = !isPortal && props.permanent? true : false;
49
51
  this.state = {
50
52
  accessibilityViewIsModal: false,
51
53
  drawerShown,
54
+ isPortal,
52
55
  openValue: new Animated.Value(drawerShown?1:0),
53
56
  };
54
57
  }
55
-
58
+ isPortal(){
59
+ return !!this.state.isPortal;
60
+ }
56
61
  getDrawerPosition() {
57
62
  const { drawerPosition } = this.props;
58
63
  const rtl = I18nManager.isRTL;
@@ -170,39 +175,43 @@ export default class DrawerLayout extends React.PureComponent {
170
175
  if(permanent){
171
176
  dynamicDrawerStyles.position = "relative";
172
177
  }
178
+ const Wrapper = this.isPortal()? Portal : React.Fragment;
179
+ const canRender = this.isPortal()? this.state.drawerShown : true;
173
180
  return (
174
- <View
175
- testID = {testID}
176
- style={{ flex: 1, backgroundColor: 'transparent',flexDirection:permanent?'row':'column'}}
177
- {...this._panResponder.panHandlers}
178
- >
179
- {!permanent && <TouchableWithoutFeedback
180
- style={{pointerEvents}}
181
- testID = {testID+"_TouchableWithoutFeedBack"}
182
- onPress={this._onOverlayClick}
181
+ <Wrapper>
182
+ <View
183
+ testID = {testID}
184
+ style={[{ flex: canRender && 1 || 0, backgroundColor: 'transparent',flexDirection:permanent?'row':'column'},canRender?styles.portalVisibleContainer:styles.portalNotVisibleContainer]}
185
+ {...this._panResponder.panHandlers}
183
186
  >
187
+ {!permanent && <TouchableWithoutFeedback
188
+ style={{pointerEvents}}
189
+ testID = {testID+"_TouchableWithoutFeedBack"}
190
+ onPress={this._onOverlayClick}
191
+ >
192
+ <Animated.View
193
+ testID={testID+"_Backdrow"}
194
+ ref = {this._backdropRef}
195
+ style={[styles.overlay,{backgroundColor:theme.colors.backdrop},{pointerEvents}, animatedOverlayStyles]}
196
+ />
197
+ </TouchableWithoutFeedback>}
198
+ {posRight && this.renderContent({testID})}
184
199
  <Animated.View
185
- testID={testID+"_Backdrow"}
186
- ref = {this._backdropRef}
187
- style={[styles.overlay,{backgroundColor:theme.colors.backdrop},{pointerEvents}, animatedOverlayStyles]}
188
- />
189
- </TouchableWithoutFeedback>}
190
- {posRight && this.renderContent({testID})}
191
- <Animated.View
192
- testID={testID+"_NavigationViewContainer"}
193
- ref={React.mergeRefs(navigationViewRef,this._navigationViewRef)}
194
- accessibilityViewIsModal={accessibilityViewIsModal}
195
- style={[
196
- styles.drawer,
197
- dynamicDrawerStyles,
198
- elev,
199
- animatedDrawerStyles,
200
- ]}
201
- >
202
- {this.props.renderNavigationView()}
203
- </Animated.View>
204
- {!posRight && this.renderContent({testID})}
205
- </View>
200
+ testID={testID+"_NavigationViewContainer"}
201
+ ref={React.mergeRefs(navigationViewRef,this._navigationViewRef)}
202
+ accessibilityViewIsModal={accessibilityViewIsModal}
203
+ style={[
204
+ styles.drawer,
205
+ dynamicDrawerStyles,
206
+ elev,
207
+ animatedDrawerStyles,
208
+ ]}
209
+ >
210
+ {this.props.renderNavigationView()}
211
+ </Animated.View>
212
+ {!posRight && this.renderContent({testID})}
213
+ </View>
214
+ </Wrapper>
206
215
  );
207
216
  }
208
217
 
@@ -449,10 +458,17 @@ const styles = StyleSheet.create({
449
458
  right: 0,
450
459
  zIndex: 1000,
451
460
  },
461
+ portalVisibleContainer : {
462
+ ...StyleSheet.absoluteFill,
463
+ },
464
+ portalNotVisibleContainer : {
465
+ opacity : 0,
466
+ }
452
467
  });
453
468
 
454
469
  DrawerLayout.propTypes = {
455
- children: PropTypes.any.isRequired,
470
+ isPortal : PropTypes.bool,
471
+ children: PropTypes.any,
456
472
  drawerBackgroundColor : PropTypes.string,
457
473
  drawerLockMode: PropTypes.oneOf(['unlocked','locked-closed', 'locked-open']),
458
474
  drawerPosition: PropTypes.oneOf(['left', 'right']),
@@ -71,7 +71,7 @@ const DrawerNavigationViewComponent = React.forwardRef((props,ref)=>{
71
71
  <DrawerItems
72
72
  drawerRef = {drawerRef}
73
73
  {...defaultObj(drawerItemsProps)}
74
- items = {drawerItems}
74
+ items = {drawerItems || []}
75
75
  drawerType = {drawerType}
76
76
  isDrawerOpen = {drawerRef.current?.isOpen() || false}
77
77
  minimized = {isMinimized}
@@ -1,6 +1,73 @@
1
+ import Drawer from "./Drawer";
1
2
  import React from "$react";
2
- export const DrawerContext = React.createContext(null);
3
+ import {View,StyleSheet} from "react-native";
4
+ let drawerRef = null;
3
5
 
4
- export const useDrawer = ()=>{
5
- return React.useContext(DrawerContext) || {hasContext:x=>false};
6
- }
6
+ export const createProviderRef = (cb)=>{
7
+ const ref = React.useRef(null);
8
+ React.useEffect(()=>{
9
+ if(typeof cb =='function'){
10
+ cb(ref.current);
11
+ } else if(cb !== false) {
12
+ drawerRef = ref.current;
13
+ }
14
+ },[ref.current])
15
+ return ref;
16
+ };
17
+
18
+ export const getProviderRef = ()=> drawerRef;
19
+
20
+ export const open = (props,innerProviderRef)=>{
21
+ innerProviderRef = innerProviderRef || getProviderRef();
22
+ if(!innerProviderRef) return false;
23
+ if(innerProviderRef.current && innerProviderRef.current.open){
24
+ innerProviderRef = innerProviderRef.current;
25
+ }
26
+ if(innerProviderRef && typeof innerProviderRef.open =='function') {
27
+ return innerProviderRef.open(props);
28
+ }
29
+ return false;
30
+ }
31
+
32
+ export const close = (props,innerProviderRef)=>{
33
+ innerProviderRef = innerProviderRef || getProviderRef();
34
+ if(!innerProviderRef) return false;
35
+ if(innerProviderRef.current && innerProviderRef.current.open){
36
+ innerProviderRef = innerProviderRef.current;
37
+ }
38
+ if(innerProviderRef && typeof innerProviderRef.close =='function') return innerProviderRef.close(props);
39
+ return false;
40
+ }
41
+
42
+ const Provider = React.forwardRef((props,innerRef)=>{
43
+ return <Drawer
44
+ ref = {innerRef || createProviderRef()}
45
+ position="right"
46
+ sessionName = {sessionName}
47
+ {...props}
48
+ permanent={false}
49
+ isPortal
50
+ />
51
+ });
52
+
53
+ const sessionName = "custom-drawer-provider-right";
54
+
55
+ Provider.displayName = "DrawerProviderComponent";
56
+
57
+ export default Provider;
58
+
59
+ Provider.open = open;
60
+
61
+ Provider.close = close;
62
+
63
+ Provider.sessionName = sessionName;
64
+
65
+ const styles = StyleSheet.create({
66
+ visible : {
67
+ opacity : 1,
68
+ ...StyleSheet.absoluteFill,
69
+ },
70
+ notVisible : {
71
+ opacity : 0,
72
+ }
73
+ })
@@ -0,0 +1,6 @@
1
+ import React from "$react";
2
+ export const DrawerContext = React.createContext(null);
3
+
4
+ export const useDrawer = ()=>{
5
+ return React.useContext(DrawerContext) || {hasContext:x=>false};
6
+ }
@@ -1,23 +1,10 @@
1
- import {StyleSheet} from 'react-native';
2
- import DrawerLayout from './DrawerLayout';
3
- import {isIos} from "$cplatform";
4
- import React from "$react";
5
- import PropTypes from "prop-types";
6
- import {defaultObj,isObj,isNonNullString} from "$cutils";
7
- import theme,{Colors,flattenStyle} from "$theme";
1
+ import {default as Drawer} from "./Drawer";
2
+ import Provider from "./Provider";
8
3
  import DrawerItems from './DrawerItems';
9
- import Dimensions,{isDesktopMedia,getCurrentMedia} from "$cplatform/dimensions";
10
- import {open,close} from "$epreloader";
11
- import {DRAWER_POSITIONS,DRAWER_TYPES,MINIMIZED_WIDTH,getDrawerWidth} from './utils';
12
- import Icon,{MENU_ICON} from "$ecomponents/Icon";
13
- import View from "$ecomponents/View";
14
- import {closeDrawer} from './DrawerItems/utils';
15
- import {DrawerContext} from "./Provider";
16
- import NavigationView from "./NavigationView";
17
- import { canBeMinimizedOrPermanent } from './utils';
18
- import { useSession } from './hooks';
19
4
 
5
+ export * from "./Drawer";
20
6
  export * from "./Provider";
7
+ export * from "./context";
21
8
 
22
9
  export {DrawerItems};
23
10
  export {default as DrawerItem} from "./DrawerItems/DrawerItem";
@@ -25,440 +12,7 @@ export {default as DrawerItem} from "./DrawerItems/DrawerItem";
25
12
  export * from "./utils";
26
13
  export * from "./hooks";
27
14
 
28
- const canHandleExtra = x=> true;
15
+ Drawer.Provider = Provider;
16
+ export default Drawer;
17
+ export {Provider};
29
18
 
30
-
31
- const DrawerComponent = React.forwardRef((props,ref)=>{
32
- let {position,permanent,onDrawerSlide,sessionName,content,
33
- drawerItemsContainerProps,contentContainerStyle,drawerItemsProps,minimizable,
34
- minimized,drawerItems,hideStatusBar,overlayColor, onDrawerMinimize,onDrawerToggleMinimize,
35
- onDrawerOpen,onDrawerClose,onDrawerToggle,header,headerProps,toggleIconProps,
36
- permanentToggleIcon,minimizedToggleIcon,temporaryToggleIcon,withMinimizedIcon,
37
- isItemActive,onPageResize,navigationViewRef,children:customChildren,testID,drawerType} = props;
38
-
39
- const children = React.useMemo(()=>customChildren,[customChildren]);
40
- testID = defaultStr(testID,"RN_DrawerComponent")
41
- const session = useSession(sessionName);
42
- sessionName = session.sessionName;
43
- const sessionValue = session.get();
44
- const drawerRef = React.useRef(null);
45
- const onSlideCallbackRef = React.useRef(null);
46
- drawerItemsContainerProps = defaultObj(drawerItemsContainerProps);
47
- position = defaultStr(position);
48
- position = DRAWER_POSITIONS[position] || (isNonNullString(sessionValue.position) && DRAWER_POSITIONS[sessionValue.position]? DRAWER_POSITIONS[sessionValue.position]:undefined) || DRAWER_POSITIONS.left
49
- const isLeftPosition = position === DRAWER_POSITIONS.left ? true : false;
50
- drawerType = defaultStr(drawerType).toLowerCase() || isNonNullString(sessionValue.drawerType) && DRAWER_TYPES[sessionValue.drawerType]? DRAWER_TYPES[sessionValue.drawerType] : "";
51
- if(!DRAWER_TYPES[drawerType]){
52
- drawerType = isIos()? DRAWER_TYPES.slide : DRAWER_TYPES.front;
53
- }
54
- overlayColor = Colors.isValid(overlayColor)?overlayColor:undefined;
55
- if(!overlayColor){
56
- overlayColor = theme.colors.backdrop;// drawerType === DRAWER_TYPES.front ? 'black' : '#00000000';
57
- }
58
- let drawerWidth = getDrawerWidth();
59
- const restP = {};
60
- const isDesktop = isDesktopMedia();
61
- const _canBeMinimizedOrPermanent = canBeMinimizedOrPermanent();
62
- permanent = _canBeMinimizedOrPermanent ? (sessionValue.permanent !== undefined ? sessionValue.permanent : permanent) : false;
63
- minimized = _canBeMinimizedOrPermanent ? (sessionValue.minimized !== undefined ? sessionValue.minimized: minimized) : false;
64
- if(permanent === undefined){
65
- permanent = canBeMinimizedOrPermanent()? true : false;
66
- }
67
- if(minimized === undefined){
68
- minimized = false;
69
- }
70
- const [state,_setState] = React.useState({
71
- minimized,
72
- permanent,
73
- });
74
- if(sessionValue.permanent ===undefined){
75
- session.set(state);
76
- }
77
- const setState = (s,s2)=>{
78
- s = typeof s =='object' && s ? s : {};
79
- s2 = typeof s2 =='object' && s2 ? s2 : {};
80
- s2 = {...state,...s,...s2};
81
- session.set(s2);
82
- return _setState(s2);
83
- }
84
-
85
- const [context] = React.useState({});
86
-
87
-
88
- const callbackRef = React.useRef(null);
89
- const callback = callbackRef.current;
90
- callbackRef.current = null;
91
- ///permet de minimiser le drawer
92
- context.minimize = (callback)=>{
93
- if(!Dimensions.isDesktopMedia() || isMinimized){
94
- return typeof callback =='function'? callback(context.getState()) : null;
95
- }
96
- callbackRef.current = callback;
97
- setState({minimized:true});
98
- }
99
- /*** permet de restaurer le drawer */
100
- context.restore = (callback)=>{
101
- if(!Dimensions.isDesktopMedia() || !context.isMinimized() || !context.isPermanent()){
102
- return typeof callback =='function'? callback(context.getState()) : null;
103
- }
104
- callbackRef.current = callback;
105
- setState({minimized:false,permanent:true});
106
- }
107
- const checkToggleBtn = (cb)=>{
108
- if(!Dimensions.isDesktopMedia() && drawerRef?.current?.isPermanent()){
109
- setState({permanent:false});
110
- if(typeof cb ==='function'){
111
- cb(getDrawerState());
112
- }
113
- return false;
114
- }
115
- return true;
116
- }
117
-
118
- context.toggleMinimized = (minimized,s2)=>{
119
- if(!checkToggleBtn()) return;
120
- if(!Dimensions.isDesktopMedia() || typeof minimized !== 'boolean' || !drawerRef.current || !drawerRef.current.isOpen()) return;
121
- if(!minimizable === false) return;
122
- let nS = {minimized};
123
- if(isObj(s2)){
124
- nS = {...s2,...nS};
125
- }
126
- setState(nS);
127
- }
128
- context.getPosition = ()=>position;
129
- context.hasLeftPositon = ()=> position === DRAWER_POSITIONS.left;
130
- context.hasRightPosition = ()=> position === DRAWER_POSITIONS.right;
131
- context.isLeftPosition = ()=> isLeftPosition;
132
- context.canToggle = x=> canHandleExtra() ? true : permanent? false : true;
133
- context.canMinimize = x => minimizable !== false && canBeMinimizedOrPermanent() ? true : false;
134
- context.togglePermanent = (x,cb)=>{
135
- if(typeof x !== "boolean") return;
136
- if(!checkToggleBtn(cb)) return;
137
- const isPerm = drawerRef?.current?.isPermanent();
138
- if(x && ! isPerm || !x && isPerm){
139
- setState({permanent:x});
140
- }
141
- if(typeof cb =="function"){
142
- cb(getDrawerState());
143
- }
144
- }
145
-
146
- let {permanent:isPermanent,minimized:isMinimized} = session.get();
147
- if(_canBeMinimizedOrPermanent && isPermanent){
148
- overlayColor = 'transparent';
149
- if(isMinimized){
150
- drawerWidth = MINIMIZED_WIDTH;
151
- }
152
- restP.drawerLockMode = "locked-open";
153
- } else {
154
- isPermanent = false;
155
- isMinimized = false;
156
- restP.drawerLockMode = "unlocked";
157
- drawerWidth = drawerWidth;
158
- }
159
- context.isMinimizable = ()=>{
160
- return minimizable !== false && canBeMinimizedOrPermanent() ? true : false;
161
- }
162
- context.isMinimized = ()=>{
163
- return minimizable !== false && canBeMinimizedOrPermanent() && isDesktopMedia() && session.get("minimized")? true : false;
164
- }
165
- const hasContext = ()=>drawerRef && isObj(drawerRef?.current) && Object.size(drawerRef?.current,true);
166
- context.canBeMinimizedOrPermanent = canBeMinimizedOrPermanent;
167
- context.isPermanent = x=>{
168
- if(!drawerRef.current || !drawerRef.current.isOpen()) return false;
169
- return canBeMinimizedOrPermanent() && session.get('permanent') ? true : false;
170
- }
171
- const prevMinimized = React.usePrevious(isMinimized);
172
- React.useEffect(()=>{
173
- if(prevMinimized === isMinimized || !Dimensions.isDesktopMedia()) return;
174
- const args = getDrawerState();
175
- if(isMinimized && onDrawerMinimize){
176
- onDrawerMinimize(args);
177
- }
178
- if(onDrawerToggleMinimize){
179
- onDrawerToggleMinimize(args);
180
- }
181
- if(typeof callback =='function'){
182
- callback(args);
183
- }
184
- session.set("minimized",isMinimized);
185
- },[isMinimized])
186
- const prevIsDesktop = React.usePrevious(isDesktop);
187
- React.useEffect(()=>{
188
- if(!drawerRef.current) return;
189
- if(isDesktopMedia() && isPermanent){
190
- drawerRef.current.openDrawer();
191
- }
192
- if(prevIsDesktop !== isDesktopMedia() && typeof onPageResize ==='function'){
193
- onPageResize(getDrawerState());
194
- }
195
- },[isDesktop])
196
- const getDrawerState = context.getState = (args)=>{
197
- const isOpen = drawerRef.current && drawerRef.current.isOpen ? drawerRef.current.isOpen () : false;
198
- return {
199
- ...session.get(),context:drawerRef.current,permanent:isPermanent,
200
- sessionName,
201
- minimized : isMinimized,
202
- permanent : isPermanent,
203
- isPermanent,
204
- isMinimized,
205
- isClosed : !isOpen, closed:!isOpen,isOpen ,opened:isOpen,status: isOpen ? 'open':'closed',
206
- ...defaultObj(args),
207
- }
208
- }
209
- const customOnToggle = (args)=>{
210
- args = getDrawerState(args);
211
- if(onDrawerToggle){
212
- onDrawerToggle(args)
213
- }
214
- if(typeof callback =='function'){
215
- callback(args);
216
- }
217
- }
218
- toggleIconProps = defaultObj(toggleIconProps);
219
- headerProps = defaultObj(headerProps);
220
-
221
- const getDrawerRef = x=> drawerRef;
222
- ///lorsque le drawer est en mode permanent, l'icone par défaut est l'icon devant le dépingler du mode permanent
223
- const backIcon = "window-close";//isLeftPosition ? "arrow-left" : "arrow-right";
224
- const chevronIcon = isLeftPosition ? "chevron-left":"chevron-right";
225
- context.temporaryToggleIcon = temporaryToggleIcon = React.isValidElement(temporaryToggleIcon)? temporaryToggleIcon : backIcon;
226
- context.permanentToggleIcon = permanentToggleIcon = React.isValidElement(permanentToggleIcon)? permanentToggleIcon : chevronIcon;
227
- context.minimizedToggleIcon = minimizedToggleIcon = React.isValidElement(minimizedToggleIcon)? minimizedToggleIcon : chevronIcon//MENU_ICON;
228
-
229
- let toggleIconTooltip = null;
230
- let toggleIcon = null, mobileToggleIconTooltip = "Cliquez pour "+(open?'Masquer':'Afficher')+ " le drawer";
231
- if(!isPermanent){
232
- toggleIconTooltip = mobileToggleIconTooltip;
233
- toggleIcon = temporaryToggleIcon;
234
- } else {
235
- if(isMinimized){
236
- toggleIconTooltip = "Cliquez pour restaurer le drawer dans son status précédent";
237
- if(withMinimizedIcon !== false){
238
- toggleIcon = minimizedToggleIcon;
239
- }
240
- } else {
241
- toggleIcon = permanentToggleIcon;
242
- toggleIconTooltip = 'Cliquer pour minimiser le drawer.\n si vous souhaitez passer le drawer en mode affichage temporaire, faite un long click (pressez le pour longtemps) sur ce bouton. ';
243
- }
244
- }
245
- return (
246
- <DrawerContext.Provider
247
- value={{
248
- ...context,
249
- context,
250
- drawerRef,
251
- session,
252
- hasContext,
253
- close : (cb,force) =>closeDrawer(drawerRef,cb,force),
254
- sessionName,
255
- isItemActive : (opts)=>{
256
- if(isItemActive){
257
- return isItemActive(opts);
258
- }
259
- return false;
260
- },getState:getDrawerState,getDrawerRef
261
- }}>
262
- <View style={styles.container} testID={`${testID}_Container`}>
263
- <DrawerLayout
264
- testID = {`${testID}_DrawerLayout`}
265
- {...restP}
266
- permanent = {isPermanent}
267
- onDrawerSlide={onDrawerSlide}
268
- onDrawerOpen = {(a)=>{
269
- if(drawerRef.current){
270
- drawerRef.current.drawerShown = true;
271
- }
272
- if(onDrawerOpen){
273
- onDrawerOpen({context:drawerRef.current})
274
- }
275
- customOnToggle({...getDrawerState(),closed:false, isClosed : false,isOpen:true,opened:true,status:'open'});
276
- }}
277
- onDrawerClose = {()=>{
278
- if(drawerRef.current){
279
- drawerRef.current.drawerShown = false;
280
- }
281
- if(typeof onSlideCallbackRef.current ==='function'){
282
- //close();
283
- onSlideCallbackRef.current();
284
- }
285
- onSlideCallbackRef.current = undefined;
286
- if(onDrawerClose){
287
- onDrawerClose({context:drawerRef.current})
288
- }
289
- customOnToggle({...getDrawerState(),isClosed : true, closed:true,isOpen : false ,opened:false,status:'closed'})
290
- }}
291
- ref={(el)=>{
292
- drawerRef.current = el;
293
- if(drawerRef.current){
294
- Object.map(context,(v,i)=>{
295
- if(drawerRef.current[i] === undefined){
296
- drawerRef.current[i] = v;
297
- }
298
- });
299
- drawerRef.current.open = drawerRef.current.openDrawer;
300
- drawerRef.current.runAfterSlide = (cb,force)=>{
301
- if(!permanent){
302
- //force !== true ? open() : false;
303
- onSlideCallbackRef.current = cb;
304
- return drawerRef.current.closeDrawer();
305
- }
306
- if(typeof cb =='function'){
307
- cb(getDrawerState());
308
- }
309
- }
310
- drawerRef.current.close = drawerRef.current.runAfterSlide;
311
- drawerRef.current.isOpen = context.isOpen = typeof drawerRef.current.isOpen =='function'? drawerRef.current.isOpen.bind(drawerRef.current) : x=> drawerRef && drawerRef.current ? drawerRef.current.drawerShown : false;
312
- drawerRef.current.isClosed = context.isClosed = x => !drawerRef.current.isOpen();
313
- context.toggle = drawerRef.current.toggleDrawer = drawerRef.current.toggle = cb =>{
314
- if(!checkToggleBtn(cb)) return;
315
- if(isPermanent || isMinimized) {
316
- if(typeof cb ==='function'){
317
- cb(getDrawerState());
318
- }
319
- return;
320
- }
321
- callbackRef.current = cb;
322
- if(drawerRef.current.isOpen()){
323
- drawerRef.current.closeDrawer();
324
- } else {
325
- drawerRef.current.openDrawer();
326
- }
327
- }
328
- drawerRef.current.getState = getDrawerState;
329
- }
330
- React.setRef(ref,drawerRef.current);
331
- }}
332
- drawerWidth={drawerWidth}
333
- keyboardDismissMode="on-drag"
334
- drawerPosition={position}
335
- drawerType={drawerType}
336
- hideStatusBar = {defaultBool(hideStatusBar,true)}
337
- overlayColor = {overlayColor}
338
- renderNavigationView={(opts)=>{
339
- const cArgs = {...getDrawerState()}
340
- const h = typeof header === 'function'? header(cArgs) : header;
341
- const c = typeof content =='function'? content (cArgs) : content;
342
- return <NavigationView
343
- opts = {opts}
344
- ref = {navigationViewRef}
345
- {...{context,toggleIcon,toggleIconTooltip,header:h,content:c,isPermanent,drawerItemsProps,drawerType,drawerItems,drawerRef,setState,toggleIconProps,isLeftPosition,drawerWidth,minimizable,headerProps,isMinimized,drawerItemsContainerProps}}
346
- />
347
- }}
348
- contentContainerStyle={[
349
- {paddingBottom:30},
350
- contentContainerStyle
351
- ]
352
- }>
353
- {children}
354
- </DrawerLayout>
355
- </View>
356
- </DrawerContext.Provider>
357
- );
358
- })
359
-
360
- export default DrawerComponent;
361
-
362
-
363
-
364
-
365
- const iconType = PropTypes.oneOfType([
366
- PropTypes.node,
367
- PropTypes.string,
368
- ]);
369
-
370
- DrawerComponent.propTypes = {
371
- ...defaultObj(DrawerLayout.propTypes),
372
- position : PropTypes.oneOf(Object.keys(DRAWER_POSITIONS)),
373
- minimizable : PropTypes.bool,
374
- permanent : PropTypes.bool,
375
- minimized : PropTypes.bool,
376
- bindResizeEvent : PropTypes.bool,
377
- children : PropTypes.node,
378
- onMount : PropTypes.func,
379
- onUnmount : PropTypes.func,
380
- onDrawerOpen : PropTypes.func,
381
- onDrawerClose : PropTypes.func,
382
- onDrawerSlide : PropTypes.func,
383
- onDrawerToggle : PropTypes.func,
384
- drawerItemsProps : PropTypes.object,
385
- drawerItems : PropTypes.oneOfType([
386
- PropTypes.array,
387
- PropTypes.node,
388
- PropTypes.element,
389
- PropTypes.elementType,
390
- PropTypes.func
391
- ]),
392
- isItemActive : PropTypes.func,///vérifie si un item est actif où pas
393
- permanent : PropTypes.bool,
394
- onDrawerToggle : PropTypes.func,
395
- onDrawerToggleMinimize : PropTypes.func,
396
- onDrawerMinimize : PropTypes.func,
397
- children : PropTypes.oneOfType([
398
- PropTypes.func,
399
- PropTypes.node,
400
- ]),
401
- /*** le header à afficher sur le drawer */
402
- header : PropTypes.oneOfType([
403
- PropTypes.node,
404
- PropTypes.func,
405
- ]),
406
- headerProps : PropTypes.object,//les props à passer drawerHeader
407
- onDrawerClose : PropTypes.func,
408
- onDrawerClose : PropTypes.func,
409
- onDrawerOpen : PropTypes.func,
410
- /***l'icone toggle lorsque le drawer est en mode temporaire, dont mobile */
411
- temporaryToggleIcon : iconType,
412
- //l'icone du button toggle lorsque le drawer est en mode permament
413
- permanentToggleIcon : iconType,
414
- //l'icone de toggle lorsque le drawer est en mode persistant
415
- persistentToggleIcon : iconType,
416
- minimizedToggleIcon : iconType, //l'icone du drawer lorsque celui si est en mode minimisté
417
- /*** si l'icone minimisé est affiché lorsque le drawer est en mode minimisé */
418
- withMinimizedIcon : PropTypes.bool,
419
- }
420
-
421
- const styles = StyleSheet.create({
422
- container: {
423
- flex: 1,
424
- },
425
- drawerContainer: {
426
- flex: 1,
427
- paddingTop : 0,// isMobileNative()? 25:0,
428
- },
429
- drawerText: {
430
- margin: 10,
431
- fontSize: 15,
432
- textAlign: 'left',
433
- },
434
- drawerHeaderContainer : {
435
- flexDirection : 'column',
436
- alignItems : 'center',
437
- justifyContent : 'flex-start',
438
- },
439
- drawerHeaderContent : {
440
- margin : 0,
441
- justifyContent : 'space-between',
442
- flexDirection : 'row',
443
- alignItems : 'center',
444
- paddingHorizontal : 10,
445
- width : '100%',
446
- },
447
- drawerHeaderContentMinimized : {
448
- textAlign : 'center',
449
- alignSelf : 'center',
450
- justifyContent : 'center',
451
- alignContent : 'center',
452
- paddingTop : 10,
453
- },
454
- drawerHeaderContainerLeft : {
455
- flexDirection : 'row',
456
- //paddingRight : 20,
457
- },
458
- drawerHeaderContainerRight : {
459
- flexDirection : 'row-reverse',
460
- //paddingLeft : 20,
461
- },
462
- });
463
-
464
- DrawerComponent.displayName = "DrawerComponent";
@@ -90,7 +90,7 @@ const FormActionComponent = React.forwardRef(({
90
90
  const formInstance = getFormInstance(formName);
91
91
  if(!formInstance || typeof formInstance.isValid != 'function' && isObj(formInstance.props)) return;
92
92
  if(formInstance.isValid()){
93
- onPress({...args,data:formInstance.getData({handleChange})})
93
+ onPress({...args,formInstance,form:formInstance,data:formInstance.getData({handleChange})})
94
94
  }
95
95
  }
96
96
  };
@@ -1,14 +1,11 @@
1
1
  import AppBar from "$ecomponents/AppBar";
2
- import { Appbar } from "react-native-paper";
3
2
  import React from "$react";
4
3
  import {MENU_ICON} from "$ecomponents/Icon";
5
4
  import {defaultObj} from "$cutils";
6
5
  import {useDrawer} from "$ecomponents/Drawer";
7
6
  import Icon from "$ecomponents/Icon";
8
7
  import {useGetComponent} from "$econtext/hooks";
9
- import {navigate as cNavigate,sanitizeName} from "$cnavigation";
10
8
  import { StackActions } from '@react-navigation/native';
11
-
12
9
  export * from "./utils";
13
10
 
14
11
  const AppBarLayout = React.forwardRef(({backActionProps,withDrawer,withNotifications,backAction,backActionRef,options,...props},ref)=>{
@@ -29,8 +26,6 @@ const AppBarLayout = React.forwardRef(({backActionProps,withDrawer,withNotificat
29
26
  goBack();
30
27
  return false;
31
28
  }
32
- const home = sanitizeName("Home");
33
- console.log(navigation," is navigation heeee ",args);
34
29
  if(typeof navigation?.dispatch =='function'){
35
30
  try {
36
31
  navigation.dispatch(StackActions.popToTop());
@@ -8,7 +8,6 @@ import Login from "$eauth/Login";
8
8
  import {navigate} from "$cnavigation";
9
9
  import theme from "$theme";
10
10
  import Logo from "$ecomponents/Logo";
11
- import appConfig from "$capp/config";
12
11
 
13
12
  const DrawerNavigator = React.forwardRef(({content,children:customChildren,state,...props},ref)=>{
14
13
  const drawerRef = React.useRef(null);