WEBVTT

1
00:00:01.610 --> 00:00:04.420
<v Jonas>Let's now use the local storage API</v>

2
00:00:04.420 --> 00:00:06.500
in order to make the workout data

3
00:00:06.500 --> 00:00:09.453
persist across multiple page reloads.

4
00:00:11.440 --> 00:00:14.860
And let's start with a look at our flowchart

5
00:00:14.860 --> 00:00:18.093
so that we can see exactly what we have to implement.

6
00:00:19.092 --> 00:00:21.540
So basically the idea is that

7
00:00:21.540 --> 00:00:24.120
whenever a new workout is added,

8
00:00:24.120 --> 00:00:28.060
then all the workouts will be added to local storage.

9
00:00:28.060 --> 00:00:31.860
And so local storage is basically a place in the browser,

10
00:00:31.860 --> 00:00:34.740
where we can store data that will stay there

11
00:00:34.740 --> 00:00:37.120
even after we close the page.

12
00:00:37.120 --> 00:00:41.270
So basically the data is basically linked to the URL

13
00:00:41.270 --> 00:00:44.420
on which we are using the application.

14
00:00:44.420 --> 00:00:47.520
So, again whenever there is a new workout,

15
00:00:47.520 --> 00:00:50.170
we will take the entire workouts array

16
00:00:50.170 --> 00:00:52.540
and store it in local storage.

17
00:00:52.540 --> 00:00:54.950
And then whenever the page loads,

18
00:00:54.950 --> 00:00:56.790
so up here in this event,

19
00:00:56.790 --> 00:01:00.460
then we will load all the workouts from the local storage,

20
00:01:00.460 --> 00:01:04.270
and render them on the map and also on the list.

21
00:01:04.270 --> 00:01:08.760
So just like we do it when a user submits a new workout.

22
00:01:08.760 --> 00:01:11.410
And so like this, when you reload the page,

23
00:01:11.410 --> 00:01:12.480
it will then appear

24
00:01:12.480 --> 00:01:15.240
as if all the workouts you had previously

25
00:01:15.240 --> 00:01:17.690
are still in the same place.

26
00:01:17.690 --> 00:01:20.160
And hopefully this makes sense,

27
00:01:20.160 --> 00:01:22.370
and so let's now get started,

28
00:01:22.370 --> 00:01:25.590
and we will start with this part here.

29
00:01:25.590 --> 00:01:28.800
So storing all the workouts in local storage,

30
00:01:28.800 --> 00:01:30.370
and remember that happens

31
00:01:30.370 --> 00:01:33.700
whenever the user creates a new workout.

32
00:01:33.700 --> 00:01:38.700
And so we have to get started in the new workout method.

33
00:01:40.350 --> 00:01:43.783
So down here, we need to add yet another point.

34
00:01:46.150 --> 00:01:51.150
So set local storage to all workouts.

35
00:01:53.670 --> 00:01:56.850
And here I'm actually gonna create yet another method,

36
00:01:56.850 --> 00:01:59.123
so that we can keep this method here,

37
00:02:00.160 --> 00:02:02.050
basically nice and clean.

38
00:02:02.050 --> 00:02:05.200
So as you see, this new workout method here

39
00:02:05.200 --> 00:02:09.720
is basically a bit of a method that does delegation.

40
00:02:09.720 --> 00:02:12.140
So we do some stuff here, of course,

41
00:02:12.140 --> 00:02:15.143
but then once we're done creating the actual object,

42
00:02:16.080 --> 00:02:19.650
then down here, we delegate all kinds of functionality

43
00:02:19.650 --> 00:02:22.323
to other methods like these ones.

44
00:02:23.500 --> 00:02:26.447
And now I'll also create setLocalStorage.

45
00:02:30.045 --> 00:02:32.350
So here I'm of course calling it already,

46
00:02:32.350 --> 00:02:34.803
but now I will create it afterwards.

47
00:02:36.050 --> 00:02:39.060
So setLocalStorage and once again,

48
00:02:39.060 --> 00:02:40.543
let's add it here at the end.

49
00:02:43.350 --> 00:02:45.700
And this one doesn't need any parameters

50
00:02:45.700 --> 00:02:48.210
because we will simply get the workouts

51
00:02:48.210 --> 00:02:51.070
from the workout property.

52
00:02:51.070 --> 00:02:55.050
And so this is how we use the local storage API.

53
00:02:55.050 --> 00:02:58.940
And I say API because local storage is, once again,

54
00:02:58.940 --> 00:03:01.630
an API that the browser provides for us

55
00:03:01.630 --> 00:03:03.660
and that we can use.

56
00:03:03.660 --> 00:03:07.690
So localStorage.setItem,

57
00:03:07.690 --> 00:03:12.690
and then we have to give it a name, so workouts,

58
00:03:12.987 --> 00:03:14.880
and then the second argument

59
00:03:14.880 --> 00:03:17.220
needs to be a string that we want to store

60
00:03:17.220 --> 00:03:20.730
and which will be associated with this key here.

