feat(smart-app): implement complete mobile app MVP

- App.tsx: full navigation (Auth stack + Main tabs with 5 screens)
- Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen
- HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors
- MapScreen: interactive map with layer toggles (6 layers)
- MarketplaceScreen: categories (6), products (5), search
- ChatScreen: AI chat with quick prompts (4), bot responses
- ProfileScreen: user info, stats, menu (9 items), logout
- AlertsScreen: alert list with severity, acknowledge
- SensorsScreen: sensor list with type filters (6 types), search
- ZonesScreen: zone cards with stats
- SettingsScreen: language picker (FR/EN/ES/DE), privacy, about
- Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n
- Hooks: useSensors, useAlerts, useNotifications, useLocation
- Components: Card, Button, LoadingSpinner, ErrorBoundary, Header
- Services: iotService, notificationService (with axios API client)
- Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN)
- Theme: colors.ts with full design system (Blue Ocean palette)
- Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
This commit is contained in:
Eric FELIXINE
2026-06-01 18:00:35 -04:00
parent 08ca495bde
commit e30ae8ed09
35578 changed files with 3703534 additions and 43 deletions

View File

@@ -0,0 +1,138 @@
import * as React from 'react';
import { Platform, StyleSheet } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import DialogActions from './DialogActions';
import DialogContent from './DialogContent';
import DialogIcon from './DialogIcon';
import DialogScrollArea from './DialogScrollArea';
import DialogTitle from './DialogTitle';
import { useInternalTheme } from '../../core/theming';
import overlay from '../../styles/overlay';
import Modal from '../Modal';
const DIALOG_ELEVATION = 24;
/**
* Dialogs inform users about a specific task and may contain critical information, require decisions, or involve multiple tasks.
* To render the `Dialog` above other components, you'll need to wrap it with the [`Portal`](../../Portal) component.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { View } from 'react-native';
* import { Button, Dialog, Portal, PaperProvider, Text } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const showDialog = () => setVisible(true);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <PaperProvider>
* <View>
* <Button onPress={showDialog}>Show Dialog</Button>
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.Title>Alert</Dialog.Title>
* <Dialog.Content>
* <Text variant="bodyMedium">This is simple dialog</Text>
* </Dialog.Content>
* <Dialog.Actions>
* <Button onPress={hideDialog}>Done</Button>
* </Dialog.Actions>
* </Dialog>
* </Portal>
* </View>
* </PaperProvider>
* );
* };
*
* export default MyComponent;
* ```
*/
const Dialog = ({
children,
dismissable = true,
dismissableBackButton = dismissable,
onDismiss,
visible = false,
style,
theme: themeOverrides,
testID
}) => {
const {
right,
left
} = useSafeAreaInsets();
const theme = useInternalTheme(themeOverrides);
const {
isV3,
dark,
mode,
colors,
roundness
} = theme;
const borderRadius = (isV3 ? 7 : 1) * roundness;
const backgroundColorV2 = dark && mode === 'adaptive' ? overlay(DIALOG_ELEVATION, colors === null || colors === void 0 ? void 0 : colors.surface) : colors === null || colors === void 0 ? void 0 : colors.surface;
const backgroundColor = isV3 ? theme.colors.elevation.level3 : backgroundColorV2;
return /*#__PURE__*/React.createElement(Modal, {
dismissable: dismissable,
dismissableBackButton: dismissableBackButton,
onDismiss: onDismiss,
visible: visible,
contentContainerStyle: [{
borderRadius,
backgroundColor,
marginHorizontal: Math.max(left, right, 26)
}, styles.container, style],
theme: theme,
testID: testID
}, React.Children.toArray(children).filter(child => child != null && typeof child !== 'boolean').map((child, i) => {
if (isV3) {
if (i === 0 && /*#__PURE__*/React.isValidElement(child)) {
return /*#__PURE__*/React.cloneElement(child, {
style: [{
marginTop: 24
}, child.props.style]
});
}
}
if (i === 0 && /*#__PURE__*/React.isValidElement(child) && child.type === DialogContent) {
// Dialog content is the first item, so we add a top padding
return /*#__PURE__*/React.cloneElement(child, {
style: [{
paddingTop: 24
}, child.props.style]
});
}
return child;
}));
};
// @component ./DialogContent.tsx
Dialog.Content = DialogContent;
// @component ./DialogActions.tsx
Dialog.Actions = DialogActions;
// @component ./DialogTitle.tsx
Dialog.Title = DialogTitle;
// @component ./DialogScrollArea.tsx
Dialog.ScrollArea = DialogScrollArea;
// @component ./DialogIcon.tsx
Dialog.Icon = DialogIcon;
const styles = StyleSheet.create({
container: {
/**
* This prevents the shadow from being clipped on Android since Android
* doesn't support `overflow: visible`.
* One downside for this fix is that it will disable clicks on the area
* of the shadow around the dialog, consequently, if you click around the
* dialog (44 pixel from the top and bottom) it won't be dismissed.
*/
marginVertical: Platform.OS === 'android' ? 44 : 0,
elevation: DIALOG_ELEVATION,
justifyContent: 'flex-start'
}
});
export default Dialog;
//# sourceMappingURL=Dialog.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","Platform","StyleSheet","useSafeAreaInsets","DialogActions","DialogContent","DialogIcon","DialogScrollArea","DialogTitle","useInternalTheme","overlay","Modal","DIALOG_ELEVATION","Dialog","children","dismissable","dismissableBackButton","onDismiss","visible","style","theme","themeOverrides","testID","right","left","isV3","dark","mode","colors","roundness","borderRadius","backgroundColorV2","surface","backgroundColor","elevation","level3","createElement","contentContainerStyle","marginHorizontal","Math","max","styles","container","Children","toArray","filter","child","map","i","isValidElement","cloneElement","marginTop","props","type","paddingTop","Content","Actions","Title","ScrollArea","Icon","create","marginVertical","OS","justifyContent"],"sourceRoot":"../../../../src","sources":["components/Dialog/Dialog.tsx"],"mappings":"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","ignoreList":[]}

