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 Жыл бұрын
Awesome, thank you!
@JonsBeumer9 ай бұрын
I dont leave comments often, but this deserves one. Very clean and easy implementation, well done!
@hamedbahram9 ай бұрын
Thank you! I appreciate that.
@venky_ee7 ай бұрын
Thank you so much I was searching for this exact thing 🙏🏻
@hamedbahram7 ай бұрын
You got it!
@zabialy2919 Жыл бұрын
It just worked... Great as always Hamed!
@hamedbahram Жыл бұрын
Great to hear!
@massimo84086 ай бұрын
You are AMAZING, your tutorial are incredibly helpful and you explain it such a clear way. Please keep making content!
@hamedbahram6 ай бұрын
Thanks for the comment! I appreciate it.
@zdargahi9 ай бұрын
very insightful, Thanks Hamed jan
@hamedbahram9 ай бұрын
My pleasure! Glad it was helpful.
@abbaskareem5281 Жыл бұрын
This is the most useful video I have seen in awhile .. thank you very much for sharing your knowledge for these advanced,useful topics ❤
@hamedbahram Жыл бұрын
Glad it was helpful! Appreciate your comment.
@sumitsahu86577 ай бұрын
Thank you so much for this tutorial Hamed!
@hamedbahram7 ай бұрын
You're welcome, Sumit!
@mostafamohammadi991911 ай бұрын
Thank you, dear Hamed, for this incredible content.
@hamedbahram11 ай бұрын
You're welcome Mostafa Jan!
@mostafamohammadi991911 ай бұрын
@@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?
@Aliraz-g2r29 күн бұрын
آقا حامد گل کارت خیلی درسته خیلی از این ویدیوهای کاربردیت استفاده میکنم توی پروژه هام ایشالا سالم باشی کاکو و موفق و پر روزی ایشالا بیام کانادا ببینمت البته اگر پول دار شدم و تونستم ک بیام
@hamedbahram29 күн бұрын
Damet garm Ali jan, merc kakoo az een payaame ghashanget.
@riyan31485 ай бұрын
Thank you so much, very clear explanation 🎉
@hamedbahram5 ай бұрын
My pleasure! Glad it was helpful.
@jadealdemir3097 Жыл бұрын
Thank you million times, super good content of nextjs, very easy to understand and help me a lot
@hamedbahram Жыл бұрын
Happy to hear that!
@pro_coder07 Жыл бұрын
Thanks man... I was waiting for this video from a long period of time❤❤❤❤
@hamedbahram Жыл бұрын
You're welcome 🙂
@mrpotatokokichi79098 ай бұрын
Thank you so much, everything worked perfectly!
@hamedbahram8 ай бұрын
Glad it helped!
@mironmakeev784611 ай бұрын
Your video was very useful for me, thank you.
@hamedbahram11 ай бұрын
My pleasure, I'm glad to hear that!
@AllahomAnsorGaza8 ай бұрын
thank you for your well expatiation's buy i have question if you i can ask
@hamedbahram8 ай бұрын
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.
@mohaniya15 Жыл бұрын
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!
@hamedbahram Жыл бұрын
Perfect!
@alextarasenko422810 ай бұрын
It looks great. The only question is: will it have any negative impact on SEO, because we are using `use client`?
@hamedbahram10 ай бұрын
The first round of movies are server-rendered so your page has content as far as SEO is concerned.
@zhiven748410 ай бұрын
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?
@hamedbahram10 ай бұрын
Thanks! The server action only runs on the server.
@hamed4451 Жыл бұрын
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?
@hamedbahram Жыл бұрын
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.
@hamed4451 Жыл бұрын
@@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 ....
@goncaloshred8 ай бұрын
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!
@hamedbahram8 ай бұрын
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?
@goncaloshred8 ай бұрын
@@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...
@goncaloshred8 ай бұрын
@@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.
@hamedbahram8 ай бұрын
@@goncaloshred You don't need ReactQuery, you can use server-side pagination to load more comments.
@pheisar Жыл бұрын
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?
@hamedbahram Жыл бұрын
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.
@anversadutt Жыл бұрын
very cool, thank you, keep rocking
@hamedbahram Жыл бұрын
Thanks!
@chinwubachukwudi4483 Жыл бұрын
Thank you for sharing
@hamedbahram Жыл бұрын
Anytime! Glad to help.
@andreasoikon Жыл бұрын
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?
@hamedbahram Жыл бұрын
You can get the total number of movies from your db and only show the spinner when there is more to load.
@andreasoikon Жыл бұрын
@@hamedbahram thank you!
@Fanaro5 ай бұрын
ShadUI Expansions now has an InfiniteScroll component.
@hamedbahram5 ай бұрын
I'll have to try it out.
@hbela1000 Жыл бұрын
Exceptional.thx.
@hamedbahram Жыл бұрын
Thanks!
@Alex.ShaldaАй бұрын
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?
@hamedbahramАй бұрын
You can do server-side pagination but it's not necessary in my opinion.
@Alex.ShaldaАй бұрын
@@hamedbahram you are the goat, replied to a year old video! Thanks man 👍👍👍
@hamedbahramАй бұрын
@@Alex.Shalda My pleasure 🫡
@memoryremains7412 Жыл бұрын
Thank you very much!
@hamedbahram Жыл бұрын
You are welcome!
@mohdsahil226 Жыл бұрын
Thank you for this awesome topic!. Would you please help on how to hide spinner if there are no records?
@hamedbahram Жыл бұрын
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.
@mohdsahil226 Жыл бұрын
Thank you for your quick reply. I will be very thankful to you if you could please paste the code here.
@electroheadfx Жыл бұрын
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 !
@hamedbahram Жыл бұрын
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.
@electroheadfx Жыл бұрын
you are amazing@@hamedbahram
@stevebendersky20565 ай бұрын
Thank you very much. Can you make a video about how to make infinite scroll in react table (tanstack table) using RSC / server actions?
@hamedbahram5 ай бұрын
Good idea! I'll have that in mind. Thanks for the suggestion
@OleksiiMalichenko Жыл бұрын
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.
@hamedbahram Жыл бұрын
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.
@alextarasenko422810 ай бұрын
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.
@teujorge7 ай бұрын
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...
@hamedbahram7 ай бұрын
That's a good point. I'll work on an updated video.
@teujorge7 ай бұрын
@@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
@Parsa.izi724 Жыл бұрын
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 Жыл бұрын
Thank you! what do you mean by loading more when scrolling up? can you expand on that...
@Parsa.izi724 Жыл бұрын
@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
@hamedbahram Жыл бұрын
@@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.
@Parsa.izi724 Жыл бұрын
@hamedbahram Thanks a lot for your response 👍 you are right, I am doing the same thing ,
@hafeezullah9706 Жыл бұрын
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?
@hamedbahram Жыл бұрын
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.
@hafeezullah9706 Жыл бұрын
Point 2. Will it not increase any load time to call multiple APIs in servers component? I am new in nextjs
@SharpSteelSoftware Жыл бұрын
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.
@hamedbahram Жыл бұрын
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)
@academai119 ай бұрын
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 )
@hamedbahram9 ай бұрын
I'm using severe actions for that. You can call server actions from both client and server components. Look at my code.
@academai119 ай бұрын
@@hamedbahram nevermind, i had an async in my card component for no reason, it works just fine. thanks bro)
@hamedbahram9 ай бұрын
@@academai11 Glad to hear that!
@klimash3 ай бұрын
what is the point of server action? you can use getMovies in both server and client components
@hamedbahram3 ай бұрын
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.
@mattsmith585611 ай бұрын
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.
@hamedbahram11 ай бұрын
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.
@cristhianguay9 ай бұрын
@@hamedbahram How would you recommend doing it? I'm facing the same problem, but couldn't find good working examples.
@hamedbahram9 ай бұрын
@@cristhianguay one way can be using intercepting routes. see here → kzbin.info/www/bejne/iHzWq4aoqbykoKM
@mdsll4vr Жыл бұрын
Useful video, thanks. Why not use `search` as a key for that ul element though, instead of Math.random()?
@hamedbahram Жыл бұрын
Any unique key will do.
@edmondbounasr87279 ай бұрын
your repo is missing env.example and seeding the database with movies !
@hamedbahram9 ай бұрын
All you need in is `MONGODB_URI` in your env. And the sample data is from Mongodb Atlas, see this video → kzbin.info/www/bejne/o4DZiGafncp5Z5Y
@edmondbounasr87279 ай бұрын
@@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?
@hamedbahram9 ай бұрын
@@edmondbounasr8727 No worries! Go on my site, you can book time with me there → www.hamedbahram.io/
@dmitriyvelichko712 Жыл бұрын
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?
@hamedbahram Жыл бұрын
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.
@ahmadkam5066 Жыл бұрын
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
@hamedbahram Жыл бұрын
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.
@demamdq2346 Жыл бұрын
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!!!!
@hamedbahram Жыл бұрын
Yes you can use the intersection observer and call your api anytime the user scrolls down.
@demamdq2346 Жыл бұрын
@@hamedbahram you replied the comments haha thanks for the help, already subscribed!! Awesome stuff!
@hamedbahram Жыл бұрын
@@demamdq2346 My pleasure! welcome to the channel!
@yagelProject Жыл бұрын
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.
@hamedbahram Жыл бұрын
It will be exactly the same just remove the data fetching logic and hard code an array of movies.
@pluto3zw4 ай бұрын
Where can I find these previous videos parts of the pagination?
@hamedbahram4 ай бұрын
Go to my channel videos and search for pagination. Here is one of them --> kzbin.info/www/bejne/i3-oiZV9f6iHrZo
@pro_coder07 Жыл бұрын
Can you please make a video on google AdSense implementation without losing SSR? PLEASE🙏
@hamedbahram Жыл бұрын
Interesting 🤔 I'll have that in mind for future videos.
@pro_coder07 Жыл бұрын
@@hamedbahram thanks a lot... I will wait for that ❤❤❤
@pluto3zw4 ай бұрын
I am not getting what happened in the lib folder am really stuck, I need that. 🙏
@pluto3zw4 ай бұрын
hahaha just found it.
@hamedbahram4 ай бұрын
Glad you were able to figure it out!
@Fanaro5 ай бұрын
The code is a bit too small.
@hamedbahram5 ай бұрын
will have that in mind for future videos
@rampaikra3886 Жыл бұрын
next auth credentials and password recovery...?
@hamedbahram Жыл бұрын
Stay tuned
@dd3dd123Ай бұрын
can i fetch the first page in infinite-scroll-movies.tsx instead of fetching it in page.tsx and passing the data down?