WEBVTT

1
00:00:01.360 --> 00:00:03.850
<v Jonas>So after loading the recipe data</v>

2
00:00:03.850 --> 00:00:08.850
from or API, let's now render that data in our application.

3
00:00:10.310 --> 00:00:11.910
And for that, let's go

4
00:00:11.910 --> 00:00:16.183
to our HTML file to basically get the template from there.

5
00:00:17.460 --> 00:00:20.020
Let's close down this terminal

6
00:00:20.020 --> 00:00:22.223
which will keep working in the background.

7
00:00:23.910 --> 00:00:28.363
And so here is the results part, the pagination.

8
00:00:30.610 --> 00:00:33.890
And then here we have the recipe class.

9
00:00:33.890 --> 00:00:35.660
So the recipe class

10
00:00:35.660 --> 00:00:38.990
is basically this whole container.

11
00:00:38.990 --> 00:00:40.290
So here in this case,

12
00:00:40.290 --> 00:00:42.760
it's this whole gray container

13
00:00:42.760 --> 00:00:45.610
which is the one that will contain

14
00:00:45.610 --> 00:00:47.123
the rendered recipe.

15
00:00:48.280 --> 00:00:49.340
Okay.

16
00:00:49.340 --> 00:00:52.363
Then right now it has that message.

17
00:00:53.240 --> 00:00:55.730
So again, it is this message here

18
00:00:55.730 --> 00:00:58.163
that is already rendered there at this point.

19
00:00:59.240 --> 00:01:02.210
Then here's the code for a loading spinner

20
00:01:02.210 --> 00:01:03.920
for an error

21
00:01:03.920 --> 00:01:06.963
and then here, actually for the recipe itself.

22
00:01:08.320 --> 00:01:11.260
So here we have that, not that image,

23
00:01:11.260 --> 00:01:15.250
and then all of the information about the recipe itself.

24
00:01:15.250 --> 00:01:18.430
And so it's all of this code that we need now.

25
00:01:18.430 --> 00:01:19.410
So let's grab

26
00:01:19.410 --> 00:01:21.950
all of this commented out code

27
00:01:21.950 --> 00:01:23.540
and copy it

28
00:01:23.540 --> 00:01:25.453
and paste it here into this function.

29
00:01:27.590 --> 00:01:29.763
So let's add a comment here.

30
00:01:30.950 --> 00:01:33.230
So loading recipe

31
00:01:34.743 --> 00:01:37.783
and then afterwards as step number two,

32
00:01:38.770 --> 00:01:41.053
rendering the recipe.

33
00:01:41.960 --> 00:01:44.170
And for now here we are doing this

34
00:01:44.170 --> 00:01:45.940
like really big function.

35
00:01:45.940 --> 00:01:46.773
But of course,

36
00:01:46.773 --> 00:01:49.380
once we start thinking about the architecture

37
00:01:49.380 --> 00:01:51.430
we will then break this up

38
00:01:51.430 --> 00:01:54.510
into functions and modules

39
00:01:54.510 --> 00:01:57.003
and classes and so on and so forth.

40
00:01:59.980 --> 00:02:03.220
And so, as always doing a big

41
00:02:03.220 --> 00:02:05.853
template literal here, just as always,

42
00:02:07.916 --> 00:02:09.340
so that we can

43
00:02:09.340 --> 00:02:11.360
and then replace all the data here

44
00:02:11.360 --> 00:02:12.980
that we need.

45
00:02:12.980 --> 00:02:15.173
Just fixing the indentation here now.

46
00:02:16.340 --> 00:02:20.340
And so now let's take all the data that we need.

47
00:02:20.340 --> 00:02:23.650
And the first one here is the image.

48
00:02:23.650 --> 00:02:26.850
So let's replace this string here

49
00:02:26.850 --> 00:02:31.850
with recipe.image.

50
00:02:32.500 --> 00:02:34.580
Just like we specified here.

51
00:02:34.580 --> 00:02:36.250
And so this image property

52
00:02:36.250 --> 00:02:38.120
is basically a URL,

53
00:02:38.120 --> 00:02:40.770
which points to the location of the image

54
00:02:40.770 --> 00:02:43.360
on the Forkify API server.

55
00:02:43.360 --> 00:02:46.563
Then here we have the recipe title.

56
00:02:48.340 --> 00:02:49.403
So this one here,

57
00:02:52.807 --> 00:02:53.713
.title.

58
00:02:54.650 --> 00:02:57.610
And actually we also have that title here

59
00:02:57.610 --> 00:02:59.993
as an alt text of the image.

60
00:03:01.990 --> 00:03:02.823
Okay.

61
00:03:02.823 --> 00:03:04.263
Then here we have the clock.

