import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { Logger } from '../../utils/Log'; import { BubbleErrorCode, IActiveConfRoom, IBubble, IBubblesState } from './types'; import { RootState } from '..'; import { bubblesService } from '../../services/bubbles'; import { BubbleParticipants } from '../../services/bubbles/BubbleParticipantsServices'; import { IContact } from '../contacts/types'; const logger = new Logger('bubblesSlice'); const initialState: IBubblesState = { loading: false, bubbles: [], myBubbles: [], bubblesMembers: [], activeConferenceRoom: { hasActiveConference: false, bubbleId: '', bubble: undefined, conversation: undefined }, bubbleParticipants: [], } const bubblesSlice = createSlice({ name: 'bubbles', initialState, reducers: { getBubbles(state) { bubblesService.getBubbles(); state.loading = true; }, getBubblesResultActionCreator(state, action: PayloadAction) { state.loading = false; state.bubbles = action.payload; }, getMyBubblesResult(state, action: PayloadAction) { state.loading = false; state.myBubbles = action.payload; }, getPendingBubbleInvitations(state) { bubblesService.getInvitedBubbles(); }, acceptBubbleInvitation(state, action: PayloadAction) { const bubbleId = action.payload; bubblesService.acceptBubbleInvitation(bubbleId); }, declineBubbleInvitation(state, action: PayloadAction) { const bubbleId = action.payload; bubblesService.declineBubbleInvitation(bubbleId); }, leaveBubble(state, action: PayloadAction) { const bubbleId = action.payload; state.loading = true; bubblesService.leaveBubble(bubbleId); }, archiveBubble(state, action: PayloadAction) { const bubbleId = action.payload; state.loading = true; bubblesService.archiveBubble(bubbleId); }, deleteBubble(state, action: PayloadAction) { const bubbleId = action.payload; bubblesService.deleteBubble(bubbleId); }, getBubbleOrganizer(state, action: PayloadAction) { const bubbleId = action.payload; BubbleParticipants.getBubbleOrganizer(bubbleId); }, getBubbleMembers(state, action: PayloadAction) { const bubbleId = action.payload; BubbleParticipants.getBubbleMembers(bubbleId); }, setBubbleMembersResult(state, action: PayloadAction) { state.bubblesMembers = action.payload }, getBubbleParticipants(state, action: PayloadAction) { const bubbleId = action.payload; BubbleParticipants.getBubbleParticipants(bubbleId); }, setBubbleParticipantsResult(state, action: PayloadAction) { state.bubbleParticipants = action.payload; }, addParticipants(state, action: PayloadAction<{ bubbleId: string; contactsJid: string[] }>) { BubbleParticipants.addParticipants(action.payload.bubbleId, action.payload.contactsJid); }, createBubble(state, action: PayloadAction<{ name: string, topic: string }>) { state.loading = true; bubblesService.createBubble(action.payload.name, action.payload.topic); }, createBubbleResult(state, action: PayloadAction) { state.loading = false; state.errorCode = action.payload; }, createBubbleWithParticipants(state, action: PayloadAction<{ name: string, topic: string, participantsId: string[] }>) { state.loading = true; bubblesService.createBubbleWithParticipants(action.payload.name, action.payload.topic, action.payload.participantsId); }, updateBubbleInfo(state, action: PayloadAction<{ bubbleId: string, name: string, topic: string }>) { bubblesService.updateBubbleInfo(action.payload.bubbleId, action.payload.name, action.payload.topic); }, modifyBubbleImage(state, action: PayloadAction<{ bubbleId: string, imageUrl: string }>) { state.loading = true; bubblesService.updateBubblePhoto(action.payload.bubbleId, action.payload.imageUrl); }, modifyBubblePhotoResult(state) { state.loading = false; }, getPendingBubbleInvitation(state) { bubblesService.getPendingBubbleInvitation(); }, sendBubbleChatByEmail(state, action: PayloadAction) { bubblesService.sendBubbleChatByEmail(action.payload); }, setActiveConferenceRoom(state, action: PayloadAction) { state.activeConferenceRoom = action.payload }, checkIfBubbleHasActiveConference(state, action: PayloadAction) { bubblesService.checkIfBubbleHasActiveConference(action.payload); }, removeContactFromBubble(state, action: PayloadAction<{ bubbleId: string, contactJid: string }>) { BubbleParticipants.removeContactFromBubble(action.payload.bubbleId, action.payload.contactJid); }, giveOwnerShip(state, action: PayloadAction<{ bubbleId: string, contactJid: string }>) { BubbleParticipants.giveOwnerShip(action.payload.bubbleId, action.payload.contactJid); }, promoteBubbleParticipant(state, action: PayloadAction<{ bubbleId: string, contactJid: string }>) { BubbleParticipants.promoteContactFromBubble(action.payload.bubbleId, action.payload.contactJid); }, demoteBubbleParticipant(state, action: PayloadAction<{ bubbleId: string, contactJid: string }>) { BubbleParticipants.demoteContactFromBubble(action.payload.bubbleId, action.payload.contactJid); }, getBubbleById(state, action: PayloadAction) { bubblesService.getBubbleById(action.payload); }, hangupParticipant(state, action: PayloadAction<{ bubbleId: string, contactJid: string }>) { BubbleParticipants.hangupParticipantFromConference(action.payload.bubbleId, action.payload.contactJid); }, } }); export const loadingBubbles = (state: RootState) => state.bubbles.loading; export const { getBubbles, getBubblesResultActionCreator, getMyBubblesResult, getPendingBubbleInvitations, acceptBubbleInvitation, declineBubbleInvitation, archiveBubble, deleteBubble, leaveBubble, getBubbleOrganizer, getBubbleMembers, setBubbleMembersResult, getBubbleParticipants, setBubbleParticipantsResult, addParticipants, createBubble, createBubbleResult, createBubbleWithParticipants, updateBubbleInfo, modifyBubbleImage, modifyBubblePhotoResult, getPendingBubbleInvitation, sendBubbleChatByEmail, setActiveConferenceRoom, checkIfBubbleHasActiveConference, removeContactFromBubble, giveOwnerShip, promoteBubbleParticipant, demoteBubbleParticipant, getBubbleById, hangupParticipant } = bubblesSlice.actions; export default bubblesSlice.reducer;