@@ -8,6 +8,7 @@ import { type ListScrollItem, type ListScrollItemTag, ListScrollItemType } from
8
8
import { TraktService } from '~/services/trakt.service' ;
9
9
import { storage } from '~/utils/browser/browser-storage.utils' ;
10
10
import { DateUtils } from '~/utils/date.utils' ;
11
+ import { useSearchFilter } from '~/utils/store.utils' ;
11
12
12
13
export type CalendarItem = ( TraktCalendarShow | TraktCalendarMovie | Record < never , never > ) & {
13
14
id : ListScrollItem [ 'id' ] ;
@@ -77,11 +78,65 @@ export const useCalendarStore = defineStore('data.calendar', () => {
77
78
if ( restored ?. endCalendar ) endCalendar . value = new Date ( restored . endCalendar ) ;
78
79
} ;
79
80
81
+ const spaceDate = ( data : CalendarItem [ ] , startDate : Date , endDate : Date ) : CalendarItem [ ] => {
82
+ const spacedData : CalendarItem [ ] = [ ] ;
83
+ data ?. forEach ( ( item , index ) => {
84
+ if ( index === 0 ) {
85
+ // if the first item isn't the start date, add placeholders
86
+ if ( item . date . getTime ( ) > startDate . getTime ( ) && item . date . toLocaleDateString ( ) !== startDate . toLocaleDateString ( ) ) {
87
+ let previousDate : Date = item . date ;
88
+ while ( previousDate . toLocaleDateString ( ) !== startDate . toLocaleDateString ( ) ) {
89
+ previousDate = DateUtils . previous ( 1 , previousDate ) ;
90
+ spacedData . push ( getPlaceholder ( previousDate ) ) ;
91
+ }
92
+ }
93
+ return spacedData . push ( item ) ;
94
+ }
95
+
96
+ if ( index === data . length - 1 ) {
97
+ spacedData . push ( item ) ;
98
+
99
+ // if the last item isn't one day before the end date, add placeholders
100
+ const dayBeforeEnd = DateUtils . previous ( 1 , endDate ) ;
101
+ if ( item . date . getTime ( ) < dayBeforeEnd . getTime ( ) && item . date . toLocaleDateString ( ) !== dayBeforeEnd . toLocaleDateString ( ) ) {
102
+ let nextDate : Date = item . date ;
103
+ while ( nextDate . toLocaleDateString ( ) !== dayBeforeEnd . toLocaleDateString ( ) ) {
104
+ nextDate = DateUtils . next ( 1 , nextDate ) ;
105
+ spacedData . push ( getPlaceholder ( nextDate ) ) ;
106
+ }
107
+ }
108
+ return ;
109
+ }
110
+
111
+ const previous = data [ index - 1 ] ;
112
+
113
+ if ( item . date . toLocaleDateString ( ) === previous . date . toLocaleDateString ( ) ) return spacedData . push ( item ) ;
114
+ if ( item . date . toLocaleDateString ( ) === DateUtils . next ( 1 , previous . date ) . toLocaleDateString ( ) ) return spacedData . push ( item ) ;
115
+
116
+ // if the item isn't at least 1 day after the previous date, add placeholders
117
+ let previousDate : Date = previous . date ;
118
+ while ( item . date . toLocaleDateString ( ) !== DateUtils . next ( 1 , previousDate ) . toLocaleDateString ( ) ) {
119
+ previousDate = DateUtils . next ( 1 , previousDate ) ;
120
+ spacedData . push ( getPlaceholder ( previousDate ) ) ;
121
+ }
122
+ spacedData . push ( item ) ;
123
+ } ) ;
124
+ if ( ! spacedData . length ) spacedData . push ( ...getEmptyWeeks ( startDate ) ) ;
125
+
126
+ // if no data in response fill with placeholders
127
+ return spacedData ;
128
+ } ;
129
+
80
130
const fetchCalendar = async ( mode : 'start' | 'end' | 'reload' = 'reload' ) => {
81
131
if ( ! firstLoad . value && loading . value ) {
82
132
console . warn ( 'Already fetching calendar' ) ;
83
133
return ;
84
134
}
135
+ if ( filter . value ) {
136
+ console . warn ( 'Filtering calendar, fetch is disabled' ) ;
137
+ return ;
138
+ }
139
+
85
140
if ( firstLoad . value ) firstLoad . value = false ;
86
141
87
142
loading . value = true ;
@@ -140,51 +195,7 @@ export const useCalendarStore = defineStore('data.calendar', () => {
140
195
} ) ,
141
196
] . sort ( ( a , b ) => a . date . getTime ( ) - b . date . getTime ( ) ) ;
142
197
143
- const spacedData : CalendarItem [ ] = [ ] ;
144
- newData . forEach ( ( item , index ) => {
145
- if ( index === 0 ) {
146
- // if the first item isn't the start date, add placeholders
147
- if ( item . date . getTime ( ) > startDate . getTime ( ) && item . date . toLocaleDateString ( ) !== startDate . toLocaleDateString ( ) ) {
148
- let previousDate : Date = item . date ;
149
- while ( previousDate . toLocaleDateString ( ) !== startDate . toLocaleDateString ( ) ) {
150
- previousDate = DateUtils . previous ( 1 , previousDate ) ;
151
- spacedData . push ( getPlaceholder ( previousDate ) ) ;
152
- }
153
- }
154
- return spacedData . push ( item ) ;
155
- }
156
-
157
- if ( index === newData . length - 1 ) {
158
- spacedData . push ( item ) ;
159
-
160
- // if the last item isn't one day before the end date, add placeholders
161
- const dayBeforeEnd = DateUtils . previous ( 1 , endDate ) ;
162
- if ( item . date . getTime ( ) < dayBeforeEnd . getTime ( ) && item . date . toLocaleDateString ( ) !== dayBeforeEnd . toLocaleDateString ( ) ) {
163
- let nextDate : Date = item . date ;
164
- while ( nextDate . toLocaleDateString ( ) !== dayBeforeEnd . toLocaleDateString ( ) ) {
165
- nextDate = DateUtils . next ( 1 , nextDate ) ;
166
- spacedData . push ( getPlaceholder ( nextDate ) ) ;
167
- }
168
- }
169
- return ;
170
- }
171
-
172
- const previous = newData [ index - 1 ] ;
173
-
174
- if ( item . date . toLocaleDateString ( ) === previous . date . toLocaleDateString ( ) ) return spacedData . push ( item ) ;
175
- if ( item . date . toLocaleDateString ( ) === DateUtils . next ( 1 , previous . date ) . toLocaleDateString ( ) ) return spacedData . push ( item ) ;
176
-
177
- // if the item isn't at least 1 day after the previous date, add placeholders
178
- let previousDate : Date = previous . date ;
179
- while ( item . date . toLocaleDateString ( ) !== DateUtils . next ( 1 , previousDate ) . toLocaleDateString ( ) ) {
180
- previousDate = DateUtils . next ( 1 , previousDate ) ;
181
- spacedData . push ( getPlaceholder ( previousDate ) ) ;
182
- }
183
- spacedData . push ( item ) ;
184
- } ) ;
185
-
186
- // if no data in response fill with placeholders
187
- if ( ! spacedData . length ) spacedData . push ( ...getEmptyWeeks ( startDate ) ) ;
198
+ const spacedData = spaceDate ( newData , startDate , endDate ) ;
188
199
189
200
if ( mode === 'reload' ) {
190
201
calendar . value = [ ...spacedData ] ;
@@ -203,7 +214,22 @@ export const useCalendarStore = defineStore('data.calendar', () => {
203
214
}
204
215
} ;
205
216
206
- return { clearState, saveState, restoreState, loading, pageSize : weeks , calendar, startCalendar, endCalendar, fetchCalendar, filter, center } ;
217
+ const filteredCalendar = useSearchFilter ( calendar , filter , 'date' ) ;
218
+
219
+ return {
220
+ clearState,
221
+ saveState,
222
+ restoreState,
223
+ loading,
224
+ pageSize : weeks ,
225
+ calendar,
226
+ startCalendar,
227
+ endCalendar,
228
+ fetchCalendar,
229
+ filter,
230
+ center,
231
+ filteredCalendar,
232
+ } ;
207
233
} ) ;
208
234
209
235
export const useCalendarStoreRefs = ( ) => storeToRefs ( useCalendarStore ( ) ) ;
0 commit comments