MOBILE-4485 login: Improve app unsupported message
parent
35cda384b0
commit
d2ba06f82e
|
@ -2194,6 +2194,8 @@
|
|||
"core.login.stillcantconnect": "local_moodlemobileapp",
|
||||
"core.login.supplyinfo": "moodle",
|
||||
"core.login.toggleremove": "local_moodlemobileapp",
|
||||
"core.login.unsupportedsite": "local_moodlemobileapp",
|
||||
"core.login.unsupportedsitemessage": "local_moodlemobileapp",
|
||||
"core.login.username": "moodle",
|
||||
"core.login.usernamelowercase": "moodle",
|
||||
"core.login.usernameoremail": "moodle",
|
||||
|
|
|
@ -21,3 +21,6 @@ export const EMAIL_SIGNUP_FEATURE_NAME = 'CoreLoginEmailSignup';
|
|||
export const FORGOTTEN_PASSWORD_FEATURE_NAME = 'NoDelegate_ForgottenPassword';
|
||||
export const IDENTITY_PROVIDERS_FEATURE_NAME = 'NoDelegate_IdentityProviders';
|
||||
export const IDENTITY_PROVIDER_FEATURE_NAME_PREFIX = 'NoDelegate_IdentityProvider_';
|
||||
|
||||
// Event indicating that a user left the app because it wasn't supported by a site.
|
||||
export const APP_UNSUPPORTED_CHURN = 'app_unsupported_churn';
|
||||
|
|
|
@ -119,6 +119,8 @@
|
|||
"stillcantconnect": "Still can't connect?",
|
||||
"supplyinfo": "More details",
|
||||
"toggleremove": "Edit accounts list",
|
||||
"unsupportedsite": "Site not accessible through the app",
|
||||
"unsupportedsitemessage": "{{site}} can't be accessed through this app.\nYou can still access it using a web browser",
|
||||
"username": "Username",
|
||||
"usernamelowercase": "Only lowercase letters allowed",
|
||||
"usernameoremail": "Enter either username or email address",
|
||||
|
|
|
@ -35,6 +35,7 @@ import { CorePlatform } from '@services/platform';
|
|||
import { CoreSitesFactory } from '@services/sites-factory';
|
||||
import { EMAIL_SIGNUP_FEATURE_NAME, FORGOTTEN_PASSWORD_FEATURE_NAME } from '@features/login/constants';
|
||||
import { CoreCustomURLSchemes } from '@services/urlschemes';
|
||||
import { CoreSiteError } from '@classes/errors/siteerror';
|
||||
|
||||
/**
|
||||
* Page to enter the user credentials.
|
||||
|
@ -292,7 +293,11 @@ export class CoreLoginCredentialsPage implements OnInit, OnDestroy {
|
|||
|
||||
await CoreNavigator.navigateToSiteHome({ params: { urlToOpen: this.urlToOpen } });
|
||||
} catch (error) {
|
||||
if (error instanceof CoreSiteError && CoreLoginHelper.isAppUnsupportedError(error)) {
|
||||
await CoreLoginHelper.showAppUnsupportedModal(siteUrl, this.site, error.debug);
|
||||
} else {
|
||||
CoreLoginHelper.treatUserTokenError(siteUrl, error, username, password);
|
||||
}
|
||||
|
||||
if (error.loggedout) {
|
||||
CoreNavigator.navigate('/login/sites', { reset: true });
|
||||
|
|
|
@ -48,6 +48,7 @@ import { CorePlatform } from '@services/platform';
|
|||
import { CoreReferrer } from '@services/referrer';
|
||||
import { CoreSitesFactory } from '@services/sites-factory';
|
||||
import { ONBOARDING_DONE } from '@features/login/constants';
|
||||
import { CoreUnauthenticatedSite } from '@classes/sites/unauthenticated-site';
|
||||
|
||||
/**
|
||||
* Site (url) chooser when adding a new site.
|
||||
|
@ -301,7 +302,7 @@ export class CoreLoginSitePage implements OnInit {
|
|||
url = url.trim();
|
||||
|
||||
if (url.match(/^(https?:\/\/)?campus\.example\.edu/)) {
|
||||
this.showLoginIssue(null, new CoreError(Translate.instant('core.login.errorexampleurl')));
|
||||
this.showLoginIssue(url, new CoreError(Translate.instant('core.login.errorexampleurl')));
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -403,17 +404,23 @@ export class CoreLoginSitePage implements OnInit {
|
|||
* @param url The URL the user was trying to connect to.
|
||||
* @param error Error to display.
|
||||
*/
|
||||
protected async showLoginIssue(url: string | null, error: CoreError): Promise<void> {
|
||||
protected async showLoginIssue(url: string, error: CoreError): Promise<void> {
|
||||
let errorMessage = CoreDomUtils.getErrorMessage(error);
|
||||
let siteExists = false;
|
||||
let supportConfig: CoreUserSupportConfig | undefined = undefined;
|
||||
let errorTitle: string | undefined;
|
||||
let debug: CoreSiteErrorDebug | undefined;
|
||||
let errorTitle: string | undefined;
|
||||
let site: CoreUnauthenticatedSite | undefined;
|
||||
let supportConfig: CoreUserSupportConfig | undefined;
|
||||
|
||||
if (error instanceof CoreSiteError) {
|
||||
supportConfig = error.supportConfig;
|
||||
siteExists = supportConfig instanceof CoreUserGuestSupportConfig;
|
||||
site = supportConfig instanceof CoreUserGuestSupportConfig ? supportConfig.getSite() : undefined;
|
||||
debug = error.debug;
|
||||
|
||||
if (CoreLoginHelper.isAppUnsupportedError(error)) {
|
||||
await CoreLoginHelper.showAppUnsupportedModal(url, site, debug);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (error instanceof CoreLoginError) {
|
||||
|
@ -440,7 +447,7 @@ export class CoreLoginSitePage implements OnInit {
|
|||
}),
|
||||
}
|
||||
: (
|
||||
!siteExists
|
||||
!site
|
||||
? {
|
||||
text: Translate.instant('core.needhelp'),
|
||||
cssClass: 'core-login-need-help',
|
||||
|
|
|
@ -48,6 +48,7 @@ import {
|
|||
TypeOfLogin,
|
||||
} from '@classes/sites/unauthenticated-site';
|
||||
import {
|
||||
APP_UNSUPPORTED_CHURN,
|
||||
EMAIL_SIGNUP_FEATURE_NAME,
|
||||
FAQ_QRCODE_IMAGE_HTML,
|
||||
FAQ_QRCODE_INFO_DONE,
|
||||
|
@ -56,7 +57,7 @@ import {
|
|||
IDENTITY_PROVIDER_FEATURE_NAME_PREFIX,
|
||||
} from '../constants';
|
||||
import { LazyRoutesModule } from '@/app/app-routing.module';
|
||||
import { CoreSiteError } from '@classes/errors/siteerror';
|
||||
import { CoreSiteError, CoreSiteErrorDebug } from '@classes/errors/siteerror';
|
||||
|
||||
/**
|
||||
* Helper provider that provides some common features regarding authentication.
|
||||
|
@ -66,6 +67,15 @@ export class CoreLoginHelperProvider {
|
|||
|
||||
protected static readonly PASSWORD_RESETS_CONFIG_KEY = 'password-resets';
|
||||
|
||||
private static readonly APP_UNSUPPORTED_ERRORS = [
|
||||
'loginfailed',
|
||||
'logintokenempty',
|
||||
'logintokenerror',
|
||||
'mobileservicesnotenabled',
|
||||
'sitehasredirect',
|
||||
'webservicesnotenabled',
|
||||
];
|
||||
|
||||
protected logger: CoreLogger;
|
||||
protected sessionExpiredCheckingSite: Record<string, boolean> = {};
|
||||
protected isOpenEditAlertShown = false;
|
||||
|
@ -931,6 +941,54 @@ export class CoreLoginHelperProvider {
|
|||
return String(CoreConstants.CONFIG.skipssoconfirmation) === 'true';
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the given error means that the app is not working in the site.
|
||||
*
|
||||
* @param error Site error.
|
||||
* @returns Whether the given error means that the app is not working in the site.
|
||||
*/
|
||||
isAppUnsupportedError(error: CoreSiteError): boolean {
|
||||
return CoreLoginHelperProvider.APP_UNSUPPORTED_ERRORS.includes(error.debug?.code ?? '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show modal indicating that the app is not supported in the site.
|
||||
*
|
||||
* @param siteUrl Site url.
|
||||
* @param site Site instance.
|
||||
* @param debug Error debug information.
|
||||
*/
|
||||
async showAppUnsupportedModal(siteUrl: string, site?: CoreUnauthenticatedSite, debug?: CoreSiteErrorDebug): Promise<void> {
|
||||
const siteName = await site?.getSiteName() ?? siteUrl;
|
||||
|
||||
await CoreDomUtils.showAlertWithOptions({
|
||||
header: Translate.instant('core.login.unsupportedsite'),
|
||||
message: Translate.instant('core.login.unsupportedsitemessage', { site: siteName }),
|
||||
buttons: [
|
||||
{
|
||||
text: Translate.instant('core.cancel'),
|
||||
role: 'cancel',
|
||||
},
|
||||
{
|
||||
text: Translate.instant('core.openinbrowser'),
|
||||
handler: () => this.openInBrowserFallback(site?.getURL() ?? siteUrl, debug),
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Open site in browser as fallback when it is not supported in the app.
|
||||
*
|
||||
* @param siteUrl Site url.
|
||||
* @param debug Error debug information.
|
||||
*/
|
||||
async openInBrowserFallback(siteUrl: string, debug?: CoreSiteErrorDebug): Promise<void> {
|
||||
CoreEvents.trigger(APP_UNSUPPORTED_CHURN, { siteUrl, debug });
|
||||
|
||||
await CoreUtils.openInBrowser(siteUrl, { showBrowserWarning: false });
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a modal warning that the credentials introduced were not correct.
|
||||
*/
|
||||
|
@ -1622,3 +1680,16 @@ export type CoreLoginSiteFinderSettings = {
|
|||
displayurl: boolean;
|
||||
defaultimageurl?: string;
|
||||
};
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
/**
|
||||
* Augment CoreEventsData interface with events specific to this service.
|
||||
*
|
||||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[APP_UNSUPPORTED_CHURN]: { siteUrl: string; debug?: CoreSiteErrorDebug };
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -71,6 +71,15 @@ export class CoreUserGuestSupportConfig extends CoreUserSupportConfig {
|
|||
return 'supportpage' in this.config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get site.
|
||||
*
|
||||
* @returns site.
|
||||
*/
|
||||
getSite(): CoreUnauthenticatedSite {
|
||||
return this.site;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue