Files
BarangaySystem/resources/js/composables/useUserNotes.js
2026-06-06 18:43:00 +08:00

116 lines
3.7 KiB
JavaScript

import { ref, computed } from 'vue';
import axios from 'axios';
import { useUserStore } from '../stores/user';
/**
* Composable for managing current user's notes
*
* Backend endpoints:
* - GET /user/note/content - Get current user's notes
* - GET /user/note/dismiss - Clear (delete) current user's notes
*/
export function useUserNotes() {
const userStore = useUserStore();
const notes = computed(() => userStore.notes);
const loading = ref(false);
const error = ref(null);
/**
* Fetch the current user's notes from the backend
*/
const fetchNotes = async () => {
if (!axios) return;
// Guard: only fetch if the user is authenticated
if (!userStore.isLoggedIn) return;
loading.value = true;
error.value = null;
try {
const response = await axios.get('/user/note/content', {
headers: { 'X-Requested-With': 'XMLHttpRequest' }
});
// Validate response data - if it's HTML, we likely got redirected to login
const data = response.data;
if (typeof data === 'string' && (data.trim().startsWith('<html') || data.trim().startsWith('<!DOCTYPE'))) {
console.warn('Received HTML response for user notes, ignoring (session likely expired).');
// If it's HTML, we definitely don't want to display it as a note
userStore.setNotes('');
return;
}
if (data !== null && data !== false && data !== '') {
userStore.setNotes(data);
} else {
userStore.setNotes('');
}
} catch (err) {
console.error('Error fetching user notes:', err);
error.value = 'Failed to load notes.';
userStore.setNotes('');
} finally {
loading.value = false;
}
};
/**
* Clear/dismiss the current user's notes
*/
const dismissNotes = async () => {
if (!axios) return;
try {
const response = await axios.get('/user/note/dismiss', {
headers: { 'X-Requested-With': 'XMLHttpRequest' }
});
// Validate response - if it's HTML, the session is likely gone
const data = response.data;
if (typeof data === 'string' && (data.trim().startsWith('<html') || data.trim().startsWith('<!DOCTYPE'))) {
console.warn('Received HTML response for dismiss notes, clearing local notes anyway.');
// Clear local since we know something is wrong with the session
userStore.clearNotes();
return true; // Return true so the UI updates
}
if (data === true || (response.status >= 200 && response.status < 300)) {
userStore.clearNotes();
error.value = null;
return true;
}
return false;
} catch (err) {
console.error('Error dismissing user notes:', err);
error.value = 'Failed to dismiss notes.';
// Maybe clear local anyway if it fails?
userStore.clearNotes();
return true;
}
};
/**
* Check if notes exist
*/
const hasNotes = () => {
return !!notes.value && notes.value.length > 0;
};
/**
* Get the notes content
* @returns {string|null} The notes content or null if not loaded
*/
const getNotesContent = () => {
return notes.value;
};
return {
notes,
loading,
error,
fetchNotes,
dismissNotes,
hasNotes,
getNotesContent
};
}