-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathApp.js
82 lines (73 loc) · 1.96 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import React from 'react';
import { StyleSheet, Text, View, Image, Button } from 'react-native';
import { webSocket} from 'rxjs/webSocket';
import { groupBy, mergeMap, takeUntil, finalize } from 'rxjs/operators';
import { timer } from 'rxjs';
import kenwheeler from './ken_wheeler.png';
export default class App extends React.Component {
state = { randomKens: {} };
socket$ = webSocket('ws://localhost:8080');
requestKenHead() {
const msg = JSON.stringify({ type: 'REQUEST_KEN_HEAD' });
this.socket$.next(msg);
}
componentDidMount() {
const kenHead$ = this.socket$.pipe(
groupBy(data => data.id),
mergeMap(singleKenStream =>
singleKenStream.pipe(
takeUntil(
timer(3000),
),
finalize(() => {
const dataId = singleKenStream.key;
const randomKens = { ...this.state.randomKens };
delete randomKens[dataId];
this.setState({ randomKens });
})
)
)
);
this.subscription = kenHead$.subscribe(data => {
this.setState({
randomKens: {
...this.state.randomKens,
[data.id]: { id: data.id, x: data.x, y: data.y }
}
});
});
}
componentWillUnmount() {
this.subscription.unsubscribe();
}
render() {
return (
<View style={styles.container}>
<Text>Ken is multi-plexing!</Text>
{Object.values(this.state.randomKens).map(randomKen =>
<Image
key={randomKen.id}
source={kenwheeler}
style={{
position: 'absolute',
left: randomKen.x,
top: randomKen.y,
}}
/>
)}
<Button
onPress={() => this.requestKenHead()}
title="add a ken bobble"
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});