// @flow import React, { Fragment, Component } from 'react'; import queryString from 'query-string'; import { i18n, apiFetch } from '../../wp'; import Test from './Test'; const { __, sprintf } = i18n; type AdminBarState = { isLoading: boolean; tests: TestData[]; pickedVariants: { [testId: string]: string; }; }; class AdminBar extends Component<*, AdminBarState> { state = { isLoading: true, tests: [], pickedVariants: window.ABTestingForWP_AdminBar.cookieData || {}, }; componentDidMount() { const testsOnPage = document.querySelectorAll('.ABTestWrapper[data-test]'); const sortedTestsOnPage = Array.from(testsOnPage).sort((a, b) => { if (a.offsetTop > b.offsetTop) { return 1; } if (a.offsetTop < b.offsetTop) { return -1; } return 0; }); const testIds = sortedTestsOnPage.map(test => test.getAttribute('data-test')); apiFetch({ path: `/ab-testing-for-wp/v1/get-tests-info?${queryString.stringify({ id: testIds })}` }) .then((tests) => { this.setState({ tests: testIds.map(id => tests.find(test => test.id === id)), isLoading: false, }); }); } onChangeVariant = (testId: string, variantId: string) => { const { pickedVariants } = this.state; this.setState({ pickedVariants: { ...pickedVariants, [testId]: variantId, }, }); apiFetch({ path: `/ab-testing-for-wp/v1/ab-test?test=${testId}&variant=${variantId}` }) .then((result) => { if (result.html) { const target = document.querySelector(`.ABTestWrapper[data-test=${testId}]`); if (target) target.innerHTML = result.html; } }); }; render() { const { isLoading, tests, pickedVariants } = this.state; return (
{sprintf(__('A/B Tests %s'), tests.length > 0 ? `(${tests.length})` : '')}
); } } export default AdminBar;