WEBVTT

1
00:00:01.290 --> 00:00:02.750
<v Jonas>Well, welcome back.</v>

2
00:00:02.750 --> 00:00:07.480
And I hope that you're still having fun in this project.

3
00:00:07.480 --> 00:00:09.930
Now, the next part of this project

4
00:00:09.930 --> 00:00:12.710
is going to be implementing bookmarks.

5
00:00:12.710 --> 00:00:14.380
And so that's what we will do

6
00:00:14.380 --> 00:00:16.743
in this lecture and the next one.

7
00:00:19.193 --> 00:00:20.030
Okay.

8
00:00:20.030 --> 00:00:24.160
And let's start again with a look at our flow chart here.

9
00:00:24.160 --> 00:00:25.520
And so in this video

10
00:00:25.520 --> 00:00:29.440
what we will do is simply basically adding a handler

11
00:00:29.440 --> 00:00:34.440
to the recipe so that then the user can bookmark the recipe

12
00:00:34.550 --> 00:00:39.170
and then a that will render or update the recipe

13
00:00:39.170 --> 00:00:42.880
with the bookmark button, then update it.

14
00:00:42.880 --> 00:00:46.470
And for doing that there's actually a lot of stuff

15
00:00:46.470 --> 00:00:48.560
that we need to implement.

16
00:00:48.560 --> 00:00:53.333
So there's a lot of work for us to do, so let's get started.

17
00:00:54.270 --> 00:00:57.200
And actually, before we get started

18
00:00:57.200 --> 00:01:00.550
I think we should actually also see this in action.

19
00:01:00.550 --> 00:01:04.550
So here in the demo version, so let's say that we are here

20
00:01:04.550 --> 00:01:08.143
on this first recipe and when I click this recipe

21
00:01:08.143 --> 00:01:12.290
I then want this, icon here to change right?

22
00:01:12.290 --> 00:01:15.450
And so this is now bookmarked.

23
00:01:15.450 --> 00:01:17.980
So when I then go to the next result

24
00:01:17.980 --> 00:01:21.880
then of course this bookmark here is back to being empty.

25
00:01:21.880 --> 00:01:25.890
But when I go back to that recipe that I had bookmarked,

26
00:01:25.890 --> 00:01:28.330
then it is back to being filled.

27
00:01:28.330 --> 00:01:29.310
And so this means

28
00:01:29.310 --> 00:01:33.200
that the current recipe is indeed a bookmark.

29
00:01:33.200 --> 00:01:35.750
Then in the next lecture, we will take care

30
00:01:35.750 --> 00:01:40.090
of also displaying all the bookmarks up here.

31
00:01:40.090 --> 00:01:43.056
All right, but that's something different.

32
00:01:43.056 --> 00:01:46.728
And so for now, let's take care of the core functionality

33
00:01:46.728 --> 00:01:50.133
of being able to bookmark a recipe.

34
00:01:52.020 --> 00:01:55.840
Okay and finally there's one more thing

35
00:01:55.840 --> 00:01:58.963
that we actually need to do before starting that.

36
00:02:00.280 --> 00:02:02.910
So I discovered a small bug here.

37
00:02:02.910 --> 00:02:05.950
Let's say that we searched for something.

38
00:02:05.950 --> 00:02:10.750
And then we go to page two or page three, for example

39
00:02:10.750 --> 00:02:13.913
and then let's say we search for something else.

40
00:02:14.990 --> 00:02:16.820
So that gives us our results.

41
00:02:16.820 --> 00:02:18.520
But as we go back here

42
00:02:18.520 --> 00:02:21.960
notice how we are still on page number three.

43
00:02:21.960 --> 00:02:25.380
And so that is a bug that we need to fix.

44
00:02:25.380 --> 00:02:28.010
Now, can you figure out maybe on your own,

45
00:02:28.010 --> 00:02:30.250
why does bug is happening?

46
00:02:30.250 --> 00:02:32.460
So I think that this would be a nice challenge

47
00:02:32.460 --> 00:02:34.920
for you to pause this video actually

48
00:02:34.920 --> 00:02:38.933
right now and try to figure out why this bug is happening.

49
00:02:40.660 --> 00:02:44.090
So hopefully you figured it out.

50
00:02:44.090 --> 00:02:47.480
And the reason for it is that here in the model,

