Skip to content

Commit

Permalink
fix: access to page function and shorts related session (#1335)
Browse files Browse the repository at this point in the history
  • Loading branch information
annarhughes authored Feb 18, 2025
1 parent be0cc2e commit aa92ccb
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 51 deletions.
2 changes: 1 addition & 1 deletion app/[locale]/shorts/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export default async function Page({ params }: { params: Params }) {
const relatedCourse = await getStoryblokStories(
locale,
{},
story?.content.related_session[0].content.course,
story?.content.related_session.content.course,
);

if (!story || !relatedCourse) {
Expand Down
4 changes: 2 additions & 2 deletions components/storyblok/StoryblokResourceShortPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export interface StoryblokResourceShortPageProps {
video: { url: string };
video_transcript: ISbRichtext;
page_sections: StoryblokPageSectionProps[];
related_session: ISbStoryData[];
related_session: ISbStoryData;
related_course: ISbStoryData;
related_content: StoryblokRelatedContentStory[];
related_exercises: string[];
Expand Down Expand Up @@ -124,7 +124,7 @@ const StoryblokResourceShortPage = (props: StoryblokResourceShortPageProps) => {
storyId,
name,
resourceProgress,
relatedSession: related_session[0],
relatedSession: related_session,
relatedCourse: related_course,
video,
video_transcript,
Expand Down
32 changes: 25 additions & 7 deletions components/storyblok/StoryblokSessionPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { SessionChat } from '@/components/session/SessionChat';
import { SessionCompleteButton } from '@/components/session/SessionCompleteButton';
import { SessionHeader } from '@/components/session/SessionHeader';
import { SessionVideo } from '@/components/session/SessionVideo';
import { Link as i18nLink } from '@/i18n/routing';
import { PROGRESS_STATUS } from '@/lib/constants/enums';
import { useTypedSelector } from '@/lib/hooks/store';
import { getChatAccess } from '@/lib/utils/getChatAccess';
Expand All @@ -17,13 +18,13 @@ import { RichTextOptions } from '@/lib/utils/richText';
import { columnStyle } from '@/styles/common';
import LinkIcon from '@mui/icons-material/Link';
import StarBorderIcon from '@mui/icons-material/StarBorder';
import { Box, Container } from '@mui/material';
import { Box, Container, Link } from '@mui/material';
import { ISbRichtext, ISbStoryData, storyblokEditable } from '@storyblok/react/rsc';
import { useTranslations } from 'next-intl';
import { useEffect, useState } from 'react';
import { render } from 'storyblok-rich-text-react-renderer';
import { ContentUnavailable } from '../common/ContentUnavailable';
import LoadingContainer from '../common/LoadingContainer';
import NoDataAvailable from '../common/NoDataAvailable';

const containerStyle = {
backgroundColor: 'secondary.light',
Expand Down Expand Up @@ -80,7 +81,7 @@ const StoryblokSessionPage = (props: StoryblokSessionPageProps) => {
const partnerAdmin = useTypedSelector((state) => state.partnerAdmin);
const courses = useTypedSelector((state) => state.courses);

const [incorrectAccess, setIncorrectAccess] = useState<boolean>();
const [userAccess, setUserAccess] = useState<boolean>();
const [sessionId, setSessionId] = useState<string>(); // database Session id
const [sessionProgress, setSessionProgress] = useState<PROGRESS_STATUS>(
PROGRESS_STATUS.NOT_STARTED,
Expand Down Expand Up @@ -110,9 +111,14 @@ const StoryblokSessionPage = (props: StoryblokSessionPageProps) => {

useEffect(() => {
const coursePartners = course.content.included_for_partners;
setIncorrectAccess(
!hasAccessToPage(isLoggedIn, false, coursePartners, partnerAccesses, partnerAdmin),
const userHasAccess = hasAccessToPage(
isLoggedIn,
false,
coursePartners,
partnerAccesses,
partnerAdmin,
);
setUserAccess(userHasAccess);
}, [
isAlternateSessionPage,
partnerAccesses,
Expand All @@ -125,8 +131,20 @@ const StoryblokSessionPage = (props: StoryblokSessionPageProps) => {
getSessionCompletion(course, courses, storyId, setSessionProgress, setSessionId);
}, [courses, course, storyId, storyUuid]);

if (incorrectAccess === undefined) return <LoadingContainer />;
if (!!incorrectAccess) return <NoDataAvailable />;
if (userAccess === undefined) return <LoadingContainer />;
if (!userAccess)
return (
<ContentUnavailable
title={t('accessGuard.title')}
message={t.rich('accessGuard.introduction', {
contactLink: (children) => (
<Link component={i18nLink} href="/courses">
{children}
</Link>
),
})}
/>
);

return (
<Box
Expand Down
1 change: 0 additions & 1 deletion lib/storyblok.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ export const getStoryblokStory = async (
version: 'published',
language: locale || 'en',
...(params && params),
...(uuids && { by_uuids: uuids }),
};

try {
Expand Down
10 changes: 5 additions & 5 deletions lib/utils/hasAccessToPage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,19 @@ describe('hasAccessToPage', () => {
hasAccessToPage(true, false, ['Public'], [partnerAccess], emptyPartnerAdmin),
).toEqual(false);
});
it('a public user with partner referall should have access', () => {
it('a public user with partner referral should not access', () => {
expect(hasAccessToPage(true, false, ['Public'], [], emptyPartnerAdmin, 'Bumble')).toEqual(
true,
false,
);
});
});
describe('if courses are for partner users only', () => {
it('a public user should not have access', () => {
expect(hasAccessToPage(true, false, ['Bumble'], [], emptyPartnerAdmin)).toEqual(false);
});
it('a public user with a referral partner should not have access', () => {
expect(hasAccessToPage(true, false, ['Bumble'], [], emptyPartnerAdmin, 'bumble')).toEqual(
false,
it('a public user with a referral partner should have access', () => {
expect(hasAccessToPage(false, true, ['Bumble'], [], emptyPartnerAdmin, 'bumble')).toEqual(
true,
);
});
it('a partner user should have access', () => {
Expand Down
54 changes: 19 additions & 35 deletions lib/utils/hasAccessToPage.ts
Original file line number Diff line number Diff line change
@@ -1,54 +1,38 @@
import { PartnerAccesses } from '@/lib/store/partnerAccessSlice';
import { PartnerAdmin } from '@/lib/store/partnerAdminSlice';

const hasAccessToPage = (
export default function hasAccessToPage(
loggedIn: boolean,
availablePreLogin: boolean,
partnersWithAccess: Array<string>,
partnerAccesses: PartnerAccesses,
partnerAdmin: PartnerAdmin,
referralPartner?: string | null,
) => {
// if page is available prelogin
): boolean {
if (!availablePreLogin && !loggedIn) {
return false;
}

if (availablePreLogin && !loggedIn) {
// if available to bumble and has referal partner in local storage return true
const referralPartnerCapitalized =
referralPartner && referralPartner?.charAt(0).toUpperCase() + referralPartner?.slice(1);
if (referralPartnerCapitalized && partnersWithAccess.includes(referralPartnerCapitalized)) {
return true;
}
// if available to general public and has no referral partner in local storage return true
if (partnersWithAccess.includes('Public') && !referralPartner) {
const isPublicUser = !partnerAccesses.length && !partnerAdmin.id && !referralPartner;

if (isPublicUser) {
if (partnersWithAccess.includes('Public')) {
return true;
}
return false;
}
if (!availablePreLogin && !loggedIn) {
return false;
}

const isPublicUser = (partnerAccesses !== null && partnerAccesses.length) === 0;
// determine if public user has access
if (isPublicUser && partnersWithAccess.includes('Public')) {
return true;
if (!loggedIn) {
const referralPartnerCapitalized =
referralPartner && referralPartner?.charAt(0).toUpperCase() + referralPartner?.slice(1);
return !!referralPartnerCapitalized && partnersWithAccess.includes(referralPartnerCapitalized);
}
// determine if partner admin has access
if (partnerAdmin.partner?.name && partnersWithAccess.includes(partnerAdmin.partner?.name)) {

if (partnerAdmin.partner?.name && partnersWithAccess.includes(partnerAdmin.partner.name)) {
return true;
}
// determine if partner user has access
const isPartnerUserWithAccess = partnerAccesses.reduce<boolean>(
(hasAccessAlready, partnerAccess) => {
if (hasAccessAlready) return hasAccessAlready;
if (partnersWithAccess.includes(partnerAccess.partner.name)) {
return true;
}
return false;
},
false,
);
return isPartnerUserWithAccess;
};

export default hasAccessToPage;
return partnerAccesses.some((partnerAccess) =>
partnersWithAccess.includes(partnerAccess.partner.name),
);
}

0 comments on commit aa92ccb

Please sign in to comment.