Skip to content

Commit 7b0752d

Browse files
authored
Merge pull request #6654 from Expensify/francois-guidesPlusScreenshareRequest
Open modal to join screen share requests from GuidesPlus agents
2 parents 9f2b4f0 + ccb49b3 commit 7b0752d

File tree

7 files changed

+95
-19
lines changed

7 files changed

+95
-19
lines changed

src/Expensify.js

+49-15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import GrowlNotification from './components/GrowlNotification';
1717
import * as Growl from './libs/Growl';
1818
import StartupTimer from './libs/StartupTimer';
1919
import Log from './libs/Log';
20+
import ConfirmModal from './components/ConfirmModal';
21+
import compose from './libs/compose';
22+
import withLocalize, {withLocalizePropTypes} from './components/withLocalize';
23+
import * as User from './libs/actions/User';
2024

2125
Onyx.registerLogger(({level, message}) => {
2226
if (level === 'alert') {
@@ -48,6 +52,18 @@ const propTypes = {
4852

4953
/** Tells us if the sidebar has rendered */
5054
isSidebarLoaded: PropTypes.bool,
55+
56+
/** Information about a screen share call requested by a GuidesPlus agent */
57+
screenShareRequest: PropTypes.shape({
58+
59+
/** Access token required to join a screen share room, generated by the backend */
60+
accessToken: PropTypes.string,
61+
62+
/** Name of the screen share room to join */
63+
roomName: PropTypes.string,
64+
}),
65+
66+
...withLocalizePropTypes,
5167
};
5268

5369
const defaultProps = {
@@ -58,6 +74,7 @@ const defaultProps = {
5874
updateAvailable: false,
5975
initialReportDataLoaded: false,
6076
isSidebarLoaded: false,
77+
screenShareRequest: null,
6178
};
6279

6380
class Expensify extends PureComponent {
@@ -167,6 +184,17 @@ class Expensify extends PureComponent {
167184
<GrowlNotification ref={Growl.growlRef} />
168185
{/* We include the modal for showing a new update at the top level so the option is always present. */}
169186
{this.props.updateAvailable ? <UpdateAppModal /> : null}
187+
{this.props.screenShareRequest ? (
188+
<ConfirmModal
189+
title={this.props.translate('guides.screenShare')}
190+
onConfirm={() => User.joinScreenShare(this.props.screenShareRequest.accessToken, this.props.screenShareRequest.roomName)}
191+
onCancel={User.clearScreenShareRequest}
192+
prompt={this.props.translate('guides.screenShareRequest')}
193+
confirmText={this.props.translate('common.join')}
194+
cancelText={this.props.translate('common.decline')}
195+
isVisible
196+
/>
197+
) : null}
170198
</>
171199
)}
172200

@@ -181,18 +209,24 @@ class Expensify extends PureComponent {
181209

182210
Expensify.propTypes = propTypes;
183211
Expensify.defaultProps = defaultProps;
184-
export default withOnyx({
185-
session: {
186-
key: ONYXKEYS.SESSION,
187-
},
188-
updateAvailable: {
189-
key: ONYXKEYS.UPDATE_AVAILABLE,
190-
initWithStoredValues: false,
191-
},
192-
initialReportDataLoaded: {
193-
key: ONYXKEYS.INITIAL_REPORT_DATA_LOADED,
194-
},
195-
isSidebarLoaded: {
196-
key: ONYXKEYS.IS_SIDEBAR_LOADED,
197-
},
198-
})(Expensify);
212+
export default compose(
213+
withLocalize,
214+
withOnyx({
215+
session: {
216+
key: ONYXKEYS.SESSION,
217+
},
218+
updateAvailable: {
219+
key: ONYXKEYS.UPDATE_AVAILABLE,
220+
initWithStoredValues: false,
221+
},
222+
initialReportDataLoaded: {
223+
key: ONYXKEYS.INITIAL_REPORT_DATA_LOADED,
224+
},
225+
isSidebarLoaded: {
226+
key: ONYXKEYS.IS_SIDEBAR_LOADED,
227+
},
228+
screenShareRequest: {
229+
key: ONYXKEYS.SCREEN_SHARE_REQUEST,
230+
},
231+
}),
232+
)(Expensify);

src/ONYXKEYS.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,12 @@ export default {
5858
// select a currency based on the list
5959
CURRENCY_LIST: 'currencyList',
6060

61-
// Indicates whether an update is available and ready to beinstalled.
61+
// Indicates whether an update is available and ready to be installed.
6262
UPDATE_AVAILABLE: 'updateAvailable',
6363

64+
// Indicates that a request to join a screen share with a GuidesPlus agent was received
65+
SCREEN_SHARE_REQUEST: 'screenShareRequest',
66+
6467
// Saves the current country code which is displayed when the user types a phone number without
6568
// an international code
6669
COUNTRY_CODE: 'countryCode',

src/languages/en.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ export default {
9090
debitCard: 'Debit card',
9191
payPalMe: 'PayPal.me',
9292
bankAccount: 'Bank account',
93+
join: 'Join',
94+
decline: 'Decline',
9395
},
9496
attachmentPicker: {
9597
cameraPermissionRequired: 'Camera permission required',
@@ -194,7 +196,6 @@ export default {
194196
viewDetails: 'View details',
195197
settleExpensify: 'Pay with Expensify',
196198
settleElsewhere: 'I\'ll settle up elsewhere',
197-
decline: 'Decline',
198199
settlePaypalMe: 'Pay with PayPal.me',
199200
settleVenmo: 'Pay with Venmo',
200201
request: ({amount}) => `Request ${amount}`,
@@ -818,4 +819,8 @@ export default {
818819
newGroup: 'New group screen',
819820
},
820821
},
822+
guides: {
823+
screenShare: 'Screen share',
824+
screenShareRequest: 'Expensify is inviting you to a screen share',
825+
},
821826
};

src/languages/es.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ export default {
9090
debitCard: 'Tarjeta de débito',
9191
payPalMe: 'PayPal.me',
9292
bankAccount: 'Cuenta bancaria',
93+
join: 'Unirse',
94+
decline: 'Rechazar',
9395
},
9496
attachmentPicker: {
9597
cameraPermissionRequired: 'Se necesita permiso para usar la cámara',
@@ -194,7 +196,6 @@ export default {
194196
viewDetails: 'Ver detalles',
195197
settleExpensify: 'Pagar con Expensify',
196198
settleElsewhere: 'Voy a pagar de otra forma',
197-
decline: 'Rechazar',
198199
settlePaypalMe: 'Pagar con PayPal.me',
199200
settleVenmo: 'Pagar con Venmo',
200201
request: ({amount}) => `Solicitar ${amount}`,
@@ -820,4 +821,8 @@ export default {
820821
newGroup: 'Nueva pantalla de grupo',
821822
},
822823
},
824+
guides: {
825+
screenShare: 'Compartir pantalla',
826+
screenShareRequest: 'Expensify te está invitando a compartir la pantalla',
827+
},
823828
};

src/libs/Pusher/EventType.js

+1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ export default {
1010
REPORT_TOGGLE_PINNED: 'reportTogglePinned',
1111
PREFERRED_LOCALE: 'preferredLocale',
1212
EXPENSIFY_CARD_UPDATE: 'expensifyCardUpdate',
13+
SCREEN_SHARE_REQUEST: 'screenshareRequest',
1314
};

src/libs/actions/User.js

+28
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Log from '../Log';
1414
import NetworkConnection from '../NetworkConnection';
1515
import NameValuePair from './NameValuePair';
1616
import getSkinToneEmojiFromIndex from '../../pages/home/report/EmojiPickerMenu/getSkinToneEmojiFromIndex';
17+
import * as Link from './Link';
1718

1819
let sessionAuthToken = '';
1920
let sessionEmail = '';
@@ -279,6 +280,14 @@ function subscribeToUserEvents() {
279280
{error, pusherChannelName, eventName: Pusher.TYPE.PREFERRED_LOCALE},
280281
);
281282
});
283+
284+
// Subscribe to screen share requests sent by GuidesPlus agents
285+
Pusher.subscribe(pusherChannelName, Pusher.TYPE.SCREEN_SHARE_REQUEST, (pushJSON) => {
286+
Onyx.merge(ONYXKEYS.SCREEN_SHARE_REQUEST, pushJSON);
287+
}, false,
288+
() => {
289+
NetworkConnection.triggerReconnectionCallbacks('pusher re-subscribed to private user channel');
290+
});
282291
}
283292

284293
/**
@@ -341,6 +350,23 @@ function clearUserErrorMessage() {
341350
Onyx.merge(ONYXKEYS.USER, {error: ''});
342351
}
343352

353+
/**
354+
* Clear the data about a screen share request from Onyx.
355+
*/
356+
function clearScreenShareRequest() {
357+
Onyx.set(ONYXKEYS.SCREEN_SHARE_REQUEST, null);
358+
}
359+
360+
/**
361+
* Open an OldDot tab linking to a screen share request.
362+
* @param {String} accessToken Access token required to join a screen share room, generated by the backend
363+
* @param {String} roomName Name of the screen share room to join
364+
*/
365+
function joinScreenShare(accessToken, roomName) {
366+
Link.openOldDotLink(`inbox?action=screenShare&accessToken=${accessToken}&name=${roomName}`);
367+
clearScreenShareRequest();
368+
}
369+
344370
export {
345371
changePasswordAndNavigate,
346372
getBetas,
@@ -357,4 +383,6 @@ export {
357383
clearUserErrorMessage,
358384
subscribeToExpensifyCardUpdates,
359385
setFrequentlyUsedEmojis,
386+
joinScreenShare,
387+
clearScreenShareRequest,
360388
};

src/pages/iou/IOUTransactions.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class IOUTransactions extends Component {
9292
canBeRejected={canBeRejected}
9393
rejectButtonLabelText={isCurrentUserTransactionCreator
9494
? this.props.translate('common.cancel')
95-
: this.props.translate('iou.decline')}
95+
: this.props.translate('common.decline')}
9696
/>
9797
);
9898
})}

0 commit comments

Comments
 (0)