Skip to content

[UI Refactor] Migrate ViewingLayer to Functional Component #3371

@jkowall

Description

@jkowall

This issue is part of the larger effort to modernize the Jaeger UI codebase (Parent Issue #2610). The goal is to refactor the ViewingLayer component from a React Class Component to a React Functional Component using Hooks.

Target Component: packages/jaeger-ui/src/components/TracePage/TracePageHeader/SpanGraph/ViewingLayer.tsx

Acceptance Criteria

  • The component is converted to a Functional Component.
  • this.state is replaced with useState or useReducer.
  • Lifecycle methods (componentDidMount, etc.) are replaced with useEffect.
  • If Redux is used, the connect HOC is replaced with useSelector and useDispatch hooks (optional but preferred).
  • All existing PropType validations are preserved.
  • Performance: If the original component was a PureComponent, the new one is wrapped in React.memo.
  • Visual Verification: Attach "Before" and "After" screenshots to the PR to prove no visual regression.
  • Tests: Existing unit tests must pass.
  • Note: If tests rely on Enzyme's state() or instance(), they must be refactored to check the DOM or Props instead.

Migration Guide (Cheat Sheet)

Feature Old (Class) New (Functional)
State this.state = { isOpen: false } const [isOpen, setIsOpen] = useState(false);
Side Effects componentDidMount() useEffect(() => { ... }, [])
Props this.props.traceId props.traceId (or destructure: const { traceId } = props;)
Default Props static defaultProps = { name: 'Guest' } function Component({ name = 'Guest' }) { ... }
Performance class MyComp extends React.PureComponent export default React.memo(MyComp)
Context static contextType = MyContext const val = useContext(MyContext)
Refs this.myRef = React.createRef() const myRef = useRef(null)

Common Pitfalls (Read Carefully!)

  • Stale Closures: Be careful when using useEffect. If you use a variable inside the effect that comes from props or state, it must be in the dependency array. If you omit it, the effect will use the old value.
  • Testing with Enzyme: Functional components do not have instances. Tests like wrapper.instance().method() or wrapper.state('value') will fail. You should refactor these tests to simulate events (clicks) and check the rendered output instead.

Resources

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions