From 8dd6f9a9b3da6a5c683d91bd647a60198955317f Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Wed, 9 Jul 2025 23:59:39 +0200 Subject: feat: add conditional rendering to properties panel with text change functionality --- .../web/src/components/editor/properties-panel.tsx | 73 ++++++++++++++++++---- 1 file changed, 61 insertions(+), 12 deletions(-) (limited to 'apps/web/src/components/editor') diff --git a/apps/web/src/components/editor/properties-panel.tsx b/apps/web/src/components/editor/properties-panel.tsx index b0f9c62e..4aea58c7 100644 --- a/apps/web/src/components/editor/properties-panel.tsx +++ b/apps/web/src/components/editor/properties-panel.tsx @@ -4,25 +4,74 @@ import { useProjectStore } from "@/stores/project-store"; import { useAspectRatio } from "@/hooks/use-aspect-ratio"; import { Label } from "../ui/label"; import { ScrollArea } from "../ui/scroll-area"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { Input } from "../ui/input"; +import { MediaElement, TextElement } from "@/types/timeline"; +import { useMediaStore } from "@/stores/media-store"; export function PropertiesPanel() { const { activeProject } = useProjectStore(); const { getDisplayName, canvasSize } = useAspectRatio(); + const { selectedElements, tracks, updateTextElement } = useTimelineStore(); + const { mediaItems } = useMediaStore(); + + const emptyView = ( +
+ {/* Media Properties */} +
+ + + + +
+
+ ); + + const TextProperties = (element: TextElement, trackId: string) => ( +
+ + updateTextElement(trackId, element.id, { content: e.target.value }) + } + /> +
+ ); + + const MediaProperties = (element: MediaElement) => { + const mediaItem = mediaItems.find((item) => item.id === element.mediaId); + + if (mediaItem?.type === "audio") { + return
Audio properties
; + } + + // video or image + return
Video/Image properties
; + }; + + const ElementProperties = ( + <> + {selectedElements.map(({ trackId, elementId }) => { + const track = tracks.find((t) => t.id === trackId); + const element = track?.elements.find((e) => e.id === elementId); + + if (element?.type === "text") { + return
{TextProperties(element, trackId)}
; + } + if (element?.type === "media") { + return
{MediaProperties(element)}
; + } + })} + + ); return ( -
- {/* Media Properties */} -
- - - - -
-
+ {selectedElements.length > 0 ? ElementProperties : emptyView}
); } -- cgit v1.3.1