mirror of
https://github.com/SrIzan10/featheroom.git
synced 2026-06-06 00:56:49 +00:00
111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
/* eslint-disable no-throw-literal */
|
|
import { type classroom_v1 } from '@googleapis/classroom'
|
|
import { GoogleSignin } from '@react-native-google-signin/google-signin'
|
|
import { QueryClient, useQuery } from '@tanstack/react-query'
|
|
|
|
type ApiError = {
|
|
message: string
|
|
status: number
|
|
}
|
|
|
|
// Query Client
|
|
export const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
staleTime: 1000 * 60, // 1 minute
|
|
retry: 1,
|
|
},
|
|
},
|
|
})
|
|
|
|
// API Functions
|
|
const BASE_URL = 'https://classroom.googleapis.com'
|
|
|
|
async function fetchApi<T>(
|
|
endpoint: string,
|
|
insideKey?: string,
|
|
options?: RequestInit,
|
|
): Promise<T> {
|
|
const token = (await GoogleSignin.getTokens()).accessToken
|
|
//console.log(token)
|
|
const response = await fetch(`${BASE_URL}${endpoint}`, {
|
|
...options,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
...(token && { Authorization: `Bearer ${token}` }),
|
|
...options?.headers,
|
|
},
|
|
})
|
|
|
|
if (!response.ok) {
|
|
throw { message: response.statusText, status: response.status } as ApiError
|
|
}
|
|
|
|
const data = await response.json()
|
|
return insideKey ? data[insideKey] : data
|
|
}
|
|
|
|
// Query Keys
|
|
export const keys = {
|
|
courses: {
|
|
all: ['courses'],
|
|
one: (id: string) => ['courses', id],
|
|
announcement: (courseId: string) => ['courses', courseId, 'announcements'],
|
|
courseWork: (courseId: string) => ['courses', courseId, 'courseWork'],
|
|
courseWorkMaterials: (courseId: string) => [
|
|
'courses',
|
|
courseId,
|
|
'courseWorkMaterials',
|
|
],
|
|
},
|
|
}
|
|
|
|
// Hooks
|
|
export function useCourses() {
|
|
return useQuery({
|
|
queryKey: keys.courses.all,
|
|
queryFn: () =>
|
|
fetchApi<{ courses: classroom_v1.Schema$Course[] }>('/v1/courses'),
|
|
})
|
|
}
|
|
|
|
export function useCourse(id: string) {
|
|
return useQuery({
|
|
queryKey: keys.courses.one(id),
|
|
queryFn: () => fetchApi<classroom_v1.Schema$Course>(`/v1/courses/${id}`),
|
|
})
|
|
}
|
|
|
|
export function useAnnouncements(courseId: string) {
|
|
return useQuery({
|
|
queryKey: keys.courses.announcement(courseId),
|
|
queryFn: () =>
|
|
fetchApi<classroom_v1.Schema$Announcement[]>(
|
|
`/v1/courses/${courseId}/announcements`,
|
|
'announcements',
|
|
),
|
|
})
|
|
}
|
|
|
|
export function useCourseWork(courseId: string) {
|
|
return useQuery({
|
|
queryKey: keys.courses.courseWork(courseId),
|
|
queryFn: () =>
|
|
fetchApi<classroom_v1.Schema$CourseWork[]>(
|
|
`/v1/courses/${courseId}/courseWork`,
|
|
'courseWork',
|
|
),
|
|
})
|
|
}
|
|
|
|
export function useCourseWorkMaterials(courseId: string) {
|
|
return useQuery({
|
|
queryKey: keys.courses.courseWorkMaterials(courseId),
|
|
queryFn: () =>
|
|
fetchApi<classroom_v1.Schema$CourseWorkMaterial[]>(
|
|
`/v1/courses/${courseId}/courseWorkMaterials`,
|
|
'courseWorkMaterial',
|
|
),
|
|
})
|
|
}
|