refactor: organize frontend by feature
Some checks failed
Backend CI/CD / build_and_deploy (push) Has been cancelled
Frontend CI/CD / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 01:05:50 -04:00
parent b6eb692c27
commit 121757546a
60 changed files with 107 additions and 183 deletions

View File

@@ -0,0 +1,89 @@
import { computed, ref, watch } from 'vue';
import { defineStore } from 'pinia';
import { useAuthStore } from '@/features/auth/stores/authStore.js';
import { useWorkspaceStore } from '@/features/workspaces/stores/workspaceStore.js';
import { useClient } from '@/plugins/api.js';
export const useNotificationsStore = defineStore('notifications', () => {
const authStore = useAuthStore();
const workspaceStore = useWorkspaceStore();
const client = useClient();
const items = ref([]);
const isLoading = ref(false);
const error = ref(null);
const unreadCount = computed(() =>
items.value.filter(item => !item.readAt).length
);
const recentItems = computed(() => items.value.slice(0, 6));
function reset() {
items.value = [];
error.value = null;
}
async function fetchNotifications() {
if (!authStore.isAuthenticated || !workspaceStore.activeWorkspaceId) {
reset();
return;
}
isLoading.value = true;
error.value = null;
try {
const response = await client.get('/api/notifications', {
params: {
workspaceId: workspaceStore.activeWorkspaceId,
},
});
items.value = response.data ?? [];
} catch (fetchError) {
console.error('Failed to fetch notifications:', fetchError);
items.value = [];
error.value = 'Failed to load notifications.';
} finally {
isLoading.value = false;
}
}
async function markAsRead(notificationId) {
try {
await client.post(`/api/notifications/${notificationId}/read`);
items.value = items.value.map(item =>
item.id === notificationId
? { ...item, readAt: item.readAt ?? new Date().toISOString() }
: item
);
} catch (markError) {
console.error('Failed to mark notification as read:', markError);
}
}
watch(
() => [authStore.isAuthenticated, workspaceStore.activeWorkspaceId],
async ([isAuthenticated, workspaceId]) => {
if (!isAuthenticated || !workspaceId) {
reset();
return;
}
await fetchNotifications();
},
{ immediate: true }
);
return {
items,
recentItems,
unreadCount,
isLoading,
error,
reset,
fetchNotifications,
markAsRead,
};
});