61
00:03:20.730 --> 00:03:25.120
So basically local storage is a simple key value store,

62
00:03:25.120 --> 00:03:27.590
and so we need a key which is this one here,

63
00:03:27.590 --> 00:03:29.200
and we need a simple value,

64
00:03:29.200 --> 00:03:31.590
which must also be a string.

65
00:03:31.590 --> 00:03:34.400
But we can convert an object to a string

66
00:03:34.400 --> 00:03:36.270
by doing this.

67
00:03:36.270 --> 00:03:40.400
So JSON.stringify.

68
00:03:40.400 --> 00:03:43.670
So this is another new one, all right.

69
00:03:43.670 --> 00:03:45.700
But we can use this method here

70
00:03:45.700 --> 00:03:50.510
to convert any object in JavaScript to a string.

71
00:03:50.510 --> 00:03:52.070
And so what we want to convert

72
00:03:52.070 --> 00:03:57.070
is this.workouts, like this.

73
00:03:58.530 --> 00:04:00.600
And that's actually it already.

74
00:04:00.600 --> 00:04:04.930
With this, we are setting all the workouts to local storage.

75
00:04:04.930 --> 00:04:07.870
Now, I just want to mention that local storage

76
00:04:07.870 --> 00:04:10.120
is a very simple API.

77
00:04:10.120 --> 00:04:12.540
And so it is only advised to use

78
00:04:12.540 --> 00:04:15.830
for small amounts of data, all right.

79
00:04:15.830 --> 00:04:19.420
That's because local storage is blocking,

80
00:04:19.420 --> 00:04:23.050
and for now you don't know what blocking actually means

81
00:04:23.050 --> 00:04:25.550
but it is something that's very bad,

82
00:04:25.550 --> 00:04:27.330
and we will learn why that is

83
00:04:27.330 --> 00:04:29.290
actually in the next section.

84
00:04:29.290 --> 00:04:31.600
But for now, what matters here is

85
00:04:31.600 --> 00:04:33.780
that you shouldn't use local storage

86
00:04:33.780 --> 00:04:35.980
to store large amounts of data,

87
00:04:35.980 --> 00:04:39.453
because that will surely slow down your application.

88
00:04:40.700 --> 00:04:43.590
But anyway, let's already test this out,

89
00:04:43.590 --> 00:04:45.370
because we actually have a way

90
00:04:45.370 --> 00:04:47.293
of seeing this data in the browser.

91
00:04:50.510 --> 00:04:52.393
So let's add something here.

92
00:04:54.700 --> 00:04:56.160
Okay.

93
00:04:56.160 --> 00:04:58.580
So everything worked fine.

94
00:04:58.580 --> 00:05:01.560
So now let's go here to this application tab,

95
00:05:01.560 --> 00:05:03.310
and then here on the left side

96
00:05:03.310 --> 00:05:08.220
you have this local storage tab, all right.

97
00:05:08.220 --> 00:05:10.963
And if we click this arrow here, and then here,

98
00:05:13.090 --> 00:05:16.390
well, then actually it should be here already.

99
00:05:16.390 --> 00:05:20.410
Well, let's see if we have everything correctly set up.

100
00:05:20.410 --> 00:05:23.910
So we have setLocalStorage, then setItem

101
00:05:23.910 --> 00:05:27.330
and here everything looks correct.

102
00:05:27.330 --> 00:05:30.373
And here, I believe we're also correctly calling it,

103
00:05:32.504 --> 00:05:34.400
setLocalStorage.

104
00:05:34.400 --> 00:05:35.680
So this should work.

105
00:05:35.680 --> 00:05:37.623
So let's simply try it again here.

106
00:05:39.547 --> 00:05:40.834
(clicking)

107
00:05:40.834 --> 00:05:42.830
(typing)
Okay.

108
00:05:42.830 --> 00:05:46.410
Ah, and now you saw it appearing here, right.

109
00:05:46.410 --> 00:05:49.770
So we have the key of workout and then the value.

110
00:05:49.770 --> 00:05:53.133
And the value is basically now this string here.

111
00:05:54.030 --> 00:05:56.970
So, actually here it looks like an object,

112
00:05:56.970 --> 00:05:58.710
because apparently JavaScript

113
00:05:58.710 --> 00:06:01.360
somehow then converts it back to an object,

114
00:06:01.360 --> 00:06:04.210
but actually it is stored as a string,

115
00:06:04.210 --> 00:06:05.973
here in this workouts key.

116
00:06:07.400 --> 00:06:09.853
So you see that we have this single workout

117
00:06:09.853 --> 00:06:11.410
that we currently have,

118
00:06:11.410 --> 00:06:13.383
but of course, if we add another one,

119
00:06:16.030 --> 00:06:19.590
then now we got this bigger string here.

120
00:06:19.590 --> 00:06:23.220
And so it now contains these two objects.

121
00:06:23.220 --> 00:06:26.460
And so like this, the local storage

122
00:06:26.460 --> 00:06:29.150
always is gonna be updated.

123
00:06:29.150 --> 00:06:32.080
So it's up to date, according to the data