View File

@@ -0,0 +1,66 @@
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
import * as React from 'react';
import { StyleSheet, View } from 'react-native';
import { useInternalTheme } from '../../core/theming';
/**
* A component to show a list of actions in a Dialog.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Button, Dialog, Portal } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.Actions>
* <Button onPress={() => console.log('Cancel')}>Cancel</Button>
* <Button onPress={() => console.log('Ok')}>Ok</Button>
* </Dialog.Actions>
* </Dialog>
* </Portal>
* );
* };
*
* export default MyComponent;
* ```
*/
const DialogActions = props => {
const {
isV3
} = useInternalTheme(props.theme);
const actionsLength = React.Children.toArray(props.children).length;
return /*#__PURE__*/React.createElement(View, _extends({}, props, {
style: [isV3 ? styles.v3Container : styles.container, props.style]
}), React.Children.map(props.children, (child, i) => /*#__PURE__*/React.isValidElement(child) ? /*#__PURE__*/React.cloneElement(child, {
compact: true,
uppercase: !isV3,
style: [isV3 && {
marginRight: i + 1 === actionsLength ? 0 : 8
}, child.props.style]
}) : child));
};
DialogActions.displayName = 'Dialog.Actions';
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-end',
padding: 8
},
v3Container: {
flexDirection: 'row',
flexGrow: 1,
alignItems: 'center',
justifyContent: 'flex-end',
paddingBottom: 24,
paddingHorizontal: 24
}
});
export default DialogActions;
//# sourceMappingURL=DialogActions.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","StyleSheet","View","useInternalTheme","DialogActions","props","isV3","theme","actionsLength","Children","toArray","children","length","createElement","_extends","style","styles","v3Container","container","map","child","i","isValidElement","cloneElement","compact","uppercase","marginRight","displayName","create","flexDirection","alignItems","justifyContent","padding","flexGrow","paddingBottom","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["components/Dialog/DialogActions.tsx"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAAoBC,UAAU,EAAEC,IAAI,QAAmB,cAAc;AAKrE,SAASC,gBAAgB,QAAQ,oBAAoB;AAcrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,aAAa,GAAIC,KAAY,IAAK;EACtC,MAAM;IAAEC;EAAK,CAAC,GAAGH,gBAAgB,CAACE,KAAK,CAACE,KAAK,CAAC;EAC9C,MAAMC,aAAa,GAAGR,KAAK,CAACS,QAAQ,CAACC,OAAO,CAACL,KAAK,CAACM,QAAQ,CAAC,CAACC,MAAM;EAEnE,oBACEZ,KAAA,CAAAa,aAAA,CAACX,IAAI,EAAAY,QAAA,KACCT,KAAK;IACTU,KAAK,EAAE,CAACT,IAAI,GAAGU,MAAM,CAACC,WAAW,GAAGD,MAAM,CAACE,SAAS,EAAEb,KAAK,CAACU,KAAK;EAAE,IAElEf,KAAK,CAACS,QAAQ,CAACU,GAAG,CAACd,KAAK,CAACM,QAAQ,EAAE,CAACS,KAAK,EAAEC,CAAC,KAC3C,aAAArB,KAAK,CAACsB,cAAc,CAAyBF,KAAK,CAAC,gBAC/CpB,KAAK,CAACuB,YAAY,CAACH,KAAK,EAAE;IACxBI,OAAO,EAAE,IAAI;IACbC,SAAS,EAAE,CAACnB,IAAI;IAChBS,KAAK,EAAE,CACLT,IAAI,IAAI;MACNoB,WAAW,EAAEL,CAAC,GAAG,CAAC,KAAKb,aAAa,GAAG,CAAC,GAAG;IAC7C,CAAC,EACDY,KAAK,CAACf,KAAK,CAACU,KAAK;EAErB,CAAC,CAAC,GACFK,KACN,CACI,CAAC;AAEX,CAAC;AAEDhB,aAAa,CAACuB,WAAW,GAAG,gBAAgB;AAE5C,MAAMX,MAAM,GAAGf,UAAU,CAAC2B,MAAM,CAAC;EAC/BV,SAAS,EAAE;IACTW,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,UAAU;IAC1BC,OAAO,EAAE;EACX,CAAC;EACDf,WAAW,EAAE;IACXY,aAAa,EAAE,KAAK;IACpBI,QAAQ,EAAE,CAAC;IACXH,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,UAAU;IAC1BG,aAAa,EAAE,EAAE;IACjBC,iBAAiB,EAAE;EACrB;AACF,CAAC,CAAC;AAEF,eAAe/B,aAAa","ignoreList":[]}

