File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ import { AppRegistry } from "react-native"
2+ import WrapperComponent from "./src/WrapperComponent"
3+ import Sibling from "./src/Sibling"
4+
5+ AppRegistry . setWrapperComponentProvider ( ( ) => WrapperComponent ) ;
6+
7+ export default Sibling ;
Original file line number Diff line number Diff line change 55 "main" : " index.js" ,
66 "scripts" : {
77 "test" : " jest" ,
8- "cm" :" git-cz"
8+ "cm" : " git-cz"
99 },
1010 "repository" : {
1111 "type" : " git" ,
1919 "homepage" : " https://github.com/react-native-pure/sibling#readme" ,
2020 "devDependencies" : {
2121 "commitizen" : " ^3.0.7" ,
22- "cz-conventional-changelog" : " ^2.1.0"
22+ "cz-conventional-changelog" : " ^2.1.0" ,
23+ "fbemitter" : " ^2.1.1" ,
24+ "react" : " 16.0.0-alpha.12" ,
25+ "react-native" : " ^0.47"
26+ },
27+ "peerDependencies" : {
28+ "fbemitter" : " ^2" ,
29+ "react-native" : " >= 0.47.0" ,
30+ "react" : " >= 16.0.0"
2331 },
2432 "config" : {
2533 "commitizen" : {
Original file line number Diff line number Diff line change 1+ import * as React from "react"
2+ import SiblingEmitter , { SiblingEvents } from "./SiblingEmitter" ;
3+
4+ class Sibling {
5+ constructor ( ) {
6+ this . id = 0 ;
7+ }
8+
9+ append ( element : React . Element ) {
10+ const id = this . id ;
11+ SiblingEmitter . emit ( SiblingEvents . append , {
12+ id : id ,
13+ node : React . cloneElement ( element , {
14+ key : `sibling-${ id } `
15+ } )
16+ } ) ;
17+ this . id ++ ;
18+ return function ( ) {
19+ SiblingEmitter . emit ( SiblingEvents . remove , id ) ;
20+ } ;
21+ }
22+ }
23+
24+ export default new Sibling ( ) ;
Original file line number Diff line number Diff line change 1+ import { EventEmitter } from "fbemitter"
2+
3+ export const SiblingEvents = {
4+ append : "append" ,
5+ remove : "remove"
6+ } ;
7+
8+ export default new EventEmitter ( ) ;
Original file line number Diff line number Diff line change 1+ import * as React from "react"
2+ import SiblingEmitter , { SiblingEvents } from "./SiblingEmitter" ;
3+ import type { NodeItem } from "./Types" ;
4+
5+ type State = {
6+ elements : {
7+ [ key : number ] : React . Element
8+ }
9+ } ;
10+
11+ export default class Siblings extends React . PureComponent < void , State > {
12+
13+ _listeners = [ ] ;
14+
15+ state = {
16+ elements : { }
17+ } ;
18+
19+ render ( ) {
20+ const keys = Object . keys ( this . state . elements ) ;
21+ if ( keys . length > 0 ) {
22+ return keys . map ( ( key ) => this . state . elements [ key ] ) ;
23+ }
24+ return null ;
25+ }
26+
27+ componentDidMount ( ) {
28+ this . _listeners . push (
29+ SiblingEmitter . addListener ( SiblingEvents . append , ( item : NodeItem ) => {
30+ this . setState ( ( { elements} ) => {
31+ return {
32+ elements : {
33+ ...elements ,
34+ [ item . id ] : item . node
35+ }
36+ }
37+ } ) ;
38+ } )
39+ ) ;
40+ this . _listeners . push (
41+ SiblingEmitter . addListener ( SiblingEvents . remove , ( id : number ) => {
42+ this . setState ( ( { elements} ) => {
43+ delete elements [ id ] ;
44+ return { elements} ;
45+ } )
46+ } )
47+ )
48+ }
49+
50+ componentWillUnmount ( ) {
51+ this . _listeners . forEach ( listener => listener . remove ( ) ) ;
52+ }
53+ }
Original file line number Diff line number Diff line change 1+ import * as React from "react" ;
2+
3+ export type NodeItem = {
4+ id : number ,
5+ node : React . Node
6+ } ;
Original file line number Diff line number Diff line change 1+ import * as React from "react" ;
2+ import { View , StyleSheet } from "react-native"
3+ import Siblings from "./Siblings" ;
4+
5+ const styles = StyleSheet . create ( {
6+ container : {
7+ flex : 1
8+ }
9+ } )
10+
11+ function WrapperComponent ( props ) {
12+ return (
13+ < View style = { styles . container } >
14+ { props . children }
15+ < Siblings />
16+ </ View >
17+ ) ;
18+ }
19+
20+ export default React . memo ( WrapperComponent ) ;
You can’t perform that action at this time.
0 commit comments