@saooti/octopus-sdk 41.0.14-SNAPSHOT → 41.0.15

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 (70) hide show
  1. package/eslint.config.mjs +5 -3
  2. package/index.ts +8 -1
  3. package/package.json +4 -2
  4. package/plateform.conf +1 -1
  5. package/src/App.vue +3 -7
  6. package/src/api/classicApi.ts +1 -1
  7. package/src/components/composable/player/usePlayerLive.ts +2 -2
  8. package/src/components/composable/player/usePlayerLogic.ts +2 -1
  9. package/src/components/composable/radio/usefetchRadioData.ts +29 -12
  10. package/src/components/composable/route/useSimplePageParam.ts +6 -1
  11. package/src/components/display/categories/CategoryChooser.vue +4 -0
  12. package/src/components/display/comments/CommentList.vue +1 -1
  13. package/src/components/display/emission/EmissionList.vue +2 -1
  14. package/src/components/display/emission/EmissionPresentationItem.vue +14 -6
  15. package/src/components/display/filter/AdvancedSearch.vue +2 -2
  16. package/src/components/display/filter/DateFilter.vue +15 -2
  17. package/src/components/display/live/RadioCurrently.vue +2 -5
  18. package/src/components/display/organisation/OrganisationChooserLight.vue +34 -36
  19. package/src/components/display/podcasts/PodcastPlayButton.vue +6 -1
  20. package/src/components/display/rubriques/RubriqueChooser.vue +24 -2
  21. package/src/components/display/rubriques/RubriqueList.vue +18 -0
  22. package/src/components/display/sharing/PlayerParameters.vue +0 -8
  23. package/src/components/display/sharing/SharePlayer.vue +0 -5
  24. package/src/components/display/sharing/SubscribeButtons.vue +4 -2
  25. package/src/components/form/ClassicCheckbox.vue +30 -5
  26. package/src/components/form/ClassicInputText.vue +32 -12
  27. package/src/components/form/ClassicMultiselect.vue +35 -7
  28. package/src/components/misc/ClassicAccordion.vue +4 -4
  29. package/src/components/misc/ClassicHelpButton.vue +44 -0
  30. package/src/components/misc/ClassicLazy.vue +25 -14
  31. package/src/components/misc/ClassicNav.vue +3 -0
  32. package/src/components/misc/ClassicSpinner.vue +1 -1
  33. package/src/components/misc/FooterSection.vue +17 -20
  34. package/src/components/misc/HomeDropdown.vue +3 -110
  35. package/src/components/misc/MobileMenu.vue +59 -64
  36. package/src/components/misc/TopBar.vue +2 -10
  37. package/src/components/misc/TopBarMainContent.vue +8 -12
  38. package/src/components/misc/UserButtonContent.vue +159 -0
  39. package/src/components/misc/modal/ClassicModal.vue +4 -0
  40. package/src/components/misc/player/PlayerCompact.vue +1 -0
  41. package/src/components/misc/player/PlayerComponent.vue +1 -0
  42. package/src/components/misc/player/elements/PlayerImage.vue +0 -1
  43. package/src/components/misc/player/elements/PlayerTitle.vue +3 -3
  44. package/src/components/misc/player/radio/RadioHistory.vue +3 -2
  45. package/src/components/misc/player/video/PlayerVideo.vue +2 -2
  46. package/src/components/pages/HomePage.vue +5 -4
  47. package/src/components/pages/PageLogout.vue +1 -6
  48. package/src/components/pages/PodcastPage.vue +0 -1
  49. package/src/components/pages/PodcastsPage.vue +1 -1
  50. package/src/components/pages/VideoPage.vue +5 -2
  51. package/src/helper/equals.ts +26 -0
  52. package/src/locale/de.ts +6 -5
  53. package/src/locale/en.ts +6 -5
  54. package/src/locale/es.ts +6 -5
  55. package/src/locale/fr.ts +6 -5
  56. package/src/locale/it.ts +6 -5
  57. package/src/locale/sl.ts +6 -5
  58. package/src/router/router.ts +10 -74
  59. package/src/router/utils.ts +112 -0
  60. package/src/stores/AuthStore.ts +7 -2
  61. package/src/stores/FilterStore.ts +126 -71
  62. package/src/stores/PlayerStore.ts +11 -1
  63. package/src/stores/class/conference/conference.ts +2 -0
  64. package/src/stores/class/general/organisation.ts +2 -2
  65. package/src/stores/class/general/player.ts +2 -2
  66. package/src/style/_variables.scss +6 -0
  67. package/src/style/general.scss +18 -1
  68. package/tsconfig.json +6 -2
  69. package/typings/index.d.ts +1 -0
  70. package/src/helper/radio/radioHelper.ts +0 -15
