1
00:00:01,130 --> 00:00:03,700
<v Instructor>Welcome back to the next feature</v>

2
00:00:03,700 --> 00:00:06,080
of the Forkify Application

3
00:00:06,080 --> 00:00:08,783
and this one is going to be Pagination.

4
00:00:10,280 --> 00:00:13,260
So lets take a look at our current implementation

5
00:00:13,260 --> 00:00:17,850
of the search to get an idea what the problem is.

6
00:00:17,850 --> 00:00:22,270
So you see we have 59 results for pizza

7
00:00:22,270 --> 00:00:25,510
but now all of these results are displayed here,

8
00:00:25,510 --> 00:00:27,562
basically at once.

9
00:00:27,562 --> 00:00:28,600
Right?

10
00:00:28,600 --> 00:00:31,710
And so this is not user friendly at all.

11
00:00:31,710 --> 00:00:35,370
So and a final demo application,

12
00:00:35,370 --> 00:00:38,320
we only have 10 results on this page

13
00:00:38,320 --> 00:00:40,610
and then we can go to the next page

14
00:00:40,610 --> 00:00:44,080
and basically get the next 10 results.

15
00:00:44,080 --> 00:00:47,570
And so that's what we want to do right now

16
00:00:47,570 --> 00:00:49,910
in our application as well.

17
00:00:49,910 --> 00:00:53,180
Now, this problem is actually harder to solve

18
00:00:53,180 --> 00:00:55,090
than it might seem like

19
00:00:55,090 --> 00:00:58,580
but I'm sure that together we can do it.

20
00:00:58,580 --> 00:01:01,433
So let's think about what we have to do here.

21
00:01:02,530 --> 00:01:06,400
So remember that it is the control search results function

22
00:01:06,400 --> 00:01:08,660
that is responsible for rendering

23
00:01:08,660 --> 00:01:10,533
the search results right here.

24
00:01:11,470 --> 00:01:13,810
And currently, we are simply rendering

25
00:01:13,810 --> 00:01:16,830
all the search results like this.

26
00:01:16,830 --> 00:01:19,530
However, in the first page, we only want

27
00:01:19,530 --> 00:01:23,103
to render 10 results and not all of the results.

28
00:01:24,150 --> 00:01:24,983
Right?

29
00:01:24,983 --> 00:01:27,140
And then if we're on page one,

30
00:01:27,140 --> 00:01:30,580
we want to render the second 10 results.

31
00:01:30,580 --> 00:01:34,400
So from result 11 to result 20.

32
00:01:34,400 --> 00:01:38,060
And so let's basically create a function in our model

33
00:01:38,060 --> 00:01:41,340
which will take in the page that we want to render

34
00:01:41,340 --> 00:01:44,410
and which will then only return the results

35
00:01:44,410 --> 00:01:47,483
that we actually want to render for that page.

36
00:01:49,250 --> 00:01:50,083
Okay?

37
00:01:51,210 --> 00:01:53,393
And that's actually not so difficult.

38
00:01:54,930 --> 00:01:57,730
So let's create a new function here

39
00:01:57,730 --> 00:02:00,580
and also export it and let's call it

40
00:02:00,580 --> 00:02:04,900
get search results page.

41
00:02:06,580 --> 00:02:09,310
So I function and this one is of course

42
00:02:09,310 --> 00:02:11,500
not going to be an a sync function

43
00:02:11,500 --> 00:02:13,890
because we already have the search results

44
00:02:13,890 --> 00:02:15,850
loaded at this point.

45
00:02:15,850 --> 00:02:19,030
So at the point when we will call this function.

46
00:02:19,030 --> 00:02:20,770
All we want to do in this function,

47
00:02:20,770 --> 00:02:23,140
is basically reach into the state

48
00:02:23,140 --> 00:02:26,993
and then get the data for the page that is being requested.

49
00:02:29,870 --> 00:02:32,300
So what we will return here,

50
00:02:32,300 --> 00:02:36,530
is basically a part of the results.

51
00:02:36,530 --> 00:02:39,460
So let's write that here because that will be helpful

