Skip to content

Commit

Permalink
Output cards with dynamic content
Browse files Browse the repository at this point in the history
  • Loading branch information
sashachabin committed Jul 13, 2023
1 parent f42382e commit f2d7490
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 14 deletions.
1 change: 1 addition & 0 deletions client/api/main-page/main-page.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export interface Card {
cardId: null;
subtitle: null | string;
subtitleColor: string;
dynamicId: string;
createdAt: Date;
updatedAt: Date;
publishedAt: Date;
Expand Down
1 change: 1 addition & 0 deletions client/components/MainPage/Card/Card.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

--CardSubtitleColor: inherit;

position: relative;
display: flex;
flex-direction: column;
align-items: flex-start;
Expand Down
14 changes: 10 additions & 4 deletions client/components/MainPage/Card/Card.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import React from 'react';
import classNames from 'classnames/bind';
import { CardProps } from './Card.types';

Expand All @@ -24,6 +23,7 @@ export function Card({
buttonBackground,
subtitle,
subtitleColor,
dynamicContent
}: CardProps) {

return (
Expand All @@ -43,9 +43,15 @@ export function Card({
{t(title)}
</div>}

{subtitle && <div className={cn(styles.CardSubtitle)}>
{t(subtitle)}
</div>}
{
dynamicContent
? dynamicContent
: <>
{subtitle && <div className={cn(styles.CardSubtitle)}>
{subtitle}
</div>}
</>
}
</a>
);
}
3 changes: 3 additions & 0 deletions client/components/MainPage/Card/Card.types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ReactElement } from "react";

export type CardProps = {
title: string;
titleColor: string;
Expand All @@ -11,5 +13,6 @@ export type CardProps = {
subtitle: string;
subtitleColor: string;
invert: boolean;
dynamicContent: ReactElement;
key: number;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.CardTrafficJams {
position: absolute;
bottom: .35em;
right: .45em;
font-size: 100px;
}
20 changes: 20 additions & 0 deletions client/components/MainPage/Card/CardDynamic/CardTrafficJams.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import classNames from 'classnames/bind';

import styles from './CardTrafficJams.module.css';

const cn = classNames.bind(styles);

export function CardTrafficJams({ score }) {
return (
<>
{/* Remove card background */}
<style dangerouslySetInnerHTML={{
__html: `[class*="Card_Card"]:has([class*="CardTrafficJams"]) {background: white;}`
}}
/>
<div className={cn(styles.CardTrafficJams)}>
{score}
</div>
</>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.CardTransportA11y {
color: rgba(255,255,255,.9);
font-size: 1.1em;
}

.CardTransportA11yList {
display: flex;
gap: 16px;
}

.CardTransportA11yItem {
font-weight: 600;
text-align: left;
}

.CardTransportA11yItem dd {
margin: 4px 0 0;
}
32 changes: 32 additions & 0 deletions client/components/MainPage/Card/CardDynamic/CardTransportA11y.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import classNames from 'classnames/bind';

import styles from './CardTransportA11y.module.css';

const cn = classNames.bind(styles);

export function CardTransportA11y({ buses, trolls, trams }) {
return (
<div className={cn(styles.CardTransportA11y)}>
<p>
Сейчас в городе ходит низкопольный транспорт:
</p>

<dl className={cn(styles.CardTransportA11yList)}>
<div className={cn(styles.CardTransportA11yItem)}>
<dt>Автобусы</dt>
<dd>{buses}</dd>
</div>

<div className={cn(styles.CardTransportA11yItem)}>
<dt>Троллейбусы</dt>
<dd>{trolls}</dd>
</div>

<div className={cn(styles.CardTransportA11yItem)}>
<dt>Трамваи</dt>
<dd>{trams}</dd>
</div>
</dl>
</div>
)
}
21 changes: 15 additions & 6 deletions client/components/MainPage/MainPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import React from 'react';
import classNames from 'classnames/bind';
import { MainPageTypes } from './MainPage.types';
import { Card } from './Card/Card';
import { CardTrafficJams } from './Card/CardDynamic/CardTrafficJams';
import { CardTransportA11y } from './Card/CardDynamic/CardTransportA11y';

import Logo from './Logo.svg';
import Footer from './Footer.svg';
Expand All @@ -13,9 +15,15 @@ import { Marquee } from './Marquee/Marquee';

const cn = classNames.bind(styles);

export function MainPage({ cards, trafficJams, a11yTransportCounters, marqueeItems }: MainPageTypes) {
// TODO Output data to dynamic cards
console.log({ trafficJams, a11yTransportCounters });
export function MainPage({ cards, cardsDynamicData, marqueeItems }: MainPageTypes) {
const getDynamicContent = (dynamicId) => {
switch (dynamicId) {
case 'a11y-transport':
return <CardTransportA11y {...cardsDynamicData.a11yTransportCounters} />
case 'traffic-jams':
return <CardTrafficJams score={cardsDynamicData.trafficJams} />
}
}

return (
<div className={cn(styles.MainPage)}>
Expand All @@ -28,8 +36,8 @@ export function MainPage({ cards, trafficJams, a11yTransportCounters, marqueeIte
<div className={styles.MainPageCardGrid}>
{cards
.sort((a, b) => a.attributes.priority - b.attributes.priority)
.map(({ id, attributes }) => (
<Card
.map(({ id, attributes }) => {
return <Card
title={attributes.title}
titleColor={attributes.titleColor}
titleBackground={attributes.titleBackground}
Expand All @@ -42,9 +50,10 @@ export function MainPage({ cards, trafficJams, a11yTransportCounters, marqueeIte
subtitle={attributes.subtitle}
subtitleColor={attributes.subtitleColor}
invert={attributes.invert}
dynamicContent={getDynamicContent(attributes.dynamicId)}
key={id}
/>
))}
})}
</div>

<Marquee items={marqueeItems.map(({ attributes: { message } }) => message)} />
Expand Down
6 changes: 4 additions & 2 deletions client/components/MainPage/MainPage.types.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import type {

export type MainPageTypes = {
cards: Card[];
trafficJams: number;
a11yTransportCounters: AccessibilityTransportCounters,
cardsDynamicData: {
trafficJams: number;
a11yTransportCounters: AccessibilityTransportCounters,
};
notifications: Notification[];
marqueeItems: Marquee[];
};
6 changes: 4 additions & 2 deletions client/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ export async function getStaticProps() {
return {
props: {
cards: await MainPageApi.getCards() || [],
trafficJams: await MainPageApi.getTrafficJamsCounter() || null,
a11yTransportCounters: await MainPageApi.getA11yTransportCounters() || {},
cardsDynamicData: {
trafficJams: await MainPageApi.getTrafficJamsCounter() || null,
a11yTransportCounters: await MainPageApi.getA11yTransportCounters() || {},
},
marqueeItems: await MainPageApi.getMarqueeItems() || [],
},
revalidate: 60,
Expand Down

1 comment on commit f2d7490

@ekbdev
Copy link

@ekbdev ekbdev commented on f2d7490 Jul 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deploy preview for transport ready!

✅ Preview
https://transport-bi9cmwunp-ekbdev.vercel.app
https://ekbdev-transport-feature-output-dynamic-cards.vercel.app

Built with commit f2d7490.
This pull request is being automatically deployed with vercel-action

Please sign in to comment.