@icvdeveloper/common-module 0.0.87 → 0.0.89

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 (94) hide show
  1. package/README.md +6 -6
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/@types/components.d.ts +1 -1
  4. package/dist/runtime/assets/svg/answer.svg +14 -14
  5. package/dist/runtime/assets/svg/avatar.svg +1 -1
  6. package/dist/runtime/assets/svg/bell-icon.svg +3 -3
  7. package/dist/runtime/assets/svg/checkmark-icon.svg +1 -1
  8. package/dist/runtime/assets/svg/close-icon.svg +1 -1
  9. package/dist/runtime/assets/svg/icon-avatar.svg +1 -1
  10. package/dist/runtime/assets/svg/icon-chevron.svg +4 -4
  11. package/dist/runtime/assets/svg/icon-circle-plus.svg +1 -1
  12. package/dist/runtime/assets/svg/icon-close.svg +1 -1
  13. package/dist/runtime/assets/svg/icon-info.svg +2 -2
  14. package/dist/runtime/assets/svg/icon-new-window.svg +11 -11
  15. package/dist/runtime/assets/svg/icon-offline.svg +3 -3
  16. package/dist/runtime/assets/svg/icon-online.svg +3 -3
  17. package/dist/runtime/assets/svg/icon-person.svg +2 -2
  18. package/dist/runtime/assets/svg/icon-play.svg +2 -2
  19. package/dist/runtime/assets/svg/icon-star-filled.svg +29 -29
  20. package/dist/runtime/assets/svg/icon-star.svg +24 -24
  21. package/dist/runtime/assets/svg/icon-video-chat.svg +14 -14
  22. package/dist/runtime/assets/svg/icon-website.svg +2 -2
  23. package/dist/runtime/assets/svg/icon-zoom.svg +10 -10
  24. package/dist/runtime/assets/svg/notification-icon.svg +32 -32
  25. package/dist/runtime/assets/svg/offline-icon.svg +1 -1
  26. package/dist/runtime/assets/svg/online-icon.svg +3 -3
  27. package/dist/runtime/assets/svg/peer2peer.svg +3 -3
  28. package/dist/runtime/assets/svg/phone.svg +1 -1
  29. package/dist/runtime/assets/svg/plus-icon.svg +1 -1
  30. package/dist/runtime/assets/svg/red-icon.svg +3 -3
  31. package/dist/runtime/assets/svg/reject.svg +14 -14
  32. package/dist/runtime/assets/svg/search-icon.svg +3 -3
  33. package/dist/runtime/components/affiliates/AffiliatePage.vue +17 -17
  34. package/dist/runtime/components/agenda/AgendaList.vue +234 -234
  35. package/dist/runtime/components/agenda/AgendaTabbed.vue +309 -309
  36. package/dist/runtime/components/agenda/components/AgendaListAccordion.vue +53 -53
  37. package/dist/runtime/components/agenda/components/Calendar.vue +89 -89
  38. package/dist/runtime/components/agenda/components/InfoLink.vue +56 -56
  39. package/dist/runtime/components/agenda/components/PlayIcon.vue +49 -49
  40. package/dist/runtime/components/agenda/components/PresentationLink.vue +137 -137
  41. package/dist/runtime/components/agenda/components/Sponsor.vue +132 -132
  42. package/dist/runtime/components/auth/LoginFullWidth.vue +78 -78
  43. package/dist/runtime/components/auth/PasswordReset.vue +60 -60
  44. package/dist/runtime/components/auth/Registration.vue +27 -27
  45. package/dist/runtime/components/auth/Ucc.vue +79 -52
  46. package/dist/runtime/components/core/Accordion.vue +97 -97
  47. package/dist/runtime/components/core/CountdownTimer.vue +308 -308
  48. package/dist/runtime/components/core/DynamicHtml.vue +1 -1
  49. package/dist/runtime/components/core/Modal.vue +111 -111
  50. package/dist/runtime/components/core/Navbar.vue +154 -154
  51. package/dist/runtime/components/core/SvgIcon.vue +151 -151
  52. package/dist/runtime/components/core/ZoomModal.vue +37 -37
  53. package/dist/runtime/components/events/EventHeader.vue +133 -133
  54. package/dist/runtime/components/events/ListEvents.vue +521 -521
  55. package/dist/runtime/components/forms/AlertBox.vue +21 -21
  56. package/dist/runtime/components/forms/ErrorField.vue +17 -17
  57. package/dist/runtime/components/forms/Message.vue +27 -27
  58. package/dist/runtime/components/forms/SearchInput.vue +38 -38
  59. package/dist/runtime/components/forms/SupportForm.vue +112 -112
  60. package/dist/runtime/components/forms/SwitchInput.vue +42 -42
  61. package/dist/runtime/components/forms/TextArea.vue +26 -26
  62. package/dist/runtime/components/forms/TextInput.vue +28 -28
  63. package/dist/runtime/components/layouts/Accordion.vue +78 -78
  64. package/dist/runtime/components/media/PlayerAndContentContainer.vue +175 -175
  65. package/dist/runtime/components/media/WebcastVideoPlayer.vue +167 -167
  66. package/dist/runtime/components/media/components/AgendaPanel.vue +42 -42
  67. package/dist/runtime/components/media/components/CeCreditNotification.vue +95 -95
  68. package/dist/runtime/components/media/components/ContentAccordion.vue +63 -63
  69. package/dist/runtime/components/media/components/ContentAccordion.vue.d.ts +1 -3
  70. package/dist/runtime/components/media/components/ContentArea.vue +158 -158
  71. package/dist/runtime/components/media/components/ContentTabs.vue +229 -229
  72. package/dist/runtime/components/media/components/DocumentsPanel.vue +31 -31
  73. package/dist/runtime/components/media/components/JsonApi.vue +31 -31
  74. package/dist/runtime/components/media/components/MediaContainer.vue +63 -63
  75. package/dist/runtime/components/media/components/OverviewPanel.vue +52 -52
  76. package/dist/runtime/components/media/components/PresentersPanel.vue +52 -52
  77. package/dist/runtime/components/media/components/SessionReporting.vue +93 -93
  78. package/dist/runtime/components/media/components/SponsorsPanel.vue +71 -71
  79. package/dist/runtime/components/media/components/WindowContent.vue +92 -92
  80. package/dist/runtime/components/media/components/WindowSlide.vue +72 -72
  81. package/dist/runtime/components/presenters/PresenterListing.vue +164 -164
  82. package/dist/runtime/components/presenters/PresenterModal.vue +223 -223
  83. package/dist/runtime/components/profile/Profile.vue +149 -149
  84. package/dist/runtime/components/profile/components/Sidebar.vue +27 -27
  85. package/dist/runtime/components/profile/components/SidebarNavItem.vue +39 -39
  86. package/dist/runtime/components/profile/tabs/Favorites.vue +21 -21
  87. package/dist/runtime/components/profile/tabs/GeneralInformation.vue +122 -122
  88. package/dist/runtime/components/profile/tabs/ProfileImage.vue +75 -75
  89. package/dist/runtime/components/support/FAQAccordion.vue +140 -140
  90. package/dist/runtime/composables/useConferenceHelpers.d.ts +1 -1
  91. package/dist/runtime/composables/useConferenceHelpers.mjs +2 -2
  92. package/dist/runtime/composables/useUcc.d.ts +19 -2
  93. package/dist/runtime/composables/useUcc.mjs +103 -22
  94. package/package.json +1 -1