62
00:03:05.110 --> 00:03:08.773
So this 45 here is the cooking time.

63
00:03:10.770 --> 00:03:11.800
So recipe

64
00:03:13.120 --> 00:03:16.136
and missing the block here,

65
00:03:16.136 --> 00:03:18.690
.cookingTime.

66
00:03:18.690 --> 00:03:21.370
Then down here, we have servings.

67
00:03:21.370 --> 00:03:22.943
And so that's this number here.

68
00:03:23.840 --> 00:03:26.670
So number four will now be replaced

69
00:03:26.670 --> 00:03:29.523
with the data coming from the recipe object,

70
00:03:30.760 --> 00:03:32.690
recipe.servings

71
00:03:34.600 --> 00:03:36.673
and let's keep going.

72
00:03:38.070 --> 00:03:41.120
So down here, we have the ingredients.

73
00:03:41.120 --> 00:03:42.470
So for each ingredient,

74
00:03:42.470 --> 00:03:46.420
there will be one list element of this.

75
00:03:46.420 --> 00:03:47.280
So this example,

76
00:03:47.280 --> 00:03:49.720
right now we have two list elements

77
00:03:49.720 --> 00:03:52.040
and one for each ingredient.

78
00:03:52.040 --> 00:03:54.580
But let's actually keep that for later.

79
00:03:54.580 --> 00:03:57.670
And for now keep filling the rest

80
00:03:57.670 --> 00:03:59.760
of the data here.

81
00:03:59.760 --> 00:04:01.630
So this is the next piece of data,

82
00:04:01.630 --> 00:04:03.480
which is the publisher.

83
00:04:03.480 --> 00:04:05.823
So here it says recipe publisher.

84
00:04:06.950 --> 00:04:08.970
And so let's change that

85
00:04:08.970 --> 00:04:12.863
to recipe.publisher.

86
00:04:14.440 --> 00:04:16.447
Then here we have the source URL.

87
00:04:18.790 --> 00:04:20.690
So let's take a look at that,

88
00:04:20.690 --> 00:04:22.683
maybe here to make more sense of this.

89
00:04:23.880 --> 00:04:26.793
So we used most of this data here already.

90
00:04:28.960 --> 00:04:32.470
So here is the URL to the recipe itself,

91
00:04:32.470 --> 00:04:34.340
where it actually comes from.

92
00:04:34.340 --> 00:04:36.580
And then about the ingredients,

93
00:04:36.580 --> 00:04:38.840
as you see, it is one array

94
00:04:38.840 --> 00:04:42.950
and each position of the array contains one object

95
00:04:42.950 --> 00:04:44.630
which contains the quantity,

96
00:04:44.630 --> 00:04:49.490
the unit and the description of each ingredient.

97
00:04:49.490 --> 00:04:52.260
And so we will have to basically loop

98
00:04:52.260 --> 00:04:53.550
over this array

99
00:04:53.550 --> 00:04:55.790
and then use all of this data

100
00:04:55.790 --> 00:04:59.620
to create one list element for each of them.

101
00:04:59.620 --> 00:05:00.570
Okay.

102
00:05:00.570 --> 00:05:02.040
But for now, let's go back

103
00:05:02.040 --> 00:05:04.500
and finish the data here.

104
00:05:04.500 --> 00:05:05.333
And in this case,

105
00:05:05.333 --> 00:05:07.110
replacing this URL

106
00:05:07.110 --> 00:05:09.853
by the one coming from the object.

107
00:05:10.870 --> 00:05:12.090
So that's the recipe

108
00:05:13.440 --> 00:05:16.110
that source URL.

109
00:05:16.110 --> 00:05:19.330
And so except for the ingredients,

110
00:05:19.330 --> 00:05:20.433
that's actually it.

111
00:05:21.520 --> 00:05:26.100
So yeah, before we can check out the result,

112
00:05:26.100 --> 00:05:27.410
of course now we need

113
00:05:27.410 --> 00:05:31.330
to actually insert this HTML into our dump.

114
00:05:31.330 --> 00:05:35.640
So for that, we can use the insert adjacent HTML method

115
00:05:35.640 --> 00:05:36.640
and we need to do that

116
00:05:36.640 --> 00:05:38.320
on the parent element,

117
00:05:38.320 --> 00:05:39.290
remember.

118
00:05:39.290 --> 00:05:41.423
And I already selected that up here.

119
00:05:42.280 --> 00:05:43.880
So remember, that's the element

120
00:05:43.880 --> 00:05:45.803
with the class of recipe.

121
00:05:47.070 --> 00:05:50.773
So just to remember, it is this diff element.

122
00:05:52.090 --> 00:05:54.750
So that is called a recipe container.

123
00:05:54.750 --> 00:05:56.660
And so that's where we want to attach

