### Install Expo SDK Packages via npx expo install
Source: https://docs.expo.dev/versions/v53.0.0/index
Command to install Expo SDK packages using the npx expo install command. This ensures compatible versions are installed and handles dependency resolution automatically. The example shows installing three common packages: expo-camera, expo-contacts, and expo-sensors.
```bash
npx expo install expo-camera expo-contacts expo-sensors
```
--------------------------------
### Install expo-document-picker
Source: https://docs.expo.dev/versions/v53.0.0/sdk/document-picker
Command to install the expo-document-picker library using npx. This command ensures you get the correct version for your Expo project.
```bash
npx expo install expo-document-picker
```
--------------------------------
### Install expo-store-review
Source: https://docs.expo.dev/versions/v53.0.0/sdk/storereview
Install the expo-store-review library using npx. Ensure 'expo' is installed if integrating into an existing React Native project.
```bash
npx expo install expo-store-review
```
--------------------------------
### Install react-native-reanimated using npx expo
Source: https://docs.expo.dev/versions/v53.0.0/sdk/reanimated
Installs the react-native-reanimated library using Expo's package manager. This command ensures compatibility with the current Expo SDK version. The Reanimated Babel plugin is automatically configured via babel-preset-expo, requiring no manual setup.
```bash
npx expo install react-native-reanimated
```
--------------------------------
### Install Expo MediaLibrary
Source: https://docs.expo.dev/versions/v53.0.0/sdk/media-library
Installs the expo-media-library package using the Expo CLI. Ensure 'expo' is installed if using in an existing React Native project.
```bash
npx expo install expo-media-library
```
--------------------------------
### Install expo-live-photo
Source: https://docs.expo.dev/versions/v53.0.0/sdk/live-photo
Installs the expo-live-photo library using npx. If integrating into an existing React Native app, ensure 'expo' is also installed.
```bash
npx expo install expo-live-photo
```
--------------------------------
### Install expo-local-authentication
Source: https://docs.expo.dev/versions/v53.0.0/sdk/local-authentication
Install the expo-local-authentication library using the Expo CLI. Ensure you have Expo installed in your project if it's a React Native app.
```bash
npx expo install expo-local-authentication
```
--------------------------------
### Install expo-localization (Shell)
Source: https://docs.expo.dev/versions/v53.0.0/sdk/localization
Installs the expo-localization package using the Expo CLI. Requires Node.js and npm/yarn. No runtime inputs; outputs the package in your project.
```bash
npx expo install expo-localization
```
--------------------------------
### Install react-native-webview
Source: https://docs.expo.dev/versions/v53.0.0/sdk/webview
Command to install the react-native-webview library using npm. Ensure you have Expo installed in your project if integrating into an existing React Native app.
```bash
npx expo install react-native-webview
```
--------------------------------
### Install react-native-safe-area-context
Source: https://docs.expo.dev/versions/v53.0.0/sdk/safe-area-context
Command to install the react-native-safe-area-context library using npx. Ensure expo is installed for existing React Native projects.
```bash
npx expo install react-native-safe-area-context
```
--------------------------------
### Install react-native-svg with npm
Source: https://docs.expo.dev/versions/v53.0.0/sdk/svg
This snippet demonstrates how to install the react-native-svg library using npm. It indicates that if you are installing to an existing React Native app, remember to install expo as well followed by the instructions from the library's README. It handles interactive components and animations.
```bash
npx expo install react-native-svg
```
--------------------------------
### Install expo-intent-launcher
Source: https://docs.expo.dev/versions/v53.0.0/sdk/intent-launcher
Install the `expo-intent-launcher` library using npm or yarn. Ensure `expo` is installed if integrating into an existing React Native project.
```bash
npx expo install expo-intent-launcher
```
--------------------------------
### Install Expo AV with npm
Source: https://docs.expo.dev/versions/v53.0.0/sdk/av
Command to install expo-av using npm. Requires expo to be installed in the project for existing React Native apps.
```bash
npx expo install expo-av
```
--------------------------------
### Install Expo Camera Component
Source: https://docs.expo.dev/versions/v53.0.0/sdk/camera
Command to install the `expo-camera` library into your Expo project. Ensure `expo` is installed if integrating into an existing React Native app.
```bash
npx expo install expo-camera
```
--------------------------------
### Install Expo Crypto
Source: https://docs.expo.dev/versions/v53.0.0/sdk/crypto
Installs the expo-crypto library using the Expo CLI. Ensure you have 'expo' installed if integrating into an existing React Native project.
```bash
npx expo install expo-crypto
```
--------------------------------
### Recording Audio in React Native with Expo AV
Source: https://docs.expo.dev/versions/v53.0.0/sdk/audio-av
This example shows starting and stopping audio recording using Audio.Recording from expo-av, including permission checks and audio mode setup. Dependencies: expo-av installation; requires microphone permissions. Inputs: Recording preset like HIGH_QUALITY; outputs a URI to the recorded file. Limitations: iOS requires explicit audio mode for silent mode playback; errors handled for permission failures.
```javascript
import { useState } from 'react';
import { View, StyleSheet, Button } from 'react-native';
import { Audio } from 'expo-av';
export default function App() {
const [recording, setRecording] = useState();
const [permissionResponse, requestPermission] = Audio.usePermissions();
async function startRecording() {
try {
if (permissionResponse.status !== 'granted') {
console.log('Requesting permission..');
await requestPermission();
}
await Audio.setAudioModeAsync({
allowsRecordingIOS: true,
playsInSilentModeIOS: true,
});
console.log('Starting recording..');
const { recording } = await Audio.Recording.createAsync(
Audio.RecordingOptionsPresets.HIGH_QUALITY
);
setRecording(recording);
console.log('Recording started');
} catch (err) {
console.error('Failed to start recording', err);
}
}
async function stopRecording() {
console.log('Stopping recording..');
setRecording(undefined);
await recording.stopAndUnloadAsync();
await Audio.setAudioModeAsync(
{
allowsRecordingIOS: false,
}
);
const uri = recording.getURI();
console.log('Recording stopped and stored at', uri);
}
return (
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
backgroundColor: '#ecf0f1',
padding: 10,
},
});
```
--------------------------------
### Install Expo SDK 53
Source: https://docs.expo.dev/versions/v53.0.0/sdk/expo
Command-line installation procedure for Expo SDK 53 using npm. Sets up the core Expo package and dependencies required for cross-platform development. Should be run in a React Native or Expo project directory.
```bash
npx expo install expo
```
--------------------------------
### Create and Start Audio Recording in Expo AV
Source: https://docs.expo.dev/versions/v53.0.0/sdk/audio-av
Instantiates the Audio.Recording class, prepares it with options like HIGH_QUALITY preset, and starts recording asynchronously. Only one recorder can be active at a time; requires prior permission request and is experimental on web. Dependencies: expo-av; inputs: RecordingOptions; outputs: prepared recording instance; limitations: not supported in iOS Simulator, stops with stopAndUnloadAsync.
```javascript
const recording = new Audio.Recording();
try {
await recording.prepareToRecordAsync(Audio.RecordingOptionsPresets.HIGH_QUALITY);
await recording.startAsync();
// You are now recording!
} catch (error) {
// An error occurred!
}
```
--------------------------------
### Create Recording Async (JavaScript - Example)
Source: https://docs.expo.dev/versions/v53.0.0/sdk/audio-av
Demonstrates creating a recording with high-quality options and handling potential errors. The function returns a completed recording object.
```javascript
try {
const { recording: recordingObject, status } = await Audio.Recording.createAsync(
Audio.RecordingOptionsPresets.HIGH_QUALITY
);
// You are now recording!
} catch (error) {
// An error occurred!
}
```
--------------------------------
### Install react-native-maps with Expo
Source: https://docs.expo.dev/versions/v53.0.0/sdk/map-view
Install the react-native-maps library in an Expo project. This command ensures compatibility with the current Expo SDK version.
```Terminal
npx expo install react-native-maps
```
--------------------------------
### Install lottie-react-native with Expo CLI
Source: https://docs.expo.dev/versions/v53.0.0/sdk/lottie
This command installs the lottie-react-native library into your Expo project using the Expo CLI. Ensure you have Expo installed if you are integrating into an existing React Native project.
```bash
npx expo install lottie-react-native
```
--------------------------------
### Basic Contacts Retrieval in React Native
Source: https://docs.expo.dev/versions/v53.0.0/sdk/contacts
Demonstrates requesting permissions and fetching contacts using expo-contacts in a React Native app. Depends on expo-contacts installed and React Native setup. Takes no inputs but outputs contact data via console; limited to granted permissions and specified fields. Supports email fields in this example; can be extended for other data.
```javascript
import { useEffect } from 'react';
import { StyleSheet, View, Text } from 'react-native';
import * as Contacts from 'expo-contacts';
export default function App() {
useEffect(() => {
(async () => {
const { status } = await Contacts.requestPermissionsAsync();
if (status === 'granted') {
const { data } = await Contacts.getContactsAsync({
fields: [Contacts.Fields.Emails],
});
if (data.length > 0) {
const contact = data[0];
console.log(contact);
}
}
})();
}, []);
return (
Contacts Module Example
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});
```
--------------------------------
### Get Installation Time in Expo Application
Source: https://docs.expo.dev/versions/v53.0.0/sdk/application
Fetch the app's installation time asynchronously with getInstallationTimeAsync. It uses platform-specific methods and returns a Date object. No inputs, but returns null on web.
```javascript
await Application.getInstallationTimeAsync();
// 2019-07-18T18:08:26.121Z
```
--------------------------------
### Get Install Referrer in Expo Application
Source: https://docs.expo.dev/versions/v53.0.0/sdk/application
Obtain the install referrer URL asynchronously with getInstallReferrerAsync. Works only on Android via Google Play Store API. Returns a string, or may be empty if not available.
```javascript
await Application.getInstallReferrerAsync();
// "utm_source=google-play&utm_medium=organic"
```
--------------------------------
### Start Audio Recording
Source: https://docs.expo.dev/versions/v53.0.0/sdk/audio-av
Initiates the audio recording process. This method can only be called after `prepareToRecordAsync()` has been successfully invoked. It returns a Promise that resolves with the RecordingStatus upon starting.
```javascript
await recording.startAsync();
// Recording has started.
```
--------------------------------
### Basic MapView Usage in React Native
Source: https://docs.expo.dev/versions/v53.0.0/sdk/map-view
Example of rendering a basic MapView component in a React Native application. The MapView is styled to fill its container.
```JavaScript
import React from 'react';
import MapView from 'react-native-maps';
import { StyleSheet, View } from 'react-native';
export default function App() {
return (
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
map: {
width: '100%',
height: '100%',
},
});
```
--------------------------------
### Get Event
Source: https://docs.expo.dev/versions/v53.0.0/sdk/calendar
Returns a specific event selected by ID. If a specific instance of a recurring event is desired, the start date of this instance must also be provided.
```APIDOC
## `Calendar.getEventAsync(id, recurringEventOptions)`
### Description
Returns a specific event selected by ID. If a specific instance of a recurring event is desired, the start date of this instance must also be provided, as instances of recurring events do not have their own unique and stable IDs on either iOS or Android.
### Method
GET
### Endpoint
`/getEventAsync`
### Parameters
#### Path Parameters
None
#### Query Parameters
None
#### Request Body
- **id** (string) - Required - ID of the event to return.
- **recurringEventOptions** (RecurringEventOptions) - Optional - A map of options for recurring events. Default: `{}`
### Request Example
```json
{
"id": "some-event-id",
"recurringEventOptions": {
"startDate": "2023-10-27T10:00:00.000Z"
}
}
```
### Response
#### Success Response (200)
- **event** (Event) - An Event object matching the provided criteria, if one exists.
#### Response Example
```json
{
"id": "event-123",
"title": "Meeting",
"startDate": "2023-10-27T10:00:00.000Z",
"endDate": "2023-10-27T11:00:00.000Z"
}
```
```
--------------------------------
### Basic Expo Image Usage with Placeholder and Transition
Source: https://docs.expo.dev/versions/v53.0.0/sdk/image
Example demonstrating how to use the `Image` component from `expo-image`. It includes setting the image source, applying a blurhash placeholder, defining content fit, and a transition effect for source changes.
```javascript
import { Image } from 'expo-image';
import { StyleSheet, View } from 'react-native';
const blurhash =
'|rF?hV%2WCj[ayj[a|j[az_NaeWBj@ayfRayfQfQM{M|azj[azf6fQfQfQIpWXofj[ayj[j[fQayWCoeoeaya}j[ayfQa{oLj?j[WVj[ayayj[fQoff7azayj[ayj[j[ayofayayayj[fQj[ayayj[ayfjj[j[ayjuayj[';
export default function App() {
return (
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
image: {
flex: 1,
width: '100%',
backgroundColor: '#0553',
},
});
```
--------------------------------
### Get Current Pathname with usePathname (TypeScript)
Source: https://docs.expo.dev/versions/v53.0.0/sdk/router
Returns the current route location as a string, excluding any search parameters. Segments are normalized. For example, `/[id]?id=normal` becomes `/normal`. Dependencies: `expo-router`.
```typescript
import { Text } from 'react-native';
import { usePathname } from 'expo-router';
export default function Route() {
// pathname = "/profile/baconbrix"
const pathname = usePathname();
return User: {user};
}
```
--------------------------------
### Installation
Source: https://docs.expo.dev/versions/v53.0.0/sdk/sharing
Install the expo-sharing library in your Expo or React Native project using npm or Expo CLI.
```APIDOC
## Installation
### Description
Install the expo-sharing library using Expo CLI.
### Installation Command
```bash
npx expo install expo-sharing
```
### Additional Requirements
If you are installing this in an existing React Native app, make sure to install `expo` in your project.
```
--------------------------------
### Basic Link Usage in React Native
Source: https://docs.expo.dev/versions/v53.0.0/sdk/router
This example shows a simple implementation of the Link component from 'expo-router' to navigate to an 'about' route. It renders a View containing a Link component. This requires 'expo-router' to be installed.
```javascript
import { Link } from 'expo-router';
import { View } from 'react-native';
export default function Route() {
return (
About
);
}
```
--------------------------------
### Get Registered Tasks Async Example
Source: https://docs.expo.dev/versions/v53.0.0/sdk/task-manager
This JavaScript example shows how to retrieve a list of all tasks currently registered within the Expo TaskManager. It utilizes the `getRegisteredTasksAsync` method, which returns a promise that resolves to an array of task objects. Each task object contains details like `taskName`, `taskType`, and associated `options`. This is useful for inspecting the current state of background tasks in the application.
```javascript
[
{
taskName: 'location-updates-task-name',
taskType: 'location',
options: {
accuracy: Location.Accuracy.High,
showsBackgroundLocationIndicator: false,
},
},
{
taskName: 'geofencing-task-name',
taskType: 'geofencing',
options: {
regions: [...],
},
},
]
```
--------------------------------
### Install Expo Canary Pre-release Versions
Source: https://docs.expo.dev/versions/v53.0.0/index
Command to install the latest canary release of Expo SDK packages. Canary versions include development snapshots with date and commit hash. The command installs the canary version and fixes dependencies. These pre-release versions are unstable and should only be used by developers comfortable with potential bugs.
```bash
npm install expo@canary && npx expo install --fix
```
--------------------------------
### Create New React Native App with Expo Support
Source: https://docs.expo.dev/versions/v53.0.0/index
Terminal command to create a new React Native application with Expo SDK support using create-expo-app. The bare-minimum template creates a project with basic Expo configuration. This is the recommended way to start new projects that will use Expo SDK packages.
```bash
npx create-expo-app my-app --template bare-minimum
```
--------------------------------
### Basic Barometer Usage in React Native
Source: https://docs.expo.dev/versions/v53.0.0/sdk/barometer
Demonstrates how to use the Barometer from expo-sensors to get pressure and relative altitude. It includes functionality to start and stop listening for sensor updates and handles platform-specific availability.
```javascript
import { useState } from 'react';
import { StyleSheet, Text, TouchableOpacity, View, Platform } from 'react-native';
import { Barometer } from 'expo-sensors';
export default function App() {
const [{ pressure, relativeAltitude }, setData] = useState({ pressure: 0, relativeAltitude: 0 });
const [subscription, setSubscription] = useState(null);
const toggleListener = () => {
subscription ? unsubscribe() : subscribe();
};
const subscribe = () => {
setSubscription(Barometer.addListener(setData));
};
const unsubscribe = () => {
subscription && subscription.remove();
setSubscription(null);
};
return (
Barometer: Listener {subscription ? 'ACTIVE' : 'INACTIVE'}Pressure: {pressure} hPa
Relative Altitude:{' '}
{Platform.OS === 'ios' ? `${relativeAltitude} m` : `Only available on iOS`}
Toggle listener
);
}
const styles = StyleSheet.create({
button: {
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#eee',
padding: 10,
marginTop: 15,
},
wrapper: {
flex: 1,
alignItems: 'stretch',
justifyContent: 'center',
paddingHorizontal: 20,
},
});
```
--------------------------------
### App URL Schemes
Source: https://docs.expo.dev/versions/v53.0.0/config/app
Defines URL schemes that can be used to link into the application. For example, setting the scheme to 'demo' allows 'demo://' URLs to open the app. This is a build-time configuration and does not affect Expo Go. The scheme must start with a lowercase letter.
```json
{
"scheme": "demo"
}
```
```json
{
"scheme": ["myapp", "staging.myapp"]
}
```
--------------------------------
### Install expo-dev-client
Source: https://docs.expo.dev/versions/v53.0.0/sdk/dev-client
Command to install the expo-dev-client package using npx. This is the primary method for adding the development client to an Expo project.
```bash
npx expo install expo-dev-client
```
--------------------------------
### Install expo-navigation-bar
Source: https://docs.expo.dev/versions/v53.0.0/sdk/navigation-bar
Installs the expo-navigation-bar package using the expo install command. Ensure 'expo' is installed if integrating into an existing React Native project.
```bash
npx expo install expo-navigation-bar
```
--------------------------------
### Install expo-asset package
Source: https://docs.expo.dev/versions/v53.0.0/sdk/asset
Installs the expo-asset package using npx expo install. Required for both new Expo projects and existing React Native apps. When installing in existing React Native apps, ensure expo package is also installed.
```terminal
npx expo install expo-asset
```
--------------------------------
### Usage Example: Live Photo Picker and Viewer
Source: https://docs.expo.dev/versions/v53.0.0/sdk/live-photo
Demonstrates how to use expo-live-photo with expo-image-picker to select and display Live Photos. It includes functionality to pick photos, display them using LivePhotoView, and control playback. The component checks for platform availability.
```javascript
import * as ImagePicker from 'expo-image-picker';
import { LivePhotoAsset, LivePhotoView, LivePhotoViewType } from 'expo-live-photo';
import { useRef, useState } from 'react';
import { View, StyleSheet, Text, Button } from 'react-native';
export default function LivePhotoScreen() {
const viewRef = useRef(null);
const [livePhoto, setLivePhoto] = useState(null);
const pickImage = async () => {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['livePhotos'],
});
if (!result.canceled && result.assets[0].pairedVideoAsset?.uri) {
setLivePhoto({
photoUri: result.assets[0].uri,
pairedVideoUri: result.assets[0].pairedVideoAsset.uri,
});
} else {
console.error('Failed to pick a live photo');
}
};
if (!LivePhotoView.isAvailable()) {
return (
expo-live-photo is not available on this platform 😕
);
}
return (
{
console.log('Live photo loaded successfully!');
}}
onLoadError={error => {
console.error('Failed to load the live photo: ', error.message);
}}
/>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
paddingVertical: 20,
paddingHorizontal: 40,
},
livePhotoView: {
alignSelf: 'stretch',
height: 300,
},
pickImageExpanded: {
alignSelf: 'stretch',
height: 300,
justifyContent: 'center',
},
pickImageCollapsed: {
marginVertical: 10,
},
button: {
marginVertical: 10,
},
});
```
--------------------------------
### Import and Use Expo SDK Packages in JavaScript
Source: https://docs.expo.dev/versions/v53.0.0/index
JavaScript code showing how to import Expo SDK packages after installation. The example demonstrates importing CameraView from expo-camera, all contacts from expo-contacts, and Gyroscope from expo-sensors. These imports enable access to device camera, contact list, and motion sensor functionality.
```javascript
import { CameraView } from 'expo-camera';
import * as Contacts from 'expo-contacts';
import { Gyroscope } from 'expo-sensors';
```
--------------------------------
### Install react-native-view-shot in Expo project
Source: https://docs.expo.dev/versions/v53.0.0/sdk/captureRef
Installation command for adding react-native-view-shot to an Expo project. This command uses npx expo install to ensure compatibility with the current Expo SDK version. Requires expo to be installed in the project.
```bash
npx expo install react-native-view-shot
```
--------------------------------
### Migrating an Album Example
Source: https://docs.expo.dev/versions/v53.0.0/sdk/filesystem
This example demonstrates how to migrate an album from external storage to internal storage using Expo MediaLibrary and StorageAccessFramework.
```APIDOC
## Migrating an Album
### Description
This function demonstrates migrating an album from external storage to internal storage, creating new media library assets, and organizing them into a new album.
### Method
Asynchronous function
### Endpoint
N/A (Client-side function)
### Parameters
* **albumName** (string) - Required - The name of the album to migrate.
### Request Example
```javascript
import * as MediaLibrary from 'expo-media-library';
import * as FileSystem from 'expo-file-system';
const { StorageAccessFramework } = FileSystem;
async function migrateAlbum(albumName: string) {
// Gets SAF URI to the album
const albumUri = StorageAccessFramework.getUriForDirectoryInRoot(albumName);
// Requests permissions
const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(albumUri);
if (!permissions.granted) {
return;
}
const permittedUri = permissions.directoryUri;
// Checks if users selected the correct folder
if (!permittedUri.includes(albumName)) {
return;
}
const mediaLibraryPermissions = await MediaLibrary.requestPermissionsAsync();
if (!mediaLibraryPermissions.granted) {
return;
}
// Moves files from external storage to internal storage
await StorageAccessFramework.moveAsync({
from: permittedUri,
to: FileSystem.documentDirectory!,
});
const outputDir = FileSystem.documentDirectory! + albumName;
const migratedFiles = await FileSystem.readDirectoryAsync(outputDir);
// Creates assets from local files
const [newAlbumCreator, ...assets] = await Promise.all(
migratedFiles.map>(
async fileName => await MediaLibrary.createAssetAsync(outputDir + '/' + fileName)
)
);
// Album was empty
if (!newAlbumCreator) {
return;
}
// Creates a new album in the scoped directory
const newAlbum = await MediaLibrary.createAlbumAsync(albumName, newAlbumCreator, false);
if (assets.length) {
await MediaLibrary.addAssetsToAlbumAsync(assets, newAlbum, false);
}
}
```
### Response
This function does not return a value but performs actions on the file system and media library.
```
--------------------------------
### Configure expo-dev-client in app.json
Source: https://docs.expo.dev/versions/v53.0.0/sdk/dev-client
Example configuration for expo-dev-client within the app.json file using its config plugin. This allows setting properties like launchMode that require a new app binary.
```json
{
"expo": {
"plugins": [
[
"expo-dev-client",
{
"launchMode": "most-recent"
}
]
]
}
}
```
--------------------------------
### Import Expo AV Modules
Source: https://docs.expo.dev/versions/v53.0.0/sdk/av
Imports the Audio and Video components from the expo-av package for use in React Native applications. This is the entry point for accessing media playback functionality. Requires installation of expo-av; outputs references to Audio and Video for creating sound objects or video elements. No limitations beyond standard Expo setup.
```javascript
import { Audio, Video } from 'expo-av';
```
--------------------------------
### Install Expo ScreenOrientation
Source: https://docs.expo.dev/versions/v53.0.0/sdk/screen-orientation
Installs the expo-screen-orientation library using npm. Ensure you have Expo installed in your React Native project.
```bash
npx expo install expo-screen-orientation
```
--------------------------------
### Install expo-calendar CLI
Source: https://docs.expo.dev/versions/v53.0.0/sdk/calendar
Command to install the expo-calendar library using the Expo CLI. This is the standard way to add Expo modules to your project.
```bash
npx expo install expo-calendar
```