1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 import React from "react";
6 import { actionCreators as ac } from "common/Actions.mjs";
7 import { SafeAnchor } from "../../DiscoveryStreamComponents/SafeAnchor/SafeAnchor";
8 import { WallpapersSection } from "../../WallpapersSection/WallpapersSection";
10 export class ContentSection extends React.PureComponent {
13 this.onPreferenceSelect = this.onPreferenceSelect.bind(this);
15 // Refs are necessary for dynamically measuring drawer heights for slide animations
16 this.topSitesDrawerRef = React.createRef();
17 this.pocketDrawerRef = React.createRef();
20 inputUserEvent(eventSource, status) {
23 event: "PREF_CHANGED",
25 value: { status, menu_source: "CUSTOMIZE_MENU" },
30 onPreferenceSelect(e) {
31 // eventSource: TOP_SITES | TOP_STORIES | HIGHLIGHTS
32 const { preference, eventSource } = e.target.dataset;
34 if (e.target.nodeName === "SELECT") {
35 value = parseInt(e.target.value, 10);
36 } else if (e.target.nodeName === "INPUT") {
37 value = e.target.checked;
39 this.inputUserEvent(eventSource, value);
41 } else if (e.target.nodeName === "MOZ-TOGGLE") {
42 value = e.target.pressed;
44 this.inputUserEvent(eventSource, value);
47 this.props.setPref(preference, value);
51 this.setDrawerMargins();
54 componentDidUpdate() {
55 this.setDrawerMargins();
61 this.props.enabledSections.topSitesEnabled
65 this.props.enabledSections.pocketEnabled
69 setDrawerMargin(drawerID, isOpen) {
72 if (drawerID === `TOP_SITES`) {
73 drawerRef = this.topSitesDrawerRef.current;
74 } else if (drawerID === `TOP_STORIES`) {
75 drawerRef = this.pocketDrawerRef.current;
83 drawerHeight = parseFloat(window.getComputedStyle(drawerRef)?.height);
86 drawerRef.style.marginTop = `0`;
88 drawerRef.style.marginTop = `-${drawerHeight}px`;
96 mayHaveSponsoredTopSites,
98 mayHaveSponsoredStories,
110 showSponsoredTopSitesEnabled,
111 showSponsoredPocketEnabled,
112 showRecentSavesEnabled,
117 <div className="home-section">
118 {wallpapersEnabled && (
119 <div className="wallpapers-section">
120 <h2 data-l10n-id="newtab-wallpaper-title"></h2>
123 activeWallpaper={activeWallpaper}
127 <div id="shortcuts-section" className="section">
129 id="shortcuts-toggle"
130 pressed={topSitesEnabled || null}
131 onToggle={this.onPreferenceSelect}
132 data-preference="feeds.topsites"
133 data-eventSource="TOP_SITES"
134 data-l10n-id="newtab-custom-shortcuts-toggle"
135 data-l10n-attrs="label, description"
138 <div className="more-info-top-wrapper">
139 <div className="more-information" ref={this.topSitesDrawerRef}>
144 data-preference="topSitesRows"
145 value={topSitesRowsCount}
146 onChange={this.onPreferenceSelect}
147 disabled={!topSitesEnabled}
148 aria-labelledby="custom-shortcuts-title"
152 data-l10n-id="newtab-custom-row-selector"
153 data-l10n-args='{"num": 1}'
157 data-l10n-id="newtab-custom-row-selector"
158 data-l10n-args='{"num": 2}'
162 data-l10n-id="newtab-custom-row-selector"
163 data-l10n-args='{"num": 3}'
167 data-l10n-id="newtab-custom-row-selector"
168 data-l10n-args='{"num": 4}'
171 {mayHaveSponsoredTopSites && (
172 <div className="check-wrapper" role="presentation">
174 id="sponsored-shortcuts"
175 className="sponsored-checkbox"
176 disabled={!topSitesEnabled}
177 checked={showSponsoredTopSitesEnabled}
179 onChange={this.onPreferenceSelect}
180 data-preference="showSponsoredTopSites"
181 data-eventSource="SPONSORED_TOP_SITES"
184 className="sponsored"
185 htmlFor="sponsored-shortcuts"
186 data-l10n-id="newtab-custom-sponsored-sites"
196 <div id="pocket-section" className="section">
197 <label className="switch">
200 pressed={pocketEnabled || null}
201 onToggle={this.onPreferenceSelect}
202 aria-describedby="custom-pocket-subtitle"
203 data-preference="feeds.section.topstories"
204 data-eventSource="TOP_STORIES"
205 data-l10n-id="newtab-custom-stories-toggle"
206 data-l10n-attrs="label, description"
210 {(mayHaveSponsoredStories || mayHaveRecentSaves) && (
211 <div className="more-info-pocket-wrapper">
212 <div className="more-information" ref={this.pocketDrawerRef}>
213 {mayHaveSponsoredStories && (
214 <div className="check-wrapper" role="presentation">
216 id="sponsored-pocket"
217 className="sponsored-checkbox"
218 disabled={!pocketEnabled}
219 checked={showSponsoredPocketEnabled}
221 onChange={this.onPreferenceSelect}
222 data-preference="showSponsored"
223 data-eventSource="POCKET_SPOCS"
226 className="sponsored"
227 htmlFor="sponsored-pocket"
228 data-l10n-id="newtab-custom-pocket-sponsored"
232 {mayHaveRecentSaves && (
233 <div className="check-wrapper" role="presentation">
235 id="recent-saves-pocket"
236 className="sponsored-checkbox"
237 disabled={!pocketEnabled}
238 checked={showRecentSavesEnabled}
240 onChange={this.onPreferenceSelect}
241 data-preference="showRecentSaves"
242 data-eventSource="POCKET_RECENT_SAVES"
245 className="sponsored"
246 htmlFor="recent-saves-pocket"
247 data-l10n-id="newtab-custom-pocket-show-recent-saves"
258 <div id="recent-section" className="section">
259 <label className="switch">
261 id="highlights-toggle"
262 pressed={highlightsEnabled || null}
263 onToggle={this.onPreferenceSelect}
264 data-preference="feeds.section.highlights"
265 data-eventSource="HIGHLIGHTS"
266 data-l10n-id="newtab-custom-recent-toggle"
267 data-l10n-attrs="label, description"
273 mayHaveSponsoredStories &&
274 spocMessageVariant === "variant-c" && (
275 <div className="sponsored-content-info">
276 <div className="icon icon-help"></div>
278 Sponsored content supports our mission to build a better web.{" "}
280 dispatch={this.props.dispatch}
281 url="https://support.mozilla.org/kb/pocket-sponsored-stories-new-tabs"
289 <span className="divider" role="separator"></span>
294 className="external-link"
295 onClick={openPreferences}
296 data-l10n-id="newtab-custom-settings"