Merge jitsi-meet-react's mobile support
As a step toward merging jitsi-meet-react with jitsi-meet to share as much source code as possible between mobile and Web, merge the part of jitsi-meet-react's source tree which supports mobile inside the jitsi-meet source tree and leave jitsi-meet-react's Web support in the source code revision history but don't have it in master anymore because it's different from jitsi-meet's Web support. In other words, the two projects are mechanically merged at the file level and don't really share source code between mobile and Web.
|
@ -1,8 +1,4 @@
|
||||||
node_modules
|
|
||||||
.DS_Store
|
|
||||||
*.swp
|
*.swp
|
||||||
.idea/
|
|
||||||
*.iml
|
|
||||||
.*.tmp
|
.*.tmp
|
||||||
deploy-local.sh
|
deploy-local.sh
|
||||||
libs/
|
libs/
|
||||||
|
@ -11,3 +7,50 @@ all.css
|
||||||
unsupported_browser.css
|
unsupported_browser.css
|
||||||
.remote-sync.json
|
.remote-sync.json
|
||||||
.sync-config.cson
|
.sync-config.cson
|
||||||
|
|
||||||
|
# The following are automatically generated by the react-native command line
|
||||||
|
# utility (either with the init or upgrade option which pull in the latest
|
||||||
|
# template files recommended by Facebook for React Native).
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IJ
|
||||||
|
#
|
||||||
|
*.iml
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
||||||
|
|
||||||
|
# BUCK
|
||||||
|
#
|
||||||
|
buck-out/
|
||||||
|
\.buckd/
|
||||||
|
android/app/libs
|
||||||
|
android/keystores/debug.keystore
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
debian
|
debian/
|
||||||
libs
|
libs/
|
||||||
node_modules
|
node_modules/
|
||||||
|
react/
|
||||||
analytics.js
|
analytics.js
|
||||||
webpack.config.babel.js
|
webpack.config.babel.js
|
||||||
|
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
@ -0,0 +1 @@
|
||||||
|
export * from './react/index.native';
|
|
@ -0,0 +1 @@
|
||||||
|
export * from './react/index.native';
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
@ -143,7 +143,7 @@
|
||||||
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = app/main.m; sourceTree = "<group>"; };
|
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = app/main.m; sourceTree = "<group>"; };
|
||||||
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
||||||
22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
|
22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
|
||||||
2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../features/base/fontIcons/fonts/jitsi.ttf; sourceTree = "<group>"; };
|
2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../react/features/base/fontIcons/fonts/jitsi.ttf; sourceTree = "<group>"; };
|
||||||
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
||||||
821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
|
821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
|
||||||
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
14
package.json
|
@ -30,10 +30,19 @@
|
||||||
"jws": "*",
|
"jws": "*",
|
||||||
"lib-jitsi-meet": "jitsi/lib-jitsi-meet",
|
"lib-jitsi-meet": "jitsi/lib-jitsi-meet",
|
||||||
"postis": "^2.2.0",
|
"postis": "^2.2.0",
|
||||||
|
"react": "15.3.1",
|
||||||
|
"react-native": "0.33.0",
|
||||||
|
"react-native-vector-icons": "^2.0.3",
|
||||||
|
"react-native-webrtc": "jitsi/react-native-webrtc",
|
||||||
|
"react-redux": "^4.4.5",
|
||||||
|
"redux": "^3.5.2",
|
||||||
|
"redux-thunk": "^2.1.0",
|
||||||
"retry": "0.6.1",
|
"retry": "0.6.1",
|
||||||
"strophe": "^1.2.2",
|
"strophe": "^1.2.2",
|
||||||
"strophejs-plugins": "^0.0.6",
|
"strophejs-plugins": "^0.0.6",
|
||||||
"toastr": "^2.0.3"
|
"toastr": "^2.0.3",
|
||||||
|
"url-polyfill": "github/url-polyfill",
|
||||||
|
"xmldom": "^0.1.22"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-core": "*",
|
"babel-core": "*",
|
||||||
|
@ -43,6 +52,9 @@
|
||||||
"clean-css": "*",
|
"clean-css": "*",
|
||||||
"css-loader": "*",
|
"css-loader": "*",
|
||||||
"eslint": "*",
|
"eslint": "*",
|
||||||
|
"eslint-plugin-jsdoc": "*",
|
||||||
|
"eslint-plugin-react": "*",
|
||||||
|
"eslint-plugin-react-native": "*",
|
||||||
"expose-loader": "*",
|
"expose-loader": "*",
|
||||||
"file-loader": "*",
|
"file-loader": "*",
|
||||||
"imports-loader": "*",
|
"imports-loader": "*",
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
[ignore]
|
|
||||||
|
|
||||||
# We fork some components by platform.
|
|
||||||
.*/*[.]android.js
|
|
||||||
|
|
||||||
# Ignore templates with `@flow` in header
|
|
||||||
.*/local-cli/generator.*
|
|
||||||
|
|
||||||
# Ignore malformed json
|
|
||||||
.*/node_modules/y18n/test/.*\.json
|
|
||||||
|
|
||||||
# Ignore the website subdir
|
|
||||||
<PROJECT_ROOT>/website/.*
|
|
||||||
|
|
||||||
# Ignore BUCK generated dirs
|
|
||||||
<PROJECT_ROOT>/\.buckd/
|
|
||||||
|
|
||||||
# Ignore unexpected extra @providesModule
|
|
||||||
.*/node_modules/commoner/test/source/widget/share.js
|
|
||||||
|
|
||||||
# Ignore duplicate module providers
|
|
||||||
# For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root
|
|
||||||
.*/Libraries/react-native/React.js
|
|
||||||
.*/Libraries/react-native/ReactNative.js
|
|
||||||
.*/node_modules/jest-runtime/build/__tests__/.*
|
|
||||||
|
|
||||||
[include]
|
|
||||||
|
|
||||||
[libs]
|
|
||||||
node_modules/react-native/Libraries/react-native/react-native-interface.js
|
|
||||||
node_modules/react-native/flow
|
|
||||||
flow/
|
|
||||||
|
|
||||||
[options]
|
|
||||||
module.system=haste
|
|
||||||
|
|
||||||
esproposal.class_static_fields=enable
|
|
||||||
esproposal.class_instance_fields=enable
|
|
||||||
|
|
||||||
experimental.strict_type_args=true
|
|
||||||
|
|
||||||
munge_underscores=true
|
|
||||||
|
|
||||||
module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
|
|
||||||
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
|
|
||||||
|
|
||||||
suppress_type=$FlowIssue
|
|
||||||
suppress_type=$FlowFixMe
|
|
||||||
suppress_type=$FixMe
|
|
||||||
|
|
||||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(30\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
|
|
||||||
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(30\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
|
|
||||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
|
|
||||||
|
|
||||||
unsafe.enable_getters_and_setters=true
|
|
||||||
|
|
||||||
[version]
|
|
||||||
^0.30.0
|
|
|
@ -1,44 +0,0 @@
|
||||||
# OSX
|
|
||||||
#
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Xcode
|
|
||||||
#
|
|
||||||
build/
|
|
||||||
*.pbxuser
|
|
||||||
!default.pbxuser
|
|
||||||
*.mode1v3
|
|
||||||
!default.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
!default.mode2v3
|
|
||||||
*.perspectivev3
|
|
||||||
!default.perspectivev3
|
|
||||||
xcuserdata
|
|
||||||
*.xccheckout
|
|
||||||
*.moved-aside
|
|
||||||
DerivedData
|
|
||||||
*.hmap
|
|
||||||
*.ipa
|
|
||||||
*.xcuserstate
|
|
||||||
project.xcworkspace
|
|
||||||
|
|
||||||
# Android/IJ
|
|
||||||
#
|
|
||||||
*.iml
|
|
||||||
.idea
|
|
||||||
.gradle
|
|
||||||
local.properties
|
|
||||||
|
|
||||||
# node.js
|
|
||||||
#
|
|
||||||
node_modules/
|
|
||||||
npm-debug.log
|
|
||||||
|
|
||||||
# BUCK
|
|
||||||
#
|
|
||||||
buck-out/
|
|
||||||
\.buckd/
|
|
||||||
android/app/libs
|
|
||||||
android/keystores/debug.keystore
|
|
||||||
|
|
||||||
dist/
|
|
219
react/LICENSE
|
@ -1,219 +0,0 @@
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Note:
|
|
||||||
|
|
||||||
This project was originally contributed to the community under the MIT license and with the following notice:
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 ESTOS GmbH
|
|
||||||
Copyright (c) 2013 BlueJimp SARL
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,7 +0,0 @@
|
||||||
# jitsi-meet-react
|
|
||||||
|
|
||||||
## Launching the App
|
|
||||||
|
|
||||||
- For Android: `npm run start:android`
|
|
||||||
- For iOS: `npm run start:ios`
|
|
||||||
- For Web: `npm run start:web`
|
|
|
@ -1,5 +0,0 @@
|
||||||
jitsi-meet-react (1.0.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial release.
|
|
||||||
|
|
||||||
-- Damian Minkov <damencho@jitsi.org> Wed, 13 Jul 2016 15:32:41 +0000
|
|
|
@ -1 +0,0 @@
|
||||||
8
|
|
|
@ -1,73 +0,0 @@
|
||||||
/* jshint -W101 */
|
|
||||||
var config = {
|
|
||||||
// configLocation: './config.json', // see ./modules/HttpConfigFetch.js
|
|
||||||
hosts: {
|
|
||||||
domain: 'jitsi-meet.example.com',
|
|
||||||
//anonymousdomain: 'guest.example.com',
|
|
||||||
//authdomain: 'jitsi-meet.example.com', // defaults to <domain>
|
|
||||||
muc: 'conference.jitsi-meet.example.com', // FIXME: use XEP-0030
|
|
||||||
//jirecon: 'jirecon.jitsi-meet.example.com',
|
|
||||||
//call_control: 'callcontrol.jitsi-meet.example.com',
|
|
||||||
//focus: 'focus.jitsi-meet.example.com', // defaults to 'focus.jitsi-meet.example.com'
|
|
||||||
},
|
|
||||||
// getroomnode: function (path) { return 'someprefixpossiblybasedonpath'; },
|
|
||||||
// useStunTurn: true, // use XEP-0215 to fetch STUN and TURN server
|
|
||||||
// useIPv6: true, // ipv6 support. use at your own risk
|
|
||||||
useNicks: false,
|
|
||||||
bosh: '//jitsi-meet.example.com/http-bind', // FIXME: use xep-0156 for that
|
|
||||||
clientNode: 'http://jitsi.org/jitsimeet', // The name of client node advertised in XEP-0115 'c' stanza
|
|
||||||
//focusUserJid: 'focus@auth.jitsi-meet.example.com', // The real JID of focus participant - can be overridden here
|
|
||||||
//defaultSipNumber: '', // Default SIP number
|
|
||||||
|
|
||||||
// Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
|
|
||||||
desktopSharingChromeMethod: 'ext',
|
|
||||||
// The ID of the jidesha extension for Chrome.
|
|
||||||
desktopSharingChromeExtId: 'diibjkoicjeejcmhdnailmkgecihlobk',
|
|
||||||
// The media sources to use when using screen sharing with the Chrome
|
|
||||||
// extension.
|
|
||||||
desktopSharingChromeSources: ['screen', 'window'],
|
|
||||||
// Required version of Chrome extension
|
|
||||||
desktopSharingChromeMinExtVersion: '0.1',
|
|
||||||
|
|
||||||
// The ID of the jidesha extension for Firefox. If null, we assume that no
|
|
||||||
// extension is required.
|
|
||||||
desktopSharingFirefoxExtId: null,
|
|
||||||
// Whether desktop sharing should be disabled on Firefox.
|
|
||||||
desktopSharingFirefoxDisabled: true,
|
|
||||||
// The maximum version of Firefox which requires a jidesha extension.
|
|
||||||
// Example: if set to 41, we will require the extension for Firefox versions
|
|
||||||
// up to and including 41. On Firefox 42 and higher, we will run without the
|
|
||||||
// extension.
|
|
||||||
// If set to -1, an extension will be required for all versions of Firefox.
|
|
||||||
desktopSharingFirefoxMaxVersionExtRequired: -1,
|
|
||||||
// The URL to the Firefox extension for desktop sharing.
|
|
||||||
desktopSharingFirefoxExtensionURL: null,
|
|
||||||
|
|
||||||
// Disables ICE/UDP by filtering out local and remote UDP candidates in signalling.
|
|
||||||
webrtcIceUdpDisable: false,
|
|
||||||
// Disables ICE/TCP by filtering out local and remote TCP candidates in signalling.
|
|
||||||
webrtcIceTcpDisable: false,
|
|
||||||
|
|
||||||
openSctp: true, // Toggle to enable/disable SCTP channels
|
|
||||||
disableStats: false,
|
|
||||||
disableAudioLevels: false,
|
|
||||||
channelLastN: -1, // The default value of the channel attribute last-n.
|
|
||||||
adaptiveLastN: false,
|
|
||||||
//disableAdaptiveSimulcast: false,
|
|
||||||
enableRecording: false,
|
|
||||||
enableWelcomePage: true,
|
|
||||||
disableSimulcast: false,
|
|
||||||
logStats: false, // Enable logging of PeerConnection stats via the focus
|
|
||||||
// requireDisplayName: true, // Forces the participants that doesn't have display name to enter it when they enter the room.
|
|
||||||
// startAudioMuted: 10, // every participant after the Nth will start audio muted
|
|
||||||
// startVideoMuted: 10, // every participant after the Nth will start video muted
|
|
||||||
// defaultLanguage: "en",
|
|
||||||
// To enable sending statistics to callstats.io you should provide Applicaiton ID and Secret.
|
|
||||||
// callStatsID: "", // Application ID for callstats.io API
|
|
||||||
// callStatsSecret: "", // Secret for callstats.io API
|
|
||||||
/*noticeMessage: 'Service update is scheduled for 16th March 2015. ' +
|
|
||||||
'During that time service will not be available. ' +
|
|
||||||
'Apologise for inconvenience.',*/
|
|
||||||
disableThirdPartyRequests: false,
|
|
||||||
minHDHeight: 540
|
|
||||||
};
|
|
|
@ -1,20 +0,0 @@
|
||||||
Source: jitsi-meet-react
|
|
||||||
Section: net
|
|
||||||
Priority: extra
|
|
||||||
Maintainer: Jitsi Team <dev@jitsi.org>
|
|
||||||
Uploaders: Emil Ivov <emcho@jitsi.org>, Damian Minkov <damencho@jitsi.org>
|
|
||||||
Build-Depends: debhelper (>= 8.0.0)
|
|
||||||
Standards-Version: 3.9.6
|
|
||||||
Homepage: https://jitsi.org/meet
|
|
||||||
|
|
||||||
Package: jitsi-meet-react
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${misc:Depends}, jitsi-videobridge, jitsi-meet-prosody,
|
|
||||||
openjdk-8-jre-headless | nginx
|
|
||||||
Description: WebRTC JavaScript video conferences
|
|
||||||
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
|
||||||
Videobridge to provide high quality, scalable video conferences.
|
|
||||||
.
|
|
||||||
It is a web interface to Jitsi Videobridge for audio and video
|
|
||||||
forwarding and relaying, configured to work with jetty instance
|
|
||||||
running embedded into Jitsi Videobridge
|
|
|
@ -1,13 +0,0 @@
|
||||||
Format: http://dep.debian.net/deps/dep5
|
|
||||||
Upstream-Name: Jitsi Meet
|
|
||||||
Upstream-Contact: Emil Ivov <emcho@jitsi.org>
|
|
||||||
Source: https://github.com/jitsi/jitsi-meet-react
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2015 Atlassian Pty Ltd
|
|
||||||
License: Apache-2.0
|
|
||||||
|
|
||||||
License: Apache-2.0
|
|
||||||
On Debian systems, the full text of the Apache
|
|
||||||
License version 2 can be found in the file
|
|
||||||
'/usr/share/common-licenses/Apache-2.0'.
|
|
|
@ -1,10 +0,0 @@
|
||||||
Jitsi Meet
|
|
||||||
|
|
||||||
====
|
|
||||||
|
|
||||||
A WebRTC-powered multi-user videochat.
|
|
||||||
|
|
||||||
Powered by the jitsi-videobridge[0]
|
|
||||||
|
|
||||||
|
|
||||||
[0] https://github.com/jitsi/jitsi-videobridge
|
|
|
@ -1,8 +0,0 @@
|
||||||
Jitsi Meet for Debian
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
This is a WebRTC frontend of the video conferencing tool Jitsi Meet. It depends on the
|
|
||||||
jitsi-videobridge package, which is a SFU (Selective Forwarding Unit) and both packages
|
|
||||||
are designed to work together.
|
|
||||||
|
|
||||||
-- Yasen Pramatarov <yasen@bluejimp.com> Mon, 30 Jun 2014 23:05:18 +0100
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
|
|
||||||
# Source debconf library.
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
# certificate type choice
|
|
||||||
db_input critical jitsi-meet/cert-choice || true
|
|
||||||
db_go
|
|
|
@ -1 +0,0 @@
|
||||||
etc/jitsi/meet/
|
|
|
@ -1,4 +0,0 @@
|
||||||
README.md
|
|
||||||
debian/jitsi-meet.example
|
|
||||||
debian/jitsi-meet-react.README
|
|
||||||
debian/config.js
|
|
|
@ -1 +0,0 @@
|
||||||
dist/* /usr/share/jitsi-meet-react
|
|
|
@ -1,200 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# postinst script for jitsi-meet
|
|
||||||
#
|
|
||||||
# see: dh_installdeb(1)
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# summary of how this script can be called:
|
|
||||||
# * <postinst> `configure' <most-recently-configured-version>
|
|
||||||
# * <old-postinst> `abort-upgrade' <new version>
|
|
||||||
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
|
||||||
# <new-version>
|
|
||||||
# * <postinst> `abort-remove'
|
|
||||||
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
|
||||||
# <failed-install-package> <version> `removing'
|
|
||||||
# <conflicting-package> <version>
|
|
||||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
|
||||||
# the debian-policy package
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
configure)
|
|
||||||
|
|
||||||
JVB_ETC_CONFIG="/etc/jitsi/videobridge/config"
|
|
||||||
|
|
||||||
. $JVB_ETC_CONFIG
|
|
||||||
|
|
||||||
# loading debconf
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
# detect dpkg-reconfigure
|
|
||||||
RECONFIGURING="false"
|
|
||||||
db_get jitsi-meet/jvb-hostname
|
|
||||||
JVB_HOSTNAME_OLD=$RET
|
|
||||||
if [ -n "$RET" ] && [ ! "$JVB_HOSTNAME_OLD" = "$JVB_HOSTNAME" ] ; then
|
|
||||||
RECONFIGURING="true"
|
|
||||||
rm -f /etc/jitsi/meet/$JVB_HOSTNAME_OLD-config.js
|
|
||||||
fi
|
|
||||||
|
|
||||||
JVB_SERVE="false"
|
|
||||||
db_get jitsi-meet/jvb-serve
|
|
||||||
if [ -n "$RET" ] && [ "$RET" = "true" ] ; then
|
|
||||||
JVB_SERVE="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# stores the hostname so we will reuse it later, like in purge
|
|
||||||
db_set jitsi-meet/jvb-hostname $JVB_HOSTNAME
|
|
||||||
|
|
||||||
NGINX_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'nginx' 2>/dev/null | awk '{print $3}' || true)"
|
|
||||||
if [ "$NGINX_INSTALL_CHECK" = "installed" ] || [ "$NGINX_INSTALL_CHECK" = "unpacked" ] ; then
|
|
||||||
FORCE_NGINX="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# SSL for nginx
|
|
||||||
db_get jitsi-meet/cert-choice
|
|
||||||
CERT_CHOICE="$RET"
|
|
||||||
UPLOADED_CERT_CHOICE="A certificate is available and the files are uploaded on the server"
|
|
||||||
|
|
||||||
# jitsi meet
|
|
||||||
JITSI_MEET_CONFIG="/etc/jitsi/meet/$JVB_HOSTNAME-config.js"
|
|
||||||
if [ ! -f $JITSI_MEET_CONFIG ] ; then
|
|
||||||
cp /usr/share/doc/jitsi-meet-react/config.js $JITSI_MEET_CONFIG
|
|
||||||
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $JITSI_MEET_CONFIG
|
|
||||||
fi
|
|
||||||
|
|
||||||
# this is new install let's configure jvb to serve meet
|
|
||||||
if [[ -z $FORCE_NGINX && ( -z $JVB_HOSTNAME_OLD || "$JVB_SERVE" = "true" ) ]] ; then
|
|
||||||
|
|
||||||
JVB_CONFIG="/etc/jitsi/videobridge/sip-communicator.properties"
|
|
||||||
|
|
||||||
# this is a reconfigure, lets just delete old links
|
|
||||||
if [ "$RECONFIGURING" = "true" ] ; then
|
|
||||||
rm -f $JVB_CONFIG
|
|
||||||
fi
|
|
||||||
|
|
||||||
# we will write to the file if missing create it
|
|
||||||
if [ ! -f $JVB_CONFIG ] ; then
|
|
||||||
touch $JVB_CONFIG
|
|
||||||
fi
|
|
||||||
|
|
||||||
# configure jvb
|
|
||||||
echo "AUTHBIND=yes" >> $JVB_ETC_CONFIG
|
|
||||||
sed -i "s/JVB_OPTS=.*/JVB_OPTS=--apis=rest,xmpp/g" $JVB_ETC_CONFIG
|
|
||||||
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.host=::" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.port=443" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.ProxyServlet.hostHeader=$JVB_HOSTNAME" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.ProxyServlet.pathSpec=/http-bind" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.ProxyServlet.proxyTo=http://localhost:5280/http-bind" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.resourceBase=/usr/share/jitsi-meet-react" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./config.js=/etc/jitsi/meet/$JVB_HOSTNAME-config.js" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.regex=^/([a-zA-Z0-9]+)$" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.replacement=/" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.SSIResourceHandler.paths=/" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.tls.port=443" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.TCP_HARVESTER_PORT=443" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.sslContextFactory.keyStorePath=/etc/jitsi/videobridge/$JVB_HOSTNAME.jks" >> $JVB_CONFIG
|
|
||||||
echo "org.jitsi.videobridge.rest.jetty.sslContextFactory.keyStorePassword=changeit" >> $JVB_CONFIG
|
|
||||||
|
|
||||||
# configure authbind to allow jvb to bind to privileged ports
|
|
||||||
OWNER=$(stat -c '%U' /usr/share/jitsi-videobridge)
|
|
||||||
GROUP=$(stat -c '%G' /usr/share/jitsi-videobridge)
|
|
||||||
JVB_UID="`id -u $OWNER`"
|
|
||||||
if [ ! -f "/etc/authbind/byport/443" ] ; then
|
|
||||||
if [ ! -d "/etc/authbind/byport" ] ; then
|
|
||||||
mkdir -p /etc/authbind/byport
|
|
||||||
chmod 755 /etc/authbind
|
|
||||||
chmod 755 /etc/authbind/byport
|
|
||||||
fi
|
|
||||||
touch /etc/authbind/byport/443
|
|
||||||
chown $OWNER /etc/authbind/byport/443
|
|
||||||
chmod 755 /etc/authbind/byport/443
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
|
|
||||||
# create jks from uploaded certs
|
|
||||||
openssl pkcs12 -export \
|
|
||||||
-in /etc/ssl/$JVB_HOSTNAME.crt \
|
|
||||||
-inkey /etc/ssl/$JVB_HOSTNAME.key \
|
|
||||||
-passout pass:changeit > /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
|
|
||||||
keytool -importkeystore \
|
|
||||||
-srckeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.p12 \
|
|
||||||
-destkeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.jks \
|
|
||||||
-srcstoretype pkcs12 \
|
|
||||||
-noprompt -storepass changeit -srcstorepass changeit
|
|
||||||
else
|
|
||||||
# create jks from self-signed certs
|
|
||||||
openssl pkcs12 -export \
|
|
||||||
-in /var/lib/prosody/$JVB_HOSTNAME.crt \
|
|
||||||
-inkey /var/lib/prosody/$JVB_HOSTNAME.key \
|
|
||||||
-passout pass:changeit > /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
|
|
||||||
keytool -importkeystore \
|
|
||||||
-srckeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.p12 \
|
|
||||||
-destkeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.jks \
|
|
||||||
-srcstoretype pkcs12 \
|
|
||||||
-noprompt -storepass changeit -srcstorepass changeit
|
|
||||||
fi
|
|
||||||
|
|
||||||
db_set jitsi-meet/jvb-serve "true"
|
|
||||||
|
|
||||||
invoke-rc.d jitsi-videobridge restart
|
|
||||||
elif [[ "$FORCE_NGINX" = "true" || ( -n $JVB_HOSTNAME_OLD && "$JVB_SERVE" = "false" ) ]] ; then
|
|
||||||
# this is a reconfigure, lets just delete old links
|
|
||||||
if [ "$RECONFIGURING" = "true" ] ; then
|
|
||||||
rm -f /etc/nginx/sites-enabled/$JVB_HOSTNAME_OLD.conf
|
|
||||||
rm -f /etc/jitsi/meet/$JVB_HOSTNAME_OLD-config.js
|
|
||||||
fi
|
|
||||||
|
|
||||||
# nginx conf
|
|
||||||
if [ ! -f /etc/nginx/sites-available/$JVB_HOSTNAME.conf ] ; then
|
|
||||||
cp /usr/share/doc/jitsi-meet-react/jitsi-meet.example /etc/nginx/sites-available/$JVB_HOSTNAME.conf
|
|
||||||
if [ ! -f /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf ] ; then
|
|
||||||
ln -s /etc/nginx/sites-available/$JVB_HOSTNAME.conf /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf
|
|
||||||
fi
|
|
||||||
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" /etc/nginx/sites-available/$JVB_HOSTNAME.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
|
|
||||||
db_set jitsi-meet/cert-path-key "/etc/ssl/$JVB_HOSTNAME.key"
|
|
||||||
db_input critical jitsi-meet/cert-path-key || true
|
|
||||||
db_go
|
|
||||||
db_get jitsi-meet/cert-path-key
|
|
||||||
CERT_KEY="$RET"
|
|
||||||
db_set jitsi-meet/cert-path-crt "/etc/ssl/$JVB_HOSTNAME.crt"
|
|
||||||
db_input critical jitsi-meet/cert-path-crt || true
|
|
||||||
db_go
|
|
||||||
db_get jitsi-meet/cert-path-crt
|
|
||||||
CERT_CRT="$RET"
|
|
||||||
# replace self-signed certificate paths with user provided ones
|
|
||||||
CERT_KEY_ESC=$(echo $CERT_KEY | sed 's/\./\\\./g')
|
|
||||||
CERT_KEY_ESC=$(echo $CERT_KEY_ESC | sed 's/\//\\\//g')
|
|
||||||
sed -i "s/ssl_certificate_key\ \/var\/lib\/prosody\/.*key/ssl_certificate_key\ $CERT_KEY_ESC/g" \
|
|
||||||
/etc/nginx/sites-available/$JVB_HOSTNAME.conf
|
|
||||||
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
|
|
||||||
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
|
|
||||||
sed -i "s/ssl_certificate\ \/var\/lib\/prosody\/.*crt/ssl_certificate\ $CERT_CRT_ESC/g" \
|
|
||||||
/etc/nginx/sites-available/$JVB_HOSTNAME.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
invoke-rc.d nginx reload
|
|
||||||
fi
|
|
||||||
|
|
||||||
# and we're done with debconf
|
|
||||||
db_stop
|
|
||||||
;;
|
|
||||||
|
|
||||||
abort-upgrade|abort-remove|abort-deconfigure)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "postinst called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# dh_installdeb will replace this with shell code automatically
|
|
||||||
# generated by other debhelper scripts.
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,58 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# postrm script for jitsi-meet
|
|
||||||
#
|
|
||||||
# see: dh_installdeb(1)
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# summary of how this script can be called:
|
|
||||||
# * <postrm> `remove'
|
|
||||||
# * <postrm> `purge'
|
|
||||||
# * <old-postrm> `upgrade' <new-version>
|
|
||||||
# * <new-postrm> `failed-upgrade' <old-version>
|
|
||||||
# * <new-postrm> `abort-install'
|
|
||||||
# * <new-postrm> `abort-install' <old-version>
|
|
||||||
# * <new-postrm> `abort-upgrade' <old-version>
|
|
||||||
# * <disappearer's-postrm> `disappear' <overwriter>
|
|
||||||
# <overwriter-version>
|
|
||||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
|
||||||
# the debian-policy package
|
|
||||||
|
|
||||||
# Load debconf
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
remove)
|
|
||||||
if [ -x "/etc/init.d/nginx" ]; then
|
|
||||||
invoke-rc.d nginx reload
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
purge)
|
|
||||||
db_get jitsi-meet/jvb-hostname
|
|
||||||
JVB_HOSTNAME=$RET
|
|
||||||
if [ -n "$RET" ]; then
|
|
||||||
rm -f /etc/jitsi/meet/$JVB_HOSTNAME-config.js
|
|
||||||
rm -f /etc/nginx/sites-available/$JVB_HOSTNAME.conf
|
|
||||||
rm -f /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf
|
|
||||||
rm -f /etc/jitsi/videobridge/$JVB_HOSTNAME.jks
|
|
||||||
rm -f /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "postrm called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# dh_installdeb will replace this with shell code automatically
|
|
||||||
# generated by other debhelper scripts.
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
db_stop
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,32 +0,0 @@
|
||||||
Template: jitsi-meet/cert-choice
|
|
||||||
Type: select
|
|
||||||
__Choices: Self-signed certificate will be generated, A certificate is available and the files are uploaded on the server
|
|
||||||
_Description: SSL certificate for the Jitsi Meet instance
|
|
||||||
Jitsi Meet is best to be set up with an SSL certificate.
|
|
||||||
Having no certificate, a self-signed one will be generated.
|
|
||||||
Having a certificate signed by a recognised CA, it can be uploaded on the server
|
|
||||||
and point its location. The default filenames will be /etc/ssl/--domain.name--.key
|
|
||||||
for the key and /etc/ssl/--domain.name--.crt for the certificate.
|
|
||||||
|
|
||||||
Template: jitsi-meet/cert-path-key
|
|
||||||
Type: string
|
|
||||||
_Description: Full local server path to the SSL key file:
|
|
||||||
The full path to the SSL key file on the server.
|
|
||||||
If it has not been uploaded, now is a good time to do so.
|
|
||||||
|
|
||||||
Template: jitsi-meet/cert-path-crt
|
|
||||||
Type: string
|
|
||||||
_Description: Full local server path to the SSL certificate file:
|
|
||||||
The full path to the SSL certificate file on the server.
|
|
||||||
If you haven't uploaded it, now is a good time to upload it in another console.
|
|
||||||
|
|
||||||
Template: jitsi-meet/jvb-hostname
|
|
||||||
Type: string
|
|
||||||
_Description: The hostname of the current installation:
|
|
||||||
The value for the hostname that is set in Jitsi Videobridge installation.
|
|
||||||
|
|
||||||
Template: jitsi-meet/jvb-serve
|
|
||||||
Type: boolean
|
|
||||||
Default: false
|
|
||||||
_Description: for internal use
|
|
||||||
for internal use.
|
|
|
@ -1,42 +0,0 @@
|
||||||
server_names_hash_bucket_size 64;
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name jitsi-meet.example.com;
|
|
||||||
return 301 https://$host$request_uri;
|
|
||||||
}
|
|
||||||
server {
|
|
||||||
listen 443 ssl;
|
|
||||||
server_name jitsi-meet.example.com;
|
|
||||||
|
|
||||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
|
||||||
ssl_prefer_server_ciphers on;
|
|
||||||
ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";
|
|
||||||
|
|
||||||
add_header Strict-Transport-Security "max-age=31536000";
|
|
||||||
|
|
||||||
ssl_certificate /var/lib/prosody/jitsi-meet.example.com.crt;
|
|
||||||
ssl_certificate_key /var/lib/prosody/jitsi-meet.example.com.key;
|
|
||||||
|
|
||||||
root /usr/share/jitsi-meet-react;
|
|
||||||
index index.html index.htm;
|
|
||||||
|
|
||||||
location /config.js {
|
|
||||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^/([a-zA-Z0-9=\?]+)$ {
|
|
||||||
rewrite ^/(.*)$ / break;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
ssi on;
|
|
||||||
}
|
|
||||||
|
|
||||||
# BOSH
|
|
||||||
location /http-bind {
|
|
||||||
proxy_pass http://localhost:5280/http-bind;
|
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
|
||||||
proxy_set_header Host $http_host;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
[type: gettext/rfc822deb] jitsi-meet.templates
|
|
|
@ -1,98 +0,0 @@
|
||||||
#
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: jitsi-meet\n"
|
|
||||||
"Report-Msgid-Bugs-To: jitsi-meet@packages.debian.org\n"
|
|
||||||
"POT-Creation-Date: 2014-09-03 17:26+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: \n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#. Type: select
|
|
||||||
#. Choices
|
|
||||||
#: ../jitsi-meet.templates:1001
|
|
||||||
msgid "Self-signed certificate will be generated"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: select
|
|
||||||
#. Choices
|
|
||||||
#: ../jitsi-meet.templates:1001
|
|
||||||
msgid "A certificate is available and the files are uploaded on the server"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: select
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:1002
|
|
||||||
msgid "SSL certificate for the Jitsi Meet instance"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: select
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:1002
|
|
||||||
msgid ""
|
|
||||||
"Jitsi Meet is best to be set up with an SSL certificate. Having no "
|
|
||||||
"certificate, a self-signed one will be generated. Having a certificate "
|
|
||||||
"signed by a recognised CA, it can be uploaded on the server and point its "
|
|
||||||
"location. The default filenames will be /etc/ssl/--domain.name--.key for the "
|
|
||||||
"key and /etc/ssl/--domain.name--.crt for the certificate."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:2001
|
|
||||||
msgid "Full local server path to the SSL key file:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:2001
|
|
||||||
msgid ""
|
|
||||||
"The full path to the SSL key file on the server. If it has not been "
|
|
||||||
"uploaded, now is a good time to do so."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:3001
|
|
||||||
msgid "Full local server path to the SSL certificate file:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:3001
|
|
||||||
msgid ""
|
|
||||||
"The full path to the SSL certificate file on the server. If you haven't "
|
|
||||||
"uploaded it, now is a good time to upload it in another console."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:4001
|
|
||||||
msgid "The hostname of the current installation:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:4001
|
|
||||||
msgid ""
|
|
||||||
"The value for the hostname that is set in Jitsi Videobridge installation."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:5001
|
|
||||||
msgid "for internal use"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. Type: string
|
|
||||||
#. Description
|
|
||||||
#: ../jitsi-meet.templates:5001
|
|
||||||
msgid ""
|
|
||||||
"Jitsi Videobridge installation can use its internal jetty to serve static meet pages."
|
|
||||||
msgstr ""
|
|
|
@ -1,14 +0,0 @@
|
||||||
#!/usr/bin/make -f
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@
|
|
||||||
|
|
||||||
# we skip making Makefile exists for updating browserify modules when developing
|
|
||||||
override_dh_auto_build:
|
|
||||||
|
|
||||||
override_dh_install:
|
|
||||||
dh_installdirs
|
|
||||||
dh_install -X/config.js -X/package.json
|
|
|
@ -1 +0,0 @@
|
||||||
3.0 (quilt)
|
|
Before Width: | Height: | Size: 3.6 KiB |
|
@ -1,139 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { Provider } from 'react-redux';
|
|
||||||
import {
|
|
||||||
browserHistory,
|
|
||||||
Route,
|
|
||||||
Router
|
|
||||||
} from 'react-router';
|
|
||||||
import { push, syncHistoryWithStore } from 'react-router-redux';
|
|
||||||
|
|
||||||
import { getDomain } from '../../base/connection';
|
|
||||||
import { RouteRegistry } from '../../base/navigator';
|
|
||||||
|
|
||||||
import { AbstractApp } from './AbstractApp';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Root application component.
|
|
||||||
*
|
|
||||||
* @extends AbstractApp
|
|
||||||
*/
|
|
||||||
export class App extends AbstractApp {
|
|
||||||
/**
|
|
||||||
* Initializes a new App instance.
|
|
||||||
*
|
|
||||||
* @param {Object} props - The read-only React Component props with which
|
|
||||||
* the new instance is to be initialized.
|
|
||||||
*/
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an enhanced history that syncs navigation events with the
|
|
||||||
* store.
|
|
||||||
* @link https://github.com/reactjs/react-router-redux#how-it-works
|
|
||||||
*/
|
|
||||||
this.history = syncHistoryWithStore(browserHistory, props.store);
|
|
||||||
|
|
||||||
// Bind event handlers so they are only bound once for every instance.
|
|
||||||
this._onRouteEnter = this._onRouteEnter.bind(this);
|
|
||||||
this._routerCreateElement = this._routerCreateElement.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const routes = RouteRegistry.getRoutes();
|
|
||||||
|
|
||||||
/* eslint-disable no-extra-parens */
|
|
||||||
return (
|
|
||||||
<Provider store = { this.props.store }>
|
|
||||||
<Router
|
|
||||||
createElement = { this._routerCreateElement }
|
|
||||||
history = { this.history }>
|
|
||||||
{ routes.map(r => (
|
|
||||||
<Route
|
|
||||||
component = { r.component }
|
|
||||||
key = { r.component }
|
|
||||||
onEnter = { this._onRouteEnter }
|
|
||||||
path = { r.path } />
|
|
||||||
)) }
|
|
||||||
</Router>
|
|
||||||
</Provider>
|
|
||||||
);
|
|
||||||
|
|
||||||
/* eslint-enable no-extra-parens */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Navigates to a specific Route (via platform-specific means).
|
|
||||||
*
|
|
||||||
* @param {Route} route - The Route to which to navigate.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
_navigate(route) {
|
|
||||||
let path = route.path;
|
|
||||||
const store = this.props.store;
|
|
||||||
|
|
||||||
// The syntax :room bellow is defined by react-router. It "matches a URL
|
|
||||||
// segment up to the next /, ?, or #. The matched string is called a
|
|
||||||
// param."
|
|
||||||
path
|
|
||||||
= path.replace(
|
|
||||||
/:room/g,
|
|
||||||
store.getState()['features/base/conference'].room);
|
|
||||||
|
|
||||||
return store.dispatch(push(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked by react-router to notify this App that a Route is about to be
|
|
||||||
* rendered.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
_onRouteEnter() {
|
|
||||||
// XXX The following is mandatory. Otherwise, moving back & forward
|
|
||||||
// through the browser's history could leave this App on the Conference
|
|
||||||
// page without a room name.
|
|
||||||
|
|
||||||
// Our Router configuration (at the time of this writing) is such that
|
|
||||||
// each Route corresponds to a single URL. Hence, entering into a Route
|
|
||||||
// is like opening a URL.
|
|
||||||
|
|
||||||
// XXX In order to unify work with URLs in web and native environments,
|
|
||||||
// we will construct URL here with correct domain from config.
|
|
||||||
const currentDomain = getDomain(this.props.store.getState);
|
|
||||||
const url
|
|
||||||
= new URL(window.location.pathname, `https://${currentDomain}`)
|
|
||||||
.toString();
|
|
||||||
|
|
||||||
this._openURL(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a ReactElement from the specified component and props on behalf of
|
|
||||||
* the associated Router.
|
|
||||||
*
|
|
||||||
* @param {Component} component - The component from which the ReactElement
|
|
||||||
* is to be created.
|
|
||||||
* @param {Object} props - The read-only React Component props with which
|
|
||||||
* the ReactElement is to be initialized.
|
|
||||||
* @private
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
_routerCreateElement(component, props) {
|
|
||||||
return this._createElement(component, props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* App component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
App.propTypes = AbstractApp.propTypes;
|
|
|
@ -21,7 +21,15 @@ import './_';
|
||||||
|
|
||||||
// Re-export JitsiMeetJS from the library lib-jitsi-meet to (the other features
|
// Re-export JitsiMeetJS from the library lib-jitsi-meet to (the other features
|
||||||
// of) the project jitsi-meet-react.
|
// of) the project jitsi-meet-react.
|
||||||
import JitsiMeetJS from 'lib-jitsi-meet';
|
//
|
||||||
|
// TODO The Web support implemented by the jitsi-meet project explicitly uses
|
||||||
|
// the library lib-jitsi-meet as a binary and keeps it out of the application
|
||||||
|
// bundle. The mobile support implemented by the jitsi-meet-react project did
|
||||||
|
// not get to keeping the lib-jitsi-meet library out of the application bundle
|
||||||
|
// and even used it from source. As an intermediate step, start using the
|
||||||
|
// library lib-jitsi-meet as a binary on mobile at the time of this writing. In
|
||||||
|
// the future, implement not packaging it in the application bundle.
|
||||||
|
import JitsiMeetJS from 'lib-jitsi-meet/lib-jitsi-meet.min';
|
||||||
|
|
||||||
export { JitsiMeetJS as default };
|
export { JitsiMeetJS as default };
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './web';
|
|
|
@ -1,50 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The React equivalent of Web's audio element.
|
|
||||||
*
|
|
||||||
* @extends Component
|
|
||||||
*/
|
|
||||||
export class Audio extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
// TODO URL.releaseObjectURL on componentDid/WillUnmount
|
|
||||||
const src = this.props.stream
|
|
||||||
? URL.createObjectURL(this.props.stream)
|
|
||||||
: '';
|
|
||||||
|
|
||||||
return (
|
|
||||||
<audio
|
|
||||||
autoPlay = { true }
|
|
||||||
muted = { this.props.muted }
|
|
||||||
src = { src } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements shouldComponentUpdate of React Component. We don't update
|
|
||||||
* component if stream has not changed.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @param {Object} nextProps - Props that component is going to receive.
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
shouldComponentUpdate(nextProps) {
|
|
||||||
return (nextProps.stream || {}).id !== (this.props.stream || {}).id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Audio component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
Audio.propTypes = {
|
|
||||||
muted: React.PropTypes.bool,
|
|
||||||
stream: React.PropTypes.object
|
|
||||||
};
|
|
|
@ -1,68 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web version of Audio component.
|
|
||||||
* @extends Component
|
|
||||||
*/
|
|
||||||
export class Video extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement|null}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const stream = this.props.stream;
|
|
||||||
|
|
||||||
if (stream) {
|
|
||||||
// TODO URL.releaseObjectURL on componentDid/WillUnmount
|
|
||||||
const src = URL.createObjectURL(stream);
|
|
||||||
const style
|
|
||||||
= this.props.mirror ? styles.mirroredVideo : styles.video;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<video
|
|
||||||
autoPlay = { true }
|
|
||||||
muted = { this.props.muted }
|
|
||||||
onPlaying = { this.props.onPlaying }
|
|
||||||
src = { src }
|
|
||||||
style = { style } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements shouldComponentUpdate of React Component. We don't update
|
|
||||||
* component if stream has not changed.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @param {Object} nextProps - Props that component is going to receive.
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
shouldComponentUpdate(nextProps) {
|
|
||||||
return (nextProps.stream || {}).id !== (this.props.stream || {}).id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Video component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
Video.propTypes = {
|
|
||||||
mirror: React.PropTypes.bool,
|
|
||||||
muted: React.PropTypes.bool,
|
|
||||||
onPlaying: React.PropTypes.func,
|
|
||||||
stream: React.PropTypes.object,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Not used on Web. Introduced for the benefit of React Native. For more
|
|
||||||
* details, refer to the zOrder property of the Video class for React
|
|
||||||
* Native (i.e. ../native/Video.js).
|
|
||||||
*/
|
|
||||||
zOrder: React.PropTypes.number
|
|
||||||
};
|
|
|
@ -1,20 +0,0 @@
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import { AbstractVideoTrack } from '../AbstractVideoTrack';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Component that renders video element for a specified video track.
|
|
||||||
*
|
|
||||||
* @extends AbstractVideoTrack
|
|
||||||
*/
|
|
||||||
class VideoTrack extends AbstractVideoTrack {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* VideoTrack component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
VideoTrack.propTypes = AbstractVideoTrack.propTypes;
|
|
||||||
|
|
||||||
export default connect()(VideoTrack);
|
|
|
@ -1,3 +0,0 @@
|
||||||
export * from './Audio';
|
|
||||||
export * from './Video';
|
|
||||||
export { default as VideoTrack } from './VideoTrack';
|
|
|
@ -1,24 +0,0 @@
|
||||||
/**
|
|
||||||
* Make video element fill its container.
|
|
||||||
*/
|
|
||||||
const video = {
|
|
||||||
flex: 1,
|
|
||||||
objectFit: 'cover',
|
|
||||||
width: '100%'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transform local videos to behave like a mirror.
|
|
||||||
*/
|
|
||||||
const mirroredVideo = {
|
|
||||||
...video,
|
|
||||||
transform: 'scaleX(-1)'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web-specific styles for media components.
|
|
||||||
*/
|
|
||||||
export const styles = {
|
|
||||||
mirroredVideo,
|
|
||||||
video
|
|
||||||
};
|
|
|
@ -1,43 +0,0 @@
|
||||||
import { stopEventPropagation } from '../functions';
|
|
||||||
import AbstractContainer from './AbstractContainer';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a container of React Component children with a style.
|
|
||||||
*
|
|
||||||
* @extends AbstractContainer
|
|
||||||
*/
|
|
||||||
export class Container extends AbstractContainer {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
// eslint-disable-next-line prefer-const
|
|
||||||
let { onClick, style, visible, ...props } = this.props;
|
|
||||||
|
|
||||||
// visible
|
|
||||||
if (typeof visible !== 'undefined' && !visible) {
|
|
||||||
style = {
|
|
||||||
...style,
|
|
||||||
display: 'none'
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// onClick
|
|
||||||
(typeof onClick === 'function')
|
|
||||||
&& (props.onClick = stopEventPropagation(onClick));
|
|
||||||
|
|
||||||
// eslint-disable-next-line object-property-newline
|
|
||||||
return this._render('div', { ...props, style });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Container component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
Container.propTypes = AbstractContainer.propTypes;
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './web';
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './styles';
|
|
|
@ -1 +0,0 @@
|
||||||
require('style!./FontAwesome.css');
|
|
|
@ -1,23 +0,0 @@
|
||||||
/**
|
|
||||||
* Shim style properties to work correctly on Web.
|
|
||||||
*
|
|
||||||
* Some generic properties used by react-native for styling require additional
|
|
||||||
* style fields to be included in order to work on Web. For example, setting the
|
|
||||||
* `flex` property to control the flexbox layout also requires setting the
|
|
||||||
* `display` property to `flexbox` for the `flex` style to take effect.
|
|
||||||
*
|
|
||||||
* Using this shimStyles method allows us to minimize the number of style
|
|
||||||
* declarations that need to be set or overridden for specific platforms.
|
|
||||||
*
|
|
||||||
* @param {Object} styles - A dictionary of named style definitions.
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
export function shimStyles(styles) {
|
|
||||||
// The flexbox layout must be explicitly chosen on Web by assigning flex to
|
|
||||||
// display. This way the React Native styles can be reused on Web.
|
|
||||||
if (styles.flex) {
|
|
||||||
styles.display = 'flex';
|
|
||||||
}
|
|
||||||
|
|
||||||
return styles;
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/**
|
|
||||||
* Loads a script from a specific source. This is an extended version of
|
|
||||||
* loadScript method from ScriptUtil in lib-jitsi-meet.
|
|
||||||
*
|
|
||||||
* @param {string} src - The source from the which the script is to be
|
|
||||||
* (down)loaded. Can be absolute or relative URL.
|
|
||||||
* @param {Object} options - Additional options.
|
|
||||||
* @param {boolean} options.async=true - True to asynchronously load the script
|
|
||||||
* or false to synchronously load the script.
|
|
||||||
* @param {boolean} options.prepend=false - True to schedule the loading of the
|
|
||||||
* script as soon as possible or false to schedule the loading of the script at
|
|
||||||
* the end of the scripts known at the time.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
export function loadScript(
|
|
||||||
src,
|
|
||||||
options = {
|
|
||||||
async: true,
|
|
||||||
prepend: false
|
|
||||||
}) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const d = document;
|
|
||||||
const tagName = 'script';
|
|
||||||
const script = d.createElement(tagName);
|
|
||||||
const referenceNode = d.getElementsByTagName(tagName)[0];
|
|
||||||
|
|
||||||
let scriptSource = src;
|
|
||||||
|
|
||||||
if (isRelativeURL(src)) {
|
|
||||||
// Find the src URL of the current loaded script and use it as the
|
|
||||||
// base of the specified src (argument).
|
|
||||||
const scriptEl = document.currentScript;
|
|
||||||
|
|
||||||
if (scriptEl) {
|
|
||||||
const scriptSrc = scriptEl.src;
|
|
||||||
const baseScriptSrc
|
|
||||||
= scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);
|
|
||||||
|
|
||||||
if (scriptSrc && baseScriptSrc) {
|
|
||||||
scriptSource = new URL(src, baseScriptSrc).toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
script.async = Boolean(options.async);
|
|
||||||
script.onerror = reject;
|
|
||||||
script.onload = resolve;
|
|
||||||
script.src = scriptSource;
|
|
||||||
|
|
||||||
if (referenceNode) {
|
|
||||||
if (options.prepend) {
|
|
||||||
referenceNode.parentNode.insertBefore(script, referenceNode);
|
|
||||||
} else {
|
|
||||||
referenceNode.parentNode.appendChild(script);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const head = d.getElementsByTagName('head')[0];
|
|
||||||
|
|
||||||
head.appendChild(script);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if passed URL is relative or not.
|
|
||||||
*
|
|
||||||
* @param {string} url - URL.
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
function isRelativeURL(url) {
|
|
||||||
let relative;
|
|
||||||
|
|
||||||
// XXX If the specified value is an absolute URL, then an URL object will be
|
|
||||||
// correctly initialized from it. Otherwise, an exception will be thrown and
|
|
||||||
// we will treat the specified value as a relative URL.
|
|
||||||
try {
|
|
||||||
new URL(url); // eslint-disable-line no-new
|
|
||||||
relative = false;
|
|
||||||
} catch (ex) {
|
|
||||||
relative = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return relative;
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display a participant avatar.
|
|
||||||
*/
|
|
||||||
export default class Avatar extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const style = {
|
|
||||||
|
|
||||||
// XXX Avatar is expected to display the whole image.
|
|
||||||
objectFit: 'contain',
|
|
||||||
|
|
||||||
...styles.avatar,
|
|
||||||
...this.props.style
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<img
|
|
||||||
src = { this.props.uri }
|
|
||||||
style = { style } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Avatar component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
Avatar.propTypes = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The optional style to add to an Avatar in order to customize its base
|
|
||||||
* look (and feel).
|
|
||||||
*/
|
|
||||||
style: React.PropTypes.object,
|
|
||||||
uri: React.PropTypes.string
|
|
||||||
};
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './web';
|
|
|
@ -1,22 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import Icon from 'react-fontawesome';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thumbnail badge for displaying the audio mute status of a participant.
|
|
||||||
*/
|
|
||||||
export class AudioMutedIndicator extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<Icon
|
|
||||||
name = 'microphone-slash'
|
|
||||||
style = { styles.audioMutedIndicator } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import Icon from 'react-fontawesome';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thumbnail badge showing that the participant is the dominant speaker in
|
|
||||||
* the conference.
|
|
||||||
*/
|
|
||||||
export class DominantSpeakerIndicator extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div style = { styles.dominantSpeakerIndicatorBackground }>
|
|
||||||
<Icon
|
|
||||||
name = 'bullhorn'
|
|
||||||
style = { styles.dominantSpeakerIndicator } />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import Icon from 'react-fontawesome';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thumbnail badge showing that the participant is a conference moderator.
|
|
||||||
*/
|
|
||||||
export class ModeratorIndicator extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<Icon
|
|
||||||
name = 'star'
|
|
||||||
style = { styles.moderatorIndicator } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
import React, { Component } from 'react';
|
|
||||||
import Icon from 'react-fontawesome';
|
|
||||||
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thumbnail badge for displaying the video mute status of a participant.
|
|
||||||
*/
|
|
||||||
export class VideoMutedIndicator extends Component {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
// TODO: This should use video-camera-slash, but that doesn't exist in
|
|
||||||
// the fontawesome icon set yet.
|
|
||||||
return (
|
|
||||||
<Icon
|
|
||||||
name = 'eye-slash'
|
|
||||||
style = { styles.videoMutedIndicator } />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
export * from './AudioMutedIndicator';
|
|
||||||
export * from './DominantSpeakerIndicator';
|
|
||||||
export * from './ModeratorIndicator';
|
|
||||||
export * from './styles';
|
|
||||||
export * from './VideoMutedIndicator';
|
|
|
@ -1,46 +0,0 @@
|
||||||
import { createStyleSheet } from '../../../base/styles';
|
|
||||||
|
|
||||||
import { styles as platformIndependentStyles } from '../styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web-specific styles for the film strip.
|
|
||||||
*/
|
|
||||||
export const styles = createStyleSheet(platformIndependentStyles, {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Audio muted indicator style.
|
|
||||||
*/
|
|
||||||
audioMutedIndicator: {
|
|
||||||
textShadow: '1px 1px 2px black'
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dominant speaker indicator background style.
|
|
||||||
*/
|
|
||||||
dominantSpeakerIndicatorBackground: {
|
|
||||||
height: 15,
|
|
||||||
width: 15
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Moderator indicator style.
|
|
||||||
*/
|
|
||||||
moderatorIndicator: {
|
|
||||||
textShadow: '1px 1px 2px black'
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Video thumbnail style.
|
|
||||||
*/
|
|
||||||
thumbnail: {
|
|
||||||
height: 120,
|
|
||||||
width: 120
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Video muted indicator style.
|
|
||||||
*/
|
|
||||||
videoMutedIndicator: {
|
|
||||||
textShadow: '1px 1px 2px black'
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,89 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import { MEDIA_TYPE } from '../../base/media';
|
|
||||||
import { Container } from '../../base/react';
|
|
||||||
import { ColorPalette } from '../../base/styles';
|
|
||||||
|
|
||||||
import {
|
|
||||||
AbstractToolbar,
|
|
||||||
mapStateToProps
|
|
||||||
} from './AbstractToolbar';
|
|
||||||
import { styles } from './styles';
|
|
||||||
import ToolbarButton from './ToolbarButton';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements the conference toolbar on Web.
|
|
||||||
*
|
|
||||||
* @extends AbstractToolbar
|
|
||||||
*/
|
|
||||||
class Toolbar extends AbstractToolbar {
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const audioButtonStyles = this._getMuteButtonStyles(MEDIA_TYPE.AUDIO);
|
|
||||||
const videoButtonStyles = this._getMuteButtonStyles(MEDIA_TYPE.VIDEO);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Container
|
|
||||||
style = { styles.toolbarContainer }
|
|
||||||
visible = { this.props.visible }>
|
|
||||||
|
|
||||||
<div style = { styles.toolbarButtonsContainer }>
|
|
||||||
<ToolbarButton
|
|
||||||
iconName = { audioButtonStyles.iconName }
|
|
||||||
iconStyle = { audioButtonStyles.iconStyle }
|
|
||||||
|
|
||||||
// eslint-disable-next-line react/jsx-handler-names
|
|
||||||
onClick = { this._toggleAudio }
|
|
||||||
style = { audioButtonStyles.buttonStyle } />
|
|
||||||
<ToolbarButton
|
|
||||||
iconName = 'phone'
|
|
||||||
iconStyle = { styles.icon }
|
|
||||||
onClick = { this._onHangup }
|
|
||||||
style = {{
|
|
||||||
...styles.toolbarButton,
|
|
||||||
backgroundColor: ColorPalette.jitsiRed
|
|
||||||
}} />
|
|
||||||
<ToolbarButton
|
|
||||||
iconName = { videoButtonStyles.iconName }
|
|
||||||
iconStyle = { videoButtonStyles.iconStyle }
|
|
||||||
|
|
||||||
// eslint-disable-next-line react/jsx-handler-names
|
|
||||||
onClick = { this._toggleVideo }
|
|
||||||
style = { videoButtonStyles.buttonStyle } />
|
|
||||||
</div>
|
|
||||||
</Container>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Additional properties for various icons, which are now platform-dependent.
|
|
||||||
* This is done to have common logic of generating styles for web and native.
|
|
||||||
* TODO As soon as we have common font sets for web and native, this will no
|
|
||||||
* longer be required.
|
|
||||||
*/
|
|
||||||
Object.assign(Toolbar.prototype, {
|
|
||||||
audioIcon: 'microphone',
|
|
||||||
audioMutedIcon: 'microphone-slash',
|
|
||||||
videoIcon: 'video-camera',
|
|
||||||
|
|
||||||
// TODO Currently, for web version we're using default FontAwesome font set,
|
|
||||||
// which doesn't have 'slashed' version of 'video-camera' icon. But this
|
|
||||||
// should be changed as soon as we start to use custom Jitsi icons.
|
|
||||||
videoMutedIcon: 'video-camera'
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toolbar component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
Toolbar.propTypes = AbstractToolbar.propTypes;
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(Toolbar);
|
|
|
@ -1,47 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import Icon from 'react-fontawesome';
|
|
||||||
|
|
||||||
import { stopEventPropagation } from '../../base/react';
|
|
||||||
|
|
||||||
import AbstractToolbarButton from './AbstractToolbarButton';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a button in Toolbar on Web.
|
|
||||||
*
|
|
||||||
* @extends AbstractToolbarButton
|
|
||||||
*/
|
|
||||||
export default class ToolbarButton extends AbstractToolbarButton {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the button of this Toolbar button.
|
|
||||||
*
|
|
||||||
* @param {Object} children - The children, if any, to be rendered inside
|
|
||||||
* the button. Presumably, contains the icon of this Toolbar button.
|
|
||||||
* @protected
|
|
||||||
* @returns {ReactElement} The button of this Toolbar button.
|
|
||||||
*/
|
|
||||||
_renderButton(children) {
|
|
||||||
const props = {};
|
|
||||||
|
|
||||||
'onClick' in this.props
|
|
||||||
&& (props.onClick = stopEventPropagation(this.props.onClick));
|
|
||||||
'style' in this.props && (props.style = this.props.style);
|
|
||||||
|
|
||||||
return React.createElement('button', props, children);
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line valid-jsdoc
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
_renderIcon() {
|
|
||||||
return super._renderIcon(Icon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ToolbarButton component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
ToolbarButton.propTypes = AbstractToolbarButton.propTypes;
|
|
|
@ -1,53 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import {
|
|
||||||
AbstractWelcomePage,
|
|
||||||
mapStateToProps
|
|
||||||
} from './AbstractWelcomePage';
|
|
||||||
import { styles } from './styles';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The web container rendering the welcome page.
|
|
||||||
*
|
|
||||||
* @extends AbstractWelcomePage
|
|
||||||
*/
|
|
||||||
class WelcomePage extends AbstractWelcomePage {
|
|
||||||
/**
|
|
||||||
* Renders a prompt for entering a room name.
|
|
||||||
*
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
/* eslint-disable react/jsx-no-bind */
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div style = { styles.container }>
|
|
||||||
{ this._renderLocalVideo() }
|
|
||||||
<div style = { styles.roomContainer }>
|
|
||||||
<p style = { styles.title }>Enter room name</p>
|
|
||||||
<input
|
|
||||||
onChange = { ev => this._onRoomChange(ev.target.value) }
|
|
||||||
style = { styles.textInput }
|
|
||||||
type = 'text'
|
|
||||||
value = { this.state.room || '' } />
|
|
||||||
<button
|
|
||||||
disabled = { this._isJoinDisabled() }
|
|
||||||
onClick = { this._onJoinClick }
|
|
||||||
style = { styles.button }>JOIN</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
/* eslint-enable react/jsx-no-bind */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* WelcomePage component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
WelcomePage.propTypes = AbstractWelcomePage.propTypes;
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(WelcomePage);
|
|
|
@ -1,10 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
||||||
<title>Jitsi Meet</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './index.native';
|
|
|
@ -1 +0,0 @@
|
||||||
export * from './index.native';
|
|