Files
urupam/templates/index.html.ep

94 lines
3.2 KiB
Plaintext

% layout 'default';
% stash title => 'Urupam - URL Shortener';
<main class="page">
<h1>Urupam</h1>
<form id="shorten-form">
<div class="form-group">
<label for="url">Enter URL to shorten:</label>
<input type="url" id="url" name="url" placeholder="https://example.com" required>
</div>
<button type="submit" id="submit-btn">Shorten URL</button>
</form>
<div id="result" class="result"></div>
<script>
const form = document.getElementById('shorten-form');
const urlInput = document.getElementById('url');
const submitBtn = document.getElementById('submit-btn');
const resultDiv = document.getElementById('result');
form.addEventListener('submit', async (e) => {
e.preventDefault();
const url = urlInput.value.trim();
if (!url) {
showError('Please enter a URL');
return;
}
submitBtn.disabled = true;
submitBtn.textContent = 'Shortening...';
hideResult();
try {
const response = await fetch('/api/v1/urls', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: url })
});
const contentType = response.headers.get('content-type') || '';
let data = {};
if (contentType.includes('application/json')) {
data = await response.json();
} else {
const text = await response.text();
data = { error: text || 'Unexpected response' };
}
if (response.ok && data.success) {
showSuccess(data.short_url, data.original_url);
urlInput.value = '';
} else {
const message = data.error || `Request failed (${response.status})`;
showError(message);
}
} catch (error) {
showError('Network error: ' + error.message);
} finally {
submitBtn.disabled = false;
submitBtn.textContent = 'Shorten URL';
}
});
function showSuccess(shortUrl, originalUrl) {
resultDiv.className = 'result success show';
resultDiv.innerHTML = `
<strong>Short URL created:</strong>
<div class="short-url">
<a href="${shortUrl}" target="_blank">${shortUrl}</a>
</div>
`;
}
function showError(message) {
resultDiv.className = 'result error show';
resultDiv.innerHTML = `
<strong>Error:</strong>
<div class="error-message">${escapeHtml(message)}</div>
`;
}
function hideResult() {
resultDiv.className = 'result';
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
</script>
</main>