124
00:06:32.080 --> 00:06:33.853
that we have in our application.

125
00:06:34.720 --> 00:06:35.600
Great.

126
00:06:35.600 --> 00:06:37.060
And now all we have to do

127
00:06:37.060 --> 00:06:39.650
is to then actually show the data back here

128
00:06:39.650 --> 00:06:42.863
on the list and the map once we reload the page.

129
00:06:43.720 --> 00:06:45.660
So let me actually show that to you

130
00:06:45.660 --> 00:06:48.030
because here in the application,

131
00:06:48.030 --> 00:06:50.883
as you see the local storage is still there.

132
00:06:51.940 --> 00:06:55.390
And so now we will make use of this

133
00:06:55.390 --> 00:06:59.083
by then displaying that data back in our application.

134
00:07:00.670 --> 00:07:03.053
So remember when we want to do that,

135
00:07:03.950 --> 00:07:07.620
it is right here in the constructor, right.

136
00:07:07.620 --> 00:07:09.840
Because this is where we have all the code

137
00:07:09.840 --> 00:07:13.123
that is executed right when the application loads.

138
00:07:14.530 --> 00:07:16.003
So let's add that here.

139
00:07:17.120 --> 00:07:19.609
And I'm gonna start with some comments here.

140
00:07:19.609 --> 00:07:21.590
(typing)

141
00:07:21.590 --> 00:07:22.423
Handlers,

142
00:07:23.330 --> 00:07:28.330
then get user's position,

143
00:07:30.010 --> 00:07:34.810
and then get data from local storage.

144
00:07:36.710 --> 00:07:37.543
And so again,

145
00:07:37.543 --> 00:07:42.350
I will now call a method that I'm going to create later.

146
00:07:42.350 --> 00:07:44.117
So getLocalStorage.

147
00:07:48.170 --> 00:07:51.690
And so let's now go ahead and create this method

148
00:07:51.690 --> 00:07:52.873
down here in the end.

149
00:07:55.115 --> 00:07:59.710
(clicking)
(typing)

150
00:07:59.710 --> 00:08:02.410
And so now, here we do the opposite.

151
00:08:02.410 --> 00:08:04.863
So localStorage.getItem.

152
00:08:06.730 --> 00:08:09.633
And now we simply have to pass in the key.

153
00:08:10.720 --> 00:08:14.960
So basically the identifier of our local storage item,

154
00:08:14.960 --> 00:08:17.500
because we could set multiple items.

155
00:08:17.500 --> 00:08:20.670
So we could set everything all for application.

156
00:08:20.670 --> 00:08:22.360
So for example, if we wanted,

157
00:08:22.360 --> 00:08:25.000
we could store everything that's in the application

158
00:08:25.000 --> 00:08:26.680
in local storage.

159
00:08:26.680 --> 00:08:30.350
We would just have to define one key for each of them,

160
00:08:30.350 --> 00:08:32.430
and then we could use that key

161
00:08:32.430 --> 00:08:34.433
to basically retrieve it back.

162
00:08:35.326 --> 00:08:38.840
(clicking)
(typing)

163
00:08:38.840 --> 00:08:41.563
Alright, so let's now store this data.

164
00:08:42.550 --> 00:08:45.683
And so here, we can then see it for the first time.

165
00:08:46.730 --> 00:08:48.350
So now as the page loads,

166
00:08:48.350 --> 00:08:51.000
it should display this data to us

167
00:08:51.000 --> 00:08:51.993
in the console.

168
00:08:54.800 --> 00:08:58.573
And, well, it's nowhere to be found.

169
00:09:00.100 --> 00:09:01.833
Let's reload here maybe again.

170
00:09:03.540 --> 00:09:05.700
So something must be wrong, now,

171
00:09:05.700 --> 00:09:07.153
and it's called workouts.

172
00:09:09.350 --> 00:09:13.240
And here you go, all right.

173
00:09:13.240 --> 00:09:17.000
So you see that indeed, it is this big string.

174
00:09:17.000 --> 00:09:19.440
And so now we want to convert this string

175
00:09:19.440 --> 00:09:21.690
back to the objects.

176
00:09:21.690 --> 00:09:24.310
And so, basically we need to use the opposite

177
00:09:24.310 --> 00:09:28.513
of JSON.stringify which is JSON.parse.

178
00:09:33.070 --> 00:09:35.610
So let's try that again.

179
00:09:35.610 --> 00:09:38.100
And now indeed we get an array

180
00:09:38.100 --> 00:09:42.580
with some real objects in there, all right.

181
00:09:42.580 --> 00:09:44.830
Now there's still a problem with this,

182
00:09:44.830 --> 00:09:47.480
but more about that a little bit later,

183
00:09:47.480 --> 00:09:49.180
because all the relevant data

184
00:09:49.180 --> 00:09:51.833
that we need for now is actually in there.

185
00:09:53.230 --> 00:09:56.330
So now let's do something with that data.

186
00:09:56.330 --> 00:09:58.570
And the first thing that we should actually do

187
00:09:58.570 --> 00:10:02.440
is to check if there is actually some data.

