blocks/case-studies/card/case-studies-card.tsx (83 lines of code) (raw):
import YoutubePlayer from '@jetbrains/kotlin-web-site-ui/out/components/youtube-player';
import { useTextStyles } from '@rescui/typography';
import React from 'react';
import cn from 'classnames';
import styles from './case-studies-card.module.css';
import { CaseItem } from '../case-studies';
import { PlatformIcon } from '../platform-icon/platform-icon';
import { mdToHtml } from '../../../utils/mdToHtml';
import { Theme, ThemeProvider, useThemeWithUndefined } from '@rescui/ui-contexts';
function reverse(theme: Theme): Theme {
return theme === 'light' ? 'dark' : 'light';
}
export type CaseStudyCardProps = CaseItem & {
className?: string;
mode?: 'rock' | 'classic';
};
export const CaseStudyCard: React.FC<CaseStudyCardProps> = props => {
const theme = useThemeWithUndefined();
return <ThemeProvider theme={props.mode === 'rock' ? reverse(theme) : theme}>
<CaseStudyCardText {...props} />
</ThemeProvider>;
};
const CaseStudyCardText: React.FC<CaseStudyCardProps> = ({ className, mode, ...item }) => {
const textCn = useTextStyles();
const normalLogo = item.logo || [];
const propertyName = mode === 'rock' ? 'alternateLogo' : 'logo';
const logo = item[propertyName]?.[0] || normalLogo[0];
const optionalSecondLogo = item[propertyName]?.[1] || normalLogo[1];
const isYoutube = item.media?.type === 'youtube';
const videoId = item.media?.type === 'youtube' ? item.media.videoId : undefined;
const imageSrc = item.media?.type === 'image' ? item.media.path : undefined;
return (
<article
className={cn(styles.card, className, styles[mode || 'classic'], textCn('rs-text-2', { hardness: 'hard' }))}
data-testid="case-studies-card">
<div className={styles.content}>
{logo &&
<div className={styles.logos}>
<img className={styles.logo} src={logo} alt={item.id} height={64} />
{optionalSecondLogo && (
<img className={styles.logo} src={optionalSecondLogo} alt="" height={64} />
)}
</div>
}
{item.description &&
<div
className={cn(styles.description)}
dangerouslySetInnerHTML={{ __html: mdToHtml(item.description) }}
data-testid="case-studies-card-description"
/>}
{item.signature &&
<div>
<strong className={styles.name}>{item.signature.name}</strong>
<div className={cn(styles.position, textCn('rs-text-2', {hardness: 'average'}))}>{item.signature.position}</div>
</div>
}
{item.link &&
<a
className={cn(styles.link, textCn('rs-link', {external: true}))}
href={item.link}
>
{item.linkText || 'Read the full story'}
</a>
}
{item.platforms && item.platforms.length > 0 &&
<div className={styles.platforms} aria-label="Platforms">
{item.platforms.map((platform) =>
<PlatformIcon key={platform} platform={platform} />
)}
</div>
}
</div>
{item.media &&
<div className={styles.media}>
{isYoutube ?
<YoutubePlayer
className={styles.youtubePlayer}
mode={0}
id={videoId}
previewImgSrc={`https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`}
/>
:
<img className={styles.mediaImage} src={imageSrc} alt={`${item.id} case`} />
}
</div>
}
</article>
);
};