@icvdeveloper/common-module 1.0.2 → 1.0.4

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 (36) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/@types/components.d.ts +77 -0
  4. package/dist/runtime/components/core/AttendeeList.vue +386 -0
  5. package/dist/runtime/components/core/SvgIcon.vue +12 -0
  6. package/dist/runtime/components/events/ListEvents.vue +15 -2
  7. package/dist/runtime/components/media/components/CeCreditNotification.vue +137 -87
  8. package/dist/runtime/components/media/components/DocumentsPanel.vue +104 -27
  9. package/dist/runtime/components/media/components/SessionReporting.vue +0 -2
  10. package/dist/runtime/components/media/components/SponsorsPanel.vue +192 -68
  11. package/dist/runtime/composables/usePusher.d.ts +15 -0
  12. package/dist/runtime/composables/usePusher.mjs +52 -0
  13. package/dist/runtime/models/attendeeList.d.ts +10 -0
  14. package/dist/runtime/models/attendeeList.mjs +0 -0
  15. package/dist/runtime/models/conference.d.ts +15 -0
  16. package/dist/runtime/models/conversation.d.ts +18 -0
  17. package/dist/runtime/models/conversation.mjs +0 -0
  18. package/dist/runtime/models/icons.d.ts +2 -0
  19. package/dist/runtime/models/pagination.d.ts +14 -0
  20. package/dist/runtime/models/pagination.mjs +1 -0
  21. package/dist/runtime/models/user.d.ts +17 -0
  22. package/dist/runtime/models/user.mjs +0 -0
  23. package/dist/runtime/plugin.mjs +1 -1
  24. package/dist/runtime/store/attendeeList.d.ts +27 -0
  25. package/dist/runtime/store/attendeeList.mjs +74 -0
  26. package/dist/runtime/store/auth.d.ts +1 -0
  27. package/dist/runtime/store/auth.mjs +21 -4
  28. package/dist/runtime/store/conversations.d.ts +10 -0
  29. package/dist/runtime/store/conversations.mjs +26 -0
  30. package/dist/runtime/store/navigationConfig.d.ts +1 -1
  31. package/dist/runtime/store/user.d.ts +7 -0
  32. package/dist/runtime/store/user.mjs +23 -0
  33. package/package.json +6 -1
  34. package/dist/runtime/components/media/components/CeCreditNotification.vue.d.ts +0 -28
  35. package/dist/runtime/components/media/components/DocumentsPanel.vue.d.ts +0 -7
  36. package/dist/runtime/components/media/components/SponsorsPanel.vue.d.ts +0 -27
@@ -0,0 +1,52 @@
1
+ import Pusher from "pusher-js";
2
+ import Echo from "laravel-echo";
3
+ import { storeToRefs } from "pinia";
4
+ import { useAuthStore } from "../store/auth.mjs";
5
+ import { useAttendeeListStore } from "../store/attendeeList.mjs";
6
+ import { usePortalStore } from "../store/portal.mjs";
7
+ const {
8
+ setOnlineUsers,
9
+ setOnlineUser,
10
+ removeOnlineUser,
11
+ setUserOnline,
12
+ setRemoteUserOnline,
13
+ setRemoteUserOffline
14
+ } = useAttendeeListStore();
15
+ const { user } = storeToRefs(useAuthStore());
16
+ const { onlineUsers } = storeToRefs(useAttendeeListStore());
17
+ const { data: portal } = storeToRefs(usePortalStore());
18
+ export const usePusher = () => {
19
+ const joinPresenceChannel = () => {
20
+ const token = "Bearer " + user.value?.token;
21
+ window.Pusher = Pusher;
22
+ window.Echo = new Echo({
23
+ key: "276111d83646e96796ed",
24
+ broadcaster: "pusher",
25
+ cluster: "us2",
26
+ forceTLS: true,
27
+ authEndpoint: "https://staging.v3plusportal.com/broadcasting/auth",
28
+ auth: {
29
+ headers: {
30
+ authorization: token
31
+ }
32
+ }
33
+ });
34
+ console.log(`presence.${portal.value?.id}`);
35
+ window.Echo.join(`presence.${portal.value?.id}`).here((users) => {
36
+ console.log("users here:", users);
37
+ setOnlineUsers(users);
38
+ setUserOnline();
39
+ }).joining((user2) => {
40
+ console.log("user joining:", user2);
41
+ setOnlineUser(user2);
42
+ setRemoteUserOnline(user2.id);
43
+ }).leaving((user2) => {
44
+ console.log("user leaving:", user2);
45
+ removeOnlineUser(user2.id);
46
+ setRemoteUserOffline(user2.id);
47
+ });
48
+ };
49
+ return {
50
+ joinPresenceChannel
51
+ };
52
+ };
@@ -0,0 +1,10 @@
1
+ import { User } from "./user";
2
+ import { Pagination } from "./pagination";
3
+ export type AttendeeList = {
4
+ page?: number | null;
5
+ lastPage?: number | null;
6
+ data: User[];
7
+ };
8
+ export interface AttendeeListResult extends Pagination {
9
+ data?: User[] | null;
10
+ }
File without changes
@@ -103,6 +103,7 @@ export type Presentation = {
103
103
  presenters?: Array<Presenter>;
104
104
  sponsors?: Array<Sponsor>;
105
105
  tracks?: Array<Track>;
106
+ documents?: Array<Document>;
106
107
  };