124
00:05:58.220 --> 00:06:00.163
this HTML markup.

125
00:06:01.790 --> 00:06:05.127
So recipeContainer.insertAdjacentHTML,

126
00:06:09.668 --> 00:06:11.900
and let's do afterbegin.

127
00:06:11.900 --> 00:06:15.740
So basically as a first child

128
00:06:16.710 --> 00:06:18.520
and then the markup variable

129
00:06:18.520 --> 00:06:20.320
that we just created

130
00:06:20.320 --> 00:06:22.040
and that should be it.

131
00:06:22.040 --> 00:06:24.590
So this should now render the recipe

132
00:06:24.590 --> 00:06:26.300
in the user interface

133
00:06:26.300 --> 00:06:28.400
except for the ingredients.

134
00:06:28.400 --> 00:06:31.673
And indeed, that's looking really nice already.

135
00:06:32.690 --> 00:06:33.523
Right?

136
00:06:34.380 --> 00:06:37.110
So the ingredients are still the old ones

137
00:06:37.110 --> 00:06:39.540
but the rest is really nice,

138
00:06:39.540 --> 00:06:41.910
except for that we have still

139
00:06:41.910 --> 00:06:43.930
this message here from the beginning

140
00:06:43.930 --> 00:06:47.253
and also that we are missing all the icons.

141
00:06:48.420 --> 00:06:50.923
So you see there are no icons to be found here.

142
00:06:51.940 --> 00:06:54.010
In the real one, of course,

143
00:06:54.010 --> 00:06:56.500
there are icons all over the place.

144
00:06:56.500 --> 00:06:58.680
So we have three problems here.

145
00:06:58.680 --> 00:07:01.010
We have this message showing

146
00:07:01.010 --> 00:07:02.440
we have the ingredients

147
00:07:02.440 --> 00:07:04.340
and we have the icons.

148
00:07:04.340 --> 00:07:06.280
And let's start with this message

149
00:07:06.280 --> 00:07:07.713
and then the ingredients.

150
00:07:09.390 --> 00:07:13.583
So before we insert any new markup

151
00:07:13.583 --> 00:07:14.558
we need to get rid

152
00:07:14.558 --> 00:07:17.602
of the markup that is already there.

153
00:07:17.602 --> 00:07:22.586
So let's simply do recipeContainer.innerHTML

154
00:07:22.586 --> 00:07:25.068
and set it to nothing.

155
00:07:25.068 --> 00:07:27.376
So emptying it out.

156
00:07:27.376 --> 00:07:30.513
And so you see now it is gone.

157
00:07:30.513 --> 00:07:31.868
All right.

158
00:07:31.868 --> 00:07:34.842
So let's now worry about the ingredients.

159
00:07:34.842 --> 00:07:37.250
And again, we will need to loop

160
00:07:37.250 --> 00:07:39.080
over the ingredients array.

161
00:07:39.080 --> 00:07:40.350
And for each of them,

162
00:07:40.350 --> 00:07:44.550
we should then create this kind of markup here.

163
00:07:44.550 --> 00:07:46.453
So how should we do that?

164
00:07:47.570 --> 00:07:51.350
Well, basically exactly what I just said.

165
00:07:51.350 --> 00:07:56.260
So we take recipe.ingredients

166
00:07:56.260 --> 00:07:59.820
and then we loop over that using some array method.

167
00:07:59.820 --> 00:08:03.340
But what array method should we actually use?

168
00:08:03.340 --> 00:08:06.180
Well, remember that in the end

169
00:08:06.180 --> 00:08:07.960
the expression that we need here

170
00:08:07.960 --> 00:08:11.010
needs to return a string of HTML.

171
00:08:11.010 --> 00:08:12.030
And so that means

172
00:08:12.030 --> 00:08:15.620
that or array method needs to return something.

173
00:08:15.620 --> 00:08:18.720
So foreach is not the way to go here.

174
00:08:18.720 --> 00:08:20.990
So not foreach.

175
00:08:20.990 --> 00:08:21.823
Right?

176
00:08:21.823 --> 00:08:23.963
But instead we are going to use map.

177
00:08:24.970 --> 00:08:26.920
So map returns a new array

178
00:08:26.920 --> 00:08:28.570
with the same length.

179
00:08:28.570 --> 00:08:30.900
And so that array, we will then in the end,

180
00:08:30.900 --> 00:08:33.430
be able to simply join.

181
00:08:33.430 --> 00:08:34.720
And so now we can loop

182
00:08:34.720 --> 00:08:35.840
over the array

183
00:08:35.840 --> 00:08:38.210
by specifying a callback function.

184
00:08:38.210 --> 00:08:42.180
So each element is going to be called ingredient

185
00:08:42.180 --> 00:08:44.253
and then here we can do something.

