resizer.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. app.views.Resizer = class Resizer extends app.View {
  2. static className = "_resizer";
  3. static events = {
  4. dragstart: "onDragStart",
  5. dragend: "onDragEnd",
  6. };
  7. static MIN = 260;
  8. static MAX = 600;
  9. static isSupported() {
  10. return "ondragstart" in document.createElement("div") && !app.isMobile();
  11. }
  12. init() {
  13. this.el.setAttribute("draggable", "true");
  14. this.appendTo($("._app"));
  15. }
  16. resize(value, save) {
  17. value -= app.el.offsetLeft;
  18. if (!(value > 0)) {
  19. return;
  20. }
  21. value = Math.min(Math.max(Math.round(value), Resizer.MIN), Resizer.MAX);
  22. const newSize = `${value}px`;
  23. document.documentElement.style.setProperty("--sidebarWidth", newSize);
  24. if (save) {
  25. app.settings.setSize(value);
  26. }
  27. }
  28. onDragStart(event) {
  29. event.dataTransfer.effectAllowed = "link";
  30. event.dataTransfer.setData("Text", "");
  31. this.onDrag = this.onDrag.bind(this);
  32. $.on(window, "dragover", this.onDrag);
  33. }
  34. onDrag(event) {
  35. const value = event.pageX;
  36. if (!(value > 0)) {
  37. return;
  38. }
  39. this.lastDragValue = value;
  40. if (this.lastDrag && this.lastDrag > Date.now() - 50) {
  41. return;
  42. }
  43. this.lastDrag = Date.now();
  44. this.resize(value, false);
  45. }
  46. onDragEnd(event) {
  47. $.off(window, "dragover", this.onDrag);
  48. let value = event.pageX || event.screenX - window.screenX;
  49. if (
  50. this.lastDragValue &&
  51. !(this.lastDragValue - 5 < value && value < this.lastDragValue + 5)
  52. ) {
  53. // https://github.com/freeCodeCamp/devdocs/issues/265
  54. value = this.lastDragValue;
  55. }
  56. this.resize(value, true);
  57. }
  58. };