1
0
mirror of synced 2025-12-19 18:10:59 -05:00
Files
docs/components/context/ArticleContext.tsx

108 lines
3.5 KiB
TypeScript

import { SupportPortalVaIframeProps } from 'components/article/SupportPortalVaIframe'
import { createContext, useContext } from 'react'
export type LearningTrack = {
trackTitle: string
trackName: string
trackProduct: string
prevGuide?: { href: string; title: string }
nextGuide?: { href: string; title: string }
numberOfGuides: number
currentGuideIndex: number
}
export type MiniTocItem = {
platform?: string
contents: {
href: string
title: string
}
items?: MiniTocItem[]
}
export type ArticleContextT = {
title: string
intro: string
effectiveDate: string
renderedPage: string | JSX.Element[]
miniTocItems: Array<MiniTocItem>
permissions?: string
includesPlatformSpecificContent: boolean
includesToolSpecificContent: boolean
defaultPlatform?: string
defaultTool?: string
product?: string
productVideoUrl?: string
currentLearningTrack?: LearningTrack
detectedPlatforms: Array<string>
detectedTools: Array<string>
allTools: Record<string, string>
supportPortalVaIframeProps: SupportPortalVaIframeProps
currentLayout?: string
}
export const ArticleContext = createContext<ArticleContextT | null>(null)
export const useArticleContext = (): ArticleContextT => {
const context = useContext(ArticleContext)
if (!context) {
throw new Error('"useArticleContext" may only be used inside "ArticleContext.Provider"')
}
return context
}
const PagePathToVaFlowMapping: Record<string, string> = {
'content/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/why-are-my-contributions-not-showing-up-on-my-profile.md':
'contribution_troubleshooting',
'content/authentication/securing-your-account-with-two-factor-authentication-2fa/recovering-your-account-if-you-lose-your-2fa-credentials.md':
'2fa',
'content/pages/getting-started-with-github-pages/securing-your-github-pages-site-with-https.md':
'pages_ssl_check',
}
export const getArticleContextFromRequest = (req: any): ArticleContextT => {
const page = req.context.page
if (page.effectiveDate) {
if (isNaN(Date.parse(page.effectiveDate))) {
throw new Error(
'The "effectiveDate" frontmatter property is not valid. Please make sure it is YEAR-MONTH-DAY',
)
}
}
const supportPortalUrl =
process.env.NODE_ENV === 'production'
? 'https://support.github.com'
: // Assume that a developer is not testing the VA iframe locally if this env var is not set
process.env.SUPPORT_PORTAL_URL || ''
const supportPortalVaIframeProps = {
supportPortalUrl,
vaFlowUrlParameter: PagePathToVaFlowMapping[req.context.page.fullPath] || '',
}
return {
title: page.title,
intro: page.intro,
effectiveDate: page.effectiveDate || '',
renderedPage: req.context.renderedPage || '',
miniTocItems: req.context.miniTocItems || [],
permissions: page.permissions || '',
includesPlatformSpecificContent: page.includesPlatformSpecificContent || false,
includesToolSpecificContent: page.includesToolSpecificContent || false,
defaultPlatform: page.defaultPlatform || '',
defaultTool: page.defaultTool || '',
product: page.product || '',
productVideoUrl: page.product_video || '',
currentLearningTrack: req.context.currentLearningTrack,
detectedPlatforms: page.detectedPlatforms || [],
detectedTools: page.detectedTools || [],
allTools: page.allToolsParsed || [], // this is set at the page level, see lib/page.js
supportPortalVaIframeProps,
currentLayout: req.context.currentLayoutName,
}
}