feat: implement contributor editing for activities

This commit is contained in:
swve 2025-03-22 16:51:00 +01:00
parent 95c3550c42
commit b6059f8d5c
8 changed files with 164 additions and 82 deletions

View file

@ -12,8 +12,9 @@ import { LogIn, LogOut, ShoppingCart, AlertCircle, UserPen, ClockIcon } from 'lu
import Modal from '@components/Objects/StyledElements/Modal/Modal'
import CoursePaidOptions from './CoursePaidOptions'
import { checkPaidAccess } from '@services/payments/payments'
import { applyForContributor, getCourseContributors } from '@services/courses/courses'
import { applyForContributor } from '@services/courses/courses'
import toast from 'react-hot-toast'
import { useContributorStatus } from '../../../../hooks/useContributorStatus'
interface Author {
user: {
@ -192,7 +193,7 @@ const Actions = ({ courseuuid, orgslug, course }: CourseActionsProps) => {
const [isContributeLoading, setIsContributeLoading] = useState(false)
const [isModalOpen, setIsModalOpen] = useState(false)
const [hasAccess, setHasAccess] = useState<boolean | null>(null)
const [contributorStatus, setContributorStatus] = useState<'NONE' | 'PENDING' | 'ACTIVE' | 'INACTIVE'>('NONE')
const { contributorStatus } = useContributorStatus(courseuuid);
const isStarted = course.trail?.runs?.some(
(run) => run.status === 'STATUS_IN_PROGRESS' && run.course_id === course.id
@ -217,39 +218,6 @@ const Actions = ({ courseuuid, orgslug, course }: CourseActionsProps) => {
fetchLinkedProducts()
}, [course.id, course.org_id, session.data?.tokens?.access_token])
// Check if the current user is already a contributor
useEffect(() => {
const checkContributorStatus = async () => {
if (!session.data?.user) return
try {
const response = await getCourseContributors(
'course_' + courseuuid,
session.data?.tokens?.access_token
)
if (response && response.data) {
const currentUser = response.data.find(
(contributor: any) => contributor.user_id === session.data.user.id
)
if (currentUser) {
setContributorStatus(currentUser.authorship_status as 'PENDING' | 'ACTIVE' | 'INACTIVE')
} else {
setContributorStatus('NONE')
}
}
} catch (error) {
console.error('Failed to check contributor status:', error)
toast.error('Failed to check contributor status. Please try again later.')
}
}
if (session.data?.user) {
checkContributorStatus()
}
}, [courseuuid, session.data?.tokens?.access_token, session.data?.user])
useEffect(() => {
const checkAccess = async () => {
if (!session.data?.user) return
@ -337,7 +305,6 @@ const Actions = ({ courseuuid, orgslug, course }: CourseActionsProps) => {
}
await applyForContributor('course_' + courseuuid, data, session.data?.tokens?.access_token)
setContributorStatus('PENDING')
await revalidateTags(['courses'], orgslug)
toast.success('Your application to contribute has been submitted successfully', { id: loadingToast })
} catch (error) {

View file

@ -22,11 +22,22 @@ function EditorWrapper(props: EditorWrapperProps): JSX.Element {
let activity = props.activity
activity.content = content
toast.promise(updateActivity(activity, activity.activity_uuid, access_token), {
loading: 'Saving...',
success: <b>Activity saved!</b>,
error: <b>Could not save.</b>,
})
toast.promise(
updateActivity(activity, activity.activity_uuid, access_token).then(res => {
if (!res.success) {
throw res;
}
return res;
}),
{
loading: 'Saving...',
success: () => <b>Activity saved!</b>,
error: (err) => {
const errorMessage = err?.data?.detail || err?.data?.message || `Error ${err?.status}: Could not save`;
return <b>{errorMessage}</b>;
},
}
)
}