useVisibleStatus.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _raf = _interopRequireDefault(require("../../_util/raf"));
  9. var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
  10. function adopt(value) {
  11. return value instanceof P ? value : new P(function (resolve) {
  12. resolve(value);
  13. });
  14. }
  15. return new (P || (P = Promise))(function (resolve, reject) {
  16. function fulfilled(value) {
  17. try {
  18. step(generator.next(value));
  19. } catch (e) {
  20. reject(e);
  21. }
  22. }
  23. function rejected(value) {
  24. try {
  25. step(generator["throw"](value));
  26. } catch (e) {
  27. reject(e);
  28. }
  29. }
  30. function step(result) {
  31. result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
  32. }
  33. step((generator = generator.apply(thisArg, _arguments || [])).next());
  34. });
  35. };
  36. const StatusQueue = ['measure', 'align', null, 'motion'];
  37. var _default = (visible, doMeasure) => {
  38. const status = (0, _vue.shallowRef)(null);
  39. const rafRef = (0, _vue.shallowRef)();
  40. const destroyRef = (0, _vue.shallowRef)(false);
  41. function setStatus(nextStatus) {
  42. if (!destroyRef.value) {
  43. status.value = nextStatus;
  44. }
  45. }
  46. function cancelRaf() {
  47. _raf.default.cancel(rafRef.value);
  48. }
  49. function goNextStatus(callback) {
  50. cancelRaf();
  51. rafRef.value = (0, _raf.default)(() => {
  52. // Only align should be manually trigger
  53. let newStatus = status.value;
  54. switch (status.value) {
  55. case 'align':
  56. newStatus = 'motion';
  57. break;
  58. case 'motion':
  59. newStatus = 'stable';
  60. break;
  61. default:
  62. }
  63. setStatus(newStatus);
  64. callback === null || callback === void 0 ? void 0 : callback();
  65. });
  66. }
  67. (0, _vue.watch)(visible, () => {
  68. setStatus('measure');
  69. }, {
  70. immediate: true,
  71. flush: 'post'
  72. });
  73. (0, _vue.onMounted)(() => {
  74. // Go next status
  75. (0, _vue.watch)(status, () => {
  76. switch (status.value) {
  77. case 'measure':
  78. doMeasure();
  79. break;
  80. default:
  81. }
  82. if (status.value) {
  83. rafRef.value = (0, _raf.default)(() => __awaiter(void 0, void 0, void 0, function* () {
  84. const index = StatusQueue.indexOf(status.value);
  85. const nextStatus = StatusQueue[index + 1];
  86. if (nextStatus && index !== -1) {
  87. setStatus(nextStatus);
  88. }
  89. }));
  90. }
  91. }, {
  92. immediate: true,
  93. flush: 'post'
  94. });
  95. });
  96. (0, _vue.onBeforeUnmount)(() => {
  97. destroyRef.value = true;
  98. cancelRaf();
  99. });
  100. return [status, goNextStatus];
  101. };
  102. exports.default = _default;