mirror of
https://git.coastit.co.za/caitlin/CRM_ENVR.git
synced 2026-07-10 03:05:43 +02:00
Fixed the gif picker just need to add in gifs
This commit is contained in:
@@ -15,11 +15,7 @@ export async function GET(request: NextRequest) {
|
|||||||
const pos = searchParams.get("pos") || ""
|
const pos = searchParams.get("pos") || ""
|
||||||
|
|
||||||
if (!TENOR_API_KEY) {
|
if (!TENOR_API_KEY) {
|
||||||
return NextResponse.json({
|
return NextResponse.json({ results: [], noKey: true })
|
||||||
results: [],
|
|
||||||
error: "TENOR_API_KEY not configured",
|
|
||||||
noKey: true,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const endpoint = q
|
const endpoint = q
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ export default function MediaPicker({ onEmojiSelect, onMediaSelect, onClose, the
|
|||||||
const [gifResults, setGifResults] = useState<any[]>([])
|
const [gifResults, setGifResults] = useState<any[]>([])
|
||||||
const [gifLoading, setGifLoading] = useState(false)
|
const [gifLoading, setGifLoading] = useState(false)
|
||||||
const [gifError, setGifError] = useState("")
|
const [gifError, setGifError] = useState("")
|
||||||
const [gifNoKey, setGifNoKey] = useState(false)
|
const [gifUnavailable, setGifUnavailable] = useState(false)
|
||||||
const [gifNext, setGifNext] = useState("")
|
const [gifNext, setGifNext] = useState("")
|
||||||
|
const gifCache = useRef<Map<string, { results: any[]; next: string }>>(new Map())
|
||||||
const [recentGifs, setRecentGifs] = useState<string[]>([])
|
const [recentGifs, setRecentGifs] = useState<string[]>([])
|
||||||
const [recentStickers, setRecentStickers] = useState<string[]>([])
|
const [recentStickers, setRecentStickers] = useState<string[]>([])
|
||||||
const [stickerPacks] = useState<StickerPack[]>(getStickerPacks)
|
const [stickerPacks] = useState<StickerPack[]>(getStickerPacks)
|
||||||
@@ -60,6 +61,13 @@ export default function MediaPicker({ onEmojiSelect, onMediaSelect, onClose, the
|
|||||||
useEffect(() => { setRecentStickers(getRecent(RECENT_STICKERS_KEY)) }, [])
|
useEffect(() => { setRecentStickers(getRecent(RECENT_STICKERS_KEY)) }, [])
|
||||||
|
|
||||||
const fetchGifs = useCallback(async (query: string, pos = "") => {
|
const fetchGifs = useCallback(async (query: string, pos = "") => {
|
||||||
|
const cacheKey = `${query}::${pos}`
|
||||||
|
const cached = gifCache.current.get(cacheKey)
|
||||||
|
if (cached && !pos) {
|
||||||
|
setGifResults(cached.results)
|
||||||
|
setGifNext(cached.next)
|
||||||
|
return
|
||||||
|
}
|
||||||
setGifLoading(true)
|
setGifLoading(true)
|
||||||
setGifError("")
|
setGifError("")
|
||||||
try {
|
try {
|
||||||
@@ -68,17 +76,18 @@ export default function MediaPicker({ onEmojiSelect, onMediaSelect, onClose, the
|
|||||||
const res = await fetch(`/api/gifs?${params}`)
|
const res = await fetch(`/api/gifs?${params}`)
|
||||||
const data = await res.json()
|
const data = await res.json()
|
||||||
if (data.noKey) {
|
if (data.noKey) {
|
||||||
setGifNoKey(true)
|
setGifUnavailable(true)
|
||||||
setGifResults([])
|
setGifResults([])
|
||||||
} else if (data.results) {
|
} else if (data.results) {
|
||||||
setGifResults((prev) => (pos ? [...prev, ...data.results] : data.results))
|
setGifResults((prev) => (pos ? [...prev, ...data.results] : data.results))
|
||||||
setGifNext(data.next || "")
|
setGifNext(data.next || "")
|
||||||
setGifNoKey(false)
|
setGifUnavailable(false)
|
||||||
|
if (!pos) gifCache.current.set(cacheKey, { results: data.results, next: data.next || "" })
|
||||||
} else {
|
} else {
|
||||||
setGifError("No results found")
|
setGifError("No results found")
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
setGifError("Failed to load GIFs")
|
setGifError("Could not load GIFs. Check your connection.")
|
||||||
}
|
}
|
||||||
setGifLoading(false)
|
setGifLoading(false)
|
||||||
}, [])
|
}, [])
|
||||||
@@ -196,11 +205,10 @@ export default function MediaPicker({ onEmojiSelect, onMediaSelect, onClose, the
|
|||||||
<div className="flex items-center justify-center h-48">
|
<div className="flex items-center justify-center h-48">
|
||||||
<Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
|
<Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
|
||||||
</div>
|
</div>
|
||||||
) : gifNoKey ? (
|
) : gifUnavailable ? (
|
||||||
<div className="flex flex-col items-center justify-center h-48 text-muted-foreground text-sm gap-2">
|
<div className="flex flex-col items-center justify-center h-48 text-muted-foreground text-sm gap-2">
|
||||||
<Image className="h-8 w-8 opacity-40" />
|
<Image className="h-8 w-8 opacity-40" />
|
||||||
<span>GIF search requires a Tenor API key</span>
|
<span>GIFs are temporarily unavailable.</span>
|
||||||
<span className="text-xs opacity-60">Set TENOR_API_KEY in .env.local</span>
|
|
||||||
</div>
|
</div>
|
||||||
) : gifError ? (
|
) : gifError ? (
|
||||||
<div className="flex flex-col items-center justify-center h-48 text-muted-foreground text-sm gap-2">
|
<div className="flex flex-col items-center justify-center h-48 text-muted-foreground text-sm gap-2">
|
||||||
|
|||||||
Reference in New Issue
Block a user