/* 작성자 : 박지윤 작성일 : 2025-02-25 수정자 : 수정일 : 설명 : 프로젝트 목록 */ import { defineStore } from 'pinia'; import { ref, watch } from 'vue'; import $api from '@api'; import { useUserInfoStore } from '@/stores/useUserInfoStore'; import { useAuthStore } from '@/stores/useAuthStore'; export const useProjectStore = defineStore('project', () => { const projectList = ref([]); // 모든 프로젝트 (종료된 프로젝트 포함) const activeProjectList = ref([]); // 진행 중인 프로젝트만 (종료된 프로젝트 제외) const memberProjectList = ref([]); // 사용자가 속한 프로젝트 const activeMemberProjectList = ref([]); // 사용자가 속한 진행 중인 프로젝트 const selectedProject = ref(null); const userStore = useUserInfoStore(); const authStore = useAuthStore(); // 전체 프로젝트 가져오기 (종료된 프로젝트 포함 여부에 따라 다른 배열에 저장) const getProjectList = async (searchText = '', selectedYear = '', excludeEnded = 'false') => { if (!userStore.user) return; const res = await $api.get('project/select', { params: { searchKeyword: searchText || '', category: selectedYear || '', excludeEnded: excludeEnded }, }); if (excludeEnded === 'true') { // 종료되지 않은 프로젝트만 저장 activeProjectList.value = res.data.data.projectList; } else { // 모든 프로젝트 저장 (종료된 프로젝트 포함) projectList.value = res.data.data.projectList; } }; // 모든 프로젝트 목록 로드 (종료 여부 구분하여 모두 로드) const loadAllProjectLists = async (searchText = '', selectedYear = '') => { // 진행 중인 프로젝트 로드 await getProjectList(searchText, selectedYear, 'true'); // 모든 프로젝트 로드 (종료된 프로젝트 포함) await getProjectList(searchText, selectedYear, 'false'); }; // 사용자가 속한 프로젝트 목록 가져오기 const getMemberProjects = async () => { if (!userStore.user) return; // 로그인한 사용자 확인 const res = await $api.get(`project/${userStore.user.id}`); const allMemberProjects = res.data.data; memberProjectList.value = allMemberProjects; // 사용자가 속한 프로젝트 중 진행 중인 프로젝트만 필터링 activeMemberProjectList.value = allMemberProjects.filter(project => !project.ENDYN || project.ENDYN === 'N' ); if (activeMemberProjectList.value.length > 0 && !selectedProject.value) { setSelectedProject(activeMemberProjectList.value[0]); } }; const setSelectedProject = (project) => { selectedProject.value = project ? { ...project } : null; if (project) { localStorage.setItem('selectedProject', JSON.stringify(project)); } else { localStorage.removeItem('selectedProject'); } }; const getSelectedProject = () => { if (!selectedProject.value) { const storedProject = localStorage.getItem('selectedProject'); if (storedProject) { selectedProject.value = JSON.parse(storedProject); } } return selectedProject.value; }; // 프로젝트 리스트가 변경될 때 자동으로 반응 watch(activeProjectList, (newList) => { // 선택된 프로젝트가 없고 목록이 있는 경우 if (!selectedProject.value && newList.length > 0) { // 사용자가 속한 프로젝트가 있는지 먼저 확인 if (activeMemberProjectList.value.length > 0) { setSelectedProject(activeMemberProjectList.value[0]); } else { setSelectedProject(newList[0]); } } }); watch(activeMemberProjectList, (newList) => { if (newList.length > 0) { // 현재 선택된 프로젝트가 없는 경우 첫 번째 항목 선택 if (!selectedProject.value) { setSelectedProject(newList[0]); } else { // 선택된 프로젝트가 있는 경우 목록에 있는지 확인 const exists = newList.some(project => project.PROJCTSEQ === selectedProject.value.PROJCTSEQ); if (!exists) { setSelectedProject(newList[0]); } } } }); return { projectList, // 종료된 프로젝트 포함한 모든 프로젝트 activeProjectList, // 진행 중인 프로젝트만 memberProjectList, // 사용자가 속한 모든 프로젝트 activeMemberProjectList, // 사용자가 속한 진행 중인 프로젝트 selectedProject, getProjectList, loadAllProjectLists, // 모든 프로젝트 목록 한번에 로드 getMemberProjects, setSelectedProject, getSelectedProject, }; });