From e8e2b94b15d2c14d0b82c31b994dfb418580809f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Wed, 28 Jun 2023 11:40:26 +0200 Subject: [PATCH] MOBILE-4009 courses: Pass isGuest param on navigation --- .../pages/course-storage/course-storage.ts | 5 +- .../components/course-format/course-format.ts | 2 + .../course/pages/contents/contents.html | 2 +- .../course/pages/contents/contents.ts | 2 + src/core/features/course/pages/index/index.ts | 4 +- .../features/course/services/course-helper.ts | 51 +++++++++++++++++++ 6 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/addons/storagemanager/pages/course-storage/course-storage.ts b/src/addons/storagemanager/pages/course-storage/course-storage.ts index 7cc02bd19..2b0a4ff0a 100644 --- a/src/addons/storagemanager/pages/course-storage/course-storage.ts +++ b/src/addons/storagemanager/pages/course-storage/course-storage.ts @@ -25,6 +25,7 @@ import { CoreCourseModulePrefetchDelegate, CoreCourseModulePrefetchHandler } from '@features/course/services/module-prefetch-delegate'; import { CoreCourses } from '@features/courses/services/courses'; +import { CoreCoursesHelper } from '@features/courses/services/courses-helper'; import { CoreNavigator } from '@services/navigator'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; @@ -103,7 +104,9 @@ export class AddonStorageManagerCourseStoragePage implements OnInit, OnDestroy { this.title = Translate.instant('core.sitehome.sitehome'); } - this.isGuest = !!CoreNavigator.getRouteBooleanParam('isGuest'); + this.isGuest = CoreNavigator.getRouteBooleanParam('isGuest') ?? + (await CoreCourseHelper.courseUsesGuestAccessInfo(this.courseId)).guestAccess; + this.initialSectionId = CoreNavigator.getRouteNumberParam('sectionId'); this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); diff --git a/src/core/features/course/components/course-format/course-format.ts b/src/core/features/course/components/course-format/course-format.ts index 15d60a938..697cdd331 100644 --- a/src/core/features/course/components/course-format/course-format.ts +++ b/src/core/features/course/components/course-format/course-format.ts @@ -75,6 +75,7 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy { @Input() initialSectionId?: number; // The section to load first (by ID). @Input() initialSectionNumber?: number; // The section to load first (by number). @Input() moduleId?: number; // The module ID to scroll to. Must be inside the initial selected section. + @Input() isGuest?: boolean; // If user is accessing as a guest. // eslint-disable-next-line @typescript-eslint/no-explicit-any @ViewChildren(CoreDynamicComponent) dynamicComponents?: QueryList>; @@ -462,6 +463,7 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy { params: { title: this.course.fullname, sectionId: selectedId, + isGuest: this.isGuest, }, }, ); diff --git a/src/core/features/course/pages/contents/contents.html b/src/core/features/course/pages/contents/contents.html index ecafa525a..056ab073f 100644 --- a/src/core/features/course/pages/contents/contents.html +++ b/src/core/features/course/pages/contents/contents.html @@ -5,7 +5,7 @@ + [moduleId]="moduleId" class="core-course-format-{{course.format}}" *ngIf="dataLoaded && sections" [isGuest]="isGuest"> diff --git a/src/core/features/course/pages/contents/contents.ts b/src/core/features/course/pages/contents/contents.ts index 45a36e8c0..dac4a6212 100644 --- a/src/core/features/course/pages/contents/contents.ts +++ b/src/core/features/course/pages/contents/contents.ts @@ -64,6 +64,7 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy, CoreRefreshCon moduleId?: number; displayEnableDownload = false; displayRefresher = false; + isGuest?: boolean; protected formatOptions?: Record; protected completionObserver?: CoreEventObserver; @@ -92,6 +93,7 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy, CoreRefreshCon this.sectionId = CoreNavigator.getRouteNumberParam('sectionId'); this.sectionNumber = CoreNavigator.getRouteNumberParam('sectionNumber'); this.moduleId = CoreNavigator.getRouteNumberParam('moduleId'); + this.isGuest = CoreNavigator.getRouteBooleanParam('isGuest'); this.debouncedUpdateCachedCompletion = CoreUtils.debounce(() => { if (this.modulesHaveCompletion) { diff --git a/src/core/features/course/pages/index/index.ts b/src/core/features/course/pages/index/index.ts index 1f451a6e5..b472cdaff 100644 --- a/src/core/features/course/pages/index/index.ts +++ b/src/core/features/course/pages/index/index.ts @@ -143,7 +143,9 @@ export class CoreCourseIndexPage implements OnInit, OnDestroy { this.firstTabName = CoreNavigator.getRouteParam('selectedTab'); this.module = CoreNavigator.getRouteParam('module'); - this.isGuest = !!CoreNavigator.getRouteBooleanParam('isGuest'); + this.isGuest = CoreNavigator.getRouteBooleanParam('isGuest') ?? + (!!this.course && (await CoreCourseHelper.courseUsesGuestAccessInfo(this.course.id)).guestAccess); + this.modNavOptions = CoreNavigator.getRouteParam('modNavOptions'); this.openModule = CoreNavigator.getRouteBooleanParam('openModule') ?? true; // If false, just scroll to module. if (!this.modNavOptions) { diff --git a/src/core/features/course/services/course-helper.ts b/src/core/features/course/services/course-helper.ts index 3931a5e5e..5032933cc 100644 --- a/src/core/features/course/services/course-helper.ts +++ b/src/core/features/course/services/course-helper.ts @@ -591,6 +591,57 @@ export class CoreCourseHelperProvider { await CoreDomUtils.confirmDownloadSize(sizeSum, undefined, undefined, undefined, undefined, alwaysConfirm); } + /** + * Check whether a course is accessed using guest access and if requires password to enter. + * + * @param courseId Course ID. + * @param siteId Site ID. If not defined, current site. + * @returns Promise resolved with guestAccess and passwordRequired booleans. + */ + async courseUsesGuestAccessInfo( + courseId: number, + siteId?: string, + ): Promise<{guestAccess: boolean; passwordRequired?: boolean}> { + try { + try { + // Check if user is enrolled. If enrolled, no guest access. + await CoreCourses.getUserCourse(courseId, false, siteId); + + return { guestAccess: false }; + } catch { + // Ignore errors. + } + + try { + // The user is not enrolled in the course. Use getCourses to see if it's an admin/manager and can see the course. + await CoreCourses.getCourse(courseId, siteId); + + return { guestAccess: false }; + } catch { + // Ignore errors. + } + + // Check if guest access is enabled. + const enrolmentMethods = await CoreCourses.getCourseEnrolmentMethods(courseId, siteId); + + const method = enrolmentMethods.find((method) => method.type === 'guest'); + + if (!method) { + return { guestAccess: false }; + } + + const info = await CoreCourses.getCourseGuestEnrolmentInfo(method.id); + + // Don't allow guest access if it requires a password and it's available. + return { + guestAccess: !!info.status && !info.passwordrequired, + passwordRequired: info.passwordrequired, + }; + } catch { + return { guestAccess: false }; + } + } + /** * Create and return a section for "All sections". *