View File

@@ -0,0 +1,42 @@
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
import * as React from 'react';
import { View, StyleSheet } from 'react-native';
/**
* A component to show content in a Dialog.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Dialog, Portal, Text } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.Content>
* <Text variant="bodyMedium">This is simple dialog</Text>
* </Dialog.Content>
* </Dialog>
* </Portal>
* );
* };
*
* export default MyComponent;
* ```
*/
const DialogContent = props => /*#__PURE__*/React.createElement(View, _extends({}, props, {
style: [styles.container, props.style]
}), props.children);
DialogContent.displayName = 'Dialog.Content';
const styles = StyleSheet.create({
container: {
paddingBottom: 24,
paddingHorizontal: 24
}
});
export default DialogContent;
//# sourceMappingURL=DialogContent.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","View","StyleSheet","DialogContent","props","createElement","_extends","style","styles","container","children","displayName","create","paddingBottom","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["components/Dialog/DialogContent.tsx"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,IAAI,EAAaC,UAAU,QAAmB,cAAc;AAUrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,aAAa,GAAIC,KAAY,iBACjCJ,KAAA,CAAAK,aAAA,CAACJ,IAAI,EAAAK,QAAA,KAAKF,KAAK;EAAEG,KAAK,EAAE,CAACC,MAAM,CAACC,SAAS,EAAEL,KAAK,CAACG,KAAK;AAAE,IACrDH,KAAK,CAACM,QACH,CACP;AAEDP,aAAa,CAACQ,WAAW,GAAG,gBAAgB;AAE5C,MAAMH,MAAM,GAAGN,UAAU,CAACU,MAAM,CAAC;EAC/BH,SAAS,EAAE;IACTI,aAAa,EAAE,EAAE;IACjBC,iBAAiB,EAAE;EACrB;AACF,CAAC,CAAC;AAEF,eAAeX,aAAa","ignoreList":[]}

View File