51
00:02:47.480 --> 00:02:51.490
when we do the search so here,

52
00:02:51.490 --> 00:02:53.620
when we load the search results

53
00:02:53.620 --> 00:02:57.320
of course the state is set to one.

54
00:02:57.320 --> 00:03:01.380
So the page is set to one here automatically.

55
00:03:01.380 --> 00:03:03.920
However, as we move to another page

56
00:03:03.920 --> 00:03:07.100
then this variable here gets updated right.

57
00:03:07.100 --> 00:03:10.070
But then when we search for something else

58
00:03:10.070 --> 00:03:15.070
we never reset this page to one right?

59
00:03:15.160 --> 00:03:18.380
And so that's what we have to do right here

60
00:03:18.380 --> 00:03:20.393
where we load the search results.

61
00:03:21.790 --> 00:03:26.650
So after this here, we need to say state.search.page

62
00:03:30.270 --> 00:03:32.480
and set it back to once.

63
00:03:32.480 --> 00:03:36.710
And so now whenever we load some new search results

64
00:03:36.710 --> 00:03:39.640
so basically whenever we do a new search

65
00:03:39.640 --> 00:03:42.990
then the page will reset to one.

66
00:03:42.990 --> 00:03:44.603
So let's try that again now.

67
00:03:46.922 --> 00:03:51.922
So we are again at page three and you already see,

68
00:03:53.420 --> 00:03:54.950
we have different results.

69
00:03:54.950 --> 00:03:57.933
And indeed now we are at page number one.

70
00:03:59.520 --> 00:04:03.260
Okay so that was a small bug that needed to be fixed.

71
00:04:03.260 --> 00:04:06.800
But now let's go back to the actual topic of this video,

72
00:04:06.800 --> 00:04:09.063
which is to implement bookmarking.

73
00:04:11.240 --> 00:04:15.080
So bookmarks are all about data.

74
00:04:15.080 --> 00:04:18.560
And so we will start by working again in the model

75
00:04:18.560 --> 00:04:20.260
and we will add a new method here.

76
00:04:21.474 --> 00:04:22.450
Well actually a new function

77
00:04:22.450 --> 00:04:25.960
that we export that we will then use from the controller,

78
00:04:25.960 --> 00:04:30.960
which is simply add a bookmark.

79
00:04:31.130 --> 00:04:35.850
And so this will receive basically a recipe

80
00:04:35.850 --> 00:04:39.283
and then it will set that recipe as a bookmark.

81
00:04:41.200 --> 00:04:44.630
So a recipe and then in our state,

82
00:04:44.630 --> 00:04:47.630
we already have an array for bookmarks

83
00:04:48.780 --> 00:04:52.060
or actually we don't, but I think I had it

84
00:04:52.060 --> 00:04:53.943
in the architecture diagram.

85
00:04:55.770 --> 00:04:59.380
So anyway, we have an array of bookmarks,

86
00:04:59.380 --> 00:05:02.200
which we start as an empty array,

87
00:05:02.200 --> 00:05:04.930
but then basically adding a bookmark

88
00:05:04.930 --> 00:05:08.713
simply means to push the recipe here into this array.

89
00:05:13.410 --> 00:05:18.410
Okay so what I just said is this state.bookmarks.push

90
00:05:22.980 --> 00:05:26.593
and then the recipe object that we just received here.

91
00:05:27.440 --> 00:05:28.860
So let's add a comment here

92
00:05:30.800 --> 00:05:34.600
add bookmark because besides this

93
00:05:34.600 --> 00:05:39.230
we also want to mark the current recipe as being bookmarked.

94
00:05:39.230 --> 00:05:42.450
So at least if the current recipe is the same recipe

95
00:05:42.450 --> 00:05:45.153
as this one that we are adding here.

96
00:05:46.570 --> 00:05:51.410
So mark current recipe as bookmark

97
00:05:53.110 --> 00:05:56.740
because this will then allow us to actually display

98
00:05:56.740 --> 00:06:01.163
this current recipe as bookmarked in the recipe view.

99
00:06:02.120 --> 00:06:06.350
So we can say if recipe.id.

100
00:06:06.350 --> 00:06:09.250
So the idea of the recipe that we passed in here

101
00:06:09.250 --> 00:06:12.420
is equal to the ID of the current recipe.

