app.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // ==================== Utility Functions ====================
  2. function showMessage(text, type = 'success') {
  3. const messageEl = document.getElementById('message');
  4. if (!messageEl) return;
  5. messageEl.textContent = text;
  6. messageEl.className = `message ${type}`;
  7. setTimeout(() => {
  8. messageEl.className = 'message hidden';
  9. }, 5000);
  10. }
  11. async function handleApiError(response) {
  12. if (response.status === 401) {
  13. // Unauthorized - redirect to login
  14. window.location.href = '/login';
  15. return true;
  16. }
  17. return false;
  18. }
  19. // ==================== Authentication Functions ====================
  20. async function handleLogin(event) {
  21. event.preventDefault();
  22. const form = event.target;
  23. const formData = new FormData(form);
  24. try {
  25. const response = await fetch('/api/auth/login', {
  26. method: 'POST',
  27. body: formData
  28. });
  29. const data = await response.json();
  30. if (response.ok && data.status === 'success') {
  31. showMessage('Login successful! Redirecting...', 'success');
  32. setTimeout(() => {
  33. window.location.href = '/';
  34. }, 1000);
  35. } else {
  36. showMessage(data.detail || 'Login failed', 'error');
  37. }
  38. } catch (error) {
  39. showMessage('Error logging in: ' + error.message, 'error');
  40. }
  41. }
  42. async function handleRegister(event) {
  43. event.preventDefault();
  44. const form = event.target;
  45. const formData = new FormData(form);
  46. try {
  47. const response = await fetch('/api/auth/register', {
  48. method: 'POST',
  49. body: formData
  50. });
  51. const data = await response.json();
  52. if (response.ok && data.status === 'success') {
  53. showMessage('Account created successfully! Redirecting...', 'success');
  54. setTimeout(() => {
  55. window.location.href = '/';
  56. }, 1000);
  57. } else {
  58. showMessage(data.detail || 'Registration failed', 'error');
  59. }
  60. } catch (error) {
  61. showMessage('Error creating account: ' + error.message, 'error');
  62. }
  63. }
  64. async function logout() {
  65. try {
  66. const response = await fetch('/api/auth/logout', {
  67. method: 'POST'
  68. });
  69. const data = await response.json();
  70. if (data.status === 'success') {
  71. window.location.href = '/';
  72. }
  73. } catch (error) {
  74. console.error('Logout error:', error);
  75. window.location.href = '/';
  76. }
  77. }
  78. // ==================== Dashboard Functions ====================
  79. async function syncLibrary() {
  80. showMessage('Syncing with Audiobookshelf...', 'success');
  81. try {
  82. const response = await fetch('/api/sync');
  83. if (await handleApiError(response)) return;
  84. const data = await response.json();
  85. if (data.status === 'success') {
  86. showMessage(data.message, 'success');
  87. setTimeout(() => window.location.reload(), 1500);
  88. } else {
  89. showMessage(data.message || 'Sync failed', 'error');
  90. }
  91. } catch (error) {
  92. showMessage('Error syncing with Audiobookshelf: ' + error.message, 'error');
  93. }
  94. }
  95. async function generateRecommendations() {
  96. showMessage('Generating AI recommendations...', 'success');
  97. try {
  98. const response = await fetch('/api/recommendations/generate');
  99. if (await handleApiError(response)) return;
  100. const data = await response.json();
  101. if (data.status === 'success') {
  102. showMessage(`Generated ${data.count} new recommendations!`, 'success');
  103. setTimeout(() => window.location.reload(), 1500);
  104. } else {
  105. showMessage(data.message || 'Failed to generate recommendations', 'error');
  106. }
  107. } catch (error) {
  108. showMessage('Error generating recommendations: ' + error.message, 'error');
  109. }
  110. }