@@ -1,167 +1,167 @@
1
- <script lang="ts" setup>
2
- import { toRefs, computed, watch, onMounted, nextTick } from "vue";
3
- import { get } from "lodash-es";
4
- import { getUnixTime } from "date-fns";
5
- import { Presentation, Stream, PlayerObj } from "../../models/conference";
6
- import { WebcastPlayerClassObj } from "../../@types/components";
7
- import { useScripts } from "../../composables/useScripts";
8
- import { useClassBinding } from "../../composables/useClassBinding";
9
-
10
- type Props = {
11
- stream: Stream;
12
- presentation: Presentation;
13
- classObject?: WebcastPlayerClassObj;
14
- };
15
-
16
- const props = withDefaults(defineProps<Props>(), {
17
- classObject: () => {
18
- return {
19
- container: "",
20
- playerElement: "",
21
- embedElement: "",
22
- };
23
- },
24
- });
25
-
26
- const { stream, presentation } = toRefs(props);
27
-
28
- const { loadScripts } = useScripts();
29
- const { classBinding } = useClassBinding();
30
-
31
- // data
32
- let icvPlayerObj: PlayerObj = {
33
- autostart: false,
34
- format: "hls",
35
- playerDiv: "mediaPlayer",
36
- loadCustomStream: () => {},
37
- };
38
- let timeInterval: NodeJS.Timer | null = null;
39
-
40
- // emits
41
- const emit = defineEmits<{
42
- (event: "time", value: Number): void;
43
- }>();
44
-
45
- // computed
46
- const isHtml = computed(() => {
47
- return stream.value.type === "embed";
48
- });
49
-
50
- const isHls = computed(() => {
51
- return stream.value.type === "hls";
52
- });
53
-
54
- // methods
55
- const setupMediaPlayer = () => {
56
- if (icvPlayerObj) {
57
- icvPlayerObj = <PlayerObj>{};
58
- }
59
- if (isHls.value) {
60
- nextTick(() => {
61
- icvPlayerObj = new window.ICVDMStreamPlayer();
62
- icvPlayerObj.format = stream.value.type;
63
- icvPlayerObj.playerDiv = "mediaPlayer";
64
- icvPlayerObj.autostart = true;
65
- playStream();
66
- });
67
- }
68
- };
69
-
70
- const playStream = () => {
71
- if (isHls.value) {
72
- icvPlayerObj.format = ["audio", "audio_slide"].includes(stream.value.type)
73
- ? "audio"
74
- : "video";
75
- icvPlayerObj.loadCustomStream({
76
- file: stream.value.hls_url,
77
- });
78
- }
79
- };
80
-
81
- const checkStreamTime = () => {
82
- const defaultStreamUt = getUnixTime(Date.now()) - 40;
83
- const maxStreamDelay = defaultStreamUt - 20;
84
- let streamUt = get(icvPlayerObj, "stream_ut", defaultStreamUt);
85
-
86
- if (streamUt > maxStreamDelay) {
87
- streamUt = defaultStreamUt;
88
- }
89
- emit("time", streamUt);
90
- };
91
-
92
- const cleanup = () => {
93
- if (icvPlayerObj) {
94
- icvPlayerObj = <PlayerObj>{};
95
- }
96
- clearInterval(timeInterval);
97
- };
98
-
99
- // watchers
100
-
101
- watch(
102
- presentation,
103
- (_oldPresentation: Presentation, _newPresentation: Presentation) => {
104
- if (_oldPresentation.type !== _newPresentation.type) {
105
- setupMediaPlayer();
106
- }
107
- }
108
- );
109
-
110
- watch(stream, (_oldStream, _newStream) => {
111
- if (_oldStream !== _newStream) {
112
- setupMediaPlayer();
113
- }
114
- });
115
-
116
- // on mount
117
- // @todo figure out why ICVDMStreamPlayer doesn't load when loadScripts is run asynchroniously
118
- onMounted(() => {
119
- const _script = document.createElement("script");
120
- _script.setAttribute(
121
- "src",
122
- "https://cdn.v3mediaportal.com/streaming-player/js/icvdm.player.min.js?_id=75"
123
- );
124
- document.head.appendChild(_script);
125
- _script.onload = () => {
126
- if (get(window, "ICVDMStreamPlayer", false)) {
127
- setupMediaPlayer();
128
- timeInterval = setInterval(checkStreamTime, 1000);
129
- }
130
- };
131
- });
132
- </script>
133
-
134
- <template>
135
- <div
136
- id="webcast-player-container"
137
- :class="classBinding(classObject, 'container', 'text-center')"
138
- >
139
- <div
140
- v-if="isHls"
141
- id="mediaPlayer"
142
- ref="mediaPlayer"
143
- :class="classBinding(classObject, 'playerElement', '')"
144
- ></div>
145
- <span
146
- v-if="isHtml"
147
- :v-html="stream.embed_html"
148
- :class="classBinding(classObject, 'embedElement', '')"
149
- ></span>
150
- </div>
151
- </template>
152
-
153
- <style>
154
- #webcast-player-container > span {
155
- padding-bottom: 56.25%;
156
- height: 0;
157
- position: relative;
158
- display: block;
159
- }
160
- #webcast-player-container > span > iframe {
161
- position: absolute;
162
- top: 0;
163
- left: 0;
164
- height: 100%;
165
- width: 100%;
166
- }
167
- </style>
1
+ <script lang="ts" setup>
2
+ import { toRefs, computed, watch, onMounted, nextTick } from "vue";
3
+ import { get } from "lodash-es";
4
+ import { getUnixTime } from "date-fns";
5
+ import { Presentation, Stream, PlayerObj } from "../../models/conference";
6
+ import { WebcastPlayerClassObj } from "../../@types/components";
7
+ import { useScripts } from "../../composables/useScripts";
8
+ import { useClassBinding } from "../../composables/useClassBinding";
9
+
10
+ type Props = {
11
+ stream: Stream;
12
+ presentation: Presentation;
13
+ classObject?: WebcastPlayerClassObj;
14
+ };
15
+
16
+ const props = withDefaults(defineProps<Props>(), {
17
+ classObject: () => {
18
+ return {
19
+ container: "",
20
+ playerElement: "",
21
+ embedElement: "",
22
+ };
23
+ },
24
+ });
25
+
26
+ const { stream, presentation } = toRefs(props);
27
+
28
+ const { loadScripts } = useScripts();
29
+ const { classBinding } = useClassBinding();
30
+
31
+ // data
32
+ let icvPlayerObj: PlayerObj = {
33
+ autostart: false,
34
+ format: "hls",
35
+ playerDiv: "mediaPlayer",
36
+ loadCustomStream: () => {},
37
+ };
38
+ let timeInterval: NodeJS.Timer | null = null;
39
+
40
+ // emits
41
+ const emit = defineEmits<{
42
+ (event: "time", value: Number): void;
43
+ }>();
44
+
45
+ // computed
46
+ const isHtml = computed(() => {
47
+ return stream.value.type === "embed";
48
+ });
49
+
50
+ const isHls = computed(() => {
51
+ return stream.value.type === "hls";
52
+ });
53
+
54
+ // methods
55
+ const setupMediaPlayer = () => {
56
+ if (icvPlayerObj) {
57
+ icvPlayerObj = <PlayerObj>{};
58
+ }
59
+ if (isHls.value) {
60
+ nextTick(() => {
61
+ icvPlayerObj = new window.ICVDMStreamPlayer();
62
+ icvPlayerObj.format = stream.value.type;
63
+ icvPlayerObj.playerDiv = "mediaPlayer";
64
+ icvPlayerObj.autostart = true;
65
+ playStream();
66
+ });
67
+ }
68
+ };
69
+
70
+ const playStream = () => {
71
+ if (isHls.value) {
72
+ icvPlayerObj.format = ["audio", "audio_slide"].includes(stream.value.type)
73
+ ? "audio"
74
+ : "video";
75
+ icvPlayerObj.loadCustomStream({
76
+ file: stream.value.hls_url,
77
+ });
78
+ }
79
+ };
80
+
81
+ const checkStreamTime = () => {
82
+ const defaultStreamUt = getUnixTime(Date.now()) - 40;
83
+ const maxStreamDelay = defaultStreamUt - 20;
84
+ let streamUt = get(icvPlayerObj, "stream_ut", defaultStreamUt);
85
+
86
+ if (streamUt > maxStreamDelay) {
87
+ streamUt = defaultStreamUt;
88
+ }
89
+ emit("time", streamUt);
90
+ };
91
+
92
+ const cleanup = () => {
93
+ if (icvPlayerObj) {
94
+ icvPlayerObj = <PlayerObj>{};
95
+ }
96
+ clearInterval(timeInterval);
97
+ };
98
+
99
+ // watchers
100
+
101
+ watch(
102
+ presentation,
103
+ (_oldPresentation: Presentation, _newPresentation: Presentation) => {
104
+ if (_oldPresentation.type !== _newPresentation.type) {
105
+ setupMediaPlayer();
106
+ }
107
+ }
108
+ );
109
+
110
+ watch(stream, (_oldStream, _newStream) => {
111
+ if (_oldStream !== _newStream) {
112
+ setupMediaPlayer();
113
+ }
114
+ });
115
+
116
+ // on mount
117
+ // @todo figure out why ICVDMStreamPlayer doesn't load when loadScripts is run asynchroniously
118
+ onMounted(() => {
119
+ const _script = document.createElement("script");
120
+ _script.setAttribute(
121
+ "src",
122
+ "https://cdn.v3mediaportal.com/streaming-player/js/icvdm.player.min.js?_id=75"
123
+ );
124
+ document.head.appendChild(_script);
125
+ _script.onload = () => {
126
+ if (get(window, "ICVDMStreamPlayer", false)) {
127
+ setupMediaPlayer();
128
+ timeInterval = setInterval(checkStreamTime, 1000);
129
+ }
130
+ };
131
+ });
132
+ </script>
133
+
134
+ <template>
135
+ <div
136
+ id="webcast-player-container"
137
+ :class="classBinding(classObject, 'container', 'text-center')"
138
+ >
139
+ <div
140
+ v-if="isHls"
141
+ id="mediaPlayer"
142
+ ref="mediaPlayer"
143
+ :class="classBinding(classObject, 'playerElement', '')"
144
+ ></div>
145
+ <span
146
+ v-if="isHtml"
147
+ :v-html="stream.embed_html"
148
+ :class="classBinding(classObject, 'embedElement', '')"
149
+ ></span>
150
+ </div>
151
+ </template>
152
+
153
+ <style>
154
+ #webcast-player-container > span {
155
+ padding-bottom: 56.25%;
156
+ height: 0;
157
+ position: relative;
158
+ display: block;
159
+ }
160
+ #webcast-player-container > span > iframe {
161
+ position: absolute;
162
+ top: 0;
163
+ left: 0;
164
+ height: 100%;
165
+ width: 100%;
166
+ }
167
+ </style>
@@ -1,44 +1,44 @@
1
- <script lang="ts" setup>
2
- import { ref, toRefs } from "vue";
3
- import { Conference } from "../../../models/conference";
4
- import {
5
- AgendaPanelClassObj,
6
- AgendaPanelCompObj,
7
- AgendaListClassObj,
8
- } from "../../../@types/components";
9
- import { useClassBinding } from "../../../composables/useClassBinding";
10
-
11
- type Props = {
12
- conference: Conference | null;
13
- classObject?: AgendaPanelClassObj;
14
- };
15
-
16
- const props = withDefaults(defineProps<Props>(), {
17
- classObject: () => {
18
- return {
19
- container: "",
20
- components: ref<AgendaPanelCompObj>({
21
- agendaList: ref<AgendaListClassObj>({}),
22
- }),
23
- };
24
- },
25
- });
26
-
27
- const { conference } = toRefs(props);
28
-
29
- const { classBinding } = useClassBinding();
30
- </script>
31
-
32
- <template>
33
- <div :class="classBinding(classObject, 'container', '')">
34
- <CommonAgendaList
35
- :conference="conference"
36
- :class-object="classObject.components.agendaList"
37
- style="margin-top: 0; margin-bottom: 0; border: none"
38
- />
39
- </div>
40
- </template>
41
-
1
+ <script lang="ts" setup>
2
+ import { ref, toRefs } from "vue";
3
+ import { Conference } from "../../../models/conference";
4
+ import {
5
+ AgendaPanelClassObj,
6
+ AgendaPanelCompObj,
7
+ AgendaListClassObj,
8
+ } from "../../../@types/components";
9
+ import { useClassBinding } from "../../../composables/useClassBinding";
10
+
11
+ type Props = {
12
+ conference: Conference | null;
13
+ classObject?: AgendaPanelClassObj;
14
+ };
15
+
16
+ const props = withDefaults(defineProps<Props>(), {
17
+ classObject: () => {
18
+ return {
19
+ container: "",
20
+ components: ref<AgendaPanelCompObj>({
21
+ agendaList: ref<AgendaListClassObj>({}),
22
+ }),
23
+ };
24
+ },
25
+ });
26
+
27
+ const { conference } = toRefs(props);
28
+
29
+ const { classBinding } = useClassBinding();
30
+ </script>
31
+
32
+ <template>
33
+ <div :class="classBinding(classObject, 'container', '')">
34
+ <CommonAgendaList
35
+ :conference="conference"
36
+ :class-object="classObject.components.agendaList"
37
+ style="margin-top: 0; margin-bottom: 0; border: none"
38
+ />
39
+ </div>
40
+ </template>
41
+
42
42
  <style scoped>
