feat: hlasenie pod polom s URL obrazka (zmensene / v poriadku / za prihlasenim)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6100a7af57
commit
48fd82a77d
3 files changed
+48
-13
No files matched your search
@@ -49,19 +49,31 @@ export const ImageUploadInput: React.FC<ImageUploadInputProps> = ({
|
||||
|
||||
// Vložená URL: príliš veľký obrázok sa zmenší a uloží k nám (posledná spracovaná adresa, aby sa nerobilo dvakrát)
|
||||
const lastCheckedUrl = useRef('');
|
||||
const [urlNote, setUrlNote] = useState<{ tone: 'ok' | 'warn'; text: string } | null>(null);
|
||||
const checkUrl = async (url: string) => {
|
||||
url = url.trim();
|
||||
if (!url || url === lastCheckedUrl.current) return;
|
||||
lastCheckedUrl.current = url;
|
||||
setIsUploading(true);
|
||||
setUrlNote(null);
|
||||
try {
|
||||
const smaller = await shrinkRemoteImage(url);
|
||||
if (smaller) {
|
||||
lastCheckedUrl.current = smaller;
|
||||
onChange(smaller);
|
||||
const result = await shrinkRemoteImage(url);
|
||||
if (result.status === 'shrunk') {
|
||||
lastCheckedUrl.current = result.url;
|
||||
onChange(result.url);
|
||||
setUrlNote({ tone: 'ok', text: 'Obrázok bol väčší ako 1000 px – zmenšili sme ho a uložili k nám.' });
|
||||
} else if (result.status === 'small') {
|
||||
setUrlNote({ tone: 'ok', text: 'Obrázok je v poriadku (najviac 1000 px), adresa ostáva.' });
|
||||
} else if (result.status === 'login') {
|
||||
setUrlNote({
|
||||
tone: 'warn',
|
||||
text: 'Obrázok je za prihlásením – v e-maile sa nezobrazí. Otvorte ho v prehliadači, pravým klikom „Kopírovať obrázok“ a sem vložte Ctrl+V.'
|
||||
});
|
||||
} else if (result.status === 'failed') {
|
||||
setUrlNote({ tone: 'warn', text: `Obrázok sa nepodarilo stiahnuť (${result.error}). Skontrolujte adresu, prípadne obrázok skopírujte a vložte Ctrl+V.` });
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('Obrázok z URL sa nepodarilo zmenšiť:', err);
|
||||
setUrlNote({ tone: 'warn', text: `Obrázok sa nepodarilo spracovať: ${(err as Error).message}` });
|
||||
} finally {
|
||||
setIsUploading(false);
|
||||
}
|
||||
@@ -104,7 +116,13 @@ export const ImageUploadInput: React.FC<ImageUploadInputProps> = ({
|
||||
<input
|
||||
type="text"
|
||||
value={value || ''}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
onChange={(e) => {
|
||||
setUrlNote(null);
|
||||
onChange(e.target.value);
|
||||
}}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') checkUrl(e.currentTarget.value);
|
||||
}}
|
||||
onPaste={handlePaste}
|
||||
onBlur={(e) => checkUrl(e.target.value)}
|
||||
placeholder={placeholder}
|
||||
@@ -140,6 +158,12 @@ export const ImageUploadInput: React.FC<ImageUploadInputProps> = ({
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{urlNote && (
|
||||
<p className={`text-[10px] leading-snug ${urlNote.tone === 'warn' ? 'text-amber-700 bg-amber-50 border border-amber-200 rounded-md px-2 py-1' : 'text-emerald-700'}`}>
|
||||
{urlNote.text}
|
||||
</p>
|
||||
)}
|
||||
|
||||
{onAltChange && (
|
||||
<input
|
||||
type="text"
|
||||
|
||||
Reference in new issue
Block a user