Merge pull request #4232 from crazyserver/MOBILE-4653

Mobile 4653
main
Dani Palou 2024-11-18 14:46:20 +01:00 committed by GitHub
commit 84781a7658
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
671 changed files with 6508 additions and 4333 deletions

View File

@ -69,7 +69,7 @@ jobs:
cat circular-dependencies
lines=$(cat circular-dependencies | wc -l)
echo "Total circular dependencies: $lines"
test $lines -eq 130
test $lines -eq 90
- name: JavaScript code compatibility
run: |
npx check-es-compat www/*.js --polyfills="\{Array,String,TypedArray\}.prototype.at,Object.hasOwn"

View File

@ -30,4 +30,4 @@ const routes: Routes = [
RouterModule.forChild(routes),
],
})
export class AddonBadgeLazyModule {}
export default class AddonBadgeLazyModule {}

View File

@ -33,4 +33,4 @@ const routes: Routes = [
AddonBadgesBadgeClassPage,
],
})
export class AddonBadgeClassLazyModule {}
export default class AddonBadgeClassLazyModule {}

View File

@ -63,4 +63,4 @@ const routes: Routes = [
AddonBadgesUserBadgesPage,
],
})
export class AddonBadgesLazyModule {}
export default class AddonBadgesLazyModule {}

View File

@ -43,15 +43,15 @@ export async function getBadgesServices(): Promise<Type<unknown>[]> {
const mainMenuRoutes: Routes = [
{
path: 'badge',
loadChildren: () => import('./badge-lazy.module').then(m => m.AddonBadgeLazyModule),
loadChildren: () => import('./badge-lazy.module'),
},
{
path: 'badges',
loadChildren: () => import('./badges-lazy.module').then(m => m.AddonBadgesLazyModule),
loadChildren: () => import('./badges-lazy.module'),
},
{
path: 'badgeclass',
loadChildren: () => import('./badgeclass-lazy.module').then(m => m.AddonBadgeClassLazyModule),
loadChildren: () => import('./badgeclass-lazy.module'),
},
];

View File

@ -14,7 +14,7 @@
import { Component, OnInit } from '@angular/core';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreNavigator } from '@services/navigator';
import { ActivatedRoute } from '@angular/router';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
@ -81,7 +81,7 @@ export class AddonBadgesBadgeClassPage implements OnInit {
* @param refresher Refresher.
*/
async refreshBadgeClass(refresher?: HTMLIonRefresherElement): Promise<void> {
await CoreUtils.ignoreErrors(AddonBadges.invalidateBadgeClass(this.badgeId));
await CorePromiseUtils.ignoreErrors(AddonBadges.invalidateBadgeClass(this.badgeId));
await this.fetchBadgeClass();

View File

@ -18,7 +18,7 @@ import { CoreDomUtils } from '@services/utils/dom';
import { CoreSites } from '@services/sites';
import { CoreUser } from '@features/user/services/user';
import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreCourses } from '@features/courses/services/courses';
import { CoreNavigator } from '@services/navigator';
import { ActivatedRoute } from '@angular/router';
@ -151,12 +151,12 @@ export class AddonBadgesIssuedBadgePage implements OnInit, OnDestroy {
* @param refresher Refresher.
*/
async refreshBadges(refresher?: HTMLIonRefresherElement): Promise<void> {
await CoreUtils.allPromisesIgnoringErrors([
await CorePromiseUtils.allPromisesIgnoringErrors([
AddonBadges.invalidateUserBadges(this.courseId, this.userId),
AddonBadges.invalidateUserBadgeByHash(this.badgeHash),
]);
await CoreUtils.ignoreErrors(Promise.all([
await CorePromiseUtils.ignoreErrors(Promise.all([
this.fetchIssuedBadge(),
]));

View File

@ -17,7 +17,7 @@ import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreNavigator } from '@services/navigator';
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
@ -90,13 +90,13 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
* @param refresher Refresher.
*/
async refreshBadges(refresher?: HTMLIonRefresherElement): Promise<void> {
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
AddonBadges.invalidateUserBadges(
this.badges.getSource().COURSE_ID,
this.badges.getSource().USER_ID,
),
);
await CoreUtils.ignoreErrors(this.badges.reload());
await CorePromiseUtils.ignoreErrors(this.badges.reload());
refresher?.complete();
}

View File

@ -15,9 +15,9 @@
import { Injectable } from '@angular/core';
import { CoreSites } from '@services/sites';
import { CoreWSExternalWarning } from '@services/ws';
import { CoreSite } from '@classes/sites/site';
import { makeSingleton } from '@singletons';
import { CoreError } from '@classes/errors/error';
import { CoreCacheUpdateFrequency } from '@/core/constants';
const ROOT_CACHE_KEY = 'mmaBadges:';
@ -70,7 +70,7 @@ export class AddonBadgesProvider {
};
const preSets = {
cacheKey: this.getBadgesCacheKey(courseId, userId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const response = await site.read<AddonBadgesGetUserBadgesWSResponse>('core_badges_get_user_badges', data, preSets);
@ -133,7 +133,7 @@ export class AddonBadgesProvider {
};
const preSets = {
cacheKey: this.getUserBadgeByHashCacheKey(hash),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const response = await site.read<AddonBadgesGetUserBadgeByHashWSResponse>(
@ -190,7 +190,7 @@ export class AddonBadgesProvider {
};
const preSets = {
cacheKey: this.getBadgeClassCacheKey(id),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const response = await site.read<AddonBadgesGetBadgeClassWSResponse>(

View File

@ -14,13 +14,14 @@
import { Injectable } from '@angular/core';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
import { AddonBadges } from '../badges';
import { makeSingleton } from '@singletons';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { CoreNavigator } from '@services/navigator';
import { AddonBadgesHelper } from '../badges-helper';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Handler for badges push notifications clicks.
@ -72,7 +73,7 @@ export class AddonBadgesPushClickHandlerService implements CorePushNotifications
}
// No hash, open the list of user badges.
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
AddonBadges.invalidateUserBadges(
0,
Number(notification.usertoid),

View File

@ -13,7 +13,6 @@
// limitations under the License.
import { Injectable, Type } from '@angular/core';
import { CoreTagFeedComponent } from '@features/tag/components/feed/feed';
import { CoreTagAreaHandler } from '@features/tag/services/tag-area-delegate';
import { CoreTagFeedElement, CoreTagHelper } from '@features/tag/services/tag-helper';
import { makeSingleton } from '@singletons';
@ -45,7 +44,9 @@ export class AddonBadgesTagAreaHandlerService implements CoreTagAreaHandler {
/**
* @inheritdoc
*/
getComponent(): Type<unknown> | Promise<Type<unknown>> {
async getComponent(): Promise<Type<unknown>> {
const { CoreTagFeedComponent } = await import('@features/tag/components/feed/feed');
return CoreTagFeedComponent;
}

View File

@ -19,7 +19,7 @@ import { CoreBlockBaseComponent } from '@features/block/classes/base-block-compo
import { CoreSites } from '@services/sites';
import { ContextLevel, CoreConstants } from '@/core/constants';
import { Translate } from '@singletons';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { CoreNavigator } from '@services/navigator';
import { CoreCourseHelper } from '@features/course/services/course-helper';
import { CoreUrl } from '@singletons/url';
@ -106,7 +106,7 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i
});
// Sort the modnames alphabetically.
modFullNames = CoreUtils.sortValues(modFullNames);
modFullNames = CoreObject.sortValues(modFullNames);
for (const modName in modFullNames) {
const iconModName = modName === 'resources' ? 'page' : modName;

View File

@ -19,8 +19,8 @@ import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler
import { CoreCourseBlock } from '@features/course/services/course';
import { Params } from '@angular/router';
import { makeSingleton } from '@singletons';
import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu';
import { ContextLevel } from '@/core/constants';
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
/**
* Block handler.
@ -46,7 +46,7 @@ export class AddonBlockCalendarMonthHandlerService extends CoreBlockBaseHandler
title: 'addon.block_calendarmonth.pluginname',
class: 'addon-block-calendar-month',
component: CoreBlockOnlyTitleComponent,
link: AddonCalendarMainMenuHandlerService.PAGE_NAME,
link: ADDON_CALENDAR_PAGE_NAME,
linkParams: linkParams,
navOptions: {
preferCurrentTab: false,

View File

@ -19,9 +19,9 @@ import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler
import { CoreCourseBlock } from '@features/course/services/course';
import { Params } from '@angular/router';
import { makeSingleton } from '@singletons';
import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu';
import { CoreSites } from '@services/sites';
import { ContextLevel } from '@/core/constants';
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
/**
* Block handler.
@ -51,7 +51,7 @@ export class AddonBlockCalendarUpcomingHandlerService extends CoreBlockBaseHandl
title: 'addon.block_calendarupcoming.pluginname',
class: 'addon-block-calendar-upcoming',
component: CoreBlockOnlyTitleComponent,
link: AddonCalendarMainMenuHandlerService.PAGE_NAME,
link: ADDON_CALENDAR_PAGE_NAME,
linkParams: linkParams,
};
}

View File

@ -17,7 +17,6 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import {
CoreCoursesProvider,
CoreCourses,
CoreCoursesMyCoursesUpdatedEventData,
CoreCourseSummaryData,
@ -27,7 +26,7 @@ import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/servi
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
import { CoreSite } from '@classes/sites/site';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreText } from '@singletons/text';
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
@ -38,6 +37,12 @@ import { PageLoadsManager } from '@classes/page-loads-manager';
import { DownloadStatus } from '@/core/constants';
import { CoreSharedModule } from '@/core/shared.module';
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
import {
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
CoreCoursesMyCoursesUpdatedEventAction,
CORE_COURSES_STATE_FAVOURITE,
CORE_COURSES_STATE_HIDDEN,
} from '@features/courses/constants';
const FILTER_PRIORITY: AddonBlockMyOverviewTimeFilters[] =
['all', 'inprogress', 'future', 'past', 'favourite', 'allincludinghidden', 'hidden'];
@ -137,7 +142,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
}, CoreSites.getCurrentSiteId());
this.coursesObserver = CoreEvents.on(
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
(data) => {
this.refreshCourseList(data);
},
@ -238,7 +243,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
// Invalidate course completion data.
promises.push(this.invalidateCourseList().finally(() =>
CoreUtils.allPromises(courseIds.map((courseId) =>
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
if (courseIds.length == 1) {
@ -250,7 +255,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
}
await CoreUtils.allPromises(promises).finally(() => {
await CorePromiseUtils.allPromises(promises).finally(() => {
this.prefetchIconsInitialized = false;
});
}
@ -428,29 +433,29 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
}
/**
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
*
* @param data Event data.
* @returns Promise resolved when done.
*/
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
// Always update if user enrolled in a course.
return this.refreshContent(true);
}
const course = this.allCourses.find((course) => course.id == data.courseId);
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED) {
if (!course) {
// Not found, use WS update.
return this.refreshContent(true);
}
if (data.state == CoreCoursesProvider.STATE_FAVOURITE) {
if (data.state === CORE_COURSES_STATE_FAVOURITE) {
course.isfavourite = !!data.value;
}
if (data.state == CoreCoursesProvider.STATE_HIDDEN) {
if (data.state === CORE_COURSES_STATE_HIDDEN) {
course.hidden = !!data.value;
}
@ -458,7 +463,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
await this.filterCourses();
}
if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
if (!course) {
// Not found, use WS update.
return this.refreshContent(true);

View File

@ -16,7 +16,6 @@ import { Component, OnInit, OnDestroy } from '@angular/core';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import {
CoreCoursesProvider,
CoreCoursesMyCoursesUpdatedEventData,
CoreCourses,
CoreCourseSummaryData,
@ -29,10 +28,16 @@ import {
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CoreSite } from '@classes/sites/site';
import { CoreSharedModule } from '@/core/shared.module';
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
import {
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
CoreCoursesMyCoursesUpdatedEventAction,
CORE_COURSES_STATE_FAVOURITE,
} from '@features/courses/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Component to render a recent courses block.
@ -73,7 +78,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
this.scrollElementId = `addon-block-recentlyaccessedcourses-scroll-${scrollId}`;
this.coursesObserver = CoreEvents.on(
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
(data) => {
this.refreshCourseList(data);
},
@ -114,7 +119,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
// Invalidate course completion data.
promises.push(this.invalidateCourseList().finally(() =>
CoreUtils.allPromises(courseIds.map((courseId) =>
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
if (courseIds.length == 1) {
@ -126,7 +131,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
}
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
}
/**
@ -170,20 +175,20 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
}
/**
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
*
* @param data Event data.
* @returns Promise resolved when done.
*/
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
// Always update if user enrolled in a course.
return this.refreshContent();
}
const courseIndex = this.courses.findIndex((course) => course.id == data.courseId);
const course = this.courses[courseIndex];
if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
if (!course) {
// Not found, use WS update.
return this.refreshContent();
@ -196,8 +201,8 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
await this.invalidateCourseList();
}
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED &&
data.state == CoreCoursesProvider.STATE_FAVOURITE && course) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED &&
data.state === CORE_COURSES_STATE_FAVOURITE && course) {
course.isfavourite = !!data.value;
await this.invalidateCourseList();
}

View File

@ -21,7 +21,7 @@ import {
} from '../../services/recentlyaccesseditems';
import { CoreText } from '@singletons/text';
import { CoreLoadings } from '@services/loadings';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CoreSharedModule } from '@/core/shared.module';
/**

View File

@ -15,7 +15,7 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import { CoreCoursesProvider, CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses';
import { CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses';
import {
CoreCourseSearchedDataWithExtraInfoAndOptions,
CoreEnrolledCourseDataWithOptions,
@ -23,11 +23,17 @@ import {
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CoreSite } from '@classes/sites/site';
import { AddonBlockStarredCourse, AddonBlockStarredCourses } from '../../services/starredcourses';
import { CoreSharedModule } from '@/core/shared.module';
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
import {
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
CoreCoursesMyCoursesUpdatedEventAction,
CORE_COURSES_STATE_FAVOURITE,
} from '@features/courses/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Component to render a starred courses block.
@ -68,7 +74,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
this.scrollElementId = `addon-block-starredcourses-scroll-${scrollId}`;
this.coursesObserver = CoreEvents.on(
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
(data) => {
this.refreshCourseList(data);
},
@ -108,7 +114,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
// Invalidate course completion data.
promises.push(this.invalidateCourseList().finally(() =>
CoreUtils.allPromises(courseIds.map((courseId) =>
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
if (courseIds.length == 1) {
@ -120,7 +126,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
}
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
}
/**
@ -157,19 +163,19 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
}
/**
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
*
* @param data Event data.
* @returns Promise resolved when done.
*/
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
// Always update if user enrolled in a course.
// New courses shouldn't be favourite by default, but just in case.
return this.refreshContent();
}
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED && data.state == CoreCoursesProvider.STATE_FAVOURITE) {
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED && data.state == CORE_COURSES_STATE_FAVOURITE) {
const courseIndex = this.courses.findIndex((course) => course.id == data.courseId);
if (courseIndex < 0) {
// Not found, use WS update. Usually new favourite.

View File

@ -16,7 +16,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { CoreSites } from '@services/sites';
import { ICoreBlockComponent } from '@features/block/classes/base-block-component';
import { AddonBlockTimeline } from '../../services/timeline';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper';
import { CoreCourses } from '@features/courses/services/courses';
@ -122,7 +122,7 @@ export class AddonBlockTimelineComponent implements OnInit, ICoreBlockComponent
* @inheritdoc
*/
async invalidateContent(): Promise<void> {
await CoreUtils.allPromises([
await CorePromiseUtils.allPromises([
AddonBlockTimeline.invalidateActionEventsByTimesort(),
AddonBlockTimeline.invalidateActionEventsByCourses(),
CoreCourses.invalidateUserCourses(),

View File

@ -42,7 +42,7 @@ import { canLeaveGuard } from '@guards/can-leave';
},
{
path: 'edit/:id',
loadComponent: () => import('./pages/edit-entry/edit-entry').then(c => c.AddonBlogEditEntryPage),
loadComponent: () => import('./pages/edit-entry/edit-entry'),
canDeactivate: [canLeaveGuard],
},
...buildTabMainRoutes(injector, {
@ -71,4 +71,4 @@ import { canLeaveGuard } from '@guards/can-leave';
},
],
})
export class AddonBlogLazyModule {}
export default class AddonBlogLazyModule {}

View File

@ -37,7 +37,7 @@ import { AddonBlogSyncCronHandler } from './services/handlers/sync-cron';
const routes: Routes = [
{
path: ADDON_BLOG_MAINMENU_PAGE_NAME,
loadChildren: () => import('@addons/blog/blog-lazy.module').then(m => m.AddonBlogLazyModule),
loadChildren: () => import('@addons/blog/blog-lazy.module'),
},
];

View File

@ -41,12 +41,13 @@ import { CoreNetwork } from '@services/network';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { CoreSync } from '@services/sync';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { Translate } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { CoreForms } from '@singletons/form';
import { CoreFileEntry } from '@services/file-helper';
import { CoreTimeUtils } from '@services/utils/time';
import { CorePromiseUtils } from '@singletons/promise-utils';
@Component({
selector: 'addon-blog-edit-entry',
@ -59,7 +60,7 @@ import { CoreTimeUtils } from '@services/utils/time';
CoreTagComponentsModule,
],
})
export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
export default class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
@ViewChild('editEntryForm') formElement!: ElementRef;
@ -257,7 +258,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
return selectedEntry;
} catch (error) {
if (!params.filters || CoreUtils.isWebServiceError(error)) {
if (!params.filters || CoreWSError.isWebServiceError(error)) {
// Cannot get the entry, reject.
throw error;
}
@ -323,7 +324,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
const filters: AddonBlogFilter | undefined = CoreNavigator.getRouteParam('filters');
const entry = this.entry && 'attachment' in this.entry
? this.entry
: await CoreUtils.ignoreErrors(this.getEntry({ filters, lastModified, entryId: this.entry.id }));
: await CorePromiseUtils.ignoreErrors(this.getEntry({ filters, lastModified, entryId: this.entry.id }));
const removedFiles = CoreFileUploader.getFilesToDelete(entry?.attachmentfiles ?? [], this.files);
@ -335,7 +336,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
return await this.saveEntry({ attachmentsId: attachmentsid });
} catch (error) {
if (CoreUtils.isWebServiceError(error)) {
if (CoreWSError.isWebServiceError(error)) {
// It's a WebService error, the user cannot send the message so don't store it.
CoreDomUtils.showErrorModalDefault(error, 'Error updating entry.');
@ -360,7 +361,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
const attachmentsId = await this.uploadOrStoreFiles({ created });
await this.saveEntry({ created, attachmentsId });
} catch (error) {
if (CoreUtils.isWebServiceError(error)) {
if (CoreWSError.isWebServiceError(error)) {
// It's a WebService error, the user cannot send the message so don't store it.
CoreDomUtils.showErrorModalDefault(error, 'Error creating entry.');

View File

@ -36,7 +36,7 @@ import { CoreNetwork } from '@services/network';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUrl } from '@singletons/url';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreArray } from '@singletons/array';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreTime } from '@singletons/time';
@ -93,7 +93,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
this.isOnline.set(CoreNetwork.isOnline());
this.logView = CoreTime.once(async () => {
await CoreUtils.ignoreErrors(AddonBlog.logView(this.filter));
await CorePromiseUtils.ignoreErrors(AddonBlog.logView(this.filter));
CoreAnalytics.logEvent({
type: CoreAnalyticsEventType.VIEW_ITEM_LIST,
@ -113,7 +113,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
this.entryUpdateObserver = CoreEvents.on(ADDON_BLOG_ENTRY_UPDATED, async () => {
this.loaded.set(false);
await CoreUtils.ignoreErrors(this.refresh());
await CorePromiseUtils.ignoreErrors(this.refresh());
this.loaded.set(true);
});
@ -123,7 +123,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
}
this.loaded.set(false);
await CoreUtils.ignoreErrors(this.refresh(false));
await CorePromiseUtils.ignoreErrors(this.refresh(false));
this.loaded.set(true);
});
@ -375,7 +375,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
* @param refresher Refresher instance.
*/
async refresh(sync = true, refresher?: HTMLIonRefresherElement): Promise<void> {
const promises = this.entries.map((entry) => {
const promises = this.entries.map(async (entry) => {
if (this.isOnlineEntry(entry)) {
return CoreComments.invalidateCommentsData(
ContextLevel.USER,
@ -399,7 +399,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
}
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
await this.fetchEntries(true, false, sync);
refresher?.complete();
}

View File

@ -17,7 +17,7 @@ import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
import { CoreFile } from '@services/file';
import { CoreFileEntry } from '@services/file-helper';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { makeSingleton } from '@singletons';
import { CoreObject } from '@singletons/object';
import { CorePath } from '@singletons/path';
@ -108,7 +108,7 @@ export class AddonBlogOfflineService {
*/
async getOfflineEntry(filter: { id?: number; created?: number }, siteId?: string): Promise<AddonBlogOfflineEntry | undefined> {
const site = await CoreSites.getSite(siteId);
const record = await CoreUtils.ignoreErrors(
const record = await CorePromiseUtils.ignoreErrors(
site.getDb().getRecord<AddonBlogOfflineEntry>(OFFLINE_BLOG_ENTRIES_TABLE_NAME, filter),
);

View File

@ -17,7 +17,7 @@ import { CoreSyncBaseProvider, CoreSyncBlockedError } from '@classes/base-sync';
import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { CoreSync, CoreSyncResult } from '@services/sync';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { makeSingleton, Translate } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { ADDON_BLOG_AUTO_SYNCED, ADDON_BLOG_SYNC_ID } from '../constants';
@ -129,7 +129,7 @@ import { AddonBlogOfflineEntryDBRecord } from './database/blog';
await AddonBlogOffline.deleteOfflineEntryRecord({ created: entry.created }, siteId);
result.updated = true;
} catch (error) {
if (!error || !CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
throw error;
}
@ -223,7 +223,7 @@ import { AddonBlogOfflineEntryDBRecord } from './database/blog';
entriesToSync = entriesPendingToSync;
}
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
throw error;
}

View File

@ -12,10 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { ContextLevel } from '@/core/constants';
import { ContextLevel, CoreCacheUpdateFrequency } from '@/core/constants';
import { Injectable } from '@angular/core';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreSite } from '@classes/sites/site';
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { CoreTagItem } from '@features/tag/services/tag';
import { CoreUser, CoreUserProfile } from '@features/user/services/user';
@ -23,10 +22,12 @@ import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
import { CoreNetwork } from '@services/network';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonBlogOffline, AddonBlogOfflineEntry } from './blog-offline';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreWSError } from '@classes/errors/wserror';
const ROOT_CACHE_KEY = 'addonBlog:';
@ -62,7 +63,7 @@ export class AddonBlogProvider {
* @returns Cache key.
*/
getEntriesCacheKey(filter: AddonBlogFilter = {}): string {
return ROOT_CACHE_KEY + CoreUtils.sortAndStringify(filter);
return ROOT_CACHE_KEY + CoreObject.sortAndStringify(filter);
}
/**
@ -76,14 +77,14 @@ export class AddonBlogProvider {
const site = await CoreSites.getSite(options?.siteId);
const data: CoreBlogGetEntriesWSParams = {
filters: CoreUtils.objectToArrayOfObjects(filter, 'name', 'value'),
filters: CoreObject.toArrayOfObjects(filter, 'name', 'value'),
page: options?.page ?? 0,
perpage: AddonBlogProvider.ENTRIES_PER_PAGE,
};
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getEntriesCacheKey(filter),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
...CoreSites.getReadingStrategyPreSets(options?.readingStrategy),
};
@ -121,7 +122,7 @@ export class AddonBlogProvider {
try {
await this.addEntryOnline(params, siteId);
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return await storeOffline();
}
@ -177,7 +178,7 @@ export class AddonBlogProvider {
try {
await this.updateEntryOnline(params, siteId);
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return await storeOffline();
}
@ -230,9 +231,9 @@ export class AddonBlogProvider {
}
await this.deleteEntryOnline(params, siteId);
await CoreUtils.ignoreErrors(AddonBlogOffline.unmarkEntryAsRemoved(params.entryid));
await CorePromiseUtils.ignoreErrors(AddonBlogOffline.unmarkEntryAsRemoved(params.entryid));
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return await AddonBlogOffline.markEntryAsRemoved({ id: params.entryid, subject }, siteId);
}
@ -289,7 +290,7 @@ export class AddonBlogProvider {
const site = await CoreSites.getSite(siteId);
const data: AddonBlogViewEntriesWSParams = {
filters: CoreUtils.objectToArrayOfObjects(filter, 'name', 'value'),
filters: CoreObject.toArrayOfObjects(filter, 'name', 'value'),
};
return site.write('core_blog_view_entries', data);
@ -312,7 +313,7 @@ export class AddonBlogProvider {
const tags = options?.find(option => option.name === 'tags')?.value as string | undefined;
const publishState = options?.find(option => option.name === 'publishstate')?.value as AddonBlogPublishState
?? AddonBlogPublishState.draft;
const user = await CoreUtils.ignoreErrors(CoreUser.getProfile(offlineEntry.userid, courseId, true));
const user = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(offlineEntry.userid, courseId, true));
const folder = 'id' in offlineEntry && offlineEntry.id ? { id: offlineEntry.id } : { created: offlineEntry.created };
const offlineFiles = await AddonBlogOffline.getOfflineFiles(folder);
const optionsFiles = this.getAttachmentFilesFromOptions(options);
@ -376,7 +377,7 @@ export class AddonBlogProvider {
}
entry.summary = CoreFileHelper.replacePluginfileUrls(entry.summary, entry.summaryfiles || []);
entry.user = await CoreUtils.ignoreErrors(CoreUser.getProfile(entry.userid, entry.courseid, true));
entry.user = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(entry.userid, entry.courseid, true));
}
/**

View File

@ -13,7 +13,6 @@
// limitations under the License.
import { Injectable, Type } from '@angular/core';
import { CoreTagFeedComponent } from '@features/tag/components/feed/feed';
import { CoreTagAreaHandler } from '@features/tag/services/tag-area-delegate';
import { CoreTagFeedElement, CoreTagHelper } from '@features/tag/services/tag-helper';
import { makeSingleton } from '@singletons';
@ -45,9 +44,11 @@ export class AddonBlogTagAreaHandlerService implements CoreTagAreaHandler {
/**
* @inheritdoc
*/
getComponent(): Type<unknown> | Promise<Type<unknown>> {
return CoreTagFeedComponent;
}
async getComponent(): Promise<Type<unknown>> {
const { CoreTagFeedComponent } = await import('@features/tag/components/feed/feed');
return CoreTagFeedComponent;
}
}
export const AddonBlogTagAreaHandler = makeSingleton(AddonBlogTagAreaHandlerService);

View File

@ -25,7 +25,7 @@ import { CoreEditorComponentsModule } from '@features/editor/components/componen
import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module';
import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module';
import { AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu';
import { ADDON_CALENDAR_PAGE_NAME } from './constants';
/**
* Build module routes.
@ -37,7 +37,7 @@ function buildRoutes(injector: Injector): Routes {
return [
{
path: 'index',
data: { mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME },
data: { mainMenuTabRoot: ADDON_CALENDAR_PAGE_NAME },
component: AddonCalendarIndexPage,
},
{
@ -86,4 +86,4 @@ function buildRoutes(injector: Injector): Routes {
},
],
})
export class AddonCalendarLazyModule {}
export default class AddonCalendarLazyModule {}

View File

@ -20,7 +20,7 @@ import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu-deleg
import { CoreCronDelegate } from '@services/cron';
import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate';
import { AddonCalendarViewLinkHandler } from './services/handlers/view-link';
import { AddonCalendarMainMenuHandler, AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu';
import { AddonCalendarMainMenuHandler } from './services/handlers/mainmenu';
import { AddonCalendarSyncCronHandler } from './services/handlers/sync-cron';
import { CORE_SITE_SCHEMAS } from '@services/sites';
@ -29,6 +29,7 @@ import { CALENDAR_OFFLINE_SITE_SCHEMA } from './services/database/calendar-offli
import { AddonCalendarComponentsModule } from './components/components.module';
import { AddonCalendar } from './services/calendar';
import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
import { ADDON_CALENDAR_PAGE_NAME } from './constants';
/**
* Get calendar services.
@ -51,8 +52,8 @@ export async function getCalendarServices(): Promise<Type<unknown>[]> {
const mainMenuChildrenRoutes: Routes = [
{
path: AddonCalendarMainMenuHandlerService.PAGE_NAME,
loadChildren: () => import('./calendar-lazy.module').then(m => m.AddonCalendarLazyModule),
path: ADDON_CALENDAR_PAGE_NAME,
loadChildren: () => import('./calendar-lazy.module'),
},
];

View File

@ -29,10 +29,9 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreUtils } from '@services/utils/utils';
import { CoreArray } from '@singletons/array';
import {
AddonCalendar,
AddonCalendarProvider,
AddonCalendarWeek,
AddonCalendarWeekDaysTranslationKeys,
AddonCalendarEventToDisplay,
@ -54,6 +53,7 @@ import { CoreUrl } from '@singletons/url';
import { CoreTime } from '@singletons/time';
import { Translate } from '@singletons';
import { toBoolean } from '@/core/transforms/boolean';
import { ADDON_CALENDAR_UNDELETED_EVENT_EVENT } from '@addons/calendar/constants';
/**
* Component that displays a calendar.
@ -61,7 +61,7 @@ import { toBoolean } from '@/core/transforms/boolean';
@Component({
selector: 'addon-calendar-calendar',
templateUrl: 'addon-calendar-calendar.html',
styleUrls: ['calendar.scss'],
styleUrl: 'calendar.scss',
})
export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestroy {
@ -93,7 +93,7 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
// Listen for events "undeleted" (offline).
this.undeleteEventObserver = CoreEvents.on(
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
(data) => {
if (!data || !data.eventId) {
return;
@ -464,7 +464,7 @@ class AddonCalendarMonthSlidesItemsManagerSource extends CoreSwipeSlidesDynamicI
const categories = await CoreCourses.getCategories(0, true);
// Index categories by ID.
this.categories = CoreUtils.arrayToObject(categories, 'id');
this.categories = CoreArray.toObject(categories, 'id');
} catch {
// Ignore errors.
}

View File

@ -14,13 +14,13 @@
import { Component, Input, OnInit } from '@angular/core';
import { CoreEnrolledCourseData } from '@features/courses/services/courses';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { ModalController } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { AddonCalendarEventType, AddonCalendarProvider } from '../../services/calendar';
import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/calendar-helper';
import { AddonCalendarFilter } from '@addons/calendar/services/calendar-helper';
import { ALL_COURSES_ID } from '@features/courses/services/courses-helper';
import { CoreSharedModule } from '@/core/shared.module';
import { ADDON_CALENDAR_FILTER_CHANGED_EVENT, AddonCalendarEventIcons, AddonCalendarEventType } from '@addons/calendar/constants';
/**
* Component to display the events filter that includes events types and a list of courses.
@ -54,7 +54,7 @@ export class AddonCalendarFilterComponent implements OnInit {
sortedCourses: CoreEnrolledCourseData[] = [];
constructor() {
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
const value = AddonCalendarEventType[name];
this.typeIcons[value] = AddonCalendarEventIcons[name];
this.types.push(value);
@ -95,7 +95,7 @@ export class AddonCalendarFilterComponent implements OnInit {
this.filter.filtered = !!this.filter.courseId || this.types.some((name) => !this.filter[name]);
CoreEvents.trigger(AddonCalendarProvider.FILTER_CHANGED_EVENT, this.filter);
CoreEvents.trigger(ADDON_CALENDAR_FILTER_CHANGED_EVENT, this.filter);
}
/**

View File

@ -17,7 +17,6 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import {
AddonCalendarProvider,
AddonCalendarEventToDisplay,
AddonCalendar,
} from '../../services/calendar';
@ -29,6 +28,7 @@ import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import { CoreUrl } from '@singletons/url';
import { CoreTime } from '@singletons/time';
import { Translate } from '@singletons';
import { ADDON_CALENDAR_UNDELETED_EVENT_EVENT } from '@addons/calendar/constants';
/**
* Component that displays upcoming events.
@ -36,7 +36,7 @@ import { Translate } from '@singletons';
@Component({
selector: 'addon-calendar-upcoming-events',
templateUrl: 'addon-calendar-upcoming-events.html',
styleUrls: ['../../calendar-common.scss'],
styleUrl: '../../calendar-common.scss',
})
export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, OnDestroy {
@ -70,7 +70,7 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On
// Listen for events "undeleted" (offline).
this.undeleteEventObserver = CoreEvents.on(
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
(data) => {
if (!data || !data.eventId) {
return;

View File

@ -13,3 +13,46 @@
// limitations under the License.
export const ADDON_CALENDAR_COMPONENT = 'AddonCalendarEvents';
export const ADDON_CALENDAR_PAGE_NAME = 'calendar';
export const ADDON_CALENDAR_EVENTS_TABLE = 'addon_calendar_events_3';
export const ADDON_CALENDAR_AUTO_SYNCED = 'addon_calendar_autom_synced';
export const ADDON_CALENDAR_MANUAL_SYNCED = 'addon_calendar_manual_synced';
export const ADDON_CALENDAR_SYNC_ID = 'calendar';
export const ADDON_CALENDAR_DAYS_INTERVAL = 30;
export const ADDON_CALENDAR_STARTING_WEEK_DAY = 'addon_calendar_starting_week_day';
export const ADDON_CALENDAR_TF_24 = '%H:%M'; // Calendar time in 24 hours format.
export const ADDON_CALENDAR_TF_12 = '%I:%M %p'; // Calendar time in 12 hours format.
export const ADDON_CALENDAR_NEW_EVENT_EVENT = 'addon_calendar_new_event';
export const ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT = 'addon_calendar_new_event_discarded';
export const ADDON_CALENDAR_EDIT_EVENT_EVENT = 'addon_calendar_edit_event';
export const ADDON_CALENDAR_DELETED_EVENT_EVENT = 'addon_calendar_deleted_event';
export const ADDON_CALENDAR_UNDELETED_EVENT_EVENT = 'addon_calendar_undeleted_event';
export const ADDON_CALENDAR_FILTER_CHANGED_EVENT = 'addon_calendar_filter_changed_event';
/**
* Context levels enumeration.
*/
export enum AddonCalendarEventIcons {
SITE = 'fas-globe',
CATEGORY = 'fas-cubes',
COURSE = 'fas-graduation-cap',
GROUP = 'fas-users',
USER = 'fas-user',
}
/**
* Main calendar Event types enumeration.
*/
export enum AddonCalendarEventType {
SITE = 'site',
CATEGORY = 'category',
COURSE = 'course',
GROUP = 'group',
USER = 'user',
}

View File

@ -19,15 +19,13 @@ import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreTimeUtils } from '@services/utils/time';
import {
AddonCalendarProvider,
AddonCalendar,
AddonCalendarEventToDisplay,
AddonCalendarCalendarDay,
AddonCalendarEventType,
} from '../../services/calendar';
import { AddonCalendarOffline } from '../../services/calendar-offline';
import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calendar-helper';
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
import { AddonCalendarSync } from '../../services/calendar-sync';
import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
import { CoreCoursesHelper } from '@features/courses/services/courses-helper';
import moment from 'moment-timezone';
@ -35,7 +33,7 @@ import { NgZone, Translate } from '@singletons';
import { CoreNavigator } from '@services/navigator';
import { Params } from '@angular/router';
import { Subscription } from 'rxjs';
import { CoreUtils } from '@services/utils/utils';
import { CoreArray } from '@singletons/array';
import { CoreConstants } from '@/core/constants';
import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager';
import { CoreSwipeSlidesComponent } from '@components/swipe-slides/swipe-slides';
@ -49,6 +47,18 @@ import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import { CoreUrl } from '@singletons/url';
import { CoreTime } from '@singletons/time';
import { CoreModals } from '@services/modals';
import {
ADDON_CALENDAR_AUTO_SYNCED,
ADDON_CALENDAR_DELETED_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
ADDON_CALENDAR_MANUAL_SYNCED,
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
AddonCalendarEventType,
} from '@addons/calendar/constants';
import { CoreObject } from '@singletons/object';
/**
* Page that displays the calendar events for a certain day.
@ -91,7 +101,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
// Listen for events added. When an event is added, reload the data.
this.eventObservers.push(CoreEvents.on(
AddonCalendarProvider.NEW_EVENT_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
(data) => {
if (data && data.eventId) {
this.manager?.getSource().markAllItemsUnloaded();
@ -102,14 +112,14 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
));
// Listen for new event discarded event. When it does, reload the data.
this.eventObservers.push(CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => {
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, () => {
this.manager?.getSource().markAllItemsUnloaded();
this.refreshData(true, true);
}, this.currentSiteId));
// Listen for events edited. When an event is edited, reload the data.
this.eventObservers.push(CoreEvents.on(
AddonCalendarProvider.EDIT_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
(data) => {
if (data && data.eventId) {
this.manager?.getSource().markAllItemsUnloaded();
@ -120,13 +130,13 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
));
// Refresh data if calendar events are synchronized automatically.
this.eventObservers.push(CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => {
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_AUTO_SYNCED, () => {
this.manager?.getSource().markAllItemsUnloaded();
this.refreshData(false, true);
}, this.currentSiteId));
// Refresh data if calendar events are synchronized manually but not by this page.
this.eventObservers.push(CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => {
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_MANUAL_SYNCED, (data) => {
const selectedDay = this.manager?.getSelectedItem();
if (data && (data.source != 'day' || !selectedDay || !data.moment || !selectedDay.moment.isSame(data.moment, 'day'))) {
this.manager?.getSource().markAllItemsUnloaded();
@ -136,7 +146,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
// Update the events when an event is deleted.
this.eventObservers.push(CoreEvents.on(
AddonCalendarProvider.DELETED_EVENT_EVENT,
ADDON_CALENDAR_DELETED_EVENT_EVENT,
(data) => {
if (data && !data.sent) {
// Event was deleted in offline. Just mark it as deleted, no need to refresh.
@ -151,7 +161,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
// Listen for events "undeleted" (offline).
this.eventObservers.push(CoreEvents.on(
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
(data) => {
if (!data || !data.eventId) {
return;
@ -164,7 +174,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
));
this.eventObservers.push(CoreEvents.on(
AddonCalendarProvider.FILTER_CHANGED_EVENT,
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
async (data) => {
this.filter = data;
@ -212,7 +222,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
ngOnInit(): void {
const types: string[] = [];
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
const value = AddonCalendarEventType[name];
this.filter[name] = CoreNavigator.getRouteBooleanParam(name) ?? true;
types.push(value);
@ -343,7 +353,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
result.moment = selectedDay?.moment;
this.manager?.getSource().markAllItemsUnloaded();
CoreEvents.trigger(AddonCalendarSyncProvider.MANUAL_SYNCED, result, this.currentSiteId);
CoreEvents.trigger(ADDON_CALENDAR_MANUAL_SYNCED, result, this.currentSiteId);
}
} catch (error) {
if (showErrors) {
@ -597,7 +607,7 @@ class AddonCalendarDaySlidesItemsManagerSource extends CoreSwipeSlidesDynamicIte
const categories = await CoreCourses.getCategories(0, true);
// Index categories by ID.
this.categories = CoreUtils.arrayToObject(categories, 'id');
this.categories = CoreArray.toObject(categories, 'id');
} catch {
// Ignore errors.
}

View File

@ -20,20 +20,18 @@ import { CoreSites } from '@services/sites';
import { CoreSync } from '@services/sync';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CoreCategoryData, CoreCourses, CoreCourseSearchedData, CoreEnrolledCourseData } from '@features/courses/services/courses';
import { CoreEditorRichTextEditorComponent } from '@features/editor/components/rich-text-editor/rich-text-editor';
import {
AddonCalendarProvider,
AddonCalendarGetCalendarAccessInformationWSResponse,
AddonCalendarEvent,
AddonCalendarEventType,
AddonCalendar,
AddonCalendarSubmitCreateUpdateFormDataWSParams,
} from '../../services/calendar';
import { AddonCalendarOffline } from '../../services/calendar-offline';
import { AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper';
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
import { AddonCalendarSync } from '../../services/calendar-sync';
import { CoreSite } from '@classes/sites/site';
import { Translate } from '@singletons';
import { CoreFilterHelper } from '@features/filter/services/filter-helper';
@ -42,12 +40,20 @@ import { CoreError } from '@classes/errors/error';
import { CoreNavigator } from '@services/navigator';
import { CanLeave } from '@guards/can-leave';
import { CoreForms } from '@singletons/form';
import { CoreReminders, CoreRemindersService, CoreRemindersUnits } from '@features/reminders/services/reminders';
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
import moment from 'moment-timezone';
import { ADDON_CALENDAR_COMPONENT } from '@addons/calendar/constants';
import {
ADDON_CALENDAR_COMPONENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
ADDON_CALENDAR_SYNC_ID,
AddonCalendarEventType,
} from '@addons/calendar/constants';
import { ContextLevel } from '@/core/constants';
import { CorePopovers } from '@services/popovers';
import { CoreLoadings } from '@services/loadings';
import { REMINDERS_DISABLED, CoreRemindersUnits } from '@features/reminders/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Page that displays a form to create/edit an event.
@ -55,7 +61,7 @@ import { CoreLoadings } from '@services/loadings';
@Component({
selector: 'page-addon-calendar-edit-event',
templateUrl: 'edit-event.html',
styleUrls: ['edit-event.scss'],
styleUrl: 'edit-event.scss',
})
export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
@ -159,7 +165,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
try {
const [types, accessInfo] = await Promise.all([
AddonCalendar.getAllowedEventTypes(this.courseId),
CoreUtils.ignoreErrors(AddonCalendar.getAccessInformation(this.courseId), {
CorePromiseUtils.ignoreErrors(AddonCalendar.getAccessInformation(this.courseId), {
canmanageentries: false,
canmanageownentries: false,
canmanagegroupentries: false,
@ -179,7 +185,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
// Editing an event, get the event data. Wait for sync first.
const eventId = this.eventId;
promises.push(AddonCalendarSync.waitForSync(AddonCalendarSyncProvider.SYNC_ID).then(async () => {
promises.push(AddonCalendarSync.waitForSync(ADDON_CALENDAR_SYNC_ID).then(async () => {
// Do not block if the scope is already destroyed.
if (!this.isDestroyed && this.eventId) {
CoreSync.blockOperation(ADDON_CALENDAR_COMPONENT, eventId);
@ -363,7 +369,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
this.form.controls.repeateditall.setValue(1);
}
if (event.eventtype == AddonCalendarEventType.GROUP && courseId) {
if (event.eventtype === AddonCalendarEventType.GROUP && courseId) {
await this.loadGroups(courseId);
}
}
@ -489,12 +495,12 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
repeat: formData.repeat,
};
if (formData.eventtype == AddonCalendarEventType.COURSE) {
if (formData.eventtype === AddonCalendarEventType.COURSE) {
data.courseid = formData.courseid;
} else if (formData.eventtype == AddonCalendarEventType.GROUP) {
} else if (formData.eventtype === AddonCalendarEventType.GROUP) {
data.groupcourseid = formData.groupcourseid;
data.groupid = formData.groupid;
} else if (formData.eventtype == AddonCalendarEventType.CATEGORY) {
} else if (formData.eventtype === AddonCalendarEventType.CATEGORY) {
data.categoryid = formData.categoryid;
}
@ -560,13 +566,13 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
if (this.eventId && this.eventId > 0) {
// Editing an event.
CoreEvents.trigger(
AddonCalendarProvider.EDIT_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
{ eventId: this.eventId },
this.currentSite.getId(),
);
} else {
CoreEvents.trigger(
AddonCalendarProvider.NEW_EVENT_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
{
eventId: event.id,
oldEventId: this.eventId,
@ -617,7 +623,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
// Check if default reminders are enabled.
const defaultTime = await CoreReminders.getDefaultNotificationTime(this.currentSite.getId());
if (defaultTime === CoreRemindersService.DISABLED) {
if (defaultTime === REMINDERS_DISABLED) {
return;
}

View File

@ -17,11 +17,10 @@ import { AlertOptions } from '@ionic/core';
import {
AddonCalendar,
AddonCalendarEventToDisplay,
AddonCalendarProvider,
} from '../../services/calendar';
import { AddonCalendarEventReminder, AddonCalendarHelper } from '../../services/calendar-helper';
import { AddonCalendarOffline } from '../../services/calendar-offline';
import { AddonCalendarSync, AddonCalendarSyncEvents, AddonCalendarSyncProvider } from '../../services/calendar-sync';
import { AddonCalendarSync, AddonCalendarSyncEvents } from '../../services/calendar-sync';
import { CoreNetwork } from '@services/network';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreDomUtils } from '@services/utils/dom';
@ -32,13 +31,13 @@ import { CoreTimeUtils } from '@services/utils/time';
import { NgZone, Translate } from '@singletons';
import { Subscription } from 'rxjs';
import { CoreNavigator } from '@services/navigator';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
import { CoreConstants } from '@/core/constants';
import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker';
import { AddonCalendarEventsSource } from '@addons/calendar/classes/events-source';
import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager';
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
import { CoreReminders } from '@features/reminders/services/reminders';
import { CoreLocalNotifications } from '@services/local-notifications';
import { CorePlatform } from '@services/platform';
import { CoreConfig } from '@services/config';
@ -46,6 +45,16 @@ import { CoreToasts, ToastDuration } from '@services/toasts';
import { CorePopovers } from '@services/popovers';
import { CoreLoadings } from '@services/loadings';
import { CoreUrl } from '@singletons/url';
import {
ADDON_CALENDAR_AUTO_SYNCED,
ADDON_CALENDAR_DELETED_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
ADDON_CALENDAR_MANUAL_SYNCED,
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
} from '@addons/calendar/constants';
import { REMINDERS_DEFAULT_NOTIFICATION_TIME_CHANGED } from '@features/reminders/constants';
/**
* Page that displays a single calendar event.
@ -99,7 +108,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
this.canEdit = AddonCalendar.canEditEventsInSite();
// Listen for event edited. If current event is edited, reload the data.
this.editEventObserver = CoreEvents.on(AddonCalendarProvider.EDIT_EVENT_EVENT, (data) => {
this.editEventObserver = CoreEvents.on(ADDON_CALENDAR_EDIT_EVENT_EVENT, (data) => {
if (data && data.eventId === this.eventId) {
this.eventLoaded = false;
this.refreshEvent(true, false);
@ -107,7 +116,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
}, this.currentSiteId);
// Listen for event created. If user edits the data of a new offline event or it's sent to server, this event is triggered.
this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data) => {
this.newEventObserver = CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_EVENT, (data) => {
if (this.eventId < 0 && data && (data.eventId === this.eventId || data.oldEventId === this.eventId)) {
this.eventId = data.eventId;
this.eventLoaded = false;
@ -117,14 +126,14 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
// Refresh data if this calendar event is synchronized automatically.
this.syncObserver = CoreEvents.on(
AddonCalendarSyncProvider.AUTO_SYNCED,
ADDON_CALENDAR_AUTO_SYNCED,
(data) => this.checkSyncResult(false, data),
this.currentSiteId,
);
// Refresh data if calendar events are synchronized manually but not by this page.
this.manualSyncObserver = CoreEvents.on(
AddonCalendarSyncProvider.MANUAL_SYNCED,
ADDON_CALENDAR_MANUAL_SYNCED,
(data) => this.checkSyncResult(true, data),
this.currentSiteId,
);
@ -138,7 +147,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
});
// Reload reminders if default notification time changes.
this.defaultTimeChangedObserver = CoreEvents.on(CoreRemindersService.DEFAULT_NOTIFICATION_TIME_CHANGED, () => {
this.defaultTimeChangedObserver = CoreEvents.on(REMINDERS_DEFAULT_NOTIFICATION_TIME_CHANGED, () => {
this.loadReminders();
}, this.currentSiteId);
@ -364,7 +373,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
result.source = 'event';
CoreEvents.trigger(
AddonCalendarSyncProvider.MANUAL_SYNCED,
ADDON_CALENDAR_MANUAL_SYNCED,
result,
this.currentSiteId,
);
@ -471,7 +480,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
}
promises.push(AddonCalendar.invalidateTimeFormat());
await CoreUtils.allPromisesIgnoringErrors(promises);
await CorePromiseUtils.allPromisesIgnoringErrors(promises);
await this.fetchEvent(sync, showErrors);
}
@ -552,9 +561,9 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
// Trigger an event.
if (this.event.id < 0) {
CoreEvents.trigger(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, {}, CoreSites.getCurrentSiteId());
CoreEvents.trigger(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, {}, CoreSites.getCurrentSiteId());
} else {
CoreEvents.trigger(AddonCalendarProvider.DELETED_EVENT_EVENT, {
CoreEvents.trigger(ADDON_CALENDAR_DELETED_EVENT_EVENT, {
eventId: this.eventId,
sent: onlineEventDeleted,
}, CoreSites.getCurrentSiteId());
@ -595,7 +604,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
await AddonCalendarOffline.unmarkDeleted(this.event.id);
// Trigger an event.
CoreEvents.trigger(AddonCalendarProvider.UNDELETED_EVENT_EVENT, {
CoreEvents.trigger(ADDON_CALENDAR_UNDELETED_EVENT_EVENT, {
eventId: this.eventId,
}, CoreSites.getCurrentSiteId());

View File

@ -18,9 +18,9 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreCoursesHelper } from '@features/courses/services/courses-helper';
import { AddonCalendar, AddonCalendarProvider } from '../../services/calendar';
import { AddonCalendar } from '../../services/calendar';
import { AddonCalendarOffline } from '../../services/calendar-offline';
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
import { AddonCalendarSync } from '../../services/calendar-sync';
import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calendar-helper';
import { NgZone } from '@singletons';
import { Subscription } from 'rxjs';
@ -31,6 +31,16 @@ import { AddonCalendarUpcomingEventsComponent } from '../../components/upcoming-
import { CoreNavigator } from '@services/navigator';
import { CoreConstants } from '@/core/constants';
import { CoreModals } from '@services/modals';
import {
ADDON_CALENDAR_AUTO_SYNCED,
ADDON_CALENDAR_DELETED_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
ADDON_CALENDAR_MANUAL_SYNCED,
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
} from '@addons/calendar/constants';
/**
* Page that displays the calendar events.
@ -85,7 +95,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
// Listen for events added. When an event is added, reload the data.
this.newEventObserver = CoreEvents.on(
AddonCalendarProvider.NEW_EVENT_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
(data) => {
if (data && data.eventId) {
this.loaded = false;
@ -96,14 +106,14 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
);
// Listen for new event discarded event. When it does, reload the data.
this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => {
this.discardedObserver = CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, () => {
this.loaded = false;
this.refreshData(true, false, true);
}, this.currentSiteId);
// Listen for events edited. When an event is edited, reload the data.
this.editEventObserver = CoreEvents.on(
AddonCalendarProvider.EDIT_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
(data) => {
if (data && data.eventId) {
this.loaded = false;
@ -114,13 +124,13 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
);
// Refresh data if calendar events are synchronized automatically.
this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => {
this.syncObserver = CoreEvents.on(ADDON_CALENDAR_AUTO_SYNCED, () => {
this.loaded = false;
this.refreshData(false, false, true);
}, this.currentSiteId);
// Refresh data if calendar events are synchronized manually but not by this page.
this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => {
this.manualSyncObserver = CoreEvents.on(ADDON_CALENDAR_MANUAL_SYNCED, (data) => {
if (data && data.source != 'index') {
this.loaded = false;
this.refreshData(false, false, true);
@ -128,18 +138,18 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
}, this.currentSiteId);
// Update the events when an event is deleted.
this.deleteEventObserver = CoreEvents.on(AddonCalendarProvider.DELETED_EVENT_EVENT, () => {
this.deleteEventObserver = CoreEvents.on(ADDON_CALENDAR_DELETED_EVENT_EVENT, () => {
this.loaded = false;
this.refreshData(false, false, true);
}, this.currentSiteId);
// Update the "hasOffline" property if an event deleted in offline is restored.
this.undeleteEventObserver = CoreEvents.on(AddonCalendarProvider.UNDELETED_EVENT_EVENT, async () => {
this.undeleteEventObserver = CoreEvents.on(ADDON_CALENDAR_UNDELETED_EVENT_EVENT, async () => {
this.hasOffline = await AddonCalendarOffline.hasOfflineData();
}, this.currentSiteId);
this.filterChangedObserver = CoreEvents.on(
AddonCalendarProvider.FILTER_CHANGED_EVENT,
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
async (filterData) => {
this.filter = filterData;
@ -205,7 +215,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
result.source = 'index';
CoreEvents.trigger(
AddonCalendarSyncProvider.MANUAL_SYNCED,
ADDON_CALENDAR_MANUAL_SYNCED,
result,
this.currentSiteId,
);

View File

@ -18,6 +18,7 @@ import {
CoreReminders,
CoreRemindersService,
} from '@features/reminders/services/reminders';
import { REMINDERS_DISABLED } from '@features/reminders/constants';
/**
* Page that displays the calendar settings.
@ -67,7 +68,7 @@ export class AddonCalendarSettingsPage implements OnInit {
return;
}
await CoreReminders.setDefaultNotificationTime(reminderTime.timeBefore ?? CoreRemindersService.DISABLED);
await CoreReminders.setDefaultNotificationTime(reminderTime.timeBefore ?? REMINDERS_DISABLED);
this.updateDefaultTimeLabel();
}

View File

@ -20,36 +20,30 @@ import {
AddonCalendarEvent,
AddonCalendarEventBase,
AddonCalendarEventToDisplay,
AddonCalendarEventType,
AddonCalendarGetEventsEvent,
AddonCalendarProvider,
AddonCalendarWeek,
AddonCalendarWeekDay,
} from './calendar';
import { CoreConfig } from '@services/config';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { CoreCourse } from '@features/course/services/course';
import { ContextLevel, CoreConstants } from '@/core/constants';
import moment from 'moment-timezone';
import { makeSingleton } from '@singletons';
import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
import { CoreCategoryData } from '@features/courses/services/courses';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate';
import { ADDON_CALENDAR_COMPONENT } from '../constants';
/**
* Context levels enumeration.
*/
export enum AddonCalendarEventIcons {
SITE = 'fas-globe',
CATEGORY = 'fas-cubes',
COURSE = 'fas-graduation-cap',
GROUP = 'fas-users',
USER = 'fas-user',
}
import {
ADDON_CALENDAR_COMPONENT,
ADDON_CALENDAR_STARTING_WEEK_DAY,
AddonCalendarEventIcons,
AddonCalendarEventType,
} from '../constants';
import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
import { REMINDERS_DISABLED, REMINDERS_DEFAULT_REMINDER_TIMEBEFORE } from '@features/reminders/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Service that provides some features regarding lists of courses and categories.
@ -67,7 +61,7 @@ export class AddonCalendarHelperProvider {
*/
getEventIcon(eventType: AddonCalendarEventType | string): string {
if (this.eventTypeIcons.length == 0) {
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
const value = AddonCalendarEventType[name];
this.eventTypeIcons[value] = AddonCalendarEventIcons[name];
});
@ -322,7 +316,7 @@ export class AddonCalendarHelperProvider {
const defaultTime = await CoreReminders.getDefaultNotificationTime(siteId);
let defaultLabel: string | undefined;
if (defaultTime > CoreRemindersService.DISABLED) {
if (defaultTime > REMINDERS_DISABLED) {
const data = CoreRemindersService.convertSecondsToValueAndUnit(defaultTime);
defaultLabel = CoreReminders.getUnitValueLabel(data.value, data.unit, true);
}
@ -332,7 +326,7 @@ export class AddonCalendarHelperProvider {
id: reminder.id,
};
if (reminder.timebefore === CoreRemindersService.DEFAULT_REMINDER_TIMEBEFORE) {
if (reminder.timebefore === REMINDERS_DEFAULT_REMINDER_TIMEBEFORE) {
// Default time. Check if default notifications are disabled.
if (defaultLabel !== undefined) {
formatted.label = defaultLabel;
@ -418,7 +412,7 @@ export class AddonCalendarHelperProvider {
const site = await CoreSites.getSite(siteId);
// Get starting week day user preference, fallback to site configuration.
let startWeekDayStr = site.getStoredConfig('calendar_startwday') || '1';
startWeekDayStr = await CoreConfig.get(AddonCalendarProvider.STARTING_WEEK_DAY, startWeekDayStr);
startWeekDayStr = await CoreConfig.get(ADDON_CALENDAR_STARTING_WEEK_DAY, startWeekDayStr);
const startWeekDay = parseInt(startWeekDayStr, 10);
const today = moment();
@ -645,7 +639,7 @@ export class AddonCalendarHelperProvider {
const repeatedEvents =
await AddonCalendar.getLocalEventsByRepeatIdFromLocalDb(eventData.repeatid, site.id);
await CoreUtils.allPromises(repeatedEvents.map((event) =>
await CorePromiseUtils.allPromises(repeatedEvents.map((event) =>
AddonCalendar.invalidateEvent(event.id)));
return;
@ -666,7 +660,7 @@ export class AddonCalendarHelperProvider {
}));
try {
await CoreUtils.allPromisesIgnoringErrors(promises);
await CorePromiseUtils.allPromisesIgnoringErrors(promises);
} finally {
const treatedMonths = {};
const treatedDays = {};
@ -734,7 +728,7 @@ export class AddonCalendarHelperProvider {
}
});
await CoreUtils.allPromisesIgnoringErrors(finalPromises);
await CorePromiseUtils.allPromisesIgnoringErrors(finalPromises);
}
}
@ -784,7 +778,6 @@ export class AddonCalendarHelperProvider {
}
}
export const AddonCalendarHelper = makeSingleton(AddonCalendarHelperProvider);
/**

View File

@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { SQLiteDBRecordValues } from '@classes/sqlitedb';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CoreArray } from '@singletons/array';
import { makeSingleton } from '@singletons';
import { AddonCalendarSubmitCreateUpdateFormDataWSParams } from './calendar';
import {
@ -62,7 +62,7 @@ export class AddonCalendarOfflineProvider {
const result = await Promise.all(promises);
return CoreUtils.mergeArraysWithoutDuplicates(result[0], result[1]);
return CoreArray.mergeWithoutDuplicates(result[0], result[1]);
}
/**

View File

@ -17,7 +17,7 @@ import { CoreSyncBaseProvider, CoreSyncBlockedError } from '@classes/base-sync';
import { CoreNetwork } from '@services/network';
import { CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import {
AddonCalendar,
AddonCalendarEvent,
@ -29,7 +29,14 @@ import { makeSingleton, Translate } from '@singletons';
import { CoreSync, CoreSyncResult } from '@services/sync';
import { CoreNetworkError } from '@classes/errors/network-error';
import moment from 'moment-timezone';
import { ADDON_CALENDAR_COMPONENT } from '../constants';
import {
ADDON_CALENDAR_AUTO_SYNCED,
ADDON_CALENDAR_COMPONENT,
ADDON_CALENDAR_MANUAL_SYNCED,
ADDON_CALENDAR_SYNC_ID,
} from '../constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreWSError } from '@classes/errors/wserror';
/**
* Service to sync calendar.
@ -37,10 +44,6 @@ import { ADDON_CALENDAR_COMPONENT } from '../constants';
@Injectable({ providedIn: 'root' })
export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalendarSyncEvents> {
static readonly AUTO_SYNCED = 'addon_calendar_autom_synced';
static readonly MANUAL_SYNCED = 'addon_calendar_manual_synced';
static readonly SYNC_ID = 'calendar';
protected componentTranslatableString = 'addon.calendar.calendarevent';
constructor() {
@ -72,7 +75,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
if (result?.updated) {
// Sync successful, send event.
CoreEvents.trigger(AddonCalendarSyncProvider.AUTO_SYNCED, result, siteId);
CoreEvents.trigger(ADDON_CALENDAR_AUTO_SYNCED, result, siteId);
}
}
@ -85,7 +88,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
async syncEventsIfNeeded(siteId?: string): Promise<AddonCalendarSyncEvents | undefined> {
siteId = siteId || CoreSites.getCurrentSiteId();
const needed = await this.isSyncNeeded(AddonCalendarSyncProvider.SYNC_ID, siteId);
const needed = await this.isSyncNeeded(ADDON_CALENDAR_SYNC_ID, siteId);
if (needed) {
return this.syncEvents(siteId);
@ -101,7 +104,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
async syncEvents(siteId?: string): Promise<AddonCalendarSyncEvents> {
siteId = siteId || CoreSites.getCurrentSiteId();
const currentSyncPromise = this.getOngoingSync(AddonCalendarSyncProvider.SYNC_ID, siteId);
const currentSyncPromise = this.getOngoingSync(ADDON_CALENDAR_SYNC_ID, siteId);
if (currentSyncPromise) {
// There's already a sync ongoing for this site, return the promise.
return currentSyncPromise;
@ -112,7 +115,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
// Get offline events.
const syncPromise = this.performSyncEvents(siteId);
return this.addOngoingSync(AddonCalendarSyncProvider.SYNC_ID, syncPromise, siteId);
return this.addOngoingSync(ADDON_CALENDAR_SYNC_ID, syncPromise, siteId);
}
/**
@ -131,7 +134,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
updated: false,
};
const eventIds: number[] = await CoreUtils.ignoreErrors(AddonCalendarOffline.getAllEventsIds(siteId), []);
const eventIds: number[] = await CorePromiseUtils.ignoreErrors(AddonCalendarOffline.getAllEventsIds(siteId), []);
if (eventIds.length > 0) {
if (!CoreNetwork.isOnline()) {
@ -141,7 +144,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
const promises = eventIds.map((eventId) => this.syncOfflineEvent(eventId, result, siteId));
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
if (result.updated) {
@ -151,12 +154,12 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
AddonCalendarHelper.refreshAfterChangeEvents(result.toinvalidate, siteId),
];
await CoreUtils.ignoreErrors(Promise.all(promises));
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
}
}
// Sync finished, set sync time.
await CoreUtils.ignoreErrors(this.setSyncTime(AddonCalendarSyncProvider.SYNC_ID, siteId));
await CorePromiseUtils.ignoreErrors(this.setSyncTime(ADDON_CALENDAR_SYNC_ID, siteId));
// All done, return the result.
return result;
@ -217,7 +220,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
await Promise.all(promises);
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Local error, reject.
throw error;
}
@ -282,7 +285,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
return AddonCalendarOffline.deleteEvent(event.id, siteId);
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Local error, reject.
throw error;
}
@ -298,7 +301,6 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
}
}
export const AddonCalendarSync = makeSingleton(AddonCalendarSyncProvider);
export type AddonCalendarSyncEvents = CoreSyncResult & {
@ -316,3 +318,17 @@ export type AddonCalendarSyncInvalidateEvent = {
timestart: number;
repeated: number;
};
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 {
[ADDON_CALENDAR_MANUAL_SYNCED]: AddonCalendarSyncEvents;
[ADDON_CALENDAR_AUTO_SYNCED]: AddonCalendarSyncEvents;
}
}

View File

@ -19,7 +19,7 @@ import { CoreNetwork } from '@services/network';
import { CoreText } from '@singletons/text';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreUrl } from '@singletons/url';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { CoreGroups } from '@services/groups';
import { CoreLocalNotifications } from '@services/local-notifications';
import { CoreConfig } from '@services/config';
@ -27,41 +27,41 @@ import { AddonCalendarOffline } from './calendar-offline';
import { CoreUser } from '@features/user/services/user';
import { CoreWSExternalWarning, CoreWSDate } from '@services/ws';
import moment from 'moment-timezone';
import { AddonCalendarEventDBRecord, EVENTS_TABLE } from './database/calendar';
import { AddonCalendarEventDBRecord } from './database/calendar';
import { CoreCourses } from '@features/courses/services/courses';
import { ContextLevel, CoreConstants } from '@/core/constants';
import { ContextLevel, CoreCacheUpdateFrequency, CoreConstants } from '@/core/constants';
import { CoreWSError } from '@classes/errors/wserror';
import { ApplicationInit, makeSingleton, Translate } from '@singletons';
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
import { AddonCalendarMainMenuHandlerService } from './handlers/mainmenu';
import { SafeUrl } from '@angular/platform-browser';
import { CoreNavigator } from '@services/navigator';
import { AddonCalendarFilter } from './calendar-helper';
import { AddonCalendarSyncEvents, AddonCalendarSyncProvider } from './calendar-sync';
import { CorePath } from '@singletons/path';
import { CorePlatform } from '@services/platform';
import {
CoreReminderData,
CoreReminders,
CoreRemindersPushNotificationData,
CoreRemindersService,
} from '@features/reminders/services/reminders';
import { CoreEvents } from '@singletons/events';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { ADDON_CALENDAR_COMPONENT } from '../constants';
const ROOT_CACHE_KEY = 'mmaCalendar:';
/**
* Main calendar Event types enumeration.
*/
export enum AddonCalendarEventType {
SITE = 'site',
CATEGORY = 'category',
COURSE = 'course',
GROUP = 'group',
USER = 'user',
}
import {
ADDON_CALENDAR_COMPONENT,
ADDON_CALENDAR_DAYS_INTERVAL,
ADDON_CALENDAR_DELETED_EVENT_EVENT,
ADDON_CALENDAR_EDIT_EVENT_EVENT,
ADDON_CALENDAR_EVENTS_TABLE,
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
ADDON_CALENDAR_NEW_EVENT_EVENT,
ADDON_CALENDAR_PAGE_NAME,
ADDON_CALENDAR_STARTING_WEEK_DAY,
ADDON_CALENDAR_TF_12,
ADDON_CALENDAR_TF_24,
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
AddonCalendarEventType,
} from '../constants';
import { REMINDERS_DEFAULT_REMINDER_TIMEBEFORE } from '@features/reminders/constants';
import { AddonCalendarFilter } from './calendar-helper';
import { CorePromiseUtils } from '@singletons/promise-utils';
declare module '@singletons/events' {
@ -71,13 +71,11 @@ declare module '@singletons/events' {
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
*/
export interface CoreEventsData {
[AddonCalendarProvider.NEW_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
[AddonCalendarProvider.EDIT_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
[AddonCalendarProvider.DELETED_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
[AddonCalendarProvider.UNDELETED_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
[AddonCalendarProvider.FILTER_CHANGED_EVENT]: AddonCalendarFilter;
[AddonCalendarSyncProvider.MANUAL_SYNCED]: AddonCalendarSyncEvents;
[AddonCalendarSyncProvider.AUTO_SYNCED]: AddonCalendarSyncEvents;
[ADDON_CALENDAR_NEW_EVENT_EVENT]: AddonCalendarUpdatedEvent;
[ADDON_CALENDAR_EDIT_EVENT_EVENT]: AddonCalendarUpdatedEvent;
[ADDON_CALENDAR_DELETED_EVENT_EVENT]: AddonCalendarUpdatedEvent;
[ADDON_CALENDAR_UNDELETED_EVENT_EVENT]: AddonCalendarUpdatedEvent;
[ADDON_CALENDAR_FILTER_CHANGED_EVENT]: AddonCalendarFilter;
}
}
@ -88,20 +86,7 @@ declare module '@singletons/events' {
@Injectable({ providedIn: 'root' })
export class AddonCalendarProvider {
static readonly DAYS_INTERVAL = 30;
static readonly STARTING_WEEK_DAY = 'addon_calendar_starting_week_day';
static readonly NEW_EVENT_EVENT = 'addon_calendar_new_event';
static readonly NEW_EVENT_DISCARDED_EVENT = 'addon_calendar_new_event_discarded';
static readonly EDIT_EVENT_EVENT = 'addon_calendar_edit_event';
static readonly DELETED_EVENT_EVENT = 'addon_calendar_deleted_event';
static readonly UNDELETED_EVENT_EVENT = 'addon_calendar_undeleted_event';
static readonly FILTER_CHANGED_EVENT = 'addon_calendar_filter_changed_event';
static readonly CALENDAR_TF_24 = '%H:%M'; // Calendar time in 24 hours format.
static readonly CALENDAR_TF_12 = '%I:%M %p'; // Calendar time in 12 hours format.
protected weekDays: AddonCalendarWeekDaysTranslationKeys[] = [
protected static weekDays: AddonCalendarWeekDaysTranslationKeys[] = [
{
shortname: 'addon.calendar.sun',
fullname: 'addon.calendar.sunday',
@ -132,6 +117,8 @@ export class AddonCalendarProvider {
},
];
protected static readonly ROOT_CACHE_KEY = 'mmaCalendar:';
/**
* Check if a certain site allows creating and editing events.
*
@ -199,7 +186,7 @@ export class AddonCalendarProvider {
return true;
} catch (error) {
if (error && !CoreUtils.isWebServiceError(error)) {
if (error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {
@ -248,7 +235,7 @@ export class AddonCalendarProvider {
const promises: Promise<unknown>[] = [];
promises.push(site.getDb().deleteRecords(
EVENTS_TABLE,
ADDON_CALENDAR_EVENTS_TABLE,
{ id: eventId },
));
promises.push(CoreReminders.removeReminders({
@ -256,7 +243,7 @@ export class AddonCalendarProvider {
component: ADDON_CALENDAR_COMPONENT,
} , siteId));
await CoreUtils.ignoreErrors(Promise.all(promises));
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
}
/**
@ -297,7 +284,7 @@ export class AddonCalendarProvider {
}
CoreNavigator.navigateToSitePath(
AddonCalendarMainMenuHandlerService.PAGE_NAME,
ADDON_CALENDAR_PAGE_NAME,
{
siteId: notification.siteId,
preferCurrentTab: false,
@ -429,7 +416,7 @@ export class AddonCalendarProvider {
* @returns Cache key.
*/
protected getAccessInformationCacheKey(courseId?: number): string {
return ROOT_CACHE_KEY + 'accessInformation:' + (courseId || 0);
return AddonCalendarProvider.ROOT_CACHE_KEY + 'accessInformation:' + (courseId || 0);
}
/**
@ -441,7 +428,7 @@ export class AddonCalendarProvider {
async getAllEventsFromLocalDb(siteId?: string): Promise<AddonCalendarEventDBRecord[]> {
const site = await CoreSites.getSite(siteId);
return site.getDb().getAllRecords(EVENTS_TABLE);
return site.getDb().getAllRecords(ADDON_CALENDAR_EVENTS_TABLE);
}
/**
@ -482,7 +469,7 @@ export class AddonCalendarProvider {
* @returns Cache key.
*/
protected getAllowedEventTypesCacheKey(courseId?: number): string {
return ROOT_CACHE_KEY + 'allowedEventTypes:' + (courseId || 0);
return AddonCalendarProvider.ROOT_CACHE_KEY + 'allowedEventTypes:' + (courseId || 0);
}
/**
@ -527,9 +514,9 @@ export class AddonCalendarProvider {
format = site.getStoredConfig('calendar_site_timeformat');
}
if (format === AddonCalendarProvider.CALENDAR_TF_12) {
if (format === ADDON_CALENDAR_TF_12) {
format = Translate.instant('core.strftimetime12');
} else if (format === AddonCalendarProvider.CALENDAR_TF_24) {
} else if (format === ADDON_CALENDAR_TF_24) {
format = Translate.instant('core.strftimetime24');
}
@ -577,7 +564,7 @@ export class AddonCalendarProvider {
const site = await CoreSites.getSite(siteId);
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getEventCacheKey(id),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const params: AddonCalendarGetCalendarEventsWSParams = {
options: {
@ -613,7 +600,7 @@ export class AddonCalendarProvider {
const site = await CoreSites.getSite(siteId);
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getEventCacheKey(id),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const params: AddonCalendarGetCalendarEventByIdWSParams = {
eventid: id,
@ -641,7 +628,7 @@ export class AddonCalendarProvider {
* @returns Cache key.
*/
protected getEventCacheKey(id: number): string {
return ROOT_CACHE_KEY + 'events:' + id;
return AddonCalendarProvider.ROOT_CACHE_KEY + 'events:' + id;
}
/**
@ -654,7 +641,7 @@ export class AddonCalendarProvider {
async getEventFromLocalDb(id: number, siteId?: string): Promise<AddonCalendarGetEventsEvent | AddonCalendarEvent> {
const site = await CoreSites.getSite(siteId);
const record: AddonCalendarGetEventsEvent | AddonCalendarEvent | AddonCalendarEventDBRecord =
await site.getDb().getRecord(EVENTS_TABLE, { id: id });
await site.getDb().getRecord(ADDON_CALENDAR_EVENTS_TABLE, { id: id });
const eventConverted = record as AddonCalendarEvent;
const originalEvent = record as AddonCalendarGetEventsEvent;
@ -662,8 +649,8 @@ export class AddonCalendarProvider {
// Calculate data to match the new WS.
eventConverted.descriptionformat = originalEvent.format;
eventConverted.iscourseevent = originalEvent.eventtype == AddonCalendarEventType.COURSE;
eventConverted.iscategoryevent = originalEvent.eventtype == AddonCalendarEventType.CATEGORY;
eventConverted.iscourseevent = originalEvent.eventtype === AddonCalendarEventType.COURSE;
eventConverted.iscategoryevent = originalEvent.eventtype === AddonCalendarEventType.CATEGORY;
eventConverted.normalisedeventtype = this.getEventType(recordAsRecord);
try {
eventConverted.category = CoreText.parseJSON(recordAsRecord.category || '');
@ -699,7 +686,7 @@ export class AddonCalendarProvider {
siteId?: string,
): Promise<void> {
timebefore = timebefore ?? CoreRemindersService.DEFAULT_REMINDER_TIMEBEFORE;
timebefore = timebefore ?? REMINDERS_DEFAULT_REMINDER_TIMEBEFORE;
const previousReminders = await CoreReminders.getReminders({
instanceId: event.id,
@ -779,7 +766,7 @@ export class AddonCalendarProvider {
}
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getDayEventsCacheKey(year, month, day, courseId, categoryId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {
preSets.getFromCache = false;
@ -797,7 +784,7 @@ export class AddonCalendarProvider {
* @returns Prefix Cache key.
*/
protected getDayEventsPrefixCacheKey(): string {
return ROOT_CACHE_KEY + 'day:';
return AddonCalendarProvider.ROOT_CACHE_KEY + 'day:';
}
/**
@ -843,7 +830,7 @@ export class AddonCalendarProvider {
async getEventsList(
initialTime?: number,
daysToStart: number = 0,
daysInterval: number = AddonCalendarProvider.DAYS_INTERVAL,
daysInterval: number = ADDON_CALENDAR_DAYS_INTERVAL,
siteId?: string,
): Promise<AddonCalendarGetEventsEvent[]> {
@ -891,7 +878,7 @@ export class AddonCalendarProvider {
cacheKey: this.getEventsListCacheKey(daysToStart, daysInterval),
getCacheUsingCacheKey: true,
uniqueCacheKey: true,
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
const response =
await site.read<AddonCalendarGetCalendarEventsWSResponse>('core_calendar_get_calendar_events', params, preSets);
@ -907,7 +894,7 @@ export class AddonCalendarProvider {
* @returns Prefix Cache key.
*/
protected getEventsListPrefixCacheKey(): string {
return ROOT_CACHE_KEY + 'events:';
return AddonCalendarProvider.ROOT_CACHE_KEY + 'events:';
}
/**
@ -931,7 +918,7 @@ export class AddonCalendarProvider {
async getLocalEventsByRepeatIdFromLocalDb(repeatId: number, siteId?: string): Promise<AddonCalendarEventDBRecord[]> {
const site = await CoreSites.getSite(siteId);
return site.getDb().getRecords(EVENTS_TABLE, { repeatid: repeatId });
return site.getDb().getRecords(ADDON_CALENDAR_EVENTS_TABLE, { repeatid: repeatId });
}
/**
@ -969,7 +956,7 @@ export class AddonCalendarProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getMonthlyEventsCacheKey(year, month, courseId, categoryId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {
preSets.getFromCache = false;
@ -985,7 +972,7 @@ export class AddonCalendarProvider {
// Store starting week day preference, we need it in offline to show months that are not in cache.
if (CoreNetwork.isOnline()) {
CoreConfig.set(AddonCalendarProvider.STARTING_WEEK_DAY, response.daynames[0].dayno);
CoreConfig.set(ADDON_CALENDAR_STARTING_WEEK_DAY, response.daynames[0].dayno);
}
return response;
@ -997,7 +984,7 @@ export class AddonCalendarProvider {
* @returns Prefix Cache key.
*/
protected getMonthlyEventsPrefixCacheKey(): string {
return ROOT_CACHE_KEY + 'monthly:';
return AddonCalendarProvider.ROOT_CACHE_KEY + 'monthly:';
}
/**
@ -1054,7 +1041,7 @@ export class AddonCalendarProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getUpcomingEventsCacheKey(courseId, categoryId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {
@ -1074,7 +1061,7 @@ export class AddonCalendarProvider {
* @returns Prefix Cache key.
*/
protected getUpcomingEventsPrefixCacheKey(): string {
return ROOT_CACHE_KEY + 'upcoming:';
return AddonCalendarProvider.ROOT_CACHE_KEY + 'upcoming:';
}
/**
@ -1120,7 +1107,7 @@ export class AddonCalendarProvider {
getWeekDays(startingDay?: number): AddonCalendarWeekDaysTranslationKeys[] {
startingDay = startingDay || 0;
return this.weekDays.slice(startingDay).concat(this.weekDays.slice(0, startingDay));
return AddonCalendarProvider.weekDays.slice(startingDay).concat(AddonCalendarProvider.weekDays.slice(0, startingDay));
}
/**
@ -1440,7 +1427,7 @@ export class AddonCalendarProvider {
await this.addDefaultEventReminder(eventRecord, site.getId());
}
await site.getDb().insertRecord(EVENTS_TABLE, eventRecord);
await site.getDb().insertRecord(ADDON_CALENDAR_EVENTS_TABLE, eventRecord);
}
/**
@ -1451,7 +1438,7 @@ export class AddonCalendarProvider {
*/
protected async addDefaultEventReminder(event: AddonCalendarEventDBRecord, siteId?: string): Promise<void> {
// Add default reminder if the event isn't stored already and doesn't have any reminder.
const eventExist = await CoreUtils.promiseWorks(this.getEventFromLocalDb(event.id, siteId));
const eventExist = await CorePromiseUtils.promiseWorks(this.getEventFromLocalDb(event.id, siteId));
if (eventExist) {
return;
}
@ -1522,7 +1509,7 @@ export class AddonCalendarProvider {
// Now save the reminders if any.
if (options.reminders?.length) {
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
Promise.all(options.reminders.map((reminder) =>
this.addEventReminder(event, reminder.time, siteId))),
);
@ -1545,7 +1532,7 @@ export class AddonCalendarProvider {
// Now save the reminders if any.
if (options.reminders?.length) {
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
Promise.all(options.reminders.map((reminder) =>
this.addEventReminder(event, reminder.time, siteId))),
);
@ -1553,7 +1540,7 @@ export class AddonCalendarProvider {
return ({ sent: true, event });
} catch (error) {
if (error && !CoreUtils.isWebServiceError(error)) {
if (error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {
@ -1591,7 +1578,7 @@ export class AddonCalendarProvider {
}
const params: AddonCalendarSubmitCreateUpdateFormWSParams = {
formdata: CoreUtils.objectToGetParams(formData),
formdata: CoreObject.toGetParams(formData),
};
const result =
await site.write<AddonCalendarSubmitCreateUpdateFormWSResponse>('core_calendar_submit_create_update_form', params);
@ -1606,7 +1593,7 @@ export class AddonCalendarProvider {
if (eventId < 0) {
// Offline event has been sent. Change reminders instanceId if any.
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
CoreReminders.updateReminders(
{ instanceId: result.event.id },
{
@ -1620,7 +1607,7 @@ export class AddonCalendarProvider {
if (formData.id === 0) {
// Store the new event in local DB.
await CoreUtils.ignoreErrors(this.storeEventInLocalDb(result.event, { addDefaultReminder: false, siteId }));
await CorePromiseUtils.ignoreErrors(this.storeEventInLocalDb(result.event, { addDefaultReminder: false, siteId }));
}
return result.event;
@ -2081,9 +2068,9 @@ export type AddonCalendarEventToDisplay = Partial<AddonCalendarCalendarEvent> &
/**
* Event triggered when an event is modified with event types:
* NEW_EVENT_EVENT, EDIT_EVENT_EVENT, DELETED_EVENT_EVENT, UNDELETED_EVENT_EVENT.
* NEW_EVENT, EDIT_EVENT, DELETED_EVENT, UNDELETED_EVENT.
*/
export type AddonCalendarUpdatedEventEvent = {
export type AddonCalendarUpdatedEvent = {
eventId: number;
oldEventId?: number; // Old event ID. Used when an offline event is sent.
sent?: boolean;

View File

@ -13,7 +13,8 @@
// limitations under the License.
import { CoreSiteSchema } from '@services/sites';
import { AddonCalendarEventType } from '../calendar';
import { AddonCalendarEventType } from '@addons/calendar/constants';
/**
* Database variables for AddonDatabaseOffline service.
*/

View File

@ -12,24 +12,24 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { ADDON_CALENDAR_EVENTS_TABLE, AddonCalendarEventType } from '@addons/calendar/constants';
import { SQLiteDB } from '@classes/sqlitedb';
import { CoreRemindersService, CoreReminders } from '@features/reminders/services/reminders';
import { REMINDERS_DISABLED } from '@features/reminders/constants';
import { CoreReminders } from '@features/reminders/services/reminders';
import { CoreConfig } from '@services/config';
import { CoreSiteSchema } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { AddonCalendarEventType } from '../calendar';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Database variables for AddonCalendarProvider service.
*/
export const EVENTS_TABLE = 'addon_calendar_events_3';
export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
name: 'AddonCalendarProvider',
version: 5,
canBeCleared: [EVENTS_TABLE],
canBeCleared: [ADDON_CALENDAR_EVENTS_TABLE],
tables: [
{
name: EVENTS_TABLE,
name: ADDON_CALENDAR_EVENTS_TABLE,
columns: [
{
name: 'id',
@ -199,10 +199,10 @@ const migrateDefaultTime = async (siteId: string, convertToSeconds = false): Pro
const key = 'mmaCalendarDefaultNotifTime#' + siteId;
try {
let defaultTime = await CoreConfig.get<number>(key);
await CoreUtils.ignoreErrors(CoreConfig.delete(key));
await CorePromiseUtils.ignoreErrors(CoreConfig.delete(key));
if (defaultTime <= 0) {
defaultTime = CoreRemindersService.DISABLED;
defaultTime = REMINDERS_DISABLED;
} else if (convertToSeconds) {
// Convert from minutes to seconds.
defaultTime = defaultTime * 60;

View File

@ -16,6 +16,7 @@ import { Injectable } from '@angular/core';
import { AddonCalendar } from '../calendar';
import { makeSingleton } from '@singletons';
import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu-delegate';
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
/**
* Handler to inject an option into main menu.
@ -23,8 +24,6 @@ import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu
@Injectable({ providedIn: 'root' })
export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler {
static readonly PAGE_NAME = 'calendar';
name = 'AddonCalendar';
priority = 550;
@ -46,7 +45,7 @@ export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler
return {
icon: 'far-calendar',
title: 'addon.calendar.calendar',
page: AddonCalendarMainMenuHandlerService.PAGE_NAME,
page: ADDON_CALENDAR_PAGE_NAME,
class: 'addon-calendar-handler',
};
}

View File

@ -14,7 +14,7 @@
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
import { CoreUserProfile } from '@features/user/services/user';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import {
AddonCompetency,
AddonCompetencyDataForCourseCompetenciesPageCompetency,
@ -70,7 +70,7 @@ export class AddonCompetencyCourseCompetenciesSource
* Invalidate course cache.
*/
async invalidateCache(): Promise<void> {
await CoreUtils.ignoreErrors(AddonCompetency.invalidateCourseCompetencies(this.COURSE_ID, this.USER_ID));
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateCourseCompetencies(this.COURSE_ID, this.USER_ID));
}
/**

View File

@ -14,7 +14,7 @@
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
import { CoreUserProfile } from '@features/user/services/user';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import {
AddonCompetency,
AddonCompetencyDataForPlanPageCompetency,
@ -60,7 +60,7 @@ export class AddonCompetencyPlanCompetenciesSource extends CoreRoutedItemsManage
* Invalidate plan cache.
*/
async invalidateCache(): Promise<void> {
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(this.PLAN_ID));
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(this.PLAN_ID));
}
/**

View File

@ -31,4 +31,4 @@ const routes: Routes = [
AddonCompetencyCourseCompetenciesPageModule,
],
})
export class AddonCompetencyCourseContentsLazyModule {}
export default class AddonCompetencyCourseContentsLazyModule {}

View File

@ -69,4 +69,4 @@ const routes: Routes = [
AddonCompetencyCompetencySummaryPageModule,
],
})
export class AddonCompetencyCourseDetailsLazyModule {}
export default class AddonCompetencyCourseDetailsLazyModule {}

View File

@ -89,4 +89,4 @@ const routes: Routes = [
AddonCompetencyPlanListPage,
],
})
export class AddonCompetencyLearningPlansLazyModule {}
export default class AddonCompetencyLearningPlansLazyModule {}

View File

@ -28,7 +28,7 @@ import { Routes } from '@angular/router';
import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
import { CoreCourseIndexRoutingModule } from '@features/course/course-routing.module';
import { PARTICIPANTS_PAGE_NAME } from '@features/user/constants';
import { COURSE_PAGE_NAME } from '@features/course/constants';
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
import { ADDON_COMPETENCY_LEARNING_PLANS_PAGE, ADDON_COMPETENCY_COMPETENCIES_PAGE } from './constants';
/**
@ -49,22 +49,22 @@ export async function getCompetencyServices(): Promise<Type<unknown>[]> {
const mainMenuChildrenRoutes: Routes = [
{
path: ADDON_COMPETENCY_LEARNING_PLANS_PAGE,
loadChildren: () => import('./competency-learning-plans-lazy.module').then(m => m.AddonCompetencyLearningPlansLazyModule),
loadChildren: () => import('./competency-learning-plans-lazy.module'),
},
{
path: `${COURSE_PAGE_NAME}/:courseId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule),
path: `${CORE_COURSE_PAGE_NAME}/:courseId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
loadChildren: () => import('./competency-course-details-lazy.module'),
},
{
path: `${COURSE_PAGE_NAME}/:courseId/${PARTICIPANTS_PAGE_NAME}/:userId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule),
path: `${CORE_COURSE_PAGE_NAME}/:courseId/${PARTICIPANTS_PAGE_NAME}/:userId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
loadChildren: () => import('./competency-course-details-lazy.module'),
},
];
const courseIndexRoutes: Routes = [
{
path: ADDON_COMPETENCY_COMPETENCIES_PAGE,
loadChildren: () => import('./competency-course-contents-lazy.module').then(m => m.AddonCompetencyCourseContentsLazyModule),
loadChildren: () => import('./competency-course-contents-lazy.module'),
},
];

View File

@ -31,7 +31,7 @@ import {
} from '@addons/competency/services/competency';
import { CoreNavigator } from '@services/navigator';
import { ContextLevel } from '@/core/constants';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/constants';
import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager';
import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker';
@ -175,7 +175,7 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
async refreshCompetency(refresher: HTMLIonRefresherElement): Promise<void> {
const source = this.competencies.getSource();
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
source instanceof AddonCompetencyPlanCompetenciesSource
? AddonCompetency.invalidateCompetencyInPlan(source.PLAN_ID, this.requireCompetencyId())
: AddonCompetency.invalidateCompetencyInCourse(source.COURSE_ID, this.requireCompetencyId(), source.USER_ID),
@ -287,7 +287,7 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
return;
}
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
AddonCompetency.logCompetencyInPlanView(source.PLAN_ID, compId, this.planStatus, name, userId),
);
@ -316,7 +316,9 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
return;
}
await CoreUtils.ignoreErrors(AddonCompetency.logCompetencyInCourseView(source.COURSE_ID, compId, name, source.USER_ID));
await CorePromiseUtils.ignoreErrors(
AddonCompetency.logCompetencyInCourseView(source.COURSE_ID, compId, name, source.USER_ID),
);
CoreAnalytics.logEvent({
type: CoreAnalyticsEventType.VIEW_ITEM,

View File

@ -17,7 +17,7 @@ import { ContextLevel } from '@/core/constants';
import { AddonCompetencySummary, AddonCompetency } from '@addons/competency/services/competency';
import { CoreNavigator } from '@services/navigator';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/constants';
import { CoreTime } from '@singletons/time';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
@ -45,7 +45,7 @@ export class AddonCompetencyCompetencySummaryPage implements OnInit {
return;
}
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
AddonCompetency.logCompetencyView(this.competencyId, this.competency.competency.shortname),
);

View File

@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { CoreCacheUpdateFrequency } from '@/core/constants';
import { Injectable } from '@angular/core';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreSite } from '@classes/sites/site';
@ -19,7 +20,7 @@ import { CoreCommentsArea } from '@features/comments/services/comments';
import { CoreCourseSummary } from '@features/course/services/course';
import { CoreUserSummary } from '@features/user/services/user';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { makeSingleton } from '@singletons';
const ROOT_CACHE_KEY = 'mmaCompetency:';
@ -188,7 +189,7 @@ export class AddonCompetencyProvider {
return false;
}
return CoreUtils.promiseWorks(this.getCourseCompetencies(courseId, undefined, siteId));
return CorePromiseUtils.promiseWorks(this.getCourseCompetencies(courseId, undefined, siteId));
}
/**
@ -208,7 +209,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getLearningPlansCacheKey(userId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const response = await site.read<AddonCompetencyDataForPlansPageWSResponse>('tool_lp_data_for_plans_page', params, preSets);
@ -232,7 +233,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getLearningPlanCacheKey(planId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
return site.read('tool_lp_data_for_plan_page', params, preSets);
@ -260,7 +261,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCompetencyInPlanCacheKey(planId, competencyId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
return site.read(
@ -298,7 +299,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCompetencyInCourseCacheKey(courseId, competencyId, userId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {
@ -334,7 +335,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCompetencySummaryCacheKey(competencyId, userId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {
@ -400,7 +401,7 @@ export class AddonCompetencyProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCourseCompetenciesCacheKey(courseId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
if (ignoreCache) {

View File

@ -16,7 +16,7 @@ import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAG
import { Injectable } from '@angular/core';
import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler';
import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate';
import { COURSE_PAGE_NAME } from '@features/course/constants';
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
import { CoreNavigator } from '@services/navigator';
import { makeSingleton } from '@singletons';
import { AddonCompetency } from '../competency';
@ -41,7 +41,7 @@ export class AddonCompetencyCompetencyLinkHandlerService extends CoreContentLink
action: async (siteId: string): Promise<void> => {
if (courseId) {
await CoreNavigator.navigateToSitePath(
`${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
`${CORE_COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
{
params: { userId: params.userid },
siteId,

View File

@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
import { CoreCourseAccessDataType } from '@features/course/services/course';
import { CoreCourseAccessDataType } from '@features/course/constants';
import {
CoreCourseAccess,
CoreCourseOptionsHandler,

View File

@ -14,14 +14,15 @@
import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/constants';
import { Injectable } from '@angular/core';
import { COURSE_PAGE_NAME } from '@features/course/constants';
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { CoreNavigator } from '@services/navigator';
import { CoreUrl } from '@singletons/url';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { makeSingleton } from '@singletons';
import { AddonCompetency } from '../competency';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Handler for competencies push notifications clicks.
@ -55,7 +56,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
// Open the learning plan.
const planId = Number(contextUrlParams.id);
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(planId, notification.site));
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(planId, notification.site));
await CoreNavigator.navigateToSitePath(`${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/${planId}`, {
siteId: notification.site,
@ -71,11 +72,13 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
const planId = Number(contextUrlParams.planid);
const userId = Number(contextUrlParams.userid);
await CoreUtils.ignoreErrors(AddonCompetency.invalidateCompetencyInPlan(planId, competencyId, notification.site));
await CorePromiseUtils.ignoreErrors(
AddonCompetency.invalidateCompetencyInPlan(planId, competencyId, notification.site),
);
if (courseId) {
await CoreNavigator.navigateToSitePath(
`${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${competencyId}`,
`${CORE_COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${competencyId}`,
{
params: { userId },
siteId: notification.site,
@ -101,7 +104,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
// Open the list of plans.
const userId = Number(contextUrlParams.userid);
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlans(userId, notification.site));
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlans(userId, notification.site));
await CoreNavigator.navigateToSitePath(ADDON_COMPETENCY_LEARNING_PLANS_PAGE, {
params: { userId },

View File

@ -14,7 +14,7 @@
import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/constants';
import { Injectable } from '@angular/core';
import { COURSE_PAGE_NAME } from '@features/course/constants';
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
import { CoreUserProfile } from '@features/user/services/user';
import {
CoreUserProfileHandler,
@ -112,9 +112,13 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler
action: (event, user, context, contextId): void => {
event.preventDefault();
event.stopPropagation();
CoreNavigator.navigateToSitePath(
[COURSE_PAGE_NAME, contextId, PARTICIPANTS_PAGE_NAME, user.id, ADDON_COMPETENCY_COMPETENCIES_PAGE].join('/'),
);
CoreNavigator.navigateToSitePath([
CORE_COURSE_PAGE_NAME,
contextId,
PARTICIPANTS_PAGE_NAME,
user.id,
ADDON_COMPETENCY_COMPETENCIES_PAGE,
].join('/'));
},
};
}

View File

@ -37,4 +37,4 @@ const routes: Routes = [
AddonCourseCompletionReportPage,
],
})
export class AddonCourseCompletionLazyModule {}
export default class AddonCourseCompletionLazyModule {}

View File

@ -39,7 +39,7 @@ export async function getCourseCompletionServices(): Promise<Type<unknown>[]> {
const routes: Routes = [
{
path: 'coursecompletion',
loadChildren: () => import('./coursecompletion-lazy.module').then(m => m.AddonCourseCompletionLazyModule),
loadChildren: () => import('./coursecompletion-lazy.module'),
},
];

View File

@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { CoreLogger } from '@singletons/logger';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { CoreCourseAnyCourseData, CoreCourses } from '@features/courses/services/courses';
import { CoreSite } from '@classes/sites/site';
import { CoreStatusWithWarningsWSResponse, CoreWSExternalWarning } from '@services/ws';
@ -25,6 +25,7 @@ import { asyncObservable } from '@/core/utils/rxjs';
import { map } from 'rxjs/operators';
import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site';
import { firstValueFrom } from 'rxjs';
import { CoreCacheUpdateFrequency } from '@/core/constants';
const ROOT_CACHE_KEY = 'mmaCourseCompletion:';
@ -173,7 +174,7 @@ export class AddonCourseCompletionProvider {
const preSets = {
...(options.preSets ?? {}),
cacheKey: this.getCompletionCacheKey(courseId, userId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
cacheErrors: ['notenroled'],
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
};
@ -283,7 +284,7 @@ export class AddonCourseCompletionProvider {
return true;
} catch (error) {
if (CoreUtils.isWebServiceError(error)) {
if (CoreWSError.isWebServiceError(error)) {
// The WS returned an error, plugin is not enabled.
return false;
}

View File

@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
import { CoreCourseAccessDataType } from '@features/course/services/course';
import { CoreCourseAccessDataType } from '@features/course/constants';
import {
CoreCourseAccess,
CoreCourseOptionsHandler,

View File

@ -12,9 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { CoreCacheUpdateFrequency } from '@/core/constants';
import { Injectable } from '@angular/core';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreSite } from '@classes/sites/site';
import { CoreEnrolEnrolmentInfo } from '@features/enrol/services/enrol';
import { CoreSites } from '@services/sites';
import { CoreWSExternalWarning } from '@services/ws';
@ -44,7 +44,7 @@ export class AddonEnrolGuestService {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getGuestEnrolmentInfoCacheKey(instanceId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
const response =
@ -68,15 +68,11 @@ export class AddonEnrolGuestService {
*
* @param instanceId Guest instance ID.
* @param siteId Site Id. If not defined, use current site.
* @returns Promise resolved when the data is invalidated.
*/
async invalidateGuestEnrolmentInfo(instanceId: number, siteId?: string): Promise<void> {
const site = await CoreSites.getSite(siteId);
await Promise.all([
site.invalidateWsCacheForKey(this.getGuestEnrolmentInfoCacheKey(instanceId)),
site.invalidateWsCacheForKey(`mmCourses:guestinfo:${instanceId}`), // @todo Remove after 4.3 release.
]);
await site.invalidateWsCacheForKey(this.getGuestEnrolmentInfoCacheKey(instanceId));
}
/**

View File

@ -17,11 +17,11 @@ import { CoreEnrolAction, CoreEnrolSelfHandler, CoreEnrolInfoIcon } from '@featu
import { Translate, makeSingleton } from '@singletons';
import { AddonEnrolSelf } from './self';
import { CorePasswordModalResponse } from '@components/password-modal/password-modal';
import { CoreCoursesProvider } from '@features/courses/services/courses';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreEnrol, CoreEnrolEnrolmentMethod } from '@features/enrol/services/enrol';
import { CoreModals } from '@services/modals';
import { CoreLoadings } from '@services/loadings';
import { CORE_COURSES_ENROL_INVALID_KEY } from '@features/courses/constants';
/**
* Enrol handler.
@ -122,7 +122,7 @@ export class AddonEnrolSelfHandlerService implements CoreEnrolSelfHandler {
try {
response.validated = await AddonEnrolSelf.selfEnrol(method.courseid, password, method.id);
} catch (error) {
if (error && error.errorcode === CoreCoursesProvider.ENROL_INVALID_KEY) {
if (error && error.errorcode === CORE_COURSES_ENROL_INVALID_KEY) {
response.validated = false;
response.error = error.message;
} else {

View File

@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { CoreCacheUpdateFrequency } from '@/core/constants';
import { Injectable } from '@angular/core';
import { CoreWSError } from '@classes/errors/wserror';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreSite } from '@classes/sites/site';
import { CoreCoursesProvider } from '@features/courses/services/courses';
import { CORE_COURSES_ENROL_INVALID_KEY } from '@features/courses/constants';
import { CoreSites } from '@services/sites';
import { CoreStatusWithWarningsWSResponse } from '@services/ws';
import { makeSingleton } from '@singletons';
@ -45,7 +45,7 @@ export class AddonEnrolSelfService {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getSelfEnrolmentInfoCacheKey(instanceId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
return await site.read<AddonEnrolSelfGetInstanceInfoWSResponse>('enrol_self_get_instance_info', params, preSets);
@ -82,7 +82,7 @@ export class AddonEnrolSelfService {
* @param instanceId Enrol instance ID.
* @param siteId Site ID. If not defined, use current site.
* @returns Promise resolved if the user is enrolled. If the password is invalid, the promise is rejected
* with an object with errorcode = CoreCoursesProvider.ENROL_INVALID_KEY.
* with an object with errorcode = CORE_COURSES_ENROL_INVALID_KEY.
*/
async selfEnrol(courseId: number, password: string = '', instanceId?: number, siteId?: string): Promise<boolean> {
@ -112,7 +112,7 @@ export class AddonEnrolSelfService {
warning.warningcode == '2' || warning.warningcode == '3' || warning.warningcode == '4');
if (warning) {
throw new CoreWSError({ errorcode: CoreCoursesProvider.ENROL_INVALID_KEY, message: warning.message });
throw new CoreWSError({ errorcode: CORE_COURSES_ENROL_INVALID_KEY, message: warning.message });
} else {
throw new CoreWSError(response.warnings[0]);
}

View File

@ -19,7 +19,7 @@ import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/
import { CoreLang } from '@services/lang';
import { CoreSites } from '@services/sites';
import { CoreText } from '@singletons/text';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreEvents } from '@singletons/events';
import { CoreSite } from '@classes/sites/site';
import { makeSingleton } from '@singletons';
@ -180,7 +180,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan
// Make sure the element is in DOM, otherwise some equations don't work.
// Automatically timeout the promise after a certain time, we don't want to wait forever.
await CoreUtils.ignoreErrors(CoreUtils.timeoutPromise(CoreDom.waitToBeInDOM(container), 15000));
await CorePromiseUtils.ignoreErrors(CorePromiseUtils.timeoutPromise(CoreDom.waitToBeInDOM(container), 15000));
await this.window.M!.filter_mathjaxloader!.typeset(container);
}
@ -336,7 +336,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan
}
await CoreWait.wait(250);
await CoreUtils.ignoreErrors(this.waitForReady(retries + 1));
await CorePromiseUtils.ignoreErrors(this.waitForReady(retries + 1));
}
/**

View File

@ -17,7 +17,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
import { CoreDomUtils } from '@services/utils/dom';
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
import { AddonMessageOutputAirnotifier, AddonMessageOutputAirnotifierDevice } from '../../services/airnotifier';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Page that displays the list of devices.
@ -112,7 +112,7 @@ export class AddonMessageOutputAirnotifierDevicesPage implements OnInit, OnDestr
* Fetch devices. The purpose is to store the updated data, it won't be reflected in the view.
*/
protected async updateDevices(): Promise<void> {
await CoreUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
await CorePromiseUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
await AddonMessageOutputAirnotifier.getUserDevices();
}
@ -124,7 +124,7 @@ export class AddonMessageOutputAirnotifierDevicesPage implements OnInit, OnDestr
*/
async refreshDevices(refresher: HTMLIonRefresherElement): Promise<void> {
try {
await CoreUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
await CorePromiseUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
await this.fetchDevices();
} finally {

View File

@ -16,14 +16,13 @@ import { Injectable } from '@angular/core';
import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites';
import { CoreWSExternalWarning } from '@services/ws';
import { CoreConstants } from '@/core/constants';
import { CoreSite } from '@classes/sites/site';
import { CoreCacheUpdateFrequency, CoreConstants } from '@/core/constants';
import { CoreError } from '@classes/errors/error';
import { CoreWSError } from '@classes/errors/wserror';
import { makeSingleton, Translate } from '@singletons';
import { CoreEvents, CoreEventSiteData } from '@singletons/events';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CoreOpener } from '@singletons/opener';
import { CorePath } from '@singletons/path';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
@ -102,7 +101,7 @@ export class AddonMessageOutputAirnotifierProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getSystemConfiguredCacheKey(),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets.
};
@ -136,7 +135,7 @@ export class AddonMessageOutputAirnotifierProvider {
};
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getUserDevicesCacheKey(),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
};
if (ignoreCache) {
@ -223,7 +222,7 @@ export class AddonMessageOutputAirnotifierProvider {
);
// Don't try auto-login, admins cannot use it.
CoreUtils.openInBrowser(url, {
CoreOpener.openInBrowser(url, {
showBrowserWarning: false,
});
},

View File

@ -0,0 +1,52 @@
// (C) Copyright 2015 Moodle Pty Ltd.
//
// 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.
export const ADDON_MESSAGES_NEW_MESSAGE_EVENT = 'addon_messages_new_message_event';
export const ADDON_MESSAGES_READ_CHANGED_EVENT = 'addon_messages_read_changed_event';
// Notify a conversation should be opened.
export const ADDON_MESSAGES_OPEN_CONVERSATION_EVENT = 'addon_messages_open_conversation_event';
export const ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT = 'addon_messages_update_conversation_list_event';
export const ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT = 'addon_messages_member_changed_event';
export const ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT = 'addon_messages_unread_conversation_counts_event';
export const ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT = 'addon_messages_contact_requests_count_event';
export const ADDON_MESSAGES_POLL_INTERVAL = 10000;
export const ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT = 'AddonMessagesPushSimulation';
export const enum AddonMessagesMessagePrivacy {
COURSEMEMBER = 0, // Privacy setting for being messaged by anyone within courses user is member.
ONLYCONTACTS = 1, // Privacy setting for being messaged only by contacts.
SITE = 2, // Privacy setting for being messaged by anyone on the site.
}
export const enum AddonMessagesMessageConversationType {
INDIVIDUAL = 1, // An individual conversation.
GROUP = 2, // A group conversation.
SELF = 3, // A self conversation.
}
export const ADDON_MESSAGES_LIMIT_CONTACTS = 50;
export const ADDON_MESSAGES_LIMIT_MESSAGES = 50;
export const ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH = 3;
export const ADDON_MESSAGES_LIMIT_SEARCH = 50;
export const ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY = 'message_provider_moodle_instantmessage';
export const ADDON_MESSAGES_AUTO_SYNCED = 'addon_messages_autom_synced';
export const enum AddonMessagesUpdateConversationAction {
MUTE = 'mute',
FAVOURITE = 'favourite',
DELETE = 'delete',
}

View File

@ -117,7 +117,7 @@ function buildRoutes(injector: Injector): Routes {
...discussionRoutes,
{
path: 'message-settings',
loadChildren: () => import('./messages-settings-lazy.module').then(m => m.AddonMessagesSettingsLazyModule),
loadChildren: () => import('./messages-settings-lazy.module'),
},
...buildTabMainRoutes(injector, {
canActivate: [messagesIndexGuard],
@ -148,4 +148,4 @@ function buildRoutes(injector: Injector): Routes {
},
],
})
export class AddonMessagesLazyModule {}
export default class AddonMessagesLazyModule {}

View File

@ -34,4 +34,4 @@ const routes: Routes = [
AddonMessagesSettingsPage,
],
})
export class AddonMessagesSettingsLazyModule {}
export default class AddonMessagesSettingsLazyModule {}

View File

@ -58,13 +58,13 @@ export async function getMessagesServices(): Promise<Type<unknown>[]> {
const mainMenuChildrenRoutes: Routes = [
{
path: AddonMessagesMainMenuHandlerService.PAGE_NAME,
loadChildren: () => import('./messages-lazy.module').then(m => m.AddonMessagesLazyModule),
loadChildren: () => import('./messages-lazy.module'),
},
];
const preferencesRoutes: Routes = [
{
path: AddonMessagesSettingsHandlerService.PAGE_NAME,
loadChildren: () => import('./messages-settings-lazy.module').then(m => m.AddonMessagesSettingsLazyModule),
loadChildren: () => import('./messages-settings-lazy.module'),
},
];

View File

@ -15,7 +15,6 @@
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { CoreSites } from '@services/sites';
import {
AddonMessagesProvider,
AddonMessagesGetContactsWSResponse,
AddonMessagesSearchContactsContact,
AddonMessagesGetContactsContact,
@ -29,6 +28,7 @@ import { CoreScreen } from '@services/screen';
import { CoreNavigator } from '@services/navigator';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreKeyboard } from '@singletons/keyboard';
import { ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT } from '@addons/messages/constants';
/**
* Page that displays the list of contacts.
@ -36,7 +36,7 @@ import { CoreKeyboard } from '@singletons/keyboard';
@Component({
selector: 'addon-messages-contacts',
templateUrl: 'contacts.html',
styleUrls: ['../../messages-common.scss'],
styleUrl: '../../messages-common.scss',
})
export class AddonMessagesContacts35Page implements OnInit, OnDestroy {
@ -73,7 +73,7 @@ export class AddonMessagesContacts35Page implements OnInit, OnDestroy {
// Refresh the list when a contact request is confirmed.
this.memberInfoObserver = CoreEvents.on(
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
(data) => {
if (data.contactRequestConfirmed) {
this.refreshData();

View File

@ -18,12 +18,12 @@ import { CoreSites } from '@services/sites';
import {
AddonMessages,
AddonMessagesConversationMember,
AddonMessagesProvider,
} from '../../services/messages';
import { CoreNavigator } from '@services/navigator';
import { CoreScreen } from '@services/screen';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT } from '@addons/messages/constants';
/**
* Page that displays contacts and contact requests.
@ -31,9 +31,7 @@ import { CoreSplitViewComponent } from '@components/split-view/split-view';
@Component({
selector: 'page-addon-messages-contacts',
templateUrl: 'contacts.html',
styleUrls: [
'../../messages-common.scss',
],
styleUrl: '../../messages-common.scss',
})
export class AddonMessagesContactsPage implements OnInit, OnDestroy {
@ -65,7 +63,7 @@ export class AddonMessagesContactsPage implements OnInit, OnDestroy {
// Update the contact requests badge.
this.contactRequestsCountObserver = CoreEvents.on(
AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT,
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
(data) => {
this.requestsBadge = data.count > 0 ? String(data.count) : '';
},
@ -74,7 +72,7 @@ export class AddonMessagesContactsPage implements OnInit, OnDestroy {
// Update block status of a user.
this.memberInfoObserver = CoreEvents.on(
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
(data) => {
if (data.userBlocked || data.userUnblocked) {
const user = this.confirmedContacts.find((user) => user.id == data.userId);

View File

@ -18,20 +18,18 @@ import { AlertOptions } from '@ionic/core';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import {
AddonMessagesProvider,
AddonMessagesConversationFormatted,
AddonMessagesConversationMember,
AddonMessagesGetMessagesMessage,
AddonMessages,
AddonMessagesConversationMessageFormatted,
AddonMessagesSendMessageResults,
AddonMessagesUpdateConversationAction,
} from '../../services/messages';
import { AddonMessagesOffline, AddonMessagesOfflineMessagesDBRecordFormatted } from '../../services/messages-offline';
import { AddonMessagesSync, AddonMessagesSyncProvider } from '../../services/messages-sync';
import { AddonMessagesSync } from '../../services/messages-sync';
import { CoreUser } from '@features/user/services/user';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreLogger } from '@singletons/logger';
import { CoreInfiniteLoadingComponent } from '@components/infinite-loading/infinite-loading';
import { Md5 } from 'ts-md5/dist/md5';
@ -48,6 +46,18 @@ import { CoreText } from '@singletons/text';
import { CoreWait } from '@singletons/wait';
import { CoreModals } from '@services/modals';
import { CoreLoadings } from '@services/loadings';
import {
ADDON_MESSAGES_AUTO_SYNCED,
ADDON_MESSAGES_LIMIT_MESSAGES,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
ADDON_MESSAGES_POLL_INTERVAL,
ADDON_MESSAGES_READ_CHANGED_EVENT,
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
AddonMessagesMessageConversationType,
AddonMessagesUpdateConversationAction,
} from '@addons/messages/constants';
/**
* Page that displays a message discussion page.
@ -125,7 +135,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
this.logger = CoreLogger.getInstance('AddonMessagesDiscussionPage');
// Refresh data if this discussion is synchronized automatically.
this.syncObserver = CoreEvents.on(AddonMessagesSyncProvider.AUTO_SYNCED, (data) => {
this.syncObserver = CoreEvents.on(ADDON_MESSAGES_AUTO_SYNCED, (data) => {
if ((data.userId && data.userId == this.userId) ||
(data.conversationId && data.conversationId == this.conversationId)) {
// Fetch messages.
@ -140,7 +150,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
// Refresh data if info of a mamber of the conversation have changed.
this.memberInfoObserver = CoreEvents.on(
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
(data) => {
if (data.userId && (this.members[data.userId] || this.otherMember && data.userId == this.otherMember.id)) {
this.fetchData();
@ -595,13 +605,13 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
this.conversationId = this.conversation.id;
this.title = this.conversation.name;
this.conversationImage = this.conversation.imageurl;
this.isGroup = this.conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP;
this.isGroup = this.conversation.type === AddonMessagesMessageConversationType.GROUP;
this.favouriteIcon = 'fas-star';
this.muteIcon = this.conversation.ismuted ? 'fas-bell' : 'fas-bell-slash';
if (!this.isGroup) {
this.userId = this.conversation.userid;
}
this.isSelf = this.conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF;
this.isSelf = this.conversation.type === AddonMessagesMessageConversationType.SELF;
return true;
} else {
@ -645,7 +655,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
const messages: AddonMessagesConversationMessageFormatted[] = result.messages;
if (pagesToLoad > 0 && result.canLoadMore) {
offset += AddonMessagesProvider.LIMIT_MESSAGES;
offset += ADDON_MESSAGES_LIMIT_MESSAGES;
// Get more messages.
const nextMessages = await this.getConversationMessages(pagesToLoad, offset);
@ -764,7 +774,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
}
if (readChanged) {
CoreEvents.trigger(AddonMessagesProvider.READ_CHANGED_EVENT, {
CoreEvents.trigger(ADDON_MESSAGES_READ_CHANGED_EVENT, {
conversationId: this.conversationId,
userId: this.userId,
}, this.siteId);
@ -789,7 +799,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
if (trigger) {
// Update discussions last message.
CoreEvents.trigger(AddonMessagesProvider.NEW_MESSAGE_EVENT, {
CoreEvents.trigger(ADDON_MESSAGES_NEW_MESSAGE_EVENT, {
conversationId: this.conversationId,
userId: this.userId,
message: this.lastMessage?.text,
@ -887,7 +897,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
}
await CoreWait.wait(400);
await CoreUtils.ignoreErrors(this.waitForFetch());
await CorePromiseUtils.ignoreErrors(this.waitForFetch());
}
/**
@ -905,7 +915,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
this.fetchMessages().catch(() => {
// Ignore errors.
});
}, AddonMessagesProvider.POLL_INTERVAL);
}, ADDON_MESSAGES_POLL_INTERVAL);
}
}
@ -1265,7 +1275,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
if (splitViewLoaded) {
// Notify the left pane to load it, this way the right conversation will be highlighted.
CoreEvents.trigger(
AddonMessagesProvider.OPEN_CONVERSATION_EVENT,
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
{ userId },
this.siteId,
);
@ -1300,7 +1310,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
// Get the conversation data so it's cached. Don't block the user for this.
AddonMessages.getConversation(this.conversation.id, undefined, true);
CoreEvents.trigger(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, {
CoreEvents.trigger(ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT, {
conversationId: this.conversation.id,
action: AddonMessagesUpdateConversationAction.FAVOURITE,
value: this.conversation.isfavourite,
@ -1332,7 +1342,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
// Get the conversation data so it's cached. Don't block the user for this.
AddonMessages.getConversation(this.conversation.id, undefined, true);
CoreEvents.trigger(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, {
CoreEvents.trigger(ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT, {
conversationId: this.conversation.id,
action: AddonMessagesUpdateConversationAction.MUTE,
value: this.conversation.ismuted,
@ -1447,7 +1457,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
await AddonMessages.deleteConversation(this.conversation.id);
CoreEvents.trigger(
AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT,
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
{
conversationId: this.conversation.id,
action: AddonMessagesUpdateConversationAction.DELETE,

View File

@ -19,10 +19,9 @@ import {
AddonMessages,
AddonMessagesDiscussion,
AddonMessagesMessageAreaContact,
AddonMessagesProvider,
} from '../../services/messages';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { ActivatedRoute, Params } from '@angular/router';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
@ -33,6 +32,8 @@ import { CoreScreen } from '@services/screen';
import { CorePlatform } from '@services/platform';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreKeyboard } from '@singletons/keyboard';
import { ADDON_MESSAGES_NEW_MESSAGE_EVENT, ADDON_MESSAGES_READ_CHANGED_EVENT } from '@addons/messages/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Page that displays the list of discussions.
@ -40,7 +41,7 @@ import { CoreKeyboard } from '@singletons/keyboard';
@Component({
selector: 'addon-messages-discussions',
templateUrl: 'discussions.html',
styleUrls: ['../../messages-common.scss'],
styleUrl: '../../messages-common.scss',
})
export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
@ -75,7 +76,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
// Update discussions when new message is received.
this.newMessagesObserver = CoreEvents.on(
AddonMessagesProvider.NEW_MESSAGE_EVENT,
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
(data) => {
if (data.userId && this.discussions) {
const discussion = this.discussions.find((disc) => disc.message?.user === data.userId);
@ -97,7 +98,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
// Update discussions when a message is read.
this.readChangedObserver = CoreEvents.on(
AddonMessagesProvider.READ_CHANGED_EVENT,
ADDON_MESSAGES_READ_CHANGED_EVENT,
(data) => {
if (data.userId && this.discussions) {
const discussion = this.discussions.find((disc) => disc.message?.user === data.userId);
@ -170,7 +171,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
promises.push(AddonMessages.invalidateUnreadConversationCounts(this.siteId));
}
await CoreUtils.allPromises(promises).finally(() => this.fetchData().finally(() => {
await CorePromiseUtils.allPromises(promises).finally(() => this.fetchData().finally(() => {
if (refresher) {
refresher?.complete();
}

View File

@ -17,12 +17,10 @@ import { AccordionGroupChangeEventDetail, IonAccordionGroup, IonContent } from '
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import {
AddonMessagesProvider,
AddonMessagesConversationFormatted,
AddonMessages,
AddonMessagesNewMessagedEventData,
AddonMessagesUnreadConversationCountsEventData,
AddonMessagesUpdateConversationAction,
} from '../../services/messages';
import {
AddonMessagesOffline,
@ -35,11 +33,22 @@ import { Translate } from '@singletons';
import { Subscription } from 'rxjs';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { ActivatedRoute, Params } from '@angular/router';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { CoreNavigator } from '@services/navigator';
import { CoreScreen } from '@services/screen';
import { CorePlatform } from '@services/platform';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import {
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
ADDON_MESSAGES_READ_CHANGED_EVENT,
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
AddonMessagesMessageConversationType,
AddonMessagesUpdateConversationAction,
} from '@addons/messages/constants';
const enum AddonMessagesGroupConversationOptionNames {
FAVOURITES = 'favourites',
@ -53,7 +62,7 @@ const enum AddonMessagesGroupConversationOptionNames {
@Component({
selector: 'page-addon-messages-group-conversations',
templateUrl: 'group-conversations.html',
styleUrls: ['../../messages-common.scss'],
styleUrl: '../../messages-common.scss',
})
export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
@ -82,7 +91,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
optionName: AddonMessagesGroupConversationOptionNames.GROUP,
titleString: 'addon.messages.groupconversations',
emptyString: 'addon.messages.nogroupconversations',
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP,
type: AddonMessagesMessageConversationType.GROUP,
favourites: false,
count: 0,
unread: 0,
@ -92,7 +101,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
optionName: AddonMessagesGroupConversationOptionNames.INDIVIDUAL,
titleString: 'addon.messages.individualconversations',
emptyString: 'addon.messages.noindividualconversations',
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
type: AddonMessagesMessageConversationType.INDIVIDUAL,
favourites: false,
count: 0,
unread: 0,
@ -100,7 +109,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
},
];
typeGroup = AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP;
typeGroup = AddonMessagesMessageConversationType.GROUP;
protected siteId: string;
protected currentUserId: number;
@ -124,7 +133,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Update conversations when new message is received.
this.newMessagesObserver = CoreEvents.on(
AddonMessagesProvider.NEW_MESSAGE_EVENT,
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
(data) => {
// Check if the new message belongs to the option that is currently expanded.
const expandedOption = this.getExpandedOption();
@ -163,7 +172,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
conversation.lastmessagedate = data.timecreated / 1000;
if (data.userFrom) {
conversation.sentfromcurrentuser = data.userFrom.id === this.currentUserId;
if (conversation.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
if (conversation.type === AddonMessagesMessageConversationType.GROUP) {
conversation.members[0] = data.userFrom;
}
}
@ -183,7 +192,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
);
// Update conversations when a message is read.
this.readChangedObserver = CoreEvents.on(AddonMessagesProvider.READ_CHANGED_EVENT, (data) => {
this.readChangedObserver = CoreEvents.on(ADDON_MESSAGES_READ_CHANGED_EVENT, (data) => {
if (data.conversationId) {
const conversation = this.findConversation(data.conversationId);
@ -200,7 +209,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Load a discussion if we receive an event to do so.
this.openConversationObserver = CoreEvents.on(
AddonMessagesProvider.OPEN_CONVERSATION_EVENT,
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
(data) => {
if (data.conversationId || data.userId) {
this.gotoConversation(data.conversationId, data.userId);
@ -222,7 +231,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Update conversations if we receive an event to do so.
this.updateConversationListObserver = CoreEvents.on(
AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT,
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
(data) => {
if (data?.action === AddonMessagesUpdateConversationAction.MUTE) {
// If the conversation is displayed, change its muted value.
@ -256,7 +265,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Update unread conversation counts.
this.cronObserver = CoreEvents.on(
AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT,
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
(data) => {
this.setCounts(data, 'unread');
},
@ -265,7 +274,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Update the contact requests badge.
this.contactRequestsCountObserver = CoreEvents.on(
AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT,
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
(data) => {
this.contactRequestsCount = data.count;
},
@ -274,7 +283,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Update block status of a user.
this.memberInfoObserver = CoreEvents.on(
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
(data) => {
if (!data.userBlocked && !data.userUnblocked) {
// The block status has not changed, ignore.
@ -638,7 +647,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
// Conversation not found, it could be an old one or the message could belong to another option.
conversation = {
id: message.conversationid,
type: message.conversation?.type || AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
type: message.conversation?.type || AddonMessagesMessageConversationType.INDIVIDUAL,
membercount: message.conversation?.membercount || 0,
ismuted: message.conversation?.ismuted || false,
isfavourite: message.conversation?.isfavourite || false,
@ -657,7 +666,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
this.addOfflineConversation(conversation, option);
}
}
} else if (option.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL) {
} else if (option.type === AddonMessagesMessageConversationType.INDIVIDUAL) {
// It's a new conversation. Check if we already created it (there is more than one message for the same user).
const conversation = this.findConversation(undefined, message.touserid, option);
@ -675,7 +684,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
}).then((user) => {
const conversation: AddonMessagesConversationForList = {
id: 0,
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
type: AddonMessagesMessageConversationType.INDIVIDUAL,
membercount: 0, // Faked data.
ismuted: false, // Faked data.
isfavourite: false, // Faked data.
@ -742,7 +751,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
return AddonMessagesGroupConversationOptionNames.FAVOURITES;
}
if (conversation.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
if (conversation.type === AddonMessagesMessageConversationType.GROUP) {
return AddonMessagesGroupConversationOptionNames.GROUP;
}

View File

@ -16,7 +16,6 @@ import { Component, OnDestroy, ViewChild } from '@angular/core';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites';
import {
AddonMessagesProvider,
AddonMessagesConversationMember,
AddonMessagesMessageAreaContact,
AddonMessages,
@ -26,6 +25,11 @@ import { CoreNavigator } from '@services/navigator';
import { CoreScreen } from '@services/screen';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreKeyboard } from '@singletons/keyboard';
import {
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_LIMIT_SEARCH,
ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH,
} from '@addons/messages/constants';
/**
* Page for searching users.
@ -74,7 +78,7 @@ export class AddonMessagesSearchPage implements OnDestroy {
constructor() {
// Update block status of a user.
this.memberInfoObserver = CoreEvents.on(
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
(data) => {
if (!data.userBlocked && !data.userUnblocked) {
// The block status has not changed, ignore.
@ -139,7 +143,7 @@ export class AddonMessagesSearchPage implements OnDestroy {
let canLoadMoreMessages = false;
if (!loadMore || loadMore == 'contacts' || loadMore == 'noncontacts') {
const limitNum = loadMore ? AddonMessagesProvider.LIMIT_SEARCH : AddonMessagesProvider.LIMIT_INITIAL_USER_SEARCH;
const limitNum = loadMore ? ADDON_MESSAGES_LIMIT_SEARCH : ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH;
let limitFrom = 0;
if (loadMore == 'contacts') {
limitFrom = this.contacts.results.length;

View File

@ -14,7 +14,7 @@
import { Component, OnDestroy, OnInit, signal } from '@angular/core';
import {
AddonMessagesProvider, AddonMessagesMessagePreferences,
AddonMessagesMessagePreferences,
AddonMessagesMessagePreferencesNotification,
AddonMessagesMessagePreferencesNotificationProcessor,
AddonMessages,
@ -29,6 +29,7 @@ import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons
import { CorePlatform } from '@services/platform';
import { CoreErrorHelper } from '@services/error-helper';
import { CoreLoadings } from '@services/loadings';
import { ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY, AddonMessagesMessagePrivacy } from '@addons/messages/constants';
/**
* Page that displays the messages settings page.
@ -46,9 +47,9 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy {
contactablePrivacy?: number | boolean;
advancedContactable = false; // Whether the site supports "advanced" contactable privacy.
allowSiteMessaging = false;
onlyContactsValue = AddonMessagesProvider.MESSAGE_PRIVACY_ONLYCONTACTS;
courseMemberValue = AddonMessagesProvider.MESSAGE_PRIVACY_COURSEMEMBER;
siteValue = AddonMessagesProvider.MESSAGE_PRIVACY_SITE;
onlyContactsValue = AddonMessagesMessagePrivacy.ONLYCONTACTS;
courseMemberValue = AddonMessagesMessagePrivacy.COURSEMEMBER;
siteValue = AddonMessagesMessagePrivacy.SITE;
groupMessagingEnabled = false;
sendOnEnter = false;
warningMessage = signal<string | undefined>(undefined);
@ -91,7 +92,7 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy {
for (const component of preferences.components) {
// Only display get the notification preferences.
component.notifications = component.notifications.filter((notification) =>
notification.preferencekey == AddonMessagesProvider.NOTIFICATION_PREFERENCES_KEY);
notification.preferencekey === ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY);
if (this.loggedInOffLegacyMode) {
// Load enabled from loggedin / loggedoff values.

View File

@ -14,20 +14,23 @@
import { Injectable } from '@angular/core';
import {
AddonMessagesProvider,
AddonMessages,
} from '../messages';
import { CoreMainMenuHandler, CoreMainMenuHandlerToDisplay } from '@features/mainmenu/services/mainmenu-delegate';
import { CoreCronHandler } from '@services/cron';
import { CoreSites } from '@services/sites';
import { CoreEvents } from '@singletons/events';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import {
CorePushNotificationsNotificationBasicData,
} from '@features/pushnotifications/services/pushnotifications';
import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
import { makeSingleton } from '@singletons';
import { CoreMainMenuProvider } from '@features/mainmenu/services/mainmenu';
import {
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
} from '@addons/messages/constants';
import { MAIN_MENU_HANDLER_BADGE_UPDATED_EVENT } from '@features/mainmenu/constants';
/**
* Handler to inject an option into main menu.
@ -58,14 +61,14 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler,
constructor() {
CoreEvents.on(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, (data) => {
CoreEvents.on(ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT, (data) => {
this.unreadCount = data.favourites + data.individual + data.group + data.self;
this.orMore = !!data.orMore;
data.siteId && this.updateBadge(data.siteId);
});
CoreEvents.on(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, (data) => {
CoreEvents.on(ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, (data) => {
this.contactRequestsCount = data.count;
data.siteId && this.updateBadge(data.siteId);
@ -174,7 +177,7 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler,
// Update push notifications badge.
CoreEvents.trigger(
CoreMainMenuProvider.MAIN_MENU_HANDLER_BADGE_UPDATED,
MAIN_MENU_HANDLER_BADGE_UPDATED_EVENT,
{
handler: AddonMessagesMainMenuHandlerService.name,
value: totalCount,

View File

@ -16,7 +16,7 @@ import { Injectable } from '@angular/core';
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { CoreNavigator } from '@services/navigator';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { makeSingleton } from '@singletons';
import { AddonMessages } from '../messages';
import { AddonMessagesMainMenuHandlerService } from './mainmenu';

View File

@ -18,12 +18,11 @@ import {
AddonMessagesOffline, AddonMessagesOfflineAnyMessagesFormatted,
} from './messages-offline';
import {
AddonMessagesProvider,
AddonMessages,
AddonMessagesGetMessagesWSParams,
} from './messages';
import { CoreEvents } from '@singletons/events';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { makeSingleton, Translate } from '@singletons';
import { CoreSites } from '@services/sites';
import { CoreNetwork } from '@services/network';
@ -33,6 +32,20 @@ import { CoreError } from '@classes/errors/error';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreWait } from '@singletons/wait';
import { CoreErrorHelper, CoreErrorObject } from '@services/error-helper';
import { ADDON_MESSAGES_AUTO_SYNCED, ADDON_MESSAGES_LIMIT_MESSAGES } from '../constants';
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 {
[ADDON_MESSAGES_AUTO_SYNCED]: AddonMessagesSyncEvents;
}
}
/**
* Service to sync messages.
@ -40,8 +53,6 @@ import { CoreErrorHelper, CoreErrorObject } from '@services/error-helper';
@Injectable({ providedIn: 'root' })
export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessagesSyncEvents> {
static readonly AUTO_SYNCED = 'addon_messages_autom_synced';
constructor() {
super('AddonMessagesSync');
}
@ -113,7 +124,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
}
// Sync successful, send event.
CoreEvents.trigger(AddonMessagesSyncProvider.AUTO_SYNCED, result, siteId);
CoreEvents.trigger(ADDON_MESSAGES_AUTO_SYNCED, result, siteId);
return;
}));
@ -126,7 +137,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
}
// Sync successful, send event.
CoreEvents.trigger(AddonMessagesSyncProvider.AUTO_SYNCED, result, siteId);
CoreEvents.trigger(ADDON_MESSAGES_AUTO_SYNCED, result, siteId);
return;
}));
@ -227,7 +238,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
await AddonMessages.sendMessageOnline(userId, text, siteId);
}
} catch (error) {
if (!CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Error sending, stop execution.
if (CoreNetwork.isOnline()) {
// App is online, unmark deviceoffline if marked.
@ -305,7 +316,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
const params: AddonMessagesGetMessagesWSParams = {
useridto: userId,
useridfrom: siteCurrentUserId,
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
};
const preSets: CoreSiteWSPreSets = {
cacheKey: AddonMessages.getCacheKeyForDiscussion(userId),

View File

@ -23,17 +23,35 @@ import {
AddonMessagesOfflineConversationMessagesDBRecordFormatted,
AddonMessagesOfflineMessagesDBRecordFormatted,
} from './messages-offline';
import { CoreUtils } from '@services/utils/utils';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreEvents } from '@singletons/events';
import { CoreSite } from '@classes/sites/site';
import { CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons';
import { CoreError } from '@classes/errors/error';
import { AddonMessagesSyncEvents, AddonMessagesSyncProvider } from './messages-sync';
import { CoreWSError } from '@classes/errors/wserror';
import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons/notifications/services/notifications';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { CoreCacheUpdateFrequency } from '@/core/constants';
import {
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
ADDON_MESSAGES_LIMIT_CONTACTS,
ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH,
ADDON_MESSAGES_LIMIT_MESSAGES,
ADDON_MESSAGES_LIMIT_SEARCH,
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
ADDON_MESSAGES_POLL_INTERVAL,
ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT,
ADDON_MESSAGES_READ_CHANGED_EVENT,
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
AddonMessagesMessageConversationType,
AddonMessagesMessagePrivacy,
AddonMessagesUpdateConversationAction,
} from '../constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
declare module '@singletons/events' {
@ -43,24 +61,17 @@ declare module '@singletons/events' {
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
*/
export interface CoreEventsData {
[AddonMessagesProvider.NEW_MESSAGE_EVENT]: AddonMessagesNewMessagedEventData;
[AddonMessagesProvider.READ_CHANGED_EVENT]: AddonMessagesReadChangedEventData;
[AddonMessagesProvider.OPEN_CONVERSATION_EVENT]: AddonMessagesOpenConversationEventData;
[AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT]: AddonMessagesUpdateConversationListEventData;
[AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT]: AddonMessagesMemberInfoChangedEventData;
[AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT]: AddonMessagesUnreadConversationCountsEventData;
[AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT]: AddonMessagesContactRequestCountEventData;
[AddonMessagesSyncProvider.AUTO_SYNCED]: AddonMessagesSyncEvents;
[ADDON_MESSAGES_NEW_MESSAGE_EVENT]: AddonMessagesNewMessagedEventData;
[ADDON_MESSAGES_READ_CHANGED_EVENT]: AddonMessagesReadChangedEventData;
[ADDON_MESSAGES_OPEN_CONVERSATION_EVENT]: AddonMessagesOpenConversationEventData;
[ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT]: AddonMessagesUpdateConversationListEventData;
[ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT]: AddonMessagesMemberInfoChangedEventData;
[ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT]: AddonMessagesUnreadConversationCountsEventData;
[ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT]: AddonMessagesContactRequestCountEventData;
}
}
export const enum AddonMessagesUpdateConversationAction {
MUTE = 'mute',
FAVOURITE = 'favourite',
DELETE = 'delete',
}
/**
* Service to handle messages.
*/
@ -69,27 +80,87 @@ export class AddonMessagesProvider {
protected static readonly ROOT_CACHE_KEY = 'mmaMessages:';
static readonly NEW_MESSAGE_EVENT = 'addon_messages_new_message_event';
static readonly READ_CHANGED_EVENT = 'addon_messages_read_changed_event';
static readonly OPEN_CONVERSATION_EVENT = 'addon_messages_open_conversation_event'; // Notify a conversation should be opened.
static readonly UPDATE_CONVERSATION_LIST_EVENT = 'addon_messages_update_conversation_list_event';
static readonly MEMBER_INFO_CHANGED_EVENT = 'addon_messages_member_changed_event';
static readonly UNREAD_CONVERSATION_COUNTS_EVENT = 'addon_messages_unread_conversation_counts_event';
static readonly CONTACT_REQUESTS_COUNT_EVENT = 'addon_messages_contact_requests_count_event';
static readonly POLL_INTERVAL = 10000;
static readonly PUSH_SIMULATION_COMPONENT = 'AddonMessagesPushSimulation';
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_NEW_MESSAGE_EVENT instead.
*/
static readonly NEW_MESSAGE_EVENT = ADDON_MESSAGES_NEW_MESSAGE_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_READ_CHANGED_EVENT instead.
*/
static readonly READ_CHANGED_EVENT = ADDON_MESSAGES_READ_CHANGED_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_OPEN_CONVERSATION_EVENT instead.
*/
static readonly OPEN_CONVERSATION_EVENT = ADDON_MESSAGES_OPEN_CONVERSATION_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT instead.
*/
static readonly UPDATE_CONVERSATION_LIST_EVENT = ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT instead.
*/
static readonly MEMBER_INFO_CHANGED_EVENT = ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT instead.
*/
static readonly UNREAD_CONVERSATION_COUNTS_EVENT = ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT instead.
*/
static readonly CONTACT_REQUESTS_COUNT_EVENT = ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_POLL_INTERVAL instead.
*/
static readonly POLL_INTERVAL = ADDON_MESSAGES_POLL_INTERVAL;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT instead.
*/
static readonly PUSH_SIMULATION_COMPONENT = ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT;
static readonly MESSAGE_PRIVACY_COURSEMEMBER = 0; // Privacy setting for being messaged by anyone within courses user is member.
static readonly MESSAGE_PRIVACY_ONLYCONTACTS = 1; // Privacy setting for being messaged only by contacts.
static readonly MESSAGE_PRIVACY_SITE = 2; // Privacy setting for being messaged by anyone on the site.
static readonly MESSAGE_CONVERSATION_TYPE_INDIVIDUAL = 1; // An individual conversation.
static readonly MESSAGE_CONVERSATION_TYPE_GROUP = 2; // A group conversation.
static readonly MESSAGE_CONVERSATION_TYPE_SELF = 3; // A self conversation.
static readonly LIMIT_CONTACTS = 50;
static readonly LIMIT_MESSAGES = 50;
static readonly LIMIT_INITIAL_USER_SEARCH = 3;
static readonly LIMIT_SEARCH = 50;
/**
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.COURSEMEMBER instead.
*/
static readonly MESSAGE_PRIVACY_COURSEMEMBER = AddonMessagesMessagePrivacy.COURSEMEMBER;
/**
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.ONLYCONTACTS instead.
*/
static readonly MESSAGE_PRIVACY_ONLYCONTACTS = AddonMessagesMessagePrivacy.ONLYCONTACTS;
/**
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.SITE instead.
*/
static readonly MESSAGE_PRIVACY_SITE = AddonMessagesMessagePrivacy.SITE;
/**
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.INDIVIDUAL instead.
*/
static readonly MESSAGE_CONVERSATION_TYPE_INDIVIDUAL = AddonMessagesMessageConversationType.INDIVIDUAL;
/**
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.GROUP instead.
*/
static readonly MESSAGE_CONVERSATION_TYPE_GROUP = AddonMessagesMessageConversationType.GROUP;
/**
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.SELF instead.
*/
static readonly MESSAGE_CONVERSATION_TYPE_SELF = AddonMessagesMessageConversationType.SELF;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_CONTACTS instead.
*/
static readonly LIMIT_CONTACTS = ADDON_MESSAGES_LIMIT_CONTACTS;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_MESSAGES instead.
*/
static readonly LIMIT_MESSAGES = ADDON_MESSAGES_LIMIT_MESSAGES;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH instead.
*/
static readonly LIMIT_INITIAL_USER_SEARCH = ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_SEARCH instead.
*/
static readonly LIMIT_SEARCH = ADDON_MESSAGES_LIMIT_SEARCH;
/**
* @deprecated since 5.0. Use ADDON_MESSAGES_NEW_MESSAGE_EVENT instead.
*/
static readonly NOTIFICATION_PREFERENCES_KEY = 'message_provider_moodle_instantmessage';
protected logger: CoreLogger;
@ -147,7 +218,7 @@ export class AddonMessagesProvider {
} finally {
const data: AddonMessagesMemberInfoChangedEventData = { userId, userBlocked: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
}
}
@ -169,14 +240,14 @@ export class AddonMessagesProvider {
await site.write('core_message_confirm_contact_request', params);
await CoreUtils.allPromises([
await CorePromiseUtils.allPromises([
this.invalidateAllMemberInfo(userId, site),
this.invalidateContactsCache(site.id),
this.invalidateUserContacts(site.id),
this.refreshContactRequestsCount(site.id),
]).finally(() => {
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestConfirmed: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
});
}
@ -212,7 +283,7 @@ export class AddonMessagesProvider {
await this.invalidateAllMemberInfo(userId, site).finally(() => {
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestCreated: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
});
}
@ -234,12 +305,12 @@ export class AddonMessagesProvider {
await site.write('core_message_decline_contact_request', params);
await CoreUtils.allPromises([
await CorePromiseUtils.allPromises([
this.invalidateAllMemberInfo(userId, site),
this.refreshContactRequestsCount(site.id),
]).finally(() => {
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestDeclined: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
});
}
@ -373,8 +444,8 @@ export class AddonMessagesProvider {
conversation.lastmessagedate = lastMessage ? lastMessage.timecreated : undefined;
conversation.sentfromcurrentuser = lastMessage ? lastMessage.useridfrom == userId : undefined;
if (conversation.type != AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
const isIndividual = conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL;
if (conversation.type != AddonMessagesMessageConversationType.GROUP) {
const isIndividual = conversation.type == AddonMessagesMessageConversationType.INDIVIDUAL;
const otherUser = conversation.members.find((member) =>
(isIndividual && member.id != userId) || (!isIndividual && member.id == userId));
@ -628,7 +699,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForBlockedContacts(userId),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
};
return site.read('core_message_get_blocked_users', params, preSets);
@ -648,7 +719,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForContacts(),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
};
const contacts = await site.read<AddonMessagesGetContactsWSResponse>('core_message_get_contacts', undefined, preSets);
@ -679,14 +750,14 @@ export class AddonMessagesProvider {
* Get the list of user contacts.
*
* @param limitFrom Position of the first contact to fetch.
* @param limitNum Number of contacts to fetch. Default is AddonMessagesProvider.LIMIT_CONTACTS.
* @param limitNum Number of contacts to fetch. Default is ADDON_MESSAGES_LIMIT_CONTACTS.
* @param siteId Site ID. If not defined, use current site.
* @returns Promise resolved with the list of user contacts.
* @since 3.6
*/
async getUserContacts(
limitFrom: number = 0,
limitNum: number = AddonMessagesProvider.LIMIT_CONTACTS,
limitNum: number = ADDON_MESSAGES_LIMIT_CONTACTS,
siteId?: string,
): Promise<{contacts: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
const site = await CoreSites.getSite(siteId);
@ -699,7 +770,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForUserContacts(),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
};
const contacts = await site.read<AddonMessagesGetUserContactsWSResponse>('core_message_get_user_contacts', params, preSets);
@ -723,14 +794,14 @@ export class AddonMessagesProvider {
* Get the contact request sent to the current user.
*
* @param limitFrom Position of the first contact request to fetch.
* @param limitNum Number of contact requests to fetch. Default is AddonMessagesProvider.LIMIT_CONTACTS.
* @param limitNum Number of contact requests to fetch. Default is ADDON_MESSAGES_LIMIT_CONTACTS.
* @param siteId Site ID. If not defined, use current site.
* @returns Promise resolved with the list of contact requests.
* @since 3.6
*/
async getContactRequests(
limitFrom: number = 0,
limitNum: number = AddonMessagesProvider.LIMIT_CONTACTS,
limitNum: number = ADDON_MESSAGES_LIMIT_CONTACTS,
siteId?: string,
): Promise<{requests: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
const site = await CoreSites.getSite(siteId);
@ -743,7 +814,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForContactRequests(),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
};
const requests = await site.read<AddonMessagesGetContactRequestsWSResponse>(
@ -791,7 +862,7 @@ export class AddonMessagesProvider {
};
// Notify the new count so all badges are updated.
CoreEvents.trigger(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, data , site.id);
CoreEvents.trigger(ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, data , site.id);
return data.count;
@ -935,11 +1006,11 @@ export class AddonMessagesProvider {
): Promise<{members: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
const site = await CoreSites.getSite(siteId);
userId = userId || site.getUserId();
limitTo = limitTo ?? AddonMessagesProvider.LIMIT_MESSAGES;
limitTo = limitTo ?? ADDON_MESSAGES_LIMIT_MESSAGES;
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForConversationMembers(userId, conversationId),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
const params: AddonMessagesGetConversationMembersWSParams = {
@ -983,7 +1054,7 @@ export class AddonMessagesProvider {
options.userId = options.userId || site.getUserId();
options.limitFrom = options.limitFrom || 0;
options.limitTo = options.limitTo ?? AddonMessagesProvider.LIMIT_MESSAGES;
options.limitTo = options.limitTo ?? ADDON_MESSAGES_LIMIT_MESSAGES;
options.timeFrom = options.timeFrom || 0;
options.newestFirst = options.newestFirst ?? true;
@ -1076,7 +1147,7 @@ export class AddonMessagesProvider {
const params: AddonMessagesGetConversationsWSParams = {
userid: userId,
limitfrom: limitFrom,
limitnum: AddonMessagesProvider.LIMIT_MESSAGES + 1,
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES + 1,
};
if (forceCache) {
@ -1091,7 +1162,7 @@ export class AddonMessagesProvider {
if (favourites !== undefined && favourites != null) {
params.favourites = !!favourites;
}
if (site.isVersionGreaterEqualThan('3.7') && type != AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
if (site.isVersionGreaterEqualThan('3.7') && type != AddonMessagesMessageConversationType.GROUP) {
// Add self conversation to the list.
params.mergeself = true;
}
@ -1112,12 +1183,12 @@ export class AddonMessagesProvider {
// Format the conversations, adding some calculated fields.
const conversations = response.conversations
.slice(0, AddonMessagesProvider.LIMIT_MESSAGES)
.slice(0, ADDON_MESSAGES_LIMIT_MESSAGES)
.map((conversation) => this.formatConversation(conversation, userId!));
return {
conversations,
canLoadMore: response.conversations.length > AddonMessagesProvider.LIMIT_MESSAGES,
canLoadMore: response.conversations.length > ADDON_MESSAGES_LIMIT_MESSAGES,
};
}
@ -1144,9 +1215,9 @@ export class AddonMessagesProvider {
const counts = {
favourites: result.favourites,
individual: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
group: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP],
self: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF] || 0,
individual: result.types[AddonMessagesMessageConversationType.INDIVIDUAL],
group: result.types[AddonMessagesMessageConversationType.GROUP],
self: result.types[AddonMessagesMessageConversationType.SELF] || 0,
};
return counts;
@ -1189,7 +1260,7 @@ export class AddonMessagesProvider {
const params: AddonMessagesGetMessagesWSParams = {
useridto: site.getUserId(),
useridfrom: userId,
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
};
if (lfReceivedUnread > 0 || lfReceivedRead > 0 || lfSentUnread > 0 || lfSentRead > 0) {
@ -1212,13 +1283,13 @@ export class AddonMessagesProvider {
result.messages = result.messages.concat(sent);
const hasSent = sent.length > 0;
if (result.messages.length > AddonMessagesProvider.LIMIT_MESSAGES) {
if (result.messages.length > ADDON_MESSAGES_LIMIT_MESSAGES) {
// Sort messages and get the more recent ones.
result.canLoadMore = true;
result.messages = this.sortMessages(result['messages']);
result.messages = result.messages.slice(-AddonMessagesProvider.LIMIT_MESSAGES);
result.messages = result.messages.slice(-ADDON_MESSAGES_LIMIT_MESSAGES);
} else {
result.canLoadMore = result.messages.length == AddonMessagesProvider.LIMIT_MESSAGES && (!hasReceived || !hasSent);
result.canLoadMore = result.messages.length == ADDON_MESSAGES_LIMIT_MESSAGES && (!hasReceived || !hasSent);
}
if (excludePending) {
@ -1289,7 +1360,7 @@ export class AddonMessagesProvider {
const params: AddonMessagesGetMessagesWSParams = {
useridto: currentUserId,
useridfrom: 0,
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
};
const preSets: CoreSiteWSPreSets = {
@ -1371,7 +1442,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getCacheKeyForMemberInfo(userId, otherUserId),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
};
const params: AddonMessagesGetMemberInfoWSParams = {
referenceuserid: userId,
@ -1410,7 +1481,7 @@ export class AddonMessagesProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getMessagePreferencesCacheKey(),
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
};
const data = await site.read<AddonMessagesGetUserMessagePreferencesWSResponse>(
@ -1572,9 +1643,9 @@ export class AddonMessagesProvider {
counts = {
favourites: result.favourites,
individual: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
group: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP],
self: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF] || 0,
individual: result.types[AddonMessagesMessageConversationType.INDIVIDUAL],
group: result.types[AddonMessagesMessageConversationType.GROUP],
self: result.types[AddonMessagesMessageConversationType.SELF] || 0,
};
} else {
@ -1592,7 +1663,7 @@ export class AddonMessagesProvider {
}
// Notify the new counts so all views are updated.
CoreEvents.trigger(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, counts, site.id);
CoreEvents.trigger(ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT, counts, site.id);
return counts;
}
@ -1617,7 +1688,7 @@ export class AddonMessagesProvider {
const params: AddonMessagesGetMessagesWSParams = {
read: false,
limitfrom: 0,
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
useridto: site.getUserId(),
useridfrom: 0,
};
@ -1863,7 +1934,7 @@ export class AddonMessagesProvider {
* @returns Promise resolved when done.
*/
protected async invalidateAllMemberInfo(userId: number, site: CoreSite): Promise<void> {
await CoreUtils.allPromises([
await CorePromiseUtils.allPromises([
this.invalidateMemberInfo(userId, site.id),
this.invalidateUserContacts(site.id),
this.invalidateBlockedContactsCache(site.id),
@ -1881,7 +1952,7 @@ export class AddonMessagesProvider {
site.id,
undefined,
true,
).then((conversation) => CoreUtils.allPromises([
).then((conversation) => CorePromiseUtils.allPromises([
this.invalidateConversation(conversation.id),
this.invalidateConversationMembers(conversation.id, site.id),
])).catch(() => {
@ -2243,13 +2314,13 @@ export class AddonMessagesProvider {
await site.write('core_message_delete_contacts', params, preSets);
return CoreUtils.allPromises([
return CorePromiseUtils.allPromises([
this.invalidateUserContacts(site.id),
this.invalidateAllMemberInfo(userId, site),
this.invalidateContactsCache(site.id),
]).then(() => {
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRemoved: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
return;
});
@ -2296,7 +2367,7 @@ export class AddonMessagesProvider {
* @param query The query string.
* @param userId The user ID. If not defined, current user.
* @param limitFrom Position of the first result to get. Defaults to 0.
* @param limitNum Number of results to get. Defaults to AddonMessagesProvider.LIMIT_SEARCH.
* @param limitNum Number of results to get. Defaults to ADDON_MESSAGES_LIMIT_SEARCH.
* @param siteId Site ID. If not defined, current site.
* @returns Promise resolved with the results.
*/
@ -2304,7 +2375,7 @@ export class AddonMessagesProvider {
query: string,
userId?: number,
limitFrom: number = 0,
limitNum: number = AddonMessagesProvider.LIMIT_SEARCH,
limitNum: number = ADDON_MESSAGES_LIMIT_SEARCH,
siteId?: string,
): Promise<{messages: AddonMessagesMessageAreaContact[]; canLoadMore: boolean}> {
const site = await CoreSites.getSite(siteId);
@ -2349,7 +2420,7 @@ export class AddonMessagesProvider {
*
* @param query Text to search for.
* @param limitFrom Position of the first found user to fetch.
* @param limitNum Number of found users to fetch. Defaults to AddonMessagesProvider.LIMIT_SEARCH.
* @param limitNum Number of found users to fetch. Defaults to ADDON_MESSAGES_LIMIT_SEARCH.
* @param siteId Site ID. If not defined, use current site.
* @returns Resolved with two lists of found users: contacts and non-contacts.
* @since 3.6
@ -2357,7 +2428,7 @@ export class AddonMessagesProvider {
async searchUsers(
query: string,
limitFrom: number = 0,
limitNum: number = AddonMessagesProvider.LIMIT_SEARCH,
limitNum: number = ADDON_MESSAGES_LIMIT_SEARCH,
siteId?: string,
): Promise<{
contacts: AddonMessagesConversationMember[];
@ -2459,7 +2530,7 @@ export class AddonMessagesProvider {
message: result,
};
} catch (error) {
if (CoreUtils.isWebServiceError(error)) {
if (CoreWSError.isWebServiceError(error)) {
// It's a WebService error, the user cannot send the message so don't store it.
throw error;
}
@ -2590,7 +2661,7 @@ export class AddonMessagesProvider {
message: result,
};
} catch (error) {
if (CoreUtils.isWebServiceError(error)) {
if (CoreWSError.isWebServiceError(error)) {
// It's a WebService error, the user cannot send the message so don't store it.
throw error;
}
@ -2827,7 +2898,7 @@ export class AddonMessagesProvider {
} finally {
const data: AddonMessagesMemberInfoChangedEventData = { userId, userUnblocked: true };
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
}
}

View File

@ -16,7 +16,7 @@ import { Params } from '@angular/router';
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
import { CoreGroupInfo, CoreGroups } from '@services/groups';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { Translate } from '@singletons';
import { CoreIonicColorNames } from '@singletons/colors';
import { CoreEvents } from '@singletons/events';
@ -194,7 +194,7 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
const showSubmissions: AddonModAssignSubmissionForList[] = await Promise.all(
submissions.map(async (submission: AddonModAssignSubmissionForList) => {
const gradeData =
await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
await CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
// Load offline grades.
const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified;

View File

@ -16,7 +16,7 @@ import { Component, Input, ViewChild, ElementRef } from '@angular/core';
import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreFormFields, CoreForms } from '@singletons/form';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { ModalController, Translate } from '@singletons';
import { AddonModAssignAssign, AddonModAssignPlugin, AddonModAssignSubmission } from '../../services/assign';
import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate';
@ -88,7 +88,7 @@ export class AddonModAssignEditFeedbackModalComponent {
* @returns Promise resolved with boolean: whether the data has changed.
*/
protected async hasDataChanged(): Promise<boolean> {
const changed = await CoreUtils.ignoreErrors(
const changed = await CorePromiseUtils.ignoreErrors(
AddonModAssignFeedbackDelegate.hasPluginDataChanged(
this.assign,
this.submission,

View File

@ -24,7 +24,7 @@ import { CoreNavigator } from '@services/navigator';
import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreTimeUtils } from '@services/utils/time';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { Translate } from '@singletons';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreTime } from '@singletons/time';
@ -182,7 +182,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
if (sync) {
// Try to synchronize the assign.
await CoreUtils.ignoreErrors(this.syncActivity(showErrors));
await CorePromiseUtils.ignoreErrors(this.syncActivity(showErrors));
}
// Check if there's any offline data for this assign.
@ -250,18 +250,18 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
return; // Shouldn't happen.
}
await CoreUtils.ignoreErrors(AddonModAssign.logView(this.assign.id));
await CorePromiseUtils.ignoreErrors(AddonModAssign.logView(this.assign.id));
this.analyticsLogEvent('mod_assign_view_assign');
if (this.canViewAllSubmissions) {
// User can see all submissions, log grading view.
await CoreUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign.id));
await CorePromiseUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign.id));
this.analyticsLogEvent('mod_assign_view_grading_table', { sendUrl: false });
} else if (this.canViewOwnSubmission) {
// User can only see their own submission, log view the user submission.
await CoreUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign.id));
await CorePromiseUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign.id));
this.analyticsLogEvent('mod_assign_view_submission_status', { sendUrl: false });
}

View File

@ -37,7 +37,7 @@ import { CoreTabsComponent } from '@components/tabs/tabs';
import { CoreTabComponent } from '@components/tabs/tab';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper';
import { CoreMenuItem, CoreUtils } from '@services/utils/utils';
import { CoreMenuItem, CoreUtils } from '@singletons/utils';
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../../services/assign-helper';
import { CoreDomUtils } from '@services/utils/dom';
import { Translate } from '@singletons';
@ -70,6 +70,7 @@ import {
} from '../../constants';
import { CoreViewer } from '@features/viewer/services/viewer';
import { CoreLoadings } from '@services/loadings';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Component that displays an assignment submission.
@ -77,7 +78,7 @@ import { CoreLoadings } from '@services/loadings';
@Component({
selector: 'addon-mod-assign-submission',
templateUrl: 'addon-mod-assign-submission.html',
styleUrls: ['submission.scss'],
styleUrl: 'submission.scss',
})
export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, CanLeave {
@ -327,7 +328,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
const previousSubmission = this.previousAttempt.submission;
let modal = await CoreLoadings.show();
const size = await CoreUtils.ignoreErrors(
const size = await CorePromiseUtils.ignoreErrors(
AddonModAssignHelper.getSubmissionSizeForCopy(this.assign, previousSubmission),
-1,
); // Error calculating size, return -1.
@ -548,7 +549,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
});
}
await CoreUtils.ignoreErrors(Promise.all(promises));
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
await this.loadData(sync);
}
@ -716,7 +717,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
// If we have data about the grader, get its profile.
if (feedback.grade && feedback.grade.grader > 0) {
this.grader = await CoreUtils.ignoreErrors(CoreUser.getProfile(feedback.grade.grader, this.courseId));
this.grader = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(feedback.grade.grader, this.courseId));
} else {
delete this.grader;
}
@ -803,7 +804,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
// Submission grades aren't identified by attempt number so it can retrieve the feedback for a previous attempt.
// The app will not treat that as an special case.
const submissionGrade = await CoreUtils.ignoreErrors(
const submissionGrade = await CorePromiseUtils.ignoreErrors(
AddonModAssignOffline.getSubmissionGrade(assign.id, this.submitId),
);
@ -1075,7 +1076,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
const [gradebookGrades, assignGrades] = await Promise.all([
CoreGradesHelper.getGradeModuleItems(this.courseId, this.moduleId, this.submitId),
gradeNotReleased ?
CoreUtils.ignoreErrors(AddonModAssign.getAssignmentGrades(assign.id, { cmId: assign.cmid })) :
CorePromiseUtils.ignoreErrors(AddonModAssign.getAssignmentGrades(assign.id, { cmId: assign.cmid })) :
undefined,
]);

View File

@ -23,7 +23,7 @@ import {
} from '../services/handler';
import { AddonModAssignFeedbackDelegate } from '@addons/mod/assign/services/feedback-delegate';
import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
import { ContextLevel } from '@/core/constants';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
@ -124,7 +124,7 @@ export class AddonModAssignFeedbackCommentsComponent extends AddonModAssignFeedb
}
// There is no draft saved. Check if we have anything offline.
const offlineData = await CoreUtils.ignoreErrors(
const offlineData = await CorePromiseUtils.ignoreErrors(
AddonModAssignOffline.getSubmissionGrade(this.assign.id, this.userId),
undefined,
);

View File

@ -25,10 +25,9 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
import { Injectable, Type } from '@angular/core';
import { CoreSites } from '@services/sites';
import { CoreText } from '@singletons/text';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonModAssignFeedbackCommentsComponent } from '../component/comments';
import { CoreFileHelper } from '@services/file-helper';
/**
@ -73,7 +72,9 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss
/**
* @inheritdoc
*/
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
const { AddonModAssignFeedbackCommentsComponent } = await import('../component/comments');
return AddonModAssignFeedbackCommentsComponent;
}
@ -124,7 +125,7 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss
userId: number,
): Promise<boolean> {
// Get it from plugin or offline.
const offlineData = await CoreUtils.ignoreErrors(
const offlineData = await CorePromiseUtils.ignoreErrors(
AddonModAssignOffline.getSubmissionGrade(assign.id, userId),
undefined,
);

View File

@ -22,7 +22,6 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
import { Injectable, Type } from '@angular/core';
import { CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonModAssignFeedbackEditPdfComponent } from '../component/editpdf';
import type { IAddonModAssignFeedbackPluginComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
/**
@ -37,7 +36,9 @@ export class AddonModAssignFeedbackEditPdfHandlerService implements AddonModAssi
/**
* @inheritdoc
*/
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
const { AddonModAssignFeedbackEditPdfComponent } = await import('../component/editpdf');
return AddonModAssignFeedbackEditPdfComponent;
}

View File

@ -23,7 +23,6 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
import { Injectable, Type } from '@angular/core';
import { CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonModAssignFeedbackFileComponent } from '../component/file';
/**
* Handler for file feedback plugin.
@ -37,7 +36,9 @@ export class AddonModAssignFeedbackFileHandlerService implements AddonModAssignF
/**
* @inheritdoc
*/
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
const { AddonModAssignFeedbackFileComponent } = await import('../component/file');
return AddonModAssignFeedbackFileComponent;
}

View File

@ -36,7 +36,7 @@ import {
import { AddonModAssignHelper } from '../../services/assign-helper';
import { AddonModAssignOffline } from '../../services/assign-offline';
import { AddonModAssignSync } from '../../services/assign-sync';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { CoreWSExternalFile } from '@services/ws';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import {
@ -47,6 +47,7 @@ import {
} from '../../constants';
import { CoreToasts, ToastDuration } from '@services/toasts';
import { CoreLoadings } from '@services/loadings';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Page that allows adding or editing an assigment submission.
@ -54,7 +55,7 @@ import { CoreLoadings } from '@services/loadings';
@Component({
selector: 'page-addon-mod-assign-edit',
templateUrl: 'edit.html',
styleUrls: ['edit.scss'],
styleUrl: 'edit.scss',
})
export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
@ -232,7 +233,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
}
// Check if there's any offline data for this submission.
this.hasOffline = await CoreUtils.promiseWorks(AddonModAssignOffline.getSubmission(this.assign.id, this.userId));
this.hasOffline = await CorePromiseUtils.promiseWorks(AddonModAssignOffline.getSubmission(this.assign.id, this.userId));
CoreAnalytics.logEvent({
type: CoreAnalyticsEventType.VIEW_ITEM,
@ -343,7 +344,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
this.hasOffline,
);
} catch (error) {
if (this.allowOffline && !this.saveOffline && !CoreUtils.isWebServiceError(error)) {
if (this.allowOffline && !this.saveOffline && !CoreWSError.isWebServiceError(error)) {
// Cannot submit in online, prepare for offline usage.
this.saveOffline = true;

View File

@ -27,7 +27,7 @@ import {
AddonModAssignSubmissionStatusValues,
} from './assign';
import { AddonModAssignOffline } from './assign-offline';
import { CoreUtils } from '@services/utils/utils';
import { CoreObject } from '@singletons/object';
import { CoreFile } from '@services/file';
import { CoreCourseCommonModWSOptions } from '@features/course/services/course';
import { CoreGroups } from '@services/groups';
@ -37,6 +37,7 @@ import { makeSingleton } from '@singletons';
import { CoreFormFields } from '@singletons/form';
import { CoreFileEntry } from '@services/file-helper';
import { ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Service that provides some helper functions for assign.
@ -81,7 +82,7 @@ export class AddonModAssignHelperProvider {
return true;
}
if (await CoreUtils.promiseWorks(AddonModAssignOffline.getSubmission(assign.id, submission.userid))) {
if (await CorePromiseUtils.promiseWorks(AddonModAssignOffline.getSubmission(assign.id, submission.userid))) {
// Submission was saved or deleted offline, allow editing it or creating a new one.
return true;
}
@ -313,7 +314,7 @@ export class AddonModAssignHelperProvider {
await Promise.all(promises);
return CoreUtils.objectToArray(participantsIndexed);
return CoreObject.toArray(participantsIndexed);
}
/**
@ -530,7 +531,7 @@ export class AddonModAssignHelperProvider {
const promises = feedback.plugins.map((plugin) =>
this.prepareFeedbackPluginData(assign.id, userId, feedback).then(async (inputData) => {
const changed = await CoreUtils.ignoreErrors(
const changed = await CorePromiseUtils.ignoreErrors(
AddonModAssignFeedbackDelegate.hasPluginDataChanged(assign, submission, plugin, inputData, userId),
false,
);
@ -541,7 +542,7 @@ export class AddonModAssignHelperProvider {
return;
}));
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
return hasChanged;
}
@ -579,7 +580,7 @@ export class AddonModAssignHelperProvider {
}))
: [];
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
return hasChanged;
}

View File

@ -33,13 +33,14 @@ import {
} from './assign-offline';
import { CoreSync, CoreSyncResult } from '@services/sync';
import { CoreCourseLogHelper } from '@features/course/services/log-helper';
import { CoreUtils } from '@services/utils/utils';
import { CoreWSError } from '@classes/errors/wserror';
import { CoreNetwork } from '@services/network';
import { CoreNetworkError } from '@classes/errors/network-error';
import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper';
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_COMPONENT, ADDON_MOD_ASSIGN_MANUAL_SYNCED } from '../constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Service to sync assigns.
@ -189,7 +190,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
*/
protected async performSyncAssign(assignId: number, siteId: string): Promise<AddonModAssignSyncResult> {
// Sync offline logs.
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
CoreCourseLogHelper.syncActivity(ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId),
);
@ -207,7 +208,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
if (!submissions.length && !grades.length) {
// Nothing to sync.
await CoreUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
await CorePromiseUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
return result;
}
@ -246,15 +247,15 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
}
}));
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
if (result.updated) {
// Data has been sent to server. Now invalidate the WS calls.
await CoreUtils.ignoreErrors(AddonModAssign.invalidateContent(assign.cmid, courseId, siteId));
await CorePromiseUtils.ignoreErrors(AddonModAssign.invalidateContent(assign.cmid, courseId, siteId));
}
// Sync finished, set sync time.
await CoreUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
await CorePromiseUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
// All done, return the result.
return result;
@ -272,7 +273,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
siteId: string,
): Promise<AddonModAssignSubmissionsGradingDBRecordFormatted[]> {
// If no offline data found, return empty array.
return CoreUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissionsGrade(assignId, siteId), []);
return CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissionsGrade(assignId, siteId), []);
}
/**
@ -287,7 +288,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
siteId: string,
): Promise<AddonModAssignSubmissionsDBRecordFormatted[]> {
// If no offline data found, return empty array.
return CoreUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissions(assignId, siteId), []);
return CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissions(assignId, siteId), []);
}
/**
@ -359,7 +360,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
// Submission data sent, update cached data. No need to block the user for this.
AddonModAssign.getSubmissionStatus(assign.id, options);
} catch (error) {
if (!error || !CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Local error, reject.
throw error;
}
@ -508,9 +509,9 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
// Update cached data.
promises.push(AddonModAssign.getSubmissionStatus(assign.id, options));
await CoreUtils.allPromises(promises);
await CorePromiseUtils.allPromises(promises);
} catch (error) {
if (!error || !CoreUtils.isWebServiceError(error)) {
if (!CoreWSError.isWebServiceError(error)) {
// Local error, reject.
throw error;
}
@ -535,7 +536,7 @@ export type AddonModAssignSyncResult = CoreSyncResult & {
};
/**
* Data passed to AUTO_SYNCED event.
* Data passed to ADDON_MOD_ASSIGN_AUTO_SYNCED event.
*/
export type AddonModAssignAutoSyncData = {
assignId: number;
@ -544,9 +545,23 @@ export type AddonModAssignAutoSyncData = {
};
/**
* Data passed to MANUAL_SYNCED event.
* Data passed to ADDON_MOD_ASSIGN_MANUAL_SYNCED event.
*/
export type AddonModAssignManualSyncData = AddonModAssignAutoSyncData & {
context: string;
submitId?: number;
};
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 {
[ADDON_MOD_ASSIGN_MANUAL_SYNCED]: AddonModAssignManualSyncData;
[ADDON_MOD_ASSIGN_AUTO_SYNCED]: AddonModAssignAutoSyncData;
}
}

View File

@ -24,23 +24,19 @@ import { CoreTimeUtils } from '@services/utils/time';
import { CoreCourseLogHelper } from '@features/course/services/log-helper';
import { CoreError } from '@classes/errors/error';
import { CoreNetwork } from '@services/network';
import { CoreUtils } from '@services/utils/utils';
import { AddonModAssignOffline } from './assign-offline';
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
import { CoreComments } from '@features/comments/services/comments';
import { AddonModAssignSubmissionFormatted } from './assign-helper';
import { CoreWSError } from '@classes/errors/wserror';
import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData } from './assign-sync';
import { CoreFormFields } from '@singletons/form';
import { CoreFileHelper } from '@services/file-helper';
import { CoreIonicColorNames } from '@singletons/colors';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { ContextLevel } from '@/core/constants';
import { ContextLevel, CoreCacheUpdateFrequency } from '@/core/constants';
import {
ADDON_MOD_ASSIGN_AUTO_SYNCED,
ADDON_MOD_ASSIGN_COMPONENT,
ADDON_MOD_ASSIGN_GRADED_EVENT,
ADDON_MOD_ASSIGN_MANUAL_SYNCED,
ADDON_MOD_ASSIGN_STARTED_EVENT,
ADDON_MOD_ASSIGN_SUBMISSION_REMOVED_EVENT,
ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
@ -60,8 +56,6 @@ declare module '@singletons/events' {
[ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT]: AddonModAssignSubmittedForGradingEventData;
[ADDON_MOD_ASSIGN_GRADED_EVENT]: AddonModAssignGradedEventData;
[ADDON_MOD_ASSIGN_STARTED_EVENT]: AddonModAssignStartedEventData;
[ADDON_MOD_ASSIGN_MANUAL_SYNCED]: AddonModAssignManualSyncData;
[ADDON_MOD_ASSIGN_AUTO_SYNCED]: AddonModAssignAutoSyncData;
}
}
@ -174,7 +168,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getAssignmentCacheKey(courseId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
updateFrequency: CoreCacheUpdateFrequency.RARELY,
component: ADDON_MOD_ASSIGN_COMPONENT,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets.
};
@ -246,7 +240,7 @@ export class AddonModAssignProvider {
};
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getAssignmentUserMappingsCacheKey(assignId),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
@ -456,7 +450,7 @@ export class AddonModAssignProvider {
};
const preSets: CoreSiteWSPreSets = {
cacheKey: this.getSubmissionsCacheKey(assignId),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
@ -654,7 +648,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = {
cacheKey: this.listParticipantsCacheKey(assignId, groupId),
updateFrequency: CoreSite.FREQUENCY_OFTEN,
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
@ -1025,7 +1019,7 @@ export class AddonModAssignProvider {
return true;
} catch (error) {
if (allowOffline && error && !CoreUtils.isWebServiceError(error)) {
if (allowOffline && error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {
@ -1135,7 +1129,7 @@ export class AddonModAssignProvider {
return true;
} catch (error) {
if (error && !CoreUtils.isWebServiceError(error)) {
if (error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {
@ -1243,7 +1237,7 @@ export class AddonModAssignProvider {
return true;
} catch (error) {
if (error && !CoreUtils.isWebServiceError(error)) {
if (error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {
@ -1384,7 +1378,7 @@ export class AddonModAssignProvider {
return true;
} catch (error) {
if (error && !CoreUtils.isWebServiceError(error)) {
if (error && !CoreWSError.isWebServiceError(error)) {
// Couldn't connect to server, store in offline.
return storeOffline();
} else {

View File

@ -27,7 +27,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/
import { CoreCourse, CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course';
import { CoreWSFile } from '@services/ws';
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../assign-helper';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { CoreFilepool } from '@services/filepool';
import { CoreGroups } from '@services/groups';
import { AddonModAssignSync, AddonModAssignSyncResult } from '../assign-sync';
@ -252,7 +252,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
if (blindMarking) {
promises.push(
CoreUtils.ignoreErrors(AddonModAssign.getAssignmentUserMappings(assign.id, -1, modOptions)),
CorePromiseUtils.ignoreErrors(AddonModAssign.getAssignmentUserMappings(assign.id, -1, modOptions)),
);
}
@ -260,7 +260,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
promises.push(CoreCourse.getModuleBasicInfoByInstance(assign.id, 'assign', { siteId }));
// Get course data, needed to determine upload max size if it's configured to be course limit.
promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
promises.push(CorePromiseUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
// Download intro files and attachments. Do not call getFiles because it'd call some WS twice.
let files: CoreWSFile[] = assign.introattachments || [];

View File

@ -17,10 +17,11 @@ import { CoreCourseHelper } from '@features/course/services/course-helper';
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
import { CoreUrl } from '@singletons/url';
import { CoreUtils } from '@services/utils/utils';
import { CoreUtils } from '@singletons/utils';
import { makeSingleton } from '@singletons';
import { AddonModAssign } from '../assign';
import { ADDON_MOD_ASSIGN_FEATURE_NAME } from '../../constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Handler for assign push notifications clicks.
@ -54,7 +55,7 @@ export class AddonModAssignPushClickHandlerService implements CorePushNotificati
const courseId = Number(notification.courseid);
const moduleId = Number(contextUrlParams.id);
await CoreUtils.ignoreErrors(AddonModAssign.invalidateContent(moduleId, courseId, notification.site));
await CorePromiseUtils.ignoreErrors(AddonModAssign.invalidateContent(moduleId, courseId, notification.site));
await CoreCourseHelper.navigateToModule(moduleId, {
courseId,
siteId: notification.site,

View File

@ -18,7 +18,7 @@ import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offlin
import { Component, OnInit } from '@angular/core';
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { CoreFileSession } from '@services/file-session';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { AddonModAssignSubmissionFileHandlerService } from '../services/handler';
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
@ -54,7 +54,7 @@ export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmiss
: undefined;
// Get the offline data.
const offlineData = await CoreUtils.ignoreErrors(
const offlineData = await CorePromiseUtils.ignoreErrors(
AddonModAssignOffline.getSubmission(this.assign.id),
undefined,
);
@ -67,7 +67,7 @@ export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmiss
// It has offline data.
let offlineFiles: FileEntry[] = [];
if (offlineDataFiles.offline) {
offlineFiles = <FileEntry[]>await CoreUtils.ignoreErrors(
offlineFiles = <FileEntry[]>await CorePromiseUtils.ignoreErrors(
AddonModAssignHelper.getStoredSubmissionFiles(
this.assign.id,
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,

View File

@ -25,13 +25,13 @@ import { Injectable, Type } from '@angular/core';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
import { CoreFileSession } from '@services/file-session';
import { CoreUtils } from '@services/utils/utils';
import { CoreFileUtils } from '@singletons/file-utils';
import { CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonModAssignSubmissionFileComponent } from '../component/file';
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
import { CorePromiseUtils } from '@singletons/promise-utils';
/**
* Handler for file submission plugin.
@ -101,7 +101,9 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
/**
* @inheritdoc
*/
getComponent(): Type<AddonModAssignSubmissionPluginBaseComponent> {
async getComponent(): Promise<Type<AddonModAssignSubmissionPluginBaseComponent>> {
const { AddonModAssignSubmissionFileComponent } = await import('../component/file');
return AddonModAssignSubmissionFileComponent;
}
@ -116,7 +118,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
siteId?: string,
): Promise<void> {
await CoreUtils.ignoreErrors(
await CorePromiseUtils.ignoreErrors(
AddonModAssignHelper.deleteStoredSubmissionFiles(
assign.id,
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,
@ -174,7 +176,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
submission: AddonModAssignSubmission,
plugin: AddonModAssignPlugin,
): Promise<boolean> {
const offlineData = await CoreUtils.ignoreErrors(
const offlineData = await CorePromiseUtils.ignoreErrors(
// Check if there's any offline data.
AddonModAssignOffline.getSubmission(assign.id, submission.userid),
undefined,
@ -240,7 +242,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
// Data has changed, we need to upload new files and re-upload all the existing files.
const currentFiles = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
const error = CoreUtils.hasRepeatedFilenames(currentFiles);
const error = CoreFileUtils.hasRepeatedFilenames(currentFiles);
if (error) {
throw error;
@ -302,7 +304,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
if (filesData.offline) {
// Has offline files, get them and add them to the list.
const storedFiles = <FileEntry[]> await CoreUtils.ignoreErrors(
const storedFiles = <FileEntry[]> await CorePromiseUtils.ignoreErrors(
AddonModAssignHelper.getStoredSubmissionFiles(
assign.id,
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,

View File

@ -19,7 +19,7 @@ import { Component, OnInit, ElementRef } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms';
import { CoreSites } from '@services/sites';
import { CoreText } from '@singletons/text';
import { CoreUtils } from '@services/utils/utils';
import { CorePromiseUtils } from '@singletons/promise-utils';
import { AddonModAssignSubmissionOnlineTextPluginData } from '../services/handler';
import { ContextLevel } from '@/core/constants';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
@ -60,7 +60,7 @@ export class AddonModAssignSubmissionOnlineTextComponent extends AddonModAssignS
*/
async ngOnInit(): Promise<void> {
// Get the text. Check if we have anything offline.
const offlineData = await CoreUtils.ignoreErrors(
const offlineData = await CorePromiseUtils.ignoreErrors(
AddonModAssignOffline.getSubmission(this.assign.id),
undefined,
);

Some files were not shown because too many files have changed in this diff Show More