186
00:08:47.640 --> 00:08:50.013
So let's simply replace a string here.

187
00:08:51.560 --> 00:08:53.200
Right?

188
00:08:53.200 --> 00:08:54.540
So taking this

189
00:08:56.610 --> 00:08:59.923
and put it right here.

190
00:09:00.850 --> 00:09:02.350
And then of course we don't need

191
00:09:02.350 --> 00:09:03.403
this one anymore.

192
00:09:04.776 --> 00:09:07.026
(clicking)

193
00:09:08.700 --> 00:09:09.593
Okay.

194
00:09:10.480 --> 00:09:12.633
Then here we have some kind of error,

195
00:09:16.220 --> 00:09:17.390
but nevermind.

196
00:09:17.390 --> 00:09:20.273
Let's think about the data here first.

197
00:09:21.400 --> 00:09:22.360
So let's take a look

198
00:09:22.360 --> 00:09:24.003
at the data actually again.

199
00:09:26.330 --> 00:09:28.233
So at the array.

200
00:09:30.500 --> 00:09:32.760
So each array element is an object

201
00:09:32.760 --> 00:09:34.240
which has quantity,

202
00:09:34.240 --> 00:09:36.213
unit and description.

203
00:09:37.150 --> 00:09:37.983
Okay.

204
00:09:38.940 --> 00:09:42.640
So this ingredient is now that object.

205
00:09:42.640 --> 00:09:43.940
And so here we can say

206
00:09:46.570 --> 00:09:51.480
ingredient.quantity

207
00:09:52.610 --> 00:09:54.203
then here the unit,

208
00:09:55.660 --> 00:09:57.800
the ingredient.unit

209
00:09:58.850 --> 00:10:00.420
and then finally here

210
00:10:00.420 --> 00:10:02.180
instead of pasta we want

211
00:10:03.090 --> 00:10:07.063
the ingredient.description.

212
00:10:08.400 --> 00:10:09.280
And so now here

213
00:10:09.280 --> 00:10:11.010
we will have an array

214
00:10:11.010 --> 00:10:12.400
in which each element

215
00:10:12.400 --> 00:10:15.040
will contain this markup corresponding

216
00:10:15.040 --> 00:10:16.420
to the ingredient.

217
00:10:16.420 --> 00:10:17.970
And so now all we need to do

218
00:10:17.970 --> 00:10:20.410
is to transform that array of strings

219
00:10:20.410 --> 00:10:22.063
into one big string.

220
00:10:23.270 --> 00:10:26.150
So we can take the result of this map,

221
00:10:26.150 --> 00:10:27.370
which is that array

222
00:10:28.350 --> 00:10:31.990
and call join on it like this.

223
00:10:31.990 --> 00:10:35.140
And so now the result of this entire expression

224
00:10:35.140 --> 00:10:36.160
is going to be

225
00:10:36.160 --> 00:10:38.963
a big string containing all the ingredients.

226
00:10:40.170 --> 00:10:41.863
So if we give it a save now,

227
00:10:43.250 --> 00:10:46.503
then indeed here we have our eight ingredients.

228
00:10:48.000 --> 00:10:49.410
Okay.

229
00:10:49.410 --> 00:10:52.170
So that's pepperoni pizza burgers.

230
00:10:52.170 --> 00:10:53.600
And now,

231
00:10:53.600 --> 00:10:55.390
remember we have a second one here,

232
00:10:55.390 --> 00:10:57.483
so that's, switched them out again.

233
00:11:00.490 --> 00:11:01.930
Give it a save.

234
00:11:01.930 --> 00:11:02.763
And now we got,

235
00:11:03.690 --> 00:11:05.870
well, this pizza here.

236
00:11:05.870 --> 00:11:08.363
And so indeed it now has different ingredients,

237
00:11:09.650 --> 00:11:11.570
different publisher

238
00:11:11.570 --> 00:11:13.950
and everything is different.

239
00:11:13.950 --> 00:11:14.910
Great.

240
00:11:14.910 --> 00:11:17.100
But now there is one thing missing,

241
00:11:17.100 --> 00:11:19.083
which is the icons.

242
00:11:19.990 --> 00:11:22.350
So let's see why that is.

243
00:11:22.350 --> 00:11:24.490
Well, remember that the page that

244
00:11:24.490 --> 00:11:27.010
is displayed here in the browser,

245
00:11:27.010 --> 00:11:31.720
is this HTML here from the disc folder.

246
00:11:31.720 --> 00:11:32.920
Right?

247
00:11:32.920 --> 00:11:35.410
And so remember that all the images

248
00:11:35.410 --> 00:11:37.140
and really all the assets

249
00:11:37.140 --> 00:11:39.610
are now coming from this folder.

