Skip to content

Commit 9b05137

Browse files
authored
Merge pull request #7 from Unity-Lab-AI/feature/UnityWebApp10.0Update3
UnityWebAppUpdate3(willthiswork?)
2 parents 3d326f4 + c060b33 commit 9b05137

File tree

3 files changed

+117
-16
lines changed

3 files changed

+117
-16
lines changed

Screensaver.js

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -288,22 +288,73 @@ async function copyImageToClipboard() {
288288
showError('No image to copy');
289289
return;
290290
}
291+
292+
const tempImage = new Image();
293+
tempImage.crossOrigin = 'anonymous';
291294

292-
// Fetch the image and create a clipboard item
293-
const response = await fetch(img.src);
294-
const blob = await response.blob();
295-
const data = [new ClipboardItem({ [blob.type]: blob })];
296-
await navigator.clipboard.write(data);
295+
await new Promise((resolve, reject) => {
296+
tempImage.onload = resolve;
297+
tempImage.onerror = reject;
298+
tempImage.src = img.src + '?t=' + new Date().getTime();
299+
});
300+
301+
const canvas = document.createElement('canvas');
302+
canvas.width = tempImage.naturalWidth;
303+
canvas.height = tempImage.naturalHeight;
304+
const ctx = canvas.getContext('2d');
305+
ctx.drawImage(tempImage, 0, 0);
306+
307+
try {
308+
const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png', 1.0));
309+
const clipboardItem = new ClipboardItem({ 'image/png': blob });
310+
await navigator.clipboard.write([clipboardItem]);
311+
312+
const reader = new FileReader();
313+
reader.onloadend = () => {
314+
const base64data = reader.result;
315+
try {
316+
localStorage.setItem('lastScreensaverImage', base64data);
317+
} catch (e) {
318+
console.warn('Failed to save to localStorage:', e);
319+
}
320+
};
321+
reader.readAsDataURL(blob);
322+
323+
const feedback = document.createElement('div');
324+
feedback.className = 'image-upload-feedback';
325+
feedback.textContent = 'Image copied! ✓';
326+
img.parentElement.appendChild(feedback);
327+
setTimeout(() => feedback.remove(), 2000);
328+
329+
} catch (clipboardError) {
330+
console.error('Clipboard write failed:', clipboardError);
331+
const link = document.createElement('a');
332+
const imgUrl = canvas.toDataURL('image/png');
333+
link.href = imgUrl;
334+
link.download = `screensaver-${Date.now()}.png`;
335+
document.body.appendChild(link);
336+
link.click();
337+
document.body.removeChild(link);
338+
339+
const feedback = document.createElement('div');
340+
feedback.className = 'image-upload-feedback';
341+
feedback.textContent = 'Clipboard failed - Image downloaded instead';
342+
img.parentElement.appendChild(feedback);
343+
setTimeout(() => feedback.remove(), 2000);
344+
}
345+
} catch (error) {
346+
console.error('Error copying image:', error);
347+
showError('Failed to copy image - CORS or network error');
297348

298-
// Show success feedback
299349
const feedback = document.createElement('div');
300350
feedback.className = 'image-upload-feedback';
301-
feedback.textContent = 'Image copied to clipboard! ✓';
302-
img.parentElement.appendChild(feedback);
303-
setTimeout(() => feedback.remove(), 2000);
304-
} catch (error) {
305-
console.error('Failed to copy image:', error);
306-
showError('Failed to copy image to clipboard');
351+
feedback.style.backgroundColor = '#ef4444';
352+
feedback.textContent = 'Failed to copy image';
353+
const img = document.getElementById('screensaver-image');
354+
if (img && img.parentElement) {
355+
img.parentElement.appendChild(feedback);
356+
setTimeout(() => feedback.remove(), 2000);
357+
}
307358
}
308359
}
309360

@@ -364,7 +415,9 @@ function buildScreensaverImageUrl(prompt) {
364415
nologo: 'true',
365416
model: modelSelect.value || 'unity',
366417
enhance: enhanceCheck.checked.toString(),
367-
private: privateCheck.checked.toString()
418+
private: privateCheck.checked.toString(),
419+
t: Date.now(),
420+
cors: 'true'
368421
});
369422

370423
return `https://image.pollinations.ai/prompt/${encodeURIComponent(prompt)}?${params.toString()}`;
@@ -574,7 +627,14 @@ function initializeScreensaver() {
574627

575628
const copyBtn = document.getElementById('screensaver-copy');
576629
if (copyBtn) {
577-
copyBtn.addEventListener('click', copyImageToClipboard);
630+
copyBtn.addEventListener('click', async () => {
631+
try {
632+
await copyImageToClipboard();
633+
} catch (error) {
634+
console.error('Failed to copy image:', error);
635+
showError('Failed to copy image');
636+
}
637+
});
578638
}
579639

580640
const downloadBtn = document.getElementById('screensaver-download');

git_gui_state.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"repo_url": "https://github.com/Unity-Lab-AI/Unity-Lab-AI.github.io.git", "repo_name": "unity.unityailab.com", "feature_branch": "feature/UnityWebApp10.0Update2"}
1+
{"repo_url": "https://github.com/Unity-Lab-AI/Unity-Lab-AI.github.io.git", "repo_name": "unity.unityailab.com", "feature_branch": "feature/UnityWebApp10.0Update3"}

index.html

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,47 @@
956956
padding-bottom: calc(15px + env(safe-area-inset-bottom));
957957
}
958958
}
959+
.image-upload-feedback {
960+
position: fixed;
961+
top: 50%;
962+
left: 50%;
963+
transform: translate(-50%, -50%);
964+
background: rgba(0, 0, 0, 0.8);
965+
color: white;
966+
padding: 15px 30px;
967+
border-radius: 8px;
968+
z-index: 10001;
969+
font-size: 16px;
970+
animation: fadeInOut 2s ease forwards;
971+
pointer-events: none;
972+
}
973+
974+
@keyframes fadeInOut {
975+
0% { opacity: 0; transform: translate(-50%, -40%); }
976+
15% { opacity: 1; transform: translate(-50%, -50%); }
977+
85% { opacity: 1; transform: translate(-50%, -50%); }
978+
100% { opacity: 0; transform: translate(-50%, -60%); }
979+
}
980+
981+
.error-popup {
982+
position: fixed;
983+
top: 20px;
984+
right: 20px;
985+
background: #ef4444;
986+
color: white;
987+
padding: 1rem;
988+
border-radius: 0.5rem;
989+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
990+
z-index: 10002;
991+
opacity: 0;
992+
transform: translateX(100%);
993+
transition: all 0.3s ease;
994+
}
995+
996+
.error-popup.show {
997+
opacity: 1;
998+
transform: translateX(0);
999+
}
9591000
</style>
9601001
</head>
9611002
<body>
@@ -1137,4 +1178,4 @@
11371178
</script>
11381179

11391180
</body>
1140-
</html>
1181+
</html>

0 commit comments

Comments
 (0)