Result Page Integration (Epic 2)
Technical implementation details for displaying QR codes on the result page in Epic 2.
This document describes how the result page is enhanced in Epic 2 to display and download QR codes alongside audio content.
See Text-to-Speech Submission API for the base Epic 1 implementation.
Overview
Epic 2 extends the result page to include QR code generation, display, and download functionality. The QR code is generated server-side during audio creation and displayed alongside the audio player.
What Changed from Epic 1
Epic 1 Result Page:
- Audio player
- Shareable link
- Copy link button
Epic 2 Result Page (Additions):
- 🆕 [NEW] QR code preview
- 🆕 [NEW] Download QR code button
- 🆕 [NEW] QR code usage guide
- 🆕 [NEW] QR code specifications display
Data Structure
Generation Entity (Epic 2)
Fields:
| Field | Type | Description |
|---|---|---|
id | string | UUID identifier |
text | string | User input text |
slug | string | Unique URL-safe slug |
voiceId | string | Selected voice ID |
clientId | string | Client identifier |
audioUrl | string | S3 URL of audio file |
qrCodeUrl | string | null | 🆕 [NEW] S3 URL of QR code image (Epic 2) |
status | string | "completed", "processing", or "failed" |
characterCount | number | Number of characters |
processingTime | number | Generation time in milliseconds |
createdAt | string | ISO 8601 timestamp |
createdBy | object | User info (userId, userName) |
Epic 2 Addition:
qrCodeUrlfield contains S3 URL to QR code PNG imagenullin Epic 1, populated in Epic 2
Example Response (Epic 2)
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"text": "Welcome to MicDots!",
"slug": "welcome-micdots-1706882400123",
"voiceId": "rachel-voice-id-123",
"clientId": "client-abc-123",
"audioUrl": "https://s3.amazonaws.com/micdots-audio/welcome-micdots-1706882400123.mp3",
"qrCodeUrl": "https://s3.amazonaws.com/micdots-qr/welcome-micdots-1706882400123.png",
"status": "completed",
"characterCount": 20,
"processingTime": 7850,
"createdAt": "2024-01-22T14:30:00Z",
"createdBy": {
"userId": "user-id-456",
"userName": "John Doe"
}
},
"links": {
"share": "https://micdots.com/play/welcome-micdots-1706882400123",
"audio": "https://s3.amazonaws.com/micdots-audio/welcome-micdots-1706882400123.mp3",
"qrCode": "https://s3.amazonaws.com/micdots-qr/welcome-micdots-1706882400123.png"
}
}
QR Code Card Component
UI Structure
The QR code card displays:
- NEW Badge - Indicates this is a new Epic 2 feature
- QR Code Preview - 200x200px image on white background
- Download Button - Downloads the QR code as PNG
- Format Info - "500x500px PNG • Print ready • Scannable"
Styling (CSS/SCSS)
.qr-code-card {
background: #242938;
border: 2px solid #f093fb; // Pink gradient border
border-radius: 16px;
padding: 32px;
position: relative;
.new-badge {
position: absolute;
top: 16px;
right: 16px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
padding: 4px 12px;
border-radius: 12px;
font-size: 11px;
font-weight: 600;
color: #ffffff;
}
.qr-preview {
background: #ffffff;
border-radius: 12px;
padding: 24px;
margin-bottom: 20px;
display: flex;
align-items: center;
justify-content: center;
aspect-ratio: 1 / 1;
img {
max-width: 200px;
max-height: 200px;
border-radius: 8px;
}
}
.download-button {
width: 100%;
height: 48px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
border: none;
border-radius: 8px;
color: #ffffff;
font-size: 16px;
font-weight: 600;
cursor: pointer;
margin-bottom: 12px;
transition: transform 0.2s;
&:hover:not(:disabled) {
transform: translateY(-2px);
}
&:disabled {
opacity: 0.6;
cursor: not-allowed;
}
}
.format-info {
font-size: 13px;
color: #a0a8c0;
text-align: center;
margin: 0;
}
}
QR Usage Guide Component
The QR Usage Guide displays three use cases:
-
🖨️ Print & Display
- Add to menus, posters, business cards, or product packaging
-
📱 Scan to Play
- Anyone can scan with their phone camera to hear the message
-
📧 Digital Sharing
- Include in emails, PDFs, presentations, or social media
API Integration
Fetching Result Data
The result page fetches generation data from the backend API.
Endpoint: GET /api/v1/text-to-speech/{id}
Headers:
Authorization: Bearer {access-token}
Content-Type: application/json
Response: See the "Example Response (Epic 2)" section above for the complete JSON response structure.
QR Code Download Functionality
The download button allows users to save the QR code image to their device.
Download Behavior:
- Fetches QR code image from S3 URL
- Triggers browser download
- Filename format:
micdots-qr-{slug}.png - Falls back to opening in new tab if download fails
Error Handling
QR Code Loading Error
If the QR code image fails to load:
- Display error message: "⚠️ Failed to load QR code. Please refresh the page."
- Provide "Refresh Page" button
- Log error to console for debugging
Download Error Handling
If QR code download fails:
- Show error notification: "Failed to download QR code. Please try again."
- Allow user to retry download
- Log error details for debugging
Responsive Design
Layout Behavior
The result page adapts to different screen sizes:
Desktop (≥ 1024px): 3-column grid Tablet (768px - 1023px): 2-column grid (QR card spans both columns) Mobile (< 768px): Single column stack
Responsive Styles
.content-grid {
display: grid;
gap: 24px;
// Desktop: 3 columns
@media (min-width: 1024px) {
grid-template-columns: repeat(3, 1fr);
}
// Tablet: 2 columns
@media (min-width: 768px) and (max-width: 1023px) {
grid-template-columns: repeat(2, 1fr);
// QR card spans both columns
.qr-code-card {
grid-column: span 2;
max-width: 400px;
margin: 0 auto;
}
}
// Mobile: 1 column (stack)
@media (max-width: 767px) {
grid-template-columns: 1fr;
}
}
Performance Optimization
Lazy Loading QR Code
The QR code image uses browser native lazy loading:
loading="lazy"attribute prevents loading until image is near viewportdecoding="async"allows async image decoding- Explicit width/height (200x200) prevents layout shift
Preloading QR Code (Optional)
Optionally preload QR code image when result data is fetched to improve perceived performance.
Analytics Tracking
Track QR Code Downloads
Track QR code downloads for analytics:
Success Event: "QR Code Downloaded"
generationId: UUID of the generationslug: URL slugtimestamp: ISO 8601 timestamp
Failure Event: "QR Code Download Failed"
generationId: UUID of the generationerror: Error message
Testing
Manual Testing
Test the QR code display and download functionality:
-
QR Code Display
- Verify QR code image renders correctly
- Check image has correct src attribute
- Verify 200x200px dimensions
-
Download Functionality
- Click "Download QR Code" button
- Verify button shows "Downloading..." state
- Confirm file downloads with correct name:
micdots-qr-{slug}.png - Verify downloaded file is valid PNG image
-
Error Handling
- Test with invalid QR code URL
- Verify error message displays
- Confirm "Refresh Page" button works
Security Considerations
Validate QR Code URL
Validate QR code URLs to prevent security issues:
Validation Rules:
- Must be a valid URL format
- Must be from allowed S3 bucket:
s3.amazonaws.com/micdots-qr/ - Must start with
https:// - Reject invalid or suspicious URLs
Error Handling:
- Log validation errors to console
- Display error state to user
- Do not render invalid URLs
Related Documentation
- Text-to-Speech Submission API - Base Epic 1 implementation
- QR Tiger API Integration - QR code generation details
- QR Generation Research - Technology decision
- Result Page UI - UI/UX design
- Epic 2 Overview - Feature overview