43
43
  .sponsor-grid {
44
44
  display: grid;
@@ -50,4 +50,4 @@ const { classBinding } = useClassBinding();
50
50
  align-self: center;
51
51
  justify-self: center;
52
52
  }
53
- </style>
53
+ </style>
@@ -1,99 +1,99 @@
1
- <template>
2
- <transition name="slide-fade">
3
- <div v-if="visible" class="flex bg-yellow-lightest shadow text-grey-darker py-6 px-10">
4
- <div class="flex-1 text-center mx-auto">
5
- <p>
6
- Time Remaining <span :class="timeRemainingClass">{{ displayFor }} seconds </span>
7
- </p>
8
- <p v-text="promptText"></p>
9
- <p>
10
- <button class="btn btn-secondary" @click="acceptClick" v-text="buttonText"></button>
11
- </p>
12
- </div>
13
- </div>
14
- </transition>
15
- </template>
16
-
1
+ <template>
2
+ <transition name="slide-fade">
3
+ <div v-if="visible" class="flex bg-yellow-lightest shadow text-grey-darker py-6 px-10">
4
+ <div class="flex-1 text-center mx-auto">
5
+ <p>
6
+ Time Remaining <span :class="timeRemainingClass">{{ displayFor }} seconds </span>
7
+ </p>
8
+ <p v-text="promptText"></p>
9
+ <p>
10
+ <button class="btn btn-secondary" @click="acceptClick" v-text="buttonText"></button>
11
+ </p>
12
+ </div>
13
+ </div>
14
+ </transition>
15
+ </template>
16
+
17
17
  <script>
