Loëck Vézien
7 years ago
committed by
GitHub
12 changed files with 254 additions and 70 deletions
@ -1,20 +1,32 @@ |
|||
// @flow
|
|||
|
|||
import React, { PureComponent } from 'react' |
|||
import { compose } from 'redux' |
|||
import { connect } from 'react-redux' |
|||
import { translate } from 'react-i18next' |
|||
|
|||
import type { MapStateToProps } from 'react-redux' |
|||
import type { Device } from 'types/common' |
|||
|
|||
import { getCurrentDevice } from 'reducers/devices' |
|||
|
|||
import Box from 'components/base/Box' |
|||
|
|||
const mapStateToProps: MapStateToProps<*, *, *> = state => ({ |
|||
currentDevice: getCurrentDevice(state), |
|||
}) |
|||
|
|||
type Props = { |
|||
devices: Array<Object>, |
|||
t: (string, ?Object) => string, |
|||
currentDevice: Device | null, |
|||
} |
|||
|
|||
class Home extends PureComponent<Props> { |
|||
render() { |
|||
const { devices, t } = this.props |
|||
return <div>{t('common.connectedDevices', { count: devices.length })}</div> |
|||
const { currentDevice } = this.props |
|||
return currentDevice !== null ? ( |
|||
<Box style={{ wordBreak: 'break-word' }} p={20}> |
|||
Your current device: {currentDevice.path} |
|||
</Box> |
|||
) : null |
|||
} |
|||
} |
|||
|
|||
export default compose(connect(({ devices }: Props): Object => ({ devices })), translate())(Home) |
|||
export default connect(mapStateToProps)(Home) |
|||
|
@ -1,17 +1,112 @@ |
|||
// @flow
|
|||
|
|||
import React, { PureComponent } from 'react' |
|||
import React, { PureComponent, Fragment } from 'react' |
|||
import { connect } from 'react-redux' |
|||
|
|||
import type { MapStateToProps, MapDispatchToProps } from 'react-redux' |
|||
import type { Device, Devices } from 'types/common' |
|||
import type { deviceChooseType } from 'actions/devices' |
|||
|
|||
import { getDevices, getCurrentDevice } from 'reducers/devices' |
|||
|
|||
import { deviceChoose } from 'actions/devices' |
|||
|
|||
import Box from 'components/base/Box' |
|||
import Overlay from 'components/base/Overlay' |
|||
|
|||
const mapStateToProps: MapStateToProps<*, *, *> = state => ({ |
|||
devices: getDevices(state), |
|||
currentDevice: getCurrentDevice(state), |
|||
}) |
|||
|
|||
const mapDispatchToProps: MapDispatchToProps<*, *, *> = { |
|||
deviceChoose, |
|||
} |
|||
|
|||
type Props = { |
|||
devices: Devices, |
|||
currentDevice: Device | null, |
|||
deviceChoose: deviceChooseType, |
|||
} |
|||
|
|||
type State = { |
|||
changeDevice: boolean, |
|||
} |
|||
|
|||
const hasDevices = props => props.currentDevice === null && props.devices.length > 0 |
|||
|
|||
class TopBar extends PureComponent<Props, State> { |
|||
state = { |
|||
changeDevice: hasDevices(this.props), |
|||
} |
|||
|
|||
componentWillReceiveProps(nextProps) { |
|||
if (hasDevices(nextProps) && this.props.currentDevice !== null) { |
|||
this.setState({ |
|||
changeDevice: true, |
|||
}) |
|||
} |
|||
} |
|||
|
|||
handleChangeDevice = () => |
|||
this.setState({ |
|||
changeDevice: true, |
|||
}) |
|||
|
|||
handleSelectDevice = device => () => { |
|||
const { deviceChoose } = this.props |
|||
|
|||
deviceChoose(device) |
|||
|
|||
this.setState({ |
|||
changeDevice: false, |
|||
}) |
|||
} |
|||
|
|||
class TopBar extends PureComponent<{}> { |
|||
render() { |
|||
const { devices } = this.props |
|||
const { changeDevice } = this.state |
|||
|
|||
return ( |
|||
<Box bg="white" noShrink style={{ height: 60 }}> |
|||
{''} |
|||
</Box> |
|||
<Fragment> |
|||
{changeDevice && ( |
|||
<Overlay p={20}> |
|||
{devices.map(device => ( |
|||
<Box |
|||
key={device.path} |
|||
color="white" |
|||
bg="night" |
|||
onClick={this.handleSelectDevice(device)} |
|||
> |
|||
{device.path} |
|||
</Box> |
|||
))} |
|||
</Overlay> |
|||
)} |
|||
<Box bg="white" noShrink style={{ height: 60 }} justify="center" align="flex-end"> |
|||
<CountDevices count={devices.length} onChangeDevice={this.handleChangeDevice} /> |
|||
</Box> |
|||
</Fragment> |
|||
) |
|||
} |
|||
} |
|||
|
|||
export default TopBar |
|||
const CountDevices = ({ count, onChangeDevice } = { count: Number, onChangeDevice: Function }) => ( |
|||
<Box color="night" mr={20} horizontal flow={10} onClick={onChangeDevice}> |
|||
<Box> |
|||
<DeviceIcon height={20} width={20} /> |
|||
</Box> |
|||
<Box>{count}</Box> |
|||
</Box> |
|||
) |
|||
|
|||
const DeviceIcon = props => ( |
|||
<svg {...props} viewBox="0 0 19.781 19.781"> |
|||
<path |
|||
d="M14.507 0L9.8 4.706a2.92 2.92 0 0 0-1.991.854l-6.89 6.889a2.93 2.93 0 0 0 0 4.143l2.33 2.33a2.925 2.925 0 0 0 4.141 0l6.89-6.891c.613-.612.895-1.43.851-2.232l4.589-4.588L14.507 0zm.386 8.792a2.927 2.927 0 0 0-.611-.902l-2.33-2.331a2.945 2.945 0 0 0-1.08-.682l3.637-3.636 3.968 3.969-3.584 3.582zm.693-5.381l-.949.949-1.26-1.26.949-.949 1.26 1.26zm1.881 1.882l-.949.949-1.26-1.26.948-.949 1.261 1.26z" |
|||
fill="currentColor" |
|||
/> |
|||
</svg> |
|||
) |
|||
|
|||
export default connect(mapStateToProps, mapDispatchToProps)(TopBar) |
|||
|
@ -1,34 +1,23 @@ |
|||
// @flow
|
|||
|
|||
import React, { Fragment } from 'react' |
|||
import { compose } from 'redux' |
|||
import { connect } from 'react-redux' |
|||
import React from 'react' |
|||
import { Route } from 'react-router' |
|||
import { translate } from 'react-i18next' |
|||
|
|||
import Box from 'components/base/Box' |
|||
import Overlay from 'components/base/Overlay' |
|||
|
|||
import Home from 'components/Home' |
|||
import SideBar from 'components/SideBar' |
|||
import TopBar from 'components/TopBar' |
|||
|
|||
const Wrapper = ({ devices, t }: { devices: Array<Object>, t: string => string }) => ( |
|||
<Fragment> |
|||
{devices.length === 0 ? ( |
|||
<Overlay align="center" justify="center"> |
|||
<Box color="white">{t('common.connectDevice')}</Box> |
|||
</Overlay> |
|||
) : ( |
|||
<Box grow horizontal> |
|||
<SideBar /> |
|||
<Box grow bg="cream"> |
|||
<TopBar /> |
|||
<Route path="/" component={Home} /> |
|||
</Box> |
|||
</Box> |
|||
)} |
|||
</Fragment> |
|||
const Wrapper = () => ( |
|||
<Box grow horizontal> |
|||
<SideBar /> |
|||
<Box grow bg="cream"> |
|||
<TopBar /> |
|||
<Route path="/" component={Home} /> |
|||
</Box> |
|||
</Box> |
|||
) |
|||
|
|||
export default compose(connect(({ devices }): Object => ({ devices })), translate())(Wrapper) |
|||
export default translate()(Wrapper) |
|||
|
@ -1,6 +1,6 @@ |
|||
common: |
|||
ok: Okay |
|||
cancel: Cancel |
|||
connectDevice: Please connect your device |
|||
connectedDevices: You have {{count}} device connected |
|||
connectedDevices_0: You don't have device connected |
|||
connectedDevices_plural: You have {{count}} devices connected |
|||
|
Loading…
Reference in new issue