blocks/server-side/features-carousel/index.tsx (101 lines of code) (raw):
import React, { FC, useState } from 'react';
import classNames from 'classnames';
import { useTextStyles } from '@rescui/typography';
import SwipeableViews from 'react-swipeable-views';
import { Button } from '@rescui/button';
import { CodeHighlight } from '../../../components/code-highlight/code-highlight';
import { ArrowLeftIcon, ArrowRightIcon } from '@rescui/icons';
import styles from './index.module.css';
import { SnapCarousel } from '../../../components/snap-carousel/snap-carousel';
import { trackEvent } from '../../../utils/event-logger';
interface FeatureSlideItem {
id: string;
icon: ImgSrc;
title: React.ReactNode;
description: React.ReactNode;
codeSample: string;
}
interface CopyCodeButtonProps {
codeSample: string;
label: string;
}
const CopyCodeButton: FC<CopyCodeButtonProps> = ({ codeSample, label }) => {
const handleCopy = () => {
trackEvent({
eventAction: 'kt_server_side_code_snippet_copy',
eventLabel: label,
});
navigator.clipboard.writeText(codeSample);
};
return (
<Button
size="xs"
mode="rock"
theme="dark"
onClick={handleCopy}
className={styles.copyButton}
>
Copy Kotlin code
</Button>
);
};
interface FeatureCardProps {
icon: ImgSrc;
title: React.ReactNode;
description: React.ReactNode;
codeSample: string;
className?: string;
}
const FeatureCard: FC<FeatureCardProps> = ({
icon,
title,
description,
codeSample,
className
}) => {
const textCn = useTextStyles();
return (
<div className={classNames(styles.featureCard, className)}>
<div className={styles.content}>
<div className={styles.contentText}>
<div className={styles.contentIcon}>
<img className="" src={icon.src} alt="404" />
</div>
<h3 className={classNames(textCn('rs-h3'), 'jb-offset-top-16')}>{title}</h3>
<p
className={classNames(
textCn('rs-text-2', { hardness: 'hard' }),
'jb-offset-top-8'
)}
>
{description}
</p>
</div>
</div>
<div className={styles.imageWrapper}>
<CopyCodeButton codeSample={codeSample} label={title.toString()} />
<CodeHighlight code={codeSample} className={styles.codeBlock} />
</div>
</div>
);
};
interface FeaturesCarouselProps {
featuresData: FeatureSlideItem[];
className?: string;
}
export const FeaturesCarousel: FC<FeaturesCarouselProps> = ({ featuresData, className }) => {
return (
<div className={classNames(styles.carouselContainer, className)}>
<SnapCarousel>
{featuresData.map(feature => (
<FeatureCard
className={styles.slide}
key={feature.id}
{...feature}
/>
))}
</SnapCarousel>
</div>
);
};
export default FeaturesCarousel;