/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from "react";
import {
StyleSheet,
Text,
TouchableOpacity,
View,
Clipboard,
Platform,
ScrollView
} from "react-native";
import { StackNavigator } from "react-navigation";
import FCM, { NotificationActionType } from "react-native-fcm";
import { registerKilledListener, registerAppListener } from "./Listeners";
import firebaseClient from "./FirebaseClient";
registerKilledListener();
class MainPage extends Component {
constructor(props) {
super(props);
this.state = {
token: "",
tokenCopyFeedback: ""
};
}
async componentDidMount() {
FCM.createNotificationChannel({
id: 'default',
name: 'Default',
description: 'used for example',
priority: 'high'
})
registerAppListener(this.props.navigation);
FCM.getInitialNotification().then(notif => {
this.setState({
initNotif: notif
});
if (notif && notif.targetScreen === "detail") {
setTimeout(() => {
this.props.navigation.navigate("Detail");
}, 500);
}
});
try {
let result = await FCM.requestPermissions({
badge: false,
sound: true,
alert: true
});
} catch (e) {
console.error(e);
}
FCM.getFCMToken().then(token => {
console.log("TOKEN (getFCMToken)", token);
this.setState({ token: token || "" });
});
if (Platform.OS === "ios") {
FCM.getAPNSToken().then(token => {
console.log("APNS TOKEN (getFCMToken)", token);
});
}
// topic example
// FCM.subscribeToTopic('sometopic')
// FCM.unsubscribeFromTopic('sometopic')
}
showLocalNotification() {
FCM.presentLocalNotification({
channel: 'default',
id: new Date().valueOf().toString(), // (optional for instant notification)
title: "Test Notification with action", // as FCM payload
body: "Force touch to reply", // as FCM payload (required)
sound: "bell.mp3", // "default" or filename
priority: "high", // as FCM payload
click_action: "com.myapp.MyCategory", // as FCM payload - this is used as category identifier on iOS.
badge: 10, // as FCM payload IOS only, set 0 to clear badges
number: 10, // Android only
ticker: "My Notification Ticker", // Android only
auto_cancel: true, // Android only (default true)
large_icon:
"https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg", // Android only
icon: "ic_launcher", // as FCM payload, you can relace this with custom icon you put in mipmap
big_text: "Show when notification is expanded", // Android only
sub_text: "This is a subText", // Android only
color: "red", // Android only
vibrate: 300, // Android only default: 300, no vibration if you pass 0
wake_screen: true, // Android only, wake up screen when notification arrives
group: "group", // Android only
picture:
"https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png", // Android only bigPicture style
ongoing: true, // Android only
my_custom_data: "my_custom_field_value", // extra data you want to throw
lights: true, // Android only, LED blinking (default false)
show_in_foreground: true // notification when app is in foreground (local & remote)
});
}
scheduleLocalNotification() {
FCM.scheduleLocalNotification({
id: "testnotif",
fire_date: new Date().getTime() + 5000,
vibrate: 500,
title: "Hello",
body: "Test Scheduled Notification",
sub_text: "sub text",
priority: "high",
large_icon:
"https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg",
show_in_foreground: true,
picture:
"https://firebase.google.com/_static/af7ae4b3fc/images/firebase/lockup.png",
wake_screen: true,
extra1: { a: 1 },
extra2: 1
});
}
sendRemoteNotification(token) {
let body;
if (Platform.OS === "android") {
body = {
to: token,
data: {
custom_notification: {
title: "Simple FCM Client",
body: "Click me to go to detail",
sound: "default",
priority: "high",
show_in_foreground: true,
targetScreen: "detail"
}
},
priority: 10
};
} else {
body = {
to: token,
notification: {
title: "Simple FCM Client",
body: "Click me to go to detail",
sound: "default"
},
data: {
targetScreen: "detail"
},
priority: 10
};
}
firebaseClient.send(JSON.stringify(body), "notification");
}
sendRemoteData(token) {
let body = {
to: token,
data: {
title: "Simple FCM Client",
body: "This is a notification with only DATA.",
sound: "default"
},
priority: "normal"
};
firebaseClient.send(JSON.stringify(body), "data");
}
showLocalNotificationWithAction() {
FCM.presentLocalNotification({
title: "Test Notification with action",
body: "Force touch to reply",
priority: "high",
show_in_foreground: true,
click_action: "com.myidentifi.fcm.text", // for ios
android_actions: JSON.stringify([
{
id: "view",
title: "view"
},
{
id: "dismiss",
title: "dismiss"
}
]) // for android, take syntax similar to ios's. only buttons are supported
});
}
render() {
let { token, tokenCopyFeedback } = this.state;
return (
Welcome to Simple Fcm Client!
{this.state.tokenCopyFeedback}
Remote notif won't be available to iOS emulators
this.sendRemoteNotification(token)}
style={styles.button}
>
Send Remote Notification
this.sendRemoteData(token)}
style={styles.button}
>
Send Remote Data
this.showLocalNotification()}
style={styles.button}
>
Show Local Notification
this.showLocalNotificationWithAction(token)}
style={styles.button}
>
Show Local Notification with Action
this.scheduleLocalNotification()}
style={styles.button}
>
Schedule Notification in 5s
Init notif:
{JSON.stringify(this.state.initNotif)}
Token:
this.setClipboardContent(this.state.token)}
>
{this.state.token}
);
}
setClipboardContent(text) {
Clipboard.setString(text);
this.setState({ tokenCopyFeedback: "Token copied to clipboard." });
setTimeout(() => {
this.clearTokenCopyFeedback();
}, 2000);
}
clearTokenCopyFeedback() {
this.setState({ tokenCopyFeedback: "" });
}
}
class DetailPage extends Component {
render() {
return (
Detail page
);
}
}
export default StackNavigator(
{
Main: {
screen: MainPage
},
Detail: {
screen: DetailPage
}
},
{
initialRouteName: "Main"
}
);
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "#F5FCFF"
},
welcome: {
fontSize: 20,
textAlign: "center",
margin: 10
},
instructions: {
textAlign: "center",
color: "#333333",
marginBottom: 2
},
feedback: {
textAlign: "center",
color: "#996633",
marginBottom: 3
},
button: {
backgroundColor: "teal",
paddingHorizontal: 20,
paddingVertical: 15,
marginVertical: 10,
borderRadius: 10
},
buttonText: {
color: "white",
backgroundColor: "transparent"
}
});