import React, { Component, ReactNode } from 'react'; import queryString from 'query-string'; import { __, sprintf } from '@wordpress/i18n'; import apiFetch from '@wordpress/api-fetch'; import Test from './Test'; type AdminBarState = { isLoading: boolean; tests: TestData[]; pickedVariants: { [testId: string]: string; }; }; class AdminBar extends Component<{}, AdminBarState> { constructor(props: {}) { super(props); this.state = { isLoading: true, tests: [], pickedVariants: ABTestingForWP_AdminBar.participating || {}, }; } componentDidMount(): void { 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')); const resolveTestData = testIds.length > 0 ? apiFetch({ path: `ab-testing-for-wp/v1/get-tests-info?${queryString.stringify({ id: testIds }, { arrayFormat: 'bracket' })}` }) : Promise.resolve([]); resolveTestData.then((tests) => { this.setState({ tests: testIds .map((id) => tests.find((test) => test.id === id)) .filter((test): boolean => typeof test !== 'undefined') as TestData[], isLoading: false, }); }); } onChangeVariant = (testId: string, variantId: string): void => { const { pickedVariants } = this.state; this.setState({ pickedVariants: { ...pickedVariants, [testId]: variantId, }, }); apiFetch<{ html: string }>({ 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(): ReactNode { const { isLoading, tests, pickedVariants } = this.state; return ( <>
{sprintf(__('A/B Tests %s', 'ab-testing-for-wp'), tests.length > 0 ? `(${tests.length})` : '')}
    {isLoading && (
  • {__('Scanning for tests on page', 'ab-testing-for-wp')}
  • )} {!isLoading && tests.length === 0 ? (
  • {__('No tests found on page', 'ab-testing-for-wp')}
  • ) : tests.map((test) => ( ))}
); } } export default AdminBar;