Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

WelcomePage.web.js 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /* global $, APP, interfaceConfig */
  2. import React from 'react';
  3. import { connect } from 'react-redux';
  4. import { Watermarks } from '../../base/react';
  5. import { AbstractWelcomePage, _mapStateToProps } from './AbstractWelcomePage';
  6. /* eslint-disable require-jsdoc */
  7. /**
  8. * The Web container rendering the welcome page.
  9. *
  10. * @extends AbstractWelcomePage
  11. */
  12. class WelcomePage extends AbstractWelcomePage {
  13. /* eslint-enable require-jsdoc */
  14. /**
  15. * Initializes a new WelcomePage instance.
  16. *
  17. * @param {Object} props - The read-only properties with which the new
  18. * instance is to be initialized.
  19. */
  20. constructor(props) {
  21. super(props);
  22. this.state = {
  23. ...this.state,
  24. enableWelcomePage: true,
  25. generateRoomnames:
  26. interfaceConfig.GENERATE_ROOMNAMES_ON_WELCOME_PAGE
  27. };
  28. // Bind event handlers so they are only bound once for every instance.
  29. this._onDisableWelcomeChange = this._onDisableWelcomeChange.bind(this);
  30. this._onKeyDown = this._onKeyDown.bind(this);
  31. this._onRoomChange = this._onRoomChange.bind(this);
  32. }
  33. /**
  34. * This method is executed when comonent is mounted.
  35. *
  36. * @inheritdoc
  37. * @returns {void}
  38. */
  39. componentDidMount() {
  40. if (this.state.generateRoomnames) {
  41. this._updateRoomname();
  42. }
  43. // XXX Temporary solution until we add React translation.
  44. APP.translation.translateElement($('#welcome_page'));
  45. }
  46. /**
  47. * Implements React's {@link Component#render()}.
  48. *
  49. * @inheritdoc
  50. * @returns {ReactElement|null}
  51. */
  52. render() {
  53. return (
  54. <div id = 'welcome_page'>
  55. {
  56. this._renderHeader()
  57. }
  58. {
  59. this._renderMain()
  60. }
  61. </div>
  62. );
  63. }
  64. /**
  65. * Returns the domain name.
  66. *
  67. * @private
  68. * @returns {string} Domain name.
  69. */
  70. _getDomain() {
  71. return `${window.location.protocol}//${window.location.host}/`;
  72. }
  73. /**
  74. * Handles <tt>change</tt> event of the checkbox which allows specifying
  75. * whether the WelcomePage is disabled.
  76. *
  77. * @param {Event} event - The (HTML) Event which details the change such as
  78. * the EventTarget.
  79. * @returns {void}
  80. */
  81. _onDisableWelcomeChange(event) {
  82. this.setState({
  83. enableWelcomePage: !event.target.checked
  84. }, () => {
  85. APP.settings.setWelcomePageEnabled(this.state.enableWelcomePage);
  86. });
  87. }
  88. /**
  89. * Handles 'keydown' event to initiate joining the room when the
  90. * 'Enter/Return' button is pressed.
  91. *
  92. * @param {Event} event - Key down event object.
  93. * @private
  94. * @returns {void}
  95. */
  96. _onKeyDown(event) {
  97. if (event.keyCode === /* Enter */ 13) {
  98. this._onJoin();
  99. }
  100. }
  101. /**
  102. * Overrides the super to account for the differences in the argument types
  103. * provided by HTML and React Native text inputs.
  104. *
  105. * @inheritdoc
  106. * @override
  107. * @param {Event} event - The (HTML) Event which details the change such as
  108. * the EventTarget.
  109. * @protected
  110. */
  111. _onRoomChange(event) {
  112. super._onRoomChange(event.target.value);
  113. }
  114. /**
  115. * Renders a feature with a specific index.
  116. *
  117. * @param {number} index - The index of the feature to render.
  118. * @private
  119. * @returns {ReactElement}
  120. */
  121. _renderFeature(index) {
  122. return (
  123. <div className = 'feature_holder'>
  124. <div
  125. className = 'feature_icon'
  126. data-i18n = { `welcomepage.feature${index}.title` } />
  127. <div
  128. className = 'feature_description'
  129. data-i18n = { `welcomepage.feature${index}.content` }
  130. data-i18n-options = { JSON.stringify({
  131. postProcess: 'resolveAppName'
  132. }) } />
  133. </div>
  134. );
  135. }
  136. /**
  137. * Renders a row of features.
  138. *
  139. * @param {number} beginIndex - The inclusive feature index to begin the row
  140. * with.
  141. * @param {number} endIndex - The exclusive feature index to end the row
  142. * with.
  143. * @private
  144. * @returns {ReactElement}
  145. */
  146. _renderFeatureRow(beginIndex, endIndex) {
  147. const features = [];
  148. for (let index = beginIndex; index < endIndex; ++index) {
  149. features.push(this._renderFeature(index));
  150. }
  151. return (
  152. <div className = 'feature_row'>
  153. {
  154. features
  155. }
  156. </div>
  157. );
  158. }
  159. /* eslint-disable require-jsdoc */
  160. /**
  161. * Renders the header part of this WelcomePage.
  162. *
  163. * @private
  164. * @returns {ReactElement|null}
  165. */
  166. _renderHeader() {
  167. /* eslint-enable require-jsdoc */
  168. return (
  169. <div id = 'welcome_page_header'>
  170. <Watermarks />
  171. <div id = 'enter_room_container'>
  172. <div id = 'enter_room_form'>
  173. <div className = 'domain-name'>
  174. {
  175. this._getDomain()
  176. }
  177. </div>
  178. <div id = 'enter_room'>
  179. <input
  180. autoFocus = { true }
  181. className = 'enter-room__field'
  182. data-room-name
  183. = { this.state.generatedRoomname }
  184. id = 'enter_room_field'
  185. onChange = { this._onRoomChange }
  186. onKeyDown = { this._onKeyDown }
  187. placeholder = { this.state.roomPlaceholder }
  188. type = 'text'
  189. value = { this.state.room } />
  190. { /* eslint-disable react/jsx-handler-names */ }
  191. <div
  192. className = 'icon-reload enter-room__reload'
  193. onClick = { this._updateRoomname } />
  194. { /* eslint-enable react/jsx-handler-names */ }
  195. <button
  196. className = 'enter-room__button'
  197. data-i18n = 'welcomepage.go'
  198. id = 'enter_room_button'
  199. onClick = { this._onJoin }
  200. type = 'button' />
  201. </div>
  202. </div>
  203. </div>
  204. <div id = 'brand_header' />
  205. <input
  206. checked = { !this.state.enableWelcomePage }
  207. id = 'disable_welcome'
  208. name = 'checkbox'
  209. onChange = { this._onDisableWelcomeChange }
  210. type = 'checkbox' />
  211. <label
  212. className = 'disable_welcome_position'
  213. data-i18n = 'welcomepage.disable'
  214. htmlFor = 'disable_welcome' />
  215. <div id = 'header_text' />
  216. </div>
  217. );
  218. }
  219. /**
  220. * Renders the main part of this WelcomePage.
  221. *
  222. * @private
  223. * @returns {ReactElement|null}
  224. */
  225. _renderMain() {
  226. return (
  227. <div id = 'welcome_page_main'>
  228. <div id = 'features'>
  229. {
  230. this._renderFeatureRow(1, 5)
  231. }
  232. {
  233. this._renderFeatureRow(5, 9)
  234. }
  235. </div>
  236. </div>
  237. );
  238. }
  239. }
  240. export default connect(_mapStateToProps)(WelcomePage);