Files
discord-decomp/design/components/ContextMenu/native/ContextMenuPopout.native.tsx
T
2026-11-01 12:12:55 +02:00

236 lines
12 KiB
TypeScript

// Metro module 13211 (f13212).
import { useEffect, useState, useMemo, useCallback } from "react";
import { View, StyleSheet } from "react-native";
import { createStyles } from "../../Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _ContextMenuConstants_native from "./ContextMenuConstants.native";
import { CONTEXT_MENU_ITEM_PADDING, CONTEXT_MENU_DIVIDER_HEIGHT, CONTEXT_MENU_EDGE_OFFSET } from "./ContextMenuConstants.native";
import * as _ReanimatedRexport from "../../../../modules/reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedStyle, useSharedValue } from "../../../../modules/reanimated/ReanimatedRexport";
import * as _TransitionGroup from "../../TransitionGroup/TransitionGroup";
import useSafeAreaInsetsKeyboardAware_native from "../../../../modules/safe_area/useSafeAreaInsetsKeyboardAware.native";
import useWindowDimensions_native from "../../../../modules/screen/useWindowDimensions.native";
import { isAndroid } from "../../../../utils/PlatformUtils";
import * as _spring from "../../../animation/reanimated/spring/spring";
import * as _ContextMenuState_native from "./ContextMenuState.native";
import { Gesture, GestureDetector } from "../../../../_bundle/Module5273";
import { Text } from "../../Text/native/Text";
import { ContextMenuItem } from "./ContextMenuItem.native";
import { getIsScreenReaderEnabled } from "../../../../modules/a11y/native/useIsScreenReaderEnabled.native";
import { Backdrop } from "../../Backdrop/native/Backdrop.native";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
let useStyles, __initData, __initData2, __initData3, __initData4, useStyles2, __initData5, ContextMenuBackdrop;
const ContextMenuDivider = function ContextMenuDivider() {
return <View style={useStyles().divider} />;
};
ContextMenuBackdrop = function ContextMenuBackdrop(props) {
const { onPress: onPress2, visible } = props;
const styles2 = useStyles2();
const n = function n() {
return {
opacity: _spring.withSpring(visible.get(), _ContextMenuConstants_native.CONTEXT_MENU_SPRING)
};
};
n.__closure = {
withSpring: _spring.withSpring,
visible,
CONTEXT_MENU_SPRING: _ContextMenuConstants_native.CONTEXT_MENU_SPRING
};
n.__workletHash = 6862317967896;
n.__initData = __initData5;
return <Backdrop blur="none" style={useAnimatedStyle(n)} accessibleDismissStyle={styles2.accessibleDismiss} onDismiss={onPress2} accessibilityLabel={isAndroid() ? intl.string(_index_native.t.hPBScv) : intl.string(_index_native.t.xs0juG)} />;
};
useStyles = createStyles({
container: {
position: "absolute",
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGHEST,
borderWidth: 1,
borderColor: Module712.colors.BORDER_SUBTLE,
borderRadius: Module712.radii.lg,
minWidth: _ContextMenuConstants_native.CONTEXT_MENU_MIN_WIDTH,
...Module712.shadows.SHADOW_HIGH
},
titleContainer: {
padding: CONTEXT_MENU_ITEM_PADDING
},
divider: {
borderBottomWidth: CONTEXT_MENU_DIVIDER_HEIGHT,
borderBottomColor: Module712.colors.BORDER_SUBTLE
}
});
__initData = {
code: "function ContextMenuPopoutNativeTsx1(){const{maxHeight,height,CONTEXT_MENU_MIN_WIDTH,positionY,positionX,CONTEXT_MENU_MIN_SCALE,withSpring,interpolate,visible,CONTEXT_MENU_SPRING,transitionState,TransitionStates,runOnJS,cleanUp,onClose}=this.__closure;const visibleHeight=Math.min(maxHeight,height);const halfHeight=visibleHeight/2;const halfWidth=CONTEXT_MENU_MIN_WIDTH/2;const translateYDirection=positionY==='below'?-1:1;const translateXDirection=positionX==='left'?-1:1;const translateY=translateYDirection*halfHeight+CONTEXT_MENU_MIN_SCALE*-translateYDirection*halfHeight;const translateX=translateXDirection*halfWidth+CONTEXT_MENU_MIN_SCALE*-translateXDirection*halfWidth;return{opacity:withSpring(interpolate(visible.get(),[0,1],[0,1]),CONTEXT_MENU_SPRING,'respect-motion-settings',function(finished){if(finished&&transitionState===TransitionStates.YEETED){runOnJS(cleanUp)();runOnJS(onClose)();}}),transform:[{translateX:withSpring(interpolate(visible.get(),[0,1],[translateX,0]),CONTEXT_MENU_SPRING)},{translateY:withSpring(interpolate(visible.get(),[0,1],[translateY,0]),CONTEXT_MENU_SPRING)},{scale:withSpring(interpolate(visible.get(),[0,1],[CONTEXT_MENU_MIN_SCALE,1]),CONTEXT_MENU_SPRING)}]};}"
};
__initData2 = {
code: "function ContextMenuPopoutNativeTsx2(finished){const{transitionState,TransitionStates,runOnJS,cleanUp,onClose}=this.__closure;if(finished&&transitionState===TransitionStates.YEETED){runOnJS(cleanUp)();runOnJS(onClose)();}}"
};
__initData3 = {
code: "function update_ContextMenuPopoutNativeTsx3(e){const{updateContextMenuState,state}=this.__closure;updateContextMenuState(e.absoluteX,e.absoluteY,state);}"
};
__initData4 = {
code: "function ContextMenuPopoutNativeTsx4(){const{state,runOnJS,requestClose}=this.__closure;const{activeIndex:activeIndex}=state;const isDismiss=activeIndex.get()===-1;runOnJS(requestClose)(isDismiss);}"
};
useStyles2 = createStyles({
accessibleDismiss: {
...StyleSheet.absoluteFillObject,
height: "auto"
}
});
__initData5 = {
code: "function ContextMenuPopoutNativeTsx5(){const{withSpring,visible,CONTEXT_MENU_SPRING}=this.__closure;return{opacity:withSpring(visible.get(),CONTEXT_MENU_SPRING)};}"
};
export function ContextMenuPopout(props) {
let c20412_9, state2, setState;
const { menu, transitionState, cleanUp } = props;
c20412_9 = void 0;
state2 = void 0;
setState = void 0;
const { x: r14, positionX, positionY, height, items: items2, state, requestClose, onClose, title: title2, keyboardShouldPersistTaps: keyboardShouldPersistTaps2 = "handled", dividerIndexes: dividerIndexes2, y: r18 } = menu;
const sharedValue = useSharedValue(transitionState === _TransitionGroup.TransitionStates.MOUNTED ? 1 : 0);
useEffect(() => {
if (transitionState === _TransitionGroup.TransitionStates.YEETED) {
sharedValue.set(0);
} else {
sharedValue.set(1);
}
}, [transitionState, sharedValue]);
const styles = useStyles();
const insets = useSafeAreaInsetsKeyboardAware_native({
includeKeyboardHeight: true
}).insets;
const { top, bottom } = insets;
const windowDimensions_native = useWindowDimensions_native({
ignoreKeyboard: isAndroid()
});
const { width, height: height2 } = windowDimensions_native;
const r4 = positionY === "below";
const r60 = height2 - r18;
const maxHeight = r4 ? r60 - bottom - CONTEXT_MENU_EDGE_OFFSET : r60 - top - CONTEXT_MENU_EDGE_OFFSET;
c20412_9 = maxHeight;
[state2, setState] = useState(height >= maxHeight);
const r77 = r4 ? "top" : "bottom";
const r78 = {};
r78[r77] = r18;
r78[positionX] = r14;
r78.maxHeight = maxHeight;
r78.maxWidth = width - CONTEXT_MENU_EDGE_OFFSET - r14;
const R = function R() {
const r5 = Math.min(c20412_9, height) / 2;
const r4 = _ContextMenuConstants_native.CONTEXT_MENU_MIN_WIDTH / 2;
const r1 = positionY === "below" ? -1 : 1;
const r2 = positionX === "left" ? -1 : 1;
const r41 = _ReanimatedRexport.interpolate(sharedValue.get(), [0, 1], [0, 1]);
const r44 = function t(a0) {
if (a0 ? transitionState === _TransitionGroup.TransitionStates.YEETED : a0) {
_ReanimatedRexport.runOnJS(cleanUp)();
_ReanimatedRexport.runOnJS(onClose)();
}
};
r44.__closure = {
transitionState,
TransitionStates: _TransitionGroup.TransitionStates,
runOnJS: _ReanimatedRexport.runOnJS,
cleanUp,
onClose
};
r44.__workletHash = 4025068986009;
r44.__initData = __initData2;
return {
opacity: _spring.withSpring(r41, _ContextMenuConstants_native.CONTEXT_MENU_SPRING, "respect-motion-settings", r44),
transform: [{
translateX: _spring.withSpring(_ReanimatedRexport.interpolate(sharedValue.get(), [0, 1], [r2 * r4 + _ContextMenuConstants_native.CONTEXT_MENU_MIN_SCALE * -r2 * r4, 0]), _ContextMenuConstants_native.CONTEXT_MENU_SPRING)
}, {
translateY: _spring.withSpring(_ReanimatedRexport.interpolate(sharedValue.get(), [0, 1], [r1 * r5 + _ContextMenuConstants_native.CONTEXT_MENU_MIN_SCALE * -r1 * r5, 0]), _ContextMenuConstants_native.CONTEXT_MENU_SPRING)
}, {
scale: _spring.withSpring(_ReanimatedRexport.interpolate(sharedValue.get(), [0, 1], [_ContextMenuConstants_native.CONTEXT_MENU_MIN_SCALE, 1]), _ContextMenuConstants_native.CONTEXT_MENU_SPRING)
}]
};
};
R.__closure = {
maxHeight,
height,
CONTEXT_MENU_MIN_WIDTH: _ContextMenuConstants_native.CONTEXT_MENU_MIN_WIDTH,
positionY,
positionX,
CONTEXT_MENU_MIN_SCALE: _ContextMenuConstants_native.CONTEXT_MENU_MIN_SCALE,
withSpring: _spring.withSpring,
interpolate: _ReanimatedRexport.interpolate,
visible: sharedValue,
CONTEXT_MENU_SPRING: _ContextMenuConstants_native.CONTEXT_MENU_SPRING,
transitionState,
TransitionStates: _TransitionGroup.TransitionStates,
runOnJS: _ReanimatedRexport.runOnJS,
cleanUp,
onClose
};
R.__workletHash = 16778623591634;
R.__initData = __initData;
const animatedStyle = useAnimatedStyle(R);
const memo = useMemo(() => {
const update = function update(a0) {
_ContextMenuState_native.updateContextMenuState(a0.absoluteX, a0.absoluteY, state);
};
update.__closure = {
updateContextMenuState: _ContextMenuState_native.updateContextMenuState,
state
};
update.__workletHash = 4218299258082;
update.__initData = __initData3;
const r25 = Gesture.Pan().enabled(!state2).onStart(update).onUpdate(update);
const r27 = function t() {
const r8 = state.activeIndex.get();
_ReanimatedRexport.runOnJS(requestClose)(r8 === -1);
};
r27.__closure = {
state,
runOnJS: _ReanimatedRexport.runOnJS,
requestClose
};
r27.__workletHash = 14495067009140;
r27.__initData = __initData4;
return r25.onEnd(r27);
}, [state, requestClose, state2]);
const callback2 = useCallback((a0) => {
setState(Math.round(a0.nativeEvent.layout.height) >= Math.round(c20412_9));
}, [maxHeight]);
const callback3 = useCallback(() => {
requestClose(true);
}, [requestClose]);
const callback4 = useCallback(() => {
requestClose(false);
}, [requestClose]);
const r135 = [<ContextMenuBackdrop onPress={callback3} visible={sharedValue} />, ,];
const r146 = title2 != null ? <>
<View style={styles.titleContainer}>
<Text variant="text-md/bold" color="mobile-text-heading-primary" accessibilityRole="header">{title2}</Text>
</View>
<ContextMenuDivider />
</> : null;
const items = items2;
const title = title2;
const state3 = state;
const callback = callback4;
const dividerIndexes = dividerIndexes2;
r135[1] = <GestureDetector gesture={memo}>
<ReanimatedRexport.ScrollView onLayout={callback2} bounces={false} style={[styles.container, r78, animatedStyle]} keyboardShouldPersistTaps={keyboardShouldPersistTaps2} accessibilityRole="list">
{r146}
{items.map(({ label, action, iconSource, IconComponent, trailingIndicator, variant, accessibilityRole }, a1) => {
const r41 = <ContextMenuItem key={`${label}-${a1}`} index={a1} label={label} start={a1 === 0 && title == null} end={a1 === items.length - 1} lastInSection={dividerIndexes.includes(a1 + 1)} iconSource={iconSource} IconComponent={IconComponent} trailingIndicator={trailingIndicator} state={state3} onPress={(event) => {
if (isAndroid() && getIsScreenReaderEnabled()) {
action();
}
if (callback != null) {
callback(event);
}
}} variant={variant} accessibilityRole={accessibilityRole} />;
return dividerIndexes.includes(a1) ? <>
<ContextMenuDivider key={`divider-${a1}`} />
{r41}
</> : r41;
})}
</ReanimatedRexport.ScrollView>
</GestureDetector>;
return <>{r135}</>;
}