@@ -0,0 +1,75 @@
import * as React from 'react';
import { StyleSheet, View } from 'react-native';
import { useInternalTheme } from '../../core/theming';
import Icon from '../Icon';
/**
* @supported Available in v5.x with theme version 3
* A component to show an icon in a Dialog.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { StyleSheet } from 'react-native';
* import { Dialog, Portal, Text } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.Icon icon="alert" />
* <Dialog.Title style={styles.title}>This is a title</Dialog.Title>
* <Dialog.Content>
* <Text variant="bodyMedium">This is simple dialog</Text>
* </Dialog.Content>
* </Dialog>
* </Portal>
* );
* };
*
* const styles = StyleSheet.create({
* title: {
* textAlign: 'center',
* },
* })
*
* export default MyComponent;
* ```
*/
const DialogIcon = ({
size = 24,
color,
icon,
theme: themeOverrides
}) => {
const theme = useInternalTheme(themeOverrides);
if (!theme.isV3) {
return null;
}
//@ts-ignore
const iconColor = color || theme.colors.secondary;
return /*#__PURE__*/React.createElement(View, {
style: styles.wrapper
}, /*#__PURE__*/React.createElement(Icon, {
source: icon,
color: iconColor,
size: size
}));
};
DialogIcon.displayName = 'Dialog.Icon';
const styles = StyleSheet.create({
wrapper: {
alignItems: 'center',
justifyContent: 'center',
paddingTop: 24
}
});
export default DialogIcon;
// @component-docs ignore-next-line
export { DialogIcon };
//# sourceMappingURL=DialogIcon.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","StyleSheet","View","useInternalTheme","Icon","DialogIcon","size","color","icon","theme","themeOverrides","isV3","iconColor","colors","secondary","createElement","style","styles","wrapper","source","displayName","create","alignItems","justifyContent","paddingTop"],"sourceRoot":"../../../../src","sources":["components/Dialog/DialogIcon.tsx"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAI/C,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,OAAOC,IAAI,MAAsB,SAAS;AAqB1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,UAAU,GAAGA,CAAC;EAClBC,IAAI,GAAG,EAAE;EACTC,KAAK;EACLC,IAAI;EACJC,KAAK,EAAEC;AACF,CAAC,KAAK;EACX,MAAMD,KAAK,GAAGN,gBAAgB,CAACO,cAAc,CAAC;EAE9C,IAAI,CAACD,KAAK,CAACE,IAAI,EAAE;IACf,OAAO,IAAI;EACb;;EAEA;EACA,MAAMC,SAAS,GAAGL,KAAK,IAAIE,KAAK,CAACI,MAAM,CAACC,SAAS;EAEjD,oBACEd,KAAA,CAAAe,aAAA,CAACb,IAAI;IAACc,KAAK,EAAEC,MAAM,CAACC;EAAQ,gBAC1BlB,KAAA,CAAAe,aAAA,CAACX,IAAI;IAACe,MAAM,EAAEX,IAAK;IAACD,KAAK,EAAEK,SAAU;IAACN,IAAI,EAAEA;EAAK,CAAE,CAC/C,CAAC;AAEX,CAAC;AAEDD,UAAU,CAACe,WAAW,GAAG,aAAa;AAEtC,MAAMH,MAAM,GAAGhB,UAAU,CAACoB,MAAM,CAAC;EAC/BH,OAAO,EAAE;IACPI,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE;EACd;AACF,CAAC,CAAC;AAEF,eAAenB,UAAU;;AAEzB;AACA,SAASA,UAAU","ignoreList":[]}

View File