102
00:06:12.420 --> 00:06:16.230
So the one that is currently loaded in our application

103
00:06:16.230 --> 00:06:21.117
which is state.recipe.id, while in this case

104
00:06:23.270 --> 00:06:28.270
we want to say state.recipe.bookmarked should be true.

105
00:06:33.100 --> 00:06:37.463
So basically setting a new property on this recipe object.

106
00:06:38.950 --> 00:06:43.880
So for now that is the add bookmark function here.

107
00:06:43.880 --> 00:06:47.020
And so now let's create a new controller.

108
00:06:47.020 --> 00:06:50.023
So a controller for adding a new bookmark,

109
00:06:51.910 --> 00:06:55.833
so control, add bookmark.

110
00:07:01.640 --> 00:07:04.860
And so here let's not try to add a bookmark

111
00:07:06.370 --> 00:07:09.210
with the current recipe.

112
00:07:09.210 --> 00:07:13.520
So model.state.recipe

113
00:07:14.470 --> 00:07:18.330
and then let's also immediately log that to the console

114
00:07:18.330 --> 00:07:23.170
so that we can see that it is actually marked as a bookmark.

115
00:07:25.530 --> 00:07:29.970
And now of course we need a way of calling this

116
00:07:29.970 --> 00:07:31.850
a controller function.

117
00:07:31.850 --> 00:07:33.883
So when will that happen?

118
00:07:34.900 --> 00:07:39.900
Well, it should happen when we click on this button right?

119
00:07:40.070 --> 00:07:41.520
So this bookmark button

120
00:07:42.400 --> 00:07:45.850
and right now the icon here is actually wrong.

121
00:07:45.850 --> 00:07:50.203
So let's start by fixing that here in the recipe view.

122
00:07:52.020 --> 00:07:54.683
So where is that,

123
00:07:56.610 --> 00:07:57.443
here.

124
00:07:57.443 --> 00:07:59.750
So here it should not be fill for now,

125
00:07:59.750 --> 00:08:03.963
it should simply be the empty icon like this.

126
00:08:04.870 --> 00:08:05.703
All right.

127
00:08:07.570 --> 00:08:11.570
Now the name of this button here is button round

128
00:08:12.840 --> 00:08:16.020
but let's add a another class here.

129
00:08:16.020 --> 00:08:17.280
So let's say button

130
00:08:19.970 --> 00:08:24.850
bookmark, and so now we want to listen for clicks

131
00:08:24.850 --> 00:08:25.923
on this element.

132
00:08:26.990 --> 00:08:30.020
However, to keep this view simple

133
00:08:30.020 --> 00:08:34.400
I will not select this element, so at least not directly.

134
00:08:34.400 --> 00:08:38.400
And instead I will once again, do event delegation.

135
00:08:38.400 --> 00:08:42.577
So here let's add another function called addHandler

136
00:08:43.740 --> 00:08:46.793
and hear add bookmark.

137
00:08:49.010 --> 00:08:53.640
Which has always will receive a handler function

138
00:08:53.640 --> 00:08:55.840
which in this case is going to be the controller,

139
00:08:55.840 --> 00:08:58.163
we just created a minute ago.

140
00:08:59.260 --> 00:09:04.260
So here this.parentelement.event listener click,

141
00:09:08.160 --> 00:09:11.283
and then, or a function here.

142
00:09:12.400 --> 00:09:15.200
And so in fact this is really necessary

143
00:09:15.200 --> 00:09:18.135
because the element that we are trying to select.

144
00:09:18.135 --> 00:09:21.360
So this button with this class

145
00:09:21.360 --> 00:09:26.360
of a button bookmark does actually not exist

146
00:09:26.900 --> 00:09:31.070
by the time the application is loaded, right.

147
00:09:31.070 --> 00:09:34.389
So basically by the time that the page starts

148
00:09:34.389 --> 00:09:37.200
this element does not exist.

149
00:09:37.200 --> 00:09:39.990
And so it's impossible to add an event listener

150
00:09:39.990 --> 00:09:42.740
to an element that doesn't exist.

151
00:09:42.740 --> 00:09:45.560
And so that is yet another great use case

152
00:09:45.560 --> 00:09:47.580
for event delegation.

