@saooti/octopus-sdk 31.0.24 → 31.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +15 -1
  2. package/index.ts +5 -2
  3. package/package.json +2 -1
  4. package/src/components/display/categories/CategoryList.vue +5 -5
  5. package/src/components/display/emission/EmissionItem.vue +4 -8
  6. package/src/components/display/emission/EmissionPlayerItem.vue +8 -16
  7. package/src/components/display/filter/AdvancedSearch.vue +2 -12
  8. package/src/components/display/filter/ProductorSearch.vue +0 -3
  9. package/src/components/display/live/LiveItem.vue +4 -8
  10. package/src/components/display/organisation/OrganisationChooserLight.vue +18 -25
  11. package/src/components/display/participant/ParticipantItem.vue +4 -8
  12. package/src/components/display/playlist/PlaylistItem.vue +4 -8
  13. package/src/components/display/podcasts/PodcastImage.vue +15 -9
  14. package/src/components/display/podcasts/PodcastInlineList.vue +43 -309
  15. package/src/components/display/podcasts/PodcastInlineListClassic.vue +246 -0
  16. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +158 -0
  17. package/src/components/display/podcasts/PodcastItem.vue +5 -9
  18. package/src/components/display/podcasts/PodcastModuleBox.vue +3 -26
  19. package/src/components/display/podcasts/PodcastSwiperList.vue +209 -0
  20. package/src/components/display/rubriques/RubriqueList.vue +6 -5
  21. package/src/components/display/sharing/SharePlayer.vue +42 -81
  22. package/src/components/display/sharing/SharePlayerColors.vue +17 -15
  23. package/src/components/display/sharing/SharePlayerTypes.vue +15 -32
  24. package/src/components/display/sharing/SubscribeButtons.vue +44 -200
  25. package/src/components/form/ClassicCheckbox.vue +8 -8
  26. package/src/components/form/ClassicRadio.vue +9 -9
  27. package/src/components/form/ClassicSearch.vue +29 -29
  28. package/src/components/form/ClassicSelect.vue +12 -15
  29. package/src/components/misc/ErrorMessage.vue +6 -8
  30. package/src/components/misc/Footer.vue +65 -96
  31. package/src/components/misc/LeftMenu.vue +42 -93
  32. package/src/components/misc/Snackbar.vue +1 -1
  33. package/src/components/misc/TopBar.vue +42 -86
  34. package/src/components/misc/modal/ClipboardModal.vue +1 -8
  35. package/src/components/misc/modal/MessageModal.vue +1 -2
  36. package/src/components/misc/modal/QrCodeModal.vue +1 -11
  37. package/src/components/mixins/orgaComputed.ts +15 -0
  38. package/src/components/mixins/organisationFilter.ts +2 -0
  39. package/src/components/mixins/player/playerLogic.ts +1 -1
  40. package/src/components/pages/Emission.vue +43 -86
  41. package/src/components/pages/Emissions.vue +38 -59
  42. package/src/components/pages/Home.vue +5 -12
  43. package/src/components/pages/Lives.vue +1 -6
  44. package/src/components/pages/Participant.vue +34 -48
  45. package/src/components/pages/Participants.vue +10 -28
  46. package/src/components/pages/Playlist.vue +20 -31
  47. package/src/components/pages/Playlists.vue +5 -15
  48. package/src/components/pages/Podcast.vue +95 -115
  49. package/src/components/pages/Podcasts.vue +34 -92
  50. package/src/components/pages/Rubrique.vue +6 -17
  51. package/src/components/pages/Search.vue +16 -36
  52. package/src/locale/en.ts +1 -1
  53. package/src/store/paramStore.ts +13 -11
@@ -1,108 +1,52 @@
1
1
  <template>
