mirror of
https://github.com/status-im/react-native-webview.git
synced 2025-02-24 01:38:45 +00:00
`onFileDownload` is called with the URL that you can use to download the file. When RNCWebView detects that the HTTP response should result in a file download, `onFileDownload` is called. The client can then provide code to download the file. RNCWebView determines that a file download should take place if either of the following is true: 1. The HTTP response contains a `Content-Disposition` header that is of type 'attachment' 2. The MIME type of the response cannot be rendered by the iOS WebView
203 lines
4.6 KiB
TypeScript
203 lines
4.6 KiB
TypeScript
import React, {Component} from 'react';
|
|
import {
|
|
StyleSheet,
|
|
SafeAreaView,
|
|
Text,
|
|
TouchableOpacity,
|
|
View,
|
|
Keyboard,
|
|
Button,
|
|
Platform,
|
|
} from 'react-native';
|
|
|
|
import Alerts from './examples/Alerts';
|
|
import Scrolling from './examples/Scrolling';
|
|
import Background from './examples/Background';
|
|
import Downloads from './examples/Downloads';
|
|
import Uploads from './examples/Uploads';
|
|
import Injection from './examples/Injection';
|
|
|
|
const TESTS = {
|
|
Alerts: {
|
|
title: 'Alerts',
|
|
testId: 'alerts',
|
|
description: 'Alerts tests',
|
|
render() {
|
|
return <Alerts />;
|
|
},
|
|
},
|
|
Scrolling: {
|
|
title: 'Scrolling',
|
|
testId: 'scrolling',
|
|
description: 'Scrolling event test',
|
|
render() {
|
|
return <Scrolling />;
|
|
},
|
|
},
|
|
Background: {
|
|
title: 'Background',
|
|
testId: 'background',
|
|
description: 'Background color test',
|
|
render() {
|
|
return <Background />;
|
|
},
|
|
},
|
|
Downloads: {
|
|
title: 'Downloads',
|
|
testId: 'downloads',
|
|
description: 'File downloads test',
|
|
render() {
|
|
return <Downloads />;
|
|
},
|
|
},
|
|
Uploads: {
|
|
title: 'Uploads',
|
|
testId: 'uploads',
|
|
description: 'Upload test',
|
|
render() {
|
|
return <Uploads />;
|
|
},
|
|
},
|
|
Injection: {
|
|
title: 'Injection',
|
|
testId: 'injection',
|
|
description: 'Injection test',
|
|
render() {
|
|
return <Injection />;
|
|
},
|
|
},
|
|
};
|
|
|
|
type Props = {};
|
|
type State = {restarting: boolean, currentTest: Object};
|
|
|
|
export default class App extends Component<Props, State> {
|
|
state = {
|
|
restarting: false,
|
|
currentTest: TESTS.Alerts,
|
|
};
|
|
|
|
_simulateRestart = () => {
|
|
this.setState({restarting: true}, () => this.setState({restarting: false}));
|
|
};
|
|
|
|
_changeTest = testName => {
|
|
this.setState({currentTest: TESTS[testName]});
|
|
};
|
|
|
|
render() {
|
|
const {restarting, currentTest} = this.state;
|
|
return (
|
|
<SafeAreaView style={styles.container}>
|
|
<TouchableOpacity
|
|
style={styles.closeKeyboardView}
|
|
onPress={() => Keyboard.dismiss()}
|
|
testID="closeKeyboard"
|
|
/>
|
|
|
|
<TouchableOpacity
|
|
testID="restart_button"
|
|
onPress={this._simulateRestart}
|
|
style={styles.restartButton}
|
|
activeOpacity={0.6}>
|
|
<Text>Simulate Restart</Text>
|
|
</TouchableOpacity>
|
|
|
|
<View style={styles.testPickerContainer}>
|
|
<Button
|
|
testID="testType_alerts"
|
|
title="Alerts"
|
|
onPress={() => this._changeTest('Alerts')}
|
|
/>
|
|
<Button
|
|
testID="testType_scrolling"
|
|
title="Scrolling"
|
|
onPress={() => this._changeTest('Scrolling')}
|
|
/>
|
|
<Button
|
|
testID="testType_background"
|
|
title="Background"
|
|
onPress={() => this._changeTest('Background')}
|
|
/>
|
|
<Button
|
|
testID="testType_injection"
|
|
title="Injection"
|
|
onPress={() => this._changeTest('Injection')}
|
|
/>
|
|
{Platform.OS == "ios" && <Button
|
|
testID="testType_downloads"
|
|
title="Downloads"
|
|
onPress={() => this._changeTest('Downloads')}
|
|
/>}
|
|
{Platform.OS === 'android' && <Button
|
|
testID="testType_uploads"
|
|
title="Uploads"
|
|
onPress={() => this._changeTest('Uploads')}
|
|
/>}
|
|
</View>
|
|
|
|
{restarting ? null : (
|
|
<View
|
|
testID={`example-${currentTest.testId}`}
|
|
key={currentTest.title}
|
|
style={styles.exampleContainer}>
|
|
<Text style={styles.exampleTitle}>{currentTest.title}</Text>
|
|
<Text style={styles.exampleDescription}>
|
|
{currentTest.description}
|
|
</Text>
|
|
<View style={styles.exampleInnerContainer}>
|
|
{currentTest.render()}
|
|
</View>
|
|
</View>
|
|
)}
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: '#F5FCFF',
|
|
padding: 8,
|
|
},
|
|
exampleContainer: {
|
|
padding: 16,
|
|
backgroundColor: '#FFF',
|
|
borderColor: '#EEE',
|
|
borderTopWidth: 1,
|
|
borderBottomWidth: 1,
|
|
flex: 1,
|
|
},
|
|
exampleTitle: {
|
|
fontSize: 18,
|
|
},
|
|
exampleDescription: {
|
|
color: '#333333',
|
|
marginBottom: 16,
|
|
},
|
|
exampleInnerContainer: {
|
|
borderColor: '#EEE',
|
|
borderTopWidth: 1,
|
|
paddingTop: 10,
|
|
flex: 1,
|
|
},
|
|
restartButton: {
|
|
padding: 6,
|
|
fontSize: 16,
|
|
borderRadius: 5,
|
|
backgroundColor: '#F3F3F3',
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
alignSelf: 'flex-end',
|
|
},
|
|
closeKeyboardView: {
|
|
width: 5,
|
|
height: 5,
|
|
},
|
|
testPickerContainer: {
|
|
flexDirection: 'row',
|
|
flexWrap: 'wrap',
|
|
},
|
|
});
|