153
00:09:47.580 --> 00:09:49.950
So we do exactly what we do here

154
00:09:49.950 --> 00:09:53.585
which is to simply listen for the event on a parent element

155
00:09:53.585 --> 00:09:57.390
and then try to figure out if the click actually happened

156
00:09:57.390 --> 00:09:59.743
on the element that we are looking for.

157
00:10:00.985 --> 00:10:05.310
And so once again, we will do a button element here

158
00:10:05.310 --> 00:10:10.310
and then e.target.closest, because one more time

159
00:10:10.330 --> 00:10:13.780
the user might actually click on the icon element.

160
00:10:13.780 --> 00:10:16.233
So on the SVG data is in there.

161
00:10:18.660 --> 00:10:21.630
Okay and if there is a button

162
00:10:22.700 --> 00:10:25.030
or let's actually say, if there is no button

163
00:10:26.570 --> 00:10:30.190
then return so the same guard clause as always

164
00:10:31.210 --> 00:10:34.950
and otherwise call or handler.

165
00:10:34.950 --> 00:10:38.030
So this was pretty straight forward I believe

166
00:10:38.030 --> 00:10:41.210
because we have done this many times before.

167
00:10:41.210 --> 00:10:42.880
Okay and so now

168
00:10:42.880 --> 00:10:46.660
all we have to do is in the controller module

169
00:10:46.660 --> 00:10:50.573
to call this method here right.

170
00:10:53.650 --> 00:10:58.210
So recipe, view.addhandler add bookmark

171
00:10:58.210 --> 00:11:03.210
and then we pass in control add bookmark.

172
00:11:03.420 --> 00:11:07.230
And so then when we click the element that we just selected

173
00:11:07.230 --> 00:11:10.810
then we will add the current recipe as a bookmark

174
00:11:10.810 --> 00:11:14.490
and prologue also that current recipe to the console

175
00:11:14.490 --> 00:11:17.490
so that we can see that it was actually marked

176
00:11:17.490 --> 00:11:18.693
as bookmarked.

177
00:11:21.120 --> 00:11:25.010
Okay so lets the reload just to make sure

178
00:11:25.010 --> 00:11:26.293
let's click the button.

179
00:11:27.780 --> 00:11:30.270
And did anything happen?

180
00:11:30.270 --> 00:11:32.090
Oh yeah, I think it just

181
00:11:33.520 --> 00:11:35.830
yeah locked this object here.

182
00:11:35.830 --> 00:11:36.883
So let's see.

183
00:11:37.980 --> 00:11:39.510
Ah, and here we have it.

184
00:11:39.510 --> 00:11:42.393
So bookmarked is now set to true.

185
00:11:43.400 --> 00:11:44.233
Great.

186
00:11:45.110 --> 00:11:49.540
So an important piece of the work here is already done

187
00:11:49.540 --> 00:11:54.540
but now we then want to render here this icon as filled.

188
00:11:55.060 --> 00:11:58.400
And so let's go back to our view and basically say

189
00:11:58.400 --> 00:12:02.830
if bookmarked is true, then a render the filled icon.

190
00:12:02.830 --> 00:12:05.903
And if not, then simply render this one.

191
00:12:07.720 --> 00:12:10.573
So that should be easy enough.

192
00:12:12.340 --> 00:12:13.980
So not here in the view, of course

193
00:12:13.980 --> 00:12:17.033
but in the recipe view where regenerate a markup.

194
00:12:18.453 --> 00:12:23.453
So yeah, this is the button here, and this is the icon

195
00:12:24.530 --> 00:12:26.630
that I'm talking about.

196
00:12:26.630 --> 00:12:29.300
So here, when the recipe is bookmarked

197
00:12:29.300 --> 00:12:33.033
we want to add like this fill part.

198
00:12:34.120 --> 00:12:38.707
And so we can simply say this.data

199
00:12:41.790 --> 00:12:45.293
which is the recipe.bookmarked.

200
00:12:47.440 --> 00:12:52.440
So if so then here create a fill and otherwise nothing.

201
00:12:55.294 --> 00:12:58.640
Okay and now finally, to actually make this work

202
00:12:58.640 --> 00:13:03.350
of course, we will also have to update the entire recipe.

203
00:13:03.350 --> 00:13:08.350
So recipe view and so this is why we created

