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 { useTranslation } from 'next-i18next'; 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 { t } = useTranslation('common'); 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 = t('pages.dashboard.loading', { defaultValue: 'Loading...', }); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [courses, setCourses] = React.useState(loadingMessage); const [course_sections, setCourse_sections] = React.useState(loadingMessage); const [lessons, setLessons] = React.useState(loadingMessage); const [enrollments, setEnrollments] = React.useState(loadingMessage); const [lesson_progress, setLesson_progress] = React.useState(loadingMessage); const [course_reviews, setCourse_reviews] = React.useState(loadingMessage); const [course_announcements, setCourse_announcements] = React.useState(loadingMessage); const [quizzes, setQuizzes] = React.useState(loadingMessage); const [quiz_questions, setQuiz_questions] = React.useState(loadingMessage); const [quiz_options, setQuiz_options] = React.useState(loadingMessage); const [quiz_attempts, setQuiz_attempts] = React.useState(loadingMessage); const [assignment_submissions, setAssignment_submissions] = React.useState(loadingMessage); const [marketing_pages, setMarketing_pages] = React.useState(loadingMessage); const [contact_messages, setContact_messages] = React.useState(loadingMessage); const [pricing_plans, setPricing_plans] = React.useState(loadingMessage); const [plan_features, setPlan_features] = React.useState(loadingMessage); const [users, setUsers] = 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 = [ 'roles', 'permissions', 'courses', 'course_sections', 'lessons', 'enrollments', 'lesson_progress', 'course_reviews', 'course_announcements', 'quizzes', 'quiz_questions', 'quiz_options', 'quiz_attempts', 'assignment_submissions', 'marketing_pages', 'contact_messages', 'pricing_plans', 'plan_features', 'users', ]; const fns = [ setRoles, setPermissions, setCourses, setCourse_sections, setLessons, setEnrollments, setLesson_progress, setCourse_reviews, setCourse_announcements, setQuizzes, setQuiz_questions, setQuiz_options, setQuiz_attempts, setAssignment_submissions, setMarketing_pages, setContact_messages, setPricing_plans, setPlan_features, setUsers, ]; 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 ( <> {getPageTitle( t('pages.dashboard.pageTitle', { defaultValue: 'Overview' }), )} {''} {hasPermission(currentUser, 'CREATE_ROLES') && ( )} {!!rolesWidgets.length && hasPermission(currentUser, 'CREATE_ROLES') && (

{`${widgetsRole?.role?.label || 'Users'}'s widgets`}

)}
{(isFetchingQuery || loading) && (
{' '} {t('pages.dashboard.loadingWidgets', { defaultValue: 'Loading widgets...', })}
)} {rolesWidgets && rolesWidgets.map((widget) => ( ))}
{!!rolesWidgets.length &&
}
{hasPermission(currentUser, 'READ_ROLES') && (
Roles
{roles}
)} {hasPermission(currentUser, 'READ_PERMISSIONS') && (
Permissions
{permissions}
)} {hasPermission(currentUser, 'READ_COURSES') && (
Courses
{courses}
)} {hasPermission(currentUser, 'READ_COURSE_SECTIONS') && (
Course sections
{course_sections}
)} {hasPermission(currentUser, 'READ_LESSONS') && (
Lessons
{lessons}
)} {hasPermission(currentUser, 'READ_ENROLLMENTS') && (
Enrollments
{enrollments}
)} {hasPermission(currentUser, 'READ_LESSON_PROGRESS') && (
Lesson progress
{lesson_progress}
)} {hasPermission(currentUser, 'READ_COURSE_REVIEWS') && (
Course reviews
{course_reviews}
)} {hasPermission(currentUser, 'READ_COURSE_ANNOUNCEMENTS') && (
Course announcements
{course_announcements}
)} {hasPermission(currentUser, 'READ_QUIZZES') && (
Quizzes
{quizzes}
)} {hasPermission(currentUser, 'READ_QUIZ_QUESTIONS') && (
Quiz questions
{quiz_questions}
)} {hasPermission(currentUser, 'READ_QUIZ_OPTIONS') && (
Quiz options
{quiz_options}
)} {hasPermission(currentUser, 'READ_QUIZ_ATTEMPTS') && (
Quiz attempts
{quiz_attempts}
)} {hasPermission(currentUser, 'READ_ASSIGNMENT_SUBMISSIONS') && (
Assignment submissions
{assignment_submissions}
)} {hasPermission(currentUser, 'READ_MARKETING_PAGES') && (
Marketing pages
{marketing_pages}
)} {hasPermission(currentUser, 'READ_CONTACT_MESSAGES') && (
Contact messages
{contact_messages}
)} {hasPermission(currentUser, 'READ_PRICING_PLANS') && (
Pricing plans
{pricing_plans}
)} {hasPermission(currentUser, 'READ_PLAN_FEATURES') && (
Plan features
{plan_features}
)} {hasPermission(currentUser, 'READ_USERS') && (
Users
{users}
)}
); }; Dashboard.getLayout = function getLayout(page: ReactElement) { return {page}; }; export default Dashboard;