| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- // ==================== Utility Functions ====================
- function showMessage(text, type = 'success') {
- const messageEl = document.getElementById('message');
- if (!messageEl) return;
- messageEl.textContent = text;
- messageEl.className = `message ${type}`;
- setTimeout(() => {
- messageEl.className = 'message hidden';
- }, 5000);
- }
- async function handleApiError(response) {
- if (response.status === 401) {
- // Unauthorized - redirect to login
- window.location.href = '/login';
- return true;
- }
- return false;
- }
- // ==================== Authentication Functions ====================
- async function handleLogin(event) {
- event.preventDefault();
- const form = event.target;
- const formData = new FormData(form);
- try {
- const response = await fetch('/api/auth/login', {
- method: 'POST',
- body: formData
- });
- const data = await response.json();
- if (response.ok && data.status === 'success') {
- showMessage('Login successful! Redirecting...', 'success');
- setTimeout(() => {
- window.location.href = '/';
- }, 1000);
- } else {
- showMessage(data.detail || 'Login failed', 'error');
- }
- } catch (error) {
- showMessage('Error logging in: ' + error.message, 'error');
- }
- }
- async function handleRegister(event) {
- event.preventDefault();
- const form = event.target;
- const formData = new FormData(form);
- try {
- const response = await fetch('/api/auth/register', {
- method: 'POST',
- body: formData
- });
- const data = await response.json();
- if (response.ok && data.status === 'success') {
- showMessage('Account created successfully! Redirecting...', 'success');
- setTimeout(() => {
- window.location.href = '/';
- }, 1000);
- } else {
- showMessage(data.detail || 'Registration failed', 'error');
- }
- } catch (error) {
- showMessage('Error creating account: ' + error.message, 'error');
- }
- }
- async function logout() {
- try {
- const response = await fetch('/api/auth/logout', {
- method: 'POST'
- });
- const data = await response.json();
- if (data.status === 'success') {
- window.location.href = '/';
- }
- } catch (error) {
- console.error('Logout error:', error);
- window.location.href = '/';
- }
- }
- // ==================== Dashboard Functions ====================
- async function syncLibrary() {
- showMessage('Syncing with Audiobookshelf...', 'success');
- try {
- const response = await fetch('/api/sync');
- if (await handleApiError(response)) return;
- const data = await response.json();
- if (data.status === 'success') {
- showMessage(data.message, 'success');
- setTimeout(() => window.location.reload(), 1500);
- } else {
- showMessage(data.message || 'Sync failed', 'error');
- }
- } catch (error) {
- showMessage('Error syncing with Audiobookshelf: ' + error.message, 'error');
- }
- }
- async function generateRecommendations() {
- showMessage('Generating AI recommendations...', 'success');
- try {
- const response = await fetch('/api/recommendations/generate');
- if (await handleApiError(response)) return;
- const data = await response.json();
- if (data.status === 'success') {
- showMessage(`Generated ${data.count} new recommendations!`, 'success');
- setTimeout(() => window.location.reload(), 1500);
- } else {
- showMessage(data.message || 'Failed to generate recommendations', 'error');
- }
- } catch (error) {
- showMessage('Error generating recommendations: ' + error.message, 'error');
- }
- }
|