@@ -0,0 +1,112 @@
1
+ import { Router } from "vue-router";
2
+ import { useFilterStore, FilterStore } from "../stores/FilterStore";
3
+ import { useSaveFetchStore } from "../stores/SaveFetchStore";
4
+ import { Rubriquage } from "../stores/class/rubrique/rubriquage";
5
+ import classicApi from "../api/classicApi";
6
+ import { useAuthStore, AuthStore } from "../stores/AuthStore";
7
+ import { deepEqual } from "../helper/equals";
8
+
9
+ async function changeOrgaFilter(orgaFilter: string, filterStore: FilterStore){
10
+ const saveStore = useSaveFetchStore();
11
+ const response = await saveStore.getOrgaData(orgaFilter);
12
+ const data = await classicApi.fetchData<Array<Rubriquage>>({
13
+ api: 0,
14
+ path: "rubriquage/find/" + orgaFilter,
15
+ parameters: {
16
+ sort: "HOMEPAGEORDER",
17
+ homePageOrder: true,
18
+ },
19
+ specialTreatement: true,
20
+ });
21
+ const isLive = await saveStore.getOrgaLiveEnabled(orgaFilter);
22
+ filterStore.filterUpdateOrga({
23
+ orgaId: orgaFilter,
24
+ imgUrl: response.imageUrl,
25
+ name: response.name,
26
+ rubriquageArray: data.filter((element: Rubriquage) => {
27
+ return element.rubriques.length;
28
+ }),
29
+ isLive: isLive,
30
+ });
31
+ }
32
+
33
+ let fetchMyOrgaActive = false;
34
+ /** Variable used to apply beforeEach redirect only once */
35
+ let resolved = false;
36
+
37
+ /**
38
+ * Utility function seting up the router with a custom beforeEach
39
+ */
40
+ export function setupRouter(router: Router, getMyOrgaActive: (authStore: AuthStore) => Promise<string>): void {
41
+ router.beforeResolve(async () =>{
42
+ fetchMyOrgaActive = false;
43
+ // Reinit variable to allow one redirect
44
+ resolved = false;
45
+ });
46
+
47
+ // Navigation guard that updates current organisation & may make redirects
48
+ router.beforeEach(async (to, from) => {
49
+
50
+ if ("/logout" === to.path && "/logout" !== from.path) {
51
+ setTimeout(() => {
52
+ window.location.reload(true);
53
+ }, 500);
54
+ }
55
+ const authStore = useAuthStore();
56
+ const filterStore = useFilterStore();
57
+
58
+ const isSamePath = to.matched[0]?.path === from.matched[0]?.path && to.path.includes(from.path);
59
+ let orgaToFocus = isSamePath ? (to.query.productor?.toString() ?? undefined) : undefined;
60
+
61
+ if(authStore.authProfile){
62
+ if(!isSamePath && !fetchMyOrgaActive){
63
+ await getMyOrgaActive(authStore);
64
+ fetchMyOrgaActive = true;
65
+ }
66
+ if(undefined!==orgaToFocus){
67
+ orgaToFocus = authStore.authOrgaId;
68
+ }
69
+ }
70
+
71
+ // Update organisation
72
+ if (isSamePath && orgaToFocus !== from.query.productor) {
73
+ if (filterStore.filterOrgaId !== orgaToFocus && orgaToFocus !== undefined) {
74
+ await changeOrgaFilter(orgaToFocus, filterStore);
75
+ }
76
+ }
77
+
78
+ // Only change target if not going to logout and not already resolved
79
+ if ("/logout" !== to.path && resolved !== true) {
80
+ resolved = true;
81
+ const newQuery = {
82
+ ...to.query
83
+ };
84
+
85
+ // Set productor
86
+ if (to.query.productor) {
87
+ newQuery.productor = to.query.productor;
88
+ } else if (filterStore.filterOrgaId === undefined) {
89
+ delete newQuery.productor;
90
+ } else {
91
+ newQuery.productor = filterStore.filterOrgaId;
92
+ }
93
+
94
+ // Enable 'viewall' mode if already active
95
+ if ((from.query.viewall === "true" || to.query.viewall === "true") && to.query.viewall !== "false") {
96
+ newQuery.viewall = "true";
97
+ } else {
98
+ delete newQuery.viewall;
99
+ }
100
+
101
+ // If the queries are different, update path
102
+ if (!deepEqual(newQuery, to.query)) {
103
+ return {
104
+ path: to.path,
105
+ query: { ...newQuery },
106
+ params: to.params,
107
+ name: to.name,
108
+ };
109
+ }
110
+ }
111
+ });
112
+ }
@@ -5,12 +5,14 @@ import { defineStore } from "pinia";
5
5
  import { KeycloakInfo } from "@/stores/class/user/person";
