mirror of https://github.com/msgbyte/tailchat
feat: add livekit meeting context and
parent
7e239ead86
commit
c937178956
@ -0,0 +1,28 @@
|
||||
import React, { PropsWithChildren, useContext, useMemo } from 'react';
|
||||
import {
|
||||
MeetingState,
|
||||
MeetingStateStoreType,
|
||||
createMeetingStateStore,
|
||||
} from '../store/meeting';
|
||||
import { useStore } from 'zustand';
|
||||
|
||||
const MeetingContext = React.createContext<MeetingStateStoreType>(null);
|
||||
|
||||
export const MeetingContextProvider: React.FC<PropsWithChildren> = React.memo(
|
||||
(props) => {
|
||||
const store = useMemo(() => createMeetingStateStore(), []);
|
||||
|
||||
return (
|
||||
<MeetingContext.Provider value={store}>
|
||||
{props.children}
|
||||
</MeetingContext.Provider>
|
||||
);
|
||||
}
|
||||
);
|
||||
MeetingContextProvider.displayName = 'MeetingContextProvider';
|
||||
|
||||
export function useMeetingContextState<T>(selector: (s: MeetingState) => T) {
|
||||
const context = useContext(MeetingContext);
|
||||
|
||||
return useStore(context, selector);
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
import { createStore } from 'zustand';
|
||||
import { immer } from 'zustand/middleware/immer';
|
||||
|
||||
export interface MeetingState {
|
||||
rightPanel: 'chat' | 'member' | null;
|
||||
setRightPanel: (panel: 'chat' | 'member' | null) => void;
|
||||
}
|
||||
|
||||
export function createMeetingStateStore() {
|
||||
return createStore<MeetingState>()(
|
||||
immer((set, get) => ({
|
||||
rightPanel: null,
|
||||
setRightPanel: (rightPanel) => {
|
||||
if (get().rightPanel === rightPanel) {
|
||||
// toggle
|
||||
set({ rightPanel: null });
|
||||
} else {
|
||||
set({ rightPanel });
|
||||
}
|
||||
},
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
export type MeetingStateStoreType = ReturnType<typeof createMeetingStateStore>;
|
Loading…
Reference in New Issue