From 88bb059094c9b734f7b1a392cd0d49480357093c Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Wed, 17 Feb 2021 14:10:19 +0300 Subject: [PATCH] strapi card grid support --- pages/[...slug].tsx | 9 ++++++ pages/index.tsx | 53 +++++++++++-------------------- src/components/PageGrid/index.tsx | 4 +-- src/remote/factory.ts | 30 ++++++++++++++++- src/remote/types.ts | 7 ++++ src/types.ts | 16 +++++++++- 6 files changed, 81 insertions(+), 38 deletions(-) diff --git a/pages/[...slug].tsx b/pages/[...slug].tsx index 65c314c2..66e83185 100644 --- a/pages/[...slug].tsx +++ b/pages/[...slug].tsx @@ -15,6 +15,7 @@ import { Html } from 'src/components/Html' import { Youtube } from '@/components/Youtube' import { createPage, createPageUrls } from '@/remote/factory' import { paramsToSlug } from '@/remote/lib' +import { PageGrid } from '@/components/PageGrid' async function getUrls() { let urls = [] @@ -147,6 +148,14 @@ const Index: NextPage = props => ( ) + case 'grid': + return ( + + ) + default: return (
diff --git a/pages/index.tsx b/pages/index.tsx
index d4856456..8e8e9d0b 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -15,42 +15,27 @@ type Props = {
     items: PageCardDto[]
 }
 
-const Index: NextPage = props => {
-    const items = props.items.map(item => ({
-        id: item.id,
-        url: item.url,
-        title: item.title,
-        featured: item.featured,
-        date: new Date(item.date),
-        cover: {
-            src: item.cover.src,
-            width: item.cover.width,
-            height: item.cover.height,
-        }
-    }))
+const Index: NextPage = props => (
+    
+        
+            {props.title}
+            
+        
 
-    return (
-        
-            
-                {props.title}
-                
-            
+        
 
-            
-
-            
-        
-    )
-}
+        
+    
+)
 
 export const getStaticProps = async () => {
     const url = 'https://hudozka.tmshv.com/home'
diff --git a/src/components/PageGrid/index.tsx b/src/components/PageGrid/index.tsx
index d6f564a7..6b8aea4c 100644
--- a/src/components/PageGrid/index.tsx
+++ b/src/components/PageGrid/index.tsx
@@ -1,5 +1,5 @@
 import Image from 'next/image'
-import { ImageSize, PageCardData } from 'src/types'
+import { ImageSize, PageCardData, PageCardDto } from 'src/types'
 import { CardGrid } from '../CardGrid'
 import { Card, CardLayout } from '../Card'
 import { Date } from './Date'
@@ -10,7 +10,7 @@ import { Button } from '../Button'
 import { useState, useCallback } from 'react'
 
 export type PageGridProps = {
-    items: PageCardData[]
+    items: PageCardDto[]
 }
 
 export const PageGrid: React.FC = props => {
diff --git a/src/remote/factory.ts b/src/remote/factory.ts
index 472e496e..4fac8e9f 100644
--- a/src/remote/factory.ts
+++ b/src/remote/factory.ts
@@ -1,7 +1,7 @@
 import { getResizedUrl } from "@/lib/image";
 import { IPage, ITag, PageCardDto, Token } from "@/types";
 import { asItem } from "./lib";
-import { StrapiComponentEmbed, StrapiComponent, StrapiHome, StrapiPage, StrapiPageCard } from "./types";
+import { StrapiComponentEmbed, StrapiComponent, StrapiHome, StrapiPage, StrapiPageCard, StrapiComponentCardGrid } from "./types";
 
 export function createPageUrls(pages: StrapiPage[]) {
     return {
@@ -76,6 +76,15 @@ export function createPageTokens(components: StrapiComponent[]): Token[] {
                 return createEmbed(component)
             }
 
+            case 'hudozka.card-grid': {
+                return {
+                    token: 'grid',
+                    data: {
+                        items: component.items.map(createCardGrid)
+                    }
+                }
+            }
+
             default:
                 return {
                     token: 'text',
@@ -132,6 +141,25 @@ function isCardFeatured(card: StrapiPageCard): boolean {
     return card.layout === 'big' || card.layout === 'medium'
 }
 
+export function createCardGrid(card: StrapiPageCard): PageCardDto {
+    // const cover = item.coverSrc ?? process.env.APP_CARD_DEFAULT_IMAGE
+
+    return {
+        id: card.id,
+        // id: card.page.id,
+        url: card.page.slug,
+        title: card.page.title,
+        featured: isCardFeatured(card),
+        date: card.page.date,
+        cover: {
+            src: card.page.cover.url,
+            width: card.page.cover.width,
+            height: card.page.cover.height,
+            // alt: '',
+        }
+    }
+
+
 export function createHomeCards(data: StrapiHome): PageCardDto[] {
     // const cover = item.coverSrc ?? process.env.APP_CARD_DEFAULT_IMAGE
 
diff --git a/src/remote/types.ts b/src/remote/types.ts
index 3c41eaef..40d5124e 100644
--- a/src/remote/types.ts
+++ b/src/remote/types.ts
@@ -73,11 +73,18 @@ export type StrapiComponentEmbed = {
     src: string,
 }
 
+export type StrapiComponentCardGrid = {
+    __component: "hudozka.card-grid",
+    id: number,
+    items: StrapiPageCard[],
+}
+
 export type StrapiComponent =
     | StrapiComponentText
     | StrapiComponentImage
     | StrapiComponentDocument
     | StrapiComponentEmbed
+    | StrapiComponentCardGrid
 
 export type StrapiTag = {
     id: number,
diff --git a/src/types.ts b/src/types.ts
index 9f5aa87a..983dceac 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -158,4 +158,18 @@ export type InstagramToken = {
     }
 }
 
-export type Token = TextToken | ImageToken | FileToken | HtmlToken | YoutubeToken | InstagramToken
+export type GridToken = {
+    token: 'grid'
+    data: {
+        items: PageCardDto[]
+    }
+}
+
+export type Token =
+    | TextToken
+    | ImageToken
+    | FileToken
+    | HtmlToken
+    | YoutubeToken
+    | InstagramToken
+    | GridToken