Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {
connect,
const {
createFactory,
PureComponent,
const Localized = createFactory(FluentReact.Localized);
const BrowserIcon = createFactory(
);
const {
updateSettingsVisibility,
updateTargetBrowsers,
class Settings extends PureComponent {
static get propTypes() {
return {
defaultTargetBrowsers: PropTypes.arrayOf(PropTypes.shape(Types.browser))
.isRequired,
targetBrowsers: PropTypes.arrayOf(PropTypes.shape(Types.browser))
.isRequired,
updateTargetBrowsers: PropTypes.func.isRequired,
updateSettingsVisibility: PropTypes.func.isRequired,
};
}
constructor(props) {
super(props);
this._onTargetBrowserChanged = this._onTargetBrowserChanged.bind(this);
this.state = {
targetBrowsers: props.targetBrowsers,
};
}
_onTargetBrowserChanged({ target }) {
const { id, status } = target.dataset;
let { targetBrowsers } = this.state;
if (target.checked) {
targetBrowsers = [...targetBrowsers, { id, status }];
} else {
targetBrowsers = targetBrowsers.filter(
b => !(b.id === id && b.status === status)
);
}
this.setState({ targetBrowsers });
}
_renderTargetBrowsers() {
const { defaultTargetBrowsers } = this.props;
const { targetBrowsers } = this.state;
return dom.section(
{
className: "compatibility-settings__target-browsers",
},
Localized(
{ id: "compatibility-target-browsers-header" },
dom.header(
{
className: "compatibility-settings__target-browsers-header",
},
"compatibility-target-browsers-header"
)
),
dom.ul(
{
className: "compatibility-settings__target-browsers-list",
},
defaultTargetBrowsers.map(({ id, name, status, version }) => {
const inputId = `${id}-${status}`;
const isTargetBrowser = !!targetBrowsers.find(
b => b.id === id && b.status === status
);
return dom.li(
{
className: "compatibility-settings__target-browsers-item",
},
dom.input({
id: inputId,
type: "checkbox",
checked: isTargetBrowser,
onChange: this._onTargetBrowserChanged,
"data-id": id,
"data-status": status,
}),
dom.label(
{
className: "compatibility-settings__target-browsers-item-label",
htmlFor: inputId,
},
BrowserIcon({ id, title: `${name} ${status}` }),
`${name} ${status} (${version})`
)
);
})
)
);
}
_renderHeader() {
return dom.header(
{
className: "compatibility-settings__header",
},
Localized(
{ id: "compatibility-settings-header" },
dom.label(
{
className: "compatibility-settings__header-label",
},
"compatibility-settings-header"
)
),
Localized(
{
id: "compatibility-close-settings-button",
attrs: { title: true },
},
dom.button(
{
className: "compatibility-settings__header-button",
title: "compatibility-close-settings-button",
onClick: () => {
const { defaultTargetBrowsers } = this.props;
const { targetBrowsers } = this.state;
// Sort by ordering of default browsers.
const browsers = defaultTargetBrowsers.filter(b =>
targetBrowsers.find(t => t.id === b.id && t.status === b.status)
);
if (
this.props.targetBrowsers.toString() !== browsers.toString()
) {
this.props.updateTargetBrowsers(browsers);
}
this.props.updateSettingsVisibility();
},
},
dom.img({
className: "compatibility-settings__header-icon",
src: CLOSE_ICON,
})
)
)
);
}
render() {
return dom.section(
{
className: "compatibility-settings",
},
this._renderHeader(),
this._renderTargetBrowsers()
);
}
}
const mapStateToProps = state => {
return {
defaultTargetBrowsers: state.compatibility.defaultTargetBrowsers,
targetBrowsers: state.compatibility.targetBrowsers,
};
};
const mapDispatchToProps = dispatch => {
return {
updateTargetBrowsers: browsers => dispatch(updateTargetBrowsers(browsers)),
updateSettingsVisibility: () => dispatch(updateSettingsVisibility(false)),
};
};
module.exports = connect(mapStateToProps, mapDispatchToProps)(Settings);