chore: update CHANGELOG.md for 0.3.0-alpha release and implement favicon support in Top Referrers component
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
import { useState, useEffect } from 'react'
|
||||
import { formatNumber } from '@/lib/utils/format'
|
||||
import { getReferrerIcon } from '@/lib/utils/icons'
|
||||
import { getReferrerFavicon, getReferrerIcon } from '@/lib/utils/icons'
|
||||
import { Modal, GlobeIcon } from '@ciphera-net/ui'
|
||||
import { getTopReferrers, TopReferrer } from '@/lib/api/stats'
|
||||
|
||||
@@ -19,6 +19,7 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
|
||||
const [isModalOpen, setIsModalOpen] = useState(false)
|
||||
const [fullData, setFullData] = useState<TopReferrer[]>([])
|
||||
const [isLoadingFull, setIsLoadingFull] = useState(false)
|
||||
const [faviconFailed, setFaviconFailed] = useState<Set<string>>(new Set())
|
||||
|
||||
// Filter out empty/unknown referrers
|
||||
const filteredReferrers = (referrers || []).filter(
|
||||
@@ -30,6 +31,22 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
|
||||
const emptySlots = Math.max(0, LIMIT - displayedReferrers.length)
|
||||
const showViewAll = hasData && filteredReferrers.length > LIMIT
|
||||
|
||||
function renderReferrerIcon(referrer: string) {
|
||||
const faviconUrl = getReferrerFavicon(referrer)
|
||||
const useFavicon = faviconUrl && !faviconFailed.has(referrer)
|
||||
if (useFavicon) {
|
||||
return (
|
||||
<img
|
||||
src={faviconUrl}
|
||||
alt=""
|
||||
className="w-5 h-5 flex-shrink-0 rounded object-contain"
|
||||
onError={() => setFaviconFailed((prev) => new Set(prev).add(referrer))}
|
||||
/>
|
||||
)
|
||||
}
|
||||
return <span className="text-lg flex-shrink-0">{getReferrerIcon(referrer)}</span>
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (isModalOpen) {
|
||||
const fetchData = async () => {
|
||||
@@ -80,7 +97,7 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
|
||||
{displayedReferrers.map((ref, index) => (
|
||||
<div key={index} className="flex items-center justify-between h-9 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors">
|
||||
<div className="flex-1 truncate text-neutral-900 dark:text-white flex items-center gap-3">
|
||||
<span className="text-lg flex-shrink-0">{getReferrerIcon(ref.referrer)}</span>
|
||||
{renderReferrerIcon(ref.referrer)}
|
||||
<span className="truncate" title={ref.referrer}>{ref.referrer}</span>
|
||||
</div>
|
||||
<div className="text-sm font-semibold text-neutral-600 dark:text-neutral-400 ml-4">
|
||||
@@ -123,7 +140,7 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
|
||||
(fullData.length > 0 ? fullData : filteredReferrers).map((ref, index) => (
|
||||
<div key={index} className="flex items-center justify-between py-2 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors">
|
||||
<div className="flex-1 truncate text-neutral-900 dark:text-white flex items-center gap-3">
|
||||
<span className="text-lg flex-shrink-0">{getReferrerIcon(ref.referrer)}</span>
|
||||
{renderReferrerIcon(ref.referrer)}
|
||||
<span className="truncate" title={ref.referrer}>{ref.referrer}</span>
|
||||
</div>
|
||||
<div className="text-sm font-semibold text-neutral-600 dark:text-neutral-400 ml-4">
|
||||
|
||||
Reference in New Issue
Block a user