(name: K, options: UseSocketSubscribeListOptions<K, T> = {})
| 157 | } |
| 158 | const defaultFilter = () => true; |
| 159 | export function useSocketSubscribeList< |
| 160 | K extends keyof SubscribeEventMap = keyof SubscribeEventMap, |
| 161 | T = SubscribeEventData<K>, |
| 162 | >(name: K, options: UseSocketSubscribeListOptions<K, T> = {}): T[] { |
| 163 | const { filter = defaultFilter } = options; |
| 164 | const { subscribe } = useSocket(); |
| 165 | const isLogined = useIsLogined(); |
| 166 | const [list, push] = useReducer( |
| 167 | (state: T[], data: T) => [...state, data], |
| 168 | [] as T[] |
| 169 | ); |
| 170 | |
| 171 | const cb = useEvent((_data) => { |
| 172 | if (filter(_data)) { |
| 173 | push(_data); |
| 174 | } |
| 175 | }); |
| 176 | |
| 177 | useEffect(() => { |
| 178 | if (!isLogined) { |
| 179 | console.warn('Skip socket subscribe login because of not login'); |
| 180 | return; |
| 181 | } |
| 182 | |
| 183 | const unsubscribe = subscribe(name, cb); |
| 184 | |
| 185 | return () => { |
| 186 | unsubscribe(); |
| 187 | }; |
| 188 | }, [name]); |
| 189 | |
| 190 | return list; |
| 191 | } |
no test coverage detected