From b1e12d33abbd9d5f065080be496662890e52e38c Mon Sep 17 00:00:00 2001 From: Tudor-Ovidiu Avram Date: Thu, 23 Jul 2020 11:16:40 +0300 Subject: [PATCH] feat(embed) implement embed meeting feature --- css/buttons/copy.scss | 1 + css/main.scss | 1 + css/modals/embed-meeting/_embed-meeting.scss | 59 ++++++++++++++++ css/modals/invite/_invite_more.scss | 4 -- interface_config.js | 2 +- lang/main.json | 6 ++ react/features/base/icons/svg/code-block.svg | 4 ++ react/features/base/icons/svg/index.js | 1 + .../components/EmbedMeetingDialog.js | 69 +++++++++++++++++++ .../components/EmbedMeetingTrigger.js | 50 ++++++++++++++ .../embed-meeting/components/Header.js | 38 ++++++++++ .../embed-meeting/components/index.js | 1 + react/features/embed-meeting/index.js | 1 + .../add-people-dialog/web/AddPeopleDialog.js | 3 + .../web/InviteByEmailSection.js | 1 - .../toolbox/components/web/Toolbox.js | 35 ++++++++++ 16 files changed, 270 insertions(+), 6 deletions(-) create mode 100644 css/modals/embed-meeting/_embed-meeting.scss create mode 100644 react/features/base/icons/svg/code-block.svg create mode 100644 react/features/embed-meeting/components/EmbedMeetingDialog.js create mode 100644 react/features/embed-meeting/components/EmbedMeetingTrigger.js create mode 100644 react/features/embed-meeting/components/Header.js create mode 100644 react/features/embed-meeting/components/index.js create mode 100644 react/features/embed-meeting/index.js diff --git a/css/buttons/copy.scss b/css/buttons/copy.scss index 9596abcc36..20867ce516 100644 --- a/css/buttons/copy.scss +++ b/css/buttons/copy.scss @@ -21,6 +21,7 @@ text-overflow: ellipsis; white-space: nowrap; max-width: 292px; + margin-right: 16px; &.selected { font-weight: 600; diff --git a/css/main.scss b/css/main.scss index 1257937f28..4b3ed8c4ee 100644 --- a/css/main.scss +++ b/css/main.scss @@ -37,6 +37,7 @@ $flagsImagePath: "../images/"; @import 'modals/desktop-picker/desktop-picker'; @import 'modals/device-selection/device-selection'; @import 'modals/dialog'; +@import 'modals/embed-meeting/embed-meeting'; @import 'modals/feedback/feedback'; @import 'modals/invite/info'; @import 'modals/settings/settings'; diff --git a/css/modals/embed-meeting/_embed-meeting.scss b/css/modals/embed-meeting/_embed-meeting.scss new file mode 100644 index 0000000000..3d3a7f21a4 --- /dev/null +++ b/css/modals/embed-meeting/_embed-meeting.scss @@ -0,0 +1,59 @@ +.embed-meeting { + &-dialog { + display: flex; + flex-direction: column; + + &-header { + display: flex; + justify-content: space-between; + margin: 16px 16px 24px; + width: calc(100% - 32px); + color: #fff; + font-weight: 600; + font-size: 24px; + line-height: 32px; + + & > div > svg { + cursor: pointer; + fill: #A4B8D1; + } + } + } + + &-copy { + color: white; + font-size: 15px; + margin-left: auto; + margin-top: 16px; + width: auto; + } + + &-code { + background: transparent; + border: 1px solid #A4B8D1; + color: white; + font-size: 15px; + height: 165px; + line-height: 24px; + padding: 8px; + width: 100%; + resize: vertical; + } + + &-trigger { + display: flex; + align-items: center; + padding: 8px 8px 8px 16px; + margin-top: 24px; + width: calc(100% - 24px); + height: 24px; + background: #2A3A4B; + border: 1px solid #5E6D7A; + border-radius: 4px; + cursor: pointer; + + .jitsi-icon { + margin-right: 20px; + } + } +} diff --git a/css/modals/invite/_invite_more.scss b/css/modals/invite/_invite_more.scss index 73160928a2..742f4e8981 100644 --- a/css/modals/invite/_invite_more.scss +++ b/css/modals/invite/_invite_more.scss @@ -47,10 +47,6 @@ font-size: 15px; line-height: 24px; - & > span { - font-weight: 600; - } - &.header { display: flex; justify-content: space-between; diff --git a/interface_config.js b/interface_config.js index dfcc6cdfcb..32f8f221ab 100644 --- a/interface_config.js +++ b/interface_config.js @@ -185,7 +185,7 @@ var interfaceConfig = { * - 'desktop' controls the "Share your screen" button */ TOOLBAR_BUTTONS: [ - 'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen', + 'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen', 'fodeviceselection', 'hangup', 'profile', 'chat', 'recording', 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand', 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts', diff --git a/lang/main.json b/lang/main.json index bd326a1587..b98ec138a4 100644 --- a/lang/main.json +++ b/lang/main.json @@ -190,6 +190,7 @@ "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}", "connecting": "Connecting", "contactSupport": "Contact support", + "copied": "Copied", "copy": "Copy", "dismiss": "Dismiss", "displayNameRequired": "Hi! What’s your name?", @@ -316,6 +317,9 @@ "e2ee": { "labelToolTip": "Audio and Video Communication on this call is end-to-end encrypted" }, + "embedMeeting": { + "title": "Embed this meeting" + }, "feedback": { "average": "Average", "bad": "Bad", @@ -670,6 +674,7 @@ "chat": "Toggle chat window", "document": "Toggle shared document", "download": "Download our apps", + "embedMeeting": "Embed meeting", "e2ee": "End-to-End Encryption", "feedback": "Leave feedback", "fullScreen": "Toggle full screen", @@ -718,6 +723,7 @@ "documentOpen": "Open shared document", "download": "Download our apps", "e2ee": "End-to-End Encryption", + "embedMeeting": "Embed meeting", "enterFullScreen": "View full screen", "enterTileView": "Enter tile view", "exitFullScreen": "Exit full screen", diff --git a/react/features/base/icons/svg/code-block.svg b/react/features/base/icons/svg/code-block.svg new file mode 100644 index 0000000000..5c5783b2d5 --- /dev/null +++ b/react/features/base/icons/svg/code-block.svg @@ -0,0 +1,4 @@ + + + + diff --git a/react/features/base/icons/svg/index.js b/react/features/base/icons/svg/index.js index b9f38b58fd..e7f43a4513 100644 --- a/react/features/base/icons/svg/index.js +++ b/react/features/base/icons/svg/index.js @@ -20,6 +20,7 @@ export { default as IconCheck } from './check.svg'; export { default as IconClose } from './close.svg'; export { default as IconCloseX } from './close-x.svg'; export { default as IconClosedCaption } from './closed_caption.svg'; +export { default as IconCodeBlock } from './code-block.svg'; export { default as IconConnectionActive } from './gsm-bars.svg'; export { default as IconConnectionInactive } from './ninja.svg'; export { default as IconCopy } from './copy.svg'; diff --git a/react/features/embed-meeting/components/EmbedMeetingDialog.js b/react/features/embed-meeting/components/EmbedMeetingDialog.js new file mode 100644 index 0000000000..5da5a2caa4 --- /dev/null +++ b/react/features/embed-meeting/components/EmbedMeetingDialog.js @@ -0,0 +1,69 @@ +// @flow + +import React from 'react'; +import { connect } from 'react-redux'; + +import CopyButton from '../../base/buttons/CopyButton'; +import { getInviteURL } from '../../base/connection'; +import { Dialog } from '../../base/dialog'; +import { translate } from '../../base/i18n'; + +import Header from './Header'; + +type Props = { + + /** + * Invoked to obtain translated strings. + */ + t: Function, + + /** + * The URL of the conference. + */ + url: string +}; + +/** + * Allow users to embed a jitsi meeting in an iframe. + * + * @returns {React$Element} + */ +function EmbedMeeting({ t, url }: Props) { + /** + * Get the embed code for a jitsi meeting. + * + * @returns {string} The iframe embed code. + */ + const getEmbedCode = () => + `'; + + return ( + +
+