diff --git a/app.json b/app.json index 160bcb1..6fc2e59 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "expo": { "name": "ImEX Mobile", "slug": "imexmobile", - "version": "1.2.3", + "version": "1.3.0", "extra": { "expover": "1" }, @@ -11,12 +11,12 @@ "ios": { "supportsTablet": true, "bundleIdentifier": "com.imex.imexmobile", - "buildNumber": "1.2.3", + "buildNumber": "1.3.0", "googleServicesFile": "./GoogleService-Info.plist" }, "android": { "package": "com.imex.imexmobile", - "versionCode": 1020300, + "versionCode": 1030000, "googleServicesFile": "./google-services.json" }, "splash": { @@ -29,9 +29,7 @@ "updates": { "fallbackToCacheTimeout": 0 }, - "assetBundlePatterns": [ - "**/*" - ], + "assetBundlePatterns": ["**/*"], "web": { "favicon": "./assets/logo192noa.png", "config": { @@ -60,8 +58,6 @@ } ] }, - "plugins": [ - "sentry-expo" - ] + "plugins": ["sentry-expo"] } } diff --git a/components/job-list/job-list.component.jsx b/components/job-list/job-list.component.jsx index bac93dd..491e457 100644 --- a/components/job-list/job-list.component.jsx +++ b/components/job-list/job-list.component.jsx @@ -1,7 +1,8 @@ import { useQuery } from "@apollo/client"; import React from "react"; -import { RefreshControl, View, Text } from "react-native"; -import { FlatList } from "react-native-gesture-handler"; +import { useTranslation } from "react-i18next"; +import { FlatList, RefreshControl, Text, View } from "react-native"; +import { Button, Searchbar, Title } from "react-native-paper"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; @@ -9,8 +10,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import ErrorDisplay from "../error-display/error-display.component"; import JobListItem from "../job-list-item/job-list-item.component"; import LoadingDisplay from "../loading-display/loading-display.component"; -import { Title, Button, Searchbar } from "react-native-paper"; -import { useTranslation } from "react-i18next"; + const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); diff --git a/components/screen-main/screen-main.component.jsx b/components/screen-main/screen-main.component.jsx index 65dd259..3d524ad 100644 --- a/components/screen-main/screen-main.component.jsx +++ b/components/screen-main/screen-main.component.jsx @@ -5,7 +5,7 @@ import { createStackNavigator } from "@react-navigation/stack"; import i18n from "i18next"; import React, { useEffect } from "react"; import { Button } from "react-native-paper"; -import { SafeAreaView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { logImEXEvent } from "../../firebase/firebase.analytics"; @@ -25,7 +25,7 @@ import ScreenMediaBrowser from "../screen-media-browser/screen-media-browser.com import ScreenSettingsComponent from "../screen-settings/screen-settings.component"; import ScreenSignIn from "../screen-sign-in/screen-sign-in.component"; import ScreenSplash from "../screen-splash/screen-splash.component"; -import moment from "moment"; + const JobStack = createStackNavigator(); const MoreStack = createStackNavigator(); const BottomTabs = createBottomTabNavigator(); @@ -107,6 +107,15 @@ const MoreStackNavigator = () => ( const BottomTabsNavigator = () => ( ({ + // tabBarActiveTintColor: "dodgerblue", + // tabBarInactiveTintColor: "slategrey", + // tabBarStyle: [ + // { + // display: "flex", + // }, + // null, + // ], + // eslint-disable-next-line react/display-name tabBarIcon: ({ color, size }) => { let iconName; @@ -123,24 +132,27 @@ const BottomTabsNavigator = () => ( return ; }, })} - tabBarOptions={{ - activeTintColor: "dodgerblue", - inactiveTintColor: "slategrey", - }} > @@ -155,27 +167,16 @@ export function ScreenMainComponent({ checkUserSession(); }, [checkUserSession]); - const hasMobileAccess = - bodyshop && - bodyshop.features && - (bodyshop.features.allAccess === true || - moment(bodyshop.features.mobile).isAfter(moment())); - - console.log( - "🚀 ~ file: screen-main.component.jsx ~ line 171 ~ hasMobileAccess", - hasMobileAccess, - bodyshop && bodyshop.features - ); return ( {currentUser.authorized === null ? ( ) : currentUser.authorized ? ( - bodyshop && hasMobileAccess ? ( + bodyshop ? ( ) : ( - + ) ) : ( diff --git a/components/screen-media-browser/screen-media-browser.component.jsx b/components/screen-media-browser/screen-media-browser.component.jsx index fd12739..9c6d9e0 100644 --- a/components/screen-media-browser/screen-media-browser.component.jsx +++ b/components/screen-media-browser/screen-media-browser.component.jsx @@ -1,6 +1,6 @@ import { Ionicons } from "@expo/vector-icons"; import { AssetsSelector } from "expo-images-picker"; -import React, { useCallback, useState } from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { StyleSheet, Text, View } from "react-native"; import { connect } from "react-redux"; @@ -11,6 +11,7 @@ import CameraSelectJob from "../camera-select-job/camera-select-job.component"; import JobSpaceAvailable from "../job-space-available/job-space-available.component"; import UploadDeleteSwitch from "../upload-delete-switch/upload-delete-switch.component"; import UploadProgress from "../upload-progress/upload-progress.component"; +import { MediaType } from "expo-media-library"; const mapStateToProps = createStructuredSelector({ selectedCameraJobId: selectCurrentCameraJobId, @@ -29,6 +30,93 @@ export function ImageBrowserScreen({ selectedCameraJobId }) { if (data.length !== 0) setUploads(data); }; + const widgetErrors = useMemo( + () => ({ + errorTextColor: "black", + errorMessages: { + hasErrorWithPermissions: "Please Allow media gallery permissions.", + hasErrorWithLoading: "There was an error while loading images.", + hasErrorWithResizing: "There was an error while loading images.", + hasNoAssets: "No images found.", + }, + }), + [] + ); + + const widgetSettings = useMemo( + () => ({ + getImageMetaData: false, // true might perform slower results but gives meta data and absolute path for ios users + initialLoad: 100, + assetsType: [MediaType.photo, MediaType.video], + minSelection: 1, + maxSelection: 3, + portraitCols: 4, + landscapeCols: 4, + }), + [] + ); + + const widgetResize = useMemo( + () => ({ + width: 50, + compress: 0.7, + base64: false, + saveTo: "jpeg", + }), + [] + ); + + const _textStyle = { + color: "white", + }; + + const _buttonStyle = { + backgroundColor: "orange", + borderRadius: 5, + }; + + const widgetNavigator = useMemo( + () => ({ + Texts: { + finish: t("mediabrowser.actions.upload"), + back: t("mediabrowser.actions.refresh"), + selected: "selected", + }, + midTextColor: "black", + minSelection: 1, + buttonTextStyle: styles.textStyle, + buttonStyle: styles.buttonStyle, + onBack: () => { + forceRerender(); + }, + onSuccess: onDone, + }), + [] + ); + + const widgetStyles = useMemo( + () => ({ + margin: 2, + bgColor: "white", + spinnerColor: "blue", + widgetWidth: 99, + videoIcon: { + Component: Ionicons, + iconName: "ios-videocam", + color: "white", + size: 20, + }, + selectedIcon: { + Component: Ionicons, + iconName: "ios-checkmark-circle-outline", + color: "white", + bg: "rgba(35,35,35, 0.75)", + size: 32, + }, + }), + [] + ); + return ( @@ -49,62 +137,10 @@ export function ImageBrowserScreen({ selectedCameraJobId }) { { - forceRerender(); - }, - doneFunction: onDone, - }, - - noAssets: { - Component: function NoAsset() { - return ( - - - - {t("mediabrowser.labels.nomedia")} - - - ); - }, - }, - }} + Settings={widgetSettings} + Errors={widgetErrors} + Styles={widgetStyles} + Navigator={widgetNavigator} /> )} @@ -130,3 +166,60 @@ const styles = StyleSheet.create({ }); export default connect(mapStateToProps, null)(ImageBrowserScreen); + +// options={{ +// assetsType: ["photo", "video"], +// margin: 3, +// portraitCols: 4, +// landscapeCols: 6, +// widgetWidth: 100, +// widgetBgColor: "white", +// selectedBgColor: "#adadad", +// spinnerColor: "#c8c8c8", +// videoIcon: { +// Component: Ionicons, +// iconName: "ios-videocam", +// color: "white", +// size: 20, +// }, +// selectedIcon: { +// Component: Ionicons, +// iconName: "ios-checkmark-circle-outline", +// color: "white", +// bg: "rgba(35,35,35, 0.75)", +// size: 32, +// }, +// defaultTopNavigator: { +// continueText: t("mediabrowser.actions.upload"), +// goBackText: t("mediabrowser.actions.refresh"), +// buttonStyle: styles.buttonStyle, +// textStyle: styles.textStyle, +// backFunction: () => { +// forceRerender(); +// }, +// doneFunction: onDone, +// }, + +// noAssets: { +// Component: function NoAsset() { +// return ( +// +// +// +// {t("mediabrowser.labels.nomedia")} +// +// +// ); +// }, +// }, +// }}