@@ -0,0 +1,24 @@ | |||||
"use server"; | |||||
import { serverFetchBlob } from "@/app/utils/fetchUtil"; | |||||
import { BASE_API_URL } from "@/config/api"; | |||||
export interface FileResponse { | |||||
filename: string; | |||||
blobValue: Uint8Array; | |||||
} | |||||
export const fetchPoQrcode = async (data: any) => { | |||||
const reportBlob = await serverFetchBlob<FileResponse>( | |||||
`${BASE_API_URL}/stockInLine/print-label`, | |||||
{ | |||||
method: "POST", | |||||
body: JSON.stringify(data), | |||||
headers: { "Content-Type": "application/json" }, | |||||
}, | |||||
); | |||||
return reportBlob | |||||
}; |
@@ -0,0 +1,10 @@ | |||||
export const downloadFile = (blobData: Uint8Array, filename: string) => { | |||||
const url = URL.createObjectURL(new Blob([blobData])); | |||||
const link = document.createElement("a"); | |||||
link.href = url; | |||||
link.setAttribute("download", filename); | |||||
link.click(); | |||||
} | |||||
@@ -74,6 +74,79 @@ export async function serverFetchJson<T>(...args: FetchParams) { | |||||
} | } | ||||
} | } | ||||
export async function serverFetchBlob<T>(...args: FetchParams) { | |||||
const response = await serverFetch(...args); | |||||
if (response.ok) { | |||||
const body = response.body; | |||||
// console.log(body) | |||||
// console.log(body?.tee()[0].getReader()) | |||||
const reader = body?.getReader(); | |||||
let finalUInt8Array = new Uint8Array(); | |||||
let done = false; | |||||
while (!done) { | |||||
const read = await reader?.read(); | |||||
// version 1 | |||||
if (read?.done) { | |||||
done = true; | |||||
} else { | |||||
const tempUInt8Array = new Uint8Array( | |||||
finalUInt8Array.length + read?.value.length!, | |||||
); | |||||
tempUInt8Array.set(finalUInt8Array); | |||||
tempUInt8Array.set(read?.value!, finalUInt8Array.length); | |||||
finalUInt8Array = new Uint8Array(tempUInt8Array.length!); | |||||
finalUInt8Array.set(tempUInt8Array); | |||||
// console.log("1", finalUInt8Array) | |||||
} | |||||
} | |||||
// version 2 & return bodyRead | |||||
// const bodyRead = reader?.read().then(function processText({ done, value }): any { | |||||
// // Result objects contain two properties: | |||||
// // done - true if the stream has already given you all its data. | |||||
// // value - some data. Always undefined when done is true. | |||||
// if (done) { | |||||
// console.log("Stream complete"); | |||||
// return { filename: response.headers.get("filename"), blobValue: finalUInt8Array } as T;; | |||||
// } | |||||
// // value for fetch streams is a Uint8Array | |||||
// finalUInt8Array = new Uint8Array(value.length) | |||||
// finalUInt8Array.set(value) | |||||
// console.log(finalUInt8Array) | |||||
// // Read some more, and call this function again | |||||
// return reader.read().then(processText); | |||||
// }) | |||||
// const bodyValue = bodyRead?.value | |||||
// const blob = await response.blob() | |||||
// const blobText = await blob.text(); | |||||
// const blobType = await blob.type; | |||||
// console.log(bodyReader) | |||||
// console.log("2", finalUInt8Array) | |||||
// console.log(bodyValue) | |||||
return { | |||||
filename: response.headers.get("filename"), | |||||
blobValue: finalUInt8Array, | |||||
} as T; | |||||
} else { | |||||
switch (response.status) { | |||||
case 401: | |||||
signOutUser(); | |||||
default: | |||||
console.error(await response.text()); | |||||
throw Error("Something went wrong fetching data in server."); | |||||
} | |||||
} | |||||
} | |||||
export const signOutUser = () => { | export const signOutUser = () => { | ||||
const headersList = headers(); | const headersList = headers(); | ||||
const referer = headersList.get("referer"); | const referer = headersList.get("referer"); | ||||
@@ -43,9 +43,12 @@ import LooksOneIcon from '@mui/icons-material/LooksOne'; | |||||
import LooksTwoIcon from '@mui/icons-material/LooksTwo'; | import LooksTwoIcon from '@mui/icons-material/LooksTwo'; | ||||
import Looks3Icon from '@mui/icons-material/Looks3'; | import Looks3Icon from '@mui/icons-material/Looks3'; | ||||
import axiosInstance from "@/app/(main)/axios/axiosInstance"; | import axiosInstance from "@/app/(main)/axios/axiosInstance"; | ||||
import axios from "axios"; | |||||
import axios, { AxiosRequestConfig } from "axios"; | |||||
import { NEXT_PUBLIC_API_URL } from "@/config/api"; | import { NEXT_PUBLIC_API_URL } from "@/config/api"; | ||||
import qs from 'qs'; | |||||
import QrCodeIcon from '@mui/icons-material/QrCode'; | import QrCodeIcon from '@mui/icons-material/QrCode'; | ||||
import { downloadFile } from "@/app/utils/commonUtil"; | |||||
import { fetchPoQrcode } from "@/app/api/pdf/actions"; | |||||
interface ResultWithId { | interface ResultWithId { | ||||
id: number; | id: number; | ||||
} | } | ||||
@@ -241,6 +244,16 @@ function PoInputGrid({ | |||||
[] | [] | ||||
); | ); | ||||
const printQrcode = useCallback(async (row: any) => { | |||||
console.log(row.id) | |||||
const postData = {stockInLineIds: [row.id]} | |||||
const response = await fetchPoQrcode(postData) | |||||
if (response) { | |||||
console.log(response) | |||||
downloadFile(new Uint8Array(response.blobValue), response.filename!!) | |||||
} | |||||
}, [fetchPoQrcode, downloadFile]) | |||||
const handleQrCode = useCallback( | const handleQrCode = useCallback( | ||||
(id: GridRowId, params: any) => () => { | (id: GridRowId, params: any) => () => { | ||||
setRowModesModel((prev) => ({ | setRowModesModel((prev) => ({ | ||||
@@ -254,6 +267,7 @@ function PoInputGrid({ | |||||
// return the record with its status as pending | // return the record with its status as pending | ||||
// update layout | // update layout | ||||
console.log("delayed"); | console.log("delayed"); | ||||
printQrcode(params.row) | |||||
}, 200); | }, 200); | ||||
}, | }, | ||||
[] | [] | ||||