ProjectName.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import "./ProjectName.css";
  2. import React, { Component } from "react";
  3. import { selectNode, removeSelection } from "../utils";
  4. type Props = {
  5. value: string;
  6. onChange: (value: string) => void;
  7. label: string;
  8. };
  9. export class ProjectName extends Component<Props> {
  10. private handleFocus = (e: React.FocusEvent<HTMLElement>) => {
  11. selectNode(e.currentTarget);
  12. };
  13. private handleBlur = (e: React.FocusEvent<HTMLElement>) => {
  14. const value = e.currentTarget.innerText.trim();
  15. if (value !== this.props.value) {
  16. this.props.onChange(value);
  17. }
  18. removeSelection();
  19. };
  20. private handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {
  21. if (e.key === "Enter") {
  22. e.preventDefault();
  23. e.currentTarget.blur();
  24. }
  25. };
  26. public render() {
  27. return (
  28. <span
  29. suppressContentEditableWarning
  30. contentEditable="true"
  31. data-type="wysiwyg"
  32. className="ProjectName"
  33. role="textbox"
  34. aria-label={this.props.label}
  35. onBlur={this.handleBlur}
  36. onKeyDown={this.handleKeyDown}
  37. onFocus={this.handleFocus}
  38. >
  39. {this.props.value}
  40. </span>
  41. );
  42. }
  43. }