@fto-consult/expo-ui 8.49.0 → 8.50.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.
@@ -7,6 +7,7 @@ module.exports = function(api) {
7
7
  $components : path.resolve($src,"components"),
8
8
  $navigation : path.resolve($src,"navigation"),
9
9
  $screens : path.resolve($src,"screens"),
10
+ $layouts : path.resolve($src,"layouts"),
10
11
  $database: path.resolve($src, "database"), //le repertoire dédié au données d'accès à la base de données
11
12
  //...your custom module resolver alias, @see : https://www.npmjs.com/package/babel-plugin-module-resolver
12
13
  }
@@ -11,8 +11,8 @@
11
11
  "@react-navigation/native-stack": "^6.9.25",
12
12
  "@react-navigation/stack": "^6.3.28",
13
13
  "@shopify/flash-list": "1.6.3",
14
- "expo": "^50.0.11",
15
- "expo-camera": "~14.0.6",
14
+ "expo": "^50.0.13",
15
+ "expo-camera": "~14.1.1",
16
16
  "expo-clipboard": "~5.0.1",
17
17
  "expo-font": "~11.10.3",
18
18
  "expo-image-picker": "~14.7.1",
@@ -23,7 +23,7 @@
23
23
  "expo-system-ui": "~2.9.3",
24
24
  "expo-web-browser": "~12.8.2",
25
25
  "react": "18.2.0",
26
- "react-native": "0.73.4",
26
+ "react-native": "0.73.5",
27
27
  "react-native-safe-area-context": "4.8.2",
28
28
  "react-native-screens": "~3.29.0",
29
29
  "react-native-svg": "14.1.0",
