diff --git a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/Subs/AssignmentTaskGeneralEdit.tsx b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/Subs/AssignmentTaskGeneralEdit.tsx index d9221af0..f7bae0ef 100644 --- a/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/Subs/AssignmentTaskGeneralEdit.tsx +++ b/apps/web/app/orgs/[orgslug]/dash/assignments/[assignmentuuid]/_components/TaskEditor/Subs/AssignmentTaskGeneralEdit.tsx @@ -13,6 +13,9 @@ import { Cloud, File, Info, Loader, UploadCloud } from 'lucide-react' import Link from 'next/link'; import React, { useEffect } from 'react' import toast from 'react-hot-toast'; +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['pdf', 'docx', 'mp4', 'jpg', 'png', 'pptx', 'zip']) export function AssignmentTaskGeneralEdit() { const session = useLHSession() as any; @@ -242,6 +245,7 @@ function UpdateTaskRef() {
@@ -205,6 +209,7 @@ function OrgEditGeneral() {
diff --git a/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx b/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx index 7a60cc19..786a7384 100644 --- a/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx +++ b/apps/web/components/Objects/Editor/Extensions/Image/ImageBlockComponent.tsx @@ -9,6 +9,9 @@ import { useCourse } from '@components/Contexts/CourseContext' import { useEditorProvider } from '@components/Contexts/Editor/EditorContext' import { useLHSession } from '@components/Contexts/LHSessionContext' import { FileUploadBlock, FileUploadBlockButton, FileUploadBlockInput } from '../../FileUploadBlock' +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['image']) function ImageBlockComponent(props: any) { const org = useOrg() as any @@ -53,7 +56,7 @@ function ImageBlockComponent(props: any) { return ( - + diff --git a/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx b/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx index 5620c5a4..5738b68a 100644 --- a/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx +++ b/apps/web/components/Objects/Editor/Extensions/PDF/PDFBlockComponent.tsx @@ -9,6 +9,9 @@ import { useCourse } from '@components/Contexts/CourseContext' import { useEditorProvider } from '@components/Contexts/Editor/EditorContext' import { useLHSession } from '@components/Contexts/LHSessionContext' import { FileUploadBlock, FileUploadBlockButton, FileUploadBlockInput } from '../../FileUploadBlock' +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['pdf']) function PDFBlockComponent(props: any) { const org = useOrg() as any @@ -49,7 +52,7 @@ function PDFBlockComponent(props: any) { return ( - + diff --git a/apps/web/components/Objects/Editor/Extensions/Video/VideoBlockComponent.tsx b/apps/web/components/Objects/Editor/Extensions/Video/VideoBlockComponent.tsx index 6542443c..e7e4ca7b 100644 --- a/apps/web/components/Objects/Editor/Extensions/Video/VideoBlockComponent.tsx +++ b/apps/web/components/Objects/Editor/Extensions/Video/VideoBlockComponent.tsx @@ -9,6 +9,9 @@ import { useCourse } from '@components/Contexts/CourseContext' import { useEditorProvider } from '@components/Contexts/Editor/EditorContext' import { useLHSession } from '@components/Contexts/LHSessionContext' import { FileUploadBlock, FileUploadBlockButton, FileUploadBlockInput } from '../../FileUploadBlock' +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['webm', 'mp4']) function VideoBlockComponents(props: any) { const org = useOrg() as any @@ -51,7 +54,7 @@ function VideoBlockComponents(props: any) { return ( - + diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx index 4c736bde..06d14e55 100644 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx @@ -9,6 +9,9 @@ import FormLayout, { import React, { useState } from 'react' import * as Form from '@radix-ui/react-form' import BarLoader from 'react-spinners/BarLoader' +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['pdf']) function DocumentPdfModal({ submitFileActivity, chapterId, course }: any) { const [documentpdf, setDocumentPdf] = React.useState(null) as any @@ -64,7 +67,7 @@ function DocumentPdfModal({ submitFileActivity, chapterId, course }: any) { - + diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx index 4fba84bb..0d9ce796 100644 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx @@ -10,6 +10,9 @@ import React, { useState } from 'react' import * as Form from '@radix-ui/react-form' import BarLoader from 'react-spinners/BarLoader' import { Youtube } from 'lucide-react' +import { constructAcceptValue } from '@/lib/constants'; + +const SUPPORTED_FILES = constructAcceptValue(['mp4', 'webm']) interface ExternalVideoObject { name: string @@ -134,7 +137,7 @@ function VideoModal({ - +
diff --git a/apps/web/lib/constants.ts b/apps/web/lib/constants.ts new file mode 100644 index 00000000..1d3107d0 --- /dev/null +++ b/apps/web/lib/constants.ts @@ -0,0 +1,20 @@ +export const ACCEPTED_FILE_FORMATS = { + video: 'video/*', + mp4: 'video/mp4', + webm: 'video/webm', + image: 'image/*', + jpg: 'image/jpeg', + png: 'image/png', + webp: 'image/webp', + pdf: 'application/pdf', + pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + zip: 'application/zip,application/x-zip-compressed' +} as const; + +/** + * Constructs the 'accept' attribute value for an input element + */ +export function constructAcceptValue(types : (keyof typeof ACCEPTED_FILE_FORMATS)[]): string { + return types.map(type => ACCEPTED_FILE_FORMATS[type]).filter(Boolean).join(",") +} \ No newline at end of file