/** * * Copyright 2023-2025 InspectorRAGet Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ 'use client'; import { useState, memo, useMemo } from 'react'; import { Button, Tag } from '@carbon/react'; import { Edit, TrashCan } from '@carbon/icons-react'; import { TaskComment, Model } from '@/src/types'; import EditCommentModal from '@/src/components/comments/EditCommentModal'; import classes from './CommentViewer.module.scss'; // =================================================================================== // TYPES // =================================================================================== interface Props { comments: TaskComment[]; onUpdate: Function; models: Map | undefined; } // =================================================================================== // RENDER FUNCTION // =================================================================================== function Comment({ id, comment, onEdit, onDelete, models, }: { id: string; comment: TaskComment; onEdit: Function; onDelete: Function; models: Map | undefined; }) { const [editing, setEditing] = useState(false); const [tag, tagType]: [string, string] = useMemo(() => { if (comment.provenance) { if (comment.provenance.component.includes('input')) { return ['Input', 'purple']; } else if (comment.provenance.component.includes('document_')) { return ['Contexts', 'cyan']; } else if ( comment.provenance.component.includes('::evaluation::response') ) { const modelId = comment.provenance.component.split('::')[0]; return [`${models?.get(modelId)?.name || modelId}`, 'green']; } else { return ['Generic', 'gray']; } } else { return ['Generic', 'gray']; } }, [comment.provenance, models]); return ( <> setEditing(false)} onSubmit={(updatedComment) => { // Step 1: Update comment onEdit(updatedComment); // Step 2: Close editing modal setEditing(false); }} models={models} />
Author {comment.author}
Provenance {tag}
Last updated {new Date(comment.updated).toLocaleDateString()}
{comment.comment}
); } // =================================================================================== // MAIN FUNCTION // =================================================================================== export default memo(function ViewComments({ comments, onUpdate, models, }: Props) { return (

Comments

{comments.map((comment, commentIdx) => { return ( onUpdate(comments.toSpliced(commentIdx, 1, updatedComment)) } onDelete={() => onUpdate(comments.toSpliced(commentIdx, 1))} models={models} /> ); })}
); });