# Project export: Jobstr

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: CruzHacks 2024
- Tagline: Confused student? Changing careers? Jobstr is the app for you. Jobstr employs the fun and snappy format of dating apps like Tinder to "match" you with the perfect career path!
- Devpost: https://devpost.com/software/jobstr
- GitHub: https://github.com/sarahwxie/cruzhacks2024
- Demo: https://docs.google.com/presentation/d/1GeCRHB_L4PQm_YU7ciTVu_y0vyuM6mv-1Ehs3p4TMKQ/edit?usp=sharing
- Result: winner ([Sponsor - Vectara])
- Team: 3 GitHub contributor(s) — sarahwxie (6 commits), Jacqueline Palevich (2 commits), vjvasqz (1 commits)

## Devpost submission (written by the team)

### Overview

We hacked until the last minute, so check out our Google Slides for the latest screens!

### Inspiration

Like most college students, the members of our team are facing down one of the most daunting decisions we've ever had to make. At 19 years old, with barely any life experience under our belts, we need to decide what we want to do with the rest of our lives. And judges, if you've gone through a career change recently, maybe the apprehension, worry, and uncertainty that this decision brings is still fresh in your mind. Our app aims to change all of that.

### What it does

Jobstr uses the familiar, fun, and snappy format of a dating app to help you find your perfect career! Swipe through jobs that are specifically tailored for your profile. Are they hot or not? If you "like" a job, you'll get a match! Then, you'll get the chance to speak to an AI chatbot specifically programmed with all the knowledge of a seasoned professional in the field. Who do you want to be?

### How we built it

Inspired by the internships we've done, our tech stack uses the following tech stack: React Native TypeScript MobX-State-Tree Expo RN Reanimated for Animations AsyncStorage Jest & Maestro for Tests CircleCI We also use AI tooling: To generate inclusive images To allow you to chat with a member of a chosen career

### Challenges we ran into

We have a clear pathway for all the features we want to implement to create a MVP, however we had a little bit a trouble completing some of the last features on time (eg. editing of your own profile page)

### Accomplishments we're proud of

Getting almost all of our critical features done! Using a scrum and CI/CD format

### What we learned

Lots about Figma, UI/UX! Data Scraping Working in the React Native Framework

## README (from the GitHub repository)

# Welcome to your new ignited app!

