@saooti/octopus-sdk 41.0.5 → 41.0.6

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saooti/octopus-sdk",
3
- "version": "41.0.5",
3
+ "version": "41.0.6",
4
4
  "private": false,
5
5
  "description": "Javascript SDK for using octopus",
6
6
  "author": "Saooti",
package/plateform.conf CHANGED
@@ -1 +1 @@
1
- dev2.saooti.org
1
+ preprod.saooti.org
@@ -51,8 +51,8 @@ export const usePlayerLive = (hlsReady: Ref<boolean>)=>{
51
51
  }
52
52
 
53
53
  function playLive() {
54
- if (!playerStore.playerLive) return;
55
- playerStore.playerUpdatePlayerHlsUrl(`${apiStore.hlsUrl}live/dev.${playerStore.playerLive.conferenceId}/index.m3u8`);
54
+ if (!playerStore.playerHlsIdentifier) return;
55
+ playerStore.playerUpdatePlayerHlsUrl(`${apiStore.hlsUrl}live/${playerStore.playerHlsIdentifier}/index.m3u8`);
56
56
  playHls();
57
57
  }
58
58
 
@@ -211,7 +211,10 @@ function play(isVideo: boolean): void {
211
211
  playerStore.playerPlay(
212
212
  {
213
213
  ...props.podcast,
214
- ...{ conferenceId: props.fetchConference?.conferenceId },
214
+ ...{
215
+ conferenceId: props.fetchConference?.conferenceId,
216
+ hlsIdentifier: props.fetchConference?.hlsIdentifier,
217
+ },
215
218
  },
216
219
  isVideo,
217
220
  );
@@ -32,113 +32,43 @@
32
32
  :left-pos="true"
33
33
  :is-top-layer="true"
34
34
  >
35
- <nav :aria-label="t('User menu')">
36
- <ul class="p-0 m-0">
37
- <template v-if="!isAuthenticated">
38
- <li class="li-style-none">
39
- <a class="octopus-dropdown-item realLink" :href="pathLogin">
40
- {{ t("Login") }}
41
- </a>
42
- </li>
43
- <li class="li-style-none">
44
- <router-link
45
- v-if="!state.generalParameters.podcastmaker"
46
- class="octopus-dropdown-item"
47
- to="/main/pub/create"
48
- >
49
- {{ t("Create an account") }}
50
- </router-link>
51
- </li>
52
- </template>
53
- <template v-else>
54
- <li v-for="routerBack in routerBackoffice" :key="routerBack.path" class="li-style-none">
55
- <router-link
56
- v-if="!state.generalParameters.podcastmaker && routerBack.condition"
57
- :class="routerBack.class"
58
- :to="routerBack.path"
59
- >
60
- {{ routerBack.title }}
61
- </router-link>
62
- </li>
63
- <template v-if="helpLinks.length">
64
- <hr />
65
- <li v-for="helpLink in helpLinks" :key="helpLink.title" class="li-style-none">
66
- <a
67
- :href="helpLink.href"
68
- class="octopus-dropdown-item realLink"
69
- rel="noreferrer noopener"
70
- target="_blank"
71
- :title="t('New window', {text: helpLink.title})"
72
- >
73
- {{ helpLink.title }}
74
- <OpenInNewIcon class="ms-1" :size="15"/>
75
- </a>
76
- </li>
77
- </template>
78
- <hr />
79
- <li class="li-style-none">
80
- <a class="octopus-dropdown-item c-hand" href="/logout">
81
- {{ t("Logout") }}
82
- </a>
83
- </li>
84
- </template>
85
- <li class="li-style-none">
86
- <router-link
87
- v-if="!authStore.isGarRole"
88
- class="octopus-dropdown-item"
89
- to="/main/pub/contact"
90
- >
91
- {{ t("Contact") }}
92
- </router-link>
93
- </li>
94
- </ul>
95
- </nav>
35
+ <UserButtonContent :isEducation="isEducation" :navLabel="t('User menu')" :specificRoutes="routerBackoffice"/>
96
36
  </ClassicPopover>
97
37
  </div>
98
38
  </template>
99
39
 
100
40
  <script setup lang="ts">
101
- import OpenInNewIcon from "vue-material-design-icons/OpenInNew.vue";
41
+ import UserButtonContent from "./UserButtonContent.vue";
102
42
  import AppsIcon from "vue-material-design-icons/Apps.vue";
103
43
  import AccountIcon from "vue-material-design-icons/Account.vue";
104
44
  import DownloadIcon from "vue-material-design-icons/Download.vue";
105
- import { state } from "../../stores/ParamSdkStore";
106
45
  import ClassicPopover from "../misc/ClassicPopover.vue";
107
46
  import { useAuthStore } from "../../stores/AuthStore";
108
47
  import { computed } from "vue";
109
- import { useApiStore } from "../../stores/ApiStore";
110
48
  import { useI18n } from "vue-i18n";
111
49
  import { useRoute, useRouter } from "vue-router";
112
50
 
113
51
  //Props
114
- const props = defineProps({
52
+ defineProps({
115
53
  isEducation: { default: false, type: Boolean },
116
54
  mobileMenuDisplay: { default: false, type: Boolean },
117
- scrolled: { default: false, type: Boolean },
118
55
  })
119
56
 
120
57
  //Composables
121
58
  const { t } = useI18n();
122
59
  const authStore = useAuthStore();
123
- const apiStore = useApiStore();
124
60
  const route = useRoute();
125
61
  const router = useRouter();
126
62
 
127
63
  //Computed
128
64
  const isAuthenticated = computed(() => undefined !== authStore.authProfile?.userId);
129
65
  const isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);
130
- const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
131
66
  const organisationsAvailable = computed(() => authStore.authProfile?.organisations ?? []);
132
- const helpLinks = computed(() => {
133
- if (authStore.isGarRole || props.isEducation) {
67
+
68
+ const routerBackoffice = computed(() => {
69
+ if(!isAuthenticated.value){
134
70
  return [];
135
71
  }
136
- return [
137
- { title:t("Help"), href: "https://help.octopus.saooti.com/Aide/"},
138
- { title: t("TutoMag"), href: "https://help.octopus.saooti.com/" },
139
- ];
140
- });
141
- const routerBackoffice = computed(() => {
142
72
  return [
143
73
  {
144
74
  title: t("My space"),
@@ -18,39 +18,11 @@
18
18
  :left-pos="true"
19
19
  :is-top-layer="true"
20
20
  >
21
- <template v-for="link in routerLinkArray" :key="link.routeName">
22
- <router-link
23
- v-if="link.condition"
24
- :class="
25
- 'home' === link.routeName
26
- ? 'octopus-dropdown-item show-phone-flex'
27
- : 'octopus-dropdown-item'
28
- "
29
- :to="{
30
- name: link.routeName,
31
- query: getQueriesRouter(link.routeName),
32
- }"
33
- >
34
- {{ link.title }}
35
- </router-link>
36
- </template>
37
- <a
38
- v-if="!isAuthenticatedWithOrga"
39
- class="octopus-dropdown-item realLink"
40
- :href="pathLogin"
41
- >
42
- {{ t("Login") }}
43
- </a>
44
- <a v-else class="octopus-dropdown-item c-hand" href="/logout">
45
- {{ t("Logout") }}
46
- </a>
47
- <router-link
48
- v-if="!authStore.isGarRole"
49
- class="octopus-dropdown-item"
50
- to="/main/pub/contact"
51
- >
52
- {{ t("Contact") }}
53
- </router-link>
21
+ <UserButtonContent
22
+ :isEducation="isEducation"
23
+ :navLabel="t('User menu')"
24
+ :specificRoutes="routerLinkArray"
25
+ :displayUserContent="displayUserContent"/>
54
26
  </ClassicPopover>
55
27
  </div>
56
28
  </template>
@@ -62,20 +34,20 @@ import { state } from "../../stores/ParamSdkStore";
62
34
  import { defineAsyncComponent, ref, computed } from "vue";
63
35
  import { useFilterStore } from "../../stores/FilterStore";
64
36
  import { useAuthStore } from "../../stores/AuthStore";
65
- import { useApiStore } from "../../stores/ApiStore";
66
37
  import { useI18n } from "vue-i18n";
67
- import { useRoute } from "vue-router";
38
+ import { useResizePhone } from "../composable/useResizePhone";
68
39
  const ClassicPopover = defineAsyncComponent(
69
40
  () => import("../misc/ClassicPopover.vue"),
70
41
  );
71
-
42
+ const UserButtonContent = defineAsyncComponent(
43
+ () => import("./UserButtonContent.vue"),
44
+ );
72
45
 
73
46
  //Props
74
47
  const props = defineProps({
75
48
  isEducation: { default: false, type: Boolean },
76
49
  show: { default: false, type: Boolean },
77
50
  notPodcastAndEmission: { default: false, type: Boolean },
78
- scrolled: { default: false, type: Boolean },
79
51
  })
80
52
 
81
53
  //Data
@@ -85,60 +57,90 @@ const firstLoaded = ref(false);
85
57
  const { t } = useI18n();
86
58
  const { rubriqueQueryParam } = useRubriquesFilterComputed();
87
59
  const authStore = useAuthStore();
88
- const apiStore = useApiStore();
89
60
  const filterStore = useFilterStore();
90
- const route = useRoute();
61
+ const { windowWidth } = useResizePhone();
91
62
 
92
63
 
93
64
  //Computed
65
+ const displayUserContent = computed(() => 500>=windowWidth.value);
94
66
  const isAuthenticatedWithOrga = computed(() => undefined !== authStore.authOrgaId);
95
- const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
96
67
  const routerLinkArray = computed(() =>{
97
68
  return [
98
69
  {
99
70
  title: t("My space"),
100
- routeName: "backoffice",
71
+ path:{
72
+ name: "backoffice",
73
+ query: getQueriesRouter(true),
74
+ },
75
+ class: "octopus-dropdown-item",
101
76
  condition: isAuthenticatedWithOrga.value,
102
77
  },
103
- { title: t("Home"), routeName: "home", condition: true },
78
+ {
79
+ title: t("Home"),
80
+ path:{
81
+ name: "home",
82
+ query: getQueriesRouter(false),
83
+ },
84
+ class:"octopus-dropdown-item show-phone-flex",
85
+ condition: true
86
+ },
104
87
  {
105
88
  title: t("Radio & Live"),
106
- routeName: "lives",
89
+ path:{
90
+ name: "lives",
91
+ query: getQueriesRouter(true),
92
+ },
93
+ class: "octopus-dropdown-item",
107
94
  condition:
108
95
  state.generalParameters.isLiveTab &&
109
96
  ((filterStore.filterOrgaId && filterStore.filterLive) || !filterStore.filterOrgaId),
110
97
  },
111
98
  {
112
99
  title: t("Podcasts"),
113
- routeName: "podcasts",
100
+ path:{
101
+ name: "podcasts",
102
+ query: getQueriesRouter(false),
103
+ },
104
+ class: "octopus-dropdown-item",
114
105
  condition: !props.notPodcastAndEmission,
115
106
  },
116
107
  {
117
108
  title: t("Emissions"),
118
- routeName: "emissions",
109
+ path:{
110
+ name: "emissions",
111
+ query: getQueriesRouter(false),
112
+ },
113
+ class: "octopus-dropdown-item",
119
114
  condition: !props.notPodcastAndEmission,
120
115
  },
121
116
  {
122
117
  title: t("Productors"),
123
- routeName: "productors",
118
+ path:{
119
+ name: "productors",
120
+ query: getQueriesRouter(true),
121
+ },
122
+ class: "octopus-dropdown-item",
124
123
  condition:
125
124
  !state.generalParameters.podcastmaker && (!filterStore.filterOrgaId || props.isEducation),
126
125
  },
127
126
  {
128
127
  title: t("Playlists"),
129
- routeName: "playlists",
128
+ path:{
129
+ name: "playlists",
130
+ query: getQueriesRouter(true),
131
+ },
132
+ class: "octopus-dropdown-item",
130
133
  condition: true,
131
134
  },
132
135
  {
133
136
  title: t("Speakers"),
134
- routeName: "participants",
137
+ path:{
138
+ name: "participants",
139
+ query: getQueriesRouter(true),
140
+ },
141
+ class: "octopus-dropdown-item",
135
142
  condition: true,
136
143
  },
137
- {
138
- title: t("Create an account"),
139
- routeName: "createAccount",
140
- condition: !isAuthenticatedWithOrga.value,
141
- },
142
144
  ];
143
145
  });
144
146
 
@@ -153,12 +155,8 @@ function handleMenuClick() {
153
155
  document.getElementById("mobile-menu-dropdown")?.click();
154
156
  }, 200);
155
157
  }
156
- function getQueriesRouter(routeName: string) {
157
- if (
158
- "podcasts" !== routeName &&
159
- "emissions" !== routeName &&
160
- "home" !== routeName
161
- ) {
158
+ function getQueriesRouter(onlyProductor:boolean) {
159
+ if (onlyProductor) {
162
160
  return { productor: filterStore.filterOrgaId };
163
161
  }
164
162
  return {
@@ -136,12 +136,10 @@
136
136
  :is-education="generalStore.platformEducation"
137
137
  :show="mobileMenuDisplay"
138
138
  :not-podcast-and-emission="inContentDisplayPage && !scrolled"
139
- :scrolled="scrolled"
140
139
  />
141
140
  <HomeDropdown
142
141
  :is-education="generalStore.platformEducation"
143
142
  :mobile-menu-display="mobileMenuDisplay"
144
- :scrolled="scrolled"
145
143
  />
146
144
  <router-link
147
145
  v-show="!isPhone && !inContentDisplayPage"
@@ -0,0 +1,113 @@
1
+ <template>
2
+ <nav :aria-label="navLabel">
3
+ <ul class="p-0 m-0">
4
+ <template v-if="specificRoutes.length">
5
+ <li v-for="routerBack in specificRoutes" :key="routerBack.path" class="li-style-none">
6
+ <router-link
7
+ v-if="!state.generalParameters.podcastmaker && routerBack.condition"
8
+ :class="routerBack.class"
9
+ :to="routerBack.path"
10
+ >
11
+ {{ routerBack.title }}
12
+ </router-link>
13
+ </li>
14
+ <hr v-if="displayUserContent"/>
15
+ </template>
16
+ <template v-if="displayUserContent">
17
+ <template v-if="!isAuthenticated">
18
+ <li class="li-style-none">
19
+ <a class="octopus-dropdown-item realLink" :href="pathLogin">
20
+ {{ t("Login") }}
21
+ </a>
22
+ </li>
23
+ <li class="li-style-none">
24
+ <router-link
25
+ v-if="!state.generalParameters.podcastmaker"
26
+ class="octopus-dropdown-item"
27
+ to="/main/pub/create"
28
+ >
29
+ {{ t("Create an account") }}
30
+ </router-link>
31
+ </li>
32
+ </template>
33
+ <template v-else>
34
+ <template v-if="helpLinks.length">
35
+ <li v-for="helpLink in helpLinks" :key="helpLink.title" class="li-style-none">
36
+ <a
37
+ :href="helpLink.href"
38
+ class="octopus-dropdown-item realLink"
39
+ rel="noreferrer noopener"
40
+ target="_blank"
41
+ :title="t('New window', {text: helpLink.title})"
42
+ >
43
+ {{ helpLink.title }}
44
+ <OpenInNewIcon class="ms-1" :size="15"/>
45
+ </a>
46
+ </li>
47
+ </template>
48
+ <hr />
49
+ <li class="li-style-none">
50
+ <a class="octopus-dropdown-item c-hand" href="/logout">
51
+ {{ t("Logout") }}
52
+ </a>
53
+ </li>
54
+ </template>
55
+ <li class="li-style-none">
56
+ <router-link
57
+ v-if="!authStore.isGarRole"
58
+ class="octopus-dropdown-item"
59
+ to="/main/pub/contact"
60
+ >
61
+ {{ t("Contact") }}
62
+ </router-link>
63
+ </li>
64
+ </template>
65
+ </ul>
66
+ </nav>
67
+ </template>
68
+
69
+ <script setup lang="ts">
70
+ import OpenInNewIcon from "vue-material-design-icons/OpenInNew.vue";
71
+ import { state } from "../../stores/ParamSdkStore";
72
+ import { useAuthStore } from "../../stores/AuthStore";
73
+ import { computed } from "vue";
74
+ import { useApiStore } from "../../stores/ApiStore";
75
+ import { useI18n } from "vue-i18n";
76
+ import { RouteLocationAsPathGeneric, RouteLocationAsRelativeGeneric, useRoute } from "vue-router";
77
+
78
+ //Interface
79
+ interface RouteInfo{
80
+ title: string;
81
+ class: string;
82
+ path: string | RouteLocationAsRelativeGeneric | RouteLocationAsPathGeneric;
83
+ condition: boolean
84
+ }
85
+
86
+ //Props
87
+ const props = defineProps({
88
+ isEducation: { default: false, type: Boolean },
89
+ navLabel: { default: "", type: String },
90
+ specificRoutes: { default: false, type: Array as ()=> Array<RouteInfo> },
91
+ displayUserContent: { default: true, type: Boolean },
92
+ })
93
+
94
+ //Composables
95
+ const { t } = useI18n();
96
+ const authStore = useAuthStore();
97
+ const apiStore = useApiStore();
98
+ const route = useRoute();
99
+
100
+ //Computed
101
+ const isAuthenticated = computed(() => undefined !== authStore.authProfile?.userId);
102
+ const pathLogin = computed(() => "/sso/login?redirect_url="+encodeURI(apiStore.frontendUrl + route.fullPath));
103
+ const helpLinks = computed(() => {
104
+ if (authStore.isGarRole || props.isEducation) {
105
+ return [];
106
+ }
107
+ return [
108
+ { title:t("Help"), href: "https://help.octopus.saooti.com/Aide/"},
109
+ { title: t("TutoMag"), href: "https://help.octopus.saooti.com/" },
110
+ ];
111
+ });
112
+
113
+ </script>
@@ -39,10 +39,10 @@ const playerStore = usePlayerStore();
39
39
  //Computed
40
40
  const isSecured = computed(() => "SECURED" === playerStore.playerLive?.organisation?.privacy);
41
41
  const hlsVideoUrl = computed(() => {
42
- if (!playerStore.playerLive) {
42
+ if (!playerStore.playerHlsIdentifier) {
43
43
  return "";
44
44
  }
45
- return `${apiStore.hlsUrl}live/video_dev.${playerStore.playerLive.conferenceId}/index.m3u8`;
45
+ return `${apiStore.hlsUrl}live/video_${playerStore.playerHlsIdentifier}/index.m3u8`;
46
46
  });
47
47
 
48
48
  onMounted(()=>{
@@ -255,7 +255,6 @@ async function fetchConferenceStatus() {
255
255
  api: 9,
256
256
  path: "conference/info/" + podcast.value?.conferenceId,
257
257
  });
258
-
259
258
  fetchConference.value = {...fetchConference.value, ...data};
260
259
  } catch {
261
260
  //Do nothing
@@ -193,7 +193,7 @@ const hlsVideoUrl = computed(() => {
193
193
  if (!recordingLive.value || !podcastConference.value) {
194
194
  return "";
195
195
  }
196
- return `${apiStore.hlsUrl}live/video_dev.${podcastConference.value.conferenceId}/index.m3u8`;
196
+ return `${apiStore.hlsUrl}live/video_${podcastConference.value.hlsIdentifier}/index.m3u8`;
197
197
  });
198
198
  const isSecured = computed(() => {
199
199
  return "SECURED" === podcast.value?.organisation?.privacy;
@@ -255,7 +255,10 @@ async function getPodcastDetails(): Promise<void> {
255
255
  playerStore.playerPlay(
256
256
  {
257
257
  ...podcast.value,
258
- ...{ conferenceId: podcast.value.conferenceId },
258
+ ...{
259
+ conferenceId: podcast.value.conferenceId,
260
+ hlsIdentifier: podcastConference.value?.hlsIdentifier,
261
+ },
259
262
  },
260
263
  true,
261
264
  );
@@ -32,6 +32,7 @@ interface PlayerState {
32
32
  playerChaptering?: Chaptering;
33
33
  playerDelayStitching: number;
34
34
  playerHlsUrl?: string;
35
+ playerHlsIdentifier?:string;
35
36
  }
36
37
  export const usePlayerStore = defineStore("PlayerStore", {
37
38
  state: (): PlayerState => ({
@@ -49,6 +50,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
49
50
  playerVideo: false,
50
51
  playerChaptering: undefined,
51
52
  playerDelayStitching: 0,
53
+ playerHlsIdentifier: undefined,
52
54
  }),
53
55
  getters: {
54
56
  playerChapteringPercent(): ChapteringPercent | undefined {
@@ -146,6 +148,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
146
148
  this.playerPodcast = undefined;
147
149
  this.playerMedia = undefined;
148
150
  this.playerLive = undefined;
151
+ this.playerHlsIdentifier = undefined;
149
152
  this.playerRadio = undefined;
150
153
  this.playerElapsed = 0;
151
154
  this.playerVideo = false;
@@ -168,6 +171,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
168
171
  this.playerPodcast = undefined;
169
172
  this.playerMedia = undefined;
170
173
  this.playerLive = undefined;
174
+ this.playerHlsIdentifier = undefined;
171
175
  this.playerRadio = undefined;
172
176
  this.playerVideo = isVideo;
173
177
  this.playerElapsed = 0;
@@ -177,6 +181,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
177
181
  (!param.podcastId || param.processingStatus !== "READY")
178
182
  ) {
179
183
  this.playerLive = param;
184
+ this.playerHlsIdentifier = param.hlsIdentifier;
180
185
  this.playerCurrentChange = null;
181
186
  return;
182
187
  }
@@ -8,6 +8,7 @@ export interface Conference {
8
8
  deletionAttempts?: number;
9
9
  directCode?: string;
10
10
  externalRtmpUrl?: ExternalRtmpUrl;
11
+ hlsIdentifier: string;
11
12
  hostname?: string;
12
13
  jingleDuration?: number;
13
14
  jingleFilePath?: string;
@@ -57,6 +58,7 @@ export function getEmptyConference(): Conference {
57
58
  export interface ConferencePublicInfo {
58
59
  status: string;
59
60
  videoProfile: string;
61
+ hlsIdentifier: string;
60
62
  }
61
63
 
62
64
  export interface ExternalRtmpUrl {