'use client'; import React, { useCallback, useState } from 'react'; import useImageUpload from '../../lib/hooks/useImageUpload'; import { cn, fetcher } from '@/lib/utils'; import { SignedPayload, MessageBase, ChatEntity } from '@/lib/types'; import { useRouter } from 'next/navigation'; import Loading from '../ui/Loading'; import toast from 'react-hot-toast'; import { generateVideoThumbnails, getVideoCover, } from '@rajesh896/video-thumbnails-generator'; export interface ImageSelectorProps {} type Example = { url: string; initMessages: MessageBase[]; }; const ImageSelector: React.FC = () => { const router = useRouter(); const [isUploading, setUploading] = useState(false); const upload = useCallback(async (file: File, chatId?: string) => { const { id, signedUrl, publicUrl, fields } = await fetcher( '/api/sign', { method: 'POST', body: JSON.stringify({ id: chatId, fileType: file.type, fileName: file.name, }), }, ); const formData = new FormData(); Object.entries(fields).forEach(([key, value]) => { formData.append(key, value as string); }); formData.append('file', file); const uploadResponse = await fetch(signedUrl, { method: 'POST', body: formData, }); if (!uploadResponse.ok) { toast.error(uploadResponse.statusText); return; } return { id, publicUrl, }; }, []); 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 file = files[0]; const resp = await upload(file); if (!resp) { return; } if (file.type === 'video/mp4') { const thumbnails = await generateVideoThumbnails(file, 1, 'file'); fetch(thumbnails[0]) .then(res => res.blob()) .then(blob => { const thumbnailFile = new File( [blob], file.name.replace('.mp4', '.png').replace('.MP4', '.png'), { type: 'image/png', }, ); return upload(thumbnailFile, resp.id); }); } await fetcher('/api/upload', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ id: resp.id, url: resp.publicUrl, }), }); setUploading(false); router.push(`/chat/${resp.id}`); }; }, ); return (
{isUploading ? ( ) : ( 'Start using Vision Agent by selecting an image' )}
); }; export default ImageSelector;