UNPKG

@fto-consult/expo-ui

Version:

Bibliothèque de composants UI Expo,react-native

131 lines (122 loc) 5.36 kB
import React from "$react"; import Dialog from "./Dialog"; import { createProviderRef } from "$ecomponents/Dialog/Provider"; import {isMobileOrTabletMedia} from "$cplatform/dimensions"; import {MAX_WIDTH} from "$ecomponents/Dialog/utils"; import {extendObj,defaultObj,isObj,defaultBool,defaultStr,defaultVal} from "$cutils"; import grid from "$theme/grid"; import theme from "$theme"; import {isDesktopMedia} from "$cdimensions"; let dialogProviderRef = null; /*** l'on peut override par défaut l'action ok par les props ok|yes l'on peut override par défaut l'acction cancel par les props closeAction|no */ const FormDataDialogProvider = React.forwardRef((props,innerRef)=>{ innerRef = innerRef || createProviderRef((eRef)=>{ dialogProviderRef = eRef; }); const [visible,setVisible] = React.useState(false); const [state,setState] = React.useState({}); const isMobile = isMobileOrTabletMedia(); const formRef = React.useRef(null); let {closeAction} = props; const context = { open : (props)=>{ let sData = {}; if(formRef.current && formRef.current.formDataContext && formRef.current.formDataContext.getData){ sData.data = formRef.current.formDataContext.getData(); } if(!visible){ setVisible(true); } setState({...sData,...defaultObj(props)}); }, close : ()=>{ if(!visible) return; setVisible(false); }, }; React.setRef(innerRef,context); const dialogProps = extendObj({},props.dialogProps,state.dialogProps,{hiddenControlled:true}); const formProps = defaultObj(state.formProps); if(state.visible){ formProps.fieldProps = defaultObj(formProps.fieldProps); formProps.fieldProps.windowWidth = !isMobile ? MAX_WIDTH : undefined; formProps.fieldProps.mediaQueryUpdateStyle = ({target})=>{ if(!formRef.current || !formRef.current.dialogRef || !formRef.current.dialogRef.current || !formRef.current.dialogRef.current.isFullScreen) return; const f = formRef.current.dialogRef.current.isFullScreen(); return f ? grid.col() : {width:'100%'}; } } return <Dialog responsive withScrollView subtitle ={false} {...props} {...state} visible = {visible} formProps = {formProps} isProvider ref={formRef} windowWidth = {MAX_WIDTH} propsMutator = {({cancelButton,...rest})=>{ const isMob = isMobileOrTabletMedia(); if(closeAction === true || state.closeAction === true) return rest; rest.windowWidth = !isMob ? MAX_WIDTH : undefined; const no = extendObj({},props.no,state.no); rest.actions = Array.isArray(rest.actions)? Object.clone(rest.actions) : isObj(rest.actions)? Object.clone(rest.actions) : null; closeAction = defaultObj(closeAction); rest.cancelButton = false; if(cancelButton !== false && rest.actions && (!isMob || rest.fullScreen === false) && state.no !== false){ if(isDesktopMedia() && typeof rest.maxActions !=='number'){ rest.maxActions = 2; } const noText = defaultVal(no.text,no.label,closeAction.text,closeAction.label,'Annuler') const closeBtn ={ ...closeAction, ...no, text : noText, label : noText, icon : defaultVal(no.icon,closeAction.icon,'close'), isCancelButton : true, error : true, onPress : context.close, isAction : false, } Array.isArray(rest.actions)? rest.actions.push(closeBtn) : isObj(rest.actions)? rest.actions ["close-bn-dddsdd"] = closeBtn : undefined; } return rest; }} dialogProps = {dialogProps} controlled={false} onDismiss = {(e)=>{ if(visible){ setVisible(false); } }} open = {context.open} close = {context.close} /> }); FormDataDialogProvider.open = (props,innerProviderRef)=>{ innerProviderRef = innerProviderRef || dialogProviderRef; if(!innerProviderRef) return; if(innerProviderRef.current && innerProviderRef.current.open){ innerProviderRef = innerProviderRef.current; } if(innerProviderRef && typeof innerProviderRef.open =='function') { return innerProviderRef.open(props); } return false; } FormDataDialogProvider.close = (props,innerProviderRef)=>{ innerProviderRef = innerProviderRef || dialogProviderRef; if(!innerProviderRef) return; if(innerProviderRef.current && innerProviderRef.current.open){ innerProviderRef = innerProviderRef.current; } if(innerProviderRef && typeof innerProviderRef.close =='function') return innerProviderRef.close(props); return false; } FormDataDialogProvider.displayName = "FormDataFormDataDialogProviderComponent"; export default FormDataDialogProvider;