WEBVTT

1
00:00:01.210 --> 00:00:02.800
<v Jonas>Welcome back.</v>

2
00:00:02.800 --> 00:00:04.860
So now that you know everything

3
00:00:04.860 --> 00:00:08.150
about the model-view-controller architecture

4
00:00:08.150 --> 00:00:12.150
and also how it's gonna be implemented in our project,

5
00:00:12.150 --> 00:00:15.660
let's now actually go do that in practice.

6
00:00:15.660 --> 00:00:18.430
And this is gonna be a long lecture,

7
00:00:18.430 --> 00:00:20.313
so let's get started.

8
00:00:21.970 --> 00:00:25.680
And let's start by creating the necessary new files

9
00:00:25.680 --> 00:00:28.603
so that we can then split up our code between them.

10
00:00:29.640 --> 00:00:33.093
So let's start by closing all of the folders here.

11
00:00:34.050 --> 00:00:35.770
And then inside of src

12
00:00:35.770 --> 00:00:39.780
and JavaScript, let's create a new file,

13
00:00:39.780 --> 00:00:42.643
which will be called model.js.

14
00:00:44.434 --> 00:00:45.700
And so this is basically going

15
00:00:45.700 --> 00:00:49.683
to be the module in which we write our entire model.

16
00:00:50.560 --> 00:00:52.790
Then we also need the view,

17
00:00:52.790 --> 00:00:54.400
or actually, the views

18
00:00:54.400 --> 00:00:56.840
because we will have multiple views.

19
00:00:56.840 --> 00:01:00.410
Basically one for each feature.

20
00:01:00.410 --> 00:01:03.600
So now we're working on displaying the recipe

21
00:01:03.600 --> 00:01:06.320
and so this one is going to be called recipeView.

22
00:01:07.970 --> 00:01:10.653
But actually, let's create a new folder here

23
00:01:10.653 --> 00:01:15.653
for the views in order not to clutter our JavaScript folder.

24
00:01:18.100 --> 00:01:19.040
All right?

25
00:01:19.040 --> 00:01:24.040
And so then in here, let's create recipeView.js.

26
00:01:26.330 --> 00:01:29.720
So we will have one big module here

27
00:01:29.720 --> 00:01:31.890
for all the controllers.

28
00:01:31.890 --> 00:01:35.370
Then one big file for the entire model.

29
00:01:35.370 --> 00:01:37.850
So for all the models basically.

30
00:01:37.850 --> 00:01:40.910
So for the recipe, for search, for bookmarks

31
00:01:40.910 --> 00:01:43.550
and all of that but for the views,

32
00:01:43.550 --> 00:01:47.520
we will have one module for each of the different views.

33
00:01:47.520 --> 00:01:49.747
And you'll understand why that makes sense

34
00:01:49.747 --> 00:01:53.140
as we keep developing our application.

35
00:01:53.140 --> 00:01:56.070
And probably the first reason that comes to mind

36
00:01:56.070 --> 00:01:59.510
is that the views are simply much bigger.

37
00:01:59.510 --> 00:02:04.510
And so we don't want a file, which like 500 lines of code.

38
00:02:04.680 --> 00:02:07.430
We could, of course, also split up the model

39
00:02:07.430 --> 00:02:11.240
and the controller and probably many people would do that

40
00:02:11.240 --> 00:02:14.500
but I don't want to have to mess with a lot

41
00:02:14.500 --> 00:02:16.360
of files here in this project.

42
00:02:16.360 --> 00:02:19.663
That would just make it very confusing for you to follow.

43
00:02:21.060 --> 00:02:23.340
So let's actually take a look again here

44
00:02:23.340 --> 00:02:24.690
at this architecture

45
00:02:24.690 --> 00:02:27.100
that I showed you in the last video.

46
00:02:27.100 --> 00:02:30.770
And here, we will actually start with the model.

47
00:02:30.770 --> 00:02:34.420
So again, we're going to have a big state object,

48
00:02:34.420 --> 00:02:38.270
which then inside will contain an object for recipe,

49
00:02:38.270 --> 00:02:40.670
search and bookmarks.

50
00:02:40.670 --> 00:02:43.580
And now we will just start with the recipe

51
00:02:43.580 --> 00:02:45.760
and then there will be a function

52
00:02:45.760 --> 00:02:48.420
for loading the recipe, right?

53
00:02:48.420 --> 00:02:50.560
And so then that function will then be called

54
00:02:50.560 --> 00:02:53.610
by controlRecipes, which kind of sits

55
00:02:53.610 --> 00:02:56.000
between loading the recipe

56
00:02:56.000 --> 00:02:59.420
and then rendering it using the view.

57
00:02:59.420 --> 00:03:02.140
So remember that the controller kind of sits

58
00:03:02.140 --> 00:03:04.510
between model and the view

59
00:03:04.510 --> 00:03:06.293
so it acts like a bridge.

60
00:03:07.260 --> 00:03:10.880
All right, and let's actually keep it open here

61
00:03:10.880 --> 00:03:13.223
and close all of these others.

62
00:03:14.460 --> 00:03:16.090
And so here in our model,

63
00:03:16.090 --> 00:03:20.910
let's simply create that state object

64
00:03:22.130 --> 00:03:24.860
and then in there we have the recipe,

65
00:03:24.860 --> 00:03:28.450
which in turn, is also an empty object.

66
00:03:28.450 --> 00:03:30.640
At least at the beginning.

67
00:03:30.640 --> 00:03:34.950
And then we will export this state

68
00:03:34.950 --> 00:03:38.070
so that we can then use it in the controller.

69
00:03:38.070 --> 00:03:40.740
And let's put them here just like in the diagram.

70
00:03:40.740 --> 00:03:43.193
Model, controller and view.

71
00:03:44.440 --> 00:03:45.630
Okay?

72
00:03:45.630 --> 00:03:48.070
So we're exporting the state from here

73
00:03:48.070 --> 00:03:51.713
and now let's also create that loadRecipe function.

74
00:03:53.050 --> 00:03:54.720
And of course, we also export it

75
00:03:54.720 --> 00:03:56.723
so that we can use it in the controller.

76
00:03:59.350 --> 00:04:00.603
So loadRecipe.

77
00:04:01.681 --> 00:04:03.930
And this function will be the one responsible

78
00:04:03.930 --> 00:04:06.440
for actually fetching the recipe data

79
00:04:06.440 --> 00:04:09.040
from our Forkify API.

80
00:04:09.040 --> 00:04:11.403
And so this is going to be an async function.

81
00:04:13.380 --> 00:04:14.213
All right?

82
00:04:15.230 --> 00:04:18.800
And so now we can actually start grabbing some

83
00:04:18.800 --> 00:04:20.163
of the code from here.

84
00:04:22.180 --> 00:04:23.410
Okay?

85
00:04:23.410 --> 00:04:26.160
So as I said, basically the goal of this lecture

86
00:04:26.160 --> 00:04:28.540
is to refactor all the code here

87
00:04:28.540 --> 00:04:31.363
into the different parts of the architecture.

88
00:04:32.810 --> 00:04:33.950
Okay?

89
00:04:33.950 --> 00:04:36.290
So what here exactly is concerned

90
00:04:36.290 --> 00:04:38.603
with basically getting the data?

