useQueue.ts 965 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { type Ref, provide, ref } from 'vue'
  2. export const queueKey = '__QUEUE_KEY__'
  3. export interface Queue {
  4. queue: Ref<any[]>
  5. pushToQueue: (comp: any) => void
  6. removeFromQueue: (comp: any) => void
  7. closeOther: (comp: any) => void
  8. closeOutside: () => void
  9. }
  10. export function useQueue() {
  11. const queue = ref<any[]>([])
  12. function pushToQueue(comp: any) {
  13. queue.value.push(comp)
  14. }
  15. function removeFromQueue(comp: any) {
  16. queue.value = queue.value.filter((item) => {
  17. return item.$.uid !== comp.$.uid
  18. })
  19. }
  20. function closeOther(comp: any) {
  21. queue.value.forEach((item) => {
  22. if (item.$.uid !== comp.$.uid) {
  23. item.$.exposed.close()
  24. }
  25. })
  26. }
  27. function closeOutside() {
  28. queue.value.forEach((item) => {
  29. item.$.exposed.close()
  30. })
  31. }
  32. provide(queueKey, {
  33. queue,
  34. pushToQueue,
  35. removeFromQueue,
  36. closeOther,
  37. closeOutside
  38. })
  39. return {
  40. closeOther,
  41. closeOutside
  42. }
  43. }