UNPKG

@livelike/react-native

Version:

LiveLike React Native package

75 lines (65 loc) 2.08 kB
import { WidgetKind } from '@livelike/javascript'; import { createStore } from './store'; export type TimelineWidgetState = { widgetId: string; widgetKind: WidgetKind; }; export type TimelineWidgetsState = { widgets: TimelineWidgetState[]; }; export type TimelineWidgetStoreValue = Record<string, TimelineWidgetsState>; const initialTimelineWidgetStoreValue: TimelineWidgetStoreValue = {}; export const timelineWidgetStore = createStore(initialTimelineWidgetStoreValue); export type BaseTimelineWidgetsActionArgs = { programId: string; }; export type updateTimelineWidgetStateActionArgs = BaseTimelineWidgetsActionArgs & { widgetTimelineState: TimelineWidgetsState; }; export type UpdateTimelineWidgetsActionArgs = BaseTimelineWidgetsActionArgs & { widgets: TimelineWidgetState[]; prepend?: boolean; }; export const timelineWidgetStoreActions = { updateTimelineWidgetStateAction({ programId, widgetTimelineState, }: updateTimelineWidgetStateActionArgs) { const prevTimelineWidgetsState = timelineWidgetStore.get()[programId]; timelineWidgetStore.set({ ...timelineWidgetStore.get(), [programId]: { ...prevTimelineWidgetsState, ...widgetTimelineState, }, }); }, updateTimelineWidgetsAction({ programId, widgets, prepend, }: UpdateTimelineWidgetsActionArgs) { const prevTimelineWidgetsState = timelineWidgetStore.get()[programId]; let updatedWidgets = prevTimelineWidgetsState?.widgets ?? []; const widgetIdSet = new Set(); for (const { widgetId } of updatedWidgets) { widgetIdSet.add(widgetId); } const filteredWidgets = widgets.filter( ({ widgetId }) => !widgetIdSet.has(widgetId) ); if (prepend) { updatedWidgets = [...filteredWidgets, ...updatedWidgets]; } else { updatedWidgets = [...updatedWidgets, ...filteredWidgets]; } timelineWidgetStore.set({ ...timelineWidgetStore.get(), [programId]: { ...prevTimelineWidgetsState, widgets: updatedWidgets, }, }); }, };