@@ -16,12 +16,12 @@ import { VideoToggle } from './controls/video_toggle';
16
16
import { ScreenToggle } from './controls/screen_toggle' ;
17
17
import { ConnectionState , Room , Track } from 'livekit-client' ;
18
18
import { ReactNode , useCallback , useEffect , useRef , useState } from 'react' ;
19
- import { publisher , subject_map , SubjectKey } from '@/lib/std/chanel' ;
19
+ import { publisher , subject_map , SubjectKey , subscriber } from '@/lib/std/chanel' ;
20
20
import { SettingToggle } from './controls/setting_toggle' ;
21
- import { Button , Drawer , message , Slider } from 'antd' ;
21
+ import { Button , Drawer , message , Modal , Slider } from 'antd' ;
22
22
import { SvgResource } from '../pre_join/resources' ;
23
23
import { use_add_user_device , use_stored_set } from '@/lib/hooks/store/user_choices' ;
24
- import { AddDeviceInfo , useVideoBlur } from '@/lib/std/device' ;
24
+ import { AddDeviceInfo , State , useVideoBlur } from '@/lib/std/device' ;
25
25
26
26
export function Controls ( {
27
27
room,
@@ -51,7 +51,9 @@ export function Controls({
51
51
const [ volume , set_volume ] = useState ( add_derivce_settings . microphone . other ) ;
52
52
const [ video_blur , set_video_blur ] = useState ( add_derivce_settings . video . blur ) ;
53
53
const [ screen_blur , set_screen_blur ] = useState ( add_derivce_settings . screen . blur ) ;
54
-
54
+ const [ screen_bg_color , set_screen_bg_color ] = useState ( screen_enabled ? '#1E1E1E' : '#22CCEE' ) ;
55
+ const [ record , set_record ] = useState ( add_derivce_settings ) ;
56
+ const [ saved , set_saved ] = useState ( false ) ;
55
57
const visibleControls = { leave : true , ...controls } ;
56
58
const localPermissions = useLocalParticipantPermissions ( ) ;
57
59
@@ -124,7 +126,7 @@ export function Controls({
124
126
[ saveAudioInputEnabled ] ,
125
127
) ;
126
128
127
- const save_changes = ( ) => {
129
+ const save_changes = ( save : boolean ) => {
128
130
let username = userChoices . username ;
129
131
let data = Object . assign ( add_derivce_settings , {
130
132
microphone : {
@@ -138,20 +140,87 @@ export function Controls({
138
140
} ,
139
141
} ) as AddDeviceInfo ;
140
142
use_stored_set ( username , { device : data } ) ;
141
- set_setting_visible ( false ) ;
143
+
142
144
// 发布事件
143
145
publisher ( SubjectKey . Setting , data ) ;
146
+ set_saved ( save ) ;
147
+ if ( save ) {
148
+ set_setting_visible ( false ) ;
149
+ set_record ( data ) ;
150
+ messageApi . success ( 'Changes saved successfully' ) ;
151
+ }
152
+ } ;
144
153
145
- messageApi . success ( 'Changes saved successfully' ) ;
154
+ const close_setting = ( ) => {
155
+ // 当saved为false时 ,将record重新赋值给add_derivce_settings
156
+ if ( ! saved ) {
157
+ set_volume ( record . microphone . other ) ;
158
+ set_video_blur ( record . video . blur ) ;
159
+ set_screen_blur ( record . screen . blur ) ;
160
+ let username = userChoices . username ;
161
+ use_stored_set ( username , { device : record } ) ;
162
+ }
146
163
} ;
147
164
165
+ const screen_handle_state = useCallback ( ( state : State ) => {
166
+ if ( state === State . Start ) {
167
+ set_screen_enabled ( true ) ;
168
+ set_screen_bg_color ( '#22CCEE' ) ;
169
+ } else {
170
+ set_screen_enabled ( false ) ;
171
+
172
+ set_screen_bg_color ( '#1E1E1E' ) ;
173
+ }
174
+ } , [ ] ) ;
175
+
176
+ // const audio_handle_state = useCallback((state: State) => {
177
+ // console.error('audio_handle_state', state);
178
+ // set_audio_enabled(state === State.Start);
179
+ // }, []);
180
+
181
+ // const video_handle_state = useCallback((state: State) => {
182
+ // set_video_enabled(state === State.Start);
183
+ // }, []);
184
+
185
+ useEffect ( ( ) => {
186
+ const screen_sub = subscriber ( SubjectKey . ScreenState , screen_handle_state ) ;
187
+ // const audio_sub = subscriber(SubjectKey.AudioState, audio_handle_state);
188
+ // const video_sub = subscriber(SubjectKey.VideoState, video_handle_state);
189
+
190
+ return ( ) => {
191
+ screen_sub ?. unsubscribe ( ) ;
192
+ // audio_sub?.unsubscribe();
193
+ // video_sub?.unsubscribe();
194
+ } ;
195
+ } , [ screen_handle_state ] ) ;
196
+
197
+ // [当整个room加载好之后,询问用户是否需要开启屏幕分享] -------------------------------------------------------------------
198
+ const { confirm } = Modal ;
199
+
200
+ useEffect ( ( ) => {
201
+ if ( room ?. state === ConnectionState . Connected ) {
202
+ confirm ( {
203
+ title : 'Do you want to share your screen?' ,
204
+ content : 'You can share your screen with others in the room.' ,
205
+ onOk ( ) {
206
+ screen_on_clicked ( false ) ;
207
+ } ,
208
+ onCancel ( ) { } ,
209
+ } ) ;
210
+ }
211
+ } , [ room ?. state ] ) ;
212
+
148
213
return (
149
214
< div className = { `${ styles . controls } lk-control-bar` } >
150
215
{ contextHolder }
151
216
< div className = { styles . controls_left } >
152
217
< AudioToggle enabled = { audio_enabled } onClicked = { audio_on_clicked } > </ AudioToggle >
153
218
< VideoToggle enabled = { video_enabled } onClicked = { video_on_clicked } > </ VideoToggle >
154
- < ScreenToggle enabled = { screen_enabled } onClicked = { screen_on_clicked } > </ ScreenToggle >
219
+ < ScreenToggle
220
+ enabled = { screen_enabled }
221
+ onClicked = { screen_on_clicked }
222
+ bg_color = { screen_bg_color }
223
+ > </ ScreenToggle >
155
224
< SettingToggle enabled = { setting_visible } onClicked = { setting_on_clicked } > </ SettingToggle >
156
225
{ visibleControls . chat && (
157
226
< ChatToggle >
@@ -169,6 +238,7 @@ export function Controls({
169
238
title = "Settings"
170
239
placement = "right"
171
240
closable = { false }
241
+ onClose = { close_setting }
172
242
width = { '40%' }
173
243
open = { setting_visible }
174
244
extra = { setting_drawer_header ( {
@@ -181,7 +251,10 @@ export function Controls({
181
251
< Slider
182
252
defaultValue = { volume }
183
253
className = { styles . common_space }
184
- onChange = { ( e ) => set_volume ( e ) }
254
+ onChange = { ( e ) => {
255
+ set_volume ( e ) ;
256
+ save_changes ( false ) ;
257
+ } }
185
258
/>
186
259
</ div >
187
260
@@ -197,6 +270,7 @@ export function Controls({
197
270
onChange = { ( e ) => {
198
271
set_video_blur ( e ) ;
199
272
setVideoBlur ( e ) ;
273
+ save_changes ( false ) ;
200
274
} }
201
275
/>
202
276
</ div >
@@ -212,21 +286,12 @@ export function Controls({
212
286
onChange = { ( e ) => {
213
287
set_screen_blur ( e ) ;
214
288
setVideoBlur ( e ) ;
289
+ save_changes ( false ) ;
215
290
} }
216
291
/>
217
292
</ div >
218
- < div className = { styles . setting_box } style = { { overflow : 'hidden' } } >
219
- < div > Blur Test:{ Math . round ( blurValue ) } px</ div >
220
- < img
221
- ref = { video_track_ref }
222
- src = { `${ process . env . NEXT_PUBLIC_BASE_PATH } /images/blur_test.png` }
223
- height = "220"
224
- style = { { marginBottom : '16px' , filter : `blur(${ blurValue } px)` , overflow : 'hidden' } }
225
- />
226
- </ div >
227
-
228
293
< div className = { styles . setting_container_footer } >
229
- < Button type = "primary" onClick = { save_changes } >
294
+ < Button type = "primary" onClick = { ( ) => save_changes ( true ) } >
230
295
Save Changes
231
296
</ Button >
232
297
</ div >
0 commit comments