@@ -0,0 +1,59 @@
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
import * as React from 'react';
import { StyleSheet, View } from 'react-native';
import { useInternalTheme } from '../../core/theming';
/**
* A component to show a scrollable content in a Dialog. The component only provides appropriate styling.
* For the scrollable content you can use `ScrollView`, `FlatList` etc. depending on your requirement.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { ScrollView } from 'react-native';
* import { Dialog, Portal, Text } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.ScrollArea>
* <ScrollView contentContainerStyle={{paddingHorizontal: 24}}>
* <Text>This is a scrollable area</Text>
* </ScrollView>
* </Dialog.ScrollArea>
* </Dialog>
* </Portal>
* );
* };
*
* export default MyComponent;
* ```
*/
const DialogScrollArea = props => {
const theme = useInternalTheme(props.theme);
const borderStyles = {
borderColor: theme.isV3 ? theme.colors.surfaceVariant : 'rgba(0, 0, 0, .12)',
borderTopWidth: theme.isV3 ? 1 : StyleSheet.hairlineWidth,
borderBottomWidth: theme.isV3 ? 1 : StyleSheet.hairlineWidth
};
return /*#__PURE__*/React.createElement(View, _extends({}, props, {
style: [styles.container, borderStyles, theme.isV3 && styles.v3Container, props.style]
}), props.children);
};
DialogScrollArea.displayName = 'Dialog.ScrollArea';
const styles = StyleSheet.create({
container: {
paddingHorizontal: 24,
flexGrow: 1,
flexShrink: 1
},
v3Container: {
marginBottom: 24
}
});
export default DialogScrollArea;
//# sourceMappingURL=DialogScrollArea.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","StyleSheet","View","useInternalTheme","DialogScrollArea","props","theme","borderStyles","borderColor","isV3","colors","surfaceVariant","borderTopWidth","hairlineWidth","borderBottomWidth","createElement","_extends","style","styles","container","v3Container","children","displayName","create","paddingHorizontal","flexGrow","flexShrink","marginBottom"],"sourceRoot":"../../../../src","sources":["components/Dialog/DialogScrollArea.tsx"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAAoBC,UAAU,EAAEC,IAAI,QAAmB,cAAc;AAIrE,SAASC,gBAAgB,QAAQ,oBAAoB;AAcrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAIC,KAAY,IAAK;EACzC,MAAMC,KAAK,GAAGH,gBAAgB,CAACE,KAAK,CAACC,KAAK,CAAC;EAC3C,MAAMC,YAAY,GAAG;IACnBC,WAAW,EAAEF,KAAK,CAACG,IAAI,GACnBH,KAAK,CAACI,MAAM,CAACC,cAAc,GAC3B,oBAAoB;IACxBC,cAAc,EAAEN,KAAK,CAACG,IAAI,GAAG,CAAC,GAAGR,UAAU,CAACY,aAAa;IACzDC,iBAAiB,EAAER,KAAK,CAACG,IAAI,GAAG,CAAC,GAAGR,UAAU,CAACY;EACjD,CAAC;EACD,oBACEb,KAAA,CAAAe,aAAA,CAACb,IAAI,EAAAc,QAAA,KACCX,KAAK;IACTY,KAAK,EAAE,CACLC,MAAM,CAACC,SAAS,EAChBZ,YAAY,EACZD,KAAK,CAACG,IAAI,IAAIS,MAAM,CAACE,WAAW,EAChCf,KAAK,CAACY,KAAK;EACX,IAEDZ,KAAK,CAACgB,QACH,CAAC;AAEX,CAAC;AAEDjB,gBAAgB,CAACkB,WAAW,GAAG,mBAAmB;AAElD,MAAMJ,MAAM,GAAGjB,UAAU,CAACsB,MAAM,CAAC;EAC/BJ,SAAS,EAAE;IACTK,iBAAiB,EAAE,EAAE;IACrBC,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE;EACd,CAAC;EACDN,WAAW,EAAE;IACXO,YAAY,EAAE;EAChB;AACF,CAAC,CAAC;AAEF,eAAevB,gBAAgB","ignoreList":[]}

View File