188
00:10:02.440 --> 00:10:04.820
So when there is nothing in local storage,

189
00:10:04.820 --> 00:10:09.230
then of course the data will be, like undefined.

190
00:10:09.230 --> 00:10:11.903
So in that case, we don't want to do anything.

191
00:10:12.960 --> 00:10:16.760
So let's use another guard clause here and say,

192
00:10:16.760 --> 00:10:19.493
if there is no data then simply return.

193
00:10:21.190 --> 00:10:24.020
But anyway, let's keep going.

194
00:10:24.020 --> 00:10:26.990
And so what we want to do with this data,

195
00:10:26.990 --> 00:10:29.900
which is basically our array of workouts,

196
00:10:29.900 --> 00:10:33.160
is to restore our workouts array.

197
00:10:33.160 --> 00:10:38.140
So we can say, this.workouts

198
00:10:38.140 --> 00:10:41.223
should be equal to the data that we just read.

199
00:10:42.630 --> 00:10:45.030
So, keep in mind that this method here

200
00:10:45.030 --> 00:10:48.600
is gonna be executed right in the very beginning.

201
00:10:48.600 --> 00:10:50.600
And so at that point,

202
00:10:50.600 --> 00:10:53.520
the workouts array is always gonna be empty.

203
00:10:53.520 --> 00:10:56.800
But if we already had some data in the local storage,

204
00:10:56.800 --> 00:11:00.060
then, we will simply set that workouts array

205
00:11:00.060 --> 00:11:02.780
to the data that we had before.

206
00:11:02.780 --> 00:11:05.680
And so essentially we are restoring the data here

207
00:11:05.680 --> 00:11:09.330
across multiple reloads of the page.

208
00:11:09.330 --> 00:11:12.650
Okay, and so now let's take all these workouts

209
00:11:12.650 --> 00:11:14.503
and render them in the list.

210
00:11:16.500 --> 00:11:19.053
So this.workouts,

211
00:11:20.300 --> 00:11:21.810
and so we want to do something

212
00:11:21.810 --> 00:11:23.453
for each of the workouts.

213
00:11:24.860 --> 00:11:27.110
And so we loop over this array,

214
00:11:27.110 --> 00:11:29.100
but we don't want to create a new array.

215
00:11:29.100 --> 00:11:31.543
And so forEach is perfect for this.

216
00:11:32.796 --> 00:11:35.933
Then now, I'm gonna call each of them work.

217
00:11:37.620 --> 00:11:40.847
And so, now I can do this.renderWorkout

218
00:11:43.190 --> 00:11:44.623
the current workout.

219
00:11:45.930 --> 00:11:49.150
And so now it becomes really, really helpful

220
00:11:49.150 --> 00:11:50.540
that we have all the logic

221
00:11:50.540 --> 00:11:54.020
of rendering a workout in the sidebar

222
00:11:54.020 --> 00:11:58.090
here nicely inside of this method, right.

223
00:11:58.090 --> 00:12:01.550
Because, imagine that we had all this code here,

224
00:12:01.550 --> 00:12:05.683
inside of this method here,

225
00:12:06.630 --> 00:12:11.170
so the new workout method, right.

226
00:12:11.170 --> 00:12:13.370
So if we did all of that here,

227
00:12:13.370 --> 00:12:15.840
then now we would have to copy that code

228
00:12:15.840 --> 00:12:17.970
or we would have to refactor it.

229
00:12:17.970 --> 00:12:21.140
But instead, you can start to get into the habit

230
00:12:21.140 --> 00:12:24.630
of exporting functionality into its own methods

231
00:12:24.630 --> 00:12:26.180
or its own functions.

232
00:12:26.180 --> 00:12:29.210
And so then it is very easy to reuse them,

233
00:12:29.210 --> 00:12:32.110
such as we are doing now with renderWorkout.

234
00:12:33.970 --> 00:12:34.803
Right.

235
00:12:34.803 --> 00:12:37.210
So here, all we do is to call renderWorkout

236
00:12:38.830 --> 00:12:41.320
that we already had written before.

237
00:12:41.320 --> 00:12:42.930
So let's now test this,

238
00:12:42.930 --> 00:12:44.170
and right now,

239
00:12:44.170 --> 00:12:47.920
we should already get the two workouts there,

240
00:12:47.920 --> 00:12:50.870
and indeed, here they are.

241
00:12:50.870 --> 00:12:54.550
So these are the two ones that we had created previously.

242
00:12:54.550 --> 00:12:58.683
And so we see that it did indeed now persist across loads.

243
00:12:59.620 --> 00:13:03.130
Now, we also need to add them here on the map.

244
00:13:03.130 --> 00:13:03.963
And so for that,

245
00:13:03.963 --> 00:13:07.483
we are going to use our renderWorkout marker method

246
00:13:07.483 --> 00:13:09.223
that we also already have.

247
00:13:10.435 --> 00:13:13.283
And let's start by actually putting it here,

248
00:13:14.670 --> 00:13:16.400
just so I can show you

