This is the boilerplate that 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!
This app uses Expo SDK 50, the React Native for TV repo, and the config plugin @react-native-tvos/config-tv
. With these changes, prebuild is able to configure the iOS and Android folders for Apple TV and Android TV builds.
To try TV builds:
- Clone this repo
- Then do
yarn
export EXPO_TV=1
npx expo prebuild --clean
yarn ios # Builds and runs the Ignite boilerplate on Apple TV
yarn android --device tv_api_31 # Builds and runs the Ignite boilerplate on the named Android TV emulator
To go back to phone builds:
unset EXPO_TV
npx expo prebuild --clean
yarn ios # Builds and runs the Ignite boilerplate on an iPhone simulator
yarn android --device pixel_6_api_31 # Builds and runs the Ignite boilerplate on the named Android phone emulator
You can initiate your own TV app by executing
npx ignite-cli@9.5.0 new IgniteTV --workflow=prebuild --yes
and then applying the changes in this repo.
The original demo code will work on TV, once the required dependencies and app.json
changes are applied. This repo includes additional commits to improve the appearance of the demo code on TV:
- Changes to highlight controls when focused by the TV focus engine
- Scaling of component sizes for TV
- Better TV layout
- Addition of a banner image for the Android TV app list
- Addition of Apple TV brand assets (icon and top shelf images)
- Focus guide to improve navigation in the login screen
- React Navigation 7.0.0 alpha, to allow the tab navigator to appear at the top of the screen for TV
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
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.
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.
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.
How to use your icon
or image
assets:
import { Image } from 'react-native';
const MyComponent = () => {
return (
<Image source={require('../assets/images/my_image.png')} />
);
};
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.
This directory will hold your Jest configs and mocks.
Follow our Maestro Setup recipe from the Ignite Cookbook!