Files
medusa-store/www/reference/src/components/search/hit-component.js
T
2022-04-05 11:22:25 +02:00

102 lines
2.7 KiB
JavaScript

import React, { useContext } from "react"
import NavigationContext from "../../context/navigation-context"
import { convertToKebabCase } from "../../utils/convert-to-kebab-case"
import { navigate } from "gatsby"
const HitComponent = ({ hit, children, data }) => {
const { goTo, api } = useContext(NavigationContext)
let { url, type, hierarchy } = hit
/** Get the API that is not currently being viewed, so we can create
* an URL that goes to the other API.
*/
const getOtherAPI = () => {
if (api === "store") return "admin"
if (api === "admin") return "store"
}
/** If result is part of currently viewed API then we scroll to the
* concept/method, and update the pages metadata.
*/
const goToHierarchy = e => {
e.preventDefault()
//find section
let section = data.sections.find((s) => s.section.section_name == hierarchy.lvl1);
section = section ? section.section : {}
if (hierarchy.lvl2) {
goTo({
section: convertToKebabCase(hierarchy.lvl1),
method: convertToKebabCase(hierarchy.lvl2),
sectionObj: section
})
} else {
goTo({ section: convertToKebabCase(hierarchy.lvl1), sectionObj: section })
}
}
/** If result is NOT part of currently viewed API, but still a part of
* the Gatsby site, then we use Gatsby's navigate function for improved
* linking.
*/
const navigateHierarchy = e => {
e.preventDefault()
if (hierarchy.lvl2) {
navigate(
`/api/${getOtherAPI()}/${convertToKebabCase(
hierarchy.lvl1
)}/${convertToKebabCase(hierarchy.lvl2)}`
)
} else {
navigate(`/api/${getOtherAPI()}/${convertToKebabCase(hierarchy.lvl1)}`)
}
}
/**
* If result is part of the API reference then we want to strip
* the #'s from the URL's. If the result is of LVL2 then we want
* to add the LVL1 to the URL: '/store/#create-cart' -> '/store/cart/create-cart'
*/
const formatURL = () => {
url = url.replace("#", "/")
if (type === "lvl2") {
const index = url.lastIndexOf("/")
url =
url.substring(0, index) +
`/${convertToKebabCase(hierarchy.lvl1)}` +
url.substring(index)
}
}
/**
* If the result is part of the currently viewed API
*/
if (url.includes(`api/${api}`)) {
formatURL()
return (
<a href={url} onClick={goToHierarchy}>
{children}
</a>
)
}
/**
* If the result is NOT part of the currently viewed API
*/
if (url.includes(`api/${getOtherAPI()}`)) {
formatURL()
return (
<a href={url} onClick={navigateHierarchy}>
{children}
</a>
)
}
/**
* If the result is part of the Docasaurus docs
*/
return <a href={url}>{children}</a>
}
export default HitComponent