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