diff --git a/src/services/laconicService.ts b/src/services/laconicService.ts index 84438e6..a5d95ff 100644 --- a/src/services/laconicService.ts +++ b/src/services/laconicService.ts @@ -164,7 +164,10 @@ export async function getAnimalRecordsBySeiAddress(seiAddress: string): Promise< } // Transform the response into our AnimalRecordResult format - const records = (data.data?.queryRecords || []).map((record: any) => { + console.log(`Received ${data.data?.queryRecords?.length || 0} records from GraphQL`); + + // First, convert the records to our format + const mappedRecords = (data.data?.queryRecords || []).map((record: any) => { // Convert attributes to a map const attributesMap = record.attributes.reduce((acc: any, attr: any) => { acc[attr.key] = attr.value.string || attr.value.int || attr.value.float; @@ -198,7 +201,21 @@ export async function getAnimalRecordsBySeiAddress(seiAddress: string): Promise< seiAddress: attributesMap.seiAddress || seiAddress, timestamp: record.createTime || new Date().toISOString() }; - }).filter((record: AnimalRecordResult) => record.imageUrl && record.imageUrl.trim() !== ''); + }); + + // Filter valid records and remove duplicates by using the record ID + const uniqueRecordMap = new Map(); + + mappedRecords + .filter((record: AnimalRecordResult) => record.imageUrl && record.imageUrl.trim() !== '') + .forEach((record: AnimalRecordResult) => { + // Only add if this ID isn't already in our map + if (!uniqueRecordMap.has(record.id)) { + uniqueRecordMap.set(record.id, record); + } + }); + + const records = Array.from(uniqueRecordMap.values()); // Sort by timestamp descending (newest first) return records.sort((a, b) => { @@ -264,7 +281,10 @@ export async function getAllAnimalRecords(): Promise { } // Transform the response into our AnimalRecordResult format - const records = (data.data?.queryRecords || []).map((record: any) => { + console.log(`Received ${data.data?.queryRecords?.length || 0} records from GraphQL for all records`); + + // First, convert the records to our format + const mappedRecords = (data.data?.queryRecords || []).map((record: any) => { // Convert attributes to a map const attributesMap = record.attributes.reduce((acc: any, attr: any) => { acc[attr.key] = attr.value.string || attr.value.int || attr.value.float; @@ -298,7 +318,21 @@ export async function getAllAnimalRecords(): Promise { seiAddress: attributesMap.seiAddress || '', timestamp: record.createTime || new Date().toISOString() }; - }).filter((record: AnimalRecordResult) => record.imageUrl && record.imageUrl.trim() !== ''); + }); + + // Filter valid records and remove duplicates by using the record ID + const uniqueRecordMap = new Map(); + + mappedRecords + .filter((record: AnimalRecordResult) => record.imageUrl && record.imageUrl.trim() !== '') + .forEach((record: AnimalRecordResult) => { + // Only add if this ID isn't already in our map + if (!uniqueRecordMap.has(record.id)) { + uniqueRecordMap.set(record.id, record); + } + }); + + const records = Array.from(uniqueRecordMap.values()); // Sort by timestamp descending (newest first) return records.sort((a, b) => {