import * as icon from '@mdi/js'; import Head from 'next/head' import React from 'react' import axios from 'axios'; import type { ReactElement } from 'react' import LayoutAuthenticated from '../layouts/Authenticated' import SectionMain from '../components/SectionMain' import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton' import BaseIcon from "../components/BaseIcon"; import { getPageTitle } from '../config' import Link from "next/link"; import { hasPermission } from "../helpers/userPermissions"; import { fetchWidgets } from '../stores/roles/rolesSlice'; import { WidgetCreator } from '../components/WidgetCreator/WidgetCreator'; import { SmartWidget } from '../components/SmartWidget/SmartWidget'; import { useAppDispatch, useAppSelector } from '../stores/hooks'; const Dashboard = () => { const dispatch = useAppDispatch(); const iconsColor = useAppSelector((state) => state.style.iconsColor); const corners = useAppSelector((state) => state.style.corners); const cardsStyle = useAppSelector((state) => state.style.cardsStyle); const loadingMessage = 'Loading...'; const [users, setUsers] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [courses, setCourses] = React.useState(loadingMessage); const [course_categories, setCourse_categories] = React.useState(loadingMessage); const [lessons, setLessons] = React.useState(loadingMessage); const [enrollments, setEnrollments] = React.useState(loadingMessage); const [lesson_progress, setLesson_progress] = React.useState(loadingMessage); const [quizzes, setQuizzes] = React.useState(loadingMessage); const [quiz_questions, setQuiz_questions] = React.useState(loadingMessage); const [question_choices, setQuestion_choices] = React.useState(loadingMessage); const [quiz_attempts, setQuiz_attempts] = React.useState(loadingMessage); const [quiz_answers, setQuiz_answers] = React.useState(loadingMessage); const [assignments, setAssignments] = React.useState(loadingMessage); const [assignment_submissions, setAssignment_submissions] = React.useState(loadingMessage); const [gradebook_items, setGradebook_items] = React.useState(loadingMessage); const [grades, setGrades] = React.useState(loadingMessage); const [course_announcements, setCourse_announcements] = React.useState(loadingMessage); const [course_resources, setCourse_resources] = React.useState(loadingMessage); const [widgetsRole, setWidgetsRole] = React.useState({ role: { value: '', label: '' }, }); const { currentUser } = useAppSelector((state) => state.auth); const { isFetchingQuery } = useAppSelector((state) => state.openAi); const { rolesWidgets, loading } = useAppSelector((state) => state.roles); async function loadData() { const entities = ['users','roles','permissions','courses','course_categories','lessons','enrollments','lesson_progress','quizzes','quiz_questions','question_choices','quiz_attempts','quiz_answers','assignments','assignment_submissions','gradebook_items','grades','course_announcements','course_resources',]; const fns = [setUsers,setRoles,setPermissions,setCourses,setCourse_categories,setLessons,setEnrollments,setLesson_progress,setQuizzes,setQuiz_questions,setQuestion_choices,setQuiz_attempts,setQuiz_answers,setAssignments,setAssignment_submissions,setGradebook_items,setGrades,setCourse_announcements,setCourse_resources,]; const requests = entities.map((entity, index) => { if(hasPermission(currentUser, `READ_${entity.toUpperCase()}`)) { return axios.get(`/${entity.toLowerCase()}/count`); } else { fns[index](null); return Promise.resolve({data: {count: null}}); } }); Promise.allSettled(requests).then((results) => { results.forEach((result, i) => { if (result.status === 'fulfilled') { fns[i](result.value.data.count); } else { fns[i](result.reason.message); } }); }); } async function getWidgets(roleId) { await dispatch(fetchWidgets(roleId)); } React.useEffect(() => { if (!currentUser) return; loadData().then(); setWidgetsRole({ role: { value: currentUser?.app_role?.id, label: currentUser?.app_role?.name } }); }, [currentUser]); React.useEffect(() => { if (!currentUser || !widgetsRole?.role?.value) return; getWidgets(widgetsRole?.role?.value || '').then(); }, [widgetsRole?.role?.value]); return ( <>
{`${widgetsRole?.role?.label || 'Users'}'s widgets`}
)}