2
- <div
3
- v-if="loading || (!loading && 0 !== allPodcasts.length)"
4
- class="d-flex flex-column p-3"
5
- >
6
- <h2>{{ title }}</h2>
7
- <div class="d-flex justify-content-between">
8
- <div class="d-flex">
9
- <button
10
- class="btn btn-underline"
11
- :class="{ active: !popularSort }"
12
- @click="sortChrono()"
13
- >
14
- {{ $t('Last added') }}
15
- </button>
16
- <button
17
- class="btn btn-underline"
18
- :class="{ active: popularSort }"
19
- @click="sortPopular()"
20
- >
21
- {{ $t('Most popular') }}
22
- </button>
23
- </div>
24
- <div
25
- v-if="!isArrow && !overflowScroll"
26
- class="hide-phone"
27
- >
28
- <button
29
- class="btn admin-button m-1"
30
- :class="{ disabled: !previousAvailable }"
31
- :title="$t('Display previous')"
32
- @click="displayPrevious()"
33
- >
34
- <div class="saooti-left fw-bold" />
35
- </button>
36
- <button
37
- class="btn admin-button m-1"
38
- :class="{ disabled: !nextAvailable }"
39
- :title="$t('Display next')"
40
- @click="displayNext()"
41
- >
42
- <div class="saooti-right fw-bold" />
43
- </button>
44
- </div>
45
- </div>
46
- <ClassicLoading
47
- :loading-text="loading?$t('Loading podcasts ...'):undefined"
48
- />
49
- <transition-group
50
- v-show="loaded"
51
- :name="transitionName"
52
- class="element-list-inline"
53
- tag="ul"
54
- :class="[
55
- alignLeft ? 'justify-content-start' : '',
56
- overflowScroll ? 'overflowScroll' : '',
57
- ]"
58
- :css="isInlineAnimation"
59
- >
60
- <PodcastItem
61
- v-for="p in podcasts"
62
- :key="p.podcastId"
63
- class="flex-shrink-0 item-phone-margin"
64
- :podcast="p"
65
- :class="[alignLeft ? 'me-3' : '']"
66
- />
67
- </transition-group>
68
- <router-link
69
- class="btn btn-link align-self-center width-fit-content m-4"
70
- :to="refTo"
71
- @click="handleSeeMoreButton"
72
- >
73
- {{ buttonText }}
74
- <div
75
- v-if="buttonPlus"
76
- class="ms-1 saooti-more"
77
- />
78
- </router-link>
79
- </div>
2
+ <PodcastInlineListClassic
3
+ v-if="listTypeClassic"
4
+ :organisation-id="organisationId"
5
+ :emission-id="emissionId"
6
+ :iab-id="iabId"
7
+ :title="title"
8
+ :href="href"
9
+ :button-text="buttonText"
10
+ :is-arrow="isArrow"
11
+ :require-popular-sort="requirePopularSort"
12
+ :button-plus="buttonPlus"
13
+ :rubrique-id="rubriqueId"
14
+ :rubriquage-id="rubriquageId"
15
+ :no-rubriquage-id="noRubriquageId"
16
+ :query="query"
17
+ @update:isArrow="$emit('update:isArrow',$event)"
18
+ />
19
+ <PodcastSwiperList
20
+ v-else
21
+ :organisation-id="organisationId"
22
+ :emission-id="emissionId"
23
+ :iab-id="iabId"
24
+ :title="title"
25
+ :href="href"
26
+ :button-text="buttonText"
27
+ :is-arrow="isArrow"
28
+ :require-popular-sort="requirePopularSort"
29
+ :button-plus="buttonPlus"
30
+ :rubrique-id="rubriqueId"
31
+ :rubriquage-id="rubriquageId"
32
+ :no-rubriquage-id="noRubriquageId"
33
+ :query="query"
34
+ @update:isArrow="$emit('update:isArrow',$event)"
35
+ />
80
36
  </template>
81
37
 
82
38
  <script lang="ts">
