diff --git a/js/actionCreators/index.ts b/js/actionCreators/index.ts
index e48a79d7..0899619c 100644
--- a/js/actionCreators/index.ts
+++ b/js/actionCreators/index.ts
@@ -143,7 +143,7 @@ export function loadSerializedState(
};
}
-export function loadDefaultSkin() {
+export function loadDefaultSkin(): Dispatchable {
return { type: LOAD_DEFAULT_SKIN };
}
diff --git a/js/components/AvsWindow/index.js b/js/components/AvsWindow/index.js
deleted file mode 100644
index c48c79ae..00000000
--- a/js/components/AvsWindow/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from "react";
-import GenWindow from "../GenWindow";
-import "../../../css/gen-window.css";
-
-const AvsWindow = () => (
- {}} windowId="AVS_WINDOW">
-
-
-);
-
-export default AvsWindow;
diff --git a/js/components/ContextMenuWrapper.js b/js/components/ContextMenuWrapper.tsx
similarity index 76%
rename from js/components/ContextMenuWrapper.js
rename to js/components/ContextMenuWrapper.tsx
index ce665138..4556f1aa 100644
--- a/js/components/ContextMenuWrapper.js
+++ b/js/components/ContextMenuWrapper.tsx
@@ -1,9 +1,18 @@
-import React from "react";
-import PropTypes from "prop-types";
+import React, { ReactNode } from "react";
import ContextMenu from "./ContextMenu";
-export default class ContextMenuWraper extends React.Component {
- constructor(props) {
+interface Props {
+ renderContents(): ReactNode;
+}
+
+interface State {
+ selected: boolean;
+ offsetTop: number | null;
+ offsetLeft: number | null;
+}
+
+export default class ContextMenuWraper extends React.Component {
+ constructor(props: Props) {
super(props);
this.state = {
selected: false,
@@ -29,14 +38,14 @@ export default class ContextMenuWraper extends React.Component {
this._closeMenu();
};
- _handleGlobalClick = e => {
+ _handleGlobalClick = (e: MouseEvent) => {
if (e.button === 2) {
return;
}
this._closeMenu();
};
- _handleRightClick = e => {
+ _handleRightClick = (e: React.MouseEvent) => {
const { pageX, pageY } = e;
this.setState({
selected: true,
@@ -63,8 +72,8 @@ export default class ContextMenuWraper extends React.Component {
>
{renderContents()}
@@ -73,8 +82,3 @@ export default class ContextMenuWraper extends React.Component {
);
}
}
-
-ContextMenuWraper.propTypes = {
- children: PropTypes.any.isRequired,
- renderContents: PropTypes.func.isRequired
-};
diff --git a/js/components/EqualizerWindow/Band.js b/js/components/EqualizerWindow/Band.tsx
similarity index 65%
rename from js/components/EqualizerWindow/Band.js
rename to js/components/EqualizerWindow/Band.tsx
index eff8eedc..e13312a2 100644
--- a/js/components/EqualizerWindow/Band.js
+++ b/js/components/EqualizerWindow/Band.tsx
@@ -1,17 +1,34 @@
import React from "react";
import { connect } from "react-redux";
-import Slider from "rc-slider/lib/Slider";
+import Slider from "rc-slider";
import { SET_BAND_FOCUS, UNSET_FOCUS } from "../../actionTypes";
+import { AppState, Dispatch, Band as BandType } from "../../types";
+
+interface StateProps {
+ value: number;
+ backgroundPosition: string;
+}
+interface DispatchProps {
+ handleMouseDown(): void;
+ handleMouseUp(): void;
+}
+interface OwnProps {
+ id: string;
+ band: BandType;
+ onChange(value: number): void;
+}
+
+type Props = StateProps & DispatchProps & OwnProps;
const MAX_VALUE = 100;
// Given a value between 1-100, return the sprite number (0-27)
-export const spriteNumber = value => {
+export const spriteNumber = (value: number): number => {
const percent = value / 100;
return Math.round(percent * 27);
};
// Given a sprite number, return the x,y
-export const spriteOffsets = number => {
+export const spriteOffsets = (number: number): { x: number; y: number } => {
const x = number % 14;
const y = Math.floor(number / 14);
return { x, y };
@@ -26,10 +43,9 @@ const Band = ({
onChange,
handleMouseDown,
handleMouseUp
-}) => (
+}: Props) => (
);
-const mapStateToProps = (state, ownProps) => {
+const mapStateToProps = (state: AppState, ownProps: OwnProps): StateProps => {
const value = state.equalizer.sliders[ownProps.band];
const { x, y } = spriteOffsets(spriteNumber(value));
const xOffset = x * 15; // Each sprite is 15px wide
const yOffset = y * 65; // Each sprite is 15px tall
const backgroundPosition = `-${xOffset}px -${yOffset}px`;
- return {
- id: ownProps.id,
- value,
- backgroundPosition
- };
+ return { value, backgroundPosition };
};
-const mapDispatchToProps = (dispatch, ownProps) => ({
+const mapDispatchToProps = (
+ dispatch: Dispatch,
+ ownProps: OwnProps
+): DispatchProps => ({
handleMouseDown: () =>
dispatch({ type: SET_BAND_FOCUS, input: "eq", bandFocused: ownProps.band }),
handleMouseUp: () => dispatch({ type: UNSET_FOCUS })
diff --git a/js/components/MainWindow/EqToggleButton.js b/js/components/MainWindow/EqToggleButton.tsx
similarity index 53%
rename from js/components/MainWindow/EqToggleButton.js
rename to js/components/MainWindow/EqToggleButton.tsx
index 06b26633..24233cac 100644
--- a/js/components/MainWindow/EqToggleButton.js
+++ b/js/components/MainWindow/EqToggleButton.tsx
@@ -4,18 +4,29 @@ import classnames from "classnames";
import { getWindowOpen } from "../../selectors";
import { toggleWindow } from "../../actionCreators";
+import { AppState } from "../../types";
-const EqToggleButton = props => (
+interface StateProps {
+ windowOpen: boolean;
+}
+
+interface DispatchProps {
+ handleClick(e: React.MouseEvent): void;
+}
+
+type Props = StateProps & DispatchProps;
+
+const EqToggleButton = (props: Props) => (
);
-const mapStateToProps = state => ({
- getWindowOpen: getWindowOpen(state)
+const mapStateToProps = (state: AppState): StateProps => ({
+ windowOpen: getWindowOpen(state)("equalizer")
});
const mapDispatchToProps = {
diff --git a/js/components/PlaybackContextMenu.js b/js/components/PlaybackContextMenu.tsx
similarity index 61%
rename from js/components/PlaybackContextMenu.js
rename to js/components/PlaybackContextMenu.tsx
index 8d636b81..3759ea94 100644
--- a/js/components/PlaybackContextMenu.js
+++ b/js/components/PlaybackContextMenu.tsx
@@ -1,18 +1,21 @@
import React from "react";
import { connect } from "react-redux";
-import {
- previous,
- play,
- pause,
- stop,
- next,
- seekForward,
- seekBackward,
- nextN
-} from "../actionCreators";
+import * as Actions from "../actionCreators";
import { Hr, Node } from "./ContextMenu";
+import { Dispatch } from "../types";
-const PlaybackContextMenu = props => (
+interface Props {
+ previous(): void;
+ play(): void;
+ pause(): void;
+ stop(): void;
+ next(): void;
+ seekBackward(steps: number): void;
+ seekForward(steps: number): void;
+ nextN(steps: number): void;
+}
+
+const PlaybackContextMenu = (props: Props) => (
@@ -55,15 +58,17 @@ const PlaybackContextMenu = props => (
);
-const mapDispatchToProps = {
- previous,
- play,
- pause,
- stop,
- next,
- seekForward,
- seekBackward,
- nextN
+const mapDispatchToProps = (dispatch: Dispatch): Props => {
+ return {
+ previous: () => dispatch(Actions.previous()),
+ play: () => dispatch(Actions.play()),
+ pause: () => dispatch(Actions.pause()),
+ stop: () => dispatch(Actions.stop()),
+ next: () => dispatch(Actions.next()),
+ seekForward: steps => dispatch(Actions.seekForward(steps)),
+ seekBackward: steps => dispatch(Actions.seekBackward(steps)),
+ nextN: steps => dispatch(Actions.nextN(steps))
+ };
};
export default connect(
diff --git a/js/components/SkinsContextMenu.js b/js/components/SkinsContextMenu.js
deleted file mode 100644
index 772a7f16..00000000
--- a/js/components/SkinsContextMenu.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import React from "react";
-import { connect } from "react-redux";
-import * as Actions from "../actionCreators";
-import { Hr, Node, Parent } from "./ContextMenu";
-
-const SkinContextMenu = props => (
-
-
-
- "} />
- {props.availableSkins.map(skin => (
- props.setSkin(skin.url)}
- label={skin.name}
- />
- ))}
-
-);
-
-const mapStateToProps = state => ({
- availableSkins: state.settings.availableSkins
-});
-
-const mapDispatchToProps = {
- loadDefaultSkin: Actions.loadDefaultSkin,
- openSkinFileDialog: Actions.openSkinFileDialog,
- setSkin: Actions.setSkinFromUrl
-};
-
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(SkinContextMenu);
diff --git a/js/components/SkinsContextMenu.tsx b/js/components/SkinsContextMenu.tsx
new file mode 100644
index 00000000..3660d06d
--- /dev/null
+++ b/js/components/SkinsContextMenu.tsx
@@ -0,0 +1,55 @@
+import React from "react";
+import { connect } from "react-redux";
+import * as Actions from "../actionCreators";
+import { Hr, Node, Parent } from "./ContextMenu";
+import { AppState, Skin, Dispatch } from "../types";
+
+interface StateProps {
+ availableSkins: Skin[];
+}
+
+interface DispatchProps {
+ loadDefaultSkin(): void;
+ setSkin(url: string): void;
+ openSkinFileDialog(): void;
+}
+
+type Props = StateProps & DispatchProps;
+
+const SkinContextMenu = (props: Props) => (
+
+
+
+ "} />
+ {props.availableSkins.map(skin => (
+ props.setSkin(skin.url)}
+ label={skin.name}
+ />
+ ))}
+
+);
+
+const mapStateToProps = (state: AppState): StateProps => ({
+ availableSkins: state.settings.availableSkins
+});
+
+const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => {
+ return {
+ loadDefaultSkin() {
+ dispatch(Actions.loadDefaultSkin());
+ },
+ openSkinFileDialog() {
+ dispatch(Actions.openSkinFileDialog());
+ },
+ setSkin(url: string) {
+ dispatch(Actions.setSkinFromUrl(url));
+ }
+ };
+};
+
+export default connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(SkinContextMenu);