Merge remote-tracking branch 'upstream/develop' into feature/proper-codeblock-colors
						commit
						d017f3d06c
					
				|  | @ -6,8 +6,8 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk | |||
| 
 | ||||
| pushd matrix-js-sdk | ||||
| yarn link | ||||
| yarn install $@ | ||||
| yarn install --pure-lockfile $@ | ||||
| popd | ||||
| 
 | ||||
| yarn link matrix-js-sdk | ||||
| yarn install $@ | ||||
| yarn install --pure-lockfile $@ | ||||
|  |  | |||
|  | @ -13,13 +13,13 @@ | |||
| scripts/fetchdep.sh matrix-org matrix-js-sdk | ||||
| pushd matrix-js-sdk | ||||
| yarn link | ||||
| yarn install | ||||
| yarn install --pure-lockfile | ||||
| popd | ||||
| 
 | ||||
| # Now set up the react-sdk | ||||
| yarn link matrix-js-sdk | ||||
| yarn link | ||||
| yarn install | ||||
| yarn install --pure-lockfile | ||||
| yarn reskindex | ||||
| 
 | ||||
| # Finally, set up element-web | ||||
|  | @ -27,6 +27,6 @@ scripts/fetchdep.sh vector-im element-web | |||
| pushd element-web | ||||
| yarn link matrix-js-sdk | ||||
| yarn link matrix-react-sdk | ||||
| yarn install | ||||
| yarn install --pure-lockfile | ||||
| yarn build:res | ||||
| popd | ||||
|  |  | |||
|  | @ -390,6 +390,7 @@ export class Analytics { | |||
|             { expl: _td('Your device resolution'), value: resolution }, | ||||
|         ]; | ||||
| 
 | ||||
|         // FIXME: Using an import will result in test failures
 | ||||
