@mundogamernetwork/shared-ui 1.1.37 → 1.1.38

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.
@@ -1,67 +1,254 @@
1
1
  <script setup lang="ts">
2
+ import { ref, onMounted } from "vue";
2
3
  import { storeToRefs } from "pinia";
3
4
 
4
- definePageMeta({ layout: "default" });
5
+ const locale = useNuxtApp().$i18n.locale;
5
6
 
6
7
  const institutionalStore = useInstitutionalStore();
7
- const { magazine } = storeToRefs(institutionalStore);
8
+ const { magazine, language } = institutionalStore;
8
9
  const authStore = useAuthStore();
9
- const { signedIn } = storeToRefs(authStore);
10
+ const { user, signedIn } = storeToRefs(authStore);
10
11
 
11
- const config = useRuntimeConfig();
12
- const systemId = config.public.mgSharedUi?.systemId || import.meta.env.VITE_SYSTEM_ID;
12
+ interface MagazineItem {
13
+ id: string;
14
+ edition_number: number;
15
+ language: {
16
+ id: string;
17
+ };
18
+ }
19
+
20
+ interface LanguageItem {
21
+ id: string;
22
+ localized_name: string;
23
+ }
13
24
 
14
25
  const currentPage = ref(1);
15
- const perPage = 12;
16
- const selectedLanguage = ref("");
26
+ const totalPages = ref(1);
27
+ const itemsPerPage = 12;
28
+ const totalItens = ref(0);
17
29
 
