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