We Need to Taco 'Bout Your Choices
In this episode, Emma Bostian and Jason will build an app together to settle their taco differences with your help. Make sure to mark your calendar and help settle this debate! š®š®š®
Links & Resources
- https://hasura.io/
- https://squoosh.app/
- https://reactjs.org/docs/create-a-new-react-app.html
- https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range
- https://www.netlify.com/products/dev/
- https://www.netlify.com/products/functions/
- https://unsplash.com/photos/61wG5-SAF_Y
- https://unsplash.com/photos/OKJlJn5smek
- https://unsplash.com/photos/ZQf4jzkpz1k
- https://unsplash.com/photos/z_PfaGzeN9E
- https://www.instagram.com/emmabostian/
Related Episodes
Full Transcript
Click to expand the full transcript
Captions provided by White Coat Captioning (https://whitecoatcaptioning.com/). Communication Access Realtime Translation (CART) is provided in order to facilitate communication accessibility and may not be a totally verbatim record of the proceedings.
JASON LENGSTORF: Hello, everyone. And, welcome to another episode of Learn With Jason. Today, weāre going to argue about taco with Emma Bostian. Emma, thank you so much for hanging out with us today.
EMMA BOSTIAN: Youāre so welcome. Please excuse the fact that Iām eating pizza. Why am I not eating tacos? Thatās because they donāt have Taco Bell in this future and I refuse to eat anything else.
JASON LENGSTORF: Itās going to be so easy to win this debate because itās so obviously wrong that Taco Bell is ā more or less ā better than any other taco.
Iām super-excited to have you on the show. Iām happy to have you back. For those of you who donāt know, Emma and I used to work together, but way back in the day, we both worked at IBM.
Do you want to give a background and a story?
EMMA BOSTIAN: Storytime!
(Laughter).
Jason believed in me when I was a baby developer. I started at IBM in 2015. I remember, you believed in my mentorship. I was starting to do an executive mentorship program at IBM and Jason was one of four people who believed in me. I was like, how do you get to speak at conferences, you get to travel the world. I want to do that. You inspired me. I was lived in Germany. Now Iām in Sweden. New country, new me.
JASON LENGSTORF: No kidding.
EMMA BOSTIAN: The sparks notes edition of how we met.
JASON LENGSTORF: Youāre at Spotify now. Is this your second or third foreign country that youāve lived in now?
EMMA BOSTIAN: Well, if you count study abroad, it would be three, because I studied in London, loved in Germany for three years and lived in Sweden for four and a half months.
JASON LENGSTORF: Of the three, which is your favorite?
EMMA BOSTIAN: Sweden. Donāt get me wrong, I love Germany. I didnāt love the city I was in. It was kind of boring, no offense.
JASON LENGSTORF: I have found that there are cities that feel like home and thereās city that feel like the kind of place you donāt ā you never really settle it. I felt that way about Berlin. I thought it was going to be home. It just did not feel that way for me.
Um, but ā
EMMA BOSTIAN: Yeah. (Laughter).
JASON LENGSTORF: La Neta, is that (Indiscernible).
EMMA BOSTIAN: My coworkers in the chat, quite a few. Theyāre asking you why didnāt you order from La Neta. You would have won by default and I am stubborn. (Laughter).
JASON LENGSTORF: Okay. So, this all kind of stemmed from an argument where you ā you posted, on Twitter, that Taco Bell was the best taco and I couldnāt let that stand. So, we argued until we decided that this had to actually get settled. So today, weāre going to build an app to settle this debate. This is going to rely on audience participation. We need votes. So, the plan that we have is, weāre going to build a polling app. And this is actually going to be kind of inspired by an app that Sarah built called āis this a sandwich.ā Itās a click-through poll. Weāre going to aggregate these scores and show a winner. So, this is our plan; neither one of us does a ton with data so we may or may not get there. Weāre going to do our best.
EMMA BOSTIAN: We might get to the Create React part and say, screw it, weāre done. (Laughter).
JASON LENGSTORF: More or less a rap battle where weāll talk about tacos at each other.
On that note, letās twitch over to pair programming mode. If youāre not already following Emma, you should go and do that. It is a good time. Emma is full of good insights and good jokes and bad takes on tacos.
EMMA BOSTIAN: And if youāre not already following Jason, make sure to hit that āsubscribeā button.
JASON LENGSTORF: Ring that bell!
(Laughter).
Letās also make sure that we give a shout-out to our sponsors. So, we have live captioning being done by Vanessa right now. That is over at lwj.dev/live. Thatās made possible by Netlify, Fauna, and Auth0. I very much appreciate.
Weāre going to use Hasura today to do our voting.
If we want to get started, hereās the way I see this goingā¦youāre a React pro. So youāre going to lead ā
EMMA BOSTIAN: Oh, thatās dangerous, but letās do it!
(Laughter).
JASON LENGSTORF: We need to get some images. The vision that we have is youāre going to look at a taco and answer, is this a taco? Is this the best taco, yes or no? This is not going to be a particularly scientifically accurate show. Youāre going to see if you want to troll me or Emma. Weāre going to go to Unsplash and grab taco images.
EMMA BOSTIAN: This is not safe for work. (Laughter).
JASON LENGSTORF: Okay. So, hereās what weāve got, weāve got ā hereās our taco photos. So, we got some Taco Bell photos. I couldnāt find a āhereās a Taco Bell press ones.ā Please donāt sue me, Taco Bell. Emmaās all for it. This is 50% good press.
Now ā so, weāve got these four Taco Bell images and weāre going to grab four non-Taco Bell images. Letās see ā letās look at ā how about this one and ā weāre using Unsplash because, again, we want to make sure ā first of all, that the creators get credit. And second, I donāt want this episode to get taken down later.
EMMA BOSTIAN: Al Pastor is the best.
JASON LENGSTORF: The effort is there.
EMMA BOSTIAN: You know the first time I had an Al Pastor taco, we rolled up to a gas station in the middle of Austin, off a highway. And it was ā it was not as good at Taco Bell, but I will give it a 9 out of 10. (Laughter).
JASON LENGSTORF: So, Iām going to download these and we are going to, uh ā weāre going to work on these. So, just a quick shout-out to the creators. That is very much appreciated. Iām going to put them into this ā not that. This directory, here. Oh, I really donāt like that itās ā oh, man. Why is that not organized? Be organized.
EMMA BOSTIAN: I hate that so much.
JASON LENGSTORF: Itās killing me. (Laughter). So, weāve got these four images. I feel like we probably want to process these a little bit because they are very, very large. Iām going to use Squoosh.App. I think it was the Chrome Dev Rel team. It looks like it got an update. Thatās really nice-looking.
EMMA BOSTIAN: Look at that!
JASON LENGSTORF: Thatās beautiful. Okay. So what we should be able to do with this, then, is any one of these, we can drag in and we can resize it. Letās make it 800 pixels wide. And then Iām going to compress it. And, look, weāre going to get an 88% savings on these files, which is unbelievable. So, thereās one. Letās get the next one ā
EMMA BOSTIAN: I always do this through Figma and itās such a pain in the butt.
JASON LENGSTORF: It really is. Itās really, really nice to be able to come here for this kind of stuff. Um, so, yeah, another one. Weāre going to get an 88% savings. And, like, you can see, we resized it so you can see the quality difference here. But if we go down to the size itās going to be at, like 800 pixels, you can barely see the difference. This is 12% of the size it is supposed to be. Thatās a really important ā did I do the Fidel Fernando one twice? Let it be 75 again. All right. Is it just ā itās continually doing the same one. Iām going to reload, because I think maybe I ā Fidel Fernando one is in there.
EMMA BOSTIAN: Thatās the hardest thing is keeping your assets organized, I swear.
JASON LENGSTORF: It really is. Likeā¦you good? 98% savings on this one holy buckets!
EMMA BOSTIAN: You know that show, āExtreme Cheapskatesā? Thatās us. I feel like we need copyright music in the background.
JASON LENGSTORF: The problem with the music is when weāre talking and thereās music and people play sound effects, the show can get really overstimulating.
EMMA BOSTIAN: Itās a shame I donāt have my trumpet. We could have played. (Laughter). (Music playing in the background).
JASON LENGSTORF: 99% savings on that one. Now that weāve got these, Iām going to take these giant ones out, these giant files. And instead, weāre going to drop these ones back in. And I think this is the one that doesnāt have ā yep. Okay. So, now weāve got these images and theyāre significantly smaller. So, this is going to be way easier to manage. And so, with that, we can start a new site. So, you were thinking Create React App?
EMMA BOSTIAN: Yes, please.
JASON LENGSTORF: So, letās ā NPX ā wait. Is it NPM Create?
EMMA BOSTIAN: Weāre going to find out.
JASON LENGSTORF: Letās see what happens. And weāre going to call this one āWe Need to Taco āBout Your Choices.ā This is the best repo Iāll ever create. And itās not a monorepo so I never have to type it again. Itās just here to make me smile. Okay. So, we are installing everything that we need. Andā¦hopefully this wonāt take very long. I got the good internet so that I didnāt have to, you know, really spend any time on this.
EMMA BOSTIAN: I swear my cats are going to be unruly during this and itās just because they know when mom is livestreaming. (Laughter).
JASON LENGSTORF: They lie and wait.
EMMA BOSTIAN: I feel like we should make awkward elevator conversation. Do you have any fun questions?
JASON LENGSTORF: Yeah, where are you at, chat?
EMMA BOSTIAN: Yeah, chat. Ask us anything. Oh, God.
JASON LENGSTORF: Youāre going to regret that. (Laughter).
EMMA BOSTIAN: Howās the weather? Dark!
JASON LENGSTORF: How much sunshine do you have?
EMMA BOSTIAN: I donāt want to talk about it. Corn or flour tortilla. It has to be a flour if itās a quesadilla. Thereās nothing better than a potato, egg and cheese.
JASON LENGSTORF: Maybe only the folks that have been to Austin can appreciate, breakfast tacos, outside of Texas, are just garbage. I got a ā
EMMA BOSTIAN: We can agree on that.
JASON LENGSTORF: I got a breakfast taco in Portland and I was so sad.
For anyone not familiar with tacos, itās a Mexican dish, especially in Europe, theyāre hard to find. A taco is not necessarily the hard shell. Traditionally, they donāt have a hard shell. But, you can take a tortilla thatās usually about yay big and you would serve that with meat or grilled toppings. Al Pastor, they do beef?
EMMA BOSTIAN: Itās pork and itās marinated.
JASON LENGSTORF: Theyāll put fresh onions, cilantro and then hard-shell tacos are flash-fried tortillas and Americans really got into that because we like hand-held food.
EMMA BOSTIAN: There is a Gordita Crunch and you wrap it in a soft layer of cheese. That is why I love Taco Bell.
JASON LENGSTORF: The chat is very into this. (Laughter). I think youāre all wrong, but the ā yeah. So, the ā (Laughter). Oh, chat, youāre killing me. Youāre killing me right now.
EMMA BOSTIAN: (Away from mic).
JASON LENGSTORF: Al Pastor is like Chiliās. You know the cone of meat you would see in a kabob shop? Itās that. Itās a vertical rotisserie grill. Yes, I love those. So, now that weāve got this, Iām actually ā
EMMA BOSTIAN: No! Why ā why is that on the right side? Are you ā are ā
JASON LENGSTORF: Iāll show you why. Watch. This is why. Itās so that when I open this and then I hide my sidebar, my code doesnāt jump around. I learned this from Nikki, in the chat, and I know that itās upsetting at first, but itās a game changer.
EMMA BOSTIAN: I cannot proceed with this livestream. (Laughter).
JASON LENGSTORF: People are so upset.
Okay. Weāre all making choices that some of us donāt agree with us today. Weāll disagree and commit here, I think.
So, the first thing we need to do is probably just define our list of tacos. Right? So we can start with, like, tacos and that can be an array and then each one is going to need, um ā we can call it, like, source. That will be the path to the image. Itās going to need alt text. Do we want to give them names or anything? We should probably give them an ID of some sort.
EMMA BOSTIAN: I donāt think theyāll need names, because I think weāll run out of names. Like, Saucy Boy 1? Big Boy 2?
(Laughter).
JASON LENGSTORF: Okay. So, then if weāve got these, I can take all of these images. Iām just going to copy them. Andā¦do you know how static images work in Create React App?
EMMA BOSTIAN: Thatās a ānoā for me. I think you just import them.
JASON LENGSTORF: You just import them?
EMMA BOSTIAN: You import ātacoā from the relative path.
JASON LENGSTORF: What?!?
EMMA BOSTIAN: I donāt know, Iām not a programmer. (Laughter).
JASON LENGSTORF: We need to call this āimages.ā And Iāll put all these photos in here. Is that going to work for me? Itās not going to work for me, which means I got to drag them in. Thatās fine. So, letās take all of these. Weāll put them into this images folder. Okay.
EMMA BOSTIAN: Beautiful. Doritos Locos. (Laughter).
JASON LENGSTORF: Oh, thatās not going to work.
EMMA BOSTIAN: You can copy the path, though. Look at that!
JASON LENGSTORF: Beautiful. Oh, itās beautiful. Okay. So, weāll be able to go from app into there. And, we can say, uh, āTaco Bell Cheesy Double Decker Taco.ā Okay. So, thatās one. And then, we can duplicate this out. So the next one we need is the cheesy thing, whatever this is. Okay. Iām sorry, these are not going to be the most helpful, um, alt text because I donāt want to spend the whole episode trying to configure this object. So, we will do our best. In a production app, we would take more time on this.
EMMA BOSTIAN: They want us to name one āFabulous Fatty.ā (Laughter).
JASON LENGSTORF: And, what was the last one? Just āTaco Bell Tacos.ā
EMMA BOSTIAN: Sounds good. Iām not sure if itāll work like this. I donāt know if we need to import them and set the source.
JASON LENGSTORF: Good point.
EMMA BOSTIAN: But, I think that this is worth a shot.
JASON LENGSTORF: Name one āCheesy Chester.ā
EMMA BOSTIAN: Like weāre naming children.
JASON LENGSTORF: I feel like if we named one āCheesy Chester,ā it would get bullied.
EMMA BOSTIAN: Oohhhh.
JASON LENGSTORF: This is going to go poorly, I think.
EMMA BOSTIAN: I wonder if we should validate our assumption before we just keep making ā
JASON LENGSTORF: Youāre probably right. Letās see if we can get these to show on-screen. Soā¦I guess we can just do, like, aā¦all right. So, letās do, like, a main and then inside, we can do, um, ātaco.map.ā And, why donāt we get, like, an image and itāll need a key, which we can use the ID. Not like that, it doesnāt. And then, is this going to work? āTaco sourceā?
EMMA BOSTIAN: I donāt know. Are you using (Indiscernible) as your font?
JASON LENGSTORF: Operator Mono. We should see an immediate explosion. No!!!! Wait, what does that mean? Did it not, like ā it didnāt print them, even.
EMMA BOSTIAN: It says āmap needs a return.ā A-ha! I did this the other day.
JASON LENGSTORF: Every time. Every single time. Now what?
EMMA BOSTIAN: Itās probably not ā yeah.
JASON LENGSTORF: Unexpected token.
EMMA BOSTIAN: Iām surprised that ESLint didnāt remove that. You can set it to component or image.
JASON LENGSTORF: So, hold on. If I do āCheesy Chesterā here, weāre going to import that from here.
EMMA BOSTIAN: Yeah.
JASON LENGSTORF: Then, is that the source or do I just, like, throw this in as ā
EMMA BOSTIAN: No, I think itās your source. Iām pretty sure.
JASON LENGSTORF: Uh-oh.
EMMA BOSTIAN: I like how I told you I was pretty sure and you were like, āIām going to try it anyway.ā
JASON LENGSTORF: I like to see what happens. (Laughter). You were absolutely right. It just brought in the path and I was trying to create that path as a component. (Laughter).
EMMA BOSTIAN: People are saying that the images should be in the public folder, as well.
JASON LENGSTORF: Oh, look at this public folder we should have used. Okay. So, wait, then ā so, if thatās the case, then we could just do this?
EMMA BOSTIAN: Potentially, yeah. Letās try it.
JASON LENGSTORF: Letās try it with one. Let me take my Cheesy Chester out of here.
EMMA BOSTIAN: I appreciate (Indiscernible) telling you to listen to me.
JASON LENGSTORF: I am listening.
EMMA BOSTIAN: Iām kidding.
JASON LENGSTORF: Why did that just work for all of them, though?
EMMA BOSTIAN: Probably because we moved it into the public folder.
JASON LENGSTORF: Oh, and itās relative. Okay. Okay. So ā
EMMA BOSTIAN: Thatās good.
JASON LENGSTORF: And so the other way we could have done this would have been to, uh, to import those ā to import those images directly and then we could have put them as the source. But this ā this feels more correct, I guess?
EMMA BOSTIAN: Yeah. Itās less clutter at the top, definitely.
JASON LENGSTORF: Yeah. Yeah. I do like not having to import images as JavaScript dependencies. That feels a little weird.
We got Fidel. Letās drop the public out. Letās get Jordan. I love this relative path. This is new to me.
EMMA BOSTIAN: Itās nice, right?
JASON LENGSTORF: Wonderful. Okay. All right. And, last one, Christian.
EMMA BOSTIAN: Ladies! Iām working!
JASON LENGSTORF: Your cats?
EMMA BOSTIAN: Yeah. Itās like the Daytona 500 in here. (Laughter).
JASON LENGSTORF: These are not Taco Bell tacos. Iām so sorry for those alt descriptions. I want to make sure we get a chance to finish and we have limited time.
EMMA BOSTIAN: Can you stop! Sorry. (Laughter).
JASON LENGSTORF: So, we have that and then weāve got our app CSS. So letās take this app CSS and change ā I donāt want it to be 100v height. Weāll add padding. That seems a little ā yes. Thatās a little easier to deal with. Maybe a little bit shorter. Good. Okay. So then we need, like, a container for our images. Umā¦do you have opinions on this? Whatās your preferred way, right now?
EMMA BOSTIAN: How are you going to display them? Are you going to display them in a grid or display them one-by-one?
JASON LENGSTORF: Oh, we should display them one-by-one.
EMMA BOSTIAN: Have a hook that says āactive tacoā and set it to the ID of the current ā
JASON LENGSTORF: Okay. So, we can import use state from React and then down here, weāll create active taco ā āset active taco.ā Iām pretty sure that my favorite ā my favorite variable names are going to come out of this.
EMMA BOSTIAN: Yeah. (Laughter).
JASON LENGSTORF: Also, Iām realizing I made a HUGE mistake by not zero indexing these.
EMMA BOSTIAN: Yeah.
JASON LENGSTORF: But then again, maybe I also just want to ā
EMMA BOSTIAN: I mean, yeah, move that up to the top if youāre going to get upset about the fact that it starts down there.
JASON LENGSTORF: Iām going to get upset. (Laughter). You know me well. (Laughter).
EMMA BOSTIAN: I mean, I was going to be upset, too, but I wasnāt going to cancel the livestream. (Laughter).
JASON LENGSTORF: I was. I was just going to stop. Like, weāre done.
EMMA BOSTIAN: Jason Lengstorf canceled due to his choice in indexing. (Laughter).
JASON LENGSTORF: Instead of showing this, we can start by doing, like ā we would need maybe a div with a class of current vote. Class name of, like, current vote, I think. And then inside of this, we needā¦the image, um, a form, and under the form, we need a, like, āyes/no,ā and, like a question heading.
EMMA BOSTIAN: You know what Iām thinking? Instead of saving the index as the active taco, letās save the whole index.
JASON LENGSTORF: Okay. Weāll go ātacos zero.ā Weāll just start there. Okay. That works. Oh, yeah, we can do āactive taco dot.ā So to start, we can go back to our image, weāll do a source of āactive taco.source.ā āActive taco.alt.ā Weāll do styling relative to this container, I think. So, then, we need āform.ā And, that form will probably ā nah, weāll just figure that out later. So, to start, we need a question. āIs this the most delicious taco?ā And then we need ā okay. Should we do this as a ā as buttons? As a radio?
EMMA BOSTIAN: I think it needs to be a range of, like, 1 to 5, like, a slider.
JASON LENGSTORF: Oooookay.
EMMA BOSTIAN: Because then, we can see which ones have the highest overall rating. Because the thing ā yeah. If you say, āis this the most delicious?ā They may not know. They may not have seen the other ones.
JASON LENGSTORF: I get what youāre saying. Weāll label this with an HTML4 for amount and choose one for not delicious ā
EMMA BOSTIAN: Garbage.
JASON LENGSTORF: Choose ā1ā for garbage. (Laughter).
EMMA BOSTIAN: Choose 5 for (Indiscernible). (Laughter).
JASON LENGSTORF: Well, I donāt think anybodyās going to give Taco Bell a Michelin star. How about 5 is āI will die for this taco.ā
EMMA BOSTIAN: Sounds good.
JASON LENGSTORF: Input range ā
EMMA BOSTIAN: I would have to look this up.
JASON LENGSTORF: Max ā I just did one of these with ā with Lindsay a little while ago and we styled this up, so Iām trying to remember what she taught me. Min/max and I think the step will default to one. Nope, I broke it already. Yeah, that is great.
EMMA BOSTIAN: Why are there no labels on it, though?
JASON LENGSTORF: What do you mean?
EMMA BOSTIAN: Thereās no indexing numbers. Is that the default by HTML inputs?
JASON LENGSTORF: Maybe it is. Actually what we should do is do like a const ā tastiness. Weāll start at the middle. Weāll start at 3 and you can choose which direction you want to go. And so, we will set the value ā
EMMA BOSTIAN: Wait, you can set list equal to tick marks as an attribute. Oh, my god, this is so cool. Iām going to send you this in the Zoom chat. This is super-cool. You have a data list element. You set it to the ID of the list ā the list attribute. And then you can set different options, different steps with different labels so that itās fully-accessible. Yeah, if you scroll down towards the bottom, youāll see the example with ā keep going. Keep going. Itās pretty far down. Yeah. This one, here. Right there. You just past it. Go up again.
JASON LENGSTORF: Oh, nice! Oh, wow. Wait, so to do that, we need to input type range ā oh, so tick marks is the ID. I get it! I get it! I get it! So, that makes sense. So, then weāre going to ā oh, I love that! So, I guess we can probably put it in the ā in the thing? Letās do a data list ID of tick marks. And then, weāre going to get an option value 1. Okay.
EMMA BOSTIAN: I just also want to call this out because Craig made a great point. Currently no browser fully-supports these features.
JASON LENGSTORF: Letās do five of these and go every other will get its value. So, this one will be ā2.ā This one will be ā3.ā 4. And, 5. What does this look like? Okay. So, weāre getting closer. We need to add and styles, here, because this is getting a little too ā for now, I guess, letās ā
EMMA BOSTIAN: Thatās awesome, though. I hope that they make that extensible to all browsers quite soon.
JASON LENGSTORF: Okay. So, this doesnāt quite work, but it works pretty well. We need an āon changeā for this and so āon change.ā I donāt remember how to do this.
EMMA BOSTIAN: Yeah. Yeah. Exactly. Weāre going to have to set tastiness.
JASON LENGSTORF: Target value? Letās try.
EMMA BOSTIAN: We going to find out.
JASON LENGSTORF: Oh, my goodness! That is beautiful. Okay. So now what we can do is we can send this vote to umā¦we can send this vote to a database, which means we need a database. For that, weāre going to use Hasura. Letās maybe get the clicking through working, first, and we can store all the results and then weāll submit all the results at once.
So ā okay. So, that means we probably need ā this is where now Iām wondering if we need, like, something more than just āuse state,ā but we can ā we can do, like, umā¦score ā or, we can do āresponses.ā And weāll do āset responses.ā And that can be āuse state.ā Like, an array? And then, down here, weāll haveā¦uhā¦okay. Weāll save and rate the next taco.
EMMA BOSTIAN: Uh-huh.
JASON LENGSTORF: Good. And then, when we click that, weāre going to need an āon submit.ā And this is going to need, like, logic. Soā¦because weāre going to have to, like ā when you still have tacos left in the list, we need to update ā okay. So, letās write this down. āHandle submit.ā
EMMA BOSTIAN: I wonder if we should actually have ā can you ā in the default state, can you reference another state value? Like, if we have active taco index, can we use that inside of the ā like, do we need ā you know what I mean? I think we should actually keep the index so we can check whether or not weāve actually reached the end.
JASON LENGSTORF: What we should ā hmmmmā¦yeah. Maybe we do want, um ā maybe we do want the index, because then we could be like ā
EMMA BOSTIAN: Yeah, I think thatās probably better. Yeah.
JASON LENGSTORF: So letās keep an index. And then what we can do, down here, isā¦tacos. Active taco. And then weāll change all of these. Okay. So, then what ā oh, what we probably also need is a hidden input. Well, no, we donāt. We can grab that out of the state. When we save our taco, we need to save the current taco ID and its rating. Then, we need to check if this is the last ā last taco. If not, show the next taco. If so, save the response to the database. Iām going to say āDBā so I donāt have to spell ādatabase.ā So, we can save these in āresponses.ā So I think the first thing we would get is, um, we would do, likeā¦āset responses.ā And then we would have the current responses. And we can do, like, umā¦no, wait. It needs to be an array. So, we could return an array, with the current responses, and then set a new one with an ID of ā
EMMA BOSTIAN: Why canāt we just push it? Oh, yeah, because weāre not mutating it directly. Gotcha.
JASON LENGSTORF: I think it has to be immutable. It would be ātacos.ā āActive taco.ā The ID andā¦tastiness, we can just store directly.
EMMA BOSTIAN: Cool.
JASON LENGSTORF: Right? Yes. And thenā¦it would be āif tacos.last index.ā Is that the right thing?
EMMA BOSTIAN: Ummmm, no. It would be, uhhhh, āactive taco is equal to ā whereās array?
JASON LENGSTORF: Tacos.
EMMA BOSTIAN: Tacos.link, minus one.
JASON LENGSTORF: Okay. Then ā
EMMA BOSTIAN: (Away from mic). (Laughter). Sheās awful!
JASON LENGSTORF: So, if it is, then hereā¦
EMMA BOSTIAN: Nice. For science. For bragging rights. (Laughter).
JASON LENGSTORF: Okay. So, if we get there, if not, then we would set active taco to be āactive taco, plus one.ā
EMMA BOSTIAN: Uh-huh.
JASON LENGSTORF: Okay. So, okay. So, I think that ā that meets our goals.
EMMA BOSTIAN: We should just see if it works right now.
JASON LENGSTORF: Yeah. I think this will let us advance through ā
EMMA BOSTIAN: Oh, we should also reset the input to zero.
JASON LENGSTORF: Yes, youāre right.
EMMA BOSTIAN: Or, to middle.
JASON LENGSTORF: Set ātastyā to three. Okay. We added this to āon submit.ā Yes. Okay. So, letās give this a try. So, this taco, uh, I get to run the control, so I get to make the choices right now. Oh, no! Oh, we need to prevent default.
EMMA BOSTIAN: Yeaaaahhhhh.
JASON LENGSTORF: āPrevent default.ā Okay. Letās try this one more time. Here. Save. No.
(Laughter).
We need to style this.
EMMA BOSTIAN: Yeah.
JASON LENGSTORF: Actually, that one does (Away from mic). Absolutely not. No. Yes, I would die for this taco. (Laughter). Iām definitely getting tacos for lunch. Okay. So, I broke something. Oh, it didnāt ā oh.
EMMA BOSTIAN: We probably have an invalid index. We probably have our check incorrect.
JASON LENGSTORF: Yeah. Youāre probably right. Soā¦
EMMA BOSTIAN: So, itās still trying to render, even after weāre done.
JASON LENGSTORF: Oh, we didnāt return! Like, silly cotton headed ninny mugs. If I go through and do a quick ā yes! So, that ā that actually did the thing. Letās ā Iām realizing now, we probably should have ā letās style this so that itās faster to click through.
So, what do you think we should do with this?
EMMA BOSTIAN: Style-wise?
JASON LENGSTORF: Yeah.
EMMA BOSTIAN: We need to make all these photos the same width and height and give them absolute positioning so theyāre not jumping around.
JASON LENGSTORF: Yes.
EMMA BOSTIAN: Yeah, letās do the height of those.
JASON LENGSTORF: Add these responses in so we can see them. So, in the app.CSS, what did we call this container? We called it ācurrent vote.ā So letās go down here and weāll style-up ācurrent vote.ā So, with that, we can maybe see if we need to do anything with that. But, letās do a current vote image. You said you want to give them a width of ā we set those ones to 800. Letās make them a little bit smaller. Weāll get high DPI out of that. For height, you said ā like, 3X4, do you think? Do you freeze? Oh, no, Emmaās frozen.
And then, Iām going to try somethingā¦Iāve offended her so deeply that sheās gone now. Look at that go! Okay. So, this is, like, my favorite CSS property when you donāt control the images, you can āobject fit cover. āI hope sheās coming back. The cats finally took vengeance and went for her.
(Laughter).
There she is. Zoom is out to get us! We will get her back in, in just a moment. Here she comes. Oh, you can do it. Come on ā
EMMA BOSTIAN: You know what I love is when Zoom decides that it needs to update and quits the app. (Laughter).
JASON LENGSTORF: Like, just mid ā yeah, good.
EMMA BOSTIAN: It was like, āZoom has an update, you have to restart.ā It didnāt even give me a choice.
JASON LENGSTORF: That does make me really productive, when that happens.
Iāll get rid of this spacer, now that weāre doing a little bit of styling. Yeah, check that out! Okay. What I did is I used āobject fit coverā as an aspect ratio.
EMMA BOSTIAN: Would love to get the ā the text breaking on to new lines.
JASON LENGSTORF: Whoa. Hold on. We missed one.
EMMA BOSTIAN: Someone said we had an āoff by oneā error.
JASON LENGSTORF: Oh, because our ā because our ā wait! If our active taco ā
EMMA BOSTIAN: Maybe remove the āminus oneā?
JASON LENGSTORF: We actually want the last one. Itās when we get to the one after the last one that we would want to update. Okay. So, maybe one ā oh, no! Hush. Uhhh, so, one more quick thing we should probably do is just style these up a little bit. So, letās do it right in the browser.
EMMA BOSTIAN: Flex Box.
JASON LENGSTORF: All right. So, talk me through Flex Box.
EMMA BOSTIAN: Form, youāre going to want a display flex and flex direction column. Nice. Nice. And thenā¦uhhhhā¦ooohh, that input field though.
JASON LENGSTORF: So I wrapped it with the label so I can probably pull it out, actually, because I realized I also made an accessibility error, I did an HTML 4 and I didnāt give this an ID but now that it has an ID, if we pull it out of the label, itās still connected because of this HTML 4 and the ID. And now these work. So, weāve got our form, display flex, flex direction column.
EMMA BOSTIAN: We might want to add ā I donāt know if a line center or justify content center is going to allow ā okay. I guess center-lining is possibly the best. Yeah, nice. Thatās good enough.
JASON LENGSTORF: Yeah, I think for this particular use case, weāre going to be okay. Iām trying to give some breathing room so you can see whatās going on. But, yeah, that actually came out just a little bit ā what is, what? Five lines of CSS and just made this look about 1,000 times better. If we go to the button, we can add button styles. Weāll go āmargin-top.ā Wow, come on, spell. Give it a little bit of breathing room and then we can make it, like, background ā
EMMA BOSTIAN: Salmon. Oh, thatās awful. Cool. Love it. (Laughter).
JASON LENGSTORF: Give it some padding.
EMMA BOSTIAN: Letās add a nice, little transition on there.
JASON LENGSTORF: Oohhh. Okay.
EMMA BOSTIAN: Well, youāre probably going to have to pull that out of the Editor. Pull it out of Dev Tools and pull it out of the Editor.
JASON LENGSTORF: Once youāve written styles in the browser, if you click this Inspector Style Sheet, itāll show you everything youāve written so you can copy-paste it.
EMMA BOSTIAN: Copy pasta.
JASON LENGSTORF: I love copy pasta.
EMMA BOSTIAN: Can you make sure that black text is accessible on that salmon background? We can do that in Chrome, as well. I think you can click the color.
JASON LENGSTORF: I think we have to actually click the color. Contrast is ā
EMMA BOSTIAN: Look at that! If we set it to white, itās definitely not going to be AA/AAA. Glad we sorted that one.
Go back to the style sheet, real quick. So, this is CSS. So, on button hover and button focusā¦letās do aā transform scale.ā Letās do 1.1, maybe and add transition transform. I think itās ātransform. āIt may be āscale.ā Weāll do .2 seconds and see how that looks. Nice!
JASON LENGSTORF: Nice! Okay.
EMMA BOSTIAN: All right.
JASON LENGSTORF: Thatās fun. Cool. So, now, we have, like ā oops. Uh-oh, uh-oh. Letās try that again. Click, click, click, click, click, click, click, click. Whereās our last ā
EMMA BOSTIAN: Itās the last case, I think. So, um, I think itās still probably trying to set ā well, we have eight. Are seven being rendered or eight? What is up with our indexing?
JASON LENGSTORF: Iām not sure. Let me pull this off to the side.
EMMA BOSTIAN: The minus 1 was correct.
JASON LENGSTORF: But the minus 1 couldnāt have been correct because we were missing one? Did I just miss this? One, two, three, four, five, six, seven. So that would be index eight. Weāre initializing at zero. So, where it should ā
EMMA BOSTIAN: So if āactive tacoā is seven, thatās our last one ā wait, hold on.
JASON LENGSTORF: When itās seven ā
EMMA BOSTIAN: We need a negative 1 on there. Minus 1.
JASON LENGSTORF: Isnāt that what caused us to be missing one?
EMMA BOSTIAN: I donāt think so.
JASON LENGSTORF: One, two, three, four, five, six, seven, eight. 0hhhh! Itās because of this! We have, like, a race condition, where this is being set but ā okay. So, to beat that, we need to ā
EMMA BOSTIAN: We need to move it under the āifā statement, no? Oh, wait. No. No.
JASON LENGSTORF: I think we have to do something like thisā¦and then, we can do āresponses.ā And thenā¦weāll just set the responses to ānew responses.ā Really ā if we need this, then weāre going to need ā
EMMA BOSTIAN: Oh, I got you. Okay.
JASON LENGSTORF: That way, we beat the race condition just by having the object copied.
EMMA BOSTIAN: Can you explain what that is, for my sake, but also for people listening?
JASON LENGSTORF: Yes. So, when React runs a use state update, it ā the state is not immediately consistent everywhere, which means because we declared responses and set responses, when we run the set responses, we canāt guarantee that responses will be updated to this value when this code runs. So, that means that we would need to do ā weād need to do something more ā weād need a use effect that watch the responses value, or something like that. This solves the same problem because we get the new value. What this wouldnāt solve is if this were to randomly fails. If this randomly fails, weāve got much bigger problems because I donāt think itās theoretically possible in the React codebase. But it keeps it consistent. And that way, we can work on that updated value, even if we donāt have the absolute latest and greatest from use state.
This absolutely will get us into trouble in a more complex app, though. I would not ship this to production, this copy of a copy here. You would want to rely on the React lifecycle to make sure you donāt end up one response here and one response there and theyāre not quite consistent, except when they are. Youāll be sad. Since we only have one component that is doing one thing, this is an acceptable workaround. But, you know, your mileage may vary.
EMMA BOSTIAN: I think itās database time now.
JASON LENGSTORF: I think it is. Let me run this, one more time, to make sure we get all eight. And Iām going to change some of them. So, thereās all eight. And itās storing them as a string, so letās fix that. We want ā we want the values to be numbers. So, what if I just change theseā¦
EMMA BOSTIAN: Oh, I donāt know if you can do that; can you?
JASON LENGSTORF: Letās find out, because that would be the easiest solution.
EMMA BOSTIAN: Yeah, thatās true.
JASON LENGSTORF: No, that doesnāt work. So, instead, we got to go in ā weāll parse āint.ā And then, nowā¦we should see that first oneās five is an integer. Yeah! Okay. We can go in here. Weāve already got the ID and weāve got a tastiness score. Weāre going to do a pretty insufficient thing where weāre going to store these in the database. We are going to do that because weāve got 30 minutes left and I want to make sure we get it done.
So, Iām going to log in ā
EMMA BOSTIAN: This is the first time Iām actually making a full-stack app.
JASON LENGSTORF: Iām very excited.
EMMA BOSTIAN: I took database in college and stuff. But in isolation, Iāve never fully put one together.
JASON LENGSTORF: 0hhhh, taco choices. Iām going to use their free tier, which is the U.S. East Region. When I continue to the database setup, I have this option to try with Heroku. Iām logged into my Heroku account. If youāre not, theyāll take you over to log in. Now, ta-da!
EMMA BOSTIAN: What type of database is Postgres?
JASON LENGSTORF: SQL. If youāve used MySQL, the database interaction would look very similar. Fortunately, we donāt have to worry about it. Thereās no SQL required for Hasura. We use GraphQL.
Iām going to set this so the chat doesnāt hack the crap out of us, because they always do.
(Laughter).
>> You hackers! You ā you dirty hackers!
JASON LENGSTORF: Yes, thatās you, chat. You are the hackers.
So, then, what Iām going to do is Iām going to go over to this data tab. Thank goodness, it was a little laggy yesterday and itās snappy as hell today, so thatās good news. Weāre going to call this ātaco votes.ā And weāll give it a column of ID. This is going to go an integer and weāll just not auto-increment it. And then we need ā actuallyā¦
EMMA BOSTIAN: Maybe we shouldnāt auto-increment that. It might be buggy.
JASON LENGSTORF: We need a primary key. This is going to be not the thing. Weāre going to, instead, use a taco ID. That will be an integer. We need the Tastiness score.
EMMA BOSTIAN: What weāre missing is a boolean.
JASON LENGSTORF: We forgot that the whole point was to troll each other. (Laughter). Weāll go add a flag for āis Taco Bell.ā So now when I click this, weāll be able to go to Graphical. Weāll be able to insert new taco votes and we can insert like this. Weāll be able to, um ā no, not update. Insert. And the objects is an array so we can do āis Taco Bell, Taco ID and Tastinessā score. Our taco ID would be zero. Tastiness score would be three. āIs Taco Bell falseā is good. So then, weāll see, we created one taco vote row. And if I go over to ādata,ā and look at this taco votes, we can see, now, weāve got one vote. So, Iām going ā
EMMA BOSTIAN: Because you actually ran that mutation. I gotcha.
JASON LENGSTORF: That is everything weāre going to need. Weāll just call this āadd taco vote,ā so itās easy for us to figure out whatās going on. Letās set this up to actually run. I guess the first we need to do is add this āis Taco Bellā flag.
EMMA BOSTIAN: Do we need to add any dependencies for this?
JASON LENGSTORF: Weāll add one for node fetch. Iām going to copy/paste this. This one is ā and these three are. This oneās not.
EMMA BOSTIAN: Iām glad we caught that because we would have completely defeated the purpose of this.
JASON LENGSTORF: Wouldnāt that have been heartbreaking?
(Laughter).
Okay. The other thing weāre going to need is the ā soā¦will be tacos āactive taco.ā And then we can do the taco ID. Andā¦āis Taco Bellā will be āTaco is Taco Bell.ā Now we should get the full object we need and weāll be able to send these off. So, what I am going to do is, um, Iām going to just get this set up for, um, Netlify functions because weāre writing to a database, we need to have some kind of protection of the database keys. Because we need that admin key in order to write to this database and we donāt want anybody to be able to write to our database from anywhere, which means we canāt put this in our client code because they could open the source viewer and skew the results, which, you know, we donāt want to do bad science here.
Umā¦
EMMA BOSTIAN: Iām going to warn you, I got a notification that Zoom will quit in 15 minutes. No option to delay this. What Iāve learned is Zoom is horrific in terms of ā itās blocking our fun.
JASON LENGSTORF: Where does this build to when we build it? Iām going to find out. I think itās going to go to ādist.ā It goes to ābuild.ā So, the publish folder is ābuild.ā The command is āyarn build.ā And our functions are going to live in a folder called āfunctions.ā And that should be everything we need to get this set up. Iām also going to NPM ā or, I guess āadd yarn fetch.ā Then I create functions and add ā letās do, like, (Indiscernible) add spots. And in here, we can get fetch, which will be ārequire node fetch.ā And then weāre going to export a handler. This is the AWS flavor or Netlify. Other serverless flavors will do it differently. So what I want to get out is the responses, which will be in the event body, but they are stringified. So, weāre going to āevent body, JSON parse that.ā And then we need to send this off to Hasura. We need a few things. First, Iām just going to copy-paste a little helper file that I have, that makes this a little bit easier. So, letās go to āLearn With Jason.ā Iām working on a new version of my site and I just added in some Hasura stuff. This will make our lives a little bit easier.
And what this function does is, if we do it this way ā actually, letās just do it this way. Weāll get it out like this. Weāre going to send a fetch request off to our Hasura URL, which we need to grab as an environment variable. Then weāve got our secret, which we set in the cloud dashboard and we can send off our query and our variables. So, our query is going to be that mutation that we wrote. And, our variables are going to be the responses. So, the responses ā if we take a look at these again ā are ā letās refresh and run a new one of these, now that weāve got the āis Taco Bellā flag in there. Weāve got ID, tastiness and challenge true. This ID is not actually the taco ID, which is what weāll need in the database, which means weāre going to have to map this. So, letās grab that mutation. And this, we can almost drop right in. The main difference is weāre going to turn this into a variable.
So, if ā an easy way to do that is to come over here and look as our tacos and we can just hit that āvariableā button and it becomes objects and we can see, here, it tells us what it needs to be. It did all that stuff for us, thatās cool. Iām going to copy this out and put this right at the top here. And Iām going to make it required instead of making it optional, which is what Hasura did by default. Then our objects are going to go here and that means that our variables need to include objects because it maps these to these and that needs to be an array. So, weāre going to get our responses.map and for each response, weāre going to return a taco ID, which will be the response ID. And then, weāre going to return the, um ā I guess we can just do the rest of it. Actually, we canāt, because that would override our ID. So, instead, weāre going to include ā
EMMA BOSTIAN: Well, canāt you just spread response first, and then overwrite that one? Oh, I see what youāre saying.
JASON LENGSTORF: Weād have to delete it or something, so instead, weāll do it the long way.
EMMA BOSTIAN: Couldnāt we just rename it ā I mean, you can rename it.
JASON LENGSTORF: Wait, you can rename keys in an object?
EMMA BOSTIAN: We abstantiated it. Canāt we change it in the object definitions?
JASON LENGSTORF: I mean, you could, I guess. (Laughter). No, thatās a much better idea. (Laughter). Okay. So, letās fix that. Um, here we go. Weāve got our IDs. I missed one. So, thereās our taco ID. And then down here, we need taco ID and taco ID. Do we use ā.IDā anywhere else?
EMMA BOSTIAN: Weāre not mapping anymore.
JASON LENGSTORF: Yeah. Weāre not mapping anymore. Okay. Okay. Letās just verify that, one more time, and make sure thatās what we want. Boop, boop, boop, boop, boop, boop, boop. Copy ID tastiness. Perfect. That will be significantly easier to handle because we can just drop this directly in.
And that means that whatever we get back, weāre going to just get back the number of affected rows. Iām going to return a status code of 200 and a body of āokay.ā And weāre going to be fine with that.
Um, yeah, weāve got 18 minutes. Once we have that, Iām going to initialize this for work with Netlify. So, weāve got our site, here. Iām going to get āadd everything.ā Good.
EMMA BOSTIAN: Do we need to add, like, the URL?
JASON LENGSTORF: We do, but Iām going to set it up as an environment variable and in order to do that, I could put it in a local ENV file, but Iām going to set it up in Netlify so we can deploy it.
Okay. Almost ready to judge Emmaās taco choices. And then, we can ā did I already create this one? āGitHub, repo, create.ā And we can copy-paste this. Make it public. Yes. Good. Then, weāre going to get āpush.ā Set the upstream so I donāt have to keep typing this. And then Iām going to Netlify āinit.ā And we want to create and configure a new site. Weāll put it on my team. Weāre going to call this āWe Need to Taco āBout Your Choices.ā Good. Leave that default. Go build. Good. So, now, I can āNetlify open.ā It opened the right window! Look at that! Now, I can go into my settings and my build and deploy environment and Iām going to add environment variables.
EMMA BOSTIAN: (Away from mic).
JASON LENGSTORF: Itās so much nicer than an N file. So, Iām going to copy this one and this one and thanks to Sarah, I have ā
EMMA BOSTIAN: Thatās amazing.
JASON LENGSTORF: Itās so nice. I can just type in here and not worry about you hackers stealing all my secrets. Okay. And so, the GraphQL is here. Now that Iāve done that, check this out, I can do āNetlify devā and it pulled those environment variables from Netlify. So now if I was working on a team, my team members would be able to run Netlify dev, as well. So we donāt have to DM each other. Itās really nice.
Oops, I have it runs in two places, so letās close this one and letās run it again. Da-da-da. Okay. So, now that this is running, we can call this, um, this function with our response value. So, if we go back out here, to this one, um, I think I can just ā I think you can just do this. Does that work? It sure does. Okay. Perfect. So, now what I can do is Iām going to open, like, Postman. You could use Curl. Because this is running locally, I can actually test this function by sending real data to Hasura. This is a nice way to do it so Iām going to go to http, local host 8888. Itās always go to be at .Netlify/functions. We called this āHasura add response,ā I think? āHasura add response.ā Yes. I can send ā as a body ā weāll go with raw, JSON and Iām going to paste this in here. And I think that might work or it might explode. Weāll find out.
So, Iām just going to pass in ā no, I need more. We needed to call this āresponses,ā I think? Yes, because itās looking for responses. So, weāll call this āresponses.ā And then, here ā letās see if that just works. I think it might explode ā oh, no, this is valid JSON because weāre not sending any strings or anything so I just need to make that valid. Yes! Here we goā¦we got a 500 error. Field tastiness not found in insert input. Oh, no, we named it something different, didnāt we? Tastiness Score. Oh! Frustrating! This is what I get for trying to be ā so, our tastiness is going to be ātastiness score, is tastiness good.ā Letās try that one more time. Boop, boop, boop, boop, boop, boop. Okay. So, now I can go back and letās get all of these out of here. Now weāve got a tastiness score. So, if I send, we got a 200 āokay.ā And that should be that if I go back to Hasura and I look at our data, look at that! Weāve got votes!
So, now I am just pleased as punch because we can set this up to actually run. So, what we would do, now, is we would say, umā¦new responses. Weāll make this async and we will await fetch, Netlify, functions, Hasura, add response and weāre going to send it as a post request and the body is going to be, um ā waitā¦weāre going to JSON stringify responses, but weāre going to set that to ānew responsesā so itās the right value. Then what we should see here, if I go in and I actually complete this ā
EMMA BOSTIAN: Uh-huh?
JASON LENGSTORF: So, letās do this. Weāll set a couple of these. Weāll just move them around, get some different scores. Okay. So, we donāt have, like, an end state but what we can do, then, is we can go and look at this. Weāll run the query. And nowā¦we have more scores. So, this works. This is actually functional and that means we can deploy it and the chat can actually start voting on tacos.
What did I do? Oh, crap. So, pushing that change and this should build pretty quickly. And, while weāre waiting for it to build, letās get a chat for the link. Oh, no, Emma! Sheās back?
(Laughter).
Just constantly betrayed by Zoom.
EMMA BOSTIAN: Iām over it. (Laughter).
JASON LENGSTORF: So, weāre getting a link for the chat to go and vote on these, because we are just about in business here. There we go. Itās live. So, chat, go and vote on tacos. And, weāve got nine minutes, so we probably donāt have time to actually show how we would pull this in, but actually, this ā this could make a really fun follow-up, where maybe we will do a graph that we can show, where, like, once you ā once you finish voting, we can pull in those results and show you a score of, like, whether or not people are fans of Taco Bell.
Umā¦but, yeah, Iām so excited. Iām really glad we got this running.
EMMA BOSTIAN: (Away from mic).
JASON LENGSTORF: Chat, thatās really what youāre after, right? We were able to ā pretty quickly ā three people are voting. (Laughter). Getting a lot of taco votes here, so weāre going to have really good, scientific data. (Laughter). So, Emma, uh, are you down to come back? I know Iām kind of putting you on spot in public. Do you want to display our results?
EMMA BOSTIAN: We have to give the people what we want, which is to watch me sit here, like, āwhat is happening?ā
JASON LENGSTORF: We should add a āthanksā page. If we get to the last taco, so, this would update our active taco, here, two tacos length is greater than one. So what we could also do is āset is done. Set is done.ā And weāll do use state false. And then if you get here, we will ā after you finish ā actually, letās do it before. Set is done to true. And, if you are done, what we can do is change this out. And weāll do, like, a ā
EMMA BOSTIAN: Marque.
JASON LENGSTORF: Does that still work?
(Laughter).
Okay. So, we can ā weāll put this in a div.
EMMA BOSTIAN: Oh, my god, somebody put a Marque in your chat.
JASON LENGSTORF: Oh, no! That is bad news. (Laughter). This is going to go so poorly. Okay, but, for real, though, donāt do anything bad. (Laughter). So, we can do some results and then letās just ā we can really quickly style this up a tad. And, while weāre doing this, Emma, where should people go if they want to learn more about you ā >> You hackers! You ā you dirty hackers!
JASON LENGSTORF: Or about tacos?
EMMA BOSTIAN: I mean, you can find me crap-posting on Twitter. But Iām really trying to share more on Instagram. So, like, follow me on there, because ā
JASON LENGSTORF: Is it the same?
EMMA BOSTIAN: Yeah. Itās private though. You know why I privated it? Not because I care, but sometimes my friends will follow me and Iāll miss it so I have to, like, accept everyone, I can see ā then I donāt miss my friends.
JASON LENGSTORF: I gotcha. I gotcha. I think I still technically have an Instagram.
EMMA BOSTIAN: You do, I tagged you in one of my stories. (Laughter).
JASON LENGSTORF: This is so bad.
EMMA BOSTIAN: Itās so great. (Laughter).
JASON LENGSTORF: Okay. Thatās atrocious. Iām going to commit this. My favorite commit message.
EMMA BOSTIAN: Dear lord. The chat is trying to hack Twitch now.
JASON LENGSTORF: Stop hacking, chat! I donāt think colors will work, I think I fixed that. The site used for resizing images is Squoosh.
Shout-out to White Coat Captioning, and Vanessa, whoās been helping us out all day. Thank you so much for taking the time to be here and caption the show. That is made possible by Netlify, Hasura, Fauna and Auth0.
Make sure you also go out and check out the schedule because weāve got a lot of really fun stuff coming up. Weāre going to learn Minecraft next week. Literally, Iām going to play the game, Minecraft, for the first time, on stream, with Lindsay. Iām going to dig myself into a hole quite literally.
Then, Jay is going to come up and weāre going to do kind of a really interesting SVG animation ā oh, you broke my whole stream. You hackers. Get out! Iām so mad at all of you. Noooooo! What is that. All right. Okay. Jeez. What is this? What is this? Weāre just going to refresh that.
>> You hackers! You ā you dirty hackers!
JASON LENGSTORF: Did it even work? Youāre all on timeout. Thatās how I feel about this right now.
EMMA BOSTIAN: You know youāre never going to have a solid stream again now. They set display ānone.ā
JASON LENGSTORF: What?
EMMA BOSTIAN: I got you.
JASON LENGSTORF: Youāre all the worst. Thatās how I feel about you all now.
Oh, God!
(Laughter).
You know what? Just stop. Just stop. Youāre all ā youāre all done. Um ā
(Laughter).
EMMA BOSTIAN: That was the best thing thatās ever happened.
JASON LENGSTORF: I was going to teach you stuff and now Iām over it. Youāre all on timeout.
EMMA BOSTIAN: I feel like thatās a Twitch security flaw.
JASON LENGSTORF: Itās a āmeā security flaw. I wrote this chat box.
EMMA BOSTIAN: Ohhhh. Youāre screwed.
JASON LENGSTORF: The overlay is just a website. I would have never expected that my chat is so full of monsters that I would have to protect my chat box against SSS attacks. Well, now that Iāve been thoroughly betrayed, Emma, thank you so much for taking the time to hang out us with. Chat, thank you for being terrible. Vanessa, thank you for doing captioning today.
Youāre all terrible and wonderful and I treasure every minute. Weāre going to raid. Emma, thank you, again, Iām going to end this before we both drown.
EMMA BOSTIAN: Thank you.
JASON LENGSTORF: Bye!
Closed captioning and more are made possible by our sponsors: