Skip to content

Commit a590d7f

Browse files
committed
finish 03-11
1 parent ad1fddf commit a590d7f

13 files changed

+440
-338
lines changed

app/rooms/[roomName]/PageClientImpl.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ function VideoConferenceComponent(props: {
136136
}, [props.userChoices, props.options.hq, props.options.codec]);
137137

138138
const room = React.useMemo(() => new Room(roomOptions), []);
139-
const device_settings = use_add_user_device(props.userChoices.username);
140139
React.useEffect(() => {
141140
if (e2eeEnabled) {
142141
keyProvider

app/rooms/[roomName]/pre_join/pre_join.tsx

+19-53
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { Button, Input, Slider, Switch } from 'antd';
1818
import { DevicesSelector } from '@/app/api/devices/device_selector';
1919
import { count_video_blur, default_device, MediaDeviceKind } from '@/lib/std/device';
2020
import { ScreenPreview } from '@/app/api/devices/screen_preview';
21-
import { use_add_user_device, use_stored_set} from '@/lib/hooks/store/user_choices';
21+
import { use_add_user_device, use_stored_set } from '@/lib/hooks/store/user_choices';
2222

2323
/**
2424
* The PreJoin Page component should use before user enter into the room.
@@ -50,11 +50,12 @@ export function PreJoin({
5050
});
5151

5252
const [user_choices, set_user_choices] = useState(initialUserChoices);
53-
const [device_settings, set_device_settings] = useState(use_add_user_device(user_choices.username));
53+
const [device_settings, set_device_settings] = useState(
54+
use_add_user_device(user_choices.username),
55+
);
5456
// [enables] ---------------------------------------------------------------------
55-
const [audio_enabled, set_audio_enabled] = useState(device_settings.microphone.enabled);
56-
const [video_enabled, set_video_enabled] = useState(device_settings.video.enabled);
57-
const [screen_enabled, set_screen_enabled] = useState(device_settings.screen.enabled);
57+
const [audio_enabled, set_audio_enabled] = useState(true);
58+
const [video_enabled, set_video_enabled] = useState(true);
5859
const [audio_device_id, set_audio_device_id] = useState(user_choices.audioDeviceId);
5960
const [video_device_id, set_video_device_id] = useState(user_choices.videoDeviceId);
6061
const [username, set_username] = useState(user_choices.username);
@@ -146,7 +147,7 @@ export function PreJoin({
146147
blur: video_blur,
147148
},
148149
screen: {
149-
enabled: screen_enabled,
150+
enabled: false,
150151
blur: screen_blur,
151152
},
152153
},
@@ -184,9 +185,8 @@ export function PreJoin({
184185
set_screen_blur(0.15);
185186
set_volume_self(100);
186187
set_volume_others(20);
187-
set_audio_enabled(false);
188-
set_video_enabled(false);
189-
set_screen_enabled(false);
188+
set_audio_enabled(true);
189+
set_video_enabled(true);
190190
set_username('');
191191
};
192192
// [play] ------------------------------------------------------------------------
@@ -246,7 +246,11 @@ export function PreJoin({
246246
</div>
247247

248248
<Slider
249-
defaultValue={volume_self}
249+
min={0.0}
250+
max={100.0}
251+
step={1}
252+
value={volume_self}
253+
defaultValue={100}
250254
className={styles.common_space}
251255
onChange={(e) => set_volume_self(e)}
252256
/>
@@ -265,7 +269,11 @@ export function PreJoin({
265269
</Button>
266270
</div>
267271
<Slider
268-
defaultValue={volume_others}
272+
min={0.0}
273+
max={100.0}
274+
step={1}
275+
value={volume_others}
276+
defaultValue={20}
269277
className={styles.common_space}
270278
onChange={(e) => set_volume_others(e)}
271279
/>
@@ -321,36 +329,6 @@ export function PreJoin({
321329
></DevicesSelector>
322330
</div>
323331
</div>
324-
<div>
325-
<header>
326-
<div className={styles['pre_join_main_device_tool']}>
327-
<SvgResource type="screen" />
328-
<span>Screen share</span>
329-
</div>
330-
<Switch
331-
defaultChecked={screen_enabled}
332-
className={styles.remove_bg}
333-
value={screen_enabled}
334-
onChange={(e) => {
335-
set_screen_enabled(e);
336-
}}
337-
></Switch>
338-
</header>
339-
<div className={styles.adjust_settings}>
340-
<span>Screen Blur:</span>
341-
<Slider
342-
defaultValue={0.15}
343-
className={`${styles.common_space} ${styles.slider}`}
344-
value={screen_blur}
345-
min={0}
346-
max={1}
347-
step={0.05}
348-
onChange={(e) => {
349-
set_screen_blur(e);
350-
}}
351-
/>
352-
</div>
353-
</div>
354332
<div>
355333
<header>
356334
<div className={styles['pre_join_main_device_tool']}>
@@ -393,18 +371,6 @@ export function PreJoin({
393371
</div>
394372
)}
395373
</div>
396-
<div className={styles['pre_join_main_device_right_video']}>
397-
<ScreenPreview
398-
enabled={screen_enabled}
399-
blur={count_video_blur(screen_blur, {
400-
height: video_el.current?.height || 360,
401-
width: video_el.current?.width || 320,
402-
})}
403-
onClose={() => {
404-
set_screen_enabled(false);
405-
}}
406-
></ScreenPreview>
407-
</div>
408374
</div>
409375
</div>
410376
<div className={styles['pre_join_main_info']}></div>

app/rooms/[roomName]/room/controls.tsx

+85-20
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import { VideoToggle } from './controls/video_toggle';
1616
import { ScreenToggle } from './controls/screen_toggle';
1717
import { ConnectionState, Room, Track } from 'livekit-client';
1818
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';
2020
import { SettingToggle } from './controls/setting_toggle';
21-
import { Button, Drawer, message, Slider } from 'antd';
21+
import { Button, Drawer, message, Modal, Slider } from 'antd';
2222
import { SvgResource } from '../pre_join/resources';
2323
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';
2525

2626
export function Controls({
2727
room,
@@ -51,7 +51,9 @@ export function Controls({
5151
const [volume, set_volume] = useState(add_derivce_settings.microphone.other);
5252
const [video_blur, set_video_blur] = useState(add_derivce_settings.video.blur);
5353
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);
5557
const visibleControls = { leave: true, ...controls };
5658
const localPermissions = useLocalParticipantPermissions();
5759

@@ -124,7 +126,7 @@ export function Controls({
124126
[saveAudioInputEnabled],
125127
);
126128

127-
const save_changes = () => {
129+
const save_changes = (save: boolean) => {
128130
let username = userChoices.username;
129131
let data = Object.assign(add_derivce_settings, {
130132
microphone: {
@@ -138,20 +140,87 @@ export function Controls({
138140
},
139141
}) as AddDeviceInfo;
140142
use_stored_set(username, { device: data });
141-
set_setting_visible(false);
143+
142144
// 发布事件
143145
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+
};
144153

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+
}
146163
};
147164

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+
148213
return (
149214
<div className={`${styles.controls} lk-control-bar`}>
150215
{contextHolder}
151216
<div className={styles.controls_left}>
152217
<AudioToggle enabled={audio_enabled} onClicked={audio_on_clicked}></AudioToggle>
153218
<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>
155224
<SettingToggle enabled={setting_visible} onClicked={setting_on_clicked}></SettingToggle>
156225
{visibleControls.chat && (
157226
<ChatToggle>
@@ -169,6 +238,7 @@ export function Controls({
169238
title="Settings"
170239
placement="right"
171240
closable={false}
241+
onClose={close_setting}
172242
width={'40%'}
173243
open={setting_visible}
174244
extra={setting_drawer_header({
@@ -181,7 +251,10 @@ export function Controls({
181251
<Slider
182252
defaultValue={volume}
183253
className={styles.common_space}
184-
onChange={(e) => set_volume(e)}
254+
onChange={(e) => {
255+
set_volume(e);
256+
save_changes(false);
257+
}}
185258
/>
186259
</div>
187260

@@ -197,6 +270,7 @@ export function Controls({
197270
onChange={(e) => {
198271
set_video_blur(e);
199272
setVideoBlur(e);
273+
save_changes(false);
200274
}}
201275
/>
202276
</div>
@@ -212,21 +286,12 @@ export function Controls({
212286
onChange={(e) => {
213287
set_screen_blur(e);
214288
setVideoBlur(e);
289+
save_changes(false);
215290
}}
216291
/>
217292
</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-
228293
<div className={styles.setting_container_footer}>
229-
<Button type="primary" onClick={save_changes}>
294+
<Button type="primary" onClick={() => save_changes(true)}>
230295
Save Changes
231296
</Button>
232297
</div>

app/rooms/[roomName]/room/controls/audio_toggle.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export function AudioToggle({ enabled, onClicked, showText = true }: ToggleProps
8484
maxWidth: '100px',
8585
}}
8686
>
87-
{active_audio}
87+
Microphone
8888
</div>
8989
<SvgResource type="down" svgSize={16}></SvgResource>
9090
</span>

app/rooms/[roomName]/room/controls/screen_toggle.tsx

+19-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
11
import { Button } from 'antd';
22
import { SvgResource } from '../../pre_join/resources';
3-
import { ToggleProps } from '@/lib/std/device';
3+
import { State, ToggleProps } from '@/lib/std/device';
4+
import { useCallback, useEffect, useState } from 'react';
5+
6+
export function ScreenToggle({ enabled, onClicked, showText = true, bg_color }: ToggleProps & {bg_color: string}) {
47

5-
export function ScreenToggle({ enabled, onClicked, showText = true }: ToggleProps) {
68
const on_clicked = () => {
79
onClicked(enabled);
810
};
911

1012
return (
1113
<>
1214
{showText ? (
13-
<Button variant="solid" color="default" size="large" onClick={on_clicked} style={{backgroundColor: '#1E1E1E', height : '44px', borderRadius: '8px'}}>
15+
<Button
16+
variant="solid"
17+
color="default"
18+
size="large"
19+
onClick={on_clicked}
20+
style={{ backgroundColor: bg_color, height: '44px', borderRadius: '8px' }}
21+
>
1422
{enabled ? (
15-
<SvgResource type="screen" svgSize={16}></SvgResource>
23+
<div style={{ display: 'inline-flex', alignItems: 'center' }}>
24+
<SvgResource type="screen_close" svgSize={16}></SvgResource>
25+
<div style={{ marginLeft: '12px' }}>Stop screen share</div>
26+
</div>
1627
) : (
17-
<SvgResource type="screen_close" svgSize={16}></SvgResource>
28+
<div style={{ display: 'inline-flex', alignItems: 'center' }}>
29+
<SvgResource type="screen" svgSize={16}></SvgResource>
30+
<div style={{ marginLeft: '12px' }}>Share screen</div>
31+
</div>
1832
)}
19-
Share screen
2033
</Button>
2134
) : (
2235
<Button shape="circle" variant="solid" color="default" size="large" onClick={on_clicked}>

app/rooms/[roomName]/room/controls/video_toggle.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function VideoToggle({ enabled, onClicked, showText = true }: ToggleProps
8585
maxWidth: '100px',
8686
}}
8787
>
88-
{active_video}
88+
Camera
8989
</div>
9090
<SvgResource type="down" svgSize={16}></SvgResource>
9191
</span>

0 commit comments

Comments
 (0)