import {ElementType, useEffect, useState} from 'react' import fetcher from '@/lib/fetcher' import {numberFormat} from '@/lib/numberFormat' import {supabase} from '@/lib/supabase' type ViewsProps = { as?: ElementType slug: string className?: string shouldUpdateViews?: boolean } const NEXT_PUBLIC_SITE_URL = process.env.NEXT_PUBLIC_SITE_URL export function Views({as: Component = 'span', slug, className, shouldUpdateViews = false}: ViewsProps) { const [views, setViews] = useState(0) useEffect(() => { const sub = supabase .channel('any') .on('postgres_changes', { event: 'UPDATE', schema: 'public', table: 'analytics', filter: `slug=eq.${slug}` }, payload => { setViews(payload.new.views) }) .subscribe(); return () => { sub.unsubscribe() } }, []) useEffect(() => { const getViews = async () => { const {views} = await fetcher(`${NEXT_PUBLIC_SITE_URL}/api/views/${slug}`) setViews(views) }; getViews() }, []) useEffect(() => { if (shouldUpdateViews) { const registerView = async () => { const {views} = await fetcher(`${NEXT_PUBLIC_SITE_URL}/api/views/${slug}`, { method: 'POST' } ) }; registerView() } }, []) return ( {` · ${views > 0 ? numberFormat(views) : '—'} views`} ) }