204
00:13:08.600 --> 00:13:10.633
that update method before.

205
00:13:11.610 --> 00:13:15.470
And so now again, this method is coming in very useful

206
00:13:15.470 --> 00:13:20.050
because otherwise we would have to render the entire page

207
00:13:20.050 --> 00:13:22.330
or actually the entire view

208
00:13:22.330 --> 00:13:24.520
which would make a lot of sense

209
00:13:24.520 --> 00:13:27.550
because with this we will only update the element

210
00:13:27.550 --> 00:13:29.453
which has actually changed.

211
00:13:31.550 --> 00:13:34.860
And so here then again we need to pass in the data

212
00:13:34.860 --> 00:13:36.900
that we want to update.

213
00:13:36.900 --> 00:13:41.003
And so that's model.state.recipe once again.

214
00:13:41.910 --> 00:13:45.030
Okay and so now as we click here

215
00:13:45.030 --> 00:13:50.030
let's see, and indeed the button was updated.

216
00:13:51.590 --> 00:13:53.700
Now we get all of these logs here.

217
00:13:53.700 --> 00:13:57.543
Let's take them out that is in the view.

218
00:13:58.870 --> 00:14:02.460
So that's this one here.

219
00:14:02.460 --> 00:14:04.120
Great.

220
00:14:04.120 --> 00:14:06.120
So here, let's now search for something.

221
00:14:11.260 --> 00:14:13.733
So let's mark this one here as a bookmark,

222
00:14:14.950 --> 00:14:16.310
then this one here

223
00:14:17.590 --> 00:14:21.223
but now as we come back here, let's see what happens.

224
00:14:22.610 --> 00:14:25.383
And you see that the bookmark is actually gone,

225
00:14:27.500 --> 00:14:28.720
right?

226
00:14:28.720 --> 00:14:33.720
So now here you no longer see bookmarked set to true.

227
00:14:33.770 --> 00:14:35.113
So why is that?

228
00:14:35.950 --> 00:14:39.550
Well, as we load each new recipe

229
00:14:39.550 --> 00:14:42.660
it will always be loaded basically from scratch.

230
00:14:42.660 --> 00:14:46.800
So it will be loaded from the API, right?

231
00:14:46.800 --> 00:14:51.070
We are not loading this recipe from the bookmarks.

232
00:14:51.070 --> 00:14:53.570
And actually we won't do that.

233
00:14:53.570 --> 00:14:57.260
But what we will do is to now use the data that we store

234
00:14:57.260 --> 00:14:59.930
in the bookmarks array and the state

235
00:14:59.930 --> 00:15:04.350
to basically Mark any recipe that we load as bookmarked,

236
00:15:04.350 --> 00:15:07.163
if it is already in the bookmarks array.

237
00:15:08.490 --> 00:15:11.470
So that probably sounded more complicated

238
00:15:11.470 --> 00:15:13.450
than it actually is.

239
00:15:13.450 --> 00:15:16.780
Okay so let's go here back to the model

240
00:15:16.780 --> 00:15:20.260
and then to our function, which loads the recipe.

241
00:15:20.260 --> 00:15:21.763
So that is this one.

242
00:15:22.630 --> 00:15:25.520
So here the as we got all this data

243
00:15:25.520 --> 00:15:28.380
and store it in the state.

244
00:15:28.380 --> 00:15:32.060
Then what we can do is to check if there is already a recipe

245
00:15:32.060 --> 00:15:35.270
with the same ID in the bookmarks state.

246
00:15:35.270 --> 00:15:38.740
And if it is then we will mark the current recipe

247
00:15:38.740 --> 00:15:43.740
that we just loaded from the API as bookmarked set to true.

248
00:15:44.030 --> 00:15:46.070
So let's use

249
00:15:46.070 --> 00:15:49.060
one of the nice array methods that we learned about,

250
00:15:49.060 --> 00:15:52.050
which is the sum method.

251
00:15:52.050 --> 00:15:55.830
And remember that the sum method returns true or false.

252
00:15:55.830 --> 00:15:59.663
And so that's great for doing an if check like this.

253
00:16:00.620 --> 00:16:04.820
So here we can check if state.bookmarks.some

254
00:16:08.350 --> 00:16:10.570
which basically means any,

