import { defineStore } from 'pinia' import { TemplateId } from './constant' import { useUserStore } from './user' import { mainURL, liveStreamURL } from '@/env' import { fetchRomms, fetchRoomMiniCode, fetchLeaderRoomMiniCode, insertRoom, updateRoom, deleteRoom, fetchRoomScenes } from '@/api' import { Room as SRoom, Scenes } from '@/api' export type { RoomScene } from '@/api' export type Rooms = Room[] export type Room = SRoom & { miniCode?: string leaderMiniCode?: string scenes: Scenes } export interface ShareLinkType { num: string name?: string roomId: number role?: string lang?: string avatar?: string userId?: string } export const createRoom = (room: Partial): Room => { const user = useUserStore().current return { id: TemplateId, leaderName: user.nickname.substring(0, 15), title: '', time: new Date().toDateString(), viewCount: 0, desc: '', cover: '', scenes: [], ...room } } export const useRoomStore = defineStore('room', { state: () => ({ list: [] as Rooms, shareLink: '' }), getters: { getNums: () => >(room: T) => room.scenes.map(scene => scene.num), getShareUrl: () => (param: ShareLinkType) => { const search = new URLSearchParams() search.set('m', `${param.num}`) search.set('role', `${param.role || 'leader'}`) param.name && search.set('name', `${param.name}`) search.set('roomId', `roomId_${param.roomId}`) param.avatar && search.set('avatar', param.avatar) param.lang && search.set('set', param.lang) param.userId && search.set('vruserId', `user_${param.userId}`) search.set('isTour', '0') return liveStreamURL + '?' + search.toString() }, filter: state => (keyowrd: string) => state.list.filter(room => room.title.includes(keyowrd)) }, actions: { async fetchList() { const srooms = await fetchRomms() this.list = srooms.map(room => ({ ...room, scenes: [] })) }, async delete(room: Room) { await deleteRoom(room) const index = this.list.indexOf(room) if (~index) { this.list.splice(index, 1) } }, async update(room: Room) { await updateRoom(room, this.getNums(room)) await this.fetchList() }, async insert(room: Omit) { await insertRoom(room, this.getNums(room)) // const sroom = // this.list.push({ ...room, ...sroom }) this.fetchList() }, async setRoomScenes(room: Room) { const scenes = await fetchRoomScenes(room.id) room.scenes = scenes }, async setRoomMiniCode(room: Room) { const code = room.miniCode || (await fetchRoomMiniCode(room)) room.miniCode = code }, async setLeaderRoomMiniCode(room: Room) { const code = room.leaderMiniCode || (await fetchLeaderRoomMiniCode(room)) room.leaderMiniCode = code }, setShareLink(param: ShareLinkType) { const search = new URLSearchParams() search.set('m', `${param.num}`) search.set('role', `${param.role || 'leader'}`) param.name && search.set('name', `${param.name}`) search.set('roomId', `${param.roomId}`) param.lang && search.set('set', param.lang) this.shareLink = liveStreamURL + search.toString() } } })