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;