@@ -1,25 +1,6 @@
1
1
  /****
2
2
  la liste des tables de donnéees à exporter, de la forme :
3
3
  [tableName1] : {
4
- fields : { //la liste des champs liés à la table de données
5
- [field1] : {
6
- label | text : <string | ReactComponent>, le texte ou libelé lié au champ
7
- type : <string>, le type de field par exemple : text,password, email, switch, checkbox, tel, select, et bien d'autres
8
-
9
- //cette fonction est appelée à chaque fois que les premiers règles de validations ont été conclus lors de la validation du champ. Elle doit retourner soit un boolean, une chaine de caractère, un objet ou une promesse
10
- //si une chaine de caractère est retournée, alors la validation du champ considère qu'il s'agit d'une erreur et le message est affiché comme erreur de validation du champ
11
- //si un objet est retourné et cet objet contient un champ message | msg de type string, alors le validateur considère qu'il s'agit d'une erreur et le champ en question est affiché comme message de l'erreur
12
- //si une promese est retournée, alors la fonction attendra que la promesse soit résolue
13
- 1. si la promesse resoud une chaine de caractère ou un objet idem au cas précédent, ladite chaine est condisérée comme une erreur
14
- 2. si la promesse renvoie une erreur, alors le validateur considère comme un échec de validation et le message lié à l'erreur est affiché comme message d'erreur de validation
15
- //si false est retournée, alors rien n'est fait et le status de ce champ reste toujours à invalide. il sera donc impossible d'enregistrer le formulaire form data
16
- //si true est retourneé, alors la formField est valide
17
- onValidatorValid : ({value,context,....rest}) => <boolean | object {} | string | Promise <boolean | object : {} | string>>,
18
-
19
- //Cette fonction est appélée à chaque échec de validation du form field
20
- onValidatorNoValid : ({value,context,...rest}) => <any>
21
- }
22
- },
23
4
  tableName <string>, le nom de la table name
24
5
  label | text <string>, le titre à donner à la table data
25
6
  icon : <string | ReactComponent>, l'icon de la table data,
@@ -31,7 +12,7 @@
31
12
  drawerSection <string>, //le nom de la section associé au drawer dans lequel figurera le table data
32
13
  print <function ({data,...settings})>=> <Promise<{content:[],...rest}>, //la fonction utile pour l'impression de la tabel de données suivant les recommandation de la libraririe pdfmake
33
14
  printOptions <object>, //les options à passer à la fonction print,
34
-
15
+ newElementLabel : <string>, //le texte à utiliser pour le rendu du bouton lorsqu'il s'agit d'un nouvel element de la table data
35
16
  databaseStatistics <function ()=> <boolean> | boolean>, //si la table data figurera dans les Statistiques en BD, validable si le composant DatabaseStatistics est appélé dans l'application
36
17
 
37
18
  showInFab <boolean | function()=><boolean>, //spécifie si un bouton lié à la table sera affiché dans le composant Fab
@@ -48,10 +29,51 @@
48
29
  }
49
30
  }
50
31
  fabProps { boolean<false> | object|function({tableName})}, //si fabProps vaux false ou retourne false, alors le table data ne s'affichera pas dans le composant Fab
32
+ fields : { //la liste des champs liés à la table de données
33
+ [field1] : {
34
+ label | text : <string | ReactComponent>, le texte ou libelé lié au champ
35
+ type : <string>, le type de field par exemple : text,password, email, switch, checkbox, tel, select, et bien d'autres
36
+ sortable : <boolean>, //si la colonne sera triable
37
+ filterable : <boolean> //si la colonne sera filterable
38
+ form : <boolen> //si la colonne sera affiché et pris en compte dans le formulaire (FormData) lié à l'enregistrement des données de la table data
39
+ datagrid : <boolean> //si la colonne sera affiché et pris en compte dans le composant Datagrid
40
+ //cette fonction est appelée à chaque fois que les premiers règles de validations ont été conclus lors de la validation du champ. Elle doit retourner soit un boolean, une chaine de caractère, un objet ou une promesse
41
+ //si une chaine de caractère est retournée, alors la validation du champ considère qu'il s'agit d'une erreur et le message est affiché comme erreur de validation du champ
42
+ //si un objet est retourné et cet objet contient un champ message | msg de type string, alors le validateur considère qu'il s'agit d'une erreur et le champ en question est affiché comme message de l'erreur
43
+ //si une promese est retournée, alors la fonction attendra que la promesse soit résolue
44
+ 1. si la promesse resoud une chaine de caractère ou un objet idem au cas précédent, ladite chaine est condisérée comme une erreur
45
+ 2. si la promesse renvoie une erreur, alors le validateur considère comme un échec de validation et le message lié à l'erreur est affiché comme message d'erreur de validation
46
+ //si false est retournée, alors rien n'est fait et le status de ce champ reste toujours à invalide. il sera donc impossible d'enregistrer le formulaire form data
47
+ //si true est retourneé, alors la formField est valide
48
+ onValidatorValid : ({value,context,....rest}) => <boolean | object {} | string | Promise <boolean | object : {} | string>>,
49
+
50
+ //Cette fonction est appélée à chaque échec de validation du form field
51
+ onValidatorNoValid : ({value,context,...rest}) => <any>
52
+
53
+ width : 180, //définit la longueur de la colonne dans le composant datagrid
54
+
55
+ //si vous souhaitez personnaliser le rendu de la colonne dans le composant Datagrid
56
+ datagrid : {
57
+ render : ({rowData,columnField,columnDef,...rest})=><ReactNode>
58
+ },
59
+ visible : <boolean>, //si le champ sera visible (par défaut dans le datagrid) et dans le formulaire d'enregistrement ou modification de la données lié à la table data
60
+ readOnly : <boolean>, //si le champ sera en lecture seul dans le formulaire d'enregistrement d'une nouvelle données lié à la table data
61
+ disabled : <boolean>, //si le champ sera désactivé dans le formulaire d'enregistrement/modification de la données liées à la table data
62
+ readOnlyOnEditing : <boolean>, //si le champ sera en mode lecture seule au moment de la modification de la données liée à la table data
63
+ visibleOnlyOnCreate : <boolean>, //si le champ est visible dans le formulaire uniquement en cas de création
64
+ visibleOnlyOnEditing : <boolean>, //si le champ sera visible uniquement au moment de la modification de la données liées à la table data
65
+ disabledOnEditing : <boolean>, //si le champ est désactivé dans le formulaire lorsqu'il s'agit de la modification de la données liée à la table data
66
+
67
+ primaryKey : <boolean>, //si le champ fait partie des clés primaire de la table data. Par défaut, tous les champs de type clé primaire sont en mode lecture seule en cas de modification de la données. il est indispensable pour chaque table de données de toujours spécifier au moins un champ comme clé primaire. tous les champs ayant cette propriétés à true sont utilisés à chaque fois pour évaluer l'identifiant unique lié àla table data mais aussi pour déterminer s'il s'agit d'une mise à jour où pas
68
+ },
69
+ ....
70
+ [fieldN] : {....}
71
+ },
72
+
51
73
  }
52
74
  */