18
- async function fetchMagazines() {
30
+ const languages: Ref<LanguageItem[]> = ref([]);
31
+ const languageId = ref("");
32
+
33
+ const queryParams = {
34
+ filter: {
35
+ status: 1,
36
+ platform_id: import.meta.env.VITE_SYSTEM_ID,
37
+ },
38
+ sort: "id",
39
+ order: "desc",
40
+ per_page: itemsPerPage,
41
+ };
42
+
43
+ const {
44
+ public: { apiBaseURL },
45
+ } = useRuntimeConfig();
46
+
47
+ function formatDate(dateString: string): string {
48
+ const date = new Date(dateString);
49
+ let monthNames;
50
+ const languagePtBr = languages.value
51
+ .filter((language) => language?.name_abrev === "pt-BR")
52
+ .map((language) => language.id);
53
+ if (languageId.value === languagePtBr[0]) {
54
+ monthNames = [
55
+ "Janeiro",
56
+ "Fevereiro",
57
+ "Março",
58
+ "Abril",
59
+ "Maio",
60
+ "Junho",
61
+ "Julho",
62
+ "Agosto",
63
+ "Setembro",
64
+ "Outubro",
65
+ "Novembro",
66
+ "Dezembro",
67
+ ];
68
+ } else {
69
+ monthNames = [
70
+ "January",
71
+ "February",
72
+ "March",
73
+ "April",
74
+ "May",
75
+ "June",
76
+ "July",
77
+ "August",
78
+ "September",
79
+ "October",
80
+ "November",
81
+ "December",
82
+ ];
83
+ }
84
+ const month = monthNames[date.getMonth()];
85
+ const year = date.getFullYear().toString().slice(-2);
86
+ return `${month} ${year}`;
87
+ }
88
+
89
+ async function fetchMagazine() {
19
90
  try {
20
- const params: any = {
21
- filter: {
22
- status: 1,
23
- platform_id: systemId,
24
- },
25
- sort: "created_at",
26
- order: "desc",
27
- per_page: perPage,
91
+ await institutionalStore.fetchLatestMagazine({
92
+ ...queryParams,
28
93
  page: currentPage.value,
29
- };
30
- if (selectedLanguage.value) params.filter.language = selectedLanguage.value;
94
+ });
95
+
96
+ const meta = magazine.data?.meta?.pagination ?? null;
97
+ totalPages.value = meta ? meta.total_pages : 1;
98
+ totalItens.value = meta
99
+ ? meta.total
100
+ : magazine.data && magazine.data.length
101
+ ? magazine.data.length
102
+ : 0;
31
103
 
32
- await institutionalStore.fetchLatestMagazine(params);
33
- } catch {
34
- // silent
104
+ if (magazine.data?.[0]?.language?.id) {
105
+ languageId.value = magazine.data[0].language.id;
106
+ }
107
+ filterLanguages();
108
+ } catch (error) {
109
+ console.error("Error fetching magazine:", error);
35
110
  }
36
111
  }
37
112
 
38
- function loadMore() {
39
- currentPage.value++;
40
- const params: any = {
41
- filter: {
42
- status: 1,
43
- platform_id: systemId,
44
- },
45
- sort: "created_at",
46
- order: "desc",
47
- per_page: perPage,
48
- page: currentPage.value,
49
- };
50
- if (selectedLanguage.value) params.filter.language = selectedLanguage.value;
51
- institutionalStore.fetchMoreLatestMagazine(params);
113
+ async function fetchMoreMagazine() {
114
+ try {
115
+ await institutionalStore.fetchMoreLatestMagazine({
116
+ ...queryParams,
117
+ page: currentPage.value,
118
+ });
119
+
120
+ if (magazine.data?.[0]?.language?.id) {
121
+ languageId.value = magazine.data[0].language.id;
122
+ }
123
+ filterLanguages();
124
+ } catch (error) {
125
+ console.error("Error fetching more magazine:", error);
126
+ }
52
127
  }
53
128
 
54
- function changeLanguage() {
55
- currentPage.value = 1;
56
- fetchMagazines();
129
+ function handleItemClick(magazineId: string) {
130
+ const clickedMagazine = magazine.data.find(
131
+ (item: MagazineItem) => item.id === magazineId,
132
+ );
133
+ if (clickedMagazine) {
134
+ const clickedIndex = magazine.data.findIndex(
135
+ (item: MagazineItem) => item.id === magazineId,
136
+ );
137
+ magazine.data.splice(clickedIndex, 1);
138
+ magazine.data.unshift(clickedMagazine);
139
+
140
+ languageId.value = clickedMagazine.language.id;
141
+ filterLanguages();
142
+ }
143
+ }
144
+
145
+ function fetchMore() {
146
+ if (currentPage.value < totalPages.value) {
147
+ currentPage.value++;
148
+ fetchMoreMagazine();
149
+ }
150
+ }
151
+
152
+ async function fetchLanguage() {
153
+ try {
154
+ await institutionalStore.fetchLanguage({});
155
+ } catch (error) {
156
+ console.error("Error fetching languiages:", error);
157
+ }
57
158
  }
58
159
 
59
- onMounted(() => {
60
- fetchMagazines();
61
- institutionalStore.fetchLanguage({ per_page: "all" });
160
+ function filterLanguages() {
161
+ if (magazine.data && magazine.data.length > 0) {
162
+ const firstMagazine = magazine.data[0];
163
+ languageId.value = firstMagazine.language.id;
164
+ const editionNumber = firstMagazine.edition_number;
165
+ const languageIds = magazine.data
166
+ .filter((item: MagazineItem) => item.edition_number === editionNumber)
167
+ .map((item: MagazineItem) => item.language.id);
168
+ languages.value = language.data.filter((language: LanguageItem) =>
169
+ languageIds.includes(language.id),
170
+ );
171
+ }
172
+ }
173
+
174
+ useSeoMeta({
175
+ title: "MGN Magazine",
176
+ description:
177
+ "Discover, be inspired and connect in the magazine that breathes digital gaming. Welcome to your new source of gamer passion!",
178
+ ogTitle: "MGN Magazine",
179
+ ogDescription:
180
+ "Discover, be inspired and connect in the magazine that breathes digital gaming. Welcome to your new source of gamer passion!",
181
+ ogImage: "/imgs/seo-magazine-image.jpg",
182
+ ogUrl: "/magazine",
183
+ twitterTitle: "MGN Magazine",
184
+ twitterDescription:
185
+ "Discover, be inspired and connect in the magazine that breathes digital gaming. Welcome to your new source of gamer passion!",
186
+ twitterImage: "/imgs/seo-magazine-image.jpg",
187
+ twitterCard: "summary",
62
188
  });
63
189
 
64
- const locale = useNuxtApp().$i18n.locale;
190
+ watch(languageId, (newValue) => {
191
+ if (!Array.isArray(magazine.data) || magazine.data.length === 0) return;
192
+
193
+ const selectedEditionNumber = magazine.data[0].edition_number;
194
+ const newMagazine = magazine.data.find(
195
+ (item: MagazineItem) =>
196
+ item.language.id === newValue &&
197
+ item.edition_number === selectedEditionNumber,
198
+ );
199
+ if (newMagazine) {
200
+ handleItemClick(newMagazine.id);
201
+ languageId.value = newMagazine.language.id;
202
+ }
203
+ filterLanguages();
204
+ });
205
+
206
+ function downloadPdf() {
207
+ if (magazine.data[0]?.pdf_url_src) {
208
+ window.open(magazine.data[0]?.pdf_url_src, "_blank");
209
+ }
210
+ }
211
+
212
+ const isSmallScreen = ref(false);
213
+
214
+ const updateScreenSize = () => {
215
+ isSmallScreen.value = window.innerWidth <= 768;
216
+ };
217
+
218
+ onMounted(async () => {
219
+ updateScreenSize();
220
+ window.addEventListener("resize", updateScreenSize);
221
+ await fetchLanguage();
222
+ await fetchMagazine();
223
+ });
224
+
225
+ onBeforeUnmount(() => {
226
+ window.removeEventListener("resize", updateScreenSize);
227
+ });
228
+
229
+ const runtimeConfig = useRuntimeConfig();
230
+
231
+ const accountsRegisterUrl = computed(() => {
232
+ if (process.client) {
233
+ const base_url = runtimeConfig.public.accountsBaseUrl;
234
+ const current = window.location.href;
235
+
236
+ return `${base_url}/register?redirect_to=${encodeURIComponent(current)}&system_id=${runtimeConfig.public.platformId}`;
237
+ }
238
+ });
239
+
240
+ const uniqueEditions = computed(() => {
241
+ if (!magazine.data || magazine.data.length === 0) {
242
+ return [];
243
+ }
244
+
245
+ const editionsSet = new Set();
246
+ for (const item of magazine.data) {
247
+ editionsSet.add(item.edition_number);
248
+ }
249
+
250
+ return [...editionsSet];
251
+ });
65
252
  </script>
66
253
 
67
254
  <template>
@@ -75,64 +262,468 @@ const locale = useNuxtApp().$i18n.locale;
75
262
  </div>
76
263
  <div class="container">
77
264
  <div class="row">
78
- <div class="col-8 offset-2">
79
- <div class="filters">
80
- <select v-model="selectedLanguage" @change="changeLanguage">
81
- <option value="">{{ $t("more.magazine.all_languages") }}</option>
82
- <option
83
- v-for="lang in institutionalStore.language.data"
84
- :key="lang.id"
85
- :value="lang.slug"
86
- >
87
- {{ lang.name }}
88
- </option>
89
- </select>
90
- </div>
91
-
92
- <div v-if="magazine.status === 'pending' && (!magazine.data || magazine.data.length === 0)" class="loading">
93
- <p>{{ $t("components.loading") }}</p>
265
+ <div class="col-12">
266
+ <div class="text-page">
267
+ {{ $t("more.magazine.text_1") }}
94
268
  </div>
95
269
 
96
- <div v-else-if="magazine.data && magazine.data.length > 0">
97
- <div class="magazine-grid">
98
- <div
99
- v-for="item in magazine.data"
100
- :key="item.id"
101
- class="magazine-card"
102
- >
103
- <NuxtLink :to="`/${locale}/magazine/${item.slug}`" class="magazine-card__link">
104
- <div class="magazine-card__cover">
270
+ <div v-if="magazine.data.length > 0">
271
+ <div v-if="magazine && magazine.data">
272
+ <div class="magazine-card first-item">
273
+ <div
274
+ class="infos d-flex flex-row w-100"
275
+ v-if="!isSmallScreen"
276
+ >
277
+ <div
278
+ v-if="magazine.data[0]?.premium === true"
279
+ class="premium-card col-auto"
280
+ >
281
+ <div class="premium">
282
+ <svg
283
+ xmlns="http://www.w3.org/2000/svg"
284
+ width="56"
285
+ height="57"
286
+ viewBox="0 0 56 57"
287
+ fill="none"
288
+ >
289
+ <path
290
+ d="M38.3133 42.3287H16.8933V44.9421H38.3133V42.3287Z"
291
+ fill="var(--text-magazine)"
292
+ />
293
+ <path
294
+ d="M35.7 26.2754L27.6033 12.2754L19.5066 26.2521L9.33331 23.6854L15.0966 39.7154H40.0633L46.6666 23.8487L35.7 26.2754Z"
295
+ fill="var(--text-magazine)"
296
+ />
297
+ </svg>
298
+ {{ $t("more.magazine.text_6") }}
299
+ </div>
300
+ <NuxtLink
301
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
302
+ >
303
+ <img
304
+ :src="
305
+ magazine.data[0]?.cover_url_src ||
306
+ '/imgs/no-cover-img.jpg'
307
+ "
308
+ />
309
+ </NuxtLink>
310
+ </div>
311
+ <NuxtLink
312
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
313
+ >
314
+ <img
315
+ v-if="magazine.data[0]?.premium === false"
316
+ :src="
317
+ magazine.data[0]?.cover_url_src ||
318
+ '/imgs/no-cover-img.jpg'
319
+ "
320
+ />
321
+ </NuxtLink>
322
+ <div class="col-6">
323
+ <NuxtLink
324
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
325
+ :class="'title'"
326
+ >
327
+ <div class="title">
328
+ {{ magazine.data[0]?.name }}
329
+ </div>
330
+ </NuxtLink>
331
+ <div class="sub-infos">
332
+ <div class="edition">
333
+ {{ $t("more.magazine.edition") }} #{{
334
+ magazine.data[0]?.edition_number
335
+ }}
336
+ </div>
337
+ <div class="data">
338
+ {{ formatDate(magazine.data[0]?.release_date) }}
339
+ </div>
340
+ </div>
341
+ <div class="description">
342
+ {{ magazine.data[0]?.short_description }}
343
+ </div>
344
+ <NuxtLink
345
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
346
+ >
347
+ <button class="btn more">
348
+ {{ $t("more.magazine.btn_1") }} >
349
+ </button>
350
+ </NuxtLink>
351
+ <div
352
+ v-if="
353
+ magazine.data[0]?.public === false &&
354
+ magazine.data[0]?.premium === false &&
355
+ signedIn === false
356
+ "
357
+ class="signin action-block"
358
+ >
359
+ {{ $t("more.magazine.text_2") }}
360
+ <div class="download">
361
+ <select v-model="languageId" class="select">
362
+ <option :key="'none'" :value="'none'">
363
+ {{ $t("more.magazine.text_3") }}
364
+ </option>
365
+ <option
366
+ v-for="language in languages"
367
+ :key="language.id"
368
+ :value="language.id"
369
+ >
370
+ {{ language.localized_name }}
371
+ </option>
372
+ </select>
373
+ <ClientOnly>
374
+ <a class="btn primary" :href="accountsRegisterUrl">
375
+ {{ $t("more.magazine.btn_4") }}
376
+ </a>
377
+ </ClientOnly>
378
+ </div>
379
+ </div>
380
+ <div
381
+ v-else-if="
382
+ magazine.data[0]?.premium === true &&
383
+ magazine.data[0]?.public === false &&
384
+ signedIn === false
385
+ "
386
+ class="download signin py-4 d-flex action-block premium"
387
+ >
388
+ {{ $t("more.magazine.text_4") }}
389
+ <div class="d-flex flex-row">
390
+ <select v-model="languageId" class="select">
391
+ <option :key="'none'" :value="'none'">
392
+ {{ $t("more.magazine.text_3") }}
393
+ </option>
394
+ <option
395
+ v-for="language in languages"
396
+ :key="language.id"
397
+ :value="language.id"
398
+ >
399
+ {{ language.localized_name }}
400
+ </option>
401
+ </select>
402
+ <button
403
+ class="btn primary"
404
+ :href="accountsRegisterUrl"
405
+ >
406
+ {{ $t("more.magazine.btn_5") }}
407
+ </button>
408
+ </div>
409
+ </div>
410
+ <div v-else class="download action-block flex-row py-4">
411
+ <select v-model="languageId" class="select">
412
+ <option :key="'none'" :value="'none'">
413
+ {{ $t("more.magazine.text_3") }}
414
+ </option>
415
+ <option
416
+ v-for="language in languages"
417
+ :key="language.id"
418
+ :value="language.id"
419
+ >
420
+ {{ language.localized_name }}
421
+ </option>
422
+ </select>
423
+ <a class="btn primary" @click="downloadPdf()">
424
+ {{ $t("more.magazine.btn_2") }}
425
+ </a>
426
+ </div>
427
+ </div>
428
+ </div>
429
+ <div class="infos" v-if="isSmallScreen">
430
+ <div
431
+ v-if="magazine.data[0]?.premium === true"
432
+ class="premium-card"
433
+ >
434
+ <div class="premium">
435
+ <svg
436
+ xmlns="http://www.w3.org/2000/svg"
437
+ width="56"
438
+ height="57"
439
+ viewBox="0 0 56 57"
440
+ fill="none"
441
+ >
442
+ <path
443
+ d="M38.3133 42.3287H16.8933V44.9421H38.3133V42.3287Z"
444
+ fill="var(--text-magazine)"
445
+ />
446
+ <path
447
+ d="M35.7 26.2754L27.6033 12.2754L19.5066 26.2521L9.33331 23.6854L15.0966 39.7154H40.0633L46.6666 23.8487L35.7 26.2754Z"
448
+ fill="var(--text-magazine)"
449
+ />
450
+ </svg>
451
+ {{ $t("more.magazine.text_6") }}
452
+ </div>
453
+ <NuxtLink
454
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
455
+ >
456
+ <img
457
+ :src="
458
+ magazine.data[0]?.cover_url_src ||
459
+ '/imgs/no-cover-img.jpg'
460
+ "
461
+ />
462
+ </NuxtLink>
463
+ </div>
464
+ <NuxtLink
465
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
466
+ :class="'title'"
467
+ >
468
+ <div class="title">
469
+ {{ magazine.data[0]?.name }}
470
+ </div>
471
+ </NuxtLink>
472
+ <div class="sub-infos">
473
+ <div class="edition">
474
+ {{ $t("more.magazine.edition") }} #{{
475
+ magazine.data[0]?.edition_number
476
+ }}
477
+ </div>
478
+ <div class="data">
479
+ {{ formatDate(magazine.data[0]?.release_date) }}
480
+ </div>
481
+ </div>
482
+ <NuxtLink
483
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
484
+ >
105
485
  <img
106
- :src="item.cover_image_url || '/imgs/default.jpg'"
107
- :alt="item.title"
486
+ v-if="magazine.data[0]?.premium === false"
487
+ :src="
488
+ magazine.data[0]?.cover_url_src ||
489
+ '/imgs/no-cover-img.jpg'
490
+ "
108
491
  />
109
- <span v-if="item.is_premium" class="premium-badge">Premium</span>
492
+ </NuxtLink>
493
+
494
+ <div class="description">
495
+ {{ magazine.data[0]?.short_description }}
496
+ </div>
497
+
498
+ <NuxtLink
499
+ :to="`/${locale}/magazine/${magazine.data[0]?.slug}`"
500
+ >
501
+ <button class="btn more">
502
+ {{ $t("more.magazine.btn_1") }} >
503
+ </button>
504
+ </NuxtLink>
505
+ <div
506
+ v-if="
507
+ magazine.data[0]?.public === false &&
508
+ magazine.data[0]?.premium === false
509
+ "
510
+ class="signin action-block"
511
+ >
512
+ {{ $t("more.magazine.text_2") }}
513
+ <div class="download action-block">
514
+ <select v-model="languageId" class="select">
515
+ <option :key="'none'" :value="'none'">
516
+ {{ $t("more.magazine.text_3") }}
517
+ </option>
518
+ <option
519
+ v-for="language in languages"
520
+ :key="language.id"
521
+ :value="language.id"
522
+ >
523
+ {{ language.localized_name }}
524
+ </option>
525
+ </select>
526
+ <ClientOnly>
527
+ <a class="btn primary" :href="accountsRegisterUrl">
528
+ {{ $t("more.magazine.btn_4") }}
529
+ </a>
530
+ </ClientOnly>
531
+ </div>
110
532
  </div>
111
- <div class="magazine-card__info">
112
- <h3>{{ item.title }}</h3>
113
- <span class="edition" v-if="item.edition_number">
114
- {{ $t("more.magazine.edition") }} #{{ item.edition_number }}
115
- </span>
116
- <span class="date">{{ item.release_date || item.created_at }}</span>
533
+ <div
534
+ v-else-if="
535
+ magazine.data[0]?.premium === true &&
536
+ magazine.data[0]?.public === false
537
+ "
538
+ class="download signin py-4 d-flex action-block"
539
+ >
540
+ {{ $t("more.magazine.text_4") }}
541
+ <div class="d-flex flex-row">
542
+ <select v-model="languageId" class="select">
543
+ <option :key="'none'" :value="'none'">
544
+ {{ $t("more.magazine.text_3") }}
545
+ </option>
546
+ <option
547
+ v-for="language in languages"
548
+ :key="language.id"
549
+ :value="language.id"
550
+ >
551
+ {{ language.localized_name }}
552
+ </option>
553
+ </select>
554
+ <button class="btn primary" :href="accountsRegisterUrl">
555
+ {{ $t("more.magazine.btn_5") }}
556
+ </button>
557
+ </div>
117
558
  </div>
118
- </NuxtLink>
559
+ <div v-else class="download flex-row py-4 action-block">
560
+ <select v-model="languageId" class="select">
561
+ <option :key="'none'" :value="'none'">
562
+ {{ $t("more.magazine.text_3") }}
563
+ </option>
564
+ <option
565
+ v-for="language in languages"
566
+ :key="language.id"
567
+ :value="language.id"
568
+ >
569
+ {{ language.localized_name }}
570
+ </option>
571
+ </select>
572
+ <a class="btn primary" @click="downloadPdf()">
573
+ {{ $t("more.magazine.btn_2") }}
574
+ </a>
575
+ </div>
576
+ </div>
119
577
  </div>
120
- </div>
578
+ <div
579
+ v-if="
580
+ Array.isArray(magazine.data) && magazine.data.length > 0
581
+ "
582
+ class="content-magazine"
583
+ >
584
+ <template v-for="edition in uniqueEditions">
585
+ <div
586
+ v-if="
587
+ magazine.data.find(
588
+ (item) =>
589
+ item.edition_number === edition &&
590
+ item.language_id === languageId,
591
+ )
592
+ "
593
+ >
594
+ <div
595
+ class="magazine-card"
596
+ @click="
597
+ handleItemClick(
598
+ magazine.data.find(
599
+ (item) =>
600
+ item.edition_number === edition &&
601
+ item.language_id === languageId,
602
+ ).id,
603
+ )
604
+ "
605
+ >
606
+ <div class="infos">
607
+ <template
608
+ v-if="
609
+ magazine.data.find(
610
+ (item) =>
611
+ item.edition_number === edition &&
612
+ item.language_id === languageId,
613
+ ).premium === true
614
+ "
615
+ >
616
+ <div class="premium-card">
617
+ <div class="premium">
618
+ <svg
619
+ xmlns="http://www.w3.org/2000/svg"
620
+ width="56"
621
+ height="57"
622
+ viewBox="0 0 56 57"
623
+ fill="none"
624
+ >
625
+ <path
626
+ d="M38.3133 42.3287H16.8933V44.9421H38.3133V42.3287Z"
627
+ fill="var(--text-magazine)"
628
+ />
629
+ <path
630
+ d="M35.7 26.2754L27.6033 12.2754L19.5066 26.2521L9.33331 23.6854L15.0966 39.7154H40.0633L46.6666 23.8487L35.7 26.2754Z"
631
+ fill="var(--text-magazine)"
632
+ />
633
+ </svg>
634
+ {{ $t("more.magazine.text_6") }}
635
+ </div>
636
+ <img
637
+ :src="
638
+ magazine.data.find(
639
+ (item) =>
640
+ item.edition_number === edition &&
641
+ item.language_id === languageId,
642
+ ).cover_url_src || '/imgs/no-cover-img.jpg'
643
+ "
644
+ />
645
+ </div>
646
+ </template>
121
647
 
122
- <div
123
- v-if="magazine.data.meta && magazine.data.length < magazine.data.meta.total"
124
- class="load-more"
125
- >
126
- <button @click="loadMore" :disabled="magazine.status === 'pending'">
127
- {{ $t("components.load_more") }}
128
- </button>
648
+ <template v-else>
649
+ <img
650
+ :src="
651
+ magazine.data.find(
652
+ (item) =>
653
+ item.edition_number === edition &&
654
+ item.language_id === languageId,
655
+ ).cover_url_src || '/imgs/no-cover-img.jpg'
656
+ "
657
+ />
658
+ </template>
659
+ <div class="sub-infos">
660
+ <div class="edition">
661
+ {{ $t("more.magazine.edition") }} #{{
662
+ magazine.data.find(
663
+ (item) =>
664
+ item.edition_number === edition &&
665
+ item.language_id === languageId,
666
+ ).edition_number
667
+ }}
668
+ </div>
669
+ <div class="data">
670
+ {{
671
+ formatDate(
672
+ magazine.data.find(
673
+ (item) =>
674
+ item.edition_number === edition &&
675
+ item.language_id === languageId,
676
+ ).release_date,
677
+ )
678
+ }}
679
+ </div>
680
+ </div>
681
+ </div>
682
+ </div>
683
+ </div>
684
+ </template>
685
+ </div>
686
+
687
+ <div
688
+ v-if="
689
+ currentPage < totalPages || magazine.status === 'pending'
690
+ "
691
+ class="d-flex justify-content-center mt-4"
692
+ >
693
+ <button
694
+ v-for="page in totalPages"
695
+ :key="page"
696
+ :class="{
697
+ btn: true,
698
+ secondary: currentPage !== page,
699
+ primary: currentPage === page,
700
+ }"
701
+ @click.prevent="currentPage = page"
702
+ >
703
+ {{ page }}
704
+ </button>
705
+ </div>
129
706
  </div>
