import React, { ReactElement, ReactNode, useCallback, useContext, useMemo, } from 'react'; import { Columns, RHS } from '@/src/components/Columns'; import { Authentication, Parameters, Response, } from '@/src/components/Parameters'; import { LanguageContext } from '@/src/utils/contexts/languageContext'; import { LinkableContext } from '@/src/utils/contexts/linkableContext'; import { usePathname } from 'next/navigation'; import { useSetPage } from '@/src/components/scrollManager'; export const Languages = ["python", "typescript", "go", "curl"]; export type Language = (typeof Languages)[number]; export const DefaultLanguage = 'typescript'; export const LanguageProvider = (props: { children: ReactNode }) => { const slug = usePathname(); const setPage = useSetPage(); const language = useMemo(() => { // slug is in the form "/typescript/installation" (or null) const routeLang = slug?.split('/')[1]; return routeLang || DefaultLanguage; }, [slug]); const setLanguage = useCallback( (newLanguage: string) => { const langRoutePrefix = (lang: string) => `/${lang}/`; // Using window.location.pathname because router.asPath often has [...rest] in it const newPath = window.location.pathname.replace( langRoutePrefix(language), langRoutePrefix(newLanguage), ); setPage(newPath); }, [language, setPage], ); const context = { language, setLanguage, languages: Languages, }; return ( {props.children} ); }; export const LanguageSwitch = (props: { langToContent: Partial>; }) => { const { language } = useContext(LanguageContext); return ( {props.langToContent[language]} ); }; export const LanguageOperation = (props: { usage: ReactElement; authentication?: ReactElement; parameters: ReactElement; response: ReactElement; }) => ( {props.authentication ? ( {props.authentication} ) : null} {props.parameters} {props.response} {props.usage} );