room.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { defineStore } from 'pinia'
  2. import { TemplateId } from './constant'
  3. import { useUserStore } from './user'
  4. import { mainURL, liveStreamURL } from '@/env'
  5. import {
  6. fetchRomms,
  7. fetchRoomMiniCode,
  8. fetchLeaderRoomMiniCode,
  9. insertRoom,
  10. updateRoom,
  11. deleteRoom,
  12. fetchRoomScenes
  13. } from '@/api'
  14. import { Room as SRoom, Scenes } from '@/api'
  15. export type { RoomScene } from '@/api'
  16. export type Rooms = Room[]
  17. export type Room = SRoom & {
  18. miniCode?: string
  19. leaderMiniCode?: string
  20. scenes: Scenes
  21. }
  22. export interface ShareLinkType {
  23. num: string
  24. name?: string
  25. roomId: number
  26. role?: string
  27. lang?: string
  28. avatar?: string
  29. userId?: string
  30. }
  31. export const createRoom = (room: Partial<Room>): Room => {
  32. const user = useUserStore().current
  33. return {
  34. id: TemplateId,
  35. leaderName: user.nickname.substring(0, 15),
  36. title: '',
  37. time: new Date().toDateString(),
  38. viewCount: 0,
  39. desc: '',
  40. cover: '',
  41. scenes: [],
  42. ...room
  43. }
  44. }
  45. export const useRoomStore = defineStore('room', {
  46. state: () => ({
  47. list: [] as Rooms,
  48. shareLink: ''
  49. }),
  50. getters: {
  51. getNums:
  52. () =>
  53. <T extends Pick<Room, 'scenes'>>(room: T) =>
  54. room.scenes.map(scene => scene.num),
  55. getShareUrl: () => (param: ShareLinkType) => {
  56. const search = new URLSearchParams()
  57. search.set('m', `${param.num}`)
  58. search.set('role', `${param.role || 'leader'}`)
  59. param.name && search.set('name', `${param.name}`)
  60. search.set('roomId', `roomId_${param.roomId}`)
  61. param.avatar && search.set('avatar', param.avatar)
  62. param.lang && search.set('set', param.lang)
  63. param.userId && search.set('vruserId', `user_${param.userId}`)
  64. search.set('isTour', '0')
  65. return liveStreamURL + '?' + search.toString()
  66. },
  67. filter: state => (keyowrd: string) =>
  68. state.list.filter(room => room.title.includes(keyowrd))
  69. },
  70. actions: {
  71. async fetchList() {
  72. const srooms = await fetchRomms()
  73. this.list = srooms.map(room => ({ ...room, scenes: [] }))
  74. },
  75. async delete(room: Room) {
  76. await deleteRoom(room)
  77. const index = this.list.indexOf(room)
  78. if (~index) {
  79. this.list.splice(index, 1)
  80. }
  81. },
  82. async update(room: Room) {
  83. await updateRoom(room, this.getNums(room))
  84. await this.fetchList()
  85. },
  86. async insert(room: Omit<Room, 'id'>) {
  87. await insertRoom(room, this.getNums(room))
  88. // const sroom =
  89. // this.list.push({ ...room, ...sroom })
  90. this.fetchList()
  91. },
  92. async setRoomScenes(room: Room) {
  93. const scenes = await fetchRoomScenes(room.id)
  94. room.scenes = scenes
  95. },
  96. async setRoomMiniCode(room: Room) {
  97. const code = room.miniCode || (await fetchRoomMiniCode(room))
  98. room.miniCode = code
  99. },
  100. async setLeaderRoomMiniCode(room: Room) {
  101. const code = room.leaderMiniCode || (await fetchLeaderRoomMiniCode(room))
  102. room.leaderMiniCode = code
  103. },
  104. setShareLink(param: ShareLinkType) {
  105. const search = new URLSearchParams()
  106. search.set('m', `${param.num}`)
  107. search.set('role', `${param.role || 'leader'}`)
  108. param.name && search.set('name', `${param.name}`)
  109. search.set('roomId', `${param.roomId}`)
  110. param.lang && search.set('set', param.lang)
  111. this.shareLink = liveStreamURL + search.toString()
  112. }
  113. }
  114. })