91
00:04:40.220 --> 00:04:42.300
So it starts here

92
00:04:42.300 --> 00:04:45.680
when we fetch the recipe from the API

93
00:04:45.680 --> 00:04:48.223
and then basically, it's all of this here.

94
00:04:49.270 --> 00:04:50.550
So all of this.

95
00:04:50.550 --> 00:04:51.663
So let's copy it.

96
00:04:53.570 --> 00:04:55.390
So rendering the spinner, of course,

97
00:04:55.390 --> 00:04:58.210
has nothing to do with the business logic

98
00:04:58.210 --> 00:05:00.940
but really, it is only presentation logic

99
00:05:00.940 --> 00:05:02.930
and so this one will eventually go

100
00:05:02.930 --> 00:05:03.803
into the view.

101
00:05:05.823 --> 00:05:07.560
And then here getting the ID,

102
00:05:07.560 --> 00:05:10.150
this is also not business logic.

103
00:05:10.150 --> 00:05:13.710
This is actually more about the application logic itself.

104
00:05:13.710 --> 00:05:16.720
So about making the application work.

105
00:05:16.720 --> 00:05:19.170
And so let's keep that part here.

106
00:05:19.170 --> 00:05:21.610
So again, I will just copy this

107
00:05:21.610 --> 00:05:24.743
or actually cut and put it here.

108
00:05:26.497 --> 00:05:29.837
And now we start getting these errors but nevermind.

109
00:05:31.210 --> 00:05:34.800
Probably, we should actually terminate our process here

110
00:05:34.800 --> 00:05:35.970
with Control + C

111
00:05:37.030 --> 00:05:39.363
so that we don't get errors all the time.

112
00:05:41.270 --> 00:05:42.380
Okay?

113
00:05:42.380 --> 00:05:45.580
Now we need to, of course, adjust this here a little bit.

114
00:05:45.580 --> 00:05:49.799
So this first part here makes sense, right?

115
00:05:49.799 --> 00:05:53.760
Now, we just need to get this ID from anywhere.

116
00:05:53.760 --> 00:05:55.580
So right now, we have no idea

117
00:05:55.580 --> 00:05:58.290
which ID we should actually fetch.

118
00:05:58.290 --> 00:05:59.980
And so it's probably a good idea

119
00:05:59.980 --> 00:06:03.890
to pass that ID into this function.

120
00:06:03.890 --> 00:06:05.400
So the controller is the one

121
00:06:05.400 --> 00:06:09.200
that will actually get that ID right here

122
00:06:09.200 --> 00:06:11.260
and so then when it calls the model,

123
00:06:11.260 --> 00:06:12.870
so the loadRecipe function,

124
00:06:12.870 --> 00:06:15.673
it can pass that ID into it.

125
00:06:17.357 --> 00:06:20.210
Then this part here can all stay the same

126
00:06:20.210 --> 00:06:21.934
and this as well.

127
00:06:21.934 --> 00:06:23.530
And this actually should now

128
00:06:23.530 --> 00:06:26.913
not be the recipe but state.recipe.

129
00:06:28.554 --> 00:06:31.693
And here we can just create a const from this.

130
00:06:35.362 --> 00:06:37.687
And here let's also log state.recipe.

131
00:06:39.800 --> 00:06:41.130
All right.

132
00:06:41.130 --> 00:06:45.930
So this function here is not going to return anything.

133
00:06:45.930 --> 00:06:49.430
All it will do is to change our state object.

134
00:06:49.430 --> 00:06:51.530
So this big state object,

135
00:06:51.530 --> 00:06:53.530
which will then contain the recipe

136
00:06:53.530 --> 00:06:55.260
and into which the controller

137
00:06:55.260 --> 00:06:58.103
will then grab and take the recipe out of there.

138
00:06:58.960 --> 00:07:00.650
And this is going to work

139
00:07:00.650 --> 00:07:02.440
because there is a live connection

140
00:07:02.440 --> 00:07:05.360
between the exports and the imports.

141
00:07:05.360 --> 00:07:06.870
Remember that?

142
00:07:06.870 --> 00:07:08.750
So when this state object here

143
00:07:08.750 --> 00:07:11.313
is going to get updated by loadRecipe,

144
00:07:12.150 --> 00:07:15.910
then that state is also updated in the controller,

145
00:07:15.910 --> 00:07:17.573
which imports the state.

146
00:07:18.530 --> 00:07:22.403
So let's now actually import all of that into here.

147
00:07:24.000 --> 00:07:25.993
So doing it here at the very top.

148
00:07:27.950 --> 00:07:30.520
So import and then from the model,

149
00:07:30.520 --> 00:07:33.190
we simply want to import everything.

150
00:07:33.190 --> 00:07:37.220
So we have a couple of named exports here.

151
00:07:37.220 --> 00:07:39.680
So again, there are named exports

152
00:07:39.680 --> 00:07:41.350
and default exports

153
00:07:41.350 --> 00:07:43.480
and these ones are named exports

154
00:07:43.480 --> 00:07:46.520
because we explicitly gave them a name

155
00:07:46.520 --> 00:07:48.964
and so here we can simply import everything

156
00:07:48.964 --> 00:07:51.843
and then call it the model.

157
00:07:53.570 --> 00:07:55.090
And so here in the controller,

158
00:07:55.090 --> 00:07:59.190
we will then end up with model.state

159
00:07:59.190 --> 00:08:00.240
and model.loadRecipe.

160
00:08:01.840 --> 00:08:02.673
Remember that?

161
00:08:02.673 --> 00:08:06.713
And then here, the current folder, model.js.

162
00:08:09.010 --> 00:08:09.883
Okay.

163
00:08:12.660 --> 00:08:16.160
So let's go back here to loading the recipe

164
00:08:16.160 --> 00:08:19.990
and the spinner should probably be outside of here.

165
00:08:19.990 --> 00:08:23.010
And so here, now let's actually call the function.

166
00:08:23.010 --> 00:08:26.040
So let's call model.loadRecipe

167
00:08:28.510 --> 00:08:30.283
and then pass in the ID.

168
00:08:31.300 --> 00:08:33.250
And this loadRecipe function

169
00:08:33.250 --> 00:08:36.000
is an async function and therefore,

170
00:08:36.000 --> 00:08:38.370
it is going to return a promise.

171
00:08:38.370 --> 00:08:39.440
Remember?

172
00:08:39.440 --> 00:08:43.290
And so therefore, here we have to avoid that promise

173
00:08:43.290 --> 00:08:46.130
before we can move on in the next step here

174
00:08:46.130 --> 00:08:49.183
in the execution of this async function.

175
00:08:50.050 --> 00:08:52.949
And so you see, this is exactly the situation

176
00:08:52.949 --> 00:08:56.903
of one async function calling another async function

177
00:08:56.903 --> 00:09:00.810
that we already studied in one of the previous sections.

178
00:09:00.810 --> 00:09:02.040
Remember that?

179
00:09:02.040 --> 00:09:04.970
And so again, it is really, really important

180
00:09:04.970 --> 00:09:07.460
to keep in mind that an async function

181
00:09:07.460 --> 00:09:09.640
will return a promise

182
00:09:09.640 --> 00:09:11.160
that we then need to handle

183
00:09:11.160 --> 00:09:13.900
whenever we call that async function.

