mirror of https://github.com/vector-im/riot-web
				
				
				
			Remove the Lazy Loading `InvalidStoreError` Dialogs (#12358)
* remove the LL dialogs and the use of InvalidStoreError * remove stringspull/28217/head
							parent
							
								
									4a182e89b0
								
							
						
					
					
						commit
						ac62ce3e6c
					
				| 
						 | 
				
			
			@ -19,7 +19,6 @@ limitations under the License.
 | 
			
		|||
 | 
			
		||||
import { ReactNode } from "react";
 | 
			
		||||
import { createClient, MatrixClient, SSOAction, OidcTokenRefresher } from "matrix-js-sdk/src/matrix";
 | 
			
		||||
import { InvalidStoreError } from "matrix-js-sdk/src/errors";
 | 
			
		||||
import { IEncryptedPayload } from "matrix-js-sdk/src/crypto/aes";
 | 
			
		||||
import { QueryDict } from "matrix-js-sdk/src/utils";
 | 
			
		||||
import { logger } from "matrix-js-sdk/src/logger";
 | 
			
		||||
| 
						 | 
				
			
			@ -52,8 +51,6 @@ import LegacyCallHandler from "./LegacyCallHandler";
 | 
			
		|||
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";
 | 
			
		||||
import { setSentryUser } from "./sentry";
 | 
			
		||||
| 
						 | 
				
			
			@ -439,39 +436,6 @@ async function onFailedDelegatedAuthLogin(description: string | ReactNode, tryAg
 | 
			
		|||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function handleInvalidStoreError(e: InvalidStoreError): Promise<void> | void {
 | 
			
		||||
    if (e.reason === InvalidStoreError.TOGGLED_LAZY_LOADING) {
 | 
			
		||||
        return Promise.resolve()
 | 
			
		||||
            .then(() => {
 | 
			
		||||
                const lazyLoadEnabled = e.value;
 | 
			
		||||
                if (lazyLoadEnabled) {
 | 
			
		||||
                    return new Promise<void>((resolve) => {
 | 
			
		||||
                        Modal.createDialog(LazyLoadingResyncDialog, {
 | 
			
		||||
                            onFinished: resolve,
 | 
			
		||||
                        });
 | 
			
		||||
                    });
 | 
			
		||||
                } else {
 | 
			
		||||
                    // show warning about simultaneous use
 | 
			
		||||
                    // between LL/non-LL version on same host.
 | 
			
		||||
                    // as disabling LL when previously enabled
 | 
			
		||||
                    // is a strong indicator of this (/develop & /app)
 | 
			
		||||
                    return new Promise<void>((resolve) => {
 | 
			
		||||
                        Modal.createDialog(LazyLoadingDisabledDialog, {
 | 
			
		||||
                            onFinished: resolve,
 | 
			
		||||
                            host: window.location.host,
 | 
			
		||||
                        });
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .then(() => {
 | 
			
		||||
                return MatrixClientPeg.safeGet().store.deleteAllData();
 | 
			
		||||
            })
 | 
			
		||||
            .then(() => {
 | 
			
		||||
                PlatformPeg.get()?.reload();
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function registerAsGuest(hsUrl: string, isUrl?: string, defaultDeviceDisplayName?: string): Promise<boolean> {
 | 
			
		||||
    logger.log(`Doing guest login on ${hsUrl}`);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,6 @@ import {
 | 
			
		|||
    SyncStateData,
 | 
			
		||||
    SyncState,
 | 
			
		||||
} from "matrix-js-sdk/src/matrix";
 | 
			
		||||
import { InvalidStoreError } from "matrix-js-sdk/src/errors";
 | 
			
		||||
import { defer, IDeferred, QueryDict } from "matrix-js-sdk/src/utils";
 | 
			
		||||
import { logger } from "matrix-js-sdk/src/logger";
 | 
			
		||||
import { throttle } from "lodash";
 | 
			
		||||
| 
						 | 
				
			
			@ -1484,9 +1483,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
 | 
			
		|||
 | 
			
		||||
        cli.on(ClientEvent.Sync, (state: SyncState, prevState: SyncState | null, data?: SyncStateData) => {
 | 
			
		||||
            if (state === SyncState.Error || state === SyncState.Reconnecting) {
 | 
			
		||||
                if (data?.error instanceof InvalidStoreError) {
 | 
			
		||||
                    Lifecycle.handleInvalidStoreError(data.error);
 | 
			
		||||
                }
 | 
			
		||||
                this.setState({ syncError: data?.error ?? null });
 | 
			
		||||
            } else if (this.state.syncError) {
 | 
			
		||||
                this.setState({ syncError: null });
 | 
			
		||||
| 
						 | 
				
			
			@ -2018,14 +2014,10 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
 | 
			
		|||
                />
 | 
			
		||||
            );
 | 
			
		||||
        } else if (this.state.view === Views.LOGGED_IN) {
 | 
			
		||||
            // store errors stop the client syncing and require user intervention, so we'll
 | 
			
		||||
            // be showing a dialog. Don't show anything else.
 | 
			
		||||
            const isStoreError = this.state.syncError && this.state.syncError instanceof InvalidStoreError;
 | 
			
		||||
 | 
			
		||||
            // `ready` and `view==LOGGED_IN` may be set before `page_type` (because the
 | 
			
		||||
            // latter is set via the dispatcher). If we don't yet have a `page_type`,
 | 
			
		||||
            // keep showing the spinner for now.
 | 
			
		||||
            if (this.state.ready && this.state.page_type && !isStoreError) {
 | 
			
		||||
            if (this.state.ready && this.state.page_type) {
 | 
			
		||||
                /* for now, we stuff the entirety of our props and state into the LoggedInView.
 | 
			
		||||
                 * 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -2042,12 +2034,11 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
 | 
			
		|||
                );
 | 
			
		||||
            } else {
 | 
			
		||||
                // we think we are logged in, but are still waiting for the /sync to complete
 | 
			
		||||
                // Suppress `InvalidStoreError`s here, since they have their own error dialog.
 | 
			
		||||
                view = (
 | 
			
		||||
                    <LoginSplashView
 | 
			
		||||
                        matrixClient={MatrixClientPeg.safeGet()}
 | 
			
		||||
                        onLogoutClick={this.onLogoutClick}
 | 
			
		||||
                        syncError={isStoreError ? null : this.state.syncError}
 | 
			
		||||
                        syncError={this.state.syncError}
 | 
			
		||||
                    />
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,55 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2018 New Vector Ltd
 | 
			
		||||
Copyright 2020 The Matrix.org Foundation C.I.C.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
import React from "react";
 | 
			
		||||
 | 
			
		||||
import QuestionDialog from "./QuestionDialog";
 | 
			
		||||
import { _t } from "../../../languageHandler";
 | 
			
		||||
import SdkConfig from "../../../SdkConfig";
 | 
			
		||||
 | 
			
		||||
interface IProps {
 | 
			
		||||
    host: string;
 | 
			
		||||
    onFinished(): void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const LazyLoadingDisabledDialog: React.FC<IProps> = (props) => {
 | 
			
		||||
    const brand = SdkConfig.get().brand;
 | 
			
		||||
    const description1 = _t("lazy_loading|disabled_description1", {
 | 
			
		||||
        brand,
 | 
			
		||||
        host: props.host,
 | 
			
		||||
    });
 | 
			
		||||
    const description2 = _t("lazy_loading|disabled_description2", {
 | 
			
		||||
        brand,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <QuestionDialog
 | 
			
		||||
            hasCancelButton={false}
 | 
			
		||||
            title={_t("lazy_loading|disabled_title")}
 | 
			
		||||
            description={
 | 
			
		||||
                <div>
 | 
			
		||||
                    <p>{description1}</p>
 | 
			
		||||
                    <p>{description2}</p>
 | 
			
		||||
                </div>
 | 
			
		||||
            }
 | 
			
		||||
            button={_t("lazy_loading|disabled_action")}
 | 
			
		||||
            onFinished={props.onFinished}
 | 
			
		||||
        />
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default LazyLoadingDisabledDialog;
 | 
			
		||||
| 
						 | 
				
			
			@ -1,43 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2018 New Vector Ltd
 | 
			
		||||
Copyright 2020 The Matrix.org Foundation C.I.C.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
import React from "react";
 | 
			
		||||
 | 
			
		||||
import QuestionDialog from "./QuestionDialog";
 | 
			
		||||
import { _t } from "../../../languageHandler";
 | 
			
		||||
import SdkConfig from "../../../SdkConfig";
 | 
			
		||||
 | 
			
		||||
interface IProps {
 | 
			
		||||
    onFinished(): void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const LazyLoadingResyncDialog: React.FC<IProps> = (props) => {
 | 
			
		||||
    const brand = SdkConfig.get().brand;
 | 
			
		||||
    const description = _t("lazy_loading|resync_description", { brand });
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <QuestionDialog
 | 
			
		||||
            hasCancelButton={false}
 | 
			
		||||
            title={_t("lazy_loading|resync_title", { brand })}
 | 
			
		||||
            description={<div>{description}</div>}
 | 
			
		||||
            button={_t("action|ok")}
 | 
			
		||||
            onFinished={props.onFinished}
 | 
			
		||||
        />
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default LazyLoadingResyncDialog;
 | 
			
		||||
| 
						 | 
				
			
			@ -1511,14 +1511,6 @@
 | 
			
		|||
        "view_rules": "View rules"
 | 
			
		||||
    },
 | 
			
		||||
    "language_dropdown_label": "Language Dropdown",
 | 
			
		||||
    "lazy_loading": {
 | 
			
		||||
        "disabled_action": "Clear cache and resync",
 | 
			
		||||
        "disabled_description1": "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.",
 | 
			
		||||
        "disabled_description2": "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.",
 | 
			
		||||
        "disabled_title": "Incompatible local cache",
 | 
			
		||||
        "resync_description": "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!",
 | 
			
		||||
        "resync_title": "Updating %(brand)s"
 | 
			
		||||
    },
 | 
			
		||||
    "leave_room_dialog": {
 | 
			
		||||
        "last_person_warning": "You are the only person here. If you leave, no one will be able to join in the future, including you.",
 | 
			
		||||
        "leave_room_question": "Are you sure you want to leave the room '%(roomName)s'?",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue