@@ -3,12 +3,17 @@ import { Accounts } from 'meteor/accounts-base';
33import { Meteor } from 'meteor/meteor' ;
44import { Platform } from 'ionic-angular' ;
55import { Sim } from '@ionic-native/sim' ;
6+ import { SmsReceiver } from "../ionic/sms-receiver" ;
7+ import * as Bluebird from "bluebird" ;
8+ import { TWILIO_SMS_NUMBERS } from "api/models" ;
9+ import { Observable } from "rxjs" ;
610
711@Injectable ( )
812export class PhoneService {
913 constructor ( private platform : Platform ,
10- private sim : Sim ) {
11-
14+ private sim : Sim ,
15+ private smsReceiver : SmsReceiver ) {
16+ Bluebird . promisifyAll ( this . smsReceiver ) ;
1217 }
1318
1419 async getNumber ( ) : Promise < string > {
@@ -27,6 +32,38 @@ export class PhoneService {
2732 return '+' + ( await this . sim . getSimInfo ( ) ) . phoneNumber ;
2833 }
2934
35+ async getSMS ( ) : Promise < string > {
36+ if ( ! this . platform . is ( 'android' ) ) {
37+ throw new Error ( 'Cannot read SMS, platform is not Android.' )
38+ }
39+
40+ try {
41+ await ( < any > this . smsReceiver ) . isSupported ( ) ;
42+ } catch ( e ) {
43+ throw new Error ( 'User denied SMS access.' ) ;
44+ }
45+
46+ const startObs = Observable . fromPromise ( ( < any > this . smsReceiver ) . startReceiving ( ) ) . map ( ( msg : string ) => msg ) ;
47+ const timeoutObs = Observable . interval ( 120000 ) . take ( 1 ) . map ( ( ) => {
48+ throw new Error ( 'Receiving SMS timed out.' )
49+ } ) ;
50+
51+ try {
52+ var msg = await startObs . takeUntil ( timeoutObs ) . toPromise ( ) ;
53+ } catch ( e ) {
54+ await ( < any > this . smsReceiver ) . stopReceiving ( ) ;
55+ throw e ;
56+ }
57+
58+ await ( < any > this . smsReceiver ) . stopReceiving ( ) ;
59+
60+ if ( TWILIO_SMS_NUMBERS . includes ( msg . split ( ">" ) [ 0 ] ) ) {
61+ return msg . substr ( msg . length - 4 ) ;
62+ } else {
63+ throw new Error ( 'Sender is not a Twilio number.' )
64+ }
65+ }
66+
3067 verify ( phoneNumber : string ) : Promise < void > {
3168 return new Promise < void > ( ( resolve , reject ) => {
3269 Accounts . requestPhoneVerification ( phoneNumber , ( e : Error ) => {
0 commit comments