import React, { useState } from 'react' import AvatarImage from './AvatarImage.jsx' import Avatar from './Avatar.jsx' export default function RecordList({ title, records, apiConfig, showTitle = true, user = null, agent = null, onRecordDeleted = null }) { const [expandedRecords, setExpandedRecords] = useState(new Set()) const [deletingRecords, setDeletingRecords] = useState(new Set()) const toggleJsonView = (index) => { const newExpanded = new Set(expandedRecords) if (newExpanded.has(index)) { newExpanded.delete(index) } else { newExpanded.add(index) } setExpandedRecords(newExpanded) } const handleDelete = async (record, index) => { if (!user || !agent || !record.uri) return const confirmed = window.confirm('このレコードを削除しますか?') if (!confirmed) return setDeletingRecords(prev => new Set([...prev, index])) try { // Extract repo, collection, rkey from URI const uriParts = record.uri.split('/') const repo = uriParts[2] const collection = uriParts[3] const rkey = uriParts[4] await agent.com.atproto.repo.deleteRecord({ repo: repo, collection: collection, rkey: rkey }) if (onRecordDeleted) { onRecordDeleted() } } catch (error) { alert(`削除に失敗しました: ${error.message}`) } finally { setDeletingRecords(prev => { const newSet = new Set(prev) newSet.delete(index) return newSet }) } } const canDelete = (record) => { return user && agent && record.uri && record.value.author?.did === user.did } if (!records || records.length === 0) { return ( {showTitle && {title} (0)} レコードがありません ) } return ( {showTitle && {title} ({records.length})} {records.map((record, i) => ( {record.value.author?.displayName || record.value.author?.handle} @{record.value.author?.handle} {new Date(record.value.createdAt).toLocaleString()} toggleJsonView(i)} className={`btn btn-sm ${expandedRecords.has(i) ? 'btn-outline' : 'btn-primary'}`} title="Show/Hide JSON" > {expandedRecords.has(i) ? 'hide' : 'json'} {canDelete(record) && ( handleDelete(record, i)} disabled={deletingRecords.has(i)} className="btn btn-danger btn-sm" title="Delete Record" > {deletingRecords.has(i) ? 'deleting...' : 'delete'} )} {expandedRecords.has(i) && ( json data {JSON.stringify(record, null, 2)} )} {record.value.text || record.value.content} {record.value.post?.url && ( {record.value.post.url} )} ))} ) }
レコードがありません
{JSON.stringify(record, null, 2)}