130
707
  </div>
131
708
 
132
- <div v-else class="no-data">
709
+ <div
710
+ v-else-if="magazine.status && magazine.status !== 'success'"
711
+ class="container-skelecton"
712
+ >
713
+ <MagazineSkelectonLoading v-for="n in 1" :key="n" />
714
+ </div>
715
+
716
+ <div v-else class="container-skelecton">
717
+ <br />
133
718
  {{ $t("more.magazine.no_data") }}
134
719
  </div>
135
720
  </div>
721
+
722
+ <NewsletterFullWidthComponent />
723
+
724
+ <!-- <div class="col-12">
725
+ <AdSenseComponent :ad-width-responsive="true" />
726
+ </div> -->
136
727
  </div>
137
728
  </div>
138
729
  </section>
@@ -144,12 +735,19 @@ const locale = useNuxtApp().$i18n.locale;
144
735
  color: var(--inactive);
145
736
  font-size: 0.875rem;
146
737
 
738
+ &-container-skelecton {
739
+ display: flex;
740
+ flex-direction: column;
741
+ row-gap: 16px;
742
+ }
743
+
147
744
  .header {
148
745
  position: relative;
149
746
  height: 200px;
150
747
  display: flex;
151
748
  justify-content: center;
152
749
  align-items: center;
750
+ font-size: 0.875rem;
153
751
  margin-bottom: 2rem;
154
752
 
155
753
  & > div {
@@ -161,7 +759,8 @@ const locale = useNuxtApp().$i18n.locale;
161
759
  content: " ";
162
760
  display: block;
163
761
  position: absolute;
164
- background: url("@/assets/images/bg-magazine.png") no-repeat center center / cover;
762
+ background: url("@/assets/images/bg-magazine.png") no-repeat center center /
763
+ cover;
165
764
  width: 100%;
166
765
  height: 100%;
167
766
  top: 50%;
@@ -170,98 +769,382 @@ const locale = useNuxtApp().$i18n.locale;
170
769
  }
171
770
  }
