EscolaLMS/sdk

View on GitHub
src/react/context/types.ts

Summary

Maintainability
F
1 wk
Test Coverage
import { RequestOptionsInit } from "umi-request";
import * as API from "./../../types/api";

export interface ContextState<T> {
  loading: boolean;
  filter?: API.CourseParams;
  list: T[];
}

export interface ContextPaginatedMetaState<T> {
  loading: boolean;
  list?: API.PaginatedMetaList<T>;
  error?: API.DefaultResponseError;
}

export interface ContextPaginatedState<T> {
  loading: boolean;
  list?: API.PaginatedList<T>;
  error?: API.DefaultResponseError;
}

export interface ContextListState<T> {
  loading: boolean;
  list?: T[];
  error?: API.DefaultResponseError;
}

export interface ContextStateValue<T> {
  loading: boolean;
  value?: T;
  error?: API.DefaultResponseError;
  byId?: Record<
    number | string,
    { loading: boolean; value?: T; error?: API.DefaultResponseError }
  >;
}

export interface EscolaLMSContextReadConfig {
  token?: string | null;
  courses: ContextPaginatedMetaState<API.CourseListItem>;
  challenges: ContextPaginatedMetaState<API.CompetencyChallenge>;
  userGroup: ContextStateValue<API.UserGroup>;
  userGroups: ContextPaginatedMetaState<API.UserGroup>;
  registerableGroups: ContextListState<API.UserGroup>;
  course: ContextStateValue<API.CourseListItem>;
  program: ContextStateValue<API.CourseProgram>;
  settings: ContextStateValue<API.AppSettings>;
  config: ContextStateValue<API.AppConfig>;
  uniqueTags: ContextListState<API.Tag>;
  categoryTree: ContextListState<API.Category>;
  user: ContextStateValue<API.UserAsProfile>;
  cart: ContextStateValue<API.Cart>;
  progress: ContextStateValue<API.CourseProgress>;
  paginatedProgress: ContextPaginatedMetaState<API.CourseProgressItem>;
  myAuthoredCourses: ContextPaginatedMetaState<API.Course>;
  courseProgressDetails: ContextStateValue<API.CourseProgressDetails>;
  tutors: ContextListState<API.UserItem>;
  tutor: ContextStateValue<API.UserItem>;
  orders: ContextPaginatedMetaState<API.Order>;
  payments: ContextPaginatedMetaState<API.Payment>;
  certificates: ContextPaginatedMetaState<API.Certificate>;
  mattermostChannels: ContextStateValue<API.MattermostData>;
  pages: ContextPaginatedMetaState<API.PageListItem>;
  page: ContextStateValue<API.Page>;
  notifications: ContextPaginatedMetaState<API.Notification>;
  h5p: ContextStateValue<API.H5PObject>;
  tokenExpireDate?: string | null;
  consultations: ContextPaginatedMetaState<API.Consultation>;
  consultation: ContextStateValue<API.Consultation>;
  fields: ContextListState<API.Metadata>;
  stationaryEvents: ContextPaginatedMetaState<API.StationaryEvent>;
  userConsultations: ContextPaginatedMetaState<API.Consultation>;
  webinars: ContextPaginatedMetaState<API.Webinar>;
  tutorConsultations: ContextPaginatedMetaState<API.AppointmentTerm>;
  events: ContextPaginatedMetaState<API.Event>;
  webinar: ContextStateValue<API.Webinar>;
  stationaryEvent: ContextStateValue<API.StationaryEvent>;
  userWebinars: ContextListState<API.Webinar>;
  products: ContextPaginatedMetaState<API.Product>;
  userProducts: ContextPaginatedMetaState<API.Product>;
  product: ContextStateValue<API.Product>;
  userStationaryEvents: ContextListState<API.StationaryEvent>;
  tasks: ContextPaginatedMetaState<API.Task>;
  task: ContextStateValue<API.Task>;
  challenge: ContextStateValue<API.CompetencyChallenge>;
  courseAccess: ContextPaginatedMetaState<API.CourseAccessEnquiry>;
  myCourses: ContextStateValue<number[]>;
  consultationAccess: ContextPaginatedMetaState<API.ConsultationsAccessEnquiry>;
  consultationAccessEnquiry: ContextStateValue<API.ConsultationsAccessEnquiry>;
  bookmarkNotes: ContextPaginatedMetaState<API.BookmarkNote>;
  subjects: ContextPaginatedMetaState<API.GroupSubject>;
  schedule: ContextListState<API.ScheduleData>;
  scheduleTutors: ContextListState<API.LessonTutor>;
  attendances: ContextStateValue<API.Attendance[]>;
  exams: ContextStateValue<API.Exam[]>;
  semesters: ContextListState<API.SemesterData>;
  academicYears: ContextListState<API.AcademicYear>;
  dictionariesWords: ContextPaginatedMetaState<API.DictionariesWords>;
  dictionariesWord: ContextStateValue<API.DictionariesWords>;
  dictionariesAccess: ContextStateValue<API.DictionariesAccess>;
  dictionariesWordsCategories: ContextListState<API.DictionariesWordsCategory>;
}