107
108
  export type Track = {
108
109
  access?: boolean;
@@ -132,6 +133,19 @@ export type Day = {
132
133
  track_groups?: Array<TrackGroup>;
133
134
  sponsors?: Array<Sponsor>;
134
135
  };
136
+ export type CeCreditConfig = {
137
+ id: number;
138
+ conference_id: number;
139
+ enabled: boolean;
140
+ format: string;
141
+ text_response_answer: string | null;
142
+ randomize_interval: boolean;
143
+ per_hour: number;
144
+ sequence_array: Array<number>;
145
+ display_for: number;
146
+ prompt_text: string | null;
147
+ button_text: string | null;
148
+ };
135
149
  export type Conference = {
136
150
  access?: boolean;
137
151
  agenda_enabled?: boolean;
@@ -153,6 +167,7 @@ export type Conference = {
153
167
  affiliates?: Array<Sponsor>;
154
168
  sponsors?: Array<Sponsor>;
155
169
  template_config?: object;
170
+ ce_credit_config?: CeCreditConfig;
156
171
  };
157
172
  export type Stream = {
158
173
  id: number;
@@ -0,0 +1,18 @@
1
+ import { User } from "./user";
2
+ export type MessagesRead = {
3
+ user?: User | null;
4
+ };
5
+ export type Message = {
6
+ id?: number;
7
+ user?: User | null;
8
+ message?: string | null;
9
+ messages_read?: MessagesRead | null;
10
+ created_at?: string | null;
11
+ };
12
+ export type Conversation = {
13
+ id?: number;
14
+ users?: User[] | null;
15
+ user?: User | null;
16
+ messages?: Message[] | null;
17
+ last_message?: Message | null;
18
+ };
File without changes
@@ -19,4 +19,6 @@ export type Icons = {
19
19
  chevron: Icon;
20
20
  circlePlus: Icon;
21
21
  circleMinus: Icon;
22
+ online: Icon;
23
+ offline: Icon;
22
24
  };
@@ -0,0 +1,14 @@
1
+ export interface Pagination {
2
+ total?: number | null;
3
+ per_page?: number | null;
4
+ current_page?: number | null;
5
+ last_page?: number | null;
6
+ first_page_url?: string | null;
7
+ last_page_url?: string | null;
8
+ next_page_url?: string | null;
9
+ prev_page_url?: string | null;
10
+ path?: string | null;
11
+ from?: number | null;
12
+ to?: number | null;
13
+ }
14
+ export declare const PAGE_LENGTH = 15;
@@ -0,0 +1 @@
1
+ export const PAGE_LENGTH = 15;
@@ -0,0 +1,17 @@
1
+ import { Group } from "./group";
2
+ import { Conference } from "./conference";
3
+ export type User = {
4
+ id?: number;
5
+ name?: string;
6
+ email?: string;
7
+ company?: string | null;
8
+ title?: string | null;
9
+ online?: boolean;
10
+ profile_image?: string | null;
11
+ linkedin_url?: string | null;
12
+ twitter_url?: string | null;
13
+ video_chat?: boolean | null;
14
+ type?: string;
15
+ groups?: Group[];
16
+ conferences?: Conference[];
17
+ };
File without changes
@@ -127,7 +127,7 @@ export default defineNuxtPlugin((nuxtApp) => {
127
127
  nuxtApp.hook("app:created", (app) => {
128
128
  const { data: portal } = storeToRefs(usePortalStore());
129
129
  const { globalConfigValue } = useTemplateConfigsStore();
130
- let customCss = globalConfigValue("custom_css");
130
+ let customCss = globalConfigValue("custom_css") || "";
131
131
  customCss = customCss.length > 0 ? customCss.replace(/\n/g, "") : "";
132
132
  if (portal.value) {
133
133
  app.config.globalProperties.$head.addHeadObjs(
@@ -0,0 +1,27 @@
1
+ import { User } from "../models/user";
2
+ import { AttendeeList } from "../models/attendeeList";
3
+ export interface AttendeeListState {
4
+ attendeeList: {
5
+ page?: number | null;
6
+ lastPage?: number | null;
7
+ data: User[];
8
+ };
9
+ onlineUsers: {
10
+ page?: number | null;
11
+ lastPage?: number | null;
12
+ data: User[];
13
+ };
14
+ }
15
+ export declare const useAttendeeListStore: import("pinia").StoreDefinition<"attendeeList", AttendeeListState, {}, {
16
+ getAttendeeList(params: {
17
+ pageNumber: number;
18
+ searchParams?: string | undefined;
19
+ }): Promise<AttendeeList>;
20
+ clearAttendeeList(): void;
21
+ setOnlineUsers(users: User[]): void;
22
+ setOnlineUser(user: User): void;
23
+ removeOnlineUser(id: number): void;
24
+ setUserOnline(): void;
25
+ setRemoteUserOnline(id: number): void;
26
+ setRemoteUserOffline(id: number): void;
27
+ }>;
@@ -0,0 +1,74 @@
1
+ import { defineStore } from "pinia";
2
+ import { map, remove } from "lodash-es";
3
+ import { useApi } from "../composables/useApi.mjs";
4
+ export const useAttendeeListStore = defineStore("attendeeList", {
5
+ state: () => ({
6
+ attendeeList: {
7
+ page: 1,
8
+ lastPage: null,
9
+ data: []
10
+ },
11
+ onlineUsers: {
12
+ page: 1,
13
+ lastPage: null,
14
+ data: []
15
+ }
16
+ }),
17
+ getters: {},
18
+ actions: {
19
+ getAttendeeList(params) {
20
+ const { pageNumber, searchParams } = params;
21
+ return new Promise((resolve, reject) => {
22
+ const request = useApi();
23
+ const params2 = searchParams?.length ? new URLSearchParams({
24
+ page: pageNumber.toString(),
25
+ search: searchParams
26
+ }) : new URLSearchParams({ page: pageNumber.toString() });
27
+ request(`/users/?` + params2).then((response) => {
28
+ this.attendeeList = {
29
+ page: response.meta.current_page,
30
+ lastPage: response.meta.last_page,
31
+ data: response.data
32
+ };
33
+ resolve(this.attendeeList);
34
+ }).catch((error) => {
35
+ reject(error);
36
+ });
37
+ });
38
+ },
39
+ clearAttendeeList() {
40
+ this.attendeeList = {
41
+ page: 1,
42
+ lastPage: null,
43
+ data: []
44
+ };
45
+ },
46
+ setOnlineUsers(users) {
47
+ this.onlineUsers.data = users;
48
+ },
49
+ setOnlineUser(user) {
50
+ this.onlineUsers.data?.push(user);
51
+ },
52
+ removeOnlineUser(id) {
53
+ remove(this.onlineUsers.data, { id });
54
+ },
55
+ setUserOnline() {
56
+ const request = useApi();
57
+ request(`user/online`, { method: "PUT" });
58
+ },
59
+ setRemoteUserOnline(id) {
60
+ map(this.onlineUsers.data, (storedUser) => {
61
+ if (storedUser.id === id) {
62
+ storedUser.online = true;
63
+ }
64
+ });
65
+ },
66
+ setRemoteUserOffline(id) {
67
+ map(this.onlineUsers.data, (storedUser) => {
68
+ if (storedUser.id === id) {
69
+ storedUser.online = false;
70
+ }
71
+ });
72
+ }
73
+ }
74
+ });
@@ -11,6 +11,7 @@ export declare const useAuthStore: import("pinia").StoreDefinition<"auth", AuthS
11
11
  isLoggedIn: (state: AuthStoreState) => boolean;
12
12
  }, {
13
13
  loginEmailOnly(data: object): Promise<AuthUser>;
14
+ reset(): void;
14
15
  login(params: LoginParams): Promise<AuthUser>;
15
16
  logout(): Promise<void>;
16
17
  update(data: AuthUser): Promise<void>;
@@ -2,8 +2,24 @@ import { defineStore } from "pinia";
2
2
  import { merge } from "lodash-es";
3
3
  import { useApi } from "../composables/useApi.mjs";
4
4
  import { useConferencesStore } from "./conferences.mjs";
5
+ import { DateTime } from "luxon";
5
6
  export const useAuthStore = defineStore("auth", {
6
- persist: true,
7
+ persist: {
8
+ afterRestore(context) {
9
+ if (context.store.$state.user) {
10
+ const user = context.store.$state.user;
11
+ const now = DateTime.now().setZone("utc");
12
+ const expiration = DateTime.fromFormat(
13
+ user.expires_at,
14
+ "yyyy-MM-dd HH:mm:ss",
15
+ { zone: "utc" }
16
+ ).minus({ hours: 2 });
17
+ if (now >= expiration) {
18
+ context.store.reset();
19
+ }
20
+ }
21
+ }
22
+ },
7
23
  state: () => ({
8
24
  user: null
9
25
  }),
@@ -16,9 +32,7 @@ export const useAuthStore = defineStore("auth", {
16
32
  loginEmailOnly(data) {
17
33
  return new Promise((resolve, reject) => {
18
34
  const request = useApi();
19
- request(
20
- `users/email/${data.email}?with=token`
21
- ).then((response) => {
35
+ request(`users/email/${data.email}?with=token`).then((response) => {
22
36
  let mergedUser = merge(data, response);
23
37
  this.user = mergedUser;
24
38
  const { selectedConference, getSelectedConference } = useConferencesStore();
@@ -29,6 +43,9 @@ export const useAuthStore = defineStore("auth", {
29
43
  });
30
44
  });
31
45
  },
46
+ reset() {
47
+ this.user = null;
48
+ },
32
49
  login(params) {
33
50
  return new Promise((resolve, reject) => {
34
51
  const request = useApi();
@@ -0,0 +1,10 @@
1
+ import { User } from "../models/user";
2
+ import { Conversation } from "../models/conversation";
3
+ export interface ConversationState {
4
+ chatOpen: boolean;
5
+ selectedConversation: Conversation;
6
+ }
7
+ export declare const useConversationStore: import("pinia").StoreDefinition<"conversations", ConversationState, {}, {
8
+ toggleChat(): void;
9
+ createConversation(users: User[]): Promise<Conversation>;
10
+ }>;
@@ -0,0 +1,26 @@
1
+ import { defineStore } from "pinia";
2
+ import { useApi } from "../composables/useApi.mjs";
3
+ ;
4
+ export const useConversationStore = defineStore("conversations", {
5
+ state: () => ({
6
+ chatOpen: false,
7
+ selectedConversation: {}
8
+ }),
9
+ getters: {},
10
+ actions: {
11
+ toggleChat() {
12
+ this.chatOpen = !this.chatOpen;
13
+ },
14
+ createConversation(users) {
15
+ return new Promise((resolve, reject) => {
16
+ const request = useApi();
17
+ request(`conversations`, { users }).then((response) => {
18
+ this.selectedConversation = response.data;
19
+ resolve(this.selectedConversation);
20
+ }).catch((error) => {
21
+ reject(error);
22
+ });
23
+ });
24
+ }
25
+ }
26
+ });
@@ -3,7 +3,7 @@ export interface NavigationConfigState {
3
3
  data: NavigationConfig[];
4
4
  }
5
5
  export declare const useNavigationConfigStore: import("pinia").StoreDefinition<"navigationConfig", NavigationConfigState, {
6
- getEnabled: (state: NavigationConfigState) => (sorted?: boolean) => any;
6
+ getEnabled: (state: NavigationConfigState) => (sorted?: boolean) => NavigationConfig[];
7
7
  }, {
8
8
  setNavigationConfig(payload: any): Promise<NavigationConfigState>;
9
9
  }>;
@@ -0,0 +1,7 @@
1
+ import { User } from "../models/user";
2
+ export interface UserState {
3
+ currentUser: User;
4
+ }
5
+ export declare const useUserStore: import("pinia").StoreDefinition<"user", UserState, {}, {
6
+ getUser(): Promise<User>;
7
+ }>;
@@ -0,0 +1,23 @@
1
+ import { defineStore } from "pinia";
2
+ import { useApi } from "../composables/useApi.mjs";
3
+ ;
4
+ export const useUserStore = defineStore("user", {
5
+ state: () => ({
6
+ currentUser: {}
7
+ }),
8
+ getters: {},
9
+ // TODO try and combine this with store/auth user handling
10
+ actions: {
11
+ getUser() {
12
+ return new Promise((resolve, reject) => {
13
+ const request = useApi();
14
+ request(`user`, {}).then((response) => {
15
+ this.currentUser = response.data;
16
+ resolve(this.currentUser);
17
+ }).catch((error) => {
18
+ reject(error);
19
+ });
20
+ });
21
+ }
22
+ }
23
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icvdeveloper/common-module",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -26,13 +26,17 @@
26
26
  "@nuxt/kit": "^3.0.0",
27
27
  "@nuxtjs/tailwindcss": "^6.1.3",
28
28
  "@pinia/nuxt": "^0.3.1",
29
+ "@ts-pro/vue-eternal-loading": "^1.3.1",
30
+ "@types/pusher-js": "^5.1.0",
29
31
  "add-to-calendar-button": "^2.1.1",
30
32
  "analytics": "^0.8.1",
33
+ "laravel-echo": "^1.15.1",
31
34
  "lodash-es": "^4.17.21",
32
35
  "luxon": "^3.2.1",
33
36
  "nprogress": "^0.2.0",
34
37
  "pinia": "^2.0.17",
35
38
  "pinia-plugin-persistedstate": "^2.1.1",
39
+ "pusher-js": "^8.2.0",
36
40
  "sass": "^1.54.2",
37
41
  "sass-loader": "^13.0.2",
38
42
  "tailwindcss-opentype": "^1.1.0",
@@ -42,6 +46,7 @@
42
46
  "@nuxt/module-builder": "^0.2.1",
43
47
  "@nuxtjs/eslint-config-typescript": "^12.0.0",
44
48
  "@tailwindcss/typography": "^0.5.4",
49
+ "@types/lodash-es": "^4.17.7",
45
50
  "eslint": "^8.22.0",
46
51
  "eslint-config-prettier": "^8.5.0",
47
52
  "nuxt": "^3.0.0"
@@ -1,28 +0,0 @@
1
- declare namespace _default {
2
- function data(): {
3
- pusher: null;
4
- channel: null;
5
- displayFor: number;
6
- promptText: string;
7
- buttonText: string;
8
- visible: boolean;
9
- countdownLoopId: null;
10
- };
11
- namespace computed {
12
- function timeRemainingClass(): "font-bold text-green-dark" | "font-bold text-red";
13
- }
14
- namespace props {
15
- namespace conferenceId {
16
- const type: NumberConstructor;
17
- const required: boolean;
18
- }
19
- }
20
- namespace methods {
21
- function handleNotification(_conference: any): void;
22
- function countdownLoop(): void;
23
- function acceptClick(): void;
24
- function closeNotification(): void;
25
- }
26
- function created(): void;
27
- }
28
- export default _default;
@@ -1,7 +0,0 @@
1
- declare namespace _default {
2
- function data(): {};
3
- namespace computed {
4
- function documentArray(): any;
5
- }
6
- }
7
- export default _default;
@@ -1,27 +0,0 @@
1
- declare namespace _default {
2
- function data(): {
3
- sponsorsArray: never[];
4
- trackSponsorsArray: never[];
5
- };
6
- namespace props {
7
- namespace sponsorType {
8
- const type: StringConstructor;
9
- }
10
- namespace currentPresentation {
11
- const type_1: ObjectConstructor;
12
- export { type_1 as type };
13
- function _default(): {};
14
- export { _default as default };
15
- }
16
- }
17
- const computed: {};
18
- const methods: {};
19
- namespace watch {
20
- export namespace currentPresentation_1 {
21
- const immediate: boolean;
22
- function handler(currentPres: any): void;
23
- }
24
- export { currentPresentation_1 as currentPresentation };
25
- }
26
- }
27
- export default _default;