jiti-meet/react/features/share-room/middleware.ts

67 lines
2.1 KiB
TypeScript

import { Share } from 'react-native';
import { getName } from '../app/functions.native';
import { IStore } from '../app/types';
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
import { getShareInfoText } from '../invite/functions';
import { BEGIN_SHARE_ROOM } from './actionTypes';
import { endShareRoom, toggleShareDialog } from './actions';
import logger from './logger';
/**
* Middleware that captures room URL sharing actions and starts the sharing
* process.
*
* @param {Store} store - Redux store.
* @returns {Function}
*/
MiddlewareRegistry.register(store => next => action => {
switch (action.type) {
case BEGIN_SHARE_ROOM:
_shareRoom(action.roomURL, store);
break;
}
return next(action);
});
/**
* Open the native sheet for sharing a specific conference/room URL.
*
* @param {string} roomURL - The URL of the conference/room to be shared.
* @param {Store} store - Redux store.
* @private
* @returns {void}
*/
function _shareRoom(roomURL: string, { dispatch, getState }: IStore) {
getShareInfoText(getState(), roomURL)
.then(message => {
const title = `${getName()} Conference`;
const onFulfilled
= (shared: boolean) => dispatch(endShareRoom(roomURL, shared));
Share.share(
/* content */ {
message,
title
},
/* options */ {
dialogTitle: title, // Android
subject: title // iOS
})
.then(
/* onFulfilled */ value => {
onFulfilled(value.action === Share.sharedAction);
dispatch(toggleShareDialog(false));
},
/* onRejected */ reason => {
dispatch(toggleShareDialog(false));
logger.error(
`Failed to share conference/room URL ${roomURL}:`,
reason);
onFulfilled(false);
});
});
}