export interface EscolaLMSContextAPIConfig {
  apiUrl: string;
  getImagePrefix: () => string;
  getImageSvgPrefix: () => string;
  fetchCourses: (
    filter: API.CourseParams
  ) => Promise<API.DefaultMetaResponse<API.Course>>;
  fetchChallenges: (
    filter: API.ChallengesParams
  ) => Promise<API.DefaultMetaResponse<API.CompetencyChallenge>>;

  fetchUserGroup: (
    id: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.UserGroup>
    | API.DefaultMetaResponse<API.UserGroup>
  >;
  fetchUserGroups: (
    params: API.UserGroupsParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.UserGroup>
    | API.DefaultMetaResponse<API.UserGroup>
  >;
  fetchRegisterableGroups: () => Promise<
    | void
    | API.DefaultResponse<API.UserGroup>
    | API.DefaultMetaResponse<API.UserGroup>
  >;
  fetchCourse: (id: number) => Promise<API.DefaultResponse<API.Course>>;
  fetchProgram: (id: number) => Promise<API.DefaultResponse<API.CourseProgram>>;
  fetchConfig: () => Promise<
    | void
    | API.DefaultResponse<API.AppConfig>
    | API.DefaultMetaResponse<API.AppConfig>
  >;
  fetchSettings: () => Promise<
    | void
    | API.DefaultResponse<API.AppSettings>
    | API.DefaultMetaResponse<API.AppSettings>
  >;
  fetchCategories: () => Promise<
    | void
    | API.DefaultResponse<API.Category>
    | API.DefaultMetaResponse<API.Category>
  >;
  fetchTags: () => Promise<
    void | API.DefaultResponse<API.Tag> | API.DefaultMetaResponse<API.Tag>
  >;
  login: (body: API.LoginRequest) => Promise<API.LoginResponse>;
  logout: () => Promise<void>;
  register: (
    body: API.RegisterRequest
  ) => Promise<API.DefaultResponse<API.RegisterResponse>>;
  forgot: (body: API.ForgotRequest) => Promise<API.AuthResponse>;
  reset: (body: API.ResetPasswordRequest) => Promise<API.AuthResponse>;
  emailVerify: (id: string, hash: string) => Promise<API.AuthResponse>;
  initAccountDelete: (returnUrl: string) => Promise<API.AuthResponse>;
  confirmAccountDelete: (
    userId: string,
    deleteToken: string
  ) => Promise<API.AuthResponse>;
  addToCart: (id: number, quantity?: number) => Promise<API.AddProductResponse>;
  addMissingProducts: (products: number[]) => Promise<void>;
  removeFromCart: (courseId: number) => Promise<void>;
  fetchCart: () => Promise<
    void | API.DefaultResponse<API.Cart> | API.DefaultMetaResponse<API.Cart>
  >;
  resetCart: () => void;
  payWithStripe: (payment_method: string, return_url: string) => Promise<void>;
  payWithP24: (
    email: string,
    return_url: string,
    data?: API.InvoiceData
  ) => Promise<void>;
  subscriptionPayWithP24: (
    subId: number,
    email: string,
    return_url: string,
    data?: API.InvoiceData
  ) => Promise<void>;
  fetchProgress: () => Promise<
    | void
    | API.DefaultResponse<API.CourseProgress>
    | API.DefaultMetaResponse<API.CourseProgress>
  >;
  fetchPaginatedProgress: (
    filter: API.PaginatedProgressParams
  ) => Promise<API.DefaultMetaResponse<API.CourseProgressItem>>;
  fetchMyAuthoredCourses: (
    params?: API.PaginationParams
  ) => Promise<
    void | API.DefaultResponse<API.Course> | API.DefaultMetaResponse<API.Course>
  >;
  fetchCourseProgress: (courseId: number) => Promise<void>;
  sendProgress: (
    courseId: number,
    data: API.CourseProgressItemElement[]
  ) => Promise<void>;
  h5pProgress: (
    courseId: string,
    topicId: number,
    statement: API.IStatement
  ) => Promise<API.SuccessResponse> | null;
  fetchTutors: () => Promise<
    | void
    | API.DefaultResponse<API.UserItem>
    | API.DefaultMetaResponse<API.UserItem>
  >;
  fetchTutor: (
    id: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.UserItem>
    | API.DefaultMetaResponse<API.UserItem>
  >;
  fetchOrders: (
    params?: API.PaginationParams & { status?: number }
  ) => Promise<
    void | API.DefaultResponse<API.Order> | API.DefaultMetaResponse<API.Order>
  >;
  fetchPayments: () => Promise<
    | void
    | API.DefaultResponse<API.Payment>
    | API.DefaultMetaResponse<API.Payment>
  >;
  fetchProfile: () => Promise<
    | void
    | API.DefaultResponse<API.UserAsProfile>
    | API.DefaultMetaResponse<API.UserAsProfile>
  >;
  fetchCertificates: (
    params?: API.CertificateParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.Certificate>
    | API.DefaultMetaResponse<API.Certificate>
  >;
  fetchCertificate: (
    id: number
  ) => Promise<API.DefaultResponse<API.Certificate>>;
  generateCertificate: (id: number) => Promise<Blob>;
  fetchMattermostChannels: () => Promise<
    | void
    | API.DefaultResponse<API.MattermostData>
    | API.DefaultMetaResponse<API.MattermostData>
  >;
  fetchPages: () => Promise<
    void | API.DefaultResponse<API.Page> | API.DefaultMetaResponse<API.Page>
  >;
  fetchPage: (
    slug: string
  ) => Promise<
    void | API.DefaultResponse<API.Page> | API.DefaultMetaResponse<API.Page>
  >;
  updateProfile: (
    data: API.UpdateUserDetails
  ) => Promise<API.DefaultResponse<API.UserAsProfile>>;
  updateProfileEmail: (
    data: API.UpdateUserEmail
  ) => Promise<API.DefaultResponse<API.UserAsProfile>>;
  updateAvatar: (
    avatar: File
  ) => Promise<API.DefaultResponse<API.UserAsProfile>>;
  topicPing: (topicId: number) => Promise<Boolean>;
  topicIsFinished: (topicId: number) => Boolean;
  getNextPrevTopic: (topicId: number, next?: boolean) => API.Topic | null;
  courseProgress: (courseId: number) => number;
  socialAuthorize: (token: string) => void;
  fetchNotifications: (
    filter?: API.PaginationParams
  ) => Promise<API.DefaultMetaResponse<API.Notification>>;
  readNotify: (id: string) => Promise<void>;
  readAllNotifications: () => Promise<void>;
  fetchH5P: (uuid: string) => void;
  getRefreshedToken: () => Promise<void>;
  fetchConsultations: (
    filter: API.ConsultationParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.Consultation>
    | API.DefaultMetaResponse<API.Consultation>
  >;
  fetchConsultation: (
    id: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.Consultation>
    | API.DefaultMetaResponse<API.Consultation>
  >;
  fetchUserConsultations: () => Promise<
    | void
    | API.DefaultResponse<API.Consultation>
    | API.DefaultMetaResponse<API.Consultation>
  >;
  fetchFields: (
    filter: API.FieldsParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.Metadata>
    | API.DefaultMetaResponse<API.Metadata>
  >;
  fetchStationaryEvents: (
    filter: API.StationaryEventsParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.StationaryEvent>
    | API.DefaultMetaResponse<API.StationaryEvent>
  >;
  fetchStationaryEvent: (
    id: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.StationaryEvent>
    | API.DefaultMetaResponse<API.StationaryEvent>
  >;
  bookConsultationTerm: (
    id: number,
    term: string
  ) => Promise<API.ScheduleConsultationResponse>;
  fetchProducts: (
    filter: API.PageParams &
      API.PaginationParams & {
        type?: string;
        "tags[]"?: string;
        name?: string;
        productable_type?: string;
      }
  ) => Promise<API.DefaultMetaResponse<API.Product>>;
  fetchMyProducts: (
    filter: API.PageParams &
      API.PaginationParams & {
        type?: string;
        "tags[]"?: string;
        name?: string;
        productable_type?: string;
      }
  ) => Promise<API.DefaultMetaResponse<API.Product>>;
  attachProduct: (
    productableId: number,
    productableType: string
  ) => Promise<API.DefaultResponse<null>>;
  cancelSubscription: (productId: number) => Promise<API.DefaultResponse<null>>;
  fetchProduct: (id: number) => Promise<API.DefaultResponse<API.Product>>;
  getProductInfo: (id: number) => Promise<API.DefaultResponse<API.Product>>;
  fetchWebinars: (
    filter: API.WebinarParams
  ) => Promise<API.DefaultMetaResponse<API.Webinar>>;
  fetchWebinar: (id: number) => Promise<API.DefaultResponse<API.Webinar>>;
  fetchEvents: (
    filter: API.EventsParams
  ) => Promise<
    void | API.DefaultResponse<API.Event> | API.DefaultMetaResponse<API.Event>
  >;
  fetchTutorConsultations: () => Promise<
    | void
    | API.DefaultResponse<API.AppointmentTerm>
    | API.DefaultMetaResponse<API.AppointmentTerm>
  >;
  approveConsultationTerm: (
    consultation: number,
    term: string,
    userId?: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.AppointmentTerm>
    | API.DefaultMetaResponse<API.AppointmentTerm>
  >;
  rejectConsultationTerm: (
    consultation: number,
    term: string,
    userId?: number
  ) => Promise<
    | void
    | API.DefaultResponse<API.AppointmentTerm>
    | API.DefaultMetaResponse<API.AppointmentTerm>
  >;
  changePassword: (
    body: API.ChangePasswordRequest
  ) => Promise<API.AuthResponse>;

  deleteAccount: () => Promise<API.AuthResponse>;
  generateConsultationJitsy: (
    consultation: number,
    term: string
  ) => Promise<API.DefaultResponse<API.JitsyData>>;
  generateWebinarJitsy: (
    webinarId: number
  ) => Promise<API.DefaultResponse<API.JitsyData>>;
  fetchUserWebinars: () => Promise<
    | void
    | API.DefaultResponse<API.Webinar>
    | API.DefaultMetaResponse<API.Webinar>
  >;
  realizeVoucher: (voucher: string) => Promise<API.AuthResponse>;
  createTeamsChat: (id: number) => Promise<API.TeamsChatResponse>;
  removeVoucher: () => Promise<API.AuthResponse>;
  fetchQuestionnaires: (
    model: string,
    id: number
  ) => Promise<API.DefaultMetaResponse<API.Questionnaire>>;
  fetchQuestionnaire: (
    modelTypeTitle: string,
    modelID: number,
    id: number
  ) => Promise<API.DefaultResponse<API.QuestionnaireAnswerResponse>>;
  fetchQuestionnaireStars: (
    modelTypeTitle: string,
    modelID: number,
    id: number
  ) => Promise<API.DefaultResponse<API.QuestionnaireStars>>;
  fetchQuestionnaireStarsByModel: (
    modelTypeTitle: string,
    modelID: number
  ) => Promise<API.DefaultResponse<API.QuestionnaireStarsModel>>;
  fetchQuestionnairesAnswers: (
    modelTypeTitle: string,
    modelID: number,
    id: number,
    params?: API.PaginationParams
  ) => Promise<API.DefaultMetaResponse<API.QuestionAnswer>>;
  sendQuestionnaireAnswer: (
    model: string,
    modelID: number,
    id: number,
    body: Partial<EscolaLms.Questionnaire.Models.QuestionAnswer>
  ) => Promise<
    API.DefaultResponse<EscolaLms.Questionnaire.Models.QuestionAnswer>
  >;
  fetchUserStationaryEvents: () => Promise<
    | void
    | API.DefaultResponse<API.StationaryEvent>
    | API.DefaultMetaResponse<API.StationaryEvent>
  >;
  fetchOrderInvoice: (
    id: number,
    options?: RequestOptionsInit
  ) => Promise<Blob>;
  changeConsultationTerm: (
    termId: number,
    newDate: string,
    term: string,
    userId?: number
  ) => Promise<API.DefaultResponse<object>>;
  fetchTasks: (
    filter: API.TaskParams
  ) => Promise<API.DefaultMetaResponse<API.Task>>;
  fetchCourseAccess: (
    filter?: API.CourseAccessEnquiryListParams
  ) => Promise<API.DefaultMetaResponse<API.CourseAccessEnquiry>>;
  fetchMyCourses: () => Promise<void>;
  addCourseAccess: (
    data: API.CourseAccessEnquiryCreateRequest
  ) => Promise<API.DefaultResponse<API.CourseAccessEnquiry>>;
  deleteCourseAccess: (
    id: number
  ) => Promise<API.DefaultResponse<API.CourseAccessEnquiry>>;

  fetchConsultationAccessEnquiry: (
    enquiryId: number
  ) => Promise<API.DefaultResponse<API.ConsultationsAccessEnquiry>>;
  fetchConsultationAccess: (
    filter?: API.CourseAccessEnquiryListParams
  ) => Promise<API.DefaultMetaResponse<API.ConsultationsAccessEnquiry>>;
  addConsultationAccess: (
    data: API.ConsultationsAccessEnquiryCreateRequest
  ) => Promise<API.DefaultResponse<API.ConsultationsAccessEnquiry>>;
  deleteConsultationAccess: (
    id: number
  ) => Promise<API.DefaultResponse<API.ConsultationsAccessEnquiry>>;
  updateConsultationAccess: (
    id: number,
    data: API.ConsultationsAccessEnquiryUpdateRequest
  ) => Promise<API.DefaultResponse<API.ConsultationsAccessEnquiry>>;

  addTask: (
    data: EscolaLms.Tasks.Http.Requests.CreateTaskRequest
  ) => Promise<API.DefaultResponse<API.Task>>;
  deleteTask: (id: number) => Promise<API.DefaultResponse<API.Task>>;
  fetchAttendances: (
    groupId: number
  ) => Promise<API.DefaultResponse<API.Attendance[]>>;
  fetchTask: (
    id: number
  ) => Promise<
    void | API.DefaultResponse<API.Task> | API.DefaultMetaResponse<API.Task>
  >;
  fetchChallenge: (
    id: number
  ) => Promise<API.DefaultResponse<API.CompetencyChallenge>>;
  updateTask: (
    id: number,
    data: EscolaLms.Tasks.Http.Requests.UpdateTaskRequest
  ) => Promise<API.DefaultResponse<API.Task>>;
  updateTaskStatus: (
    id: number,
    done: boolean
  ) => Promise<API.DefaultResponse<API.Task>>;

  createTaskNote: (
    id: number,
    note: string
  ) => Promise<API.DefaultResponse<API.TaskNote>>;
  updateTaskNote: (
    id: number,
    taskNoteId: number,
    note: string
  ) => Promise<API.DefaultResponse<API.TaskNote>>;
  deleteTaskNote: (
    taskNoteId: number
  ) => Promise<API.DefaultResponse<API.TaskNote>>;

  fetchBookmarkNotes: (
    filter?: API.BookmarkNoteParams
  ) => Promise<API.DefaultMetaResponse<API.BookmarkNote>>;
  createBookmarkNote: (
    body: API.CreateBookmarkNote
  ) => Promise<API.DefaultResponse<API.BookmarkNote>>;
  updateBookmarkNote: (
    id: number,
    body: API.CreateBookmarkNote
  ) => Promise<API.DefaultResponse<API.BookmarkNote>>;
  deleteBookmarkNote: (
    id: number
  ) => Promise<API.DefaultResponse<API.BookmarkNote>>;
  fetchSubjects: (
    params?: API.SubjectsParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.GroupSubject>
    | API.DefaultMetaResponse<API.GroupSubject>
  >;
  fetchSchedule: () => Promise<
    | void
    | API.DefaultResponse<API.ScheduleData>
    | API.DefaultMetaResponse<API.ScheduleData>
  >;
  fetchScheduleTutors: () => Promise<
    | void
    | API.DefaultResponse<API.LessonTutor>
    | API.DefaultMetaResponse<API.LessonTutor>
  >;
  fetchExams: (
    params?: API.ExamsParams
  ) => Promise<
    void | API.DefaultResponse<API.Exam[]> | API.DefaultMetaResponse<API.Exam[]>
  >;
  fetchSemesters: (
    params?: API.SemestersParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.SemesterData>
    | API.DefaultMetaResponse<API.SemesterData>
  >;
  fetchAcademicYears: (
    params?: API.AcademicYearParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.AcademicYear>
    | API.DefaultMetaResponse<API.AcademicYear>
  >;
  fetchDictionariesWords: (
    slug: string,
    params?: API.DictionariesWordsParams
  ) => Promise<API.DefaultMetaResponse<API.DictionariesWords>>;
  fetchDictionariesWord: (
    slug: string,
    id: number
  ) => Promise<API.DefaultResponse<API.DictionariesWords>>;
  fetchDictionariesAccess: () => Promise<
    API.DefaultResponse<API.DictionariesAccess>
  >;
  fetchDictionariesWordsCategories: (
    slig: string,
    params?: API.DictionariesParams
  ) => Promise<
    | void
    | API.DefaultResponse<API.DictionariesWordsCategory>
    | API.DefaultMetaResponse<API.DictionariesWordsCategory>
  >;
}
export type EscolaLMSContextConfig = EscolaLMSContextReadConfig &
  EscolaLMSContextAPIConfig;

export type SortProgram = (lessons: API.Lesson[]) => API.Lesson[];