93 lines
3.2 KiB
Plaintext
93 lines
3.2 KiB
Plaintext
% layout 'default';
|
|
% stash title => 'Urupam';
|
|
<main class="page">
|
|
<form id="shorten-form">
|
|
<div class="form-group">
|
|
<input type="url" id="url" name="url" placeholder="https://example.com" required aria-label="URL to shorten">
|
|
</div>
|
|
<button type="submit" id="submit-btn">Shorten URL</button>
|
|
</form>
|
|
<div id="result" class="result"></div>
|
|
<div class="brand-mark">urupam</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>
|