@tellescope/video-chat 0.0.11

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/src/video.tsx ADDED
@@ -0,0 +1,129 @@
1
+ import React, { useCallback, useState, CSSProperties } from "react"
2
+
3
+ import {
4
+ useSession,
5
+ } from "@tellescope/react-components/lib/esm/authentication"
6
+
7
+ import {
8
+ UserIdentity,
9
+ } from "@tellescope/types-utilities"
10
+ import {
11
+ AttendeeInfo,
12
+ MeetingInfo,
13
+ } from '@tellescope/types-models'
14
+
15
+ import {
16
+ user_display_name,
17
+ } from "@tellescope/utilities"
18
+
19
+ import {
20
+ Session,
21
+ EnduserSession,
22
+ } from "@tellescope/sdk"
23
+
24
+ import { ThemeProvider } from 'styled-components';
25
+ import {
26
+ MeetingProvider,
27
+ lightTheme,
28
+
29
+ // LocalVideo,
30
+ VideoTileGrid,
31
+ // VideoGrid,
32
+ // VideoTile,
33
+ // PreviewVideo,
34
+ // RemoteVideo,
35
+ useLocalVideo,
36
+ useMeetingManager,
37
+ // useRosterState,
38
+ // useRemoteVideoTileState,
39
+ // useContentShareControls, // screen sharing
40
+ } from 'amazon-chime-sdk-component-library-react';
41
+ import { } from "../../../types-client/node_modules/@tellescope/types-models/src"
42
+
43
+ export const CurrentCallContext = React.createContext({} as {
44
+ meeting: MeetingInfo | undefined, setMeeting: (m: MeetingInfo | undefined) => void,
45
+ })
46
+ interface VideoProps {
47
+ children?: React.ReactNode,
48
+ theme?: typeof lightTheme,
49
+ }
50
+ export const WithVideo = ({ children, theme=lightTheme }: VideoProps) => {
51
+ const [meeting, setMeeting] = useState(undefined as MeetingInfo | undefined)
52
+
53
+ return (
54
+ <CurrentCallContext.Provider value={{ meeting, setMeeting }}>
55
+ <ThemeProvider theme={theme}>
56
+ <MeetingProvider>
57
+ {children}
58
+ </MeetingProvider>
59
+ </ThemeProvider>
60
+ </CurrentCallContext.Provider>
61
+ )
62
+ }
63
+
64
+ export const useStartVideoCall = () => {
65
+ const [starting, setStarting] = useState(false)
66
+ const [ending, setEnding] = useState(false)
67
+ const { meeting, setMeeting } = React.useContext(CurrentCallContext)
68
+
69
+ const session = useSession()
70
+ const meetingManager = useMeetingManager();
71
+ const { toggleVideo, isVideoEnabled } = useLocalVideo();
72
+
73
+ const createAndStartMeeting = async (initialAttendees?: UserIdentity[]) => {
74
+ setStarting(false)
75
+
76
+ try {
77
+ const { meeting, host } = await session.api.meetings.start_meeting()
78
+
79
+ await meetingManager.join({ meetingInfo: meeting, attendeeInfo: host }); // Use the join API to create a meeting session
80
+ await meetingManager.start(); // At this point you can let users setup their devices, or start the session immediately
81
+
82
+ if (initialAttendees) {
83
+ session.api.meetings.add_attendees_to_meeting({ id: meeting.Meeting.ExternalMeetingId, attendees: initialAttendees })
84
+ }
85
+
86
+ setMeeting(meeting.Meeting)
87
+ } catch(err) {
88
+ console.error(err)
89
+ }
90
+ finally {
91
+ setStarting(false)
92
+ }
93
+ }
94
+
95
+ const addAttendees = useCallback(async (attendees: UserIdentity[]) => {
96
+ if (!meeting) return
97
+ await session.api.meetings.add_attendees_to_meeting({ id: meeting?.ExternalMeetingId, attendees })
98
+ }, [session, meeting])
99
+
100
+ const endMeeting = async () => {
101
+ if (!meeting) return
102
+ setEnding(true)
103
+
104
+ try {
105
+ await session.api.meetings.end_meeting({ id: meeting.ExternalMeetingId })
106
+ } catch(err) { console.error(err) }
107
+
108
+ setEnding(false)
109
+ setMeeting(undefined)
110
+ }
111
+
112
+ return { starting, ending, meeting, videoIsEnabled: isVideoEnabled, toggleVideo, createAndStartMeeting, addAttendees, endMeeting }
113
+ }
114
+
115
+ export const useJoinVideoCall = () => {
116
+ const meetingManager = useMeetingManager();
117
+ const { toggleVideo, isVideoEnabled } = useLocalVideo();
118
+ const { meeting, setMeeting } = React.useContext(CurrentCallContext)
119
+
120
+ const joinMeeting = async (meetingInfo: { Meeting: MeetingInfo }, attendeeInfo: { Attendee: AttendeeInfo }) => {
121
+ await meetingManager.join({ meetingInfo, attendeeInfo }); // Use the join API to create a meeting session
122
+ await meetingManager.start(); // At this point you can let users setup their devices, or start the session immediately
123
+ setMeeting(meetingInfo.Meeting)
124
+ }
125
+
126
+ return { meeting, videoIsEnabled: isVideoEnabled, toggleVideo, joinMeeting }
127
+ }
128
+
129
+ export { VideoTileGrid }
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.settings.json",
3
+ "compilerOptions": {
4
+ "outDir": "lib/esm",
5
+ "rootDir": "src",
6
+ },
7
+ "exclude": ["node_modules", "lib", "tests"],
8
+ "include": ["src"],
9
+ "references": [
10
+ { "path": "../components" },
11
+ ]
12
+ }