249
00:13:16.400 --> 00:13:18.703
that it's actually not gonna work.

250
00:13:19.550 --> 00:13:22.330
But then it becomes easier to explain

251
00:13:22.330 --> 00:13:23.663
why it doesn't work.

252
00:13:24.660 --> 00:13:25.593
So let's see.

253
00:13:27.290 --> 00:13:28.807
And so here we get,

254
00:13:28.807 --> 00:13:32.970
"Cannot read property 'addlayer' of undefined."

255
00:13:32.970 --> 00:13:34.600
So indeed, we get an error

256
00:13:34.600 --> 00:13:37.350
when we try to add this first workout

257
00:13:37.350 --> 00:13:38.423
also to the map.

258
00:13:39.370 --> 00:13:42.360
So let's go back and think why that is.

259
00:13:42.360 --> 00:13:45.260
Well, once again, remember that this method here

260
00:13:45.260 --> 00:13:47.980
is executed right at the beginning,

261
00:13:47.980 --> 00:13:50.070
so right after the page loaded.

262
00:13:50.070 --> 00:13:53.340
And so we are trying to add this marker to the map

263
00:13:53.340 --> 00:13:55.160
right at the beginning.

264
00:13:55.160 --> 00:13:56.950
However, at this point,

265
00:13:56.950 --> 00:14:00.020
the map has actually not yet been loaded.

266
00:14:00.020 --> 00:14:01.130
And so essentially,

267
00:14:01.130 --> 00:14:04.730
we are trying to add a marker,

268
00:14:04.730 --> 00:14:07.423
let's say where that is.

269
00:14:09.230 --> 00:14:12.520
So we are trying to add this marker to the map,

270
00:14:12.520 --> 00:14:13.890
which is this one here,

271
00:14:13.890 --> 00:14:17.040
which isn't yet defined at this point.

272
00:14:17.040 --> 00:14:20.080
And so once again, this is a first glimpse

273
00:14:20.080 --> 00:14:22.970
into the nature of asynchronous JavaScript,

274
00:14:22.970 --> 00:14:26.140
which we will talk about in the next section.

275
00:14:26.140 --> 00:14:29.730
But what matters here is that you grasp this idea

276
00:14:29.730 --> 00:14:32.370
that the map is not yet created

277
00:14:32.370 --> 00:14:33.670
right at the beginning

278
00:14:33.670 --> 00:14:36.940
when the application is first loaded, right.

279
00:14:36.940 --> 00:14:38.670
It takes some time.

280
00:14:38.670 --> 00:14:41.310
So, first the position of the user

281
00:14:41.310 --> 00:14:46.260
needs to beget using geolocation,

282
00:14:46.260 --> 00:14:47.840
so this one here.

283
00:14:47.840 --> 00:14:48.900
And then after that,

284
00:14:48.900 --> 00:14:51.350
the map has also to be loaded.

285
00:14:51.350 --> 00:14:53.950
So there's a lot of stuff that has to happen

286
00:14:53.950 --> 00:14:58.390
before we can actually render any markers on the map.

287
00:14:58.390 --> 00:15:01.270
So instead of trying to render the markers,

288
00:15:01.270 --> 00:15:03.030
right at the very beginning,

289
00:15:03.030 --> 00:15:04.720
we should only do that

290
00:15:04.720 --> 00:15:06.920
once the map has been loaded.

291
00:15:06.920 --> 00:15:09.600
And so we can put that logic

292
00:15:09.600 --> 00:15:14.020
right here in this method of load map, okay.

293
00:15:14.020 --> 00:15:16.003
So here at the very end, basically.

294
00:15:16.890 --> 00:15:19.023
So let's get the code from down here.

295
00:15:21.100 --> 00:15:23.910
So I will get all of this,

296
00:15:23.910 --> 00:15:27.063
but I will then only keep this part, all right.

297
00:15:28.250 --> 00:15:30.080
So let's copy this.

298
00:15:30.080 --> 00:15:34.030
And so here we will not render the markers,

299
00:15:34.030 --> 00:15:36.863
so only the workout on the sidebar list.

300
00:15:37.700 --> 00:15:39.153
And then it is here.

301
00:15:41.180 --> 00:15:45.680
So, yeah.

302
00:15:45.680 --> 00:15:47.120
Right here in load map,

303
00:15:47.120 --> 00:15:50.910
this is where we will then render the markers,

304
00:15:50.910 --> 00:15:53.100
because at this point,

305
00:15:53.100 --> 00:15:56.020
the map is, of course, already available.

306
00:15:56.020 --> 00:16:00.290
And so with this, it should be working, okay.

307
00:16:00.290 --> 00:16:02.460
But make sure that you really understand

308
00:16:02.460 --> 00:16:05.410
why we have to call this method here

309
00:16:05.410 --> 00:16:07.720
and not right in the beginning.

310
00:16:07.720 --> 00:16:11.940
So, let's see what happens now,

311
00:16:11.940 --> 00:16:15.750
and we didn't get any error and yeah.

312
00:16:15.750 --> 00:16:17.840
So now we have the two markers

