Files
discord-decomp/modules/in_app_notifications/native/InAppNotificationContainer.tsx
T
2026-11-01 12:12:55 +02:00

526 lines
22 KiB
TypeScript

// Metro module 10276 (f10277).
import { useMemo, useState, useCallback, useRef, useEffect } from "react";
import { Keyboard, StyleSheet, View } from "react-native";
import NativeMenuStore from "../../native_menu/native/NativeMenuStore";
import ReadStateStore from "../../../stores/ReadStateStore";
import { DEFAULT_ANIMATION_TIMING, EXPANDABLE_MIN_WINDOW_HEIGHT, MIN_SWIPE_DISTANCE, MIN_SWIPE_VELOCITY, NOTIFICATION_BOB_RANGE, PAN_INPUT_RANGE, extrapolateConfig, NOTIFICATION_CONTAINER_MARGIN } from "./InAppNotificationConstants";
import { AnalyticEvents, AnalyticsObjectTypes, AnalyticsObjects, AnalyticsSections, InAppNotificationTypes } from "../../../Constants";
import * as _ReanimatedRexport from "../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { Easing, useSharedValue, cancelAnimation, useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { useCanExpandInAppNotification } from "./InAppNotificationExpandExperiment";
import { canReactToMessage } from "../../reactions/canReactToMessage";
import { canReplyToMessage } from "../../replies/canReplyToMessage";
import MessageNotification from "./MessageNotification";
import MessageFailedToSendNotification from "./MessageFailedToSendNotification";
import ForumThreadCreatedNotification from "./ForumThreadCreatedNotification";
import { BugReporterNotification } from "../../bug_reporter/native/BugReporterNotification";
import AlertNotification from "./AlertNotification";
import ReactionNotification from "./ReactionNotification";
import ReminderNotification from "./ReminderNotification";
import RestrictedHoursWarningNotification from "./RestrictedHoursWarningNotification";
import MessageRequestNotification from "./MessageRequestNotification";
import { MessageNotificationDetachedContent } from "./MessageNotificationDetachedContent";
import { extractMetadataFromNotification, trackDismissed } from "./InAppNotificationUtils";
import useStateFromSharedValue from "../../reanimated/native/useStateFromSharedValue";
import { useStateFromStores } from "../../../_bundle/Module589";
import { UNSAFE_markDismissibleContentAsDismissed } from "../../dismissible_content/DismissibleContentUnsafeUtils";
import { DismissibleContent } from "../../../_bundle/Module1358";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import AppAnalyticsUtils from "../../app_analytics/AppAnalyticsUtils";
import useBackPressHandler from "../../routing/native/useBackPressHandler";
import useWindowDimensions_native from "../../screen/useWindowDimensions.native";
import SnowflakeUtils from "../../../utils/SnowflakeUtils";
import { ack } from "../../../actions/ReadStateActionCreators";
import * as _timing from "../../../design/animation/reanimated/timing/timing";
import useMountEffect, { useUnmountEffect } from "../../../hooks/useMountEffect";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { Gesture, GestureDetector } from "../../../_bundle/Module5273";
import * as _spring from "../../../design/animation/reanimated/spring/spring";
import { OverlayView } from "../../../design/void/native";
import { Backdrop } from "../../../design/components/Backdrop/native/Backdrop.native";
import * as _index_native from "../../../intl/index.native";
import { intl } from "../../../intl/index.native";
import { SafeAreaPaddingView } from "../../../components_native/common/SafeAreaView";
import { InAppNotificationContext } from "./InAppNotificationContext";
let c6860_24, useStyles, DetachedNotificationContent, __initData, __initData2, __initData3, __initData4, __initData5, __initData6, __initData7, __initData8, __initData9;
const NotificationWrapper = function NotificationWrapper(props) {
const notification2 = props.notification;
const type = notification2.type;
if (InAppNotificationTypes.MESSAGE === type) {
return <MessageNotification notification={notification2} />;
}
if (InAppNotificationTypes.MESSAGE_FAILED_TO_SEND === type) {
return <MessageFailedToSendNotification notification={notification2} />;
}
if (InAppNotificationTypes.FORUM_THREAD_CREATED === type) {
return <ForumThreadCreatedNotification notification={notification2} />;
}
if (InAppNotificationTypes.BUG_REPORTER === type) {
return <BugReporterNotification notification={notification2} />;
}
if (InAppNotificationTypes.ALERT === type) {
return <AlertNotification notification={notification2} />;
}
if (InAppNotificationTypes.REACTION === type) {
return <ReactionNotification notification={notification2} />;
}
if (InAppNotificationTypes.MESSAGE_REMINDER === type) {
return <ReminderNotification notification={notification2} />;
}
if (InAppNotificationTypes.RESTRICTED_HOURS_WARNING !== type && InAppNotificationTypes.RESTRICTED_SCHEDULE_UPDATED !== type) {
if (InAppNotificationTypes.MESSAGE_REQUEST === type) {
return <MessageRequestNotification notification={notification2} />;
}
return null;
}
return <RestrictedHoursWarningNotification notification={notification2} />;
};
DetachedNotificationContent = function DetachedNotificationContent(props) {
const notification2 = props.notification;
return notification2.type === InAppNotificationTypes.MESSAGE ? <MessageNotificationDetachedContent notification={notification2} /> : null;
};
c6860_24 = {
duration: 200,
easing: Easing.in(Easing.ease)
};
useStyles = createStyles({
safeAreaContainer: {
position: "absolute",
left: 0,
right: 0,
backgroundColor: "transparent",
marginTop: 8,
top: 0,
bottom: 0
},
backdrop: {
position: "absolute",
zIndex: 0
},
animatedContainer: {
marginLeft: NOTIFICATION_CONTAINER_MARGIN,
marginRight: NOTIFICATION_CONTAINER_MARGIN
}
});
__initData = {
code: "function InAppNotificationContainerTsx1(finished){const{runOnJS,handleDismissNotification}=this.__closure;if(finished){runOnJS(handleDismissNotification)('autodismissed');}}"
};
__initData2 = {
code: "function InAppNotificationContainerTsx2(){const{runOnJS,setInitialized}=this.__closure;return runOnJS(setInitialized)(true);}"
};
__initData3 = {
code: "function InAppNotificationContainerTsx3(){const{withTiming,expandedSV,DEFAULT_ANIMATION_TIMING}=this.__closure;return{opacity:withTiming(expandedSV.get()?1:0,DEFAULT_ANIMATION_TIMING)};}"
};
__initData4 = {
code: "function InAppNotificationContainerTsx4(){const{runOnJS,setPanning}=this.__closure;runOnJS(setPanning)(false);}"
};
__initData5 = {
code: "function InAppNotificationContainerTsx5(event){const{velocityY,MIN_SWIPE_VELOCITY,MIN_SWIPE_DISTANCE,isExpandableNotification,notificationGestureY,expandedSV,runOnJS,setExpanded,withTiming,PAN_INPUT_RANGE,DEFAULT_ANIMATION_TIMING,handleDismissNotification,setPanning,withSpring}=this.__closure;const shouldDismiss=Math.abs(velocityY.get())>=MIN_SWIPE_VELOCITY||Math.abs(event.translationY)>=MIN_SWIPE_DISTANCE;if(isExpandableNotification&&event.translationY>MIN_SWIPE_DISTANCE){notificationGestureY.set(0);expandedSV.set(true);runOnJS(setExpanded)(true,'swipe');}else if(shouldDismiss&&event.translationY<=0){notificationGestureY.set(withTiming(event.translationY>0?PAN_INPUT_RANGE[2]:PAN_INPUT_RANGE[0],DEFAULT_ANIMATION_TIMING,'animate-always',function(finished){if(finished){runOnJS(handleDismissNotification)('swipe');}}));}else{runOnJS(setPanning)(false);notificationGestureY.set(withSpring(0,{damping:10,mass:1,stiffness:100,velocity:velocityY.get()},'animate-always'));}}"
};
__initData6 = {
code: "function InAppNotificationContainerTsx6(event){const{startY,isExpandableNotification,notificationGestureY,velocityY}=this.__closure;const rawY=startY.get()+event.translationY;const newY=isExpandableNotification&&rawY>0?rawY:Math.min(rawY,startY.get());notificationGestureY.set(newY);velocityY.set(event.velocityY);}"
};
__initData7 = {
code: "function InAppNotificationContainerTsx7(){const{startY,notificationGestureY,velocityY,runOnJS,setPanning}=this.__closure;startY.set(notificationGestureY.get());velocityY.set(0);runOnJS(setPanning)(true);}"
};
__initData8 = {
code: "function InAppNotificationContainerTsx8(finished){const{runOnJS,handleDismissNotification}=this.__closure;if(finished){runOnJS(handleDismissNotification)('swipe');}}"
};
__initData9 = {
code: "function InAppNotificationContainerTsx9(){const{notificationGestureY,scale,isExpandableNotification,interpolate,MIN_SWIPE_DISTANCE,PAN_INPUT_RANGE,NOTIFICATION_BOB_RANGE,extrapolateConfig,initialized}=this.__closure;const gestureY=notificationGestureY.get();const scaleValue=scale.get();if(isExpandableNotification&&gestureY>0){return{transform:[{translateY:interpolate(gestureY,[0,MIN_SWIPE_DISTANCE,PAN_INPUT_RANGE[2]],[0,0,NOTIFICATION_BOB_RANGE],extrapolateConfig)},{scale:initialized?1:scaleValue}],opacity:initialized?1:scaleValue};}const scaleTransform=initialized?interpolate(gestureY,PAN_INPUT_RANGE,[0.3,1,0.3],extrapolateConfig):scaleValue;const opacityTransform=initialized?interpolate(gestureY,PAN_INPUT_RANGE,[0,1,0],extrapolateConfig):scaleValue;return{transform:[{translateY:gestureY},{scale:scaleTransform}],opacity:opacityTransform};}"
};
export default function InAppNotificationContainer(props) {
let r122;
let guildId, channelId, messageId, channelType, sharedValue, sharedValue2, sharedValue3, sharedValue4, state, setState, state2, setState2, state3, setState3, sharedValue5, isExpanded, state4, setState4, state5, setState5, callback, callback2, showReactionBar, showReplyInput, isExpandableNotification, callback3, ref;
const notification = props.notification;
guildId = void 0;
channelId = void 0;
messageId = void 0;
channelType = void 0;
sharedValue = void 0;
sharedValue2 = void 0;
sharedValue3 = void 0;
sharedValue4 = void 0;
state = void 0;
setState = void 0;
state2 = void 0;
setState2 = void 0;
state3 = void 0;
setState3 = void 0;
sharedValue5 = void 0;
isExpanded = void 0;
state4 = void 0;
setState4 = void 0;
state5 = void 0;
setState5 = void 0;
callback = void 0;
callback2 = void 0;
showReactionBar = void 0;
showReplyInput = void 0;
isExpandableNotification = void 0;
callback3 = void 0;
ref = void 0;
const styles = useStyles();
const memo = useMemo(() => extractMetadataFromNotification(notification), [notification]);
guildId = memo.guildId;
channelId = memo.channelId;
messageId = memo.messageId;
channelType = memo.channelType;
sharedValue = useSharedValue(0);
sharedValue2 = useSharedValue(0);
sharedValue3 = useSharedValue(0);
sharedValue4 = useSharedValue(0);
[state, setState] = useState(null);
[state2, setState2] = useState(false);
[state3, setState3] = useState(false);
sharedValue5 = useSharedValue(false);
isExpanded = useStateFromSharedValue(sharedValue5);
[state4, setState4] = useState(false);
[state5, setState5] = useState(false);
const stateFromStores = useStateFromStores([NativeMenuStore], () => NativeMenuStore.isOpen());
callback = useCallback(() => {
UNSAFE_markDismissibleContentAsDismissed(DismissibleContent.IN_APP_NOTIFICATION_EXPAND_NUX);
}, []);
callback2 = useCallback((a0, a1) => {
sharedValue5.set(a0);
if (a0) {
let expand_source = a1;
ActionSheetActionCreators.hideAllActionSheets();
callback();
const IN_APP_NOTIFICATION_EXPANDED = AnalyticEvents.IN_APP_NOTIFICATION_EXPANDED;
if (a1 == null) {
expand_source = "unknown";
}
AppAnalyticsUtils.trackWithMetadata(IN_APP_NOTIFICATION_EXPANDED, {
type: notification.type,
notif_guild_id: guildId,
notif_channel_id: channelId,
in_app_notification_id: notification.inAppNotificationId,
message_id: messageId,
expand_source
});
}
ActionSheetActionCreators.setActionSheetZIndex(a0 ? 1 : void 0);
}, [sharedValue5, notification, guildId, channelId, messageId, callback]);
useBackPressHandler(useCallback(() => {
let r5 = !!isExpanded;
if (r5) {
callback2(false);
r5 = true;
}
return r5;
}, [isExpanded, callback2]), isExpanded);
const windowDimensions_native = useWindowDimensions_native({
ignoreKeyboard: true
});
const { width, height } = windowDimensions_native;
const canExpandInAppNotification = useCanExpandInAppNotification("InAppNotificationContainer");
let canExpand = canExpandInAppNotification.canExpand;
const canReact = canExpandInAppNotification.canReact;
if (notification.type !== InAppNotificationTypes.MESSAGE) {
r122 = {
showReactionBar: false,
showReplyInput: false,
isExpandableNotification: false
};
} else {
const { message, channel } = notification;
if (canExpand) {
canExpand = height > EXPANDABLE_MIN_WINDOW_HEIGHT;
}
const canReactToMessage2 = canReactToMessage(message, channel);
const canReplyToMessage2 = canReplyToMessage(channel, message);
let showReactionBar2 = (canExpand ? canReact : canExpand) && canReactToMessage2;
if (canExpand) {
canExpand = canReplyToMessage2;
}
r122 = {
showReactionBar: showReactionBar2,
showReplyInput: canExpand,
isExpandableNotification: null
};
if (!showReactionBar2) {
showReactionBar2 = canExpand;
}
r122.isExpandableNotification = showReactionBar2;
}
showReactionBar = r122.showReactionBar;
showReplyInput = r122.showReplyInput;
isExpandableNotification = r122.isExpandableNotification;
callback3 = useCallback((a0) => {
if (a0 != null) {
trackDismissed({
type: notification.type,
guildId,
channelId,
dismissReason: a0,
inAppNotificationId: notification.inAppNotificationId,
messageId
});
}
if (state4 && notification.type === InAppNotificationTypes.MESSAGE) {
const r11 = ReadStateStore.ackMessageId(notification.channel.id);
if ((r11 == null || SnowflakeUtils.compare(r11, notification.message.id) < 0) && notification.mentionCount >= ReadStateStore.getMentionCount(notification.channel.id)) {
ack(notification.channel.id, {
section: AnalyticsSections.IN_APP_NOTIFICATION,
object: AnalyticsObjects.ACK_IN_APP_NOTIFICATION_ACTION,
objectType: AnalyticsObjectTypes.ACK_SEMI_AUTOMATIC
}, true, true, notification.message.id);
}
}
const onDismiss2 = notification.onDismiss;
if (onDismiss2 != null) {
onDismiss2.call(notification);
}
}, [state4, notification, guildId, channelId, messageId]);
ref = useRef(null);
useEffect(() => {
let r3 = state3;
if (state3) {
r3 = ref.current == null;
}
if (r3) {
ref.current = setTimeout(() => {
const r7 = PAN_INPUT_RANGE[0];
const r20 = function t(a0) {
if (a0) {
_ReanimatedRexport.runOnJS(callback3)("autodismissed");
}
};
r20.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
handleDismissNotification: callback3
};
r20.__workletHash = 1150739008183;
r20.__initData = __initData;
sharedValue.set(_timing.withTiming(r7, DEFAULT_ANIMATION_TIMING, "respect-motion-settings", r20));
}, 2000);
}
}, [state3, sharedValue, callback3]);
useUnmountEffect(() => {
ActionSheetActionCreators.setActionSheetZIndex(void 0);
if (ref.current != null) {
clearTimeout(ref.current);
cancelAnimation(sharedValue);
}
});
useMountEffect(() => {
const r18 = () => _ReanimatedRexport.runOnJS(setState2)(true);
r18.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setInitialized: setState2
};
r18.__workletHash = 11548697745556;
r18.__initData = __initData2;
sharedValue4.set(_timing.withTiming(1, c6860_24, "respect-motion-settings", r18));
return () => cancelAnimation(sharedValue4);
});
useEffect(() => {
if (state2) {
AnalyticsUtils.track(AnalyticEvents.IN_APP_NOTIFICATION_SHOWN, {
type: notification.type,
guild_id: guildId,
channel_id: channelId,
in_app_notification_id: notification.inAppNotificationId,
message_id: messageId,
channel_type: channelType
});
}
}, [state2, notification.type, guildId, channelId, notification.inAppNotificationId, messageId, channelType]);
const xt = () => ({
opacity: _timing.withTiming(sharedValue5.get() ? 1 : 0, DEFAULT_ANIMATION_TIMING)
});
xt.__closure = {
withTiming: _timing.withTiming,
expandedSV: sharedValue5,
DEFAULT_ANIMATION_TIMING
};
xt.__workletHash = 2841593511002;
xt.__initData = __initData3;
const animatedStyle = useAnimatedStyle(xt);
const r170 = Gesture.Pan().enabled(isExpanded ? !isExpanded : !state3);
const Rt = function Rt() {
sharedValue3.set(sharedValue.get());
sharedValue2.set(0);
_ReanimatedRexport.runOnJS(setState5)(true);
};
Rt.__closure = {
startY: sharedValue3,
notificationGestureY: sharedValue,
velocityY: sharedValue2,
runOnJS: _ReanimatedRexport.runOnJS,
setPanning: setState5
};
Rt.__workletHash = 11316955045022;
Rt.__initData = __initData7;
const r179 = r170.onBegin(Rt);
const Gt = function Gt(a0) {
let r6;
const r8 = sharedValue3.get() + a0.translationY;
if (isExpandableNotification) {
r6 = r8;
if (!(r6 > 0)) {
r6 = Math.min(r8, sharedValue3.get());
}
} else {
r6 = Math.min(r8, sharedValue3.get());
}
sharedValue.set(r6);
sharedValue2.set(a0.velocityY);
};
Gt.__closure = {
startY: sharedValue3,
isExpandableNotification,
notificationGestureY: sharedValue,
velocityY: sharedValue2
};
Gt.__workletHash = 16677375054247;
Gt.__initData = __initData6;
const r185 = r179.onUpdate(Gt);
const vt = function vt(a0) {
const r2 = Math.abs(sharedValue2.get()) >= MIN_SWIPE_VELOCITY || Math.abs(a0.translationY) >= MIN_SWIPE_DISTANCE;
if (isExpandableNotification && a0.translationY > MIN_SWIPE_DISTANCE) {
sharedValue.set(0);
sharedValue5.set(true);
_ReanimatedRexport.runOnJS(callback2)(true, "swipe");
} else if (r2 && a0.translationY <= 0) {
const r59 = a0.translationY > 0 ? PAN_INPUT_RANGE[2] : PAN_INPUT_RANGE[0];
const n = function n(a0) {
if (a0) {
_ReanimatedRexport.runOnJS(callback3)("swipe");
}
};
n.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
handleDismissNotification: callback3
};
n.__workletHash = 1684596854482;
n.__initData = __initData8;
sharedValue.set(_timing.withTiming(r59, DEFAULT_ANIMATION_TIMING, "animate-always", n));
} else {
_ReanimatedRexport.runOnJS(setState5)(false);
sharedValue.set(_spring.withSpring(0, {
damping: 10,
mass: 1,
stiffness: 100,
velocity: sharedValue2.get()
}, "animate-always"));
}
};
vt.__closure = {
velocityY: sharedValue2,
MIN_SWIPE_VELOCITY,
MIN_SWIPE_DISTANCE,
isExpandableNotification,
notificationGestureY: sharedValue,
expandedSV: sharedValue5,
runOnJS: _ReanimatedRexport.runOnJS,
setExpanded: callback2,
withTiming: _timing.withTiming,
PAN_INPUT_RANGE,
DEFAULT_ANIMATION_TIMING,
handleDismissNotification: callback3,
setPanning: setState5,
withSpring: _spring.withSpring
};
vt.__workletHash = 5165226193044;
vt.__initData = __initData5;
const r203 = r185.onEnd(vt);
const Mt = function Mt() {
_ReanimatedRexport.runOnJS(setState5)(false);
};
Mt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setPanning: setState5
};
Mt.__workletHash = 2178187669683;
Mt.__initData = __initData4;
const gesture = r203.onFinalize(Mt);
const bt = function bt() {
let r26;
const translateY = sharedValue.get();
const r5 = sharedValue4.get();
if (isExpandableNotification && translateY > 0) {
const transform = [{
translateY: _ReanimatedRexport.interpolate(translateY, [0, MIN_SWIPE_DISTANCE, PAN_INPUT_RANGE[2]], [0, 0, NOTIFICATION_BOB_RANGE], extrapolateConfig)
}, ,];
let opacity = 1;
transform[1] = {
scale: state2 ? 1 : r5
};
if (!state2) {
opacity = r5;
}
r26 = {
transform,
opacity
};
} else {
r26 = {
transform: [{
translateY
}, {
scale: state2 ? _ReanimatedRexport.interpolate(translateY, PAN_INPUT_RANGE, [0.3, 1, 0.3], extrapolateConfig) : r5
}],
opacity: state2 ? _ReanimatedRexport.interpolate(translateY, PAN_INPUT_RANGE, [0, 1, 0], extrapolateConfig) : r5
};
}
return r26;
};
bt.__closure = {
notificationGestureY: sharedValue,
scale: sharedValue4,
isExpandableNotification,
interpolate: _ReanimatedRexport.interpolate,
MIN_SWIPE_DISTANCE,
PAN_INPUT_RANGE,
NOTIFICATION_BOB_RANGE,
extrapolateConfig,
initialized: state2
};
bt.__workletHash = 14122965198084;
bt.__initData = __initData9;
const animatedStyle2 = useAnimatedStyle(bt);
const memo2 = useMemo(() => ({
notificationGestureY: sharedValue,
velocityY: sharedValue2,
containerScale: sharedValue4,
initialized: state2,
autoDismissing: state3,
setAutoDismissing: setState3,
setActionTaken: setState4,
isExpanded,
expandedSV: sharedValue5,
setExpanded: callback2,
handleDismissNotification: callback3,
panning: state5,
isExpandableNotification,
showReactionBar,
showReplyInput,
confirmation: state,
setConfirmation: setState
}), [state3, sharedValue5, callback3, state2, isExpanded, sharedValue, sharedValue4, callback2, sharedValue2, state5, isExpandableNotification, showReactionBar, showReplyInput, state, setState]);
return <OverlayView style={StyleSheet.absoluteFill} pointerEvents="box-none">
<View style={[styles.backdrop, {
width,
height
}]} pointerEvents={isExpanded ? "auto" : "none"}>
<Backdrop style={animatedStyle} onDismiss={() => {
Keyboard.dismiss();
callback2(false);
}} accessibilityLabel={intl.string(_index_native.t["9sewOj"])} />
</View>
<SafeAreaPaddingView top bottom left right style={styles.safeAreaContainer} pointerEvents="box-none" importantForAccessibility={stateFromStores ? "no-hide-descendants" : void 0}>
<InAppNotificationContext.Provider value={memo2}>
<GestureDetector gesture={gesture}>
<ReanimatedRexport.View style={[styles.animatedContainer, animatedStyle2]} pointerEvents="box-none">
<NotificationWrapper notification={notification} />
</ReanimatedRexport.View>
</GestureDetector>
<DetachedNotificationContent notification={notification} />
</InAppNotificationContext.Provider>
</SafeAreaPaddingView>
</OverlayView>;
};