UNPKG

@applicaster/zapp-react-native-utils

Version:

Applicaster Zapp React Native utilities package

165 lines (127 loc) 4.29 kB
// import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage"; import { log_error, log_info } from "./ActionExecutorContext"; import { ActionResult } from "./ActionExecutor"; import { get } from "lodash"; import { onMaxTagsReached } from "./StorageActions"; import { ScreenMultiSelectProvider } from "../storage/ScreenStateMultiSelectProvider"; import { ScreenSingleValueProvider } from "../storage/ScreenSingleValueProvider"; import { useScreenStateStore } from "../reactHooks/navigation/useScreenStateStore"; export const screenSetVariable = async ( screenRoute: string, screenStateStore: ReturnType<typeof useScreenStateStore>, context: Record<string, any>, action: ActionType ): Promise<ActionResult> => { if (!context) { log_error("handleAction: screenSetVariable action missing context"); return ActionResult.Error; } const entry = context?.entry as ZappEntry; if (!entry) { log_error( "handleAction: screenSetVariable action missing entry. Entry is required to get the value." ); return ActionResult.Error; } const tag = action.options?.selector ? get(entry, action.options.selector) : (entry.extensions?.tag ?? entry.id); const key = action.options?.key; if (!key) { log_error("handleAction: screenSetVariable action missing argument 'key'", { key, }); return ActionResult.Error; } if (!tag) { log_error( "handleAction: screenSetVariable action could not determine tag", { selector: action.options?.selector, value: action.options?.value } ); return ActionResult.Error; } try { const singleValueProvider = ScreenSingleValueProvider.getProvider( key, screenRoute, screenStateStore ); const currentValue = await singleValueProvider.getValueAsync(); log_info( `handleAction: screenSetVariable setting value: ${tag} for key: ${key}, previous value: ${currentValue}` ); await singleValueProvider.setValue(String(tag)); log_info( `handleAction: screenSetVariable successfully set value: ${tag} for key: ${key}` ); return ActionResult.Success; } catch (error) { log_error("handleAction: screenSetVariable failed to set value", { key, tag, error, }); return ActionResult.Error; } }; export const screenToggleFlag = async ( screenRoute: string, screenStateStore: ReturnType<typeof useScreenStateStore>, context: Record<string, any>, action: ActionType ) => { if (!context) { log_error("handleAction: screenToggleFlag action missing context"); return ActionResult.Error; } const entry = context?.entry as ZappEntry; if (!entry) { log_error( "handleAction: screenToggleFlag action missing entry. Entry is required to get the tag." ); return ActionResult.Error; } const tag = action.options?.selector ? get(entry, action.options.selector) : (entry.extensions?.tag ?? entry.id); const key = action.options?.key; if (key && tag) { const multiSelectProvider = ScreenMultiSelectProvider.getProvider( key, screenRoute, screenStateStore ); const selectedItems = await multiSelectProvider.getSelectedAsync(); const isTagInSelectedItems = selectedItems.includes(tag); log_info( `handleAction: screenToggleFlag event will ${ isTagInSelectedItems ? "remove" : "add" } tag: ${tag} for key: ${key}, current selectedItems: ${selectedItems}` ); if (selectedItems.includes(tag)) { await multiSelectProvider.removeItem(tag); } else { const maxItems = action.options?.max_items; if (maxItems && selectedItems.length >= maxItems) { log_info( `handleAction: screenToggleFlag event reached max items limit: ${maxItems}, cannot add tag: ${tag}` ); await onMaxTagsReached({ selectedItems, maxItems, tag, keyNamespace: key, }); return ActionResult.Cancel; } await multiSelectProvider.addItem(tag); } } else { log_error("handleAction: screenToggleFlag event missing key or tag", { key, tag, }); return ActionResult.Error; } return ActionResult.Success; };