184
00:09:13.900 --> 00:09:16.900
At least, if we want to get some result out of it

185
00:09:16.900 --> 00:09:20.140
or if we kind of want to stop the execution

186
00:09:20.140 --> 00:09:23.870
in the function that is calling the other async function.

187
00:09:23.870 --> 00:09:25.020
All right?

188
00:09:25.020 --> 00:09:28.333
So again, really important to understand the mechanics

189
00:09:28.333 --> 00:09:30.453
of what is happening here.

190
00:09:32.370 --> 00:09:36.130
Now, here we should probably also have some error handling.

191
00:09:36.130 --> 00:09:37.693
So I forgot that part.

192
00:09:39.110 --> 00:09:40.000
So try

193
00:09:43.220 --> 00:09:44.793
and all the way down here,

194
00:09:47.354 --> 00:09:48.800
and then catch the error

195
00:09:52.370 --> 00:09:54.433
and then alert the error as well.

196
00:09:55.530 --> 00:09:56.393
All right.

197
00:09:58.420 --> 00:10:02.260
So remember that this loadRecipe function here

198
00:10:02.260 --> 00:10:04.290
does not return anything.

199
00:10:04.290 --> 00:10:07.410
And so therefore, we are not storing any result

200
00:10:07.410 --> 00:10:09.830
into any new variable.

201
00:10:09.830 --> 00:10:12.040
Instead, here we will get access

202
00:10:12.040 --> 00:10:14.410
to state.recipe.

203
00:10:14.410 --> 00:10:17.853
So to that state.recipe

204
00:10:17.853 --> 00:10:21.093
that is going to be manipulated right here.

205
00:10:22.070 --> 00:10:25.720
So you see that this loadRecipe function here clearly

206
00:10:25.720 --> 00:10:27.960
is not a pure function.

207
00:10:27.960 --> 00:10:29.850
So it has the side effect

208
00:10:29.850 --> 00:10:32.040
of manipulating this variable

209
00:10:32.040 --> 00:10:34.110
that is outside of it.

210
00:10:34.110 --> 00:10:35.690
And there would be different ways

211
00:10:35.690 --> 00:10:39.940
of avoiding that but that is just a lot of work

212
00:10:39.940 --> 00:10:42.810
and it's just not worth it here in this case.

213
00:10:42.810 --> 00:10:45.153
We are still trying to learn here, remember.

214
00:10:46.260 --> 00:10:48.860
But anyway, we now here have access

215
00:10:48.860 --> 00:10:53.860
to model.state.recipe.

216
00:10:54.250 --> 00:10:55.840
And so just in order to see

217
00:10:55.840 --> 00:10:57.610
if everything still works,

218
00:10:57.610 --> 00:11:01.006
let's store that recipe into the recipe variable

219
00:11:01.006 --> 00:11:03.263
so that we can then render it,

220
00:11:03.263 --> 00:11:06.463
using this code that we already have here.

221
00:11:07.960 --> 00:11:11.080
So just temporarily, recipe

222
00:11:12.300 --> 00:11:14.233
and then destructure it.

223
00:11:16.260 --> 00:11:17.450
So let's give it a save

224
00:11:18.640 --> 00:11:20.803
and let's restart our application here.

225
00:11:26.284 --> 00:11:27.117
All right.

226
00:11:29.970 --> 00:11:31.920
Let's reload here

227
00:11:31.920 --> 00:11:34.363
and you see that it's working.

228
00:11:36.340 --> 00:11:37.600
Right?

229
00:11:37.600 --> 00:11:41.900
So everything we implemented so far was correct

230
00:11:41.900 --> 00:11:44.720
and that's pretty important to keep checking

231
00:11:44.720 --> 00:11:47.930
when we are refactoring code like this.

232
00:11:47.930 --> 00:11:49.580
Okay?

233
00:11:49.580 --> 00:11:52.090
So that was actually the easy part,

234
00:11:52.090 --> 00:11:54.100
now comes the recipeView,

235
00:11:54.100 --> 00:11:57.400
which will then contain basically all the rest

236
00:11:57.400 --> 00:11:59.093
of the code that we have here.

237
00:11:59.950 --> 00:12:04.250
So let's go here and set the view up.

238
00:12:04.250 --> 00:12:06.796
So the view is going to be a class

239
00:12:06.796 --> 00:12:09.680
and in this case called RecipeView.

240
00:12:11.810 --> 00:12:13.730
And we do this because later,

241
00:12:13.730 --> 00:12:16.740
we will also have a parent class called View,

242
00:12:16.740 --> 00:12:18.670
which will contain a couple of methods

243
00:12:18.670 --> 00:12:21.130
that all the views should inherit.

244
00:12:21.130 --> 00:12:23.070
And so using classes makes all

245
00:12:23.070 --> 00:12:25.620
of this very simple to implement.

246
00:12:25.620 --> 00:12:29.390
Also, we want each view to have a couple of private methods

247
00:12:29.390 --> 00:12:32.920
and properties and so classes makes this really easy

248
00:12:32.920 --> 00:12:35.050
to implement again.

249
00:12:35.050 --> 00:12:37.540
And just in general, I feel that classes

250
00:12:37.540 --> 00:12:40.290
are really the right way to go here.

251
00:12:40.290 --> 00:12:42.290
And again, it will make even more sense

252
00:12:42.290 --> 00:12:45.823
once we start to add the parent class of view.

253
00:12:46.680 --> 00:12:49.160
But anyway, I mentioned that I want each

254
00:12:49.160 --> 00:12:52.720
of these classes to have a couple of private properties

255
00:12:52.720 --> 00:12:55.273
and one of them is going to be the parentElement.

256
00:12:56.920 --> 00:13:01.920
So parentElement, and let's right away set the parentElement

257
00:13:02.742 --> 00:13:07.467
to the recipe container.

258
00:13:09.050 --> 00:13:12.370
So basically, to this element, all right?

259
00:13:12.370 --> 00:13:14.540
Because this will then make it really easy

260
00:13:14.540 --> 00:13:16.350
to render the spinner

261
00:13:16.350 --> 00:13:18.960
and to render success or error messages

262
00:13:18.960 --> 00:13:21.683
or to render, of course, the recipe itself.

263
00:13:23.620 --> 00:13:27.520
So if each of the views has this parentElement property,

264
00:13:27.520 --> 00:13:32.200
then it will be really easy to do all of those tasks

265
00:13:32.200 --> 00:13:34.260
and again, that will become really clear

266
00:13:34.260 --> 00:13:36.653
once we start adding more and more views.

267
00:13:37.490 --> 00:13:39.820
But now the next thing I want to do

268
00:13:39.820 --> 00:13:43.140
is to actually export something from this module.

269
00:13:43.140 --> 00:13:45.750
So of course, we have to export something

270
00:13:45.750 --> 00:13:48.200
from this view so that the controller

271
00:13:48.200 --> 00:13:50.020
can then use it.

272
00:13:50.020 --> 00:13:53.700
Now, what are we going to export from this view?

273
00:13:53.700 --> 00:13:55.560
So we might export, of course,

274
00:13:55.560 --> 00:13:58.990
the entire class like this

275
00:13:58.990 --> 00:14:00.890
and so then here in the controller,

