All files / lib/providers/ContentAnalytics index.tsx

20% Statements 3/15
0% Branches 0/5
16.66% Functions 1/6
16.66% Lines 2/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60                1x               15x                                                                                      
import React, { createContext } from 'react';
 
import { gameEventConsumeForWebviewApi, gameEventConsumeWithTokenApi } from '@lib/apis/statistics';
import { EventConsumeRequest } from '@uniquegood/realworld-statistics-interface';
import { useIsForWebviewContext } from '@lib/providers/IsForWebview';
 
type EventProps = Pick<EventConsumeRequest, 'eventType' | 'metadata'>;
 
const ContentAnalyticsContext = createContext<{
  consumeEvent: (props: EventProps) => Promise<unknown>;
}>({
  consumeEvent: async () => {
    // pass
  }
});
 
export const useContentAnalyticsContext = () => React.useContext(ContentAnalyticsContext);
 
export function ContentAnalyticsProvider({
  children,
  gameId,
  isTest = false
}: {
  children: React.ReactNode;
  gameId: string;
  isTest?: boolean;
}) {
  const { isWebview } = useIsForWebviewContext();
 
  const gameEventApi = React.useMemo(
    () => (isWebview ? gameEventConsumeForWebviewApi : gameEventConsumeWithTokenApi),
    [isWebview]
  );
 
  const consumeEvent = React.useCallback(
    async (props: EventProps) => {
      try {
        if (isTest) return;
 
        await gameEventApi.consumeEvent({
          gameId,
          createdAt: new Date().toISOString(),
          ...props
        });
      } catch (e) {
        console.warn(e);
      }
    },
    [gameEventApi]
  );
 
  const contextValue = React.useMemo(() => ({ consumeEvent }), [consumeEvent]);
 
  return (
    <ContentAnalyticsContext.Provider value={contextValue}>
      {children}
    </ContentAnalyticsContext.Provider>
  );
}