ClassroomProvider.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import React, { useState, useEffect, useRef, createContext, useContext, useMemo } from 'react';
  2. import { useParams } from 'react-router';
  3. import { useClassroom , Role } from './useClassroom.ts';
  4. import { User } from '../../../share/types.ts';
  5. type ClassroomContextType = ReturnType<typeof useClassroom>;
  6. const ClassroomContext = createContext<ClassroomContextType | null>(null);
  7. export const ClassroomProvider: React.FC<{children: React.ReactNode, user: User}> = ({ children, user }) => {
  8. const classroom = useClassroom({ user });
  9. const { id: classId, role: pathRole } = useParams();
  10. useEffect(() => {
  11. if (classId) {
  12. classroom.setClassId(classId);
  13. }
  14. if (pathRole && (pathRole === Role.Teacher || pathRole === Role.Student)) {
  15. classroom.setRole(pathRole === Role.Teacher ? Role.Teacher : Role.Student);
  16. }
  17. }, [classId, pathRole]);
  18. return (
  19. <ClassroomContext.Provider value={classroom}>
  20. {children}
  21. </ClassroomContext.Provider>
  22. );
  23. };
  24. export const useClassroomContext = () => {
  25. const context = useContext(ClassroomContext);
  26. if (!context) {
  27. throw new Error('useClassroomContext must be used within a ClassroomProvider');
  28. }
  29. return context;
  30. };