Spaces:
Sleeping
Sleeping
import { create } from 'zustand'; | |
import type { SpaceInfo } from '@/service/space'; | |
import { | |
getAllSpaces, | |
createSpace, | |
getSpaceDetail, | |
startSpace, | |
deleteSpace as deleteSpaceApi | |
} from '@/service/space'; | |
interface ISpaceStore { | |
spaces: SpaceInfo[]; | |
currentSpace: SpaceInfo | null; | |
loading: boolean; | |
error: string | null; | |
// Actions | |
fetchAllSpaces: () => Promise<void>; | |
fetchSpaceById: (space_id: string) => Promise<SpaceInfo | null>; | |
addSpace: (spaceData: { | |
title: string; | |
objective: string; | |
host: string; | |
participants: string[]; | |
participants_info?: { | |
url: string; | |
role_description?: string; | |
}[]; | |
}) => Promise<SpaceInfo | null>; | |
startSpace: (space_id: string) => Promise<SpaceInfo | null>; | |
deleteSpace: (space_id: string) => Promise<boolean>; | |
updateSpaceStatus: (space_id: string, status: number) => void; | |
setCurrentSpace: (space: SpaceInfo | null) => void; | |
clearError: () => void; | |
} | |
export const useSpaceStore = create<ISpaceStore>((set, get) => ({ | |
spaces: [], | |
currentSpace: null, | |
loading: false, | |
error: null, | |
fetchAllSpaces: async () => { | |
set({ loading: true, error: null }); | |
try { | |
const response = await getAllSpaces(); | |
console.log('API Response:', response); | |
if (response.data.code === 0) { | |
set({ spaces: response.data.data, loading: false }); | |
} else { | |
console.error('API Error:', response.data); | |
set({ error: response.data.message || 'Failed to fetch spaces', loading: false }); | |
} | |
} catch (error) { | |
console.error('Fetch Error:', error); | |
set({ error: 'An error occurred while fetching spaces', loading: false }); | |
} | |
}, | |
fetchSpaceById: async (space_id: string) => { | |
set({ loading: true, error: null }); | |
try { | |
const response = await getSpaceDetail(space_id); | |
console.log('Space Detail API Response:', response); | |
if (response.data.code === 0) { | |
const spaceData = response.data.data; | |
set({ currentSpace: spaceData, loading: false }); | |
return spaceData; | |
} | |
console.error('API Error:', response.data); | |
set({ error: response.data.message || 'Failed to fetch space', loading: false }); | |
return null; | |
} catch (error) { | |
console.error('Fetch Error:', error); | |
set({ error: 'An error occurred while fetching space details', loading: false }); | |
return null; | |
} | |
}, | |
addSpace: async (spaceData) => { | |
set({ loading: true, error: null }); | |
try { | |
const response = await createSpace(spaceData); | |
console.log('API Response:', response); | |
if (response.data.code === 0) { | |
const newSpace = response.data.data; | |
set((state) => ({ | |
spaces: [newSpace, ...state.spaces], | |
currentSpace: newSpace, | |
loading: false | |
})); | |
return newSpace; | |
} | |
console.error('API Error:', response.data); | |
set({ error: response.data.message || 'Failed to create space', loading: false }); | |
return null; | |
} catch (error) { | |
console.error('Fetch Error:', error); | |
set({ error: 'An error occurred while creating the space', loading: false }); | |
return null; | |
} | |
}, | |
startSpace: async (space_id: string) => { | |
set({ loading: true, error: null }); | |
try { | |
const response = await startSpace(space_id); | |
console.log('Start Space API Response:', response); | |
if (response.data.code === 0) { | |
const updatedSpace = response.data.data; | |
set((state) => ({ | |
spaces: state.spaces.map((space) => | |
space.id === updatedSpace.id ? updatedSpace : space | |
), | |
currentSpace: | |
state.currentSpace?.id === updatedSpace.id ? updatedSpace : state.currentSpace, | |
loading: false | |
})); | |
return updatedSpace; | |
} | |
console.error('API Error:', response.data); | |
set({ error: response.data.message || 'Failed to start space', loading: false }); | |
return null; | |
} catch (error) { | |
console.error('Fetch Error:', error); | |
set({ error: 'An error occurred while starting the space', loading: false }); | |
return null; | |
} | |
}, | |
updateSpaceStatus: (space_id, status) => { | |
const spaces = get().spaces; | |
const newSpaces = spaces.map((space) => { | |
if (space.id === space_id) { | |
return { ...space, status }; | |
} | |
return space; | |
}); | |
set({ spaces: newSpaces }); | |
}, | |
deleteSpace: async (space_id: string) => { | |
set({ loading: true, error: null }); | |
try { | |
const response = await deleteSpaceApi(space_id); | |
if (response.data.code === 0) { | |
set((state) => ({ | |
spaces: state.spaces.filter((space) => space.id !== space_id), | |
loading: false | |
})); | |
return true; | |
} | |
set({ error: response.data.message || 'Failed to delete space', loading: false }); | |
return false; | |
} catch (error) { | |
console.error('Delete Error:', error); | |
set({ error: 'An error occurred while deleting the space', loading: false }); | |
return false; | |
} | |
}, | |
setCurrentSpace: (space) => set({ currentSpace: space }), | |
clearError: () => set({ error: null }) | |
})); | |