ViewApiRequest.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <script setup lang="ts">
  2. import { defineAsyncComponent, ref, onMounted, onBeforeUnmount } from "vue";
  3. import Toast from "toasters";
  4. import VueJsonPretty from "vue-json-pretty";
  5. import { storeToRefs } from "pinia";
  6. import { useWebsocketsStore } from "@/stores/websockets";
  7. import { useModalsStore } from "@/stores/modals";
  8. import { useViewApiRequestStore } from "@/stores/viewApiRequest";
  9. import "vue-json-pretty/lib/styles.css";
  10. const Modal = defineAsyncComponent(() => import("@/components/Modal.vue"));
  11. const QuickConfirm = defineAsyncComponent(
  12. () => import("@/components/QuickConfirm.vue")
  13. );
  14. const props = defineProps({
  15. modalUuid: { type: String, required: true }
  16. });
  17. const { socket } = useWebsocketsStore();
  18. const viewApiRequestStore = useViewApiRequestStore(props);
  19. const { requestId, request, removeAction } = storeToRefs(viewApiRequestStore);
  20. const { viewApiRequest } = viewApiRequestStore;
  21. const { closeCurrentModal } = useModalsStore();
  22. const loaded = ref(false);
  23. const remove = () => {
  24. if (removeAction.value)
  25. socket.dispatch(removeAction.value, requestId.value, res => {
  26. if (res.status === "success") {
  27. new Toast("API request successfully removed.");
  28. closeCurrentModal();
  29. } else {
  30. new Toast("API request with that ID not found.");
  31. }
  32. });
  33. };
  34. onMounted(() => {
  35. socket.onConnect(() => {
  36. loaded.value = false;
  37. socket.dispatch("youtube.getApiRequest", requestId.value, res => {
  38. if (res.status === "success") {
  39. const { apiRequest } = res.data;
  40. viewApiRequest(apiRequest);
  41. loaded.value = true;
  42. socket.dispatch(
  43. "apis.joinRoom",
  44. `view-api-request.${requestId.value}`
  45. );
  46. socket.on(
  47. "event:youtubeApiRequest.removed",
  48. () => {
  49. new Toast("This API request was removed.");
  50. closeCurrentModal();
  51. },
  52. { modalUuid: props.modalUuid }
  53. );
  54. } else {
  55. new Toast("API request with that ID not found");
  56. closeCurrentModal();
  57. }
  58. });
  59. });
  60. });
  61. onBeforeUnmount(() => {
  62. socket.dispatch(
  63. "apis.leaveRoom",
  64. `view-api-request.${requestId.value}`,
  65. () => {}
  66. );
  67. // Delete the Pinia store that was created for this modal, after all other cleanup tasks are performed
  68. viewApiRequestStore.$dispose();
  69. });
  70. </script>
  71. <template>
  72. <modal title="View API Request">
  73. <template #body>
  74. <div v-if="!loaded" class="vertical-padding">
  75. <p>Request hasn't loaded yet</p>
  76. </div>
  77. <div v-else class="vertical-padding">
  78. <p><b>ID:</b> {{ request._id }}</p>
  79. <p><b>URL:</b> {{ request.url }}</p>
  80. <div>
  81. <b>Params:</b>
  82. <ul v-if="request.params">
  83. <li
  84. v-for="[paramKey, paramValue] in Object.entries(
  85. request.params
  86. )"
  87. :key="paramKey"
  88. >
  89. <b>{{ paramKey }}</b
  90. >: {{ paramValue }}
  91. </li>
  92. </ul>
  93. <span v-else>None/Not found</span>
  94. </div>
  95. <div>
  96. <b>Results:</b>
  97. <vue-json-pretty
  98. :data="request.results"
  99. :show-length="true"
  100. ></vue-json-pretty>
  101. </div>
  102. <p><b>Date:</b> {{ request.date }}</p>
  103. <p><b>Quota cost:</b> {{ request.quotaCost }}</p>
  104. </div>
  105. </template>
  106. <template #footer>
  107. <quick-confirm v-if="removeAction" @confirm="remove()">
  108. <a class="button is-danger"> Remove API request</a>
  109. </quick-confirm>
  110. </template>
  111. </modal>
  112. </template>
  113. <style lang="less" scoped>
  114. ul {
  115. list-style-type: disc;
  116. padding-left: 20px;
  117. }
  118. </style>