250
00:11:39.610 --> 00:11:41.920
And that includes the icons.

251
00:11:41.920 --> 00:11:44.320
So our icons are always coming

252
00:11:44.320 --> 00:11:47.340
from this icon.svg file.

253
00:11:47.340 --> 00:11:49.500
But now the icons are actually coming

254
00:11:49.500 --> 00:11:52.323
from icons.all of this here.

255
00:11:53.380 --> 00:11:54.600
And you can see that

256
00:11:54.600 --> 00:11:55.750
for example,

257
00:11:55.750 --> 00:11:57.970
right here in the search bar.

258
00:11:57.970 --> 00:11:59.800
So icon search is coming

259
00:11:59.800 --> 00:12:04.170
from icons.96 and so on and so forth.

260
00:12:04.170 --> 00:12:06.690
However, in our template literal,

261
00:12:06.690 --> 00:12:09.550
we are still writing, basically,

262
00:12:09.550 --> 00:12:11.653
the old path to the icons.

263
00:12:12.700 --> 00:12:14.480
So this one here.

264
00:12:14.480 --> 00:12:15.600
And so right now,

265
00:12:15.600 --> 00:12:18.860
JavaScript will not be able to find this.

266
00:12:18.860 --> 00:12:20.600
So in the disc folder,

267
00:12:20.600 --> 00:12:21.433
this one here,

268
00:12:21.433 --> 00:12:25.210
there is no source/image folder

269
00:12:25.210 --> 00:12:27.910
in which there is icons.svg

270
00:12:27.910 --> 00:12:29.770
because that exists only

271
00:12:29.770 --> 00:12:31.570
in our source folder.

272
00:12:31.570 --> 00:12:33.020
So only right here

273
00:12:33.020 --> 00:12:35.260
where we are developing the application.

274
00:12:35.260 --> 00:12:37.280
But again right now

275
00:12:37.280 --> 00:12:40.120
we are basically shipping the application already.

276
00:12:40.120 --> 00:12:44.030
And so it's using the data from this disc folder.

277
00:12:44.030 --> 00:12:45.580
And so now we need a way

278
00:12:45.580 --> 00:12:47.500
of telling our JavaScript

279
00:12:47.500 --> 00:12:50.510
that the icons file is no longer this one

280
00:12:50.510 --> 00:12:52.723
but instead it is this one.

281
00:12:53.600 --> 00:12:55.320
And we can actually do that

282
00:12:55.320 --> 00:12:58.860
with parcel by basically simply importing

283
00:12:58.860 --> 00:13:00.810
the icons file.

284
00:13:00.810 --> 00:13:03.660
So let's go to the top of our file

285
00:13:03.660 --> 00:13:05.650
because I like to keep all the imports

286
00:13:05.650 --> 00:13:06.863
always at the top.

287
00:13:08.060 --> 00:13:10.130
And so again, in parcel,

288
00:13:10.130 --> 00:13:13.560
we can import more than just JavaScript files.

289
00:13:13.560 --> 00:13:15.950
We can import all kinds of assets

290
00:13:15.950 --> 00:13:18.400
and that includes images.

291
00:13:18.400 --> 00:13:20.090
So let's import

292
00:13:20.090 --> 00:13:22.210
and let's call it simply icons.

293
00:13:22.210 --> 00:13:24.423
But this name can be anything that we want.

294
00:13:25.470 --> 00:13:27.630
(clicking)

295
00:13:27.630 --> 00:13:31.860
From another path to the original icons file,

296
00:13:31.860 --> 00:13:35.700
basically, from the view of this controller file,

297
00:13:35.700 --> 00:13:36.750
right?

298
00:13:36.750 --> 00:13:39.600
So here we are in controller.js.

299
00:13:39.600 --> 00:13:41.510
And so now we need to find a path

300
00:13:41.510 --> 00:13:42.913
to the images,

301
00:13:43.910 --> 00:13:46.940
so to this original icons file.

302
00:13:46.940 --> 00:13:49.763
So we need to go one way up.

303
00:13:50.720 --> 00:13:52.570
So exactly the way we browse

304
00:13:52.570 --> 00:13:54.860
the file tree in the terminal.

305
00:13:54.860 --> 00:13:58.050
So .. always means the parent folder.

306
00:13:58.050 --> 00:13:59.640
And so right now we are back

307
00:13:59.640 --> 00:14:02.510
in the source folder,

308
00:14:02.510 --> 00:14:05.120
which is the parent of js.

309
00:14:05.120 --> 00:14:06.330
And then from there,

310
00:14:06.330 --> 00:14:08.290
we can go into images

311
00:14:08.290 --> 00:14:11.493
and then icons.svg.

312
00:14:12.430 --> 00:14:13.860
All right.

