App.js 5.83 KB
Newer Older
renato's avatar
renato committed
1 2 3 4 5 6 7 8 9 10 11
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  TouchableOpacity,
12
  View,
Libin Lu's avatar
Libin Lu committed
13 14
  Clipboard,
  Platform
renato's avatar
renato committed
15 16
} from 'react-native';

Libin Lu's avatar
Libin Lu committed
17 18
import FCM from "react-native-fcm";

renato's avatar
renato committed
19 20 21 22
import PushController from "./PushController";
import firebaseClient from  "./FirebaseClient";

export default class App extends Component {
23 24 25 26
  constructor(props) {
    super(props);

    this.state = {
27 28
      token: "",
      tokenCopyFeedback: ""
29 30 31
    }
  }

Libin Lu's avatar
Libin Lu committed
32 33 34 35 36 37 38 39
  componentDidMount(){
    FCM.getInitialNotification().then(notif => {
      this.setState({
        initNotif: notif
      })
    });
  }

Libin Lu's avatar
Libin Lu committed
40 41
  showLocalNotification() {
    FCM.presentLocalNotification({
Libin Lu's avatar
Libin Lu committed
42
      vibrate: 500,
Libin Lu's avatar
Libin Lu committed
43 44
      title: 'Hello',
      body: 'Test Notification',
Libin Lu's avatar
Libin Lu committed
45
      big_text: 'i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large',
Libin Lu's avatar
Libin Lu committed
46
      priority: "high",
Libin Lu's avatar
Libin Lu committed
47
      sound: "bell.mp3",
Libin Lu's avatar
Libin Lu committed
48
      large_icon: "https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg",
Libin Lu's avatar
Libin Lu committed
49 50
      show_in_foreground: true,
      number: 10
Libin Lu's avatar
Libin Lu committed
51 52 53
    });
  }

Libin Lu's avatar
Libin Lu committed
54 55 56 57 58 59 60
  scheduleLocalNotification() {
    FCM.scheduleLocalNotification({
      id: 'testnotif',
      fire_date: new Date().getTime()+5000,
      vibrate: 500,
      title: 'Hello',
      body: 'Test Scheduled Notification',
Libin Lu's avatar
Libin Lu committed
61
      sub_text: 'sub text',
Libin Lu's avatar
Libin Lu committed
62
      priority: "high",
Libin Lu's avatar
Libin Lu committed
63
      large_icon: "https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg",
Libin Lu's avatar
Libin Lu committed
64 65 66 67 68
      show_in_foreground: true,
      picture: 'https://firebase.google.com/_static/af7ae4b3fc/images/firebase/lockup.png'
    });
  }

Libin Lu's avatar
Libin Lu committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
  sendRemoteNotification(token) {
    let body;

    if(Platform.OS === 'android'){
      body = {
        "to": token,
      	"data":{
					"custom_notification": {
						"title": "Simple FCM Client",
						"body": "This is a notification with only NOTIFICATION.",
						"sound": "default",
						"priority": "high",
						"show_in_foreground": true
        	}
    		},
    		"priority": 10
      }
    } else {
			body = {
				"to": token,
				"notification":{
					"title": "Simple FCM Client",
					"body": "This is a notification with only NOTIFICATION.",
					"sound": "default"
				},
				"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");
  }

  sendRemoteNotificationWithData(token) {
    let body = {
      "to": token,
      "notification":{
    		"title": "Simple FCM Client",
    		"body": "This is a notification with NOTIFICATION and DATA (NOTIF).",
				"sound": "default"
    	},
    	"data":{
    		"hello": "there"
    	},
    	"priority": "high"
    }

    firebaseClient.send(JSON.stringify(body), "notification-data");
  }

renato's avatar
renato committed
132
  render() {
133
    let { token, tokenCopyFeedback } = this.state;
134

renato's avatar
renato committed
135 136
    return (
      <View style={styles.container}>
137 138 139
        <PushController
          onChangeToken={token => this.setState({token: token || ""})}
        />
renato's avatar
renato committed
140 141 142 143
        <Text style={styles.welcome}>
          Welcome to Simple Fcm Client!
        </Text>

Libin Lu's avatar
Libin Lu committed
144 145 146 147 148
        <Text>
          Init notif: {JSON.stringify(this.state.initNotif)}

        </Text>

149
        <Text selectable={true} onPress={() => this.setClipboardContent(this.state.token)} style={styles.instructions}>
150 151 152
          Token: {this.state.token}
        </Text>

153 154 155 156
        <Text style={styles.feedback}>
          {this.state.tokenCopyFeedback}
        </Text>

Libin Lu's avatar
Libin Lu committed
157 158 159 160
        <Text style={styles.feedback}>
          Remote notif won't be available to iOS emulators
        </Text>

Libin Lu's avatar
Libin Lu committed
161
        <TouchableOpacity onPress={() => this.sendRemoteNotification(token)} style={styles.button}>
Libin Lu's avatar
Libin Lu committed
162
          <Text style={styles.buttonText}>Send Remote Notification</Text>
renato's avatar
renato committed
163 164
        </TouchableOpacity>

Libin Lu's avatar
Libin Lu committed
165
        <TouchableOpacity onPress={() => this.sendRemoteData(token)} style={styles.button}>
Libin Lu's avatar
Libin Lu committed
166
          <Text style={styles.buttonText}>Send Remote Data</Text>
renato's avatar
renato committed
167
        </TouchableOpacity>
renato's avatar
renato committed
168

Libin Lu's avatar
Libin Lu committed
169
        <TouchableOpacity onPress={() => this.sendRemoteNotificationWithData(token)} style={styles.button}>
Libin Lu's avatar
Libin Lu committed
170
          <Text style={styles.buttonText}>Send Remote Notification With Data</Text>
renato's avatar
renato committed
171
        </TouchableOpacity>
Libin Lu's avatar
Libin Lu committed
172 173 174 175

        <TouchableOpacity onPress={() => this.showLocalNotification()} style={styles.button}>
          <Text style={styles.buttonText}>Send Local Notification</Text>
        </TouchableOpacity>
Libin Lu's avatar
Libin Lu committed
176 177 178 179

        <TouchableOpacity onPress={() => this.scheduleLocalNotification()} style={styles.button}>
          <Text style={styles.buttonText}>Schedule Notification in 5s</Text>
        </TouchableOpacity>
renato's avatar
renato committed
180 181 182
      </View>
    );
  }
183 184 185 186 187 188 189 190 191 192

  setClipboardContent(text) {
    Clipboard.setString(text);
    this.setState({tokenCopyFeedback: "Token copied to clipboard."});
    setTimeout(() => {this.clearTokenCopyFeedback()}, 2000);
  }

  clearTokenCopyFeedback() {
    this.setState({tokenCopyFeedback: ""});
  }
renato's avatar
renato committed
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
}

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',
210 211 212 213 214 215
    marginBottom: 2,
  },
  feedback: {
    textAlign: 'center',
    color: '#996633',
    marginBottom: 3,
renato's avatar
renato committed
216 217 218 219 220
  },
  button: {
    backgroundColor: "teal",
    paddingHorizontal: 20,
    paddingVertical: 10,
renato's avatar
renato committed
221
    marginVertical: 15,
renato's avatar
renato committed
222 223 224 225 226 227 228
    borderRadius: 10
  },
  buttonText: {
    color: "white",
    backgroundColor: "transparent"
  },
});