Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Bruno Predot
/
tmdb_test
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Bruno Predot
2025-04-24 21:35:34 +0200
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
5acf933314c25d9a25875c3bc6df5176fd3330b0
5acf9333
1 parent
501cc3bd
Gestion des recherches de film vie le composable et implémentation dans le composant MoviesList.
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
73 additions
and
6 deletions
components/MoviesList.vue
composables/tMDB.ts
components/MoviesList.vue
View file @
5acf933
...
...
@@ -10,7 +10,7 @@ import { useDateFormat } from "@vueuse/core";
//#endregion
//#region --Declaration--.
const { fetchPopularMovies } = useTMDB();
const { fetchPopularMovies
, searchMovies
} = useTMDB();
//#endregion
//#region --Data/refs--.
...
...
@@ -18,6 +18,7 @@ const isInitialLoading = ref(true);
const isLoadingMore = ref(false);
const currentPage = ref(1);
const totalPages = ref(0);
const searchQuery = ref("");
/** Elément observé pour le défilement infini. */
const loadMoreTrigger = ref<HTMLElement | null>(null);
/** Instance de IntersectionObserver */
...
...
@@ -41,11 +42,12 @@ const fetchMovies = async (page: number) => {
const data = await fetchPopularMovies(page);
// Save in Movie model.
if (isInitialLoading.value) {
// First fetch, erase old data before save.
useRepo(Movie).fresh(data.results);
} else {
// Add to store collection.
useRepo(Movie).save(data.results);
}
totalPages.value = data.total_pages;
currentPage.value = page;
} catch (error) {
...
...
@@ -56,24 +58,69 @@ const fetchMovies = async (page: number) => {
}
};
/**
* Search movies
* @param query
* @param page
*/
const search = async (query: string, page: number) => {
// If empty search, fetch popular movies.
if (!query.trim()) {
await fetchMovies(1);
return;
}
try {
isLoadingMore.value = true;
if (page === 1) {
isInitialLoading.value = true;
}
const data = await searchMovies(query, page);
// Save in Movie model.
if (isInitialLoading.value) {
// First fetch, erase old data before save.
useRepo(Movie).fresh(data.results);
} else {
// Add to store collection.
useRepo(Movie).save(data.results);
}
totalPages.value = data.total_pages;
currentPage.value = page;
} catch (error) {
console.error("Error searching movies:", error);
} finally {
isInitialLoading.value = false;
isLoadingMore.value = false;
}
};
function createIntersectionObserver() {
return new IntersectionObserver(
(entries) => {
const [entry] = entries;
if (entry.isIntersecting && !isLoadingMore.value && currentPage.value < totalPages.value) {
if (searchQuery.value) {
// Continue searching query if already active.
search(searchQuery.value, currentPage.value + 1)
} else {
// Continue fetching popular movies.
fetchMovies(currentPage.value + 1);
}
}
},
{ threshold: 1.0 },
);
}
function handleSearchEvent(event: string) {
console.log(event);
currentPage.value = 1;
searchQuery.value = event;
search(event, 1);
}
function handleClearSearchEvent() {
console.log("clear event");
searchQuery.value = '';
// Fetch popular movies after clear.
fetchMovies(1);
}
//#endregion
...
...
composables/tMDB.ts
View file @
5acf933
...
...
@@ -15,7 +15,7 @@ export const useTMDB = function() {
`
${
apiUrl
}
/movie/popular?api_key=
${
apiKey
}
&language=fr-FR&page=
${
page
}
`
,
);
if
(
!
response
.
ok
)
{
console
.
error
(
"An error occured when fetching popular movies:"
);
console
.
error
(
"An error occur
r
ed when fetching popular movies:"
);
}
else
{
return
await
response
.
json
();
}
...
...
@@ -24,5 +24,25 @@ export const useTMDB = function() {
}
};
return
{
fetchPopularMovies
}
/**
* Search movies
* @param query
* @param page
*/
const
searchMovies
=
async
(
query
:
string
,
page
:
number
)
=>
{
try
{
const
response
=
await
fetch
(
`
${
apiUrl
}
/search/movie?api_key=
${
apiKey
}
&language=fr-FR&query=
${
encodeURIComponent
(
query
)}
&page=
${
page
}
`
,
);
if
(
!
response
.
ok
)
{
console
.
error
(
"An error occurred when searching movies:"
);
}
else
{
return
await
response
.
json
();
}
}
catch
(
error
)
{
console
.
error
(
"Error searching movies:"
,
error
);
}
};
return
{
fetchPopularMovies
,
searchMovies
}
}
\ No newline at end of file
...
...
Please
register
or
login
to post a comment