body.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 { Breakpoints } from '.';
  5. import { ReactWidget } from '@jupyterlab/apputils';
  6. import { ArrayExt } from '@phosphor/algorithm';
  7. import { ISignal } from '@phosphor/signaling';
  8. export class Body extends ReactWidget {
  9. constructor(model: Breakpoints.Model) {
  10. super();
  11. this.model = model;
  12. this.addClass('jp-DebuggerBreakpoints-body');
  13. }
  14. render() {
  15. return <BreakpointsComponent model={this.model} />;
  16. }
  17. readonly model: Breakpoints.Model;
  18. }
  19. const BreakpointsComponent = ({ model }: { model: Breakpoints.Model }) => {
  20. const [breakpoints, setBreakpoints] = useState(model.breakpoints);
  21. useEffect(() => {
  22. const updateBreakpoints = (
  23. _: Breakpoints.Model,
  24. updates: Breakpoints.IBreakpoint[]
  25. ) => {
  26. if (ArrayExt.shallowEqual(breakpoints, updates)) {
  27. return;
  28. }
  29. setBreakpoints(updates);
  30. };
  31. model.breakpointsChanged.connect(updateBreakpoints);
  32. return () => {
  33. model.breakpointsChanged.disconnect(updateBreakpoints);
  34. };
  35. });
  36. return (
  37. <div>
  38. {breakpoints.map((breakpoint: Breakpoints.IBreakpoint) => (
  39. <BreakpointComponent
  40. key={breakpoint.line}
  41. breakpoint={breakpoint}
  42. breakpointChanged={model.breakpointChanged}
  43. />
  44. ))}
  45. </div>
  46. );
  47. };
  48. const BreakpointComponent = ({
  49. breakpoint,
  50. breakpointChanged
  51. }: {
  52. breakpoint: Breakpoints.IBreakpoint;
  53. breakpointChanged: ISignal<Breakpoints.Model, Breakpoints.IBreakpoint>;
  54. }) => {
  55. const [active, setActive] = useState(breakpoint.active);
  56. breakpoint.active = active;
  57. const setBreakpointEnabled = (state: boolean) => {
  58. setActive(state);
  59. };
  60. useEffect(() => {
  61. const updateBreakpoints = (
  62. _: Breakpoints.Model,
  63. updates: Breakpoints.IBreakpoint
  64. ) => {
  65. setBreakpointEnabled(updates.active);
  66. };
  67. breakpointChanged.connect(updateBreakpoints);
  68. return () => {
  69. breakpointChanged.disconnect(updateBreakpoints);
  70. };
  71. });
  72. return (
  73. <div className={`breakpoint`}>
  74. <input
  75. onChange={() => {
  76. setBreakpointEnabled(!active);
  77. }}
  78. type="checkbox"
  79. checked={active}
  80. />
  81. <span>
  82. {breakpoint.source.name} : {breakpoint.line}
  83. </span>
  84. </div>
  85. );
  86. };