Spaces:
Sleeping
Sleeping
File size: 1,848 Bytes
d0a1b70 38448fc c3e8f3d 38448fc d0a1b70 38448fc c3e8f3d d0a1b70 c3e8f3d d0a1b70 38448fc 26c4b30 38448fc 26c4b30 38448fc 26c4b30 f80b091 38448fc f80b091 c3e8f3d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
'use client';
import React, { useState } from 'react';
import useImageUpload from '../../lib/hooks/useImageUpload';
import { cn, fetcher } from '@/lib/utils';
import { ChatEntity, MessageBase } from '@/lib/types';
import { useRouter } from 'next/navigation';
import Loading from '../ui/Loading';
export interface ImageSelectorProps {}
type Example = {
url: string;
initMessages: MessageBase[];
};
const ImageSelector: React.FC<ImageSelectorProps> = () => {
const router = useRouter();
const [isUploading, setUploading] = useState(false);
const { getRootProps, getInputProps, isDragActive } = useImageUpload(
undefined,
async files => {
const formData = new FormData();
if (files.length !== 1) {
throw new Error('Only one image can be uploaded at a time');
}
setUploading(true);
const reader = new FileReader();
reader.readAsDataURL(files[0]);
reader.onload = async () => {
const resp = await fetcher<ChatEntity>('/api/upload', {
method: 'POST',
body: JSON.stringify({
base64: reader.result as string,
fileType: files[0].type,
}),
});
setUploading(false);
if (resp) {
router.push(`/chat/${resp.id}`);
}
};
},
);
return (
<div
{...getRootProps()}
className={cn(
'dropzone border-2 border-dashed border-gray-400 w-full h-64 flex items-center justify-center rounded-lg mt-4 cursor-pointer',
isDragActive && 'bg-gray-500/50 border-solid',
)}
>
<input {...getInputProps()} />
<p className="text-gray-400 text-lg">
{isUploading ? (
<Loading />
) : (
'Drag or drop image here, or click to select images'
)}
</p>
</div>
);
};
export default ImageSelector;
|