52
00:02:39,460 --> 00:02:42,520
to understand the logic we need to write here.

53
00:02:42,520 --> 00:02:47,520
So we will return state.search.results,

54
00:02:47,660 --> 00:02:51,253
which remember is this array here.

55
00:02:52,230 --> 00:02:53,063
Right?

56
00:02:53,063 --> 00:02:56,360
And then we only want to return part of it

57
00:02:56,360 --> 00:02:57,793
and so that's a slice.

58
00:02:59,050 --> 00:03:01,180
So again for the first page,

59
00:03:01,180 --> 00:03:05,820
we would like to return from result one to result 10.

60
00:03:05,820 --> 00:03:09,660
And so that would be zero to nine actually

61
00:03:09,660 --> 00:03:12,940
because the array is zero based.

62
00:03:12,940 --> 00:03:16,350
Now of course, we're not gonna hard code these values here

63
00:03:16,350 --> 00:03:20,800
but we can basically calculate them based on the page.

64
00:03:20,800 --> 00:03:21,973
So let me try that.

65
00:03:23,120 --> 00:03:27,053
So we will basically create a start variable.

66
00:03:27,900 --> 00:03:30,840
So let's set that to zero for now.

67
00:03:30,840 --> 00:03:32,990
So basically having the same values as here

68
00:03:36,610 --> 00:03:40,993
and also an end variable.

69
00:03:42,200 --> 00:03:44,630
So we want to start at a certain point

70
00:03:44,630 --> 00:03:47,283
and then also end at a certain point.

71
00:03:48,400 --> 00:03:49,233
Right?

72
00:03:49,233 --> 00:03:51,450
But again, we don't want to hard code

73
00:03:51,450 --> 00:03:53,630
these values of course but instead,

74
00:03:53,630 --> 00:03:56,273
we want to calculate them dynamically.

75
00:03:57,110 --> 00:04:00,890
So here we will want a nine and here a zero

76
00:04:00,890 --> 00:04:02,733
and so how can we calculate that?

77
00:04:03,680 --> 00:04:06,460
Well, the easiest way that everyone does it,

78
00:04:06,460 --> 00:04:09,890
or at least, I think that's the way that everyone does it,

79
00:04:09,890 --> 00:04:14,890
is to take the page and then minus one

80
00:04:16,350 --> 00:04:19,540
and then simply multiply it by the amount of results

81
00:04:19,540 --> 00:04:21,950
that we want on the page.

82
00:04:21,950 --> 00:04:24,190
So let's say 10 here for now

83
00:04:25,340 --> 00:04:29,390
and then here we do the same, simply with page.

84
00:04:29,390 --> 00:04:33,020
So page times 10.

85
00:04:33,020 --> 00:04:33,853
Okay?

86
00:04:34,890 --> 00:04:38,490
So let's say that we requested page one.

87
00:04:38,490 --> 00:04:43,490
So one minus one is zero and zero times 10 is then zero.

88
00:04:44,070 --> 00:04:47,860
So just as we wanted and for the end parameter

89
00:04:47,860 --> 00:04:52,150
then pages one times 10 is 10.

90
00:04:52,150 --> 00:04:55,590
And actually the slice method here does not include

91
00:04:55,590 --> 00:04:57,584
the last value that we pass in

92
00:04:57,584 --> 00:05:00,440
and so actually 10 is perfect here.

93
00:05:00,440 --> 00:05:04,220
So that will then extract all the way to nine.

94
00:05:04,220 --> 00:05:08,060
Now one page is two, so for page two,

95
00:05:08,060 --> 00:05:13,060
then here we will have two minus one is one, times 10,10.

96
00:05:13,420 --> 00:05:14,840
So it will start at 10

97
00:05:14,840 --> 00:05:18,650
and then go to two times 10 which is 20.

98
00:05:18,650 --> 00:05:22,930
And the same for all the other pages that we pass in.

99
00:05:22,930 --> 00:05:25,630
And so this is actually already it.

100
00:05:25,630 --> 00:05:27,323
Now let's just refactor this code

