'use client'
import { useSupabaseClient } from '@supabase/auth-helpers-react'
import { type SupabaseClient } from '@supabase/supabase-js'
import { X } from 'lucide-react'
import { useEffect, useRef, useState } from 'react'
import { useCommandMenu } from '@ui-patterns/Cmdk'
import { GenericSkeletonLoader } from '@ui-patterns/ShimmeringLoader'
import { type DocsSearchResult } from 'common'
import { Button, cn } from 'ui'
import ButtonCard from '~/components/ButtonCard'
function SearchButton() {
const { setIsOpen: setCommandMenuOpen } = useCommandMenu()
return (
)
}
async function getRecommendations(page: string, supabase: SupabaseClient) {
try {
const query = decodeURIComponent(page.replace(/^\/(?:guides|reference)\//, '')).replace(
/[_\/-]/g,
' '
)
if (!query) return []
const { data, error } = await supabase.rpc('docs_search_fts', { query })
if (error || !data?.length) return []
return data as Array>
} catch (err) {
console.error(err)
return []
}
}
function Recommendations({ page }: { page: string }) {
const supabase = useSupabaseClient()
const [recommendations, setRecommendations] = useState(
[] as Array>
)
const fetched = useRef(false)
useEffect(() => {
getRecommendations(page, supabase).then((data) => {
if (!fetched.current) {
setRecommendations(data)
fetched.current = true
}
})
}, [page, supabase])
return (
Are you looking for...?
{!fetched.current && }
{fetched.current && recommendations.length === 0 && }
{fetched.current && recommendations.length > 0 && (
)}
)
}
function LoadingState() {
return
}
function NoResults() {
return No recommendations found.
}
function RecommendationsList({
recommendations,
}: {
recommendations: Array>
}) {
return (
{recommendations
.filter(({ title }) => !!title)
.slice(0, 6)
.map(({ path, title, subtitle, description }) => (
))}
)
}
export { SearchButton, Recommendations }