194 lines
4.9 KiB
JavaScript
194 lines
4.9 KiB
JavaScript
import { ref } from "vue";
|
|
|
|
export const useNotifications = () => {
|
|
const isLoading = ref(false);
|
|
const notifications = ref([]);
|
|
const pagination = ref(null);
|
|
const error = ref(null);
|
|
|
|
// Fetch notifications list
|
|
const fetchNotifications = async (options = {}) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const queryParams = new URLSearchParams();
|
|
|
|
console.log("Query Params:", queryParams);
|
|
|
|
// Add query parameters
|
|
if (options.page) queryParams.append("page", options.page);
|
|
if (options.limit) queryParams.append("limit", options.limit);
|
|
if (options.status) queryParams.append("status", options.status);
|
|
if (options.priority) queryParams.append("priority", options.priority);
|
|
if (options.category) queryParams.append("category", options.category);
|
|
if (options.search) queryParams.append("search", options.search);
|
|
if (options.sortBy) queryParams.append("sortBy", options.sortBy);
|
|
if (options.sortOrder) queryParams.append("sortOrder", options.sortOrder);
|
|
|
|
const url = `/api/notifications/list${
|
|
queryParams.toString() ? "?" + queryParams.toString() : ""
|
|
}`;
|
|
|
|
const { data } = await $fetch(url);
|
|
|
|
notifications.value = data.notifications;
|
|
pagination.value = data.pagination;
|
|
|
|
return data;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to fetch notifications";
|
|
throw err;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Delete notification
|
|
const deleteNotification = async (notificationId) => {
|
|
try {
|
|
const response = await $fetch(`/api/notifications/${notificationId}`, {
|
|
method: "DELETE",
|
|
});
|
|
|
|
// Remove from local state
|
|
notifications.value = notifications.value.filter(
|
|
(n) => n.id !== notificationId
|
|
);
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to delete notification";
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
// Get notification by ID
|
|
const getNotificationById = async (notificationId) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
console.log("Notification ID:", notificationId);
|
|
|
|
try {
|
|
const response = await $fetch(`/api/notifications/${notificationId}`);
|
|
return response.data;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to fetch notification";
|
|
throw err;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Create notification
|
|
const createNotification = async (notificationData) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications", {
|
|
method: "POST",
|
|
body: notificationData,
|
|
});
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to create notification";
|
|
throw err;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Update notification
|
|
const updateNotification = async (notificationId, notificationData) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch(`/api/notifications/${notificationId}`, {
|
|
method: "PUT",
|
|
body: notificationData,
|
|
});
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to update notification";
|
|
throw err;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Save draft
|
|
const saveDraft = async (draftData) => {
|
|
try {
|
|
const response = await $fetch("/api/notifications/draft", {
|
|
method: "POST",
|
|
body: draftData,
|
|
});
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to save draft";
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
// Test send notification
|
|
const testSendNotification = async (testData) => {
|
|
try {
|
|
const response = await $fetch("/api/notifications/test-send", {
|
|
method: "POST",
|
|
body: testData,
|
|
});
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to send test notification";
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
// Get audience preview
|
|
const getAudiencePreview = async (audienceData) => {
|
|
try {
|
|
const response = await $fetch("/api/notifications/audience-preview", {
|
|
method: "POST",
|
|
body: audienceData,
|
|
});
|
|
|
|
return response;
|
|
} catch (err) {
|
|
error.value =
|
|
err.data?.message || err.message || "Failed to get audience preview";
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
return {
|
|
// State
|
|
isLoading,
|
|
notifications,
|
|
pagination,
|
|
error,
|
|
|
|
// Actions
|
|
fetchNotifications,
|
|
deleteNotification,
|
|
getNotificationById,
|
|
createNotification,
|
|
updateNotification,
|
|
saveDraft,
|
|
testSendNotification,
|
|
getAudiencePreview,
|
|
};
|
|
};
|