I remember writing a filter table function with hooks , and suddenly something just clicked.
@krtirtho3 жыл бұрын
I really appreciate that you're using Typescript primarily in tutorials Except Ben Awad & you I never saw anyone using Typescript primarily in tutorials
@lutfiikbalmajid31282 жыл бұрын
you may seen often if watching Angular tutorial :D
@Deliverant3 жыл бұрын
I love you Jack and what you're doing for the community, you're my inspiration
@noccer3 жыл бұрын
Same. A terrific teacher ☘️
@andresserron85963 жыл бұрын
indeed he rise the bar
@alexcooper48452 жыл бұрын
100%
@diyaagubarah33282 жыл бұрын
nice as usual we are happy we have you as our senior
@igrb3 жыл бұрын
All the explanations are so tight, seeing the dependency diagram helped a lot! You're the only person I've seen on youtube that can explain things so well in a practical way while showing the technical aspect of it. Thank you so much for the content
@ayoubbani67623 жыл бұрын
Happy birthday Jack!
@jherr3 жыл бұрын
Thanks!
@matthew11062 жыл бұрын
It's so worth it to take the effort and time to watch and review ALL of Jack's videos. It really shows how much time and thought he puts into giving his knowledge to the community for FREE. Thank you for all you do Jack!
@kleberluisaraujomottajunio42182 жыл бұрын
Thanks!
@dc33333 Жыл бұрын
wow you are good. Always a couple steps over the average explanation.
@basharkhadra29292 жыл бұрын
Your videos is on another level comparing to other KZbin channels. Thanks for the efforts
@rubenverster2502 жыл бұрын
Hey man. I love your channel so much! Like it is so hard finding a channel that dives more into the complex topics... You're absolutely stellar for more advanced info, especially since I'm now at Intermediate level :D Big
@esmaeilmirzaee3 жыл бұрын
No matter how much experience one has, every time you would learn something new. Awesome explanation. Thank you so much.
@tabliqatchi6696 Жыл бұрын
Without exaggeration you are one of the most interesting people I've ever seen on the Internet..., the way you teach makes me cry lol! I wish our world had MANY teachers like you 👌
@onkelZweiback3 жыл бұрын
I just had to subscribe after this Video. Awesome content keep it up!
@jherr3 жыл бұрын
Thanks!
@AbdelhameedG3 жыл бұрын
Thanks you Jack , that was very informative, hope to see you diving more into the advanced topics in React.
@eXmatic2 жыл бұрын
Thank you Jack for all of your high quality, in depth content. I'm so glad that i stumbled across your channel. You are explaining the concepts of React in a more detailed manner, which are often necessary when someone really wants to get a job as a React developer. Most React / programming channels on youtube only show the surface of some concepts. You explain more in depth, and in a way that it is really easy to understand. Your channel is truly underrated, I hope more people will find your channel.
@liltripple_reid89173 жыл бұрын
If you take a look at his code you'll see that he truly is a senior dev
@guilhermeprezzi77833 жыл бұрын
Where is the love reaction button yt?? I need it because like this video isnt enough! Awesome work Jack! I just missed you commenting that in some scenarios it's interesting to separate each atomic intention (use-cases) of the user into separate hooks (and how useful this can be for large systems in terms of testing and reuse) eg useGetPokemons(filter ), useCalcPokemonMinPower(pokemons), useCalcPokemonMaxPower(pokemons), useCountPokemonWithPower(pokemons, threshold) and so on
@nubl373 жыл бұрын
man the border radius on your webcam is given me old school CSS vibes amazing content and presentation
@johannsebastianbach34113 жыл бұрын
Mr Herrington, I know you probably get this all the time, but you rock!! This was really elegant!!
@JavierPortillo12 жыл бұрын
I come from a vue background and it was just so clear when you compared useMemo to computed values. Thank you!
@sasatatar2 жыл бұрын
Just a small correction in the description: It's Kent C. Dodds, not Dobbs. Other than that awesome content, I learned a ton, from both of you! :)
@jherr2 жыл бұрын
Whoops, my bad.
@TheL0rdOfTheStrings3 жыл бұрын
Man your explanations are so clear. Well done. Wish I had this kind of tuition when I was starting learning JS and React.
@admxxi3 жыл бұрын
Thanks for the great content! Btw: what keyboard are u using?
@jherr3 жыл бұрын
A Varmilo VA87M my daughter got me for my birthday.
@JamesQQuick2 жыл бұрын
Really good stuff!
@andresserron85963 жыл бұрын
Amazing display, The touch of proficiency is the diagram at the end of the video, no bs as usual!
@jr-hp7er3 жыл бұрын
Now, it feels, i was always using the hooks in a very much wrong way. Thanks to Uncle Jack for teaching us the right way:) Loved it, awesome
@cassioscabral2 жыл бұрын
Coming from Vue, I was watching and thinking "this is just like a computed property" and then you said that was just like it. I honestly was "afraid" of using useMemo when even the docs say to not use it often. But in your example, it does not only make sense, but I agree that having that list of dependencies makes clear that to "compute" this value depends on those other values.
@kumarnitesh603 жыл бұрын
Another great tutorial. Your video quality has improved a lot, if possible can you do a video on recording or creating tutorials, and the setup that you are using currently.
@jherr3 жыл бұрын
Thanks. I appreciate that. That's really cool that you think it's good enough to do a video on. I'll definitely think about it.
@PaulSebastianM Жыл бұрын
I think I was afraid to overuse the hooks like this before seeing this. So many articles say to not abuse useMemo because it leads to performance issues, but judging by your examples, it seems like the opposite is true. Basically cache everything, or wrap everything that changes.
@IctioPar3 жыл бұрын
So glad to have found this channel, great content!
@jofla3 жыл бұрын
Where are you from? That background in the beginning looks beautiful. Thanks for this video
@jherr3 жыл бұрын
Oregon. Although this is Lacamas Park in Camas, WA.
@JustinProfaizer2 жыл бұрын
I have never had anyone explain all of the React intricacies so well.
@SaifAlFalah3 жыл бұрын
Thanks for the great video Jack! Your content is gold!
@fernard89853 жыл бұрын
Great content, thanks. It rather reinforced my feeling that I use hooks correctly than showed me something I didn't know, but still a good watch. Btw, why haven't you simply computed min and max within a single useMemo call, returning an object rather than a integer twice?
@jherr3 жыл бұрын
Probably could have, yeah.
@lilibayo2 жыл бұрын
Fantastic video as usual. Thanks Jack! Lil question: Why did you end up wrapping onSetThreshold w/ useCallback? Looks like it is not being passed into a memoed child component, It also does not look like an expensive function. Thanks
@jherr2 жыл бұрын
I probably didn't have to. When it comes to useCallback expensive doesn't matter. That's just about useMemo and it's one of two reasons to use useMemo; maintaining referential identities and, as you point out, expensive synchronous computes.
@lilibayo2 жыл бұрын
@@jherr Got it! Thank you so much for the clear explanation.
@Jmfufghf Жыл бұрын
Great tutorial. One question is now I've learned about making forms with useRef to prevent rerenders, I like how clean and simple the code is vs storing state in useState. What do you think?
@jherr Жыл бұрын
Uncontrolled inputs are fine. Preferred in a lot of situations. Forms managers like react-hook-form primarily use uncontrolled inputs.
@AAquaticAApe Жыл бұрын
Great video Jack! Question - Is it ok to disable my linter when I want to have an empty useEffect dependency array? It will usually tell me I need to have something inside or remove it entirely.
@jherr Жыл бұрын
You should never ever have an empty dependency array. And no, you should not disable the linter, it is almost always correct.
@AAquaticAApe Жыл бұрын
@@jherr Thanks Jack!
@ghassanclassic76892 жыл бұрын
You’re legendary. I watched almost all your videos. Thank you very much for the amazing content, keep it up 🥇🏆
@simonedwards71012 жыл бұрын
Hi Jack, I've not seen this line of code used before "const [pokemon, setPokemon] = useState([]);". I mean, I understand and have used the useState part but specifically not the part in that position. Is that a Typescript thing?
@jherr2 жыл бұрын
Yeah. That’s typescript. You have to define what will go into the array. If you start with an empty array there is no way for it to know what you will be putting into it and making sure you always put the right kind of stuff.
@simonedwards71012 жыл бұрын
@@jherr Thanks for confirming Jack. I've not used or read Typescript as yet. Trying to focus (reduce my learning curve) on learning JavaScript, React & Next.
@thomasstambaugh51812 жыл бұрын
@@simonedwards7101 I'm in the same boat. After more than two years of pretty much full-time React and NodeJS coding, I'm still struggling with basic syntax and "shortcuts" (such as the gazillion varieties of expressing an arrow function). I fully intend to use Typescript when I feel more confident of my understanding of the underlying Javascript that it relies on.
@tiennsloit Жыл бұрын
Love you, I think I am gonna watch all your react videos 😅
@dellryuzi3 жыл бұрын
sorry jack what's the reason you usememo in min max too? when it's enough on pokemonWithPower to memoized the table?
@jherr3 жыл бұрын
They are derived values. So the component can get re-rendered as many times as we want, but the min/max won't get re-computed unless the underlying data changes.
@dellryuzi3 жыл бұрын
@@jherr i think useMemo should be used when we really wanna pass the value to other component? Since using useMemo uses memory and too many useMemo usage will eventually result a bad performance caused by first read-time to decide whether value will be memoized or not. I've seen a lot of apps using too many useMemo and instead resulting a slower app. or perhaps jack do u have any idea when it's the best time to stop useMemo? rather than memoized everything?
@jherr3 жыл бұрын
@@dellryuzi I haven't seen useMemo slow down an app. Comparing two arrays of scalars is a quick operation, and nobody is suggesting an app with useEffects is slower, and the dependency logic is the same between useMemo, useEffect and useCallback. If you're calculating an object or an array you should use useMemo because those are references, and if you do pass them somewhere to another component, or use that reference in a dependency array, you'll want it to managed by useMemo. If you are creating a scalar from useMemo then it's really a question of how long the scalar takes to calculate. If it's a simple expression then you probably shouldn't use useMemo, if it's the result of some iteration or a reduce, then you should probably use useMemo, otherwise not.
@Larry-lv7dz2 жыл бұрын
Thanks Jack! Awesome content as always
@leonewu71713 жыл бұрын
i wonder what that vscode autosuggestions extension is. in 3:58
@leonewu71713 жыл бұрын
haha, I know it as i watching the video. copilot
@jherr3 жыл бұрын
Yep, it's copilot. Expect a video on that fairly soon.
@wfoster922 жыл бұрын
This is amazing content! Your examples are top notch
@TurboBorsuk2 жыл бұрын
There should be a separate comment section for all the praise and appreciation ;) I was scrolling through in hope to find someone disagree with you on this one - simply out of interest in other points of view, not saying I'm not buying your arguments, but when there are 2 programmers there are 11 solutions (
@thomasstambaugh51812 жыл бұрын
The legendary Bill Joy once told me that the fundamental flaw of the "management" panacea of adding new programmers to a team that is behind schedule is that the rate of new code generation per developer expands linearly while the rate of new idea generation per developer expands exponentially. Since overall team productivity is the ratio of the former to the latter, team productivity asymptotically approaches zero as developers are added.
@mudscuffer2 жыл бұрын
useMemo and useCallback definitely have their place, but writing code like this you start feeling like you need them everywhere. It's a lot of boilerplate. It's can be worth taking a step back before you reach for them. 1. You could have achieved the same effect by instead separating the threshold input and count into a child component. 2. You get no value from memoizing onChange listeners if you are passing them straight to inputs anyway.
@ThEldeRS3 жыл бұрын
I adore the diagram! Is this an extension or an OOTB feature? Thanks for the explanation about hooks, it was enlightening!
@jherr3 жыл бұрын
OOTB feature. It's always been there.
@sandeepsoni7269 Жыл бұрын
Hey Jack thanks for the video. Can you share which font and theme you're using in your vscode. Waiting for reply.
@jherr Жыл бұрын
It's always in the description of the video.
@jujijiju69293 жыл бұрын
Hi Jack, interested to see if you have any thoughts on the new SolidJS library.
@jherr3 жыл бұрын
I have much much much love for SolidJS. This video me gearing up to show how SolidJS gets reactive state very right.
@jujijiju69293 жыл бұрын
@@jherr Awesome, looking forward to it!. I've been looking at it's docs last weekend and it feels really well thought out.
@jherr3 жыл бұрын
@@jujijiju6929 Not only well thought out but blazingly fast. I wrote a search page for my BCC videos in it and it's insanely fast.
@erdemsoydan41172 жыл бұрын
Hi ! from official docs -> "You may rely on useMemo as a performance optimization, not as a semantic guarantee. In the future, React may choose to “forget” some previously memoized values and recalculate them on next render, e.g. to free memory for offscreen components." QUESTION: As long as there is a statement like that about useMemo, i really wonder how do people (including you:)) encourage developers to use it?
@jherr2 жыл бұрын
It manages referential identity, primarily. So if you are constructing arrays or objects, and those are passed to other components then, as of today, those will be referentially managed to not trigger downstream effects, memos, callbacks, or updates to memoized components.
@erdemsoydan41172 жыл бұрын
@@jherr Well.. Please check what I expose in my comment :) Epecially this part: -> "In the future, React may choose to “forget” some previously memoized values and recalculate them on next render" . >>>IN FUTURE REACT MAY CHOOSE TO FORGET
@jherr2 жыл бұрын
@@erdemsoydan4117 First off they "may" do it, and they don't now. And then there is "choose", and I read that it that under some circumstances, most likely low memory, they may go into a mode where they will invalidate this simple first order cache. (BTW, it's important to understand that `useMemo` stores only the most recent value, not all possible outputs.) Because dependency arrays work on ===, and === works on value for strings, numbers and booleans, and references for objects, arrays, and functions, you have to have a mechanism to control references for complex object types for derived values, and those mechanisms are useCallback and useMemo. Without them you'd have to resort to pushing the derived data into mutable state, which is incorrectly modeling the relationship between mutable state, and data that we derive from that mutable state.
@erdemsoydan41172 жыл бұрын
@@jherr Thanks for your precious time. I have been working on mid scale app and we are using Context API (yeah not redux :)) . That scale and and using context API made me have extreme attention on rerenders. So I have no problem about understanding them. I also use useMemo sometimes but whenever I use I was hesitating because of the remark about useMemo in official docs as I mentioned above. I have been waiting to ask about this to someone "a true expert" like you on this case. Thanks for your answer. (Also In your example, if I was working on it, I would use useCallback instead of where ever you used use Memo. e.g Count over threshold : {getCountOverThreshould()} . Is there any drawback about this? useCallback instead of useMemo?)
@jherr2 жыл бұрын
@@erdemsoydan4117 It's been a while since I've looked at the code in this video, but if the `countOverThreshold` is a simple value I don't really understand the value of creating an accessor for it. It's certainly less surprising from an API perspective to have it be a value, as opposed to an accessor that returns a value. Can you fill me in a little on your thinking and why you believe this approach is advantageous?
@MrEnsiferum773 жыл бұрын
Dependency graph, actually is topological sort in data structure context, or something similar.
@jherr3 жыл бұрын
Fair. In this case I was looking for a term that captured the dependencies between the various pieces of state, derived state and effects.
@krimod3 жыл бұрын
Great content, I'm really thankful for all the work you put in your tutorials !! stupid question, i m writing it mid vid, I m still wrapping my head around the useMemo hook etc and i ve been thinking, if it so necessary, why is it not the default for state ? Sorry for my english.
@jherr3 жыл бұрын
If you give me a time reference I'll give you my reasoning about useMemo.
@aestheticallyamazing20033 жыл бұрын
What intellisense did you use around 3:54 I'm totally mind blown
@jherr3 жыл бұрын
That's Github Copilot.
@ferooref76143 жыл бұрын
Why do you need to destructure the array in 14:03 ?
@jherr3 жыл бұрын
Math.min expects multiple arguments, like Math.min(10,20,30). If I do this Math.min([10,20,30]) then it just wants to min that one array. If I do this Math.min(...[10,20,30]) that turns into Math.min(10,20,30) and I get the min value.
@philykearney3 жыл бұрын
Great video Jack as always. 👍 What vscode theme is that?
@jherr3 жыл бұрын
Night Wolf [dark blue] with MonoLisa
@philykearney3 жыл бұрын
@@jherr nice, thanks 🙏
@shokhbozabdullayev62602 жыл бұрын
Thanks for the great extension for diagramms)
@MmmMmmGood173 жыл бұрын
Thank you, this was very informative. It was a bit hard for me to follow because of having two components in one file. Just a recommendation to consider separating out the components into their own files. Thanks!
@jherr3 жыл бұрын
Thanks for the feedback!
@lkd9822 жыл бұрын
brilliant demonstration
@76Freeman3 жыл бұрын
Thank you very much Jack for this very informative and clear video.
@sandeepgupta24762 жыл бұрын
Can I add pokemon.length as dependecy in useMemo instead of whole pkemon array?
@jherr2 жыл бұрын
Sure, but... If you changed the pokemon array to a new reference BUT the length remained the same, then that dependency wouldn't fire.
@sandeepgupta24762 жыл бұрын
@@jherr indeed, you made a greate point.
@chenrvn3 жыл бұрын
Hey, thanks for sharing :-) I am not sure when you have a dependency you can use the use effect with his dependency array also, so when you need to use useEffect and when use Memo? BTW I didn't really understand what use Callback give us here because you show it without any dependency. Can you give an example please :-)
@jherr3 жыл бұрын
useEffect is "watch these values". useMemo is "compute this value from these values". and useCallback is the same thing but applied to functions. For custom hooks I would always use useMemo and useCallback because I don't know how the data and functions I return from the custom hook will be used. For component code, useCallback is optional, but I still recommend it if you are sending the callback to another component so that it retains referential integrity.
@NorweskiDrwal3 жыл бұрын
useCallback holds a function that needs to run when given dependency changes in this case, we wanted to fire it only with event.target and we didn't need useCallback's context to watch for updates from that dependent variable if we included "pokemon" variable somewhere in that "onSetSearch", it means we want useCallback to know about "pokemon" too i hope this makes sense ;)
@chenrvn3 жыл бұрын
@@jherr I think the conclusion need to be: do you want to make react to be Reactive? You need to use: useEffect, use Memo and use Callback :-)
@gregstarr9633 Жыл бұрын
Most excellent video.. highly valuable.. thank u so much
@osamaaburabie56843 жыл бұрын
Great tutorial sir, I have a question whats the name of the extension for auto suggestions you're using.
@jherr3 жыл бұрын
That would be Github Copilot. Don't believe the FUD, it's not going to take your job. But it is going to accelerate your coding like I've never seen before.
@osamaaburabie56843 жыл бұрын
@@jherr I've signed for it couple weeks ago but i thought ur using something else haha. thanks for the quick response btw🙏
@kunjuperath3 жыл бұрын
For search is there a reason why you chose to refetch the data and do a filter rather than just filter the array that you already have locally? I guess refetching guarantees the latest data (which wouldnt help in this case) but on an onChange that seems like too many fetches imo. Thanks for the awesome video! Cheers!
@jherr3 жыл бұрын
The example is more about how to manage control flow. But in reality, yeah, it's a small dataset and in this case fetch is just going to returned the cached data anyway. I'd probably also add in some debounce tho. :)
@kunjuperath3 жыл бұрын
Thanks for replying! That makes sense and I didn't know debounce was a thing tysm!
@happygurha50623 жыл бұрын
Love to see a demo on dependency injection with react context And react ui architecture patterns
@Knowwhentobluff2 жыл бұрын
But isn’t use memo doing triple equals too? If I have two objects I’m comparing and I change something deep inside the object .. it isn’t going to trigger the useMemo
@jherr2 жыл бұрын
That’s correct. If the reference doesn’t change then it won’t fire. But… you can depend on the deeply nested value.
@Knowwhentobluff2 жыл бұрын
@@jherr I have a useMemo that I use that depends on react query data..I change the object property deep inside the project on a post call api call success response… but my useMemo doesn’t rerun for the new values.. maybe i have to go deeper in the object for my useMemo dependency array?
@jherr2 жыл бұрын
@@Knowwhentobluff you should depend on the values you use in the memo, deeply nested or not.
@Knowwhentobluff2 жыл бұрын
@@jherr even if useMemo is like “omg this is an unnecessary dependency”
@PhilipAlexanderHassialis3 жыл бұрын
Oh.... and this is why Solid uses functions instead of primitive values in their createSignal, right? So essentially, since you invoke the function, the runtime "knows" what is dependent to something and renders only the appropriate part... is this a correct assumption Jack?
@jherr3 жыл бұрын
Yes. Exactly.
@novanoskillz41513 жыл бұрын
Can someone explain the calculatePower function at 3:18 what are all of the + signs doing?
@dokkenrox Жыл бұрын
They're adding all the numbers in each variable together to get the total.
@mikecastor20472 жыл бұрын
What a fantastic resource!
@carminetambascia63552 жыл бұрын
Jack is the Lead Senior anyone wish to have. But anyone can have a bit watching his video
@sidds50392 жыл бұрын
Ah that comparison with Vue's 'computed' mechanism really cleared up a lot for me - thanks!
@mansamusa5593 жыл бұрын
Can you make a video about your VS code add ons and code formatting? I really need to step up my game after seeing u code!!
@mansamusa5593 жыл бұрын
I'm learning so much from you thanks alot!!
@0x0abb3 жыл бұрын
awesome work!
@tarunsukhu26143 жыл бұрын
You are a champion Jack! , Thank you
@ShaggyKris3 жыл бұрын
By the way, what is that diagram extension that you're using?
@jherr3 жыл бұрын
There are a bunch, but the particular one I used was marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio I prefer the look of Excalidraw - excalidraw.com/ - but having the arrows snapping feature made it easier in this case.
@ShaggyKris3 жыл бұрын
@@jherr Thanks!
@buckyhelmsmash76702 жыл бұрын
what's your vscode theme color?
@jherr2 жыл бұрын
Night Wolf [black] and Operator Mono
@codezero60233 жыл бұрын
What plug-in are you using for diagrams in VS code?
Hello jack , could you please tell us , which extension use for diagram plotting in vs code
@jherr2 жыл бұрын
Diagram.io
@MrEliyahilel2 жыл бұрын
You are awesome, thanks a lot!
@NEGI_JI092 жыл бұрын
Congratulate me) I finally found what I was looking for
@dgcp3543 жыл бұрын
Ur home looks amazing
@reanibutani95553 жыл бұрын
Thank you very much Jack
@rohithchittibommala20023 жыл бұрын
What is theme u r using?
@miguelyoutube1002 жыл бұрын
Thanks for the great video
@NorweskiDrwal3 жыл бұрын
14:45 min max could have also been achieved with useCallback(type: 'min' | 'max') and Math[type](...) , reducing the code duplication a little, I think ;) unless this would memoize only the callback, not what it returns, in which case we'd have to use useMemo anyway, which would not be the optimisation we wanted welp, sometimes over-optimisation hurts the performance, when you don't know what you're doing, which proves the point of this video :D
@damonwu96582 жыл бұрын
really good example 👍
@jackh32423 жыл бұрын
React hook form might be an interesting idea for a new video 😉
@jherr3 жыл бұрын
I've done a couple previously on React hook form. I might add it to a speed run though. It's a great library.
@mkman3 жыл бұрын
I love the pop culture references 😃
@illiakhomenko64052 жыл бұрын
amazing explanation, thank you!
@kirillpavlovskii83422 жыл бұрын
What is .dio files extension ? How does it work ?
@jherr2 жыл бұрын
It's handled by a diagramming tool extension. marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio
@joelbrandao42 жыл бұрын
Great content! Can someone explain the need for useCallback? I couldn't get it. Thanks!
@thomasstambaugh51812 жыл бұрын
Heh -- I rely on the linter to tell me when I need useCallback. My perhaps naive understanding is that useCallback is the mechanism to break infinite loops in the rendering/useEffect code. As the linter explains, a function that is needed only by one specific useEffect hook can often be refactored into a local function within the hook -- eliminating the need for useCallback. Your mileage may vary. :)
@oussamaabdelwahed55942 жыл бұрын
great content :D
@ab0od1793 жыл бұрын
These tutorials are great but tutorials that explains logics might be even better, for example: I had a hard time implementing a data fetch on scroll app on how to do that from both frontend and backend. Same with tables that have indexing at the bottom, on how to fetch data on indexing change (again from frontend and backend).
@jherr3 жыл бұрын
react-use has some excellent hooks to track scrolling, and you can use the data from those as dependencies on useEffects to fetch more data. Same thing with a page index. If the page index is a dependency of the fetch useEffect then the fetch will fire every time the page changes to go and get the data for that page.
@ab0od1793 жыл бұрын
@@jherr Thanks for the advice, backend was also a challenge (in some way)
@sourishdutta96003 жыл бұрын
Really awesome 👌👏
@AlexejStrelzow Жыл бұрын
great video, thnx - just a small typo: it's Kent C Dodds, not Dobbs; or maybe it's a joke I don't get...