255
00:16:10.570 --> 00:16:14.660
so at least that's how I like to think about this method.

256
00:16:14.660 --> 00:16:17.500
So this method will loop over an array

257
00:16:17.500 --> 00:16:21.920
and then return true if any of them actually has to

258
00:16:21.920 --> 00:16:24.003
for the condition that we specify here.

259
00:16:25.300 --> 00:16:29.350
So if bookmark.id is the same

260
00:16:30.540 --> 00:16:33.360
as the ID that we just received here

261
00:16:33.360 --> 00:16:36.113
okay, let's call this here bookmark actually.

262
00:16:38.380 --> 00:16:40.960
And so basically what this means is that

263
00:16:40.960 --> 00:16:45.240
if there is any bookmark, which has the bookmark ID

264
00:16:45.240 --> 00:16:48.000
equal to the ID that we just received

265
00:16:48.000 --> 00:16:51.240
well, then we want the current recipe

266
00:16:51.240 --> 00:16:56.090
which is state.recipe to be bookmarked.

267
00:16:56.090 --> 00:16:59.763
So bookmark equal to true.

268
00:17:00.810 --> 00:17:04.793
Okay and otherwise we wanted a set to false.

269
00:17:08.790 --> 00:17:12.580
And so with this, all the recipes that we now load

270
00:17:12.580 --> 00:17:17.390
we'll always have bookmarked set to either true or false.

271
00:17:17.390 --> 00:17:19.620
Okay great.

272
00:17:19.620 --> 00:17:24.550
And so now we actually used this state.bookmarks

273
00:17:24.550 --> 00:17:26.600
for anything meaningful.

274
00:17:26.600 --> 00:17:30.180
So up until this point, we had stored the recipe

275
00:17:30.180 --> 00:17:33.760
in the bookmarks array, but it wasn't really useful.

276
00:17:33.760 --> 00:17:36.620
So there was really no point up until now,

277
00:17:36.620 --> 00:17:39.254
but now here use basically use this array

278
00:17:39.254 --> 00:17:41.860
in order to store all the bookmarks

279
00:17:41.860 --> 00:17:44.640
so that when we come back to one of them,

280
00:17:44.640 --> 00:17:48.163
we can then mark the recipe as being bookmarked.

281
00:17:49.290 --> 00:17:51.003
So let's try this now again.

282
00:17:52.630 --> 00:17:56.320
So bookmarking this, then I come to this

283
00:17:56.320 --> 00:18:01.320
and yeah so that worked and you see that it is bookmarked

284
00:18:02.150 --> 00:18:04.910
set to true and the previous one.

285
00:18:04.910 --> 00:18:07.940
So the double crust stuffed pizza

286
00:18:07.940 --> 00:18:10.740
is of course bookmarked set to false.

287
00:18:10.740 --> 00:18:13.420
And so when we click that here,

288
00:18:13.420 --> 00:18:15.830
it doesn't have the bookmark.

289
00:18:15.830 --> 00:18:17.313
Now we bookmarked it.

290
00:18:18.200 --> 00:18:20.913
And when we come back to it, then there it is.

291
00:18:22.200 --> 00:18:26.327
Okay and now just as the final piece here,

292
00:18:26.327 --> 00:18:28.900
when we click on this button again

293
00:18:28.900 --> 00:18:33.620
we then want to unbookmark basically this recipe.

294
00:18:33.620 --> 00:18:36.420
So we want to remove it from the bookmarks

295
00:18:36.420 --> 00:18:40.040
but right now, of course, that doesn't happen.

296
00:18:40.040 --> 00:18:44.900
And so what we need now is basically yet another method

297
00:18:44.900 --> 00:18:47.010
or function here in our model,

298
00:18:47.010 --> 00:18:51.450
which will simply remove a bookmark.

299
00:18:51.450 --> 00:18:54.203
So doing the opposite of add bookmark.

300
00:18:55.590 --> 00:18:59.940
So const delete bookmark

301
00:19:02.830 --> 00:19:05.800
and this one will simply receive an ID

302
00:19:05.800 --> 00:19:08.530
because that is actually simpler.

303
00:19:08.530 --> 00:19:11.160
And this is actually a common pattern

304
00:19:11.160 --> 00:19:14.340
that you will see in programming when we add something

305
00:19:14.340 --> 00:19:16.130
we get the entire data.

