Skip to content

Commit 405ae50

Browse files
committed
Step 14.11: Add getSMS method to phone.ts
1 parent 7e8c061 commit 405ae50

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

api/server/models.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export const DEFAULT_PICTURE_URL = '/assets/default-profile-pic.svg';
2+
export const TWILIO_SMS_NUMBERS = ["+12248032362"];
23

34
export interface Profile {
45
name?: string;

src/services/phone.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ import { Accounts } from 'meteor/accounts-base';
33
import { Meteor } from 'meteor/meteor';
44
import { Platform } from 'ionic-angular';
55
import { 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()
812
export 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

Comments
 (0)