276
00:14:00.890 --> 00:14:03.310
we would have to import that class

277
00:14:03.310 --> 00:14:06.550
and create a new object out of that class.

278
00:14:06.550 --> 00:14:11.510
So basically, create a new RecipeView object, right?

279
00:14:11.510 --> 00:14:13.020
However, in that situation,

280
00:14:13.020 --> 00:14:14.117
it might be possible

281
00:14:14.117 --> 00:14:16.740
to create more that one view

282
00:14:16.740 --> 00:14:19.100
and we would never want that.

283
00:14:19.100 --> 00:14:21.650
Also, that would add unnecessary work

284
00:14:21.650 --> 00:14:24.130
to the controller, which we basically want

285
00:14:24.130 --> 00:14:26.570
to keep as simple as possible.

286
00:14:26.570 --> 00:14:28.809
And so in order to avoid all that,

287
00:14:28.809 --> 00:14:31.670
we will already create the object here

288
00:14:31.670 --> 00:14:34.660
and then export that object.

289
00:14:34.660 --> 00:14:37.310
And so like this, no one from the outside

290
00:14:37.310 --> 00:14:40.407
of this class here will have access to anything,

291
00:14:40.407 --> 00:14:42.793
except for the object.

292
00:14:44.720 --> 00:14:48.600
So what we will do is to export default

293
00:14:48.600 --> 00:14:50.360
and then a new RecipeView.

294
00:14:54.060 --> 00:14:55.020
All right?

295
00:14:55.020 --> 00:14:57.090
And that's actually it.

296
00:14:57.090 --> 00:14:59.440
So we don't pass any data in

297
00:14:59.440 --> 00:15:02.693
and so therefore, we don't need any constructor even.

298
00:15:05.800 --> 00:15:06.633
Okay?

299
00:15:06.633 --> 00:15:09.273
And then here all we do is import

300
00:15:09.273 --> 00:15:12.033
and here we then can give it any name.

301
00:15:13.020 --> 00:15:14.920
So I'm calling it recipeView

302
00:15:14.920 --> 00:15:17.902
because I think that's what makes most sense.

303
00:15:17.902 --> 00:15:22.902
And then views and then recipeView.js.

304
00:15:26.260 --> 00:15:29.390
Now, how do we then actually pass any data

305
00:15:29.390 --> 00:15:31.340
into the recipeView?

306
00:15:31.340 --> 00:15:34.159
Because if we're not creating the new object ourselves,

307
00:15:34.159 --> 00:15:36.450
then we cannot pass any data

308
00:15:36.450 --> 00:15:39.115
in like for the constructor, right?

309
00:15:39.115 --> 00:15:44.115
So we cannot pass any data into this RecipeView,

310
00:15:44.500 --> 00:15:47.940
well, because we're creating that object right here

311
00:15:47.940 --> 00:15:51.320
in the RecipeView module already.

312
00:15:51.320 --> 00:15:53.948
But actually, I did that on purpose

313
00:15:53.948 --> 00:15:58.948
so that we can create a very nice method called render.

314
00:15:59.326 --> 00:16:02.220
So what I will want to do here,

315
00:16:02.220 --> 00:16:04.180
and let me already write it here

316
00:16:04.180 --> 00:16:05.993
even before having the method.

317
00:16:07.090 --> 00:16:12.090
So what I will want to do is to call recipeView.render.

318
00:16:14.070 --> 00:16:17.020
And then here all we do is to pass in the data,

319
00:16:17.020 --> 00:16:20.937
which will be model.state.recipe.

320
00:16:23.300 --> 00:16:25.750
And this method here called render

321
00:16:25.750 --> 00:16:28.690
is a very common name for methods,

322
00:16:28.690 --> 00:16:32.720
for example, in React, it is also called render.

323
00:16:32.720 --> 00:16:35.590
And so I think this is a nice name.

324
00:16:35.590 --> 00:16:39.200
It's really descriptive of what is going to happen.

325
00:16:39.200 --> 00:16:40.430
All right?

326
00:16:40.430 --> 00:16:44.330
So if we did export the entire class,

327
00:16:44.330 --> 00:16:48.647
then here we would have to do like const recipeView

328
00:16:50.610 --> 00:16:55.113
equal new RecipeView or something like that.

329
00:16:57.140 --> 00:17:01.470
And then here, we would have to pass in the data like this

330
00:17:01.470 --> 00:17:03.970
when we create the new recipe.

331
00:17:03.970 --> 00:17:06.526
And of course, this would also be possible

332
00:17:06.526 --> 00:17:09.700
but honestly, I like it better like this.

333
00:17:09.700 --> 00:17:12.590
So having this nice render method

334
00:17:12.590 --> 00:17:14.330
is a lot more descriptive

335
00:17:14.330 --> 00:17:17.813
and a lot cleaner and also for the reasons

336
00:17:17.813 --> 00:17:20.433
that I explained previously already.

337
00:17:21.720 --> 00:17:24.240
Now, anyway, this render method here

338
00:17:24.240 --> 00:17:26.400
will now accept this data.

339
00:17:26.400 --> 00:17:29.093
It will then store it into the object.

340
00:17:31.810 --> 00:17:35.620
So let's add the public render method.

341
00:17:35.620 --> 00:17:39.293
So this is, of course, part of the public API.

342
00:17:40.800 --> 00:17:42.660
So this receives data

343
00:17:42.660 --> 00:17:46.040
and will then set this.#data

344
00:17:47.600 --> 00:17:50.040
to the data it just received.

345
00:17:50.040 --> 00:17:52.913
So we need to declare that up here.

346
00:17:55.260 --> 00:17:57.400
And so this render method here

347
00:17:57.400 --> 00:17:59.030
and these two properties

348
00:17:59.030 --> 00:18:00.840
are something that all the views

349
00:18:00.840 --> 00:18:03.000
are going to have in common.

350
00:18:03.000 --> 00:18:05.941
And this will be really beautiful to work with

351
00:18:05.941 --> 00:18:07.730
as you will see.

352
00:18:07.730 --> 00:18:11.280
But now, let's actually do something with this data,

353
00:18:11.280 --> 00:18:13.203
which is to actually render it.

354
00:18:14.530 --> 00:18:16.130
So basically what we want now

355
00:18:16.130 --> 00:18:18.110
is to take all of this code

356
00:18:19.564 --> 00:18:22.423
and cut it from here.

357
00:18:25.190 --> 00:18:26.713
And put it into our view.

358
00:18:27.690 --> 00:18:29.180
Okay?

359
00:18:29.180 --> 00:18:32.340
Now, we will actually not put it into the render method

360
00:18:32.340 --> 00:18:36.150
because again, this method will later be common

361
00:18:36.150 --> 00:18:37.720
to all the views.

362
00:18:37.720 --> 00:18:39.660
So to all the classes.

363
00:18:39.660 --> 00:18:44.500
However, each view will, of course, render different HTML.

364
00:18:44.500 --> 00:18:46.616
And so we will simply have a method

365
00:18:46.616 --> 00:18:48.727
that generates that HTML

366
00:18:48.727 --> 00:18:53.727
so that the render method can then render that HTML.

367
00:18:53.793 --> 00:18:57.263
So if that sounds confusing, let me write it in code.