@@ -0,0 +1,74 @@
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
import * as React from 'react';
import { StyleSheet } from 'react-native';
import { useInternalTheme } from '../../core/theming';
import Text from '../Typography/Text';
import Title from '../Typography/v2/Title';
/**
* A component to show a title in a Dialog.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Dialog, Portal, Text } from 'react-native-paper';
*
* const MyComponent = () => {
* const [visible, setVisible] = React.useState(false);
*
* const hideDialog = () => setVisible(false);
*
* return (
* <Portal>
* <Dialog visible={visible} onDismiss={hideDialog}>
* <Dialog.Title>This is a title</Dialog.Title>
* <Dialog.Content>
* <Text variant="bodyMedium">This is simple dialog</Text>
* </Dialog.Content>
* </Dialog>
* </Portal>
* );
* };
*
* export default MyComponent;
* ```
*/
const DialogTitle = ({
children,
theme: themeOverrides,
style,
...rest
}) => {
const theme = useInternalTheme(themeOverrides);
const {
isV3,
colors,
fonts
} = theme;
const TextComponent = isV3 ? Text : Title;
const headerTextStyle = {
color: isV3 ? colors.onSurface : colors === null || colors === void 0 ? void 0 : colors.text,
...(isV3 ? fonts.headlineSmall : {})
};
return /*#__PURE__*/React.createElement(TextComponent, _extends({
variant: "headlineSmall",
accessibilityRole: "header",
style: [styles.text, isV3 && styles.v3Text, headerTextStyle, style]
}, rest), children);
};
DialogTitle.displayName = 'Dialog.Title';
const styles = StyleSheet.create({
text: {
marginTop: 22,
marginBottom: 18,
marginHorizontal: 24
},
v3Text: {
marginTop: 16,
marginBottom: 16
}
});
export default DialogTitle;
// @component-docs ignore-next-line
export { DialogTitle };
//# sourceMappingURL=DialogTitle.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","StyleSheet","useInternalTheme","Text","Title","DialogTitle","children","theme","themeOverrides","style","rest","isV3","colors","fonts","TextComponent","headerTextStyle","color","onSurface","text","headlineSmall","createElement","_extends","variant","accessibilityRole","styles","v3Text","displayName","create","marginTop","marginBottom","marginHorizontal"],"sourceRoot":"../../../../src","sources":["components/Dialog/DialogTitle.tsx"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAAoBC,UAAU,QAAmB,cAAc;AAE/D,SAASC,gBAAgB,QAAQ,oBAAoB;AAErD,OAAOC,IAAI,MAAM,oBAAoB;AACrC,OAAOC,KAAK,MAAM,wBAAwB;AAc1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,WAAW,GAAGA,CAAC;EACnBC,QAAQ;EACRC,KAAK,EAAEC,cAAc;EACrBC,KAAK;EACL,GAAGC;AACE,CAAC,KAAK;EACX,MAAMH,KAAK,GAAGL,gBAAgB,CAACM,cAAc,CAAC;EAC9C,MAAM;IAAEG,IAAI;IAAEC,MAAM;IAAEC;EAAM,CAAC,GAAGN,KAAK;EAErC,MAAMO,aAAa,GAAGH,IAAI,GAAGR,IAAI,GAAGC,KAAK;EAEzC,MAAMW,eAAe,GAAG;IACtBC,KAAK,EAAEL,IAAI,GAAGC,MAAM,CAACK,SAAS,GAAGL,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEM,IAAI;IAC7C,IAAIP,IAAI,GAAGE,KAAK,CAACM,aAAa,GAAG,CAAC,CAAC;EACrC,CAAC;EAED,oBACEnB,KAAA,CAAAoB,aAAA,CAACN,aAAa,EAAAO,QAAA;IACZC,OAAO,EAAC,eAAe;IACvBC,iBAAiB,EAAC,QAAQ;IAC1Bd,KAAK,EAAE,CAACe,MAAM,CAACN,IAAI,EAAEP,IAAI,IAAIa,MAAM,CAACC,MAAM,EAAEV,eAAe,EAAEN,KAAK;EAAE,GAChEC,IAAI,GAEPJ,QACY,CAAC;AAEpB,CAAC;AAEDD,WAAW,CAACqB,WAAW,GAAG,cAAc;AAExC,MAAMF,MAAM,GAAGvB,UAAU,CAAC0B,MAAM,CAAC;EAC/BT,IAAI,EAAE;IACJU,SAAS,EAAE,EAAE;IACbC,YAAY,EAAE,EAAE;IAChBC,gBAAgB,EAAE;EACpB,CAAC;EACDL,MAAM,EAAE;IACNG,SAAS,EAAE,EAAE;IACbC,YAAY,EAAE;EAChB;AACF,CAAC,CAAC;AAEF,eAAexB,WAAW;;AAE1B;AACA,SAASA,WAAW","ignoreList":[]}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["components/Dialog/utils.ts"],"mappings":"","ignoreList":[]}