From b185c0fc4583f25d2615904677848142be1cba12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 18 Feb 2022 15:49:07 +0100 Subject: [PATCH] MOBILE-3814 module: Add prefetch status on module activity cards --- .../components/module/core-course-module.html | 2 + .../course/components/module/module.scss | 1 + .../course/components/module/module.ts | 72 ++++++++++++++++++- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/core/features/course/components/module/core-course-module.html b/src/core/features/course/components/module/core-course-module.html index e1048efe5..579f101e5 100644 --- a/src/core/features/course/components/module/core-course-module.html +++ b/src/core/features/course/components/module/core-course-module.html @@ -17,6 +17,8 @@ +

diff --git a/src/core/features/course/components/module/module.scss b/src/core/features/course/components/module/module.scss index da557da41..c4fd942bd 100644 --- a/src/core/features/course/components/module/module.scss +++ b/src/core/features/course/components/module/module.scss @@ -13,6 +13,7 @@ .core-module-title .item-heading ion-icon { @include margin-horizontal(8px, null); + vertical-align: middle; } .core-module-buttons, diff --git a/src/core/features/course/components/module/module.ts b/src/core/features/course/components/module/module.ts index 0761f2ad6..478dc0b62 100644 --- a/src/core/features/course/components/module/module.ts +++ b/src/core/features/course/components/module/module.ts @@ -22,6 +22,12 @@ import { } from '@features/course/services/course-helper'; import { CoreCourse } from '@features/course/services/course'; import { CoreCourseModuleDelegate, CoreCourseModuleHandlerButton } from '@features/course/services/module-delegate'; +import { + CoreCourseModulePrefetchDelegate, + CoreCourseModulePrefetchHandler, +} from '@features/course/services/module-prefetch-delegate'; +import { CoreConstants } from '@/core/constants'; +import { CoreEventObserver, CoreEvents } from '@singletons/events'; /** * Component to display a module entry in a list of modules. @@ -47,11 +53,16 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy { hasInfo = false; showLegacyCompletion = false; // Whether to show module completion in the old format. showManualCompletion = false; // Whether to show manual completion when completion conditions are disabled. + prefetchStatusIcon = ''; // Module prefetch status icon. + prefetchStatusText = ''; // Module prefetch status text. + protected prefetchHandler?: CoreCourseModulePrefetchHandler; + + protected moduleStatusObserver?: CoreEventObserver; /** - * Component being initialized. + * @inheritdoc */ - ngOnInit(): void { + async ngOnInit(): Promise { this.modNameTranslated = CoreCourse.translateModuleName(this.module.modname) || ''; this.showLegacyCompletion = !CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('3.11'); this.checkShowManualCompletion(); @@ -70,6 +81,60 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy { (this.module.visible !== 0 && this.module.isStealth) || (this.module.availabilityinfo) ); + + if (this.module.handlerData?.showDownloadButton) { + const status = await CoreCourseModulePrefetchDelegate.getModuleStatus(this.module, this.module.course); + this.updateModuleStatus(status); + + // Listen for changes on this module status, even if download isn't enabled. + this.prefetchHandler = CoreCourseModulePrefetchDelegate.getPrefetchHandlerFor(this.module.modname); + if (!this.prefetchHandler) { + return; + } + + this.moduleStatusObserver = CoreEvents.on(CoreEvents.PACKAGE_STATUS_CHANGED, (data) => { + if (this.module.id != data.componentId || data.component != this.prefetchHandler?.component) { + return; + } + + let status = data.status; + if (this.prefetchHandler.determineStatus) { + // Call determineStatus to get the right status to display. + status = this.prefetchHandler.determineStatus(this.module, status, true); + } + + // Update the status. + this.updateModuleStatus(status); + }, CoreSites.getCurrentSiteId()); + } + } + + /** + * Show module status. + * + * @param prefetchstatus Module status. + */ + protected updateModuleStatus(prefetchstatus: string): void { + if (!prefetchstatus) { + return; + } + + switch (prefetchstatus) { + case CoreConstants.OUTDATED: + this.prefetchStatusIcon = CoreConstants.ICON_OUTDATED; + this.prefetchStatusText = 'core.outdated'; + break; + case CoreConstants.DOWNLOADED: + this.prefetchStatusIcon = CoreConstants.ICON_DOWNLOADED; + this.prefetchStatusText = 'core.downloaded'; + break; + default: + this.prefetchStatusIcon = ''; + this.prefetchStatusText = ''; + break; + } + + this.module.handlerData?.updateStatus?.(prefetchstatus); } /** @@ -109,10 +174,11 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy { } /** - * Component destroyed. + * @inheritdoc */ ngOnDestroy(): void { this.module.handlerData?.onDestroy?.(); + this.moduleStatusObserver?.off(); } }