368
00:18:58.440 --> 00:19:02.170
So generateMarkup.

369
00:19:02.170 --> 00:19:05.440
And so this is going to be a private method

370
00:19:05.440 --> 00:19:07.550
and since we're using Babel here,

371
00:19:07.550 --> 00:19:10.970
I can already use this syntax here.

372
00:19:14.980 --> 00:19:17.860
So pasting the code here

373
00:19:19.770 --> 00:19:23.580
and so this is going to generate this Markup variable

374
00:19:23.580 --> 00:19:27.363
and we can actually immediately return that from here.

375
00:19:28.640 --> 00:19:29.473
Okay?

376
00:19:30.310 --> 00:19:32.865
Now, this is not going to do anything yet

377
00:19:32.865 --> 00:19:37.280
because what is recipe here in this case?

378
00:19:37.280 --> 00:19:38.700
It's nothing, right?

379
00:19:38.700 --> 00:19:40.273
It's not defined at all.

380
00:19:41.450 --> 00:19:45.480
Now, in this case, where is this data actually?

381
00:19:45.480 --> 00:19:49.983
Well, it is in this.#data, right?

382
00:19:51.290 --> 00:19:52.797
So why's that?

383
00:19:52.797 --> 00:19:54.970
So let's take a look at our controller

384
00:19:56.090 --> 00:19:57.840
and let's start from the beginning.

385
00:19:58.890 --> 00:20:01.610
So the recipe is loaded here

386
00:20:01.610 --> 00:20:06.073
and then that will store it into the state object, right?

387
00:20:06.933 --> 00:20:09.143
Here we don't need that anymore.

388
00:20:10.120 --> 00:20:14.190
Then here we take model.state.recipe,

389
00:20:14.190 --> 00:20:18.120
which is that data that we just received here in step one

390
00:20:18.120 --> 00:20:23.120
and then that data is passed into the render method, right?

391
00:20:23.220 --> 00:20:26.050
And so render method then takes that data

392
00:20:26.050 --> 00:20:28.923
and stores it inside of this.#data.

393
00:20:29.890 --> 00:20:31.810
And so this is so that we can then use

394
00:20:31.810 --> 00:20:33.706
that data all over the place

395
00:20:33.706 --> 00:20:35.693
inside of this object.

396
00:20:37.890 --> 00:20:41.530
And by the way, this is exactly what we have here

397
00:20:41.530 --> 00:20:43.710
in this architecture diagram.

398
00:20:43.710 --> 00:20:45.273
So inside of controlRecipes,

399
00:20:47.477 --> 00:20:49.683
the loadRecipe function is called,

400
00:20:49.683 --> 00:20:53.380
then the recipe data foes into the state

401
00:20:53.380 --> 00:20:55.400
and then that data passes

402
00:20:55.400 --> 00:20:58.570
right through the controller basically

403
00:20:58.570 --> 00:21:01.270
and goes into the render method,

404
00:21:01.270 --> 00:21:04.293
which then in turn, calls generateMarkup.

405
00:21:05.400 --> 00:21:08.060
So you see, we already have many things

406
00:21:08.060 --> 00:21:09.760
here implemented here already,

407
00:21:09.760 --> 00:21:12.150
like data and parentElement,

408
00:21:12.150 --> 00:21:14.701
we're just missing some small parts

409
00:21:14.701 --> 00:21:16.913
but we are going to get there.

410
00:21:17.770 --> 00:21:19.830
But now what we were doing here

411
00:21:19.830 --> 00:21:22.610
is to discuss where this recipe data

412
00:21:22.610 --> 00:21:24.810
is actually located right now.

413
00:21:24.810 --> 00:21:27.253
And we came to the conclusion that it is in this.#data.

414
00:21:29.480 --> 00:21:31.160
So I will copy it

415
00:21:31.160 --> 00:21:36.160
and then we need to replace all the recipe. here with that.

416
00:21:38.780 --> 00:21:41.094
So I'm hitting Command + D.

417
00:21:41.094 --> 00:21:44.193
So for you, that should be Control + D.

418
00:21:46.290 --> 00:21:49.210
And then let me paste that dot

419
00:21:50.180 --> 00:21:51.573
and then that's it.

420
00:21:53.430 --> 00:21:54.910
All right?

421
00:21:54.910 --> 00:21:56.560
Then down here, we have this code,

422
00:21:56.560 --> 00:21:58.820
which is not supposed to be here

423
00:21:58.820 --> 00:22:00.880
because all this function does

424
00:22:00.880 --> 00:22:03.560
is to return an HTML string.

425
00:22:03.560 --> 00:22:05.400
And it's going to be the render method

426
00:22:05.400 --> 00:22:09.060
that will be responsible for then actually putting

427
00:22:09.060 --> 00:22:11.810
that HTML onto the page.

428
00:22:11.810 --> 00:22:15.590
Now, okay.

429
00:22:15.590 --> 00:22:18.970
So here, let's say that the markup

430
00:22:18.970 --> 00:22:21.857
is this.#generateMarkup.

431
00:22:28.350 --> 00:22:30.960
Well, this is probably something that's coming

432
00:22:30.960 --> 00:22:33.683
from Babel here.

433
00:22:35.130 --> 00:22:36.543
Not really sure why.

434
00:22:38.240 --> 00:22:41.720
But apparently, VS Code doesn't like this yet.

435
00:22:41.720 --> 00:22:44.120
Ah, we're still missing the dot here, of course.

436
00:22:45.090 --> 00:22:47.090
Now it appears to be working.

437
00:22:47.090 --> 00:22:49.370
And of course, we've still got some errors here

438
00:22:49.370 --> 00:22:51.790
but nevermind about that.

439
00:22:51.790 --> 00:22:54.020
We are still refactoring.

440
00:22:54.020 --> 00:22:55.830
So we have our markup.

441
00:22:55.830 --> 00:22:57.853
Now we need to put it on the page.

442
00:22:58.940 --> 00:23:03.530
So again, we need to start by clearing the parentElement

443
00:23:03.530 --> 00:23:08.280
and actually, let's create another small method for that.

444
00:23:08.280 --> 00:23:11.780
So just to get in the habit of abstracting some code

445
00:23:13.520 --> 00:23:15.970
and so now this is where our parentElement

446
00:23:15.970 --> 00:23:17.240
will come into play

447
00:23:18.730 --> 00:23:20.660
'cause now we can say

448
00:23:20.660 --> 00:23:22.670
this.#parentElement.innerHTML

449
00:23:26.650 --> 00:23:27.923
and set it to empty.

450
00:23:29.010 --> 00:23:30.310
Right?

451
00:23:30.310 --> 00:23:32.330
And so this method here

452
00:23:32.330 --> 00:23:34.780
will be usable for all the views

453
00:23:34.780 --> 00:23:36.390
as long as all the views

454
00:23:36.390 --> 00:23:40.800
have a parentElement property like this one.

455
00:23:40.800 --> 00:23:41.780
Right?

456
00:23:41.780 --> 00:23:44.890
So all of this will become really reusable

457
00:23:44.890 --> 00:23:49.576
as you will in one of the future lectures.

458
00:23:49.576 --> 00:23:53.033
So here we now can then call that.

459
00:23:56.722 --> 00:23:57.710
And then to finish,