83
- import { handle403 } from '../../mixins/handle403';
84
- import octopusApi from '@saooti/octopus-api';
85
- import domHelper from '../../../helper/dom';
86
- import PodcastItem from './PodcastItem.vue';
87
- import ClassicLoading from '../../form/ClassicLoading.vue';
88
- const PHONE_WIDTH = 960;
89
39
  import { state } from '../../../store/paramStore';
90
- import { Podcast } from '@/store/class/general/podcast';
91
- import { RubriquageFilter } from '@/store/class/rubrique/rubriquageFilter';
92
- import { defineComponent } from 'vue'
93
- import { RouteLocationRaw } from 'vue-router';
94
- import { AxiosError } from 'axios';
95
- import { Rubrique } from '@/store/class/rubrique/rubrique';
40
+ import { defineAsyncComponent, defineComponent } from 'vue';
41
+ const PodcastInlineListClassic = defineAsyncComponent(() => import('./PodcastInlineListClassic.vue'));
42
+ const PodcastSwiperList = defineAsyncComponent(() => import('./PodcastSwiperList.vue'));
96
43
  export default defineComponent({
97
44
  name: 'PodcastInlineList',
98
45
 
99
46
  components: {
100
- PodcastItem,
101
- ClassicLoading
47
+ PodcastInlineListClassic,
48
+ PodcastSwiperList,
102
49
  },
103
-
104
- mixins: [handle403],
105
-
106
50
  props: {
107
51
  organisationId: { default: undefined, type: String},
108
52
  emissionId: { default: undefined, type: Number},
@@ -119,220 +63,10 @@ export default defineComponent({
119
63
  query: { default: undefined, type: String},
120
64
  },
121
65
  emits: ['update:isArrow'],
122
-
123
- data() {
124
- return {
125
- loading: true as boolean,
126
- loaded: true as boolean,
127
- index: 0 as number,
128
- first: 0 as number,
129
- size: 5 as number,
130
- totalCount: 0 as number,
131
- popularSort: false as boolean,
132
- allPodcasts: [] as Array<Podcast>,
133
- direction: 1 as number,
134
- alignLeft: false as boolean,
135
- };
136
- },
137
- computed: {
138
- podcasts(): Array<Podcast> {
139
- return this.allPodcasts.slice(this.index, this.index + this.size);
140
- },
141
- sizeItem(): number {
142
- return state.generalParameters.podcastItem ? (state.generalParameters.podcastItem as number): 13;
143
- },
144
- overflowScroll(): boolean {
145
- return (state.emissionPage.overflowScroll as boolean);
146
- },
147
- isInlineAnimation(): boolean {
148
- return (state.generalParameters.isInlineAnimation as boolean);
149
- },
150
- filterOrga(): string {
151
- return this.$store.state.filter.organisationId;
152
- },
153
- organisation(): string|undefined {
154
- if (this.organisationId) return this.organisationId;
155
- if (this.filterOrga) return this.filterOrga;
156
- return undefined;
66
+ computed:{
67
+ listTypeClassic(): boolean {
68
+ return (state.podcastPage.listTypeClassic as boolean);
157
69
  },
158
- rubriqueQueryParam(): string|undefined{
159
- if(this.$store.state.filter && this.$store.state.filter.rubriqueFilter && this.$store.state.filter.rubriqueFilter.length){
160
- return this.$store.state.filter.rubriqueFilter.map((value: RubriquageFilter) => value.rubriquageId+':'+value.rubriqueId).join();
161
- }
162
- return undefined;
163
- },
164
- refTo(): string | RouteLocationRaw {
165
- if (this.href) return this.href;
166
- if(this.iabId){
167
- return {
168
- name: 'category',
169
- params:{ 'iabId': this.iabId },
170
- query: { productor: this.$store.state.filter.organisationId },
171
- };
172
- }
173
- return {
174
- name: 'podcasts',
175
- query: { productor: this.$store.state.filter.organisationId,
176
- iabId: this.$store.state.filter.iab ? this.$store.state.filter.iab.id : undefined,
177
- rubriquesId: this.rubriqueQueryParam },
178
- };
179
- },
180
- previousAvailable(): boolean {
181
- return this.index > 0;
182
- },
183
- nextAvailable(): boolean {
184
- return this.index + this.size < this.totalCount;
185
- },
186
- transitionName(): string {
187
- return this.direction > 0 ? 'out-left' : 'out-right';
188
- },
189
- watchVariable():string{
190
- return `${this.emissionId}|${this.organisationId}|${this.filterOrga}|${this.iabId}|${this.rubriqueId}|${this.rubriquageId}|${this.query}`;
191
- }
192
- },
193
- watch: {
194
- watchVariable(): void {
195
- this.reset();
196
- this.fetchNext();
197
- },
198
- },
199
-
200
- created() {
201
- if (undefined !== this.requirePopularSort) {
202
- this.popularSort = this.requirePopularSort;
203
- }
204
- if (undefined !== this.isArrow) {
205
- this.$emit('update:isArrow', true);
206
- }
207
- window.addEventListener('resize', this.handleResize);
208
- },
209
-
210
- unmounted() {
211
- window.removeEventListener('resize', this.handleResize);
212
- },
213
-
214
- mounted() {
215
- this.handleResize();
216
- this.fetchNext();
217
- },
218
- methods: {
219
- handleSeeMoreButton(event: { preventDefault: () => void; }){
220
- if(!this.rubriqueId || this.noRubriquageId.length){
221
- return;
222
- }
223
- event.preventDefault();
224
- const rubriqueChosenId = this.rubriqueId[this.rubriqueId.length - 1];
225
- let filterToAdd: RubriquageFilter = {
226
- rubriquageId: 0,
227
- rubriqueId: rubriqueChosenId,
228
- nameRubriquage: '',
229
- nameRubrique: ''
230
- };
231
- if(this.$store.state.filter.rubriquageArray.length){
232
- const rubriqueChosen = this.$store.state.filter.rubriquageArray[this.rubriqueId.length - 1].rubriques.find((element: Rubrique) => element.rubriqueId === rubriqueChosenId);
233
- filterToAdd = {
234
- rubriquageId: this.$store.state.filter.rubriquageArray[this.rubriqueId.length - 1].rubriquageId,
235
- rubriqueId: rubriqueChosenId,
236
- nameRubriquage: this.$store.state.filter.rubriquageArray[this.rubriqueId.length - 1].title,
237
- nameRubrique: rubriqueChosen.name
238
- };
239
- }
240
- const newFilter: Array<RubriquageFilter> = Array.from(this.$store.state.filter.rubriqueFilter);
241
- newFilter.push(filterToAdd);
242
- this.$store.commit('filterRubrique', newFilter);
243
- const queries = this.$route.query;
244
- const queryString = newFilter.map(value => value.rubriquageId+':'+value.rubriqueId).join();
245
- this.$router.push({ name: 'podcasts',query: { ...queries, ...{ rubriquesId: queryString }} });
246
- },
247
- async fetchNext(): Promise<void> {
248
- try {
249
- const data = await octopusApi.fetchPodcasts({
250
- first: this.first,
251
- size: this.size + 1,
252
- organisationId: this.organisation,
253
- emissionId: this.emissionId,
254
- iabId: this.iabId,
255
- rubriqueId: this.rubriqueId.length ?this.rubriqueId:undefined,
256
- rubriquageId: this.rubriquageId.length ?this.rubriquageId : undefined,
257
- noRubriquageId: this.noRubriquageId.length ? this.noRubriquageId : undefined,
258
- sort: this.popularSort ? 'POPULARITY' : 'DATE',
259
- query: this.query,
260
- });
261
- this.loading = false;
262
- this.loaded = true;
263
- this.totalCount = data.count;
264
- if (this.allPodcasts.length + data.result.length < this.totalCount) {
265
- const nexEl = data.result.pop() as Podcast;
266
- this.preloadImage(nexEl.imageUrl?nexEl.imageUrl:'');
267
- }
268
- this.allPodcasts = this.allPodcasts.concat(
269
- data.result.filter((pod: Podcast|null) => null !== pod)
270
- );
271
- if (this.allPodcasts.length <= 3) {
272
- this.alignLeft = true;
273
- } else {
274
- this.alignLeft = false;
275
- }
276
- this.first += this.size;
277
- } catch (error) {
278
- this.handle403((error as AxiosError));
279
- }
280
- },
281
- displayPrevious(): void {
282
- this.direction = -1;
283
- if (this.previousAvailable) {
284
- this.index -= 1;
285
- }
286
- },
287
- displayNext(): void {
288
- this.direction = 1;
289
- if (!this.nextAvailable) return;
290
- if (
291
- this.first - (this.index + this.size) < 2 &&
292
- this.allPodcasts.length < this.totalCount
293
- ) {
294
- this.fetchNext();
295
- }
296
- this.index += 1;
297
- },
298
- handleResize(): void {
299
- if (!this.$el) return;
300
- if (this.overflowScroll) {
301
- this.size = 20;
302
- return;
303
- }
304
- if (window.innerWidth <= PHONE_WIDTH) {
305
- this.size = 10;
306
- return;
307
- }
308
- const width = (this.$el as HTMLElement).offsetWidth;
309
- const sixteen = domHelper.convertRemToPixels(this.sizeItem + 0.7);
310
- this.size = Math.floor(width / sixteen);
311
- },
312
- sortPopular(): void {
313
- if (this.popularSort) return;
314
- this.popularSort = true;
315
- this.reset();
316
- this.fetchNext();
317
- },
318
- sortChrono(): void {
319
- if (!this.popularSort) return;
320
- this.popularSort = false;
321
- this.reset();
322
- this.fetchNext();
323
- },
324
- reset(): void {
325
- this.loading = true;
326
- this.loaded = true;
327
- this.index = 0;
328
- this.first = 0;
329
- this.totalCount = 0;
330
- this.allPodcasts.length = 0;
331
- },
332
- preloadImage(url: string): void {
333
- const img = new Image();
334
- img.src = url;
335
- },
336
- },
70
+ }
337
71
  })
338
72
  </script>
@@ -0,0 +1,246 @@
1
+ <template>
2
+ <PodcastInlineListTemplate
3
+ v-if="loading || (!loading && 0 !== allPodcasts.length)"
4
+ :display-arrow="true"
5
+ :popular-sort="popularSort"
6
+ :button-text="buttonText"
7
+ :button-plus="buttonPlus"
8
+ :title="title"
9
+ :href="href"
10
+ :iab-id="iabId"
11
+ :rubrique-id="rubriqueId"
12
+ :previous-available="previousAvailable"
13
+ :next-available="nextAvailable"
14
+ :no-rubriquage-id="noRubriquageId"
15
+ @sortChrono="sortChrono"
16
+ @sortPopular="sortPopular"
17
+ @displayPrevious="displayPrevious"
18
+ @displayNext="displayNext"
19
+ >
20
+ <template #list-inline>
21
+ <ClassicLoading
22
+ :loading-text="loading?$t('Loading podcasts ...'):undefined"
23
+ />
24
+ <transition-group
25
+ v-show="loaded"
26
+ :name="transitionName"
27
+ class="element-list-inline"
28
+ tag="ul"
29
+ :class="[
30
+ alignLeft ? 'justify-content-start' : '',
31
+ overflowScroll ? 'overflowScroll' : '',
32
+ ]"
33
+ :css="isInlineAnimation"
34
+ >
35
+ <PodcastItem
36
+ v-for="p in podcasts"
37
+ :key="p.podcastId"
38
+ class="flex-shrink-0 item-phone-margin"
39
+ :podcast="p"
40
+ :class="[alignLeft ? 'me-3' : '']"
41
+ />
42
+ </transition-group>
43
+ </template>
44
+ </PodcastInlineListTemplate>
45
+ </template>
46
+
47
+ <script lang="ts">
48
+ import PodcastInlineListTemplate from './PodcastInlineListTemplate.vue';
49
+ import octopusApi from '@saooti/octopus-api';
50
+ import domHelper from '../../../helper/dom';
51
+ import PodcastItem from './PodcastItem.vue';
52
+ import ClassicLoading from '../../form/ClassicLoading.vue';
53
+ const PHONE_WIDTH = 960;
54
+ import { state } from '../../../store/paramStore';
55
+ import { Podcast } from '@/store/class/general/podcast';
56
+ import { defineComponent } from 'vue'
57
+ export default defineComponent({
58
+ name: 'PodcastInlineListClassic',
59
+
60
+ components: {
61
+ PodcastItem,
62
+ ClassicLoading,
63
+ PodcastInlineListTemplate
64
+ },
65
+
66
+ props: {
67
+ organisationId: { default: undefined, type: String},
68
+ emissionId: { default: undefined, type: Number},
69
+ iabId: { default: undefined, type: Number},
70
+ title: { default: '', type: String},
71
+ href: { default: undefined, type: String},
72
+ buttonText: { default: undefined, type: String},
73
+ isArrow: { default: false, type: Boolean},
74
+ requirePopularSort: { default:undefined, type: Boolean},
75
+ buttonPlus: { default:false, type: Boolean},
76
+ rubriqueId: { default: () => [], type: Array as ()=> Array<number> },
77
+ rubriquageId:{ default: () => [], type: Array as ()=> Array<number> },
78
+ noRubriquageId: { default: () => [], type: Array as ()=> Array<number> },
79
+ query: { default: undefined, type: String},
80
+ },
81
+ emits: ['update:isArrow'],
82
+
83
+ data() {
84
+ return {
85
+ loading: true as boolean,
86
+ loaded: true as boolean,
87
+ index: 0 as number,
88
+ first: 0 as number,
89
+ size: 5 as number,
90
+ totalCount: 0 as number,
91
+ popularSort: false as boolean,
92
+ allPodcasts: [] as Array<Podcast>,
93
+ direction: 1 as number,
94
+ alignLeft: false as boolean,
95
+ };
96
+ },
97
+ computed: {
98
+ podcasts(): Array<Podcast> {
99
+ return this.allPodcasts.slice(this.index, this.index + this.size);
100
+ },
101
+ sizeItem(): number {
102
+ return state.generalParameters.podcastItem ? (state.generalParameters.podcastItem as number): 13;
103
+ },
104
+ overflowScroll(): boolean {
105
+ return (state.emissionPage.overflowScroll as boolean);
106
+ },
107
+ isInlineAnimation(): boolean {
108
+ return (state.generalParameters.isInlineAnimation as boolean);
109
+ },
110
+ filterOrga(): string {
111
+ return this.$store.state.filter.organisationId;
112
+ },
113
+ organisation(): string|undefined {
114
+ if (this.organisationId) return this.organisationId;
115
+ if (this.filterOrga) return this.filterOrga;
116
+ return undefined;
117
+ },
118
+ previousAvailable(): boolean {
119
+ return this.index > 0;
120
+ },
121
+ nextAvailable(): boolean {
122
+ return this.index + this.size < this.totalCount;
123
+ },
124
+ transitionName(): string {
125
+ return this.direction > 0 ? 'out-left' : 'out-right';
126
+ },
127
+ watchVariable():string{
128
+ return `${this.emissionId}|${this.organisationId}|${this.filterOrga}|${this.iabId}|${this.rubriqueId}|${this.rubriquageId}|${this.query}`;
129
+ }
130
+ },
131
+ watch: {
132
+ watchVariable(): void {
133
+ this.reset();
134
+ this.fetchNext();
135
+ },
136
+ },
137
+
138
+ created() {
139
+ if (undefined !== this.requirePopularSort) {
140
+ this.popularSort = this.requirePopularSort;
141
+ }
142
+ if (undefined !== this.isArrow) {
143
+ this.$emit('update:isArrow', true);
144
+ }
145
+ window.addEventListener('resize', this.handleResize);
146
+ },
147
+
148
+ unmounted() {
149
+ window.removeEventListener('resize', this.handleResize);
150
+ },
151
+
152
+ mounted() {
153
+ this.handleResize();
154
+ this.fetchNext();
155
+ },
156
+ methods: {
157
+ async fetchNext(): Promise<void> {
158
+ const data = await octopusApi.fetchPodcasts({
159
+ first: this.first,
160
+ size: this.size + 1,
161
+ organisationId: this.organisation,
162
+ emissionId: this.emissionId,
163
+ iabId: this.iabId,
164
+ rubriqueId: this.rubriqueId.length ?this.rubriqueId:undefined,
165
+ rubriquageId: this.rubriquageId.length ?this.rubriquageId : undefined,
166
+ noRubriquageId: this.noRubriquageId.length ? this.noRubriquageId : undefined,
167
+ sort: this.popularSort ? 'POPULARITY' : 'DATE',
168
+ query: this.query,
169
+ });
170
+ this.loading = false;
171
+ this.loaded = true;
172
+ this.totalCount = data.count;
173
+ if (this.allPodcasts.length + data.result.length < this.totalCount) {
174
+ const nexEl = data.result.pop() as Podcast;
175
+ if(nexEl){
176
+ this.preloadImage(nexEl.imageUrl?nexEl.imageUrl:'');
177
+ }
178
+ }
179
+ this.allPodcasts = this.allPodcasts.concat(
180
+ data.result.filter((pod: Podcast|null) => null !== pod)
181
+ );
182
+ if (this.allPodcasts.length <= 3) {
183
+ this.alignLeft = true;
184
+ } else {
185
+ this.alignLeft = false;
186
+ }
187
+ this.first += this.size;
188
+ },
189
+ displayPrevious(): void {
190
+ this.direction = -1;
191
+ if (this.previousAvailable) {
192
+ this.index -= 1;
193
+ }
194
+ },
195
+ displayNext(): void {
196
+ this.direction = 1;
197
+ if (!this.nextAvailable) return;
198
+ if (
199
+ this.first - (this.index + this.size) < 2 &&
200
+ this.allPodcasts.length < this.totalCount
201
+ ) {
202
+ this.fetchNext();
203
+ }
204
+ this.index += 1;
205
+ },
206
+ handleResize(): void {
207
+ if (!this.$el) return;
208
+ if (this.overflowScroll) {
209
+ this.size = 20;
210
+ return;
211
+ }
212
+ if (window.innerWidth <= PHONE_WIDTH) {
213
+ this.size = 10;
214
+ return;
215
+ }
216
+ const width = (this.$el as HTMLElement).offsetWidth;
217
+ const sixteen = domHelper.convertRemToPixels(this.sizeItem + 0.7);
218
+ this.size = Math.floor(width / sixteen);
219
+ },
220
+ sortPopular(): void {
221
+ if (this.popularSort) return;
222
+ this.popularSort = true;
223
+ this.reset();
224
+ this.fetchNext();
225
+ },
226
+ sortChrono(): void {
227
+ if (!this.popularSort) return;
228
+ this.popularSort = false;
229
+ this.reset();
230
+ this.fetchNext();
231
+ },
232
+ reset(): void {
233
+ this.loading = true;
234
+ this.loaded = true;
235
+ this.index = 0;
236
+ this.first = 0;
237
+ this.totalCount = 0;
238
+ this.allPodcasts.length = 0;
239
+ },
240
+ preloadImage(url: string): void {
241
+ const img = new Image();
242
+ img.src = url;
243
+ },
244
+ },
245
+ })
246
+ </script>