@saooti/octopus-sdk 40.2.19 → 41.0.0

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 (214) hide show
  1. package/index.ts +2 -1
  2. package/package.json +4 -3
  3. package/src/App.vue +71 -95
  4. package/src/components/composable/player/usePlayerLive.ts +13 -4
  5. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  6. package/src/components/composable/player/usePlayerVast.ts +7 -7
  7. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  8. package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
  9. package/src/components/composable/route/useRouteUpdateParams.ts +4 -4
  10. package/src/components/composable/route/useSimplePageParam.ts +15 -8
  11. package/src/components/composable/useInit.ts +2 -2
  12. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  13. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  14. package/src/components/display/categories/CategoryChooser.vue +144 -145
  15. package/src/components/display/categories/CategoryFilter.vue +172 -198
  16. package/src/components/display/categories/CategoryList.vue +122 -147
  17. package/src/components/display/comments/CommentInput.vue +100 -122
  18. package/src/components/display/comments/CommentList.vue +169 -191
  19. package/src/components/display/comments/CommentName.vue +35 -45
  20. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  21. package/src/components/display/comments/CommentPlayer.vue +38 -50
  22. package/src/components/display/comments/CommentSection.vue +85 -103
  23. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  24. package/src/components/display/comments/item/CommentItem.vue +104 -115
  25. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  26. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  27. package/src/components/display/comments/like/LikeButton.vue +36 -41
  28. package/src/components/display/comments/like/LikeSection.vue +128 -136
  29. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  30. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  31. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  32. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  33. package/src/components/display/edit/EditBox.vue +9 -8
  34. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  35. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  36. package/src/components/display/emission/EmissionItem.vue +57 -69
  37. package/src/components/display/emission/EmissionList.vue +189 -218
  38. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  39. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  40. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  41. package/src/components/display/filter/AdvancedSearch.vue +151 -176
  42. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  43. package/src/components/display/filter/DateFilter.vue +76 -91
  44. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  45. package/src/components/display/filter/ProductorSearch.vue +87 -90
  46. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  47. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  48. package/src/components/display/filter/SearchOrder.vue +35 -35
  49. package/src/components/display/list/ListPaginate.vue +72 -93
  50. package/src/components/display/list/PaginateParams.vue +36 -40
  51. package/src/components/display/list/PaginateSection.vue +113 -124
  52. package/src/components/display/list/SwiperList.vue +97 -109
  53. package/src/components/display/live/CountDown.vue +15 -9
  54. package/src/components/display/live/CountdownOctopus.vue +16 -10
  55. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  56. package/src/components/display/live/LiveItem.vue +64 -73
  57. package/src/components/display/live/LiveList.vue +125 -137
  58. package/src/components/display/live/RadioCurrently.vue +66 -73
  59. package/src/components/display/live/RadioImage.vue +39 -50
  60. package/src/components/display/live/RadioItem.vue +9 -14
  61. package/src/components/display/live/RadioList.vue +39 -53
  62. package/src/components/display/live/RadioPlanning.vue +210 -222
  63. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  64. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  65. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  66. package/src/components/display/participant/ParticipantItem.vue +66 -74
  67. package/src/components/display/participant/ParticipantList.vue +116 -141
  68. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  69. package/src/components/display/playlist/PlaylistList.vue +115 -144
  70. package/src/components/display/playlist/PodcastList.vue +90 -103
  71. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  72. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  73. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  74. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  75. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  76. package/src/components/display/podcasts/PodcastFilterList.vue +62 -56
  77. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  78. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  79. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  80. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  81. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  82. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  83. package/src/components/display/podcasts/PodcastList.vue +182 -206
  84. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  85. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  86. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  87. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  88. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  89. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  90. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  91. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  92. package/src/components/display/podcasts/TagList.vue +48 -50
  93. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  94. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  95. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  96. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  97. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  98. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  99. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  100. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  101. package/src/components/display/sharing/QrCode.vue +55 -67
  102. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  103. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  104. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  105. package/src/components/display/sharing/SharePlayer.vue +273 -295
  106. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  107. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  108. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  109. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  110. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  111. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  112. package/src/components/form/ClassicCheckbox.vue +26 -30
  113. package/src/components/form/ClassicContentEditable.vue +37 -33
  114. package/src/components/form/ClassicCopyButton.vue +40 -44
  115. package/src/components/form/ClassicDatePicker.vue +114 -114
  116. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  117. package/src/components/form/ClassicInputText.vue +116 -120
  118. package/src/components/form/ClassicLoading.vue +7 -12
  119. package/src/components/form/ClassicMultiselect.vue +115 -117
  120. package/src/components/form/ClassicRadio.vue +21 -16
  121. package/src/components/form/ClassicRadioLabel.vue +23 -22
  122. package/src/components/form/ClassicSearch.vue +24 -19
  123. package/src/components/form/ClassicSelect.vue +47 -38
  124. package/src/components/form/ClassicWysiwyg.vue +116 -123
  125. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  126. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  127. package/src/components/icons/BlueSkyIcon.vue +8 -11
  128. package/src/components/icons/DeezerIcon.vue +8 -11
  129. package/src/components/icons/EditFtpIcon.vue +8 -11
  130. package/src/components/icons/IHeartIcon.vue +8 -11
  131. package/src/components/icons/PlayVideoIcon.vue +7 -10
  132. package/src/components/icons/PlayerFmIcon.vue +7 -10
  133. package/src/components/icons/PocketCastIcon.vue +8 -11
  134. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  135. package/src/components/icons/RadiolineIcon.vue +8 -11
  136. package/src/components/icons/TuninIcon.vue +8 -11
  137. package/src/components/icons/XIcon.vue +7 -10
  138. package/src/components/misc/AcpmImage.vue +6 -7
  139. package/src/components/misc/ClassicAccordion.vue +26 -31
  140. package/src/components/misc/ClassicLazy.vue +86 -90
  141. package/src/components/misc/ClassicNav.vue +16 -20
  142. package/src/components/misc/ClassicPopover.vue +271 -282
  143. package/src/components/misc/ClassicSpinner.vue +5 -27
  144. package/src/components/misc/ErrorMessage.vue +11 -12
  145. package/src/components/misc/FooterGarSection.vue +33 -41
  146. package/src/components/misc/FooterSection.vue +94 -131
  147. package/src/components/misc/HomeDropdown.vue +83 -105
  148. package/src/components/misc/MobileMenu.vue +101 -111
  149. package/src/components/misc/ProgressBar.vue +53 -62
  150. package/src/components/misc/TopBar.vue +98 -120
  151. package/src/components/misc/TopBarMainContent.vue +114 -133
  152. package/src/components/misc/modal/ClassicModal.vue +40 -33
  153. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  154. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  155. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  156. package/src/components/misc/modal/MessageModal.vue +50 -47
  157. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  158. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  159. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  160. package/src/components/misc/player/PlayerCompact.vue +6 -4
  161. package/src/components/misc/player/PlayerComponent.vue +8 -9
  162. package/src/components/misc/player/PlayerLarge.vue +9 -8
  163. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  164. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  165. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  166. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  167. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  168. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  169. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  170. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  171. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  172. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  173. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  174. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  175. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  176. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  177. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  178. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  179. package/src/components/pages/CategoryPage.vue +28 -33
  180. package/src/components/pages/EmissionPage.vue +113 -132
  181. package/src/components/pages/EmissionsPage.vue +2 -0
  182. package/src/components/pages/Error403Page.vue +21 -20
  183. package/src/components/pages/HomePage.vue +91 -100
  184. package/src/components/pages/LivesPage.vue +35 -37
  185. package/src/components/pages/MapPage.vue +209 -241
  186. package/src/components/pages/PageLogout.vue +8 -11
  187. package/src/components/pages/PageNotFound.vue +9 -5
  188. package/src/components/pages/ParticipantPage.vue +96 -110
  189. package/src/components/pages/ParticipantsPage.vue +3 -0
  190. package/src/components/pages/PlaylistPage.vue +112 -117
  191. package/src/components/pages/PlaylistsPage.vue +9 -2
  192. package/src/components/pages/PodcastPage.vue +224 -238
  193. package/src/components/pages/PodcastsPage.vue +9 -2
  194. package/src/components/pages/RadioPage.vue +56 -70
  195. package/src/components/pages/RubriquePage.vue +7 -3
  196. package/src/components/pages/SearchPage.vue +31 -36
  197. package/src/components/pages/TagPage.vue +11 -9
  198. package/src/components/pages/VideoPage.vue +14 -11
  199. package/src/helper/displayHelper.ts +1 -1
  200. package/src/helper/loadScript.ts +4 -4
  201. package/src/i18n.ts +2 -2
  202. package/src/main.ts +1 -1
  203. package/src/router/router.ts +17 -4
  204. package/src/stores/AuthStore.ts +12 -12
  205. package/src/stores/FilterStore.ts +1 -1
  206. package/src/stores/VastStore.ts +2 -2
  207. package/src/stores/class/general/player.ts +1 -0
  208. package/public/css/fonts/icomoon.eot +0 -0
  209. package/public/css/fonts/icomoon.svg +0 -113
  210. package/public/css/fonts/icomoon.ttf +0 -0
  211. package/public/css/fonts/icomoon.woff +0 -0
  212. package/public/css/fonts/icomoon.woff2 +0 -0
  213. package/public/css/fonts/style.css +0 -352
  214. package/sonarqube-scanner.js +0 -10
