diff --git a/functions/src/api/routes/faq/faq.ts b/functions/src/api/routes/faq/faq.ts index 4b00f5a5..ab5d30b9 100644 --- a/functions/src/api/routes/faq/faq.ts +++ b/functions/src/api/routes/faq/faq.ts @@ -8,6 +8,7 @@ const FaqCategory = Type.Object({ name: Type.String(), order: Type.Number(), share: Type.Boolean(), + unifiedPage: Type.Optional(Type.Boolean()), private: Type.Optional(Type.Boolean()), privateId: Type.Optional(Type.String()), }) diff --git a/src/events/page/faq/FaqCategoryItem.tsx b/src/events/page/faq/FaqCategoryItem.tsx index 694a9254..eca24456 100644 --- a/src/events/page/faq/FaqCategoryItem.tsx +++ b/src/events/page/faq/FaqCategoryItem.tsx @@ -13,7 +13,6 @@ import { collections } from '../../../services/firebase' import { collection } from '@firebase/firestore' import { generateFirestoreId } from '../../../utils/generateFirestoreId' import { FaqCategoryItemContent } from './FaqCategoryItemContent' -import { generateFaqPdf } from '../../../utils/faqPdfGenerator' export type FaqCategoryProps = { event: Event @@ -75,17 +74,6 @@ export const FaqCategoryItem = (props: FaqCategoryProps) => { setDidChange(false) } - const exportToPdf = async () => { - try { - setIsExporting(true) - await generateFaqPdf(props.event, props.category, data) - } catch (error) { - console.error('Failed to generate PDF:', error) - } finally { - setIsExporting(false) - } - } - return ( @@ -96,11 +84,6 @@ export const FaqCategoryItem = (props: FaqCategoryProps) => { setOpen(!isOpen)}> {isOpen ? : } - {isOpen && ( - - - - )} {didChange && ( Save diff --git a/src/events/page/faq/FaqCategoryItemContent.tsx b/src/events/page/faq/FaqCategoryItemContent.tsx index 778b1e8a..1793c489 100644 --- a/src/events/page/faq/FaqCategoryItemContent.tsx +++ b/src/events/page/faq/FaqCategoryItemContent.tsx @@ -1,6 +1,5 @@ -import * as React from 'react' import { useState } from 'react' -import { Box, Button, DialogContentText, FormControlLabel, Switch, TextField } from '@mui/material' +import { Box, Button, DialogContentText, FormControlLabel, Switch, TextField, IconButton } from '@mui/material' import { generateFirestoreId } from '../../../utils/generateFirestoreId' import { TypographyCopyable } from '../../../components/TypographyCopyable' import { getFaqCategoryPrivateLink } from './faqLink' @@ -14,6 +13,8 @@ import { doc } from 'firebase/firestore' import { collections } from '../../../services/firebase' import { DeleteRounded, EditRounded } from '@mui/icons-material' import { ConfirmDialog } from '../../../components/ConfirmDialog' +import { generateFaqPdf } from '../../../utils/faqPdfGenerator' +import { PictureAsPdf } from '@mui/icons-material' export type FaqCategoryItemContentProps = { event: Event @@ -36,6 +37,14 @@ export const FaqCategoryItemContent = ({ const [isChangingCategoryName, setIsChangingCategoryName] = useState(null) const categoryDocumentDeletion = useFirestoreDocumentDeletion(doc(collections.faq(event.id), category.id)) + const exportToPdf = async () => { + try { + await generateFaqPdf(event, category, data) + } catch (error) { + console.error('Failed to generate PDF:', error) + } + } + return ( @@ -67,6 +76,17 @@ export const FaqCategoryItemContent = ({ } label="Private url?" /> + { + categoryMutation.mutate({ unifiedPage: e.target.checked }) + }} + /> + } + label="Display as unified page" + /> {category.private && category.privateId ? ( {getFaqCategoryPrivateLink(event, category.privateId)} @@ -96,6 +116,9 @@ export const FaqCategoryItemContent = ({ ) : null} + + + {data.map((faq, index) => ( { {faq.category.name} - {questionsOrdered.map((question, index) => { - return ( - { - if (openQuestionId === question.id) { + {faq.category.unifiedPage ? ( + + { + return acc + `# ${question.question}\n${question.answer}\n\n` + }, '')} + /> + + ) : ( + questionsOrdered.map((question, index) => { + return ( + { + if (openQuestionId === question.id) { + setSearchParams((prev) => { + const newParams = new URLSearchParams(prev) + newParams.delete('question') + return newParams + }) + setOpenQuestion(null) + return + } setSearchParams((prev) => { const newParams = new URLSearchParams(prev) - newParams.delete('question') + newParams.set('question', question.id) return newParams }) - setOpenQuestion(null) - return - } - setSearchParams((prev) => { - const newParams = new URLSearchParams(prev) - newParams.set('question', question.id) - return newParams - }) - setOpenQuestion(question.id) - }} - /> - ) - })} + setOpenQuestion(question.id) + }} + /> + ) + }) + )} ) } diff --git a/src/public/publicTypes.ts b/src/public/publicTypes.ts index 8f5c9f65..4b171f2f 100644 --- a/src/public/publicTypes.ts +++ b/src/public/publicTypes.ts @@ -10,6 +10,7 @@ export type PublicFaqCategoryType = { name: string order: number faqs: PublicFaqItemType[] + unifiedPage: boolean } export type PublicFaqType = { diff --git a/src/types.ts b/src/types.ts index 84501ce7..727a21f4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -231,6 +231,7 @@ export interface FaqCategory { share: boolean private: boolean privateId: string | null + unifiedPage?: boolean collectionList: string[] faqs: Faq[] }