Clean up presigned URL implementation: remove dead fields, fix error handling

- Remove unused image_url from upload response and TS type
- Remove bare except in serve_image that masked config errors as 404s
- Add error state and broken-image placeholder in QuestionBubble

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 08:49:01 -04:00
parent 167d014ca5
commit 30db71d134
3 changed files with 17 additions and 13 deletions

View File

@@ -125,7 +125,7 @@ class ConversationService {
async uploadImage(
file: File,
conversationId: string,
): Promise<{ image_key: string; image_url: string }> {
): Promise<{ image_key: string }> {
const formData = new FormData();
formData.append("file", file);
formData.append("conversation_id", conversationId);

View File

@@ -9,10 +9,17 @@ type QuestionBubbleProps = {
export const QuestionBubble = ({ text, image_key }: QuestionBubbleProps) => {
const [imageUrl, setImageUrl] = useState<string | null>(null);
const [imageError, setImageError] = useState(false);
useEffect(() => {
if (!image_key) return;
conversationService.getPresignedImageUrl(image_key).then(setImageUrl).catch(() => {});
conversationService
.getPresignedImageUrl(image_key)
.then(setImageUrl)
.catch((err) => {
console.error("Failed to load image:", err);
setImageError(true);
});
}, [image_key]);
return (
@@ -25,6 +32,12 @@ export const QuestionBubble = ({ text, image_key }: QuestionBubbleProps) => {
"shadow-sm shadow-leaf/10",
)}
>
{imageError && (
<div className="flex items-center gap-2 text-xs text-charcoal/50 bg-charcoal/5 rounded-xl px-3 py-2 mb-2">
<span>🖼</span>
<span>Image failed to load</span>
</div>
)}
{imageUrl && (
<img
src={imageUrl}