You know I was trying to think of something like this the other day. You choose really relevant and brilliant example to talk about! Definitely coming back to this haha. Thanks! Amazing stuff
@@hamedbahram In the official Next.js docs, they mentioned that you could only use a server action with action props on a form or formAction. However, here, neither of them was used. Could you please explain it?
آقا حامد گل کارت خیلی درسته خیلی از این ویدیوهای کاربردیت استفاده میکنم توی پروژه هام ایشالا سالم باشی کاکو و موفق و پر روزی ایشالا بیام کانادا ببینمت البته اگر پول دار شدم و تونستم ک بیام
You're welcome! Well the movies page would have the initial data coming from the server so it won't be empty. Keep in mind that in NextJs even client components are pre-rendered on the server. You can confirm this by looking at the page source.
What are your thoughts on server actions in the documentation only being addressed as agents of mutation (its a POST request behind the scenes). There is no example in the documentation that shows a server action being used as a getter. Is using a POST request to get data bad practice?
That's a good question. I think it's Ok to use a POST request in this example to retrieve data. Server actions are just functions that run on the server but can also be called from the client, I think the POST implementation is to allow server mutations if needed. That said, server actions are still experimental and there are no stablished patterns on how to use them.
Very nice video!! Love it! I have a question, if you call the server action in the client component(loadMoreMovies), does it execute the action code on the client? or does it call the server action in server, get the data, then send back the data to client component and set the data?
If you click on a movie and then navigate back to the search results, does the infinite scroll list reset? I'm trying to resolve this problem in a current project.
We don't have the individual movie pages in this example. It depends on your implementation, you can have it in a way that restores the state on the `/movies` page when navigating back.
Hey @hamedbahram, great video and nice channel! One question please. What happens if all movies are loaded and you scroll to the bottom of the page? Is there a spinner still showing or is it removed?
My pleasure! you can disconnect the intersection observer if the result is empty, or you can get the total count of your resources from your database and figure out what your last page is.
Hey Hamed, first thanks a lot for your videos. I'm learning to code by myself and it's just really helpful to follow the docs with your help, since I'm not familiar with a lot of concepts just yet! I've been trying to implement infinite scrolling / pagination and I find that using pagination with server side rendering, everything works perfectly, even calling server actions with optimistic updates to like / save posts etc. However, I'm not having the same luck when I implement the infinite scrolling, my optimistic updates are reverted back. Would like to ask you if you could come up with a video example one day, where one would click on a button to fetch more comments and still be able to use server actions and optimistically show the like / dislike happening. Hope I'm not mixing things up!
Hey! Sure, can you expand on the scenario... you want to load more comments on a page while having server actions for liking/disliking comments working with Optimistic UI?
@@hamedbahram Yes... I was fetching comments from a server action inside useEffect and then render the new comments using useState. This worked well to fetch the comments, but when liking a comment using useOptimistic hook from React, the previous state is being reverted after the like server action. If I render the comments using a client pagination component that changes route to ?page=2 for example, then I can use searchParams to fetch the next page of comments, all of that in the server. In this case, the like comment server action using useOptimistic does update correctly. Still I was trying to not use searchParams for this, by doing data fetching in the client. The problem is that I seem to face a challenge updating the UI optimistically when calling server action to like the comment. I might be missing something...
@@hamedbahram from my understanding, because I'm using a client component to render more comments, I would need to invalidate the cache after a server action, so that the comments data is revalidated after that. I see some people using ReactQuery for that, but I was trying to avoid it.
Cool video! But I have a question. Are there any other options besides using redirect and key crutch while searching? It seems costly to re-render the entire page instead of increasing grid render with React reconciliation.
I also noticed one pitfall (maybe not a problem for just one filter and small page). Once you are redirecting a user on filter change (which is needed to keep filters state in the url) entire page is re requested. So maybe for search with debounce it is not noticeable, but if you have some kind of checkboxes or whatever, it will create some lag and unresponsiveness. You click the checkbox, next.js requests new page with updated params -> only after that it updates url params. So if you have filters which need to be controlled and rely on url, it may be quite tricky part.
It was awesome, Hamde, as always. Thank you a million times! I have two questions: 1- Is it okay to use experimental features in a production app? 2- You've moved all the results (both the initial load and subsequent fetches on scroll) to the client component. Won't this impact SEO? Because on the client-side, the data isn't appended to the source, like what we currently see in React.js. Could this lead to SEO issues?
My pleasure! I wouldn't recommend experimental features, especially an alpha release, like server actions, for production as there may be bugs and unknown issues introduced to your application. Regarding your second question, our initial load is on the server, since both the page and the `movies` components are server components, only the subsequent fetches on scroll are happening on the client. So your inital page has data as fas as SEO is concerned.
@@hamedbahram yes, you fetched it on server but render it on client , is it ok? is it still SSR? even you bring the render on client? I'm a little confused about it ....
Have you the codebase start for this project, I don't find in previous video, thanks, great to get project on Next and RSC. The Next RSC is very tricky actually with cache and invalidation I can't use yet in production. Thanks great work man !
Hey thanks for the reminder! Just added the link in the video description. You can checkout the `search` branch for the starting point, and the `infinite-scrolling` branch for the finished version.
Is this not working anymore? It does not look like async functions are allowed to be called in client components. I get an error suggesting this: Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.
Your page component needs to be a server component, async functions were never allowed in client components. Use my code as a reference (link is in the video description)
It is cool that you pass some data as initial props, thus making the page SSR which is great for SEO. But that is only for initial data. What about the rest, they will not be rendered on the server, which is bad for SEO. How do you solve it?
The `getMovies` should only be executed on the server since it has the connection string to your DB, the `fetchMovies` server action however can be called from the client.
You produce incredible videos, thanks a lot, do you know if any infinite scrolls that load more data by scrolling down, and scrolling up at the same time?
@hamedbahram Imagine that you searched inside the chat and this message is not in the messages, and 20 messages should be loaded from the same searched message. In this case, the user should scroll up and the messages before the searched message should be loaded, and scroll down. Next messages will be loaded,I could not find a suitable package
Great video, how do you use async loadMoreMovies in the infinite-scroll-movies client component? Im on nextjs14 and its giving me error: Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server. Any tips how to solve it? Thanks )
1. If I don`t want to use "use server", what is the alternate for this? 2. on category page i call two APIs getCategory and fetchMovies is it ok to call multiple APIs in sever component using async, await. 3. can I use suspense (skelton) around infiniteScrollMovies Component. 4. Can I call separate sever component in side page and call separate API inside it and do scrolling thing there?
1. Server actions are marked with `use server` and there is no other way. 2. Yes you can call multiple APIs in server components. 3. Not sure why, but you can wrap any async component in Suspense. 4. Yes you can nest server components and have each one call APIs individually.
Can you please tell If I want to use some async operations inside my ItemCard (movies in your case). Will it be possible to do it If we use infinite scroll and render our items inside 'use client' component And will increse it the size of your build?
You can pass server components as children to client component with no problem. You can also have the card items be client components, which is how we'd do it in previous versions of NextJs.
I want to use infinite scrolling for list of customers which customer items in table are editable and can be removed. My result was as below: In first page when I edit customer, it will be edited in list but this not working on next pages. I mean updating customer in next pages of customers is not updating list data, but it id updating customer data in my database. can you help me to do this? Thank you
I'm not sure if I understand the question or the problem correctly. But generally speaking, I think you should fetch customer data client side and use mutation to update any customer and refetch data. This can be done by libraries like SWR.
Can we get this working with scroll restoration? If the user goes to a new route and then back, they should come back to the same spot they where... Trying to implement this in my app with no luck so far...
@@hamedbahram I tried implementing such behavior with the tanstack useInfiniteQuery hook (which seems to support server components but not server actions) but it works only for me some of the time
Hi. Can you please tell me how to make infinite load with a regular array, without mongodb? You could make a separate branch in github without mongodb but with regular data array.
How can i get the infinite scrolling without using server actions? I can use the observer package, but instead of server actions, i have a express API .. Can i use some of your logic but just fetch my endpoints to get the information... ?! I am just starting with next, anyway great tutorial!!!!
I dont leave comments often, but this deserves one. Very clean and easy implementation, well done!
Thank you! I appreciate that.
You know I was trying to think of something like this the other day.
You choose really relevant and brilliant example to talk about! Definitely coming back to this haha.
Thanks! Amazing stuff
Awesome, thank you!
You are AMAZING, your tutorial are incredibly helpful and you explain it such a clear way. Please keep making content!
Thanks for the comment! I appreciate it.
very insightful, Thanks Hamed jan
My pleasure! Glad it was helpful.
Thank you so much I was searching for this exact thing 🙏🏻
You got it!
This is the most useful video
I have seen in awhile .. thank you very much for sharing your knowledge for these advanced,useful topics ❤
Glad it was helpful! Appreciate your comment.
It just worked... Great as always Hamed!
Great to hear!
Thank you, dear Hamed, for this incredible content.
You're welcome Mostafa Jan!
@@hamedbahram In the official Next.js docs, they mentioned that you could only use a server action with action props on a form or formAction. However, here, neither of them was used. Could you please explain it?
Thank you so much for this tutorial Hamed!
You're welcome, Sumit!
آقا حامد گل کارت خیلی درسته خیلی از این ویدیوهای کاربردیت استفاده میکنم توی پروژه هام ایشالا سالم باشی کاکو و موفق و پر روزی ایشالا بیام کانادا ببینمت البته اگر پول دار شدم و تونستم ک بیام
Damet garm Ali jan, merc kakoo az een payaame ghashanget.
thank you for your well expatiation's
buy i have question if you i can ask
You're welcome! Well the movies page would have the initial data coming from the server so it won't be empty. Keep in mind that in NextJs even client components are pre-rendered on the server. You can confirm this by looking at the page source.
What are your thoughts on server actions in the documentation only being addressed as agents of mutation (its a POST request behind the scenes). There is no example in the documentation that shows a server action being used as a getter. Is using a POST request to get data bad practice?
That's a good question. I think it's Ok to use a POST request in this example to retrieve data. Server actions are just functions that run on the server but can also be called from the client, I think the POST implementation is to allow server mutations if needed. That said, server actions are still experimental and there are no stablished patterns on how to use them.
Thanks man... I was waiting for this video from a long period of time❤❤❤❤
You're welcome 🙂
Thank you so much, very clear explanation 🎉
My pleasure! Glad it was helpful.
Thank you million times, super good content of nextjs, very easy to understand and help me a lot
Happy to hear that!
haha i might add this next to the threads clone that i made using server actions on my channel, found this at the right time!
Perfect!
Thank you so much, everything worked perfectly!
Glad it helped!
It looks great. The only question is: will it have any negative impact on SEO, because we are using `use client`?
The first round of movies are server-rendered so your page has content as far as SEO is concerned.
Very nice video!! Love it! I have a question, if you call the server action in the client component(loadMoreMovies), does it execute the action code on the client? or does it call the server action in server, get the data, then send back the data to client component and set the data?
Thanks! The server action only runs on the server.
Your video was very useful for me, thank you.
My pleasure, I'm glad to hear that!
If you click on a movie and then navigate back to the search results, does the infinite scroll list reset? I'm trying to resolve this problem in a current project.
We don't have the individual movie pages in this example. It depends on your implementation, you can have it in a way that restores the state on the `/movies` page when navigating back.
@@hamedbahram How would you recommend doing it? I'm facing the same problem, but couldn't find good working examples.
@@cristhianguay one way can be using intercepting routes. see here → th-cam.com/video/RKszSrtWqjA/w-d-xo.html
Hey @hamedbahram, great video and nice channel! One question please. What happens if all movies are loaded and you scroll to the bottom of the page? Is there a spinner still showing or is it removed?
You can get the total number of movies from your db and only show the spinner when there is more to load.
@@hamedbahram thank you!
Thank you for this awesome topic!. Would you please help on how to hide spinner if there are no records?
My pleasure! you can disconnect the intersection observer if the result is empty, or you can get the total count of your resources from your database and figure out what your last page is.
Thank you for your quick reply. I will be very thankful to you if you could please paste the code here.
Hey Hamed, first thanks a lot for your videos. I'm learning to code by myself and it's just really helpful to follow the docs with your help, since I'm not familiar with a lot of concepts just yet! I've been trying to implement infinite scrolling / pagination and I find that using pagination with server side rendering, everything works perfectly, even calling server actions with optimistic updates to like / save posts etc. However, I'm not having the same luck when I implement the infinite scrolling, my optimistic updates are reverted back. Would like to ask you if you could come up with a video example one day, where one would click on a button to fetch more comments and still be able to use server actions and optimistically show the like / dislike happening. Hope I'm not mixing things up!
Hey! Sure, can you expand on the scenario... you want to load more comments on a page while having server actions for liking/disliking comments working with Optimistic UI?
@@hamedbahram Yes... I was fetching comments from a server action inside useEffect and then render the new comments using useState. This worked well to fetch the comments, but when liking a comment using useOptimistic hook from React, the previous state is being reverted after the like server action.
If I render the comments using a client pagination component that changes route to ?page=2 for example, then I can use searchParams to fetch the next page of comments, all of that in the server. In this case, the like comment server action using useOptimistic does update correctly.
Still I was trying to not use searchParams for this, by doing data fetching in the client. The problem is that I seem to face a challenge updating the UI optimistically when calling server action to like the comment.
I might be missing something...
@@hamedbahram from my understanding, because I'm using a client component to render more comments, I would need to invalidate the cache after a server action, so that the comments data is revalidated after that. I see some people using ReactQuery for that, but I was trying to avoid it.
@@goncaloshred You don't need ReactQuery, you can use server-side pagination to load more comments.
Cool video! But I have a question. Are there any other options besides using redirect and key crutch while searching? It seems costly to re-render the entire page instead of increasing grid render with React reconciliation.
Not that I know of... You could try a server action for the search where you could call the 'revalidatePath' function to refresh the route.
I also noticed one pitfall (maybe not a problem for just one filter and small page).
Once you are redirecting a user on filter change (which is needed to keep filters state in the url) entire page is re requested. So maybe for search with debounce it is not noticeable, but if you have some kind of checkboxes or whatever, it will create some lag and unresponsiveness. You click the checkbox, next.js requests new page with updated params -> only after that it updates url params. So if you have filters which need to be controlled and rely on url, it may be quite tricky part.
It was awesome, Hamde, as always. Thank you a million times!
I have two questions:
1- Is it okay to use experimental features in a production app?
2- You've moved all the results (both the initial load and subsequent fetches on scroll) to the client component. Won't this impact SEO? Because on the client-side, the data isn't appended to the source, like what we currently see in React.js. Could this lead to SEO issues?
My pleasure! I wouldn't recommend experimental features, especially an alpha release, like server actions, for production as there may be bugs and unknown issues introduced to your application. Regarding your second question, our initial load is on the server, since both the page and the `movies` components are server components, only the subsequent fetches on scroll are happening on the client. So your inital page has data as fas as SEO is concerned.
@@hamedbahram yes, you fetched it on server but render it on client , is it ok?
is it still SSR? even you bring the render on client? I'm a little confused about it ....
Have you the codebase start for this project, I don't find in previous video, thanks, great to get project on Next and RSC. The Next RSC is very tricky actually with cache and invalidation I can't use yet in production. Thanks great work man !
Hey thanks for the reminder! Just added the link in the video description. You can checkout the `search` branch for the starting point, and the `infinite-scrolling` branch for the finished version.
you are amazing@@hamedbahram
Is this not working anymore? It does not look like async functions are allowed to be called in client components. I get an error suggesting this:
Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.
Your page component needs to be a server component, async functions were never allowed in client components. Use my code as a reference (link is in the video description)
It is cool that you pass some data as initial props, thus making the page SSR which is great for SEO. But that is only for initial data. What about the rest, they will not be rendered on the server, which is bad for SEO. How do you solve it?
You can do server-side pagination but it's not necessary in my opinion.
@@hamedbahram you are the goat, replied to a year old video! Thanks man 👍👍👍
@@Alex.Shalda My pleasure 🫡
what is the point of server action? you can use getMovies in both server and client components
The `getMovies` should only be executed on the server since it has the connection string to your DB, the `fetchMovies` server action however can be called from the client.
ShadUI Expansions now has an InfiniteScroll component.
I'll have to try it out.
You produce incredible videos, thanks a lot, do you know if any infinite scrolls that load more data by scrolling down, and scrolling up at the same time?
Thank you! what do you mean by loading more when scrolling up? can you expand on that...
@hamedbahram Imagine that you searched inside the chat and this message is not in the messages, and 20 messages should be loaded from the same searched message. In this case, the user should scroll up and the messages before the searched message should be loaded, and scroll down. Next messages will be loaded,I could not find a suitable package
@@Parsa.izi724 I see 🤔that'll require a custom implementation for observer the scroll both ways, don't know of a libary that does that.
@hamedbahram Thanks a lot for your response 👍 you are right, I am doing the same thing ,
Great video, how do you use async loadMoreMovies in the infinite-scroll-movies client component? Im on nextjs14 and its giving me error:
Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.
Any tips how to solve it? Thanks )
I'm using severe actions for that. You can call server actions from both client and server components. Look at my code.
@@hamedbahram nevermind, i had an async in my card component for no reason, it works just fine. thanks bro)
@@academai11 Glad to hear that!
1. If I don`t want to use "use server", what is the alternate for this?
2. on category page i call two APIs getCategory and fetchMovies is it ok to call multiple APIs in sever component using async, await.
3. can I use suspense (skelton) around infiniteScrollMovies Component.
4. Can I call separate sever component in side page and call separate API inside it and do scrolling thing there?
1. Server actions are marked with `use server` and there is no other way.
2. Yes you can call multiple APIs in server components.
3. Not sure why, but you can wrap any async component in Suspense.
4. Yes you can nest server components and have each one call APIs individually.
Point 2. Will it not increase any load time to call multiple APIs in servers component? I am new in nextjs
Useful video, thanks.
Why not use `search` as a key for that ul element though, instead of Math.random()?
Any unique key will do.
Can you please tell If I want to use some async operations inside my ItemCard (movies in your case). Will it be possible to do it If we use infinite scroll and render our items inside 'use client' component
And will increse it the size of your build?
You can pass server components as children to client component with no problem. You can also have the card items be client components, which is how we'd do it in previous versions of NextJs.
Thank you very much. Can you make a video about how to make infinite scroll in react table (tanstack table) using RSC / server actions?
Good idea! I'll have that in mind. Thanks for the suggestion
very cool, thank you, keep rocking
Thanks!
I want to use infinite scrolling for list of customers
which customer items in table are editable and can be removed.
My result was as below:
In first page when I edit customer, it will be edited in list
but this not working on next pages.
I mean updating customer in next pages of customers is not updating list data, but it id updating
customer data in my database.
can you help me to do this?
Thank you
I'm not sure if I understand the question or the problem correctly. But generally speaking, I think you should fetch customer data client side and use mutation to update any customer and refetch data. This can be done by libraries like SWR.
Can we get this working with scroll restoration? If the user goes to a new route and then back, they should come back to the same spot they where... Trying to implement this in my app with no luck so far...
That's a good point. I'll work on an updated video.
@@hamedbahram I tried implementing such behavior with the tanstack useInfiniteQuery hook (which seems to support server components but not server actions) but it works only for me some of the time
your repo is missing env.example and seeding the database with movies !
All you need in is `MONGODB_URI` in your env. And the sample data is from Mongodb Atlas, see this video → th-cam.com/video/mOvW3iheF14/w-d-xo.html
@@hamedbahram i guess i missed the data related video thank you hamed.
I want to ask u few questions related to nextjs how we can connect?
@@edmondbounasr8727 No worries! Go on my site, you can book time with me there → www.hamedbahram.io/
Hi. Can you please tell me how to make infinite load with a regular array, without mongodb? You could make a separate branch in github without mongodb but with regular data array.
It will be exactly the same just remove the data fetching logic and hard code an array of movies.
Thank you for sharing
Anytime! Glad to help.
Exceptional.thx.
Thanks!
Where can I find these previous videos parts of the pagination?
Go to my channel videos and search for pagination. Here is one of them --> th-cam.com/video/UNEXbGJCTw8/w-d-xo.html
How can i get the infinite scrolling without using server actions? I can use the observer package, but instead of server actions, i have a express API .. Can i use some of your logic but just fetch my endpoints to get the information... ?! I am just starting with next, anyway great tutorial!!!!
Yes you can use the intersection observer and call your api anytime the user scrolls down.
@@hamedbahram you replied the comments haha thanks for the help, already subscribed!! Awesome stuff!
@@demamdq2346 My pleasure! welcome to the channel!
Thank you very much!
You are welcome!
Can you please make a video on google AdSense implementation without losing SSR? PLEASE🙏
Interesting 🤔 I'll have that in mind for future videos.
@@hamedbahram thanks a lot... I will wait for that ❤❤❤
I am not getting what happened in the lib folder am really stuck, I need that. 🙏
hahaha just found it.
Glad you were able to figure it out!
The code is a bit too small.
will have that in mind for future videos
next auth credentials and password recovery...?
Stay tuned
can i fetch the first page in infinite-scroll-movies.tsx instead of fetching it in page.tsx and passing the data down?
Yes you can.
@@hamedbahram thanks!!