313
00:14:13.860 --> 00:14:15.750
Now this is the way it used to work

314
00:14:15.750 --> 00:14:16.973
in parcel one.

315
00:14:18.710 --> 00:14:19.950
So if for some reason,

316
00:14:19.950 --> 00:14:21.787
you are running parcel one

317
00:14:21.787 --> 00:14:24.400
then this is the way to go.

318
00:14:24.400 --> 00:14:26.060
But in parcel two,

319
00:14:26.060 --> 00:14:28.070
it works almost the same way.

320
00:14:28.070 --> 00:14:30.340
But then for any static assets

321
00:14:30.340 --> 00:14:32.690
that are not programming files.

322
00:14:32.690 --> 00:14:34.670
So for any like images

323
00:14:34.670 --> 00:14:37.000
or videos or sound files,

324
00:14:37.000 --> 00:14:38.747
we need to write url:

325
00:14:41.536 --> 00:14:43.603
and then the path to the file.

326
00:14:44.910 --> 00:14:46.250
Okay.

327
00:14:46.250 --> 00:14:47.550
So let's take this out

328
00:14:49.560 --> 00:14:52.830
but then let's lock this icons to the console

329
00:14:52.830 --> 00:14:55.950
so that you see what this icons really is.

330
00:14:55.950 --> 00:14:58.430
Because in fact, it is nothing more

331
00:14:58.430 --> 00:15:01.633
than simply the path to the new icons file.

332
00:15:02.690 --> 00:15:04.340
So the local host,

333
00:15:04.340 --> 00:15:05.470
one two, three, four

334
00:15:05.470 --> 00:15:07.080
is in this case, basically,

335
00:15:07.080 --> 00:15:08.680
our disc folder.

336
00:15:08.680 --> 00:15:09.830
And then in there,

337
00:15:09.830 --> 00:15:11.950
the file that we need is icon.96f

338
00:15:13.490 --> 00:15:15.240
and so on and so forth.

339
00:15:15.240 --> 00:15:18.670
And so that is exactly this file here.

340
00:15:18.670 --> 00:15:19.800
Okay.

341
00:15:19.800 --> 00:15:21.773
And so now let's use that.

342
00:15:23.840 --> 00:15:25.913
So everywhere it says icon.

343
00:15:26.810 --> 00:15:29.740
So everywhere we have this old path

344
00:15:29.740 --> 00:15:33.200
we now want to replace it simply with the icons.

345
00:15:33.200 --> 00:15:35.980
So let's select all of them using command

346
00:15:35.980 --> 00:15:37.163
or Control+D.

347
00:15:39.210 --> 00:15:40.960
Or if that doesn't work for you,

348
00:15:40.960 --> 00:15:43.920
you can always probably use Command+F

349
00:15:43.920 --> 00:15:45.520
or something like that.

350
00:15:45.520 --> 00:15:46.400
But anyway,

351
00:15:46.400 --> 00:15:49.440
now we have all of them selected at the same time

352
00:15:49.440 --> 00:15:51.190
and then I can delete them all

353
00:15:52.323 --> 00:15:57.120
and then insert the icons variable here everywhere.

354
00:15:57.120 --> 00:15:59.700
And so now if we give this a save

355
00:16:00.681 --> 00:16:03.650
then our icons are back.

356
00:16:03.650 --> 00:16:05.100
Right?

357
00:16:05.100 --> 00:16:07.390
So starting here

358
00:16:07.390 --> 00:16:08.830
then in all ingredients

359
00:16:08.830 --> 00:16:10.740
and here also,

360
00:16:10.740 --> 00:16:12.110
all over the place.

361
00:16:12.110 --> 00:16:13.873
We now have our icons back.

362
00:16:15.000 --> 00:16:16.690
And now just to finish this lecture,

363
00:16:16.690 --> 00:16:19.160
I want to give this one more touch,

364
00:16:19.160 --> 00:16:22.490
which is this here.

365
00:16:22.490 --> 00:16:23.720
So watch what happens here

366
00:16:23.720 --> 00:16:25.723
in the recipe when I load the page.

367
00:16:28.000 --> 00:16:29.620
Well, that was pretty fast.

368
00:16:29.620 --> 00:16:30.703
Let's see again.

369
00:16:31.810 --> 00:16:34.080
So maybe for half a second or so

370
00:16:34.080 --> 00:16:36.200
you saw a loading spinner there.

371
00:16:36.200 --> 00:16:39.230
And so that's what I want to have here as well.

372
00:16:39.230 --> 00:16:41.250
So before the recipe arrives

373
00:16:41.250 --> 00:16:43.940
I want like a loading spinner there

374
00:16:43.940 --> 00:16:46.240
because that's a very common pattern

