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 [landing_pages, setLanding_pages] = React.useState(loadingMessage); const [sections, setSections] = React.useState(loadingMessage); const [gallery_albums, setGallery_albums] = React.useState(loadingMessage); const [gallery_items, setGallery_items] = React.useState(loadingMessage); const [videos, setVideos] = React.useState(loadingMessage); const [partners, setPartners] = React.useState(loadingMessage); const [donation_methods, setDonation_methods] = React.useState(loadingMessage); const [supporters, setSupporters] = React.useState(loadingMessage); const [prayer_requests, setPrayer_requests] = React.useState(loadingMessage); const [contact_messages, setContact_messages] = React.useState(loadingMessage); const [social_links, setSocial_links] = React.useState(loadingMessage); const [site_settings, setSite_settings] = 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','landing_pages','sections','gallery_albums','gallery_items','videos','partners','donation_methods','supporters','prayer_requests','contact_messages','social_links','site_settings',]; const fns = [setUsers,setRoles,setPermissions,setLanding_pages,setSections,setGallery_albums,setGallery_items,setVideos,setPartners,setDonation_methods,setSupporters,setPrayer_requests,setContact_messages,setSocial_links,setSite_settings,]; 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('Overview')} {''} {hasPermission(currentUser, 'CREATE_ROLES') && } {!!rolesWidgets.length && hasPermission(currentUser, 'CREATE_ROLES') && (

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

)}
{(isFetchingQuery || loading) && (
{' '} Loading widgets...
)} { rolesWidgets && rolesWidgets.map((widget) => ( ))}
{!!rolesWidgets.length &&
}
{hasPermission(currentUser, 'READ_USERS') &&
Users
{users}
} {hasPermission(currentUser, 'READ_ROLES') &&
Roles
{roles}
} {hasPermission(currentUser, 'READ_PERMISSIONS') &&
Permissions
{permissions}
} {hasPermission(currentUser, 'READ_LANDING_PAGES') &&
Landing pages
{landing_pages}
} {hasPermission(currentUser, 'READ_SECTIONS') &&
Sections
{sections}
} {hasPermission(currentUser, 'READ_GALLERY_ALBUMS') &&
Gallery albums
{gallery_albums}
} {hasPermission(currentUser, 'READ_GALLERY_ITEMS') &&
Gallery items
{gallery_items}
} {hasPermission(currentUser, 'READ_VIDEOS') &&
Videos
{videos}
} {hasPermission(currentUser, 'READ_PARTNERS') &&
Partners
{partners}
} {hasPermission(currentUser, 'READ_DONATION_METHODS') &&
Donation methods
{donation_methods}
} {hasPermission(currentUser, 'READ_SUPPORTERS') &&
Supporters
{supporters}
} {hasPermission(currentUser, 'READ_PRAYER_REQUESTS') &&
Prayer requests
{prayer_requests}
} {hasPermission(currentUser, 'READ_CONTACT_MESSAGES') &&
Contact messages
{contact_messages}
} {hasPermission(currentUser, 'READ_SOCIAL_LINKS') &&
Social links
{social_links}
} {hasPermission(currentUser, 'READ_SITE_SETTINGS') &&
Site settings
{site_settings}
}
) } Dashboard.getLayout = function getLayout(page: ReactElement) { return {page} } export default Dashboard