blocks/server-side/features-switcher/index.tsx (105 lines of code) (raw):
import React, { FC, useCallback, useState } from 'react';
import classNames from 'classnames';
import { useTextStyles } from '@rescui/typography';
import { Button } from '@rescui/button';
import { CodeHighlight } from '../../../components/code-highlight/code-highlight';
import styles from './index.module.css';
import { trackEvent } from '../../../utils/event-logger';
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 CustomSlideProps {
codeSample: string;
label: string;
}
const CustomSlide: FC<CustomSlideProps> = ({ codeSample, label }) => (
<div className={styles.slide}>
<CopyCodeButton codeSample={codeSample} label={label} />
<CodeHighlight code={codeSample} className={styles.codeBlock} />
</div>
);
interface FeatureSlideItem {
id: string;
icon: ImgSrc;
title: React.ReactNode;
description: React.ReactNode;
codeSample: string;
}
interface FeaturesSwitcherProps {
slides: FeatureSlideItem[];
className?: string;
onTab?: (label: string) => void
}
export const FeaturesSwitcher: FC<FeaturesSwitcherProps> = ({ slides, className, onTab }) => {
const textCn = useTextStyles();
const [currentSlideIndex, setCurrentSlideIndex] = useState(0);
const onSelect = useCallback((index: number, id: string) => {
setCurrentSlideIndex(index);
if (onTab) {
onTab(id);
}
}, []);
return (
<div className={classNames(styles.slideshow, className)}>
<div className={styles.slidesPanel}>
<ul className={styles.slidesSwitcher}>
{slides.map((slide, i) => (
<li className={i === 0 ? '' : styles.offsettop12} key={slide.id}>
<button
type="button"
tabIndex={0}
onClick={() => onSelect(i, slide.id)}
className={classNames(styles.tab, i === currentSlideIndex ? styles.tabActive : '')}
>
<p className={classNames(textCn('rs-h3'), styles.tabTitle)}>{slide.title}</p>
{ i === currentSlideIndex && (
<p
className={classNames(
textCn('rs-text-2', {
hardness: 'hard',
}),
styles.tabDescription
)}
>
{slide.description}
</p>
)}
</button>
</li>
))}
</ul>
</div>
<div className={styles.slides}>
{slides.map((slide, i) => (
<div
key={slide.id}
className={classNames(
styles.slide,
i === currentSlideIndex || (currentSlideIndex === -1 && i === 0)
? styles.slideVisible
: styles.slideHidden
)}
>
<CustomSlide key={slide.id} label={slide.title.toString()} {...slide} />
</div>
))}
</div>
</div>
);
};
export default FeaturesSwitcher;