body.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import React, { useEffect, useState } from 'react';
  4. import { Callstack } from '.';
  5. import { ReactWidget } from '@jupyterlab/apputils';
  6. import { ArrayExt } from '@phosphor/algorithm';
  7. export class Body extends ReactWidget {
  8. constructor(model: Callstack.Model) {
  9. super();
  10. this.model = model;
  11. this.addClass('jp-DebuggerCallstack-body');
  12. }
  13. render() {
  14. return <FramesComponent model={this.model} />;
  15. }
  16. readonly model: Callstack.Model;
  17. }
  18. const FramesComponent = ({ model }: { model: Callstack.Model }) => {
  19. const [frames, setFrames] = useState(model.frames);
  20. const [selected, setSelected] = useState(model.frame);
  21. const onSelected = (frame: any) => {
  22. setSelected(frame);
  23. model.frame = frame;
  24. };
  25. useEffect(() => {
  26. const updateFrames = (_: Callstack.Model, updates: Callstack.IFrame[]) => {
  27. if (ArrayExt.shallowEqual(frames, updates)) {
  28. return;
  29. }
  30. setFrames(updates);
  31. setSelected(updates[0]);
  32. };
  33. model.framesChanged.connect(updateFrames);
  34. return () => {
  35. model.framesChanged.disconnect(updateFrames);
  36. };
  37. });
  38. return (
  39. <ul>
  40. {frames.map(ele => (
  41. <li
  42. key={ele.id}
  43. onClick={() => onSelected(ele)}
  44. className={selected === ele ? 'selected' : ''}
  45. >
  46. {ele.name} at {ele.source.name}:{ele.line}
  47. </li>
  48. ))}
  49. </ul>
  50. );
  51. };