6
6
  import { VideoConfig } from "@/stores/class/config/videoConfig";
7
7
  import classicApi from "../api/classicApi";
8
- interface AuthParam{
8
+
9
+ interface AuthParam {
9
10
  accessToken?: string;
10
11
  refreshToken?: string;
11
12
  expiration?: Date|string;
12
13
  clientId?: string;
13
14
  }
15
+
14
16
  interface AuthState {
15
17
  authReload: number;
16
18
  authName: string;
@@ -43,7 +45,7 @@ export const useAuthStore = defineStore("AuthStore", {
43
45
  comments: undefined,
44
46
  attributes: {
45
47
  RSS_CONTACT: undefined,
46
- },
48
+ }
47
49
  },
48
50
  authVideoConfig: { active: false },
49
51
  }),
@@ -231,3 +233,6 @@ export const useAuthStore = defineStore("AuthStore", {
231
233
  },
232
234
  },
233
235
  });
236
+
237
+ /** Type for the AuthStore */
238
+ export type AuthStore = ReturnType<typeof useAuthStore>;
@@ -1,73 +1,128 @@
1
- import { Category } from "@/stores/class/general/category";
2
- import { Rubriquage } from "@/stores/class/rubrique/rubriquage";
3
- import { RubriquageFilter } from "@/stores/class/rubrique/rubriquageFilter";
4
- import { Rubrique } from "@/stores/class/rubrique/rubrique";
5
- import { defineStore } from "pinia";
1
+ import { computed, ref } from 'vue';
6
2
 
7
- interface FilterState {
8
- filterOrgaId?: string;
9
- filterImgUrl?: string;
10
- filterName?: string;
11
- filterRubriquage: Array<Rubriquage>;
12
- filterRubrique: Array<RubriquageFilter>;
13
- filterRubriqueDisplay: Array<Rubrique>;
14
- filterTypeMedia?: string;
15
- filterSortOrder?: string;
16
- filterSortField?: string;
17
- filterLive?: boolean;
18
- filterIab?: Category;
19
- }
20
- export const useFilterStore = defineStore("FilterStore", {
21
- state: (): FilterState => ({
22
- filterRubriquage: [],
23
- filterRubrique: [],
24
- filterRubriqueDisplay: [],
25
- filterLive: false,
26
- }),
27
- actions: {
28
- filterUpdateOrga(filter: {
29
- orgaId?: string;
30
- imgUrl?: string;
31
- name?: string;
32
- rubriquageArray?: Array<Rubriquage>;
33
- isLive?: boolean;
34
- }) {
35
- if (filter.imgUrl || !filter.orgaId) {
36
- this.filterImgUrl = filter.imgUrl;
37
- }
38
- if (filter.name || !filter.orgaId) {
39
- this.filterName = filter.name;
40
- }
41
- if (filter.rubriquageArray) {
42
- this.filterRubriquage = filter.rubriquageArray;
43
- }
44
- this.filterLive = filter.isLive;
45
- this.filterIab = undefined;
46
- this.filterOrgaId = filter.orgaId;
47
- },
48
- filterUpdateIab(iab?: Category) {
49
- this.filterIab = iab;
50
- },
51
- filterUpdateRubrique(rubriqueFilter: Array<RubriquageFilter>) {
52
- this.filterRubrique = rubriqueFilter;
53
- },
54
- filterUpdateRubriqueDisplay(rubriques: Array<Rubrique>) {
55
- this.filterRubriqueDisplay = rubriques.filter(rubrique=> rubrique);
56
- },
57
- filterUpdateMedia(filter: {
58
- type?: string;
59
- order?: string;
60
- field?: string;
61
- }) {
62
- if (filter.type) {
63
- this.filterTypeMedia = filter.type;
64
- }
65
- if (filter.order) {
66
- this.filterSortOrder = filter.order;
67
- }
68
- if (filter.field) {
69
- this.filterSortField = filter.field;
70
- }
71
- },
72
- },
3
+ import { Category } from '@/stores/class/general/category';
4
+ import { Rubriquage } from '@/stores/class/rubrique/rubriquage';
5
+ import { RubriquageFilter } from '@/stores/class/rubrique/rubriquageFilter';
6
+ import { Rubrique } from '@/stores/class/rubrique/rubrique';
7
+ import { defineStore } from 'pinia';
8
+ import { useAuthStore } from './AuthStore';
9
+ import { useRoute } from 'vue-router';
10
+
11
+ /**
12
+ * Store managing data regarding the filters to apply to know which
13
+ * podcasts to show.
14
+ */
15
+ export const useFilterStore = defineStore("FilterStore", () => {
16
+ const _filterOrgaId = ref<string|null>(null);
17
+ const filterImgUrl = ref<string>();
18
+ const filterName = ref<string>();
19
+ const filterRubriquage = ref<Array<Rubriquage>>([]);
20
+ const filterRubrique = ref<Array<RubriquageFilter>>([]);
21
+ const filterRubriqueDisplay = ref<Array<Rubrique>>([]);
22
+ const filterTypeMedia = ref<string>();
23
+ const filterSortOrder = ref<string>();
24
+ const filterSortField = ref<string>();
25
+ const filterLive = ref<boolean>(false);
26
+ const filterIab = ref<Category>();
27
+
28
+ const route = useRoute();
29
+ const authStore = useAuthStore();
30
+
31
+ /**
32
+ * ID of the current organisation.
33
+ */
34
+ const filterOrgaId = computed((): string|undefined => {
35
+ if (route?.query.viewall === "true") {
36
+ return undefined;
37
+ } else if (route?.query.productor) {
38
+ return route.query.productor as string;
39
+ } else if(_filterOrgaId.value === null) {
40
+ return authStore.authOrgaId;
41
+ } else {
42
+ return _filterOrgaId.value ?? undefined;
43
+ }
44
+ });
45
+
46
+ /**
47
+ * The ID of the current organisation, regardless of other options.
48
+ * Use this if you want to know the organisation of the user even in
49
+ * unfocused mode (ie viewall = true)
50
+ */
51
+ const realOrgaId = computed(() => {
52
+ return _filterOrgaId.value ?? undefined;
53
+ });
54
+
55
+ function filterUpdateOrga(filter: {
56
+ orgaId?: string;
57
+ imgUrl?: string;
58
+ name?: string;
59
+ rubriquageArray?: Array<Rubriquage>;
60
+ isLive?: boolean;
61
+ }) {
62
+ if (filter.imgUrl || !filter.orgaId) {
63
+ filterImgUrl.value = filter.imgUrl;
64
+ }
65
+ if (filter.name || !filter.orgaId) {
66
+ filterName.value = filter.name;
67
+ }
68
+ if (filter.rubriquageArray) {
69
+ filterRubriquage.value = filter.rubriquageArray;
70
+ }
71
+ filterLive.value = filter.isLive ?? false;
72
+ filterIab.value = undefined;
73
+ _filterOrgaId.value = filter.orgaId ?? null;
74
+ }
75
+
76
+ function filterUpdateIab(iab?: Category) {
77
+ filterIab.value = iab;
78
+ }
79
+
80
+ function filterUpdateRubrique(rubriqueFilter: Array<RubriquageFilter>) {
81
+ filterRubrique.value = rubriqueFilter;
82
+ }
83
+
84
+ function filterUpdateRubriqueDisplay(rubriques: Array<Rubrique>) {
85
+ filterRubriqueDisplay.value = rubriques.filter(rubrique=> rubrique);
86
+ }
87
+
88
+ function filterUpdateMedia(filter: {
89
+ type?: string;
90
+ order?: string;
91
+ field?: string;
92
+ }) {
93
+ if (filter.type) {
94
+ filterTypeMedia.value = filter.type;
95
+ }
96
+ if (filter.order) {
97
+ filterSortOrder.value = filter.order;
98
+ }
99
+ if (filter.field) {
100
+ filterSortField.value = filter.field;
101
+ }
102
+ }
103
+
104
+ return {
105
+ filterOrgaId,
106
+ realOrgaId,
107
+
108
+ filterUpdateOrga,
109
+ filterUpdateIab,
110
+ filterUpdateRubrique,
111
+ filterUpdateRubriqueDisplay,
112
+ filterUpdateMedia,
113
+
114
+ filterImgUrl,
115
+ filterName,
116
+ filterRubriquage,
117
+ filterRubrique,
118
+ filterRubriqueDisplay,
119
+ filterTypeMedia,
120
+ filterSortOrder,
121
+ filterSortField,
122
+ filterLive,
123
+ filterIab
124
+ };
73
125
  });
126
+
127
+ /** Type for the FilterStore */
128
+ export type FilterStore = ReturnType<typeof useFilterStore>;
@@ -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 {
@@ -139,6 +141,11 @@ export const usePlayerStore = defineStore("PlayerStore", {
139
141
  },
140
142
  },
141
143
  actions: {
144
+ /**
145
+ * Start playing audio/video
146
+ * @param param The data
147
+ * @param isVideo If true, enable video mode
148
+ */
142
149
  async playerPlay(param?: any, isVideo = false) {
143
150
  if (!param) {
144
151
  this.playerCurrentChange = null;
@@ -146,6 +153,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
146
153
  this.playerPodcast = undefined;
147
154
  this.playerMedia = undefined;
148
155
  this.playerLive = undefined;
156
+ this.playerHlsIdentifier = undefined;
149
157
  this.playerRadio = undefined;
150
158
  this.playerElapsed = 0;
151
159
  this.playerVideo = false;
@@ -168,6 +176,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
168
176
  this.playerPodcast = undefined;
169
177
  this.playerMedia = undefined;
170
178
  this.playerLive = undefined;
179
+ this.playerHlsIdentifier = undefined;
171
180
  this.playerRadio = undefined;
172
181
  this.playerVideo = isVideo;
173
182
  this.playerElapsed = 0;
@@ -177,6 +186,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
177
186
  (!param.podcastId || param.processingStatus !== "READY")
178
187
  ) {
179
188
  this.playerLive = param;
189
+ this.playerHlsIdentifier = param.hlsIdentifier;
180
190
  this.playerCurrentChange = null;
181
191
  return;
182
192
  }
@@ -210,7 +220,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
210
220
  playerUpdateSeekTime(seekTime: number) {
211
221
  this.playerSeekTime = seekTime;
212
222
  },
213
- playerMetadata(metadata: MediaRadio, history: Array<MediaRadio>) {
223
+ playerMetadata(metadata: MediaRadio|undefined, history: Array<MediaRadio>) {
214
224
  if (!this.playerRadio) {
215
225
  return;
216
226
  }
@@ -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 {
@@ -22,13 +22,13 @@ export function emptyOrganisationData(): Organisation {
22
22
  return {
23
23
  imageUrl: "",
24
24
  id: "",
25
- name: "",
25
+ name: ""
26
26
  };
27
27
  }
28
28
  export function emptyOrgaData(defaultName: string): Organisation {
29
29
  return {
30
30
  imageUrl: "/img/emptypodcast.webp",
31
31
  id: "",
32
- name: defaultName,
32
+ name: defaultName
33
33
  };
34
34
  }
@@ -4,7 +4,7 @@ import { Podcast } from "./podcast";
4
4
  export interface Radio {
5
5
  canalId: number;
6
6
  url: string;
7
- metadata: MediaRadio;
7
+ metadata?: MediaRadio;
8
8
  history: Array<MediaRadio>;
9
9
  nextAdvertising: NextAdvertising;
10
10
  isInit: boolean;
@@ -30,7 +30,7 @@ export interface NextAdvertising {
30
30
 
31
31
  export interface MetadataRadio {
32
32
  channelId: number;
33
- currently: MediaRadio;
33
+ currently: MediaRadio|null;
34
34
  previously: Array<MediaRadio>;
35
35
  nextAdvertising: NextAdvertising;
36
36
  }
@@ -27,10 +27,16 @@
27
27
  --octopus-background-transparent: oklch(from var(--octopus-background) l c h / 40%);
28
28
  --octopus-tertiary-really-transparent: oklch(from var(--octopus-tertiary) l c h / 30%);
29
29
 
30
+ //Gradient
31
+ --octopus-gradient : linear-gradient(90deg,var(--octopus-primary) 0%, var(--octopus-tertiary) 100%);
32
+
30
33
  // Size
31
34
  --octopus-image-size: 12.5rem;
32
35
  --octopus-podcast-size: 13.5rem;
33
36
  --octopus-border-radius: 0.2rem;
34
37
  --octopus-line-clamp:2;
35
38
  --octopus-max-height-description: 7rem;
39
+
40
+ //Font-family
41
+ --octopus-font-family: Montserrat,sans-serif,"Helvetica Neue";
36
42
  }
@@ -1,5 +1,6 @@
1
1
  /** Document style */
2
2
 
3
+
3
4
  html{
4
5
  font-size: 20px;
5
6
  height: 100%;
@@ -9,7 +10,7 @@ html{
9
10
  body{
10
11
  margin: 0;
11
12
  color: var(--octopus-color-text);
12
- font-family: Montserrat,sans-serif,"Helvetica Neue";
13
+ font-family: var(--octopus-font-family);
13
14
  font-size: 0.8rem;
14
15
  overflow-x: hidden;
15
16
  background: var(--octopus-secondary-lighter);
@@ -42,6 +43,10 @@ main, #app{
42
43
  align-items: center;
43
44
  }
44
45
 
46
+ input {
47
+ font-family: var(--octopus-font-family);
48
+ }
49
+
45
50
  /** Link style */
46
51
  a{
47
52
  word-break: break-word;
@@ -114,6 +119,11 @@ main, #app{
114
119
  background: var(--octopus-complementary-color) !important;
115
120
  }
116
121
 
122
+ .bg-gradient{
123
+ background: var(--octopus-primary);
124
+ background:var(--octopus-gradient);
125
+ }
126
+
117
127
  .text-blue-octopus{
118
128
  color: var(--octopus-tertiary) !important
119
129
  }
@@ -170,6 +180,13 @@ main, #app{
170
180
  }
171
181
  }
172
182
 
183
+ .show-small-screen{
184
+ display: none !important;
185
+ @media (width <= 500px) {
186
+ display: flex !important;
187
+ }
188
+ }
189
+
173
190
  .show-phone{
174
191
  display: none;
175
192
 
package/tsconfig.json CHANGED
@@ -13,7 +13,11 @@
13
13
  "sourceMap": true,
14
14
  "baseUrl": ".",
15
15
  "types": [
16
- "webpack-env"
16
+ "webpack-env", "sockjs-client"
17
+ ],
18
+ "typeRoots": [
19
+ "./typings",
20
+ "./node_modules/@types/"
17
21
  ],
18
22
  "paths": {
19
23
  "@/*": [
@@ -38,6 +42,6 @@
38
42
  "node_modules"
39
43
  ],
40
44
  "files": [
41
- "src/shims-vue.d.ts",
45
+ "src/shims-vue.d.ts"
42
46
  ]
43
47
  }
@@ -0,0 +1 @@
1
+ declare module 'sockjs-client/dist/sockjs';
@@ -1,15 +0,0 @@
1
- import { MediaRadio } from "@/stores/class/general/player";
2
-
3
- export default {
4
- displayTitle(metadata: MediaRadio): string {
5
- let title = "";
6
- if (metadata.title) {
7
- title += metadata.title;
8
- }
9
- if (metadata.artist) {
10
- title += " - " + metadata.artist;
11
- }
12
- return title;
13
- }
14
- };
15
-