diff --git a/backend/src/routes/tmdb.js b/backend/src/routes/tmdb.js index b1b0867..8fffe10 100644 --- a/backend/src/routes/tmdb.js +++ b/backend/src/routes/tmdb.js @@ -37,7 +37,12 @@ router.get('/search', authMiddleware, async (req, res) => { ); if (!response.ok) { - throw new Error('TMDB API error'); + const errorText = await response.text(); + console.error('TMDB API error:', response.status, errorText); + return res.status(500).json({ + error: `TMDB API error: ${response.status}`, + details: errorText + }); } const data = await response.json(); diff --git a/frontend/src/pages/ChallengeDetail.jsx b/frontend/src/pages/ChallengeDetail.jsx index 8244bbd..784276a 100644 --- a/frontend/src/pages/ChallengeDetail.jsx +++ b/frontend/src/pages/ChallengeDetail.jsx @@ -14,6 +14,7 @@ export default function ChallengeDetail() { const [searchResults, setSearchResults] = useState([]); const [showInvite, setShowInvite] = useState(false); const [loading, setLoading] = useState(true); + const [searchTimeout, setSearchTimeout] = useState(null); useEffect(() => { loadChallenge(); @@ -76,19 +77,30 @@ export default function ChallengeDetail() { } }; - const handleSearchUsers = async (query) => { + const handleSearchUsers = (query) => { setInviteQuery(query); + + // Clear previous timeout + if (searchTimeout) { + clearTimeout(searchTimeout); + } + if (query.trim().length < 2) { setSearchResults([]); return; } - try { - const data = await api.searchUsers(query); - setSearchResults(data.users); - } catch (err) { - console.error('Search failed:', err); - } + // Debounce search by 1 second + const timeout = setTimeout(async () => { + try { + const data = await api.searchUsers(query); + setSearchResults(data.users); + } catch (err) { + console.error('Search failed:', err); + } + }, 1000); + + setSearchTimeout(timeout); }; const handleInvite = async (userId) => { diff --git a/frontend/src/pages/ChallengeList.jsx b/frontend/src/pages/ChallengeList.jsx index 5c1762f..7dab72d 100644 --- a/frontend/src/pages/ChallengeList.jsx +++ b/frontend/src/pages/ChallengeList.jsx @@ -8,6 +8,7 @@ export default function ChallengeList() { const [showResults, setShowResults] = useState([]); const [loading, setLoading] = useState(true); const [creating, setCreating] = useState(false); + const [searchTimeout, setSearchTimeout] = useState(null); useEffect(() => { loadChallenges(); @@ -24,19 +25,30 @@ export default function ChallengeList() { } }; - const handleSearch = async (query) => { + const handleSearch = (query) => { setSearchQuery(query); + + // Clear previous timeout + if (searchTimeout) { + clearTimeout(searchTimeout); + } + if (query.trim().length < 2) { setShowResults([]); return; } - try { - const data = await api.searchShows(query); - setShowResults(data.results || []); - } catch (err) { - console.error('Search failed:', err); - } + // Debounce search by 1.5 seconds + const timeout = setTimeout(async () => { + try { + const data = await api.searchShows(query); + setShowResults(data.results || []); + } catch (err) { + console.error('Search failed:', err); + } + }, 1500); + + setSearchTimeout(timeout); }; const handleCreateChallenge = async (show) => { diff --git a/frontend/src/pages/Friends.jsx b/frontend/src/pages/Friends.jsx index 1a9f339..842d0cc 100644 --- a/frontend/src/pages/Friends.jsx +++ b/frontend/src/pages/Friends.jsx @@ -8,6 +8,7 @@ export default function Friends() { const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [loading, setLoading] = useState(true); + const [searchTimeout, setSearchTimeout] = useState(null); useEffect(() => { loadData(); @@ -29,19 +30,30 @@ export default function Friends() { } }; - const handleSearch = async (query) => { + const handleSearch = (query) => { setSearchQuery(query); + + // Clear previous timeout + if (searchTimeout) { + clearTimeout(searchTimeout); + } + if (query.trim().length < 2) { setSearchResults([]); return; } - try { - const data = await api.searchUsers(query); - setSearchResults(data.users); - } catch (err) { - console.error('Search failed:', err); - } + // Debounce search by 1 second + const timeout = setTimeout(async () => { + try { + const data = await api.searchUsers(query); + setSearchResults(data.users); + } catch (err) { + console.error('Search failed:', err); + } + }, 1000); + + setSearchTimeout(timeout); }; const handleSendRequest = async (userId) => {