313
00:16:17.840 --> 00:16:19.913
right where I had put them previously.

314
00:16:21.150 --> 00:16:24.673
And now let's just add another one right here.

315
00:16:29.680 --> 00:16:30.513
All right.

316
00:16:30.513 --> 00:16:32.163
And now if I reload the page,

317
00:16:34.600 --> 00:16:37.770
then indeed, there is the marker,

318
00:16:37.770 --> 00:16:40.633
and this one and, of course, all the other ones as well.

319
00:16:41.530 --> 00:16:42.660
Beautiful.

320
00:16:42.660 --> 00:16:44.113
So this is great.

321
00:16:45.230 --> 00:16:48.690
And our application is now essentially finished.

322
00:16:48.690 --> 00:16:51.413
I just want to show you one problem that we have now.

323
00:16:52.440 --> 00:16:54.493
And that has to do with local storage.

324
00:16:55.450 --> 00:16:57.780
So, remember that when I click here

325
00:16:57.780 --> 00:16:59.580
on one of these workouts,

326
00:16:59.580 --> 00:17:02.030
it will move the map to the workout,

327
00:17:02.030 --> 00:17:04.030
and so that's gonna be fine,

328
00:17:04.030 --> 00:17:07.530
but what also happens is that this clicks property

329
00:17:07.530 --> 00:17:10.653
is gonna be increased by using the click method

330
00:17:10.653 --> 00:17:14.210
that is inherited from the workout class.

331
00:17:14.210 --> 00:17:17.113
But watch what happens now as I try to do that.

332
00:17:19.340 --> 00:17:23.363
And so we get workout.click is not a function.

333
00:17:24.620 --> 00:17:26.793
So, why do you think that is?

334
00:17:27.780 --> 00:17:30.880
Well, let's try to take a look at the objects

335
00:17:30.880 --> 00:17:33.840
that we get back from local storage.

336
00:17:33.840 --> 00:17:35.253
So that's this one here.

337
00:17:36.170 --> 00:17:37.250
And I know that right now

338
00:17:37.250 --> 00:17:39.850
we have a ton of console.logs here,

339
00:17:39.850 --> 00:17:42.000
so we should get rid of them at some point,

340
00:17:42.870 --> 00:17:45.230
but anyway, for now let's take a look

341
00:17:45.230 --> 00:17:48.540
at the objects that we basically have right now.

342
00:17:48.540 --> 00:17:51.090
And so this is currently also the data

343
00:17:51.090 --> 00:17:54.483
that is in this .workouts, right?

344
00:17:55.380 --> 00:17:57.730
Now, if we take a look at this,

345
00:17:57.730 --> 00:17:59.940
then here everything works okay.

346
00:17:59.940 --> 00:18:03.160
But now if we take a look at the prototype chain,

347
00:18:03.160 --> 00:18:06.540
you see that now it's no longer an object

348
00:18:06.540 --> 00:18:08.230
of the type of running,

349
00:18:08.230 --> 00:18:12.120
and also not of the type of workout, right.

350
00:18:12.120 --> 00:18:15.793
So the entire prototype chain that we had before is gone.

351
00:18:16.840 --> 00:18:20.910
So contrast that to one of these objects.

352
00:18:20.910 --> 00:18:23.510
So again, the data is fine,

353
00:18:23.510 --> 00:18:28.200
but here, we actually have the prototype with calcPace,

354
00:18:28.200 --> 00:18:31.890
and then that has the click entities,

355
00:18:31.890 --> 00:18:36.833
that description methods in the workout prototype, right.

356
00:18:38.290 --> 00:18:41.200
So, the problem here is that basically,

357
00:18:41.200 --> 00:18:44.350
when we converted our objects to a string,

358
00:18:44.350 --> 00:18:47.140
and then back from the string to objects,

359
00:18:47.140 --> 00:18:49.590
we lost the prototype chain.

360
00:18:49.590 --> 00:18:51.453
And so these new objects here

361
00:18:51.453 --> 00:18:54.640
that we recovered from the local storage

362
00:18:54.640 --> 00:18:57.210
are now just regular objects.

363
00:18:57.210 --> 00:18:59.160
They are now no longer objects

364
00:18:59.160 --> 00:19:01.000
that were created by the running

365
00:19:01.000 --> 00:19:03.020
or by the cycling class.

366
00:19:03.020 --> 00:19:04.010
And so therefore,

367
00:19:04.010 --> 00:19:05.990
they will not be able to inherit

368
00:19:05.990 --> 00:19:08.050
any of their methods.

369
00:19:08.050 --> 00:19:09.347
And so in the end,

370
00:19:09.347 --> 00:19:12.320
that's the reason why workout.click

371
00:19:12.320 --> 00:19:14.760
is now not a function anymore.

372
00:19:14.760 --> 00:19:18.470
So, again, because the object now no longer has it

373
00:19:18.470 --> 00:19:19.573
in its prototype.

374
00:19:20.520 --> 00:19:23.300
So you see that this is just the regular methods

375
00:19:23.300 --> 00:19:26.963
that are available on any object, all right.

