import React from "react";
import { View, ButtonProps } from "react-native";
import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable";
import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
import * as R from "ramda";
import { useInitialFocus } from "@applicaster/zapp-react-native-utils/focusManager";
import { getXray } from "@applicaster/zapp-react-native-utils/logger";
import { useFocusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable/index.android";
import {
useIsRTL,
applyRTLStylesIfNeeded,
} from "@applicaster/zapp-react-native-utils/localizationUtils";
const { Logger } = getXray();
import {
cloneElementsWithIds,
insertBetween,
recursiveCloneElementsWithState,
useFilterChildren,
} from "../../../utils";
import type {
HorizontalSeparatorProps,
ContainerProps,
ContainerChildren,
} from "./types";
const logger = new Logger("plugin", "plugins/navigation-action");
const generateId = (cellUUID, suffixId) => `${cellUUID}--${suffixId}`;
const HorizontalSeparator = ({ width }: HorizontalSeparatorProps) => (
);
export function ButtonContainerView({
style,
children,
...otherProps
}: ContainerProps) {
const isRTL = useIsRTL();
const horizontalGutter = R.pathOr(0, ["horizontalGutter"], otherProps);
const filteredChildren = useFilterChildren(children);
const buttonIds = filteredChildren.map((child) => {
const { cellUUID, suffixId } = child.props;
return generateId(cellUUID, suffixId);
});
useInitialFocus(otherProps.state === "focused", R.head(buttonIds));
if (R.isEmpty(filteredChildren)) {
return null;
}
return (
{insertBetween(
(index) => (
),
cloneElementsWithIds(buttonIds, filteredChildren)
)}
);
}
export function FocusableViewComponent(
{ style, children, item, ...otherProps }: ButtonProps,
ref
) {
const {
cellUUID,
groupId,
suffixId,
normalStyles,
focusedStyles,
nextFocusLeft,
nextFocusRight,
pluginIdentifier,
disableFocus,
} = otherProps;
const parentFocus = useFocusable();
const actionContext = useActions(pluginIdentifier);
const onPress = () => {
if (!actionContext) {
logger.warning(
`Cannot resolve action context for ${pluginIdentifier} - please make sure the plugin is installed and up to date`
);
return;
}
actionContext?.invokeAction?.(item);
};
return (
{(isFocused) => {
const additionalStyles = isFocused ? focusedStyles : normalStyles;
return (
{recursiveCloneElementsWithState(isFocused, children)}
);
}}
);
}