77 lines
2.2 KiB
TypeScript
Executable File
77 lines
2.2 KiB
TypeScript
Executable File
import { useLocal } from "@/utils/use-local";
|
|
import get from "lodash.get";
|
|
import { FC, ReactNode } from "react";
|
|
export const ButtonUpload: FC<{
|
|
child: ReactNode;
|
|
url_upload: string;
|
|
on_update: (url: string) => Promise<void>;
|
|
}> = ({ child, url_upload, on_update }) => {
|
|
const input = useLocal({
|
|
value: 0 as any,
|
|
display: false as any,
|
|
ref: null as any,
|
|
drop: false as boolean,
|
|
});
|
|
return (
|
|
<div className="c-flex-grow c-flex-row c-flex">
|
|
<div className={cx("c-cursor-pointer c-flex-grow")}>
|
|
<div
|
|
className="c-flex c-flex-row"
|
|
onClick={() => {
|
|
if (input.ref) {
|
|
input.ref.click();
|
|
}
|
|
}}
|
|
>
|
|
{child}
|
|
</div>
|
|
<input
|
|
ref={(ref) => (input.ref = ref)}
|
|
type="file"
|
|
multiple
|
|
onChange={async (event: any) => {
|
|
let file = null;
|
|
try {
|
|
file = event.target.files[0];
|
|
} catch (ex) {}
|
|
const formData = new FormData();
|
|
formData.append("file", file);
|
|
const response = await fetch(url_upload, {
|
|
method: "POST",
|
|
body: formData,
|
|
});
|
|
|
|
if (response.ok) {
|
|
const contentType: any = response.headers.get("content-type");
|
|
let result;
|
|
if (contentType.includes("application/json")) {
|
|
result = await response.json();
|
|
} else if (contentType.includes("text/plain")) {
|
|
result = await response.text();
|
|
} else {
|
|
result = await response.blob();
|
|
}
|
|
if (Array.isArray(result)) {
|
|
const url: any = get(result, "[0]") || null;
|
|
await on_update(url);
|
|
} else {
|
|
alert("Error upload");
|
|
}
|
|
} else {
|
|
}
|
|
}}
|
|
className={
|
|
"c-absolute c-w-full c-h-full c-cursor-pointer c-top-0 c-left-0 c-hidden"
|
|
}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
const formatMoney = (res: number) => {
|
|
const formattedAmount = new Intl.NumberFormat("id-ID", {
|
|
minimumFractionDigits: 0,
|
|
}).format(res);
|
|
return formattedAmount;
|
|
};
|