460
00:23:57.710 --> 00:24:01.710
we can finally render that HTML to the page.

461
00:24:01.710 --> 00:24:03.150
And so here, once again,

462
00:24:03.150 --> 00:24:06.360
we can now use this.#parentElement

463
00:24:08.540 --> 00:24:11.900
and then insert that HTML there.

464
00:24:11.900 --> 00:24:13.120
Okay.

465
00:24:13.120 --> 00:24:16.323
So this might already be working actually.

466
00:24:17.420 --> 00:24:20.600
So all of this here looks good to me.

467
00:24:20.600 --> 00:24:22.750
Let's take a look at the controller.

468
00:24:22.750 --> 00:24:26.410
And you see that this is now a really nice

469
00:24:26.410 --> 00:24:30.620
and small function here already, right?

470
00:24:30.620 --> 00:24:34.013
Now, this one, we actually want to call it controlRecipes.

471
00:24:35.490 --> 00:24:37.163
So let's replace it everywhere.

472
00:24:38.420 --> 00:24:39.253
controlRecipes.

473
00:24:42.280 --> 00:24:46.713
So that's the name that I have here in the diagram.

474
00:24:47.800 --> 00:24:49.240
Okay?

475
00:24:49.240 --> 00:24:51.010
And so now what we're missing

476
00:24:51.010 --> 00:24:55.593
is only to export the renderSpinner also into the view.

477
00:24:56.440 --> 00:24:57.480
So this one, of course,

478
00:24:57.480 --> 00:25:02.080
also has nothing to do with the controller

479
00:25:02.080 --> 00:25:03.773
and so it belongs in the view.

480
00:25:08.930 --> 00:25:10.500
So of course, not a function

481
00:25:10.500 --> 00:25:15.370
but a method and this one will also be a public method

482
00:25:15.370 --> 00:25:18.930
so that the controller can then call this method here

483
00:25:18.930 --> 00:25:20.823
as it starts fetching the data.

484
00:25:21.730 --> 00:25:22.860
Okay?

485
00:25:22.860 --> 00:25:23.950
And now here again,

486
00:25:23.950 --> 00:25:28.260
we have the beauty of the parentElement already being

487
00:25:28.260 --> 00:25:30.143
inside of the object.

488
00:25:32.250 --> 00:25:34.760
So this one we can simply delete

489
00:25:34.760 --> 00:25:39.213
and here we can replace it with this.#parentElement.

490
00:25:44.050 --> 00:25:45.250
Now, right.

491
00:25:45.250 --> 00:25:48.086
Next up, I'm seeing that this icons variable

492
00:25:48.086 --> 00:25:51.713
is not going to be defined anywhere in this module.

493
00:25:52.930 --> 00:25:56.323
So we will need to grab that from here.

494
00:25:58.280 --> 00:26:00.080
So you'll see that here we have the icons

495
00:26:00.080 --> 00:26:04.490
and we don't need them here anymore at least.

496
00:26:04.490 --> 00:26:07.163
So now we need them right here.

497
00:26:11.510 --> 00:26:12.580
And now what we need to do

498
00:26:12.580 --> 00:26:16.280
is to then call this renderSpinner method right here.

499
00:26:22.060 --> 00:26:24.360
So that's going to be recipeView.renderSpinner

500
00:26:27.270 --> 00:26:30.330
and here again, we no longer need to pass

501
00:26:30.330 --> 00:26:32.550
in the parentElement.

502
00:26:32.550 --> 00:26:35.410
And just watch how beautiful this is.

503
00:26:35.410 --> 00:26:39.730
So we have recipeView and then renderSpinner

504
00:26:39.730 --> 00:26:40.940
and we already know

505
00:26:40.940 --> 00:26:43.702
that this will then automatically render the spinner

506
00:26:43.702 --> 00:26:45.912
on the recipeView.

507
00:26:45.912 --> 00:26:49.400
And the same is later going to happen with other views.

508
00:26:49.400 --> 00:26:51.910
For example, with the bookmarks view.

509
00:26:51.910 --> 00:26:55.970
We will also have a renderSpinner on the bookmarks view

510
00:26:55.970 --> 00:26:58.470
and it's going to work the exact same way.

511
00:26:58.470 --> 00:27:00.540
And the same with render.

512
00:27:00.540 --> 00:27:03.800
So all we have to do is call these same methods then

513
00:27:03.800 --> 00:27:05.200
on all the views

514
00:27:05.200 --> 00:27:08.053
and they will then simply act on whatever view

515
00:27:08.053 --> 00:27:11.430
that we are calling them, right?

516
00:27:11.430 --> 00:27:13.650
And that works so nice

517
00:27:13.650 --> 00:27:16.360
because we have this parentElement here

518
00:27:16.360 --> 00:27:18.273
and also this data property.

519
00:27:19.500 --> 00:27:23.660
So I think that this is a really nice architecture

520
00:27:23.660 --> 00:27:27.310
and so let's now actually see if this works.

521
00:27:27.310 --> 00:27:30.750
So let's reload this here.

522
00:27:30.750 --> 00:27:32.960
And here we have some errors.

523
00:27:32.960 --> 00:27:35.944
So apparently, if there is a really big error,

524
00:27:35.944 --> 00:27:39.590
then Parcel will let us know about that.

525
00:27:39.590 --> 00:27:42.170
And in this case, the problem is that it failed

526
00:27:42.170 --> 00:27:43.833
to resolve this URL.

527
00:27:45.410 --> 00:27:47.290
And that actually makes sense

528
00:27:47.290 --> 00:27:51.101
because this view here is in a different folder.

529
00:27:51.101 --> 00:27:52.410
Right?

530
00:27:52.410 --> 00:27:55.750
So here we're only going one folder up

531
00:27:55.750 --> 00:27:57.580
and going up one folder from here

532
00:27:57.580 --> 00:28:00.480
will end up in the JavaScript folder.

533
00:28:00.480 --> 00:28:03.320
However, we want to go into images.

534
00:28:03.320 --> 00:28:05.483
So we need to go up one more level.

535
00:28:06.720 --> 00:28:07.623
So like this.

536
00:28:10.900 --> 00:28:11.890
Okay?

537
00:28:11.890 --> 00:28:14.850
So here we have apparently some bug.

538
00:28:14.850 --> 00:28:19.240
Let's just see if anything happens still on this event

539
00:28:19.240 --> 00:28:20.820
and it does.

540
00:28:20.820 --> 00:28:23.990
There's still some problem here maybe

541
00:28:23.990 --> 00:28:25.490
that has to do with the fact

542
00:28:25.490 --> 00:28:28.923
that we are using these private methods here.

543
00:28:29.920 --> 00:28:31.400
So let me change this here

544
00:28:31.400 --> 00:28:32.487
to this one.

545
00:28:34.130 --> 00:28:38.773
So right here, yeah.

546
00:28:40.270 --> 00:28:42.681
And let's also comment out this one

547
00:28:42.681 --> 00:28:45.513
and then we're not using any private methods anymore.

548
00:28:47.490 --> 00:28:50.663
However, that is apparently still not working.

549
00:28:51.751 --> 00:28:53.150
All right.

550
00:28:53.150 --> 00:28:57.803
So let's take a look here at our this.#data.

551
00:28:59.360 --> 00:29:03.423
So this.#data just to see what we get here.