306
00:19:16.130 --> 00:19:19.393
And when we want to delete something, we only get to the ID.

307
00:19:20.350 --> 00:19:24.090
So this is a pretty common pattern again.

308
00:19:24.090 --> 00:19:28.710
So what we want to do here is to basically delete the recipe

309
00:19:28.710 --> 00:19:33.710
which has this ID from the bookmarks array right?

310
00:19:34.330 --> 00:19:39.010
So state.bookmarks and then to delete something,

311
00:19:39.010 --> 00:19:41.550
we use the splice method.

312
00:19:41.550 --> 00:19:45.610
Remember, and then here we need the index

313
00:19:45.610 --> 00:19:48.160
where the element is actually located

314
00:19:48.160 --> 00:19:49.310
that we want to delete.

315
00:19:50.330 --> 00:19:53.309
So we will calculate the index in a second.

316
00:19:53.309 --> 00:19:56.670
And then how many items we want to delete

317
00:19:56.670 --> 00:19:57.763
which has only one.

318
00:19:59.123 --> 00:20:02.980
And so this index here, we can calculate it by using

319
00:20:02.980 --> 00:20:05.783
our old friend defined index method.

320
00:20:07.310 --> 00:20:08.963
So state.bookmarks.

321
00:20:10.010 --> 00:20:13.300
And I think we already did something very similar to this

322
00:20:13.300 --> 00:20:15.833
in the Bankist application.

323
00:20:17.620 --> 00:20:19.710
So here we are looking for the element

324
00:20:20.830 --> 00:20:25.830
which has the ID equal to the ID that was passed in.

325
00:20:26.800 --> 00:20:28.920
So there's going to be one bookmark

326
00:20:28.920 --> 00:20:33.110
for which this condition here is true.

327
00:20:33.110 --> 00:20:37.730
So word current bookmark.id is equal to this ID.

328
00:20:37.730 --> 00:20:41.045
And so for this element where this condition is true

329
00:20:41.045 --> 00:20:43.330
the index will be returned.

330
00:20:43.330 --> 00:20:46.913
And then we can take that index and deleted from the array.

331
00:20:47.840 --> 00:20:52.840
And then finally, let's also mark the current recipe

332
00:20:54.440 --> 00:20:57.023
as not a bookmark anymore.

333
00:20:59.790 --> 00:21:04.790
So as not bookmarked and here as well,

334
00:21:05.920 --> 00:21:10.920
and here let's say delete bookmark, okay.

335
00:21:13.500 --> 00:21:17.330
And now we need to of course use this function somewhere.

336
00:21:17.330 --> 00:21:20.433
And that's always, that can only be in the controller.

337
00:21:22.130 --> 00:21:27.130
Okay, so this control add bookmark function will be executed

338
00:21:27.290 --> 00:21:30.830
whenever we click on that bookmark button.

339
00:21:30.830 --> 00:21:32.900
And so here we now need to control

340
00:21:32.900 --> 00:21:35.900
what exactly should happen in that case.

341
00:21:35.900 --> 00:21:40.540
So when do we actually want to add a bookmark?

342
00:21:40.540 --> 00:21:45.493
Well, actually only when the recipe is not yet bookmarked.

343
00:21:46.330 --> 00:21:47.573
So let's write that.

344
00:21:48.910 --> 00:21:53.157
So if model.state.recipe.bookmarked

345
00:21:55.860 --> 00:21:57.173
so if that's false,

346
00:21:58.270 --> 00:22:00.250
then do this.

347
00:22:00.250 --> 00:22:03.493
So add to bookmark then but if not,

348
00:22:04.820 --> 00:22:07.160
and so let's now do this instead of an else

349
00:22:07.160 --> 00:22:09.610
because this is more readable

350
00:22:09.610 --> 00:22:12.203
then we want to delete bookmark.

351
00:22:13.370 --> 00:22:17.970
And again, here we pass in actually the ID like this

352
00:22:19.290 --> 00:22:23.160
and that's actually it, and this is possible.

353
00:22:23.160 --> 00:22:27.650
Remember so it's possible that we read the bookmark property

354
00:22:27.650 --> 00:22:29.250
right at the beginning

355
00:22:29.250 --> 00:22:31.610
because we add that to all the recipes

