File size: 2,178 Bytes
f3269f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
function UserMessage({ content }) {
  return (
    <div className="msg-row msg-row--user">
      <div className="bubble bubble--user">{content}</div>
      <div className="avatar avatar--user">You</div>
    </div>
  );
}

function ConfirmationMessage({ content, onConfirm, onDecline }) {
  return (
    <div className="msg-row msg-row--assistant">
      <div className="avatar avatar--bot">J</div>
      <div className="assistant-content">
        <div className="bubble bubble--assistant">{content}</div>
        {onConfirm && onDecline && (
          <div className="confirm-actions">
            <button className="confirm-btn confirm-btn--yes" onClick={onConfirm}>Yes</button>
            <button className="confirm-btn confirm-btn--no" onClick={onDecline}>No</button>
          </div>
        )}
      </div>
    </div>
  );
}

function AssistantMessage({ content, sources, error }) {
  const uniqueSources = sources ? [...new Set(sources.filter(Boolean))] : [];

  return (
    <div className="msg-row msg-row--assistant">
      <div className="avatar avatar--bot">J</div>
      <div className="assistant-content">
        <div className={`bubble bubble--assistant ${error ? 'bubble--error' : ''}`}>
          {content}
        </div>
        {uniqueSources.length > 0 && (
          <div className="sources">
            <span className="sources-label">Sources</span>
            <div className="sources-list">
              {uniqueSources.map((src, i) => (
                <span key={i} className="source-tag">
                  <span className="source-icon">📄</span>
                  {src}
                </span>
              ))}
            </div>
          </div>
        )}
      </div>
    </div>
  );
}

export default function ChatMessage({ message, onConfirm, onDecline }) {
  if (message.role === 'user') {
    return <UserMessage content={message.content} />;
  }
  if (message.type === 'confirmation') {
    return <ConfirmationMessage content={message.content} onConfirm={onConfirm} onDecline={onDecline} />;
  }
  return (
    <AssistantMessage
      content={message.content}
      sources={message.sources}
      error={message.error}
    />
  );
}