diff --git a/apps/www/pages/partners/experts/[slug].tsx b/apps/www/pages/partners/experts/[slug].tsx new file mode 100644 index 00000000000..e06148d892e --- /dev/null +++ b/apps/www/pages/partners/experts/[slug].tsx @@ -0,0 +1,244 @@ +import {marked} from 'marked' +import {GetStaticPaths, GetStaticProps} from 'next' +import {NextSeo} from 'next-seo' +import Image from 'next/image' +import Link from 'next/link' +import {Swiper, SwiperSlide} from 'swiper/react' +import 'swiper/swiper.min.css' +import {IconChevronLeft, IconExternalLink} from 'ui' +import DefaultLayout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import supabase from '~/lib/supabase' +import {Partner} from '~/types/partners' +import Error404 from '../../404' + +function Partner({ partner }: { partner: Partner }) { + if (!partner) return + return ( + <> + + + + + + {/* Back button */} + + + + Back + + + + + + + {partner.title} + + + + + + {partner.images.map((image: any, i: number) => { + return ( + + + + + + ) + })} + + + + + + + Overview + + + {partner.video && ( + + + + )} + + + + + + + Details + + + + {partner.type === 'technology' && ( + + Developer + {partner.developer} + + )} + + + Category + + + {partner.category} + + + + + + Website + + {new URL(partner.website).host} + + + + {partner.type === 'technology' && ( + + Documentation + + + Learn + + + + + )} + + + + + + + > + ) +} + +// This function gets called at build time +export const getStaticPaths: GetStaticPaths = async () => { + const { data: slugs } = await supabase.from('partners').select('slug') + + const paths: { + params: { slug: string } + locale?: string | undefined + }[] = + slugs?.map(({ slug }) => ({ + params: { + slug, + }, + })) ?? [] + + return { + paths, + fallback: 'blocking', + } +} + +// This also gets called at build time +export const getStaticProps: GetStaticProps = async ({ params }) => { + let { data: partner } = await supabase + .from('partners') + .select('*') + .eq('approved', true) + .eq('slug', params!.slug as string) + .single() + + if (!partner) { + return { + notFound: true, + } + } + + // Parse markdown + partner.overview = marked.parse(partner.overview) + + return { + props: { partner }, + revalidate: 18000, // In seconds - refresh every 5 hours + } +} + +export default Partner diff --git a/apps/www/pages/partners/integrations/[slug].tsx b/apps/www/pages/partners/integrations/[slug].tsx new file mode 100644 index 00000000000..357ff79294a --- /dev/null +++ b/apps/www/pages/partners/integrations/[slug].tsx @@ -0,0 +1,244 @@ +import {marked} from 'marked' +import {GetStaticPaths, GetStaticProps} from 'next' +import {NextSeo} from 'next-seo' +import Image from 'next/image' +import Link from 'next/link' +import {Swiper, SwiperSlide} from 'swiper/react' +import 'swiper/swiper.min.css' +import {IconChevronLeft, IconExternalLink} from 'ui' +import DefaultLayout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import supabase from '~/lib/supabase' +import {Partner} from '~/types/partners' +import Error404 from '../../404' + +function Partner({ partner }: { partner: Partner }) { + if (!partner) return + return ( + <> + + + + + + {/* Back button */} + + + + Back + + + + + + + {partner.title} + + + + + + {partner.images.map((image: any, i: number) => { + return ( + + + + + + ) + })} + + + + + + + Overview + + + {partner.video && ( + + + + )} + + + + + + + Details + + + + {partner.type === 'technology' && ( + + Developer + {partner.developer} + + )} + + + Category + + + {partner.category} + + + + + + Website + + {new URL(partner.website).host} + + + + {partner.type === 'technology' && ( + + Documentation + + + Learn + + + + + )} + + + + + + + > + ) +} + +// This function gets called at build time +export const getStaticPaths: GetStaticPaths = async () => { + const { data: slugs } = await supabase.from('partners').select('slug') + + const paths: { + params: { slug: string } + locale?: string | undefined + }[] = + slugs?.map(({ slug }) => ({ + params: { + slug, + }, + })) ?? [] + + return { + paths, + fallback: 'blocking', + } +} + +// This also gets called at build time +export const getStaticProps: GetStaticProps = async ({ params }) => { + let { data: partner } = await supabase + .from('partners') + .select('*') + .eq('approved', true) + .eq('slug', params!.slug as string) + .single() + + if (!partner) { + return { + notFound: true, + } + } + + // Parse markdown + partner.overview = marked.parse(partner.overview) + + return { + props: { partner }, + revalidate: 18000, // In seconds - refresh every 5 hours + } +} + +export default Partner