[![CircleCI](https://circleci.com/gh/infinitered/ignite.svg?style=svg)](https://circleci.com/gh/infinitered/ignite)

## The latest and greatest boilerplate for Infinite Red opinions

This is the boilerplate that [Infinite Red](https://infinite.red) uses as a way to test bleeding-edge changes to our React Native stack.

Currently includes:

- React Native
- React Navigation
- MobX State Tree
- TypeScript
- And more!

## Quick Start

The Ignite boilerplate project's structure will look similar to this:

```
ignite-project
├── app
│   ├── components
│   ├── config
│   ├── i18n
│   ├── models
│   ├── navigators
│   ├── screens
│   ├── services
│   ├── theme
│   ├── utils
│   └── app.tsx
├── assets
│   ├── icons
│   └── images
├── test
│   ├── __snapshots__
│   ├── mockFile.ts
│   └── setup.ts
├── README.md
├── android
│   ├── app
│   ├── build.gradle
│   ├── gradle
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── keystores
│   └── settings.gradle
├── ignite
│   └── templates
|       |── app-icon
│       ├── component
│       ├── model
│       ├── navigator
│       └── screen
├── index.js
├── ios
│   ├── IgniteProject
│   ├── IgniteProject-tvOS
│   ├── IgniteProject-tvOSTests
│   ├── IgniteProject.xcodeproj
│   └── IgniteProjectTests
├── .env
└── package.json

```

### ./app directory

Included in an Ignite boilerplate project is the `app` directory. This is a directory you would normally have to create when using vanilla React Native.

The inside of the `app` directory looks similar to the following:

```
app
├── components
├── config
├── i18n
├── models
├── navigators
├── screens
├── services
├── theme
├── utils
└── app.tsx
```

**components**
This is where your reusable components live which help you build your screens.

**i18n**
This is where your translations will live if you are using `react-native-i18n`.

**models**
This is where your app's models will live. Each model has a directory which will contain the `mobx-state-tree` model file, test file, and any other supporting files like actions, types, etc.

**navigators**
This is where your `react-navigation` navigators will live.

**screens**
This is where your screen components will live. A screen is a React component which will take up the entire screen and be part of the navigation hierarchy. Each screen will have a directory containing the `.tsx` file, along with any assets or other helper files.

**services**
Any services that interface with the outside world will live here (think REST APIs, Push Notifications, etc.).

**theme**
Here lives the theme for your application, including spacing, colors, and typography.

**utils**
This is a great place to put miscellaneous helpers and utilities. Things like date helpers, formatters, etc. are often found here. However, it should only be used for things that are truly shared across your application. If a helper or utility is only used by a specific component or model, consider co-locating your helper with that component or model.

**app.tsx** This is the entry point to your app. This is where you will find the main App component which renders the rest of the application.

### ./assets directory

This directory is designed to organize and store various assets, making it easy for you to manage and use them in your application. The assets are further categorized into subdirectories, including `icons` and `images`:

```
assets
├── icons
└── images
```

**icons**
This is where your icon assets will live. These icons can be used for buttons, navigation elements, or any other UI components. The recommended format for icons is PNG, but other formats can be used as well.

Ignite comes with a built-in `Icon` component. You can find detailed usage instructions in the [docs](https://github.com/infinitered/ignite/blob/master/docs/Components-Icon.md).

**images**
This is where your images will live, such as background images, logos, or any other graphics. You can use various formats such as PNG, JPEG, or GIF for your images.

Another valuable built-in component within Ignite is the `AutoImage` component. You can find detailed usage instructions in the [docs](https://github.com/infinitered/ignite/blob/master/docs/Components-AutoImage.md).

How to use your `icon` or `image` assets:

```
import { Image } from 'react-native';

const MyComponent = () => {
  return (
    <Image source={require('../assets/images/my_image.png')} />
  );
};
```

### ./ignite directory

The `ignite` directory stores all things Ignite, including CLI and boilerplate items. Here you will find templates you can customize to help you get started with React Native.

### ./test directory

This directory will hold your Jest configs and mocks.

## Running Maestro end-to-end tests

Follow our [Maestro Setup](https://ignitecookbook.com/docs/recipes/MaestroSetup) recipe from the [Ignite Cookbook](https://ignitecookbook.com/)!

## Previous Boilerplates

- [2018 aka Bowser](https://github.com/infinitered/ignite-bowser)
- [2017 aka Andross](https://github.com/infinitered/ignite-andross)
- [2016 aka Ignite 1.0](https://github.com/infinitered/ignite-ir-boilerplate-2016)

## Detected evidence (automated analysis)

Indexed codebase: 121 recognized source files, 371 KB.
- Firebase (technology) — detected in the code
- JavaScript (language) — detected in the code
- React (technology) — detected in the code
- TypeScript (language) — detected in the code
- Python (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (120 of 136)

```
.gitignore
.maestro/FavoritePodcast.yaml
.maestro/Login.yaml
.prettierignore
app.config.ts
app.json
App.tsx
app/app.tsx
app/assets/data/demo.ts
app/assets/styles/index.ts
app/components/AutoImage.tsx
app/components/Button.tsx
app/components/Card.tsx
app/components/CardItem.tsx
app/components/City.tsx
app/components/EmptyState.tsx
app/components/Filters.tsx
app/components/Header.tsx
app/components/Icon.tsx
app/components/IconTinder.tsx
app/components/index.ts
app/components/ListItem.tsx
app/components/ListView.tsx
app/components/Message.tsx
app/components/ProfileItem.tsx
app/components/Screen.tsx
app/components/TabBarIcon.tsx
app/components/Text.tsx
app/components/TextField.tsx
app/components/Toggle.tsx
app/config/config.base.ts
app/config/config.dev.ts
app/config/config.prod.ts
app/config/index.ts
app/devtools/ReactotronClient.ts
app/devtools/ReactotronClient.web.ts
app/devtools/ReactotronConfig.ts
app/i18n/ar.ts
app/i18n/en.ts
app/i18n/fr.ts
app/i18n/i18n.ts
app/i18n/index.ts
app/i18n/ko.ts
app/i18n/translate.ts
app/manual-libraries/react-native-card-stack-swiper/Card.js
app/manual-libraries/react-native-card-stack-swiper/CardStack.js
app/manual-libraries/react-native-card-stack-swiper/index.d.ts
app/manual-libraries/react-native-card-stack-swiper/index.js
app/models/AuthenticationStore.ts
app/models/Episode.test.ts
app/models/Episode.ts
app/models/EpisodeStore.ts
app/models/helpers/getRootStore.ts
app/models/helpers/setupRootStore.ts
app/models/helpers/useStores.ts
app/models/helpers/withSetPropAction.ts
app/models/index.ts
app/models/RootStore.ts
app/navigators/AppNavigator.tsx
app/navigators/DemoNavigator.tsx
app/navigators/index.ts
app/navigators/InsideNavigator.tsx
app/navigators/navigationUtilities.ts
app/screens/ChatScreen.tsx
app/screens/DemoCommunityScreen.tsx
app/screens/DemoDebugScreen.tsx
app/screens/DemoPodcastListScreen.tsx
app/screens/DemoShowroomScreen/DemoDivider.tsx
app/screens/DemoShowroomScreen/demos/DemoAutoImage.tsx
app/screens/DemoShowroomScreen/demos/DemoButton.tsx
app/screens/DemoShowroomScreen/demos/DemoCard.tsx
app/screens/DemoShowroomScreen/demos/DemoEmptyState.tsx
app/screens/DemoShowroomScreen/demos/DemoHeader.tsx
app/screens/DemoShowroomScreen/demos/DemoIcon.tsx
app/screens/DemoShowroomScreen/demos/DemoListItem.tsx
app/screens/DemoShowroomScreen/demos/DemoText.tsx
app/screens/DemoShowroomScreen/demos/DemoTextField.tsx
app/screens/DemoShowroomScreen/demos/DemoToggle.tsx
app/screens/DemoShowroomScreen/demos/index.ts
app/screens/DemoShowroomScreen/DemoShowroomScreen.tsx
app/screens/DemoShowroomScreen/DemoUseCase.tsx
app/screens/DemoShowroomScreen/DrawerIconButton.tsx
app/screens/ErrorScreen/ErrorBoundary.tsx
app/screens/ErrorScreen/ErrorDetails.tsx
app/screens/HomeOld.tsx
app/screens/HomeScreen.tsx
app/screens/index.ts
app/screens/LoginScreen.tsx
app/screens/MatchesScreen.tsx
app/screens/ProfileScreen.tsx
app/screens/WelcomeScreen.tsx
app/services/api/api.ts
app/services/api/api.types.ts
app/services/api/apiProblem.test.ts
app/services/api/apiProblem.ts
app/services/api/index.ts
app/theme/colors.ts
app/theme/index.ts
app/theme/spacing.ts
app/theme/timing.ts
app/theme/typography.ts
app/types
app/types.ts
app/utils/crashReporting.ts
app/utils/delay.ts
app/utils/formatDate.ts
app/utils/ignoreWarnings.ts
app/utils/openLinkInBrowser.ts
app/utils/storage/index.ts
app/utils/storage/storage.test.ts
app/utils/storage/storage.ts
app/utils/useHeader.tsx
app/utils/useIsMounted.ts
app/utils/useSafeAreaInsetsStyle.ts
assets/generationJson/careers (3).json
assets/generationJson/images.json
babel.config.js
eas.json
FirebaseConfig.ts
ignite/templates/component/NAME.tsx.ejs
[16 more files omitted for size]
```

### Dependencies

- package.json: @babel/core@^7.20.0, @babel/plugin-proposal-export-namespace-from@^7.18.9, @babel/plugin-proposal-nullish-coalescing-operator@^7.0.0, @babel/plugin-proposal-optional-chaining@^7.0.0, @babel/plugin-transform-arrow-functions@^7.0.0, @babel/plugin-transform-shorthand-properties@^7.0.0, @babel/plugin-transform-template-literals@^7.0.0, @babel/preset-env@^7.20.0, @babel/runtime@^7.20.0, @expo-google-fonts/space-grotesk@^0.2.2, @react-native-async-storage/async-storage@1.18.2, @react-navigation/bottom-tabs@^6.3.2, @react-navigation/native@^6.0.2, @react-navigation/native-stack@^6.0.2, @shopify/flash-list@1.4.3, @types/i18n-js@3.8.2, @types/jest@^29.2.1, @types/react@~18.2.14, @types/react-test-renderer@^18.0.0, @typescript-eslint/eslint-plugin@^5.59.0, @typescript-eslint/parser@^5.59.0, apisauce@3.0.1, babel-jest@^29.2.1, date-fns@^2.30.0, eslint@8.17.0, eslint-config-prettier@8.5.0, eslint-config-standard@17.0.0, eslint-plugin-import@2.26.0, eslint-plugin-n@^15.0.0, eslint-plugin-node@11.1.0, eslint-plugin-promise@6.0.0, eslint-plugin-react@7.30.0, eslint-plugin-react-native@4.0.0, eslint-plugin-reactotron@^0.1.1, expo@^49.0.21, expo-application@~5.3.0, expo-build-properties@~0.8.3, expo-font@~11.4.0, expo-linking@~5.0.2, expo-localization@~14.3.0, expo-splash-screen@~0.20.4, expo-status-bar@~1.6.0, firebase@^10.7.2, i18n-js@3.9.2, jest@^29.2.1, jest-expo@49.0.0, mobx@6.10.2, mobx-react-lite@4.0.5, mobx-state-tree@5.3.0, patch-package@6.4.7, postinstall-prepare@1.0.1, prettier@2.8.8, prop-types@^15.8.1, react@18.2.0, react-dom@18.2.0, react-lifecycles-compat@^3.0.4, react-native@0.72.6, react-native-drawer-layout@4.0.0-alpha.1, react-native-gesture-handler@~2.12.0, react-native-reanimated@~3.3.0, react-native-safe-area-context@4.6.3, react-native-screens@~3.22.0, react-native-web@~0.19.6, react-test-renderer@18.2.0, reactotron-core-client@2.8.11, reactotron-mst@3.1.5, reactotron-react-js@3.3.9, reactotron-react-native@5.0.4, rn-tinder-card@^1.7.0, ts-jest@^29.1.1, ts-node@^10.9.2, typescript@5.3.2

### Recent commits (newest first)

- Merge pull request #1 from jacqueraffe/main
- rest of images + json
- adding images
- changed hanne to veronica
- matches, chat, profile pages
- good looking screens
- working swiping left & right functionality
- working firebase, tinder code
- New Ignite 9.4.0 app

## Key source files (fetched from GitHub, selected and truncated for size)

### package.json

```
{
  "name": "cruzhacks-2024",
  "version": "0.0.1",
  "private": true,
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "compile": "tsc --noEmit -p . --pretty",
    "format": "prettier --write \"app/**/*.{js,jsx,json,md,ts,tsx}\"",
    "lint": "eslint App.tsx app test --fix --ext .js,.ts,.tsx && npm run format",
    "patch": "patch-package",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:maestro": "maestro test .maestro/FavoritePodcast.yaml",
    "adb": "adb reverse tcp:9090 tcp:9090 && adb reverse tcp:3000 tcp:3000 && adb reverse tcp:9001 tcp:9001 && adb reverse tcp:8081 tcp:8081",
    "postinstall": "patch-package",
    "bundle:visualize": "npx react-native-bundle-visualizer",
    "bundle:visualize:dev": "npx react-native-bundle-visualizer --dev",
    "build:ios:sim": "eas build --profile development --platform ios --local",
    "build:ios:dev": "eas build --profile development:device --platform ios --local",
    "build:ios:prod": "eas build --profile production --platform ios --local",
    "build:android:sim": "eas build --profile development --platform android --local",
    "build:android:dev": "eas build --profile development:device --platform android --local",
    "build:android:prod": "eas build --profile production --platform android --local",
    "start": "npx expo start",
    "android": "npx expo start --android",
    "ios": "npx expo start --ios",
    "web": "npx expo start --web",
    "bundle:web": "npx expo export --platform web",
    "serve:web": "npx server dist",
    "prebuild:clean": "npx expo prebuild --clean",
    "prebuild": "npx expo prebuild"
  },
  "dependencies": {
    "@expo-google-fonts/space-grotesk": "^0.2.2",
    "@react-native-async-storage/async-storage": "1.18.2",
    "@react-navigation/bottom-tabs": "^6.3.2",
    "@react-navigation/native": "^6.0.2",
    "@react-navigation/native-stack": "^6.0.2",
    "@shopify/flash-list": "1.4.3",
    "apisauce": "3.0.1",
    "date-fns": "^2.30.0",
    "expo": "^49.0.21",
    "expo-application": "~5.3.0",
    "expo-build-properties": "~0.8.3",
    "expo-font": "~11.4.0",
    "expo-linking": "~5.0.2",
    "expo-localization": "~14.3.0",
    "expo-splash-screen": "~0.20.4",
    "expo-status-bar": "~1.6.0",
    "firebase": "^10.7.2",
    "i18n-js": "3.9.2",
    "mobx": "6.10.2",
    "mobx-react-lite": "4.0.5",
    "mobx-state-tree": "5.3.0",
    "prop-types": "^15.8.1",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-lifecycles-compat": "^3.0.4",
    "react-native": "0.72.6",
    "react-native-drawer-layout": "4.0.0-alpha.1",
    "react-native-gesture-handler": "~2.12.0",
    "react-native-reanimated": "~3.3.0",
    "react-native-safe-area-context": "4.6.3",
    "react-native-screens": "~3.22.0",
    "react-native-web": "~0.19.6",
    "rn-tinder-card": "^1.7.0"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0",
    "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
    "@babel/plugin-proposal-optional-chaining": "^7.0.0",
    "@babel/plugin-transform-arrow-functions": "^7.0.0",
    "@babel/plugin-transform-shorthand-properties": "^7.0.0",
    "@babel/plugin-transform-template-literals": "^7.0.0",
    "@babel/preset-env": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@types/i18n-js": "3.8.2",
    "@types/jest": "^29.2.1",
    "@types/react": "~18.2.14",
    "@types/react-test-renderer": "^18.0.0",
    "@typescript-eslint/eslint-plugin": "^5.59.0",
    "@typescript-eslint/parser": "^5.59.0",
    "babel-jest": "^29.2.1",
    "eslint": "8.17.0",
    "eslint-config-prettier": "8.5.0",
    "eslint-config-standard": "17.0.0",
    "eslint-plugin-import": "2.26.0",
    "eslint-plugin-n": "^15.0.0",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "6.0.0",
    "eslint-plugin-react": "7.30.0",
    "eslint-plugin-react-native": "4.0.0",
    "eslint-plugin-reactotron": "^0.1.1",
    "jest": "^29.2.1",
    "jest-expo": "49.0.0",
    "patch-package": "6.4.7",
    "postinstall-prepare": "1.0.1",
    "prettier": "2.8.8",
    "react-test-renderer": "18.2.0",
    "reactotron-core-client": "2.8.11",
    "reactotron-mst": "3.1.5",
    "reactotron-react-js": "3.3.9",
    "reactotron-react-native": "5.0.4",
    "ts-jest": "^29.1.1",
    "ts-node": "^10.9.2",
    "typescript": "5.3.2"
  },
  "expo": {
    "install": {
      "exclude": [
        "typescript"
      ]
    }
  },
  "engines": {
    "node": ">=16"
  },
  "prettier": {
    "printWidth": 100,
    "semi": false,
    "singleQuote": false,
    "trailingComma": "all"
  },
  "eslintConfig": {
    "root": true,
    "parser": "@typescript-eslint/parser",
    "extends": [
      "plugin:@typescript-eslint/recommended",
      "plugin:react/recommended",
      "plugin:react-native/all",
      "standard",
      "prettier"
    ],
    "plugins": [
      "@typescript-eslint",
      "react",
      "react-native",
      "reactotron"
    ],
    "parserOptions": {
      "ecmaFeatures": {
        "jsx": true
      }
    },
    "settings": {
      "react": {
        "pragma": "React",
        "version": "detect"
      }
    },
    "globals": {
      "__DEV__": false,
      "jasmine": false,
      "beforeAll": false,
      "afterAll": false,
      "beforeEach": false,
      "afterEach": false,
      "test": false,
      "expect": false,
      "describe": false,
      "jest": false,
      "it": false
    },
    "rules": {
      "@typescript-eslint/ban-ts-ignore": 0,
      "@typescript-eslint/ban-ts-comment": 0,
      "@typescript-eslint/explicit-function-return-type": 0,
      "@typescript-eslint/explicit-member-accessibility": 0,
      "@typescript-eslint/explicit-module-boundary-types": 0,
      "@typescript-eslint/indent": 0,
      "@typescript-eslint/member-delimiter-style": 0,
      "@typescript-eslint/no-empty-interface": 0,
      "@typescript-eslint/no-explicit-any": 0,
      "@typescript-eslint/no-object-literal-type-assertion": 0,
      "@typescript-eslint/n
[truncated — 576 more characters]
```

### App.tsx

```typescript
import App from "./app/app"
import React from "react"
import * as SplashScreen from "expo-splash-screen"

SplashScreen.preventAutoHideAsync()

function IgniteApp() {
  return <App hideSplashScreen={SplashScreen.hideAsync} />
}

export default IgniteApp

```

### app/app.tsx

```typescript
/* eslint-disable import/first */
/**
 * Welcome to the main entry point of the app. In this file, we'll
 * be kicking off our app.
 *
 * Most of this file is boilerplate and you shouldn't need to modify
 * it very often. But take some time to look through and understand
 * what is going on here.
 *
 * The app navigation resides in ./app/navigators, so head over there
 * if you're interested in adding screens and navigators.
 */
if (__DEV__) {
  // Load Reactotron configuration in development. We don't want to
  // include this in our production bundle, so we are using `if (__DEV__)`
  // to only execute this in development.
  require("./devtools/ReactotronConfig.ts")
}
import "./i18n"
import "./utils/ignoreWarnings"
import { useFonts } from "expo-font"
import React from "react"
import { initialWindowMetrics, SafeAreaProvider } from "react-native-safe-area-context"
import * as Linking from "expo-linking"
import { useInitialRootStore } from "./models"
import { AppNavigator, useNavigationPersistence } from "./navigators"
import { ErrorBoundary } from "./screens/ErrorScreen/ErrorBoundary"
import * as storage from "./utils/storage"
import { customFontsToLoad } from "./theme"
import Config from "./config"
import { GestureHandlerRootView } from "react-native-gesture-handler"
import { ViewStyle } from "react-native"

export const NAVIGATION_PERSISTENCE_KEY = "NAVIGATION_STATE"

// Web linking configuration
const prefix = Linking.createURL("/")
const config = {
  screens: {
    Login: {
      path: "",
    },
    Welcome: "welcome",
    Demo: {
      screens: {
        DemoShowroom: {
          path: "showroom/:queryIndex?/:itemIndex?",
        },
        DemoDebug: "debug",
        DemoPodcastList: "podcast",
        DemoCommunity: "community",
      },
    },
  },
}

interface AppProps {
  hideSplashScreen: () => Promise<boolean>
}

/**
 * This is the root component of our app.
 */
function App(props: AppProps) {
  const { hideSplashScreen } = props
  const {
    initialNavigationState,
    onNavigationStateChange,
    isRestored: isNavigationStateRestored,
  } = useNavigationPersistence(storage, NAVIGATION_PERSISTENCE_KEY)

  const [areFontsLoaded] = useFonts(customFontsToLoad)

  const { rehydrated } = useInitialRootStore(() => {
    // This runs after the root store has been initialized and rehydrated.

    // If your initialization scripts run very fast, it's good to show the splash screen for just a bit longer to prevent flicker.
    // Slightly delaying splash screen hiding for better UX; can be customized or removed as needed,
    // Note: (vanilla Android) The splash-screen will not appear if you launch your app via the terminal or Android Studio. Kill the app and launch it normally by tapping on the launcher icon. https://stackoverflow.com/a/69831106
    // Note: (vanilla iOS) You might notice the splash-screen logo change size. This happens in debug/development mode. Try building the app for release.
    setTimeout(hideSplashScreen, 500)
  })

  // Before we show the app, we have to wait for our state to be ready.
  // In the meantime, don't render anything. This will be the background
  // color set in native by rootView's background color.
  // In iOS: application:didFinishLaunchingWithOptions:
  // In Android: https://stackoverflow.com/a/45838109/204044
  // You can replace with your own loading component if you wish.
  if (!rehydrated || !isNavigationStateRestored || !areFontsLoaded) return null

  const linking = {
    prefixes: [prefix],
    config,
  }

  // otherwise, we're ready to render the app
  return (
    <SafeAreaProvider initialMetrics={initialWindowMetrics}>
      <ErrorBoundary catchErrors={Config.catchErrors}>
        <GestureHandlerRootView style={$container}>
          <AppNavigator
            linking={linking}
            initialState={initialNavigationState}
            onStateChange={onNavigationStateChange}
          />
        </GestureHandlerRootView>
      </ErrorBoundary>
    </SafeAreaProvider>
  )
}

export default App

const $container: ViewStyle = {
  flex: 1,
}

```

### app/i18n/index.ts

```typescript
import "./i18n"
export * from "./i18n"
export * from "./translate"

```

### app/theme/index.ts

```typescript
export * from "./colors"
export * from "./spacing"
export * from "./typography"
export * from "./timing"

```

### app/navigators/index.ts

```typescript
export * from "./AppNavigator"
export * from "./navigationUtilities"
// export other navigators from here
export * from "./InsideNavigator"

```

### app/models/index.ts

```typescript
export * from "./RootStore"
export * from "./helpers/getRootStore"
export * from "./helpers/useStores"
export * from "./helpers/setupRootStore"

```

### app/screens/index.ts

```typescript
export * from "./WelcomeScreen"
export * from "./HomeScreen"

export * from "./LoginScreen"
export * from "./DemoCommunityScreen"
export * from "./DemoDebugScreen"
export * from "./DemoShowroomScreen/DemoShowroomScreen"

export * from "./ErrorScreen/ErrorBoundary"
// export other screens here

```

### app/components/index.ts

```typescript
export * from "./AutoImage"
export * from "./Button"
export * from "./Card"
export * from "./Header"
export * from "./Icon"
export * from "./ListItem"
export * from "./ListView"
export * from "./Screen"
export * from "./Text"
export * from "./TextField"
export * from "./Toggle"
export * from "./EmptyState"

export { default as CardItem } from "./CardItem"
export { default as City } from "./City"
export { default as Filters } from "./Filters"
export { default as IconTinder } from "./IconTinder"
export { default as Message } from "./Message"
export { default as ProfileItem } from "./ProfileItem"

```

### app/config/index.ts

```typescript
/**
 * This file imports configuration objects from either the config.dev.js file
 * or the config.prod.js file depending on whether we are in __DEV__ or not.
 *
 * Note that we do not gitignore these files. Unlike on web servers, just because
 * these are not checked into your repo doesn't mean that they are secure.
 * In fact, you're shipping a JavaScript bundle with every
 * config variable in plain text. Anyone who downloads your app can easily
 * extract them.
 *
 * If you doubt this, just bundle your app, and then go look at the bundle and
 * search it for one of your config variable values. You'll find it there.
 *
 * Read more here: https://reactnative.dev/docs/security#storing-sensitive-info
 */
import BaseConfig from "./config.base"
import ProdConfig from "./config.prod"
import DevConfig from "./config.dev"

let ExtraConfig = ProdConfig

if (__DEV__) {
  ExtraConfig = DevConfig
}

const Config = { ...BaseConfig, ...ExtraConfig }

export default Config

```

[110 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]