356
00:22:31.610 --> 00:22:35.663
that are ever loaded right at the beginning right here.

357
00:22:37.070 --> 00:22:42.070
Okay and so now this should not work.

358
00:22:45.770 --> 00:22:48.323
Let's try avocado now for a change.

359
00:22:49.510 --> 00:22:52.240
So some sushi here that looks delicious

360
00:22:54.290 --> 00:22:57.100
and we get ourselves a bug.

361
00:22:57.100 --> 00:23:01.883
So let's go to line number eight, 98 actually.

362
00:23:02.850 --> 00:23:05.010
So 98.

363
00:23:05.010 --> 00:23:08.480
Oh and here we are using recipe.id

364
00:23:09.570 --> 00:23:12.120
because we simply copied it from here.

365
00:23:12.120 --> 00:23:16.870
So you see that simply copying some code many times can

366
00:23:16.870 --> 00:23:19.010
make us run into bugs.

367
00:23:19.010 --> 00:23:22.093
So here, of course we are already receiving the ID.

368
00:23:23.300 --> 00:23:26.940
So that's only ID let's go back

369
00:23:29.030 --> 00:23:31.503
and let's search for avocado again.

370
00:23:33.900 --> 00:23:37.253
So here we have that let's bookmark it.

371
00:23:38.300 --> 00:23:40.493
Well, that didn't work.

372
00:23:41.380 --> 00:23:46.380
Let's see why, so probably something wrong

373
00:23:46.700 --> 00:23:47.953
in our controller.

374
00:23:49.190 --> 00:23:53.120
So let's lock this year to the console,

375
00:23:53.120 --> 00:23:55.660
just to see if this is having any effect

376
00:24:00.630 --> 00:24:04.803
let's clear this here, and it is false.

377
00:24:06.140 --> 00:24:07.223
And so,

378
00:24:08.220 --> 00:24:10.010
therefore this should have worked

379
00:24:11.970 --> 00:24:14.363
but somehow nothing worked.

380
00:24:15.860 --> 00:24:19.713
So this code here did not get executed for some reason.

381
00:24:20.630 --> 00:24:24.550
Oh and actually I see what is happening.

382
00:24:24.550 --> 00:24:28.470
So this code actually did get executed.

383
00:24:28.470 --> 00:24:32.860
So this code here, will mark the recipe as bookmarked,

384
00:24:32.860 --> 00:24:36.730
but then in the next line of code right here,

385
00:24:36.730 --> 00:24:39.810
then the recipe is already bookmarked.

386
00:24:39.810 --> 00:24:42.980
And so then it will delete that bookmark.

387
00:24:42.980 --> 00:24:45.903
And so here, actually we need an else.

388
00:24:49.340 --> 00:24:54.340
Okay so that's the kind of sometimes difficult

389
00:24:55.042 --> 00:24:59.090
bugs to find, but I'm sure that with time,

390
00:24:59.090 --> 00:25:01.823
you will also be able to find all of these bug.

391
00:25:03.610 --> 00:25:07.743
So let's click on some recipe here, mark it as a bookmark.

392
00:25:08.760 --> 00:25:11.713
Then we go here to some other one mark that.

393
00:25:14.040 --> 00:25:17.620
Then here, that is still working and now let's click

394
00:25:17.620 --> 00:25:19.730
and see if it disappears.

395
00:25:19.730 --> 00:25:22.053
And yes, it does.

396
00:25:23.590 --> 00:25:27.030
Now do the same here, come back.

397
00:25:27.030 --> 00:25:28.563
And it is still unbookmarked.

398
00:25:32.030 --> 00:25:34.930
Well, all right.

399
00:25:34.930 --> 00:25:37.600
So with this, we have two core functionality

400
00:25:37.600 --> 00:25:41.880
of bookmarking actually already implemented.

401
00:25:41.880 --> 00:25:44.380
So great job once again.

402
00:25:44.380 --> 00:25:46.260
And now all that is missing

403
00:25:46.260 --> 00:25:49.390
is that we display all our bookmarks up here

404
00:25:49.390 --> 00:25:51.570
in this bookmarks panel.

405
00:25:51.570 --> 00:25:54.860
And that is a little bit more work than it might sound.

406
00:25:54.860 --> 00:25:57.713
And so that's leave that for our next video.

