'use client'; // RULES: // contains list page for cr_questions (QuizCRQuestions) // contain definition to collection only // import * as React from 'react'; import { useRouter } from 'next/navigation'; import { COL_QUIZ_CR_QUESTIONS } from '@/constants'; import { LoadingButton } from '@mui/lab'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; import Divider from '@mui/material/Divider'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; import type { ListResult, RecordModel } from 'pocketbase'; import { useTranslation } from 'react-i18next'; import { paths } from '@/paths'; import isDevelopment from '@/lib/check-is-development'; import { logger } from '@/lib/default-logger'; import { pb } from '@/lib/pb'; import { toast } from '@/components/core/toaster'; import ErrorDisplay from '@/components/dashboard/error'; import { defaultCrQuestion } from '@/components/dashboard/cr/questions/_constants'; import { CrQuestionsFilters } from '@/components/dashboard/cr/questions/cr-questions-filters'; import type { Filters } from '@/components/dashboard/cr/questions/cr-questions-filters'; import { CrQuestionsPagination } from '@/components/dashboard/cr/questions/cr-questions-pagination'; import { CrQuestionsSelectionProvider } from '@/components/dashboard/cr/questions/cr-questions-selection-context'; import { CrQuestionsTable } from '@/components/dashboard/cr/questions/cr-questions-table'; import type { CrQuestion } from '@/components/dashboard/cr/questions/type'; import FormLoading from '@/components/loading'; export default function Page({ searchParams }: PageProps): React.JSX.Element { const { t } = useTranslation(['lp_questions']); const { email, phone, sortDir, status, name, visible, type } = searchParams; const router = useRouter(); const [lessonQuestionsData, setLessonCategoriesData] = React.useState([]); // const [isLoadingAddPage, setIsLoadingAddPage] = React.useState(false); const [showLoading, setShowLoading] = React.useState(true); const [showError, setShowError] = React.useState({ show: false, detail: '' }); // const [rowsPerPage, setRowsPerPage] = React.useState(5); // const [f, setF] = React.useState([]); const [currentPage, setCurrentPage] = React.useState(0); // const [recordCount, setRecordCount] = React.useState(0); const [listOption, setListOption] = React.useState({}); const [listSort, setListSort] = React.useState({}); // const sortedLessonCategories = applySort(lessonQuestionsData, sortDir); const filteredLessonCategories = applyFilters(sortedLessonCategories, { email, phone, status }); const reloadRows = async (): Promise => { try { const models: ListResult = await pb .collection(COL_QUIZ_CR_QUESTIONS) .getList(currentPage + 1, rowsPerPage, listOption); const { items, totalItems } = models; const tempLessonTypes: CrQuestion[] = items.map((lt) => { return { ...defaultCrQuestion, ...lt }; }); setLessonCategoriesData(tempLessonTypes); setRecordCount(totalItems); setF(tempLessonTypes); // console.log({ currentPage, f }); } catch (error) { // logger.error(error); setShowError({ // show: true, detail: JSON.stringify(error, null, 2), }); } finally { setShowLoading(false); } }; const [lastListOption, setLastListOption] = React.useState({}); const isFirstRun = React.useRef(false); React.useEffect(() => { if (!isFirstRun.current) { isFirstRun.current = true; } else if (JSON.stringify(listOption) !== JSON.stringify(lastListOption)) { // reset page number as tab changes setLastListOption(listOption); setCurrentPage(0); void reloadRows(); } else { void reloadRows(); } }, [currentPage, rowsPerPage, listOption]); React.useEffect(() => { let tempFilter = [], tempSortDir = ''; if (visible) { tempFilter.push(`visible = "${visible}"`); } if (sortDir) { tempSortDir = `-created`; } if (name) { tempFilter.push(`name ~ "%${name}%"`); } if (type) { tempFilter.push(`type ~ "%${type}%"`); } let preFinalListOption = {}; if (tempFilter.length > 0) { preFinalListOption = { filter: tempFilter.join(' && ') }; } if (tempSortDir.length > 0) { preFinalListOption = { ...preFinalListOption, sort: tempSortDir }; } setListOption(preFinalListOption); // setListOption({ // filter: tempFilter.join(' && '), // sort: tempSortDir, // // // }); }, [visible, sortDir, name, type]); // return <>helloworld; if (showLoading) return ; if (showError.show) return ( ); return ( {t('list.title')} { setIsLoadingAddPage(true); router.push(paths.dashboard.cr_questions.create); }} startIcon={} variant="contained" > {t('list.add')}
{JSON.stringify(f, null, 2)}
); } // Sorting and filtering has to be done on the server. function applySort(row: CrQuestion[], sortDir: 'asc' | 'desc' | undefined): CrQuestion[] { return row.sort((a, b) => { if (sortDir === 'asc') { return a.createdAt.getTime() - b.createdAt.getTime(); } return b.createdAt.getTime() - a.createdAt.getTime(); }); } function applyFilters(row: CrQuestion[], { email, phone, status, name, visible }: Filters): CrQuestion[] { return row.filter((item) => { if (email) { if (!item.email?.toLowerCase().includes(email.toLowerCase())) { return false; } } if (phone) { if (!item.phone?.toLowerCase().includes(phone.toLowerCase())) { return false; } } if (status) { if (item.status !== status) { return false; } } if (name) { if (!item.name?.toLowerCase().includes(name.toLowerCase())) { return false; } } if (visible) { if (!item.visible?.toLowerCase().includes(visible.toLowerCase())) { return false; } } return true; }); } interface PageProps { searchParams: { email?: string; phone?: string; sortDir?: 'asc' | 'desc'; status?: string; name?: string; visible?: string; type?: string; // }; }