mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
94 lines
3.1 KiB
TypeScript
94 lines
3.1 KiB
TypeScript
'use client'
|
|
import React, { createContext, useContext, useEffect, useReducer } from 'react'
|
|
import { useLHSession } from '@components/Contexts/LHSessionContext'
|
|
import { getAssignmentTask } from '@services/courses/assignments'
|
|
import { useAssignments } from './AssignmentContext';
|
|
import { mutate } from 'swr';
|
|
import { getAPIUrl } from '@services/config/config';
|
|
|
|
interface State {
|
|
selectedAssignmentTaskUUID: string | null;
|
|
assignmentTask: Record<string, any>;
|
|
reloadTrigger: number;
|
|
}
|
|
|
|
interface Action {
|
|
type: string;
|
|
payload?: any;
|
|
}
|
|
|
|
const initialState: State = {
|
|
selectedAssignmentTaskUUID: null,
|
|
assignmentTask: {},
|
|
reloadTrigger: 0,
|
|
};
|
|
|
|
export const AssignmentsTaskContext = createContext<State | undefined>(undefined);
|
|
export const AssignmentsTaskDispatchContext = createContext<React.Dispatch<Action> | undefined>(undefined);
|
|
|
|
export function AssignmentsTaskProvider({ children }: { children: React.ReactNode }) {
|
|
const session = useLHSession() as any;
|
|
const access_token = session?.data?.tokens?.access_token;
|
|
const assignment = useAssignments() as any
|
|
|
|
const [state, dispatch] = useReducer(assignmentstaskReducer, initialState);
|
|
|
|
async function fetchAssignmentTask(assignmentTaskUUID: string) {
|
|
const res = await getAssignmentTask(assignmentTaskUUID, access_token);
|
|
|
|
|
|
if (res.success) {
|
|
dispatch({ type: 'setAssignmentTask', payload: res.data });
|
|
}
|
|
}
|
|
|
|
useEffect(() => {
|
|
|
|
if (state.selectedAssignmentTaskUUID) {
|
|
fetchAssignmentTask(state.selectedAssignmentTaskUUID);
|
|
mutate(`${getAPIUrl()}assignments/${assignment.assignment_object?.assignment_uuid}/tasks`);
|
|
}
|
|
}, [state.selectedAssignmentTaskUUID, state.reloadTrigger, assignment]);
|
|
|
|
return (
|
|
<AssignmentsTaskContext.Provider value={state}>
|
|
<AssignmentsTaskDispatchContext.Provider value={dispatch}>
|
|
{children}
|
|
</AssignmentsTaskDispatchContext.Provider>
|
|
</AssignmentsTaskContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useAssignmentsTask() {
|
|
const context = useContext(AssignmentsTaskContext);
|
|
if (context === undefined) {
|
|
throw new Error('useAssignmentsTask must be used within an AssignmentsTaskProvider');
|
|
}
|
|
return context;
|
|
}
|
|
|
|
export function useAssignmentsTaskDispatch() {
|
|
const context = useContext(AssignmentsTaskDispatchContext);
|
|
if (context === undefined) {
|
|
throw new Error('useAssignmentsTaskDispatch must be used within an AssignmentsTaskProvider');
|
|
}
|
|
return context;
|
|
}
|
|
|
|
function assignmentstaskReducer(state: State, action: Action): State {
|
|
switch (action.type) {
|
|
case 'setSelectedAssignmentTaskUUID':
|
|
return { ...state, selectedAssignmentTaskUUID: action.payload };
|
|
case 'setAssignmentTask':
|
|
return { ...state, assignmentTask: action.payload };
|
|
case 'reload':
|
|
return { ...state, reloadTrigger: state.reloadTrigger + 1 };
|
|
case 'SET_MULTIPLE_STATES':
|
|
return {
|
|
...state,
|
|
...action.payload,
|
|
};
|
|
default:
|
|
return state;
|
|
}
|
|
}
|