552
00:29:07.550 --> 00:29:09.969
And so we see that apparently

553
00:29:09.969 --> 00:29:13.303
that method is not even being called.

554
00:29:14.440 --> 00:29:16.357
Ah, and I see the problem.

555
00:29:16.357 --> 00:29:19.170
I actually did not call it.

556
00:29:19.170 --> 00:29:22.110
So I didn't use the parenthesis, right?

557
00:29:22.110 --> 00:29:25.103
So what a stupid mistake.

558
00:29:27.480 --> 00:29:30.660
So let's roll back on all the changes I did,

559
00:29:30.660 --> 00:29:32.650
except, of course, for this one

560
00:29:32.650 --> 00:29:34.610
but here, probably all I need to do

561
00:29:34.610 --> 00:29:37.473
is to call these two methods.

562
00:29:39.300 --> 00:29:40.543
Ah, beautiful.

563
00:29:41.750 --> 00:29:42.770
So we're back.

564
00:29:42.770 --> 00:29:44.680
It's working now again.

565
00:29:44.680 --> 00:29:46.590
And it's working really nice,

566
00:29:46.590 --> 00:29:47.983
including the spinner.

567
00:29:50.700 --> 00:29:52.210
Okay?

568
00:29:52.210 --> 00:29:54.240
And so I think with this,

569
00:29:54.240 --> 00:29:57.430
we successfully refactored our entire code

570
00:29:57.430 --> 00:30:00.020
to this new architecture.

571
00:30:00.020 --> 00:30:01.940
Well, not the entire code actually.

572
00:30:01.940 --> 00:30:05.760
We're still missing this handler here

573
00:30:05.760 --> 00:30:08.430
and all of this part that is here.

574
00:30:08.430 --> 00:30:11.730
But don't worry about that for now, okay?

575
00:30:11.730 --> 00:30:13.430
We will have a separate lecture,

576
00:30:13.430 --> 00:30:16.460
which will talk about how we can handle events

577
00:30:16.460 --> 00:30:19.320
in this particular architecture.

578
00:30:19.320 --> 00:30:20.530
For now what matters

579
00:30:20.530 --> 00:30:23.422
is that this works just nicely.

580
00:30:23.422 --> 00:30:26.780
There's just one thing that I actually want to change

581
00:30:26.780 --> 00:30:30.700
but that has nothing to do with the architecture.

582
00:30:30.700 --> 00:30:34.270
So what I want to change is these numbers.

583
00:30:34.270 --> 00:30:36.180
So do you see here we have 0.5

584
00:30:37.189 --> 00:30:42.189
but in the real world, you will see this more like this.

585
00:30:42.980 --> 00:30:46.950
So like 1/2 tablespoon of brown sugar

586
00:30:46.950 --> 00:30:49.140
instead of 0.5.

587
00:30:49.140 --> 00:30:52.023
So this looks a lot nicer or this, for example,

588
00:30:52.023 --> 00:30:54.613
1 1/2 is a lot nicer than 1.5.

589
00:30:56.560 --> 00:30:57.640
And so for that,

590
00:30:57.640 --> 00:31:00.640
we are actually going to use an external library,

591
00:31:00.640 --> 00:31:03.373
which will very easily do this for us.

592
00:31:03.373 --> 00:31:05.130
Okay?

593
00:31:05.130 --> 00:31:07.707
And so I included this part so I could show you

594
00:31:07.707 --> 00:31:10.620
just how to do this.

595
00:31:10.620 --> 00:31:12.870
So let me just google it here.

596
00:31:12.870 --> 00:31:15.930
Npm fractional

597
00:31:15.930 --> 00:31:19.103
just so we can see what this package looks like.

598
00:31:20.080 --> 00:31:21.980
So if you google npm,

599
00:31:21.980 --> 00:31:26.020
then you will usually end up on npmjs.com

600
00:31:26.020 --> 00:31:29.260
and this will then contain like one page

601
00:31:29.260 --> 00:31:34.080
for each package that is on npm, all right?

602
00:31:34.080 --> 00:31:36.390
And so here what you see

603
00:31:36.390 --> 00:31:39.970
is that you can basically create new fractions based

604
00:31:39.970 --> 00:31:43.810
on numbers and then you can do all kinds of multiplications

605
00:31:43.810 --> 00:31:46.007
with them, like multiplying, dividing

606
00:31:46.007 --> 00:31:50.550
and in the end, converting them to a string.

607
00:31:50.550 --> 00:31:52.568
And so that's what we will do now.

608
00:31:52.568 --> 00:31:55.830
So we will convert each number to a fraction

609
00:31:55.830 --> 00:31:58.543
and then immediately convert them to a string.

610
00:31:59.620 --> 00:32:01.780
So this is how we install it.

611
00:32:01.780 --> 00:32:03.443
Let's just grab that.

612
00:32:04.570 --> 00:32:07.423
And then we need our terminal back.

613
00:32:09.650 --> 00:32:11.183
Let's add another one.

614
00:32:12.070 --> 00:32:13.523
So that's the plus sign.

615
00:32:16.250 --> 00:32:18.453
And this should be pretty fast hopefully.

616
00:32:21.080 --> 00:32:23.427
And so we need that here

617
00:32:23.427 --> 00:32:25.300
and so let's import

618
00:32:27.610 --> 00:32:30.370
fractional from

619
00:32:31.570 --> 00:32:33.003
and then fractional.

620
00:32:34.180 --> 00:32:35.380
And so here again you see

621
00:32:35.380 --> 00:32:37.930
that any libraries or any packages

622
00:32:37.930 --> 00:32:40.240
that we import from npm,

623
00:32:40.240 --> 00:32:43.060
we don't even have to specify any path.

624
00:32:43.060 --> 00:32:45.880
All we have to do is to write their names here

625
00:32:45.880 --> 00:32:50.200
and then here, we need also what they export.

626
00:32:50.200 --> 00:32:52.983
And let me see what they actually export.

627
00:32:53.990 --> 00:32:57.380
So it should be called fraction, okay?

628
00:32:57.380 --> 00:33:01.660
So this library actually exports something called fraction.

629
00:33:01.660 --> 00:33:03.488
And we can see that because here,

630
00:33:03.488 --> 00:33:08.488
it is importing the fractional library using require.

631
00:33:08.540 --> 00:33:12.500
And that is simply the old CommonJS way of importing,

632
00:33:12.500 --> 00:33:14.340
which I showed you earlier.

633
00:33:14.340 --> 00:33:16.116
And so that is one of the reasons

634
00:33:16.116 --> 00:33:17.950
why I show that to you

635
00:33:17.950 --> 00:33:20.920
because yeah, again you will see this all the time

636
00:33:20.920 --> 00:33:22.350
in the wild still

637
00:33:22.350 --> 00:33:24.550
because so many packages on npm

638
00:33:24.550 --> 00:33:25.993
are still using CommonJS.

639
00:33:28.060 --> 00:33:32.400
So let's import Fraction here.

640
00:33:32.400 --> 00:33:33.473
Actually like this.

641
00:33:35.040 --> 00:33:35.873
Okay?

642
00:33:35.873 --> 00:33:39.143
And let's just see if this actually does exist now.

643
00:33:44.140 --> 00:33:46.060
And yeah, it does.