101
00:05:27,323 --> 00:05:31,100
because of course this year isn't important data about

102
00:05:31,100 --> 00:05:35,253
or application and so it should go into the state.

103
00:05:36,920 --> 00:05:37,753
Okay?

104
00:05:39,090 --> 00:05:44,090
So let's call that results per page

105
00:05:45,810 --> 00:05:47,653
and so let's set it to 10.

106
00:05:51,260 --> 00:05:53,030
So here instead of 10,

107
00:05:53,030 --> 00:05:57,780
we have state.search.results per page.

108
00:06:01,380 --> 00:06:03,630
So that's a lot better.

109
00:06:03,630 --> 00:06:05,880
But actually, we can do even better

110
00:06:05,880 --> 00:06:08,230
because this year now looks kind

111
00:06:08,230 --> 00:06:10,990
of like a magic number, right?

112
00:06:10,990 --> 00:06:13,720
So a number that comes out of nowhere

113
00:06:13,720 --> 00:06:16,653
and so I think you can see where I'm going with this.

114
00:06:17,660 --> 00:06:21,051
So I will create another constant in our configuration file

115
00:06:21,051 --> 00:06:24,010
and then if at some point in the future

116
00:06:24,010 --> 00:06:26,478
we want to change the configuration,

117
00:06:26,478 --> 00:06:30,010
in this case of the results we want per page,

118
00:06:30,010 --> 00:06:31,570
we can simply come here to

119
00:06:31,570 --> 00:06:34,343
the configuration file and change that.

120
00:06:35,670 --> 00:06:36,993
So let's import that.

121
00:06:40,170 --> 00:06:45,170
So that's right here, replace that here, man,

122
00:06:45,910 --> 00:06:48,313
so that should work just fine now.

123
00:06:50,593 --> 00:06:54,560
Now, okay and now let's go back to our controller

124
00:06:54,560 --> 00:06:59,560
and so, again this is the way we did it previously,

125
00:06:59,630 --> 00:07:04,330
so all the results but now we only want some results.

126
00:07:04,330 --> 00:07:08,360
And so we can now call that function that we just created.

127
00:07:08,360 --> 00:07:13,260
So model.get search results and then let's say

128
00:07:13,260 --> 00:07:16,090
we want to start with page one.

129
00:07:16,090 --> 00:07:18,420
And of course we will then later on

130
00:07:18,420 --> 00:07:20,610
get this value here dynamically.

131
00:07:20,610 --> 00:07:23,823
But for now we just want to see if this actually works.

132
00:07:24,750 --> 00:07:29,750
So let's see and let's search here again for pizza.

133
00:07:31,660 --> 00:07:33,833
So again 59 results.

134
00:07:36,830 --> 00:07:41,313
But we still get all the results here for some reason.

135
00:07:43,300 --> 00:07:47,963
So let's only lock this here to the console.

136
00:07:50,040 --> 00:07:53,603
So just to see what our function here is doing.

137
00:07:57,470 --> 00:08:01,093
Well, apparently, it doesn't really do anything.

138
00:08:01,960 --> 00:08:04,790
So get search results per page.

139
00:08:04,790 --> 00:08:07,750
I think that is the correct name.

140
00:08:07,750 --> 00:08:10,423
So that should actually work.

141
00:08:11,360 --> 00:08:13,190
Well, let's just log something here,

142
00:08:13,190 --> 00:08:16,823
just so we see if this function is actually being executed.

143
00:08:17,680 --> 00:08:20,083
So start and end.

144
00:08:24,040 --> 00:08:27,303
Well, nothing is happening here for some reason.

145
00:08:31,020 --> 00:08:34,260
Maybe we need to stop parcel,

146
00:08:34,260 --> 00:08:37,993
sometimes that is necessary and then run it again.

147
00:08:40,900 --> 00:08:42,683
So let's build it all again.

148
00:08:44,780 --> 00:08:47,023
Let's also try it again.

149
00:08:48,970 --> 00:08:52,410
Ah, and now it seems to work and indeed,

