MOBILE-4081 chore: Fixtures on types and async functions

main
Pau Ferrer Ocaña 2022-08-31 13:36:05 +02:00
parent 17add1f0fb
commit 68a4a4e75f
56 changed files with 159 additions and 233 deletions

View File

@ -93,7 +93,7 @@
</div> </div>
</ng-container> </ng-container>
<p *ngIf="day.filteredEvents.length > 4" class="addon-calendar-day-more"> <p *ngIf="day.filteredEvents.length > 4" class="addon-calendar-day-more">
<b>{{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }}</b> <strong>{{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }}</strong>
</p> </p>
</div> </div>
</ion-col> </ion-col>

View File

@ -661,7 +661,7 @@ export class AddonCalendarHelperProvider {
const finalPromises: Promise<unknown>[] =[AddonCalendar.invalidateAllUpcomingEvents()]; const finalPromises: Promise<unknown>[] =[AddonCalendar.invalidateAllUpcomingEvents()];
// Fetch months and days. // Fetch months and days.
fetchTimestarts.map((fetchTime) => { fetchTimestarts.forEach((fetchTime) => {
const day = moment(fetchTime * 1000); const day = moment(fetchTime * 1000);
const monthId = this.getMonthId(day); const monthId = this.getMonthId(day);
@ -697,7 +697,7 @@ export class AddonCalendarHelperProvider {
}); });
// Invalidate months and days. // Invalidate months and days.
invalidateTimestarts.map((fetchTime) => { invalidateTimestarts.forEach((fetchTime) => {
const day = moment(fetchTime * 1000); const day = moment(fetchTime * 1000);
const monthId = this.getMonthId(day); const monthId = this.getMonthId(day);

View File

@ -529,7 +529,7 @@ export class AddonCalendarProvider {
// Convert the array to an object. // Convert the array to an object.
const result = {}; const result = {};
if (response.allowedeventtypes) { if (response.allowedeventtypes) {
response.allowedeventtypes.map((type) => { response.allowedeventtypes.forEach((type) => {
result[type] = true; result[type] = true;
}); });
} }

View File

@ -65,7 +65,7 @@
<ng-container *ngIf="isSelf && !canLoadMore"> <ng-container *ngIf="isSelf && !canLoadMore">
<p class="ion-text-center">{{ 'addon.messages.selfconversation' | translate }}</p> <p class="ion-text-center">{{ 'addon.messages.selfconversation' | translate }}</p>
<p class="ion-text-center"><i>{{ 'addon.messages.selfconversationdefaultmessage' | translate }}</i></p> <p class="ion-text-center"><em>{{ 'addon.messages.selfconversationdefaultmessage' | translate }}</em></p>
</ng-container> </ng-container>
<h2 class="sr-only">{{ title }}</h2> <h2 class="sr-only">{{ title }}</h2>

View File

@ -126,7 +126,7 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
CoreSites.getCurrentSiteId(), CoreSites.getCurrentSiteId(),
); );
} }
} catch (error) { } catch {
// Ignore errors, probably user is offline or sync is blocked. // Ignore errors, probably user is offline or sync is blocked.
} }
} }

View File

@ -525,7 +525,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
submitId: this.submitId, submitId: this.submitId,
}, this.siteId); }, this.siteId);
} }
} catch (error) { } catch {
// Ignore errors, probably user is offline or sync is blocked. // Ignore errors, probably user is offline or sync is blocked.
} }
} }

View File

@ -565,7 +565,7 @@ export class AddonModAssignProvider {
}; };
try { try {
return this.getSubmissionStatus(assign.id, newOptions); return await this.getSubmissionStatus(assign.id, newOptions);
} catch { } catch {
// Error, return the first result even if it doesn't have the user submission. // Error, return the first result even if it doesn't have the user submission.
return response; return response;

View File

@ -220,7 +220,7 @@ export class AddonModChatChatPage implements OnInit, OnDestroy, CanLeave {
} }
return id; return id;
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
return id; return id;
} }

View File

@ -66,7 +66,9 @@ export class AddonModChatHelperProvider {
if (!formattedMessage.special && formattedMessage.message.match(patternTo)) { if (!formattedMessage.special && formattedMessage.message.match(patternTo)) {
const matches = formattedMessage.message.match(patternTo); const matches = formattedMessage.message.match(patternTo);
formattedMessage.message = `<i><b>${Translate.instant('addon.mod_chat.saidto')} </b>${matches![1]}</i>: ${matches![2]}`; formattedMessage.message = `<em>
<strong>${Translate.instant('addon.mod_chat.saidto')} </strong>
${matches![1]}</em>: ${matches![2]}`;
} }
formattedMessage.showUserData = this.showUserData(currentUserId, message, prevMessage); formattedMessage.showUserData = this.showUserData(currentUserId, message, prevMessage);

View File

@ -723,7 +723,7 @@ export class AddonModDataHelperProvider {
try { try {
await AddonModData.invalidateEntryData(dataId, entryId, siteId); await AddonModData.invalidateEntryData(dataId, entryId, siteId);
await AddonModData.invalidateEntriesData(dataId, siteId); await AddonModData.invalidateEntriesData(dataId, siteId);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }

View File

@ -987,7 +987,7 @@ export class AddonModDataProvider {
options.groupId = options.groupId || 0; options.groupId = options.groupId || 0;
options.sort = options.sort || 0; options.sort = options.sort || 0;
options.order || options.order || 'DESC'; options.order = options.order || 'DESC';
options.page = options.page || 0; options.page = options.page || 0;
options.perPage = options.perPage || AddonModDataProvider.PER_PAGE; options.perPage = options.perPage || AddonModDataProvider.PER_PAGE;
options.readingStrategy = options.readingStrategy || CoreSitesReadingStrategy.PREFER_NETWORK; options.readingStrategy = options.readingStrategy || CoreSitesReadingStrategy.PREFER_NETWORK;

View File

@ -66,9 +66,9 @@ export class AddonModFeedbackAttemptPage implements OnInit, OnDestroy {
/** /**
* @inheritdoc * @inheritdoc
*/ */
ngOnInit(): void { async ngOnInit(): Promise<void> {
try { try {
this.attempts.start(); await this.attempts.start();
} catch (error) { } catch (error) {
CoreDomUtils.showErrorModal(error); CoreDomUtils.showErrorModal(error);

View File

@ -292,7 +292,7 @@ export class AddonModForumDiscussionsSource extends CoreRoutedItemsManagerSource
discussion.userfullname = user.fullname; discussion.userfullname = user.fullname;
discussion.userpictureurl = user.profileimageurl; discussion.userpictureurl = user.profileimageurl;
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
}); });

View File

@ -358,7 +358,7 @@ export class AddonModForumDiscussionPage implements OnInit, AfterViewInit, OnDes
// Not set, use default sort. // Not set, use default sort.
// @TODO add fallback to $CFG->forum_displaymode. // @TODO add fallback to $CFG->forum_displaymode.
} }
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }
@ -511,7 +511,7 @@ export class AddonModForumDiscussionPage implements OnInit, AfterViewInit, OnDes
} }
await Promise.all(promises); await Promise.all(promises);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }

View File

@ -474,7 +474,7 @@ class AddonModGlossaryEntriesManager extends CoreListItemsManager<AddonModGlossa
await AddonModGlossary.logView(glossary.id, viewMode, glossary.name); await AddonModGlossary.logView(glossary.id, viewMode, glossary.name);
CoreCourse.checkModuleCompletion(this.page.courseId, this.page.module.completiondata); CoreCourse.checkModuleCompletion(this.page.courseId, this.page.module.completiondata);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }

View File

@ -663,13 +663,12 @@ export class AddonModGlossaryProvider {
// No more pages and the entry wasn't found. Reject. // No more pages and the entry wasn't found. Reject.
throw new CoreError('Entry not found.'); throw new CoreError('Entry not found.');
}; }
/** /**
* Performs the whole fetch of the entries using the proper function and arguments. * Performs the whole fetch of the entries using the proper function and arguments.
* *
* @param fetchFunction Function to fetch. * @param fetchFunction Function to fetch.
* @param fetchArguments Arguments to call the fetching.
* @param options Other options. * @param options Other options.
* @return Promise resolved with all entrries. * @return Promise resolved with all entrries.
*/ */
@ -682,7 +681,7 @@ export class AddonModGlossaryProvider {
const entries: AddonModGlossaryEntry[] = []; const entries: AddonModGlossaryEntry[] = [];
const fetchMoreEntries = async (): Promise<AddonModGlossaryEntry[]> => { const fetchMoreEntries = async (): Promise<AddonModGlossaryEntry[]> => {
const result = await fetchFunction({ const result = fetchFunction({
from: entries.length, from: entries.length,
...options, // Include all options. ...options, // Include all options.
}); });
@ -915,7 +914,14 @@ export class AddonModGlossaryProvider {
try { try {
// Try to add it in online. // Try to add it in online.
return this.addEntryOnline(glossaryId, concept, definition, entryOptions, <number> attachments, otherOptions.siteId); return await this.addEntryOnline(
glossaryId,
concept,
definition,
entryOptions,
<number> attachments,
otherOptions.siteId,
);
} catch (error) { } catch (error) {
if (otherOptions.allowOffline && !CoreUtils.isWebServiceError(error)) { if (otherOptions.allowOffline && !CoreUtils.isWebServiceError(error)) {
// Couldn't connect to server, store in offline. // Couldn't connect to server, store in offline.

View File

@ -459,7 +459,7 @@ export class AddonModH5PActivityIndexComponent extends CoreCourseModuleMainActiv
try { try {
// Invalidate attempts. // Invalidate attempts.
await AddonModH5PActivity.invalidateUserAttempts(this.h5pActivity.id, undefined, this.siteId); await AddonModH5PActivity.invalidateUserAttempts(this.h5pActivity.id, undefined, this.siteId);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }

View File

@ -119,7 +119,7 @@ export class AddonModH5PActivityAttemptResultsPage implements OnInit {
try { try {
this.user = await CoreUser.getProfile(this.attempt.userid, this.courseId, true); this.user = await CoreUser.getProfile(this.attempt.userid, this.courseId, true);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }

View File

@ -133,7 +133,7 @@ export class AddonModH5PActivityUserAttemptsPage implements OnInit {
protected async fetchUserProfile(): Promise<void> { protected async fetchUserProfile(): Promise<void> {
try { try {
this.user = await CoreUser.getProfile(this.userId, this.courseId, true); this.user = await CoreUser.getProfile(this.userId, this.courseId, true);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }

View File

@ -143,7 +143,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref
if (password) { if (password) {
try { try {
return this.validatePassword(lessonId, accessInfo, password, options); return await this.validatePassword(lessonId, accessInfo, password, options);
} catch { } catch {
// Error validating it. // Error validating it.
} }
@ -320,7 +320,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref
* @param lesson Lesson. * @param lesson Lesson.
* @param password Password (if needed). * @param password Password (if needed).
* @param retake Retake to prefetch. * @param retake Retake to prefetch.
* @param options Options. * @param modOptions Options.
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async prefetchPlayData( protected async prefetchPlayData(
@ -364,12 +364,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref
const promises = pages.map(async (data) => { const promises = pages.map(async (data) => {
// Check if any page has a RANDOMBRANCH jump. // Check if any page has a RANDOMBRANCH jump.
if (!hasRandomBranch) { if (!hasRandomBranch) {
for (let i = 0; i < data.jumps.length; i++) { hasRandomBranch = data.jumps.some((jump) => jump === AddonModLessonProvider.LESSON_RANDOMBRANCH);
if (data.jumps[i] == AddonModLessonProvider.LESSON_RANDOMBRANCH) {
hasRandomBranch = true;
break;
}
}
} }
// Get the page data. We don't pass accessInfo because we don't need to calculate the offline data. // Get the page data. We don't pass accessInfo because we don't need to calculate the offline data.
@ -499,8 +494,8 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref
* Validate the password. * Validate the password.
* *
* @param lessonId Lesson ID. * @param lessonId Lesson ID.
* @param info Lesson access info. * @param accessInfo Lesson access info.
* @param pwd Password to check. * @param password Password to check.
* @param options Other options. * @param options Other options.
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */

View File

@ -118,7 +118,7 @@ export class AddonModLtiHelperProvider {
await AddonModLti.logView(ltiId, name, siteId); await AddonModLti.logView(ltiId, name, siteId);
CoreCourse.checkModuleCompletion(courseId, module.completiondata); CoreCourse.checkModuleCompletion(courseId, module.completiondata);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }

View File

@ -65,7 +65,7 @@
</article> </article>
<div class="ion-margin-top" *ngIf="tagsEnabled && tags.length > 0"> <div class="ion-margin-top" *ngIf="tagsEnabled && tags.length > 0">
<b>{{ 'core.tag.tags' | translate }}:</b> <strong>{{ 'core.tag.tags' | translate }}:</strong>
<core-tag-list [tags]="tags"></core-tag-list> <core-tag-list [tags]="tags"></core-tag-list>
</div> </div>
</div> </div>

View File

@ -723,7 +723,7 @@ export class AddonModWikiProvider {
try { try {
// Try to create it in online. // Try to create it in online.
return this.newPageOnline(title, content, options); return await this.newPageOnline(title, content, options);
} catch (error) { } catch (error) {
if (CoreUtils.isWebServiceError(error)) { if (CoreUtils.isWebServiceError(error)) {
// The WebService has thrown an error, this means that the page cannot be added. // The WebService has thrown an error, this means that the page cannot be added.

View File

@ -119,7 +119,7 @@ export class AddonModWorkshopAssessmentStrategyComponent implements OnInit, OnDe
// Load Weights selector. // Load Weights selector.
if (this.edit && this.access.canallocate) { if (this.edit && this.access.canallocate) {
this.weights; this.weights = [];
for (let i = 16; i >= 0; i--) { for (let i = 16; i >= 0; i--) {
this.weights[i] = i; this.weights[i] = i;
} }
@ -347,8 +347,6 @@ export class AddonModWorkshopAssessmentStrategyComponent implements OnInit, OnDe
this.workshop.course, this.workshop.course,
assessmentData, assessmentData,
); );
gradeUpdated = false;
} else { } else {
// Try to send it to server. // Try to send it to server.

View File

@ -8,7 +8,6 @@
:host-context(ion-item.md) ion-icon { :host-context(ion-item.md) ion-icon {
&[slot] { &[slot] {
font-size: 1.6em;
color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.54); color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.54);
font-size: 24px; font-size: 24px;
margin-top: 12px; margin-top: 12px;

View File

@ -52,10 +52,8 @@ export abstract class CoreBlockBaseComponent implements OnInit, ICoreBlockCompon
*/ */
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
if (this.block.configs && this.block.configs.length > 0) { if (this.block.configs && this.block.configs.length > 0) {
this.block.configs.map((config) => { this.block.configs.forEach((config) => {
config.value = CoreTextUtils.parseJSON(config.value); config.value = CoreTextUtils.parseJSON(config.value);
return config;
}); });
this.block.configsRecord = CoreUtils.arrayToObject(this.block.configs, 'name'); this.block.configsRecord = CoreUtils.arrayToObject(this.block.configs, 'name');

View File

@ -47,13 +47,7 @@ export class CoreCoursesCourseLinkHandlerService extends CoreContentLinksHandler
} }
/** /**
* Get the list of actions for a link (url). * @inheritdoc
*
* @param siteIds List of sites the URL belongs to.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @return List of (or promise resolved with list of) actions.
*/ */
getActions( getActions(
siteIds: string[], siteIds: string[],
@ -103,17 +97,10 @@ export class CoreCoursesCourseLinkHandlerService extends CoreContentLinksHandler
} }
/** /**
* Check if the handler is enabled for a certain site (site + user) and a URL. * @inheritdoc
* If not defined, defaults to true.
*
* @param siteId The site ID.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @return Whether the handler is enabled for the URL and site.
*/ */
async isEnabled(siteId: string, url: string, params: Params, courseId?: number): Promise<boolean> { async isEnabled(siteId: string, url: string, params: Params): Promise<boolean> {
courseId = parseInt(params.id, 10); const courseId = parseInt(params.id, 10);
if (!courseId) { if (!courseId) {
return false; return false;
@ -333,7 +320,7 @@ export class CoreCoursesCourseLinkHandlerService extends CoreContentLinksHandler
await CoreUtils.wait(5000); await CoreUtils.wait(5000);
return await this.waitForEnrolled(courseId); return this.waitForEnrolled(courseId);
} }
} }

View File

@ -973,7 +973,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
this.showMessage('core.editor.textrecovered', this.RESTORE_MESSAGE_CLEAR_TIME); this.showMessage('core.editor.textrecovered', this.RESTORE_MESSAGE_CLEAR_TIME);
} }
} }
} catch (error) { } catch {
// Ignore errors, shouldn't happen. // Ignore errors, shouldn't happen.
} }
} }

View File

@ -56,7 +56,7 @@ export class CoreEditorOfflineProvider {
const params = this.fixDraftPrimaryData(contextLevel, contextInstanceId, elementId, extraParams); const params = this.fixDraftPrimaryData(contextLevel, contextInstanceId, elementId, extraParams);
await db.deleteRecords(DRAFT_TABLE, params); await db.deleteRecords(DRAFT_TABLE, params);
} catch (error) { } catch {
// Ignore errors, probably no draft stored. // Ignore errors, probably no draft stored.
} }
} }
@ -149,12 +149,12 @@ export class CoreEditorOfflineProvider {
} }
await db.insertRecord(DRAFT_TABLE, entry); await db.insertRecord(DRAFT_TABLE, entry);
} catch (error) { } catch {
// Ignore errors saving the draft. It shouldn't happen. // Ignore errors saving the draft. It shouldn't happen.
} }
return entry; return entry;
} catch (error) { } catch {
// No draft stored. Store an empty draft to save the pageinstance. // No draft stored. Store an empty draft to save the pageinstance.
await this.saveDraft( await this.saveDraft(
contextLevel, contextLevel,

View File

@ -812,7 +812,7 @@ export class CoreFileUploaderHelperProvider {
file = await CoreFile.getFileObjectFromFileEntry(fileEntry); file = await CoreFile.getFileObjectFromFileEntry(fileEntry);
size = file.size; size = file.size;
} catch (error) { } catch {
// Ignore failures. // Ignore failures.
} }
} }

View File

@ -30,14 +30,7 @@ export class CoreGradesReportLinkHandlerService extends CoreContentLinksHandlerB
pattern = /\/grade\/report(\/user)?\/index.php/; pattern = /\/grade\/report(\/user)?\/index.php/;
/** /**
* Get the list of actions for a link (url). * @inheritdoc
*
* @param siteIds List of sites the URL belongs to.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @param data Extra data to handle the URL.
* @return List of (or promise resolved with list of) actions.
*/ */
getActions( getActions(
siteIds: string[], siteIds: string[],
@ -60,14 +53,7 @@ export class CoreGradesReportLinkHandlerService extends CoreContentLinksHandlerB
} }
/** /**
* Check if the handler is enabled for a certain site (site + user) and a URL. * @inheritdoc
* If not defined, defaults to true.
*
* @param siteId The site ID.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @return Whether the handler is enabled for the URL and site.
*/ */
async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> { async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> {
if (!courseId && !params.id) { if (!courseId && !params.id) {

View File

@ -30,14 +30,7 @@ export class CoreGradesUserLinkHandlerService extends CoreContentLinksHandlerBas
pattern = /\/course\/user\.php.*[?&]mode=grade/; pattern = /\/course\/user\.php.*[?&]mode=grade/;
/** /**
* Get the list of actions for a link (url). * @inheritdoc
*
* @param siteIds List of sites the URL belongs to.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @param data Extra data to handle the URL.
* @return List of (or promise resolved with list of) actions.
*/ */
getActions( getActions(
siteIds: string[], siteIds: string[],
@ -60,14 +53,7 @@ export class CoreGradesUserLinkHandlerService extends CoreContentLinksHandlerBas
} }
/** /**
* Check if the handler is enabled for a certain site (site + user) and a URL. * @inheritdoc
* If not defined, defaults to true.
*
* @param siteId The site ID.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @return Whether the handler is enabled for the URL and site.
*/ */
async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> { async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> {
if (!courseId && !params.id) { if (!courseId && !params.id) {

View File

@ -191,7 +191,7 @@ export class CoreH5PContentValidator {
/** /**
* Validate given value against number semantics. * Validate given value against number semantics.
* *
* @param num Number to validate. * @param value Number to validate.
* @param semantics Semantics. * @param semantics Semantics.
* @return Validated number. * @return Validated number.
*/ */
@ -497,9 +497,7 @@ export class CoreH5PContentValidator {
let validateFunction: undefined | ((...args: unknown[]) => unknown); let validateFunction: undefined | ((...args: unknown[]) => unknown);
let field: CoreH5PSemantics | undefined; let field: CoreH5PSemantics | undefined;
for (let i = 0; i < semantics.fields.length; i++) { for (const field of semantics.fields) {
field = semantics.fields[i];
if (field.name == key) { if (field.name == key) {
if (semantics.optional) { if (semantics.optional) {
field.optional = true; field.optional = true;
@ -778,8 +776,7 @@ export class CoreH5PContentValidator {
if (matches && matches.length > 1) { if (matches && matches.length > 1) {
if (allowedStyles && attrName === 'style') { if (allowedStyles && attrName === 'style') {
// Allow certain styles. // Allow certain styles.
for (let i = 0; i < allowedStyles.length; i++) { for (const pattern of allowedStyles) {
const pattern = allowedStyles[i];
if (matches[1].match(pattern)) { if (matches[1].match(pattern)) {
// All patterns are start to end patterns, and CKEditor adds one span per style. // All patterns are start to end patterns, and CKEditor adds one span per style.
attrArray.push('style="' + matches[1] + '"'); attrArray.push('style="' + matches[1] + '"');
@ -1122,7 +1119,7 @@ export class CoreH5PContentValidator {
}, },
]; ];
return this.metadataSemantics!; return this.metadataSemantics;
} }
/** /**
@ -1266,7 +1263,7 @@ export class CoreH5PContentValidator {
], ],
}; };
return this.copyrightSemantics!; return this.copyrightSemantics;
} }
/** /**

View File

@ -292,7 +292,7 @@ export class CoreH5PCore {
// Update library usage. // Update library usage.
try { try {
await this.h5pFramework.deleteLibraryUsage(content.id, siteId); await this.h5pFramework.deleteLibraryUsage(content.id, siteId);
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }

View File

@ -229,7 +229,7 @@ export class CoreH5PFileStorage {
try { try {
// Delete the index.html. // Delete the index.html.
await this.deleteContentIndex(entry.foldername, site.getId()); await this.deleteContentIndex(entry.foldername, site.getId());
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
}); });
@ -463,7 +463,7 @@ export class CoreH5PFileStorage {
// Delete existing library version. // Delete existing library version.
try { try {
await CoreFile.removeDir(folderPath); await CoreFile.removeDir(folderPath);
} catch (error) { } catch {
// Ignore errors, maybe it doesn't exist. // Ignore errors, maybe it doesn't exist.
} }

View File

@ -223,7 +223,7 @@ export class CoreH5PHelper {
// Remove tmp folder. // Remove tmp folder.
try { try {
await CoreFile.removeDir(destFolder); await CoreFile.removeDir(destFolder);
} catch (error) { } catch {
// Ignore errors, it will be deleted eventually. // Ignore errors, it will be deleted eventually.
} }
} }

View File

@ -273,7 +273,7 @@ export class CoreH5PValidator {
const parts = entry.name.split('.'); // The language code is in parts[0]. const parts = entry.name.split('.'); // The language code is in parts[0].
langIndex[parts[0]] = langFileData; langIndex[parts[0]] = langFileData;
} catch (error) { } catch {
// Ignore this language. // Ignore this language.
} }
})); }));

View File

@ -47,7 +47,7 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
canDownload$ = new BehaviorSubject(false); canDownload$ = new BehaviorSubject(false);
calculating$ = new BehaviorSubject(true); calculating$ = new BehaviorSubject(true);
displayOptions?: CoreH5PDisplayOptions; displayOptions?: CoreH5PDisplayOptions;
urlParams?: {[name: string]: string}; urlParams: {[name: string]: string} = {};
protected site: CoreSite; protected site: CoreSite;
protected siteId: string; protected siteId: string;
@ -60,7 +60,7 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
) { ) {
this.logger = CoreLogger.getInstance('CoreH5PPlayerComponent'); this.logger = CoreLogger.getInstance('CoreH5PPlayerComponent');
this.site = CoreSites.getCurrentSite()!; this.site = CoreSites.getRequiredCurrentSite();
this.siteId = this.site.getId(); this.siteId = this.site.getId();
this.siteCanDownload = this.site.canDownloadFiles() && !CoreH5P.isOfflineDisabledInSite(); this.siteCanDownload = this.site.canDownloadFiles() && !CoreH5P.isOfflineDisabledInSite();
} }
@ -100,7 +100,7 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
// Download the package in background if the size is low. // Download the package in background if the size is low.
try { try {
this.attemptDownloadInBg(); await this.attemptDownloadInBg();
} catch (error) { } catch (error) {
this.logger.error('Error downloading H5P in background', error); this.logger.error('Error downloading H5P in background', error);
} }
@ -120,12 +120,12 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
try { try {
// Get the file size and ask the user to confirm. // Get the file size and ask the user to confirm.
const size = await CorePluginFileDelegate.getFileSize({ fileurl: this.urlParams!.url }, this.siteId); const size = await CorePluginFileDelegate.getFileSize({ fileurl: this.urlParams.url }, this.siteId);
await CoreDomUtils.confirmDownloadSize({ size: size, total: true }); await CoreDomUtils.confirmDownloadSize({ size: size, total: true });
// User confirmed, add to the queue. // User confirmed, add to the queue.
await CoreFilepool.addToQueueByUrl(this.siteId, this.urlParams!.url, this.component, this.componentId); await CoreFilepool.addToQueueByUrl(this.siteId, this.urlParams.url, this.component, this.componentId);
} catch (error) { } catch (error) {
if (CoreDomUtils.isCanceledError(error)) { if (CoreDomUtils.isCanceledError(error)) {
@ -191,7 +191,6 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Calculate state of the file. * Calculate state of the file.
* *
* @param fileUrl The H5P file URL.
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async calculateState(): Promise<void> { protected async calculateState(): Promise<void> {
@ -199,7 +198,7 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
// Get the status of the file. // Get the status of the file.
try { try {
const state = await CoreFilepool.getFileStateByUrl(this.siteId, this.urlParams!.url); const state = await CoreFilepool.getFileStateByUrl(this.siteId, this.urlParams.url);
this.canDownload$.next(true); this.canDownload$.next(true);
this.state = state; this.state = state;

View File

@ -14,7 +14,7 @@
<ion-list> <ion-list>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqcannotfindmysitequestion' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqcannotfindmysitequestion' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
@ -24,7 +24,7 @@
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqwhatisurlquestion' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqwhatisurlquestion' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap core-login-faqwhatisurlanswer"> <ion-item class="ion-text-wrap core-login-faqwhatisurlanswer">
@ -34,7 +34,7 @@
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqcannotconnectquestion' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqcannotconnectquestion' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
@ -44,7 +44,7 @@
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqsetupsitequestion' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqsetupsitequestion' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
@ -57,7 +57,7 @@
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqtestappquestion' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqtestappquestion' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap"> <ion-item class="ion-text-wrap">
@ -67,7 +67,7 @@
</ion-item> </ion-item>
<ion-item class="ion-text-wrap" *ngIf="canScanQR"> <ion-item class="ion-text-wrap" *ngIf="canScanQR">
<ion-label> <ion-label>
<h2><b>{{ 'core.login.faqwhereisqrcode' | translate }}</b></h2> <h2><strong>{{ 'core.login.faqwhereisqrcode' | translate }}</strong></h2>
</ion-label> </ion-label>
</ion-item> </ion-item>
<ion-item class="ion-text-wrap core-login-faqwhereisqrcodeanswer" *ngIf="canScanQR"> <ion-item class="ion-text-wrap core-login-faqwhereisqrcodeanswer" *ngIf="canScanQR">

View File

@ -360,7 +360,7 @@ export class CoreLoginSitePage implements OnInit {
params: pageParams, params: pageParams,
}); });
} }
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
} }
@ -546,7 +546,7 @@ export class CoreLoginSitePage implements OnInit {
}, },
}); });
} }
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} finally { } finally {
modal.dismiss(); modal.dismiss();

View File

@ -625,13 +625,10 @@ export class CorePushNotificationsProvider {
const total = counters.reduce((previous, counter) => previous + counter, 0); const total = counters.reduce((previous, counter) => previous + counter, 0);
if (!CorePlatform.isMobile()) { if (CorePlatform.isMobile()) {
// Browser doesn't have an app badge, stop. // Set the app badge on mobile.
return total;
}
// Set the app badge.
await Badge.set(total); await Badge.set(total);
}
return total; return total;
} }

View File

@ -404,17 +404,15 @@ export class CoreRatingProvider {
true, true,
)); ));
const ratingsResults = await Promise.all(promises);
if (!site.isVersionGreaterEqualThan([' 3.6.5', '3.7.1', '3.8'])) { if (!site.isVersionGreaterEqualThan([' 3.6.5', '3.7.1', '3.8'])) {
promises.map((promise) => promise.then(async (ratings) => { const ratings: CoreRatingItemRating[] = [].concat.apply([], ratingsResults);
const userIds = ratings.map((rating: CoreRatingItemRating) => rating.userid);
const userIds = ratings.map((rating) => rating.userid);
await CoreUser.prefetchProfiles(userIds, courseId, site.id); await CoreUser.prefetchProfiles(userIds, courseId, site.id);
return;
}));
} }
await Promise.all(promises);
} }
/** /**

View File

@ -53,8 +53,9 @@ export class CoreSiteHomeIndexLinkHandlerService extends CoreContentLinksHandler
/** /**
* @inheritdoc * @inheritdoc
*/ */
async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> { async isEnabled(siteId: string, url: string, params: Record<string, string>): Promise<boolean> {
courseId = parseInt(params.id, 10); const courseId = parseInt(params.id, 10);
if (!courseId) { if (!courseId) {
return url.includes('index.php'); return url.includes('index.php');
} }

View File

@ -30,21 +30,12 @@ export class CoreUserProfileLinkHandlerService extends CoreContentLinksHandlerBa
pattern = /((\/user\/view\.php)|(\/user\/profile\.php)).*([?&]id=\d+)/; pattern = /((\/user\/view\.php)|(\/user\/profile\.php)).*([?&]id=\d+)/;
/** /**
* Get the list of actions for a link (url). * @inheritdoc
*
* @param siteIds List of sites the URL belongs to.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @param data Extra data to handle the URL.
* @return List of (or promise resolved with list of) actions.
*/ */
getActions( getActions(
siteIds: string[], siteIds: string[],
url: string, url: string,
params: Record<string, string>, params: Record<string, string>,
courseId?: number, // eslint-disable-line @typescript-eslint/no-unused-vars
data?: unknown, // eslint-disable-line @typescript-eslint/no-unused-vars
): CoreContentLinksAction[] | Promise<CoreContentLinksAction[]> { ): CoreContentLinksAction[] | Promise<CoreContentLinksAction[]> {
return [{ return [{
action: (siteId): void => { action: (siteId): void => {
@ -59,17 +50,9 @@ export class CoreUserProfileLinkHandlerService extends CoreContentLinksHandlerBa
} }
/** /**
* Check if the handler is enabled for a certain site (site + user) and a URL. * @inheritdoc
* If not defined, defaults to true.
*
* @param siteId The site ID.
* @param url The URL to treat.
* @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1}
* @param courseId Course ID related to the URL. Optional but recommended.
* @return Whether the handler is enabled for the URL and site.
*/ */
// eslint-disable-next-line @typescript-eslint/no-unused-vars async isEnabled(siteId: string, url: string): Promise<boolean> {
async isEnabled(siteId: string, url: string, params: Record<string, string>, courseId?: number): Promise<boolean> {
return url.indexOf('/grade/report/') == -1; return url.indexOf('/grade/report/') == -1;
} }

View File

@ -181,7 +181,7 @@ export class CoreUserProfileFieldDelegateService extends CoreDelegate<CoreUserPr
if (data) { if (data) {
result.push(data); result.push(data);
} }
} catch (error) { } catch {
// Ignore errors. // Ignore errors.
} }
})); }));

View File

@ -43,7 +43,7 @@ export class CoreFormatDatePipe implements PipeTransform {
timestamp = timestamp || Date.now(); timestamp = timestamp || Date.now();
format = format || 'strftimedaydatetime'; format = format || 'strftimedaydatetime';
if (typeof timestamp == 'string') { if (typeof timestamp === 'string') {
// Convert the value to a number. // Convert the value to a number.
const numberTimestamp = parseInt(timestamp, 10); const numberTimestamp = parseInt(timestamp, 10);
if (isNaN(numberTimestamp)) { if (isNaN(numberTimestamp)) {
@ -55,7 +55,7 @@ export class CoreFormatDatePipe implements PipeTransform {
} }
// Add "core." if needed. // Add "core." if needed.
if (format.indexOf('strf') == 0 || format.indexOf('df') == 0) { if (format.indexOf('strf') === 0 || format.indexOf('df') === 0) {
format = 'core.' + format; format = 'core.' + format;
} }

View File

@ -1205,7 +1205,7 @@ export class CoreFileProvider {
}); });
await Promise.all(promises); await Promise.all(promises);
} catch (error) { } catch {
// Ignore errors, maybe it doesn't exist. // Ignore errors, maybe it doesn't exist.
} }
} }

View File

@ -1467,7 +1467,7 @@ export class CoreFilepoolProvider {
const fileSize = await CoreFile.getFileSize(file.path); const fileSize = await CoreFile.getFileSize(file.path);
size += fileSize; size += fileSize;
} catch (error) { } catch {
// Ignore failures, maybe some file was deleted. // Ignore failures, maybe some file was deleted.
} }
})); }));

View File

@ -200,10 +200,8 @@ export class CorePluginFileDelegateService extends CoreDelegate<CorePluginFileHa
if (handler && handler.getFileSize) { if (handler && handler.getFileSize) {
try { try {
const size = handler.getFileSize(downloadableFile, siteId); return await handler.getFileSize(downloadableFile, siteId);
} catch {
return size;
} catch (error) {
// Ignore errors. // Ignore errors.
} }
} }

View File

@ -302,14 +302,12 @@ export class CoreMimetypeUtilsProvider {
*/ */
guessExtensionFromUrl(fileUrl: string): string | undefined { guessExtensionFromUrl(fileUrl: string): string | undefined {
const split = fileUrl.split('.'); const split = fileUrl.split('.');
let candidate; let extension: string | undefined;
let extension;
let position;
if (split.length > 1) { if (split.length > 1) {
candidate = split[split.length - 1].toLowerCase(); let candidate = split[split.length - 1].toLowerCase();
// Remove params if any. // Remove params if any.
position = candidate.indexOf('?'); let position = candidate.indexOf('?');
if (position > -1) { if (position > -1) {
candidate = candidate.substring(0, position); candidate = candidate.substring(0, position);
} }
@ -343,7 +341,7 @@ export class CoreMimetypeUtilsProvider {
*/ */
getFileExtension(filename: string): string | undefined { getFileExtension(filename: string): string | undefined {
const dot = filename.lastIndexOf('.'); const dot = filename.lastIndexOf('.');
let ext; let ext: string | undefined;
if (dot > -1) { if (dot > -1) {
ext = filename.substring(dot + 1).toLowerCase(); ext = filename.substring(dot + 1).toLowerCase();
@ -582,11 +580,10 @@ export class CoreMimetypeUtilsProvider {
*/ */
removeExtension(path: string): string { removeExtension(path: string): string {
const position = path.lastIndexOf('.'); const position = path.lastIndexOf('.');
let extension;
if (position > -1) { if (position > -1) {
// Check extension corresponds to a mimetype to know if it's valid. // Check extension corresponds to a mimetype to know if it's valid.
extension = path.substring(position + 1).toLowerCase(); const extension = path.substring(position + 1).toLowerCase();
if (this.getMimeType(extension) !== undefined) { if (this.getMimeType(extension) !== undefined) {
return path.substring(0, position); // Remove extension. return path.substring(0, position); // Remove extension.
} }

View File

@ -741,7 +741,7 @@ export class CoreTextUtilsProvider {
* @returns Treated text. * @returns Treated text.
*/ */
replaceArguments(text: string, replacements: Record<string, string> = {}, encoding?: 'uri'): string { replaceArguments(text: string, replacements: Record<string, string> = {}, encoding?: 'uri'): string {
let match; let match: RegExpMatchArray | null = null;
while ((match = text.match(/\{\{([^}]+)\}\}/))) { while ((match = text.match(/\{\{([^}]+)\}\}/))) {
const argument = match[1].trim(); const argument = match[1].trim();
@ -829,7 +829,7 @@ export class CoreTextUtilsProvider {
/** /**
* Replace @@PLUGINFILE@@ wildcards with the real URL in a text. * Replace @@PLUGINFILE@@ wildcards with the real URL in a text.
* *
* @param Text to treat. * @param text to treat.
* @param files Files to extract the pluginfile URL from. They need to have the URL in a url or fileurl attribute. * @param files Files to extract the pluginfile URL from. They need to have the URL in a url or fileurl attribute.
* @return Treated text. * @return Treated text.
*/ */
@ -847,8 +847,10 @@ export class CoreTextUtilsProvider {
/** /**
* Restore original draftfile URLs. * Restore original draftfile URLs.
* *
* @param text Text to treat, including pluginfile URLs. * @param siteUrl Site URL.
* @param replaceMap Map of the replacements that were done. * @param treatedText Treated text with replacements.
* @param originalText Original text.
* @param files List of files to search and replace.
* @return Treated text. * @return Treated text.
*/ */
restoreDraftfileUrls(siteUrl: string, treatedText: string, originalText: string, files: CoreWSFile[]): string { restoreDraftfileUrls(siteUrl: string, treatedText: string, originalText: string, files: CoreWSFile[]): string {
@ -1053,7 +1055,6 @@ export class CoreTextUtilsProvider {
* *
* @param title Title of the new state. * @param title Title of the new state.
* @param content Content of the text to be expanded. * @param content Content of the text to be expanded.
* @param component Component to link the embedded files to.
* @param options Options. * @param options Options.
* @return Promise resolved when the modal is displayed. * @return Promise resolved when the modal is displayed.
*/ */

View File

@ -170,7 +170,7 @@ export class CoreTimeUtilsProvider {
/** /**
* Converts a number of seconds into a short human readable format: minutes and seconds, in fromat: 3' 27''. * Converts a number of seconds into a short human readable format: minutes and seconds, in fromat: 3' 27''.
* *
* @param seconds Seconds * @param duration Seconds
* @return Short human readable text. * @return Short human readable text.
* @deprecated since app 4.0. Use CoreTime.formatTimeShort instead. * @deprecated since app 4.0. Use CoreTime.formatTimeShort instead.
*/ */

View File

@ -544,7 +544,7 @@ export class CoreUrlUtilsProvider {
url = url.replace(/\/webservice\/pluginfile\.php\//, '/pluginfile.php/'); url = url.replace(/\/webservice\/pluginfile\.php\//, '/pluginfile.php/');
// Make sure the URL doesn't contain the token. // Make sure the URL doesn't contain the token.
url.replace(/([?&])token=[^&]*&?/, '$1'); url = url.replace(/([?&])token=[^&]*&?/, '$1');
return url; return url;
} }

View File

@ -486,7 +486,7 @@ export class CoreUtilsProvider {
* @param ...args All the params sent after checkAll will be passed to isEnabledFn. * @param ...args All the params sent after checkAll will be passed to isEnabledFn.
* @return Promise resolved with the list of enabled sites. * @return Promise resolved with the list of enabled sites.
*/ */
filterEnabledSites<P extends unknown[]>( async filterEnabledSites<P extends unknown[]>(
siteIds: string[], siteIds: string[],
isEnabledFn: (siteId, ...args: P) => boolean | Promise<boolean>, isEnabledFn: (siteId, ...args: P) => boolean | Promise<boolean>,
checkAll?: boolean, checkAll?: boolean,
@ -507,16 +507,14 @@ export class CoreUtilsProvider {
} }
} }
return this.allPromises(promises).catch(() => { await CoreUtils.ignoreErrors(this.allPromises(promises));
// Ignore errors.
}).then(() => {
if (!checkAll) { if (!checkAll) {
// Checking 1 was enough, so it will either return all the sites or none. // Checking 1 was enough, so it will either return all the sites or none.
return enabledSites.length ? siteIds : []; return enabledSites.length ? siteIds : [];
} else { } else {
return enabledSites; return enabledSites;
} }
});
} }
/** /**
@ -639,11 +637,12 @@ export class CoreUtilsProvider {
* *
* @return Promise resolved with the list of countries. * @return Promise resolved with the list of countries.
*/ */
getCountryList(): Promise<Record<string, string>> { async getCountryList(): Promise<Record<string, string>> {
// Get the keys of the countries. // Get the keys of the countries.
return this.getCountryKeysList().then((keys) => { const keys = await this.getCountryKeysList();
// Now get the code and the translated name. // Now get the code and the translated name.
const countries = {}; const countries: Record<string, string> = {};
keys.forEach((key) => { keys.forEach((key) => {
if (key.indexOf('assets.countries.') === 0) { if (key.indexOf('assets.countries.') === 0) {
@ -653,7 +652,6 @@ export class CoreUtilsProvider {
}); });
return countries; return countries;
});
} }
/** /**
@ -661,18 +659,14 @@ export class CoreUtilsProvider {
* *
* @return Promise resolved with the list of countries. * @return Promise resolved with the list of countries.
*/ */
getCountryListSorted(): Promise<CoreCountry[]> { async getCountryListSorted(): Promise<CoreCountry[]> {
// Get the keys of the countries. // Get the keys of the countries.
return this.getCountryList().then((countries) => { const countries = await this.getCountryList();
// Sort translations. // Sort translations.
const sortedCountries: { code: string; name: string }[] = []; return Object.keys(countries)
.sort((a, b) => countries[a].localeCompare(countries[b]))
Object.keys(countries).sort((a, b) => countries[a].localeCompare(countries[b])).forEach((key) => { .map((code) => ({ code, name: countries[code] }));
sortedCountries.push({ code: key, name: countries[key] });
});
return sortedCountries;
});
} }
/** /**
@ -680,11 +674,13 @@ export class CoreUtilsProvider {
* *
* @return Promise resolved with the countries list. Rejected if not translated. * @return Promise resolved with the countries list. Rejected if not translated.
*/ */
protected getCountryKeysList(): Promise<string[]> { protected async getCountryKeysList(): Promise<string[]> {
// It's possible that the current language isn't translated, so try with default language first. // It's possible that the current language isn't translated, so try with default language first.
const defaultLang = CoreLang.getDefaultLanguage(); const defaultLang = CoreLang.getDefaultLanguage();
return this.getCountryKeysListForLanguage(defaultLang).catch(() => { try {
return await this.getCountryKeysListForLanguage(defaultLang);
} catch {
// Not translated, try to use the fallback language. // Not translated, try to use the fallback language.
const fallbackLang = CoreLang.getFallbackLanguage(); const fallbackLang = CoreLang.getFallbackLanguage();
@ -693,8 +689,8 @@ export class CoreUtilsProvider {
throw new Error('Countries not found.'); throw new Error('Countries not found.');
} }
return this.getCountryKeysListForLanguage(fallbackLang); return await this.getCountryKeysListForLanguage(fallbackLang);
}); }
} }
/** /**
@ -732,17 +728,19 @@ export class CoreUtilsProvider {
* @param url The URL of the file. * @param url The URL of the file.
* @return Promise resolved with the mimetype. * @return Promise resolved with the mimetype.
*/ */
getMimeTypeFromUrl(url: string): Promise<string> { async getMimeTypeFromUrl(url: string): Promise<string> {
// First check if it can be guessed from the URL. // First check if it can be guessed from the URL.
const extension = CoreMimetypeUtils.guessExtensionFromUrl(url); const extension = CoreMimetypeUtils.guessExtensionFromUrl(url);
const mimetype = extension && CoreMimetypeUtils.getMimeType(extension); let mimetype = extension && CoreMimetypeUtils.getMimeType(extension);
if (mimetype) { if (mimetype) {
return Promise.resolve(mimetype); return mimetype;
} }
// Can't be guessed, get the remote mimetype. // Can't be guessed, get the remote mimetype.
return CoreWS.getRemoteFileMimeType(url).then(mimetype => mimetype || ''); mimetype = await CoreWS.getRemoteFileMimeType(url);
return mimetype || '';
} }
/** /**
@ -772,7 +770,7 @@ export class CoreUtilsProvider {
/** /**
* Check if an unknown value is a FileEntry. * Check if an unknown value is a FileEntry.
* *
* @param value Value to check. * @param file Object to check.
* @return Type guard indicating if the file is a FileEntry. * @return Type guard indicating if the file is a FileEntry.
*/ */
valueIsFileEntry(file: unknown): file is FileEntry { valueIsFileEntry(file: unknown): file is FileEntry {
@ -1029,7 +1027,7 @@ export class CoreUtilsProvider {
this.iabInstance = InAppBrowser.create(url, '_blank', options); this.iabInstance = InAppBrowser.create(url, '_blank', options);
if (CorePlatform.isMobile()) { if (CorePlatform.isMobile()) {
let loadStopSubscription; let loadStopSubscription: Subscription | undefined;
const loadStartUrls: string[] = []; const loadStartUrls: string[] = [];
// Trigger global events when a url is loaded or the window is closed. This is to make it work like in Ionic 1. // Trigger global events when a url is loaded or the window is closed. This is to make it work like in Ionic 1.
@ -1720,7 +1718,7 @@ export class CoreUtilsProvider {
* Ignore errors from a promise. * Ignore errors from a promise.
* *
* @param promise Promise to ignore errors. * @param promise Promise to ignore errors.
* @param fallbackResult Value to return if the promise is rejected. * @param fallback Value to return if the promise is rejected.
* @return Promise with ignored errors, resolving to the fallback result if provided. * @return Promise with ignored errors, resolving to the fallback result if provided.
*/ */
async ignoreErrors<Result>(promise: Promise<Result>): Promise<Result | undefined>; async ignoreErrors<Result>(promise: Promise<Result>): Promise<Result | undefined>;