initial: bootstrap from BukidBountyApp base
This commit is contained in:
130
resources/js/composables/useAnnouncements.js
Normal file
130
resources/js/composables/useAnnouncements.js
Normal file
@@ -0,0 +1,130 @@
|
||||
import { ref } from 'vue';
|
||||
import axios from 'axios';
|
||||
|
||||
/**
|
||||
* Composable for managing global announcements
|
||||
*/
|
||||
export function useAnnouncements() {
|
||||
const announcements = ref([]);
|
||||
const loading = ref(false);
|
||||
const error = ref(null);
|
||||
|
||||
/**
|
||||
* Fetch the latest active announcements for users
|
||||
*/
|
||||
const fetchLatest = async () => {
|
||||
loading.value = true;
|
||||
error.value = null;
|
||||
try {
|
||||
const response = await axios.get('/Announcements/Latest');
|
||||
announcements.value = response.data || [];
|
||||
} catch (err) {
|
||||
console.error('Error fetching announcements:', err);
|
||||
error.value = 'Failed to load announcements.';
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* List all announcements (for admin management)
|
||||
*/
|
||||
const fetchAllAdmin = async () => {
|
||||
loading.value = true;
|
||||
error.value = null;
|
||||
try {
|
||||
const response = await axios.post('/Admin/Announcements/List');
|
||||
return response.data || [];
|
||||
} catch (err) {
|
||||
console.error('Error fetching admin announcements:', err);
|
||||
error.value = 'Failed to fetch admin announcements.';
|
||||
return [];
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Store a new announcement
|
||||
*/
|
||||
const storeAnnouncement = async (data) => {
|
||||
try {
|
||||
const response = await axios.post('/Admin/Announcement/Store', data);
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.error('Error storing announcement:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Update an announcement
|
||||
*/
|
||||
const updateAnnouncement = async (data) => {
|
||||
try {
|
||||
const response = await axios.post('/Admin/Announcement/Update', data);
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.error('Error updating announcement:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete an announcement
|
||||
*/
|
||||
const deleteAnnouncement = async (target) => {
|
||||
try {
|
||||
const response = await axios.post('/Admin/Announcement/Delete', { target });
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.error('Error deleting announcement:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggle active status of an announcement
|
||||
*/
|
||||
const toggleStatus = async (target) => {
|
||||
try {
|
||||
const response = await axios.post('/Admin/Announcement/ToggleStatus', { target });
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.error('Error toggling status:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Upload an announcement photo
|
||||
*/
|
||||
const uploadPhoto = async (file) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
try {
|
||||
const response = await axios.post('/File/Upload/announcement', formData, {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.error('Error uploading photo:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
announcements,
|
||||
loading,
|
||||
error,
|
||||
fetchLatest,
|
||||
fetchAllAdmin,
|
||||
storeAnnouncement,
|
||||
updateAnnouncement,
|
||||
deleteAnnouncement,
|
||||
toggleStatus,
|
||||
uploadPhoto
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user