@@ -4,7 +4,7 @@
4
4
  v-show="show"
5
5
  id="mobile-menu-dropdown"
6
6
  class="btn-transparent text-white c-hand m-2 h2"
7
- :title="$t('open left Menu')"
7
+ :title="t('open left Menu')"
8
8
  @click="handleMenuClick"
9
9
  >
10
10
  <MenuIcon :size="34" />
@@ -39,142 +39,132 @@
39
39
  class="octopus-dropdown-item realLink"
40
40
  :href="pathLogin"
41
41
  >
42
- {{ $t("Login") }}
42
+ {{ t("Login") }}
43
43
  </a>
44
44
  <a v-else class="octopus-dropdown-item c-hand" href="/logout">
45
- {{ $t("Logout") }}
45
+ {{ t("Logout") }}
46
46
  </a>
47
47
  <router-link
48
- v-if="!isGarRole"
48
+ v-if="!authStore.isGarRole"
49
49
  class="octopus-dropdown-item"
50
50
  to="/main/pub/contact"
51
51
  >
52
- {{ $t("Contact") }}
52
+ {{ t("Contact") }}
53
53
  </router-link>
54
54
  </ClassicPopover>
55
55
  </div>
56
56
  </template>
57
57
 
58
- <script lang="ts">
58
+ <script setup lang="ts">
59
59
  import MenuIcon from "vue-material-design-icons/Menu.vue";