|         const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); | ||||
|         Modal.createTrackedDialog('Analytics Details', '', ErrorDialog, { | ||||
|             title: _t('Analytics'), | ||||
|  |  | |||
|  | @ -77,6 +77,7 @@ export default class AsyncWrapper extends React.Component<IProps, IState> { | |||
|             const Component = this.state.component; | ||||
|             return <Component {...this.props} />; | ||||
|         } else if (this.state.error) { | ||||
|             // FIXME: Using an import will result in test failures
 | ||||
|             const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|             const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|             return <BaseDialog onFinished={this.props.onFinished} title={_t("Error")}> | ||||
|  |  | |||
|  | @ -419,6 +419,7 @@ export default class ContentMessages { | |||
| 
 | ||||
|         const isQuoting = Boolean(RoomViewStore.getQuotingEvent()); | ||||
|         if (isQuoting) { | ||||
|             // FIXME: Using an import will result in Element crashing
 | ||||
|             const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|             const { finished } = Modal.createTrackedDialog<[boolean]>('Upload Reply Warning', '', QuestionDialog, { | ||||
|                 title: _t('Replying With Files'), | ||||
|  | @ -453,6 +454,7 @@ export default class ContentMessages { | |||
|         } | ||||
| 
 | ||||
|         if (tooBigFiles.length > 0) { | ||||
|             // FIXME: Using an import will result in Element crashing
 | ||||
|             const UploadFailureDialog = sdk.getComponent("dialogs.UploadFailureDialog"); | ||||
|             const { finished } = Modal.createTrackedDialog<[boolean]>('Upload Failure', '', UploadFailureDialog, { | ||||
|                 badFiles: tooBigFiles, | ||||
|  | @ -463,7 +465,6 @@ export default class ContentMessages { | |||
|             if (!shouldContinue) return; | ||||
|         } | ||||
| 
 | ||||
|         const UploadConfirmDialog = sdk.getComponent("dialogs.UploadConfirmDialog"); | ||||
|         let uploadAll = false; | ||||
|         // Promise to complete before sending next file into room, used for synchronisation of file-sending
 | ||||
|         // to match the order the files were specified in
 | ||||
|  | @ -471,6 +472,8 @@ export default class ContentMessages { | |||
|         for (let i = 0; i < okFiles.length; ++i) { | ||||
|             const file = okFiles[i]; | ||||
|             if (!uploadAll) { | ||||
|                 // FIXME: Using an import will result in Element crashing
 | ||||
|                 const UploadConfirmDialog = sdk.getComponent("dialogs.UploadConfirmDialog"); | ||||
|                 const { finished } = Modal.createTrackedDialog<[boolean, boolean]>('Upload Files confirmation', | ||||
|                     '', UploadConfirmDialog, { | ||||
|                         file, | ||||
|  | @ -606,6 +609,7 @@ export default class ContentMessages { | |||
|                         { fileName: upload.fileName }, | ||||
|                     ); | ||||
|                 } | ||||
|                 // FIXME: Using an import will result in Element crashing
 | ||||
|                 const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                 Modal.createTrackedDialog('Upload failed', '', ErrorDialog, { | ||||
|                     title: _t('Upload Failed'), | ||||
|  |  | |||
|  | @ -33,7 +33,6 @@ import Presence from './Presence'; | |||
| import dis from './dispatcher/dispatcher'; | ||||
| import DMRoomMap from './utils/DMRoomMap'; | ||||
| import Modal from './Modal'; | ||||
| import * as sdk from './index'; | ||||
| import ActiveWidgetStore from './stores/ActiveWidgetStore'; | ||||
| import PlatformPeg from "./PlatformPeg"; | ||||
| import { sendLoginRequest } from "./Login"; | ||||
|  | @ -52,6 +51,10 @@ import CallHandler from './CallHandler'; | |||
| import LifecycleCustomisations from "./customisations/Lifecycle"; | ||||
| import ErrorDialog from "./components/views/dialogs/ErrorDialog"; | ||||
| import { _t } from "./languageHandler"; | ||||
| import LazyLoadingResyncDialog from "./components/views/dialogs/LazyLoadingResyncDialog"; | ||||
| import LazyLoadingDisabledDialog from "./components/views/dialogs/LazyLoadingDisabledDialog"; | ||||
| import SessionRestoreErrorDialog from "./components/views/dialogs/SessionRestoreErrorDialog"; | ||||
| import StorageEvictedDialog from "./components/views/dialogs/StorageEvictedDialog"; | ||||
| 
 | ||||
| const HOMESERVER_URL_KEY = "mx_hs_url"; | ||||
| const ID_SERVER_URL_KEY = "mx_is_url"; | ||||
|  | @ -238,8 +241,6 @@ export function handleInvalidStoreError(e: InvalidStoreError): Promise<void> { | |||
|         return Promise.resolve().then(() => { | ||||
|             const lazyLoadEnabled = e.value; | ||||
|             if (lazyLoadEnabled) { | ||||
|                 const LazyLoadingResyncDialog = | ||||
|                     sdk.getComponent("views.dialogs.LazyLoadingResyncDialog"); | ||||
|                 return new Promise((resolve) => { | ||||
|                     Modal.createDialog(LazyLoadingResyncDialog, { | ||||
|                         onFinished: resolve, | ||||
|  | @ -250,8 +251,6 @@ export function handleInvalidStoreError(e: InvalidStoreError): Promise<void> { | |||
|                 // between LL/non-LL version on same host.
 | ||||
|                 // as disabling LL when previously enabled
 | ||||
|                 // is a strong indicator of this (/develop & /app)
 | ||||
|                 const LazyLoadingDisabledDialog = | ||||
|                     sdk.getComponent("views.dialogs.LazyLoadingDisabledDialog"); | ||||
|                 return new Promise((resolve) => { | ||||
|                     Modal.createDialog(LazyLoadingDisabledDialog, { | ||||
|                         onFinished: resolve, | ||||
|  | @ -451,9 +450,6 @@ export async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): | |||
| async function handleLoadSessionFailure(e: Error): Promise<boolean> { | ||||
|     console.error("Unable to load session", e); | ||||
| 
 | ||||
|     const SessionRestoreErrorDialog = | ||||
|           sdk.getComponent('views.dialogs.SessionRestoreErrorDialog'); | ||||
| 
 | ||||
|     const modal = Modal.createTrackedDialog('Session Restore Error', '', SessionRestoreErrorDialog, { | ||||
|         error: e.message, | ||||
|     }); | ||||
|  | @ -612,7 +608,6 @@ async function doSetLoggedIn( | |||
| } | ||||
| 
 | ||||
| function showStorageEvictedDialog(): Promise<boolean> { | ||||
|     const StorageEvictedDialog = sdk.getComponent('views.dialogs.StorageEvictedDialog'); | ||||
|     return new Promise(resolve => { | ||||
|         Modal.createTrackedDialog('Storage evicted', '', StorageEvictedDialog, { | ||||
|             onFinished: resolve, | ||||
|  |  | |||
|  | @ -219,6 +219,7 @@ class _MatrixClientPeg implements IMatrixClientPeg { | |||
|         } catch (e) { | ||||
|             if (e && e.name === 'InvalidCryptoStoreError') { | ||||
|                 // The js-sdk found a crypto DB too new for it to use
 | ||||
|                 // FIXME: Using an import will result in test failures
 | ||||
|                 const CryptoStoreTooNewDialog = | ||||
|                     sdk.getComponent("views.dialogs.CryptoStoreTooNewDialog"); | ||||
|                 Modal.createDialog(CryptoStoreTooNewDialog); | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ import * as TextForEvent from './TextForEvent'; | |||
| import Analytics from './Analytics'; | ||||
| import * as Avatar from './Avatar'; | ||||
| import dis from './dispatcher/dispatcher'; | ||||
| import * as sdk from './index'; | ||||
| import { _t } from './languageHandler'; | ||||
| import Modal from './Modal'; | ||||
| import SettingsStore from "./settings/SettingsStore"; | ||||
|  | @ -37,6 +36,7 @@ import { isPushNotifyDisabled } from "./settings/controllers/NotificationControl | |||
| import RoomViewStore from "./stores/RoomViewStore"; | ||||
| import UserActivity from "./UserActivity"; | ||||
| import { mediaFromMxc } from "./customisations/Media"; | ||||
| import ErrorDialog from "./components/views/dialogs/ErrorDialog"; | ||||
| 
 | ||||
| /* | ||||
|  * Dispatches: | ||||
|  | @ -240,7 +240,6 @@ export const Notifier = { | |||
|                         ? _t('%(brand)s does not have permission to send you notifications - ' + | ||||
|                             'please check your browser settings', { brand }) | ||||
|                         : _t('%(brand)s was not given permission to send notifications - please try again', { brand }); | ||||
|                     const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); | ||||
|                     Modal.createTrackedDialog('Unable to enable Notifications', result, ErrorDialog, { | ||||
|                         title: _t('Unable to enable Notifications'), | ||||
|                         description, | ||||
|  |  | |||
|  | @ -22,13 +22,13 @@ import { User } from "matrix-js-sdk/src/models/user"; | |||
| import { MatrixClientPeg } from './MatrixClientPeg'; | ||||
| import MultiInviter, { CompletionStates } from './utils/MultiInviter'; | ||||
| import Modal from './Modal'; | ||||
| import * as sdk from './'; | ||||
| import { _t } from './languageHandler'; | ||||
| import InviteDialog, { KIND_DM, KIND_INVITE, Member } from "./components/views/dialogs/InviteDialog"; | ||||
| import CommunityPrototypeInviteDialog from "./components/views/dialogs/CommunityPrototypeInviteDialog"; | ||||
| import { CommunityPrototypeStore } from "./stores/CommunityPrototypeStore"; | ||||
| import BaseAvatar from "./components/views/avatars/BaseAvatar"; | ||||
| import { mediaFromMxc } from "./customisations/Media"; | ||||
| import ErrorDialog from "./components/views/dialogs/ErrorDialog"; | ||||
| 
 | ||||
| export interface IInviteResult { | ||||
|     states: CompletionStates; | ||||
|  | @ -51,7 +51,6 @@ export function inviteMultipleToRoom(roomId: string, addresses: string[]): Promi | |||
| 
 | ||||
| export function showStartChatInviteDialog(initialText = ""): void { | ||||
|     // This dialog handles the room creation internally - we don't need to worry about it.
 | ||||
|     const InviteDialog = sdk.getComponent("dialogs.InviteDialog"); | ||||
|     Modal.createTrackedDialog( | ||||
|         'Start DM', '', InviteDialog, { kind: KIND_DM, initialText }, | ||||
|         /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, | ||||
|  | @ -111,7 +110,6 @@ export function inviteUsersToRoom(roomId: string, userIds: string[]): Promise<vo | |||
|         showAnyInviteErrors(result.states, room, result.inviter); | ||||
|     }).catch((err) => { | ||||
|         console.error(err.stack); | ||||
|         const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|         Modal.createTrackedDialog('Failed to invite', '', ErrorDialog, { | ||||
|             title: _t("Failed to invite"), | ||||
|             description: ((err && err.message) ? err.message : _t("Operation failed")), | ||||
|  | @ -131,7 +129,6 @@ export function showAnyInviteErrors( | |||
|         // Just get the first message because there was a fatal problem on the first
 | ||||
|         // user. This usually means that no other users were attempted, making it
 | ||||
|         // pointless for us to list who failed exactly.
 | ||||
|         const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|         Modal.createTrackedDialog('Failed to invite users to the room', '', ErrorDialog, { | ||||
|             title: _t("Failed to invite users to the room:", { roomName: room.name }), | ||||
|             description: inviter.getErrorText(failedUsers[0]), | ||||
|  | @ -178,7 +175,6 @@ export function showAnyInviteErrors( | |||
|                 </div> | ||||
|             </div>; | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog("Some invites could not be sent", "", ErrorDialog, { | ||||
|                 title: _t("Some invites couldn't be sent"), | ||||
|                 description, | ||||
|  |  | |||
|  | @ -354,6 +354,7 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f | |||
|                 throw new Error("Secret storage creation canceled"); | ||||
|             } | ||||
|         } else { | ||||
|             // FIXME: Using an import will result in test failures
 | ||||
|             const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); | ||||
|             await cli.bootstrapCrossSigning({ | ||||
|                 authUploadDeviceSigningKeys: async (makeRequest) => { | ||||
|  |  | |||
|  | @ -23,7 +23,6 @@ import { User } from "matrix-js-sdk/src/models/user"; | |||
| import * as ContentHelpers from 'matrix-js-sdk/src/content-helpers'; | ||||
| import { MatrixClientPeg } from './MatrixClientPeg'; | ||||
| import dis from './dispatcher/dispatcher'; | ||||
| import * as sdk from './index'; | ||||
| import { _t, _td } from './languageHandler'; | ||||
| import Modal from './Modal'; | ||||
| import MultiInviter from './utils/MultiInviter'; | ||||
|  | @ -50,6 +49,12 @@ import { UIFeature } from "./settings/UIFeature"; | |||
| import { CHAT_EFFECTS } from "./effects"; | ||||
| import CallHandler from "./CallHandler"; | ||||
| import { guessAndSetDMRoom } from "./Rooms"; | ||||
| import UploadConfirmDialog from './components/views/dialogs/UploadConfirmDialog'; | ||||
| import ErrorDialog from './components/views/dialogs/ErrorDialog'; | ||||
| import DevtoolsDialog from './components/views/dialogs/DevtoolsDialog'; | ||||
| import RoomUpgradeWarningDialog from "./components/views/dialogs/RoomUpgradeWarningDialog"; | ||||
| import InfoDialog from "./components/views/dialogs/InfoDialog"; | ||||
| import SlashCommandHelpDialog from "./components/views/dialogs/SlashCommandHelpDialog"; | ||||
| 
 | ||||
| // XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816
 | ||||
| interface HTMLInputEvent extends Event { | ||||
|  | @ -63,7 +68,6 @@ const singleMxcUpload = async (): Promise<any> => { | |||
|         fileSelector.onchange = (ev: HTMLInputEvent) => { | ||||
|             const file = ev.target.files[0]; | ||||
| 
 | ||||
|             const UploadConfirmDialog = sdk.getComponent("dialogs.UploadConfirmDialog"); | ||||
|             Modal.createTrackedDialog('Upload Files confirmation', '', UploadConfirmDialog, { | ||||
|                 file, | ||||
|                 onFinished: (shouldContinue) => { | ||||
|  | @ -246,7 +250,6 @@ export const Commands = [ | |||
|         args: '<query>', | ||||
|         description: _td('Searches DuckDuckGo for results'), | ||||
|         runFn: function() { | ||||
|             const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); | ||||
|             // TODO Don't explain this away, actually show a search UI here.
 | ||||
|             Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { | ||||
|                 title: _t('/ddg is not a command'), | ||||
|  | @ -269,8 +272,6 @@ export const Commands = [ | |||
|                     return reject(_t("You do not have the required permissions to use this command.")); | ||||
|                 } | ||||
| 
 | ||||
|                 const RoomUpgradeWarningDialog = sdk.getComponent("dialogs.RoomUpgradeWarningDialog"); | ||||
| 
 | ||||
|                 const { finished } = Modal.createTrackedDialog('Slash Commands', 'upgrade room confirmation', | ||||
|                     RoomUpgradeWarningDialog, { roomId: roomId, targetVersion: args }, /*className=*/null, | ||||
|                     /*isPriority=*/false, /*isStatic=*/true); | ||||
|  | @ -314,7 +315,6 @@ export const Commands = [ | |||
| 
 | ||||
|                         if (checkForUpgradeFn) cli.removeListener('Room', checkForUpgradeFn); | ||||
| 
 | ||||
|                         const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); | ||||
|                         Modal.createTrackedDialog('Slash Commands', 'room upgrade error', ErrorDialog, { | ||||
|                             title: _t('Error upgrading room'), | ||||
|                             description: _t( | ||||
|  | @ -434,7 +434,6 @@ export const Commands = [ | |||
|             const topic = topicEvents && topicEvents.getContent().topic; | ||||
|             const topicHtml = topic ? linkifyAndSanitizeHtml(topic) : _t('This room has no topic.'); | ||||
| 
 | ||||
|             const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); | ||||
|             Modal.createTrackedDialog('Slash Commands', 'Topic', InfoDialog, { | ||||
|                 title: room.name, | ||||
|                 description: <div dangerouslySetInnerHTML={{ __html: topicHtml }} />, | ||||
|  | @ -737,7 +736,6 @@ export const Commands = [ | |||
|                     ignoredUsers.push(userId); // de-duped internally in the js-sdk
 | ||||
|                     return success( | ||||
|                         cli.setIgnoredUsers(ignoredUsers).then(() => { | ||||
|                             const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); | ||||
|                             Modal.createTrackedDialog('Slash Commands', 'User ignored', InfoDialog, { | ||||
|                                 title: _t('Ignored user'), | ||||
|                                 description: <div> | ||||
|  | @ -768,7 +766,6 @@ export const Commands = [ | |||
|                     if (index !== -1) ignoredUsers.splice(index, 1); | ||||
|                     return success( | ||||
|                         cli.setIgnoredUsers(ignoredUsers).then(() => { | ||||
|                             const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); | ||||
|                             Modal.createTrackedDialog('Slash Commands', 'User unignored', InfoDialog, { | ||||
|                                 title: _t('Unignored user'), | ||||
|                                 description: <div> | ||||
|  | @ -838,7 +835,6 @@ export const Commands = [ | |||
|         command: 'devtools', | ||||
|         description: _td('Opens the Developer Tools dialog'), | ||||
|         runFn: function(roomId) { | ||||
|             const DevtoolsDialog = sdk.getComponent('dialogs.DevtoolsDialog'); | ||||
|             Modal.createDialog(DevtoolsDialog, { roomId }); | ||||
|             return success(); | ||||
|         }, | ||||
|  | @ -943,7 +939,6 @@ export const Commands = [ | |||
|                         await cli.setDeviceVerified(userId, deviceId, true); | ||||
| 
 | ||||
|                         // Tell the user we verified everything
 | ||||
|                         const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); | ||||
|                         Modal.createTrackedDialog('Slash Commands', 'Verified key', InfoDialog, { | ||||
|                             title: _t('Verified key'), | ||||
|                             description: <div> | ||||
|  | @ -1000,8 +995,6 @@ export const Commands = [ | |||
|         command: "help", | ||||
|         description: _td("Displays list of commands with usages and descriptions"), | ||||
|         runFn: function() { | ||||
|             const SlashCommandHelpDialog = sdk.getComponent('dialogs.SlashCommandHelpDialog'); | ||||
| 
 | ||||
|             Modal.createTrackedDialog('Slash Commands', 'Help', SlashCommandHelpDialog); | ||||
|             return success(); | ||||
|         }, | ||||
|  |  | |||
|  | @ -189,6 +189,7 @@ export function dialogTermsInteractionCallback( | |||
| ): Promise<string[]> { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         console.log("Terms that need agreement", policiesAndServicePairs); | ||||
|         // FIXME: Using an import will result in test failures
 | ||||
|         const TermsDialog = sdk.getComponent("views.dialogs.TermsDialog"); | ||||
| 
 | ||||
|         Modal.createTrackedDialog('Terms of Service', '', TermsDialog, { | ||||
|  |  | |||
|  | @ -17,10 +17,10 @@ limitations under the License. | |||
| import * as React from "react"; | ||||
| import classNames from "classnames"; | ||||
| 
 | ||||
| import * as sdk from "../index"; | ||||
| import Modal from "../Modal"; | ||||
| import { _t, _td } from "../languageHandler"; | ||||
| import { isMac, Key } from "../Keyboard"; | ||||
| import InfoDialog from "../components/views/dialogs/InfoDialog"; | ||||
| 
 | ||||
| // TS: once languageHandler is TS we can probably inline this into the enum
 | ||||
| _td("Navigation"); | ||||
|  | @ -375,7 +375,6 @@ export const toggleDialog = () => { | |||
|         </div>; | ||||
|     }); | ||||
| 
 | ||||
|     const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); | ||||
|     activeModal = Modal.createTrackedDialog("Keyboard Shortcuts", "", InfoDialog, { | ||||
|         className: "mx_KeyboardShortcutsDialog", | ||||
|         title: _t("Keyboard Shortcuts"), | ||||
|  |  | |||
|  | @ -19,13 +19,13 @@ import { asyncAction } from './actionCreators'; | |||
| import Modal from '../Modal'; | ||||
| import * as Rooms from '../Rooms'; | ||||
| import { _t } from '../languageHandler'; | ||||
| import * as sdk from '../index'; | ||||
| import { MatrixClient } from "matrix-js-sdk/src/client"; | ||||
| import { Room } from "matrix-js-sdk/src/models/room"; | ||||
| import { AsyncActionPayload } from "../dispatcher/payloads"; | ||||
| import RoomListStore from "../stores/room-list/RoomListStore"; | ||||
| import { SortAlgorithm } from "../stores/room-list/algorithms/models"; | ||||
| import { DefaultTagID } from "../stores/room-list/models"; | ||||
| import ErrorDialog from '../components/views/dialogs/ErrorDialog'; | ||||
| 
 | ||||
| export default class RoomListActions { | ||||
|     /** | ||||
|  | @ -88,7 +88,6 @@ export default class RoomListActions { | |||
|                 return Rooms.guessAndSetDMRoom( | ||||
|                     room, newTag === DefaultTagID.DM, | ||||
|                 ).catch((err) => { | ||||
|                     const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                     console.error("Failed to set direct chat tag " + err); | ||||
|                     Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, { | ||||
|                         title: _t('Failed to set direct chat tag'), | ||||
|  | @ -109,7 +108,6 @@ export default class RoomListActions { | |||
|                 const promiseToDelete = matrixClient.deleteRoomTag( | ||||
|                     roomId, oldTag, | ||||
|                 ).catch(function(err) { | ||||
|                     const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                     console.error("Failed to remove tag " + oldTag + " from room: " + err); | ||||
|                     Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, { | ||||
|                         title: _t('Failed to remove tag %(tagName)s from room', { tagName: oldTag }), | ||||
|  | @ -129,7 +127,6 @@ export default class RoomListActions { | |||
|                 metaData = metaData || {}; | ||||
| 
 | ||||
|                 const promiseToAdd = matrixClient.setRoomTag(roomId, newTag, metaData).catch(function(err) { | ||||
|                     const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                     console.error("Failed to add tag " + newTag + " to room: " + err); | ||||
|                     Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, { | ||||
|                         title: _t('Failed to add tag %(tagName)s to room', { tagName: newTag }), | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../../index'; | ||||
| import { _t } from '../../../../languageHandler'; | ||||
| import SdkConfig from '../../../../SdkConfig'; | ||||
| import SettingsStore from "../../../../settings/SettingsStore"; | ||||
|  | @ -24,6 +23,9 @@ import Modal from '../../../../Modal'; | |||
| import { formatBytes, formatCountLong } from "../../../../utils/FormattingUtils"; | ||||
| import EventIndexPeg from "../../../../indexing/EventIndexPeg"; | ||||
| import { SettingLevel } from "../../../../settings/SettingLevel"; | ||||
| import Field from '../../../../components/views/elements/Field'; | ||||
| import BaseDialog from "../../../../components/views/dialogs/BaseDialog"; | ||||
| import DialogButtons from "../../../../components/views/elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (confirmed: boolean) => void; | ||||
|  | @ -145,7 +147,6 @@ export default class ManageEventIndexDialog extends React.Component<IProps, ISta | |||
| 
 | ||||
|     render() { | ||||
|         const brand = SdkConfig.get().brand; | ||||
|         const Field = sdk.getComponent('views.elements.Field'); | ||||
| 
 | ||||
|         let crawlerState; | ||||
|         if (this.state.currentRoom === null) { | ||||
|  | @ -176,15 +177,12 @@ export default class ManageEventIndexDialog extends React.Component<IProps, ISta | |||
|                     <Field | ||||
|                         label={_t('Message downloading sleep time(ms)')} | ||||
|                         type='number' | ||||
|                         value={this.state.crawlerSleepTime} | ||||
|                         value={this.state.crawlerSleepTime.toString()} | ||||
|                         onChange={this.onCrawlerSleepTimeChange} /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         ); | ||||
| 
 | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
| 
 | ||||
|         return ( | ||||
|             <BaseDialog className='mx_ManageEventIndexDialog' | ||||
|                 onFinished={this.props.onFinished} | ||||
|  |  | |||
|  | @ -22,12 +22,12 @@ import AutocompleteProvider from './AutocompleteProvider'; | |||
| import { MatrixClientPeg } from '../MatrixClientPeg'; | ||||
| import QueryMatcher from './QueryMatcher'; | ||||
| import { PillCompletion } from './Components'; | ||||
| import * as sdk from '../index'; | ||||
| import { sortBy } from "lodash"; | ||||
| import { makeGroupPermalink } from "../utils/permalinks/Permalinks"; | ||||
| import { ICompletion, ISelectionRange } from "./Autocompleter"; | ||||
| import FlairStore from "../stores/FlairStore"; | ||||
| import { mediaFromMxc } from "../customisations/Media"; | ||||
| import BaseAvatar from '../components/views/avatars/BaseAvatar'; | ||||
| 
 | ||||
| const COMMUNITY_REGEX = /\B\+\S*/g; | ||||
| 
 | ||||
|  | @ -56,8 +56,6 @@ export default class CommunityProvider extends AutocompleteProvider { | |||
|         force = false, | ||||
|         limit = -1, | ||||
|     ): Promise<ICompletion[]> { | ||||
|         const BaseAvatar = sdk.getComponent('views.avatars.BaseAvatar'); | ||||
| 
 | ||||
|         // Disable autocompletions when composing commands because of various issues
 | ||||
|         // (see https://github.com/vector-im/element-web/issues/4762)
 | ||||
|         if (/^(\/join|\/leave)/.test(query)) { | ||||
|  |  | |||
|  | @ -21,8 +21,8 @@ import AutocompleteProvider from './AutocompleteProvider'; | |||
| import { _t } from '../languageHandler'; | ||||
| import { MatrixClientPeg } from '../MatrixClientPeg'; | ||||
| import { PillCompletion } from './Components'; | ||||
| import * as sdk from '../index'; | ||||
| import { ICompletion, ISelectionRange } from "./Autocompleter"; | ||||
| import RoomAvatar from '../components/views/avatars/RoomAvatar'; | ||||
| 
 | ||||
| const AT_ROOM_REGEX = /@\S*/g; | ||||
| 
 | ||||
|  | @ -40,8 +40,6 @@ export default class NotifProvider extends AutocompleteProvider { | |||
|         force = false, | ||||
|         limit = -1, | ||||
|     ): Promise<ICompletion[]> { | ||||
|         const RoomAvatar = sdk.getComponent('views.avatars.RoomAvatar'); | ||||
| 
 | ||||
|         const client = MatrixClientPeg.get(); | ||||
| 
 | ||||
|         if (!this.room.currentState.mayTriggerNotifOfType('room', client.credentials.userId)) return []; | ||||
|  |  | |||
|  | @ -21,7 +21,6 @@ import React from 'react'; | |||
| import { _t } from '../languageHandler'; | ||||
| import AutocompleteProvider from './AutocompleteProvider'; | ||||
| import { PillCompletion } from './Components'; | ||||
| import * as sdk from '../index'; | ||||
| import QueryMatcher from './QueryMatcher'; | ||||
| import { sortBy } from 'lodash'; | ||||
| import { MatrixClientPeg } from '../MatrixClientPeg'; | ||||
|  | @ -33,6 +32,7 @@ import { RoomState } from "matrix-js-sdk/src/models/room-state"; | |||
| import { EventTimeline } from "matrix-js-sdk/src/models/event-timeline"; | ||||
| import { makeUserPermalink } from "../utils/permalinks/Permalinks"; | ||||
| import { ICompletion, ISelectionRange } from "./Autocompleter"; | ||||
| import MemberAvatar from '../components/views/avatars/MemberAvatar'; | ||||
| 
 | ||||
| const USER_REGEX = /\B@\S*/g; | ||||
| 
 | ||||
|  | @ -108,8 +108,6 @@ export default class UserProvider extends AutocompleteProvider { | |||
|         force = false, | ||||
|         limit = -1, | ||||
|     ): Promise<ICompletion[]> { | ||||
|         const MemberAvatar = sdk.getComponent('views.avatars.MemberAvatar'); | ||||
| 
 | ||||
|         // lazy-load user list into matcher
 | ||||
|         if (!this.users) this._makeUsers(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,7 +24,6 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | |||
| import { Room } from 'matrix-js-sdk/src/models/room'; | ||||
| import { TimelineWindow } from 'matrix-js-sdk/src/timeline-window'; | ||||
| 
 | ||||
| import * as sdk from '../../index'; | ||||
| import { MatrixClientPeg } from '../../MatrixClientPeg'; | ||||
| import EventIndexPeg from "../../indexing/EventIndexPeg"; | ||||
| import { _t } from '../../languageHandler'; | ||||
|  | @ -34,6 +33,9 @@ import DesktopBuildsNotice, { WarningKind } from "../views/elements/DesktopBuild | |||
| import { replaceableComponent } from "../../utils/replaceableComponent"; | ||||
| 
 | ||||
| import ResizeNotifier from '../../utils/ResizeNotifier'; | ||||
| import TimelinePanel from "./TimelinePanel"; | ||||
| import Spinner from "../views/elements/Spinner"; | ||||
| import { TileShape } from '../views/rooms/EventTile'; | ||||
| 
 | ||||
| interface IProps { | ||||
|     roomId: string; | ||||
|  | @ -237,8 +239,6 @@ class FilePanel extends React.Component<IProps, IState> { | |||
|         } | ||||
| 
 | ||||
|         // wrap a TimelinePanel with the jump-to-event bits turned off.
 | ||||
|         const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); | ||||
|         const Loader = sdk.getComponent("elements.Spinner"); | ||||
| 
 | ||||
|         const emptyState = (<div className="mx_RightPanel_empty mx_FilePanel_empty"> | ||||
|             <h2>{_t('No files visible in this room')}</h2> | ||||
|  | @ -264,7 +264,7 @@ class FilePanel extends React.Component<IProps, IState> { | |||
|                         timelineSet={this.state.timelineSet} | ||||
|                         showUrlPreview = {false} | ||||
|                         onPaginationRequest={this.onPaginationRequest} | ||||
|                         tileShape="file_grid" | ||||
|                         tileShape={TileShape.FileGrid} | ||||
|                         resizeNotifier={this.props.resizeNotifier} | ||||
|                         empty={emptyState} | ||||
|                     /> | ||||
|  | @ -277,7 +277,7 @@ class FilePanel extends React.Component<IProps, IState> { | |||
|                     onClose={this.props.onClose} | ||||
|                     previousPhase={RightPanelPhases.RoomSummary} | ||||
|                 > | ||||
|                     <Loader /> | ||||
|                     <Spinner /> | ||||
|                 </BaseCard> | ||||
|             ); | ||||
|         } | ||||
|  |  | |||
|  | @ -96,6 +96,7 @@ const HomePage: React.FC<IProps> = ({ justRegistered = false }) => { | |||
|     const pageUrl = getHomePageUrl(config); | ||||
| 
 | ||||
|     if (pageUrl) { | ||||
|         // FIXME: Using an import will result in wrench-element-tests failures
 | ||||
|         const EmbeddedPage = sdk.getComponent('structures.EmbeddedPage'); | ||||
|         return <EmbeddedPage className="mx_HomePage" url={pageUrl} scrollbar={true} />; | ||||
|     } | ||||
|  |  | |||
|  | @ -24,7 +24,6 @@ import { Key } from '../../Keyboard'; | |||
| import PageTypes from '../../PageTypes'; | ||||
| import MediaDeviceHandler from '../../MediaDeviceHandler'; | ||||
| import { fixupColorFonts } from '../../utils/FontManager'; | ||||
| import * as sdk from '../../index'; | ||||
| import dis from '../../dispatcher/dispatcher'; | ||||
| import { IMatrixClientCreds } from '../../MatrixClientPeg'; | ||||
| import SettingsStore from "../../settings/SettingsStore"; | ||||
|  | @ -59,6 +58,11 @@ import { replaceableComponent } from "../../utils/replaceableComponent"; | |||
| import CallHandler, { CallHandlerEvent } from '../../CallHandler'; | ||||
| import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; | ||||
| import AudioFeedArrayForCall from '../views/voip/AudioFeedArrayForCall'; | ||||
| import RoomView from './RoomView'; | ||||
| import ToastContainer from './ToastContainer'; | ||||
| import MyGroups from "./MyGroups"; | ||||
| import UserView from "./UserView"; | ||||
| import GroupView from "./GroupView"; | ||||
| 
 | ||||
| // We need to fetch each pinned message individually (if we don't already have it)
 | ||||
| // so each pinned message may trigger a request. Limit the number per room for sanity.
 | ||||
|  | @ -78,8 +82,8 @@ interface IProps { | |||
|     hideToSRUsers: boolean; | ||||
|     resizeNotifier: ResizeNotifier; | ||||
|     // eslint-disable-next-line camelcase
 | ||||
|     page_type: string; | ||||
|     autoJoin: boolean; | ||||
|     page_type?: string; | ||||
|     autoJoin?: boolean; | ||||
|     threepidInvite?: IThreepidInvite; | ||||
|     roomOobData?: IOOBData; | ||||
|     currentRoomId: string; | ||||
|  | @ -567,12 +571,6 @@ class LoggedInView extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const RoomView = sdk.getComponent('structures.RoomView'); | ||||
|         const UserView = sdk.getComponent('structures.UserView'); | ||||
|         const GroupView = sdk.getComponent('structures.GroupView'); | ||||
|         const MyGroups = sdk.getComponent('structures.MyGroups'); | ||||
|         const ToastContainer = sdk.getComponent('structures.ToastContainer'); | ||||
| 
 | ||||
|         let pageElement; | ||||
| 
 | ||||
|         switch (this.props.page_type) { | ||||
|  |  | |||
|  | @ -36,7 +36,6 @@ import dis from "../../dispatcher/dispatcher"; | |||
| import Notifier from '../../Notifier'; | ||||
| 
 | ||||
| import Modal from "../../Modal"; | ||||
| import * as sdk from '../../index'; | ||||
| import { showRoomInviteDialog, showStartChatInviteDialog } from '../../RoomInvite'; | ||||
| import * as Rooms from '../../Rooms'; | ||||
| import linkifyMatrix from "../../linkify-matrix"; | ||||
|  | @ -85,9 +84,27 @@ import RoomListStore from "../../stores/room-list/RoomListStore"; | |||
| import { RoomUpdateCause } from "../../stores/room-list/models"; | ||||
| import defaultDispatcher from "../../dispatcher/dispatcher"; | ||||
| import SecurityCustomisations from "../../customisations/Security"; | ||||
| import Spinner from "../views/elements/Spinner"; | ||||
| import QuestionDialog from "../views/dialogs/QuestionDialog"; | ||||
| import UserSettingsDialog from '../views/dialogs/UserSettingsDialog'; | ||||
| import CreateGroupDialog from '../views/dialogs/CreateGroupDialog'; | ||||
| import CreateRoomDialog from '../views/dialogs/CreateRoomDialog'; | ||||
| import RoomDirectory from './RoomDirectory'; | ||||
| import KeySignatureUploadFailedDialog from "../views/dialogs/KeySignatureUploadFailedDialog"; | ||||
| import IncomingSasDialog from "../views/dialogs/IncomingSasDialog"; | ||||
| import CompleteSecurity from "./auth/CompleteSecurity"; | ||||
| import LoggedInView from './LoggedInView'; | ||||
| import Welcome from "../views/auth/Welcome"; | ||||
| import ForgotPassword from "./auth/ForgotPassword"; | ||||
| import E2eSetup from "./auth/E2eSetup"; | ||||
| import Registration from './auth/Registration'; | ||||
| import Login from "./auth/Login"; | ||||
| import ErrorBoundary from '../views/elements/ErrorBoundary'; | ||||
| import VerificationRequestToast from '../views/toasts/VerificationRequestToast'; | ||||
| 
 | ||||
| import PerformanceMonitor, { PerformanceEntryNames } from "../../performance"; | ||||
| import UIStore, { UI_EVENTS } from "../../stores/UIStore"; | ||||
| import SoftLogout from './auth/SoftLogout'; | ||||
| 
 | ||||
| /** constants for MatrixChat.state.view */ | ||||
| export enum Views { | ||||
|  | @ -156,7 +173,12 @@ interface IRoomInfo { | |||
| /* eslint-enable camelcase */ | ||||
| 
 | ||||
| interface IProps { // TODO type things better
 | ||||
|     config: Record<string, any>; | ||||
|     config: { | ||||
|         piwik: { | ||||
|             policyUrl: string; | ||||
|         }; | ||||
|         [key: string]: any; | ||||
|     }; | ||||
|     serverConfig?: ValidatedServerConfig; | ||||
|     onNewScreen: (screen: string, replaceLast: boolean) => void; | ||||
|     enableGuest?: boolean; | ||||
|  | @ -519,7 +541,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
| 
 | ||||
|     onAction = (payload) => { | ||||
|         // console.log(`MatrixClientPeg.onAction: ${payload.action}`);
 | ||||
|         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
| 
 | ||||
|         // Start the onboarding process for certain actions
 | ||||
|         if (MatrixClientPeg.get() && MatrixClientPeg.get().isGuest() && | ||||
|  | @ -613,8 +634,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                     onFinished: (confirm) => { | ||||
|                         if (confirm) { | ||||
|                             // FIXME: controller shouldn't be loading a view :(
 | ||||
|                             const Loader = sdk.getComponent("elements.Spinner"); | ||||
|                             const modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); | ||||
|                             const modal = Modal.createDialog(Spinner, null, 'mx_Dialog_spinner'); | ||||
| 
 | ||||
|                             MatrixClientPeg.get().leave(payload.room_id).then(() => { | ||||
|                                 modal.close(); | ||||
|  | @ -650,7 +670,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|             } | ||||
|             case Action.ViewUserSettings: { | ||||
|                 const tabPayload = payload as OpenToTabPayload; | ||||
|                 const UserSettingsDialog = sdk.getComponent("dialogs.UserSettingsDialog"); | ||||
|                 Modal.createTrackedDialog('User settings', '', UserSettingsDialog, | ||||
|                     { initialTabId: tabPayload.initialTabId }, | ||||
|                     /*className=*/null, /*isPriority=*/false, /*isStatic=*/true); | ||||
|  | @ -663,11 +682,12 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                 this.createRoom(payload.public, payload.defaultName); | ||||
|                 break; | ||||
|             case 'view_create_group': { | ||||
|                 let CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog"); | ||||
|                 if (SettingsStore.getValue("feature_communities_v2_prototypes")) { | ||||
|                     CreateGroupDialog = CreateCommunityPrototypeDialog; | ||||
|                 } | ||||
|                 Modal.createTrackedDialog('Create Community', '', CreateGroupDialog); | ||||
|                 const prototype = SettingsStore.getValue("feature_communities_v2_prototypes"); | ||||
|                 Modal.createTrackedDialog( | ||||
|                     'Create Community', | ||||
|                     '', | ||||
|                     prototype ? CreateCommunityPrototypeDialog : CreateGroupDialog, | ||||
|                 ); | ||||
|                 break; | ||||
|             } | ||||
|             case Action.ViewRoomDirectory: { | ||||
|  | @ -677,7 +697,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                         room_id: SpaceStore.instance.activeSpace.roomId, | ||||
|                     }); | ||||
|                 } else { | ||||
|                     const RoomDirectory = sdk.getComponent("structures.RoomDirectory"); | ||||
|                     Modal.createTrackedDialog('Room directory', '', RoomDirectory, { | ||||
|                         initialText: payload.initialText, | ||||
|                     }, 'mx_RoomDirectory_dialogWrapper', false, true); | ||||
|  | @ -1019,7 +1038,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         const CreateRoomDialog = sdk.getComponent('dialogs.CreateRoomDialog'); | ||||
|         const modal = Modal.createTrackedDialog('Create Room', '', CreateRoomDialog, { | ||||
|             defaultPublic, | ||||
|             defaultName, | ||||
|  | @ -1116,7 +1134,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     private leaveRoom(roomId: string) { | ||||
|         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|         const roomToLeave = MatrixClientPeg.get().getRoom(roomId); | ||||
|         const warnings = this.leaveRoomWarnings(roomId); | ||||
| 
 | ||||
|  | @ -1143,8 +1160,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                     const d = leaveRoomBehaviour(roomId); | ||||
| 
 | ||||
|                     // FIXME: controller shouldn't be loading a view :(
 | ||||
|                     const Loader = sdk.getComponent("elements.Spinner"); | ||||
|                     const modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); | ||||
|                     const modal = Modal.createDialog(Spinner, null, 'mx_Dialog_spinner'); | ||||
| 
 | ||||
|                     d.finally(() => modal.close()); | ||||
|                     dis.dispatch({ | ||||
|  | @ -1439,7 +1455,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|             }); | ||||
|         }); | ||||
|         cli.on('no_consent', function(message, consentUri) { | ||||
|             const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|             Modal.createTrackedDialog('No Consent Dialog', '', QuestionDialog, { | ||||
|                 title: _t('Terms and Conditions'), | ||||
|                 description: <div> | ||||
|  | @ -1548,8 +1563,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|         }); | ||||
| 
 | ||||
|         cli.on("crypto.keySignatureUploadFailure", (failures, source, continuation) => { | ||||
|             const KeySignatureUploadFailedDialog = | ||||
|                 sdk.getComponent('views.dialogs.KeySignatureUploadFailedDialog'); | ||||
|             Modal.createTrackedDialog( | ||||
|                 'Failed to upload key signatures', | ||||
|                 'Failed to upload key signatures', | ||||
|  | @ -1559,7 +1572,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
| 
 | ||||
|         cli.on("crypto.verification.request", request => { | ||||
|             if (request.verifier) { | ||||
|                 const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); | ||||
|                 Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { | ||||
|                     verifier: request.verifier, | ||||
|                 }, null, /* priority = */ false, /* static = */ true); | ||||
|  | @ -1569,7 +1581,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                     title: _t("Verification requested"), | ||||
|                     icon: "verification", | ||||
|                     props: { request }, | ||||
|                     component: sdk.getComponent("toasts.VerificationRequestToast"), | ||||
|                     component: VerificationRequestToast, | ||||
|                     priority: 90, | ||||
|                 }); | ||||
|             } | ||||
|  | @ -1977,21 +1989,18 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|         let view = null; | ||||
| 
 | ||||
|         if (this.state.view === Views.LOADING) { | ||||
|             const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|             view = ( | ||||
|                 <div className="mx_MatrixChat_splash"> | ||||
|                     <Spinner /> | ||||
|                 </div> | ||||
|             ); | ||||
|         } else if (this.state.view === Views.COMPLETE_SECURITY) { | ||||
|             const CompleteSecurity = sdk.getComponent('structures.auth.CompleteSecurity'); | ||||
|             view = ( | ||||
|                 <CompleteSecurity | ||||
|                     onFinished={this.onCompleteSecurityE2eSetupFinished} | ||||
|                 /> | ||||
|             ); | ||||
|         } else if (this.state.view === Views.E2E_SETUP) { | ||||
|             const E2eSetup = sdk.getComponent('structures.auth.E2eSetup'); | ||||
|             view = ( | ||||
|                 <E2eSetup | ||||
|                     onFinished={this.onCompleteSecurityE2eSetupFinished} | ||||
|  | @ -2012,7 +2021,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                  * we should go through and figure out what we actually need to pass down, as well | ||||
|                  * as using something like redux to avoid having a billion bits of state kicking around. | ||||
|                  */ | ||||
|                 const LoggedInView = sdk.getComponent('structures.LoggedInView'); | ||||
|                 view = ( | ||||
|                     <LoggedInView | ||||
|                         {...this.props} | ||||
|  | @ -2020,14 +2028,12 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                         ref={this.loggedInView} | ||||
|                         matrixClient={MatrixClientPeg.get()} | ||||
|                         onRoomCreated={this.onRoomCreated} | ||||
|                         onCloseAllSettings={this.onCloseAllSettings} | ||||
|                         onRegistered={this.onRegistered} | ||||
|                         currentRoomId={this.state.currentRoomId} | ||||
|                     /> | ||||
|                 ); | ||||
|             } else { | ||||
|                 // we think we are logged in, but are still waiting for the /sync to complete
 | ||||
|                 const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|                 let errorBox; | ||||
|                 if (this.state.syncError && !isStoreError) { | ||||
|                     errorBox = <div className="mx_MatrixChat_syncError"> | ||||
|  | @ -2045,10 +2051,8 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                 ); | ||||
|             } | ||||
|         } else if (this.state.view === Views.WELCOME) { | ||||
|             const Welcome = sdk.getComponent('auth.Welcome'); | ||||
|             view = <Welcome />; | ||||
|         } else if (this.state.view === Views.REGISTER && SettingsStore.getValue(UIFeature.Registration)) { | ||||
|             const Registration = sdk.getComponent('structures.auth.Registration'); | ||||
|             const email = ThreepidInviteStore.instance.pickBestInvite()?.toEmail; | ||||
|             view = ( | ||||
|                 <Registration | ||||
|  | @ -2067,7 +2071,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                 /> | ||||
|             ); | ||||
|         } else if (this.state.view === Views.FORGOT_PASSWORD && SettingsStore.getValue(UIFeature.PasswordReset)) { | ||||
|             const ForgotPassword = sdk.getComponent('structures.auth.ForgotPassword'); | ||||
|             view = ( | ||||
|                 <ForgotPassword | ||||
|                     onComplete={this.onLoginClick} | ||||
|  | @ -2078,7 +2081,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|             ); | ||||
|         } else if (this.state.view === Views.LOGIN) { | ||||
|             const showPasswordReset = SettingsStore.getValue(UIFeature.PasswordReset); | ||||
|             const Login = sdk.getComponent('structures.auth.Login'); | ||||
|             view = ( | ||||
|                 <Login | ||||
|                     isSyncing={this.state.pendingInitialSync} | ||||
|  | @ -2094,7 +2096,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|                 /> | ||||
|             ); | ||||
|         } else if (this.state.view === Views.SOFT_LOGOUT) { | ||||
|             const SoftLogout = sdk.getComponent('structures.auth.SoftLogout'); | ||||
|             view = ( | ||||
|                 <SoftLogout | ||||
|                     realQueryParams={this.props.realQueryParams} | ||||
|  | @ -2106,7 +2107,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { | |||
|             console.error(`Unknown view ${this.state.view}`); | ||||
|         } | ||||
| 
 | ||||
|         const ErrorBoundary = sdk.getComponent('elements.ErrorBoundary'); | ||||
|         return <ErrorBoundary> | ||||
|             {view} | ||||
|         </ErrorBoundary>; | ||||
|  |  | |||
|  | @ -34,7 +34,6 @@ import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; | |||
| import ResizeNotifier from '../../utils/ResizeNotifier'; | ||||
| import ContentMessages from '../../ContentMessages'; | ||||
| import Modal from '../../Modal'; | ||||
| import * as sdk from '../../index'; | ||||
| import CallHandler, { PlaceCallType } from '../../CallHandler'; | ||||
| import dis from '../../dispatcher/dispatcher'; | ||||
| import * as Rooms from '../../Rooms'; | ||||
|  | @ -82,6 +81,14 @@ import { replaceableComponent } from "../../utils/replaceableComponent"; | |||
| import UIStore from "../../stores/UIStore"; | ||||
| import EditorStateTransfer from "../../utils/EditorStateTransfer"; | ||||
| import { throttle } from "lodash"; | ||||
| import ErrorDialog from '../views/dialogs/ErrorDialog'; | ||||
| import SearchResultTile from '../views/rooms/SearchResultTile'; | ||||
| import Spinner from "../views/elements/Spinner"; | ||||
| import UploadBar from './UploadBar'; | ||||
| import RoomStatusBar from "./RoomStatusBar"; | ||||
| import MessageComposer from '../views/rooms/MessageComposer'; | ||||
| import JumpToBottomButton from "../views/rooms/JumpToBottomButton"; | ||||
| import TopUnreadMessagesBar from "../views/rooms/TopUnreadMessagesBar"; | ||||
| 
 | ||||
| const DEBUG = false; | ||||
| let debuglog = function(msg: string) {}; | ||||
|  | @ -1328,7 +1335,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|                 searchResults: results, | ||||
|             }); | ||||
|         }, (error) => { | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             console.error("Search failed", error); | ||||
|             Modal.createTrackedDialog('Search failed', '', ErrorDialog, { | ||||
|                 title: _t("Search failed"), | ||||
|  | @ -1344,9 +1350,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     private getSearchResultTiles() { | ||||
|         const SearchResultTile = sdk.getComponent('rooms.SearchResultTile'); | ||||
|         const Spinner = sdk.getComponent("elements.Spinner"); | ||||
| 
 | ||||
|         // XXX: todo: merge overlapping results somehow?
 | ||||
|         // XXX: why doesn't searching on name work?
 | ||||
| 
 | ||||
|  | @ -1466,7 +1469,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|             console.error("Failed to reject invite: %s", error); | ||||
| 
 | ||||
|             const msg = error.message ? error.message : JSON.stringify(error); | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to reject invite', '', ErrorDialog, { | ||||
|                 title: _t("Failed to reject invite"), | ||||
|                 description: msg, | ||||
|  | @ -1500,7 +1502,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|             console.error("Failed to reject invite: %s", error); | ||||
| 
 | ||||
|             const msg = error.message ? error.message : JSON.stringify(error); | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to reject invite', '', ErrorDialog, { | ||||
|                 title: _t("Failed to reject invite"), | ||||
|                 description: msg, | ||||
|  | @ -1834,10 +1835,8 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|         let isStatusAreaExpanded = true; | ||||
| 
 | ||||
|         if (ContentMessages.sharedInstance().getCurrentUploads().length > 0) { | ||||
|             const UploadBar = sdk.getComponent('structures.UploadBar'); | ||||
|             statusBar = <UploadBar room={this.state.room} />; | ||||
|         } else if (!this.state.searchResults) { | ||||
|             const RoomStatusBar = sdk.getComponent('structures.RoomStatusBar'); | ||||
|             isStatusAreaExpanded = this.state.statusBarVisible; | ||||
|             statusBar = <RoomStatusBar | ||||
|                 room={this.state.room} | ||||
|  | @ -1943,12 +1942,9 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|             myMembership === 'join' && !this.state.searchResults | ||||
|         ); | ||||
|         if (canSpeak) { | ||||
|             const MessageComposer = sdk.getComponent('rooms.MessageComposer'); | ||||
|             messageComposer = | ||||
|                 <MessageComposer | ||||
|                     room={this.state.room} | ||||
|                     callState={this.state.callState} | ||||
|                     showApps={this.state.showApps} | ||||
|                     e2eStatus={this.state.e2eStatus} | ||||
|                     resizeNotifier={this.props.resizeNotifier} | ||||
|                     replyToEvent={this.state.replyToEvent} | ||||
|  | @ -2034,7 +2030,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|         let topUnreadMessagesBar = null; | ||||
|         // Do not show TopUnreadMessagesBar if we have search results showing, it makes no sense
 | ||||
|         if (this.state.showTopUnreadMessagesBar && !this.state.searchResults) { | ||||
|             const TopUnreadMessagesBar = sdk.getComponent('rooms.TopUnreadMessagesBar'); | ||||
|             topUnreadMessagesBar = ( | ||||
|                 <TopUnreadMessagesBar onScrollUpClick={this.jumpToReadMarker} onCloseClick={this.forgetReadMarker} /> | ||||
|             ); | ||||
|  | @ -2042,7 +2037,6 @@ export default class RoomView extends React.Component<IProps, IState> { | |||
|         let jumpToBottom; | ||||
|         // Do not show JumpToBottomButton if we have search results showing, it makes no sense
 | ||||
|         if (!this.state.atEndOfLiveTimeline && !this.state.searchResults) { | ||||
|             const JumpToBottomButton = sdk.getComponent('rooms.JumpToBottomButton'); | ||||
|             jumpToBottom = (<JumpToBottomButton | ||||
|                 highlight={this.state.room.getUnreadNotificationCount(NotificationCountType.Highlight) > 0} | ||||
|                 numUnreadMessages={this.state.numUnreadMessages} | ||||
|  |  | |||
|  | @ -18,9 +18,9 @@ limitations under the License. | |||
| 
 | ||||
| import * as React from "react"; | ||||
| import { _t } from '../../languageHandler'; | ||||
| import * as sdk from "../../index"; | ||||
| import AutoHideScrollbar from './AutoHideScrollbar'; | ||||
| import { replaceableComponent } from "../../utils/replaceableComponent"; | ||||
| import AccessibleButton from "../views/elements/AccessibleButton"; | ||||
| 
 | ||||
| /** | ||||
|  * Represents a tab for the TabbedView. | ||||
|  | @ -82,8 +82,6 @@ export default class TabbedView extends React.Component<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     private _renderTabLabel(tab: Tab) { | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         let classes = "mx_TabbedView_tabLabel "; | ||||
| 
 | ||||
|         const idx = this.props.tabs.indexOf(tab); | ||||
|  |  | |||
|  | @ -32,7 +32,6 @@ import RoomContext from "../../contexts/RoomContext"; | |||
| import UserActivity from "../../UserActivity"; | ||||
| import Modal from "../../Modal"; | ||||
| import dis from "../../dispatcher/dispatcher"; | ||||
| import * as sdk from "../../index"; | ||||
| import { Key } from '../../Keyboard'; | ||||
| import Timer from '../../utils/Timer'; | ||||
| import shouldHideEvent from '../../shouldHideEvent'; | ||||
|  | @ -47,6 +46,7 @@ import ResizeNotifier from "../../utils/ResizeNotifier"; | |||
| import { RoomPermalinkCreator } from "../../utils/permalinks/Permalinks"; | ||||
| import Spinner from "../views/elements/Spinner"; | ||||
| import EditorStateTransfer from '../../utils/EditorStateTransfer'; | ||||
| import ErrorDialog from '../views/dialogs/ErrorDialog'; | ||||
| 
 | ||||
| const PAGINATE_SIZE = 20; | ||||
| const INITIAL_SIZE = 20; | ||||
|  | @ -1096,7 +1096,6 @@ class TimelinePanel extends React.Component<IProps, IState> { | |||
|             console.error( | ||||
|                 `Error loading timeline panel at ${eventId}: ${error}`, | ||||
|             ); | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
| 
 | ||||
|             let onFinished; | ||||
| 
 | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ enum Phase { | |||
| 
 | ||||
| interface IProps { | ||||
|     serverConfig: ValidatedServerConfig; | ||||
|     onServerConfigChange: () => void; | ||||
|     onServerConfigChange: (serverConfig: ValidatedServerConfig) => void; | ||||
|     onLoginClick?: () => void; | ||||
|     onComplete: () => void; | ||||
| } | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React, { ReactNode } from 'react'; | |||
| import { MatrixError } from "matrix-js-sdk/src/http-api"; | ||||
| 
 | ||||
| import { _t, _td } from '../../../languageHandler'; | ||||
| import * as sdk from '../../../index'; | ||||
| import Login, { ISSOFlow, LoginFlow } from '../../../Login'; | ||||
| import SdkConfig from '../../../SdkConfig'; | ||||
| import { messageForResourceLimitError } from '../../../utils/ErrorUtils'; | ||||
|  | @ -36,6 +35,8 @@ import Spinner from "../../views/elements/Spinner"; | |||
| import SSOButtons from "../../views/elements/SSOButtons"; | ||||
| import ServerPicker from "../../views/elements/ServerPicker"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import AuthBody from "../../views/auth/AuthBody"; | ||||
| import AuthHeader from "../../views/auth/AuthHeader"; | ||||
| 
 | ||||
| // These are used in several places, and come from the js-sdk's autodiscovery
 | ||||
| // stuff. We define them here so that they'll be picked up by i18n.
 | ||||
|  | @ -541,8 +542,6 @@ export default class LoginComponent extends React.PureComponent<IProps, IState> | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const AuthHeader = sdk.getComponent("auth.AuthHeader"); | ||||
|         const AuthBody = sdk.getComponent("auth.AuthBody"); | ||||
|         const loader = this.isBusy() && !this.state.busyLoggingIn ? | ||||
|             <div className="mx_Login_loader"><Spinner /></div> : null; | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,19 +18,24 @@ import { createClient } from 'matrix-js-sdk/src/matrix'; | |||
| import React, { ReactNode } from 'react'; | ||||
| import { MatrixClient } from "matrix-js-sdk/src/client"; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t, _td } from '../../../languageHandler'; | ||||
| import { messageForResourceLimitError } from '../../../utils/ErrorUtils'; | ||||
| import AutoDiscoveryUtils, { ValidatedServerConfig } from "../../../utils/AutoDiscoveryUtils"; | ||||
| import classNames from "classnames"; | ||||
| import * as Lifecycle from '../../../Lifecycle'; | ||||
| import { MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import { IMatrixClientCreds, MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import AuthPage from "../../views/auth/AuthPage"; | ||||
| import Login, { ISSOFlow } from "../../../Login"; | ||||
| import dis from "../../../dispatcher/dispatcher"; | ||||
| import SSOButtons from "../../views/elements/SSOButtons"; | ||||
| import ServerPicker from '../../views/elements/ServerPicker'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import RegistrationForm from '../../views/auth/RegistrationForm'; | ||||
| import AccessibleButton from '../../views/elements/AccessibleButton'; | ||||
| import AuthBody from "../../views/auth/AuthBody"; | ||||
| import AuthHeader from "../../views/auth/AuthHeader"; | ||||
| import InteractiveAuth from "../InteractiveAuth"; | ||||
| import Spinner from "../../views/elements/Spinner"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     serverConfig: ValidatedServerConfig; | ||||
|  | @ -47,13 +52,7 @@ interface IProps { | |||
|     // - The user's password, if available and applicable (may be cached in memory
 | ||||
|     //   for a short time so the user is not required to re-enter their password
 | ||||
|     //   for operations like uploading cross-signing keys).
 | ||||
|     onLoggedIn(params: { | ||||
|         userId: string; | ||||
|         deviceId: string; | ||||
|         homeserverUrl: string; | ||||
|         identityServerUrl?: string; | ||||
|         accessToken: string; | ||||
|     }, password: string): void; | ||||
|     onLoggedIn(params: IMatrixClientCreds, password: string): void; | ||||
|     makeRegistrationUrl(params: { | ||||
|         /* eslint-disable camelcase */ | ||||
|         client_secret: string; | ||||
|  | @ -246,7 +245,7 @@ export default class Registration extends React.Component<IProps, IState> { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private onFormSubmit = formVals => { | ||||
|     private onFormSubmit = async (formVals): Promise<void> => { | ||||
|         this.setState({ | ||||
|             errorText: "", | ||||
|             busy: true, | ||||
|  | @ -442,10 +441,6 @@ export default class Registration extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     private renderRegisterComponent() { | ||||
|         const InteractiveAuth = sdk.getComponent('structures.InteractiveAuth'); | ||||
|         const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|         const RegistrationForm = sdk.getComponent('auth.RegistrationForm'); | ||||
| 
 | ||||
|         if (this.state.matrixClient && this.state.doingUIAuth) { | ||||
|             return <InteractiveAuth | ||||
|                 matrixClient={this.state.matrixClient} | ||||
|  | @ -516,10 +511,6 @@ export default class Registration extends React.Component<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const AuthHeader = sdk.getComponent('auth.AuthHeader'); | ||||
|         const AuthBody = sdk.getComponent("auth.AuthBody"); | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         let errorText; | ||||
|         const err = this.state.errorText; | ||||
|         if (err) { | ||||
|  |  | |||
|  | @ -16,7 +16,6 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import * as sdk from '../../../index'; | ||||
| import dis from '../../../dispatcher/dispatcher'; | ||||
| import * as Lifecycle from '../../../Lifecycle'; | ||||
| import Modal from '../../../Modal'; | ||||
|  | @ -26,6 +25,12 @@ import AuthPage from "../../views/auth/AuthPage"; | |||
| import { SSO_HOMESERVER_URL_KEY, SSO_ID_SERVER_URL_KEY } from "../../../BasePlatform"; | ||||
| import SSOButtons from "../../views/elements/SSOButtons"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import ConfirmWipeDeviceDialog from '../../views/dialogs/ConfirmWipeDeviceDialog'; | ||||
| import Field from '../../views/elements/Field'; | ||||
| import AccessibleButton from '../../views/elements/AccessibleButton'; | ||||
| import Spinner from "../../views/elements/Spinner"; | ||||
| import AuthHeader from "../../views/auth/AuthHeader"; | ||||
| import AuthBody from "../../views/auth/AuthBody"; | ||||
| 
 | ||||
| const LOGIN_VIEW = { | ||||
|     LOADING: 1, | ||||
|  | @ -94,7 +99,6 @@ export default class SoftLogout extends React.Component<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     onClearAll = () => { | ||||
|         const ConfirmWipeDeviceDialog = sdk.getComponent('dialogs.ConfirmWipeDeviceDialog'); | ||||
|         Modal.createTrackedDialog('Clear Data', 'Soft Logout', ConfirmWipeDeviceDialog, { | ||||
|             onFinished: (wipeData) => { | ||||
|                 if (!wipeData) return; | ||||
|  | @ -202,7 +206,6 @@ export default class SoftLogout extends React.Component<IProps, IState> { | |||
| 
 | ||||
|     private renderSignInSection() { | ||||
|         if (this.state.loginView === LOGIN_VIEW.LOADING) { | ||||
|             const Spinner = sdk.getComponent("elements.Spinner"); | ||||
|             return <Spinner />; | ||||
|         } | ||||
| 
 | ||||
|  | @ -214,9 +217,6 @@ export default class SoftLogout extends React.Component<IProps, IState> { | |||
|         } | ||||
| 
 | ||||
|         if (this.state.loginView === LOGIN_VIEW.PASSWORD) { | ||||
|             const Field = sdk.getComponent("elements.Field"); | ||||
|             const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|             let error = null; | ||||
|             if (this.state.errorText) { | ||||
|                 error = <span className='mx_Login_error'>{this.state.errorText}</span>; | ||||
|  | @ -286,10 +286,6 @@ export default class SoftLogout extends React.Component<IProps, IState> { | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const AuthHeader = sdk.getComponent("auth.AuthHeader"); | ||||
|         const AuthBody = sdk.getComponent("auth.AuthBody"); | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         return ( | ||||
|             <AuthPage> | ||||
|                 <AuthHeader /> | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React, { ChangeEvent, createRef, FormEvent, MouseEvent } from 'react'; | |||
| import classNames from 'classnames'; | ||||
| import { MatrixClient } from "matrix-js-sdk/src/client"; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import AccessibleButton from "../elements/AccessibleButton"; | ||||
|  | @ -26,6 +25,8 @@ import Spinner from "../elements/Spinner"; | |||
| import CountlyAnalytics from "../../../CountlyAnalytics"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { LocalisedPolicy, Policies } from '../../../Terms'; | ||||
| import Field from '../elements/Field'; | ||||
| import CaptchaForm from "./CaptchaForm"; | ||||
| 
 | ||||
| /* This file contains a collection of components which are used by the | ||||
|  * InteractiveAuth to prompt the user to enter the information needed | ||||
|  | @ -164,8 +165,7 @@ export class PasswordAuthEntry extends React.Component<IAuthEntryProps, IPasswor | |||
| 
 | ||||
|         let submitButtonOrSpinner; | ||||
|         if (this.props.busy) { | ||||
|             const Loader = sdk.getComponent("elements.Spinner"); | ||||
|             submitButtonOrSpinner = <Loader />; | ||||
|             submitButtonOrSpinner = <Spinner />; | ||||
|         } else { | ||||
|             submitButtonOrSpinner = ( | ||||
|                 <input type="submit" | ||||
|  | @ -185,8 +185,6 @@ export class PasswordAuthEntry extends React.Component<IAuthEntryProps, IPasswor | |||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         const Field = sdk.getComponent('elements.Field'); | ||||
| 
 | ||||
|         return ( | ||||
|             <div> | ||||
|                 <p>{ _t("Confirm your identity by entering your account password below.") }</p> | ||||
|  | @ -236,13 +234,11 @@ export class RecaptchaAuthEntry extends React.Component<IRecaptchaAuthEntryProps | |||
| 
 | ||||
|     render() { | ||||
|         if (this.props.busy) { | ||||
|             const Loader = sdk.getComponent("elements.Spinner"); | ||||
|             return <Loader />; | ||||
|             return <Spinner />; | ||||
|         } | ||||
| 
 | ||||
|         let errorText = this.props.errorText; | ||||
| 
 | ||||
|         const CaptchaForm = sdk.getComponent("views.auth.CaptchaForm"); | ||||
|         let sitePublicKey; | ||||
|         if (!this.props.stageParams || !this.props.stageParams.public_key) { | ||||
|             errorText = _t( | ||||
|  | @ -390,8 +386,7 @@ export class TermsAuthEntry extends React.Component<ITermsAuthEntryProps, ITerms | |||
| 
 | ||||
|     render() { | ||||
|         if (this.props.busy) { | ||||
|             const Loader = sdk.getComponent("elements.Spinner"); | ||||
|             return <Loader />; | ||||
|             return <Spinner />; | ||||
|         } | ||||
| 
 | ||||
|         const checkboxes = []; | ||||
|  | @ -590,8 +585,7 @@ export class MsisdnAuthEntry extends React.Component<IMsisdnAuthEntryProps, IMsi | |||
| 
 | ||||
|     render() { | ||||
|         if (this.state.requestingToken) { | ||||
|             const Loader = sdk.getComponent("elements.Spinner"); | ||||
|             return <Loader />; | ||||
|             return <Spinner />; | ||||
|         } else { | ||||
|             const enableSubmit = Boolean(this.state.token); | ||||
|             const submitClasses = classNames({ | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import * as Email from '../../../email'; | ||||
| import { looksValid as phoneNumberLooksValid } from '../../../phonenumber'; | ||||
| import Modal from '../../../Modal'; | ||||
|  | @ -31,6 +30,7 @@ import CountlyAnalytics from "../../../CountlyAnalytics"; | |||
| import Field from '../elements/Field'; | ||||
| import RegistrationEmailPromptDialog from '../dialogs/RegistrationEmailPromptDialog'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import CountryDropdown from "./CountryDropdown"; | ||||
| 
 | ||||
| enum RegistrationField { | ||||
|     Email = "field_email", | ||||
|  | @ -471,7 +471,6 @@ export default class RegistrationForm extends React.PureComponent<IProps, IState | |||
|         if (!this.showPhoneNumber()) { | ||||
|             return null; | ||||
|         } | ||||
|         const CountryDropdown = sdk.getComponent('views.auth.CountryDropdown'); | ||||
|         const phoneLabel = this.authStepIsRequired('m.login.msisdn') ? | ||||
|             _t("Phone") : | ||||
|             _t("Phone (optional)"); | ||||
|  |  | |||
|  | @ -15,11 +15,11 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import { SettingLevel } from "../../../settings/SettingLevel"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     unknownProfileUsers: Array<{ | ||||
|  | @ -50,8 +50,6 @@ export default class AskInviteAnywayDialog extends React.Component<IProps> { | |||
|     }; | ||||
| 
 | ||||
|     public render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
| 
 | ||||
|         const errorList = this.props.unknownProfileUsers | ||||
|             .map(address => <li key={address.userId}>{address.userId}: {address.errorText}</li>); | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,13 +18,17 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import SdkConfig from '../../../SdkConfig'; | ||||
| import Modal from '../../../Modal'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import sendBugReport, { downloadBugReport } from '../../../rageshake/submit-rageshake'; | ||||
| import AccessibleButton from "../elements/AccessibleButton"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import QuestionDialog from "./QuestionDialog"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import Field from '../elements/Field'; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -93,7 +97,6 @@ export default class BugReportDialog extends React.Component<IProps, IState> { | |||
|         }).then(() => { | ||||
|             if (!this.unmounted) { | ||||
|                 this.props.onFinished(false); | ||||
|                 const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|                 // N.B. first param is passed to piwik and so doesn't want i18n
 | ||||
|                 Modal.createTrackedDialog('Bug report sent', '', QuestionDialog, { | ||||
|                     title: _t('Logs sent'), | ||||
|  | @ -160,11 +163,6 @@ export default class BugReportDialog extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     public render() { | ||||
|         const Loader = sdk.getComponent("elements.Spinner"); | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|         const Field = sdk.getComponent('elements.Field'); | ||||
| 
 | ||||
|         let error = null; | ||||
|         if (this.state.err) { | ||||
|             error = <div className="error"> | ||||
|  | @ -176,7 +174,7 @@ export default class BugReportDialog extends React.Component<IProps, IState> { | |||
|         if (this.state.busy) { | ||||
|             progress = ( | ||||
|                 <div className="progress"> | ||||
|                     <Loader /> | ||||
|                     <Spinner /> | ||||
|                     {this.state.progress} ... | ||||
|                 </div> | ||||
|             ); | ||||
|  |  | |||
|  | @ -16,9 +16,10 @@ Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> | |||
|  */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import request from 'browser-request'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import QuestionDialog from "./QuestionDialog"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     newVersion: string; | ||||
|  | @ -65,9 +66,6 @@ export default class ChangelogDialog extends React.Component<IProps> { | |||
|     } | ||||
| 
 | ||||
|     public render() { | ||||
|         const Spinner = sdk.getComponent('views.elements.Spinner'); | ||||
|         const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); | ||||
| 
 | ||||
|         const logs = REPOS.map(repo => { | ||||
|             let content; | ||||
|             if (this.state[repo] == null) { | ||||
|  |  | |||
|  | @ -15,9 +15,12 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import ConfirmRedactDialog from './ConfirmRedactDialog'; | ||||
| import ErrorDialog from './ErrorDialog'; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     redact: () => Promise<void>; | ||||
|  | @ -73,7 +76,6 @@ export default class ConfirmAndWaitRedactDialog extends React.PureComponent<IPro | |||
|     public render() { | ||||
|         if (this.state.isRedacting) { | ||||
|             if (this.state.redactionErrorCode) { | ||||
|                 const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                 const code = this.state.redactionErrorCode; | ||||
|                 return ( | ||||
|                     <ErrorDialog | ||||
|  | @ -83,8 +85,6 @@ export default class ConfirmAndWaitRedactDialog extends React.PureComponent<IPro | |||
|                     /> | ||||
|                 ); | ||||
|             } else { | ||||
|                 const BaseDialog = sdk.getComponent("dialogs.BaseDialog"); | ||||
|                 const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|                 return ( | ||||
|                     <BaseDialog | ||||
|                         onFinished={this.props.onFinished} | ||||
|  | @ -95,7 +95,6 @@ export default class ConfirmAndWaitRedactDialog extends React.PureComponent<IPro | |||
|                 ); | ||||
|             } | ||||
|         } else { | ||||
|             const ConfirmRedactDialog = sdk.getComponent("dialogs.ConfirmRedactDialog"); | ||||
|             return <ConfirmRedactDialog onFinished={this.onParentFinished} />; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -15,9 +15,9 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import TextInputDialog from "./TextInputDialog"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -29,7 +29,6 @@ interface IProps { | |||
| @replaceableComponent("views.dialogs.ConfirmRedactDialog") | ||||
| export default class ConfirmRedactDialog extends React.Component<IProps> { | ||||
|     render() { | ||||
|         const TextInputDialog = sdk.getComponent('views.dialogs.TextInputDialog'); | ||||
|         return ( | ||||
|             <TextInputDialog onFinished={this.props.onFinished} | ||||
|                 title={_t("Confirm Removal")} | ||||
|  |  | |||
|  | @ -17,11 +17,14 @@ limitations under the License. | |||
| import React from 'react'; | ||||
| import { MatrixClient } from 'matrix-js-sdk/src/client'; | ||||
| import { RoomMember } from "matrix-js-sdk/src/models/room-member"; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { GroupMemberType } from '../../../groups'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { mediaFromMxc } from "../../../customisations/Media"; | ||||
| import MemberAvatar from '../avatars/MemberAvatar'; | ||||
| import BaseAvatar from '../avatars/BaseAvatar'; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     // matrix-js-sdk (room) member object. Supply either this or 'groupMember'
 | ||||
|  | @ -67,11 +70,6 @@ export default class ConfirmUserActionDialog extends React.Component<IProps> { | |||
|     }; | ||||
| 
 | ||||
|     public render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|         const MemberAvatar = sdk.getComponent("views.avatars.MemberAvatar"); | ||||
|         const BaseAvatar = sdk.getComponent("views.avatars.BaseAvatar"); | ||||
| 
 | ||||
|         const confirmButtonClass = this.props.danger ? 'danger' : ''; | ||||
| 
 | ||||
|         let reasonBox; | ||||
|  |  | |||
|  | @ -16,8 +16,9 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import * as sdk from "../../../index"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -34,9 +35,6 @@ export default class ConfirmWipeDeviceDialog extends React.Component<IProps> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
| 
 | ||||
|         return ( | ||||
|             <BaseDialog | ||||
|                 className='mx_ConfirmWipeDeviceDialog' | ||||
|  |  | |||
|  | @ -15,11 +15,12 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import dis from '../../../dispatcher/dispatcher'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { MatrixClientPeg } from '../../../MatrixClientPeg'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -106,9 +107,6 @@ export default class CreateGroupDialog extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const Spinner = sdk.getComponent('elements.Spinner'); | ||||
| 
 | ||||
|         if (this.state.creating) { | ||||
|             return <Spinner />; | ||||
|         } | ||||
|  |  | |||
|  | @ -16,21 +16,22 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import dis from '../../../dispatcher/dispatcher'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import SdkConfig from '../../../SdkConfig'; | ||||
| import Modal from '../../../Modal'; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| import QuestionDialog from "./QuestionDialog"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
| } | ||||
| 
 | ||||
| export default (props: IProps) => { | ||||
| const CryptoStoreTooNewDialog: React.FC<IProps> = (props: IProps) => { | ||||
|     const brand = SdkConfig.get().brand; | ||||
| 
 | ||||
|     const _onLogoutClicked = () => { | ||||
|         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|         Modal.createTrackedDialog('Logout e2e db too new', '', QuestionDialog, { | ||||
|             title: _t("Sign out"), | ||||
|             description: _t( | ||||
|  | @ -58,8 +59,6 @@ export default (props: IProps) => { | |||
|             { brand }, | ||||
|         ); | ||||
| 
 | ||||
|     const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|     const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|     return (<BaseDialog className="mx_CryptoStoreTooNewDialog" | ||||
|         contentId='mx_Dialog_content' | ||||
|         title={_t("Incompatible Database")} | ||||
|  | @ -79,3 +78,5 @@ export default (props: IProps) => { | |||
|         </DialogButtons> | ||||
|     </BaseDialog>); | ||||
| }; | ||||
| 
 | ||||
| export default CryptoStoreTooNewDialog; | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import Analytics from '../../../Analytics'; | ||||
| import { MatrixClientPeg } from '../../../MatrixClientPeg'; | ||||
| import * as Lifecycle from '../../../Lifecycle'; | ||||
|  | @ -26,6 +25,7 @@ import InteractiveAuth, { ERROR_USER_CANCELLED } from "../../structures/Interact | |||
| import { DEFAULT_PHASE, PasswordAuthEntry, SSOAuthEntry } from "../auth/InteractiveAuthEntryComponents"; | ||||
| import StyledCheckbox from "../elements/StyledCheckbox"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -165,8 +165,6 @@ export default class DeactivateAccountDialog extends React.Component<IProps, ISt | |||
|     } | ||||
| 
 | ||||
|     public render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
| 
 | ||||
|         let error = null; | ||||
|         if (this.state.errStr) { | ||||
|             error = <div className="error"> | ||||
|  |  | |||
|  | @ -16,7 +16,6 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React, { useState, useEffect, ChangeEvent, MouseEvent } from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import SyntaxHighlight from '../elements/SyntaxHighlight'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import Field from "../elements/Field"; | ||||
|  | @ -42,6 +41,8 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; | |||
| import { Room } from "matrix-js-sdk/src/models/room"; | ||||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||
| import { SettingLevel } from '../../../settings/SettingLevel'; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import TruncatedList from "../elements/TruncatedList"; | ||||
| 
 | ||||
| interface IGenericEditorProps { | ||||
|     onBack: () => void; | ||||
|  | @ -369,7 +370,6 @@ class FilteredList extends React.PureComponent<IFilteredListProps, IFilteredList | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const TruncatedList = sdk.getComponent("elements.TruncatedList"); | ||||
|         return <div> | ||||
|             <Field label={_t('Filter results')} autoFocus={true} size={64} | ||||
|                 type="text" autoComplete="off" value={this.props.query} onChange={this.onQuery} | ||||
|  | @ -1261,7 +1261,6 @@ export default class DevtoolsDialog extends React.PureComponent<IProps, IState> | |||
|             </React.Fragment>; | ||||
|         } | ||||
| 
 | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         return ( | ||||
|             <BaseDialog className="mx_QuestionDialog" onFinished={this.props.onFinished} title={_t('Developer Tools')}> | ||||
|                 { body } | ||||
|  |  | |||
|  | @ -26,9 +26,9 @@ limitations under the License. | |||
|  */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -57,7 +57,6 @@ export default class ErrorDialog extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     public render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         return ( | ||||
|             <BaseDialog | ||||
|                 className="mx_ErrorDialog" | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React, { createRef } from 'react'; | |||
| import classNames from 'classnames'; | ||||
| 
 | ||||
| import { _t, _td } from "../../../languageHandler"; | ||||
| import * as sdk from "../../../index"; | ||||
| import { MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import { makeRoomPermalink, makeUserPermalink } from "../../../utils/permalinks/Permalinks"; | ||||
| import DMRoomMap from "../../../utils/DMRoomMap"; | ||||
|  | @ -65,6 +64,9 @@ import { copyPlaintext, selectText } from "../../../utils/strings"; | |||
| import * as ContextMenu from "../../structures/ContextMenu"; | ||||
| import { toRightOf } from "../../structures/ContextMenu"; | ||||
| import GenericTextContextMenu from "../context_menus/GenericTextContextMenu"; | ||||
| import QuestionDialog from "./QuestionDialog"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| // we have a number of types defined from the Matrix spec which can't reasonably be altered here.
 | ||||
| /* eslint-disable camelcase */ | ||||
|  | @ -1046,7 +1048,6 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps | |||
|         if (this.unmounted) return; | ||||
| 
 | ||||
|         if (failed.length > 0) { | ||||
|             const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); | ||||
|             Modal.createTrackedDialog('Invite Paste Fail', '', QuestionDialog, { | ||||
|                 title: _t('Failed to find the following users'), | ||||
|                 description: _t( | ||||
|  | @ -1158,7 +1159,6 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps | |||
|         const toRender = sourceMembers.slice(0, showNum); | ||||
|         const hasMore = toRender.length < sourceMembers.length; | ||||
| 
 | ||||
|         const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
|         let showMore = null; | ||||
|         if (hasMore) { | ||||
|             showMore = ( | ||||
|  | @ -1269,10 +1269,6 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
|         const Spinner = sdk.getComponent("elements.Spinner"); | ||||
| 
 | ||||
|         let spinner = null; | ||||
|         if (this.state.busy) { | ||||
|             spinner = <Spinner w={20} h={20} />; | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { ensureDMExists } from "../../../createRoom"; | ||||
| import { IDialogProps } from "./IDialogProps"; | ||||
|  | @ -26,6 +25,10 @@ import Markdown from '../../../Markdown'; | |||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import StyledRadioButton from "../elements/StyledRadioButton"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| import Field from "../elements/Field"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| 
 | ||||
| interface IProps extends IDialogProps { | ||||
|     mxEvent: MatrixEvent; | ||||
|  | @ -239,11 +242,6 @@ export default class ReportEventDialog extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
|         const Loader = sdk.getComponent('elements.Spinner'); | ||||
|         const Field = sdk.getComponent('elements.Field'); | ||||
| 
 | ||||
|         let error = null; | ||||
|         if (this.state.err) { | ||||
|             error = <div className="error"> | ||||
|  | @ -255,7 +253,7 @@ export default class ReportEventDialog extends React.Component<IProps, IState> { | |||
|         if (this.state.busy) { | ||||
|             progress = ( | ||||
|                 <div className="progress"> | ||||
|                     <Loader /> | ||||
|                     <Spinner /> | ||||
|                 </div> | ||||
|             ); | ||||
|         } | ||||
|  |  | |||
|  | @ -24,12 +24,12 @@ import GeneralRoomSettingsTab from "../settings/tabs/room/GeneralRoomSettingsTab | |||
| import SecurityRoomSettingsTab from "../settings/tabs/room/SecurityRoomSettingsTab"; | ||||
| import NotificationSettingsTab from "../settings/tabs/room/NotificationSettingsTab"; | ||||
| import BridgeSettingsTab from "../settings/tabs/room/BridgeSettingsTab"; | ||||
| import * as sdk from "../../../index"; | ||||
| import { MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import dis from "../../../dispatcher/dispatcher"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import { UIFeature } from "../../../settings/UIFeature"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| export const ROOM_GENERAL_TAB = "ROOM_GENERAL_TAB"; | ||||
| export const ROOM_SECURITY_TAB = "ROOM_SECURITY_TAB"; | ||||
|  | @ -119,8 +119,6 @@ export default class RoomSettingsDialog extends React.Component<IProps> { | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
| 
 | ||||
|         const roomName = MatrixClientPeg.get().getRoom(this.props.roomId).name; | ||||
|         return ( | ||||
|             <BaseDialog | ||||
|  |  | |||
|  | @ -22,7 +22,6 @@ import { User } from "matrix-js-sdk/src/models/user"; | |||
| import { Group } from "matrix-js-sdk/src/models/group"; | ||||
| import { RoomMember } from "matrix-js-sdk/src/models/room-member"; | ||||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import QRCode from "../elements/QRCode"; | ||||
| import { RoomPermalinkCreator, makeGroupPermalink, makeUserPermalink } from "../../../utils/permalinks/Permalinks"; | ||||
|  | @ -35,6 +34,8 @@ import { IDialogProps } from "./IDialogProps"; | |||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import { UIFeature } from "../../../settings/UIFeature"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import GenericTextContextMenu from "../context_menus/GenericTextContextMenu.js"; | ||||
| 
 | ||||
| const socials = [ | ||||
|     { | ||||
|  | @ -119,7 +120,6 @@ export default class ShareDialog extends React.PureComponent<IProps, IState> { | |||
| 
 | ||||
|         const successful = await copyPlaintext(this.getUrl()); | ||||
|         const buttonRect = target.getBoundingClientRect(); | ||||
|         const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); | ||||
|         const { close } = ContextMenu.createMenu(GenericTextContextMenu, { | ||||
|             ...toRightOf(buttonRect, 2), | ||||
|             message: successful ? _t('Copied!') : _t('Failed to copy'), | ||||
|  | @ -230,7 +230,6 @@ export default class ShareDialog extends React.PureComponent<IProps, IState> { | |||
|             </>; | ||||
|         } | ||||
| 
 | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         return <BaseDialog | ||||
|             title={title} | ||||
|             className='mx_ShareDialog' | ||||
|  |  | |||
|  | @ -16,11 +16,12 @@ limitations under the License. | |||
| 
 | ||||
| import url from 'url'; | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t, pickBestLanguage } from '../../../languageHandler'; | ||||
| 
 | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { SERVICE_TYPES } from "matrix-js-sdk/src/service-types"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| interface ITermsCheckboxProps { | ||||
|     onChange: (url: string, checked: boolean) => void; | ||||
|  | @ -117,9 +118,6 @@ export default class TermsDialog extends React.PureComponent<ITermsDialogProps, | |||
|     }; | ||||
| 
 | ||||
|     public render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
| 
 | ||||
|         const rows = []; | ||||
|         for (const policiesAndService of this.props.policiesAndServicePairs) { | ||||
|             const parsedBaseUrl = url.parse(policiesAndService.service.baseUrl); | ||||
|  |  | |||
|  | @ -16,11 +16,12 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import filesize from "filesize"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { getBlobSafeMimeType } from '../../../utils/blobs'; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| import DialogButtons from "../elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     file: File; | ||||
|  | @ -67,9 +68,6 @@ export default class UploadConfirmDialog extends React.Component<IProps> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
| 
 | ||||
|         let title; | ||||
|         if (this.props.totalFiles > 1 && this.props.currentIndex !== undefined) { | ||||
|             title = _t( | ||||
|  |  | |||
|  | @ -28,11 +28,11 @@ import PreferencesUserSettingsTab from "../settings/tabs/user/PreferencesUserSet | |||
| import VoiceUserSettingsTab from "../settings/tabs/user/VoiceUserSettingsTab"; | ||||
| import HelpUserSettingsTab from "../settings/tabs/user/HelpUserSettingsTab"; | ||||
| import FlairUserSettingsTab from "../settings/tabs/user/FlairUserSettingsTab"; | ||||
| import * as sdk from "../../../index"; | ||||
| import SdkConfig from "../../../SdkConfig"; | ||||
| import MjolnirUserSettingsTab from "../settings/tabs/user/MjolnirUserSettingsTab"; | ||||
| import { UIFeature } from "../../../settings/UIFeature"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "./BaseDialog"; | ||||
| 
 | ||||
| export enum UserTab { | ||||
|     General = "USER_GENERAL_TAB", | ||||
|  | @ -162,8 +162,6 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
| 
 | ||||
|         return ( | ||||
|             <BaseDialog | ||||
|                 className='mx_UserSettingsDialog' | ||||
|  |  | |||
|  | @ -16,8 +16,9 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| import { _t } from "../../../../languageHandler"; | ||||
| import * as sdk from "../../../../index"; | ||||
| import { replaceableComponent } from "../../../../utils/replaceableComponent"; | ||||
| import BaseDialog from "../BaseDialog"; | ||||
| import DialogButtons from "../../elements/DialogButtons"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     onFinished: (success: boolean) => void; | ||||
|  | @ -34,9 +35,6 @@ export default class ConfirmDestroyCrossSigningDialog extends React.Component<IP | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); | ||||
| 
 | ||||
|         return ( | ||||
|             <BaseDialog | ||||
|                 className='mx_ConfirmDestroyCrossSigningDialog' | ||||
|  |  | |||
|  | @ -260,6 +260,7 @@ export default class Field extends React.PureComponent<PropShapes, IState> { | |||
|         }); | ||||
| 
 | ||||
|         // Handle displaying feedback on validity
 | ||||
|         // FIXME: Using an import will result in test failures
 | ||||
|         const Tooltip = sdk.getComponent("elements.Tooltip"); | ||||
|         let fieldTooltip; | ||||
|         if (tooltipContent || this.state.feedback) { | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ import FocusLock from "react-focus-lock"; | |||
| import MemberAvatar from "../avatars/MemberAvatar"; | ||||
| import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; | ||||
| import MessageContextMenu from "../context_menus/MessageContextMenu"; | ||||
| import { aboveLeftOf, ContextMenu } from '../../structures/ContextMenu'; | ||||
| import { aboveLeftOf } from '../../structures/ContextMenu'; | ||||
| import MessageTimestamp from "../messages/MessageTimestamp"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import { formatFullDate } from "../../../DateUtils"; | ||||
|  | @ -304,17 +304,13 @@ export default class ImageView extends React.Component<IProps, IState> { | |||
|         let contextMenu = null; | ||||
|         if (this.state.contextMenuDisplayed) { | ||||
|             contextMenu = ( | ||||
|                 <ContextMenu | ||||
|                 <MessageContextMenu | ||||
|                     {...aboveLeftOf(this.contextMenuButton.current.getBoundingClientRect())} | ||||
|                     mxEvent={this.props.mxEvent} | ||||
|                     permalinkCreator={this.props.permalinkCreator} | ||||
|                     onFinished={this.onCloseContextMenu} | ||||
|                 > | ||||
|                     <MessageContextMenu | ||||
|                         mxEvent={this.props.mxEvent} | ||||
|                         permalinkCreator={this.props.permalinkCreator} | ||||
|                         onFinished={this.onCloseContextMenu} | ||||
|                         onCloseDialog={this.props.onFinished} | ||||
|                     /> | ||||
|                 </ContextMenu> | ||||
|                     onCloseDialog={this.props.onFinished} | ||||
|                 /> | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,11 +17,11 @@ limitations under the License. | |||
| import React from 'react'; | ||||
| 
 | ||||
| import Dropdown from "../../views/elements/Dropdown"; | ||||
| import * as sdk from '../../../index'; | ||||
| import PlatformPeg from "../../../PlatformPeg"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import Spinner from "./Spinner"; | ||||
| 
 | ||||
| function languageMatchesSearchQuery(query, language) { | ||||
|     if (language.label.toUpperCase().includes(query.toUpperCase())) return true; | ||||
|  | @ -84,7 +84,6 @@ export default class SpellCheckLanguagesDropdown extends React.Component<SpellCh | |||
| 
 | ||||
|     render() { | ||||
|         if (this.state.languages === null) { | ||||
|             const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|             return <Spinner />; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ limitations under the License. | |||
| 
 | ||||
| import React from "react"; | ||||
| import classNames from "classnames"; | ||||
| import * as sdk from "../../../index"; | ||||
| import AccessibleButton from "./AccessibleButton"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     // Whether or not this toggle is in the 'on' position.
 | ||||
|  | @ -43,7 +43,6 @@ export default ({ checked, disabled = false, onChange, ...props }: IProps) => { | |||
|         "mx_ToggleSwitch_enabled": !disabled, | ||||
|     }); | ||||
| 
 | ||||
|     const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
|     return ( | ||||
|         <AccessibleButton {...props} | ||||
|             className={classes} | ||||
|  |  | |||
|  | @ -16,11 +16,11 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import Tooltip from './Tooltip'; | ||||
| 
 | ||||
| interface IProps { | ||||
|     helpText: string; | ||||
|     helpText: React.ReactNode | string; | ||||
| } | ||||
| 
 | ||||
| interface IState { | ||||
|  | @ -49,7 +49,6 @@ export default class TooltipButton extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const Tooltip = sdk.getComponent("elements.Tooltip"); | ||||
|         const tip = this.state.hover ? <Tooltip | ||||
|             className="mx_TooltipButton_container" | ||||
|             tooltipClassName="mx_TooltipButton_helpText" | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ export const EMOJI_HEIGHT = 37; | |||
| export const EMOJIS_PER_ROW = 8; | ||||
| 
 | ||||
| interface IProps { | ||||
|     selectedEmojis: Set<string>; | ||||
|     selectedEmojis?: Set<string>; | ||||
|     showQuickReactions?: boolean; | ||||
|     onChoose(unicode: string): boolean; | ||||
| } | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| import React from 'react'; | ||||
| import { MatrixEvent } from 'matrix-js-sdk/src'; | ||||
| import { MatrixClientPeg } from '../../../MatrixClientPeg'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { getNameForEventRoom, userLabelForEventRoom } | ||||
|     from '../../../utils/KeyVerificationStateObserver'; | ||||
|  | @ -26,6 +25,7 @@ import { RightPanelPhases } from "../../../stores/RightPanelStorePhases"; | |||
| import { Action } from "../../../dispatcher/actions"; | ||||
| import EventTileBubble from "./EventTileBubble"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import AccessibleButton from '../elements/AccessibleButton'; | ||||
| 
 | ||||
| interface IProps { | ||||
|     mxEvent: MatrixEvent; | ||||
|  | @ -115,8 +115,6 @@ export default class MKeyVerificationRequest extends React.Component<IProps> { | |||
|     } | ||||
| 
 | ||||
|     public render() { | ||||
|         const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
| 
 | ||||
|         const { mxEvent } = this.props; | ||||
|         const request = mxEvent.verificationRequest; | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | |||
| 
 | ||||
| interface IProps { | ||||
|     mxEvent: MatrixEvent; | ||||
|     onClick(): void; | ||||
|     onClick?(): void; | ||||
|     enableFlair: boolean; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,13 +16,13 @@ limitations under the License. | |||
| 
 | ||||
| import React from "react"; | ||||
| 
 | ||||
| import * as sdk from "../../../index"; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import { RoomMember } from "matrix-js-sdk/src/models/room-member"; | ||||
| import { User } from "matrix-js-sdk/src/models/user"; | ||||
| import AccessibleButton from "../elements/AccessibleButton"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| 
 | ||||
| export const PendingActionSpinner = ({ text }) => { | ||||
|     const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|     return <div className="mx_EncryptionInfo_spinner"> | ||||
|         <Spinner /> | ||||
|         { text } | ||||
|  | @ -64,7 +64,6 @@ const EncryptionInfo: React.FC<IProps> = ({ | |||
|         } | ||||
|         content = <PendingActionSpinner text={text} />; | ||||
|     } else { | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         content = ( | ||||
|             <AccessibleButton kind="primary" className="mx_UserInfo_wideButton" onClick={onStartVerification}> | ||||
|                 {_t("Start Verification")} | ||||
|  |  | |||
|  | @ -81,6 +81,7 @@ const EncryptionPanel: React.FC<IProps> = (props: IProps) => { | |||
|     const changeHandler = useCallback(() => { | ||||
|         // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card
 | ||||
|         if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { | ||||
|             // FIXME: Using an import will result in test failures
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog("Verification failed", "insecure", ErrorDialog, { | ||||
|                 headerImage: require("../../../../res/img/e2e/warning.svg"), | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| import React from "react"; | ||||
| 
 | ||||
| import { MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import * as sdk from '../../../index'; | ||||
| import { verificationMethods } from 'matrix-js-sdk/src/crypto'; | ||||
| import { SCAN_QR_CODE_METHOD } from "matrix-js-sdk/src/crypto/verification/QRCode"; | ||||
| import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; | ||||
|  | @ -38,6 +37,8 @@ import { | |||
| } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; | ||||
| import Spinner from "../elements/Spinner"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import AccessibleButton from "../elements/AccessibleButton"; | ||||
| import VerificationShowSas from "../verification/VerificationShowSas"; | ||||
| 
 | ||||
| // XXX: Should be defined in matrix-js-sdk
 | ||||
| enum VerificationPhase { | ||||
|  | @ -81,7 +82,6 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat | |||
|         const { member, request } = this.props; | ||||
|         const showSAS: boolean = request.otherPartySupportsMethod(verificationMethods.SAS); | ||||
|         const showQR: boolean = request.otherPartySupportsMethod(SCAN_QR_CODE_METHOD); | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         const brand = SdkConfig.get().brand; | ||||
| 
 | ||||
|         const noCommonMethodError: JSX.Element = !showSAS && !showQR ? | ||||
|  | @ -195,7 +195,6 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat | |||
| 
 | ||||
|     private renderQRReciprocatePhase() { | ||||
|         const { member, request } = this.props; | ||||
|         const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
|         const description = request.isSelfVerification ? | ||||
|             _t("Almost there! Is your other session showing the same shield?") : | ||||
|             _t("Almost there! Is %(displayName)s showing the same shield?", { | ||||
|  | @ -265,7 +264,6 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat | |||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         return ( | ||||
|             <div className="mx_UserInfo_container mx_VerificationPanel_verified_section"> | ||||
|                 <h3>{_t("Verified")}</h3> | ||||
|  | @ -282,8 +280,6 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat | |||
|     private renderCancelledPhase() { | ||||
|         const { member, request } = this.props; | ||||
| 
 | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         let startAgainInstruction: string; | ||||
|         if (request.isSelfVerification) { | ||||
|             startAgainInstruction = _t("Start verification again from the notification."); | ||||
|  | @ -332,7 +328,6 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat | |||
|                     case verificationMethods.RECIPROCATE_QR_CODE: | ||||
|                         return this.renderQRReciprocatePhase(); | ||||
|                     case verificationMethods.SAS: { | ||||
|                         const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); | ||||
|                         const emojis = this.state.sasEvent ? | ||||
|                             <VerificationShowSas | ||||
|                                 displayName={displayName} | ||||
|  |  | |||
|  | @ -711,6 +711,7 @@ export default class BasicMessageEditor extends React.Component<IProps, IState> | |||
|     } | ||||
| 
 | ||||
|     public insertMention(userId: string): void { | ||||
|         this.modifiedFlag = true; | ||||
|         const { model } = this.props; | ||||
|         const { partCreator } = model; | ||||
|         const member = this.props.room.getMember(userId); | ||||
|  | @ -729,6 +730,7 @@ export default class BasicMessageEditor extends React.Component<IProps, IState> | |||
|     } | ||||
| 
 | ||||
|     public insertQuotedMessage(event: MatrixEvent): void { | ||||
|         this.modifiedFlag = true; | ||||
|         const { model } = this.props; | ||||
|         const { partCreator } = model; | ||||
|         const quoteParts = parseEvent(event, partCreator, { isQuotedMessage: true }); | ||||
|  | @ -744,6 +746,7 @@ export default class BasicMessageEditor extends React.Component<IProps, IState> | |||
|     } | ||||
| 
 | ||||
|     public insertPlaintext(text: string): void { | ||||
|         this.modifiedFlag = true; | ||||
|         const { model } = this.props; | ||||
|         const { partCreator } = model; | ||||
|         const caret = this.getCaret(); | ||||
|  |  | |||
|  | @ -131,11 +131,12 @@ export default class EditMessageComposer extends React.Component<IProps, IState> | |||
|         super(props); | ||||
|         this.context = context; // otherwise React will only set it prior to render due to type def above
 | ||||
| 
 | ||||
|         const isRestored = this.createEditorModel(); | ||||
|         const ev = this.props.editState.getEvent(); | ||||
|         this.state = { | ||||
|             saveDisabled: true, | ||||
|             saveDisabled: !isRestored || !this.isContentModified(createEditContent(this.model, ev)["m.new_content"]), | ||||
|         }; | ||||
| 
 | ||||
|         this.createEditorModel(); | ||||
|         window.addEventListener("beforeunload", this.saveStoredEditorState); | ||||
|         this.dispatcherRef = dis.register(this.onAction); | ||||
|     } | ||||
|  | @ -230,12 +231,12 @@ export default class EditMessageComposer extends React.Component<IProps, IState> | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private saveStoredEditorState(): void { | ||||
|     private saveStoredEditorState = (): void => { | ||||
|         const item = SendHistoryManager.createItem(this.model); | ||||
|         this.clearPreviousEdit(); | ||||
|         localStorage.setItem(this.editorRoomKey, this.props.editState.getEvent().getId()); | ||||
|         localStorage.setItem(this.editorStateKey, JSON.stringify(item)); | ||||
|     } | ||||
|     }; | ||||
| 
 | ||||
|     private isSlashCommand(): boolean { | ||||
|         const parts = this.model.parts; | ||||
|  | @ -256,10 +257,9 @@ export default class EditMessageComposer extends React.Component<IProps, IState> | |||
|     private isContentModified(newContent: IContent): boolean { | ||||
|         // if nothing has changed then bail
 | ||||
|         const oldContent = this.props.editState.getEvent().getContent(); | ||||
|         if (!this.editorRef.current?.isModified() || | ||||
|             (oldContent["msgtype"] === newContent["msgtype"] && oldContent["body"] === newContent["body"] && | ||||
|         if (oldContent["msgtype"] === newContent["msgtype"] && oldContent["body"] === newContent["body"] && | ||||
|             oldContent["format"] === newContent["format"] && | ||||
|             oldContent["formatted_body"] === newContent["formatted_body"])) { | ||||
|             oldContent["formatted_body"] === newContent["formatted_body"]) { | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|  | @ -410,36 +410,27 @@ export default class EditMessageComposer extends React.Component<IProps, IState> | |||
|         dis.unregister(this.dispatcherRef); | ||||
|     } | ||||
| 
 | ||||
|     private createEditorModel(): void { | ||||
|     private createEditorModel(): boolean { | ||||
|         const { editState } = this.props; | ||||
|         const room = this.getRoom(); | ||||
|         const partCreator = new CommandPartCreator(room, this.context); | ||||
| 
 | ||||
|         let parts; | ||||
|         let isRestored = false; | ||||
|         if (editState.hasEditorState()) { | ||||
|             // if restoring state from a previous editor,
 | ||||
|             // restore serialized parts from the state
 | ||||
|             parts = editState.getSerializedParts().map(p => partCreator.deserializePart(p)); | ||||
|         } else { | ||||
|             //otherwise, either restore serialized parts from localStorage or parse the body of the event
 | ||||
|             parts = this.restoreStoredEditorState(partCreator) || parseEvent(editState.getEvent(), partCreator); | ||||
|             // otherwise, either restore serialized parts from localStorage or parse the body of the event
 | ||||
|             const restoredParts = this.restoreStoredEditorState(partCreator); | ||||
|             parts = restoredParts || parseEvent(editState.getEvent(), partCreator); | ||||
|             isRestored = !!restoredParts; | ||||
|         } | ||||
|         this.model = new EditorModel(parts, partCreator); | ||||
|         this.saveStoredEditorState(); | ||||
|     } | ||||
| 
 | ||||
|     private getInitialCaretPosition(): CaretPosition { | ||||
|         const { editState } = this.props; | ||||
|         let caretPosition; | ||||
|         if (editState.hasEditorState() && editState.getCaret()) { | ||||
|             // if restoring state from a previous editor,
 | ||||
|             // restore caret position from the state
 | ||||
|             const caret = editState.getCaret(); | ||||
|             caretPosition = this.model.positionForOffset(caret.offset, caret.atNodeEnd); | ||||
|         } else { | ||||
|             // otherwise, set it at the end
 | ||||
|             caretPosition = this.model.getPositionAtEnd(); | ||||
|         } | ||||
|         return caretPosition; | ||||
|         return isRestored; | ||||
|     } | ||||
| 
 | ||||
|     private onChange = (): void => { | ||||
|  |  | |||
|  | @ -47,6 +47,13 @@ import { StaticNotificationState } from "../../../stores/notifications/StaticNot | |||
| import NotificationBadge from "./NotificationBadge"; | ||||
| import { ComposerInsertPayload } from "../../../dispatcher/payloads/ComposerInsertPayload"; | ||||
| import { Action } from '../../../dispatcher/actions'; | ||||
| import MemberAvatar from '../avatars/MemberAvatar'; | ||||
| import SenderProfile from '../messages/SenderProfile'; | ||||
| import MessageTimestamp from '../messages/MessageTimestamp'; | ||||
| import TooltipButton from '../elements/TooltipButton'; | ||||
| import ReadReceiptMarker from "./ReadReceiptMarker"; | ||||
| import MessageActionBar from "../messages/MessageActionBar"; | ||||
| import ReactionsRow from '../messages/ReactionsRow'; | ||||
| 
 | ||||
| const eventTileTypes = { | ||||
|     [EventType.RoomMessage]: 'messages.MessageEvent', | ||||
|  | @ -666,7 +673,6 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         const ReadReceiptMarker = sdk.getComponent('rooms.ReadReceiptMarker'); | ||||
|         const avatars = []; | ||||
|         const receiptOffset = 15; | ||||
|         let left = 0; | ||||
|  | @ -733,7 +739,7 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     onSenderProfileClick = event => { | ||||
|     onSenderProfileClick = () => { | ||||
|         const mxEvent = this.props.mxEvent; | ||||
|         dis.dispatch<ComposerInsertPayload>({ | ||||
|             action: Action.ComposerInsert, | ||||
|  | @ -841,10 +847,6 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const MessageTimestamp = sdk.getComponent('messages.MessageTimestamp'); | ||||
|         const SenderProfile = sdk.getComponent('messages.SenderProfile'); | ||||
|         const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); | ||||
| 
 | ||||
|         //console.info("EventTile showUrlPreview for %s is %s", this.props.mxEvent.getId(), this.props.showUrlPreview);
 | ||||
| 
 | ||||
|         const content = this.props.mxEvent.getContent(); | ||||
|  | @ -987,7 +989,6 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         const MessageActionBar = sdk.getComponent('messages.MessageActionBar'); | ||||
|         const actionBar = !isEditing ? <MessageActionBar | ||||
|             mxEvent={this.props.mxEvent} | ||||
|             reactions={this.state.reactions} | ||||
|  | @ -1027,7 +1028,6 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|                 { 'requestLink': (sub) => <a onClick={this.onRequestKeysClick}>{ sub }</a> }, | ||||
|             ); | ||||
| 
 | ||||
|         const TooltipButton = sdk.getComponent('elements.TooltipButton'); | ||||
|         const keyRequestInfo = isEncryptionFailure && !isRedacted ? | ||||
|             <div className="mx_EventTile_keyRequestInfo"> | ||||
|                 <span className="mx_EventTile_keyRequestInfo_text"> | ||||
|  | @ -1038,7 +1038,6 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
| 
 | ||||
|         let reactionsRow; | ||||
|         if (!isRedacted) { | ||||
|             const ReactionsRow = sdk.getComponent('messages.ReactionsRow'); | ||||
|             reactionsRow = <ReactionsRow | ||||
|                 mxEvent={this.props.mxEvent} | ||||
|                 reactions={this.state.reactions} | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ import React from 'react'; | |||
| import classNames from 'classnames'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { MatrixClientPeg } from '../../../MatrixClientPeg'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||
| import { Room } from "matrix-js-sdk/src/models/room"; | ||||
| import { RoomMember } from "matrix-js-sdk/src/models/room-member"; | ||||
|  | @ -44,13 +43,14 @@ import SendMessageComposer from "./SendMessageComposer"; | |||
| import { ComposerInsertPayload } from "../../../dispatcher/payloads/ComposerInsertPayload"; | ||||
| import { Action } from "../../../dispatcher/actions"; | ||||
| import EditorModel from "../../../editor/model"; | ||||
| import EmojiPicker from '../emojipicker/EmojiPicker'; | ||||
| import MemberStatusMessageAvatar from "../avatars/MemberStatusMessageAvatar"; | ||||
| 
 | ||||
| interface IComposerAvatarProps { | ||||
|     me: object; | ||||
| } | ||||
| 
 | ||||
| function ComposerAvatar(props: IComposerAvatarProps) { | ||||
|     const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar'); | ||||
|     return <div className="mx_MessageComposer_avatar"> | ||||
|         <MemberStatusMessageAvatar member={props.me} width={24} height={24} /> | ||||
|     </div>; | ||||
|  | @ -76,7 +76,6 @@ const EmojiButton = ({ addEmoji }) => { | |||
|     let contextMenu; | ||||
|     if (menuDisplayed) { | ||||
|         const buttonRect = button.current.getBoundingClientRect(); | ||||
|         const EmojiPicker = sdk.getComponent('emojipicker.EmojiPicker'); | ||||
|         contextMenu = <ContextMenu {...aboveLeftOf(buttonRect)} onFinished={closeMenu} managed={false}> | ||||
|             <EmojiPicker onChoose={addEmoji} showQuickReactions={true} /> | ||||
|         </ContextMenu>; | ||||
|  | @ -366,15 +365,12 @@ export default class MessageComposer extends React.Component<IProps, IState> { | |||
|         ]; | ||||
| 
 | ||||
|         if (!this.state.tombstone && this.state.canSendMessages) { | ||||
|             const SendMessageComposer = sdk.getComponent("rooms.SendMessageComposer"); | ||||
| 
 | ||||
|             controls.push( | ||||
|                 <SendMessageComposer | ||||
|                     ref={(c) => this.messageComposerInput = c} | ||||
|                     key="controls_input" | ||||
|                     room={this.props.room} | ||||
|                     placeholder={this.renderPlaceholderText()} | ||||
|                     resizeNotifier={this.props.resizeNotifier} | ||||
|                     permalinkCreator={this.props.permalinkCreator} | ||||
|                     replyToEvent={this.props.replyToEvent} | ||||
|                     onChange={this.onChange} | ||||
|  |  | |||
|  | @ -20,13 +20,14 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | |||
| import { Room } from "matrix-js-sdk/src/models/room"; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import dis from "../../../dispatcher/dispatcher"; | ||||
| import * as sdk from "../../../index"; | ||||
| import Modal from "../../../Modal"; | ||||
| import { isValid3pidInvite } from "../../../RoomInvite"; | ||||
| import RoomAvatar from "../avatars/RoomAvatar"; | ||||
| import RoomName from "../elements/RoomName"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import ErrorDialog from '../dialogs/ErrorDialog'; | ||||
| import AccessibleButton from '../elements/AccessibleButton'; | ||||
| 
 | ||||
| interface IProps { | ||||
|     event: MatrixEvent; | ||||
|  | @ -104,7 +105,6 @@ export default class ThirdPartyMemberInfo extends React.Component<IProps, IState | |||
|                 // Revert echo because of error
 | ||||
|                 this.setState({ invited: true }); | ||||
| 
 | ||||
|                 const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|                 Modal.createTrackedDialog('Revoke 3pid invite failed', '', ErrorDialog, { | ||||
|                     title: _t("Failed to revoke invite"), | ||||
|                     description: _t( | ||||
|  | @ -119,8 +119,6 @@ export default class ThirdPartyMemberInfo extends React.Component<IProps, IState | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); | ||||
| 
 | ||||
|         let adminTools = null; | ||||
|         if (this.state.canKick && this.state.invited) { | ||||
|             adminTools = ( | ||||
|  |  | |||
|  | @ -16,15 +16,14 @@ limitations under the License. | |||
| 
 | ||||
| import React from 'react'; | ||||
| 
 | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import { SettingLevel } from "../../../settings/SettingLevel"; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import SettingsFlag from '../elements/SettingsFlag'; | ||||
| 
 | ||||
| const SETTING_MANUALLY_VERIFY_ALL_SESSIONS = "e2ee.manuallyVerifyAllSessions"; | ||||
| 
 | ||||
| const E2eAdvancedPanel = props => { | ||||
|     const SettingsFlag = sdk.getComponent('views.elements.SettingsFlag'); | ||||
|     return <div className="mx_SettingsTab_section"> | ||||
|         <span className="mx_SettingsTab_subheading">{_t("Encryption")}</span> | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React from 'react'; | |||
| 
 | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import SdkConfig from "../../../SdkConfig"; | ||||
| import * as sdk from '../../../index'; | ||||
| import Modal from '../../../Modal'; | ||||
| import SettingsStore from "../../../settings/SettingsStore"; | ||||
| import AccessibleButton from "../elements/AccessibleButton"; | ||||
|  | @ -27,6 +26,7 @@ import EventIndexPeg from "../../../indexing/EventIndexPeg"; | |||
| import { SettingLevel } from "../../../settings/SettingLevel"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import SeshatResetDialog from '../dialogs/SeshatResetDialog'; | ||||
| import InlineSpinner from '../elements/InlineSpinner'; | ||||
| 
 | ||||
| interface IState { | ||||
|     enabling: boolean; | ||||
|  | @ -147,7 +147,6 @@ export default class EventIndexPanel extends React.Component<{}, IState> { | |||
| 
 | ||||
|     render() { | ||||
|         let eventIndexingSettings = null; | ||||
|         const InlineSpinner = sdk.getComponent('elements.InlineSpinner'); | ||||
|         const brand = SdkConfig.get().brand; | ||||
| 
 | ||||
|         if (EventIndexPeg.get() !== null) { | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| import url from 'url'; | ||||
| import React from 'react'; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import * as sdk from '../../../index'; | ||||
| import { MatrixClientPeg } from "../../../MatrixClientPeg"; | ||||
| import Modal from '../../../Modal'; | ||||
| import dis from "../../../dispatcher/dispatcher"; | ||||
|  | @ -28,6 +27,10 @@ import { getDefaultIdentityServerUrl, doesIdentityServerHaveTerms } from '../../ | |||
| import { timeout } from "../../../utils/promise"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { ActionPayload } from '../../../dispatcher/payloads'; | ||||
| import InlineSpinner from '../elements/InlineSpinner'; | ||||
| import AccessibleButton from '../elements/AccessibleButton'; | ||||
| import Field from '../elements/Field'; | ||||
| import QuestionDialog from "../dialogs/QuestionDialog"; | ||||
| 
 | ||||
| // We'll wait up to this long when checking for 3PID bindings on the IS.
 | ||||
| const REACHABILITY_TIMEOUT = 10000; // ms
 | ||||
|  | @ -126,7 +129,6 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
| 
 | ||||
|     private getTooltip = () => { | ||||
|         if (this.state.checking) { | ||||
|             const InlineSpinner = sdk.getComponent('views.elements.InlineSpinner'); | ||||
|             return <div> | ||||
|                 <InlineSpinner /> | ||||
|                 { _t("Checking server") } | ||||
|  | @ -217,7 +219,6 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     private showNoTermsWarning(fullUrl) { | ||||
|         const QuestionDialog = sdk.getComponent("views.dialogs.QuestionDialog"); | ||||
|         const { finished } = Modal.createTrackedDialog('No Terms Warning', '', QuestionDialog, { | ||||
|             title: _t("Identity server has no terms of service"), | ||||
|             description: ( | ||||
|  | @ -319,7 +320,6 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|             message = unboundMessage; | ||||
|         } | ||||
| 
 | ||||
|         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
|         const { finished } = Modal.createTrackedDialog('Identity Server Bound Warning', '', QuestionDialog, { | ||||
|             title, | ||||
|             description: message, | ||||
|  | @ -352,8 +352,6 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const AccessibleButton = sdk.getComponent('views.elements.AccessibleButton'); | ||||
|         const Field = sdk.getComponent('elements.Field'); | ||||
|         const idServerUrl = this.state.currentClientIdServer; | ||||
|         let sectionTitle; | ||||
|         let bodyText; | ||||
|  | @ -398,7 +396,6 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|                 discoButtonContent = _t("Do not use an identity server"); | ||||
|             } | ||||
|             if (this.state.disconnectBusy) { | ||||
|                 const InlineSpinner = sdk.getComponent('views.elements.InlineSpinner'); | ||||
|                 discoButtonContent = <InlineSpinner />; | ||||
|             } | ||||
|             discoSection = <div> | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ limitations under the License. | |||
| import React from 'react'; | ||||
| import { _t, _td } from "../../../../../languageHandler"; | ||||
| import { MatrixClientPeg } from "../../../../../MatrixClientPeg"; | ||||
| import * as sdk from "../../../../.."; | ||||
| import AccessibleButton from "../../../elements/AccessibleButton"; | ||||
| import Modal from "../../../../../Modal"; | ||||
| import { replaceableComponent } from "../../../../../utils/replaceableComponent"; | ||||
|  | @ -26,6 +25,8 @@ import { RoomMember } from "matrix-js-sdk/src/models/room-member"; | |||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||
| import { RoomState } from "matrix-js-sdk/src/models/room-state"; | ||||
| import { compare } from "../../../../../utils/strings"; | ||||
| import ErrorDialog from '../../../dialogs/ErrorDialog'; | ||||
| import PowerSelector from "../../../elements/PowerSelector"; | ||||
| 
 | ||||
| const plEventsToLabels = { | ||||
|     // These will be translated for us later.
 | ||||
|  | @ -76,7 +77,6 @@ interface IBannedUserProps { | |||
| export class BannedUser extends React.Component<IBannedUserProps> { | ||||
|     private onUnbanClick = (e) => { | ||||
|         MatrixClientPeg.get().unban(this.props.member.roomId, this.props.member.userId).catch((err) => { | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             console.error("Failed to unban: " + err); | ||||
|             Modal.createTrackedDialog('Failed to unban', '', ErrorDialog, { | ||||
|                 title: _t('Error'), | ||||
|  | @ -176,7 +176,6 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> { | |||
|         client.sendStateEvent(this.props.roomId, "m.room.power_levels", plContent).catch(e => { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Power level requirement change failed', '', ErrorDialog, { | ||||
|                 title: _t('Error changing power level requirement'), | ||||
|                 description: _t( | ||||
|  | @ -203,7 +202,6 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> { | |||
|         client.sendStateEvent(this.props.roomId, "m.room.power_levels", plContent).catch(e => { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Power level change failed', '', ErrorDialog, { | ||||
|                 title: _t('Error changing power level'), | ||||
|                 description: _t( | ||||
|  | @ -215,8 +213,6 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> { | |||
|     }; | ||||
| 
 | ||||
|     render() { | ||||
|         const PowerSelector = sdk.getComponent('elements.PowerSelector'); | ||||
| 
 | ||||
|         const client = MatrixClientPeg.get(); | ||||
|         const room = client.getRoom(this.props.roomId); | ||||
|         const plEvent = room.currentState.getStateEvents('m.room.power_levels', ''); | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React from 'react'; | |||
| import { MatrixEvent } from "matrix-js-sdk/src/models/event"; | ||||
| import { _t } from "../../../../../languageHandler"; | ||||
| import { MatrixClientPeg } from "../../../../../MatrixClientPeg"; | ||||
| import * as sdk from "../../../../.."; | ||||
| import LabelledToggleSwitch from "../../../elements/LabelledToggleSwitch"; | ||||
| import Modal from "../../../../../Modal"; | ||||
| import QuestionDialog from "../../../dialogs/QuestionDialog"; | ||||
|  | @ -27,6 +26,7 @@ import { SettingLevel } from "../../../../../settings/SettingLevel"; | |||
| import SettingsStore from "../../../../../settings/SettingsStore"; | ||||
| import { UIFeature } from "../../../../../settings/UIFeature"; | ||||
| import { replaceableComponent } from "../../../../../utils/replaceableComponent"; | ||||
| import SettingsFlag from '../../../elements/SettingsFlag'; | ||||
| 
 | ||||
| // Knock and private are reserved keywords which are not yet implemented.
 | ||||
| export enum JoinRule { | ||||
|  | @ -385,8 +385,6 @@ export default class SecurityRoomSettingsTab extends React.Component<IProps, ISt | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const SettingsFlag = sdk.getComponent("elements.SettingsFlag"); | ||||
| 
 | ||||
|         const client = MatrixClientPeg.get(); | ||||
|         const room = client.getRoom(this.props.roomId); | ||||
|         const isEncrypted = this.state.encrypted; | ||||
|  |  | |||
|  | @ -22,7 +22,6 @@ import AccessibleTooltipButton from '../../../elements/AccessibleTooltipButton'; | |||
| import SdkConfig from "../../../../../SdkConfig"; | ||||
| import createRoom from "../../../../../createRoom"; | ||||
| import Modal from "../../../../../Modal"; | ||||
| import * as sdk from "../../../../.."; | ||||
| import PlatformPeg from "../../../../../PlatformPeg"; | ||||
| import * as KeyboardShortcuts from "../../../../../accessibility/KeyboardShortcuts"; | ||||
| import UpdateCheckButton from "../../UpdateCheckButton"; | ||||
|  | @ -30,6 +29,8 @@ import { replaceableComponent } from "../../../../../utils/replaceableComponent" | |||
| import { copyPlaintext } from "../../../../../utils/strings"; | ||||
| import * as ContextMenu from "../../../../structures/ContextMenu"; | ||||
| import { toRightOf } from "../../../../structures/ContextMenu"; | ||||
| import BugReportDialog from '../../../dialogs/BugReportDialog'; | ||||
| import GenericTextContextMenu from "../../../context_menus/GenericTextContextMenu"; | ||||
| 
 | ||||
| interface IProps { | ||||
|     closeSettingsFn: () => void; | ||||
|  | @ -81,10 +82,6 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState> | |||
|     }; | ||||
| 
 | ||||
|     private onBugReport = (e) => { | ||||
|         const BugReportDialog = sdk.getComponent("dialogs.BugReportDialog"); | ||||
|         if (!BugReportDialog) { | ||||
|             return; | ||||
|         } | ||||
|         Modal.createTrackedDialog('Bug Report Dialog', '', BugReportDialog, {}); | ||||
|     }; | ||||
| 
 | ||||
|  | @ -171,7 +168,6 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState> | |||
| 
 | ||||
|         const successful = await copyPlaintext(MatrixClientPeg.get().getAccessToken()); | ||||
|         const buttonRect = target.getBoundingClientRect(); | ||||
|         const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); | ||||
|         const { close } = ContextMenu.createMenu(GenericTextContextMenu, { | ||||
|             ...toRightOf(buttonRect, 2), | ||||
|             message: successful ? _t('Copied!') : _t('Failed to copy'), | ||||
|  |  | |||
|  | @ -22,8 +22,11 @@ import { ListRule } from "../../../../../mjolnir/ListRule"; | |||
| import { BanList, RULE_SERVER, RULE_USER } from "../../../../../mjolnir/BanList"; | ||||
| import Modal from "../../../../../Modal"; | ||||
| import { MatrixClientPeg } from "../../../../../MatrixClientPeg"; | ||||
| import * as sdk from "../../../../../index"; | ||||
| import { replaceableComponent } from "../../../../../utils/replaceableComponent"; | ||||
| import ErrorDialog from "../../../dialogs/ErrorDialog"; | ||||
| import QuestionDialog from "../../../dialogs/QuestionDialog"; | ||||
| import AccessibleButton from "../../../elements/AccessibleButton"; | ||||
| import Field from "../../../elements/Field"; | ||||
| 
 | ||||
| interface IState { | ||||
|     busy: boolean; | ||||
|  | @ -68,7 +71,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|         } catch (e) { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to add Mjolnir rule', '', ErrorDialog, { | ||||
|                 title: _t('Error adding ignored user/server'), | ||||
|                 description: _t('Something went wrong. Please try again or view your console for hints.'), | ||||
|  | @ -90,7 +92,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|         } catch (e) { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to subscribe to Mjolnir list', '', ErrorDialog, { | ||||
|                 title: _t('Error subscribing to list'), | ||||
|                 description: _t('Please verify the room ID or address and try again.'), | ||||
|  | @ -108,7 +109,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|         } catch (e) { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to remove Mjolnir rule', '', ErrorDialog, { | ||||
|                 title: _t('Error removing ignored user/server'), | ||||
|                 description: _t('Something went wrong. Please try again or view your console for hints.'), | ||||
|  | @ -126,7 +126,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|         } catch (e) { | ||||
|             console.error(e); | ||||
| 
 | ||||
|             const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|             Modal.createTrackedDialog('Failed to unsubscribe from Mjolnir list', '', ErrorDialog, { | ||||
|                 title: _t('Error unsubscribing from list'), | ||||
|                 description: _t('Please try again or view your console for hints.'), | ||||
|  | @ -137,8 +136,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|     } | ||||
| 
 | ||||
|     private viewListRules(list: BanList) { | ||||
|         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); | ||||
| 
 | ||||
|         const room = MatrixClientPeg.get().getRoom(list.roomId); | ||||
|         const name = room ? room.name : list.roomId; | ||||
| 
 | ||||
|  | @ -168,8 +165,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|     } | ||||
| 
 | ||||
|     private renderPersonalBanListRules() { | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         const list = Mjolnir.sharedInstance().getPersonalList(); | ||||
|         const rules = list ? [...list.userRules, ...list.serverRules] : []; | ||||
|         if (!list || rules.length <= 0) return <i>{_t("You have not ignored anyone.")}</i>; | ||||
|  | @ -199,8 +194,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|     } | ||||
| 
 | ||||
|     private renderSubscribedBanLists() { | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
| 
 | ||||
|         const personalList = Mjolnir.sharedInstance().getPersonalList(); | ||||
|         const lists = Mjolnir.sharedInstance().lists.filter(b => { | ||||
|             return personalList? personalList.roomId !== b.roomId : true; | ||||
|  | @ -241,8 +234,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> | |||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const Field = sdk.getComponent('elements.Field'); | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         const brand = SdkConfig.get().brand; | ||||
| 
 | ||||
|         return ( | ||||
|  |  | |||
|  | @ -20,10 +20,10 @@ import { _t } from "../../../../../languageHandler"; | |||
| import LabelledToggleSwitch from "../../../elements/LabelledToggleSwitch"; | ||||
| import SettingsStore from "../../../../../settings/SettingsStore"; | ||||
| import Field from "../../../elements/Field"; | ||||
| import * as sdk from "../../../../.."; | ||||
| import PlatformPeg from "../../../../../PlatformPeg"; | ||||
| import { SettingLevel } from "../../../../../settings/SettingLevel"; | ||||
| import { replaceableComponent } from "../../../../../utils/replaceableComponent"; | ||||
| import SettingsFlag from '../../../elements/SettingsFlag'; | ||||
| import * as KeyboardShortcuts from "../../../../../accessibility/KeyboardShortcuts"; | ||||
| import AccessibleButton from "../../../elements/AccessibleButton"; | ||||
| 
 | ||||
|  | @ -184,7 +184,6 @@ export default class PreferencesUserSettingsTab extends React.Component<{}, ISta | |||
|     }; | ||||
| 
 | ||||
|     private renderGroup(settingIds: string[]): React.ReactNodeArray { | ||||
|         const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); | ||||
|         return settingIds.filter(SettingsStore.isEnabled).map(i => { | ||||
|             return <SettingsFlag key={i} name={i} level={SettingLevel.ACCOUNT} />; | ||||
|         }); | ||||
|  |  | |||
|  | @ -21,7 +21,6 @@ import { EventType } from "matrix-js-sdk/src/@types/event"; | |||
| 
 | ||||
| import { MatrixClientPeg } from './MatrixClientPeg'; | ||||
| import Modal from './Modal'; | ||||
| import * as sdk from './index'; | ||||
| import { _t } from './languageHandler'; | ||||
| import dis from "./dispatcher/dispatcher"; | ||||
| import * as Rooms from "./Rooms"; | ||||
|  | @ -37,6 +36,8 @@ import { makeSpaceParentEvent } from "./utils/space"; | |||
| import { Action } from "./dispatcher/actions"; | ||||
| import { ICreateRoomOpts } from "matrix-js-sdk/src/@types/requests"; | ||||
| import { Preset, Visibility } from "matrix-js-sdk/src/@types/partials"; | ||||
| import ErrorDialog from "./components/views/dialogs/ErrorDialog"; | ||||
| import Spinner from "./components/views/elements/Spinner"; | ||||
| 
 | ||||
| // we define a number of interfaces which take their names from the js-sdk
 | ||||
| /* eslint-disable camelcase */ | ||||
|  | @ -80,9 +81,6 @@ export default function createRoom(opts: IOpts): Promise<string | null> { | |||
| 
 | ||||
|     const startTime = CountlyAnalytics.getTimestamp(); | ||||
| 
 | ||||
|     const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|     const Loader = sdk.getComponent("elements.Spinner"); | ||||
| 
 | ||||
|     const client = MatrixClientPeg.get(); | ||||
|     if (client.isGuest()) { | ||||
|         dis.dispatch({ action: 'require_registration' }); | ||||
|  | @ -153,7 +151,7 @@ export default function createRoom(opts: IOpts): Promise<string | null> { | |||
|     } | ||||
| 
 | ||||
|     let modal; | ||||
|     if (opts.spinner) modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); | ||||
|     if (opts.spinner) modal = Modal.createDialog(Spinner, null, 'mx_Dialog_spinner'); | ||||
| 
 | ||||
|     let roomId; | ||||
|     return client.createRoom(createOpts).finally(function() { | ||||
|  |  | |||
|  | @ -93,15 +93,15 @@ async function collectBugReport(opts: IOpts = {}, gzipLogs = true) { | |||
|             body.append("cross_signing_supported_by_hs", | ||||
|                 String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"))); | ||||
|             body.append("cross_signing_key", crossSigning.getId()); | ||||
|             body.append("cross_signing_pk_in_secret_storage", | ||||
|             body.append("cross_signing_privkey_in_secret_storage", | ||||
|                 String(!!(await crossSigning.isStoredInSecretStorage(secretStorage)))); | ||||
| 
 | ||||
|             const pkCache = client.getCrossSigningCacheCallbacks(); | ||||
|             body.append("cross_signing_master_pk_cached", | ||||
|             body.append("cross_signing_master_privkey_cached", | ||||
|                 String(!!(pkCache && await pkCache.getCrossSigningKeyCache("master")))); | ||||
|             body.append("cross_signing_self_signing_pk_cached", | ||||
|             body.append("cross_signing_self_signing_privkey_cached", | ||||
|                 String(!!(pkCache && await pkCache.getCrossSigningKeyCache("self_signing")))); | ||||
|             body.append("cross_signing_user_signing_pk_cached", | ||||
|             body.append("cross_signing_user_signing_privkey_cached", | ||||
|                 String(!!(pkCache && await pkCache.getCrossSigningKeyCache("user_signing")))); | ||||
| 
 | ||||
|             body.append("secret_storage_ready", String(await client.isSecretStorageReady())); | ||||
|  |  | |||
|  | @ -164,6 +164,7 @@ class RoomViewStore extends Store<ActionPayload> { | |||
|                 } | ||||
|                 break; | ||||
|             case 'open_room_settings': { | ||||
|                 // FIXME: Using an import will result in test failures
 | ||||
|                 const RoomSettingsDialog = sdk.getComponent("dialogs.RoomSettingsDialog"); | ||||
|                 Modal.createTrackedDialog('Room settings', '', RoomSettingsDialog, { | ||||
|                     roomId: payload.room_id || this.state.roomId, | ||||
|  | @ -340,6 +341,7 @@ class RoomViewStore extends Store<ActionPayload> { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // FIXME: Using an import will result in test failures
 | ||||
|         const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); | ||||
|         Modal.createTrackedDialog('Failed to join room', '', ErrorDialog, { | ||||
|             title: _t("Failed to join room"), | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| import Modal from "../Modal"; | ||||
| import * as sdk from "../index"; | ||||
| import { _t } from "../languageHandler"; | ||||
| import DeviceListener from "../DeviceListener"; | ||||
| import SetupEncryptionDialog from "../components/views/dialogs/security/SetupEncryptionDialog"; | ||||
|  | @ -23,6 +22,7 @@ import { accessSecretStorage } from "../SecurityManager"; | |||
| import ToastStore from "../stores/ToastStore"; | ||||
| import GenericToast from "../components/views/toasts/GenericToast"; | ||||
| import SecurityCustomisations from "../customisations/Security"; | ||||
| import Spinner from "../components/views/elements/Spinner"; | ||||
| 
 | ||||
| const TOAST_KEY = "setupencryption"; | ||||
| 
 | ||||
|  | @ -88,7 +88,6 @@ export const showToast = (kind: Kind) => { | |||
|             Modal.createTrackedDialog("Verify session", "Verify session", SetupEncryptionDialog, | ||||
|                 {}, null, /* priority = */ false, /* static = */ true); | ||||
|         } else { | ||||
|             const Spinner = sdk.getComponent("elements.Spinner"); | ||||
|             const modal = Modal.createDialog( | ||||
|                 Spinner, null, "mx_Dialog_spinner", /* priority */ false, /* static */ true, | ||||
|             ); | ||||
|  |  | |||
|  | @ -19,7 +19,6 @@ import { User } from "matrix-js-sdk/src/models/user"; | |||
| import { MatrixClientPeg } from './MatrixClientPeg'; | ||||
| import dis from "./dispatcher/dispatcher"; | ||||
| import Modal from './Modal'; | ||||
| import * as sdk from './index'; | ||||
| import { RightPanelPhases } from "./stores/RightPanelStorePhases"; | ||||
| import { findDMForUser } from './createRoom'; | ||||
| import { accessSecretStorage } from './SecurityManager'; | ||||
|  | @ -27,6 +26,7 @@ import { verificationMethods } from 'matrix-js-sdk/src/crypto'; | |||
| import { Action } from './dispatcher/actions'; | ||||
| import UntrustedDeviceDialog from "./components/views/dialogs/UntrustedDeviceDialog"; | ||||
| import { IDevice } from "./components/views/right_panel/UserInfo"; | ||||
| import ManualDeviceKeyVerificationDialog from "./components/views/dialogs/ManualDeviceKeyVerificationDialog"; | ||||
| 
 | ||||
| async function enable4SIfNeeded() { | ||||
|     const cli = MatrixClientPeg.get(); | ||||
|  | @ -71,8 +71,6 @@ export async function verifyDevice(user: User, device: IDevice) { | |||
|                     refireParams: { member: user, verificationRequestPromise }, | ||||
|                 }); | ||||
|             } else if (action === "legacy") { | ||||
|                 const ManualDeviceKeyVerificationDialog = | ||||
|                     sdk.getComponent("dialogs.ManualDeviceKeyVerificationDialog"); | ||||
|                 Modal.createTrackedDialog("Legacy verify session", "legacy verify session", | ||||
|                     ManualDeviceKeyVerificationDialog, | ||||
|                     { | ||||
|  |  | |||
|  | @ -14,18 +14,20 @@ See the License for the specific language governing permissions and | |||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| import "../../../skinned-sdk"; | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import ReactTestUtils from 'react-dom/test-utils'; | ||||
| import ReactDOM from 'react-dom'; | ||||
| 
 | ||||
| import * as TestUtils from '../../../test-utils'; | ||||
| import sdk from '../../../skinned-sdk'; | ||||
| import { MatrixClientPeg } from '../../../../src/MatrixClientPeg'; | ||||
| import { Room } from 'matrix-js-sdk/src/models/room'; | ||||
| import { RoomMember } from 'matrix-js-sdk/src/models/room-member'; | ||||
| import { User } from "matrix-js-sdk/src/models/user"; | ||||
| import { compare } from "../../../../src/utils/strings"; | ||||
| import MemberList from "../../../../src/components/views/rooms/MemberList"; | ||||
| import MemberTile from '../../../../src/components/views/rooms/MemberTile'; | ||||
| 
 | ||||
| function generateRoomId() { | ||||
|     return '!' + Math.random().toString().slice(2, 10) + ':domain'; | ||||
|  | @ -206,7 +208,6 @@ describe('MemberList', () => { | |||
|     } | ||||
| 
 | ||||
|     function itDoesOrderMembersCorrectly(enablePresence) { | ||||
|         const MemberTile = sdk.getComponent("rooms.MemberTile"); | ||||
|         describe('does order members correctly', () => { | ||||
|             // Note: even if presence is disabled, we still expect that the presence
 | ||||
|             // tests will pass. All expectOrderedByPresenceAndPowerLevel does is ensure
 | ||||
|  |  | |||
|  | @ -12,5 +12,5 @@ unzip -q element.zip | |||
| rm element.zip | ||||
| mv element-web-${ELEMENT_BRANCH} element-web | ||||
| cd element-web | ||||
| yarn install | ||||
| yarn install --pure-lockfile | ||||
| yarn run build | ||||
|  |  | |||
|  | @ -4,4 +4,4 @@ set -e | |||
| ./synapse/install.sh | ||||
| # local testing doesn't need a Element fetched from master, | ||||
| # so not installing that by default | ||||
| yarn install | ||||
| yarn install --pure-lockfile | ||||
|  |  | |||
							
								
								
									
										27
									
								
								yarn.lock
								
								
								
								
							
							
						
						
									
										27
									
								
								yarn.lock
								
								
								
								
							|  | @ -1677,6 +1677,11 @@ | |||
|     "@types/scheduler" "*" | ||||
|     csstype "^3.0.2" | ||||
| 
 | ||||
| "@types/retry@^0.12.0": | ||||
|   version "0.12.0" | ||||
|   resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" | ||||
|   integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== | ||||
| 
 | ||||
| "@types/sanitize-html@^2.3.1": | ||||
|   version "2.3.1" | ||||
|   resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-2.3.1.tgz#094d696b83b7394b016e96342bbffa6a028795ce" | ||||
|  | @ -5445,10 +5450,10 @@ mathml-tag-names@^2.1.3: | |||
|   resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" | ||||
|   integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== | ||||
| 
 | ||||
| matrix-js-sdk@12.0.0: | ||||
|   version "12.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.0.0.tgz#8ee7cc37661476341d0c792a1a12bc78b19f9fdd" | ||||
|   integrity sha512-DHeq87Sx9Dv37FYyvZkmA1VYsQUNaVgc3QzMUkFwoHt1T4EZzgyYpdsp3uYruJzUW0ACvVJcwFdrU4e1VS97dQ== | ||||
| matrix-js-sdk@12.0.1: | ||||
|   version "12.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.0.1.tgz#3a63881f743420a4d39474daa39bd0fb90930d43" | ||||
|   integrity sha512-HkOWv8QHojceo3kPbC+vAIFUjsRAig6MBvEY35UygS3g2dL0UcJ5Qx09/2wcXtu6dowlDnWsz2HHk62tS2cklA== | ||||
|   dependencies: | ||||
|     "@babel/runtime" "^7.12.5" | ||||
|     another-json "^0.2.0" | ||||
|  | @ -5456,6 +5461,7 @@ matrix-js-sdk@12.0.0: | |||
|     bs58 "^4.0.1" | ||||
|     content-type "^1.0.4" | ||||
|     loglevel "^1.7.1" | ||||
|     p-retry "^4.5.0" | ||||
|     qs "^6.9.6" | ||||
|     request "^2.88.2" | ||||
|     unhomoglyph "^1.0.6" | ||||
|  | @ -6007,6 +6013,14 @@ p-locate@^4.1.0: | |||
|   dependencies: | ||||
|     p-limit "^2.2.0" | ||||
| 
 | ||||
| p-retry@^4.5.0: | ||||
|   version "4.6.0" | ||||
|   resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.0.tgz#9de15ae696278cffe86fce2d8f73b7f894f8bc9e" | ||||
|   integrity sha512-SAHbQEwg3X5DRNaLmWjT+DlGc93ba5i+aP3QLfVNDncQEQO4xjbYW4N/lcVTSuP0aJietGfx2t94dJLzfBMpXw== | ||||
|   dependencies: | ||||
|     "@types/retry" "^0.12.0" | ||||
|     retry "^0.13.1" | ||||
| 
 | ||||
| p-try@^2.0.0: | ||||
|   version "2.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" | ||||
|  | @ -6816,6 +6830,11 @@ ret@~0.1.10: | |||
|   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" | ||||
|   integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== | ||||
| 
 | ||||
| retry@^0.13.1: | ||||
|   version "0.13.1" | ||||
|   resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" | ||||
|   integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== | ||||
| 
 | ||||
| reusify@^1.0.4: | ||||
|   version "1.0.4" | ||||
|   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Šimon Brandner
						Šimon Brandner