376
00:19:27.860 --> 00:19:29.680
So this can be a big problem

377
00:19:29.680 --> 00:19:31.730
when you work with local storage

378
00:19:31.730 --> 00:19:33.890
and object oriented programming

379
00:19:33.890 --> 00:19:35.750
like we are doing here.

380
00:19:35.750 --> 00:19:38.340
Now to fix this problem, we could go ahead

381
00:19:38.340 --> 00:19:41.663
and restore the object right here.

382
00:19:43.840 --> 00:19:47.123
So, in our getLocalStorage,

383
00:19:48.090 --> 00:19:51.560
we could now loop over this data here,

384
00:19:51.560 --> 00:19:53.680
and then restore the objects

385
00:19:53.680 --> 00:19:57.030
by creating a new object using the class,

386
00:19:57.030 --> 00:20:01.130
based on the data that is coming here from local storage.

387
00:20:01.130 --> 00:20:02.990
But that's a little bit of work

388
00:20:02.990 --> 00:20:05.350
and so we're not gonna do that here.

389
00:20:05.350 --> 00:20:07.840
And so instead what I will do

390
00:20:07.840 --> 00:20:10.350
is to simply disable the functionality

391
00:20:10.350 --> 00:20:12.400
of counting the clicks.

392
00:20:12.400 --> 00:20:16.560
So remember that when I first introduced this method here,

393
00:20:16.560 --> 00:20:19.270
I told you that one of the reasons for it

394
00:20:19.270 --> 00:20:21.530
is that I also wanted to show you something

395
00:20:21.530 --> 00:20:23.130
in the next lecture.

396
00:20:23.130 --> 00:20:24.720
And so that's exactly here,

397
00:20:24.720 --> 00:20:26.560
what I wanted to show you.

398
00:20:26.560 --> 00:20:30.130
So basically, that objects coming from local storage

399
00:20:30.130 --> 00:20:32.240
will not inherit all the methods

400
00:20:32.240 --> 00:20:33.990
that they did before.

401
00:20:33.990 --> 00:20:35.200
All right.

402
00:20:35.200 --> 00:20:37.850
And so with that, we are basically done.

403
00:20:37.850 --> 00:20:42.273
Let's just get rid of some of these console.logs here,

404
00:20:44.890 --> 00:20:47.400
because it's not really a good practice

405
00:20:47.400 --> 00:20:50.563
to have them in the final code.

406
00:20:52.770 --> 00:20:55.860
So we can have maybe one while we're developing,

407
00:20:55.860 --> 00:20:59.273
but then at some point it simply clutters,

408
00:21:01.330 --> 00:21:03.720
like our entire console workout.

409
00:21:03.720 --> 00:21:05.103
And so that's not helpful.

410
00:21:06.120 --> 00:21:07.393
And here again.

411
00:21:10.740 --> 00:21:11.830
And you see that here

412
00:21:11.830 --> 00:21:14.593
we still have all of these workouts, of course.

413
00:21:15.470 --> 00:21:17.000
Now actually to finish,

414
00:21:17.000 --> 00:21:19.660
I want to create a quick and easy way

415
00:21:19.660 --> 00:21:23.130
to delete all of these workouts at once,

416
00:21:23.130 --> 00:21:25.093
at least from local storage.

417
00:21:26.020 --> 00:21:28.703
And so let's go back here,

418
00:21:30.090 --> 00:21:32.880
and basically add a method

419
00:21:32.880 --> 00:21:36.220
to the public interface of this class

420
00:21:36.220 --> 00:21:37.910
for the first time.

421
00:21:37.910 --> 00:21:39.960
So this class is a little bit unusual,

422
00:21:39.960 --> 00:21:43.100
because right now, we don't have any public method.

423
00:21:43.100 --> 00:21:45.310
So there's no public interface.

424
00:21:45.310 --> 00:21:49.760
But now we will create a reset method here,

425
00:21:49.760 --> 00:21:52.030
which we can then use out here

426
00:21:52.030 --> 00:21:54.130
or even in the console.

427
00:21:54.130 --> 00:21:56.450
And so, actually that's what we will do,

428
00:21:56.450 --> 00:21:58.540
so using it in a console.

429
00:21:58.540 --> 00:22:00.550
So what I want to do in this one here

430
00:22:00.550 --> 00:22:04.500
is to basically remove this workouts item

431
00:22:04.500 --> 00:22:06.560
from local storage.

432
00:22:06.560 --> 00:22:09.970
And so besides setting and getting items,

433
00:22:09.970 --> 00:22:13.773
we can also remove items based on the key.

434
00:22:17.060 --> 00:22:17.893
All right.

435
00:22:17.893 --> 00:22:20.060
And with this we removed our workouts

436
00:22:20.060 --> 00:22:22.070
from the local storage,

437
00:22:22.070 --> 00:22:25.790
and now we can then reload the page programmatically.

438
00:22:25.790 --> 00:22:29.250
And so then the application will look completely empty.

439
00:22:29.250 --> 00:22:33.607
And we can do this with location.reload.

