Merge pull request #6412 from matrix-org/gsouqet/ts-migration-1
						commit
						ae60692e88
					
				|  | @ -15,8 +15,10 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../../index'; | ||||
| import PropTypes from 'prop-types'; | ||||
| 
 | ||||
| import BaseDialog from "../../../../components/views/dialogs/BaseDialog"; | ||||
| import Spinner from "../../../../components/views/elements/Spinner"; | ||||
| import DialogButtons from "../../../../components/views/elements/DialogButtons"; | ||||
| import dis from "../../../../dispatcher/dispatcher"; | ||||
| import { _t } from '../../../../languageHandler'; | ||||
| 
 | ||||
|  | @ -24,46 +26,44 @@ import SettingsStore from "../../../../settings/SettingsStore"; | |||
| import EventIndexPeg from "../../../../indexing/EventIndexPeg"; | ||||
| import { Action } from "../../../../dispatcher/actions"; | ||||
| import { SettingLevel } from "../../../../settings/SettingLevel"; | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
| } | ||||
| 
 | ||||
| interface IState { | ||||
|     disabling: boolean; | ||||
| } | ||||
| 
 | ||||
| /* | ||||
|  * Allows the user to disable the Event Index. | ||||
|  */ | ||||
| export default class DisableEventIndexDialog extends React.Component { | ||||
|     static propTypes = { | ||||
|         onFinished: PropTypes.func.isRequired, | ||||
|     } | ||||
| 
 | ||||
|     constructor(props) { | ||||
| export default class DisableEventIndexDialog extends React.Component<IProps, IState> { | ||||
|     constructor(props: IProps) { | ||||
|         super(props); | ||||
| 
 | ||||
|         this.state = { | ||||
|             disabling: false, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     _onDisable = async () => { | ||||
|     private onDisable = async (): Promise<void> => { | ||||
|         this.setState({ | ||||
|             disabling: true, | ||||
|         }); | ||||
| 
 | ||||
|         await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); | ||||
|         await EventIndexPeg.deleteEventIndex(); | ||||
|         this.props.onFinished(); | ||||
|         this.props.onFinished(true); | ||||
|         dis.fire(Action.ViewUserSettings); | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|     }; | ||||
| 
 | ||||
|     public render(): React.ReactNode { | ||||
|         return ( | ||||
|             <BaseDialog onFinished={this.props.onFinished} title={_t("Are you sure?")}> | ||||
|                 { _t("If disabled, messages from encrypted rooms won't appear in search results.") } | ||||
|                 { this.state.disabling ? <Spinner /> : <div /> } | ||||
|                 <DialogButtons | ||||
|                     primaryButton={_t('Disable')} | ||||
|                     onPrimaryButtonClick={this._onDisable} | ||||
|                     onPrimaryButtonClick={this.onDisable} | ||||
|                     primaryButtonClass="danger" | ||||
|                     cancelButtonClass="warning" | ||||
|                     onCancel={this.props.onFinished} | ||||
|  | @ -134,8 +134,9 @@ export default class ManageEventIndexDialog extends React.Component<IProps, ISta | |||
|     } | ||||
| 
 | ||||
|     private onDisable = async () => { | ||||
|         Modal.createTrackedDialogAsync("Disable message search", "Disable message search", | ||||
|             import("./DisableEventIndexDialog"), | ||||
|         const DisableEventIndexDialog = (await import("./DisableEventIndexDialog")).default; | ||||
|         Modal.createTrackedDialog("Disable message search", "Disable message search", | ||||
|             DisableEventIndexDialog, | ||||
|             null, null, /* priority = */ false, /* static = */ true, | ||||
|         ); | ||||
|     }; | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; | |||
| 
 | ||||
| @replaceableComponent("views.auth.AuthBody") | ||||
| export default class AuthBody extends React.PureComponent { | ||||
|     render() { | ||||
|     public render(): React.ReactNode { | ||||
|         return <div className="mx_AuthBody"> | ||||
|             { this.props.children } | ||||
|         </div>; | ||||
|  | @ -22,7 +22,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; | |||
| 
 | ||||
| @replaceableComponent("views.auth.AuthFooter") | ||||
| export default class AuthFooter extends React.Component { | ||||
|     render() { | ||||
|     public render(): React.ReactNode { | ||||
|         return ( | ||||
|             <div className="mx_AuthFooter"> | ||||
|                 <a href="https://matrix.org" target="_blank" rel="noreferrer noopener">{ _t("powered by Matrix") }</a> | ||||
|  | @ -16,20 +16,17 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import AuthHeaderLogo from "./AuthHeaderLogo"; | ||||
| import LanguageSelector from "./LanguageSelector"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     disableLanguageSelector?: boolean; | ||||
| } | ||||
| 
 | ||||
| @replaceableComponent("views.auth.AuthHeader") | ||||
| export default class AuthHeader extends React.Component { | ||||
|     static propTypes = { | ||||
|         disableLanguageSelector: PropTypes.bool, | ||||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const AuthHeaderLogo = sdk.getComponent('auth.AuthHeaderLogo'); | ||||
|         const LanguageSelector = sdk.getComponent('views.auth.LanguageSelector'); | ||||
| 
 | ||||
| export default class AuthHeader extends React.Component<IProps> { | ||||
|     public render(): React.ReactNode { | ||||
|         return ( | ||||
|             <div className="mx_AuthHeader"> | ||||
|                 <AuthHeaderLogo /> | ||||
|  | @ -19,7 +19,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; | |||
| 
 | ||||
| @replaceableComponent("views.auth.AuthHeaderLogo") | ||||
| export default class AuthHeaderLogo extends React.PureComponent { | ||||
|     render() { | ||||
|     public render(): React.ReactNode { | ||||
|         return <div className="mx_AuthHeaderLogo"> | ||||
|             Matrix | ||||
|         </div>; | ||||
|  | @ -17,14 +17,12 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import AuthFooter from "./AuthFooter"; | ||||
| 
 | ||||
| @replaceableComponent("views.auth.AuthPage") | ||||
| export default class AuthPage extends React.PureComponent { | ||||
|     render() { | ||||
|         const AuthFooter = sdk.getComponent('auth.AuthFooter'); | ||||
| 
 | ||||
|     public render(): React.ReactNode { | ||||
|         return ( | ||||
|             <div className="mx_AuthPage"> | ||||
|                 <div className="mx_AuthPage_modal"> | ||||
|  | @ -19,7 +19,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; | |||
| 
 | ||||
| @replaceableComponent("views.auth.CompleteSecurityBody") | ||||
| export default class CompleteSecurityBody extends React.PureComponent { | ||||
|     render() { | ||||
|     public render(): React.ReactNode { | ||||
|         return <div className="mx_CompleteSecurityBody"> | ||||
|             { this.props.children } | ||||
|         </div>; | ||||
|  | @ -15,21 +15,19 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| 
 | ||||
| import { COUNTRIES, getEmojiFlag } from '../../../phonenumber'; | ||||
| import { COUNTRIES, getEmojiFlag, PhoneNumberCountryDefinition } from '../../../phonenumber'; | ||||
| import SdkConfig from "../../../SdkConfig"; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import Dropdown from "../elements/Dropdown"; | ||||
| 
 | ||||
| const COUNTRIES_BY_ISO2 = {}; | ||||
| for (const c of COUNTRIES) { | ||||
|     COUNTRIES_BY_ISO2[c.iso2] = c; | ||||
| } | ||||
| 
 | ||||
| function countryMatchesSearchQuery(query, country) { | ||||
| function countryMatchesSearchQuery(query: string, country: PhoneNumberCountryDefinition): boolean { | ||||
|     // Remove '+' if present (when searching for a prefix)
 | ||||
|     if (query[0] === '+') { | ||||
|         query = query.slice(1); | ||||
|  | @ -41,15 +39,26 @@ function countryMatchesSearchQuery(query, country) { | |||
|     return false; | ||||
| } | ||||
| 
 | ||||
| @replaceableComponent("views.auth.CountryDropdown") | ||||
| export default class CountryDropdown extends React.Component { | ||||
|     constructor(props) { | ||||
|         super(props); | ||||
|         this._onSearchChange = this._onSearchChange.bind(this); | ||||
|         this._onOptionChange = this._onOptionChange.bind(this); | ||||
|         this._getShortOption = this._getShortOption.bind(this); | ||||
| interface IProps { | ||||
|     value?: string; | ||||
|     onOptionChange: (country: PhoneNumberCountryDefinition) => void; | ||||
|     isSmall: boolean; // if isSmall, show +44 in the selected value
 | ||||
|     showPrefix: boolean; | ||||
|     className?: string; | ||||
|     disabled?: boolean; | ||||
| } | ||||
| 
 | ||||
|         let defaultCountry = COUNTRIES[0]; | ||||
| interface IState { | ||||
|     searchQuery: string; | ||||
|     defaultCountry: PhoneNumberCountryDefinition; | ||||
| } | ||||
| 
 | ||||
| @replaceableComponent("views.auth.CountryDropdown") | ||||
| export default class CountryDropdown extends React.Component<IProps, IState> { | ||||
|     constructor(props: IProps) { | ||||
|         super(props); | ||||
| 
 | ||||
|         let defaultCountry: PhoneNumberCountryDefinition = COUNTRIES[0]; | ||||
|         const defaultCountryCode = SdkConfig.get()["defaultCountryCode"]; | ||||
|         if (defaultCountryCode) { | ||||
|             const country = COUNTRIES.find(c => c.iso2 === defaultCountryCode.toUpperCase()); | ||||
|  | @ -62,7 +71,7 @@ export default class CountryDropdown extends React.Component { | |||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     componentDidMount() { | ||||
|     public componentDidMount(): void { | ||||
|         if (!this.props.value) { | ||||
|             // If no value is given, we start with the default
 | ||||
|             // country selected, but our parent component
 | ||||
|  | @ -71,21 +80,21 @@ export default class CountryDropdown extends React.Component { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     _onSearchChange(search) { | ||||
|     private onSearchChange = (search: string): void => { | ||||
|         this.setState({ | ||||
|             searchQuery: search, | ||||
|         }); | ||||
|     } | ||||
|     }; | ||||
| 
 | ||||
|     _onOptionChange(iso2) { | ||||
|     private onOptionChange = (iso2: string): void => { | ||||
|         this.props.onOptionChange(COUNTRIES_BY_ISO2[iso2]); | ||||
|     } | ||||
|     }; | ||||
| 
 | ||||
|     _flagImgForIso2(iso2) { | ||||
|     private flagImgForIso2(iso2: string): React.ReactNode { | ||||
|         return <div className="mx_Dropdown_option_emoji">{ getEmojiFlag(iso2) }</div>; | ||||
|     } | ||||
| 
 | ||||
|     _getShortOption(iso2) { | ||||
|     private getShortOption = (iso2: string): React.ReactNode => { | ||||
|         if (!this.props.isSmall) { | ||||
|             return undefined; | ||||
|         } | ||||
|  | @ -94,14 +103,12 @@ export default class CountryDropdown extends React.Component { | |||
|             countryPrefix = '+' + COUNTRIES_BY_ISO2[iso2].prefix; | ||||
|         } | ||||
|         return <span className="mx_CountryDropdown_shortOption"> | ||||
|             { this._flagImgForIso2(iso2) } | ||||
|             { this.flagImgForIso2(iso2) } | ||||
|             { countryPrefix } | ||||
|         </span>; | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const Dropdown = sdk.getComponent('elements.Dropdown'); | ||||
|     }; | ||||
| 
 | ||||
|     public render(): React.ReactNode { | ||||
|         let displayedCountries; | ||||
|         if (this.state.searchQuery) { | ||||
|             displayedCountries = COUNTRIES.filter( | ||||
|  | @ -124,7 +131,7 @@ export default class CountryDropdown extends React.Component { | |||
| 
 | ||||
|         const options = displayedCountries.map((country) => { | ||||
|             return <div className="mx_CountryDropdown_option" key={country.iso2}> | ||||
|                 { this._flagImgForIso2(country.iso2) } | ||||
|                 { this.flagImgForIso2(country.iso2) } | ||||
|                 { _t(country.name) } (+{ country.prefix }) | ||||
|             </div>; | ||||
|         }); | ||||
|  | @ -136,10 +143,10 @@ export default class CountryDropdown extends React.Component { | |||
|         return <Dropdown | ||||
|             id="mx_CountryDropdown" | ||||
|             className={this.props.className + " mx_CountryDropdown"} | ||||
|             onOptionChange={this._onOptionChange} | ||||
|             onSearchChange={this._onSearchChange} | ||||
|             onOptionChange={this.onOptionChange} | ||||
|             onSearchChange={this.onSearchChange} | ||||
|             menuWidth={298} | ||||
|             getShortOption={this._getShortOption} | ||||
|             getShortOption={this.getShortOption} | ||||
|             value={value} | ||||
|             searchEnabled={true} | ||||
|             disabled={this.props.disabled} | ||||
|  | @ -149,13 +156,3 @@ export default class CountryDropdown extends React.Component { | |||
|         </Dropdown>; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| CountryDropdown.propTypes = { | ||||
|     className: PropTypes.string, | ||||
|     isSmall: PropTypes.bool, | ||||
|     // if isSmall, show +44 in the selected value
 | ||||
|     showPrefix: PropTypes.bool, | ||||
|     onOptionChange: PropTypes.func.isRequired, | ||||
|     value: PropTypes.string, | ||||
|     disabled: PropTypes.bool, | ||||
| }; | ||||
|  | @ -18,21 +18,23 @@ import SdkConfig from "../../../SdkConfig"; | |||
| import { getCurrentLanguage } from "../../../languageHandler"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import PlatformPeg from "../../../PlatformPeg"; | ||||
| import * as sdk from '../../../index'; | ||||
| import React from 'react'; | ||||
| import { SettingLevel } from "../../../settings/SettingLevel"; | ||||
| import LanguageDropdown from "../elements/LanguageDropdown"; | ||||
| 
 | ||||
| function onChange(newLang) { | ||||
| function onChange(newLang: string): void { | ||||
|     if (getCurrentLanguage() !== newLang) { | ||||
|         SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLang); | ||||
|         PlatformPeg.get().reload(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export default function LanguageSelector({ disabled }) { | ||||
|     if (SdkConfig.get()['disable_login_language_selector']) return <div />; | ||||
| interface IProps { | ||||
|     disabled?: boolean; | ||||
| } | ||||
| 
 | ||||
|     const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); | ||||
| export default function LanguageSelector({ disabled }: IProps): JSX.Element { | ||||
|     if (SdkConfig.get()['disable_login_language_selector']) return <div />; | ||||
|     return <LanguageDropdown | ||||
|         className="mx_AuthBody_language" | ||||
|         onOptionChange={onChange} | ||||
|  | @ -17,7 +17,7 @@ limitations under the License. | |||
| import React from 'react'; | ||||
| import classNames from "classnames"; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import * as sdk from "../../../index"; | ||||
| import SdkConfig from '../../../SdkConfig'; | ||||
| import AuthPage from "./AuthPage"; | ||||
| import { _td } from "../../../languageHandler"; | ||||
|  | @ -25,21 +25,26 @@ import SettingsStore from "../../../settings/SettingsStore"; | |||
| import { UIFeature } from "../../../settings/UIFeature"; | ||||
| import CountlyAnalytics from "../../../CountlyAnalytics"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import LanguageSelector from "./LanguageSelector"; | ||||
| 
 | ||||
| // translatable strings for Welcome pages
 | ||||
| _td("Sign in with SSO"); | ||||
| 
 | ||||
| interface IProps { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @replaceableComponent("views.auth.Welcome") | ||||
| export default class Welcome extends React.PureComponent { | ||||
|     constructor(props) { | ||||
| export default class Welcome extends React.PureComponent<IProps> { | ||||
|     constructor(props: IProps) { | ||||
|         super(props); | ||||
| 
 | ||||
|         CountlyAnalytics.instance.track("onboarding_welcome"); | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const EmbeddedPage = sdk.getComponent('structures.EmbeddedPage'); | ||||
|         const LanguageSelector = sdk.getComponent('auth.LanguageSelector'); | ||||
|     public render(): React.ReactNode { | ||||
|         // FIXME: Using an import will result in wrench-element-tests failures
 | ||||
|         const EmbeddedPage = sdk.getComponent("structures.EmbeddedPage"); | ||||
| 
 | ||||
|         const pagesConfig = SdkConfig.get().embeddedPages; | ||||
|         let pageUrl = null; | ||||
|  | @ -42,7 +42,13 @@ export const getEmojiFlag = (countryCode: string) => { | |||
|     return String.fromCodePoint(...countryCode.split('').map(l => UNICODE_BASE + l.charCodeAt(0))); | ||||
| }; | ||||
| 
 | ||||
| export const COUNTRIES = [ | ||||
| export interface PhoneNumberCountryDefinition { | ||||
|     iso2: string; | ||||
|     name: string; | ||||
|     prefix: string; | ||||
| } | ||||
| 
 | ||||
| export const COUNTRIES: PhoneNumberCountryDefinition[] = [ | ||||
|     { | ||||
|         "iso2": "GB", | ||||
|         "name": _td("United Kingdom"), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Germain
						Germain