diff --git a/src/pages/ChatMain/ChatLongAnswer/ParsedValueView.vue b/src/pages/ChatMain/ChatLongAnswer/ParsedValueView.vue index 1fd5cd4..11e498b 100644 --- a/src/pages/ChatMain/ChatLongAnswer/ParsedValueView.vue +++ b/src/pages/ChatMain/ChatLongAnswer/ParsedValueView.vue @@ -4,6 +4,17 @@ {{ entry.value }} + + + + {{ entry.value.caption }} + + { return value !== null && typeof value === "object" && !Array.isArray(value); }; -const sanitizeValue = (value) => { - if (isArrayValue(value)) { - return value.map((item) => sanitizeValue(item)); +const parseJsonStringValue = (value) => { + if (typeof value !== "string") return value; + + const text = value.trim(); + if (!/^[\[{]/.test(text)) return value; + + try { + return JSON.parse(text); + } catch (e) { + return value; } - if (isObjectValue(value)) { - return Object.keys(value).reduce((result, key) => { +}; + +const sanitizeValue = (value) => { + const parsedValue = parseJsonStringValue(value); + + if (isArrayValue(parsedValue)) { + return parsedValue.map((item) => sanitizeValue(item)); + } + if (isObjectValue(parsedValue)) { + return Object.keys(parsedValue).reduce((result, key) => { if (IGNORED_FIELD_KEYS.includes(key)) return result; - result[key] = sanitizeValue(value[key]); + result[key] = sanitizeValue(parsedValue[key]); return result; }, {}); } - return value; + return parsedValue; }; const hasDisplayValue = (value) => { @@ -79,10 +105,27 @@ const formatLeafValue = (value) => { return String(value); }; +const isImageValue = (value) => { + return isObjectValue(value) && hasDisplayValue(value.image_id); +}; + +const createImageEntry = (key, value) => ({ + key, + type: "image", + value: { + image_id: formatLeafValue(value.image_id).trim(), + caption: hasDisplayValue(value.caption) ? formatLeafValue(value.caption) : "", + }, +}); + const renderFieldEntries = computed(() => { if (isIgnoredField.value || !hasDisplayValue(props.value)) return []; const value = sanitizeValue(props.value); + if (isImageValue(value)) { + return [createImageEntry(props.fieldKey, value)]; + } + if (isArrayValue(value)) { return [{ key: props.fieldKey, @@ -96,6 +139,9 @@ const renderFieldEntries = computed(() => { .filter((key) => hasDisplayValue(value[key])) .map((key) => { const entryValue = value[key]; + if (isImageValue(entryValue)) { + return createImageEntry(key, entryValue); + } if (isArrayValue(entryValue)) { return { key, @@ -120,6 +166,14 @@ const renderFieldEntries = computed(() => { const isIgnoredField = computed(() => IGNORED_FIELD_KEYS.includes(props.fieldKey)); const shouldRenderField = computed(() => renderFieldEntries.value.length > 0); + +const handlePreviewClick = (imageUrl) => { + uni.previewImage({ + current: imageUrl, + urls: [imageUrl], + }); +}; +