440
00:22:36.280 --> 00:22:40.060
And location is basically a big object

441
00:22:40.060 --> 00:22:41.810
that contains a lot of methods

442
00:22:41.810 --> 00:22:44.180
and properties in the browser.

443
00:22:44.180 --> 00:22:45.570
And so one of the methods

444
00:22:45.570 --> 00:22:48.023
is the ability to reload the page.

445
00:22:49.080 --> 00:22:51.453
So, let's try that now.

446
00:22:52.390 --> 00:22:55.160
And as I said, I will do that in the console.

447
00:22:55.160 --> 00:22:57.240
So let's go actually back to our code

448
00:22:57.240 --> 00:22:59.073
just to see where we can use it.

449
00:23:00.140 --> 00:23:03.300
So, we are creating the app object

450
00:23:03.300 --> 00:23:06.880
and then storing it in app, right.

451
00:23:06.880 --> 00:23:10.220
And so we have access to this variable here,

452
00:23:10.220 --> 00:23:12.300
of course, in the console.

453
00:23:12.300 --> 00:23:14.713
So let's take a look at that actually.

454
00:23:16.800 --> 00:23:18.700
And you'll see that indeed,

455
00:23:18.700 --> 00:23:23.560
here we have these private fields,

456
00:23:23.560 --> 00:23:25.930
and then we have all of these methods here

457
00:23:25.930 --> 00:23:27.790
in the prototype.

458
00:23:27.790 --> 00:23:29.883
And so one of them is of course, reset.

459
00:23:30.740 --> 00:23:34.400
And so let's do that.

460
00:23:34.400 --> 00:23:35.713
So reset.

461
00:23:36.820 --> 00:23:38.713
And yeah, it worked.

462
00:23:39.550 --> 00:23:42.610
So our application is back to being empty now

463
00:23:42.610 --> 00:23:45.670
so that we can add some more realistic data

464
00:23:45.670 --> 00:23:46.883
if we wanted to.

465
00:23:49.024 --> 00:23:50.220
(typing)

466
00:23:50.220 --> 00:23:52.140
For example like this,

467
00:23:52.140 --> 00:23:54.660
or maybe we went cycling right here,

468
00:23:54.660 --> 00:23:56.543
which is a really nice location.

469
00:23:57.970 --> 00:24:01.210
And here, let's say we took two hours

470
00:24:01.210 --> 00:24:05.000
and gained 500 meters, all right.

471
00:24:05.000 --> 00:24:05.833
And now, of course,

472
00:24:05.833 --> 00:24:08.220
everything is back to working here

473
00:24:08.220 --> 00:24:11.630
because we got rid of that click method.

474
00:24:11.630 --> 00:24:14.230
We still have some logins here to the console,

475
00:24:14.230 --> 00:24:17.430
but, never mind, that's not a problem.

476
00:24:17.430 --> 00:24:18.770
All right.

477
00:24:18.770 --> 00:24:20.020
But what matters here

478
00:24:20.020 --> 00:24:23.160
is that our application is now feature complete.

479
00:24:23.160 --> 00:24:26.233
We implemented everything from our flowchart.

480
00:24:28.592 --> 00:24:29.470
Right.

481
00:24:29.470 --> 00:24:31.290
So everything is done here.

482
00:24:31.290 --> 00:24:34.070
And so at this point, the final architecture

483
00:24:34.070 --> 00:24:38.140
of our application looks like this.

484
00:24:38.140 --> 00:24:40.500
So I have all of the methods here

485
00:24:40.500 --> 00:24:43.730
that we implemented in the app class,

486
00:24:43.730 --> 00:24:47.890
and also for workout, running and cycling.

487
00:24:47.890 --> 00:24:50.140
Now, I'm not gonna go over this here now,

488
00:24:50.140 --> 00:24:51.450
but it's a good idea

489
00:24:51.450 --> 00:24:53.500
for you to actually check it out,

490
00:24:53.500 --> 00:24:55.230
to get a really good idea

491
00:24:55.230 --> 00:24:56.670
of how the different methods

492
00:24:56.670 --> 00:24:59.500
call each other in our application.

493
00:24:59.500 --> 00:25:01.360
So this arrows that you see here

494
00:25:01.360 --> 00:25:04.113
are basically methods calling other methods.

495
00:25:04.990 --> 00:25:05.850
All right.

496
00:25:05.850 --> 00:25:08.680
And that's it, that's our application,

497
00:25:08.680 --> 00:25:10.060
I hope that you liked it

498
00:25:10.060 --> 00:25:13.770
and that you had as much fun as I had building it.

499
00:25:13.770 --> 00:25:16.190
So this was a really great experience,

500
00:25:16.190 --> 00:25:18.780
and now before we actually finish the section,

501
00:25:18.780 --> 00:25:21.170
let's have one more final lecture,

502
00:25:21.170 --> 00:25:23.220
where I will give you some suggestions

503
00:25:23.220 --> 00:25:26.610
of how to improve this application even more.

504
00:25:26.610 --> 00:25:28.393
So let's go there right now.