60
60
  import { useRubriquesFilterComputed } from "../composable/route/useRubriquesFilterComputed";
61
61
  import { state } from "../../stores/ParamSdkStore";
62
- import { defineComponent, defineAsyncComponent } from "vue";
62
+ import { defineAsyncComponent, ref, computed } from "vue";
63
63
  import { useFilterStore } from "../../stores/FilterStore";
64
64
  import { useAuthStore } from "../../stores/AuthStore";
65
- import { mapState } from "pinia";
66
65
  import { useApiStore } from "../../stores/ApiStore";
66
+ import { useI18n } from "vue-i18n";
67
+ import { useRoute } from "vue-router";
67
68
  const ClassicPopover = defineAsyncComponent(
68
69
  () => import("../misc/ClassicPopover.vue"),
69
70
  );
70
- export default defineComponent({
71
- name: "MobileMenu",
72
- components: {
73
- ClassicPopover,
74
- MenuIcon,
75
- },
76
- props: {
77
- isEducation: { default: false, type: Boolean },
78
- show: { default: false, type: Boolean },
79
- notPodcastAndEmission: { default: false, type: Boolean },
80
- scrolled: { default: false, type: Boolean },
81
- },
82
- setup(){
83
- const { rubriqueQueryParam } = useRubriquesFilterComputed();
84
- return { rubriqueQueryParam }
85
- },
86
- data() {
87
- return {
88
- firstLoaded: false as boolean,
89
- };
90
- },
91
- computed: {
92
- ...mapState(useAuthStore, ["authOrgaId", "isGarRole"]),
93
- ...mapState(useFilterStore, ["filterLive", "filterOrgaId", "filterIab"]),
94
- ...mapState(useApiStore, ["frontendUrl"]),
95
- isAuthenticatedWithOrga(): boolean {
96
- return undefined !== this.authOrgaId;
71
+
72
+
73
+ //Props
74
+ const props = defineProps({
75
+ isEducation: { default: false, type: Boolean },
76
+ show: { default: false, type: Boolean },
77
+ notPodcastAndEmission: { default: false, type: Boolean },
78
+ scrolled: { default: false, type: Boolean },
79
+ })
80
+
81
+ //Data
82
+ const firstLoaded = ref(false);
83
+
84
+ //Composables
85
+ const { t } = useI18n();
86
+ const { rubriqueQueryParam } = useRubriquesFilterComputed();
87
+ const authStore = useAuthStore();
88
+ const apiStore = useApiStore();
89
+ const filterStore = useFilterStore();
90
+ const route = useRoute();
91
+
92
+
93
+ //Computed
94
+ const isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);
95
+ const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
96
+ const routerLinkArray = computed(() =>{
97
+ return [
98
+ {
99
+ title: t("My space"),
100
+ routeName: "backoffice",
101
+ condition: isAuthenticatedWithOrga.value,
97
102
  },
98
- pathLogin(){
99
- return "/sso/login?redirect_url="+encodeURI(this.frontendUrl + this.$route.fullPath);
103
+ { title: t("Home"), routeName: "home", condition: true },
104
+ {
105
+ title: t("Radio & Live"),
106
+ routeName: "lives",
107
+ condition:
108
+ state.generalParameters.isLiveTab &&
109
+ ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),
100
110
  },
101
- routerLinkArray() {
102
- return [
103
- {
104
- title: this.$t("My space"),
105
- routeName: "backoffice",
106
- condition: this.isAuthenticatedWithOrga,
107
- },
108
- { title: this.$t("Home"), routeName: "home", condition: true },
109
- {
110
- title: this.$t("Radio & Live"),
111
- routeName: "lives",
112
- condition:
113
- state.generalParameters.isLiveTab &&
114
- ((this.filterOrgaId && this.filterLive) || !this.filterOrgaId),
115
- },
116
- {
117
- title: this.$t("Podcasts"),
118
- routeName: "podcasts",
119
- condition: !this.notPodcastAndEmission,
120
- },
121
- {
122
- title: this.$t("Emissions"),
123
- routeName: "emissions",
124
- condition: !this.notPodcastAndEmission,
125
- },
126
- {
127
- title: this.$t("Productors"),
128
- routeName: "productors",
129
- condition:
130
- !this.isPodcastmaker && (!this.filterOrgaId || this.isEducation),
131
- },
132
- {
133
- title: this.$t("Playlists"),
134
- routeName: "playlists",
135
- condition: true,
136
- },
137
- {
138
- title: this.$t("Speakers"),
139
- routeName: "participants",
140
- condition: true,
141
- },
142
- {
143
- title: this.$t("Create an account"),
144
- routeName: "createAccount",
145
- condition: !this.isAuthenticatedWithOrga,
146
- },
147
- ];
111
+ {
112
+ title: t("Podcasts"),
113
+ routeName: "podcasts",
114
+ condition: !props.notPodcastAndEmission,
148
115
  },
149
- isPodcastmaker(): boolean {
150
- return state.generalParameters.podcastmaker as boolean;
116
+ {
117
+ title: t("Emissions"),
118
+ routeName: "emissions",
119
+ condition: !props.notPodcastAndEmission,
151
120
  },
152
- },
153
-
154
- methods: {
155
- handleMenuClick() {
156
- if (this.firstLoaded) {
157
- return;
158
- }
159
- this.firstLoaded = true;
160
- setTimeout(() => {
161
- document.getElementById("mobile-menu-dropdown")?.click();
162
- }, 200);
121
+ {
122
+ title: t("Productors"),
123
+ routeName: "productors",
124
+ condition:
125
+ !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),
126
+ },
127
+ {
128
+ title: t("Playlists"),
129
+ routeName: "playlists",
130
+ condition: true,
131
+ },
132
+ {
133
+ title: t("Speakers"),
134
+ routeName: "participants",
135
+ condition: true,
163
136
  },
164
- getQueriesRouter(routeName: string) {
165
- if (
166
- "podcasts" !== routeName &&
167
- "emissions" !== routeName &&
168
- "home" !== routeName
169
- ) {
170
- return { productor: this.filterOrgaId };
171
- }
172
- return {
173
- productor: this.filterOrgaId,
174
- iabId: this.filterIab?.id,
175
- rubriquesId: this.rubriqueQueryParam,
176
- };
137
+ {
138
+ title: t("Create an account"),
139
+ routeName: "createAccount",
140
+ condition: !isAuthenticatedWithOrga.value,
177
141
  },
178
- },
142
+ ];
179
143
  });
144
+
145
+
146
+ //Methods
147
+ function handleMenuClick() {
148
+ if (firstLoaded.value) {
149
+ return;
150
+ }
151
+ firstLoaded.value = true;
152
+ setTimeout(() => {
153
+ document.getElementById("mobile-menu-dropdown")?.click();
154
+ }, 200);
155
+ }
156
+ function getQueriesRouter(routeName: string) {
157
+ if (
158
+ "podcasts" !== routeName &&
159
+ "emissions" !== routeName &&
160
+ "home" !== routeName
161
+ ) {
162
+ return { productor: filterStore.filterOrgaId };
163
+ }
164
+ return {
165
+ productor: filterStore.filterOrgaId,
166
+ iabId: filterStore.filterIab?.id,
167
+ rubriquesId: rubriqueQueryParam.value,
168
+ };
169
+ }
180
170
  </script>
@@ -10,10 +10,10 @@
10
10
  aria-valuenow="0"
11
11
  aria-valuemin="0"
12
12
  aria-valuemax="100"
13
- :aria-label="$t('Live progress bar')"
13
+ :aria-label="t('Live progress bar')"
14
14
  :style="'width: ' + secondaryProgress + '%'"
15
15
  />
16
- <template v-if="playerMedia">
16
+ <template v-if="playerStore.playerMedia">
17
17
  <div
18
18
  v-if="mediaCueInPercent > 0"
19
19
  class="octopus-progress-bar bg-complementary"
@@ -30,10 +30,10 @@
30
30
  aria-valuenow="0"
31
31
  aria-valuemin="0"
32
32
  aria-valuemax="100"
33
- :aria-label="$t('Listening progress bar')"
33
+ :aria-label="t('Listening progress bar')"
34
34
  :style="'width: ' + mainProgress + '%'"
35
35
  />
36
- <template v-if="playerMedia">
36
+ <template v-if="playerStore.playerMedia">
37
37
  <div
38
38
  v-if="mediaCueInPercent > 0"
39
39
  class="octopus-progress-bar octopus-progress-bar-duration bg-complementary"
@@ -55,8 +55,8 @@
55
55
  class="octopus-progress-bar-cursor"
56
56
  :style="'left:' + mainProgress + '%'"
57
57
  />
58
- <template v-if="playerChapteringPercent">
59
- <template v-for="chapter in playerChapteringPercent" :key="chapter">
58
+ <template v-if="playerStore.playerChapteringPercent">
59
+ <template v-for="chapter in playerStore.playerChapteringPercent" :key="chapter">
60
60
  <div
61
61
  :id="'chapter-' + chapter.startPercent"
62
62
  class="octopus-progress-bar octopus-chapter"
@@ -82,66 +82,57 @@
82
82
  </div>
83
83
  </template>
84
84
 
85
- <script lang="ts">
85
+ <script setup lang="ts">
86
86
  import { usePlayerStore } from "../../stores/PlayerStore";
87
- import { mapState } from "pinia";
88
- import { defineAsyncComponent, defineComponent } from "vue";
87
+ import { computed, defineAsyncComponent, ref, watch } from "vue";
88
+ import { useI18n } from "vue-i18n";
89
89
  const ClassicPopover = defineAsyncComponent(
90
90
  () => import("../misc/ClassicPopover.vue"),
91
91
  );
92
- export default defineComponent({
93
- name: "ProgressBar",
94
- components: {
95
- ClassicPopover,
96
- },
97
- props: {
98
- alertBar: { default: undefined, type: Number },
99
- mainProgress: { default: 0, type: Number },
100
- secondaryProgress: { default: 0, type: Number },
101
- isProgressCursor: { default: false, type: Boolean },
102
- inPlayer: { default: false, type: Boolean },
103
- },
104
- data() {
105
- return {
106
- mediaCueInPercent: 0 as number,
107
- mediaCueOutPercent: 100 as number,
108
- };
109
- },
110
- computed: {
111
- ...mapState(usePlayerStore, [
112
- "playerMedia",
113
- "playerChapteringPercent",
114
- "playerStatus",
115
- ]),
116
- display() {
117
- return "STOPPED" !== this.playerStatus;
118
- },
119
- },
120
- watch: {
121
- playerMedia: {
122
- deep: true,
123
- immediate: true,
124
- handler() {
125
- if (this.playerMedia) {
126
- this.mediaCueInPercent = this.timeMediaToPercent(
127
- this.playerMedia.cueIn ?? 0,
128
- );
129
- this.mediaCueOutPercent = this.timeMediaToPercent(
130
- this.playerMedia.cueOut ?? null,
131
- );
132
- }
133
- },
134
- },
135
- },
136
- methods: {
137
- timeMediaToPercent(value: number | null): number {
138
- if (null === value || !this.playerMedia) {
139
- return 100;
140
- }
141
- return (value * 100) / (this.playerMedia?.duration ?? 1);
142
- },
143
- },
144
- });
92
+
93
+ //Props
94
+ defineProps({
95
+ alertBar: { default: undefined, type: Number },
96
+ mainProgress: { default: 0, type: Number },
97
+ secondaryProgress: { default: 0, type: Number },
98
+ isProgressCursor: { default: false, type: Boolean },
99
+ inPlayer: { default: false, type: Boolean },
100
+ })
101
+
102
+
103
+ //Data
104
+ const mediaCueInPercent = ref(0);
105
+ const mediaCueOutPercent = ref(100);
106
+
107
+
108
+ //Composables
109
+ const { t } = useI18n();
110
+ const playerStore = usePlayerStore();
111
+
112
+ //Computed
113
+ const display = computed(() => "STOPPED" !== playerStore.playerStatus);
114
+
115
+
116
+ //Watch
117
+ watch(()=>playerStore.playerMedia, () => {
118
+ if (playerStore.playerMedia) {
119
+ mediaCueInPercent.value = timeMediaToPercent(
120
+ playerStore.playerMedia.cueIn ?? 0,
121
+ );
122
+ mediaCueOutPercent.value = timeMediaToPercent(
123
+ playerStore.playerMedia.cueOut ?? null,
124
+ );
125
+ }
126
+ }, {deep: true, immediate: true});
127
+
128
+
129
+ //Methods
130
+ function timeMediaToPercent(value: number | null): number {
131
+ if (null === value || !playerStore.playerMedia) {
132
+ return 100;
133
+ }
134
+ return (value * 100) / (playerStore.playerMedia?.duration ?? 1);
135
+ }
145
136
  </script>
146
137
 
147
138
  <style lang="scss">
@@ -3,7 +3,7 @@
3
3
  role="banner"
4
4
  class="header-saooti-play"
5
5
  :style="headerBackgroundImage"
6
- :class="[contentToDisplay ? 'header-img-bg':'header-color-bg', scrolled? 'scrolled':'', needToBlur ? 'header-force-blur':'']"
6
+ :class="[generalStore.contentToDisplay ? 'header-img-bg':'header-color-bg', scrolled? 'scrolled':'', needToBlur ? 'header-force-blur':'']"
7
7
  >
8
8
  <TopBarMainContent
9
9
  :is-phone="isPhone"
@@ -13,27 +13,26 @@
13
13
  :class="headerBackgroundImage.length ? 'header-opacity':''"
14
14
  />
15
15
  </header>
16
- <div v-if="contentToDisplay" class="header-content-bg" :style="headerBackgroundImage" :class="{ scrolled: scrolled, 'header-force-blur':needToBlur }" >
16
+ <div v-if="generalStore.contentToDisplay" class="header-content-bg" :style="headerBackgroundImage" :class="{ scrolled: scrolled, 'header-force-blur':needToBlur }" >
17
17
  <div class="header-additional-content header-content">
18
18
  <h1 v-if="!scrolled" class="text-truncate">
19
19
  {{ titleToDisplay }}
20
20
  </h1>
21
21
  <SubscribeButtons
22
- v-if="!isGarRole"
22
+ v-if="!authStore.isGarRole"
23
23
  v-show="!scrolled"
24
24
  :emission="emissionObject"
25
- :playlist-id="contentToDisplay?.playlistId"
25
+ :playlist-id="generalStore.contentToDisplay?.playlistId"
26
26
  :window-width="windowWidth"
27
27
  />
28
28
  </div>
29
29
  </div>
30
30
  </template>
31
31
 
32
- <script lang="ts">
32
+ <script setup lang="ts">
33
33
  import {useImageProxy} from "../composable/useImageProxy";
34
34
  import TopBarMainContent from "./TopBarMainContent.vue";
35
- import { mapState } from "pinia";
36
- import { defineAsyncComponent, defineComponent } from "vue";
35
+ import { computed, defineAsyncComponent, onBeforeUnmount, onMounted, ref, watch } from "vue";
37
36
  import { useAuthStore } from "../../stores/AuthStore";
38
37
  import { useGeneralStore } from "../../stores/GeneralStore";
39
38
  import { Podcast } from "@/stores/class/general/podcast";
@@ -45,121 +44,100 @@ import axios from "axios";
45
44
  const SubscribeButtons = defineAsyncComponent(
46
45
  () => import("../display/sharing/SubscribeButtons.vue"),
47
46
  );
48
- export default defineComponent({
49
- name: "TopBar",
50
- components: {
51
- TopBarMainContent,
52
- SubscribeButtons,
53
- },
54
- setup(){
55
- const { isPhone, windowWidth } = useResizePhone();
56
- const { useProxyImageUrl } = useImageProxy();
57
- return { isPhone, windowWidth, useProxyImageUrl }
58
- },
59
47
 
60
- data() {
61
- return {
62
- scrolled: false as boolean,
63
- oldScrollY: 0 as number,
64
- minScroll: 0 as number,
65
- headerBackgroundImage: "" as string,
66
- needToBlur: false as boolean,
67
- };
68
- },
69
- computed: {
70
- ...mapState(useAuthStore, ["isGarRole"]),
71
- ...mapState(useGeneralStore, ["contentToDisplay"]),
72
- isContentToDisplay(): boolean {
73
- return (
74
- "podcast" === this.$route.name ||
75
- "emission" === this.$route.name ||
76
- "playlist" === this.$route.name ||
77
- "radio" === this.$route.name
78
- );
79
- },
80
- titleToDisplay(): string {
81
- if ((this.contentToDisplay as Podcast)?.podcastId) {
82
- return (this.contentToDisplay as Podcast).emission.name;
83
- }
84
- if ((this.contentToDisplay as Playlist)?.playlistId) {
85
- return (this.contentToDisplay as Playlist).title;
86
- }
87
- if ((this.contentToDisplay as Emission)?.emissionId) {
88
- return (this.contentToDisplay as Emission).name;
89
- }
90
- if ((this.contentToDisplay as Canal)?.id) {
91
- return (this.contentToDisplay as Canal).name;
92
- }
93
- return "";
94
- },
95
- emissionObject(): Emission | null {
96
- if ((this.contentToDisplay as Podcast)?.podcastId) {
97
- return (this.contentToDisplay as Podcast).emission;
98
- }
99
- if ((this.contentToDisplay as Emission)?.emissionId) {
100
- return this.contentToDisplay as Emission;
101
- }
102
- return null;
103
- },
104
- },
105
- watch:{
106
- contentToDisplay: {
107
- deep: true,
108
- immediate: true,
109
- async handler() {
110
- if(!this.contentToDisplay){
111
- this.headerBackgroundImage = "";
112
- this.needToBlur = false;
113
- return;
114
- }
115
- const proxyUrl = this.useProxyImageUrl(this.contentToDisplay.imageUrl,"270", undefined, true);
116
- try {
117
- const result = await axios.get(proxyUrl);
118
- this.headerBackgroundImage = `background-image: url('${result.data}');`;
119
- if(result.data !== this.contentToDisplay.imageUrl){
120
- this.needToBlur = false;
121
- }else{
122
- this.needToBlur = true;
123
- }
124
- } catch {
125
- this.headerBackgroundImage = this.contentToDisplay.imageUrl ? `background-image: url('${this.contentToDisplay.imageUrl}');` : "";
126
- this.needToBlur = true;
127
- }
128
- },
129
- },
130
- },
131
- mounted() {
132
- window.addEventListener("scroll", this.handleScroll);
133
- },
134
- beforeUnmount() {
135
- window.removeEventListener("scroll", this.handleScroll);
136
- },
137
- methods: {
138
- handleScroll(): void {
139
- if (
140
- window.scrollY - this.oldScrollY > 0 &&
141
- window.scrollY > 1 &&
142
- document.body.offsetHeight - window.innerHeight > 40
143
- ) {
144
- if (!this.scrolled) {
145
- this.scrolled = true;
146
- this.minScroll = 0;
147
- }
148
- } else if (
149
- window.scrollY - this.oldScrollY < 0 &&
150
- window.scrollY < 1 &&
151
- this.minScroll > 20
152
- ) {
153
- this.scrolled = false;
154
- this.minScroll = 0;
155
- }
156
- this.oldScrollY = window.scrollY;
157
- if (this.minScroll < window.scrollY) {
158
- this.minScroll = window.scrollY;
159
- }
160
- },
161
- },
48
+
49
+ //Data
50
+ const scrolled = ref(false);
51
+ const oldScrollY = ref(0);
52
+ const minScroll = ref(0);
53
+ const headerBackgroundImage = ref("");
54
+ const needToBlur = ref(false);
55
+
56
+
57
+ //Composables
58
+ const { isPhone, windowWidth } = useResizePhone();
59
+ const { useProxyImageUrl } = useImageProxy();
60
+ const authStore = useAuthStore();
61
+ const generalStore = useGeneralStore();
62
+
63
+ //Computed
64
+ const titleToDisplay = computed(() => {
65
+ if ((generalStore.contentToDisplay as Podcast)?.podcastId) {
66
+ return (generalStore.contentToDisplay as Podcast).emission.name;
67
+ }
68
+ if ((generalStore.contentToDisplay as Playlist)?.playlistId) {
69
+ return (generalStore.contentToDisplay as Playlist).title;
70
+ }
71
+ if ((generalStore.contentToDisplay as Emission)?.emissionId) {
72
+ return (generalStore.contentToDisplay as Emission).name;
73
+ }
74
+ if ((generalStore.contentToDisplay as Canal)?.id) {
75
+ return (generalStore.contentToDisplay as Canal).name;
76
+ }
77
+ return "";
78
+ });
79
+ const emissionObject = computed(() => {
80
+ if ((generalStore.contentToDisplay as Podcast)?.podcastId) {
81
+ return (generalStore.contentToDisplay as Podcast).emission;
82
+ }
83
+ if ((generalStore.contentToDisplay as Emission)?.emissionId) {
84
+ return generalStore.contentToDisplay as Emission;
85
+ }
86
+ return null;
162
87
  });
88
+
89
+ //Watch
90
+ watch(()=>generalStore.contentToDisplay, async () => {
91
+ if(!generalStore.contentToDisplay){
92
+ headerBackgroundImage.value = "";
93
+ needToBlur.value = false;
94
+ return;
95
+ }
96
+ const widthAsked = window.innerWidth > 960 ? "1600":"1000";
97
+ const proxyUrl = useProxyImageUrl(generalStore.contentToDisplay.imageUrl,widthAsked, undefined, true);
98
+ try {
99
+ const result = await axios.get(proxyUrl);
100
+ headerBackgroundImage.value = `background-image: url('${result.data}');`;
101
+ needToBlur.value = result.data === generalStore.contentToDisplay.imageUrl;
102
+ } catch {
103
+ headerBackgroundImage.value = generalStore.contentToDisplay.imageUrl ? `background-image: url('${generalStore.contentToDisplay.imageUrl}');` : "";
104
+ needToBlur.value = true;
105
+ }
106
+ }, {deep: true, immediate: true});
107
+
108
+
109
+ onMounted(()=>{
110
+ window.addEventListener("scroll", handleScroll);
111
+ })
112
+ onBeforeUnmount(() => {
113
+ window.removeEventListener("scroll", handleScroll);
114
+ })
115
+
116
+
117
+ //Methods
118
+ function handleScroll(): void {
119
+ if (
120
+ window.scrollY - oldScrollY.value > 0 &&
121
+ window.scrollY > 1 &&
122
+ document.body.offsetHeight - window.innerHeight > 40
123
+ ) {
124
+ if (!scrolled.value) {
125
+ scrolled.value = true;
126
+ minScroll.value = 0;
127
+ }
128
+ } else if (
129
+ window.scrollY - oldScrollY.value < 0 &&
130
+ window.scrollY < 1 &&
131
+ minScroll.value > 20
132
+ ) {
133
+ scrolled.value = false;
134
+ minScroll.value = 0;
135
+ }
136
+ oldScrollY.value = window.scrollY;
137
+ if (minScroll.value < window.scrollY) {
138
+ minScroll.value = window.scrollY;
139
+ }
140
+ }
163
141
  </script>
164
142
 
165
143
  <style lang="scss">