53
75
  export default {
54
-
76
+ users : require("./users").default,
55
77
  }
56
78
 
57
79
  export {default as getTable} from "./getTable";
@@ -0,0 +1,11 @@
1
+ import React from "$react";
2
+ import DateLib from "$clib/date";
3
+
4
+ export default function accordion({rowData}){
5
+ return {
6
+ content : `${rowData.email}`,
7
+ title : rowData?.username,
8
+ avatar : rowData.avatar,
9
+ right : DateLib.format(rowData.birthdate),
10
+ }
11
+ }
@@ -0,0 +1 @@
1
+ export default 'material-person-add'
@@ -0,0 +1,42 @@
1
+ import accordion from "./accordion";
2
+ import table from "./table";
3
+ import {navigateToTableData} from "$enavigation/utils";
4
+ import editIcon from "./editIcon";
5
+ import addIcon from "./addIcon";
6
+ import newElementLabel from "./newElementLabel";
7
+ import { generateData } from "./utils";
8
+
9
+ export default {
10
+ fetcher : (url,options)=>{ //la fonction fetcher à passer au composant SWRDatagrid
11
+ return Promise.resolve(generateData(1000)); //génère 100 utilisateurs à l'aide de la librarire faker
12
+ },
13
+ accordionProps : {
14
+ accordion,
15
+ bottomSheetTitle : ({rowCounterIndex})=>{
16
+ return "Détail sur l'utilisateur N° "+rowCounterIndex.formatNumber();
17
+ },
18
+ },
19
+ /*** les actions du datagrid lorsqu'on sélectionne les éléments de la table */
20
+ selectedRowsActions : ({selectedRows,selectedRowsCount,...rest})=>{
21
+ return {
22
+ edit : {
23
+ text : 'Modifier/Consulter',
24
+ icon : editIcon,
25
+ perm : `${table}:update|read`, //cette action n'est affiché si et seulement si l'utilisateur a la permission de modifier la table
26
+ onPress : ({selectedRows})=>{
27
+ navigateToTableData(table,{datas:selectedRows});
28
+ }
29
+ },
30
+ }
31
+ },
32
+ actions : [
33
+ {
34
+ text : newElementLabel,
35
+ icon : addIcon,
36
+ perm : `${table}:create`, //cette action n'est affichée si et seulement si l'utilisateur a la permission de créer un élément lié à la table data
37
+ onPress : ()=>{
38
+ navigateToTableData(table,{});
39
+ }
40
+ }
41
+ ],
42
+ }
@@ -0,0 +1 @@
1
+ export default "pencil";
@@ -0,0 +1,30 @@
1
+
2
+ export default {
3
+ userId : {
4
+ primaryKey : true,
5
+ text :"Id",
6
+ type : "id", //il s'agit d'un champ de type id
7
+ visibleOnlyOnEditing : true, //l'id de sera généré depuis la base de données, donc pas question d'afficher au moment de création de la table data
8
+ width : 180, //spécifier la longueur de la colonne dans le composant datagrid
9
+ },
10
+ username : {
11
+ text : "Name",
12
+ width : 220,
13
+ },
14
+ amount : {
15
+ type : "number",
16
+ label : "Amount",
17
+ },
18
+ email : {
19
+ type : "email",
20
+ label : 'Email',
21
+ },
22
+ avatar : {
23
+ type : "image",
24
+ label: 'Avatar',
25
+ },
26
+ birthdate : {
27
+ type : "date",
28
+ label : "Date",
29
+ },
30
+ }
@@ -0,0 +1,10 @@
1
+ export default {
2
+ table : require("./table").default,
3
+ icon : 'material-people',
4
+ title : "Exemple table : Utilisateurs",
5
+ datagrid : require("./datagrid").default,
6
+ perms : require("./perms").default,
7
+ newElementLabel : require("./newElementLabel").default,
8
+ sortable : false, //la table n'est pas triable
9
+ filterable : false,//la table n'est pas filterable
10
+ }
@@ -0,0 +1 @@
1
+ export default "Nouvel utilisateur";
@@ -0,0 +1,15 @@
1
+ export default {
2
+ delete : false, //il sera impossible d'assigner la permission de suppression à un utilisateur
3
+ readPerms : {
4
+ text : "Visualiser permissions",
5
+ tooltip : "Peut visualiser les permissions des autres utilisateurs"
6
+ },
7
+ editPerms : {
8
+ text : "Modifier permissions",
9
+ tooltip : "Peut Modifier les permissions des autres utilisateurs"
10
+ },
11
+ groupable : {
12
+ text : "Grouper les données de liste",
13
+ tooltip : "Peut grouper les données de liste",
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ export default "users";
@@ -0,0 +1,20 @@
1
+ import { faker } from '@faker-js/faker';
2
+ export function createRandomUser (){
3
+ return {
4
+ userId: faker.string.uuid(),
5
+ username: faker.internet.userName(),
6
+ amount : faker.number.int(),
7
+ email: faker.internet.email(),
8
+ avatar: faker.image.dataUri({height:50,width:50}),
9
+ password: faker.internet.password(),
10
+ birthdate: faker.date.birthdate(),
11
+ registeredAt: faker.date.past(),
12
+ };
13
+ }
14
+
15
+ export const generateData = (count)=>{
16
+ count = typeof count =='number' && count > 5 ? count : 10000;
17
+ return faker.helpers.multiple(createRandomUser, {
18
+ count,
19
+ });
20
+ }
@@ -0,0 +1,47 @@
1
+ import SWRDatagrid from "$ecomponents/Datagrid/SWRDatagrid";
2
+ import getTable from "$database/tables/getTable";
3
+ import { defaultStr } from "$cutils";
4
+ import {forwardRef} from "$react";
5
+ import fetch from "$capi/fetch";
6
+
7
+ const TableDataListLayoutComponent = forwardRef(
8
+ ({ tableName, table,fetcher, ...rest }, ref) => {
9
+ tableName = defaultStr(tableName, table).trim().toUpperCase();
10
+ const tableObj = Object.assign({}, getTable(tableName));
11
+ return ( //le SWRDatagrid est le composant datagrid réicrit à l'aide de la librairie swr : (https://swr.vercel.app/) utile pour effectuer le fetching des données distantes
12
+ <SWRDatagrid
13
+ fetchPath = {tableName} //le chemin (path) à passer à la fonction useSWR, @voir : https://swr.vercel.app/
14
+ fetchPathKey={tableName} //IL s'agit d'une chaine de caractère identifiant de manière unique le chemin fetchPath. Si vous faites appels plusieurs fois à ce composants, rassurez vous à chaque fois que cette clié soit distinct pour chaque appel car sionon les données récupérées depuis la BD seront identiques pour tous les appels du composant
15
+ sessionName={tableName} //le nom de la session, utile pour persister les paramètres liés au datagrid de la table data
16
+ filterable={true} //si la table de données est filterable, spécifiez la valeur false, pour que les données ne soit pas filtrable
17
+ canFetchOnlyVisibleColumns={false} //si uniquement les colonnes visisible seront récupérérs depuis la base de données, via le champ fields des options envoyés à la fonction fetcher
18
+ parseMangoQueries = {true} //Spécifiez la valeur false, si vous utilisez une base de données qui accepte les requêtes mangoes (Voir https://www.mongodb.com/docs/manual/tutorial/query-documents) et true pour un backend lié à une BD relationnelle
19
+ {...rProps}
20
+ {...defaultObj(tableObj.datagrid)} //les props du datagrid lié à la table data
21
+ exportToExcelIsAllowed={"{0}:exporttoexcel".sprintf(tableName)} //la permission pour l'export des données de la table data au format Excel, vous pouvez définir également une fonction de la forme : ()=><boolean>
22
+ exportToPDFIsAllowed={"{0}:exporttopdf".sprintf(tableName)} //la permission pour l'export des données au format pdf, vous pouvez également définir une fonction de la forme : ()=><boolean>
23
+ {...rest}
24
+ ref={ref}
25
+ fetcher={(url, opts) => {
26
+ if(typeof fetcher ==="function"){
27
+ return fetcher(url,opts);
28
+ }
29
+ delete opts.fields;
30
+ delete opts?.fetchOptions?.fields;
31
+ console.log(opts.fetchOptions," les options à utiliser pour effectuer le fetch distant des données");
32
+ console.log(url," l'url de la requête")
33
+ console.log(opts.fetchOptions?.where," les options de filtres ")
34
+ //implémenter votre logique de récupération des données distance
35
+ return fetch(url, opts);
36
+ }}
37
+ table={tableObj}
38
+ />
39
+ );
40
+ }
41
+ );
42
+
43
+ export default TableDataListLayoutComponent;
44
+
45
+ TableDataListLayoutComponent.displayName = "TableDataListLayoutComponent";
46
+
47
+ TableDataListLayoutComponent.propTypes = {};
@@ -0,0 +1,2 @@
1
+
2
+ export {default as List} from "./List";
@@ -1,9 +1,9 @@
1
1
  import Screen from "$eScreen";
2
- import SWRDatagrid from "$ecomponents/Datagrid/SWRDatagrid";
2
+ import {List} from "$layouts/TableData";
3
3
 
4
4
  export default function TableDataListScreen (props){
5
5
  return <Screen {...props}>
6
- <SWRDatagrid {...props}/>
6
+ <List {...props}/>
7
7
  </Screen>
8
8
  }
9
9
 
@@ -31,6 +31,21 @@ export default class TableDataScreenItem extends TableData{
31
31
  upsertToDB({data,tableName,...rest}){
32
32
  return Promise.resolve({data});
33
33
  }
34
+ prepareComponentProps (...rest){
35
+ return super.prepareComponentProps(...rest); //pour preparer les props qui seront rendu par le composant
36
+ }
37
+ /****
38
+ la fonction permet de préparer les champs du composant TableData avant qu'ils ne soient envoyés au composant FormData
39
+ Si cette fonction retourne false, alors le champ en question ne sera pas pris en compte dans le formulaire lors de l'enregistrement des données
40
+ Cette fonction est très utile pour non seulement filtrer les champs qui peuvent appraitre dans le formulaire, mais aussi modifier dynamiquement le status du champ en fonction des situatioins
41
+ - le champ isUpdate <boolean>, détermine s'il s'agit d'une mise à jour de la données (data) en cours
42
+ - le champ name <string>, représente le nom du champ dans le formulaire, la clé du champ dans la props fields du table data
43
+ - le champ field <object>, représente l'objet field, l'une des valeurs de la propriétés fields du table data
44
+ - le champ data <object>, représente la donnée du table data en cours de traitement. Lorsque isUpdate est à false, data est un objet non vide et non null
45
+ */
46
+ prepareField({name,field,isUpdate,data,...rest}){
47
+ return super.prepareField({name,field,isUpdate,data,...rest});
48
+ }
34
49
  }
35
50
 
36
51
  TableDataScreenItem.Modal = true; //spécifiez si cet écran s'affiche en model ou non
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fto-consult/expo-ui",
3
- "version": "8.49.0",
3
+ "version": "8.50.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": {
@@ -0,0 +1,76 @@
1
+ import React from "$react";
2
+ import theme from "$theme";
3
+ import Label from "$ecomponents/Label";
4
+ import {defaultObj} from "$cutils";
5
+ import Icon from "$ecomponents/Icon";
6
+ import {Pressable,StyleSheet} from "react-native";
7
+ import PropTypes from "prop-types";
8
+
9
+ const ButtonStatusComponent = React.forwardRef(({status,withIcon,color,backgroundColor,label,text,icon,editIconProps,editIcon,iconProps,onPress,editable,testID,left,right,labelProps,...containerProps},ref)=>{
10
+ labelProps = defaultObj(labelProps);
11
+ iconProps = defaultObj(iconProps);
12
+ testID = defaultStr(testID,"RN_ButtonStatusComponent_"+status);
13
+ const style = defaultObj(StyleSheet.flatten(containerProps.style));
14
+ color = theme.Colors.isValid(color) ? color : theme.Colors.isValid(style.color)? style.color : undefined;
15
+ backgroundColor = theme.Colors.isValid(backgroundColor) ? backgroundColor : theme.color.isValid(style.backgroundColor)?style.backgroundColor : undefined;
16
+ const rP = {style:[color && {color}, backgroundColor && {backgroundColor}]};
17
+ if(color){
18
+ rP.color = color;
19
+ }
20
+ if(backgroundColor){
21
+ rP.backgroundColor = backgroundColor;
22
+ }
23
+ label = React.isValidElement(label,true) && label || React.isValid(text,true) && text || null;
24
+ left = typeof left =='function'? left(rP) : left;
25
+ right = typeof right =='function'? right(rP) : right;
26
+ const icProps = {color,size:15,...iconProps,style:[theme.styles.noMargin,theme.styles.noPadding,iconProps.style],onPress}
27
+ return <Pressable ref={ref} onPres={onPress} testID={`${testID}_Container`} {...containerProps} style={[{borderRadius:15,paddingVertical:4,paddingHorizontal:10,alignSelf: 'flex-start'},theme.styles.row,theme.styles.flexWrap,backgroundColor && {backgroundColor},style]}>
28
+ {React.isValidElement(left)? left : null}
29
+ {withIcon !== false && React.isValidElement(icon,true) ? <Icon {...icProps} icon={icon} />:null}
30
+ {label ? <Label testID={`${testID}_Label`} {...labelProps} style={[color && {color},{fontSize:13},labelProps.style]}>{label}</Label> : null}
31
+ {withIcon !== false && editable && React.isValidElement(editIcon,true) ? <Icon {...icProps} icon={editIcon} {...defaultObj(editIconProps)}/>:null}
32
+ {React.isValidElement(right)? right : null}
33
+ </Pressable>
34
+ });
35
+
36
+ ButtonStatusComponent.displayName = "ButtonStatusComponent";
37
+
38
+ export default ButtonStatusComponent;
39
+
40
+ ButtonStatusComponent.defaultProps = {
41
+ withIcon : true,
42
+ editable : false,
43
+ }
44
+
45
+ ButtonStatusComponent.propTypes = {
46
+ label : PropTypes.oneOfType([ //le libelé à faire figurer sur le status
47
+ PropTypes.node,
48
+ PropTypes.element,
49
+ PropTypes.string,
50
+ ]),
51
+ text : PropTypes.oneOfType([ //alias à label
52
+ PropTypes.node,
53
+ PropTypes.element,
54
+ PropTypes.string,
55
+ ]),
56
+ labelProps : PropTypes.object, //les props à passer au composant Label, pour l'affichage du libelé du status
57
+ withIcon : PropTypes.bool, //si les icones seront affichés
58
+ color : PropTypes.string, //la couleur du status
59
+ backgroundColor : PropTypes.string, //la couleur d'arrière plan
60
+ iconProps : PropTypes.object, //les props à passer aux différents icones du composant
61
+ onPres : PropTypes.func, //la fonction appelée lorsqu'on clique sur le status
62
+ editable : PropTypes.bool, //si le status est modifiable, dans ce cas une icone est affiché à droite lorsque le status est editable
63
+ left : PropTypes.oneOfType([ //l'élément react à rendre à gauche du texte (label)
64
+ PropTypes.func,
65
+ PropTypes.node,
66
+ PropTypes.string,
67
+ PropTypes.element,
68
+ ]),
69
+ right : PropTypes.oneOfType([ //l'élément react à rendre à droite du texte (label)
70
+ PropTypes.func,
71
+ PropTypes.node,
72
+ PropTypes.string,
73
+ PropTypes.element,
74
+ ]),
75
+ editIconProps : PropTypes.object,//les props de l'iconne edit
76
+ }
@@ -12,6 +12,7 @@ import ActivityIndicator from "$ecomponents/ActivityIndicator";
12
12
  import Surface from "$ecomponents/Surface";
13
13
  import Label from "$ecomponents/Label";
14
14
  import {defaultObj,defaultVal,defaultDecimal,defaultStr} from "$cutils";
15
+ import {default as Status} from "./Status";
15
16
 
16
17
  import PropTypes from "prop-types";
17
18
  const white = "white";
@@ -466,4 +467,8 @@ ButtonComponent.propTypes = {
466
467
  return true;
467
468
  }
468
469
  return false;
469
- }
470
+ }
471
+
472
+ ButtonComponent.Status = Status;
473
+
474
+ export {Status};
@@ -1,7 +1,7 @@
1
1
  module.exports = {
2
2
  "@fto-consult/expo-ui": {
3
3
  "name": "@fto-consult/expo-ui",
4
- "version": "8.48.0",
4
+ "version": "8.49.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/borispipo/expo-ui.git"