Rewritten to hooks

This commit is contained in:
2019-07-05 13:38:02 +02:00
parent a17faa9482
commit 41b4d3b115
12 changed files with 278 additions and 393 deletions

View File

@@ -18,7 +18,7 @@ import {
} from 'react-native-debug-console';
network.attach();
log.attach(true);
log.attach();
context.hello = () => 'earth';
console.log('fooo');

View File

@@ -1,12 +1,10 @@
import React from 'react';
import React, { useState } from 'react';
import {
StyleSheet,
View,
Text,
TextInput,
} from 'react-native';
import styled from 'styled-components/native';
import State from '../../data/State';
import { context } from '../../../console';
import log from '../../../log';
import Icon from '../../base/Icon';
@@ -36,13 +34,11 @@ const styles = StyleSheet.create({
const Input = ({
logs,
}) => (
<State>
{({
text = '',
history = [],
historyOffset,
}, setState) => (
}) => {
const [text, setText] = useState('');
const [history, setHistory] = useState([]);
const [historyOffset, setHistoryOffset] = useState();
return (
<View style={styles.container}>
<Button
onPress={() => {
@@ -50,10 +46,8 @@ const Input = ({
currentOffset += 1;
const index = history.length - 1 - currentOffset;
if (history[index]) {
setState({
text: history[index],
historyOffset: currentOffset,
});
setText(history[index]);
setHistoryOffset(currentOffset);
}
}}
>
@@ -66,10 +60,8 @@ const Input = ({
currentOffset -= 1;
const index = history.length - 1 - currentOffset;
if (history[index]) {
setState({
text: history[index],
historyOffset: currentOffset,
});
setText(history[index]);
setHistoryOffset(currentOffset);
}
}}
>
@@ -82,7 +74,7 @@ const Input = ({
autoCorrect={false}
style={styles.input}
value={text}
onChangeText={text => setState({ text })}
onChangeText={text => setText(text)}
/>
<Button
onPress={() => {
@@ -92,11 +84,9 @@ const Input = ({
const fn = new Function(...contextKeys, text);
try {
fn(...contextValues);
setState({
text: '',
history: newHistory,
historyOffset: undefined,
});
setText('');
setHistoryOffset(undefined);
setHistory(newHistory);
} catch (err) {
log.error([err]);
}
@@ -105,8 +95,7 @@ const Input = ({
<Icon name="play" />
</Button>
</View>
)}
</State>
);
);
};
export default Input;

View File

@@ -1,11 +1,10 @@
import React from 'react';
import React, { useState } from 'react';
import {
StyleSheet,
View,
} from 'react-native';
import log from '../../../log';
import Log from '../../data/Log';
import State from '../../data/State';
import useLog from '../../data/log';
import Toolbar, {
Button,
Selector,
@@ -33,15 +32,10 @@ const initFilters = [
const Console = ({
includeStackTrace,
}) => (
<Log>
{({ logs }) => (
<State
initState={{
filters: initFilters,
}}
>
{({ filters }, setState) => (
}) => {
const logs = useLog();
const [filters, setFilters] = useState(initFilters);
return (
<View style={styles.container}>
<Toolbar>
<Selector
@@ -50,9 +44,7 @@ const Console = ({
options={filters}
multiSelect
onSelect={(selected) => {
setState({
filters: selected,
});
setFilters([...selected]);
}}
/>
<Seperator />
@@ -65,10 +57,7 @@ const Console = ({
<Output filter={filters.filter(f => f.selected).map(f => f.name)} logs={logs} includeStackTrace={includeStackTrace} />
<Input />
</View>
)}
</State>
)}
</Log>
);
);
};
export default Console;

View File

@@ -1,11 +1,10 @@
import React from 'react';
import React, { useState } from 'react';
import {
StyleSheet,
View,
} from 'react-native';
import network from '../../../network';
import State from '../../data/State';
import Network from '../../data/Network';
import useRequests from '../../data/requests';
import Toolbar, {
Button,
Seperator,
@@ -27,13 +26,9 @@ const styles = StyleSheet.create({
},
});
let i = 0;
const Console = () => (
<State>
{({
active,
}, setState) => (
<Network>
{({ requests }) => {
const Console = () => {
const requests = useRequests();
const [active, setActive] = useState();
const selected = active >= 0 ? requests[active] : undefined;
return (
<View style={styles.container}>
@@ -48,15 +43,11 @@ const Console = () => (
<List
selected={selected ? selected.id : undefined}
requests={requests}
onSelect={(i) => setState({ active: i })}
onSelect={(i) => setActive(i)}
/>
{selected && <Details {...selected} />}
</View>
);
}}
</Network>
)}
</State>
);
}
export default Console;

View File

@@ -1,7 +1,6 @@
import React from 'react';
import React, { useState } from 'react';
import styled from 'styled-components/native';
import Storage from '../../data/Storage';
import State from '../../data/State';
import useStorage from '../../data/storage';
import Toolbar, {
Button,
Seperator,
@@ -15,11 +14,15 @@ const Wrapper = styled.View`
const StorageView = ({
provider,
}) => (
<State>
{({ selected }, setState) => (
<Storage provider={provider}>
{(data, update, removeItem, clear) => (
}) => {
const [selected, setSelected] = useState();
const {
data,
update,
removeItem,
clear,
} = useStorage(provider);
return (
<Wrapper>
<Toolbar>
<Seperator />
@@ -42,17 +45,16 @@ const StorageView = ({
</Toolbar>
<Keys
selected={selected}
onSelect={(key) => setState({ selected: key })}
onSelect={(key) => {
setSelected(key);
}}
keys={Object.keys(data)}
/>
{selected && data[selected] && (
<Value value={data[selected]} />
)}
</Wrapper>
)}
</Storage>
)}
</State>
);
);
};
export default StorageView;

View File

@@ -1,13 +1,11 @@
import React, { Fragment } from 'react';
import React, { Fragment, useState } from 'react';
import styled from 'styled-components/native';
import PropTypes from 'prop-types';
import {
Text,
StyleSheet,
TouchableOpacity,
View,
} from 'react-native';
import State from '../data/State';
import Icon from '../base/Icon';
const styles = StyleSheet.create({
@@ -67,15 +65,10 @@ const Console = ({
tabs,
onClose,
onDownload,
}) => (
}) => {
const [active, setActive] = useState(0);
return (
<View style={styles.container}>
<State
initState={{
active: 0,
}}
>
{({ active }, setState) => (
<Fragment>
<Header>
<TabScroll horizontal>
<TabWrapper>
@@ -84,7 +77,7 @@ const Console = ({
key={name}
style={active === i ? styles.tabActive : styles.tabInactive}
onPress={() => {
setState({ active: i });
setActive(i);
}}
>
<Text>{name}</Text>
@@ -108,11 +101,9 @@ const Console = ({
)}
</Header>
{tabs[active] && tabs[active].view}
</Fragment>
)}
</State>
</View>
);
);
};
Console.propTypes = {
tabs: PropTypes.arrayOf(PropTypes.shape({

View File

@@ -1,9 +1,8 @@
import React, { Fragment } from 'react';
import React, { Fragment, useState } from 'react';
import {
SafeAreaView,
TouchableOpacity,
} from 'react-native';
import State from '../../data/State';
import Button from './Button';
import Row from '../Row';
import Icon from '../Icon';
@@ -17,14 +16,14 @@ const Selector = ({
onSelect,
options = [],
...others
}) => (
<State>
{({ open }, setState) => (
}) => {
const [open, setOpen] = useState(false);
return (
<Fragment>
<Button
{...others}
onPress={() => {
setState({ open: true })
setOpen(true);
}}
/>
<Modal
@@ -32,7 +31,7 @@ const Selector = ({
transparent={false}
visible={!!open}
onRequestClose={() => {
setState({ open: false })
setOpen(false);
}}
>
<SafeAreaView
@@ -43,7 +42,7 @@ const Selector = ({
name="Close"
icon="close"
onPress={() => {
setState({ open: false })
setOpen(false);
}}
/>
{options.map((option) => (
@@ -69,8 +68,7 @@ const Selector = ({
</SafeAreaView>
</Modal>
</Fragment>
)}
</State>
);
);
};
export default Selector;

View File

@@ -1,38 +1,19 @@
import { Component } from 'react';
import { useEffect, useState } from 'react';
import log from '../../log';
class Log extends Component {
constructor() {
super();
this.state = {
logs: [],
};
this.setLogs = this.setLogs.bind(this);
const useLog = () => {
const [logs, setLogs] = useState([]);
useEffect(() => {
const update = (newLogs) => {
setLogs([...newLogs]);
}
log.listen(update);
componentDidMount() {
log.listen(this.setLogs);
return () => {
log.unlisten(update);
}
}, []);
return logs;
};
componentWillUnmount() {
log.unlisten(this.setLogs);
}
setLogs(logs) {
this.setState({
logs,
});
}
render() {
const {
children,
} = this.props;
const component = children(
this.state,
);
return component;
}
}
export default Log;
export default useLog;

View File

@@ -1,38 +0,0 @@
import { Component } from 'react';
import network from '../../network';
class Network extends Component {
constructor() {
super();
this.state = {
requests: [],
};
this.setRequests = this.setRequests.bind(this);
}
componentDidMount() {
network.listen(this.setRequests);
}
componentWillUnmount() {
network.unlisten(this.setRequests);
}
setRequests(requests) {
this.setState({
requests,
});
}
render() {
const {
children,
} = this.props;
const component = children(
this.state,
);
return component;
}
}
export default Network;

View File

@@ -1,20 +0,0 @@
import React, { Component } from 'react';
class State extends Component {
constructor(props, ...others) {
super(props, ...others);
this.state = props.initState || {};
this.setState = this.setState.bind(this);
}
render() {
const { children } = this.props;
const component = children(
this.state,
this.setState,
);
return component;
}
}
export default State;

View File

@@ -1,57 +1,40 @@
import { Component } from 'react';
import { useState, useEffect } from 'react';
class Storage extends Component {
constructor() {
super();
this.state = {
data: {},
};
this.update = this.update.bind(this);
this.removeItem = this.removeItem.bind(this);
this.clear = this.clear.bind(this);
}
const useStorage = (provider) => {
const [data, setData] = useState({});
componentDidMount() {
this.update();
}
async removeItem(name) {
await this.props.provider.removeItem(name);
await this.update();
}
async clear() {
await this.props.provider.clear();
await this.update();
}
async update() {
try {
const keys = await this.props.provider.getAllKeys();
const values = await Promise.all(keys.map(key => this.props.provider.getItem(key)));
const update = async () => {
const keys = await provider.getAllKeys();
const values = await Promise.all(keys.map(key => provider.getItem(key)));
const data = {};
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const value = values[i];
data[key] = value;
}
this.setState({
data,
});
} catch (err) {
console.error(err);
}
setData(data);
};
const removeItem = async (name) => {
await provider.removeItem(name);
await update();
}
render() {
const {
children,
} = this.props;
const {
const clear = async () => {
await provider.clear();
await update();
}
useEffect(() => {
update().catch(err => console.error(err));
}, []);
return {
data,
} = this.state;
return children(data, this.update, this.removeItem, this.clear);
update,
removeItem,
clear,
}
}
export default Storage;
export default useStorage;

View File

@@ -0,0 +1,19 @@
import { useState, useEffect } from 'react';
import network from '../../network';
const useRequests = () => {
const [requests, setRequests] = useState([]);
useEffect(() => {
const update = (newRequests) => {
setRequests(newRequests);
};
network.listen(update);
return () => {
network.unlisten(update);
};
}, []);
return requests;
};
export default useRequests;