From ada7d2508381bae4ee7cddecd8effef97faddc10 Mon Sep 17 00:00:00 2001
From: Jonas Braathen
Date: Sun, 7 Jul 2024 17:43:19 +0200
Subject: [PATCH] add reusable ImageFigure component
---
web/src/app/aktuelt/[slug]/page.tsx | 22 ++++++-------
web/src/app/foreninger/[slug]/page.tsx | 2 +-
web/src/app/lokaler/[slug]/page.tsx | 2 +-
.../associations/AssociationItem.tsx | 2 +-
web/src/components/blocks/FeaturedBlock.tsx | 2 +-
.../components/blocks/HorizontalRuleBlock.tsx | 2 +-
.../components/blocks/ImageSliderBlock.tsx | 24 +++++++-------
.../components/blocks/ImageWithTextBlock.tsx | 32 ++++++++-----------
web/src/components/events/EventHeader.tsx | 4 ++-
web/src/components/events/EventItem.tsx | 2 +-
web/src/components/general/Image.tsx | 22 +++++++++++--
.../image.module.scss} | 6 +++-
web/src/components/news/NewsItem.tsx | 2 +-
web/src/components/venues/VenueInfo.tsx | 2 +-
web/src/components/venues/VenueItem.tsx | 2 +-
15 files changed, 70 insertions(+), 58 deletions(-)
rename web/src/components/{blocks/imageWithTextBlock.module.scss => general/image.module.scss} (92%)
diff --git a/web/src/app/aktuelt/[slug]/page.tsx b/web/src/app/aktuelt/[slug]/page.tsx
index 75560ef..9bb8c00 100644
--- a/web/src/app/aktuelt/[slug]/page.tsx
+++ b/web/src/app/aktuelt/[slug]/page.tsx
@@ -1,6 +1,6 @@
import { getClient } from "@/app/client";
import { Blocks } from "@/components/blocks/Blocks";
-import Image from "@/components/general/Image";
+import { ImageFigure } from "@/components/general/Image";
import { graphql } from "@/gql";
import { NewsFragment } from "@/gql/graphql";
import { formatDate, formatExtendedDateTime } from "@/lib/date";
@@ -56,18 +56,14 @@ export default async function Page({ params }: { params: { slug: string } }) {
{news.title}
{featuredImage && (
-
-
- {featuredImage.attribution && (
- {featuredImage.attribution}
- )}
-
+
)}
diff --git a/web/src/app/foreninger/[slug]/page.tsx b/web/src/app/foreninger/[slug]/page.tsx
index 7422fb4..3a77ad6 100644
--- a/web/src/app/foreninger/[slug]/page.tsx
+++ b/web/src/app/foreninger/[slug]/page.tsx
@@ -1,7 +1,7 @@
import { getClient } from "@/app/client";
import { Blocks } from "@/components/blocks/Blocks";
import Icon from "@/components/general/Icon";
-import Image from "@/components/general/Image";
+import { Image } from "@/components/general/Image";
import { graphql } from "@/gql";
import { AssociationFragment } from "@/gql/graphql";
import Link from "next/link";
diff --git a/web/src/app/lokaler/[slug]/page.tsx b/web/src/app/lokaler/[slug]/page.tsx
index c27ad28..ab17e8d 100644
--- a/web/src/app/lokaler/[slug]/page.tsx
+++ b/web/src/app/lokaler/[slug]/page.tsx
@@ -1,7 +1,7 @@
import { getClient } from "@/app/client";
import { Blocks } from "@/components/blocks/Blocks";
import { ImageSliderBlock } from "@/components/blocks/ImageSliderBlock";
-import Image from "@/components/general/Image";
+import { Image } from "@/components/general/Image";
import { NeufMap } from "@/components/venues/NeufMap";
import { VenueInfo } from "@/components/venues/VenueInfo";
import { graphql } from "@/gql";
diff --git a/web/src/components/associations/AssociationItem.tsx b/web/src/components/associations/AssociationItem.tsx
index ba33d2f..d64305f 100644
--- a/web/src/components/associations/AssociationItem.tsx
+++ b/web/src/components/associations/AssociationItem.tsx
@@ -1,7 +1,7 @@
import { AssociationFragment } from "@/gql/graphql";
import styles from "./associationItem.module.scss";
import Link from "next/link";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
export const AssociationItem = ({
association,
diff --git a/web/src/components/blocks/FeaturedBlock.tsx b/web/src/components/blocks/FeaturedBlock.tsx
index 1a90247..ca0ff5f 100644
--- a/web/src/components/blocks/FeaturedBlock.tsx
+++ b/web/src/components/blocks/FeaturedBlock.tsx
@@ -1,6 +1,6 @@
import { FeaturedBlock as FeaturedBlockType } from "@/gql/graphql";
import Link from "next/link";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
import styles from "./featuredBlock.module.scss";
// the 'text' field has been aliased to 'featuredBlockText' and i'm
diff --git a/web/src/components/blocks/HorizontalRuleBlock.tsx b/web/src/components/blocks/HorizontalRuleBlock.tsx
index 0810705..564e55a 100644
--- a/web/src/components/blocks/HorizontalRuleBlock.tsx
+++ b/web/src/components/blocks/HorizontalRuleBlock.tsx
@@ -1,5 +1,5 @@
import { HorizontalRuleBlock as HorizontalRuleBlockType } from "@/gql/graphql";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
import styles from "./horizontalRuleBlock.module.scss";
export const HorizontalRuleBlock = ({
diff --git a/web/src/components/blocks/ImageSliderBlock.tsx b/web/src/components/blocks/ImageSliderBlock.tsx
index 8e6b66f..bd36d67 100644
--- a/web/src/components/blocks/ImageSliderBlock.tsx
+++ b/web/src/components/blocks/ImageSliderBlock.tsx
@@ -1,6 +1,6 @@
"use client";
import { ImageSliderBlock as ImageSliderBlockType } from "@/gql/graphql";
-import Image from "../general/Image";
+import { ImageFigure } from "@/components/general/Image";
import styles from "./imageSliderBlock.module.scss";
// import swiper modules & styles
@@ -31,18 +31,16 @@ export const ImageSliderBlock = ({
{block.images &&
block.images.map((imageItem: any, index: number) => (
-
-
- {imageItem.text && {imageItem.text}}
-
+
))}
diff --git a/web/src/components/blocks/ImageWithTextBlock.tsx b/web/src/components/blocks/ImageWithTextBlock.tsx
index 4b7190d..bb0d747 100644
--- a/web/src/components/blocks/ImageWithTextBlock.tsx
+++ b/web/src/components/blocks/ImageWithTextBlock.tsx
@@ -1,26 +1,20 @@
import { ImageWithTextBlock as ImageWithTextBlockType } from "@/gql/graphql";
-import Image from "../general/Image";
-import styles from "./imageWithTextBlock.module.scss";
+import { ImageFigure } from "@/components/general/Image";
-export const ImageWithTextBlock = ({
+export function ImageWithTextBlock({
block,
}: {
block: ImageWithTextBlockType;
-}) => {
+}) {
return (
-
-
- {block.text && {block.text}}
-
+
);
-};
+}
diff --git a/web/src/components/events/EventHeader.tsx b/web/src/components/events/EventHeader.tsx
index 2fda03e..e7cf0a8 100644
--- a/web/src/components/events/EventHeader.tsx
+++ b/web/src/components/events/EventHeader.tsx
@@ -1,6 +1,6 @@
import { EventFragment } from "@/lib/event";
import styles from "./eventHeader.module.scss";
-import Image from "@/components/general/Image";
+import { Image } from "@/components/general/Image";
import Link from "next/link";
import { OrganizerList } from "./OrganizerList";
import Icon from "../general/Icon";
@@ -17,6 +17,8 @@ function formatPrice(price: number): string {
}
export const EventHeader = ({ event }: { event: EventFragment }) => {
+ // TODO: where should we show image attribution for the featured image?
+
const featuredImage: any = event.featuredImage;
return (
diff --git a/web/src/components/events/EventItem.tsx b/web/src/components/events/EventItem.tsx
index e3f9d12..01a8b05 100644
--- a/web/src/components/events/EventItem.tsx
+++ b/web/src/components/events/EventItem.tsx
@@ -2,7 +2,7 @@
import styles from "./eventItem.module.scss";
import Link from "next/link";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
import {
SingularEvent,
EventFragment,
diff --git a/web/src/components/general/Image.tsx b/web/src/components/general/Image.tsx
index 8ad7516..7ee51a3 100644
--- a/web/src/components/general/Image.tsx
+++ b/web/src/components/general/Image.tsx
@@ -1,7 +1,25 @@
import NextImage, { ImageProps as NextImageProps } from "next/image";
+import styles from "./image.module.scss";
-type ImageProps = NextImageProps;
+type ImageProps = NextImageProps & {
+ attribution?: string | null;
+ caption?: string | null;
+ imageFormat?: string | null; // "original" | "bleed" | "fullWidth"
+};
-export default function Image(props: ImageProps) {
+export function ImageFigure(props: ImageProps) {
+ const { attribution, caption, imageFormat, ...nextImageProps } = props;
+ return (
+
+
+ {attribution && {attribution}
}
+ {caption && {caption}}
+
+ );
+}
+
+export function Image(props: NextImageProps) {
return ;
}
diff --git a/web/src/components/blocks/imageWithTextBlock.module.scss b/web/src/components/general/image.module.scss
similarity index 92%
rename from web/src/components/blocks/imageWithTextBlock.module.scss
rename to web/src/components/general/image.module.scss
index 2d4f677..4b4eff7 100644
--- a/web/src/components/blocks/imageWithTextBlock.module.scss
+++ b/web/src/components/general/image.module.scss
@@ -1,4 +1,4 @@
-.imageWithTextBlock {
+.image {
width: 100%;
margin: 0;
@@ -52,4 +52,8 @@
text-align: left;
}
}
+}
+
+.attribution {
+ border: 1px dotted mediumpurple;
}
\ No newline at end of file
diff --git a/web/src/components/news/NewsItem.tsx b/web/src/components/news/NewsItem.tsx
index 1bd130b..286cfbd 100644
--- a/web/src/components/news/NewsItem.tsx
+++ b/web/src/components/news/NewsItem.tsx
@@ -1,5 +1,5 @@
import styles from "./newsItem.module.scss";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
import { NewsFragment } from "@/lib/news";
import { formatDate } from "@/lib/date";
import Link from "next/link";
diff --git a/web/src/components/venues/VenueInfo.tsx b/web/src/components/venues/VenueInfo.tsx
index a1e0bbb..7ac40a6 100644
--- a/web/src/components/venues/VenueInfo.tsx
+++ b/web/src/components/venues/VenueInfo.tsx
@@ -1,7 +1,7 @@
import { VenueFragment } from "@/gql/graphql";
import styles from "./venueInfo.module.scss";
import Link from "next/link";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
import Icon from "../general/Icon";
export const VenueInfo = ({ venue }: { venue: VenueFragment }) => {
diff --git a/web/src/components/venues/VenueItem.tsx b/web/src/components/venues/VenueItem.tsx
index b73faa9..166798a 100644
--- a/web/src/components/venues/VenueItem.tsx
+++ b/web/src/components/venues/VenueItem.tsx
@@ -1,7 +1,7 @@
import { VenueFragment } from "@/gql/graphql";
import styles from "./venueItem.module.scss";
import Link from "next/link";
-import Image from "../general/Image";
+import { Image } from "@/components/general/Image";
export const VenueItem = ({ venue }: { venue: VenueFragment }) => {
const featuredImage: any = venue.featuredImage;