1414 * limitations under the License.
1515 */
1616
17- import type { ReactNode } from 'react' ;
17+ import type { Dispatch , ReactNode , SetStateAction } from 'react' ;
1818import {
1919 createContext ,
2020 useCallback ,
2121 useContext ,
2222 useEffect ,
23+ useMemo ,
2324 useState ,
2425} from 'react' ;
2526
26- import type { SDKToPanelMessage , TransactionEvent } from 'yorkie-js-sdk' ;
27+ import {
28+ DocEventType ,
29+ type SDKToPanelMessage ,
30+ type TransactionEvent ,
31+ } from 'yorkie-js-sdk' ;
2732import { connectPort , sendToSDK } from '../../port' ;
2833
2934const DocKeyContext = createContext < string > ( null ) ;
3035const YorkieDocContext = createContext ( null ) ;
31- const TransactionEventsContext = createContext < Array < TransactionEvent > > ( null ) ;
36+ const TransactionEventsContext = createContext < {
37+ events : Array < TransactionEvent > ;
38+ hidePresenceEvents : boolean ;
39+ setHidePresenceEvents : Dispatch < SetStateAction < boolean > > ;
40+ } > ( null ) ;
3241
3342type Props = {
3443 children ?: ReactNode ;
@@ -41,6 +50,10 @@ export function YorkieSourceProvider({ children }: Props) {
4150 Array < TransactionEvent >
4251 > ( [ ] ) ;
4352
53+ // filter out presence events
54+ const [ hideTransactionPresenceEvents , setHideTransactionPresenceEvents ] =
55+ useState ( false ) ;
56+
4457 const resetDocument = ( ) => {
4558 setCurrentDocKey ( '' ) ;
4659 setTransactionEvents ( [ ] ) ;
@@ -94,7 +107,13 @@ export function YorkieSourceProvider({ children }: Props) {
94107
95108 return (
96109 < DocKeyContext . Provider value = { currentDocKey } >
97- < TransactionEventsContext . Provider value = { transactionEvents } >
110+ < TransactionEventsContext . Provider
111+ value = { {
112+ events : transactionEvents ,
113+ hidePresenceEvents : hideTransactionPresenceEvents ,
114+ setHidePresenceEvents : setHideTransactionPresenceEvents ,
115+ } }
116+ >
98117 < YorkieDocContext . Provider value = { [ doc , setDoc ] } >
99118 { children }
100119 </ YorkieDocContext . Provider >
@@ -121,12 +140,64 @@ export function useYorkieDoc() {
121140 return value ;
122141}
123142
143+ export enum TransactionEventType {
144+ Document = 'document' ,
145+ Presence = 'presence' ,
146+ }
147+
148+ export const getTransactionEventType = (
149+ event : TransactionEvent ,
150+ ) : TransactionEventType => {
151+ for ( const docEvent of event ) {
152+ if (
153+ docEvent . type === DocEventType . StatusChanged ||
154+ docEvent . type === DocEventType . Snapshot ||
155+ docEvent . type === DocEventType . LocalChange ||
156+ docEvent . type === DocEventType . RemoteChange
157+ ) {
158+ return TransactionEventType . Document ;
159+ }
160+ }
161+
162+ return TransactionEventType . Presence ;
163+ } ;
164+
124165export function useTransactionEvents ( ) {
125- const value = useContext ( TransactionEventsContext ) ;
126- if ( value === undefined ) {
166+ const { events, hidePresenceEvents, setHidePresenceEvents } = useContext (
167+ TransactionEventsContext ,
168+ ) ;
169+
170+ if ( events === undefined ) {
127171 throw new Error (
128172 'useTransactionEvents should be used within YorkieSourceProvider' ,
129173 ) ;
130174 }
131- return value ;
175+
176+ // create an enhanced events with metadata
177+ const enhancedEvents = useMemo ( ( ) => {
178+ return events . map ( ( event ) => {
179+ const transactionEventType = getTransactionEventType ( event ) ;
180+
181+ return {
182+ event,
183+ transactionEventType,
184+ isFiltered :
185+ hidePresenceEvents &&
186+ transactionEventType === TransactionEventType . Presence ,
187+ } ;
188+ } ) ;
189+ } , [ hidePresenceEvents , events ] ) ;
190+
191+ // filter out presence events from the original events
192+ const presenceFilteredEvents = useMemo ( ( ) => {
193+ if ( ! hidePresenceEvents ) return enhancedEvents ;
194+ return enhancedEvents . filter ( ( e ) => ! e . isFiltered ) ;
195+ } , [ enhancedEvents ] ) ;
196+
197+ return {
198+ originalEvents : enhancedEvents ,
199+ presenceFilteredEvents,
200+ hidePresenceEvents,
201+ setHidePresenceEvents,
202+ } ;
132203}
0 commit comments