useVisibleStatus.js 2.5 KB

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