644
00:33:46.060 --> 00:33:50.350
So actually, that's even Fraction inside of Fraction

645
00:33:50.350 --> 00:33:55.051
but anyway, let's now go ahead and use this actually

646
00:33:55.051 --> 00:33:58.163
so that it's in here.

647
00:33:59.010 --> 00:34:01.853
So here we now no longer simply want the quantity

648
00:34:01.853 --> 00:34:04.430
but we want the quantity converted

649
00:34:04.430 --> 00:34:05.943
to a fraction string.

650
00:34:07.430 --> 00:34:09.317
So according to the documentation,

651
00:34:09.317 --> 00:34:13.570
we have to say new Fraction

652
00:34:14.580 --> 00:34:18.663
and in this case, it's actually Fraction.Fraction.

653
00:34:19.760 --> 00:34:22.450
So again that's because here inside of Fraction

654
00:34:22.450 --> 00:34:26.780
is where the Fraction function is actually located.

655
00:34:26.780 --> 00:34:27.630
Okay?

656
00:34:27.630 --> 00:34:32.526
And here you could see that we have to then use new.

657
00:34:32.526 --> 00:34:35.460
Now, actually to make this a bit nicer,

658
00:34:35.460 --> 00:34:40.340
we can also use destructuring here right away.

659
00:34:40.340 --> 00:34:41.973
So we can do this.

660
00:34:45.600 --> 00:34:46.973
And if we now take a look,

661
00:34:48.660 --> 00:34:50.868
well, now we have this bug here.

662
00:34:50.868 --> 00:34:52.913
But nevermind.

663
00:34:55.740 --> 00:34:57.083
So let's just do this.

664
00:34:58.100 --> 00:35:01.600
And then call toString on that

665
00:35:01.600 --> 00:35:03.803
just like it said in the documentation.

666
00:35:06.290 --> 00:35:10.010
So you see that now as I destructured that fraction,

667
00:35:10.010 --> 00:35:12.180
it became the actual function.

668
00:35:12.180 --> 00:35:17.180
And yeah, here you see beautifully that it is now

669
00:35:17.331 --> 00:35:21.513
in this size or in this format of the fraction.

670
00:35:23.200 --> 00:35:25.100
And if I take a look at the other one,

671
00:35:25.100 --> 00:35:26.363
then the same as well.

672
00:35:27.260 --> 00:35:31.810
Now, this one doesn't look very beautiful but nevermind.

673
00:35:31.810 --> 00:35:34.140
So we cannot fix all of it

674
00:35:34.140 --> 00:35:38.440
but at least, this looks really cool now, right?

675
00:35:38.440 --> 00:35:43.030
And so this is when we reach for packages on npm.

676
00:35:43.030 --> 00:35:44.740
So when we need some functionality

677
00:35:44.740 --> 00:35:48.500
that we don't want to implement ourselves.

678
00:35:48.500 --> 00:35:49.410
I'm just going back here

679
00:35:49.410 --> 00:35:51.890
because I noticed some problem here,

680
00:35:51.890 --> 00:35:54.170
which was this one.

681
00:35:54.170 --> 00:35:58.550
And that was because previously here we had null.

682
00:35:58.550 --> 00:36:02.486
So there was no value for this cilantro.

683
00:36:02.486 --> 00:36:07.373
And so we should probably check if the number does exist.

684
00:36:09.460 --> 00:36:13.143
So we can say ing.quantity.

685
00:36:14.120 --> 00:36:16.739
If it exists, then do this.

686
00:36:16.739 --> 00:36:21.250
And if not, then simply put an empty string there

687
00:36:21.250 --> 00:36:22.536
and of course, now here.

688
00:36:22.536 --> 00:36:26.073
So that must be out here.

689
00:36:29.750 --> 00:36:33.033
Yep, now it's gone and it looks a lot nicer.

690
00:36:34.750 --> 00:36:36.100
All right.

691
00:36:36.100 --> 00:36:37.330
Now just to finish,

692
00:36:37.330 --> 00:36:40.960
I actually want to refactor this function here.

693
00:36:41.990 --> 00:36:43.320
So let me grab this

694
00:36:46.520 --> 00:36:51.207
and put it down here and call it generateMarkupIngredients

695
00:36:55.590 --> 00:36:56.823
or just Ingredient.

696
00:37:00.907 --> 00:37:01.950
Okay.

697
00:37:01.950 --> 00:37:05.183
And this will then receive the ingredient.

698
00:37:06.140 --> 00:37:06.973
Okay.

699
00:37:06.973 --> 00:37:10.090
And then here inside of the map,

700
00:37:10.090 --> 00:37:12.443
we can then simply call this.

701
00:37:15.580 --> 00:37:19.250
And let's copy it because these private methods,

702
00:37:19.250 --> 00:37:22.963
for some reason, VS Code doesn't really understand them yet.

703
00:37:24.460 --> 00:37:27.683
So right here.

704
00:37:29.290 --> 00:37:34.290
And so successfully refactored this part

705
00:37:34.664 --> 00:37:38.090
and so we are now done in this lecture

706
00:37:38.090 --> 00:37:41.063
where we also successfully refactored the entire code

707
00:37:41.063 --> 00:37:42.960
that we already had

708
00:37:42.960 --> 00:37:46.963
to the model-view-controller architecture.

709
00:37:48.330 --> 00:37:49.450
All right?

710
00:37:49.450 --> 00:37:51.610
So we're not done 100%

711
00:37:51.610 --> 00:37:54.170
but we've done a lot of work in this lecture

712
00:37:54.170 --> 00:37:57.540
and I really hope that you understood everything

713
00:37:57.540 --> 00:37:58.960
that we did here.

714
00:37:58.960 --> 00:38:02.560
So this was a really, really, really important lecture.

715
00:38:02.560 --> 00:38:06.010
So make sure that you understand everything that we did.

716
00:38:06.010 --> 00:38:07.984
So make sure to review all the code

717
00:38:07.984 --> 00:38:11.110
and also compare it here

718
00:38:11.110 --> 00:38:13.260
with this diagram one more time

719
00:38:13.260 --> 00:38:16.700
so that you see which functions we call when

720
00:38:16.700 --> 00:38:19.095
and then also, how exactly the data flows

721
00:38:19.095 --> 00:38:21.670
between these different functions.

722
00:38:21.670 --> 00:38:24.060
And especially here in this view

723
00:38:24.060 --> 00:38:27.239
because I know that this can get a little bit confusing

724
00:38:27.239 --> 00:38:29.110
and so reviewing this

725
00:38:29.110 --> 00:38:31.340
is gonna be a very good idea,

726
00:38:31.340 --> 00:38:34.870
especially because we will use this so many times also

727
00:38:34.870 --> 00:38:36.220
in the other features.

728
00:38:36.220 --> 00:38:38.900
And so by then, you really must understand

729
00:38:38.900 --> 00:38:40.680
how all of this fits together

730
00:38:40.680 --> 00:38:43.060
because otherwise, it's gonna be very hard

731
00:38:43.060 --> 00:38:46.320
to follow the rest of the project.

732
00:38:46.320 --> 00:38:48.370
Okay, so take your time

733
00:38:48.370 --> 00:38:51.093
and only then move on to the next video.