375
00:16:46.240 --> 00:16:49.580
that you see in all kinds of applications.

376
00:16:49.580 --> 00:16:51.030
Right?

377
00:16:51.030 --> 00:16:53.420
And it's actually very simple.

378
00:16:53.420 --> 00:16:55.730
So we have the code already here

379
00:16:55.730 --> 00:16:56.683
in our HTML.

380
00:16:57.726 --> 00:17:00.053
So it is this a spinner here.

381
00:17:01.090 --> 00:17:02.993
So let's grab this code.

382
00:17:03.950 --> 00:17:04.783
And then

383
00:17:06.070 --> 00:17:08.540
here I will simply create an external function

384
00:17:09.540 --> 00:17:10.373
called

385
00:17:13.110 --> 00:17:16.300
render a spinner

386
00:17:19.550 --> 00:17:21.940
and let's make this a very generic function

387
00:17:21.940 --> 00:17:23.500
that we can reuse.

388
00:17:23.500 --> 00:17:26.633
And so that's passed in the parent element.

389
00:17:27.960 --> 00:17:29.700
And so then we can simply attach this

390
00:17:29.700 --> 00:17:31.320
to any parent element

391
00:17:31.320 --> 00:17:32.603
that is passed in here.

392
00:17:36.120 --> 00:17:38.630
So as always creating a markup variable

393
00:17:42.030 --> 00:17:43.610
and then our code here.

394
00:17:43.610 --> 00:17:44.960
And just like before,

395
00:17:44.960 --> 00:17:47.780
we need to now replace this old path

396
00:17:47.780 --> 00:17:49.113
with the new path.

397
00:17:50.490 --> 00:17:52.250
So icons

398
00:17:53.720 --> 00:17:54.650
and then of course,

399
00:17:54.650 --> 00:17:56.340
we need to add this HTML

400
00:17:56.340 --> 00:17:58.150
to the dump as a child

401
00:17:58.150 --> 00:18:01.110
of the parent element in this case.

402
00:18:01.110 --> 00:18:03.193
So parentEl.insertAdjacentHTML

403
00:18:08.309 --> 00:18:09.392
afterbegin

404
00:18:10.940 --> 00:18:12.333
and markup.

405
00:18:13.300 --> 00:18:14.410
Okay.

406
00:18:14.410 --> 00:18:16.150
And now let me just quickly show you

407
00:18:16.150 --> 00:18:18.700
why this is going to work.

408
00:18:18.700 --> 00:18:20.393
So here in the CSS,

409
00:18:21.700 --> 00:18:23.073
let's look for spinner.

410
00:18:24.090 --> 00:18:25.200
And here you see

411
00:18:25.200 --> 00:18:29.470
that the icon inside of the spinner class

412
00:18:29.470 --> 00:18:31.720
has this rotation animation

413
00:18:31.720 --> 00:18:34.710
that keeps going forever.

414
00:18:34.710 --> 00:18:37.780
So that's this infinite attribute here

415
00:18:37.780 --> 00:18:39.690
in the animation property.

416
00:18:39.690 --> 00:18:41.520
And this rotation animation

417
00:18:42.370 --> 00:18:45.600
I created here manually using key frames.

418
00:18:45.600 --> 00:18:47.320
And basically what it does

419
00:18:47.320 --> 00:18:48.940
is to rotate the element

420
00:18:48.940 --> 00:18:51.250
to 360 degrees.

421
00:18:51.250 --> 00:18:53.850
And so if you ever need a spinner like this,

422
00:18:53.850 --> 00:18:56.863
you can simply, basically copy this code here.

423
00:18:58.210 --> 00:18:59.043
All right.

424
00:19:00.660 --> 00:19:02.633
Let's close what we don't need here.

425
00:19:03.740 --> 00:19:06.100
And probably, before we insert this,

426
00:19:06.100 --> 00:19:08.943
we should also clear the parent element.

427
00:19:10.130 --> 00:19:14.010
So just like before setting the inner HTML

428
00:19:14.010 --> 00:19:15.500
to nothing.

429
00:19:15.500 --> 00:19:18.770
And now let's actually render the spinner.

430
00:19:18.770 --> 00:19:21.340
So let's do that here

431
00:19:21.340 --> 00:19:22.883
as we load the recipe.

432
00:19:24.230 --> 00:19:25.563
So right here.

433
00:19:27.130 --> 00:19:29.231
So renderSpinner

434
00:19:29.231 --> 00:19:31.290
and then the parent element in this case,

435
00:19:31.290 --> 00:19:33.930
is going to be the recipeContainer.

436
00:19:37.270 --> 00:19:39.040
All right, let's go back

437
00:19:39.040 --> 00:19:39.873
and reload

438
00:19:40.740 --> 00:19:42.360
and there it was.

