File size: 5,992 Bytes
f5ed9bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* eslint-disable @next/next/no-img-element */
import { Dialog, Transition } from '@headlessui/react';
import { Document } from '@langchain/core/documents';
import { Fragment, useState } from 'react';

const MessageSources = ({ sources }: { sources: Document[] }) => {
  const [isDialogOpen, setIsDialogOpen] = useState(false);

  const closeModal = () => {
    setIsDialogOpen(false);
    document.body.classList.remove('overflow-hidden-scrollable');
  };

  const openModal = () => {
    setIsDialogOpen(true);
    document.body.classList.add('overflow-hidden-scrollable');
  };

  return (
    <div className="grid grid-cols-2 lg:grid-cols-4 gap-2">

      {sources.slice(0, 3).map((source, i) => (

        <a

          className="bg-[#111111] hover:bg-[#1c1c1c] transition duration-200 rounded-lg p-3 flex flex-col space-y-2 font-medium"

          key={i}

          href={source.metadata.url}

          target="_blank"

        >

          <p className="text-white text-xs overflow-hidden whitespace-nowrap text-ellipsis">

            {source.metadata.title}

          </p>

          <div className="flex flex-row items-center justify-between">

            <div className="flex flex-row items-center space-x-1">

              <img

                src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`}

                width={16}

                height={16}

                alt="favicon"

                className="rounded-lg h-4 w-4"

              />

              <p className="text-xs text-white/50 overflow-hidden whitespace-nowrap text-ellipsis">

                {source.metadata.url.replace(/.+\/\/|www.|\..+/g, '')}

              </p>

            </div>

            <div className="flex flex-row items-center space-x-1 text-white/50 text-xs">

              <div className="bg-white/50 h-[4px] w-[4px] rounded-full" />

              <span>{i + 1}</span>

            </div>

          </div>

        </a>

      ))}

      {sources.length > 3 && (

        <button

          onClick={openModal}

          className="bg-[#111111] hover:bg-[#1c1c1c] transition duration-200 rounded-lg px-4 py-2 flex flex-col justify-between space-y-2"

        >

          <div className="flex flex-row items-center space-x-1">

            {sources.slice(3, 6).map((source, i) => (

              <img

                src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`}

                width={16}

                height={16}

                alt="favicon"

                className="rounded-lg h-4 w-4"

                key={i}

              />

            ))}

          </div>

          <p className="text-xs text-white/50">

            View {sources.length - 3} more

          </p>

        </button>

      )}

      <Transition appear show={isDialogOpen} as={Fragment}>

        <Dialog as="div" className="relative z-50" onClose={closeModal}>

          <div className="fixed inset-0 overflow-y-auto">

            <div className="flex min-h-full items-center justify-center p-4 text-center">

              <Transition.Child

                as={Fragment}

                enter="ease-out duration-200"

                enterFrom="opacity-0 scale-95"

                enterTo="opacity-100 scale-100"

                leave="ease-in duration-100"

                leaveFrom="opacity-100 scale-200"

                leaveTo="opacity-0 scale-95"

              >

                <Dialog.Panel className="w-full max-w-md transform rounded-2xl bg-[#111111] border border-[#1c1c1c] p-6 text-left align-middle shadow-xl transition-all">

                  <Dialog.Title className="text-lg font-medium leading-6 text-white">

                    Sources

                  </Dialog.Title>

                  <div className="grid grid-cols-2 gap-2 overflow-auto max-h-[300px] mt-2 pr-2">

                    {sources.map((source, i) => (

                      <a

                        className="bg-[#111111] hover:bg-[#1c1c1c] border border-[#1c1c1c] transition duration-200 rounded-lg p-3 flex flex-col space-y-2 font-medium"

                        key={i}

                        href={source.metadata.url}

                        target="_blank"

                      >

                        <p className="text-white text-xs overflow-hidden whitespace-nowrap text-ellipsis">

                          {source.metadata.title}

                        </p>

                        <div className="flex flex-row items-center justify-between">

                          <div className="flex flex-row items-center space-x-1">

                            <img

                              src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`}

                              width={16}

                              height={16}

                              alt="favicon"

                              className="rounded-lg h-4 w-4"

                            />

                            <p className="text-xs text-white/50 overflow-hidden whitespace-nowrap text-ellipsis">

                              {source.metadata.url.replace(

                                /.+\/\/|www.|\..+/g,

                                '',

                              )}

                            </p>

                          </div>

                          <div className="flex flex-row items-center space-x-1 text-white/50 text-xs">

                            <div className="bg-white/50 h-[4px] w-[4px] rounded-full" />

                            <span>{i + 1}</span>

                          </div>

                        </div>

                      </a>

                    ))}

                  </div>

                </Dialog.Panel>

              </Transition.Child>

            </div>

          </div>

        </Dialog>

      </Transition>

    </div>
  );
};

export default MessageSources;