import { useCourse, useCourseDispatch } from '@components/Contexts/CourseContext' import LinkToUserGroup from '@components/Objects/Modals/Dash/EditCourseAccess/LinkToUserGroup' import ConfirmationModal from '@components/Objects/StyledElements/ConfirmationModal/ConfirmationModal' import Modal from '@components/Objects/StyledElements/Modal/Modal' import { getAPIUrl } from '@services/config/config' import { unLinkResourcesToUserGroup } from '@services/usergroups/usergroups' import { swrFetcher } from '@services/utils/ts/requests' import { Globe, SquareUserRound, Users, X } from 'lucide-react' import { useLHSession } from '@components/Contexts/LHSessionContext' import React, { useEffect, useState } from 'react' import toast from 'react-hot-toast' import useSWR, { mutate } from 'swr' type EditCourseAccessProps = { orgslug: string course_uuid?: string } function EditCourseAccess(props: EditCourseAccessProps) { const session = useLHSession() as any; const access_token = session?.data?.tokens?.access_token; const course = useCourse() as any; const { isLoading, courseStructure } = course as any; const dispatchCourse = useCourseDispatch() as any; const { data: usergroups } = useSWR(courseStructure ? `${getAPIUrl()}usergroups/resource/${courseStructure.course_uuid}` : null, (url) => swrFetcher(url, access_token)); const [isClientPublic, setIsClientPublic] = useState(undefined); useEffect(() => { if (!isLoading && courseStructure?.public !== undefined) { setIsClientPublic(courseStructure.public); } }, [isLoading, courseStructure]); useEffect(() => { if (!isLoading && courseStructure?.public !== undefined && isClientPublic !== undefined) { if (isClientPublic !== courseStructure.public) { dispatchCourse({ type: 'setIsNotSaved' }); const updatedCourse = { ...courseStructure, public: isClientPublic, }; dispatchCourse({ type: 'setCourseStructure', payload: updatedCourse }); } } }, [isLoading, isClientPublic, courseStructure, dispatchCourse]); return (
{courseStructure && (

Access to the course

Choose if you want your course to be publicly available on the internet or only accessible to signed in users

{isClientPublic && (
Active
)}
Public
The Course is publicly available on the internet, it is indexed by search engines and can be accessed by anyone
} functionToExecute={() => setIsClientPublic(true)} status="info" /> {!isClientPublic && (
Active
)}
Users Only
The Course is only accessible to signed in users, additionally you can choose which UserGroups can access this course
} functionToExecute={() => setIsClientPublic(false)} status="info" />
{!isClientPublic && }
)} ); } function UserGroupsSection({ usergroups }: { usergroups: any[] }) { const course = useCourse() as any; const [userGroupModal, setUserGroupModal] = useState(false); const session = useLHSession() as any; const access_token = session?.data?.tokens?.access_token; const removeUserGroupLink = async (usergroup_id: number) => { try { const res = await unLinkResourcesToUserGroup(usergroup_id, course.courseStructure.course_uuid, access_token); if (res.status === 200) { toast.success('Successfully unlinked from usergroup'); mutate(`${getAPIUrl()}usergroups/resource/${course.courseStructure.course_uuid}`); } else { toast.error(`Error ${res.status}: ${res.data.detail}`); } } catch (error) { toast.error('An error occurred while unlinking the user group.'); } }; return ( <>

UserGroups

You can choose to give access to this course to specific groups of users only by linking it to a UserGroup

{usergroups?.map((usergroup: any) => ( ))}
Name Actions
{usergroup.name} Delete link } functionToExecute={() => removeUserGroupLink(usergroup.id)} status="warning" />
setUserGroupModal(!userGroupModal)} minHeight="no-min" minWidth="md" dialogContent={} dialogTitle="Link Course to a UserGroup" dialogDescription="Choose a UserGroup to link this course to. Users from this UserGroup will have access to this course." dialogTrigger={ } />
); } export default EditCourseAccess;