172
771
 
173
- .filters {
174
- margin-bottom: 24px;
175
-
176
- select {
177
- height: 40px;
178
- padding: 0 12px;
179
- border: 1px solid var(--search-bar-border-color);
180
- background: var(--search-bar-bg);
181
- color: var(--search-bar-fg);
182
- font-size: 14px;
183
- min-width: 200px;
184
- }
772
+ .text-page {
773
+ font-family: Roboto;
774
+ font-size: 14px;
775
+ font-style: normal;
776
+ font-weight: 400;
777
+ color: var(--text-magazine);
778
+ line-height: 20px;
185
779
  }
186
780
 
187
- .magazine-grid {
188
- display: grid;
189
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
190
- gap: 24px;
191
- }
781
+ .first-item {
782
+ display: flex;
783
+ padding: 2rem 0;
784
+ align-items: center;
785
+ gap: 32px;
786
+ align-self: stretch;
787
+ border-bottom: 2px solid #ee3831;
788
+ margin-bottom: 40px;
192
789
 
193
- .magazine-card {
194
- &__link {
195
- text-decoration: none;
196
- color: inherit;
197
- }
790
+ .infos {
791
+ display: flex;
792
+ gap: 32px;
793
+
794
+ .premium-card {
795
+ position: relative;
796
+ margin-right: -32px;
198
797
 
199
- &__cover {
200
- position: relative;
201
- margin-bottom: 8px;
798
+ .premium {
799
+ display: flex;
800
+ width: 270px;
801
+ height: 350px;
802
+ padding: 16px;
803
+ flex-direction: column;
804
+ justify-content: center;
805
+ align-items: center;
806
+ background: rgba(19, 22, 28, 0.5);
807
+ backdrop-filter: blur(2px);
808
+ position: absolute;
809
+ color: var(--text-magazine);
810
+ text-align: center;
811
+ font-family: Roboto;
812
+ font-size: 18px;
813
+ font-style: normal;
814
+ font-weight: 600;
815
+ line-height: 26px;
816
+
817
+ img {
818
+ width: 100%;
819
+ height: auto;
820
+ position: relative;
821
+ }
822
+ }
823
+ }
202
824
 
203
825
  img {
204
- width: 100%;
205
- aspect-ratio: 3/4;
206
- object-fit: cover;
826
+ width: 270px;
827
+ height: 350px;
207
828
  }
208
829
 
209
- .premium-badge {
210
- position: absolute;
211
- top: 8px;
212
- right: 8px;
213
- padding: 2px 8px;
214
- background: var(--chip-text);
215
- color: var(--chip-background-2);
216
- font-size: 11px;
830
+ .title {
831
+ font-family: Roboto;
832
+ font-size: 18px;
833
+ font-style: normal;
217
834
  font-weight: 600;
835
+ line-height: 26px;
836
+ color: var(--text-magazine);
218
837
  }
219
- }
220
838
 
221
- &__info {
222
- h3 {
839
+ .sub-infos {
840
+ display: flex;
841
+ align-items: center;
842
+ gap: 24px;
843
+ align-self: stretch;
844
+ margin-top: 24px;
845
+
846
+ .edition {
847
+ color: var(--text-magazine);
848
+ font-family: Roboto;
849
+ font-size: 14px;
850
+ font-style: normal;
851
+ font-weight: 400;
852
+ line-height: 20px;
853
+ }
854
+
855
+ .data {
856
+ font-family: Roboto;
857
+ font-size: 14px;
858
+ font-style: normal;
859
+ font-weight: 400;
860
+ line-height: 20px;
861
+ color: var(--text-magazine);
862
+ text-transform: uppercase;
863
+ }
864
+ }
865
+
866
+ .description {
867
+ font-family: Roboto;
223
868
  font-size: 14px;
224
- font-weight: 600;
225
- color: var(--card-cover-title);
226
- margin-bottom: 4px;
869
+ font-style: normal;
870
+ font-weight: 400;
871
+ color: var(--text-magazine);
872
+ margin-top: 24px;
873
+ margin-bottom: 24px;
874
+ line-height: 20px;
227
875
  }
228
876
 
229
- .edition {
230
- display: block;
877
+ .more {
878
+ display: flex;
879
+ height: 32px;
880
+ padding: 0px 12px;
881
+ flex-direction: column;
882
+ justify-content: center;
883
+ align-items: center;
884
+ background-color: var(--news-card-bg);
885
+ color: #ee3831;
886
+ font-family: Roboto;
231
887
  font-size: 12px;
232
- color: var(--chip-text);
233
- margin-bottom: 2px;
888
+ font-style: normal;
889
+ font-weight: 400;
890
+ line-height: 16px;
234
891
  }
235
892
 
236
- .date {
237
- font-size: 12px;
238
- color: var(--secondary-info-fg);
893
+ .signin {
894
+ display: flex;
895
+ padding: 8px 16px;
896
+ flex-direction: column;
897
+ align-items: flex-start;
898
+ gap: 16px;
899
+ max-width: 618px;
900
+ width: 100%;
901
+ align-self: stretch;
902
+ margin-top: 24px;
903
+ background-color: var(--news-card-bg);
904
+ color: var(--text-magazine);
905
+ font-family: Roboto;
906
+ font-size: 14px;
907
+ font-style: normal;
908
+ font-weight: 400;
909
+ line-height: 20px;
910
+
911
+ .btn {
912
+ display: flex;
913
+ width: 220px;
914
+ height: 44px;
915
+ padding: 0px 12px;
916
+ justify-content: center;
917
+ font-family: Roboto;
918
+ font-size: 16px;
919
+ font-style: normal;
920
+ font-weight: 400;
921
+ line-height: 24px;
922
+ align-items: center;
923
+ }
924
+ }
925
+
926
+ .download {
927
+ //margin-top: 24px;
928
+ width: 100%;
929
+ display: flex;
930
+ //gap: 24px;
931
+
932
+ .select {
933
+ border-style: solid;
934
+ background: transparent;
935
+ border-width: 0px 0px 1px 0px;
936
+ padding: 10px 12px;
937
+ display: flex;
938
+ flex-direction: row;
939
+ max-width: 224px;
940
+ align-items: center;
941
+ justify-content: flex-start;
942
+ align-self: stretch;
943
+ flex-shrink: 0;
944
+ margin-right: 16px;
945
+ color: var(--darkcommunity-content-text-inactive, #aaaaaa);
946
+ text-align: left;
947
+ font: var(--body-1, 400 16px/24px "Roboto", sans-serif);
948
+ position: relative;
949
+ flex: 1;
950
+ transition: 0.15s ease-in-out;
951
+
952
+ &:last-child {
953
+ margin-right: 0px;
954
+ }
955
+
956
+ &:focus,
957
+ &:focus-visible,
958
+ &:active {
959
+ transition: 0.15s ease-in-out;
960
+ border: 2px solid var(--search-bar-active-border-color);
961
+ }
962
+
963
+ option {
964
+ background: var(--search-bar-bg);
965
+ padding: 0px 16px;
966
+ gap: 16px;
967
+ align-items: center;
968
+ justify-content: flex-start;
969
+ height: 48px !important;
970
+ position: relative;
971
+ color: var(--active) !important;
972
+ text-align: left;
973
+ font: var(--body-1, 400 16px/24px "Roboto", sans-serif) !important;
974
+ }
975
+ }
976
+
977
+ .btn {
978
+ display: flex;
979
+ width: 220px;
980
+ height: 44px;
981
+ padding: 0px 12px;
982
+ justify-content: center;
983
+ font-family: Roboto;
984
+ font-size: 16px;
985
+ font-style: normal;
986
+ font-weight: 400;
987
+ line-height: 24px;
988
+ align-items: center;
989
+ }
990
+ }
991
+ }
992
+ }
993
+
994
+ .content-magazine {
995
+ display: flex;
996
+ align-items: flex-start;
997
+ align-content: flex-start;
998
+ gap: 40px 32px;
999
+ align-self: stretch;
1000
+ flex-wrap: wrap;
1001
+
1002
+ .magazine-card:not(.first-item) {
1003
+ display: flex;
1004
+ flex-direction: row;
1005
+ align-items: flex-start;
1006
+ gap: 32px;
1007
+
1008
+ .infos {
1009
+ flex: 1;
1010
+ gap: 12px;
1011
+
1012
+ .premium-card {
1013
+ position: relative;
1014
+
1015
+ .premium {
1016
+ display: flex;
1017
+ width: 222px;
1018
+ height: 287px;
1019
+ padding: 16px;
1020
+ flex-direction: column;
1021
+ justify-content: center;
1022
+ align-items: center;
1023
+ background: rgba(19, 22, 28, 0.5);
1024
+ backdrop-filter: blur(2px);
1025
+ position: absolute;
1026
+ color: var(--text-magazine);
1027
+ text-align: center;
1028
+ font-family: Roboto;
1029
+ font-size: 18px;
1030
+ font-style: normal;
1031
+ font-weight: 600;
1032
+ line-height: 26px;
1033
+
1034
+ img {
1035
+ width: 100%;
1036
+ height: auto;
1037
+ position: relative;
1038
+ }
1039
+ }
1040
+ }
1041
+
1042
+ img {
1043
+ width: 222px;
1044
+ height: 287px;
1045
+ }
1046
+
1047
+ .sub-infos {
1048
+ display: block;
1049
+ align-items: center;
1050
+ gap: 12px;
1051
+ align-self: stretch;
1052
+ margin-top: 12px;
1053
+
1054
+ .edition {
1055
+ color: var(--text-magazine);
1056
+ font-family: Roboto;
1057
+ font-size: 14px;
1058
+ font-style: normal;
1059
+ font-weight: 400;
1060
+ line-height: 20px;
1061
+ }
1062
+
1063
+ .data {
1064
+ font-family: Roboto;
1065
+ font-size: 14px;
1066
+ font-style: normal;
1067
+ font-weight: 400;
1068
+ line-height: 20px;
1069
+ color: var(--text-magazine);
1070
+ text-transform: uppercase;
1071
+ margin-bottom: 8px;
1072
+ }
1073
+ }
1074
+ }
1075
+
1076
+ &:hover {
1077
+ border-bottom: 2px solid #ee3831;
239
1078
  }
240
1079
  }
241
1080
  }
1081
+ }
1082
+
1083
+ @media only screen and (max-width: 768px) {
1084
+ .first-item {
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+
1088
+ .infos {
1089
+ display: flex;
1090
+ flex-direction: column;
1091
+ justify-content: center;
1092
+ align-items: center;
1093
+ gap: 10px !important;
1094
+
1095
+ .sub-infos {
1096
+ display: flex;
1097
+ flex-direction: column;
1098
+ justify-content: center;
1099
+ align-items: center;
1100
+ gap: 12px !important;
1101
+ align-self: stretch;
1102
+ margin: 12px 0 !important;
1103
+ }
1104
+
1105
+ .description {
1106
+ text-align: center;
1107
+ display: flex;
1108
+ width: 100vw !important;
1109
+ padding: 0 1.5rem;
1110
+ margin: 0.5rem 0 !important;
1111
+ }
242
1112
 
243
- .load-more {
244
- text-align: center;
245
- margin-top: 24px;
1113
+ .action-block {
1114
+ width: 90% !important;
1115
+ margin: 1rem auto;
1116
+ }
1117
+ }
1118
+ }
1119
+ .content-magazine {
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ justify-content: center;
1123
+ align-content: center !important;
246
1124
 
247
- button {
248
- padding: 8px 24px;
249
- border: 1px solid var(--chip-text);
250
- background: transparent;
251
- color: var(--chip-text);
252
- cursor: pointer;
253
- font-size: 14px;
1125
+ .magazine-card {
1126
+ flex-direction: column;
1127
+ justify-content: center;
254
1128
 
255
- &:disabled {
256
- opacity: 0.5;
1129
+ .sub-infos {
1130
+ display: flex;
1131
+ flex-direction: column;
1132
+ text-align: center;
257
1133
  }
258
1134
  }
259
1135
  }
1136
+ }
1137
+
1138
+ @media only screen and (max-width: 992px) {
1139
+ .action-block {
1140
+ .select {
1141
+ width: 10%;
1142
+ }
260
1143
 
261
- .no-data {
262
- text-align: center;
263
- padding: 32px;
264
- color: var(--secondary-info-fg);
1144
+ .btn {
1145
+ width: 50% !important;
1146
+ padding: 0;
1147
+ }
265
1148
  }
266
1149
  }
267
1150
  </style>