Skip to content

Commit

Permalink
Chore: Migrate notification/push to Typescript (RocketChat#3587)
Browse files Browse the repository at this point in the history
  • Loading branch information
dnlsilva authored Jan 12, 2022
1 parent ad04813 commit 2e6b314
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 143 deletions.
12 changes: 12 additions & 0 deletions app/definitions/INotification.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export interface INotification {
message: string;
style: string;
ejson: string;
collapse_key: string;
notId: string;
msgcnt: string;
title: string;
from: string;
image: string;
soundname: string;
}
7 changes: 7 additions & 0 deletions app/definitions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ import { RouteProp } from '@react-navigation/native';
import { StackNavigationProp } from '@react-navigation/stack';
import { Dispatch } from 'redux';

export * from './IAttachment';
export * from './IMessage';
export * from './INotification';
export * from './IRoom';
export * from './IServer';
export * from './ISubscription';

export interface IBaseScreen<T extends Record<string, object | undefined>, S extends string> {
navigation: StackNavigationProp<T, S>;
route: RouteProp<T, S>;
Expand Down
50 changes: 0 additions & 50 deletions app/notifications/push/index.js

This file was deleted.

57 changes: 57 additions & 0 deletions app/notifications/push/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import EJSON from 'ejson';

import store from '../../lib/createStore';
import { deepLinkingOpen } from '../../actions/deepLinking';
import { isFDroidBuild } from '../../constants/environment';
import PushNotification from './push';
import { INotification, SubscriptionType } from '../../definitions';

interface IEjson {
rid: string;
name: string;
sender: { username: string; name: string };
type: string;
host: string;
messageType: string;
messageId: string;
}

export const onNotification = (notification: INotification): void => {
if (notification) {
try {
const { rid, name, sender, type, host, messageType, messageId }: IEjson = EJSON.parse(notification.ejson);

const types: Record<string, string> = {
c: 'channel',
d: 'direct',
p: 'group',
l: 'channels'
};
let roomName = type === SubscriptionType.DIRECT ? sender.username : name;
if (type === SubscriptionType.OMNICHANNEL) {
roomName = sender.name;
}

const params = {
host,
rid,
messageId,
path: `${types[type]}/${roomName}`,
isCall: messageType === 'jitsi_call_started'
};
// TODO REDUX MIGRATION TO TS
store.dispatch(deepLinkingOpen(params));
} catch (e) {
console.warn(e);
}
}
};

export const getDeviceToken = (): string => PushNotification.getDeviceToken();
export const setBadgeCount = (count?: number): void => PushNotification.setBadgeCount(count);
export const initializePushNotifications = (): Promise<INotification> | undefined => {
if (!isFDroidBuild) {
setBadgeCount();
return PushNotification.configure(onNotification);
}
};
32 changes: 0 additions & 32 deletions app/notifications/push/push.android.js

This file was deleted.

61 changes: 0 additions & 61 deletions app/notifications/push/push.ios.js

This file was deleted.

63 changes: 63 additions & 0 deletions app/notifications/push/push.ios.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// @ts-ignore
// TODO BUMP LIB VERSION
import NotificationsIOS, { NotificationAction, NotificationCategory, Notification } from 'react-native-notifications';

import reduxStore from '../../lib/createStore';
import I18n from '../../i18n';
import { INotification } from '../../definitions/INotification';

class PushNotification {
onNotification: (notification: Notification) => void;
deviceToken: string;

constructor() {
this.onNotification = () => {};
this.deviceToken = '';

NotificationsIOS.addEventListener('remoteNotificationsRegistered', (deviceToken: string) => {
this.deviceToken = deviceToken;
});

NotificationsIOS.addEventListener('notificationOpened', (notification: Notification, completion: () => void) => {
// TODO REDUX MIGRATION TO TS
const { background } = reduxStore.getState().app;
if (background) {
this.onNotification(notification?.getData());
}
completion();
});

const actions = [
new NotificationCategory({
identifier: 'MESSAGE',
actions: [
new NotificationAction({
activationMode: 'background',
title: I18n.t('Reply'),
textInput: {
buttonTitle: I18n.t('Reply'),
placeholder: I18n.t('Type_message')
},
identifier: 'REPLY_ACTION'
})
]
})
];
NotificationsIOS.requestPermissions(actions);
}

getDeviceToken() {
return this.deviceToken;
}

setBadgeCount = (count = 0) => {
NotificationsIOS.setBadgesCount(count);
};

async configure(onNotification: (notification: INotification) => void) {
this.onNotification = onNotification;
const initial = await NotificationsIOS.getInitialNotification();
return Promise.resolve(initial);
}
}
export default new PushNotification();
36 changes: 36 additions & 0 deletions app/notifications/push/push.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// @ts-ignore
// TODO BUMP LIB VERSION
import { NotificationsAndroid, PendingNotifications, Notification } from 'react-native-notifications';

import { INotification } from '../../definitions/INotification';

class PushNotification {
onNotification: (notification: Notification) => void;
deviceToken: string;
constructor() {
this.onNotification = () => {};
this.deviceToken = '';

NotificationsAndroid.setRegistrationTokenUpdateListener((deviceToken: string) => {
this.deviceToken = deviceToken;
});

NotificationsAndroid.setNotificationOpenedListener((notification: Notification) => {
this.onNotification(notification?.getData());
});
}

getDeviceToken() {
return this.deviceToken;
}

setBadgeCount = (_?: number) => {};

configure(onNotification: (notification: INotification) => void) {
this.onNotification = onNotification;
NotificationsAndroid.refreshToken();
return PendingNotifications.getInitialNotification();
}
}

export default new PushNotification();
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@
"@rocket.chat/eslint-config": "^0.4.0",
"@storybook/addon-storyshots": "5.3.21",
"@storybook/react-native": "5.3.25",
"@types/ejson": "^2.1.3",
"@types/jest": "^26.0.24",
"@types/lodash": "^4.14.171",
"@types/react": "^17.0.14",
Expand Down
5 changes: 5 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4198,6 +4198,11 @@
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==

"@types/ejson@^2.1.3":
version "2.1.3"
resolved "https://registry.yarnpkg.com/@types/ejson/-/ejson-2.1.3.tgz#29a0028db4180b589b62eb2b6b9367c65b0c1864"
integrity sha512-Sd+XISmDWOypfDcsKeQkhykSMgYVAWJxhf7f0ySvfy2tYo+im26M/6FfqjCEiPSDAEugiuZKtA+wWeANKueWIg==

"@types/events@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
Expand Down

0 comments on commit 2e6b314

Please sign in to comment.