@applicaster/zapp-react-native-utils
Version:
Applicaster Zapp React Native utilities package
165 lines (127 loc) • 4.29 kB
text/typescript
// 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;
};