11'use client' ;
22
3- import React , { useState } from 'react' ;
43import { useParams } from 'next/navigation' ;
54import { graphql } from '@/gql' ;
6- import { TypeUseCase } from '@/gql/generated/graphql' ;
5+ import { TypeDataset , TypeUseCase } from '@/gql/generated/graphql' ;
76import { useQuery } from '@tanstack/react-query' ;
8- import { Spinner } from 'opub-ui' ;
7+ import { Card , Spinner , Text } from 'opub-ui' ;
98
109import { GraphQL } from '@/lib/api' ;
1110import BreadCrumbs from '@/components/BreadCrumbs' ;
1211import PrimaryDetails from '../components/Details' ;
1312import Metadata from '../components/Metadata' ;
13+ import { Icons } from '@/components/icons' ;
14+ import { formatDate } from '@/lib/utils' ;
15+ import { Loading } from '@/components/loading' ;
1416
1517const UseCasedetails : any = graphql ( `
1618 query UseCasedetails($pk: ID!) {
@@ -82,7 +84,6 @@ const UseCasedetails: any = graphql(`
8284
8385const UseCaseDetailPage = ( ) => {
8486 const params = useParams ( ) ;
85- console . log ( params . useCaseSlug ) ;
8687 const {
8788 data : UseCaseDetails ,
8889 isLoading,
@@ -102,12 +103,13 @@ const UseCaseDetailPage = () => {
102103 refetchOnReconnect : true ,
103104 }
104105 ) ;
106+ const datasets = UseCaseDetails ?. useCase ?. datasets || [ ] ; // Fallback to an empty array
105107
106108 return (
107109 < div >
108110 { isLoading ? (
109111 < div className = " flex justify-center p-10" >
110- < Spinner />
112+ < Loading />
111113 </ div >
112114 ) : (
113115 < >
@@ -118,12 +120,63 @@ const UseCaseDetailPage = () => {
118120 { href : '#' , label : UseCaseDetails ?. useCase ?. title || '' } ,
119121 ] }
120122 />
121- < div className = "flex flex-row bg-surfaceDefault " >
122- < div className = "w-full border-r-2 border-solid border-greyExtralight p-8 lg:w-3/4 lg:p-10" >
123- < PrimaryDetails data = { UseCaseDetails } isLoading = { isLoading } />
123+ < div className = " bg-onSurfaceDefault" >
124+ < div className = "flex flex-row" >
125+ < div className = "w-full border-r-2 border-solid border-greyExtralight p-8 lg:w-3/4 lg:p-10" >
126+ < PrimaryDetails data = { UseCaseDetails } isLoading = { isLoading } />
127+ </ div >
128+ < div className = "hidden lg:block lg:w-1/4" >
129+ < Metadata data = { UseCaseDetails } />
130+ </ div >
124131 </ div >
125- < div className = "hidden lg:block lg:w-1/4" >
126- < Metadata data = { UseCaseDetails } />
132+ < div className = "p-8 lg:p-14" >
133+ < div className = " flex flex-col gap-1" >
134+ < Text variant = "heading3xl" > Datasets in this Use Case</ Text >
135+ < Text variant = "headingLg" fontWeight = "regular" >
136+ All Datasets related to this Use Case
137+ </ Text >
138+ </ div >
139+ < div className = "grid w-full grid-cols-1 gap-6 pt-10 md:grid-cols-2 lg:grid-cols-3" >
140+ { datasets . length > 0 &&
141+ datasets . map (
142+ ( dataset : TypeDataset ) => (
143+ < Card
144+ key = { dataset . id }
145+ title = { dataset . title }
146+ variation = { 'collapsed' }
147+ iconColor = { 'warning' }
148+ metadataContent = { [
149+ {
150+ icon : Icons . calendar ,
151+ label : 'Date' ,
152+ value : formatDate ( dataset . modified ) ,
153+ } ,
154+ {
155+ icon : Icons . download ,
156+ label : 'Download' ,
157+ value : dataset . downloadCount . toString ( ) ,
158+ } ,
159+ {
160+ icon : Icons . globe ,
161+ label : 'Geography' ,
162+ value : dataset . metadata ?. find (
163+ ( meta : any ) => meta . metadataItem ?. label === 'Geography'
164+ ) ?. value || '' ,
165+ } ,
166+ ] }
167+ href = { `/datasets/${ dataset . id } ` }
168+ footerContent = { [
169+ {
170+ icon : `/Sectors/${ dataset . sectors [ 0 ] . name } .svg` ,
171+ label : 'Sectors' ,
172+ } ,
173+ { icon : '/fallback.svg' , label : 'Published by' } ,
174+ ] }
175+ description = { dataset . description || '' }
176+ />
177+ )
178+ ) }
179+ </ div >
127180 </ div >
128181 </ div >
129182 </ >
0 commit comments