import { Picker } from '@react-native-picker/picker'; import * as WebBrowser from 'expo-web-browser'; import React from 'react'; import { Alert, Platform, ScrollView, StyleSheet, Text, View } from 'react-native'; import OpenAuthSessionAsyncDemo from './OpenAuthSessionAsyncDemo'; import OpenBrowserAsyncDemo from './OpenBrowserAsyncDemo'; import Button from '../../components/Button'; const url = 'https://expo.dev'; interface Package { label: string; value: string; } interface State { packages?: Package[]; selectedPackage?: string; lastWarmedPackage?: string; } // See: https://github.com/expo/expo/pull/10229#discussion_r490961694 // eslint-disable-next-line @typescript-eslint/ban-types export default class WebBrowserScreen extends React.Component<{}, State> { static navigationOptions = { title: 'WebBrowser', }; readonly state: State = {}; componentDidMount() { if (Platform.OS === 'android') { WebBrowser.getCustomTabsSupportingBrowsersAsync() .then(({ browserPackages }) => browserPackages.map((name) => ({ label: name, value: name })) ) .then((packages) => this.setState({ packages })); } } componentWillUnmount() { if (Platform.OS === 'android') { WebBrowser.coolDownAsync(this.state.lastWarmedPackage); } } showPackagesAlert = async () => { const result = await WebBrowser.getCustomTabsSupportingBrowsersAsync(); Alert.alert('Result', JSON.stringify(result, null, 2)); }; handleWarmUpClicked = async () => { const { selectedPackage: lastWarmedPackage } = this.state; this.setState({ lastWarmedPackage, }); const result = await WebBrowser.warmUpAsync(lastWarmedPackage); Alert.alert('Result', JSON.stringify(result, null, 2)); }; handleMayInitWithUrlClicked = async () => { const { selectedPackage: lastWarmedPackage } = this.state; this.setState({ lastWarmedPackage, }); const result = await WebBrowser.mayInitWithUrlAsync(url, lastWarmedPackage); Alert.alert('Result', JSON.stringify(result, null, 2)); }; handleCoolDownClicked = async () => { const result = await WebBrowser.coolDownAsync(this.state.selectedPackage); Alert.alert('Result', JSON.stringify(result, null, 2)); }; packageSelected = (value: string | number) => { if (typeof value === 'string') { this.setState({ selectedPackage: value }); } }; renderAndroidChoices = () => Platform.OS === 'android' && ( <> Force package: {this.state.packages && [{ label: '(none)', value: '' }, ...this.state.packages].map(({ value, label }) => ( ))} ); renderAndroidButtons = () => Platform.OS === 'android' && ( <>