blocks/multiplatform/case-studies/grid.tsx (48 lines of code) (raw):
import cn from 'classnames';
import { useTextStyles } from '@rescui/typography';
import { CaseStudiesGrid } from '../../case-studies/grid/case-studies-grid';
import { FilteredCasesProvider, FilterOptions } from '../../case-studies/filter/use-filtered-cases';
import { CaseItem } from '../../case-studies/case-studies';
import styles from './grid.module.css';
import { Button } from '@rescui/button';
import { useRouter } from 'next/router';
import { useCallback } from 'react';
import { useMS } from '@jetbrains/kotlin-web-site-ui/out/components/breakpoints-v2';
const FILTER: FilterOptions = {
type: 'multiplatform'
} as const;
const CASES_HIGHLIGHTED: Readonly<CaseItem['id'][]> = Object.freeze([
'case-study-mcdonalds-umain',
'case-study-wrike',
'case-study-netflix',
'case-study-google-workspace',
'case-study-bilibili',
'case-study-x',
'case-study-duolingo'
].reverse());
function filterHighlighted(items: CaseItem[]) {
const lastOfHighlighted = Math.min(items.length, Math.max(CASES_HIGHLIGHTED.length, 7));
return [...items]
.sort((a, b) => CASES_HIGHLIGHTED.indexOf(b.id) - CASES_HIGHLIGHTED.indexOf(a.id))
.slice(0, lastOfHighlighted);
}
const LINK_CASES = '/case-studies/?type=multiplatform' as const;
export function CaseStudies() {
const router = useRouter();
const textCn = useTextStyles();
const isMS = useMS();
const handleNavigate = useCallback((e) => {
e.preventDefault();
router.replace({ hash: '' }, undefined, { scroll: false, shallow: true });
router.push(LINK_CASES);
}, [router]);
return (
<FilteredCasesProvider filter={FILTER} preprocess={filterHighlighted}>
<section className={cn(styles.section, 'ktl-layout', 'ktl-layout--center')}>
<h2 className={cn(styles.title, textCn('rs-h1'))}>Real-world success stories</h2>
<CaseStudiesGrid mode={'rock'} className={styles.grid}/>
<Button className={styles.btn} size={isMS ? 'm' : 'l'} mode={'outline'} href={LINK_CASES} onClick={handleNavigate}>
Explore more customer stories
</Button>
</section>
</FilteredCasesProvider>
);
}