• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Financial-Times / cm-react-components / 4fd18ea4-83a1-49c7-9b12-f1e128514343

05 Nov 2025 03:00PM UTC coverage: 73.505% (-1.2%) from 74.673%
4fd18ea4-83a1-49c7-9b12-f1e128514343

push

circleci

ManoelMilchev
initialise header component

314 of 406 branches covered (77.34%)

Branch coverage included in aggregate %.

0 of 10 new or added lines in 1 file covered. (0.0%)

485 of 681 relevant lines covered (71.22%)

8.25 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/components/Header/Header.js
1
import React, { useEffect, useRef } from 'react';
2
import PropTypes from 'prop-types';
3
import oHeaderServices from '@financial-times/o-header-services';
4

5
import { SecondaryNavigation } from './SecondaryNavigation';
6
import { MainNavigation } from './MainNavigation';
7

8
const Header = ({
×
9
  title,
10
  name,
11
  id,
12
  mainMenuData,
13
  secondaryMenuData,
14
  clientMenuData,
15
  renderProp
16
}) => {
NEW
17
  const headerRef = useRef(null);
×
18

NEW
19
  useEffect(() => {
×
NEW
20
    if (headerRef.current) {
×
21
      // Initialize o-header-services for this specific header element
NEW
22
      oHeaderServices.init(headerRef.current);
×
23
    }
24

25
    // Cleanup function
NEW
26
    return () => {
×
NEW
27
      if (headerRef.current) {
×
28
        // Destroy the component when unmounting to prevent memory leaks
NEW
29
        const headerElement = headerRef.current.querySelector('[data-o-component="o-header-services"]');
×
NEW
30
        if (headerElement && headerElement.oHeaderServices) {
×
NEW
31
          headerElement.oHeaderServices.destroy();
×
32
        }
33
      }
34
    };
35
  }, []);
36

NEW
37
  return (
×
38
    <div className="o-layout__header" ref={headerRef}>
39
      <header className="o-header-services " data-o-component="o-header-services" data-testid="header-component">
40
        <div className="o-header-services__top">
41
          <div className="o-header-services__hamburger">
42
            <a className="o-header-services__hamburger-icon" href="/" role="button">
43
              <span className="o-header-services__visually-hidden">Open primary navigation</span>
44
            </a>
45
          </div>
46
          <a href="/">
47
            <div className="o-header-services__logo" />
48
          </a>
49
          <div className="o-header-services__title">
50
            <a className="o-header-services__product-name" href="/">{title}</a>
51
          </div>
52
        </div>
53
        <MainNavigation
54
          menuData={mainMenuData}
55
          renderProp={renderProp}
56
        />
57
        {secondaryMenuData && secondaryMenuData.length > 0 && (
×
58
          <SecondaryNavigation
59
            name={name}
60
            id={id}
61
            menuData={secondaryMenuData}
62
            clientMenuData={clientMenuData}
63
            renderProp={renderProp}
64
          />
65
        )}
66
      </header>
67
    </div>
68
  );
69
};
70

71
Header.propTypes = {
×
72
  title: PropTypes.string,
73
  name: PropTypes.string,
74
  id: PropTypes.string,
75
  mainMenuData: MainNavigation.propTypes.menuData,
76
  secondaryMenuData: SecondaryNavigation.propTypes.menuData,
77
  clientMenuData: SecondaryNavigation.propTypes.clientMenuData,
78
  renderProp: SecondaryNavigation.propTypes.renderProp
79
};
80

81
export default Header;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc