diff --git a/app.json b/app.json index 41e9b57..6e3296f 100644 --- a/app.json +++ b/app.json @@ -65,6 +65,12 @@ }, "description": "", "plugins": [ + [ + "expo-dev-client", + { + "launchMode": "most-recent" + } + ], [ "expo-media-library", { diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx deleted file mode 100644 index 54e11d0..0000000 --- a/app/(tabs)/_layout.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Tabs } from 'expo-router'; -import React from 'react'; - -import { HapticTab } from '@/components/haptic-tab'; -import { IconSymbol } from '@/components/ui/icon-symbol'; -import { Colors } from '@/constants/theme'; -import { useColorScheme } from '@/hooks/use-color-scheme'; - -export default function TabLayout() { - const colorScheme = useColorScheme(); - - return ( - - , - }} - /> - , - }} - /> - - ); -} diff --git a/app/(tabs)/explore.tsx b/app/(tabs)/explore.tsx deleted file mode 100644 index 71518f9..0000000 --- a/app/(tabs)/explore.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { Image } from 'expo-image'; -import { Platform, StyleSheet } from 'react-native'; - -import { Collapsible } from '@/components/ui/collapsible'; -import { ExternalLink } from '@/components/external-link'; -import ParallaxScrollView from '@/components/parallax-scroll-view'; -import { ThemedText } from '@/components/themed-text'; -import { ThemedView } from '@/components/themed-view'; -import { IconSymbol } from '@/components/ui/icon-symbol'; -import { Fonts } from '@/constants/theme'; - -export default function TabTwoScreen() { - return ( - - }> - - - Explore - - - This app includes example code to help you get started. - - - This app has two screens:{' '} - app/(tabs)/index.tsx and{' '} - app/(tabs)/explore.tsx - - - The layout file in app/(tabs)/_layout.tsx{' '} - sets up the tab navigator. - - - Learn more - - - - - You can open this project on Android, iOS, and the web. To open the web version, press{' '} - w in the terminal running this project. - - - - - For static images, you can use the @2x and{' '} - @3x suffixes to provide files for - different screen densities - - - - Learn more - - - - - This template has light and dark mode support. The{' '} - useColorScheme() hook lets you inspect - what the user's current color scheme is, and so you can adjust UI colors accordingly. - - - Learn more - - - - - This template includes an example of an animated component. The{' '} - components/HelloWave.tsx component uses - the powerful{' '} - - react-native-reanimated - {' '} - library to create a waving hand animation. - - {Platform.select({ - ios: ( - - The components/ParallaxScrollView.tsx{' '} - component provides a parallax effect for the header image. - - ), - })} - - - ); -} - -const styles = StyleSheet.create({ - headerImage: { - color: '#808080', - bottom: -90, - left: -35, - position: 'absolute', - }, - titleContainer: { - flexDirection: 'row', - gap: 8, - }, -}); diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx deleted file mode 100644 index 786b736..0000000 --- a/app/(tabs)/index.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { Image } from 'expo-image'; -import { Platform, StyleSheet } from 'react-native'; - -import { HelloWave } from '@/components/hello-wave'; -import ParallaxScrollView from '@/components/parallax-scroll-view'; -import { ThemedText } from '@/components/themed-text'; -import { ThemedView } from '@/components/themed-view'; -import { Link } from 'expo-router'; - -export default function HomeScreen() { - return ( - - }> - - Welcome! - - - - Step 1: Try it - - Edit app/(tabs)/index.tsx to see changes. - Press{' '} - - {Platform.select({ - ios: 'cmd + d', - android: 'cmd + m', - web: 'F12', - })} - {' '} - to open developer tools. - - - - - - Step 2: Explore - - - - alert('Action pressed')} /> - alert('Share pressed')} - /> - - alert('Delete pressed')} - /> - - - - - - {`Tap the Explore tab to learn more about what's included in this starter app.`} - - - - Step 3: Get a fresh start - - {`When you're ready, run `} - npm run reset-project to get a fresh{' '} - app directory. This will move the current{' '} - app to{' '} - app-example. - - - - ); -} - -const styles = StyleSheet.create({ - titleContainer: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - }, - stepContainer: { - gap: 8, - marginBottom: 8, - }, - reactLogo: { - height: 178, - width: 290, - bottom: 0, - left: 0, - position: 'absolute', - }, -}); diff --git a/app/_layout.tsx b/app/_layout.tsx index f518c9b..620ea20 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,24 +1,31 @@ -import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; -import { Stack } from 'expo-router'; -import { StatusBar } from 'expo-status-bar'; -import 'react-native-reanimated'; +import { ApolloProvider } from "@apollo/client"; +import { Icon, Label, NativeTabs } from "expo-router/unstable-native-tabs"; +import { useTranslation } from "react-i18next"; +import { Provider } from "react-redux"; +import { PersistGate } from "redux-persist/integration/react"; +import { client } from "../graphql/client"; +import { persistor, store } from "../redux/store"; +import "../translations/i18n"; -import { useColorScheme } from '@/hooks/use-color-scheme'; - -export const unstable_settings = { - anchor: '(tabs)', -}; - -export default function RootLayout() { - const colorScheme = useColorScheme(); +export default function TabLayout() { + const { t } = useTranslation(); return ( - - - - - - - + + + + + + + + + + + + + + + + ); } diff --git a/app/index.tsx b/app/index.tsx new file mode 100644 index 0000000..127e318 --- /dev/null +++ b/app/index.tsx @@ -0,0 +1,5 @@ +import { Redirect } from "expo-router"; + +export default function Index() { + return ; +} diff --git a/app/jobs/[jobId].tsx b/app/jobs/[jobId].tsx new file mode 100644 index 0000000..ff52b6a --- /dev/null +++ b/app/jobs/[jobId].tsx @@ -0,0 +1,20 @@ +import { useLocalSearchParams } from "expo-router"; +import { StyleSheet, Text, View } from "react-native"; + +export default function JobDetail() { + const params = useLocalSearchParams(); + + return ( + + Job Details for Job ID: {JSON.stringify(params)} + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, +}); diff --git a/app/jobs/_layout.tsx b/app/jobs/_layout.tsx new file mode 100644 index 0000000..9724f86 --- /dev/null +++ b/app/jobs/_layout.tsx @@ -0,0 +1,18 @@ +import { Stack } from "expo-router"; + +function JobsStack() { + return ( + + + + + ); +} + +export default JobsStack; diff --git a/app/jobs/index.tsx b/app/jobs/index.tsx new file mode 100644 index 0000000..3523ff2 --- /dev/null +++ b/app/jobs/index.tsx @@ -0,0 +1,24 @@ +import { Link } from "expo-router"; +import { StyleSheet, Text, View } from "react-native"; + +export default function Tab() { + return ( + + Jobs Screen. + + Go to detail + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, +}); diff --git a/app/modal.tsx b/app/modal.tsx deleted file mode 100644 index 6dfbc1a..0000000 --- a/app/modal.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Link } from 'expo-router'; -import { StyleSheet } from 'react-native'; - -import { ThemedText } from '@/components/themed-text'; -import { ThemedView } from '@/components/themed-view'; - -export default function ModalScreen() { - return ( - - This is a modal - - Go to home screen - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - padding: 20, - }, - link: { - marginTop: 15, - paddingVertical: 15, - }, -}); diff --git a/app/settings.tsx b/app/settings.tsx new file mode 100644 index 0000000..2aa5299 --- /dev/null +++ b/app/settings.tsx @@ -0,0 +1,17 @@ +import { StyleSheet, Text, View } from 'react-native'; + +export default function Tab() { + return ( + + Tab [Home|Settings] + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/redux/user/user.sagas.js b/redux/user/user.sagas.js index 8b1bb79..32f34c4 100644 --- a/redux/user/user.sagas.js +++ b/redux/user/user.sagas.js @@ -1,7 +1,6 @@ //import * as Analytics from "expo-firebase-analytics";//JF:commenting out the firebase analytics portion import { signInWithEmailAndPassword, signOut } from "firebase/auth"; import { all, call, put, takeLatest } from "redux-saga/effects"; -import * as Sentry from '@sentry/react-native'; import { logImEXEvent } from "../../firebase/firebase.analytics"; import { auth, @@ -108,8 +107,8 @@ export function* onSignInSuccess() { export function* signInSuccessSaga({ payload }) { try { // Analytics.setUserId(payload.email);//JF:commenting out the firebase analytics portion - //Sentry.setUser({ email: payload.email }); - + + const shop = yield client.query({ query: QUERY_BODYSHOP }); logImEXEvent("imexmobile_sign_in_success", payload); @@ -123,7 +122,7 @@ export function* signInSuccessSaga({ payload }) { // ); } catch (error) { console.log("UH-OH. Couldn't get shop details.", error); - Sentry.captureException(error); + } } diff --git a/util/document-upload.utility.js b/util/document-upload.utility.js index 0e5a592..1922f8d 100644 --- a/util/document-upload.utility.js +++ b/util/document-upload.utility.js @@ -1,4 +1,4 @@ -import * as Sentry from "@sentry/react-native"; + import axios from "axios"; import * as MediaLibrary from "expo-media-library"; import env from "../env"; @@ -6,12 +6,11 @@ import { client } from "../graphql/client"; import { INSERT_NEW_DOCUMENT } from "../graphql/documents.queries"; import { axiosAuthInterceptorId } from "./CleanAxios"; //import { splitClient } from "../components/screen-main/screen-main.component"; -import { File } from "expo-file-system"; //Context: currentUserEmail, bodyshop, jobid, invoiceid //Required to prevent headers from getting set and rejected from Cloudinary. -var cleanAxios = axios.create(); +let cleanAxios = axios.create(); cleanAxios.interceptors.request.eject(axiosAuthInterceptorId); export const handleUpload = async (ev, context) => { @@ -49,7 +48,7 @@ export const handleUpload = async (ev, context) => { } catch (error) { console.log("Error creating upload promise", error.message, error.stack); if (onError) onError(error.message); - Sentry.captureException(error); + return { success: false, error: error.message, @@ -91,7 +90,7 @@ export const uploadToImgproxy = async ( const { presignedUrl: preSignedUploadUrlToS3, key: s3Key } = signedURLResponse.data.signedUrls[0]; - var options = { + let options = { headers: { "Content-Type": fileType, "Content-Length": file.size, @@ -133,7 +132,7 @@ export const uploadToImgproxy = async ( } catch (error) { console.log("Error uploading to S3", error.message, error.stack); if (onError) onError(error.message); - Sentry.captureException(error); + return { success: false, error: error.message, diff --git a/util/local-document-upload.utility.js b/util/local-document-upload.utility.js index 7d29b6a..8ce80f3 100644 --- a/util/local-document-upload.utility.js +++ b/util/local-document-upload.utility.js @@ -1,8 +1,8 @@ import axios from "axios"; -import { store } from "../redux/store"; -import mime from "mime"; import * as MediaLibrary from "expo-media-library"; -import * as Sentry from "@sentry/react-native"; +import mime from "mime"; +import { store } from "../redux/store"; + axios.interceptors.request.use( function (config) { @@ -96,14 +96,12 @@ export const handleLocalUpload = async ({ }); } } catch (error) { - Sentry.captureException(error); console.log("Error uploading documents:", error.message); onError && onError({ error: error.message }); } } catch (error) { console.log("Uncaught error", error); - Sentry.captureException(error); onError && onError({ error: error.message }); }