From ea81d1491285b98f4a074eaa23144159e809c22b Mon Sep 17 00:00:00 2001 From: bflatastic Date: Tue, 13 Jan 2026 14:23:58 +0700 Subject: [PATCH] website: added media page author --- .../src/pages/media/media.tsx | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/frontend/apps/artcraft-website/src/pages/media/media.tsx b/frontend/apps/artcraft-website/src/pages/media/media.tsx index df64942196..764ccadc71 100644 --- a/frontend/apps/artcraft-website/src/pages/media/media.tsx +++ b/frontend/apps/artcraft-website/src/pages/media/media.tsx @@ -4,7 +4,8 @@ import dayjs from "dayjs"; import { Button } from "@storyteller/ui-button"; import { LoadingSpinner } from "@storyteller/ui-loading-spinner"; import { toast } from "@storyteller/ui-toaster"; -import { MediaFilesApi, PromptsApi } from "@storyteller/api"; +import { MediaFilesApi, PromptsApi, UserInfo } from "@storyteller/api"; +import { Gravatar } from "@storyteller/ui-gravatar"; import { twMerge } from "tailwind-merge"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { @@ -15,6 +16,7 @@ import { faPencil, faCircleInfo, faImage, + faUser, } from "@fortawesome/pro-solid-svg-icons"; import { addCorsParam, @@ -52,6 +54,7 @@ interface MediaData { isLoaded: boolean; width?: number; height?: number; + creator: UserInfo | null; } interface PromptData { @@ -131,6 +134,7 @@ export default function MediaPage() { createdAt: null, isVideo: false, isLoaded: false, + creator: null, }); const [mediaRecordLoading, setMediaRecordLoading] = useState(true); @@ -162,6 +166,7 @@ export default function MediaPage() { isLoaded: isSameUrl ? prev.isLoaded : false, width: isSameUrl ? prev.width : undefined, height: isSameUrl ? prev.height : undefined, + creator: file.maybe_creator_user || null, }; }); @@ -183,11 +188,11 @@ export default function MediaPage() { setPromptData(EMPTY_PROMPT_DATA); } } else { - setMedia({ url: null, token: null, createdAt: null, isVideo: false, isLoaded: false }); + setMedia({ url: null, token: null, createdAt: null, isVideo: false, isLoaded: false, creator: null }); toast.error("Media not found"); } } catch { - setMedia({ url: null, token: null, createdAt: null, isVideo: false, isLoaded: false }); + setMedia({ url: null, token: null, createdAt: null, isVideo: false, isLoaded: false, creator: null }); toast.error("Failed to load media"); } finally { setMediaRecordLoading(false); @@ -303,6 +308,13 @@ export default function MediaPage() {
{mediaRecordLoading ? (
+
+
+
+
+
+
+
@@ -322,6 +334,29 @@ export default function MediaPage() {
) : ( <> + {media.creator && ( +
+ {media.creator.core_info ? ( + + ) : ( +
+ +
+ )} +
+ {media.creator.display_name} + Author +
+
+ )} + {media.createdAt && (