18
- import Echo from 'laravel-echo';
19
- window.Pusher = require('pusher-js');
20
-
21
- /**
22
- @todo Extract the wsHost and app ID out so that this can run in multiple environments (local, staging, production)
23
- */
24
-
25
- window.Echo = new Echo({
26
- key: '07Ve4MlR6FmN0Il8Wy',
27
- broadcaster: 'pusher',
28
- cluster: 'us2',
29
- wsHost: 'socket.v3plusportal.com',
30
- wsPort: 6001,
31
- wssPort: 6002,
32
- disableStats: false,
33
- encrypted: true,
34
- enabledTransports: ['ws', 'wss'],
35
- });
36
-
37
- export default {
38
- data() {
39
- return {
40
- pusher: null,
41
- channel: null,
42
- displayFor: 0,
43
- promptText: '',
44
- buttonText: '',
45
- visible: false,
46
- countdownLoopId: null,
47
- };
48
- },
49
- computed: {
50
- timeRemainingClass() {
51
- if (this.displayFor > 10) {
52
- return 'font-bold text-green-dark';
53
- }
54
- return 'font-bold text-red';
55
- },
56
- },
57
- props: {
58
- conferenceId: {
59
- type: Number,
60
- required: true,
61
- },
62
- },
63
- methods: {
64
- handleNotification(_conference) {
65
- clearInterval(this.countdownLoopId);
66
- window.scrollTo({ top: 0, behavior: 'smooth' });
67
- this.visible = true;
68
- this.displayFor = parseInt(_conference.ce_credit_config.display_for) || 30;
69
- this.promptText = _conference.ce_credit_config.prompt_text;
70
- this.buttonText = _conference.ce_credit_config.button_text;
71
- this.countdownLoopId = setInterval(this.countdownLoop, 1000);
72
- },
73
- countdownLoop() {
74
- if (this.displayFor > 0) {
75
- this.displayFor--;
76
- } else {
77
- this.closeNotification();
78
- }
79
- },
80
- acceptClick() {
81
- this.closeNotification();
82
- },
83
- closeNotification() {
84
- this.displayFor = 0;
85
- this.visible = false;
86
- clearInterval(this.countdownLoopId);
87
- },
88
- },
89
- created() {
90
- window.Echo.channel(`ce-notification.${this.conferenceId}`).listen('CeCreditNotification', event => {
91
- this.handleNotification(event.conference);
92
- });
93
- },
18
+ import Echo from 'laravel-echo';
19
+ window.Pusher = require('pusher-js');
20
+
21
+ /**
22
+ @todo Extract the wsHost and app ID out so that this can run in multiple environments (local, staging, production)
23
+ */
24
+
25
+ window.Echo = new Echo({
26
+ key: '07Ve4MlR6FmN0Il8Wy',
27
+ broadcaster: 'pusher',
28
+ cluster: 'us2',
29
+ wsHost: 'socket.v3plusportal.com',
30
+ wsPort: 6001,
31
+ wssPort: 6002,
32
+ disableStats: false,
33
+ encrypted: true,
34
+ enabledTransports: ['ws', 'wss'],
35
+ });
36
+
37
+ export default {
38
+ data() {
39
+ return {
40
+ pusher: null,
41
+ channel: null,
42
+ displayFor: 0,
43
+ promptText: '',
44
+ buttonText: '',
45
+ visible: false,
46
+ countdownLoopId: null,
47
+ };
48
+ },
49
+ computed: {
50
+ timeRemainingClass() {
51
+ if (this.displayFor > 10) {
52
+ return 'font-bold text-green-dark';
53
+ }
54
+ return 'font-bold text-red';
55
+ },
56
+ },
57
+ props: {
58
+ conferenceId: {
59
+ type: Number,
60
+ required: true,
61
+ },
62
+ },
63
+ methods: {
64
+ handleNotification(_conference) {
65
+ clearInterval(this.countdownLoopId);
66
+ window.scrollTo({ top: 0, behavior: 'smooth' });
67
+ this.visible = true;
68
+ this.displayFor = parseInt(_conference.ce_credit_config.display_for) || 30;
69
+ this.promptText = _conference.ce_credit_config.prompt_text;
70
+ this.buttonText = _conference.ce_credit_config.button_text;
71
+ this.countdownLoopId = setInterval(this.countdownLoop, 1000);
72
+ },
73
+ countdownLoop() {
74
+ if (this.displayFor > 0) {
75
+ this.displayFor--;
76
+ } else {
77
+ this.closeNotification();
78
+ }
79
+ },
80
+ acceptClick() {
81
+ this.closeNotification();
82
+ },
83
+ closeNotification() {
84
+ this.displayFor = 0;
85
+ this.visible = false;
86
+ clearInterval(this.countdownLoopId);
87
+ },
88
+ },
89
+ created() {
90
+ window.Echo.channel(`ce-notification.${this.conferenceId}`).listen('CeCreditNotification', event => {
91
+ this.handleNotification(event.conference);
92
+ });
93
+ },
94
94
  };
95
- </script>
96
-
95
+ </script>
96
+
97
97
  <style scoped>
98
98
 
99
- </style>
99
+ </style>