439
00:19:42.360 --> 00:19:43.193
You saw it.

440
00:19:44.460 --> 00:19:47.325
Let's make this a little bit slower

441
00:19:47.325 --> 00:19:50.543
by changing our network speed here.

442
00:19:54.840 --> 00:19:56.900
So it took a little bit longer,

443
00:19:56.900 --> 00:19:58.820
maybe slow 3G

444
00:19:58.820 --> 00:20:00.483
is gonna be even better.

445
00:20:01.840 --> 00:20:03.170
And so now it's gonna take

446
00:20:04.170 --> 00:20:05.310
a lot more time

447
00:20:06.560 --> 00:20:08.433
but indeed here it is.

448
00:20:10.260 --> 00:20:12.190
So that spinner is a nice touch,

449
00:20:12.190 --> 00:20:13.640
I think.

450
00:20:13.640 --> 00:20:15.810
And it definitely makes this application

451
00:20:15.810 --> 00:20:18.060
feel more real world.

452
00:20:18.060 --> 00:20:20.450
Now just to finish this video,

453
00:20:20.450 --> 00:20:21.730
something that I should have done

454
00:20:21.730 --> 00:20:23.370
in the last video already

455
00:20:23.370 --> 00:20:24.760
is to add polyfills

456
00:20:24.760 --> 00:20:26.570
for es6 features

457
00:20:26.570 --> 00:20:28.210
to our code base.

458
00:20:28.210 --> 00:20:29.740
So just like we did

459
00:20:29.740 --> 00:20:31.693
in the previous section as well.

460
00:20:32.620 --> 00:20:34.683
So remember to do that,

461
00:20:36.010 --> 00:20:40.650
we installed some special packages.

462
00:20:40.650 --> 00:20:45.650
So the packages are called npm core-js

463
00:20:45.900 --> 00:20:48.580
and we can actually install multiple packages

464
00:20:48.580 --> 00:20:49.950
at the same time.

465
00:20:49.950 --> 00:20:51.920
I think I never did this before.

466
00:20:51.920 --> 00:20:53.465
So this is how it works.

467
00:20:53.465 --> 00:20:57.850
Regenerator-runtime

468
00:20:58.800 --> 00:21:00.570
and then hit enter

469
00:21:00.570 --> 00:21:03.440
and then let's wait for these packages to download

470
00:21:04.400 --> 00:21:05.493
and here they are.

471
00:21:06.580 --> 00:21:08.593
So they should be,

472
00:21:09.480 --> 00:21:10.313
yeah,

473
00:21:10.313 --> 00:21:11.230
so right here

474
00:21:11.230 --> 00:21:12.300
and now all we have to do

475
00:21:12.300 --> 00:21:13.910
is to import them here

476
00:21:13.910 --> 00:21:16.270
at the top of our file.

477
00:21:16.270 --> 00:21:18.170
And so it is, we make sure

478
00:21:18.170 --> 00:21:21.140
that most real old browsers

479
00:21:21.140 --> 00:21:22.930
are still being supported

480
00:21:22.930 --> 00:21:24.350
by our application.

481
00:21:24.350 --> 00:21:28.140
So actually we don't even need to save it anywhere.

482
00:21:28.140 --> 00:21:33.140
We can just say core-js/stable.

483
00:21:33.290 --> 00:21:36.080
So vs code, one more time, is really smart

484
00:21:36.080 --> 00:21:37.210
and can really help us

485
00:21:37.210 --> 00:21:40.763
with package imports like this.

486
00:21:43.750 --> 00:21:45.960
So again, this one here

487
00:21:45.960 --> 00:21:48.310
is for polyfilling async/await.

488
00:21:48.310 --> 00:21:51.670
And this one here is for polyfilling everything else.

489
00:21:51.670 --> 00:21:53.970
And we could just cherry pick some features

490
00:21:53.970 --> 00:21:55.791
and only import those

491
00:21:55.791 --> 00:21:59.578
but let's simply polyfill everything.

492
00:21:59.578 --> 00:22:00.791
Okay.

493
00:22:00.791 --> 00:22:03.610
Don't need this terminal anymore.

494
00:22:03.610 --> 00:22:05.260
This one here already reload it

495
00:22:06.390 --> 00:22:09.283
and you see everything keeps working the same.

496
00:22:10.650 --> 00:22:12.040
All right.

497
00:22:12.040 --> 00:22:13.810
So we have this working.

498
00:22:13.810 --> 00:22:15.020
Now in the next video,

499
00:22:15.020 --> 00:22:17.730
let's quickly add some event handlers

500
00:22:17.730 --> 00:22:18.850
so that after that

501
00:22:18.850 --> 00:22:21.403
we can start talking about the architecture.

