webamp/js/components/GenWindow/index.js
2018-05-28 15:56:18 -07:00

117 lines
3.3 KiB
JavaScript

import React from "react";
import { connect } from "react-redux";
import PropTypes from "prop-types";
import classnames from "classnames";
import "../../../css/gen-window.css";
import { SET_FOCUSED_WINDOW } from "../../actionTypes";
import { scrollVolume, setWindowSize, closeWindow } from "../../actionCreators";
import { getWindowPixelSize } from "../../selectors";
import ResizeTarget from "../ResizeTarget";
const Text = ({ children }) => {
const letters = children.split("");
return letters.map((letter, i) => (
<div
key={i}
className={`draggable gen-text-letter gen-text-${
letter === " " ? "space" : letter.toLowerCase()
}`}
/>
));
};
const CHROME_WIDTH = 19;
const CHROME_HEIGHT = 34;
// Named export for testing
export const GenWindow = ({
selected,
children,
close,
title,
setFocus,
windowId,
windowSize,
setGenWindowSize,
scrollVolume: handleWheel,
width,
height
}) => {
return (
<div
className={classnames("gen-window", "window", { selected })}
onMouseDown={() => setFocus(windowId)}
onWheel={handleWheel}
style={{ width, height }}
>
<div className="gen-top draggable">
<div className="gen-top-left draggable" />
<div className="gen-top-left-fill draggable" />
<div className="gen-top-left-end draggable" />
<div className="gen-top-title draggable">
<Text>{title}</Text>
</div>
<div className="gen-top-right-end draggable" />
<div className="gen-top-right-fill draggable" />
<div className="gen-top-right draggable">
<div className="gen-close selected" onClick={() => close(windowId)} />
</div>
</div>
<div className="gen-middle">
<div className="gen-middle-left draggable">
<div className="gen-middle-left-bottom draggable" />
</div>
<div className="gen-middle-center">
{children({
width: width - CHROME_WIDTH,
height: height - CHROME_HEIGHT
})}
</div>
<div className="gen-middle-right draggable">
<div className="gen-middle-right-bottom draggable" />
</div>
</div>
<div className="gen-bottom draggable">
<div className="gen-bottom-left draggable" />
<div className="gen-bottom-right draggable">
<ResizeTarget
currentSize={windowSize}
setWindowSize={size => setGenWindowSize(windowId, size)}
id={"gen-resize-target"}
/>
</div>
</div>
</div>
);
};
GenWindow.propTypes = {
title: PropTypes.string.isRequired,
windowId: PropTypes.string.isRequired,
children: PropTypes.func.isRequired,
close: PropTypes.func.isRequired,
selected: PropTypes.bool.isRequired
};
const mapStateToProps = (state, ownProps) => {
const { width, height } = getWindowPixelSize(state, ownProps.windowId);
return {
width,
height,
selected: state.windows.focused === ownProps.windowId,
windowSize: state.windows.genWindows[ownProps.windowId].size
};
};
const mapDispatchToProps = {
setFocus: windowId => ({ type: SET_FOCUSED_WINDOW, window: windowId }),
close: windowId => closeWindow(windowId),
setGenWindowSize: setWindowSize,
scrollVolume
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(GenWindow);