150
00:08:52,410 --> 00:08:54,903
now we only get 10 results.

151
00:08:56,510 --> 00:09:00,320
So sometimes you actually have to stop and restart parcel.

152
00:09:00,320 --> 00:09:02,980
This isn't the first time that this has happened to me

153
00:09:02,980 --> 00:09:05,150
and probably I should have warned you

154
00:09:05,150 --> 00:09:07,630
about this problem also earlier

155
00:09:08,500 --> 00:09:12,503
but anyway, now we see that this actually worked.

156
00:09:13,350 --> 00:09:18,130
So great, then we can get rid of this

157
00:09:18,130 --> 00:09:21,723
and also have this console.log right here.

158
00:09:25,380 --> 00:09:28,913
Okay? now let's try something else, like page two.

159
00:09:33,330 --> 00:09:36,610
But apparently it didn't change anything.

160
00:09:36,610 --> 00:09:41,490
Maybe we just have to turn off the hot module reload.

161
00:09:41,490 --> 00:09:42,563
Let's try that.

162
00:09:49,380 --> 00:09:53,690
Now, and now I think that these 10 here are different

163
00:09:53,690 --> 00:09:58,143
or are they? Well, I'm not sure let's try page number three.

164
00:10:00,330 --> 00:10:02,653
So we started with pizza dip.

165
00:10:04,190 --> 00:10:07,023
So let's see what we get this time at first.

166
00:10:09,431 --> 00:10:13,370
Yeah, so these actually look new to me

167
00:10:13,370 --> 00:10:16,330
so it looks like Currently, we are indeed,

168
00:10:16,330 --> 00:10:17,633
on page number three.

169
00:10:18,930 --> 00:10:22,670
Now, okay and now just to finish this part,

170
00:10:22,670 --> 00:10:25,210
here in our model, we should also store

171
00:10:25,210 --> 00:10:28,677
this page number that is coming in, in the state

172
00:10:28,677 --> 00:10:33,350
and that's going to be important because later

173
00:10:33,350 --> 00:10:35,650
when we will display the page number here,

174
00:10:35,650 --> 00:10:40,593
then we kind of need to know at which page we actually are.

175
00:10:41,840 --> 00:10:42,860
Okay?

176
00:10:42,860 --> 00:10:47,570
And so, this really makes sense because, again, this

177
00:10:47,570 --> 00:10:51,333
is a very important piece of data about our application.

178
00:10:52,670 --> 00:10:55,280
And so it's good that in any point of time,

179
00:10:55,280 --> 00:10:58,310
we can know in our application on which page

180
00:10:58,310 --> 00:11:00,563
we currently are in the search results.

181
00:11:02,430 --> 00:11:07,430
So let's simply say state.search.page is equal to page.

182
00:11:11,910 --> 00:11:15,283
And then let's actually also set it up here.

183
00:11:17,320 --> 00:11:22,230
So the page, we can set it to one by default.

184
00:11:22,230 --> 00:11:23,820
Okay?

185
00:11:23,820 --> 00:11:27,160
And then finally, we can make this even better

186
00:11:27,160 --> 00:11:31,003
and say that by default, the page should be that default.

187
00:11:32,590 --> 00:11:37,590
So state.search.page.

188
00:11:37,859 --> 00:11:41,230
And so now if we don't pass anything into the page,

189
00:11:41,230 --> 00:11:43,950
then the page will simply become the default

190
00:11:43,950 --> 00:11:46,093
of one that we just had before.

191
00:11:47,100 --> 00:11:51,080
So we can remove that one from there

192
00:11:51,080 --> 00:11:56,080
and it should then still be working in our own version,

193
00:11:57,460 --> 00:12:02,460
so pasta this time, and yeah, so here we get or 10 results.

194
00:12:03,360 --> 00:12:05,690
And so we are done with this part

195
00:12:05,690 --> 00:12:07,981
but this was actually the easy part

196
00:12:07,981 --> 00:12:12,981
because now we need to render the pagination buttons here

197
00:12:13,560 --> 00:12:15,733
and so let's leave that for the next video.

