From 39e7bf74ac57313cb1e340f7c4e26f6f5fc4193e Mon Sep 17 00:00:00 2001 From: longdayi <13477510+longdayilongdayi@user.noreply.gitee.com> Date: Fri, 21 Feb 2025 17:12:47 +0800 Subject: [PATCH 01/36] 02211712 --- apps/server/src/models/resource/processor/ImageProcessor.ts | 2 +- apps/server/src/models/resource/processor/VideoProcessor.ts | 2 +- apps/server/src/models/resource/types.ts | 2 +- apps/web/src/io/tusd.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/server/src/models/resource/processor/ImageProcessor.ts b/apps/server/src/models/resource/processor/ImageProcessor.ts index 8228c08..1851c0d 100644 --- a/apps/server/src/models/resource/processor/ImageProcessor.ts +++ b/apps/server/src/models/resource/processor/ImageProcessor.ts @@ -14,7 +14,7 @@ export class ImageProcessor extends BaseProcessor { const { url } = resource; const filepath = getUploadFilePath(url); const originMeta = resource.meta as unknown as FileMetadata; - if (!originMeta.mimeType?.startsWith('image/')) { + if (!originMeta.filetype?.startsWith('image/')) { this.logger.log(`Skipping non-image resource: ${resource.id}`); return resource; } diff --git a/apps/server/src/models/resource/processor/VideoProcessor.ts b/apps/server/src/models/resource/processor/VideoProcessor.ts index 3600298..083bb5f 100644 --- a/apps/server/src/models/resource/processor/VideoProcessor.ts +++ b/apps/server/src/models/resource/processor/VideoProcessor.ts @@ -19,7 +19,7 @@ export class VideoProcessor extends BaseProcessor { ); const originMeta = resource.meta as unknown as FileMetadata; - if (!originMeta.mimeType?.startsWith('video/')) { + if (!originMeta.filetype?.startsWith('video/')) { this.logger.log(`Skipping non-video resource: ${resource.id}`); return resource; } diff --git a/apps/server/src/models/resource/types.ts b/apps/server/src/models/resource/types.ts index 7e39e42..eb060ba 100644 --- a/apps/server/src/models/resource/types.ts +++ b/apps/server/src/models/resource/types.ts @@ -11,7 +11,7 @@ export interface ProcessResult { export interface BaseMetadata { size: number - mimeType: string + filetype: string filename: string extension: string modifiedAt: Date diff --git a/apps/web/src/io/tusd.ts b/apps/web/src/io/tusd.ts index a3e13c1..113678a 100644 --- a/apps/web/src/io/tusd.ts +++ b/apps/web/src/io/tusd.ts @@ -16,7 +16,7 @@ export const uploader = async ( maxSizeMB: 0.8, // 最大文件大小(MB) maxWidthOrHeight: 1920, // 最大宽高 useWebWorker: true, - fileType: "image/webp", // 输出文件格式 + filetype: "image/webp", // 输出文件格式 }; const compressedFile = await imageCompression(file, options); return new File([compressedFile], `${file.name.split(".")[0]}.webp`, { From 4fa5a2296dd38d5e3560ebb07bc62227ebeb3464 Mon Sep 17 00:00:00 2001 From: ditiqi Date: Fri, 21 Feb 2025 17:32:25 +0800 Subject: [PATCH 02/36] add --- .../common/container/CollapsibleContent.tsx | 54 +++++++++++++++++++ .../course/detail/CourseDetailDisplayArea.tsx | 36 ++++++++----- .../CourseDetailHeader/CourseDetailHeader.tsx | 1 - packages/common/src/models/post.ts | 1 + 4 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 apps/web/src/components/common/container/CollapsibleContent.tsx diff --git a/apps/web/src/components/common/container/CollapsibleContent.tsx b/apps/web/src/components/common/container/CollapsibleContent.tsx new file mode 100644 index 0000000..6d1ea96 --- /dev/null +++ b/apps/web/src/components/common/container/CollapsibleContent.tsx @@ -0,0 +1,54 @@ +import React, { useRef, useState } from "react"; + +interface CollapsibleContentProps { + content: string; + maxHeight?: number; +} + +const CollapsibleContent: React.FC = ({ + content, + maxHeight = 150, +}) => { + const contentWrapperRef = useRef(null); + const [isExpanded, setIsExpanded] = useState(false); + + // Determine if content needs to be collapsed + const shouldCollapse = contentWrapperRef.current + ? contentWrapperRef.current.scrollHeight > maxHeight + : false; + + return ( +
+
+
+ + {/* Gradient overlay */} + {shouldCollapse && !isExpanded && ( +
+ )} +
+ + {/* Expand/Collapse button */} + {shouldCollapse && ( + + )} +
+ ); +}; + +export default CollapsibleContent; diff --git a/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx b/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx index 4f956b5..3a2d6ff 100644 --- a/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx +++ b/apps/web/src/components/models/course/detail/CourseDetailDisplayArea.tsx @@ -1,10 +1,11 @@ // components/CourseDetailDisplayArea.tsx import { motion, useScroll, useTransform } from "framer-motion"; -import React, { useContext } from "react"; +import React, { useContext, useRef, useState } from "react"; import { VideoPlayer } from "@web/src/components/presentation/video-player/VideoPlayer"; import { CourseDetailDescription } from "./CourseDetailDescription/CourseDetailDescription"; -import { Course, PostType } from "@nice/common"; +import { Course, LectureType, PostType } from "@nice/common"; import { CourseDetailContext } from "./CourseDetailContext"; +import CollapsibleContent from "@web/src/components/common/container/CollapsibleContent"; interface CourseDetailDisplayAreaProps { // course: Course; @@ -21,23 +22,34 @@ export const CourseDetailDisplayArea: React.FC< const { scrollY } = useScroll(); const videoScale = useTransform(scrollY, [0, 200], [1, 0.8]); const videoOpacity = useTransform(scrollY, [0, 200], [1, 0.8]); - + const contentWrapperRef = useRef(null); + const [isExpanded, setIsExpanded] = useState(false); + const [shouldCollapse, setShouldCollapse] = useState(false); return (
{/* 固定的视频区域 */} {/* 移除 sticky 定位,让视频区域随页面滚动 */} - - {lecture.type === PostType.LECTURE && ( + {lecture?.meta?.type === LectureType.VIDEO && ( +
- )} -
- +
+ )} + {lecture?.meta?.type === LectureType.ARTICLE && ( +
+
+ +
+
+ )} {/* 课程内容区域 */} { 123