diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index 745b6b3a..312a8ff2 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -383,6 +383,13 @@ "title": "Export", "success": "Successfully exported" }, + "filename": { + "cookie_key_value_pairs": "Cookie", + "codegen": "{request_name} - code", + "graphql_response": "GraphQL-Response", + "lens": "{request_name} - response", + "realtime_response": "Realtime-Response" + }, "filter": { "all": "All", "none": "None", diff --git a/packages/hoppscotch-common/src/components/cookies/EditCookie.vue b/packages/hoppscotch-common/src/components/cookies/EditCookie.vue index 79c80f1a..bd9503e0 100644 --- a/packages/hoppscotch-common/src/components/cookies/EditCookie.vue +++ b/packages/hoppscotch-common/src/components/cookies/EditCookie.vue @@ -187,8 +187,9 @@ function saveCookieChange() { const { copyIcon, copyResponse } = useCopyResponse(rawCookieString) const { downloadIcon, downloadResponse } = useDownloadResponse( - "", - rawCookieString + "text/plain", + rawCookieString, + t("filename.cookie_key_value_pairs") ) function clearContent() { diff --git a/packages/hoppscotch-common/src/components/graphql/Response.vue b/packages/hoppscotch-common/src/components/graphql/Response.vue index 8a867ee5..81d18750 100644 --- a/packages/hoppscotch-common/src/components/graphql/Response.vue +++ b/packages/hoppscotch-common/src/components/graphql/Response.vue @@ -157,7 +157,8 @@ useCodemirror( const { copyIcon, copyResponse } = useCopyResponse(responseString) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - responseString + responseString, + t("filename.graphql_response") ) defineActionHandler( diff --git a/packages/hoppscotch-common/src/components/http/Codegen.vue b/packages/hoppscotch-common/src/components/http/Codegen.vue index d3a25058..53c6ac89 100644 --- a/packages/hoppscotch-common/src/components/http/Codegen.vue +++ b/packages/hoppscotch-common/src/components/http/Codegen.vue @@ -259,5 +259,11 @@ const filteredCodegenDefinitions = computed(() => { }) const { copyIcon, copyResponse } = useCopyResponse(requestCode) -const { downloadIcon, downloadResponse } = useDownloadResponse("", requestCode) +const { downloadIcon, downloadResponse } = useDownloadResponse( + "", + requestCode, + t("filename.codegen", { + request_name: request.value.name, + }) +) diff --git a/packages/hoppscotch-common/src/components/http/ImportCurl.vue b/packages/hoppscotch-common/src/components/http/ImportCurl.vue index d9a319c3..36deeaa0 100644 --- a/packages/hoppscotch-common/src/components/http/ImportCurl.vue +++ b/packages/hoppscotch-common/src/components/http/ImportCurl.vue @@ -26,12 +26,6 @@ :icon="IconWrapText" @click.prevent="toggleNestedSetting('WRAP_LINES', 'importCurl')" /> - { } const { copyIcon, copyResponse } = useCopyResponse(curl) -const { downloadIcon, downloadResponse } = useDownloadResponse("", curl) const clearContent = () => { curl.value = "" diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue index e06a67d3..4ebc0855 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue @@ -72,7 +72,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue index 4c74a4ef..9d10236e 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue @@ -93,7 +93,10 @@ const WRAP_LINES = useNestedSetting("WRAP_LINES", "httpResponseBody") const { responseBodyText } = useResponseBody(props.response) const { downloadIcon, downloadResponse } = useDownloadResponse( "text/html", - responseBodyText + responseBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const defaultPreview = persistenceService.getLocalConfig("lens_html_preview") === "true" diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue index c0142549..1260f6ef 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue @@ -67,7 +67,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) watch(props.response, () => { diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue index c9dff574..8d7afe38 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue @@ -354,7 +354,10 @@ const filterResponseError = computed(() => const { copyIcon, copyResponse } = useCopyResponse(jsonBodyText) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - jsonBodyText + jsonBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) // Template refs diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue index e916e97d..c41acd93 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue @@ -53,7 +53,10 @@ const pdfsrc = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( "application/pdf", - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue index fc24434d..9a5f7fed 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue @@ -95,7 +95,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - rawResponseBody + rawResponseBody, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const { copyIcon, copyResponse } = useCopyResponse(responseBodyText) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue index dc3db979..45516541 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue @@ -72,7 +72,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue index faab1cc9..c9494089 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue @@ -89,7 +89,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - responseBodyText + responseBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const { copyIcon, copyResponse } = useCopyResponse(responseBodyText) diff --git a/packages/hoppscotch-common/src/components/realtime/LogEntry.vue b/packages/hoppscotch-common/src/components/realtime/LogEntry.vue index 907af376..a760b199 100644 --- a/packages/hoppscotch-common/src/components/realtime/LogEntry.vue +++ b/packages/hoppscotch-common/src/components/realtime/LogEntry.vue @@ -326,7 +326,8 @@ const { copyIcon, copyResponse } = useCopyResponse(logPayload) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - logPayload + logPayload, + t("filename.realtime_response") ) const copyQueryIcon = refAutoReset( diff --git a/packages/hoppscotch-common/src/composables/lens-actions.ts b/packages/hoppscotch-common/src/composables/lens-actions.ts index b7bf9001..2f462405 100644 --- a/packages/hoppscotch-common/src/composables/lens-actions.ts +++ b/packages/hoppscotch-common/src/composables/lens-actions.ts @@ -1,9 +1,6 @@ import { HoppRESTResponse } from "@helpers/types/HoppRESTResponse" import { copyToClipboard } from "@helpers/utils/clipboard" import { refAutoReset } from "@vueuse/core" -import { pipe } from "fp-ts/function" -import * as RNEA from "fp-ts/ReadonlyNonEmptyArray" -import * as S from "fp-ts/string" import { computed, ComputedRef, onMounted, ref, Ref } from "vue" import jsonToLanguage from "~/helpers/utils/json-to-language" @@ -58,7 +55,8 @@ export type downloadResponseReturnType = (() => void) | Ref export function useDownloadResponse( contentType: string, - responseBody: Ref + responseBody: Ref, + filename: string ) { const downloadIcon = refAutoReset(IconDownload, 1000) @@ -68,24 +66,6 @@ export function useDownloadResponse( const downloadResponse = async () => { const dataToWrite = responseBody.value - // Guess extension and filename - const file = new Blob([dataToWrite], { type: contentType }) - const url = URL.createObjectURL(file) - - const filename = pipe( - url, - S.split("/"), - RNEA.last, - S.split("#"), - RNEA.head, - S.split("?"), - RNEA.head - ) - - URL.revokeObjectURL(url) - - console.log(filename) - // TODO: Look at the mime type and determine extension ? const result = await platform.io.saveFileWithDialog({ data: dataToWrite,