4
0

bindingExecutionState.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { reactive } from 'vue'
  2. import { buttonResults } from './buttonResults.js'
  3. const INDICATOR_SHOW_DELAY_MS = 1000
  4. export const bindingExecutionState = reactive({})
  5. const pendingShowTimers = {}
  6. function cancelPendingShowTimer (bindingId) {
  7. const timer = pendingShowTimers[bindingId]
  8. if (timer != null) {
  9. clearTimeout(timer)
  10. delete pendingShowTimers[bindingId]
  11. }
  12. }
  13. function scheduleIndicatorShow (bindingId) {
  14. cancelPendingShowTimer(bindingId)
  15. pendingShowTimers[bindingId] = setTimeout(() => {
  16. delete pendingShowTimers[bindingId]
  17. recomputeBindingExecutionState(bindingId)
  18. }, INDICATOR_SHOW_DELAY_MS)
  19. }
  20. export function setBindingExecutionState (bindingId, hasRunning, hasQueued) {
  21. if (!bindingId) {
  22. return
  23. }
  24. if (!hasRunning && !hasQueued) {
  25. delete bindingExecutionState[bindingId]
  26. return
  27. }
  28. bindingExecutionState[bindingId] = { hasRunning, hasQueued }
  29. }
  30. export function recomputeBindingExecutionState (bindingId) {
  31. if (!bindingId) {
  32. return
  33. }
  34. let hasRunning = false
  35. let hasQueued = false
  36. for (const trackingId in buttonResults) {
  37. const entry = buttonResults[trackingId]
  38. if (!entry || entry.bindingId !== bindingId || entry.executionFinished) {
  39. continue
  40. }
  41. if (entry.executionStarted) {
  42. hasRunning = true
  43. } else {
  44. hasQueued = true
  45. }
  46. }
  47. setBindingExecutionState(bindingId, hasRunning, hasQueued)
  48. }
  49. export function applyExecutionStartedBindingState (logEntry) {
  50. if (!logEntry?.bindingId || logEntry.executionFinished) {
  51. return
  52. }
  53. scheduleIndicatorShow(logEntry.bindingId)
  54. }
  55. export function applyExecutionFinishedBindingState (logEntry) {
  56. if (!logEntry?.bindingId) {
  57. return
  58. }
  59. cancelPendingShowTimer(logEntry.bindingId)
  60. recomputeBindingExecutionState(logEntry.bindingId)
  61. }