This commit is contained in:
janisslsm committed 2026-11-01 12:12:55 +02:00
1 parent 1781d25a15
commit 732c0ad767
33051 files changed
+2591613 -3019689

No files matched your search

@@ -0,0 +1,25 @@
// Metro module 16134 (f16135).
import AutomaticLifecycleManager from "../../../../lib/AutomaticLifecycleManager";
import { fetchAdUser } from "../../../ads/native/AdUserActionCreators.android";
import SentryUtils_native from "../../../../utils/SentryUtils.native";
class ATTManager extends AutomaticLifecycleManager {
_openATTPrePromptOrFlowTimeoutId = null;
actions = {
POST_CONNECTION_OPEN: this.onPostConnectionOpen
};
onPostConnectionOpen() {
try {
fetchAdUser("post_connection_open");
} catch ($e) {
SentryUtils_native.captureException($e);
}
}
_terminate() {
if (this._openATTPrePromptOrFlowTimeoutId != null) {
clearTimeout(this._openATTPrePromptOrFlowTimeoutId);
this._openATTPrePromptOrFlowTimeoutId = null;
}
}
}
const aTTManager = new ATTManager();
export default aTTManager;
+739
View File
@@ -0,0 +1,739 @@
// Metro module 14045 (f14046).
import { memo, useRef, useState, useCallback, useImperativeHandle, useEffect, useLayoutEffect } from "react";
import { ActivityIndicator, Pressable, View, StyleSheet } from "react-native";
import AppStateStore from "../../../stores/native/AppStateStore";
import { AppStates, ComponentActions } from "../../../Constants";
import Module712 from "../../../_bundle/Module712";
import Video from "../../../_bundle/Video_8143";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module689 from "../../../_bundle/Module689";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import * as _spring from "../../../design/animation/reanimated/spring/spring";
import * as _springPresets from "../../../design/animation/reanimated/spring/springPresets";
import * as _timing from "../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../design/animation/reanimated/timing/timingPresets";
import { ComponentDispatch } from "../../../utils/ComponentDispatchUtils";
import { useStateFromStores } from "../../../_bundle/Module589";
import { isAndroid, isIOS } from "../../../utils/PlatformUtils";
import SentryUtils_native from "../../../utils/SentryUtils.native";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { intl, t } from "../../../intl/index.native";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import { ClosedCaptionsOutlineIcon } from "../../../design/components/Icon/native/redesign/generated/ClosedCaptionsOutlineIcon";
import { TranscriptOutlineIcon } from "../../../design/components/Icon/native/redesign/generated/TranscriptOutlineIcon";
import { VideoQuestPlayerControlButton } from "./VideoQuestModal/VideoQuestPlayerControlButton";
import { SkipBackwardIcon } from "./VideoQuestModal/icons/SkipBackwardIcon";
import { RetryIcon } from "../../../design/components/Icon/native/redesign/generated/RetryIcon";
import { PlayIcon } from "../../../design/components/Icon/native/redesign/generated/PlayIcon";
import { PauseIcon } from "../../../design/components/Icon/native/redesign/generated/PauseIcon";
import { SkipForwardIcon } from "./VideoQuestModal/icons/SkipForwardIcon";
import { FullscreenEnterIcon } from "../../../design/components/Icon/native/redesign/generated/FullscreenEnterIcon";
let hasVideoEnded, canSeekForward, useStyles, PlayerState, c9821_19, __initData, __initData2, __initData3;
let c9821_13 = {
left: Module712.space.PX_16,
right: Module712.space.PX_16,
top: Module712.space.PX_16,
bottom: Module712.space.PX_16
};
let Component = memo(Video);
const hasVideoEnded2 = function hasVideoEnded(a0, a1) {
return a0 >= a1 - 1;
};
hasVideoEnded2.__closure = {};
hasVideoEnded2.__workletHash = 8992945176371;
hasVideoEnded2.__initData = {
code: "function hasVideoEnded_AdVideoPlayerTsx1(currentTime,videoDuration){return currentTime>=videoDuration-1;}"
};
hasVideoEnded = hasVideoEnded2;
const canSeekForward2 = function canSeekForward(a0, a1, a2, a3) {
const r2 = a0 >= a2 - 1;
return r2 ? !r2 : a3 ? a3 : a0 <= a1 - 1;
};
canSeekForward2.__closure = {
hasVideoEnded
};
canSeekForward2.__workletHash = 14098132092693;
canSeekForward2.__initData = {
code: "function canSeekForward_AdVideoPlayerTsx2(currentTime,maxTimestamp,videoDuration,allowUnrestrictedSeeking){const{hasVideoEnded}=this.__closure;return!hasVideoEnded(currentTime,videoDuration)&&(allowUnrestrictedSeeking||currentTime<=maxTimestamp-1);}"
};
canSeekForward = canSeekForward2;
useStyles = createStyles({
container: {
...StyleSheet.absoluteFillObject
},
loadingContainer: {
...StyleSheet.absoluteFillObject,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
justifyContent: "center",
alignItems: "center"
},
bufferingSpinner: {
position: "absolute"
},
bufferingSpinnerCentered: {
...StyleSheet.absoluteFillObject,
justifyContent: "center",
alignItems: "center"
},
video: {
height: "100%",
width: "100%"
},
videoContainer: {
position: "relative",
height: "100%",
width: "100%"
},
controls: {
...StyleSheet.absoluteFillObject,
backgroundColor: Module689(Module712.unsafe_rawColors.BLACK).alpha(0.5).hex(),
justifyContent: "center",
alignItems: "center",
flexDirection: "column"
},
controlsTopBottom: {
flexDirection: "row",
justifyContent: "flex-end",
padding: Module712.space.PX_8,
position: "absolute",
left: 0,
right: 0
},
controlsMiddle: {
justifyContent: "center",
alignItems: "center",
flexGrow: 1,
flexDirection: "row",
gap: Module712.space.PX_24,
pointerEvents: "box-none"
},
controlsTop: {
top: 0
},
controlsBottom: {
bottom: 0
},
progressContainer: {
position: "absolute",
bottom: 0,
right: 0,
left: 0,
justifyContent: "flex-end",
height: Module712.space.PX_16,
overflow: "hidden"
},
progress: {
height: 1,
backgroundColor: Module712.colors.WHITE,
shadowOffset: {
width: 0,
height: 0
},
shadowRadius: 6,
shadowOpacity: 1,
elevation: 5,
shadowColor: Module712.colors.WHITE
},
icon: {
color: Module712.colors.TEXT_DEFAULT
},
iconDisabled: {
color: Module712.colors.TEXT_SUBTLE
},
controlButton: {
padding: Module712.space.PX_8
}
});
PlayerState = {
PAUSED: "paused",
PLAYING: "playing",
ENDED: "ended",
LOADING: "loading",
ERRORED: "errored"
};
c9821_19 = {
USER_INTERACTION: "USER_INTERACTION",
SYSTEM_INITIATED: "SYSTEM_INITIATED",
IMPERATIVE_API: "IMPERATIVE_API"
};
__initData = {
code: "function shouldShowControls_AdVideoPlayerTsx3(){const{hasLoaded,hideControls,showControls,playerState,PlayerState,isVideoEnded}=this.__closure;return hasLoaded&&!hideControls&&(showControls.get()||playerState===PlayerState.PAUSED||playerState===PlayerState.ENDED||playerState===PlayerState.ERRORED||isVideoEnded);}"
};
__initData2 = {
code: "function AdVideoPlayerTsx4(){const{shouldShowControls,withSpring,SUBTLE_SPRING}=this.__closure;const show=shouldShowControls();return{opacity:withSpring(show?1:0,SUBTLE_SPRING),pointerEvents:show?'auto':'none'};}"
};
__initData3 = {
code: "function AdVideoPlayerTsx5(){const{withTiming,progressSharedValue,timingFast}=this.__closure;return{width:withTiming(progressSharedValue.get()*100+\"%\",timingFast,'animate-always')};}"
};
const r162 = memo(function(a0) {
let r351, R3aFPe, children3;
let c20872_28, sharedValue, shouldShowControls2, sharedValue2, ref5, callback2, setState5, callback3, callback4, ref6, callback5, callback6, c20872_40, callback7;
const { source, initialProgress, contentDuration = 0 } = a0;
let allowUnrestrictedSeeking = a0.allowUnrestrictedSeeking;
if (allowUnrestrictedSeeking === void 0) {
allowUnrestrictedSeeking = false;
}
let c20872_1 = allowUnrestrictedSeeking;
let disableResumeOnLoad = a0.disableResumeOnLoad;
if (disableResumeOnLoad === void 0) {
disableResumeOnLoad = false;
}
let c20872_2 = disableResumeOnLoad;
const { style, isFullscreen, externallyPaused, contentInsets, captionsEnabled = false, onToggleCaptions, onOpenTranscript, onToggleFullscreen, renderCaptions, onLoadStart, onLoad, onReadyForDisplay, onProgress, onSeek, onBuffer: onBuffer2, onError, onEnd, onPlayerStateChange, onPausePlayback, onResumePlayback, onVideoTracks, onVideoLayout } = a0;
let videoRef = a0.videoRef;
let bufferingSpinnerPlacement = a0.bufferingSpinnerPlacement;
if (bufferingSpinnerPlacement === void 0) {
bufferingSpinnerPlacement = "top-left";
}
let showCaptionsButton = a0.showCaptionsButton;
if (showCaptionsButton === void 0) {
showCaptionsButton = false;
}
let showTranscriptButton = a0.showTranscriptButton;
if (showTranscriptButton === void 0) {
showTranscriptButton = false;
}
let showFullscreenButton = a0.showFullscreenButton;
if (showFullscreenButton === void 0) {
showFullscreenButton = false;
}
let showProgress = a0.showProgress;
if (showProgress === void 0) {
showProgress = false;
}
let showSkipButtons = a0.showSkipButtons;
if (showSkipButtons === void 0) {
showSkipButtons = true;
}
let hideControls = a0.hideControls;
if (hideControls === void 0) {
hideControls = false;
}
let c20872_13 = hideControls;
const { httpEngine, automaticallyWaitsToMinimizeStalling, maxBitRate, bufferConfig, preferredForwardBufferDuration, repeat = false } = a0;
let c20872_14 = repeat;
const ref8 = a0.ref;
c20872_28 = void 0;
sharedValue = void 0;
shouldShowControls2 = void 0;
sharedValue2 = void 0;
ref5 = void 0;
callback2 = void 0;
setState5 = void 0;
callback3 = void 0;
callback4 = void 0;
ref6 = void 0;
callback5 = void 0;
callback6 = void 0;
c20872_40 = void 0;
callback7 = void 0;
const styles = useStyles();
const ref9 = useRef(null);
if (videoRef == null) {
videoRef = ref9;
}
const ref = videoRef;
const [state, setState] = useState(contentDuration);
const [state2, setState2] = useState({
...initialProgress
});
const [state3, setState3] = useState(PlayerState.LOADING);
let [state5, setState4] = useState(false);
const state4 = state5;
const ref2 = useRef(null);
const ref3 = useRef(0);
const ref4 = useRef([]);
const callback = useCallback((a0) => {
setState3(a0);
if (onPlayerStateChange != null) {
onPlayerStateChange(a0);
}
}, [onPlayerStateChange]);
const isVideoEnded = (state4 ? state3 === PlayerState.ENDED : state4) && state2.timestampSec >= state2.duration - 1;
c20872_28 = isVideoEnded;
sharedValue = useSharedValue(false);
const shouldShowControls = function shouldShowControls() {
let r1 = state4;
if (state4) {
r1 = !c20872_13;
}
if (r1) {
r1 = sharedValue.get() || state3 === PlayerState.PAUSED || state3 === PlayerState.ENDED || state3 === PlayerState.ERRORED || c20872_28;
}
return r1;
};
shouldShowControls.__closure = {
hasLoaded: state4,
hideControls,
showControls: sharedValue,
playerState: state3,
PlayerState,
isVideoEnded
};
shouldShowControls.__workletHash = 8094403036162;
shouldShowControls.__initData = __initData;
shouldShowControls2 = shouldShowControls;
const Se = function Se() {
let r5 = state4;
if (state4) {
r5 = !c20872_13;
}
if (r5) {
r5 = sharedValue.get() || state3 === PlayerState.PAUSED || state3 === PlayerState.ENDED || state3 === PlayerState.ERRORED || c20872_28;
}
return {
opacity: _spring.withSpring(r5 ? 1 : 0, _springPresets.SUBTLE_SPRING),
pointerEvents: r5 ? "auto" : "none"
};
};
Se.__closure = {
shouldShowControls: shouldShowControls2,
withSpring: _spring.withSpring,
SUBTLE_SPRING: _springPresets.SUBTLE_SPRING
};
Se.__workletHash = 311315682972;
Se.__initData = __initData2;
const animatedStyle = useAnimatedStyle(Se);
if (state4) {
state5 = !hideControls;
}
if (state5) {
state5 = sharedValue.get() || state3 === PlayerState.PAUSED || state3 === PlayerState.ENDED || state3 === PlayerState.ERRORED || isVideoEnded;
}
sharedValue2 = useSharedValue(0);
const pe = () => ({
width: _timing.withTiming(100 * sharedValue2.get() + "%", _timingPresets.timingFast, "animate-always")
});
pe.__closure = {
withTiming: _timing.withTiming,
progressSharedValue: sharedValue2,
timingFast: _timingPresets.timingFast
};
pe.__workletHash = 11793601648786;
pe.__initData = __initData3;
const animatedStyle2 = useAnimatedStyle(pe);
ref5 = useRef(-1);
const callback8 = useCallback((c27618_0) => function(...args) {
clearTimeout(ref5.current);
sharedValue.set(true);
ref5.current = setTimeout(() => {
sharedValue.set(false);
}, 2000);
if (c27618_0 != null) {
return c27618_0.apply(void 0, [...args]);
}
}, [sharedValue]);
callback2 = useCallback((timestampSec, duration) => {
setState2((prevState2) => ({
timestampSec,
maxTimestampSec: Math.max(prevState2.maxTimestampSec, Math.floor(timestampSec)),
duration
}));
}, []);
let state6;
[state6, setState5] = useState(false);
const callback9 = useCallback(() => {
if (onReadyForDisplay != null) {
onReadyForDisplay();
}
setState5(true);
}, [onReadyForDisplay]);
callback3 = useCallback((a0) => {
if (ref.current != null) {
const current2 = Math.max(0, Math.min(a0, c20872_1 ? state2.duration : state2.maxTimestampSec));
ref3.current = (ref3.current + 1) % 100;
ref.current.seek(current2 + 0.0001 * ref3.current);
ref2.current = current2;
}
}, [allowUnrestrictedSeeking, state2.duration, state2.maxTimestampSec, ref]);
useImperativeHandle(ref8, () => ({
seekToStart: () => {
if (state3 !== PlayerState.ERRORED) {
callback3(0);
if (state3 === PlayerState.ENDED) {
callback(PlayerState.PLAYING);
if (onResumePlayback != null) {
onResumePlayback(c9821_19.IMPERATIVE_API);
}
}
}
},
play: () => {
if (state3 === PlayerState.PAUSED) {
callback(PlayerState.PLAYING);
if (onResumePlayback != null) {
onResumePlayback(c9821_19.IMPERATIVE_API);
}
}
},
pause: () => {
if (state3 === PlayerState.PLAYING) {
callback(PlayerState.PAUSED);
if (onPausePlayback != null) {
onPausePlayback(c9821_19.IMPERATIVE_API);
}
}
}
}), [callback3, state3, callback, onResumePlayback, onPausePlayback]);
const callback10 = useCallback((a0) => {
const duration2 = a0.duration;
setState(duration2);
setState4(true);
if (ref.current != null) {
const timestampSec2 = initialProgress.timestampSec;
if ((c20872_2 ? !c20872_2 : timestampSec2 > 5) && timestampSec2 < duration2 - 3) {
callback3(timestampSec2 - 1);
}
callback(PlayerState.PLAYING);
if (onLoad != null) {
onLoad(a0);
}
}
}, [ref, initialProgress.timestampSec, disableResumeOnLoad, callback, onLoad, callback3]);
callback4 = useCallback(function(r3 = {}) {
let shouldRestartVideo = r3.shouldRestartVideo;
if (shouldRestartVideo === void 0) {
shouldRestartVideo = true;
}
L16: {
L14: {
if (state3 !== PlayerState.ERRORED) {
if (c20872_28 && shouldRestartVideo) {
break L14;
}
if (state3 !== PlayerState.PAUSED && state3 !== PlayerState.LOADING) {
if (state3 !== PlayerState.PLAYING) {
break L16;
}
callback(PlayerState.PAUSED);
if (onPausePlayback == null) {
break L16;
}
onPausePlayback(c9821_19.USER_INTERACTION);
break L16;
}
callback(PlayerState.PLAYING);
if (onResumePlayback == null) {
break L16;
}
onResumePlayback(c9821_19.USER_INTERACTION);
break L16;
}
}
callback3(0);
callback(PlayerState.PLAYING);
if (onResumePlayback != null) {
onResumePlayback(c9821_19.USER_INTERACTION);
}
}
}, [state3, onPausePlayback, onResumePlayback, isVideoEnded, callback, callback3]);
const callback11 = useCallback(() => callback4(), [callback4]);
ref6 = useRef(false);
callback5 = useCallback(() => {
ref6.current = false;
if (state3 === PlayerState.PLAYING) {
ref6.current = true;
callback(PlayerState.PAUSED);
if (onPausePlayback != null) {
onPausePlayback(c9821_19.SYSTEM_INITIATED);
}
}
}, [state3, callback, onPausePlayback]);
callback6 = useCallback(() => {
if (ref6.current) {
ref6.current = false;
if (state3 !== PlayerState.ERRORED) {
callback(PlayerState.PLAYING);
if (onResumePlayback != null) {
onResumePlayback(c9821_19.SYSTEM_INITIATED);
}
}
}
}, [state3, callback, onResumePlayback]);
useEffect(() => {
ComponentDispatch.subscribe(ComponentActions.QUEST_GAME_LINK_OPENED, callback5);
ComponentDispatch.subscribe(ComponentActions.QUEST_APP_STORE_OVERLAY_FINISHED, callback6);
return () => {
ComponentDispatch.unsubscribe(ComponentActions.QUEST_GAME_LINK_OPENED, callback5);
ComponentDispatch.unsubscribe(ComponentActions.QUEST_APP_STORE_OVERLAY_FINISHED, callback6);
};
}, [callback5, callback6]);
const callback12 = useCallback(() => {
if (sharedValue.get()) {
sharedValue.set(false);
}
callback4({
shouldRestartVideo: false
});
}, [sharedValue, callback4]);
const callback13 = useCallback((a0) => {
let fromTimeSec = ref4.current.shift();
if (fromTimeSec == null) {
fromTimeSec = null;
}
if (ref.current != null) {
ref2.current = null;
if (state > 0) {
sharedValue2.set(a0.currentTime / state);
callback2(a0.currentTime, state);
}
if (onSeek != null) {
onSeek({
...a0,
fromTimeSec
});
}
}
}, [state, sharedValue2, onSeek, callback2, ref]);
let disabled = state3 === PlayerState.ERRORED;
if (!disabled) {
const { timestampSec: timestampSec2, maxTimestampSec } = state2;
const r8 = timestampSec2 >= state2.duration - 1;
let r229 = !r8;
if (!r8) {
if (!allowUnrestrictedSeeking) {
allowUnrestrictedSeeking = timestampSec2 <= maxTimestampSec - 1;
}
r229 = allowUnrestrictedSeeking;
}
disabled = !r229;
}
c20872_40 = disabled;
const callback14 = useCallback(() => {
if (!c20872_40) {
let current2 = ref2.current;
if (current2 == null) {
current2 = sharedValue2.get() * state;
}
ref4.current.push(current2);
callback3(current2 + 10);
}
}, [callback3, state, sharedValue2, disabled]);
const onPress = callback8(useCallback(() => {
let current2 = ref2.current;
if (current2 == null) {
current2 = sharedValue2.get() * state;
}
ref4.current.push(current2);
callback3(current2 - 10);
if (state3 === PlayerState.ENDED) {
callback(PlayerState.PLAYING);
}
}, [callback3, state, sharedValue2, state3, callback]));
const onPress2 = callback8(callback14);
const callback15 = useCallback((a0) => {
const r2 = a0.seekableDuration !== 0 ? a0.currentTime / a0.seekableDuration : 0;
callback2(a0.currentTime, a0.seekableDuration);
sharedValue2.set(r2);
const progress = r2;
if (onProgress != null) {
onProgress({
currentTime: a0.currentTime,
seekableDuration: a0.seekableDuration,
progress
});
}
}, [sharedValue2, callback2, onProgress]);
const callback16 = useCallback(() => {
if (!c20872_14) {
callback(PlayerState.ENDED);
}
if (onEnd != null) {
onEnd();
}
}, [callback, onEnd, repeat]);
const callback17 = useCallback(() => {
callback(PlayerState.LOADING);
if (onLoadStart != null) {
onLoadStart();
}
}, [callback, onLoadStart]);
const callback18 = useCallback((a0) => {
callback(PlayerState.ERRORED);
if (onError != null) {
onError(a0);
}
}, [callback, onError]);
const r266 = useStateFromStores([AppStateStore], () => AppStateStore.getState()) === AppStates.ACTIVE;
useLayoutEffect(() => {
if (isAndroid()) {
const current = ref.current;
return () => {
try {
if (current != null) {
const setNativeProps = current.setNativeProps;
if (setNativeProps != null) {
setNativeProps.call(current, {
paused: true,
repeat: false,
src: {
uri: null
}
});
}
}
} catch ($e) {
SentryUtils_native.captureException($e);
}
};
}
}, [ref]);
const paused = (r266 ? state3 === PlayerState.PAUSED : !r266) || state3 === PlayerState.LOADING || externallyPaused;
const onBuffer = onBuffer2;
const ref7 = useRef(false);
let [state7, setState6] = useState(false);
callback7 = useCallback((a0) => {
setState6(a0);
if (a0 !== ref7.current) {
ref7.current = a0;
if (onBuffer != null) {
onBuffer(a0);
}
}
}, [onBuffer]);
const callback19 = useCallback((a0) => {
let isBuffering;
L6: {
L4: {
isBuffering = a0.isBuffering;
if (isBuffering) {
if (state3 !== PlayerState.LOADING && isIOS()) {
break L4;
}
callback7(true);
break L6;
}
}
if (!isBuffering) {
callback7(false);
}
}
}, [callback7, state3]);
const callback20 = useCallback(() => {
if (isIOS()) {
callback7(true);
}
}, [callback7]);
const callback21 = useCallback(() => {
if (isIOS()) {
callback7(false);
}
}, [callback7]);
const safeAreaInsets_native = useSafeAreaInsets_native();
const r302 = isFullscreen && safeAreaInsets_native != null && {
paddingRight: Math.max(safeAreaInsets_native.right, c9821_13.right),
paddingLeft: Math.max(safeAreaInsets_native.left, c9821_13.left)
};
const props = {
style: [styles.container, style],
accessible: false,
children: null
};
const props2 = {
style: [styles.videoContainer],
onPress: callback12,
accessible: !state5,
accessibilityLabel: intl.string(paused ? t.R3aFPe : t.fTMEUi),
children: null
};
const children = [state3 !== PlayerState.ERRORED && <Component mixWithOthers="inherit" httpEngine={httpEngine} automaticallyWaitsToMinimizeStalling={automaticallyWaitsToMinimizeStalling} maxBitRate={maxBitRate} bufferConfig={bufferConfig} preferredForwardBufferDuration={preferredForwardBufferDuration} ref={ref} accessible={false} importantForAccessibility="no-hide-descendants" accessibilityRole="none" style={styles.video} paused={paused} repeat={repeat} source={source} onBuffer={callback19} onPlaybackStalled={callback20} onPlaybackResume={callback21} onLoad={callback10} onSeek={callback13} onProgress={callback15} onLoadStart={callback17} onEnd={callback16} onError={callback18} onReadyForDisplay={callback9} onVideoTracks={onVideoTracks} onLayout={onVideoLayout} resizeMode="contain" />, renderCaptions == null ? void 0 : renderCaptions(state2.timestampSec), , , , ,];
if (state7) {
const style2 = [styles.bufferingSpinner, ,];
if (!isFullscreen && bufferingSpinnerPlacement !== "center") {
let top = contentInsets?.top;
if (top == null) {
top = 0;
}
let left = contentInsets?.left;
if (left == null) {
left = 0;
}
r351 = {
top,
left
};
} else {
r351 = styles.bufferingSpinnerCentered;
}
style2[1] = r351;
state7 = <ActivityIndicator animating style={style2} color={Module712.unsafe_rawColors.WHITE} />;
}
children[2] = state7;
children[3] = state6 ? !state6 : <View style={styles.loadingContainer}>
<ActivityIndicator animating />
</View>;
const props3 = {
style: [styles.controls, animatedStyle],
accessible: false,
children: null
};
let r371 = showCaptionsButton ? showCaptionsButton : showTranscriptButton;
if (r371) {
if (showCaptionsButton) {
showCaptionsButton = <PressableOpacity accessibilityRole="button" accessibilityLabel={intl.string(t.bDSZO1)} onPress={onToggleCaptions} style={styles.controlButton}>
<ClosedCaptionsOutlineIcon color={captionsEnabled ? styles.icon.color : styles.iconDisabled.color} />
</PressableOpacity>;
}
const r398 = [showCaptionsButton, ,];
if (showTranscriptButton) {
showTranscriptButton = <PressableOpacity accessibilityRole="button" accessibilityLabel={intl.string(t.KCzjTi)} onPress={onOpenTranscript} style={styles.controlButton}>
<TranscriptOutlineIcon color={styles.iconDisabled.color} />
</PressableOpacity>;
}
r398[1] = showTranscriptButton;
r371 = <View style={[styles.controlsTopBottom, styles.controlsTop, r302]}>{r398}</View>;
}
const children2 = [r371, , ,];
const props4 = {
style: styles.controlsMiddle,
children: null
};
const r423 = showSkipButtons ? <VideoQuestPlayerControlButton disabled={state3 === PlayerState.ERRORED} accessibilityRole="button" accessibilityLabel={intl.string(t.r9s3Uv)} onPress={onPress}>
<SkipBackwardIcon color={styles.icon.color} width={16} height={16} />
</VideoQuestPlayerControlButton> : showSkipButtons;
L107: {
children3 = [r423, , ,];
if (!isVideoEnded && state3 !== PlayerState.ERRORED) {
if (paused) {
R3aFPe = t.R3aFPe;
break L107;
}
R3aFPe = t.fTMEUi;
} else {
R3aFPe = t.K0e7M9;
}
}
children3[1] = <VideoQuestPlayerControlButton accessibilityRole="button" accessibilityLabel={intl.string(R3aFPe)} onPress={callback11}>
{!isVideoEnded && state3 !== PlayerState.ERRORED ? paused ? <PlayIcon size="lg" /> : <PauseIcon size="lg" /> : <RetryIcon size="lg" />}
</VideoQuestPlayerControlButton>;
if (showSkipButtons) {
showSkipButtons = <VideoQuestPlayerControlButton disabled={disabled} accessibilityRole="button" accessibilityLabel={intl.string(t.zWDcNP)} onPress={onPress2}>
<SkipForwardIcon color={styles.icon.color} width={16} height={16} />
</VideoQuestPlayerControlButton>;
}
children3[2] = showSkipButtons;
props4.children = children3;
children2[1] = <View {...props4} />;
if (showFullscreenButton) {
showFullscreenButton = <View style={[styles.controlsTopBottom, styles.controlsBottom, r302]}>
<PressableOpacity accessibilityRole="button" accessibilityLabel={intl.string(t.vKZT5t)} onPress={onToggleFullscreen} style={styles.controlButton}>
<FullscreenEnterIcon />
</PressableOpacity>
</View>;
}
children2[2] = showFullscreenButton;
props3.children = children2;
children[4] = <ReanimatedRexport.View {...props3} />;
if (showProgress) {
showProgress = <View style={styles.progressContainer}>
<ReanimatedRexport.View style={[styles.progress, animatedStyle2]} />
</View>;
}
children[5] = showProgress;
props2.children = children;
props.children = <Pressable {...props2} />;
return <View {...props} />;
});
exports.PlayerState = PlayerState;
export { c9821_19 as PlaybackTriggerSource };
export { r162 as AdVideoPlayer };
+8
View File
@@ -0,0 +1,8 @@
// Metro module 14060 (f14061).
import { isAndroid, isIOS } from "../../../utils/PlatformUtils";
let c9832_2 = [-1000, -1003, -1004, -1008];
export function isSourceError(a0) {
const r8 = a0 == null ? void 0 : a0.error.code;
const r7 = a0 == null ? void 0 : a0.error.errorException;
return isAndroid() ? !!(r7 == null ? void 0 : r7.includes("Source error")) : !!isIOS() && (r8 != null && c9832_2.includes(r8));
}
@@ -0,0 +1,48 @@
// Metro module 10499 (f10500).
import { AnalyticEvents } from "../../../Constants";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import * as _PlatformUtils from "../../../utils/PlatformUtils";
import { AppStates } from "../../../ConstantsIOS";
let c7044_3 = null;
let c7044_4 = null;
class AppStoreOverlayTelemetryManager extends AutomaticLifecycleManager {
actions = {
APP_STATE_UPDATE: (a0) => this.handleAppStateUpdate(a0)
};
handleAppStateUpdate({ state }) {
let r0;
const isAndroid = _PlatformUtils.isAndroid();
let r1 = !isAndroid;
if (!isAndroid) {
L7: {
r0 = c7044_3 != null;
if (r0) {
if (state === AppStates.ACTIVE && c7044_4 != null) {
c7044_3.trackOverlayEvent(AnalyticEvents.QUEST_APP_STORE_OVERLAY_RETURNED, Date.now() - c7044_4);
c7044_4 = null;
r0 = false;
break L7;
}
const BACKGROUND = AppStates.BACKGROUND;
r0 = false;
if (state === BACKGROUND) {
c7044_3.trackOverlayEvent(AnalyticEvents.QUEST_APP_STORE_OVERLAY_BACKGROUNDED);
c7044_4 = Date.now();
r0 = false;
}
}
}
r1 = r0;
}
return r1;
}
}
const appStoreOverlayTelemetryManager = new AppStoreOverlayTelemetryManager();
export default appStoreOverlayTelemetryManager;
export function setAppStoreOverlayOpen(a0) {
c7044_3 = a0;
}
export function clearAppStoreOverlayOpen() {
c7044_3 = null;
c7044_4 = null;
}
@@ -0,0 +1,20 @@
// Metro module 14113 (f14114).
import { memo } from "react";
import { StyleSheet, View } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import { useStateFromStores } from "../../../_bundle/Module589";
import { VideoComponent } from "../../../components_native/common/Video";
import Module4611 from "../../../_bundle/Module4611";
const locations = [0, 0.6];
const _excluded = ["rgba(0, 0, 0, 0)", "rgba(0, 0, 0, 0.9)"];
const r29 = memo(function BountiesBannerBackground(props) {
const children = props.children;
return <View style={props.style}>
<VideoComponent source={{
uri: props.uri
}} style={StyleSheet.absoluteFillObject} resizeMode="cover" muted disableFocus paused={useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion)} importantForAccessibility="no-hide-descendants" />
<Module4611 colors={_excluded} locations={locations} style={StyleSheet.absoluteFillObject} />
{children}
</View>;
});
export default r29;
+157
View File
@@ -0,0 +1,157 @@
// Metro module 14111 (f14112).
import { useCallback, memo } from "react";
import { View, StyleSheet } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import AdContentSeenStore from "../AdContentSeenStore";
import { BountyCarouselEmptyStateReason, DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID, QuestsExperimentLocations } from "../QuestConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { intl, t } from "../../../intl/index.native";
import { Text } from "../../../design/components/Text/native/Text";
import openBountiesNuxPromoSheet from "./openBountiesNuxPromoSheet";
import { useStateFromStores } from "../../../_bundle/Module589";
import { AdCreativeType } from "../../../_bundle/Module6013";
import { useBountiesExperience } from "../experiments/useBountiesExperience";
import { QuestContent } from "../QuestTypes";
import { trackAdContentClicked } from "../lib/analytics/AnalyticsActions";
import { QuestContentCTA } from "../lib/analytics/AnalyticsTypes";
import BountiesModalActionCreators from "./BountiesModal/BountiesModalActionCreators";
import BountiesBannerBackground from "./BountiesBannerBackground";
import Module14114 from "../../../_bundle/Module14114";
import { NewTag } from "../../../design/void/native";
import { Button } from "../../../design/components/Button/native/Button.native";
import useIsCarouselInView from "./useIsCarouselInView";
import { useBountyCarouselEmptyStateAnalytics } from "../lib/analytics/AnalyticsHooks";
import { ThemeContextProvider } from "../../../_bundle/Module3901";
import { ThemeTypes } from "../../../_bundle/Module6678";
import { QuestContentImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
let useStyles, BountiesCtaHeaderInner;
const BountiesCtaDescription = function BountiesCtaDescription(props) {
const isEmptyOrCompleted = props.isEmptyOrCompleted;
const styles = useStyles();
const r28 = <Text variant="text-sm/medium" color="text-subtle">
{intl.string(isEmptyOrCompleted ? t.q4wlOE : t.AZGGo1)}
</Text>;
const r39 = intl.format(t.fjSvsC, {
onClick: openBountiesNuxPromoSheet
});
return isEmptyOrCompleted ? <Text variant="text-sm/medium">
{r28}
{" "}
{r39}
</Text> : <View style={styles.description}>
{r28}
<Text variant="text-sm/medium">{r39}</Text>
</View>;
};
BountiesCtaHeaderInner = function BountiesCtaHeaderInner(props) {
let VIDEO_MODAL_MOBILE;
const { bounties, isEmptyOrCompleted = false, containerRef: containerRef2 } = props;
VIDEO_MODAL_MOBILE = void 0;
const styles = useStyles();
useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const stateFromStores = useStateFromStores([AdContentSeenStore], () => bounties.some((bounty) => !AdContentSeenStore.hasSeen(AdCreativeType.BOUNTY, bounty.id)), [bounties]);
VIDEO_MODAL_MOBILE = useBountiesExperience(QuestsExperimentLocations.QUEST_HOME_MOBILE).verticalScrollEnabled ? QuestContent.VIDEO_MODAL_MOBILE : QuestContent.QUEST_HOME_MOBILE_CAROUSEL;
const callback = useCallback(() => {
const r5 = bounties[0];
trackAdContentClicked({
adContentId: DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID,
adCreativeType: AdCreativeType.BOUNTY,
questContent: QuestContent.QUEST_HOME_ENTRYPOINT_MOBILE,
questContentCTA: QuestContentCTA.START_BOUNTY,
sourceQuestContent: QuestContent.QUEST_HOME_ENTRYPOINT_MOBILE,
questContentPosition: 0
});
BountiesModalActionCreators.showModal({
bountyId: r5.id,
sourceQuestContent: VIDEO_MODAL_MOBILE
});
}, [bounties, VIDEO_MODAL_MOBILE]);
return <View ref={containerRef2} style={styles.container}>
<BountiesBannerBackground uri={Module14114} style={[styles.header, styles.headerRoundedBottom]}>
{stateFromStores && <NewTag variant="text-xs/bold" containerStyle={styles.newPill} textStyle={styles.newPillText} />}
<View style={styles.headerTextBox}>
<Text variant="text-lg/semibold" color="text-strong">
{intl.string(t.qetVDw)}
</Text>
<BountiesCtaDescription isEmptyOrCompleted={isEmptyOrCompleted} />
{isEmptyOrCompleted ? !isEmptyOrCompleted : <Button grow size="md" variant="primary-overlay" text={intl.string(t["1kkbKw"])} onPress={callback} />}
</View>
</BountiesBannerBackground>
{false}
</View>;
};
StyleSheet;
useStyles = createStyles(() => ({
container: {
width: "100%",
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED,
borderBottomLeftRadius: Module712.radii.xxl,
borderBottomRightRadius: Module712.radii.xxl,
overflow: "hidden"
},
header: {
width: "100%",
minHeight: 296,
justifyContent: "flex-end",
overflow: "hidden",
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH
},
headerRoundedBottom: {
borderBottomLeftRadius: Module712.radii.xxl,
borderBottomRightRadius: Module712.radii.xxl
},
newPill: {
position: "absolute",
top: Module712.space.PX_12,
left: Module712.space.PX_12,
zIndex: 1,
backgroundColor: Module712.colors.CONTROL_OVERLAY_PRIMARY_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.round,
paddingHorizontal: Module712.space.PX_8,
paddingVertical: Module712.space.PX_4
},
newPillText: {
color: Module712.colors.CONTROL_OVERLAY_PRIMARY_TEXT_DEFAULT
},
headerTextBox: {
paddingBottom: Module712.space.PX_24,
paddingHorizontal: Module712.space.PX_20,
gap: Module712.space.PX_8
},
description: {
marginBottom: 16
},
bottomSection: {
width: "100%",
overflow: "hidden",
borderBottomLeftRadius: Module712.radii.xl,
borderBottomRightRadius: Module712.radii.xl
},
bottomContent: {
paddingBottom: 24,
paddingHorizontal: 20,
gap: Module712.space.PX_12
},
placeholderCards: {
alignSelf: "stretch",
height: 160,
borderRadius: Module712.radii.md,
backgroundColor: Module712.colors.CONTROL_OVERLAY_SECONDARY_BACKGROUND_DEFAULT
}
}));
const r41 = memo(function BountiesCtaHeader(props) {
let c20918_0 = props;
const isCarouselInView = useIsCarouselInView();
const { containerRef, isInView } = isCarouselInView;
const { bounties: bounties2, isEmptyOrCompleted = false } = props;
useBountyCarouselEmptyStateAnalytics(isEmptyOrCompleted ? bounties2.length === 0 ? BountyCarouselEmptyStateReason.EMPTY : BountyCarouselEmptyStateReason.COMPLETED : null);
return <ThemeContextProvider theme={ThemeTypes.DARKER}>
{isEmptyOrCompleted ? <BountiesCtaHeaderInner {...props} containerRef={containerRef} /> : <QuestContentImpressionTrackerNative adContentId={DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.QUEST_HOME_ENTRYPOINT_MOBILE} questContentPosition={0} overrideVisibility={isInView} sourceQuestContent={QuestContent.QUEST_HOME_ENTRYPOINT_MOBILE}>
{() => <BountiesCtaHeaderInner {...c20918_0} containerRef={containerRef} />}
</QuestContentImpressionTrackerNative>}
</ThemeContextProvider>;
});
export default r41;
@@ -0,0 +1,70 @@
// Metro module 14081 (f14082).
import { useEffect } from "react";
import { View } from "react-native";
import ReanimatedRexport, { useSharedValue, withRepeat, withSequence, Easing, cancelAnimation, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../design/animation/reanimated/timing/timing";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useToken } from "../../../../design/tokens/native/useToken";
import { ArrowSmallUpIcon } from "../../../../design/components/Icon/native/redesign/generated/ArrowSmallUpIcon";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { AnimatedCircularProgress } from "../../../../_bundle/Module14084";
let __initData, useStyles;
const BouncingArrow = function BouncingArrow(props) {
const children2 = props.children;
const sharedValue = useSharedValue(0);
useEffect(() => {
sharedValue.set(withRepeat(withSequence(withTiming(-6, {
duration: 500,
easing: Easing.inOut(Easing.quad)
}), withTiming(0, {
duration: 500,
easing: Easing.inOut(Easing.quad)
})), -1));
return () => cancelAnimation(sharedValue);
}, [sharedValue]);
const l = () => ({
transform: [{
translateY: sharedValue.get()
}]
});
l.__closure = {
translateY: sharedValue
};
l.__workletHash = 10126349088819;
l.__initData = __initData;
return <ReanimatedRexport.View style={useAnimatedStyle(l)}>{children2}</ReanimatedRexport.View>;
};
__initData = {
code: "function BountiesAutoScrollIndicatorTsx1(){const{translateY}=this.__closure;return{transform:[{translateY:translateY.get()}]};}"
};
useStyles = createStyles({
root: {
alignItems: "center",
gap: Module712.space.PX_8
},
ringContainer: {
alignItems: "center",
justifyContent: "center",
width: 40,
height: 40
}
});
export default function BountiesAutoScrollIndicator(props) {
const { progress, showProgressRing = true } = props;
const styles = useStyles();
const token = useToken(Module712.colors.WHITE);
const r16 = <ArrowSmallUpIcon size="md" color={Module712.colors.WHITE} />;
let c20889_0 = r16;
return <View style={styles.root}>
<Text variant="text-md/semibold" color="text-default">
{intl.string(t.eafsh4)}
</Text>
<View style={styles.ringContainer}>
{showProgressRing ? <AnimatedCircularProgress size={40} width={3} fill={100 * progress} duration={0} rotation={0} lineCap="round" tintColor={token} backgroundColor="rgba(255, 255, 255, 0.35)">
{() => c20889_0}
</AnimatedCircularProgress> : <BouncingArrow>{r16}</BouncingArrow>}
</View>
</View>;
};
@@ -0,0 +1,43 @@
// Metro module 14075 (f14076).
import { useEffect } from "react";
import { StyleSheet } from "react-native";
import Module712 from "../../../../_bundle/Module712";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../design/animation/reanimated/timing/timing";
import { timingSlow } from "../../../../design/animation/reanimated/timing/timingPresets";
import Module4611 from "../../../../_bundle/Module4611";
const BRAND_500 = Module712.unsafe_rawColors.BRAND_500;
const __initData = {
code: "function BountiesAutoScrollOverlayNuxGradientTsx1(){const{opacity}=this.__closure;return{opacity:opacity.get()};}"
};
export default function BountiesAutoScrollOverlayNuxGradient(props) {
const active = props.active;
const sharedValue = useSharedValue(0);
useEffect(() => {
sharedValue.set(withTiming(active ? 1 : 0, timingSlow));
}, [active, sharedValue]);
const _ = () => ({
opacity: sharedValue.get()
});
_.__closure = {
opacity: sharedValue
};
_.__workletHash = 17406907036861;
_.__initData = __initData;
return <ReanimatedRexport.View style={[StyleSheet.absoluteFillObject, useAnimatedStyle(_)]} pointerEvents="none">
<Module4611 style={StyleSheet.absoluteFillObject} colors={[`${BRAND_500}80`, `${BRAND_500}00`]} locations={[0, 1]} start={{
x: 0.5,
y: 1
}} end={{
x: 0.5,
y: 0
}} />
<Module4611 style={StyleSheet.absoluteFillObject} colors={["rgba(0,0,0,0.4)", "rgba(0,0,0,0)"]} locations={[0, 0.5]} start={{
x: 0.5,
y: 1
}} end={{
x: 0.5,
y: 0
}} />
</ReanimatedRexport.View>;
};
@@ -0,0 +1,65 @@
// Metro module 14070 (f14071).
import { useCallback } from "react";
import { Pressable, View } from "react-native";
import { END_CARD_IMAGE_SIZE } from "./BountyConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useGetQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { getBountyCtaInfo } from "./BountyCtaHelpers";
import { getScaledImageUrl } from "../../lib/AssetUtils";
import { openAdGameLinkDirectly } from "../../utils/QuestPlatformUtils";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContent } from "../../../../_bundle/Module5038";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import FastImage from "../../../../components_native/common/FastImage";
import { Text } from "../../../../design/components/Text/native/Text";
const useStyles = createStyles(() => ({
image: {
width: END_CARD_IMAGE_SIZE,
height: END_CARD_IMAGE_SIZE,
borderRadius: Module712.radii.xl,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED
},
info: {
gap: Module712.space.PX_4,
alignItems: "center",
marginTop: Module712.space.PX_12
},
ctaContainer: {
position: "relative",
alignItems: "center"
}
}));
export default function BountiesEndCardPressableCta(props) {
const { bounty, sourceQuestContent, disabled = false } = props;
const styles = useStyles();
const getQuestImpressionId = useGetQuestImpressionId();
const bountyCtaInfo = getBountyCtaInfo(bounty);
const uri = bountyCtaInfo.iconImageUri != null ? getScaledImageUrl({
assetUrl: bountyCtaInfo.iconImageUri,
width: END_CARD_IMAGE_SIZE,
height: END_CARD_IMAGE_SIZE
}) : void 0;
const callback = useCallback(() => {
openAdGameLinkDirectly({
adContentId: bounty.id,
adCreativeType: AdCreativeType.BOUNTY,
cta: bounty.cta
}, {
content: QuestContent.VIDEO_MODAL_ICON_END_CARD,
ctaContent: QuestContentCTA.OPEN_GAME_LINK,
impressionId: getQuestImpressionId(),
sourceQuestContent
});
}, [bounty.id, bounty.cta, getQuestImpressionId, sourceQuestContent]);
return <Pressable onPress={disabled ? void 0 : callback} disabled={disabled} hitSlop={16} accessibilityRole="button" accessibilityLabel={bountyCtaInfo.label} style={styles.ctaContainer}>
<FastImage source={{
uri
}} style={styles.image} />
<View style={styles.info}>
<Text variant="text-md/semibold" color="text-strong">{bountyCtaInfo.label}</Text>
<Text variant="text-sm/medium" color="text-default">{bountyCtaInfo.subtext}</Text>
</View>
</Pressable>;
};
@@ -0,0 +1,31 @@
// Metro module 14034 (f14035).
import * as Module19 from "react";
import { useMemo, useLayoutEffect } from "react";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import BountiesModalContentScroll from "./BountiesModalContentScroll";
import BountiesModalContent from "./BountiesModalContent";
import { lockOrientation, restoreDefaultOrientation } from "../../../device/native/DeviceOrientation";
import { Modal } from "../../../../design/components/Modal/native/Modal.native";
const initialRouteName = "bounty_main";
const r24 = Module19.memo(function BountiesModal(props) {
const { bountyId, sourceQuestContent } = props;
const verticalScrollEnabled = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE).verticalScrollEnabled;
const memo = useMemo(() => {
const r1 = {};
r1[initialRouteName] = {
fullscreen: true,
headerLeft: () => null,
render: () => verticalScrollEnabled ? <BountiesModalContentScroll bountyId={bountyId} sourceQuestContent={sourceQuestContent} /> : <BountiesModalContent bountyId={bountyId} sourceQuestContent={sourceQuestContent} />
};
return r1;
}, [bountyId, sourceQuestContent, verticalScrollEnabled]);
useLayoutEffect(() => {
lockOrientation("PORTRAIT", true);
return restoreDefaultOrientation;
}, []);
return <Modal hideTitle initialRouteName={initialRouteName} screens={memo} viewStyle={{
backgroundColor: "#000000"
}} />;
});
export default r24;
@@ -0,0 +1,16 @@
// Metro module 14033 (f14034).
import ModalActionCreators from "../../../../actions/ModalActionCreators";
let c9809_3 = "BOUNTIES_MODAL";
const r15 = {
showModal: ({ bountyId, sourceQuestContent }) => {
ModalActionCreators.pushLazy(import("./BountiesModal"), {
bountyId,
sourceQuestContent
}, c9809_3);
},
hideModal: () => {
ModalActionCreators.popWithKey(c9809_3);
}
};
export default r15;
export const BOUNTIES_MODAL_KEY = "BOUNTIES_MODAL";
@@ -0,0 +1,191 @@
// Metro module 14066 (f14067).
import { useCallback } from "react";
import { StyleSheet, View, Pressable } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { getBountyCtaInfo } from "./BountyCtaHelpers";
import { getScaledImageUrl } from "../../lib/AssetUtils";
import { useButtonPressAnimationProps } from "../../../../design/components/Button/native/ButtonHooks.native";
import { useGetQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { openAdGameLinkDirectly } from "../../utils/QuestPlatformUtils";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../../../_bundle/Module5038";
import { BackgroundBlurView } from "../../../../design/components/experimental/BackgroundBlurView/native/BackgroundBlurView.native";
import FastImage from "../../../../components_native/common/FastImage";
import { Text } from "../../../../design/components/Text/native/Text";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { useIsBountiesModalTransitionsRefactorEnabled } from "../../experiments/BountiesModalTransitionsRefactorExperiment";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useVisibilityTransition } from "./useVisibilityTransition";
import AnimatedEnterExitItem from "../../../../design/components/AnimatedEnterExitItem/native/AnimatedEnterExitItem";
let _excluded, AnimatedComponent, useStyles, n, s2, __initData;
const BountiesModalAdvertiserCtaContent = function BountiesModalAdvertiserCtaContent(props) {
const { bounty, sourceQuestContent, opacityStyle, transformStyle } = props;
const styles = useStyles();
const bountyCtaInfo = getBountyCtaInfo(bounty);
const uri = bountyCtaInfo.iconImageUri != null ? getScaledImageUrl({
assetUrl: bountyCtaInfo.iconImageUri,
width: 40,
height: 40
}) : void 0;
const sharedValue = useSharedValue(0);
const buttonPressAnimationProps = useButtonPressAnimationProps(sharedValue);
const { style, ...rest } = buttonPressAnimationProps;
const getQuestImpressionId = useGetQuestImpressionId();
const callback = useCallback((a0) => {
openAdGameLinkDirectly({
adContentId: bounty.id,
adCreativeType: AdCreativeType.BOUNTY,
cta: bounty.cta
}, {
content: a0,
ctaContent: QuestContentCTA.OPEN_GAME_LINK,
impressionId: getQuestImpressionId(),
sourceQuestContent
});
}, [bounty.id, bounty.cta, sourceQuestContent, getQuestImpressionId]);
return <ReanimatedRexport.View style={[styles.outerContainer, opacityStyle, transformStyle]}>
<AnimatedComponent {...rest} onPress={useCallback(() => {
callback(QuestContent.VIDEO_MODAL_MOBILE);
}, [callback])} accessibilityRole="button" accessibilityLabel={bountyCtaInfo.label} style={[styles.ctaPressable, style]}>
<BackgroundBlurView blurTheme="dark" style={styles.cta} pressed={sharedValue}>
<View style={styles.ctaLogoContainer}>
<FastImage source={{
uri
}} style={styles.ctaLogo} resizeMode="cover" />
</View>
<View style={styles.ctaInfo}>
<Text lineClamp={2} variant="text-sm/semibold" color="text-default">{bountyCtaInfo.label}</Text>
<Text variant="text-xs/medium" color="text-default">{bountyCtaInfo.subtext}</Text>
</View>
<View accessible={false} importantForAccessibility="no-hide-descendants">
<Button variant="primary-overlay" text={bountyCtaInfo.buttonLabel} size="sm" onPress={useCallback(() => {
callback(QuestContent.VIDEO_MODAL_MOBILE_FOOTER);
}, [callback])} />
</View>
</BackgroundBlurView>
</AnimatedComponent>
</ReanimatedRexport.View>;
};
_excluded = ["style"];
AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Pressable);
useStyles = createStyles(() => ({
outerContainer: {
position: "absolute",
bottom: 0,
left: 0,
right: 0,
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_16,
alignItems: "center"
},
ctaPressable: {
...Module712.shadows.SHADOW_TOP_HIGH,
alignSelf: "stretch",
borderWidth: 1,
borderColor: "transparent",
borderRadius: Module712.radii.lg,
overflow: "hidden"
},
cta: {
flexDirection: "row",
alignItems: "center",
paddingLeft: Module712.space.PX_12,
paddingRight: Module712.space.PX_16,
paddingVertical: Module712.space.PX_12,
gap: Module712.space.PX_12
},
ctaLogoContainer: {
width: 40,
height: 40,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderRadius: Module712.radii.md,
overflow: "hidden"
},
ctaLogo: {
...StyleSheet.absoluteFillObject
},
ctaInfo: {
flex: 1,
justifyContent: "center",
gap: 2
}
}));
const r43 = function n(a0) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingStandard, "respect-motion-settings")
};
};
r43.__closure = {
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r43.__workletHash = 2981824910249;
r43.__initData = {
code: "function BountiesModalAdvertiserCtaTsx1(visible){const{withTiming,timingStandard}=this.__closure;return{opacity:withTiming(visible,timingStandard,'respect-motion-settings')};}"
};
n = r43;
const r52 = function(a0, a1) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingFast, "respect-motion-settings", a1)
};
};
r52.__closure = {
withTiming: _timing.withTiming,
timingFast: _timingPresets.timingFast
};
r52.__workletHash = 15850601331978;
r52.__initData = {
code: "function BountiesModalAdvertiserCtaTsx2(visible,cleanUp){const{withTiming,timingFast}=this.__closure;return{opacity:withTiming(visible,timingFast,'respect-motion-settings',cleanUp)};}"
};
s2 = r52;
__initData = {
code: "function BountiesModalAdvertiserCtaTsx3(){const{withTiming,interpolate,visibility,visible,timingStandard,timingFast}=this.__closure;return{transform:[{translateY:withTiming(interpolate(visibility,[0,1],[8,0]),visible?timingStandard:timingFast)}]};}"
};
export default function BountiesModalAdvertiserCta(props) {
let c20882_1, animatedStyle;
const { visible, ...props2 } = props;
c20882_1 = void 0;
animatedStyle = void 0;
const isBountiesModalTransitionsRefactorEnabled = useIsBountiesModalTransitionsRefactorEnabled(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const visibility = visible ? 1 : 0;
c20882_1 = visibility;
const r32 = () => ({
transform: [{
translateY: _timing.withTiming(_ReanimatedRexport.interpolate(c20882_1, [0, 1], [8, 0]), visible ? _timingPresets.timingStandard : _timingPresets.timingFast)
}]
});
r32.__closure = {
withTiming: _timing.withTiming,
interpolate: _ReanimatedRexport.interpolate,
visibility,
visible,
timingStandard: _timingPresets.timingStandard,
timingFast: _timingPresets.timingFast
};
r32.__workletHash = 252868467367;
r32.__initData = __initData;
animatedStyle = useAnimatedStyle(r32);
const callback2 = useCallback((a0, a1) => <BountiesModalAdvertiserCtaContent {...a0} opacityStyle={a1} transformStyle={animatedStyle} />, [animatedStyle]);
const visibilityTransition = useVisibilityTransition({
visible,
entranceTiming: _timingPresets.timingStandard,
exitTiming: _timingPresets.timingFast
});
const opacityStyle = visibilityTransition.opacityStyle;
let shouldRender = visibilityTransition.shouldRender;
if (isBountiesModalTransitionsRefactorEnabled) {
shouldRender = <AnimatedEnterExitItem useReducedMotion={stateFromStores} item={visible ? props2 : void 0} entering={n} exiting={s2} renderItem={callback2} />;
} else if (shouldRender) {
shouldRender = <BountiesModalAdvertiserCtaContent {...props2} opacityStyle={opacityStyle} transformStyle={animatedStyle} />;
}
return shouldRender;
};
@@ -0,0 +1,23 @@
// Metro module 14080 (f14081).
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { PressableOpacity } from "../../../../design/void/Pressables/native/Pressables";
import { intl, t } from "../../../../intl/index.native";
import { XSmallIcon } from "../../../../design/components/Icon/native/redesign/generated/XSmallIcon";
const useStyles = createStyles(() => ({
closeButton: {
alignItems: "center",
justifyContent: "center",
backgroundColor: Module712.colors.CONTROL_OVERLAY_SECONDARY_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.round,
width: Module712.space.PX_32,
height: Module712.space.PX_32
}
}));
export default function BountiesModalCloseButton(props) {
const onPress = props.onPress;
const styles = useStyles();
return <PressableOpacity accessibilityLabel={intl.string(t.cpT0Cq)} accessibilityRole="button" hitSlop={12} onPress={onPress} style={styles.closeButton}>
<XSmallIcon size="sm" color={Module712.colors.CONTROL_OVERLAY_SECONDARY_TEXT_DEFAULT} />
</PressableOpacity>;
};
@@ -0,0 +1,2 @@
// Metro module 14057 (f14058).
export const BOUNTY_REWARD_CLAIM_FAILED_TOAST_DURATION_MS = 10000;
@@ -0,0 +1,262 @@
// Metro module 14087 (f14088).
import { useMemo, useCallback } from "react";
import { View } from "react-native";
import BountyStore from "../../BountyStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { AnalyticEvents } from "../../../../Constants";
import { ThemeTypes } from "../../../../_bundle/Module505";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useFetchVirtualCurrencyBalance } from "../../../virtual_currency/hooks/index";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import { BountyVideoEndMode, useBountiesModalTiming } from "./useBountiesModalTiming";
import { useBountyVideoProgressPersistence } from "./useBountyVideoProgressPersistence";
import { claimBountyReward } from "../../BountyActionCreators";
import { openBountyRewardClaimErrorToast } from "./bountyError";
import { useBountiesModalVideoAnalytics } from "./useBountiesModalVideoAnalytics";
import { trackAdContentEvent } from "../../lib/analytics/AnalyticsActions";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { getQuestContentName } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../../../_bundle/Module5038";
import { formatVideoProgressRatio } from "../../utils/VideoQuestUtils";
import BountiesModalActionCreators from "./BountiesModalActionCreators";
import { BountyVideo } from "./BountyVideo";
import { QuestContentImpressionTrackerNative, BillableAdPlacementImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import BountiesModalEndCard from "./BountiesModalEndCard";
import BountiesModalCloseButton from "./BountiesModalCloseButton";
import { SafeAreaPaddingView } from "../../../../components_native/common/SafeAreaView";
import BountiesModalEndedCtaButtons from "./BountiesModalEndedCtaButtons";
import { useQuestHomeBounties } from "../../hooks/QuestHooks";
import { ThemeContextProvider } from "../../../../_bundle/Module3901";
let c9854_13, useStyles;
const BountiesModalContentInner = function BountiesModalContentInner(props) {
let c20892_4, handleProgress, flushProgress, handleVideoProgressAnalytics, isEndCardVisible, maxVideoProgressSeconds, videoDuration;
const { bounty, sourceQuestContent } = props;
c20892_4 = void 0;
handleProgress = void 0;
flushProgress = void 0;
handleVideoProgressAnalytics = void 0;
isEndCardVisible = void 0;
maxVideoProgressSeconds = void 0;
videoDuration = void 0;
const styles = useStyles();
const windowDimensions_native = useWindowDimensions_native();
const { width, height } = windowDimensions_native;
const safeAreaInsets_native = useSafeAreaInsets_native();
let c20893_2 = safeAreaInsets_native;
const memo = useMemo(() => {
const r11 = width - c20893_2.left - c20893_2.right;
const r13 = height - c20893_2.top - c20893_2.bottom;
let r21 = r11 / c9854_13;
let isFullWidth = true;
let r9 = r11;
if (r21 > r13) {
r9 = r13 * c9854_13;
isFullWidth = false;
r21 = r13;
}
return {
top: Math.floor(c20893_2.top + (r13 - r21) / 2),
left: Math.floor(c20893_2.left + (r11 - r9) / 2),
width: Math.floor(r9),
height: Math.floor(r21),
isFullWidth
};
}, [width, height, safeAreaInsets_native.top, safeAreaInsets_native.bottom, safeAreaInsets_native.left, safeAreaInsets_native.right]);
const memo4 = useMemo(() => [styles.videoWrapper, {
top: memo.top,
left: memo.left,
width: memo.width,
height: memo.height
}], [styles.videoWrapper, memo]);
const memo3 = useMemo(() => [styles.closeButton, {
top: memo.top + Module712.space.PX_8,
left: memo.left + memo.width - Module712.space.PX_32 - Module712.space.PX_8
}], [styles.closeButton, memo.top, memo.left, memo.width]);
const memo2 = useMemo(() => {
const isFullWidth = memo.isFullWidth;
const bottomContainer = styles.bottomContainer;
return isFullWidth ? [bottomContainer, styles.bottomContainerFullWidth] : [bottomContainer, styles.bottomContainerNotFullWidth, {
left: memo.left,
width: memo.width
}];
}, [styles.bottomContainer, styles.bottomContainerFullWidth, styles.bottomContainerNotFullWidth, memo.isFullWidth, memo.left, memo.width]);
const stateFromStores = useStateFromStores([BountyStore], () => BountyStore.isBountyCompleted(bounty.id));
const balance = useFetchVirtualCurrencyBalance().balance;
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const { loopingEnabled, ownedByVerticalScrollExperiment, stage1Enabled, rewardTimerSeconds } = bountiesExperience;
const endMode = loopingEnabled ? BountyVideoEndMode.LOOP : BountyVideoEndMode.END_CARD;
const rewardDurationMs = !stage1Enabled && !ownedByVerticalScrollExperiment ? 1000 * bounty.rewardTimerSeconds : 1000 * rewardTimerSeconds;
c20892_4 = rewardDurationMs;
const bountyVideoProgressPersistence = useBountyVideoProgressPersistence({
bountyId: bounty.id,
endMode
});
const initialProgress = bountyVideoProgressPersistence.initialProgress;
handleProgress = bountyVideoProgressPersistence.handleProgress;
flushProgress = bountyVideoProgressPersistence.flushProgress;
const callback = useCallback(async () => {
let c27624_2;
let c27624_3 = 0;
let c30697_0;
L10: {
try {
c27624_3 = 1;
await claimBountyReward(bounty.id, sourceQuestContent);
c27624_3 = 0;
} catch ($e) {
const r24 = $e;
let r7 = r24;
c27624_2 = r24;
if (c27624_3 !== 0) {
while (true) {
try {
const r57 = c27624_2;
c27624_3 = 0;
c30697_0 = r57;
openBountyRewardClaimErrorToast(c30697_0);
break L10;
} catch (r53) {
r7 = r53;
c27624_2 = r53;
if (c27624_3 === 0) {
break;
}
}
}
}
throw r7;
}
}
}, [bounty.id, sourceQuestContent]);
const bountiesModalVideoAnalytics = useBountiesModalVideoAnalytics({
bountyId: bounty.id,
sourceQuestContent,
rewardDurationMs,
initialPlaybackTimeSec: initialProgress.timestampSec,
initialMaxVideoProgressSec: initialProgress.maxTimestampSec,
initialVideoDurationSec: initialProgress.duration,
wasPreloaded: false,
startupPath: "carousel",
verticalScrollingPosition: null
});
handleVideoProgressAnalytics = bountiesModalVideoAnalytics.handleVideoProgressAnalytics;
const { handleVideoEndAnalytics, handleVideoLoopedAnalytics, handleVideoPausedAnalytics, handleVideoResumedAnalytics, handleVideoErrorAnalytics, handleLoadStartAnalytics, handleVideoTracksAnalytics, handleReadyForDisplayAnalytics, handleBufferAnalytics } = bountiesModalVideoAnalytics;
const bountiesModalTiming = useBountiesModalTiming({
endMode,
rewardDurationMs,
isCompleted: stateFromStores,
onRewardEarned: callback,
onVideoProgress: useCallback((a0, a1, a2) => {
handleVideoProgressAnalytics(a0, a1, a2);
handleProgress(a0, a1, a2);
}, [handleVideoProgressAnalytics, handleProgress]),
onVideoEnd: handleVideoEndAnalytics,
onVideoLooped: handleVideoLoopedAnalytics,
onVideoPaused: handleVideoPausedAnalytics,
onVideoResumed: handleVideoResumedAnalytics,
initialProgressSec: initialProgress.timestampSec,
initialMaxVideoProgressSec: initialProgress.maxTimestampSec,
initialVideoDurationSec: initialProgress.duration > 0 ? initialProgress.duration : null
});
const isCtaVisible = bountiesModalTiming.isCtaVisible;
isEndCardVisible = bountiesModalTiming.isEndCardVisible;
const { handleVideoEnd, handleVideoProgress, handleVideoPaused, handleVideoResumed, rewardRemainingSeconds, rewardTotalSeconds, normalizedProgress } = bountiesModalTiming;
maxVideoProgressSeconds = bountiesModalTiming.maxVideoProgressSeconds;
videoDuration = bountiesModalTiming.videoDuration;
return <>
<View style={memo4}>
<BountyVideo isActive bounty={bounty} sourceQuestContent={sourceQuestContent} isCompleted={stateFromStores} isCtaVisible={isCtaVisible} isEndCardVisible={isEndCardVisible} isProgressBarVisible={!isEndCardVisible} orbsBalance={balance} handleVideoEnd={handleVideoEnd} handleVideoProgress={handleVideoProgress} handleVideoPaused={handleVideoPaused} handleVideoResumed={handleVideoResumed} handleVideoError={handleVideoErrorAnalytics} onLoadStart={handleLoadStartAnalytics} onBuffer={handleBufferAnalytics} onFirstFrame={handleReadyForDisplayAnalytics} onVideoTracks={handleVideoTracksAnalytics} rewardRemainingSeconds={rewardRemainingSeconds} rewardTotalSeconds={rewardTotalSeconds} normalizedProgress={normalizedProgress} repeat={loopingEnabled} initialProgress={initialProgress} renderEndCard={() => <QuestContentImpressionTrackerNative adContentId={bounty.id} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.VIDEO_MODAL_END_CARD} sourceQuestContent={sourceQuestContent} overrideVisibility={isEndCardVisible}>
{() => <BountiesModalEndCard bounty={bounty} visible={isEndCardVisible} sourceQuestContent={sourceQuestContent} />}
</QuestContentImpressionTrackerNative>} isScrollIndicatorEnabled={false} width={memo.width} height={memo.height} />
</View>
<View style={memo3}>
<BountiesModalCloseButton onPress={useCallback(() => {
const properties = {
content_name: getQuestContentName(QuestContent.VIDEO_MODAL_MOBILE),
content_id: QuestContent.VIDEO_MODAL_MOBILE,
video_progress: null,
threshold_met: null,
reward_timer_seconds: null
};
let r38 = videoDuration;
if (videoDuration == null) {
r38 = 0;
}
properties.video_progress = formatVideoProgressRatio(maxVideoProgressSeconds, r38);
const r1 = 1000 * maxVideoProgressSeconds;
properties.threshold_met = r1 >= c20892_4;
properties.reward_timer_seconds = c20892_4 / 1000;
trackAdContentEvent({
adContentId: bounty.id,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_MODAL_CLOSED,
properties,
sourceQuestContent
});
flushProgress();
BountiesModalActionCreators.hideModal();
}, [bounty.id, maxVideoProgressSeconds, rewardDurationMs, sourceQuestContent, videoDuration, flushProgress])} />
</View>
<SafeAreaPaddingView left={memo.isFullWidth} right={memo.isFullWidth} bottom style={memo2} pointerEvents="box-none">
<BountiesModalEndedCtaButtons bounty={bounty} visible={isEndCardVisible} sourceQuestContent={sourceQuestContent} onClose={useCallback(() => {
const properties = {
content_name: getQuestContentName(QuestContent.VIDEO_MODAL_END_CARD),
content_id: QuestContent.VIDEO_MODAL_END_CARD,
video_progress: null,
threshold_met: true,
reward_timer_seconds: null
};
let r36 = videoDuration;
if (videoDuration == null) {
r36 = 0;
}
properties.video_progress = formatVideoProgressRatio(maxVideoProgressSeconds, r36);
properties.reward_timer_seconds = c20892_4 / 1000;
trackAdContentEvent({
adContentId: bounty.id,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_MODAL_CLOSED,
properties,
sourceQuestContent
});
flushProgress();
BountiesModalActionCreators.hideModal();
}, [bounty.id, maxVideoProgressSeconds, rewardDurationMs, sourceQuestContent, videoDuration, flushProgress])} />
</SafeAreaPaddingView>
</>;
};
c9854_13 = 0.5625;
useStyles = createStyles(() => ({
videoWrapper: {
position: "absolute"
},
closeButton: {
position: "absolute"
},
bottomContainer: {
position: "absolute",
bottom: Module712.space.PX_24,
justifyContent: "flex-end"
},
bottomContainerFullWidth: {
left: Module712.space.PX_16,
right: Module712.space.PX_16
},
bottomContainerNotFullWidth: {
paddingLeft: Module712.space.PX_16,
paddingRight: Module712.space.PX_16
}
}));
export default function BountiesModalContent(props) {
const { bountyId, sourceQuestContent: sourceQuestContent2 } = props;
const bounty2 = useQuestHomeBounties().questHomeBounties.find((questHomeBounty) => questHomeBounty.id === bountyId);
return bounty2 != null ? <ThemeContextProvider theme={ThemeTypes.DARKER}>
<BillableAdPlacementImpressionTrackerNative adContentId={bounty2.id} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.VIDEO_MODAL_MOBILE} sourceQuestContent={sourceQuestContent2} overrideVisibility>
{() => <BountiesModalContentInner bounty={bounty2} sourceQuestContent={sourceQuestContent2} />}
</BillableAdPlacementImpressionTrackerNative>
</ThemeContextProvider> : null;
};
@@ -0,0 +1,799 @@
// Metro module 14035 (f14036).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useRef, useState, useCallback, useMemo, useEffect } from "react";
import { StyleSheet, View } from "react-native";
import BountyStore from "../../BountyStore";
import { DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID, QuestsExperimentLocations } from "../../QuestConstants";
import { AnalyticEvents } from "../../../../Constants";
import { ContentDismissActionType } from "../../../dismissible_content/DismissibleContentConstants";
import * as _Module501 from "../../../../_bundle/Module501";
import Module712 from "../../../../_bundle/Module712";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedStyle, useSharedValue, useAnimatedScrollHandler, useAnimatedReaction, useDerivedValue } from "../../../reanimated/ReanimatedRexport";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import BountiesScrollPromptFooter, { BOUNTIES_MODAL_BASE_FOOTER_HEIGHT } from "./BountiesScrollPromptFooter";
import { useQuestHomeBounties } from "../../hooks/QuestHooks";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import * as _BountiesVerticalScrollExperiment from "../../experiments/BountiesVerticalScrollExperiment";
import { useStateFromStores } from "../../../../_bundle/Module589";
import * as _useBountiesRecapScroll from "./useBountiesRecapScroll";
import { useBountiesRecapScroll } from "./useBountiesRecapScroll";
import { useBountySwipeUpNux } from "./useBountySwipeUpNux";
import { v4 } from "../../../../_bundle/Module514";
import * as _AnalyticsTypes from "../../lib/analytics/AnalyticsTypes";
import { BountyScrollingType, getQuestContentName } from "../../lib/analytics/AnalyticsTypes";
import { trackBountyAutoScrollDismissed, trackBountyVerticalScroll, trackAdContentEvent } from "../../lib/analytics/AnalyticsActions";
import { useBountiesAutoScroll, AUTO_SCROLL_PEEK_TOP_OFFSET, AUTO_SCROLL_PEEK_SCALE } from "./useBountiesAutoScroll";
import { useBountiesRecapOrbCount } from "./useBountiesRecapOrbCount";
import { markAdContentSeen } from "../../QuestActionCreators";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContent } from "../../../../_bundle/Module5038";
import { formatVideoProgressRatio } from "../../utils/VideoQuestUtils";
import BountiesModalActionCreators from "./BountiesModalActionCreators";
import { BountiesScrollVideoItem } from "./BountiesScrollVideoItem";
import BountiesScrollPromptNuxFooter from "./BountiesScrollPromptNuxFooter";
import { BountiesScrollRecapFooter } from "./BountiesScrollRecapFooter";
import BountiesAutoScrollOverlayNuxGradient from "./BountiesAutoScrollOverlayNuxGradient";
import { QuestContentImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import { BountiesScrollRecapPage } from "./BountiesScrollRecapPage";
import { AnimatedFlashList } from "../../../../_bundle/noop_6676";
import Module4611 from "../../../../_bundle/Module4611";
import BountiesModalCloseButton from "./BountiesModalCloseButton";
import BountiesAutoScrollIndicator from "./BountiesAutoScrollIndicator";
import { ThemeContextProvider } from "../../../../_bundle/Module3913";
import { ThemeTypes } from "../../../../_bundle/Module6678";
let isAndroid, zIndex, zIndex2, zIndex3, zIndex4, c9811_19, PX_8, _excluded, FOOTER_FADE_START_PROGRESS, FOOTER_FADE_END_PROGRESS, isScrollEventInBounds, BountiesRecapPullZone, useStyles, __initData, BountiesScrollVideoItemContainer, __initData2, __initData3, __initData4, __initData5, __initData6, __initData7, __initData8, __initData9, __initData10, __initData11, __initData12, __initData13, __initData14, __initData15, __initData16, __initData17, __initData18, __initData19, __initData20, BountiesModalContentScrollInner;
const ItemSeparator = function ItemSeparator(props) {
return props.trailingItem != null ? <View style={{
height: PX_8
}} /> : null;
};
BountiesRecapPullZone = function BountiesRecapPullZone(props) {
return <View style={{
height: props.height
}} />;
};
BountiesScrollVideoItemContainer = function BountiesScrollVideoItemContainer(props) {
const { index, slotHeight, scrollY, style, isPeekEnabled, children: children2 } = props;
const c = function c() {
const r19 = (scrollY.get() - index * slotHeight) / slotHeight;
return {
opacity: _ReanimatedRexport.interpolate(Math.abs(r19), [0, 0.3, 1], [1, 1, isPeekEnabled ? r19 < 0 ? index === 1 ? 0.8 : 0 : 0 : 0], _ReanimatedRexport.Extrapolation.CLAMP)
};
};
c.__closure = {
scrollY,
index,
slotHeight,
isPeekEnabled,
PEEK_OPACITY: 0.8,
interpolate: _ReanimatedRexport.interpolate,
FADE_DEADBAND: 0.3,
Extrapolation: _ReanimatedRexport.Extrapolation
};
c.__workletHash = 6532652233494;
c.__initData = __initData;
return <ReanimatedRexport.View style={[style, useAnimatedStyle(c)]}>{children2}</ReanimatedRexport.View>;
};
BountiesModalContentScrollInner = function BountiesModalContentScrollInner(props) {
let memo, questHomeBounties, state, orbAmount, ownedByVerticalScrollExperiment, rewardTimerSeconds, ownedByVerticalScrollExperiment2, isAutoScrollEnabled, c20862_13, height2, slotHeight2, c20862_16, c20862_17, height3, lastBounty, fullRecap, handleRecapMomentumEnd, state2, setState2, state3, setState3, setState4, setState5, state4, setState6, sharedValue, sharedValue2, sharedValue3, hasSingleUseSwipeUpNux, dismissSingleUseSwipeUpNux, hasRecurringSwipeUpNux, dismissRecurringSwipeUpNux, hasRecurringSwipeUpNux2, hasRecurringSwipeUpNux3, memo2, ref, ref2, peekScale, cancel, dismissOnClose, takeDidAutoScroll, onPlaybackTimeChange, onEndCardVisible, pauseCountdown, resumeCountdown, memo3, callback, callback2, bountiesRecapOrbCount, callback3, memo4, derivedValue;
let state5, width, height4, c20863_3;
const { initialBountyId, sourceQuestContent } = props;
memo = void 0;
questHomeBounties = void 0;
state = void 0;
orbAmount = void 0;
ownedByVerticalScrollExperiment = void 0;
rewardTimerSeconds = void 0;
ownedByVerticalScrollExperiment2 = void 0;
isAutoScrollEnabled = void 0;
c20862_13 = void 0;
height2 = void 0;
slotHeight2 = void 0;
c20862_16 = void 0;
c20862_17 = void 0;
height3 = void 0;
lastBounty = void 0;
fullRecap = void 0;
handleRecapMomentumEnd = void 0;
state2 = void 0;
setState2 = void 0;
state3 = void 0;
setState3 = void 0;
setState4 = void 0;
setState5 = void 0;
state4 = void 0;
setState6 = void 0;
sharedValue = void 0;
sharedValue2 = void 0;
sharedValue3 = void 0;
hasSingleUseSwipeUpNux = void 0;
dismissSingleUseSwipeUpNux = void 0;
hasRecurringSwipeUpNux = void 0;
dismissRecurringSwipeUpNux = void 0;
hasRecurringSwipeUpNux2 = void 0;
hasRecurringSwipeUpNux3 = void 0;
memo2 = void 0;
ref = void 0;
ref2 = void 0;
peekScale = void 0;
cancel = void 0;
dismissOnClose = void 0;
takeDidAutoScroll = void 0;
onPlaybackTimeChange = void 0;
onEndCardVisible = void 0;
pauseCountdown = void 0;
resumeCountdown = void 0;
memo3 = void 0;
callback = void 0;
callback2 = void 0;
bountiesRecapOrbCount = void 0;
callback3 = void 0;
memo4 = void 0;
derivedValue = void 0;
const styles = useStyles();
const height = useWindowDimensions_native().height;
const ref3 = useRef(null);
const [state6, setState] = useState(BOUNTIES_MODAL_BASE_FOOTER_HEIGHT);
const callback4 = useCallback((a0) => {
setState(Math.ceil(a0.nativeEvent.layout.height));
}, []);
state5 = state6;
width = void 0;
height4 = void 0;
c20863_3 = void 0;
const windowDimensions_native = useWindowDimensions_native();
width = windowDimensions_native.width;
height4 = windowDimensions_native.height;
const safeAreaInsets_native = useSafeAreaInsets_native();
c20863_3 = safeAreaInsets_native;
memo = useMemo(() => {
const r9 = width - c20863_3.left - c20863_3.right;
const r16 = height4 - c20863_3.top - state5;
let r18 = r9 / c9811_19;
let r7 = r9;
if (r18 > r16) {
r7 = r16 * c9811_19;
r18 = r16;
}
return {
top: c20863_3.top,
left: Math.floor(c20863_3.left + (r9 - r7) / 2),
width: Math.floor(r7),
height: Math.floor(r18)
};
}, [width, height4, safeAreaInsets_native.top, safeAreaInsets_native.left, safeAreaInsets_native.right, state5]);
questHomeBounties = useQuestHomeBounties().questHomeBounties;
state = _slicedToArray(useState(() => {
const r5 = questHomeBounties.findIndex((questHomeBounty) => questHomeBounty.id === initialBountyId);
return r5 <= 0 ? questHomeBounties : [...questHomeBounties.slice(r5), ...questHomeBounties.slice(0, r5)];
}), 1)[0];
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
orbAmount = bountiesExperience.orbAmount;
ownedByVerticalScrollExperiment = bountiesExperience.ownedByVerticalScrollExperiment;
rewardTimerSeconds = bountiesExperience.rewardTimerSeconds;
const scrollAffordanceVariant = bountiesExperience.scrollAffordanceVariant;
ownedByVerticalScrollExperiment2 = ownedByVerticalScrollExperiment;
isAutoScrollEnabled = scrollAffordanceVariant === "auto";
const shouldUseScrollIndicatorOverlay = _BountiesVerticalScrollExperiment.shouldUseScrollIndicatorOverlay(scrollAffordanceVariant);
const stateFromStores = useStateFromStores([BountyStore], () => BountyStore.getCompletedBountyCount(state) * orbAmount, [state, orbAmount]);
const r121 = state[0];
c20862_13 = r121;
const stateFromStores2 = useStateFromStores([BountyStore], () => {
if (c20862_13 == null) {
return false;
}
const bountyVideoProgress = BountyStore.getBountyVideoProgress(c20862_13.id);
return bountyVideoProgress != null && bountyVideoProgress.maxTimestampSec >= rewardTimerSeconds;
}, [r121, rewardTimerSeconds]);
height2 = memo.height;
slotHeight2 = height2 + PX_8;
const lastBountyIndex = state.length - 1;
c20862_16 = lastBountyIndex;
const enabled = stateFromStores > 0;
c20862_17 = enabled;
height3 = height2;
lastBounty = lastBountyIndex * slotHeight2;
fullRecap = lastBounty + height2;
handleRecapMomentumEnd = useBountiesRecapScroll({
listRef: ref3,
enabled,
offsets: useMemo(() => ({
lastBounty,
fullRecap,
revealHeight: height3
}), [fullRecap, lastBounty, height2])
}).handleRecapMomentumEnd;
const memo5 = useMemo(() => {
const r5 = state.map((item, index) => index * slotHeight2);
if (c20862_17) {
r5.push(fullRecap);
}
return r5;
}, [state, fullRecap, enabled, slotHeight2]);
[state2, setState2] = useState(false);
[state3, setState3] = useState(false);
let state7;
[state7, setState4] = useState(true);
let state8;
[state8, setState5] = useState(false);
[state4, setState6] = useState(0);
sharedValue = useSharedValue(false);
sharedValue2 = useSharedValue(false);
sharedValue3 = useSharedValue(0);
const bountySwipeUpNux = useBountySwipeUpNux({
isEligible: state.length > 1,
location: QuestsExperimentLocations.VIDEO_MODAL_MOBILE
});
hasSingleUseSwipeUpNux = bountySwipeUpNux.hasSingleUseSwipeUpNux;
dismissSingleUseSwipeUpNux = bountySwipeUpNux.dismissSingleUseSwipeUpNux;
hasRecurringSwipeUpNux = bountySwipeUpNux.hasRecurringSwipeUpNux;
dismissRecurringSwipeUpNux = bountySwipeUpNux.dismissRecurringSwipeUpNux;
const r179 = state4 === 0;
let visible2 = r179 && hasSingleUseSwipeUpNux && stateFromStores2;
hasRecurringSwipeUpNux2 = scrollAffordanceVariant === "peek" && hasRecurringSwipeUpNux;
hasRecurringSwipeUpNux3 = shouldUseScrollIndicatorOverlay && hasRecurringSwipeUpNux;
memo2 = useMemo(() => v4(), []);
ref = useRef(0);
ref2 = useRef(0);
useEffect(() => {
ref.current = Date.now();
}, []);
const callback5 = useCallback((a0) => {
if (a0 === _AnalyticsTypes.VerticalScrollingDirection.DOWN) {
trackBountyAutoScrollDismissed({
verticalScrollingPosition: state4,
scrollSessionId: memo2
});
}
}, [state4, memo2]);
const enabled2 = isAutoScrollEnabled ? state4 < lastBountyIndex : isAutoScrollEnabled;
const mode = r179 ? hasRecurringSwipeUpNux ? "countdown" : "hint" : "hint";
let activeBountyId = state[state4]?.id;
if (activeBountyId == null) {
activeBountyId = null;
}
const bountiesAutoScroll = useBountiesAutoScroll({
listRef: ref3,
enabled: enabled2,
mode,
activeIndex: state4,
activeBountyId,
slotHeight: slotHeight2,
onCountdownCancelled: callback5
});
const { visible, peekActive, progress, showProgressRing } = bountiesAutoScroll;
peekScale = bountiesAutoScroll.peekScale;
cancel = bountiesAutoScroll.cancel;
dismissOnClose = bountiesAutoScroll.dismissOnClose;
takeDidAutoScroll = bountiesAutoScroll.takeDidAutoScroll;
onPlaybackTimeChange = bountiesAutoScroll.onPlaybackTimeChange;
onEndCardVisible = bountiesAutoScroll.onEndCardVisible;
pauseCountdown = bountiesAutoScroll.pauseCountdown;
resumeCountdown = bountiesAutoScroll.resumeCountdown;
memo3 = useMemo(() => ({
onPlaybackTimeChange,
onPaused: pauseCountdown,
onResumed: resumeCountdown,
onEndCardVisible
}), [onEndCardVisible, onPlaybackTimeChange, pauseCountdown, resumeCountdown]);
callback = useCallback(function(a0, scrollingType = BountyScrollingType.MANUAL) {
const current = ref2.current;
if (a0 !== current) {
ref2.current = a0;
const current2 = Date.now();
const timeWatchedPreScrollMs = current2 - ref.current;
ref.current = current2;
trackBountyVerticalScroll({
scrollingType,
scrollingDirection: a0 > current ? _AnalyticsTypes.VerticalScrollingDirection.DOWN : _AnalyticsTypes.VerticalScrollingDirection.UP,
verticalScrollingPosition: a0,
scrollSessionId: memo2,
timeWatchedPreScrollMs
});
}
}, [memo2]);
callback2 = useCallback((a0) => {
const r7 = takeDidAutoScroll();
setState6(a0);
callback(a0, r7 ? BountyScrollingType.AUTO : BountyScrollingType.MANUAL);
if (state4 === 0 && a0 > 0) {
if (hasSingleUseSwipeUpNux) {
dismissSingleUseSwipeUpNux(ContentDismissActionType.USER_DISMISS);
} else if (hasRecurringSwipeUpNux) {
dismissRecurringSwipeUpNux(ContentDismissActionType.USER_DISMISS);
}
}
}, [takeDidAutoScroll, callback, state4, hasSingleUseSwipeUpNux, hasRecurringSwipeUpNux, dismissSingleUseSwipeUpNux, dismissRecurringSwipeUpNux]);
bountiesRecapOrbCount = useBountiesRecapOrbCount({
scrollY: sharedValue3,
lastBountyScrollOffset: lastBounty,
recapRevealHeight: height2,
targetOrbAmount: stateFromStores,
enabled
});
useEffect(() => {
const r7 = state[state4];
if (r7 != null) {
markAdContentSeen(AdCreativeType.BOUNTY, [r7.id]);
}
}, [state, state4]);
const callback6 = useCallback(() => {
dismissOnClose();
const r10 = state[state4];
if (r10 != null) {
const bountyVideoProgress = BountyStore.getBountyVideoProgress(r10.id);
let r11 = bountyVideoProgress?.maxTimestampSec;
if (r11 == null) {
r11 = 0;
}
let r14 = bountyVideoProgress?.duration;
if (r14 == null) {
r14 = 0;
}
const r1 = 1000 * rewardTimerSeconds;
trackAdContentEvent({
adContentId: r10.id,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_MODAL_CLOSED,
properties: {
content_name: getQuestContentName(QuestContent.VIDEO_MODAL_MOBILE),
content_id: QuestContent.VIDEO_MODAL_MOBILE,
video_progress: formatVideoProgressRatio(r11, r14),
threshold_met: 1000 * r11 >= r1,
reward_timer_seconds: r1 / 1000
},
sourceQuestContent
});
}
BountiesModalActionCreators.hideModal();
}, [state, state4, dismissOnClose, rewardTimerSeconds, sourceQuestContent]);
callback3 = useCallback(() => {
trackAdContentEvent({
adContentId: DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_MODAL_CLOSED,
properties: {
content_name: getQuestContentName(QuestContent.BOUNTIES_END_INTERSTITIAL),
content_id: QuestContent.BOUNTIES_END_INTERSTITIAL
},
sourceQuestContent
});
BountiesModalActionCreators.hideModal();
}, [sourceQuestContent]);
const Tt = function Tt(a0) {
sharedValue3.set(a0.contentOffset.y);
if (sharedValue2.get()) {
const r28 = Math.max(0, a0.contentSize.height - a0.layoutMeasurement.height);
sharedValue.set(a0.contentOffset.y >= 0 && a0.contentOffset.y <= r28);
}
};
Tt.__closure = {
scrollY: sharedValue3,
isDraggingSharedValue: sharedValue2,
isScrollingInBoundsSharedValue: sharedValue,
isScrollEventInBounds
};
Tt.__workletHash = 7942598540397;
Tt.__initData = __initData2;
const Bt = function Bt(a0) {
sharedValue2.set(true);
const r23 = Math.max(0, a0.contentSize.height - a0.layoutMeasurement.height);
sharedValue.set(a0.contentOffset.y >= 0 && a0.contentOffset.y <= r23);
};
Bt.__closure = {
isDraggingSharedValue: sharedValue2,
isScrollingInBoundsSharedValue: sharedValue,
isScrollEventInBounds
};
Bt.__workletHash = 14039038912528;
Bt.__initData = __initData3;
const Ct = function Ct(a0) {
const r6 = a0.contentOffset.y < 0 ? _AnalyticsTypes.VerticalScrollingDirection.DOWN : _AnalyticsTypes.VerticalScrollingDirection.UP;
_ReanimatedRexport.runOnJS(cancel)(r6);
sharedValue2.set(false);
if (!isAndroid) {
sharedValue.set(false);
}
};
Ct.__closure = {
VerticalScrollingDirection: _AnalyticsTypes.VerticalScrollingDirection,
runOnJS: _ReanimatedRexport.runOnJS,
cancelScrollAffordance: cancel,
isDraggingSharedValue: sharedValue2,
IS_ANDROID: isAndroid,
isScrollingInBoundsSharedValue: sharedValue
};
Ct.__workletHash = 10752087179842;
Ct.__initData = __initData4;
const It = function It(a0) {
if (c20862_17) {
_ReanimatedRexport.runOnJS(handleRecapMomentumEnd)(a0);
}
sharedValue.set(false);
};
It.__closure = {
showRecapPullZone: enabled,
runOnJS: _ReanimatedRexport.runOnJS,
handleRecapMomentumEnd,
isScrollingInBoundsSharedValue: sharedValue
};
It.__workletHash = 13684210320337;
It.__initData = __initData5;
const animatedScrollHandler = useAnimatedScrollHandler({
onScroll: Tt,
onBeginDrag: Bt,
onEndDrag: Ct,
onMomentumEnd: It
});
const xt = () => Math.min(Math.max(Math.round(sharedValue3.get() / slotHeight2), 0), c20862_16);
xt.__closure = {
scrollY: sharedValue3,
slotHeight: slotHeight2,
lastBountyIndex
};
xt.__workletHash = 14048843158960;
xt.__initData = __initData6;
const mt = function mt(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(callback2)(a0);
}
};
mt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
commitSwipe: callback2
};
mt.__workletHash = 14015091539518;
mt.__initData = __initData7;
useAnimatedReaction(xt, mt);
const wt = () => c20862_17 && sharedValue3.get() >= lastBounty - _useBountiesRecapScroll.RECAP_SNAP_EPSILON;
wt.__closure = {
showRecapPullZone: enabled,
scrollY: sharedValue3,
lastBountyScrollOffset: lastBounty,
RECAP_SNAP_EPSILON: _useBountiesRecapScroll.RECAP_SNAP_EPSILON
};
wt.__workletHash = 6584708256992;
wt.__initData = __initData8;
const yt = function yt(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(setState5)(a0);
}
};
yt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setShowRecapFooter: setState5
};
yt.__workletHash = 10788669301891;
yt.__initData = __initData9;
useAnimatedReaction(wt, yt);
const Nt = () => c20862_17 && sharedValue3.get() > lastBounty;
Nt.__closure = {
showRecapPullZone: enabled,
scrollY: sharedValue3,
lastBountyScrollOffset: lastBounty
};
Nt.__workletHash = 6186370630693;
Nt.__initData = __initData10;
const Mt = function Mt(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(setState2)(a0);
}
};
Mt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setIsRecapPageRevealed: setState2
};
Mt.__workletHash = 12713474352874;
Mt.__initData = __initData11;
useAnimatedReaction(Nt, Mt);
const Vt = () => c20862_17 && sharedValue3.get() >= fullRecap - _useBountiesRecapScroll.RECAP_SNAP_EPSILON;
Vt.__closure = {
showRecapPullZone: enabled,
scrollY: sharedValue3,
fullRecapScrollOffset: fullRecap,
RECAP_SNAP_EPSILON: _useBountiesRecapScroll.RECAP_SNAP_EPSILON
};
Vt.__workletHash = 5669564400667;
Vt.__initData = __initData12;
const bt = function bt(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(setState3)(a0);
}
};
bt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setIsRecapPageOnTop: setState3
};
bt.__workletHash = 8102193741774;
bt.__initData = __initData13;
useAnimatedReaction(Vt, bt);
const memo6 = useMemo(() => c20862_17 ? <BountiesRecapPullZone height={height3} /> : null, [height2, enabled]);
const memo7 = useMemo(() => [styles.listWrapper, {
top: 0,
left: memo.left,
width: memo.width,
height: memo.top + memo.height + 97
}], [styles.listWrapper, memo]);
const memo8 = useMemo(() => ({
paddingTop: memo.top,
paddingBottom: 97
}), [memo.top]);
memo4 = useMemo(() => ({
width: memo.width,
height: memo.height
}), [memo.width, memo.height]);
const memo9 = useMemo(() => [styles.closeButton, {
top: memo.top + Module712.space.PX_8,
left: memo.left + memo.width - Module712.space.PX_32 - Module712.space.PX_8
}], [styles.closeButton, memo.top, memo.left, memo.width]);
const memo10 = useMemo(() => [styles.autoScrollIndicator, {
top: memo.top + AUTO_SCROLL_PEEK_TOP_OFFSET + memo.height * AUTO_SCROLL_PEEK_SCALE + Module712.space.PX_32,
left: memo.left,
width: memo.width
}], [styles.autoScrollIndicator, memo.top, memo.height, memo.left, memo.width]);
const memo11 = useMemo(() => [styles.recapPage, {
top: memo.top,
left: memo.left,
width: memo.width,
height: height - memo.top,
...state3 ? {
zIndex: zIndex4
} : null
}], [state3, styles.recapPage, memo.top, memo.left, memo.width, height]);
const Ft = () => _useBountiesRecapScroll.getRevealProgress(sharedValue3.get(), lastBounty, height3);
Ft.__closure = {
getRevealProgress: _useBountiesRecapScroll.getRevealProgress,
scrollY: sharedValue3,
lastBountyScrollOffset: lastBounty,
recapRevealHeight: height2
};
Ft.__workletHash = 8427964721554;
Ft.__initData = __initData14;
derivedValue = useDerivedValue(Ft);
const Yt = () => ({
opacity: _ReanimatedRexport.interpolate(derivedValue.get(), [0, 1], [0, 1], _ReanimatedRexport.Extrapolation.CLAMP)
});
Yt.__closure = {
interpolate: _ReanimatedRexport.interpolate,
recapPullProgress: derivedValue,
Extrapolation: _ReanimatedRexport.Extrapolation
};
Yt.__workletHash = 1497321349449;
Yt.__initData = __initData15;
const animatedStyle = useAnimatedStyle(Yt);
const Jt = () => ({
opacity: _ReanimatedRexport.interpolate(derivedValue.get(), [FOOTER_FADE_START_PROGRESS, FOOTER_FADE_END_PROGRESS], [1, 0], _ReanimatedRexport.Extrapolation.CLAMP)
});
Jt.__closure = {
interpolate: _ReanimatedRexport.interpolate,
recapPullProgress: derivedValue,
FOOTER_FADE_START_PROGRESS,
FOOTER_FADE_END_PROGRESS,
Extrapolation: _ReanimatedRexport.Extrapolation
};
Jt.__workletHash = 3685190194249;
Jt.__initData = __initData16;
const animatedStyle2 = useAnimatedStyle(Jt);
const Ut = function Ut() {
return {
opacity: _ReanimatedRexport.interpolate(sharedValue3.get() >= lastBounty - slotHeight2 / 2 ? derivedValue.get() : _useBountiesRecapScroll.getRevealProgress(sharedValue3.get(), 0, height3), [FOOTER_FADE_START_PROGRESS, FOOTER_FADE_END_PROGRESS], [1, 0], _ReanimatedRexport.Extrapolation.CLAMP)
};
};
Ut.__closure = {
scrollY: sharedValue3,
lastBountyScrollOffset: lastBounty,
slotHeight: slotHeight2,
recapPullProgress: derivedValue,
getRevealProgress: _useBountiesRecapScroll.getRevealProgress,
recapRevealHeight: height2,
interpolate: _ReanimatedRexport.interpolate,
FOOTER_FADE_START_PROGRESS,
FOOTER_FADE_END_PROGRESS,
Extrapolation: _ReanimatedRexport.Extrapolation
};
Ut.__workletHash = 15092194442650;
Ut.__initData = __initData17;
const animatedStyle3 = useAnimatedStyle(Ut);
const memo12 = useMemo(() => [styles.peekGradient, {
left: memo.left,
width: memo.width,
top: memo.top + memo.height,
bottom: 0
}], [styles.peekGradient, memo.left, memo.width, memo.top, memo.height]);
const Gt = () => ({
opacity: _ReanimatedRexport.interpolate(sharedValue3.get(), [0, slotHeight2], [1, 0], _ReanimatedRexport.Extrapolation.CLAMP)
});
Gt.__closure = {
interpolate: _ReanimatedRexport.interpolate,
scrollY: sharedValue3,
slotHeight: slotHeight2,
Extrapolation: _ReanimatedRexport.Extrapolation
};
Gt.__workletHash = 5908400559291;
Gt.__initData = __initData18;
const animatedStyle4 = useAnimatedStyle(Gt);
const Zt = () => derivedValue.get() < FOOTER_FADE_END_PROGRESS;
Zt.__closure = {
recapPullProgress: derivedValue,
FOOTER_FADE_END_PROGRESS
};
Zt.__workletHash = 547045699209;
Zt.__initData = __initData19;
const Qt = function Qt(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(setState4)(a0);
}
};
Qt.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setIsCloseButtonPressable: setState4
};
Qt.__workletHash = 6290671204687;
Qt.__initData = __initData20;
useAnimatedReaction(Zt, Qt);
const callback7 = useCallback(({ item, index: index2 }) => {
const shouldLoadHls = ownedByVerticalScrollExperiment ? index2 === state4 || index2 === state4 + 1 : true;
const isActive = index2 === state4;
let isScrollIndicatorOverlayEnabled = hasRecurringSwipeUpNux3;
if (hasRecurringSwipeUpNux3) {
isScrollIndicatorOverlayEnabled = index2 === 0;
}
return <BountiesScrollVideoItemContainer index={index2} slotHeight={slotHeight2} scrollY={sharedValue3} style={memo4} isPeekEnabled={hasRecurringSwipeUpNux2}>
<BountiesScrollVideoItem key={item.id} bounty={item} sourceQuestContent={sourceQuestContent} width={memo.width} height={memo.height} index={index2} isActive={isActive} isRecapPageRevealed={state2} isRecapPageOnTop={state3} isScrollingInBoundsSharedValue={sharedValue} isScrollIndicatorOverlayEnabled={isScrollIndicatorOverlayEnabled} shouldLoadHls={shouldLoadHls} scrollAffordance={isAutoScrollEnabled ? memo3 : void 0} peekScale={isActive ? isAutoScrollEnabled ? peekScale : void 0 : void 0} softDownloadCapsEnabled={ownedByVerticalScrollExperiment2} />
</BountiesScrollVideoItemContainer>;
}, [slotHeight2, sharedValue3, memo4, hasRecurringSwipeUpNux2, isAutoScrollEnabled, peekScale, sourceQuestContent, memo.width, memo.height, state4, state2, state3, sharedValue, hasRecurringSwipeUpNux3, memo3, ownedByVerticalScrollExperiment, ownedByVerticalScrollExperiment]);
const memo13 = useMemo(() => ({
activeIndex: state4,
isRecapPageRevealed: state2,
isRecapPageOnTop: state3,
width: memo.width,
height: memo.height,
isPeekEnabled: hasRecurringSwipeUpNux2,
isAutoScrollEnabled,
canShowScrollIndicatorOverlay: hasRecurringSwipeUpNux3,
ownedByVerticalScrollExperiment,
isSoftCapPreload: ownedByVerticalScrollExperiment2
}), [state4, state2, state3, memo.width, memo.height, hasRecurringSwipeUpNux2, isAutoScrollEnabled, hasRecurringSwipeUpNux3, ownedByVerticalScrollExperiment, ownedByVerticalScrollExperiment]);
const callback8 = useCallback((a0) => {
a0.size = height2;
}, [height2]);
if (state.length === 0) {
return null;
}
const r496 = visible2 ? <BountiesScrollPromptNuxFooter /> : state8 ? <BountiesScrollRecapFooter orbAmount={stateFromStores} /> : null;
const r515 = [<BountiesAutoScrollOverlayNuxGradient active={peekActive} />, enabled ? <ReanimatedRexport.View style={[memo11, animatedStyle]} pointerEvents={state3 ? "box-none" : "none"}>
<QuestContentImpressionTrackerNative adContentId={DEFAULT_PLACEHOLDER_ENTRYPOINT_BOUNTY_ID} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.BOUNTIES_END_INTERSTITIAL} overrideVisibility={state3} sourceQuestContent={sourceQuestContent}>
{() => <BountiesScrollRecapPage orbAmount={bountiesRecapOrbCount} onClose={callback3} style={{
flex: 1
}} />}
</QuestContentImpressionTrackerNative>
</ReanimatedRexport.View> : null, <View style={memo7}>
<AnimatedFlashList ref={ref3} data={state} keyExtractor={(item) => item.id} renderItem={callback7} extraData={memo13} overrideItemLayout={callback8} ItemSeparatorComponent={ItemSeparator} ListFooterComponent={memo6} snapToOffsets={memo5} snapToEnd={false} decelerationRate={0.85} showsVerticalScrollIndicator={false} drawDistance={slotHeight2} onScroll={animatedScrollHandler} scrollEventThrottle={16} contentContainerStyle={memo8} />
</View>, hasRecurringSwipeUpNux2 ? state.length > 1 ? <ReanimatedRexport.View pointerEvents="none" style={[memo12, animatedStyle4]}>
<Module4611 colors={_excluded} style={StyleSheet.absoluteFill} />
</ReanimatedRexport.View> : null : null, <ReanimatedRexport.View style={[memo9, animatedStyle2]} pointerEvents={state7 ? "box-none" : "none"}>
{state7 ? <BountiesModalCloseButton onPress={callback6} /> : null}
</ReanimatedRexport.View>, visible ? <View style={memo10} pointerEvents="none">
<BountiesAutoScrollIndicator progress={progress} showProgressRing={showProgressRing} />
</View> : null, ,];
if (!visible2) {
visible2 = state8;
}
r515[6] = <BountiesScrollPromptFooter visible={visible2} onContentLayout={callback4} zIndex={zIndex4} opacityStyle={animatedStyle3}>{r496}</BountiesScrollPromptFooter>;
return <View style={styles.root}>{r515}</View>;
};
isAndroid = _Module501.isAndroid();
zIndex = 0;
zIndex2 = 1;
zIndex3 = 2;
zIndex4 = 3;
c9811_19 = 0.5625;
PX_8 = Module712.space.PX_8;
_excluded = ["rgba(0,0,0,0)", "rgba(0,0,0,0.75)"];
FOOTER_FADE_START_PROGRESS = 0.05;
FOOTER_FADE_END_PROGRESS = 0.1;
const isScrollEventInBounds2 = function isScrollEventInBounds(a0) {
const r12 = Math.max(0, a0.contentSize.height - a0.layoutMeasurement.height);
return a0.contentOffset.y >= 0 && a0.contentOffset.y <= r12;
};
isScrollEventInBounds2.__closure = {};
isScrollEventInBounds2.__workletHash = 14148486927190;
isScrollEventInBounds2.__initData = {
code: "function isScrollEventInBounds_BountiesModalContentScrollTsx1(event){const maxOffset=Math.max(0,event.contentSize.height-event.layoutMeasurement.height);return event.contentOffset.y>=0&&event.contentOffset.y<=maxOffset;}"
};
isScrollEventInBounds = isScrollEventInBounds2;
useStyles = createStyles(() => ({
root: {
flex: 1
},
recapPage: {
position: "absolute",
zIndex
},
listWrapper: {
position: "absolute",
zIndex: zIndex2,
overflow: "hidden"
},
closeButton: {
position: "absolute",
zIndex: zIndex4
},
peekGradient: {
position: "absolute",
zIndex: zIndex3
},
autoScrollIndicator: {
position: "absolute",
zIndex: zIndex4,
alignItems: "center"
}
}));
__initData = {
code: "function BountiesModalContentScrollTsx2(){const{scrollY,index,slotHeight,isPeekEnabled,PEEK_OPACITY,interpolate,FADE_DEADBAND,Extrapolation}=this.__closure;const signedDistance=(scrollY.get()-index*slotHeight)/slotHeight;const distance=Math.abs(signedDistance);const peekOpacity=isPeekEnabled&&signedDistance<0&&index===1?PEEK_OPACITY:0;const opacity=interpolate(distance,[0,FADE_DEADBAND,1],[1,1,peekOpacity],Extrapolation.CLAMP);return{opacity:opacity};}"
};
__initData2 = {
code: "function BountiesModalContentScrollTsx3(event){const{scrollY,isDraggingSharedValue,isScrollingInBoundsSharedValue,isScrollEventInBounds}=this.__closure;scrollY.set(event.contentOffset.y);if(isDraggingSharedValue.get()){isScrollingInBoundsSharedValue.set(isScrollEventInBounds(event));}}"
};
__initData3 = {
code: "function BountiesModalContentScrollTsx4(event){const{isDraggingSharedValue,isScrollingInBoundsSharedValue,isScrollEventInBounds}=this.__closure;isDraggingSharedValue.set(true);isScrollingInBoundsSharedValue.set(isScrollEventInBounds(event));}"
};
__initData4 = {
code: "function BountiesModalContentScrollTsx5(event){const{VerticalScrollingDirection,runOnJS,cancelScrollAffordance,isDraggingSharedValue,IS_ANDROID,isScrollingInBoundsSharedValue}=this.__closure;const scrollingDirection=event.contentOffset.y<0?VerticalScrollingDirection.DOWN:VerticalScrollingDirection.UP;runOnJS(cancelScrollAffordance)(scrollingDirection);isDraggingSharedValue.set(false);if(!IS_ANDROID){isScrollingInBoundsSharedValue.set(false);}}"
};
__initData5 = {
code: "function BountiesModalContentScrollTsx6(event){const{showRecapPullZone,runOnJS,handleRecapMomentumEnd,isScrollingInBoundsSharedValue}=this.__closure;if(showRecapPullZone){runOnJS(handleRecapMomentumEnd)(event);}isScrollingInBoundsSharedValue.set(false);}"
};
__initData6 = {
code: "function BountiesModalContentScrollTsx7(){const{scrollY,slotHeight,lastBountyIndex}=this.__closure;return Math.min(Math.max(Math.round(scrollY.get()/slotHeight),0),lastBountyIndex);}"
};
__initData7 = {
code: "function BountiesModalContentScrollTsx8(next,prev){const{runOnJS,commitSwipe}=this.__closure;if(next!==prev){runOnJS(commitSwipe)(next);}}"
};
__initData8 = {
code: "function BountiesModalContentScrollTsx9(){const{showRecapPullZone,scrollY,lastBountyScrollOffset,RECAP_SNAP_EPSILON}=this.__closure;return showRecapPullZone&&scrollY.get()>=lastBountyScrollOffset-RECAP_SNAP_EPSILON;}"
};
__initData9 = {
code: "function BountiesModalContentScrollTsx10(show,previousShow){const{runOnJS,setShowRecapFooter}=this.__closure;if(show!==previousShow){runOnJS(setShowRecapFooter)(show);}}"
};
__initData10 = {
code: "function BountiesModalContentScrollTsx11(){const{showRecapPullZone,scrollY,lastBountyScrollOffset}=this.__closure;return showRecapPullZone&&scrollY.get()>lastBountyScrollOffset;}"
};
__initData11 = {
code: "function BountiesModalContentScrollTsx12(revealed,previousRevealed){const{runOnJS,setIsRecapPageRevealed}=this.__closure;if(revealed!==previousRevealed){runOnJS(setIsRecapPageRevealed)(revealed);}}"
};
__initData12 = {
code: "function BountiesModalContentScrollTsx13(){const{showRecapPullZone,scrollY,fullRecapScrollOffset,RECAP_SNAP_EPSILON}=this.__closure;return showRecapPullZone&&scrollY.get()>=fullRecapScrollOffset-RECAP_SNAP_EPSILON;}"
};
__initData13 = {
code: "function BountiesModalContentScrollTsx14(onTop,previousOnTop){const{runOnJS,setIsRecapPageOnTop}=this.__closure;if(onTop!==previousOnTop){runOnJS(setIsRecapPageOnTop)(onTop);}}"
};
__initData14 = {
code: "function BountiesModalContentScrollTsx15(){const{getRevealProgress,scrollY,lastBountyScrollOffset,recapRevealHeight}=this.__closure;return getRevealProgress(scrollY.get(),lastBountyScrollOffset,recapRevealHeight);}"
};
__initData15 = {
code: "function BountiesModalContentScrollTsx16(){const{interpolate,recapPullProgress,Extrapolation}=this.__closure;return{opacity:interpolate(recapPullProgress.get(),[0,1],[0,1],Extrapolation.CLAMP)};}"
};
__initData16 = {
code: "function BountiesModalContentScrollTsx17(){const{interpolate,recapPullProgress,FOOTER_FADE_START_PROGRESS,FOOTER_FADE_END_PROGRESS,Extrapolation}=this.__closure;return{opacity:interpolate(recapPullProgress.get(),[FOOTER_FADE_START_PROGRESS,FOOTER_FADE_END_PROGRESS],[1,0],Extrapolation.CLAMP)};}"
};
__initData17 = {
code: "function BountiesModalContentScrollTsx18(){const{scrollY,lastBountyScrollOffset,slotHeight,recapPullProgress,getRevealProgress,recapRevealHeight,interpolate,FOOTER_FADE_START_PROGRESS,FOOTER_FADE_END_PROGRESS,Extrapolation}=this.__closure;const progress=scrollY.get()>=lastBountyScrollOffset-slotHeight/2?recapPullProgress.get():getRevealProgress(scrollY.get(),0,recapRevealHeight);return{opacity:interpolate(progress,[FOOTER_FADE_START_PROGRESS,FOOTER_FADE_END_PROGRESS],[1,0],Extrapolation.CLAMP)};}"
};
__initData18 = {
code: "function BountiesModalContentScrollTsx19(){const{interpolate,scrollY,slotHeight,Extrapolation}=this.__closure;return{opacity:interpolate(scrollY.get(),[0,slotHeight],[1,0],Extrapolation.CLAMP)};}"
};
__initData19 = {
code: "function BountiesModalContentScrollTsx20(){const{recapPullProgress,FOOTER_FADE_END_PROGRESS}=this.__closure;return recapPullProgress.get()<FOOTER_FADE_END_PROGRESS;}"
};
__initData20 = {
code: "function BountiesModalContentScrollTsx21(pressable,previousPressable){const{runOnJS,setIsCloseButtonPressable}=this.__closure;if(pressable!==previousPressable){runOnJS(setIsCloseButtonPressable)(pressable);}}"
};
export default function BountiesModalContentScroll(props) {
return <ThemeContextProvider theme={ThemeTypes.DARKER}>
<BountiesModalContentScrollInner initialBountyId={props.bountyId} sourceQuestContent={props.sourceQuestContent} />
</ThemeContextProvider>;
};
@@ -0,0 +1,56 @@
// Metro module 14088 (f14089).
import { StyleSheet, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import Module4611 from "../../../../_bundle/Module4611";
import BountiesEndCardPressableCta from "./BountiesEndCardPressableCta";
let __initData;
const useStyles = createStyles(() => ({
container: {
position: "absolute",
top: 0,
left: 0,
right: 0,
bottom: 0,
justifyContent: "center",
alignItems: "center"
},
backdropTint: {
...StyleSheet.absoluteFillObject,
backgroundColor: "rgba(241, 251, 169, 0.15)"
},
backdropGradient: {
...StyleSheet.absoluteFillObject
}
}));
__initData = {
code: "function BountiesModalEndCardTsx1(){const{withTiming,visible,timingStandard}=this.__closure;return{opacity:withTiming(visible?1:0,timingStandard)};}"
};
export default function BountiesModalEndCard(props) {
const bounty = props.bounty;
let visible2 = props.visible;
const visible = visible2;
const sourceQuestContent = props.sourceQuestContent;
const styles = useStyles();
const y = () => ({
opacity: _timing.withTiming(visible ? 1 : 0, _timingPresets.timingStandard)
});
y.__closure = {
withTiming: _timing.withTiming,
visible,
timingStandard: _timingPresets.timingStandard
};
y.__workletHash = 15062259404736;
y.__initData = __initData;
const animatedStyle = useAnimatedStyle(y);
if (visible) {
visible2 = <ReanimatedRexport.View style={[styles.container, animatedStyle]} pointerEvents="box-none">
<View style={styles.backdropTint} />
<Module4611 colors={["rgba(0, 0, 0, 0.60)", "rgba(0, 0, 0, 1)"]} locations={[0, 0.841]} style={styles.backdropGradient} />
<BountiesEndCardPressableCta bounty={bounty} sourceQuestContent={sourceQuestContent} />
</ReanimatedRexport.View>;
}
return visible2;
};
@@ -0,0 +1,61 @@
// Metro module 14072 (f14073).
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useGetQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { getBountyCtaInfo } from "./BountyCtaHelpers";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { openAdGameLinkDirectly } from "../../utils/QuestPlatformUtils";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContent } from "../../../../_bundle/Module5038";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { intl, t } from "../../../../intl/index.native";
let __initData;
const useStyles = createStyles(() => ({
container: {
gap: Module712.space.PX_8
}
}));
__initData = {
code: "function BountiesModalEndedCtaButtonsTsx1(){const{withTiming,visible,timingStandard}=this.__closure;return{opacity:withTiming(visible?1:0,timingStandard)};}"
};
export default function BountiesModalEndedCtaButtons(props) {
const bounty = props.bounty;
let visible2 = props.visible;
const visible = visible2;
const { sourceQuestContent, onClose, showCloseButton = true, disabled = false } = props;
const styles = useStyles();
const getQuestImpressionId = useGetQuestImpressionId();
const y = () => ({
opacity: _timing.withTiming(visible ? 1 : 0, _timingPresets.timingStandard)
});
y.__closure = {
withTiming: _timing.withTiming,
visible,
timingStandard: _timingPresets.timingStandard
};
y.__workletHash = 11417131685254;
y.__initData = __initData;
const animatedStyle = useAnimatedStyle(y);
const bountyCtaInfo = getBountyCtaInfo(bounty);
if (visible) {
visible2 = <ReanimatedRexport.View style={[styles.container, animatedStyle]}>
<Button variant="primary-overlay" text={bountyCtaInfo.buttonLabel} size="lg" disabled={disabled} onPress={() => {
openAdGameLinkDirectly({
adContentId: bounty.id,
adCreativeType: AdCreativeType.BOUNTY,
cta: bounty.cta
}, {
content: QuestContent.VIDEO_MODAL_END_CARD,
ctaContent: QuestContentCTA.OPEN_GAME_LINK,
impressionId: getQuestImpressionId(),
sourceQuestContent
});
}} />
{showCloseButton ? <Button variant="secondary-overlay" text={intl.string(t.cpT0Cq)} size="lg" disabled={disabled} onPress={onClose} /> : null}
</ReanimatedRexport.View>;
}
return visible2;
};
@@ -0,0 +1,98 @@
// Metro module 14062 (f14063).
import { useState } from "react";
import { StyleSheet, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
let __initData, __initData2;
const useStyles = createStyles(() => ({
progressContainer: {
height: 4
},
progressTrack: {
...StyleSheet.absoluteFillObject,
borderRadius: Module712.radii.round,
backgroundColor: Module712.colors.CONTROL_OVERLAY_SECONDARY_BACKGROUND_DEFAULT,
opacity: 0.54
},
progressBar: {
position: "absolute",
height: "100%",
left: 0,
bottom: 0,
borderRadius: Module712.radii.round,
backgroundColor: Module712.unsafe_rawColors.GREEN_300,
shadowOffset: {
width: 0,
height: 0
},
shadowRadius: 8,
shadowOpacity: 1,
elevation: 4,
shadowColor: "#30C773"
},
progressBarGlowLayer: {
position: "absolute",
height: "100%",
left: 0,
bottom: 0,
borderRadius: Module712.radii.round,
backgroundColor: Module712.unsafe_rawColors.GREEN_300,
shadowOffset: {
width: 0,
height: 0
},
shadowRadius: 12,
shadowOpacity: 1,
elevation: 8,
shadowColor: Module712.unsafe_rawColors.GREEN_300
}
}));
__initData = {
code: "function BountiesModalProgressTsx1(){const{withTiming,visible,timingFast}=this.__closure;return{opacity:withTiming(visible?1:0,timingFast)};}"
};
__initData2 = {
code: "function BountiesModalProgressTsx2(){const{withTiming,progress,shouldSkipAnimation,timingNone,timingFast}=this.__closure;return{width:withTiming(progress*100+\"%\",shouldSkipAnimation?timingNone:timingFast,'animate-always')};}"
};
export default function BountiesModalProgress(props) {
const { progress, visible, style } = props;
const styles = useStyles();
const [state, setState] = useState(false);
const [state2, setState2] = useState(progress);
if (progress !== state2) {
setState2(progress);
setState(progress < state2);
}
const O = () => ({
opacity: _timing.withTiming(visible ? 1 : 0, _timingPresets.timingFast)
});
O.__closure = {
withTiming: _timing.withTiming,
visible,
timingFast: _timingPresets.timingFast
};
O.__workletHash = 5158131592262;
O.__initData = __initData;
const animatedStyle = useAnimatedStyle(O);
const B = () => ({
width: _timing.withTiming(100 * progress + "%", state ? _timingPresets.timingNone : _timingPresets.timingFast, "animate-always")
});
B.__closure = {
withTiming: _timing.withTiming,
progress,
shouldSkipAnimation: state,
timingNone: _timingPresets.timingNone,
timingFast: _timingPresets.timingFast
};
B.__workletHash = 15586067343237;
B.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(B);
return <ReanimatedRexport.View style={[styles.progressContainer, style, animatedStyle]}>
<View style={styles.progressTrack} />
<ReanimatedRexport.View style={[styles.progressBarGlowLayer, animatedStyle2]} />
<ReanimatedRexport.View style={[styles.progressBar, animatedStyle2]} />
</ReanimatedRexport.View>;
};
export const PROGRESS_BAR_HEIGHT = 4;
@@ -0,0 +1,171 @@
// Metro module 14068 (f14069).
import { useEffect, useRef } from "react";
import { View } from "react-native";
import { SMALL_BUTTON_HEIGHT } from "../../../../design/components/Button/native/ButtonConstants.native";
import ReanimatedRexport, { Easing, useSharedValue, withSequence, withDelay, useAnimatedProps, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import Module8531, { Circle } from "../../../../_bundle/Module8531";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { isAndroid } from "../../../../utils/PlatformUtils";
import { withTiming } from "../../../../design/animation/reanimated/timing/timing";
import { Text } from "../../../../design/components/Text/native/Text";
import { CheckmarkSmallBoldIcon } from "../../../../design/components/Icon/native/redesign/generated/CheckmarkSmallBoldIcon";
const stroke = "#2ECC71";
let c9839_8 = (SMALL_BUTTON_HEIGHT - 4) / 2;
const PROGRESS_CIRCUMFERENCE = 2 * Math.PI * c9839_8;
const easing = Easing.bezier(0.15, 0.21, 0.58, 1);
const easing2 = Easing.bezier(0.61, 0, 0.58, 1);
const easing3 = Easing.bezier(0.42, 0, 0.58, 1);
const AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Circle);
const useStyles = createStyles({
progress: {
alignItems: "center",
justifyContent: "center",
backgroundColor: Module712.colors.CONTROL_OVERLAY_SECONDARY_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.round,
width: SMALL_BUTTON_HEIGHT,
height: SMALL_BUTTON_HEIGHT
},
ring: {
position: "absolute",
transform: [{
rotate: "-90deg"
}]
},
trackPath: {
color: Module712.colors.BACKGROUND_SURFACE_HIGHEST
},
countdownText: {
color: Module712.colors.CONTROL_OVERLAY_SECONDARY_TEXT_DEFAULT,
lineHeight: isAndroid() ? 14 : void 0
},
checkmarkLayer: {
position: "absolute",
inset: 6,
alignItems: "center",
justifyContent: "center"
},
checkmarkBackground: {
width: 20,
height: 20,
backgroundColor: "#2ECC71",
borderRadius: Module712.radii.round
},
checkmarkIcon: {
width: 20,
height: 20
}
});
const __initData = {
code: "function BountiesModalTimerTsx1(){const{PROGRESS_CIRCUMFERENCE,animatedProgress}=this.__closure;return{strokeDashoffset:PROGRESS_CIRCUMFERENCE-PROGRESS_CIRCUMFERENCE*animatedProgress.get()};}"
};
const __initData2 = {
code: "function BountiesModalTimerTsx2(){const{checkmarkBackgroundScale}=this.__closure;return{transform:[{scale:checkmarkBackgroundScale.get()}]};}"
};
const __initData3 = {
code: "function BountiesModalTimerTsx3(){const{checkmarkScale}=this.__closure;return{transform:[{scale:checkmarkScale.get()}]};}"
};
export default function BountiesModalTimer(props) {
let r31;
let ref;
const { isCompleted, totalSeconds, remainingSeconds } = props;
ref = void 0;
const styles = useStyles();
const r12 = isCompleted || remainingSeconds <= 0;
let c20883_0 = r12;
const r21 = Math.max(1, Math.ceil(remainingSeconds));
let c20883_1 = 0;
if (isCompleted) {
c20883_1 = 1;
r31 = 1;
} else {
const r5 = totalSeconds > 0;
r31 = 0;
if (r5) {
const r3 = 1 - remainingSeconds / totalSeconds;
c20883_1 = r3;
r31 = r3;
}
}
const sharedValue = useSharedValue(r31);
const sharedValue2 = useSharedValue(0);
const sharedValue3 = useSharedValue(0);
useEffect(() => {
sharedValue.set(withTiming(c20883_1, {
duration: 500
}, "animate-always"));
}, [sharedValue, r31]);
ref = useRef(false);
useEffect(() => {
const current = ref.current;
ref.current = true;
if (c20883_0) {
if (current) {
sharedValue2.set(withSequence(withTiming(1.65, {
duration: 267,
easing
}), withTiming(1, {
duration: 233,
easing: easing2
})));
sharedValue3.set(withDelay(167, withSequence(withTiming(1.25, {
duration: 167,
easing: easing3
}), withTiming(1, {
duration: 333,
easing: easing3
}))));
} else {
sharedValue2.set(1);
sharedValue3.set(1);
}
} else {
sharedValue2.set(0);
sharedValue3.set(0);
}
}, [r12, sharedValue2, sharedValue3]);
const U = () => ({
strokeDashoffset: PROGRESS_CIRCUMFERENCE - PROGRESS_CIRCUMFERENCE * sharedValue.get()
});
U.__closure = {
PROGRESS_CIRCUMFERENCE,
animatedProgress: sharedValue
};
U.__workletHash = 12964700773124;
U.__initData = __initData;
const animatedProps = useAnimatedProps(U);
const x = () => ({
transform: [{
scale: sharedValue2.get()
}]
});
x.__closure = {
checkmarkBackgroundScale: sharedValue2
};
x.__workletHash = 10834015407160;
x.__initData = __initData2;
const animatedStyle = useAnimatedStyle(x);
const G = () => ({
transform: [{
scale: sharedValue3.get()
}]
});
G.__closure = {
checkmarkScale: sharedValue3
};
G.__workletHash = 7510845920441;
G.__initData = __initData3;
return <View style={styles.progress}>
<Module8531 height={SMALL_BUTTON_HEIGHT} width={SMALL_BUTTON_HEIGHT} style={styles.ring}>
<Circle cx={SMALL_BUTTON_HEIGHT / 2} cy={SMALL_BUTTON_HEIGHT / 2} r={c9839_8} fill="none" stroke={styles.trackPath.color} strokeWidth={4} />
<AnimatedComponent cx={SMALL_BUTTON_HEIGHT / 2} cy={SMALL_BUTTON_HEIGHT / 2} r={c9839_8} fill="none" stroke={stroke} strokeWidth={4} strokeDasharray={PROGRESS_CIRCUMFERENCE} strokeLinecap="round" animatedProps={animatedProps} />
</Module8531>
{r12 ? !r12 : <Text variant="text-sm/semibold" style={styles.countdownText} maxFontSizeMultiplier={1}>{r21}</Text>}
<ReanimatedRexport.View style={[styles.checkmarkLayer, animatedStyle]}>
<View style={styles.checkmarkBackground} />
</ReanimatedRexport.View>
<ReanimatedRexport.View style={[styles.checkmarkLayer, useAnimatedStyle(G)]}>
<CheckmarkSmallBoldIcon size="custom" color={Module712.colors.CONTROL_OVERLAY_PRIMARY_TEXT_DEFAULT} style={styles.checkmarkIcon} />
</ReanimatedRexport.View>
</View>;
};
@@ -0,0 +1,149 @@
// Metro module 14069 (f14070).
import { useCallback } from "react";
import { Pressable, StyleSheet, View } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { useIsBountiesVerticalScrollExperimentEnabled } from "../../experiments/BountiesVerticalScrollExperiment";
import { getBountyCtaInfo } from "./BountyCtaHelpers";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import Module4611 from "../../../../_bundle/Module4611";
import BountiesEndCardPressableCta from "./BountiesEndCardPressableCta";
import BountiesModalEndedCtaButtons from "./BountiesModalEndedCtaButtons";
import { Text } from "../../../../design/components/Text/native/Text";
import { RetryIcon } from "../../../../design/components/Icon/native/redesign/generated/RetryIcon";
import { useIsBountiesModalTransitionsRefactorEnabled } from "../../experiments/BountiesModalTransitionsRefactorExperiment";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useVisibilityTransition } from "./useVisibilityTransition";
import AnimatedEnterExitItem from "../../../../design/components/AnimatedEnterExitItem/native/AnimatedEnterExitItem";
let useStyles, t, n, __initData;
const BountiesScrollEndCardContent = function BountiesScrollEndCardContent(props) {
const { bounty, visible, onReplay, isActive, isScrollingInBoundsSharedValue, sourceQuestContent, opacityStyle } = props;
const styles = useStyles();
const isBountiesVerticalScrollExperimentEnabled = useIsBountiesVerticalScrollExperimentEnabled("BountiesScrollEndCard");
const bountyCtaInfo = getBountyCtaInfo(bounty);
const accessibilityLabel = intl.string(_index_native.t["9UtZAY"]);
const y = function y() {
const r4 = isScrollingInBoundsSharedValue == null ? void 0 : isScrollingInBoundsSharedValue.get();
return {
opacity: _timing.withTiming(isActive ? r4 !== true ? 1 : 0 : 0, _timingPresets.timingStandard)
};
};
y.__closure = {
isScrollingInBoundsSharedValue,
withTiming: _timing.withTiming,
isActive,
timingStandard: _timingPresets.timingStandard
};
y.__workletHash = 4903386092677;
y.__initData = __initData;
const animatedStyle = useAnimatedStyle(y);
return <ReanimatedRexport.View style={[styles.container, opacityStyle]} pointerEvents="box-none">
<View style={styles.backdropTint} pointerEvents="none" />
<Module4611 colors={["rgba(0, 0, 0, 0.48)", "rgba(0, 0, 0, 0.8)"]} style={styles.backdropGradient} pointerEvents="none" />
{isBountiesVerticalScrollExperimentEnabled ? <ReanimatedRexport.View style={[styles.overlayContent, animatedStyle]} pointerEvents="box-none">
<BountiesEndCardPressableCta bounty={bounty} sourceQuestContent={sourceQuestContent} disabled={!isActive} />
<View style={styles.endedCtaButtonsContainer} pointerEvents="box-none">
<BountiesModalEndedCtaButtons bounty={bounty} visible={visible} sourceQuestContent={sourceQuestContent} onClose={() => {}} showCloseButton={false} disabled={!isActive} />
</View>
</ReanimatedRexport.View> : <Pressable onPress={isActive ? onReplay : void 0} disabled={!isActive} accessibilityRole="button" accessibilityLabel={accessibilityLabel} style={styles.pressable}>
<ReanimatedRexport.View style={[styles.overlayContent, animatedStyle]}>
<View style={styles.textBlock}>
<Text variant="heading-md/semibold" color="text-strong">{bountyCtaInfo.label}</Text>
<Text variant="heading-sm/medium" color="text-default">{accessibilityLabel}</Text>
</View>
<RetryIcon accessible={false} color={Module712.colors.CONTROL_OVERLAY_SECONDARY_TEXT_DEFAULT} style={styles.replayIcon} />
</ReanimatedRexport.View>
</Pressable>}
</ReanimatedRexport.View>;
};
useStyles = createStyles(() => ({
container: {
...StyleSheet.absoluteFillObject
},
backdropTint: {
...StyleSheet.absoluteFillObject,
backgroundColor: "rgba(0, 0, 0, 0.6)"
},
backdropGradient: {
...StyleSheet.absoluteFillObject
},
overlayContent: {
...StyleSheet.absoluteFillObject,
justifyContent: "center",
alignItems: "center"
},
pressable: {
...StyleSheet.absoluteFillObject,
justifyContent: "center",
alignItems: "center"
},
textBlock: {
alignItems: "center",
gap: Module712.space.PX_4
},
replayIcon: {
margin: Module712.space.PX_12
},
endedCtaButtonsContainer: {
position: "absolute",
left: Module712.space.PX_16,
right: Module712.space.PX_16,
bottom: Module712.space.PX_16
}
}));
const r36 = function t(a0) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingStandard, "respect-motion-settings")
};
};
r36.__closure = {
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r36.__workletHash = 12127714049951;
r36.__initData = {
code: "function BountiesScrollEndCardTsx1(visible){const{withTiming,timingStandard}=this.__closure;return{opacity:withTiming(visible,timingStandard,'respect-motion-settings')};}"
};
t = r36;
const r45 = function n(a0, a1) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingStandard, "respect-motion-settings", a1)
};
};
r45.__closure = {
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r45.__workletHash = 7470211880124;
r45.__initData = {
code: "function BountiesScrollEndCardTsx2(visible,cleanUp){const{withTiming,timingStandard}=this.__closure;return{opacity:withTiming(visible,timingStandard,'respect-motion-settings',cleanUp)};}"
};
n = r45;
__initData = {
code: "function BountiesScrollEndCardTsx3(){const{isScrollingInBoundsSharedValue,withTiming,isActive,timingStandard}=this.__closure;var _isScrollingInBoundsS;const isScrollingInBounds=((_isScrollingInBoundsS=isScrollingInBoundsSharedValue)===null||_isScrollingInBoundsS===void 0?void 0:_isScrollingInBoundsS.get())===true;return{opacity:withTiming(isActive&&!isScrollingInBounds?1:0,timingStandard)};}"
};
export default function BountiesScrollEndCard(props) {
const visible = props.visible;
const isBountiesModalTransitionsRefactorEnabled = useIsBountiesModalTransitionsRefactorEnabled(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const callback = useCallback((a0, a1) => <BountiesScrollEndCardContent {...a0} opacityStyle={a1} />, []);
const visibilityTransition = useVisibilityTransition({
visible,
entranceTiming: _timingPresets.timingStandard,
exitTiming: _timingPresets.timingStandard
});
const opacityStyle = visibilityTransition.opacityStyle;
let shouldRender = visibilityTransition.shouldRender;
if (isBountiesModalTransitionsRefactorEnabled) {
shouldRender = <AnimatedEnterExitItem useReducedMotion={stateFromStores} item={visible ? props : void 0} entering={t} exiting={n} renderItem={callback} />;
} else if (shouldRender) {
shouldRender = <BountiesScrollEndCardContent {...props} opacityStyle={opacityStyle} />;
}
return shouldRender;
};
@@ -0,0 +1,32 @@
// Metro module 14065 (f14066).
import { useState } from "react";
import { View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { useToken } from "../../../../design/tokens/native/useToken";
import Module712 from "../../../../_bundle/Module712";
import { BountiesScrollIndicatorRive } from "../../../../_bundle/Module3901";
const useStyles = createStyles(() => ({
container: {
width: 80,
height: 80
}
}));
export default function BountiesScrollIndicatorAnimation(props) {
const { visible, isFadingInContent } = props;
const styles = useStyles();
const token = useToken(Module712.colors.TEXT_DEFAULT);
const [key, setState] = useState(0);
const [state, setState2] = useState(visible);
if (visible !== state) {
setState2(visible);
if (visible) {
setState((prevState) => prevState + 1);
}
}
return <View style={styles.container}>
<BountiesScrollIndicatorRive key={key} stateMachine="State Machine 1" fit="contain" dataBinding={{
color: token,
startAnimation: !isFadingInContent
}} />
</View>;
};
@@ -0,0 +1,186 @@
// Metro module 14064 (f14065).
import { useState, useEffect, useCallback } from "react";
import { StyleSheet } from "react-native";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { timingSlowDuration } from "../../../../design/animation/reanimated/timing/timingPresets";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import Module4611 from "../../../../_bundle/Module4611";
import BountiesScrollIndicatorAnimation from "./BountiesScrollIndicatorAnimation";
import { Text } from "../../../../design/components/Text/native/Text";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
function $mk118410($env) {
return () => {
let env32054;
const r8 = $env.$parent.$parent[1];
const r0 = $env[0];
r8(r0);
const r10 = $env.$parent;
const r11 = env32054 = {
$parent: r10
};
env32054[0] = !r0;
const r6 = setTimeout;
const r12 = r0 ? r10.$parent.$parent[9] : 5000;
r10[0] = r6($mk118410(r11), r12);
};
}
let c9835_11, c9835_12, c9835_13, c9835_14;
let env9835 = {};
const _excluded = ["rgba(0,0,0,0)", "rgba(0,0,0,0.7)", "rgba(0,0,0,1)"];
const c9835_9 = 5000 + timingSlowDuration;
const useStyles = createStyles(() => ({
scrollIndicator: {
position: "absolute",
left: 0,
right: 0,
bottom: 0,
height: "45%",
alignItems: "center",
justifyContent: "center",
paddingHorizontal: Module712.space.PX_16
},
scrollIndicatorContent: {
position: "absolute",
bottom: 124,
left: 0,
right: 0,
alignItems: "center",
justifyContent: "flex-start",
gap: Module712.space.PX_8
},
scrollIndicatorText: {
textAlign: "center"
}
}));
c9835_11 = {
code: "function BountiesScrollIndicatorOverlayTsx1(){const{withTiming,visible,enabled,timingSlow,timingStandard,runOnJS,animationCallbackJSThread}=this.__closure;return{opacity:withTiming(visible?1:0,enabled?timingSlow:timingStandard,'respect-motion-settings',function(){'worklet';runOnJS(animationCallbackJSThread)();})};}"
};
c9835_12 = {
code: "function BountiesScrollIndicatorOverlayTsx2(){const{runOnJS,animationCallbackJSThread}=this.__closure;runOnJS(animationCallbackJSThread)();}"
};
c9835_13 = {
code: "function BountiesScrollIndicatorOverlayTsx3(){const{withTiming,visible,isEndCardVisible,enabled,timingStandard,timingSlow}=this.__closure;return{opacity:withTiming(visible&&!isEndCardVisible?1:0,isEndCardVisible||!enabled?timingStandard:timingSlow)};}"
};
c9835_14 = {
code: "function BountiesScrollIndicatorOverlayTsx4(){const{withTiming,visible,timingStandard}=this.__closure;return{transform:[{scale:withTiming(visible?1:0.9,timingStandard)}]};}"
};
export default function BountiesScrollIndicatorOverlay(props) {
let state, setState, callback;
const { enabled, isEndCardVisible, opacityStyle } = props;
state = void 0;
setState = void 0;
callback = void 0;
const styles = useStyles();
let env20880 = {
$parent: env9835
};
env20880[0] = enabled;
env20880[1] = void 0;
const [state2, setState2] = useState(true);
env20880[1] = setState2;
const [state3, setState3] = useState(enabled);
if (enabled !== state3) {
setState3(enabled);
if (enabled) {
setState2(true);
}
}
useEffect(() => {
if (env20880[0]) {
let env30695;
let env30696;
const r6 = env30695 = {
$parent: env20880
};
const r2 = env30696 = {
$parent: r6
};
env30696[0] = false;
env30695[0] = setTimeout($mk118410(r2), c9835_9);
return () => clearTimeout(env30695[0]);
}
}, [enabled]);
state = enabled ? state2 : enabled;
let isFadingInContent;
[isFadingInContent, setState] = useState(state);
const [state4, setState4] = useState(state);
if (state !== state4) {
setState4(state);
if (state) {
setState(true);
}
}
callback = useCallback(() => {
setState(false);
}, []);
const E = () => {
const r0 = state ? 1 : 0;
const r6 = enabled ? _timingPresets.timingSlow : _timingPresets.timingStandard;
const t = function t() {
_ReanimatedRexport.runOnJS(callback)();
};
t.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
animationCallbackJSThread: callback
};
t.__workletHash = 7847207274031;
t.__initData = c9835_12;
return {
opacity: _timing.withTiming(r0, r6, "respect-motion-settings", t)
};
};
E.__closure = {
withTiming: _timing.withTiming,
visible: state,
enabled,
timingSlow: _timingPresets.timingSlow,
timingStandard: _timingPresets.timingStandard,
runOnJS: _ReanimatedRexport.runOnJS,
animationCallbackJSThread: callback
};
E.__workletHash = 2813930896935;
E.__initData = c9835_11;
const animatedStyle = useAnimatedStyle(E);
const j = () => ({
opacity: _timing.withTiming(state ? isEndCardVisible ? 0 : 1 : 0, !isEndCardVisible && enabled ? _timingPresets.timingSlow : _timingPresets.timingStandard)
});
j.__closure = {
withTiming: _timing.withTiming,
visible: state,
isEndCardVisible,
enabled,
timingStandard: _timingPresets.timingStandard,
timingSlow: _timingPresets.timingSlow
};
j.__workletHash = 12172713560290;
j.__initData = c9835_13;
const animatedStyle2 = useAnimatedStyle(j);
const A = () => ({
transform: [{
scale: _timing.withTiming(state ? 1 : 0.9, _timingPresets.timingStandard)
}]
});
A.__closure = {
withTiming: _timing.withTiming,
visible: state,
timingStandard: _timingPresets.timingStandard
};
A.__workletHash = 4041303236067;
A.__initData = c9835_14;
return <ReanimatedRexport.View style={[styles.scrollIndicator, opacityStyle]} pointerEvents="none">
<ReanimatedRexport.View style={[StyleSheet.absoluteFill, animatedStyle2]}>
<Module4611 colors={_excluded} style={StyleSheet.absoluteFill} />
</ReanimatedRexport.View>
<ReanimatedRexport.View style={[styles.scrollIndicatorContent, [animatedStyle, useAnimatedStyle(A)]]}>
<BountiesScrollIndicatorAnimation visible={state} isFadingInContent={isFadingInContent} />
<Text variant="text-sm/semibold" color="text-default" style={styles.scrollIndicatorText}>
{intl.string(_index_native.t.eafsh4)}
</Text>
</ReanimatedRexport.View>
</ReanimatedRexport.View>;
};
@@ -0,0 +1,103 @@
// Metro module 14036 (f14037).
import { useMemo, useCallback } from "react";
import { StyleSheet } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { useStateFromStores } from "../../../../_bundle/Module589";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { BountiesScrollGradientRive } from "../../../../_bundle/Module3901";
import { useIsBountiesModalTransitionsRefactorEnabled } from "../../experiments/BountiesModalTransitionsRefactorExperiment";
import { useVisibilityTransition } from "./useVisibilityTransition";
import AnimatedEnterExitItem from "../../../../design/components/AnimatedEnterExitItem/native/AnimatedEnterExitItem";
let useStyles, t, n;
const BountiesScrollPromptFooterContent = function BountiesScrollPromptFooterContent(props) {
let c20864_1;
const { children, onContentLayout, zIndex, opacityStyle, visibilityOpacityStyle } = props;
c20864_1 = void 0;
const styles = useStyles();
const memo = useMemo(() => zIndex != null ? {
zIndex
} : void 0, [zIndex]);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const safeAreaInsets_native = useSafeAreaInsets_native();
c20864_1 = safeAreaInsets_native;
return <ReanimatedRexport.View style={[styles.root, visibilityOpacityStyle, memo]} pointerEvents="none">
<ReanimatedRexport.View style={[styles.gradient, opacityStyle]}>
<BountiesScrollGradientRive stateMachine="State Machine 1" fit="fill" alignment="bottom-center" withReducedMotion={stateFromStores ? "halt" : "play"} />
</ReanimatedRexport.View>
<ReanimatedRexport.View style={[styles.content, useMemo(() => ({
paddingBottom: Math.max(c20864_1.bottom, Module712.space.PX_8)
}), [safeAreaInsets_native.bottom]), opacityStyle]} onLayout={onContentLayout}>{children}</ReanimatedRexport.View>
</ReanimatedRexport.View>;
};
useStyles = createStyles(() => ({
root: {
position: "absolute",
bottom: 0,
left: 0,
right: 0
},
content: {
flex: 1,
minHeight: 97,
alignItems: "center",
justifyContent: "center",
paddingHorizontal: Module712.space.PX_16
},
gradient: {
...StyleSheet.absoluteFillObject
}
}));
const r34 = function t(a0) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingStandard, "respect-motion-settings")
};
};
r34.__closure = {
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r34.__workletHash = 11416950434629;
r34.__initData = {
code: "function BountiesScrollPromptFooterTsx1(visible){const{withTiming,timingStandard}=this.__closure;return{opacity:withTiming(visible,timingStandard,'respect-motion-settings')};}"
};
t = r34;
const r43 = function n(a0, a1) {
return {
opacity: _timing.withTiming(a0, _timingPresets.timingStandard, "respect-motion-settings", a1)
};
};
r43.__closure = {
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r43.__workletHash = 9928471408966;
r43.__initData = {
code: "function BountiesScrollPromptFooterTsx2(visible,cleanUp){const{withTiming,timingStandard}=this.__closure;return{opacity:withTiming(visible,timingStandard,'respect-motion-settings',cleanUp)};}"
};
n = r43;
export default function BountiesScrollPromptFooter(props) {
const { visible, ...props2 } = props;
const isBountiesModalTransitionsRefactorEnabled = useIsBountiesModalTransitionsRefactorEnabled(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const callback = useCallback((a0, a1) => <BountiesScrollPromptFooterContent {...a0} visibilityOpacityStyle={a1} />, []);
const visibilityTransition = useVisibilityTransition({
visible,
entranceTiming: _timingPresets.timingStandard,
exitTiming: _timingPresets.timingStandard
});
const opacityStyle = visibilityTransition.opacityStyle;
let shouldRender = visibilityTransition.shouldRender;
if (isBountiesModalTransitionsRefactorEnabled) {
shouldRender = <AnimatedEnterExitItem useReducedMotion={stateFromStores} item={visible ? props2 : void 0} entering={t} exiting={n} renderItem={callback} />;
} else if (shouldRender) {
shouldRender = <BountiesScrollPromptFooterContent {...props2} visibilityOpacityStyle={opacityStyle} />;
}
return shouldRender;
};
export const BOUNTIES_MODAL_BASE_FOOTER_HEIGHT = 97;
@@ -0,0 +1,29 @@
// Metro module 14073 (f14074).
import { View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
const useStyles = createStyles(() => ({
root: {
alignItems: "center",
gap: 2
},
titleText: {
textAlign: "center"
},
swipeText: {
textAlign: "center",
textTransform: "uppercase"
}
}));
export default function BountiesScrollPromptFooter() {
const styles = useStyles();
return <View style={styles.root}>
<Text variant="text-md/semibold" color="text-default" style={styles.titleText}>
{intl.string(t.H57f41)}
</Text>
<Text variant="text-xxs/semibold" color="text-muted" style={styles.swipeText}>
{intl.string(t.tG0zsk)}
</Text>
</View>;
};
@@ -0,0 +1,53 @@
// Metro module 14074 (f14075).
import { View } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { isIOS } from "../../../../utils/PlatformUtils";
import { intl, t } from "../../../../intl/index.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { OrbsIcon } from "../../../../design/components/Icon/native/redesign/generated/OrbsIcon";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { BountiesScrollGradientRive } from "../../../../_bundle/Module3901";
const useStyles = createStyles(() => ({
container: {
flex: 1,
alignItems: "center",
justifyContent: "center",
gap: Module712.space.PX_4
},
headerLabel: {
textTransform: "uppercase"
},
orbRow: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
},
rive: {
flex: 1,
width: "100%"
},
orbAmount: {
marginTop: isIOS() ? 6 : 0
}
}));
export function BountiesScrollRecapFooter(props) {
const orbAmount = props.orbAmount;
const styles = useStyles();
const r6 = intl.string(t.d6Rrn6);
return <View style={styles.container} pointerEvents="none" accessible accessibilityRole="text" accessibilityLabel={`${r6}, +${orbAmount}`}>
<Text variant="text-xs/bold" color="text-brand" style={styles.headerLabel} accessible={false}>{r6}</Text>
<View style={styles.orbRow} accessible={false} importantForAccessibility="no-hide-descendants">
<OrbsIcon size="sm" color="icon-strong" accessible={false} />
<Text variant="display-sm" color="text-strong" accessible={false} style={styles.orbAmount}>
{`+${orbAmount}`}
</Text>
</View>
</View>;
}
export function BountiesScrollRecapFooterGradient() {
return <View style={useStyles().rive}>
<BountiesScrollGradientRive stateMachine="State Machine 1" fit="fill" alignment="bottom-center" withReducedMotion={useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion) ? "halt" : "play"} />
</View>;
}
@@ -0,0 +1,112 @@
// Metro module 14076 (f14077).
import { StyleSheet, View } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import Module712 from "../../../../_bundle/Module712";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { isAndroid, isIOS } from "../../../../utils/PlatformUtils";
import { APNGPlayer } from "../../../image/native/APNGPlayer.android";
import Module14077 from "../../../../_bundle/Module14077";
import { VideoComponent } from "../../../../components_native/common/Video";
import Module14078 from "../../../../_bundle/Module14078";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import Module14079 from "../../../../_bundle/Module14079";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { OrbsIcon } from "../../../../design/components/Icon/native/redesign/generated/OrbsIcon";
import { Button } from "../../../../design/components/Button/native/Button.native";
let lg, useStyles;
const BountiesRecapOrbsBackground = function BountiesRecapOrbsBackground(props) {
const { style, reducedMotion } = props;
return isAndroid() ? <View style={style} needsOffscreenAlphaCompositing renderToHardwareTextureAndroid pointerEvents="none">
<APNGPlayer url={Module14077} style={StyleSheet.absoluteFillObject} autoplay={!reducedMotion} />
</View> : <VideoComponent source={{
uri: Module14078
}} style={style} resizeMode="contain" paused={reducedMotion} disableFocus preventsDisplaySleepDuringVideoPlayback={false} importantForAccessibility="no-hide-descendants" />;
};
lg = Module712.radii.lg;
useStyles = createStyles(() => ({
root: {
overflow: "hidden",
borderRadius: lg,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
content: {
flex: 1,
paddingHorizontal: Module712.space.PX_24,
justifyContent: "center",
alignItems: "center"
},
centeredCopy: {
alignItems: "center",
width: "100%"
},
orbsBackground: {
position: "absolute",
top: 0,
left: 0,
right: 0,
height: "40%",
zIndex: 1
},
headerLabel: {
paddingBottom: Module712.space.PX_4,
textTransform: "uppercase"
},
titleRow: {
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
paddingBottom: Module712.space.PX_24,
gap: Module712.space.PX_8
},
actions: {
position: "absolute",
left: Module712.space.PX_24,
right: Module712.space.PX_24,
gap: Module712.space.PX_12
},
orbAmount: {
marginTop: isIOS() ? 6 : 0,
lineHeight: 46
}
}));
export function BountiesScrollRecapPage(props) {
const { orbAmount, onClose, style } = props;
const styles = useStyles();
const safeAreaInsets_native = useSafeAreaInsets_native();
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
return <View style={[styles.root, style]} pointerEvents="box-none">
<View style={StyleSheet.absoluteFillObject} pointerEvents="none">
<VideoComponent source={{
uri: Module14079
}} style={StyleSheet.absoluteFillObject} resizeMode="cover" paused={stateFromStores} disableFocus preventsDisplaySleepDuringVideoPlayback={false} importantForAccessibility="no-hide-descendants" />
<BountiesRecapOrbsBackground style={styles.orbsBackground} reducedMotion={stateFromStores} />
</View>
<View style={styles.content} pointerEvents="box-none">
<View style={styles.centeredCopy} pointerEvents="none">
<Text variant="text-xs/bold" color="text-brand" style={styles.headerLabel}>
{intl.string(t.d6Rrn6)}
</Text>
<View accessible accessibilityRole="text" accessibilityLabel={`+${orbAmount}`}>
<View style={styles.titleRow}>
<OrbsIcon size="lg" color="icon-strong" accessible={false} />
<Text variant="display-lg" color="text-strong" accessible={false} style={styles.orbAmount}>
{`+${orbAmount}`}
</Text>
</View>
</View>
<Text variant="text-md/medium" color="text-muted" style={{
textAlign: "center"
}}>
{intl.string(t.x0Ffz3)}
</Text>
</View>
<View style={[styles.actions, {
bottom: safeAreaInsets_native.bottom + Module712.space.PX_8
}]}>
<Button grow variant="primary" text={intl.string(t.i4jeWR)} size="lg" onPress={onClose} />
</View>
</View>
</View>;
}
@@ -0,0 +1,305 @@
// Metro module 14044 (f14045).
import { useMemo, useState, useRef, useCallback, useEffect } from "react";
import { View } from "react-native";
import VirtualCurrencyStore from "../../../virtual_currency/stores/VirtualCurrencyStore";
import BountyStore from "../../BountyStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { jsx } from "react/jsx-runtime";
import { PlayerState } from "../AdVideoPlayer";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import { BountyVideoEndMode, useBountiesModalTiming } from "./useBountiesModalTiming";
import { claimBountyReward } from "../../BountyActionCreators";
import { openBountyRewardClaimErrorToast } from "./bountyError";
import { useBountyVideoProgressPersistence } from "./useBountyVideoProgressPersistence";
import { useBountiesModalVideoAnalytics } from "./useBountiesModalVideoAnalytics";
import { BountyVideo } from "./BountyVideo";
import { QuestContentImpressionTrackerNative, BillableAdPlacementImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContent } from "../../../../_bundle/Module5038";
import BountiesScrollEndCard from "./BountiesScrollEndCard";
function $mk116636($env) {
return (a0) => a0 != null ? a0 + $env[7] : null;
}
let env9820 = {};
const BountiesScrollVideoItemInner = function BountiesScrollVideoItemInner(props) {
let env20869 = {
$parent: env9820
};
const bounty2 = props.bounty;
env20869[0] = bounty2;
const sourceQuestContent2 = props.sourceQuestContent;
env20869[1] = sourceQuestContent2;
const width2 = props.width;
env20869[2] = width2;
const height2 = props.height;
env20869[3] = height2;
const { index: index2, isActive: isActive3 } = props;
env20869[4] = isActive3;
const { isRecapPageRevealed: isRecapPageRevealed2, isRecapPageOnTop: isRecapPageOnTop2, isScrollingInBoundsSharedValue: isScrollingInBoundsSharedValue2 } = props;
env20869[5] = isScrollingInBoundsSharedValue2;
const { isScrollIndicatorOverlayEnabled: isScrollIndicatorOverlayEnabled2 = false, shouldLoadHls: shouldLoadHls2 = true, scrollAffordance: scrollAffordance2, peekScale: peekScale2, softDownloadCapsEnabled: softDownloadCapsEnabled2 = false } = props;
env20869[6] = void 0;
env20869[7] = void 0;
env20869[8] = void 0;
env20869[9] = void 0;
env20869[10] = void 0;
env20869[11] = void 0;
env20869[12] = void 0;
env20869[13] = void 0;
env20869[14] = void 0;
env20869[15] = void 0;
env20869[16] = void 0;
env20869[17] = void 0;
env20869[18] = void 0;
env20869[19] = void 0;
env20869[20] = void 0;
const memo = useMemo(() => ({
width: env20869[2],
height: env20869[3]
}), [width2, height2]);
const stateFromStores = useStateFromStores([BountyStore], () => BountyStore.isBountyCompleted(env20869[0].id));
env20869[6] = stateFromStores;
const [shouldLoadHls3, setState] = useState(shouldLoadHls2);
const [state, setState2] = useState(shouldLoadHls2);
if (state !== shouldLoadHls2) {
setState2(shouldLoadHls2);
if (shouldLoadHls2) {
setState(true);
}
}
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const { loopingEnabled, ownedByVerticalScrollExperiment, stage1Enabled, orbAmount } = bountiesExperience;
env20869[7] = orbAmount;
const rewardTimerSeconds = bountiesExperience.rewardTimerSeconds;
const endMode = loopingEnabled ? BountyVideoEndMode.LOOP : ownedByVerticalScrollExperiment ? BountyVideoEndMode.END_CARD : BountyVideoEndMode.END_CARD_WITH_CTA;
const rewardDurationMs = !stage1Enabled && !ownedByVerticalScrollExperiment ? 1000 * bounty2.rewardTimerSeconds : 1000 * rewardTimerSeconds;
env20869[8] = rewardDurationMs;
const ref4 = useRef(null);
const isActive = isActive3;
const ref = ref4;
const ref2 = useRef(true);
const ref3 = useRef(null);
const callback2 = useCallback((a0) => {
ref3.current = a0;
}, []);
useEffect(() => {
if (ref2.current) {
ref2.current = false;
} else {
let r7 = isActive;
if (isActive) {
r7 = ref3.current === PlayerState.PAUSED;
}
if (r7) {
const current = ref.current;
if (current != null) {
current.play();
}
}
}
}, [isActive, ref]);
const [state2, setState3] = useState(isActive);
const [orbsBalance, setState4] = useState(() => env20869[4] ? VirtualCurrencyStore.getCurrentBalance() : null);
env20869[9] = setState4;
const [balanceWidgetPillResetKey, setState5] = useState(0);
if (state2 !== isActive) {
setState3(isActive);
if (isActive) {
const currentBalance = VirtualCurrencyStore.getCurrentBalance();
setState4(currentBalance);
if (currentBalance !== orbsBalance) {
setState5((prevState5) => prevState5 + 1);
}
}
}
const callback = useCallback(async () => {
let c27617_0, c27617_1, c27617_2;
let c27617_3 = 0;
const r13 = env20869;
L14: {
try {
let env30694;
c27617_1 = r13;
const r28 = env30694 = {
$parent: r13
};
c27617_0 = r28;
env30694[0] = false;
c27617_3 = 1;
await claimBountyReward(env20869[0].id, env20869[1]);
env30694[0] = true;
c27617_3 = 0;
if (env30694[0] && env20869[4]) {
env20869[9]($mk116636(env20869));
}
} catch ($e) {
const r26 = $e;
let r7 = r26;
c27617_2 = r26;
if (c27617_3 !== 0) {
while (true) {
try {
const r70 = c27617_2;
c27617_3 = 0;
env30694[1] = r70;
openBountyRewardClaimErrorToast(env30694[1]);
if (!(env30694[0] && env20869[4])) {
break L14;
}
env20869[9]($mk116636(env20869));
break L14;
} catch (r66) {
r7 = r66;
c27617_2 = r66;
if (c27617_3 === 0) {
break;
}
}
}
}
throw r7;
}
}
}, [bounty2.id, isActive, orbAmount, sourceQuestContent2]);
const bountyVideoProgressPersistence = useBountyVideoProgressPersistence({
bountyId: bounty2.id,
endMode
});
const { initialProgress, handleProgress } = bountyVideoProgressPersistence;
env20869[10] = handleProgress;
const flushProgress = bountyVideoProgressPersistence.flushProgress;
env20869[11] = flushProgress;
useEffect(() => () => (0, env20869[11])(), [flushProgress]);
const bountiesModalVideoAnalytics = useBountiesModalVideoAnalytics({
bountyId: bounty2.id,
sourceQuestContent: sourceQuestContent2,
rewardDurationMs,
initialPlaybackTimeSec: initialProgress.timestampSec,
initialMaxVideoProgressSec: initialProgress.maxTimestampSec,
initialVideoDurationSec: initialProgress.duration,
wasPreloaded: false,
startupPath: ownedByVerticalScrollExperiment ? "active_only" : "carousel",
verticalScrollingPosition: index2,
isActive
});
const handleVideoProgressAnalytics = bountiesModalVideoAnalytics.handleVideoProgressAnalytics;
env20869[12] = handleVideoProgressAnalytics;
const { handleVideoEndAnalytics, handleVideoLoopedAnalytics, handleVideoPausedAnalytics, handleVideoResumedAnalytics, handleVideoErrorAnalytics, handleLoadStartAnalytics, handleVideoTracksAnalytics, handleReadyForDisplayAnalytics, handleBufferAnalytics } = bountiesModalVideoAnalytics;
const onPlaybackTimeChange = scrollAffordance2?.onPlaybackTimeChange;
env20869[13] = onPlaybackTimeChange;
const onPaused = scrollAffordance2?.onPaused;
env20869[14] = onPaused;
const onResumed = scrollAffordance2?.onResumed;
env20869[15] = onResumed;
const onEndCardVisible = scrollAffordance2?.onEndCardVisible;
env20869[16] = onEndCardVisible;
const bountiesModalTiming = useBountiesModalTiming({
endMode,
rewardDurationMs,
isCompleted: stateFromStores,
onRewardEarned: callback,
onVideoProgress: useCallback((a0, a1, a2) => {
(0, env20869[12])(a0, a1, a2);
(0, env20869[10])(a0, a1, a2);
const r5 = env20869[13];
if (r5 != null) {
const r4 = env20869[6];
r5(a2, a1, r4 || 1000 * a0 >= env20869[8], a0, r4);
}
}, [handleVideoProgressAnalytics, handleProgress, stateFromStores, onPlaybackTimeChange, rewardDurationMs]),
onVideoEnd: handleVideoEndAnalytics,
onVideoLooped: handleVideoLoopedAnalytics,
onVideoPaused: handleVideoPausedAnalytics,
onVideoResumed: handleVideoResumedAnalytics,
playerRef: ref,
initialProgressSec: initialProgress.timestampSec,
initialMaxVideoProgressSec: initialProgress.maxTimestampSec,
initialVideoDurationSec: initialProgress.duration > 0 ? initialProgress.duration : null
});
const { isCtaVisible, isEndCardVisible } = bountiesModalTiming;
env20869[17] = isEndCardVisible;
const { handleVideoEnd, handleVideoProgress, handleVideoPaused } = bountiesModalTiming;
env20869[18] = handleVideoPaused;
const handleVideoResumed = bountiesModalTiming.handleVideoResumed;
env20869[19] = handleVideoResumed;
env20869[20] = bountiesModalTiming.handleReplay;
const { rewardRemainingSeconds, rewardTotalSeconds, normalizedProgress } = bountiesModalTiming;
const callback3 = useCallback((a0) => {
(0, env20869[18])(a0);
if (!env20869[17]) {
const r7 = env20869[14];
if (r7 != null) {
r7();
}
}
}, [handleVideoPaused, isEndCardVisible, onPaused]);
const callback4 = useCallback((a0) => {
(0, env20869[19])(a0);
const r6 = env20869[15];
if (r6 != null) {
r6();
}
}, [handleVideoResumed, onResumed]);
useEffect(() => {
if (env20869[17] && env20869[4]) {
const r3 = env20869[16];
if (r3 != null) {
r3();
}
}
}, [isActive, isEndCardVisible, onEndCardVisible]);
return <View style={memo}>
<BountyVideo bounty={bounty2} sourceQuestContent={sourceQuestContent2} isCompleted={stateFromStores} isCtaVisible={isCtaVisible} isEndCardVisible={isEndCardVisible} isScrollIndicatorEnabled={isScrollIndicatorOverlayEnabled2} isProgressBarVisible={isEndCardVisible ? !isEndCardVisible : !isRecapPageOnTop2} orbsBalance={orbsBalance} handleVideoEnd={handleVideoEnd} handleVideoProgress={handleVideoProgress} handleVideoPaused={callback3} handleVideoResumed={callback4} handleVideoError={handleVideoErrorAnalytics} onLoadStart={handleLoadStartAnalytics} onBuffer={handleBufferAnalytics} onFirstFrame={handleReadyForDisplayAnalytics} onVideoTracks={handleVideoTracksAnalytics} rewardRemainingSeconds={rewardRemainingSeconds} rewardTotalSeconds={rewardTotalSeconds} normalizedProgress={normalizedProgress} repeat={loopingEnabled} initialProgress={initialProgress} isActive={isActive} isRecapPageRevealed={isRecapPageRevealed2} isScrollingInBoundsSharedValue={isScrollingInBoundsSharedValue2} playerRef={ref} onPlayerStateChange={callback2} balanceWidgetPillResetKey={balanceWidgetPillResetKey} shouldLoadHls={shouldLoadHls3} width={width2} height={height2} peekScale={peekScale2} softDownloadCapsEnabled={softDownloadCapsEnabled2} renderEndCard={() => <QuestContentImpressionTrackerNative adContentId={env20869[0].id} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.VIDEO_MODAL_END_CARD} sourceQuestContent={env20869[1]} overrideVisibility={env20869[17]}>
{() => (0, jsx)(BountiesScrollEndCard, {
bounty: env20869[0],
visible: env20869[17],
onReplay: env20869[20],
isActive: env20869[4],
isScrollingInBoundsSharedValue: env20869[5],
sourceQuestContent: env20869[1]
})}
</QuestContentImpressionTrackerNative>} />
</View>;
};
export function BountiesScrollVideoItem(props) {
const { bounty, sourceQuestContent, width, height, index, isActive: isActive3 = false } = props;
const isActive2 = isActive3;
let isRecapPageRevealed2 = props.isRecapPageRevealed;
if (isRecapPageRevealed2 === void 0) {
isRecapPageRevealed2 = false;
}
const isRecapPageRevealed = isRecapPageRevealed2;
let isRecapPageOnTop2 = props.isRecapPageOnTop;
if (isRecapPageOnTop2 === void 0) {
isRecapPageOnTop2 = false;
}
const isRecapPageOnTop = isRecapPageOnTop2;
const { isScrollingInBoundsSharedValue, isScrollIndicatorOverlayEnabled: isScrollIndicatorOverlayEnabled2 = false } = props;
const isScrollIndicatorOverlayEnabled = isScrollIndicatorOverlayEnabled2;
let shouldLoadHls2 = props.shouldLoadHls;
if (shouldLoadHls2 === void 0) {
shouldLoadHls2 = true;
}
const shouldLoadHls = shouldLoadHls2;
const { scrollAffordance, peekScale, softDownloadCapsEnabled: softDownloadCapsEnabled2 = false } = props;
const softDownloadCapsEnabled = softDownloadCapsEnabled2;
return <BillableAdPlacementImpressionTrackerNative adContentId={bounty.id} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.VIDEO_MODAL_MOBILE} sourceQuestContent={sourceQuestContent} overrideVisibility={isActive2}>
{() => (0, jsx)(BountiesScrollVideoItemInner, {
bounty,
sourceQuestContent,
width,
height,
index,
isActive: isActive2,
isRecapPageRevealed,
isRecapPageOnTop,
isScrollingInBoundsSharedValue,
isScrollIndicatorOverlayEnabled,
shouldLoadHls,
scrollAffordance,
peekScale,
softDownloadCapsEnabled
})}
</BillableAdPlacementImpressionTrackerNative>;
}
@@ -0,0 +1,2 @@
// Metro module 14071 (f14072).
export const END_CARD_IMAGE_SIZE = 92;
@@ -0,0 +1,10 @@
// Metro module 14067 (f14068).
import { intl, t } from "../../../../intl/index.native";
export function getBountyCtaInfo(a0) {
return {
label: a0.productName,
subtext: a0.cta.buttonLabel,
buttonLabel: intl.string(t.LLLLPD),
iconImageUri: a0.productIcon
};
}
@@ -0,0 +1,232 @@
// Metro module 14061 (f14062).
import { useState, useRef, useMemo, useEffect, useCallback } from "react";
import { ActivityIndicator, StyleSheet, View } from "react-native";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { isAndroid } from "../../../../_bundle/Module501";
import { getScaledFirstFrameImageUrl } from "../../lib/AssetUtils";
import Module712 from "../../../../_bundle/Module712";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import BountiesModalProgress, { PROGRESS_BAR_HEIGHT } from "./BountiesModalProgress";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import { useIsBountiesVerticalScrollExperimentEnabled } from "../../experiments/BountiesVerticalScrollExperiment";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { useToken } from "../../../../design/tokens/native/useToken";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
import { timingFast } from "../../../../design/animation/reanimated/timing/timingPresets";
import * as _useBountiesAutoScroll from "./useBountiesAutoScroll";
import { AdVideoPlayer } from "../AdVideoPlayer";
import { SOFT_CAP_PRELOAD_MAX_BITRATE, SOFT_CAP_PRELOAD_BUFFER_CONFIG, SOFT_CAP_PRELOAD_FORWARD_BUFFER_SEC } from "./bountiesSoftCapPreload";
import FastImage from "../../../../components_native/common/FastImage";
import BountiesScrollIndicatorOverlay from "./BountiesScrollIndicatorOverlay";
import BountiesModalAdvertiserCta from "./BountiesModalAdvertiserCta";
import BountiesModalTimer from "./BountiesModalTimer";
import { BalanceWidgetPill } from "../../../virtual_currency/native/BalanceWidgetPill";
let __initData, __initData2, __initData3;
let c9833_12 = isAndroid() ? 150 : 0;
const contentInsets = {
top: 48,
bottom: 16,
left: 16,
right: 16
};
const lg = Module712.radii.lg;
const useStyles = createStyles(() => ({
videoContainer: {
...StyleSheet.absoluteFillObject,
overflow: "hidden",
borderRadius: lg
},
leftRow: {
position: "absolute",
top: Module712.space.PX_8,
left: Module712.space.PX_8,
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_8
},
progress: {
position: "absolute",
bottom: 0,
height: PROGRESS_BAR_HEIGHT,
left: lg,
right: lg
},
poster: {
...StyleSheet.absoluteFillObject,
backgroundColor: "#000000",
justifyContent: "center",
alignItems: "center"
},
peekOrigin: {
transformOrigin: "top"
}
}));
__initData = {
code: "function BountyVideoTsx1(){const{posterOpacity}=this.__closure;return{opacity:posterOpacity.get()};}"
};
__initData2 = {
code: "function BountyVideoTsx2(){const{isScrollingInBoundsSharedValue,withTiming,isActive,timingStandard}=this.__closure;var _isScrollingInBoundsS;const isScrollingInBounds=((_isScrollingInBoundsS=isScrollingInBoundsSharedValue)===null||_isScrollingInBoundsS===void 0?void 0:_isScrollingInBoundsS.get())===true;return{opacity:withTiming(isActive&&!isScrollingInBounds?1:0,timingStandard)};}"
};
__initData3 = {
code: "function BountyVideoTsx3(){const{peekScale,AUTO_SCROLL_PEEK_SCALE,AUTO_SCROLL_PEEK_TOP_OFFSET}=this.__closure;if(peekScale==null){return{};}const scale=peekScale.get();const scaleProgress=(1-scale)/(1-AUTO_SCROLL_PEEK_SCALE);return{transform:[{translateY:scaleProgress*AUTO_SCROLL_PEEK_TOP_OFFSET},{scale:scale}]};}"
};
export function BountyVideo(props) {
let callback;
const { bounty, sourceQuestContent, isCompleted, isCtaVisible, isEndCardVisible } = props;
let isScrollIndicatorEnabled = props.isScrollIndicatorEnabled;
const { isProgressBarVisible, orbsBalance, handleVideoEnd, handleVideoProgress, handleVideoPaused, handleVideoResumed, handleVideoError, onLoadStart, onBuffer, onFirstFrame, onVideoTracks, rewardRemainingSeconds, rewardTotalSeconds, normalizedProgress, initialProgress, repeat } = props;
let isActive = props.isActive;
if (isActive === void 0) {
isActive = false;
}
let c20877_4 = isActive;
const { isRecapPageRevealed = false, isScrollingInBoundsSharedValue, renderEndCard, playerRef, onPlayerStateChange, balanceWidgetPillResetKey, shouldLoadHls = true, width, height, peekScale } = props;
let softDownloadCapsEnabled = props.softDownloadCapsEnabled;
if (softDownloadCapsEnabled === void 0) {
softDownloadCapsEnabled = false;
}
callback = void 0;
const styles = useStyles();
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
const { ownedByVerticalScrollExperiment, stage1Enabled } = bountiesExperience;
const isBountiesVerticalScrollExperimentEnabled = useIsBountiesVerticalScrollExperimentEnabled("BountyVideo");
if (softDownloadCapsEnabled) {
softDownloadCapsEnabled = !isActive;
}
const [state2, setState] = useState(false);
const [state, setState2] = useState(false);
const ref = useRef(null);
const sharedValue = useSharedValue(1);
const memo = useMemo(() => getScaledFirstFrameImageUrl({
assetUrl: bounty.videoHls,
width,
height
}), [bounty, width, height]);
const token = useToken(Module712.colors.TEXT_DEFAULT);
const r98 = `${bounty.id}:${shouldLoadHls}`;
const [state3, setState3] = useState(r98);
if (state3 !== r98) {
setState3(r98);
setState2(false);
sharedValue.set(1);
}
useEffect(() => () => {
if (ref.current != null) {
clearTimeout(ref.current);
ref.current = null;
}
}, [r98]);
useEffect(() => {
if (state) {
sharedValue.set(_timing.withTiming(0, timingFast));
}
}, [state, sharedValue]);
callback = useCallback(() => {
if (ref.current != null) {
clearTimeout(ref.current);
ref.current = null;
}
setState2(true);
}, []);
const callback2 = useCallback(() => {
if (onFirstFrame != null) {
onFirstFrame();
}
if (ref.current != null) {
clearTimeout(ref.current);
}
ref.current = setTimeout(() => {
setState2(true);
ref.current = null;
}, c9833_12);
}, [onFirstFrame]);
const callback3 = useCallback((a0) => {
callback();
if (handleVideoError != null) {
handleVideoError(a0);
}
}, [callback, handleVideoError]);
const callback4 = useCallback((a0) => {
if (a0.currentTime > 0) {
setState(true);
}
handleVideoProgress(a0);
}, [handleVideoProgress]);
const Ce = () => ({
opacity: sharedValue.get()
});
Ce.__closure = {
posterOpacity: sharedValue
};
Ce.__workletHash = 4975136521719;
Ce.__initData = __initData;
const animatedStyle = useAnimatedStyle(Ce);
const Ae = function Ae() {
const r4 = isScrollingInBoundsSharedValue == null ? void 0 : isScrollingInBoundsSharedValue.get();
return {
opacity: _timing.withTiming(c20877_4 ? r4 !== true ? 1 : 0 : 0, _timingPresets.timingStandard)
};
};
Ae.__closure = {
isScrollingInBoundsSharedValue,
withTiming: _timing.withTiming,
isActive,
timingStandard: _timingPresets.timingStandard
};
Ae.__workletHash = 12676706441349;
Ae.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(Ae);
const Fe = function Fe() {
if (peekScale == null) {
return {};
}
const scale = peekScale.get();
return {
transform: [{
translateY: (1 - scale) / (1 - _useBountiesAutoScroll.AUTO_SCROLL_PEEK_SCALE) * _useBountiesAutoScroll.AUTO_SCROLL_PEEK_TOP_OFFSET
}, {
scale
}]
};
};
Fe.__closure = {
peekScale,
AUTO_SCROLL_PEEK_SCALE: _useBountiesAutoScroll.AUTO_SCROLL_PEEK_SCALE,
AUTO_SCROLL_PEEK_TOP_OFFSET: _useBountiesAutoScroll.AUTO_SCROLL_PEEK_TOP_OFFSET
};
Fe.__workletHash = 7501077341815;
Fe.__initData = __initData3;
const animatedStyle3 = useAnimatedStyle(Fe);
const visible = isBountiesVerticalScrollExperimentEnabled ? isCtaVisible ? !isEndCardVisible : isCtaVisible : isCtaVisible;
const r203 = [shouldLoadHls ? <AdVideoPlayer ref={playerRef} source={{
uri: bounty.videoHls
}} automaticallyWaitsToMinimizeStalling={(stage1Enabled ? !stage1Enabled : !ownedByVerticalScrollExperiment) && void 0} maxBitRate={softDownloadCapsEnabled ? SOFT_CAP_PRELOAD_MAX_BITRATE : void 0} bufferConfig={softDownloadCapsEnabled ? SOFT_CAP_PRELOAD_BUFFER_CONFIG : void 0} preferredForwardBufferDuration={softDownloadCapsEnabled ? SOFT_CAP_PRELOAD_FORWARD_BUFFER_SEC : void 0} initialProgress={initialProgress} isFullscreen={false} externallyPaused={(isActive ? isEndCardVisible : !isActive) || isRecapPageRevealed} style={StyleSheet.absoluteFillObject} contentInsets={contentInsets} onProgress={callback4} onEnd={handleVideoEnd} onPausePlayback={handleVideoPaused} onResumePlayback={handleVideoResumed} onError={callback3} onLoadStart={onLoadStart} onBuffer={onBuffer} onReadyForDisplay={callback2} onVideoTracks={onVideoTracks} hideControls={isEndCardVisible} showSkipButtons={false} repeat={repeat} bufferingSpinnerPlacement="center" onPlayerStateChange={onPlayerStateChange} /> : null, memo != null ? <ReanimatedRexport.View style={[styles.poster, animatedStyle]} pointerEvents="none">
<FastImage style={StyleSheet.absoluteFillObject} source={{
uri: memo
}} resizeMode="cover" />
{state ? !state : <ActivityIndicator animating size="small" color={token} />}
</ReanimatedRexport.View> : <ReanimatedRexport.View style={[styles.poster, animatedStyle]} pointerEvents="none" />, renderEndCard == null ? void 0 : renderEndCard(), , ,];
if (isScrollIndicatorEnabled) {
if (isActive) {
isActive = state2;
}
isScrollIndicatorEnabled = <BountiesScrollIndicatorOverlay opacityStyle={animatedStyle2} enabled={isActive} isEndCardVisible={isEndCardVisible} />;
}
r203[3] = isScrollIndicatorEnabled;
r203[4] = <ReanimatedRexport.View style={[StyleSheet.absoluteFillObject, animatedStyle2]} pointerEvents="box-none">
<BountiesModalAdvertiserCta bounty={bounty} visible={visible} sourceQuestContent={sourceQuestContent} />
</ReanimatedRexport.View>;
return <>
<ReanimatedRexport.View style={[StyleSheet.absoluteFillObject, styles.peekOrigin, animatedStyle3]}>
<View style={styles.videoContainer}>{r203}</View>
<ReanimatedRexport.View style={[styles.progress, animatedStyle2]}>
<BountiesModalProgress progress={normalizedProgress} visible={isProgressBarVisible} />
</ReanimatedRexport.View>
</ReanimatedRexport.View>
<ReanimatedRexport.View style={[styles.leftRow, animatedStyle2]}>
<BountiesModalTimer isCompleted={isCompleted} totalSeconds={rewardTotalSeconds} remainingSeconds={rewardRemainingSeconds} />
<BalanceWidgetPill key={balanceWidgetPillResetKey} balance={orbsBalance} />
</ReanimatedRexport.View>
</>;
}
@@ -0,0 +1,9 @@
// Metro module 14063 (f14064).
export const SOFT_CAP_PRELOAD_MAX_BITRATE = 500000;
export const SOFT_CAP_PRELOAD_BUFFER_CONFIG = {
minBufferMs: 1000,
maxBufferMs: 3000,
bufferForPlaybackMs: 500,
bufferForPlaybackAfterRebufferMs: 1000
};
export const SOFT_CAP_PRELOAD_FORWARD_BUFFER_SEC = 2;
@@ -0,0 +1,7 @@
// Metro module 14041 (f14042).
import { useLocalStorageState } from "../../../../hooks/useLocalStorageState";
let c9817_2 = "devtools-force-bounties-swipe-up-nux";
export const FORCE_BOUNTIES_SWIPE_UP_NUX_STORAGE_KEY = "devtools-force-bounties-swipe-up-nux";
export function useForceBountiesSwipeUpNux() {
return useLocalStorageState(c9817_2, false);
}
@@ -0,0 +1,14 @@
// Metro module 14056 (f14057).
import { BOUNTY_REWARD_CLAIM_FAILED_TOAST_DURATION_MS } from "./BountiesModalConstants";
import { intl, t } from "../../../../intl/index.native";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import Module9172 from "../../../../_bundle/Module9172";
let c9829_4 = new Set([260021]);
export function openBountyRewardClaimErrorToast(a0) {
ToastActionCreators.open({
key: "QUESTS_BOUNTIES_REWARD_CLAIM_FAILED",
content: a0?.code != null && c9829_4.has(a0.code) ? a0?.message != null ? a0.message : intl.string(t.uLjCfn) : intl.string(t.uLjCfn),
icon: Module9172,
toastDurationMs: BOUNTY_REWARD_CLAIM_FAILED_TOAST_DURATION_MS
});
}
@@ -0,0 +1,295 @@
// Metro module 14042 (f14043).
import { useState, useRef, useCallback, useEffect } from "react";
import { AppState } from "react-native";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { BountiesVerticalScrollExperiment } from "../../experiments/BountiesVerticalScrollExperiment";
import { useForceBountiesSwipeUpNux } from "./bountiesSwipeUpNuxDevTools";
import { useSharedValue } from "../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../design/animation/reanimated/timing/timing";
import { timingSlow, timingStandard } from "../../../../design/animation/reanimated/timing/timingPresets";
import { getIsInAppBrowserOpen, subscribeToIsInAppBrowserOpen } from "../../../links/native/BrowserManager";
let c9818_6 = new Set();
export const AUTO_SCROLL_PEEK_SCALE = 0.83;
export const AUTO_SCROLL_PEEK_TOP_OFFSET = 54;
export function clearDismissedScrollAffordanceBountyIds() {
c9818_6.clear();
}
export function useBountiesAutoScroll({ listRef, enabled, mode, activeIndex, activeBountyId, slotHeight, onCountdownCancelled }) {
let callback2, callback3, callback4, callback5, callback6, callback7, callback8, callback9, callback10, callback11, callback12, callback13;
callback2 = void 0;
callback3 = void 0;
callback4 = void 0;
callback5 = void 0;
callback6 = void 0;
callback7 = void 0;
callback8 = void 0;
callback9 = void 0;
callback10 = void 0;
callback11 = void 0;
callback12 = void 0;
callback13 = void 0;
const config = BountiesVerticalScrollExperiment.useConfig({
location: QuestsExperimentLocations.VIDEO_MODAL_MOBILE
});
const { autoScrollLeadMs, autoScrollEndCardMs, ctaTimerMilliSeconds } = config;
const r4 = autoScrollLeadMs / 1000;
let c20867_8 = r4;
const current = r4 + autoScrollEndCardMs / 1000;
const [r48] = useForceBountiesSwipeUpNux();
let c20867_10 = r48;
const [visible, setState] = useState(false);
const [peekActive, setState2] = useState(false);
const [progress, setState3] = useState(0);
const [showProgressRing, setState4] = useState(false);
const ref = useRef(false);
const ref2 = useRef(false);
const ref3 = useRef(false);
const ref4 = useRef(false);
const ref5 = useRef(null);
const ref6 = useRef(null);
const ref7 = useRef(0);
const ref8 = useRef(null);
const ref9 = useRef(false);
const ref10 = useRef(false);
const sharedValue = useSharedValue(1);
const ref11 = useRef(current);
const callback = useCallback(() => {
if (ref5.current != null) {
clearInterval(ref5.current);
ref5.current = null;
}
ref8.current = null;
}, []);
callback2 = useCallback(() => {
if (ref6.current != null) {
clearTimeout(ref6.current);
ref6.current = null;
}
}, []);
callback3 = useCallback((a0) => {
if (!(c20867_10 || a0 == null)) {
c9818_6.add(a0);
}
}, [r48]);
callback4 = useCallback((a0) => (c20867_10 ? !c20867_10 : a0 != null) && c9818_6.has(a0), [r48]);
callback5 = useCallback(() => {
setState(false);
setState2(false);
setState3(0);
setState4(false);
}, []);
const [state, setState5] = useState(activeIndex);
const [state2, setState6] = useState(activeBountyId);
if (!(state === activeIndex && state2 === activeBountyId)) {
setState5(activeIndex);
setState6(activeBountyId);
callback5();
}
useEffect(() => {
callback();
callback2();
ref.current = callback4(activeBountyId);
ref2.current = callback4(activeBountyId);
ref3.current = false;
ref4.current = false;
ref7.current = 0;
ref9.current = false;
ref10.current = false;
sharedValue.set(1);
}, [activeIndex, activeBountyId, callback, callback2, sharedValue, callback4]);
useEffect(() => () => {
callback();
callback2();
}, [callback, callback2]);
useEffect(() => {
ref11.current = current;
}, [current]);
callback6 = useCallback(function(r7 = 0) {
const r6 = ref2.current || ref.current || callback4(activeBountyId);
let r1 = !r6;
if (!r6) {
ref2.current = true;
callback3(activeBountyId);
callback2();
ref6.current = setTimeout(() => {
ref6.current = null;
if (!(ref.current || ref4.current)) {
sharedValue.set(withTiming(0.83, timingSlow));
setState2(true);
ref6.current = setTimeout(() => {
ref6.current = null;
if (!(ref.current || ref4.current)) {
setState(true);
}
}, 500);
}
}, r7);
r1 = true;
}
return r1;
}, [activeBountyId, callback2, callback3, sharedValue, callback4]);
callback7 = useCallback(() => {
if (!(ref4.current || ref.current)) {
ref4.current = true;
callback3(activeBountyId);
callback();
callback2();
callback5();
sharedValue.set(1);
const current2 = listRef.current;
if (current2 != null) {
current2.scrollToOffset({
offset: (activeIndex + 1) * slotHeight,
animated: true
});
}
}
}, [activeBountyId, activeIndex, callback, callback2, listRef, callback3, sharedValue, callback5, slotHeight]);
callback8 = useCallback(() => {
if (!ref.current && !ref9.current) {
const current3 = Date.now();
if (ref8.current != null) {
ref7.current = ref7.current + (current3 - ref8.current);
}
ref8.current = current3;
const current2 = ref11.current;
const r22 = ref7.current / 1000;
if (r22 >= current2) {
callback7();
} else {
setState3(r22 / current2);
}
}
}, [callback7]);
callback9 = useCallback(() => {
if (!(ref3.current || ref5.current != null || ref9.current)) {
ref3.current = true;
ref7.current = 0;
ref8.current = Date.now();
setState3(0);
setState4(true);
ref5.current = setInterval(callback8, 50);
}
}, [callback8]);
callback10 = useCallback(() => {
if (ref3.current && !ref9.current && ref5.current != null) {
const r6 = Date.now();
if (ref8.current != null) {
ref7.current = ref7.current + (r6 - ref8.current);
}
ref9.current = true;
callback();
}
}, [callback]);
callback11 = useCallback(() => {
if (ref3.current && ref9.current && !ref.current && !ref4.current) {
ref9.current = false;
ref8.current = Date.now();
ref5.current = setInterval(callback8, 50);
}
}, [callback8]);
callback12 = useCallback(() => {
if (!ref9.current) {
callback10();
ref10.current = true;
}
}, [callback10]);
callback13 = useCallback(() => {
if (ref10.current && !getIsInAppBrowserOpen()) {
ref10.current = false;
callback11();
}
}, [callback11]);
useEffect(() => {
let c27615_1;
let c27615_0 = AppState.addEventListener("change", (a0) => {
if (a0 === "active") {
callback13();
} else {
callback12();
}
});
c27615_1 = subscribeToIsInAppBrowserOpen((a0) => {
if (a0) {
callback12();
} else {
callback13();
}
});
return () => {
c27615_0.remove();
c27615_1();
};
}, [callback12, callback13]);
return {
visible,
peekActive,
progress,
showProgressRing,
peekScale: sharedValue,
cancel: useCallback((a0) => {
const current2 = ref2.current;
if (!((current2 ? ref.current : !current2) || ref4.current)) {
ref.current = true;
callback3(activeBountyId);
callback();
setState(false);
setState3(0);
sharedValue.set(withTiming(1, timingStandard));
if (mode === "countdown" && onCountdownCancelled != null) {
onCountdownCancelled(a0);
}
callback2();
callback5();
}
}, [activeBountyId, callback, callback2, callback3, mode, onCountdownCancelled, sharedValue, callback5]),
dismissOnClose: useCallback(() => {
if (ref2.current) {
ref.current = true;
callback3(activeBountyId);
callback();
callback2();
callback5();
sharedValue.set(1);
}
}, [activeBountyId, callback, callback2, callback3, sharedValue, callback5]),
takeDidAutoScroll: useCallback(() => {
const current2 = ref4.current;
ref4.current = false;
callback2();
callback5();
return current2;
}, [callback2, callback5]),
onPlaybackTimeChange: useCallback((a0, a1, a2, a3, a4) => {
if (!((enabled ? mode !== "countdown" : !enabled) || ref.current || ref4.current || a1 <= 0)) {
const current2 = ref2.current;
if (current2 ? !current2 : a4 ? a4 : 1000 * a3 > ctaTimerMilliSeconds) {
callback6(5000);
}
if ((a2 ? !ref3.current : a2) && !(a1 - a0 > c20867_8)) {
callback9();
}
}
}, [r4, ctaTimerMilliSeconds, enabled, mode, callback6, callback9]),
onEndCardVisible: useCallback(() => {
if (!((enabled ? ref.current : !enabled) || callback4(activeBountyId))) {
if (mode !== "hint") {
if (!ref2.current) {
callback6();
}
if (ref3.current) {
if (ref9.current) {
callback11();
}
} else {
callback9();
}
} else {
callback6();
}
}
}, [activeBountyId, enabled, mode, callback11, callback6, callback9, callback4]),
pauseCountdown: callback10,
resumeCountdown: callback11
};
}
@@ -0,0 +1,127 @@
// Metro module 14055 (f14056).
import { useState, useRef, useCallback } from "react";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
let c9828_5 = {
END_CARD: "END_CARD",
END_CARD_WITH_CTA: "END_CARD_WITH_CTA",
LOOP: "LOOP"
};
export { c9828_5 as BountyVideoEndMode };
export function useBountiesModalTiming(a0) {
let setState2, setState3, setState4, setState5, ref, ref2, ref3, ref4, ref5;
const { endMode, rewardDurationMs } = a0;
let isCompleted = a0.isCompleted;
const { onRewardEarned, onVideoProgress, onVideoEnd, onVideoLooped, onVideoPaused, onVideoResumed, playerRef, initialProgressSec = 0 } = a0;
let c20874_9 = initialProgressSec;
let initialMaxVideoProgressSec = a0.initialMaxVideoProgressSec;
if (initialMaxVideoProgressSec === void 0) {
initialMaxVideoProgressSec = 0;
}
let initialVideoDurationSec = a0.initialVideoDurationSec;
if (initialVideoDurationSec === void 0) {
initialVideoDurationSec = null;
}
let c20874_10 = initialVideoDurationSec;
setState2 = void 0;
setState3 = void 0;
setState4 = void 0;
setState5 = void 0;
ref = void 0;
ref2 = void 0;
ref3 = void 0;
ref4 = void 0;
ref5 = void 0;
const [isEndCardVisible, setState] = useState(initialVideoDurationSec != null && initialProgressSec >= initialVideoDurationSec - 1 && endMode !== c9828_5.LOOP);
let state;
[state, setState2] = useState(() => c20874_10 != null ? c20874_9 / c20874_10 : 0);
let normalizedProgress;
[normalizedProgress, setState3] = useState(null);
let maxVideoProgressSeconds;
[maxVideoProgressSeconds, setState4] = useState(initialMaxVideoProgressSec);
let videoDuration;
[videoDuration, setState5] = useState(initialVideoDurationSec);
ref = useRef(isCompleted);
ref2 = useRef(initialMaxVideoProgressSec);
if (initialVideoDurationSec == null) {
initialVideoDurationSec = 0;
}
ref3 = useRef(initialVideoDurationSec);
ref4 = useRef(0);
ref5 = useRef(initialProgressSec);
const callback = useCallback(({ progress, currentTime, seekableDuration }) => {
setState3(null);
const current2 = Math.max(currentTime, ref2.current);
ref2.current = current2;
ref3.current = seekableDuration;
ref5.current = currentTime;
setState2(progress);
setState4(current2);
setState5(seekableDuration);
onVideoProgress(current2, seekableDuration, currentTime);
const current = ref.current;
if (current ? !current : 1000 * current2 >= rewardDurationMs) {
ref.current = true;
onRewardEarned();
}
}, [onVideoProgress, onRewardEarned, rewardDurationMs]);
const callback2 = useCallback(() => {
onVideoEnd(ref2.current, ref3.current, ref5.current);
if (endMode === c9828_5.LOOP) {
ref4.current = ref4.current + 1;
onVideoLooped(ref4.current);
ref5.current = 0;
} else {
setState(true);
}
if (!ref.current) {
ref.current = true;
onRewardEarned();
}
}, [endMode, onVideoEnd, onVideoLooped, onRewardEarned]);
const callback3 = useCallback(() => {
if (playerRef != null) {
const current = playerRef.current;
if (current != null) {
current.seekToStart();
}
}
setState3(0);
setState(false);
}, [playerRef]);
const callback4 = useCallback((a0) => {
onVideoPaused(ref5.current, a0);
}, [onVideoPaused]);
const callback5 = useCallback((a0) => {
onVideoResumed(ref5.current, a0);
}, [onVideoResumed]);
const r2 = 1000 * maxVideoProgressSeconds;
const rewardTotalSeconds = rewardDurationMs / 1000;
const r91 = Math.max(0, rewardTotalSeconds - maxVideoProgressSeconds);
const rewardRemainingSeconds = r2 >= rewardDurationMs ? 0 : isEndCardVisible ? 0 : isCompleted ? 0 : videoDuration != null ? videoDuration > 0 ? Math.max(0, Math.min(rewardTotalSeconds, videoDuration) - maxVideoProgressSeconds) : r91 : r91;
const ctaTimerMilliSeconds = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE).ctaTimerMilliSeconds;
const r109 = isEndCardVisible && endMode !== c9828_5.END_CARD_WITH_CTA;
if (!isCompleted) {
isCompleted = r2 > ctaTimerMilliSeconds;
}
if (isCompleted) {
isCompleted = !r109;
}
if (normalizedProgress == null) {
normalizedProgress = state;
}
return {
isCtaVisible: isCompleted,
isEndCardVisible,
handleVideoEnd: callback2,
handleVideoProgress: callback,
handleVideoPaused: callback4,
handleVideoResumed: callback5,
handleReplay: callback3,
rewardRemainingSeconds,
rewardTotalSeconds,
normalizedProgress,
maxVideoProgressSeconds,
videoDuration
};
}
@@ -0,0 +1,454 @@
// Metro module 14059 (f14060).
import { useMemo, useRef, useCallback, useEffect } from "react";
import NetworkStore from "../../../../stores/NetworkStore";
import { AnalyticEvents } from "../../../../Constants";
import { useQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { v4 } from "../../../../_bundle/Module514";
import { formatVideoProgressRatio } from "../../utils/VideoQuestUtils";
import { trackAdContentEvent } from "../../lib/analytics/AnalyticsActions";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { PlaybackTriggerSource } from "../AdVideoPlayer";
import { isSourceError } from "../AdsVideoUtils";
import MonitoringAgent from "../../../monitoring/MonitoringAgent";
import { MetricEvents } from "../../../../_bundle/Module5872";
let c9831_6 = [25, 50, 75];
export function useBountiesModalVideoAnalytics(a0) {
let ref, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, ref10, ref11, ref12, callback, memo2, callback2, callback3, callback4, callback5, callback6, callback7, callback8, callback9, callback10, callback11;
const { bountyId, sourceQuestContent, rewardDurationMs, initialPlaybackTimeSec = 0, initialMaxVideoProgressSec = 0 } = a0;
let c20876_3 = initialMaxVideoProgressSec;
let initialVideoDurationSec = a0.initialVideoDurationSec;
if (initialVideoDurationSec === void 0) {
initialVideoDurationSec = 0;
}
let c20876_4 = initialVideoDurationSec;
let wasPreloaded = a0.wasPreloaded;
if (wasPreloaded === void 0) {
wasPreloaded = false;
}
const was_preloaded = wasPreloaded;
let startupPath = a0.startupPath;
if (startupPath === void 0) {
startupPath = "carousel";
}
const startup_path = startupPath;
let verticalScrollingPosition = a0.verticalScrollingPosition;
if (verticalScrollingPosition === void 0) {
verticalScrollingPosition = null;
}
const vertical_scrolling_position = verticalScrollingPosition;
let isActive = a0.isActive;
if (isActive === void 0) {
isActive = true;
}
let c20876_8 = isActive;
ref = void 0;
ref2 = void 0;
ref3 = void 0;
ref4 = void 0;
ref5 = void 0;
ref6 = void 0;
ref7 = void 0;
ref8 = void 0;
ref9 = void 0;
ref10 = void 0;
ref11 = void 0;
ref12 = void 0;
callback = void 0;
memo2 = void 0;
callback2 = void 0;
callback3 = void 0;
callback4 = void 0;
callback5 = void 0;
callback6 = void 0;
callback7 = void 0;
callback8 = void 0;
callback9 = void 0;
callback10 = void 0;
callback11 = void 0;
const questImpressionId = useQuestImpressionId();
const memo = useMemo(() => v4(), []);
const set = new Set();
const r40 = initialPlaybackTimeSec > 0 || initialMaxVideoProgressSec > 0;
if (r40) {
set.add("start");
}
if (1000 * initialMaxVideoProgressSec >= rewardDurationMs) {
set.add("threshold");
}
ref = useRef(set);
ref2 = useRef(false);
ref3 = useRef(initialPlaybackTimeSec);
ref4 = useRef(initialVideoDurationSec);
ref5 = useRef(null);
ref6 = useRef(null);
ref7 = useRef(false);
ref8 = useRef(false);
ref9 = useRef(null);
ref10 = useRef(null);
ref11 = useRef(-1);
ref12 = useRef({
bitrateBps: null,
width: null,
height: null,
levelIndex: null
});
callback = useCallback(() => {
if (ref9.current != null) {
clearTimeout(ref9.current);
ref9.current = null;
}
}, []);
memo2 = useMemo(() => ({
was_preloaded,
startup_path,
vertical_scrolling_position,
reward_timer_seconds: rewardDurationMs / 1000
}), [was_preloaded, startup_path, vertical_scrolling_position, rewardDurationMs]);
callback2 = useCallback(() => {
const current = ref12.current;
return {
hls_level_index: current.levelIndex,
hls_segment_res_width: current.width,
hls_segment_res_height: current.height
};
}, []);
callback3 = useCallback((a0) => {
if (!ref2.current) {
let r5 = a0;
ref2.current = true;
if (!(a0 > 0)) {
r5 = c20876_4;
}
if (!(r5 <= 0)) {
const r6 = formatVideoProgressRatio(c20876_3, r5);
for (const item of c9831_6) {
if (r6 >= item / 100) {
ref.current.add(`p${item}`);
}
}
}
}
}, [initialMaxVideoProgressSec, initialVideoDurationSec]);
callback4 = useCallback((a0) => {
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_PROGRESSED,
properties: {
progress: a0.progress,
video_timestamp_seconds: a0.videoTimestampSeconds,
video_session_id: memo,
impression_id: questImpressionId,
threshold_met: a0.thresholdMet,
reward_timer_seconds: rewardDurationMs / 1000
},
sourceQuestContent
});
}, [bountyId, memo, questImpressionId, sourceQuestContent, rewardDurationMs]);
callback5 = useCallback(() => {
if (!ref.current.has("start")) {
ref.current.add("start");
callback4({
videoTimestampSeconds: 0,
progress: 0,
thresholdMet: false
});
}
}, [callback4]);
callback6 = useCallback((a0, a1) => {
if (!ref.current.has("threshold")) {
ref.current.add("threshold");
const videoTimestampSeconds = Math.max(rewardDurationMs / 1000, a0);
callback4({
videoTimestampSeconds,
progress: formatVideoProgressRatio(videoTimestampSeconds, a1),
thresholdMet: true
});
}
}, [callback4, rewardDurationMs]);
callback7 = useCallback((a0, a1) => {
if (!ref.current.has("end")) {
ref.current.add("end");
callback4({
videoTimestampSeconds: Math.max(a0, a1),
progress: 1,
thresholdMet: true
});
}
}, [callback4]);
callback8 = useCallback((a0, a1) => {
if (!(a1 <= 0)) {
const progress = formatVideoProgressRatio(a0, a1);
for (const item of c9831_6) {
const r15 = `p${item}`;
if (!ref.current.has(r15) && !(progress < item / 100)) {
ref.current.add(r15);
callback4({
videoTimestampSeconds: a0,
progress,
thresholdMet: 1000 * a0 >= rewardDurationMs
});
}
}
}
}, [callback4, rewardDurationMs]);
const callback12 = useCallback((a0, a1, a2) => {
ref3.current = a2;
ref4.current = a1;
callback3(a1);
if (a0 === 0) {
callback5();
}
if (1000 * a0 >= rewardDurationMs) {
callback6(a0, a1);
}
callback8(a0, a1);
}, [callback3, callback5, callback6, callback8, rewardDurationMs]);
const callback13 = useCallback((a0, a1, a2) => {
ref3.current = a2;
ref4.current = a1;
callback3(a1);
if (a0 === 0) {
callback5();
}
callback6(a0, a1);
callback8(a0, a1);
callback7(a0, a1);
}, [callback3, callback5, callback6, callback8, callback7]);
const callback14 = useCallback((a0) => {
ref3.current = 0;
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_LOOPED,
properties: {
video_session_id: memo,
impression_id: questImpressionId,
loop_count: a0,
reward_timer_seconds: rewardDurationMs / 1000
},
sourceQuestContent
});
}, [bountyId, memo, questImpressionId, sourceQuestContent, rewardDurationMs]);
const callback15 = useCallback((a0, a1) => {
if (a1 === PlaybackTriggerSource.USER_INTERACTION) {
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_PAUSED,
properties: {
video_timestamp_seconds: a0,
video_session_id: memo,
impression_id: questImpressionId,
reward_timer_seconds: rewardDurationMs / 1000
},
sourceQuestContent
});
}
}, [bountyId, memo, questImpressionId, sourceQuestContent, rewardDurationMs]);
const callback16 = useCallback((a0, a1) => {
if (a1 === PlaybackTriggerSource.USER_INTERACTION) {
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_RESUMED,
properties: {
video_timestamp_seconds: a0,
video_session_id: memo,
impression_id: questImpressionId,
reward_timer_seconds: rewardDurationMs / 1000
},
sourceQuestContent
});
}
}, [bountyId, memo, questImpressionId, sourceQuestContent, rewardDurationMs]);
const callback17 = useCallback((a0) => {
const properties = {
video_progress: formatVideoProgressRatio(ref3.current, ref4.current),
video_error_type: null,
network_connection_speed: null,
video_session_id: memo,
video_error_code: a0 == null ? void 0 : a0.error.code,
video_error_message: null,
video_network_state: null,
impression_id: null,
reward_timer_seconds: null
};
let video_error_message = a0 == null ? void 0 : a0.error.localizedDescription;
if (video_error_message == null) {
video_error_message = a0 == null ? void 0 : a0.error.errorString;
}
properties.video_error_message = video_error_message;
properties.impression_id = questImpressionId;
properties.reward_timer_seconds = rewardDurationMs / 1000;
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_ERROR,
properties,
sourceQuestContent
});
if (isSourceError(a0)) {
MonitoringAgent.increment({
name: MetricEvents.QUEST_VIDEO_ERROR,
tags: ["error_type:SOURCE_ERROR"]
});
}
}, [bountyId, memo, questImpressionId, sourceQuestContent, rewardDurationMs]);
callback9 = useCallback(() => {
if (ref10.current != null) {
const duration = Date.now() - ref10.current;
ref10.current = null;
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_BUFFERING_ENDED,
properties: {
video_session_id: memo,
impression_id: questImpressionId,
duration,
network_connection_speed: NetworkStore.getEffectiveConnectionSpeed(),
buffer_index: ref11.current,
video_bitrate_bps: ref12.current.bitrateBps,
...callback2(),
...memo2
},
sourceQuestContent
});
}
}, [bountyId, memo, questImpressionId, callback2, memo2, sourceQuestContent]);
callback10 = useCallback(() => {
if (!(ref7.current || ref5.current == null || ref6.current == null)) {
ref7.current = true;
callback();
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_TIME_TO_FIRST_FRAME,
properties: {
video_session_id: memo,
impression_id: questImpressionId,
duration_ms: ref6.current - ref5.current,
network_connection_speed: NetworkStore.getEffectiveConnectionSpeed(),
startup_bitrate_bps: ref12.current.bitrateBps,
...callback2(),
...memo2
},
sourceQuestContent
});
}
}, [bountyId, memo, questImpressionId, callback, callback2, memo2, sourceQuestContent]);
callback11 = useCallback(() => {
if (!(ref7.current || ref5.current == null || ref6.current == null)) {
if (ref12.current.bitrateBps == null) {
if (ref9.current == null) {
ref9.current = setTimeout(() => {
ref9.current = null;
callback10();
}, 500);
}
} else {
callback10();
}
}
}, [callback10]);
useEffect(() => () => {
if (ref9.current != null) {
callback10();
}
callback();
callback9();
}, [callback, callback9, callback10]);
useEffect(() => {
if (c20876_8) {
callback11();
} else {
if (ref9.current != null) {
callback10();
}
callback();
callback9();
}
}, [isActive, callback11, callback, callback9, callback10]);
return {
handleVideoProgressAnalytics: callback12,
handleVideoEndAnalytics: callback13,
handleVideoLoopedAnalytics: callback14,
handleVideoPausedAnalytics: callback15,
handleVideoResumedAnalytics: callback16,
handleVideoErrorAnalytics: callback17,
handleLoadStartAnalytics: useCallback(() => {
callback9();
callback();
ref5.current = Date.now();
ref6.current = null;
ref7.current = false;
ref8.current = false;
ref12.current = {
bitrateBps: null,
width: null,
height: null,
levelIndex: null
};
}, [callback, callback9]),
handleVideoTracksAnalytics: useCallback(({ videoTracks, selectedVideoTrackId }) => {
let current;
if (videoTracks.length === 0) {
current = {
bitrateBps: null,
width: null,
height: null,
levelIndex: null
};
} else {
const r7 = selectedVideoTrackId != null ? selectedVideoTrackId.length > 0 ? videoTracks.findIndex((videoTrack) => videoTrack.trackId === selectedVideoTrackId) : -1 : -1;
const r16 = r7 >= 0 ? videoTracks[r7] : videoTracks[0];
current = {
bitrateBps: r16.bitrate > 0 ? r16.bitrate : null,
width: r16.width > 0 ? r16.width : null,
height: r16.height > 0 ? r16.height : null,
levelIndex: r7 >= 0 ? r7 : null
};
}
ref12.current = current;
if (c20876_8 && ref6.current != null && ref12.current.bitrateBps != null) {
callback10();
}
}, [callback10, isActive]),
handleReadyForDisplayAnalytics: useCallback(() => {
ref8.current = true;
if (ref6.current == null) {
ref6.current = Date.now();
}
if (c20876_8) {
callback11();
}
}, [isActive, callback11]),
handleBufferAnalytics: useCallback((a0) => {
if (ref8.current && c20876_8) {
if (a0) {
ref10.current = Date.now();
ref11.current = ref11.current + 1;
trackAdContentEvent({
adContentId: bountyId,
adCreativeType: AdCreativeType.BOUNTY,
event: AnalyticEvents.AD_VIDEO_BUFFERING_STARTED,
properties: {
video_session_id: memo,
impression_id: questImpressionId,
network_connection_speed: NetworkStore.getEffectiveConnectionSpeed(),
buffer_index: ref11.current,
video_bitrate_bps: ref12.current.bitrateBps,
...callback2(),
...memo2
},
sourceQuestContent
});
} else {
callback9();
}
return void 0;
}
}, [bountyId, memo, questImpressionId, callback9, callback2, isActive, memo2, sourceQuestContent])
};
}
@@ -0,0 +1,87 @@
// Metro module 14043 (f14044).
import { useState, useCallback } from "react";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useAnimatedReaction } from "../../../reanimated/ReanimatedRexport";
import * as _useBountiesRecapScroll from "./useBountiesRecapScroll";
let getRecapOrbCountFromPullProgress, __initData, __initData2;
const getRecapOrbCountFromPullProgress2 = function getRecapOrbCountFromPullProgress(a0, a1) {
if (!(a1 <= 0) && Number.isFinite(a1)) {
return Math.round(Math.min(1, Math.max(0, a0)) * a1);
}
return 0;
};
getRecapOrbCountFromPullProgress2.__closure = {};
getRecapOrbCountFromPullProgress2.__workletHash = 14295638108053;
getRecapOrbCountFromPullProgress2.__initData = {
code: "function getRecapOrbCountFromPullProgress_useBountiesRecapOrbCountTsx1(progress,targetOrbAmount){if(targetOrbAmount<=0||!Number.isFinite(targetOrbAmount)){return 0;}const clampedProgress=Math.min(1,Math.max(0,progress));return Math.round(clampedProgress*targetOrbAmount);}"
};
getRecapOrbCountFromPullProgress = getRecapOrbCountFromPullProgress2;
__initData = {
code: "function useBountiesRecapOrbCountTsx2(){const{enabled,recapRevealHeight,getRevealProgress,scrollY,lastBountyScrollOffset,RECAP_ORB_COUNT_REACHES_TARGET_AT_PROGRESS,getRecapOrbCountFromPullProgress,targetOrbAmount}=this.__closure;if(!enabled||recapRevealHeight<=0){return{count:0,revealed:false};}const pullProgress=getRevealProgress(scrollY.get(),lastBountyScrollOffset,recapRevealHeight)/RECAP_ORB_COUNT_REACHES_TARGET_AT_PROGRESS;if(pullProgress<=0.1){return{count:0,revealed:false};}return{count:getRecapOrbCountFromPullProgress(pullProgress,targetOrbAmount),revealed:true};}"
};
__initData2 = {
code: "function useBountiesRecapOrbCountTsx3({count:count,revealed:revealed}){const{runOnJS,resetDisplayCount,setDisplayCountMonotonic}=this.__closure;if(!revealed){runOnJS(resetDisplayCount)();return;}runOnJS(setDisplayCountMonotonic)(count);}"
};
export { getRecapOrbCountFromPullProgress };
export function useBountiesRecapOrbCount({ scrollY, lastBountyScrollOffset, recapRevealHeight, targetOrbAmount, enabled }) {
let callback2;
callback2 = void 0;
const [state, setState] = useState(0);
const callback = useCallback((c27616_0) => {
setState((prevState) => {
let r0 = prevState;
if (c27616_0 > prevState) {
r0 = c27616_0;
}
return r0;
});
}, []);
callback2 = useCallback(() => {
setState(0);
}, []);
const b = function b() {
if (enabled && !(recapRevealHeight <= 0)) {
const r21 = _useBountiesRecapScroll.getRevealProgress(scrollY.get(), lastBountyScrollOffset, recapRevealHeight) / 0.95;
return r21 <= 0.1 ? {
count: 0,
revealed: false
} : {
count: targetOrbAmount <= 0 ? 0 : Number.isFinite(targetOrbAmount) ? Math.round(Math.min(1, Math.max(0, r21)) * targetOrbAmount) : 0,
revealed: true
};
}
return {
count: 0,
revealed: false
};
};
b.__closure = {
enabled,
recapRevealHeight,
getRevealProgress: _useBountiesRecapScroll.getRevealProgress,
scrollY,
lastBountyScrollOffset,
RECAP_ORB_COUNT_REACHES_TARGET_AT_PROGRESS: 0.95,
getRecapOrbCountFromPullProgress,
targetOrbAmount
};
b.__workletHash = 2855285055570;
b.__initData = __initData;
const r39 = function(a0) {
const count = a0.count;
if (a0.revealed) {
_ReanimatedRexport.runOnJS(callback)(count);
} else {
_ReanimatedRexport.runOnJS(callback2)();
}
};
r39.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
resetDisplayCount: callback2,
setDisplayCountMonotonic: callback
};
r39.__workletHash = 12006414940221;
r39.__initData = __initData2;
useAnimatedReaction(b, r39);
return state;
}
@@ -0,0 +1,46 @@
// Metro module 14039 (f14040).
import { useCallback } from "react";
let getRevealProgress;
const getRevealProgress2 = function getRevealProgress(a0, a1, a2) {
return a2 <= 0 ? 0 : (a0 - a1) / a2;
};
getRevealProgress2.__closure = {};
getRevealProgress2.__workletHash = 9769647749947;
getRevealProgress2.__initData = {
code: "function getRevealProgress_useBountiesRecapScrollTsx1(scrollOffset,startOffset,revealHeight){if(revealHeight<=0){return 0;}return(scrollOffset-startOffset)/revealHeight;}"
};
getRevealProgress = getRevealProgress2;
export const RECAP_SNAP_EPSILON = 2;
export { getRevealProgress };
export function useBountiesRecapScroll({ listRef, enabled, offsets }) {
let callback2;
callback2 = void 0;
const callback = useCallback((a0) => {
if (listRef.current != null) {
listRef.current.scrollToOffset({
offset: a0,
animated: true
});
}
}, [listRef]);
const callback3 = useCallback(() => {
callback(offsets.lastBounty);
}, [offsets.lastBounty, callback]);
callback2 = useCallback((a0) => {
if (enabled && !(a0 <= offsets.lastBounty)) {
const { lastBounty, revealHeight } = offsets;
const r15 = (revealHeight <= 0 ? 0 : (a0 - lastBounty) / revealHeight) >= 0.25 ? offsets.fullRecap : offsets.lastBounty;
if (!(Math.abs(a0 - r15) < 2)) {
callback(r15);
}
}
}, [enabled, offsets.fullRecap, offsets.lastBounty, offsets.revealHeight, callback]);
return {
scrollToLastBounty: callback3,
handleRecapMomentumEnd: useCallback((a0) => {
if (enabled) {
callback2(a0.contentOffset.y);
}
}, [enabled, callback2])
};
}
@@ -0,0 +1,34 @@
// Metro module 14040 (f14041).
import { BountiesVerticalScrollExperiment } from "../../experiments/BountiesVerticalScrollExperiment";
import { useForceBountiesSwipeUpNux } from "./bountiesSwipeUpNuxDevTools";
import { DismissibleContent } from "../../../../_bundle/Module1358";
import { useSelectedDismissibleContent, useSelectedTimeRecurringDismissibleContent } from "../../../dismissible_content/hooks/useSelectedDismissibleContent";
export function useBountySwipeUpNux(a0) {
let hasRecurringSwipeUpNux;
let isEligible = a0.isEligible;
const r3 = BountiesVerticalScrollExperiment.useConfig({
location: a0.location
}).scrollAffordanceVariant === "none";
const [r27] = useForceBountiesSwipeUpNux();
const r28 = isEligible && r3 ? [DismissibleContent.BOUNTIES_SWIPE_UP_NUX] : [];
const r14 = isEligible ? r3 ? null : DismissibleContent.BOUNTIES_RECURRING_SWIPE_UP_NUX : null;
const [r43, dismissSingleUseSwipeUpNux] = useSelectedDismissibleContent(r28);
const hasSingleUseSwipeUpNux = r27 ? isEligible ? r3 : isEligible : r43 === DismissibleContent.BOUNTIES_SWIPE_UP_NUX;
const [r55, dismissRecurringSwipeUpNux] = useSelectedTimeRecurringDismissibleContent(r14, {
cooldownDurationMs: 86400000
});
if (r27) {
if (isEligible) {
isEligible = !r3;
}
hasRecurringSwipeUpNux = isEligible;
} else {
hasRecurringSwipeUpNux = r55 === DismissibleContent.BOUNTIES_RECURRING_SWIPE_UP_NUX;
}
return {
hasSingleUseSwipeUpNux,
dismissSingleUseSwipeUpNux,
hasRecurringSwipeUpNux,
dismissRecurringSwipeUpNux
};
}
@@ -0,0 +1,83 @@
// Metro module 14058 (f14059).
import { useState, useRef, useCallback } from "react";
import BountyStore from "../../BountyStore";
import { QuestsExperimentLocations } from "../../QuestConstants";
import { useBountiesExperience } from "../../experiments/useBountiesExperience";
import { BountyVideoEndMode } from "./useBountiesModalTiming";
import { setBountyVideoProgress } from "../../BountyActionCreators";
let c9830_6 = {
timestampSec: 0,
maxTimestampSec: 0,
duration: 0
};
export function useBountyVideoProgressPersistence({ bountyId, endMode }) {
let ref, ref2, ref3, ref4;
ref = void 0;
ref2 = void 0;
ref3 = void 0;
ref4 = void 0;
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.VIDEO_MODAL_MOBILE);
let ownedByVerticalScrollExperiment = bountiesExperience.ownedByVerticalScrollExperiment;
const stage1Enabled2 = bountiesExperience.stage1Enabled;
if (!ownedByVerticalScrollExperiment) {
ownedByVerticalScrollExperiment = stage1Enabled2;
}
const stage1Enabled = ownedByVerticalScrollExperiment;
const [initialProgress] = useState(() => {
let r10;
if (stage1Enabled) {
L9: {
L8: {
r10 = BountyStore.getBountyVideoProgress(bountyId);
if (r10 != null) {
if (endMode === BountyVideoEndMode.LOOP) {
const { maxTimestampSec, duration } = r10;
if (duration > 0 && maxTimestampSec >= duration - 1) {
break L8;
}
}
if (!(r10.timestampSec <= 5)) {
break L9;
}
}
}
r10 = c9830_6;
}
return r10;
}
return c9830_6;
});
ref = useRef(0);
ref2 = useRef(initialProgress.timestampSec);
ref3 = useRef(initialProgress.maxTimestampSec);
ref4 = useRef(initialProgress.duration);
return {
initialProgress,
handleProgress: useCallback((a0, a1, a2) => {
ref2.current = a2;
ref3.current = a0;
ref4.current = a1;
let r11 = stage1Enabled;
if (stage1Enabled) {
r11 = a2 >= ref.current;
}
if (r11) {
ref.current = a2 + 1;
setBountyVideoProgress(bountyId, {
timestampSec: a2,
maxTimestampSec: a0,
duration: a1
});
}
}, [stage1Enabled, bountyId]),
flushProgress: useCallback(() => {
if (stage1Enabled) {
setBountyVideoProgress(bountyId, {
timestampSec: ref2.current,
maxTimestampSec: ref3.current,
duration: ref4.current
});
}
}, [stage1Enabled, bountyId])
};
}
@@ -0,0 +1,66 @@
// Metro module 14038 (f14039).
import { useState, useCallback } from "react";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
const __initData = {
code: "function useVisibilityTransitionTsx1(){const{withTiming,visibility,visible,entranceTiming,exitTiming,runOnJS,animationCallbackJSThread}=this.__closure;return{opacity:withTiming(visibility,visible?entranceTiming:exitTiming,'respect-motion-settings',function(){'worklet';runOnJS(animationCallbackJSThread)();})};}"
};
const __initData2 = {
code: "function useVisibilityTransitionTsx2(){const{runOnJS,animationCallbackJSThread}=this.__closure;runOnJS(animationCallbackJSThread)();}"
};
export function useVisibilityTransition(a0) {
let c20865_5;
let visible2 = a0.visible;
const visible = visible2;
const { entranceTiming, exitTiming } = a0;
c20865_5 = void 0;
const [state, setState] = useState(false);
const [state2, setState2] = useState(visible);
if (state2 !== visible) {
setState2(visible);
if (!visible) {
setState(true);
}
}
const callback = useCallback(() => {
setState(false);
}, []);
const visibility = visible ? 1 : 0;
c20865_5 = visibility;
const k = () => {
const r6 = visible ? entranceTiming : exitTiming;
const n = function n() {
_ReanimatedRexport.runOnJS(callback)();
};
n.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
animationCallbackJSThread: callback
};
n.__workletHash = 11904317879470;
n.__initData = __initData2;
return {
opacity: _timing.withTiming(c20865_5, r6, "respect-motion-settings", n)
};
};
k.__closure = {
withTiming: _timing.withTiming,
visibility,
visible,
entranceTiming,
exitTiming,
runOnJS: _ReanimatedRexport.runOnJS,
animationCallbackJSThread: callback
};
k.__workletHash = 12648900540770;
k.__initData = __initData;
const r46 = {
opacityStyle: useAnimatedStyle(k),
shouldRender: null
};
if (!visible) {
visible2 = state;
}
r46.shouldRender = visible2;
return r46;
}
@@ -0,0 +1,25 @@
// Metro module 14092 (f14093).
import { useCallback } from "react";
import { View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { PROMO_SHEET_KEY } from "./openBountiesNuxPromoSheet";
import { PromoSheet } from "../../../design/components/Sheet/native/PromoSheet.native";
import { intl, t } from "../../../intl/index.native";
import { BountiesPosterSpotIllustration } from "../../../design/components/mana-assets/native/generated/BountiesPosterSpotIllustration.native";
import { Button } from "../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
illustrationContainer: {
paddingTop: Module712.space.PX_12
}
});
export default function BountiesNuxPromoSheet() {
const styles = useStyles();
const callback = useCallback(() => {
ActionSheetActionCreators.hideActionSheet(PROMO_SHEET_KEY);
}, []);
return <PromoSheet gradientColor="purple" title={intl.string(t.DDpHZG)} description={intl.string(t["LY+igv"])} illustration={<View style={styles.illustrationContainer}>
<BountiesPosterSpotIllustration width={273} height={205} />
</View>} actions={<Button grow size="lg" variant="primary" text={intl.string(t.cpT0Cq)} onPress={callback} />} />;
};
+258
View File
@@ -0,0 +1,258 @@
// Metro module 14094 (f14095).
import * as Module19 from "react";
import { useCallback, useState, useRef, useEffect, useMemo } from "react";
import { AppState, StyleSheet, View } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import BountyStore from "../BountyStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import * as _Module501 from "../../../_bundle/Module501";
import { useStateFromStores } from "../../../_bundle/Module589";
import { getScaledImageUrl, getScaledFirstFrameImageUrl } from "../lib/AssetUtils";
import { useToken } from "../../../design/tokens/native/useToken";
import { Card } from "../../../design/components/Card/native/Card.native";
import Video from "../../../_bundle/Video_8143";
import FastImage from "../../../components_native/common/FastImage";
import { CheckmarkSmallBoldIcon } from "../../../design/components/Icon/native/redesign/generated/CheckmarkSmallBoldIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import { Button } from "../../../design/components/Button/native/Button.native";
import { CircleCheckIcon } from "../../../design/components/Icon/native/redesign/generated/CircleCheckIcon";
let c9860_14, isAndroid, isAndroid2;
const width = 188;
const useStyles = createStyles(() => ({
tile: {
gap: Module712.space.PX_12
},
card: {
width,
height: 313,
overflow: "hidden",
padding: 0
},
cardImage: {
...StyleSheet.absoluteFillObject
},
previewVideo: {
...StyleSheet.absoluteFillObject
},
badge: {
position: "absolute",
top: Module712.space.PX_12,
left: Module712.space.PX_12,
backgroundColor: Module712.colors.CONTROL_OVERLAY_PRIMARY_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.round,
paddingHorizontal: Module712.space.PX_8,
paddingVertical: Module712.space.PX_4,
color: Module712.colors.CONTROL_OVERLAY_PRIMARY_TEXT_DEFAULT
},
badgeContent: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
},
badgeText: {
textTransform: "uppercase",
color: Module712.colors.CONTROL_OVERLAY_PRIMARY_TEXT_DEFAULT
},
startButton: {
position: "absolute",
bottom: Module712.space.PX_8,
left: Module712.space.PX_8,
right: Module712.space.PX_8
},
cardFooter: {
flexDirection: "column",
alignItems: "flex-start",
maxWidth: width
},
advertiserRow: {
flexDirection: "row",
gap: Module712.space.PX_4,
alignItems: "center"
},
advertiserName: {
flexShrink: 1
},
advertiserIcon: {
flexShrink: 0,
opacity: 0.7
}
}));
c9860_14 = _Module501.isAndroid() ? 150 : 0;
isAndroid = _Module501.isAndroid();
isAndroid2 = _Module501.isAndroid();
const r52 = Module19.memo(function({ bounty, index, isActive, isModalVisible, onPress }) {
let setState, setState2, state, setState3, ref, ref2, setState4, state2;
setState = void 0;
setState2 = void 0;
state = void 0;
setState3 = void 0;
ref = void 0;
ref2 = void 0;
setState4 = void 0;
state2 = void 0;
const styles = useStyles();
const stateFromStores = useStateFromStores([BountyStore], () => BountyStore.isBountyCompleted(bounty.id));
const callback2 = useCallback(() => {
onPress(bounty, index);
}, [onPress, bounty, index]);
const videoPreview = bounty.videoPreview;
let uri = bounty.imagePreview != null ? getScaledImageUrl({
assetUrl: bounty.imagePreview,
width,
height: 313
}) : null;
if (uri == null && videoPreview != null) {
uri = getScaledFirstFrameImageUrl({
assetUrl: videoPreview,
width,
height: 313
});
}
let state3;
[state3, setState] = useState(false);
const callback = useCallback(() => {
setState(true);
}, []);
let state4;
[state4, setState2] = useState(false);
let state5;
[state5, setState3] = useState(false);
state = state5;
const stateFromStores2 = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const token = useToken(Module712.modules.mobile.BOUNTY_TILE_BORDER_RADIUS);
ref = useRef(null);
const callback3 = useCallback(() => {
if (ref.current != null) {
clearTimeout(ref.current);
}
ref.current = setTimeout(() => {
setState2(true);
}, c9860_14);
}, []);
const [state6, setState5] = useState(isActive);
if (isActive !== state6) {
setState5(isActive);
if (isActive) {
if (state4 ? !state : state4) {
setState2(false);
}
if (state) {
setState3(false);
}
} else if (isAndroid) {
setState3(true);
}
}
ref2 = useRef(null);
useEffect(() => {
if (state) {
ref2.current = setTimeout(() => {
setState3(false);
setState2(false);
ref2.current = null;
}, 150);
}
return () => {
if (ref2.current != null) {
clearTimeout(ref2.current);
ref2.current = null;
}
};
}, [state]);
useEffect(() => {
let r2 = isActive;
if (isActive ? ref2.current != null : isActive) {
clearTimeout(ref2.current);
ref2.current = null;
}
if (!isActive) {
r2 = ref.current == null;
}
if (!r2) {
clearTimeout(ref.current);
ref.current = null;
}
}, [isActive]);
useEffect(() => () => {
if (ref.current != null) {
clearTimeout(ref.current);
ref.current = null;
}
}, []);
let state7;
[state7, setState4] = useState(AppState.currentState === "active");
useEffect(() => {
let c27629_0 = AppState.addEventListener("change", (a0) => {
setState4(a0 === "active");
});
return () => {
c27629_0.remove();
};
}, []);
let r126 = (isActive ? isActive : state) && videoPreview != null && state3;
let r127 = isAndroid2;
if (isAndroid2) {
r127 = isModalVisible;
}
let r128 = !r127;
if (!r127) {
if (state) {
state5 = !isActive;
}
r128 = !state5;
}
if (r128) {
r128 = r126;
}
if (r128) {
r128 = state4;
}
state2 = r128;
const memo = useMemo(() => ({
opacity: state2 ? 0 : 1
}), [state2]);
if (r126) {
r126 = <Video accessible={false} importantForAccessibility="no-hide-descendants" accessibilityRole="none" onReadyForDisplay={callback3} source={{
uri: videoPreview
}} style={styles.previewVideo} resizeMode="cover" repeat muted disableFocus paused={state7 ? stateFromStores2 : !state7} />;
}
const r150 = [r126, , , ,];
if (uri == null) {
uri = void 0;
}
r150[1] = <FastImage style={[styles.cardImage, memo]} onLoad={callback} source={{
uri
}} resizeMode="cover" />;
r150[2] = <View style={styles.badge}>
<View style={styles.badgeContent}>
{stateFromStores && <CheckmarkSmallBoldIcon size="xxs" color={Module712.colors.CONTROL_OVERLAY_PRIMARY_TEXT_DEFAULT} />}
<Text variant="text-xs/bold" style={styles.badgeText}>
{intl.string(stateFromStores ? t.vlGTLf : t["fFIJ/9"])}
</Text>
</View>
</View>;
r150[3] = <View style={styles.startButton}>
<Button variant="secondary-overlay" text={stateFromStores ? intl.string(t["9UtZAY"]) : intl.string(t.LhlgY9)} onPress={callback2} />
</View>;
const r209 = [<Card style={styles.card} radius={token} onPress={callback2} android_ripple={{
color: "transparent"
}}>{r150}</Card>, ,];
let advertiserName = bounty.advertiserName;
if (advertiserName == null) {
advertiserName = "";
}
r209[1] = <View style={styles.cardFooter}>
<View style={styles.advertiserRow}>
<Text variant="text-sm/medium" color="text-subtle" lineClamp={1} style={styles.advertiserName}>{advertiserName}</Text>
<CircleCheckIcon size="xxs" style={styles.advertiserIcon} color={Module712.colors.ICON_SUBTLE} />
</View>
<Text variant="text-sm/medium" color="text-muted">
{intl.string(t.o6FLcF)}
</Text>
</View>;
return <View style={styles.tile}>{r209}</View>;
});
export default r52;
export const CARD_WIDTH = 188;
@@ -0,0 +1,111 @@
// Metro module 14187 (f14188).
import { useMemo } from "react";
import { StyleSheet, View } from "react-native";
import { jsx } from "react/jsx-runtime";
import { createStyles, createStyleProperties } from "../../../design/components/Styles/native/createStyles";
import { hexOpacityToRgba } from "../../../utils/ColorUtils";
import Module712 from "../../../_bundle/Module712";
import { useToken } from "../../../design/tokens/native/useToken";
import useTheme from "../../../hooks/useTheme";
import * as _Module4004 from "../../../_bundle/Module4004";
import Module4611 from "../../../_bundle/Module4611";
import Module5165 from "../../../_bundle/Module5165";
function $mk93257($env) {
return () => {
const r1 = $env;
return [r1[0], r1[1]];
};
}
let useStyles, start, end, start2, end2, styleProperties, PremiumRewardGlowGradient;
const PremiumRewardFillGradient = function PremiumRewardFillGradient(props) {
let env21020;
const { children, style } = props;
const styles = useStyles();
const r18 = env21020 = {};
env21020[0] = void 0;
env21020[1] = void 0;
const token2 = useToken(Module712.colors.EXPRESSIVE_GRADIENT_NITRO_PINK_START);
env21020[0] = token2;
const token = useToken(Module712.colors.EXPRESSIVE_GRADIENT_NITRO_PINK_END);
env21020[1] = token;
const memo = useMemo($mk93257(r18), [token2, token]);
const r36 = styleProperties();
const { transparentBlack, opaqueBlack, transparentWhite, opaqueWhite } = r36;
const isThemeDark = _Module4004.isThemeDark(useTheme());
return <View style={[styles.wrapper, style]}>
<Module4611 style={styles.fill} colors={memo} start={start} end={end} pointerEvents="none" />
<Module4611 style={styles.fill} colors={useMemo(() => isThemeDark ? [transparentBlack, opaqueBlack] : [transparentWhite, opaqueWhite], [transparentBlack, opaqueBlack, transparentWhite, opaqueWhite, isThemeDark])} start={start2} end={end2} pointerEvents="none" />
{children}
</View>;
};
PremiumRewardGlowGradient = function PremiumRewardGlowGradient(props) {
let env21021;
const { children, style } = props;
const styles = useStyles();
const r17 = env21021 = {};
env21021[0] = void 0;
env21021[1] = void 0;
const token2 = useToken(Module712.colors.EXPRESSIVE_GRADIENT_NITRO_PINK_START);
env21021[0] = token2;
const token = useToken(Module712.colors.EXPRESSIVE_GRADIENT_NITRO_PINK_END);
env21021[1] = token;
const memo = useMemo($mk93257(r17), [token2, token]);
const isThemeDark2 = _Module4004.isThemeDark(useTheme());
return <View style={[styles.wrapper, style]}>
<Module5165 style={[styles.glow, isThemeDark2 ? !isThemeDark2 : styles.glowLight]} maskElement={<Module4611 style={StyleSheet.absoluteFill} colors={["transparent", "black"]} start={start2} end={end2} />}>
<Module4611 style={StyleSheet.absoluteFill} colors={memo} start={start} end={end} />
</Module5165>
{children}
</View>;
};
useStyles = createStyles({
wrapper: {
position: "relative",
overflow: "hidden"
},
fill: {
position: "absolute",
left: 0,
right: 0,
bottom: 0,
height: "100%"
},
glow: {
position: "absolute",
left: 0,
right: 0,
bottom: 0,
height: "50%"
},
glowLight: {
opacity: 0.5
}
});
start = {
x: 0,
y: 0.5
};
end = {
x: 1,
y: 0.5
};
start2 = {
x: 0.5,
y: 0
};
end2 = {
x: 0.5,
y: 1
};
styleProperties = createStyleProperties({
transparentBlack: hexOpacityToRgba("#000000", 0),
opaqueBlack: Module712.colors.BLACK,
transparentWhite: hexOpacityToRgba("#FFFFFF", 0),
opaqueWhite: Module712.colors.WHITE
});
export default function QuestPremiumRewardGradientWrapper({ visible, style, children, glow }) {
return jsx(visible ? glow ? PremiumRewardGlowGradient : PremiumRewardFillGradient : View, {
style,
children
});
};
@@ -0,0 +1,262 @@
// Metro module 15859 (f15860).
import { useState, useMemo, useCallback } from "react";
import { Pressable, View } from "react-native";
import QuestStore from "../QuestStore";
import UnenrolledActivityQuestStore from "../UnenrolledActivityQuestStore";
import { QuestsExperimentLocations } from "../QuestConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import * as _Module501 from "../../../_bundle/Module501";
import { useTheme } from "../../../hooks/useTheme";
import { isThemeDark } from "../../../design/utils/shared/themes";
import { useStateFromStores } from "../../../_bundle/Module589";
import { useGetOrFetchApplication } from "../../applications/useGetOrFetchApplications";
import { getActivityApplicationId } from "../utils/QuestTaskUtils";
import { useQuestTaskDetails } from "../hooks/QuestHooks";
import { useQuestsInstructionsToWinReward } from "../hooks/QuestCopyHooks";
import { QuestContent } from "../QuestTypes";
import AvatarUtils from "../../../utils/AvatarUtils";
import { enrollInQuest, dismissQuestActivityModal, setAutoEnroll } from "../QuestActionCreators";
import { QuestContentCTA } from "../lib/analytics/AnalyticsTypes";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { useCheckboxA11yNative } from "../../../_bundle/Module3907";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import FastImage from "../../../components_native/common/FastImage";
import QuestRewardTile from "./QuestRewardTile";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import { Button } from "../../../design/components/Button/native/Button.native";
import { FormCheckbox } from "../../../design/components/Forms/native/FormCheckbox.native";
import { HeaderActionButton } from "../../../design/components/Navigator/native/HeaderActionButton.native";
import Module7699 from "../../../_bundle/Module7699";
import { QuestContentImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
import { Modal } from "../../../design/components/Modal/native/Modal.native";
import { HermesBuiltin } from "../../../_hermes/prelude";
let c11350_13, useStyles, CloseButton;
const QuestActivityUnenrolledModalInner = function QuestActivityUnenrolledModalInner(props) {
let state, setState, getOrFetchApplication;
const quest = props.quest;
state = void 0;
setState = void 0;
getOrFetchApplication = void 0;
const styles = useStyles(isThemeDark(useTheme()));
[state, setState] = useState(useStateFromStores([UnenrolledActivityQuestStore], () => UnenrolledActivityQuestStore.getState().autoEnroll));
getOrFetchApplication = useGetOrFetchApplication(getActivityApplicationId(quest));
const questsInstructionsToWinReward = useQuestsInstructionsToWinReward({
quest,
taskDetails: useQuestTaskDetails(quest),
location: QuestsExperimentLocations.QUEST_ACTIVITY_UNENROLLED_MODAL,
sourceQuestContent: QuestContent.QUEST_ACTIVITY_UNENROLLED_MODAL
});
const memo = useMemo(() => getOrFetchApplication != null ? AvatarUtils.getApplicationIconURL({
id: getOrFetchApplication.id,
icon: getOrFetchApplication.icon,
size: 87
}) : null, [getOrFetchApplication]);
const callback = useCallback(async () => {
let c28168_0;
c28168_0 = void 0;
await enrollInQuest(quest.id, {
questContent: QuestContent.QUEST_ACTIVITY_UNENROLLED_MODAL,
questContentCTA: QuestContentCTA.START_QUEST,
sourceQuestContent: QuestContent.QUEST_ACTIVITY_UNENROLLED_MODAL
});
ModalActionCreators.pop();
}, [quest.id]);
const checkboxA11yNative = useCheckboxA11yNative({
checked: state
});
const { accessibilityRole, accessibilityState } = checkboxA11yNative;
return <Stack direction="vertical" align="center" justify="center" style={styles.container}>
<View style={styles.content}>
<View style={styles.baseShadow}>
<View style={styles.imagesContainer}>
{memo != null && <View style={styles.appIconContainer}>
<FastImage source={{
uri: memo
}} style={styles.appIcon} />
</View>}
<View style={styles.rewardTileContainer}>
<QuestRewardTile quest={quest} height={87} width={87} style={styles.questRewardTile} />
</View>
</View>
</View>
<View style={styles.textContainer}>
<Text variant="heading-xl/bold" color="mobile-text-heading-primary" style={{
textAlign: "center"
}}>
{intl.string(t.IrNgN4)}
</Text>
<Text variant="text-sm/normal" color="text-subtle" style={{
textAlign: "center"
}}>
{intl.format(t.V3NSJx, {
questName: quest.config.messages.questName
})}
{" "}
{questsInstructionsToWinReward}
</Text>
</View>
</View>
<View style={styles.footer}>
<View style={styles.buttonsContainer}>
<Button size="lg" text={intl.string(t.l7E81v)} onPress={callback} />
<Button size="lg" text={intl.string(t.fyT2ol)} onPress={function onPress() {
dismissQuestActivityModal(quest.id);
ModalActionCreators.pop();
}} variant="secondary" />
</View>
<Pressable accessibilityRole={accessibilityRole} accessibilityLabel={intl.string(t["931n1T"])} accessibilityState={accessibilityState} onPress={() => {
const r0 = !state;
setState(r0);
setAutoEnroll(r0);
}} style={{
alignSelf: "center",
flexDirection: "row",
alignItems: "center",
gap: 8
}}>
<FormCheckbox checked={state} />
<Text variant="text-sm/normal" color="text-subtle">
{intl.string(t["931n1T"])}
</Text>
</Pressable>
</View>
</Stack>;
};
CloseButton = function CloseButton() {
return <HeaderActionButton source={Module7699} onPress={function onPress() {
return ModalActionCreators.pop();
}} accessibilityLabel={intl.string(t.cpT0Cq)} />;
};
c11350_13 = {
MAIN: "main"
};
useStyles = createStyles((a0) => {
let baseShadow;
const imagesContainer = {
flexDirection: "row",
justifyContent: "center",
alignItems: "center",
marginBottom: Module712.space.PX_32,
..._Module501.isIOS() ? a0 ? {
shadowColor: "rgb(144, 144, 251)",
shadowOffset: {
width: 0,
height: 0
},
shadowOpacity: 0.6,
shadowRadius: 85
} : {} : {
filter: a0 ? [{
dropShadow: {
standardDeviation: "85px",
color: "rgba(144, 144, 251, 0.65)",
offsetX: 0,
offsetY: 0
}
}, {
dropShadow: {
standardDeviation: "85px",
color: "rgba(144, 144, 250, 0.41)",
offsetX: 0,
offsetY: 0
}
}] : []
}
};
const isIOS = _Module501.isIOS();
const r49 = {};
if (isIOS) {
HermesBuiltin.copyDataProperties(r49, a0 ? {
shadowColor: "rgb(144, 144, 250)",
shadowOffset: {
width: 0,
height: 16
},
shadowOpacity: 0.4,
shadowRadius: 85
} : {});
baseShadow = r49;
} else {
baseShadow = r49;
}
return {
container: {
flex: 1,
paddingHorizontal: Module712.space.PX_24,
paddingVertical: Module712.space.PX_16,
paddingBottom: Module712.space.PX_48
},
content: {
marginTop: "auto"
},
imagesContainer,
baseShadow,
appIconContainer: {
borderRadius: Module712.radii.xl,
borderWidth: 2.18,
borderColor: "rgba(151, 151, 159, 0.24)",
borderStyle: "solid",
transform: [{
rotate: "-12.41deg"
}],
overflow: "hidden"
},
appIcon: {
width: 87,
height: 87,
borderRadius: Module712.radii.xl - 2.18
},
rewardTileContainer: {
borderWidth: 2.18,
borderColor: "rgba(151, 151, 159, 0.24)",
borderRadius: Module712.radii.xl,
borderStyle: "solid",
transform: [{
translateX: -10
}, {
rotate: "7.81deg"
}],
overflow: "hidden"
},
questRewardTile: {
borderRadius: Module712.radii.xl - 2.18
},
textContainer: {
alignItems: "center",
gap: Module712.space.PX_8
},
buttonsContainer: {
flexDirection: "column",
gap: Module712.space.PX_8,
marginBottom: 20
},
footer: {
flexDirection: "column",
width: "100%",
marginTop: "auto"
}
};
});
export default function QuestActivityUnenrolledModal(props) {
const questId = props.questId;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuest(questId));
if (stateFromStores == null) {
return null;
}
const screens = {};
screens[c11350_13.MAIN] = {
headerLeft: CloseButton,
headerRight: function headerRight() {
return null;
},
headerTitle: () => <Text variant="redesign/heading-18/bold" color="mobile-text-heading-primary">
{intl.string(t.l7E81v)}
</Text>,
render: () => <QuestContentImpressionTrackerNative questOrQuests={stateFromStores} questContent={QuestContent.QUEST_ACTIVITY_UNENROLLED_MODAL} sourceQuestContent={QuestContent.QUEST_ACTIVITY_UNENROLLED_MODAL}>
{() => <QuestActivityUnenrolledModalInner quest={stateFromStores} />}
</QuestContentImpressionTrackerNative>
};
return <Modal screens={screens} initialRouteName={c11350_13.MAIN} />;
};
@@ -0,0 +1,367 @@
// Metro module 14144 (f14145).
import Module19, { useState } from "react";
import { View } from "react-native";
import QuestStore from "../../QuestStore";
import { QuestTaskPlatform, QuestsExperimentLocations } from "../../QuestConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { getQuestLogger } from "../../lib/getQuestLogger";
import { manuallyStartConsoleQuest } from "../../QuestActionCreators";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import { intl, t } from "../../../../intl/index.native";
import Module9172 from "../../../../_bundle/Module9172";
import { useQuestTaskDetails, useIsQuestProgressing, useTaskPlatformScreen, useConnectedAccounts, useQuestHowToHelpArticle } from "../../hooks/QuestHooks";
import { supportedConsoles } from "../../utils/QuestPlatformUtils";
import { TaskPlatformScreen, QuestContent } from "../../QuestTypes";
import { useHasWatchVideoOnMobileTasks, useMobileActivityQuest } from "../QuestHooks.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { QuestContentImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import * as _QuestTaskUtils from "../../utils/QuestTaskUtils";
import { BottomSheet } from "../../../../design/components/Sheet/native/BottomSheet.native";
import QuestBottomSheetHeader from "./QuestBottomSheetHeader";
import QuestBottomSheetFooter from "./QuestBottomSheetFooter";
import { useTrackQuestContentClickedWithImpression } from "../../lib/analytics/AnalyticsHooks";
import { useQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestBottomSheetProgressCardWatchTask, QuestBottomSheetProgressCardInGameTask, QuestBottomSheetProgressCardPlayStreamTask } from "./QuestBottomSheetProgressCard";
import QuestBottomSheetTaskSelect from "./QuestBottomSheetTaskSelect";
import QuestBottomSheetConsoleConnect from "./QuestBottomSheetConsoleConnect";
import { isSponsoredPlayQuest } from "../../utils/QuestUtils";
import { WarningIcon } from "../../../../design/components/Icon/native/redesign/generated/WarningIcon";
import { Text } from "../../../../design/components/Text/native/Text";
let c9898_13, useStyles, useEnrolledQuestContentProps, QuestBottomSheetContent, MicrophoneUnit, context;
const QuestBottomSheet = function QuestBottomSheet(props) {
let state, r55, Provider, defibrillator, footer, handleTaskSelect2, props2, quest5, showMicrophone, sourceQuestContent4, step, styles;
let setState;
L4: {
quest5 = props.quest;
const initialStep2 = props.initialStep;
sourceQuestContent4 = props.sourceQuestContent;
setState = void 0;
styles = useStyles();
const enrolledQuestContentProps = useEnrolledQuestContentProps({
quest: quest5,
initialStep: initialStep2,
location: QuestsExperimentLocations.QUEST_HOME_MOBILE,
sourceQuestContent: sourceQuestContent4
});
step = enrolledQuestContentProps.step;
defibrillator = enrolledQuestContentProps.defibrillator;
const stepActions = enrolledQuestContentProps.stepActions;
handleTaskSelect2 = enrolledQuestContentProps.handleTaskSelect;
showMicrophone = enrolledQuestContentProps.showMicrophone;
const hasWatchVideoOnMobileTasks3 = useHasWatchVideoOnMobileTasks(quest5.config);
const hasWatchVideoTasks = _QuestTaskUtils.hasWatchVideoTasks(quest5);
const isInGameQuest = _QuestTaskUtils.isInGameQuest(quest5);
let state;
[state, setState] = useState(0);
const memo4 = Module19.useMemo(() => ({
isInQuestBottomSheet: true
}), []);
Provider = context.Provider;
r55 = {
value: memo4,
children: null
};
props2 = {
header: <QuestBottomSheetHeader quest={quest5} step={step} location={QuestsExperimentLocations.QUEST_HOME_MOBILE} />,
footer: null,
startExpanded: true,
children: null
};
footer = null;
if (!isInGameQuest) {
if (hasWatchVideoTasks) {
footer = null;
if (!hasWatchVideoOnMobileTasks3) {
break L4;
}
}
footer = <QuestBottomSheetFooter quest={quest5} sourceQuestContent={sourceQuestContent4} step={step} isDefibrilating={defibrillator.isActive} onLayout={function onLayout(event) {
setState(event.nativeEvent.layout.height);
}} onBack={stepActions.onBack} onDefib={defibrillator.start} onConnectConsoleNext={stepActions.onNext} />;
}
}
props2.footer = footer;
props2.children = <View style={[styles.contentContainer, {
paddingBottom: step !== c9898_13.TASK_SELECT ? state : 0
}]}>
<QuestBottomSheetContent defibrillator={defibrillator} quest={quest5} handleTaskSelect={handleTaskSelect2} location={QuestsExperimentLocations.QUEST_HOME_MOBILE} showMicrophone={showMicrophone} sourceQuestContent={sourceQuestContent4} step={step} />
</View>;
r55.children = <BottomSheet {...props2} />;
return <Provider {...r55} />;
};
useEnrolledQuestContentProps = function useEnrolledQuestContentProps(a0) {
let xboxAndPlaystationAccounts, c20940_2, c20940_3, c20940_4, state, setState2, c20940_7, callback, hideConsoleSelect2, memo, memo2, memo3, hasWatchVideoOnMobileTasks, isMobileActivityQuest;
const { quest, initialStep: initialStep2 } = a0;
a0.location;
const sourceQuestContent = a0.sourceQuestContent;
const trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
const questImpressionId = useQuestImpressionId();
const questTaskDetails = useQuestTaskDetails(quest);
const isQuestProgressing = useIsQuestProgressing(quest);
let [r14, , c20939_4] = useTaskPlatformScreen(quest, questTaskDetails);
const hasWatchVideoOnMobileTasks3 = useHasWatchVideoOnMobileTasks(quest.config);
const quest2 = quest;
xboxAndPlaystationAccounts = void 0;
c20940_2 = void 0;
c20940_3 = void 0;
c20940_4 = void 0;
state = void 0;
setState2 = void 0;
c20940_7 = void 0;
callback = void 0;
memo = void 0;
memo2 = void 0;
memo3 = void 0;
hasWatchVideoOnMobileTasks = void 0;
isMobileActivityQuest = void 0;
const showConsoleSelect2 = function showConsoleSelect() {
return setState2(true);
};
hideConsoleSelect2 = function hideConsoleSelect() {
return setState2(false);
};
const r57 = quest.userStatus?.completedAt != null;
xboxAndPlaystationAccounts = useConnectedAccounts().xboxAndPlaystationAccounts;
const memo4 = Module19.useMemo(() => supportedConsoles(quest2).filter((c31707_0) => xboxAndPlaystationAccounts.find((xboxAndPlaystationAccount) => xboxAndPlaystationAccount.type === c31707_0) != null), [quest, xboxAndPlaystationAccounts]);
const questTaskDetails2 = useQuestTaskDetails(quest);
let r20 = useIsQuestProgressing(quest);
const [r26, r25, r77] = useTaskPlatformScreen(quest, questTaskDetails2);
c20940_2 = r26;
c20940_3 = r25;
c20940_4 = r77;
[state, setState2] = Module19.useState(memo4.length === 0 && !r57 && r26 === TaskPlatformScreen.CONSOLE || initialStep2 === c9898_13.CONSOLE_CONNECT);
if (!r20) {
r20 = questTaskDetails2.progressSeconds > 0;
}
c20940_7 = r20;
if (!(memo4.length !== 0 || r57 || r26 !== TaskPlatformScreen.CONSOLE || state)) {
setState2(true);
}
callback = Module19.useCallback(() => {
setState2(false);
c20940_4(null);
}, [r77]);
memo = Module19.useMemo(() => [{
type: c9898_13.TASK_STATUS,
shouldShow: true
}], []);
memo2 = Module19.useMemo(() => [{
type: c9898_13.CONSOLE_CONNECT,
shouldShow: state,
onNext: hideConsoleSelect2
}, {
type: c9898_13.TASK_STATUS,
shouldShow: true,
onBack: c20940_7 ? void 0 : showConsoleSelect2
}], [state, r20]);
memo3 = Module19.useMemo(() => {
const TASK_SELECT = c9898_13.TASK_SELECT;
const r15 = [{
type: TASK_SELECT,
shouldShow: c20940_2 === TaskPlatformScreen.SELECT
}, , ,];
const shouldShow = c20940_2 === TaskPlatformScreen.CONSOLE && state;
let r23 = callback;
r15[1] = {
type: c9898_13.CONSOLE_CONNECT,
shouldShow,
onBack: callback,
onNext: hideConsoleSelect2
};
let onBack = void 0;
if (!c20940_7) {
if (c20940_2 === TaskPlatformScreen.CONSOLE) {
r23 = showConsoleSelect2;
}
onBack = r23;
}
r15[2] = {
type: c9898_13.TASK_STATUS,
shouldShow: true,
onBack
};
return r15;
}, [r26, state, r20, callback]);
hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest.config);
isMobileActivityQuest = useMobileActivityQuest(quest).isMobileActivityQuest;
const memo5 = Module19.useMemo(() => {
let r16;
const r5 = c20940_3.length === 1 && c20940_3.includes(QuestTaskPlatform.DESKTOP);
const r12 = c20940_3.length === 1 && c20940_3.includes(QuestTaskPlatform.CONSOLE);
L10: {
r16 = memo3;
if (!r5 && (!hasWatchVideoOnMobileTasks && !isMobileActivityQuest)) {
if (!r12) {
break L10;
}
r16 = memo2;
} else {
r16 = memo;
}
}
let r21 = r16.find((item) => item.shouldShow);
const r23 = r16;
if (r21 == null) {
r21 = r23.at(-1);
}
return r21;
}, [r25, memo3, memo, memo2, hasWatchVideoOnMobileTasks, isMobileActivityQuest]);
const r130 = [memo5.type, ,];
const onBack = memo5?.onBack;
const onNext = memo5?.onNext;
r130[1] = {
onBack,
onNext
};
const [step, stepActions] = r130;
const quest3 = quest;
const questLogger = getQuestLogger({
quest,
location: QuestsExperimentLocations.QUEST_HOME_MOBILE
});
const [errorHints, setState3] = useState([]);
const [isActive, setState4] = useState(false);
return {
quest,
defibrillator: {
errorHints,
isActive,
start: Module19.useCallback(() => {
setState4(true);
manuallyStartConsoleQuest(quest3.id).then((result) => setState3(result.errorHints)).catch((error) => {
setState3([]);
questLogger.error("Failed to start console quest", error);
ToastActionCreators.open({
key: "START_DEFIBRILLATOR_ERROR",
content: intl.string(t.CKsXk3),
icon: Module9172
});
}).finally(() => setState4(false));
}, [quest, questLogger, setState4, setState3])
},
step,
stepActions,
showMicrophone: !(quest.userStatus?.completedAt != null) && !isQuestProgressing && r14 === TaskPlatformScreen.CONSOLE && !hasWatchVideoOnMobileTasks3,
handleTaskSelect: function handleTaskSelect(a0) {
const questContentCTA = a0 === QuestTaskPlatform.CONSOLE ? QuestContentCTA.SELECT_CONSOLE_PLATFORM : a0 === QuestTaskPlatform.DESKTOP ? QuestContentCTA.SELECT_DESKTOP_PLATFORM : QuestContentCTA.DESELECT_PLATFORM;
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA,
sourceQuestContent
});
}
c20939_4(a0);
}
};
};
QuestBottomSheetContent = function QuestBottomSheetContent(props) {
const { defibrillator, quest: quest4, handleTaskSelect: handleTaskSelect2 } = props;
let showMicrophone = props.showMicrophone;
if (showMicrophone === void 0) {
showMicrophone = false;
}
const { sourceQuestContent: sourceQuestContent2, step } = props;
const hasWatchVideoOnMobileTasks2 = useHasWatchVideoOnMobileTasks(quest4.config);
const memo4 = Module19.useMemo(() => hasWatchVideoOnMobileTasks2 ? <QuestBottomSheetProgressCardWatchTask quest={quest4} sourceQuestContent={sourceQuestContent2} /> : _QuestTaskUtils.isInGameQuest(quest4) ? <QuestBottomSheetProgressCardInGameTask quest={quest4} sourceQuestContent={sourceQuestContent2} /> : <QuestBottomSheetProgressCardPlayStreamTask quest={quest4} sourceQuestContent={sourceQuestContent2} />, [quest4, hasWatchVideoOnMobileTasks2, sourceQuestContent2]);
const r33 = [step === c9898_13.TASK_SELECT && <QuestBottomSheetTaskSelect onTaskSelect={handleTaskSelect2} />, step === c9898_13.CONSOLE_CONNECT && <QuestBottomSheetConsoleConnect quest={quest4} step={step} sourceQuestContent={sourceQuestContent2} />, ,];
let r42 = step === c9898_13.TASK_STATUS;
if (r42) {
const r44 = [memo4, ,];
if (showMicrophone) {
showMicrophone = !hasWatchVideoOnMobileTasks2;
}
if (showMicrophone) {
showMicrophone = <MicrophoneUnit quest={quest4} errorHints={defibrillator?.errorHints} />;
}
r44[1] = showMicrophone;
r42 = <View>{r44}</View>;
}
r33[2] = r42;
return <>{r33}</>;
};
MicrophoneUnit = function MicrophoneUnit(props) {
const { quest: quest5, errorHints } = props;
const styles = useStyles();
const message = useQuestHowToHelpArticle().message;
let r27 = errorHints?.length;
if (r27 == null) {
r27 = 0;
}
const r28 = r27 > 0;
const r47 = r28 && errorHints != null ? [...errorHints.map((errorHint) => errorHint.message), message] : [isSponsoredPlayQuest(quest5) ? intl.string(t.bUyEZZ) : intl.formatToPlainString(t.GXqvC1, {
gameTitle: quest5.config.messages.gameTitle
})];
return <View style={styles.microphoneUnit}>
<View style={styles.microphoneUnitHeader}>
<WarningIcon color={r28 ? "text-feedback-critical" : "text-feedback-warning"} />
<Text variant="text-md/medium" color="mobile-text-heading-primary">
{r28 ? intl.formatToPlainString(t["28Ql27"], {
gameTitle: quest5.config.messages.gameTitle
}) : intl.string(t.YstzGO)}
</Text>
</View>
{r47.map((item, index) => <Text key={index} variant="text-sm/normal">
{item}
</Text>)}
</View>;
};
c9898_13 = {
TASK_SELECT: "TASK_SELECT",
CONSOLE_CONNECT: "CONSOLE_CONNECT",
TASK_STATUS: "TASK_STATUS"
};
useStyles = createStyles({
contentContainer: {
display: "flex",
paddingHorizontal: Module712.space.PX_16,
gap: Module712.space.PX_24
},
microphoneUnit: {
display: "flex",
gap: Module712.space.PX_8,
marginHorizontal: -Module712.space.PX_16,
paddingHorizontal: Module712.space.PX_16,
marginTop: Module712.space.PX_16,
paddingTop: Module712.space.PX_16,
borderTopWidth: 1,
borderTopColor: Module712.colors.BORDER_SUBTLE
},
microphoneUnitHeader: {
display: "flex",
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_8
}
});
context = Module19.createContext({
isInQuestBottomSheet: false
});
export default function QuestBottomSheetConnected(props) {
const { questId, initialStep, sourceQuestContent: sourceQuestContent3, questContentPosition } = props;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuest(questId));
return stateFromStores != null ? <QuestContentImpressionTrackerNative overrideVisibility questOrQuests={stateFromStores} questContent={QuestContent.QUEST_BOTTOM_SHEET} questContentPosition={questContentPosition} sourceQuestContent={sourceQuestContent3}>
{() => <QuestBottomSheet quest={stateFromStores} initialStep={initialStep} sourceQuestContent={sourceQuestContent3} />}
</QuestContentImpressionTrackerNative> : null;
};
export { c9898_13 as QuestBottomSheetStep };
export { useEnrolledQuestContentProps };
export { QuestBottomSheetContent };
export { context as QuestBottomSheetContext };
@@ -0,0 +1,135 @@
// Metro module 14186 (f14187).
import { useMemo } from "react";
import { View } from "react-native";
import { PlatformTypes, UserSettingsSections } from "../../../../Constants";
import { jsxs, Fragment } from "react/jsx-runtime";
import Module712 from "../../../../_bundle/Module712";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { useConnectedAccounts } from "../../hooks/QuestHooks";
import { useTrackQuestContentClickedWithImpression } from "../../lib/analytics/AnalyticsHooks";
import { useQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { supportedConsoles } from "../../utils/QuestPlatformUtils";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import { openUserSettings } from "../../../user_settings/core/native/openUserSettings";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../QuestTypes";
import authorizeConnection_native from "../../../connections/authorizeConnection.native";
import { TableRowGroup } from "../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../../design/components/TableRow/native/TableRow.native";
import { PlaystationNeutralIcon } from "../../../../design/components/Icon/native/redesign/generated/PlaystationNeutralIcon";
import { intl, t } from "../../../../intl/index.native";
import { XboxNeutralIcon } from "../../../../design/components/Icon/native/redesign/generated/XboxNeutralIcon";
let ConsoleRow;
const NonInlineConsoleConnection = function NonInlineConsoleConnection(props) {
const { consoles, onConsoleSelect: onConsoleSelect2 } = props;
return <TableRowGroup hasIcons>
{consoles.map((console) => <ConsoleRow key={console.type} {...console} onPress={onConsoleSelect2} />)}
</TableRowGroup>;
};
ConsoleRow = function ConsoleRow(props) {
const { onPress: onPress2, ...rest } = props;
let c21017_1 = rest;
const type = rest.type;
if (PlatformTypes.PLAYSTATION === type) {
return <TableRow arrow icon={<PlaystationNeutralIcon />} label={intl.string(t.JafL6p)} subLabel={rest.account != null ? intl.string(t["u30/ut"]) : void 0} onPress={() => onPress2(c21017_1)} />;
}
if (PlatformTypes.XBOX === type) {
return <TableRow arrow icon={<XboxNeutralIcon />} label={intl.string(t.Nfvo72)} subLabel={rest.account != null ? intl.string(t["u30/ut"]) : void 0} onPress={() => onPress2(c21017_1)} />;
}
return null;
};
View;
jsxs;
Fragment;
Module712.unsafe_rawColors.PLATFORM_XBOX;
Module712.unsafe_rawColors.PLATFORM_PLAYSTATION;
createStyles({
platformButtonsContainer: {
display: "flex",
flexDirection: "row",
gap: Module712.space.PX_16,
justifyContent: "space-between"
},
platformButton: {
flex: 1,
display: "flex",
justifyContent: "center",
alignItems: "center"
}
});
export default function QuestBottomSheetConsoleConnect(props) {
let xboxAndPlaystationAccounts, trackQuestContentClickedWithImpression, questImpressionId;
const { quest, step, sourceQuestContent } = props;
xboxAndPlaystationAccounts = void 0;
trackQuestContentClickedWithImpression = void 0;
questImpressionId = void 0;
const openQuestBottomSheet2 = function openQuestBottomSheet() {
ActionSheetActionCreators.openLazy(import("./QuestBottomSheet"), "QuestBottomSheet", {
questId: quest.id,
initialStep: step,
sourceQuestContent
});
};
xboxAndPlaystationAccounts = useConnectedAccounts().xboxAndPlaystationAccounts;
trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
questImpressionId = useQuestImpressionId();
return <NonInlineConsoleConnection consoles={useMemo(() => supportedConsoles(quest).map((item) => {
return {
type: item,
account: xboxAndPlaystationAccounts.find((xboxAndPlaystationAccount) => xboxAndPlaystationAccount.type === item)
};
}), [quest, xboxAndPlaystationAccounts])} onConsoleSelect={function onConsoleSelect(event) {
if (event.account != null) {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_console_connect")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.VIEW_CONSOLE_CONNECTIONS,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.VIEW_CONSOLE_CONNECTIONS,
sourceQuestContent
});
}
ActionSheetActionCreators.hideActionSheet();
openUserSettings({
screen: UserSettingsSections.CONNECTIONS
});
return void 0;
}
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_console_connect")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.CONNECT_CONSOLE,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.CONNECT_CONSOLE,
sourceQuestContent
});
}
authorizeConnection_native({
platformType: event.type,
location: "quests",
onClose: openQuestBottomSheet2
});
}} />;
};
@@ -0,0 +1,316 @@
// Metro module 14146 (f14147).
import { useMemo, useCallback, useEffect } from "react";
import { View } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import UserStore from "../../../../stores/UserStore";
import QuestStore from "../../QuestStore";
import { ACTION_SHEET_MINIMUM_BOTTOM_PADDING } from "../../../action_sheet/native/ActionSheetConstants";
import Module712 from "../../../../_bundle/Module712";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { QuestContent, TaskPlatformScreen } from "../../QuestTypes";
import { useProgressState, QuestProgressState, useQuestTaskDetails, useIsQuestProgressing, useTaskPlatformScreen, useConnectedAccounts } from "../../hooks/QuestHooks";
import * as _QuestRewardUtils from "../../utils/QuestRewardUtils";
import { getDefaultReward } from "../../utils/QuestCopyUtils";
import { useFetchCollectiblesProduct } from "../../../collectibles/hooks/useFetchCollectiblesProduct";
import { useStateFromStoresObject, useStateFromStores } from "../../../../_bundle/Module589";
import { useToken } from "../../../../design/tokens/native/useToken";
import tinycolor from "../../../../_bundle/tinycolor";
import { handleRewardClaimThenView, getPrimaryCtaIcon } from "../QuestUtils.native";
import { useWatchTaskPressHandler, useMobileActivityPressHandler } from "./QuestBottomSheetHooks";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { getVideoQuestWatchCtaText } from "../../utils/MobileQuestVideoWatchCtaCopy";
import { supportedConsoles } from "../../utils/QuestPlatformUtils";
import { useHasWatchVideoOnMobileTasks, useMobileActivityQuest } from "../QuestHooks.native";
import { usePrimaryCtaCopy } from "../../hooks/QuestCopyHooks";
import { QuestBottomSheetStep } from "./QuestBottomSheet";
import { IconButton } from "../../../../design/components/Button/native/IconButton.native";
import { intl, t } from "../../../../intl/index.native";
import { ArrowLargeLeftIcon } from "../../../../design/components/Icon/native/redesign/generated/ArrowLargeLeftIcon";
import { useTrackQuestContentClickedWithImpression } from "../../lib/analytics/AnalyticsHooks";
import { useQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { RefreshIcon } from "../../../../design/components/Icon/native/redesign/generated/RefreshIcon";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../design/animation/reanimated/timing/timing";
import { LARGE_BUTTON_HEIGHT } from "../../../../design/components/Button/native/ButtonConstants.native";
let PX_16, useStyles, WatchTaskButton, NextButton, DefibButton, ClaimButton, __initData, __initData2, AnimatedFooter;
const useQuestRewardClaimHandler = function useQuestRewardClaimHandler(a0) {
let product, isFetching, isFetchingRewardCode, stateFromStores, stateFromStores2;
const { quest, hideActionSheet: hideActionSheet2 = true } = a0;
const hideActionSheet = hideActionSheet2;
let questContent = a0.questContent;
if (questContent === void 0) {
questContent = QuestContent.QUEST_BOTTOM_SHEET;
}
const QUEST_BOTTOM_SHEET = questContent;
const { onSuccess, sourceQuestContent } = a0;
product = void 0;
isFetching = void 0;
isFetchingRewardCode = void 0;
stateFromStores = void 0;
stateFromStores2 = void 0;
const progressState = useProgressState(quest);
const hasCollectiblesQuestReward = _QuestRewardUtils.hasCollectiblesQuestReward(quest.config);
const memo = useMemo(() => getDefaultReward(quest.config).skuId, [quest.config]);
const fetchCollectiblesProduct = useFetchCollectiblesProduct(progressState === QuestProgressState.COMPLETED ? hasCollectiblesQuestReward ? memo : null : null);
product = fetchCollectiblesProduct.product;
isFetching = fetchCollectiblesProduct.isFetching;
const stateFromStoresObject = useStateFromStoresObject([QuestStore], () => ({
isFetchingRewardCode: QuestStore.isFetchingRewardCode(quest.id),
isClaimingReward: QuestStore.isClaimingReward(quest.id)
}));
const isClaimingReward = stateFromStoresObject.isClaimingReward;
isFetchingRewardCode = stateFromStoresObject.isFetchingRewardCode;
stateFromStores = useStateFromStores([UserStore], () => {
const currentUser = UserStore.getCurrentUser();
return currentUser == null ? void 0 : currentUser.hasVerifiedEmailOrPhone();
});
stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.verified);
const memo2 = useMemo(() => {
let r0 = isFetching;
if (!isFetching) {
r0 = isFetchingRewardCode;
}
return r0;
}, [isFetching, isFetchingRewardCode]);
const token = useToken(Module712.colors.BACKGROUND_BASE_LOWER);
const token2 = useToken(Module712.colors.BACKGROUND_BASE_LOW);
const token3 = useToken(Module712.colors.BACKGROUND_BASE_LOWEST);
if (product != null) {
let buttonColors = product.styles?.buttonColors;
if (buttonColors == null) {
buttonColors = [];
}
let confettiColors = product.styles?.confettiColors;
if (confettiColors == null) {
confettiColors = [];
}
product.styles = {
buttonColors,
confettiColors,
backgroundColors: [tinycolor(token2), tinycolor(token), tinycolor(token3)]
};
}
return {
isLoading: memo2,
isClaiming: isClaimingReward,
claim: useCallback(() => handleRewardClaimThenView({
quest,
product,
hideActionSheet,
questContent: QUEST_BOTTOM_SHEET,
currentUserHasVerifiedEmailOrPhone: stateFromStores,
currentUserHasVerifiedEmail: stateFromStores2,
onSuccess,
sourceQuestContent
}), [quest, product, stateFromStores, stateFromStores2, hideActionSheet, QUEST_BOTTOM_SHEET, onSuccess, sourceQuestContent])
};
};
WatchTaskButton = function WatchTaskButton(props) {
const { questId: questId3, sourceQuestContent: sourceQuestContent4, taskDetails } = props;
return <Button grow size="lg" onPress={useWatchTaskPressHandler({
questId: questId3,
sourceQuestContent: sourceQuestContent4
})} text={getVideoQuestWatchCtaText(taskDetails)} />;
};
NextButton = function NextButton(props) {
return <Button grow size="lg" onPress={props.onPress} disabled={props.disabled} text={intl.string(t.a9OfTN)} />;
};
DefibButton = function DefibButton(props) {
const { questId, loading, disabled, onPress: onPress2, sourceQuestContent: sourceQuestContent2 } = props;
const trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
const questImpressionId = useQuestImpressionId();
return <Button grow size="lg" variant="secondary" loading={loading} disabled={disabled} icon={<RefreshIcon />} iconPosition="end" onPress={function onPress(event) {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_footer")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: questId,
questContentCTA: QuestContentCTA.DEFIBRILLATOR,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent: sourceQuestContent2,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.DEFIBRILLATOR,
sourceQuestContent: sourceQuestContent2
});
}
if (onPress2 != null) {
onPress2(event);
}
}} text={intl.string(t.nPThNb)} />;
};
ClaimButton = function ClaimButton(props) {
const { questId: questId2, disabled, loading, onPress: onPress3, sourceQuestContent: sourceQuestContent3 } = props;
const trackQuestContentClickedWithImpression2 = useTrackQuestContentClickedWithImpression();
const questImpressionId2 = useQuestImpressionId();
return <Button grow size="lg" disabled={disabled} loading={loading} onPress={function onPress() {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_footer")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: questId2,
questContentCTA: QuestContentCTA.CLAIM_REWARD,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent: sourceQuestContent3,
impressionId: questImpressionId2
});
} else {
trackQuestContentClickedWithImpression2({
questId: questId2,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.CLAIM_REWARD,
sourceQuestContent: sourceQuestContent3
});
}
onPress3();
}} text={intl.string(t.cfY4PE)} />;
};
AnimatedFooter = function AnimatedFooter(props) {
const { onLayout, ctaButton, backButton, style } = props;
let withSafeArea = props.withSafeArea;
if (withSafeArea === void 0) {
withSafeArea = true;
}
let sharedValue;
sharedValue = void 0;
const r25 = backButton != null && backButton !== false;
let c20949_0 = r25;
const bottom = useSafeAreaInsets_native().bottom;
const styles = useStyles();
const width = useWindowDimensions_native().width;
const stateFromStores3 = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
sharedValue = useSharedValue(r25 ? 1 : 0);
useEffect(() => {
sharedValue.set(withTiming(c20949_0 ? 1 : 0, {
duration: stateFromStores3 ? 0 : 200
}));
}, [r25, stateFromStores3, sharedValue]);
const y = () => ({
opacity: sharedValue.get(),
position: "absolute",
top: 0,
left: 0,
transform: [{
translateX: PX_16
}]
});
y.__closure = {
animation: sharedValue,
H_PADDING_PX: PX_16
};
y.__workletHash = 7564903336036;
y.__initData = __initData;
const animatedStyle = useAnimatedStyle(y);
const B = () => ({
width: _ReanimatedRexport.interpolate(sharedValue.get(), [0, 1], [width - 2 * PX_16, width - 2.5 * PX_16 - LARGE_BUTTON_HEIGHT]),
alignSelf: "flex-end"
});
B.__closure = {
interpolate: _ReanimatedRexport.interpolate,
animation: sharedValue,
windowWidth: width,
H_PADDING_PX: PX_16,
ICON_SIZE_PX: LARGE_BUTTON_HEIGHT
};
B.__workletHash = 9095621288509;
B.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(B);
const paddingBottom = Math.max(bottom, ACTION_SHEET_MINIMUM_BOTTOM_PADDING);
const style2 = [styles.container, , ,];
if (withSafeArea) {
withSafeArea = {
paddingBottom
};
}
style2[1] = withSafeArea;
style2[2] = style;
return <View style={style2} onLayout={onLayout}>
<ReanimatedRexport.View style={animatedStyle}>{backButton}</ReanimatedRexport.View>
<ReanimatedRexport.View style={animatedStyle2}>{ctaButton}</ReanimatedRexport.View>
</View>;
};
PX_16 = Module712.space.PX_16;
useStyles = createStyles({
container: {
display: "flex",
flexGrow: 1,
flexShrink: 1,
paddingHorizontal: Module712.space.PX_16
}
});
__initData = {
code: "function QuestBottomSheetFooterTsx1(){const{animation,H_PADDING_PX}=this.__closure;return{opacity:animation.get(),position:'absolute',top:0,left:0,transform:[{translateX:H_PADDING_PX}]};}"
};
__initData2 = {
code: "function QuestBottomSheetFooterTsx2(){const{interpolate,animation,windowWidth,H_PADDING_PX,ICON_SIZE_PX}=this.__closure;return{width:interpolate(animation.get(),[0,1],[windowWidth-H_PADDING_PX*2,windowWidth-H_PADDING_PX*2.5-ICON_SIZE_PX]),alignSelf:'flex-end'};}"
};
export default function QuestBottomSheetFooter(props) {
let r101, ctaButton;
const { quest: quest2, onLayout, step, isDefibrilating = false, onConnectConsoleNext, onBack, onDefib, style, withSafeArea, sourceQuestContent: sourceQuestContent4 } = props;
const questRewardClaimHandler = useQuestRewardClaimHandler({
quest: quest2,
sourceQuestContent: sourceQuestContent4
});
const questTaskDetails = useQuestTaskDetails(quest2);
const isQuestProgressing = useIsQuestProgressing(quest2);
const [r28] = useTaskPlatformScreen(quest2, questTaskDetails);
const xboxAndPlaystationAccounts = useConnectedAccounts().xboxAndPlaystationAccounts;
const memo = useMemo(() => supportedConsoles(quest2).filter((c30707_0) => xboxAndPlaystationAccounts.find((xboxAndPlaystationAccount) => xboxAndPlaystationAccount.type === c30707_0) != null), [quest2, xboxAndPlaystationAccounts]);
const hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest2.config);
const mobileActivityQuest = useMobileActivityQuest(quest2);
const { isMobileActivityQuest, launchMobileActivity } = mobileActivityQuest;
const primaryCtaCopy = usePrimaryCtaCopy({
quest: quest2,
application: mobileActivityQuest.questApplication
});
const mobileActivityPressHandler = useMobileActivityPressHandler({
questId: quest2.id,
sourceQuestContent: sourceQuestContent4,
launchMobileActivity
});
const r4 = quest2.userStatus?.completedAt != null;
const disabled = quest2.userStatus?.claimedAt != null;
const TASK_SELECT = QuestBottomSheetStep.TASK_SELECT;
let r82 = null;
if (step !== TASK_SELECT) {
if (QuestBottomSheetStep.CONSOLE_CONNECT === step) {
ctaButton = <NextButton onPress={onConnectConsoleNext} disabled={memo.length === 0} />;
} else {
const TASK_STATUS = QuestBottomSheetStep.TASK_STATUS;
ctaButton = null;
if (TASK_STATUS === step) {
L24: {
if (r4) {
r101 = <ClaimButton questId={quest2.id} onPress={questRewardClaimHandler.claim} disabled={disabled} loading={questRewardClaimHandler.isLoading || questRewardClaimHandler.isClaiming} sourceQuestContent={sourceQuestContent4} />;
} else if (hasWatchVideoOnMobileTasks) {
r101 = <WatchTaskButton questId={quest2.id} taskDetails={questTaskDetails} sourceQuestContent={sourceQuestContent4} />;
} else if (isMobileActivityQuest) {
r101 = <Button grow size="lg" onPress={mobileActivityPressHandler} text={primaryCtaCopy} icon={getPrimaryCtaIcon(quest2)} />;
} else {
if (r28 === TaskPlatformScreen.CONSOLE && !isQuestProgressing) {
r101 = <DefibButton questId={quest2.id} loading={isDefibrilating} disabled={isDefibrilating} onPress={onDefib} sourceQuestContent={sourceQuestContent4} />;
break L24;
}
r101 = <ClaimButton questId={quest2.id} onPress={questRewardClaimHandler.claim} disabled sourceQuestContent={sourceQuestContent4} />;
}
}
ctaButton = r101;
}
}
r82 = <AnimatedFooter onLayout={onLayout} ctaButton={ctaButton} backButton={onBack != null && <IconButton accessibilityLabel={intl.string(t["13/7kX"])} variant="secondary" icon={<ArrowLargeLeftIcon />} onPress={onBack} size="lg" />} style={style} withSafeArea={withSafeArea} />;
}
return r82;
};
export { useQuestRewardClaimHandler };
@@ -0,0 +1,149 @@
// Metro module 14145 (f14146).
import { useMemo, useRef, useEffect } from "react";
import { View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useQuestTaskDetails, useTaskPlatformScreen } from "../../hooks/QuestHooks";
import * as _QuestTaskUtils from "../../utils/QuestTaskUtils";
import { hasStreamOnDesktopTask, getDefaultInGameTask } from "../../utils/QuestTaskUtils";
import { useHasWatchVideoOnMobileTasks } from "../QuestHooks.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { getDefaultRewardNameWithArticle } from "../../utils/QuestRewardUtils";
import * as _QuestUtils from "../../utils/QuestUtils";
import { intl, t } from "../../../../intl/index.native";
import { QuestBottomSheetStep } from "./QuestBottomSheet";
import { TaskPlatformScreen } from "../../QuestTypes";
import { useActionSheetPressHandler } from "../QuestDock/QuestDockHooks";
import { useIsScreenReaderEnabled } from "../../../a11y/native/useIsScreenReaderEnabled.native";
import { setAccessibilityFocus } from "../../../a11y/native/setAccessibilityFocus.android";
import { Text } from "../../../../design/components/Text/native/Text";
import { PressableOpacity } from "../../../../design/void/Pressables/native/Pressables";
import { MoreHorizontalIcon } from "../../../../design/components/Icon/native/redesign/generated/MoreHorizontalIcon";
const useStyles = createStyles({
container: {
display: "flex",
gap: 6,
paddingHorizontal: Module712.space.PX_16,
paddingTop: Module712.space.PX_8
},
containerWithActionSheet: {
alignItems: "center",
flexDirection: "row",
paddingHorizontal: Module712.space.PX_8
},
title: {
textAlign: "center"
},
titleWithActionSheet: {
textAlign: "left",
flex: 1
},
actionSheetButton: {
flexGrow: 0,
flexShrink: 0
}
});
export default function QuestBottomSheetHeader(props) {
const { quest: quest2, step: step2 } = props;
let withActionSheet = props.withActionSheet;
if (withActionSheet === void 0) {
withActionSheet = false;
}
let isScreenReaderEnabled, ref;
let hasWatchVideoOnMobileTasks, defaultRewardNameWithArticle, isSponsoredPlayQuest;
props.location;
isScreenReaderEnabled = void 0;
ref = void 0;
const styles = useStyles();
const actionSheetPressHandler = useActionSheetPressHandler(quest2);
const quest = quest2;
const step = step2;
hasWatchVideoOnMobileTasks = void 0;
defaultRewardNameWithArticle = void 0;
isSponsoredPlayQuest = void 0;
const r32 = quest.userStatus?.completedAt != null;
let c20945_2 = r32;
const gameTitle = quest.config.messages.gameTitle;
const questTaskDetails = useQuestTaskDetails(quest);
const hasWatchVideoTasks = _QuestTaskUtils.hasWatchVideoTasks(quest);
const isInGameQuest = _QuestTaskUtils.isInGameQuest(quest);
const [r23] = useTaskPlatformScreen(quest, questTaskDetails);
let c20945_6 = r23;
const targetMinutes = questTaskDetails.targetMinutes;
const memo = useMemo(() => hasStreamOnDesktopTask({
quest
}), [quest]);
hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest.config);
defaultRewardNameWithArticle = getDefaultRewardNameWithArticle(quest.config, useStateFromStores([UserStore], () => UserStore.getCurrentUser()));
isSponsoredPlayQuest = _QuestUtils.isSponsoredPlayQuest(quest);
const memo2 = useMemo(() => {
let r56;
if (c20945_2) {
return intl.string(t["ij5E/5"]);
}
if (hasWatchVideoTasks) {
return hasWatchVideoOnMobileTasks ? intl.formatToPlainString(t.ttFsLj, {
reward: defaultRewardNameWithArticle
}) : intl.formatToPlainString(t.IpoqqA, {
questReward: defaultRewardNameWithArticle
});
}
if (isInGameQuest) {
const defaultInGameTask = getDefaultInGameTask(quest.config);
if (defaultInGameTask != null) {
return defaultInGameTask.messages.taskDescription;
}
}
L17: {
if (step === QuestBottomSheetStep.TASK_SELECT) {
r56 = intl.string(t.drVw4T);
} else if (step === QuestBottomSheetStep.CONSOLE_CONNECT) {
r56 = intl.string(t.svdwbA);
} else if (isSponsoredPlayQuest) {
r56 = intl.formatToPlainString(t["2GJLK2"], {
targetMinutes,
rewardNameWithArticle: defaultRewardNameWithArticle
});
} else {
if (c20945_6 === TaskPlatformScreen.DESKTOP && memo) {
r56 = intl.formatToPlainString(t["hkJ+Gs"], {
gameTitle,
questReward: defaultRewardNameWithArticle,
streamingDurationRequirement: targetMinutes
});
break L17;
}
r56 = intl.formatToPlainString(t.NIimTt, {
gameTitle,
rewardNameWithArticle: defaultRewardNameWithArticle,
targetMinutes
});
}
}
return r56;
}, [r32, hasWatchVideoTasks, step, r23, memo, gameTitle, defaultRewardNameWithArticle, targetMinutes, hasWatchVideoOnMobileTasks, isInGameQuest, isSponsoredPlayQuest, quest.config]);
isScreenReaderEnabled = useIsScreenReaderEnabled();
ref = useRef(null);
useEffect(() => {
let r1 = isScreenReaderEnabled;
if (isScreenReaderEnabled) {
r1 = ref.current != null;
}
if (r1) {
setAccessibilityFocus({
ref,
delay: 100
});
}
}, [isScreenReaderEnabled]);
const style = [styles.container, withActionSheet ? styles.containerWithActionSheet : withActionSheet];
const r102 = [memo2 != null && <Text ref={ref} variant="redesign/heading-18/bold" color="mobile-text-heading-primary" accessibilityRole="header" style={[styles.title, withActionSheet ? styles.titleWithActionSheet : withActionSheet]}>{memo2}</Text>, ,];
if (withActionSheet) {
withActionSheet = <PressableOpacity accessibilityRole="button" accessibilityLabel={intl.string(t["UKOtz+"])} onPress={actionSheetPressHandler} style={styles.actionSheetButton}>
<MoreHorizontalIcon color={Module712.colors.INTERACTIVE_TEXT_DEFAULT} />
</PressableOpacity>;
}
r102[1] = withActionSheet;
return <View style={style}>{r102}</View>;
};
@@ -0,0 +1,113 @@
// Metro module 14147 (f14148).
import { useContext, useCallback } from "react";
import "../../QuestConstants";
import { QuestDockExternalCoordinationContext } from "../QuestDock/QuestDockExternalCoordinationContext";
import { QuestBottomSheetContext } from "./QuestBottomSheet";
import { useQuestImpression } from "../../lib/analytics/ContentImpressionTrackerHooks";
import openVideoQuestModal from "../VideoQuestModal/openVideoQuestModal";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../QuestTypes";
import { trackQuestContentClicked } from "../../lib/analytics/AnalyticsActions";
function $mk92907($env) {
return () => {
const r2 = $env;
const r3 = r2[1];
const r1 = $env.$parent;
if (r3) {
(0, r1[1])(r1[2][5]).hideActionSheet("QuestBottomSheet");
} else {
(0, r2[0])(r1[5].COLLAPSED);
}
};
}
let env9901 = {};
export function useWatchTaskPressHandler({ questId, sourceQuestContent }) {
let env20952;
const r6 = env20952 = {
$parent: env9901
};
env20952[0] = void 0;
env20952[1] = void 0;
const setRestingQuestDockMode = useContext(QuestDockExternalCoordinationContext).setRestingQuestDockMode;
env20952[0] = setRestingQuestDockMode;
const isInQuestBottomSheet = useContext(QuestBottomSheetContext).isInQuestBottomSheet;
env20952[1] = isInQuestBottomSheet;
const callback = useCallback($mk92907(r6), [isInQuestBottomSheet, setRestingQuestDockMode]);
const questImpression = useQuestImpression();
return useCallback(() => {
callback();
openVideoQuestModal({
questId,
questContentPosition: questImpression == null ? void 0 : questImpression.getQuestContentPosition(),
sourceQuestContent
});
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_watch_task")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: questId,
questContentCTA: QuestContentCTA.WATCH_VIDEO,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent,
impressionId: questImpression == null ? void 0 : questImpression.getId(),
questContentPosition: questImpression == null ? void 0 : questImpression.getQuestContentPosition()
});
} else {
trackQuestContentClicked({
questId,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.WATCH_VIDEO,
questContentPosition: questImpression == null ? void 0 : questImpression.getQuestContentPosition(),
impressionId: questImpression == null ? void 0 : questImpression.getId(),
sourceQuestContent
});
}
}, [questId, callback, questImpression, sourceQuestContent]);
}
export function useMobileActivityPressHandler({ questId: questId2, sourceQuestContent: sourceQuestContent2, launchMobileActivity }) {
let env20954;
const r8 = env20954 = {
$parent: env9901
};
env20954[0] = void 0;
env20954[1] = void 0;
const setRestingQuestDockMode = useContext(QuestDockExternalCoordinationContext).setRestingQuestDockMode;
env20954[0] = setRestingQuestDockMode;
const isInQuestBottomSheet = useContext(QuestBottomSheetContext).isInQuestBottomSheet;
env20954[1] = isInQuestBottomSheet;
const callback2 = useCallback($mk92907(r8), [isInQuestBottomSheet, setRestingQuestDockMode]);
const questImpression2 = useQuestImpression();
return useCallback(async () => {
let c27645_0;
c27645_0 = void 0;
callback2();
await launchMobileActivity();
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_bottom_sheet_mobile_activity")) {
const impressionId = questImpression2 == null ? void 0 : questImpression2.getId();
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: questId2,
questContentCTA: QuestContentCTA.LAUNCH_MOBILE_ACTIVITY,
surfaceId: QuestContent.QUEST_BOTTOM_SHEET,
sourceQuestContent: sourceQuestContent2,
impressionId,
questContentPosition: questImpression2 == null ? void 0 : questImpression2.getQuestContentPosition()
});
} else {
const questContentPosition = questImpression2 == null ? void 0 : questImpression2.getQuestContentPosition();
trackQuestContentClicked({
questId: questId2,
questContent: QuestContent.QUEST_BOTTOM_SHEET,
questContentCTA: QuestContentCTA.LAUNCH_MOBILE_ACTIVITY,
questContentPosition,
impressionId: questImpression2 == null ? void 0 : questImpression2.getId(),
sourceQuestContent: sourceQuestContent2
});
}
}, [questId2, callback2, launchMobileActivity, questImpression2, sourceQuestContent2]);
}
@@ -0,0 +1,203 @@
// Metro module 14183 (f14184).
import { useMemo } from "react";
import { StyleSheet, View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useQuestTaskDetails, useIsQuestProgressing, useQuestFormattedDate, useThirdPartyTaskDetails } from "../../hooks/QuestHooks";
import { supportedTaskPlatforms } from "../../utils/QuestPlatformUtils";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { getDefaultRewardName } from "../../utils/QuestRewardUtils";
import * as _QuestUtils from "../../utils/QuestUtils";
import { intl, t } from "../../../../intl/index.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { FirstPartyQuestTaskTypes, FirstPartyQuestTaskTypesSets } from "../../../../_bundle/Module5040";
import { Card } from "../../../../design/components/Card/native/Card.native";
import QuestProgressIndicator from "../QuestProgressIndicator";
import { getQuestAsset, QuestAssetType } from "../../lib/AssetUtils";
import { useWatchTaskPressHandler } from "./QuestBottomSheetHooks";
import { isHeroVideoSupported } from "../QuestUtils.native";
import { PressableOpacity } from "../../../../design/void/Pressables/native/Pressables";
import { VideoComponent } from "../../../../components_native/common/Video";
import Module4611 from "../../../../_bundle/Module4611";
import FastImage from "../../../../components_native/common/FastImage";
import QuestDockBlurredContentBackground from "../QuestDock/QuestDockBlurredContentBackground";
import { PlayIcon } from "../../../../design/components/Icon/native/redesign/generated/PlayIcon";
const useStyles = createStyles({
card: {
padding: 0
},
cardWatchTask: {
justifyContent: "flex-end",
height: 210
},
content: {
padding: Module712.space.PX_16
},
contentWatchTask: {
alignItems: "flex-end"
},
footer: {
padding: 12,
display: "flex",
flexDirection: "row",
justifyContent: "center",
alignItems: "center",
backgroundColor: Module712.colors.BACKGROUND_MOD_MUTED,
borderBottomLeftRadius: Module712.modules.mobile.CARD_DEFAULT_RADIUS,
borderBottomRightRadius: Module712.modules.mobile.CARD_DEFAULT_RADIUS,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED
},
instructionsText: {
marginTop: Module712.space.PX_12,
textAlign: "center"
},
videoPreviewWrapper: {
...StyleSheet.absoluteFillObject,
borderRadius: Module712.modules.mobile.CARD_DEFAULT_RADIUS,
overflow: "hidden"
},
videoPreview: {
...StyleSheet.absoluteFillObject
},
playVideoIconWrapper: {
alignItems: "center",
justifyContent: "center",
borderRadius: Module712.radii.round,
position: "absolute",
left: "50%",
overflow: "hidden",
top: "50%",
width: 60,
height: 60,
transform: [{
translateX: -30
}, {
translateY: -30
}]
}
});
export function QuestBottomSheetProgressCardPlayStreamTask(props) {
let isSponsoredPlayQuest;
const quest2 = props.quest;
isSponsoredPlayQuest = void 0;
const styles = useStyles();
const questTaskDetails = useQuestTaskDetails(quest2);
let r7 = useIsQuestProgressing(quest2);
const isQuestProgressing = r7;
let r15 = quest2.userStatus?.completedAt != null;
let c21012_2 = r15;
const r31 = quest2.userStatus?.claimedAt != null;
let c21012_3 = r31;
const r12 = supportedTaskPlatforms(quest2);
let c21012_4 = r12;
const questFormattedDate = useQuestFormattedDate(quest2.config.rewardsConfig.rewardsExpireAt);
const gameTitle = quest2.config.messages.gameTitle;
const defaultRewardName = getDefaultRewardName(quest2.config, useStateFromStores([UserStore], () => UserStore.getCurrentUser()));
isSponsoredPlayQuest = _QuestUtils.isSponsoredPlayQuest(quest2);
const memo = useMemo(() => {
if (c21012_2 && !c21012_3) {
return intl.format(t.e3OlfB, {
rewardHook: () => <Text variant="text-sm/semibold" color="text-strong">{defaultRewardName}</Text>,
date: questFormattedDate
});
}
if (isQuestProgressing) {
return intl.format(t.aFaRso, {
minutesLeft: Math.ceil((questTaskDetails.targetSeconds - questTaskDetails.progressSeconds) / 60),
minutesHook: (a0) => <Text variant="text-sm/semibold" color="text-strong">
{a0}
</Text>
});
}
return isSponsoredPlayQuest ? intl.string(t["04ateG"]) : c21012_4.length > 1 ? intl.formatToPlainString(t.E2R8VX, {
gameName: gameTitle
}) : questTaskDetails.taskType === FirstPartyQuestTaskTypes.STREAM_ON_DESKTOP ? intl.formatToPlainString(t.boMftC, {
gameName: gameTitle
}) : questTaskDetails.taskType === FirstPartyQuestTaskTypes.PLAY_ON_DESKTOP ? intl.formatToPlainString(t["9Peldf"], {
gameName: gameTitle
}) : FirstPartyQuestTaskTypesSets.CONSOLE.has(questTaskDetails.taskType) ? intl.formatToPlainString(t["+8JB6Y"], {
gameTitle
}) : null;
}, [questTaskDetails, r15, r31, gameTitle, defaultRewardName, isQuestProgressing, r12, questFormattedDate, isSponsoredPlayQuest]);
if (!r15) {
r15 = isQuestProgressing;
}
const r86 = [<View style={styles.content}>
<QuestProgressIndicator quest={quest2} size="lg" progress={questTaskDetails.percentComplete} loading={!r15} hasConfetti />
{memo != null && <Text style={styles.instructionsText} variant="text-sm/semibold" color="text-subtle">{memo}</Text>}
</View>, ,];
if (isQuestProgressing) {
r7 = <View style={styles.footer}>
<Text color="text-feedback-positive" variant="text-sm/semibold">
{intl.format(t.lIFg6I, {
gameName: quest2.config.messages.gameTitle
})}
</Text>
</View>;
}
r86[1] = r7;
return <Card style={styles.card} border="subtle">{r86}</Card>;
}
export function QuestBottomSheetProgressCardWatchTask(props) {
const { quest, sourceQuestContent } = props;
const styles = useStyles();
const questTaskDetails2 = useQuestTaskDetails(quest);
const memo = useMemo(() => getQuestAsset(quest, QuestAssetType.QUEST_BAR_HERO_VIDEO), [quest]);
const memo3 = useMemo(() => getQuestAsset(quest, QuestAssetType.VIDEO_PLAYER_THUMBNAIL, void 0, true), [quest]);
const memo2 = useMemo(() => getQuestAsset(quest, QuestAssetType.QUEST_BAR_HERO_IMAGE), [quest]);
const watchTaskPressHandler = useWatchTaskPressHandler({
questId: quest.id,
sourceQuestContent
});
const r11 = memo != null && isHeroVideoSupported(memo);
return <PressableOpacity onPress={watchTaskPressHandler} accessibilityRole="button" accessibilityLabel={intl.string(quest.userStatus?.completedAt != null ? t.YsCuyF : t["74KqrR"])}>
<Card style={[styles.card, styles.cardWatchTask]} border="subtle">
{r11 && <View style={styles.videoPreviewWrapper}>
<VideoComponent style={styles.videoPreview} poster={memo3?.url} posterResizeMode="cover" source={{
uri: memo.url
}} resizeMode="cover" muted disableFocus preventsDisplaySleepDuringVideoPlayback={false} />
<Module4611 start={{
x: 0.5,
y: 0.5
}} end={{
x: 1,
y: 1
}} style={StyleSheet.absoluteFill} colors={["rgba(0, 0, 0, 0)", "rgba(0, 0, 0, 1)"]} />
</View>}
{(r11 ? !r11 : memo2 != null) && <View style={styles.videoPreviewWrapper}>
<FastImage style={styles.videoPreview} source={{
uri: memo2.url
}} resizeMode="cover" />
<Module4611 start={{
x: 0.5,
y: 0.5
}} end={{
x: 1,
y: 1
}} style={StyleSheet.absoluteFill} colors={["rgba(0, 0, 0, 0)", "rgba(0, 0, 0, 1)"]} />
</View>}
<View style={styles.playVideoIconWrapper}>
<QuestDockBlurredContentBackground blurTheme="light" />
<PlayIcon color={Module712.colors.WHITE} />
</View>
<View style={[styles.content, styles.contentWatchTask]}>
<QuestProgressIndicator quest={quest} size="x-sm" progress={questTaskDetails2.percentComplete} hasConfetti />
</View>
</Card>
</PressableOpacity>;
}
export function QuestBottomSheetProgressCardInGameTask(props) {
const quest2 = props.quest;
const styles = useStyles();
let progress = useThirdPartyTaskDetails(quest2)?.percentComplete;
if (progress == null) {
progress = 0;
}
return <Card style={styles.card} border="subtle">
<View style={styles.content}>
<QuestProgressIndicator quest={quest2} size="lg" progress={progress} hasConfetti />
</View>
</Card>;
}
@@ -0,0 +1,14 @@
// Metro module 14185 (f14186).
import { QuestTaskPlatform } from "../../QuestConstants";
import { TableRowGroup } from "../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../../design/components/TableRow/native/TableRow.native";
import { ScreenIcon } from "../../../../design/components/Icon/native/redesign/generated/ScreenIcon";
import { intl, t } from "../../../../intl/index.native";
import { GameControllerIcon } from "../../../../design/components/Icon/native/redesign/generated/GameControllerIcon";
export default function QuestBottomSheetTaskSelect(props) {
const onTaskSelect = props.onTaskSelect;
return <TableRowGroup hasIcons>
<TableRow arrow icon={<ScreenIcon />} label={intl.string(t["QXc01+"])} onPress={() => onTaskSelect == null ? void 0 : onTaskSelect(QuestTaskPlatform.DESKTOP)} />
<TableRow arrow icon={<GameControllerIcon />} label={intl.string(t["8lAfuB"])} onPress={() => onTaskSelect == null ? void 0 : onTaskSelect(QuestTaskPlatform.CONSOLE)} />
</TableRowGroup>;
};
+707
View File
@@ -0,0 +1,707 @@
// Metro module 14117 (f14118).
import * as Module19 from "react";
import { useMemo, useCallback, useEffect } from "react";
import { Image as Image2, View, StyleSheet } from "react-native";
import UserStore from "../../../stores/UserStore";
import QuestStore from "../QuestStore";
import { QuestsExperimentLocations } from "../QuestConstants";
import { NOOP } from "../../../_bundle/Module505";
import { Fragment } from "react/jsx-runtime";
import Module712 from "../../../_bundle/Module712";
import { experimental_createToken, createStyles, createStyleProperties } from "../../../design/components/Styles/native/createStyles";
import * as _Module4004 from "../../../_bundle/Module4004";
import { hexOpacityToRgba } from "../../../utils/ColorUtils";
import { QuestContent } from "../QuestTypes";
import { getQuestLogger } from "../lib/getQuestLogger";
import { useTrackQuestContentClickedWithImpression } from "../lib/analytics/AnalyticsHooks";
import { useQuestTaskDetails, useQuestCompletionDetails, useQuestFormattedDate, useShouldShowBonusOrbsUX } from "../hooks/QuestHooks";
import useWindowDimensions_native from "../../screen/useWindowDimensions.native";
import { getQuestAsset, QuestAssetType, getScaledFirstFrameImageUrl, getScaledImageUrl } from "../lib/AssetUtils";
import { useQuestGameLogotypeAssetUrl, useHasWatchVideoOnMobileTasks, useMobileActivityQuest } from "./QuestHooks.native";
import { useRecyclingState } from "../../../_bundle/noop_6676";
import MonitoringAgent from "../../monitoring/MonitoringAgent";
import { MetricEvents } from "../../../_bundle/Module5872";
import { getQuestContentName, QuestContentCTA } from "../lib/analytics/AnalyticsTypes";
import { useStateFromStores, useStateFromStoresObject } from "../../../_bundle/Module589";
import * as _QuestRewardUtils from "../utils/QuestRewardUtils";
import { getDefaultRewardNameWithArticle, hasCollectiblesQuestReward, getVirtualCurrencyRewardOrbQuantity, getQuestOrbRewardQuantityForUser, getDefaultRewardName } from "../utils/QuestRewardUtils";
import * as _QuestTaskUtils from "../utils/QuestTaskUtils";
import * as _QuestDataUtils from "../utils/QuestDataUtils";
import { getIsQuestExpiredButWithinThirtyDayLookback } from "../utils/QuestDataUtils";
import { getDefaultReward, getCtaLink, getExternalCtaLabel } from "../utils/QuestCopyUtils";
import useTheme from "../../../hooks/useTheme";
import { useFetchCollectiblesProduct } from "../../collectibles/hooks/useFetchCollectiblesProduct";
import { useToken } from "../../../design/tokens/native/useToken";
import { useGetQuestImpressionId } from "../lib/analytics/ContentImpressionTrackerHooks";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../_bundle/Module6013";
import { openGameLinkDirectly } from "../utils/QuestPlatformUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { usePrimaryCtaCopy, useQuestDescription } from "../hooks/QuestCopyHooks";
import tinycolor from "../../../_bundle/tinycolor";
import { intl, t } from "../../../intl/index.native";
import { viewReward, handleRewardClaimThenView, getPrimaryCtaIcon, dismissOverlayScreens } from "./QuestUtils.native";
import { getVideoQuestWatchCtaText, getVideoQuestWatchCtaAccessibilityLabel } from "../utils/MobileQuestVideoWatchCtaCopy";
import openVideoQuestModal from "./VideoQuestModal/openVideoQuestModal";
import { enrollInQuest } from "../QuestActionCreators";
import { useQuestOrbMultiplierEligibility } from "../hooks/QuestOrbMultiplierHooks";
import { QuestOrbMultiplierEligibilityType } from "../utils/QuestOrbMultiplierUtils";
import { useFontScale } from "../../screen/native/useFontScale";
import { useScaledTextLineHeight } from "../../screen/native/useScaledTextLineHeight.android";
import { GameProfileSources } from "../../game_profile/GameProfileAnalyticUtils";
import { isFabric } from "../../../utils/native/FabricUtils";
import { isAndroid } from "../../../utils/PlatformUtils";
import { OrbsIcon } from "../../../design/components/Icon/native/redesign/generated/OrbsIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { VideoQuestModalSteps } from "./VideoQuestModal/VideoQuestModal";
import { Card } from "../../../design/components/Card/native/Card.native";
import PremiumRewardGradient from "./PremiumRewardGradient";
import FastImage from "../../../components_native/common/FastImage";
import Module4611 from "../../../_bundle/Module4611";
import { VerticalGradient } from "../../../ConstantsIOS";
import QuestGameLogotype from "./QuestGameLogotype";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import Module8466 from "../../../_bundle/Module8466";
import QuestProgressIndicator from "./QuestProgressIndicator";
import QuestRewardTile from "./QuestRewardTile";
import { QuestOrbMultiplierPerkPill } from "./QuestOrbMultiplierPerkPill";
import { Button } from "../../../design/components/Button/native/Button.native";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import Module9972 from "../../../_bundle/Module9972";
import QuestContextMenu from "./QuestContextMenu";
let PX_16, useStyles, styleProperties;
const BACKGROUND_SURFACE_HIGH = Module712.colors.BACKGROUND_SURFACE_HIGH;
const BORDER_SUBTLE = Module712.colors.BORDER_SUBTLE;
const gradientStart = experimental_createToken(({ theme }) => hexOpacityToRgba(Module712.internal.resolveSemanticColor(theme, _Module4004.isThemeDark(theme) ? Module712.colors.BACKGROUND_SURFACE_HIGH : Module712.colors.BLACK), 0));
const gradientMid = experimental_createToken(({ theme }) => {
const isThemeDark = _Module4004.isThemeDark(theme);
return hexOpacityToRgba(Module712.internal.resolveSemanticColor(theme, isThemeDark ? Module712.colors.BACKGROUND_SURFACE_HIGH : Module712.colors.BLACK), isThemeDark ? 0.8 : 0.5);
});
const gradientEnd = experimental_createToken((a0) => _Module4004.isThemeDark(a0.theme) ? Module712.colors.BACKGROUND_SURFACE_HIGH : Module712.colors.BLACK);
PX_16 = Module712.space.PX_16;
useStyles = createStyles({
container: {
position: "relative",
padding: 0,
borderRadius: Module712.radii.sm,
backgroundColor: BACKGROUND_SURFACE_HIGH,
marginBottom: Module712.space.PX_16,
overflow: "hidden"
},
heroContainer: {
display: "flex",
flexDirection: "column",
justifyContent: "flex-end",
padding: Module712.space.PX_12
},
heroImg: {
resizeMode: "cover",
...StyleSheet.absoluteFillObject
},
heroLinearGradientOverlay: StyleSheet.absoluteFillObject,
previewBadge: {
position: "absolute",
top: Module712.space.PX_8,
right: Module712.space.PX_8,
backgroundColor: Module712.colors.BACKGROUND_BRAND,
padding: Module712.space.PX_4,
borderRadius: Module712.radii.sm,
...Module712.shadows.SHADOW_LOW
},
rewardImgContainer: {
height: 64,
width: 64,
marginRight: Module712.space.PX_12
},
heroFooterContainer: {
display: "flex",
flexDirection: "row",
flexWrap: "wrap",
justifyContent: "space-between",
alignItems: "flex-end"
},
heroFooterLeftContainer: {
display: "flex",
flexDirection: "column",
alignItems: "flex-start"
},
detailsWrapper: {
display: "flex",
padding: Module712.space.PX_12
},
detailsContainer: {
display: "flex",
flexDirection: "row"
},
questName: {
marginBottom: Module712.space.PX_4
},
bodyContainer: {
display: "flex",
flexDirection: "column",
gap: Module712.space.PX_4
},
subtitleRow: {
flexDirection: "row",
alignItems: "center",
rowGap: Module712.space.PX_4,
columnGap: Module712.space.PX_8,
flexWrap: "wrap"
},
orbWithAmountRow: {
flexDirection: "row",
alignItems: "center"
},
detailsTextContainer: {
flex: 1,
justifyContent: "center"
},
buttonContainers: {
borderTopWidth: 1,
borderTopColor: BORDER_SUBTLE,
display: "flex",
flexDirection: "row",
alignItems: "center",
padding: Module712.space.PX_12
},
equalWidthContainer: {
flexBasis: 0,
flexGrow: 1,
flexShrink: 1
}
});
styleProperties = createStyleProperties({
gradientStart,
gradientMid,
gradientEnd
});
const r166 = Module19.memo(function(a0) {
let props, props3;
let onLayout2, quest, QUEST_HOME_MOBILE, questContentPosition, sourceQuestContent, questLogger, trackQuestContentClickedWithImpression, styles, width, height, c20919_10, c20919_11, defaultRewardNameWithArticle, questEnrollmentBlockedUntil, hasWatchVideoTasks, hasWatchVideoOnMobileTasks, c20919_16, product, stateFromStores, stateFromStores2, isMobileActivityQuest, launchMobileActivity, getQuestImpressionId, showQuestBottomSheet2, c20919_25, hasVirtualCurrencyReward, virtualCurrencyRewardOrbQuantity, questOrbRewardQuantityForUser, defaultRewardName, scaledTextLineHeight, width2, callback;
const trackClick2 = function trackClick(a0) {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_card")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: a0,
surfaceId: QUEST_HOME_MOBILE,
sourceQuestContent,
impressionId: getQuestImpressionId()
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QUEST_HOME_MOBILE,
questContentCTA: a0,
sourceQuestContent
});
}
};
showQuestBottomSheet2 = function showQuestBottomSheet() {
ActionSheetActionCreators.openLazy(import("./QuestBottomSheet/QuestBottomSheet"), "QuestBottomSheet", {
questId: quest.id,
questContentPosition,
sourceQuestContent
});
};
const containerPadding = a0.containerPadding;
onLayout2 = a0.onLayout;
quest = a0.quest;
let questContent = a0.questContent;
if (questContent === void 0) {
questContent = QuestContent.QUEST_HOME_MOBILE;
}
QUEST_HOME_MOBILE = questContent;
questContentPosition = a0.questContentPosition;
sourceQuestContent = a0.sourceQuestContent;
questLogger = getQuestLogger({
quest,
location: QuestsExperimentLocations.QUEST_HOME_MOBILE
});
trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
const questTaskDetails = useQuestTaskDetails(quest);
const completedRatio = useQuestCompletionDetails(quest).completedRatio;
const r9 = quest.userStatus?.enrolledAt != null;
styles = useStyles();
width = useWindowDimensions_native().width - 2 * PX_16;
height = 0.2803030303030303 * width;
const memo = useMemo(() => {
let r28;
const questAsset = getQuestAsset(quest, QuestAssetType.HERO);
const isAnimated = questAsset.isAnimated;
const r18 = {
...questAsset
};
if (isAnimated) {
let url = getScaledFirstFrameImageUrl({
assetUrl: questAsset.url,
width,
height
});
if (url == null) {
url = questAsset.url;
}
r18.url = url;
r28 = r18;
} else {
r18.url = getScaledImageUrl({
assetUrl: questAsset.url,
width,
height
});
r28 = r18;
}
return r28;
}, [quest, width, height]);
const questGameLogotypeAssetUrl = useQuestGameLogotypeAssetUrl(quest);
const r103 = styleProperties();
const { gradientStart, gradientMid, gradientEnd } = r103;
const [r111, r112] = useRecyclingState(null, [quest.id]);
c20919_10 = r111;
c20919_11 = r112;
const callback2 = useCallback(() => {
c20919_11(false);
}, [r112]);
useEffect(() => {
if (c20919_10 === false) {
MonitoringAgent.increment({
name: MetricEvents.QUEST_CONTENT_RENDERING_FAILURE,
tags: [`quest_id:${quest.id}`, `quest_content:${getQuestContentName(QUEST_HOME_MOBILE)}`, "reason:asset_loading_error"]
});
}
}, [r111, quest.id, QUEST_HOME_MOBILE]);
const stateFromStores3 = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
defaultRewardNameWithArticle = getDefaultRewardNameWithArticle(quest.config, stateFromStores3);
const stateFromStoresObject = useStateFromStoresObject([QuestStore], () => ({
reward: QuestStore.getRewards(quest.id),
isFetchingRewardCode: QuestStore.isFetchingRewardCode(quest.id),
isClaimingReward: QuestStore.isClaimingReward(quest.id),
isEnrolling: QuestStore.isEnrolling(quest.id),
questEnrollmentBlockedUntil: QuestStore.questEnrollmentBlockedUntil
}));
const isFetchingRewardCode = stateFromStoresObject.isFetchingRewardCode;
let isClaimingReward = stateFromStoresObject.isClaimingReward;
const isEnrolling = stateFromStoresObject.isEnrolling;
questEnrollmentBlockedUntil = stateFromStoresObject.questEnrollmentBlockedUntil;
const questFormattedDate = useQuestFormattedDate(quest.userStatus?.completedAt, {
year: "numeric",
month: "long",
day: "numeric"
});
hasWatchVideoTasks = _QuestTaskUtils.hasWatchVideoTasks(quest);
hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest.config);
const r7 = quest.userStatus?.enrolledAt != null;
let r26 = quest.userStatus?.completedAt != null;
const r161 = quest.userStatus?.claimedAt != null;
c20919_16 = r161;
const isQuestExpired = _QuestDataUtils.isQuestExpired(quest);
const isQuestExpiredButWithinThirtyDayLookback = getIsQuestExpiredButWithinThirtyDayLookback(quest);
const skuId = getDefaultReward(quest.config).skuId;
const isThemeDark = _Module4004.isThemeDark(useTheme());
const fetchCollectiblesProduct = useFetchCollectiblesProduct(hasCollectiblesQuestReward(quest.config) ? r26 ? skuId : null : null);
product = fetchCollectiblesProduct.product;
const isFetching = fetchCollectiblesProduct.isFetching;
stateFromStores = useStateFromStores([UserStore], () => {
const currentUser = UserStore.getCurrentUser();
return currentUser == null ? void 0 : currentUser.hasVerifiedEmailOrPhone();
});
stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.verified);
const mobileActivityQuest = useMobileActivityQuest(quest);
isMobileActivityQuest = mobileActivityQuest.isMobileActivityQuest;
const questApplication = mobileActivityQuest.questApplication;
launchMobileActivity = mobileActivityQuest.launchMobileActivity;
const token = useToken(Module712.colors.BACKGROUND_BASE_LOWER);
const token2 = useToken(Module712.colors.BACKGROUND_BASE_LOW);
const token3 = useToken(Module712.colors.BACKGROUND_BASE_LOWEST);
const r4 = questEnrollmentBlockedUntil != null && !r7 && !r26 && !r161;
const questFormattedDate2 = useQuestFormattedDate(quest.config.expiresAt, {
month: "numeric",
day: "numeric"
});
getQuestImpressionId = useGetQuestImpressionId();
const callback3 = useCallback(() => {
openGameLinkDirectly(quest, {
content: QUEST_HOME_MOBILE,
ctaContent: QuestContentCTA.OPEN_GAME_LINK,
impressionId: getQuestImpressionId(),
sourceQuestContent
});
}, [quest, QUEST_HOME_MOBILE, getQuestImpressionId, sourceQuestContent]);
const primaryCtaCopy = usePrimaryCtaCopy({
quest,
application: questApplication,
shortText: true
});
if (product != null) {
let buttonColors = product.styles?.buttonColors;
if (buttonColors == null) {
buttonColors = [];
}
let confettiColors = product.styles?.confettiColors;
if (confettiColors == null) {
confettiColors = [];
}
product.styles = {
buttonColors,
confettiColors,
backgroundColors: [tinycolor(token2), tinycolor(token), tinycolor(token3)]
};
}
L67: {
if (r161) {
props = {
text: intl.string(t.vTgCWx),
loading: isFetching,
onPress: () => {
trackClick2(QuestContentCTA.SHOW_REWARD);
viewReward({
product,
quest,
questContent: QUEST_HOME_MOBILE,
questContentPosition,
sourceQuestContent
});
}
};
} else {
L35: {
if (r26) {
if (isQuestExpired && !isQuestExpiredButWithinThirtyDayLookback) {
break L35;
}
const r326 = {
text: intl.string(t.cfY4PE),
loading: null,
onPress: null
};
if (!isClaimingReward) {
isClaimingReward = isFetchingRewardCode;
}
if (!isClaimingReward) {
isClaimingReward = isFetching;
}
r326.loading = isClaimingReward;
r326.onPress = () => {
trackClick2(QuestContentCTA.CLAIM_REWARD);
handleRewardClaimThenView({
product,
quest,
questContent: QUEST_HOME_MOBILE,
questContentPosition,
currentUserHasVerifiedEmailOrPhone: stateFromStores,
currentUserHasVerifiedEmail: stateFromStores2,
sourceQuestContent
});
};
props = r326;
break L67;
}
}
if (isQuestExpired) {
props = {
text: intl.formatToPlainString(t["6p8BZx"], {
expiryDate: questFormattedDate2
}),
loading: (isClaimingReward ? isClaimingReward : isFetchingRewardCode) || isFetching,
disabled: true,
variant: "secondary",
onPress: NOOP
};
} else {
if (r7 && hasWatchVideoTasks) {
props = {
text: getVideoQuestWatchCtaText(questTaskDetails),
accessibilityLabel: getVideoQuestWatchCtaAccessibilityLabel(questTaskDetails),
disabled: false,
onPress: () => {
questLogger.log("Navigating to video quest bottom sheet");
trackClick2(QuestContentCTA.WATCH_VIDEO);
if (hasWatchVideoOnMobileTasks) {
openVideoQuestModal({
questId: quest.id,
sourceQuestContent
});
} else {
ActionSheetActionCreators.openLazy(import("./QuestBottomSheet/QuestBottomSheet"), "QuestBottomSheet", {
questId: quest.id,
questContentPosition,
sourceQuestContent
});
}
}
};
break L67;
}
if (r7 && isMobileActivityQuest) {
props = {
text: primaryCtaCopy,
icon: getPrimaryCtaIcon(quest),
disabled: false,
onPress: () => {
trackClick2(QuestContentCTA.LAUNCH_MOBILE_ACTIVITY);
callback();
}
};
break L67;
}
if (r7 && !hasWatchVideoTasks && !isMobileActivityQuest) {
props = {
text: intl.string(t.JiosAn),
variant: "secondary",
disabled: false,
onPress: () => {
questLogger.log("Navigating to console connection action sheet");
trackClick2(QuestContentCTA.VIEW_REQUIREMENTS);
ActionSheetActionCreators.openLazy(import("./QuestBottomSheet/QuestBottomSheet"), "QuestBottomSheet", {
questId: quest.id,
questContentPosition,
sourceQuestContent
});
}
};
break L67;
}
const accessibilityLabel = hasWatchVideoTasks ? getVideoQuestWatchCtaAccessibilityLabel(questTaskDetails) : void 0;
const icon = isMobileActivityQuest ? getPrimaryCtaIcon(quest) : void 0;
c20919_25 = async () => {
let c27638_0;
L17: {
c27638_0 = void 0;
questLogger.log("Enrolling in quest");
await enrollInQuest(quest.id, {
questContent: QUEST_HOME_MOBILE,
questContentCTA: !isMobileActivityQuest && !hasWatchVideoTasks ? QuestContentCTA.ACCEPT_QUEST : QuestContentCTA.START_QUEST,
sourceQuestContent
});
if (hasWatchVideoTasks && hasWatchVideoOnMobileTasks) {
openVideoQuestModal({
questId: quest.id,
sourceQuestContent
});
break L17;
}
if (isMobileActivityQuest) {
(0, callback)();
} else {
(0, showQuestBottomSheet2)();
}
}
};
props = {
text: primaryCtaCopy,
disabled: false,
loading: isEnrolling,
accessibilityLabel,
icon,
onPress: function() {
return c20919_25.apply(this, arguments);
}
};
}
}
}
const r351 = intl.formatToPlainString(t.EAYZAr, {
questName: quest.config.messages.questName
});
hasVirtualCurrencyReward = _QuestRewardUtils.hasVirtualCurrencyReward(quest.config);
const questOrbMultiplierEligibility = useQuestOrbMultiplierEligibility();
let r364 = useShouldShowBonusOrbsUX(quest, questOrbMultiplierEligibility);
const visible = r364 ? questOrbMultiplierEligibility === QuestOrbMultiplierEligibilityType.NITRO : r364;
let r372 = quest.userStatus?.orbQuantityClaimed;
if (r372 == null) {
r372 = getVirtualCurrencyRewardOrbQuantity(quest.config);
}
virtualCurrencyRewardOrbQuantity = r372;
questOrbRewardQuantityForUser = getQuestOrbRewardQuantityForUser(quest.config, stateFromStores3);
defaultRewardName = getDefaultRewardName(quest.config, stateFromStores3);
const fontScale = useFontScale();
scaledTextLineHeight = useScaledTextLineHeight("text-md/semibold");
const questDescription = useQuestDescription(quest, sourceQuestContent, QuestsExperimentLocations.QUEST_HOME_MOBILE, GameProfileSources.QuestHome);
width2 = 16 * Math.min(fontScale, 1.3);
const memo2 = useMemo(() => {
let r54;
let r10 = isFabric();
const translateY = r10 ? isAndroid() ? 16 / scaledTextLineHeight : 0 : 0;
const marginRight = width2 / 8;
const transform = r10 ? [{
translateY
}] : void 0;
const props = {
variant: "text-md/semibold",
color: "mobile-text-heading-primary"
};
const style = {
width: width2,
height: width2,
marginRight,
marginTop: 0,
transform
};
if (c20919_16 && hasVirtualCurrencyReward) {
const r126 = [<OrbsIcon size="custom" color="mobile-text-heading-primary" style={style} />, , ,];
if (r10) {
r10 = <View style={{
width: marginRight
}} />;
}
r126[1] = r10;
const r143 = t["nLXlh+"];
let orbAmount2 = virtualCurrencyRewardOrbQuantity;
if (virtualCurrencyRewardOrbQuantity == null) {
orbAmount2 = 0;
}
r126[2] = <Text {...props}>
{intl.format(r143, {
orbAmount: orbAmount2
})}
</Text>;
r54 = <View style={styles.orbWithAmountRow}>{r126}</View>;
} else if (c20919_16) {
r54 = <Text {...props}>{defaultRewardName}</Text>;
} else if (hasVirtualCurrencyReward) {
const r75 = [<Text {...props}>
{intl.format(t["0IUT4Y"], {
rewardWithArticleHook: () => null
})}
</Text>, ,];
const r83 = [<OrbsIcon size="custom" color="mobile-text-heading-primary" style={style} />, r10 ? <View style={{
width: marginRight
}} /> : r10, ,];
const r100 = t["nLXlh+"];
let orbAmount = questOrbRewardQuantityForUser;
if (questOrbRewardQuantityForUser == null) {
orbAmount = 0;
}
r83[2] = <Text {...props}>
{intl.format(r100, {
orbAmount
})}
</Text>;
r75[1] = <View style={styles.orbWithAmountRow}>{r83}</View>;
r54 = <View style={styles.orbWithAmountRow}>{r75}</View>;
} else {
r54 = <Text {...props}>
{intl.format(t["0IUT4Y"], {
rewardWithArticleHook: () => defaultRewardNameWithArticle
})}
</Text>;
}
return r54;
}, [r161, hasVirtualCurrencyReward, questOrbRewardQuantityForUser, virtualCurrencyRewardOrbQuantity, defaultRewardName, defaultRewardNameWithArticle, width2, scaledTextLineHeight, styles.orbWithAmountRow]);
const r416 = isQuestExpired && r26 && !r161 ? intl.formatToPlainString(t["l1jCM/"], {
date: questFormattedDate
}) : questDescription;
const ctaLink = getCtaLink(quest.config);
const callback4 = useCallback(() => {
openVideoQuestModal({
questId: quest.id,
initialStep: VideoQuestModalSteps.WATCH_VIDEO,
sourceQuestContent
});
}, [quest.id, sourceQuestContent]);
callback = useCallback(async () => {
dismissOverlayScreens();
await launchMobileActivity();
}, [launchMobileActivity]);
const props2 = {
style: [styles.container, {
marginHorizontal: PX_16 - containerPadding
}],
onLayout: (a0) => {
if (onLayout2 != null) {
onLayout2(a0, quest.id);
}
},
children: null
};
const r471 = [<FastImage source={{
uri: memo.url
}} style={styles.heroImg} onError={callback2} accessible accessibilityRole="image" accessibilityLabel={quest.config.messages.questName} />, <Module4611 style={styles.heroLinearGradientOverlay} start={VerticalGradient.START} end={VerticalGradient.END} colors={[gradientStart, gradientMid, gradientEnd]} />, quest.preview && <View style={styles.previewBadge}>
<Text variant="eyebrow" color="text-overlay-light">
{intl.string(t.SKNnqq)}
</Text>
</View>, ,];
const r511 = [<QuestGameLogotype assetUrl={questGameLogotypeAssetUrl} onError={callback2} />, ,];
let color = "text-overlay-light";
r511[1] = <Stack direction="horizontal" align="center" spacing={4}>
<Text variant="text-xs/medium" color={isThemeDark ? "text-muted" : "text-overlay-light"}>
{intl.string(t.VAbKhK)}
</Text>
<Image2 source={Module8466} style={{
height: 16,
width: 16
}} accessible accessibilityRole="image" accessibilityLabel={intl.string(t.OfMjx9)} />
<Text variant="text-xs/medium" color="text-overlay-light">{quest.config.messages.gamePublisher}</Text>
</Stack>;
const r555 = [<View style={styles.heroFooterLeftContainer}>{r511}</View>, ,];
let r556 = isQuestExpired ? !isQuestExpired : !r161;
if (r556) {
if (isThemeDark) {
color = "text-default";
}
r556 = <Text variant="text-xs/medium" color={color}>
{intl.format(t["7D8r4F"], {
expiryDate: questFormattedDate2
})}
</Text>;
}
r555[1] = r556;
r471[3] = <View style={styles.heroFooterContainer}>{r555}</View>;
const r573 = [<View style={[styles.heroContainer, {
height
}]}>{r471}</View>, , ,];
const r588 = [<View style={styles.rewardImgContainer}>
{r9 ? <QuestProgressIndicator quest={quest} progress={completedRatio} size="sm" /> : <QuestRewardTile quest={quest} height={64} width={64} />}
</View>, ,];
const r597 = [<Text variant="eyebrow" color="text-brand" style={styles.questName} accessibilityRole="header">{r351}</Text>, ,];
const r602 = [memo2, ,];
if (r364) {
r364 = <QuestOrbMultiplierPerkPill questId={quest.config.id} orbMultiplierEligibility={questOrbMultiplierEligibility} />;
}
r602[1] = r364;
r597[1] = <View style={styles.bodyContainer}>
<View style={styles.subtitleRow}>{r602}</View>
{r416 != null && <Text variant="text-sm/medium" color="text-muted">{r416}</Text>}
</View>;
r588[1] = <View style={styles.detailsTextContainer}>{r597}</View>;
r573[1] = <View style={styles.detailsWrapper}>
<View style={styles.detailsContainer}>{r588}</View>
</View>;
const r630 = {
children: null
};
if (r4) {
r630.children = [<Button grow onPress={NOOP} variant="secondary" disabled text={intl.string(t.V293qn)} />, <Button onPress={function onPress() {
ActionSheetActionCreators.openLazy(import("./QuestEnrollmentBlockedBottomSheet/QuestEnrollmentBlockedBottomSheet"), "QuestEnrollmentBlockedBottomSheet", {
questId: quest.id,
questEnrollmentBlockedUntil,
sourceQuestContent
});
}} variant="tertiary" text={intl.string(t.vY9GgG)} />];
props3 = r630;
} else {
r630.children = [ctaLink !== "" && !r4 && !isQuestExpired && !r161 && !r26 && <View style={styles.equalWidthContainer}>
<Button grow variant="secondary" text={getExternalCtaLabel(quest)} onPress={callback3} />
</View>, <View style={styles.equalWidthContainer}>
<Button grow {...props} />
</View>];
props3 = r630;
}
const r689 = [<Fragment {...props3} />, (r26 ? hasWatchVideoTasks : r26) && hasWatchVideoOnMobileTasks && <IconButton accessibilityLabel={intl.string(t.YsCuyF)} icon={Module9972} onPress={callback4} variant="secondary" />, , ,];
if (r26) {
r26 = isMobileActivityQuest;
}
if (r26) {
r26 = <IconButton accessibilityLabel={intl.string(t.CkUzLd)} icon={Module9972} onPress={callback} variant="secondary" />;
}
r689[2] = r26;
r689[3] = <QuestContextMenu quest={quest} showShareLink={!isQuestExpired} location={QuestsExperimentLocations.QUESTS_CARD} sourceQuestContent={sourceQuestContent} />;
r573[2] = <Stack direction="horizontal" align="center" spacing={Module712.space.PX_8} style={styles.buttonContainers}>{r689}</Stack>;
props2.children = <PremiumRewardGradient visible={visible} glow>{r573}</PremiumRewardGradient>;
return <Card {...props2} />;
});
export const ESTIMATED_CARD_HEIGHT = 348;
export { r166 as QuestCard };
@@ -0,0 +1,154 @@
// Metro module 10970 (f10971).
import { createElement, useRef, useEffect } from "react";
import AppStateStore from "../../../stores/native/AppStateStore";
import { MIN_QUEST_CONTENT_VISIBILITY_PERCENTAGE } from "../lib/analytics/ContentImpressionTrackerConstants";
import { AppStates } from "../../../Constants";
import { useRecyclingState } from "../../../_bundle/noop_6676";
import usePrevious from "../../../hooks/usePrevious";
import { useStateFromStores } from "../../../_bundle/Module589";
import { useAdContentImpressionTrackerProps } from "../lib/analytics/ContentImpressionTrackerHooks";
import { QuestContentImpressionTracker } from "../lib/analytics/ContentImpressionTracker";
import { AdCreativeType } from "../../../_bundle/Module6013";
const AdContentImpressionTrackerBaseNative = function AdContentImpressionTrackerBaseNative(a0) {
let r81;
let adContentIds, visibilityRef, setVisible;
const focused = useStateFromStores([AppStateStore], () => AppStateStore.getState()) === AppStates.ACTIVE;
const ref = useRef(null);
const previous = usePrevious(focused);
const adContentImpressionTrackerProps = useAdContentImpressionTrackerProps(a0);
const { key, adContentIds: adContentIds2 } = adContentImpressionTrackerProps;
const r13 = {
...a0,
adContentIds: adContentIds2
};
adContentIds = void 0;
visibilityRef = void 0;
adContentIds = r13.adContentIds;
visibilityRef = r13.visibilityRef;
let overrideVisibility = r13.overrideVisibility;
setVisible = void 0;
let r49;
[r49, setVisible] = useRecyclingState(false, [adContentIds.join("_")]);
useEffect(() => {
(function initHandlers({ adContentIds: adContentIds2, setVisible: setVisible2, visibilityRef: visibilityRef2 }) {
if (visibilityRef2 != null) {
const _loop = function _loop(a0) {
visibilityRef2.current.children[a0] = {
...visibilityRef2.current.children[a0],
calculateVisibility: function calculateVisibility() {
let r24, r39, r47, width;
const r3 = visibilityRef2 == null;
let r13 = void 0;
if (!r3) {
const current = visibilityRef2.current;
const r18 = current == null;
r13 = void 0;
if (!r18) {
const children2 = current.children;
r13 = children2 == null ? void 0 : children2[a0];
}
}
const layout = r13?.layout;
L21: {
const r23 = layout == null;
r24 = 0;
if (!r23) {
const r29 = (visibilityRef2 == null ? void 0 : visibilityRef2.current.parent?.layout) == null;
r24 = 0;
if (!r29) {
let axis = visibilityRef2.current.axis;
if (axis == null) {
axis = "vertical";
}
if (axis === "horizontal") {
const r60 = visibilityRef2.current.parent.scrollX == null;
r24 = 0;
if (r60) {
break L21;
}
const r62 = [r13.layout.x, r13.layout.x + r13.layout.width];
const r70 = [visibilityRef2.current.parent.scrollX, visibilityRef2.current.parent.scrollX + visibilityRef2.current.parent.layout.width];
width = r13.layout.width;
r47 = r70;
r39 = r62;
} else {
const r36 = visibilityRef2.current.parent.scrollY == null;
r24 = 0;
if (r36) {
break L21;
}
r39 = [r13.layout.y, r13.layout.y + r13.layout.height];
r47 = [visibilityRef2.current.parent.scrollY, visibilityRef2.current.parent.scrollY + visibilityRef2.current.parent.layout.height];
width = r13.layout.height;
}
if (visibilityRef2.current.parent.firstItemOffset != null) {
const firstItemOffset = visibilityRef2.current.parent.firstItemOffset;
r39[0] = r39[0] + firstItemOffset;
r39[1] = r39[1] + firstItemOffset;
}
const r94 = Math.max(r39[0], r47[0]);
r24 = Math.min(Math.max(0, Math.min(r39[1], r47[1]) - r94) / width, 1);
}
}
}
setVisible2(r24 >= MIN_QUEST_CONTENT_VISIBILITY_PERCENTAGE);
}
};
};
for (const item of adContentIds2) {
_loop(item);
}
}
})({
adContentIds,
setVisible,
visibilityRef
});
const children = visibilityRef == null ? void 0 : visibilityRef.current?.children;
return () => {
if (children != null) {
for (const adContentId of adContentIds) {
const r16 = children[adContentId];
if (r16 != null) {
r16.calculateVisibility = void 0;
}
}
}
};
}, [adContentIds, setVisible, visibilityRef]);
if (overrideVisibility == null) {
overrideVisibility = r49;
}
const r60 = {
...a0,
...{
visible: overrideVisibility,
visibleChanged: overrideVisibility !== usePrevious(overrideVisibility)
},
focused,
focusedChanged: focused !== previous,
reference: ref,
isFocused: focused
};
const key2 = a0.skipRemountKey ? void 0 : key;
const r75 = "questOrQuests" in a0;
const r76 = {
...r60,
key: key2,
adContentIds: adContentIds2
};
if (r75) {
r76.adCreativeType = AdCreativeType.QUEST;
r81 = r76;
} else {
r76.adCreativeType = a0.adCreativeType;
r81 = r76;
}
return createElement(QuestContentImpressionTracker, r81);
};
export function QuestContentImpressionTrackerNative(props) {
return <AdContentImpressionTrackerBaseNative {...props} />;
}
export function BillableAdPlacementImpressionTrackerNative(props) {
return <AdContentImpressionTrackerBaseNative {...props} />;
}
+194
View File
@@ -0,0 +1,194 @@
// Metro module 14176 (f14177).
import _objectWithoutProperties from "../../../_bundle/_objectWithoutProperties";
import * as Module19 from "react";
import { useCallback, useMemo } from "react";
import QuestStore from "../QuestStore";
import { LinkingTypes } from "../../../Constants";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import Module8964 from "../../../_bundle/Module8964";
import { intl, t } from "../../../intl/index.native";
import { useQuestPreviewActions, useShouldShowQuestPreviewOverrides } from "../hooks/QuestHooks";
import { useStateFromStores } from "../../../_bundle/Module589";
import { QuestContent } from "../QuestTypes";
import { useTrackQuestContentClickedWithImpression } from "../lib/analytics/AnalyticsHooks";
import { useQuestImpressionId } from "../lib/analytics/ContentImpressionTrackerHooks";
import { getExternalCtaLabel, getCtaLink, copyShareLink } from "../utils/QuestCopyUtils";
import * as _QuestUtils from "../utils/QuestUtils";
import { isIOS } from "../../../utils/PlatformUtils";
import parseURL from "../../../utils/native/parseURL";
import { dismissOverlayScreens } from "./QuestUtils.native";
import { openGameLinkDirectly } from "../utils/QuestPlatformUtils";
import { QuestContentCTA } from "../lib/analytics/AnalyticsTypes";
import { AccessibilityAnnouncer } from "../../../_bundle/Module3902";
import QuestDisclosureModalActionCreators from "./QuestDisclosureModal/QuestDisclosureModalActionCreators";
import { manuallyStartConsoleQuest, manualStopConsoleQuest } from "../QuestActionCreators";
import { LinkExternalSmallIcon } from "../../../design/components/Icon/native/redesign/generated/LinkExternalSmallIcon";
import Module14177 from "../../../_bundle/Module14177";
import { CopyIcon } from "../../../design/components/Icon/native/redesign/generated/CopyIcon";
import { isConsoleQuest } from "../utils/QuestTaskUtils";
import { copy } from "../../../utils/ClipboardUtils.native";
import { CheckmarkLargeIcon } from "../../../design/components/Icon/native/redesign/generated/CheckmarkLargeIcon";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../_bundle/Module6013";
import { ContextMenu } from "../../../design/components/ContextMenu/native/ContextMenu.native";
let _excluded;
const renderDefaultButton = function renderDefaultButton(a0) {
return <IconButton ref={a0.ref} {..._objectWithoutProperties(a0, _excluded)} icon={Module8964} variant="secondary" accessibilityLabel={intl.string(t.CAgr1w)} accessibilityHint={intl.string(t.hd0b7t)} />;
};
_excluded = ["ref"];
const r29 = Module19.memo(function(a0) {
let children = a0.children;
if (children === void 0) {
children = renderDefaultButton;
}
let trackQuestContentClickedWithImpression, questImpressionId, externalCtaLabel, isShareableQuest, callback, callback2, callback3, callback4, callback5, memo, memo2, memo3, shouldShowQuestPreviewOverrides, memo4;
const quest = a0.quest;
let showShareLink = a0.showShareLink;
if (showShareLink === void 0) {
showShareLink = false;
}
let additionalItems = a0.additionalItems;
if (additionalItems === void 0) {
additionalItems = [];
}
let c21007_1 = additionalItems;
const sourceQuestContent = a0.sourceQuestContent;
trackQuestContentClickedWithImpression = void 0;
questImpressionId = void 0;
externalCtaLabel = void 0;
isShareableQuest = void 0;
callback = void 0;
callback2 = void 0;
callback3 = void 0;
callback4 = void 0;
callback5 = void 0;
memo = void 0;
memo2 = void 0;
memo3 = void 0;
shouldShowQuestPreviewOverrides = void 0;
memo4 = void 0;
const questPreviewActions = useQuestPreviewActions(quest.id);
const { handleComplete, handleProgress, handleResetDismissibilityClick, handleResetStatusClick, handleOverridePreviewClick, handleResetHasBeenSeenClick } = questPreviewActions;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuestPreviewOverride(QuestContent.QUEST_BAR_MOBILE), []);
trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
questImpressionId = useQuestImpressionId();
externalCtaLabel = getExternalCtaLabel(quest);
if (showShareLink) {
showShareLink = _QuestUtils.isShareableQuest(quest.config);
}
isShareableQuest = showShareLink;
callback = useCallback(() => {
if (isIOS() && parseURL(getCtaLink(quest.config)).payload.type === LinkingTypes.INVITE) {
dismissOverlayScreens();
}
openGameLinkDirectly(quest, {
content: QuestContent.QUEST_HOME_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_OPEN_GAME_LINK,
impressionId: questImpressionId,
sourceQuestContent
});
}, [quest, questImpressionId, sourceQuestContent]);
callback2 = useCallback(() => {
if (isShareableQuest) {
copyShareLink(quest.id, {
content: QuestContent.QUEST_HOME_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_COPY_LINK,
impressionId: questImpressionId,
sourceQuestContent
});
AccessibilityAnnouncer.announce(intl.string(t["+5kSoW"]));
}
}, [isShareableQuest, quest.id, questImpressionId, sourceQuestContent]);
callback3 = useCallback(() => {
QuestDisclosureModalActionCreators.showModal({
quest,
isTargetedDisclosure: false,
trackingCtx: {
content: QuestContent.QUEST_HOME_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_OPEN_DISCLOSURE,
sourceQuestContent
}
});
}, [quest, sourceQuestContent]);
callback4 = useCallback(() => manuallyStartConsoleQuest(quest.id, true), [quest.id]);
callback5 = useCallback(() => manualStopConsoleQuest(quest.id), [quest.id]);
memo = useMemo(() => [{
label: externalCtaLabel,
IconComponent: LinkExternalSmallIcon,
action: callback,
accessibilityRole: "link"
}, {
label: intl.string(t.GcsZKJ),
action: callback3,
iconSource: Module14177
}, ...isShareableQuest ? [{
label: intl.string(t.WqhZss),
IconComponent: CopyIcon,
action: callback2
}] : []], [externalCtaLabel, callback, callback3, isShareableQuest, callback2]);
memo2 = useMemo(() => isConsoleQuest(quest) ? [{
label: "Start Console Heartbeat",
action: callback4
}, {
label: "Stop Console Heartbeat",
action: callback5
}] : [], [quest, callback4, callback5]);
memo3 = useMemo(() => [{
label: "Set Random Quest Progress",
action: () => handleProgress(0.9 * Math.random() + 0.03)
}, {
label: "Complete Quest",
action: handleComplete
}, {
label: "Reset Quest",
action: handleResetStatusClick
}, {
label: "Reset Dismissibility",
action: handleResetDismissibilityClick
}, {
label: "Reset Quest Seen",
action: handleResetHasBeenSeenClick
}, ...memo2, {
label: "Copy Quest ID",
action: () => copy(quest.id)
}], [memo2, handleComplete, handleResetDismissibilityClick, handleProgress, handleResetStatusClick, handleResetHasBeenSeenClick, quest.id]);
shouldShowQuestPreviewOverrides = useShouldShowQuestPreviewOverrides(quest);
const r90 = [handleOverridePreviewClick, quest.id, ,];
const id = stateFromStores?.id;
const r93 = () => ({
label: "Show in Quest Bar",
action: () => handleOverridePreviewClick(QuestContent.QUEST_BAR_MOBILE),
IconComponent: stateFromStores?.id === quest.id ? CheckmarkLargeIcon : void 0
});
r90[2] = id;
memo4 = useMemo(r93, r90);
return <ContextMenu items={useMemo(() => {
const r5 = c21007_1 != null ? [memo, c21007_1] : [memo];
if (shouldShowQuestPreviewOverrides) {
r5.push([memo4]);
}
return quest.preview ? [...r5, memo3] : r5;
}, [memo, memo3, quest.preview, shouldShowQuestPreviewOverrides, memo4, additionalItems])} onOpen={useCallback(() => {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_context_menu")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.OPEN_CONTEXT_MENU,
surfaceId: QuestContent.QUEST_HOME_MOBILE,
sourceQuestContent,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QuestContent.QUEST_HOME_MOBILE,
questContentCTA: QuestContentCTA.OPEN_CONTEXT_MENU,
sourceQuestContent
});
}
}, [quest.id, trackQuestContentClickedWithImpression, questImpressionId, sourceQuestContent])} triggerOnTap>{children}</ContextMenu>;
});
export default r29;
@@ -0,0 +1,33 @@
// Metro module 14133 (f14134).
import { HeaderActionButton } from "../../../../design/components/Navigator/native/HeaderActionButton.native";
import Module7699 from "../../../../_bundle/Module7699";
import QuestDisclosureModalActionCreators from "./QuestDisclosureModalActionCreators";
import { intl, t } from "../../../../intl/index.native";
import { NavigatorHeader } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import QuestDisclosureModalInner from "./QuestDisclosureModalInner";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
let c9891_4;
const CloseButton = function CloseButton() {
return <HeaderActionButton source={Module7699} onPress={function onPress() {
return QuestDisclosureModalActionCreators.hideModal();
}} accessibilityLabel={intl.string(t.cpT0Cq)} />;
};
c9891_4 = {
DISCLOSURE: "disclosure"
};
export default function QuestDisclosureModal(props) {
const { isTargetedDisclosure, gamePublisher, gameTitle, cosponsorName, isVideoQuest } = props;
const onClose2 = function onClose() {
return QuestDisclosureModalActionCreators.hideModal();
};
const screens = {};
screens[c9891_4.DISCLOSURE] = {
headerLeft: CloseButton,
headerRight: function headerRight() {
return null;
},
headerTitle: () => <NavigatorHeader title={intl.string(t.GcsZKJ)} />,
render: () => <QuestDisclosureModalInner isTargetedDisclosure={isTargetedDisclosure} gamePublisher={gamePublisher} gameTitle={gameTitle} onClose={onClose2} cosponsorName={cosponsorName} isVideoQuest={isVideoQuest} />
};
return <Navigator screens={screens} initialRouteName={c9891_4.DISCLOSURE} headerBackTitle={intl.string(t["13/7kX"])} />;
};
@@ -0,0 +1,46 @@
// Metro module 14132 (f14133).
import * as _QuestTaskUtils from "../../utils/QuestTaskUtils";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { trackQuestContentClicked } from "../../lib/analytics/AnalyticsActions";
import ModalActionCreators from "../../../../actions/ModalActionCreators";
let c9890_3 = "QUEST_DISCLOSURE_MODAL";
const r15 = {
showModal: ({ quest, isTargetedDisclosure, trackingCtx }) => {
const messages = quest.config.messages;
const { gamePublisher, gameTitle } = messages;
const hasWatchVideoTasks = _QuestTaskUtils.hasWatchVideoTasks(quest);
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_disclosure_modal")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: trackingCtx.ctaContent,
surfaceId: trackingCtx.content,
sourceQuestContent: trackingCtx.sourceQuestContent,
questContentPosition: trackingCtx.position
});
} else {
trackQuestContentClicked({
questId: quest.id,
questContent: trackingCtx.content,
questContentCTA: trackingCtx.ctaContent,
questContentPosition: trackingCtx.position,
sourceQuestContent: trackingCtx.sourceQuestContent
});
}
ModalActionCreators.pushLazy(import("./QuestDisclosureModal"), {
gamePublisher,
gameTitle,
isTargetedDisclosure,
cosponsorName: quest.config.cosponsorMetadata?.name,
isVideoQuest: hasWatchVideoTasks
}, c9890_3);
},
hideModal: () => {
ModalActionCreators.popWithKey(c9890_3);
}
};
export default r15;
@@ -0,0 +1,112 @@
// Metro module 14134 (f14135).
import { View } from "react-native";
import { HelpdeskArticles } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { DropsOptedOut } from "../../../user_settings/UserSettings";
import { ServerIcon } from "../../../../design/components/Icon/native/redesign/generated/ServerIcon";
import { intl, t } from "../../../../intl/index.native";
import { GlobeEarthIcon } from "../../../../design/components/Icon/native/redesign/generated/GlobeEarthIcon";
import { UserIcon } from "../../../../design/components/Icon/native/redesign/generated/UserIcon";
import { GameControllerIcon } from "../../../../design/components/Icon/native/redesign/generated/GameControllerIcon";
import { WumpusCouchSpotIllustration } from "../../../../design/assets/native";
import { Text } from "../../../../design/components/Text/native/Text";
import { getDisclosureText } from "../../utils/QuestCopyUtils";
import { Card } from "../../../../design/components/Card/native/Card.native";
import HelpdeskUtils from "../../../../utils/HelpdeskUtils";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flex: 1,
padding: Module712.space.PX_24,
gap: Module712.space.PX_16,
maxWidth: 480
},
illustration: {
alignSelf: "center",
marginBottom: Module712.space.PX_8
},
closeButton: {
marginTop: "auto",
paddingHorizontal: Module712.space.PX_8,
marginBottom: Module712.space.PX_24
},
targetList: {
padding: 0
},
targetItem: {
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
paddingLeft: Module712.space.PX_16,
gap: Module712.space.PX_16
},
lastTargetItem: {
borderBottomWidth: 0
},
disclosureText: {
flex: 1,
paddingVertical: Module712.space.PX_12,
borderBottomWidth: 1,
borderBottomColor: Module712.colors.BORDER_SUBTLE
}
});
export default function QuestDisclosureModalInner(props) {
let r15;
let isTargetedDisclosure = props.isTargetedDisclosure;
const { gamePublisher, gameTitle, isVideoQuest, onClose, cosponsorName } = props;
const styles = useStyles();
const setting = DropsOptedOut.useSetting();
const r3 = {
icon: null,
text: null
};
if (setting) {
r3.icon = <ServerIcon size="xs" />;
r3.text = intl.string(t["2bL0wT"]);
r15 = [r3];
} else {
r3.icon = <GlobeEarthIcon size="xs" />;
r3.text = intl.string(t.xQSdPv);
r15 = [r3, {
icon: <UserIcon size="xs" />,
text: intl.string(t.mYt7hQ)
}, {
icon: <GameControllerIcon size="xs" />,
text: intl.string(t.XAsWxQ)
}];
}
let c20935_1 = r15;
const r98 = [<View style={styles.illustration}>
<WumpusCouchSpotIllustration />
</View>, <Text variant="text-md/normal" color="mobile-text-heading-primary">
{getDisclosureText({
gamePublisher,
gameTitle,
isTargetedDisclosure,
isContextualDisclosure: setting,
cosponsorName,
isVideoQuest
})}
</Text>, , , ,];
if (isTargetedDisclosure) {
isTargetedDisclosure = <Card radius={16} style={styles.targetList}>
{r15.map((item, index) => <View key={index} style={styles.targetItem}>
{item.icon}
<View style={[styles.disclosureText, index === c20935_1.length - 1 && styles.lastTargetItem]}>
<Text variant="text-md/semibold">{item.text}</Text>
</View>
</View>)}
</Card>;
}
r98[2] = isTargetedDisclosure;
r98[3] = <Text variant="text-md/medium" color="mobile-text-heading-primary">
{intl.format(t.tzq9Wa, {
privacySettingsUrl: HelpdeskUtils.getArticleURL(HelpdeskArticles.QUESTS_PRIVACY_CONTROLS)
})}
</Text>;
r98[4] = <View style={styles.closeButton}>
<Button variant="primary" grow size="lg" text={intl.string(t.cpT0Cq)} onPress={onClose} />
</View>;
return <View style={styles.container}>{r98}</View>;
};
@@ -0,0 +1,505 @@
// Metro module 14205 (f14206).
import { useContext, useId, useCallback, useEffect, useState, useRef, memo } from "react";
import { Image as Image2, Pressable, View, StyleSheet } from "react-native";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode, QuestsExperimentLocations } from "../../QuestConstants";
import { QUEST_DOCK_COLLAPSED_HEIGHT, QUEST_DOCK_CONTENT_BORDER_RADII, QUEST_DOCK_MODE_CHANGE_PHYSICS, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED, QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED } from "./QuestDockConstants";
import { AnalyticEvents } from "../../../../Constants";
import { ThemeTypes } from "../../../../_bundle/Module505";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import QuestDockContext from "./QuestDockContext";
import { QuestDockGestureContext, QuestDockGestureContextProvider } from "./QuestDockGestureContext";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import { useQuestDockModeAnimatedReaction, useQuestDockDismissalReset } from "./QuestDockHooks";
import { useIsScreenReaderEnabled } from "../../../a11y/native/useIsScreenReaderEnabled.native";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useDerivedValue, useAnimatedStyle, useSharedValue, useAnimatedProps } from "../../../reanimated/ReanimatedRexport";
import useStateFromSharedValue from "../../../reanimated/native/useStateFromSharedValue";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useYouBarTotalHeight } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarTotalHeight";
import { useToken } from "../../../../design/tokens/native/useToken";
import useQuestDockAnimatedBorderRadius from "./useQuestDockAnimatedBorderRadius";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import * as _QuestDockUtils from "./QuestDockUtils";
import { dimensionsLayoutTransition } from "./QuestDockUtils";
import * as _springPresets from "../../../../design/animation/reanimated/spring/springPresets";
import { SUBTLE_SPRING } from "../../../../design/animation/reanimated/spring/springPresets";
import { AccessibilityViewAnimated } from "../../../../design/components/AccessibilityView/AccessibilityView.native";
import QuestDockGestureDetector from "./QuestDockGestureDetector";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import { intl, t } from "../../../../intl/index.native";
import QuestDockContentCollapsed from "./QuestDockContentCollapsed";
import QuestDockContentExpanded from "./QuestDockContentExpanded";
import QuestDockUnenrolledBackground from "./QuestDockUnenrolledBackground";
import QuestDockDragHandle from "./QuestDockDragHandle";
import { Backdrop } from "../../../../design/components/Backdrop/native/Backdrop.native";
import { useQuestBarOrDockModeChangeTracking, useQuestBarImpressionSurvey } from "../../hooks/QuestHooks";
import { QuestContent } from "../../QuestTypes";
import { QuestBarRenderedTriggerPoint } from "../../../experiments/trigger_points/QuestBarRenderedTriggerPoint";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { getIsEligibleForQuests } from "../../lib/QuestsEligibility";
import { useQuestDockHeroAsset, useQuestGameLogotypeAssetUrl, useMobileQuestDock, useIsMobileQuestDockRenderedBase, useIsMobileQuestDockVisibleToUser } from "../QuestHooks.native";
import { useGradientBottom } from "../../../client_themes/native/ClientThemesOverrides";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import MonitoringAgent from "../../../monitoring/MonitoringAgent";
import { MetricEvents } from "../../../../_bundle/Module5872";
import { getQuestContentName } from "../../lib/analytics/AnalyticsTypes";
import { updateQuestDockVisibilityEligibility } from "../../QuestActionCreators";
import { BillableAdPlacementImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import { ThemeContextProvider } from "../../../../_bundle/Module3901";
let useStyles, __initData, __initData2, __initData3, __initData4, __initData5, __initData6, __initData7, __initData8, QuestDockModeChangeTracker, QuestBarRenderedTriggerPointWrapper, useStyles2, ENTRANCE_ANIMATION_SPING_CONFIG, __initData9, QuestDockWithEntranceAnimation;
const QuestDockWithGestureAnimation = function QuestDockWithGestureAnimation(props) {
let top, c21034_7, token, c21034_9, sharedValue;
const appThemedBackgroundColor = props.appThemedBackgroundColor;
const quest2 = useContext(QuestDockContext).quest;
const styles = useStyles();
const context = useContext(QuestDockGestureContext);
const { questDockWrapperSpecs, activeQuestDockMode, windowDimensions } = context;
const context2 = useContext(QuestDockExternalCoordinationContext);
const { restingQuestDockMode, setRestingQuestDockMode } = context2;
const id = useId();
const callback3 = useCallback(() => {
setRestingQuestDockMode(QuestDockMode.COLLAPSED);
}, [setRestingQuestDockMode]);
useQuestDockModeAnimatedReaction();
useQuestDockDismissalReset();
const isScreenReaderEnabled = useIsScreenReaderEnabled();
const x = () => restingQuestDockMode.get() === QuestDockMode.EXPANDED;
x.__closure = {
restingQuestDockMode,
QuestDockMode
};
x.__workletHash = 2415817673061;
x.__initData = __initData;
const stateFromSharedValue = useStateFromSharedValue(useDerivedValue(x));
top = useSafeAreaInsets_native().top;
const youBarTotalHeight = useYouBarTotalHeight();
const isEnrolled = quest2.userStatus?.enrolledAt != null;
c21034_7 = isEnrolled;
token = useToken(Module712.modules.mobile.QUEST_DOCK_BORDER_RADIUS);
const questDockAnimatedBorderRadius = useQuestDockAnimatedBorderRadius(token);
c21034_9 = questDockAnimatedBorderRadius;
const K = () => ({
backgroundColor: appThemedBackgroundColor,
borderBottomRightRadius: _spring.withSpring(c21034_9.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
borderBottomLeftRadius: _spring.withSpring(c21034_9.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
height: questDockWrapperSpecs.get().height,
width: questDockWrapperSpecs.get().width,
opacity: _spring.withSpring(1, QUEST_DOCK_MODE_CHANGE_PHYSICS),
transform: [{
translateX: _spring.withSpring(questDockWrapperSpecs.get().x + -1 * _QuestDockUtils.roundToNearestPixel(questDockWrapperSpecs.get().width / 2), QUEST_DOCK_MODE_CHANGE_PHYSICS)
}, {
translateY: _spring.withSpring(questDockWrapperSpecs.get().y, QUEST_DOCK_MODE_CHANGE_PHYSICS)
}]
});
K.__closure = {
appThemedBackgroundColor,
withSpring: _spring.withSpring,
bottomBorderRadius: questDockAnimatedBorderRadius,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,
questDockWrapperSpecs,
QUEST_DOCK_MODE_CHANGE_PHYSICS,
roundToNearestPixel: _QuestDockUtils.roundToNearestPixel
};
K.__workletHash = 4228984550973;
K.__initData = __initData2;
const animatedStyle = useAnimatedStyle(K);
sharedValue = useSharedValue(0);
const q = () => ({
transform: [{
scale: _spring.withSpring(_ReanimatedRexport.interpolate(sharedValue.get(), [1, 0], [1, 1]), _springPresets.springStandard)
}]
});
q.__closure = {
withSpring: _spring.withSpring,
interpolate: _ReanimatedRexport.interpolate,
isPressed: sharedValue,
springStandard: _springPresets.springStandard
};
q.__workletHash = 3373473585356;
q.__initData = __initData3;
const animatedStyle2 = useAnimatedStyle(q);
const callback4 = useCallback(() => {
setRestingQuestDockMode(QuestDockMode.EXPANDED);
}, [setRestingQuestDockMode]);
const callback2 = useCallback(() => {
sharedValue.set(1);
}, [sharedValue]);
const callback = useCallback(() => {
sharedValue.set(0);
}, [sharedValue]);
const W = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? 1 : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS),
height: windowDimensions.get().height
});
W.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS,
windowDimensions
};
W.__workletHash = 6178969276321;
W.__initData = __initData4;
const animatedStyle3 = useAnimatedStyle(W);
const X = () => ({
pointerEvents: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? "auto" : "none"
});
X.__closure = {
activeQuestDockMode,
QuestDockMode
};
X.__workletHash = 5416180055289;
X.__initData = __initData5;
const animatedProps = useAnimatedProps(X);
const Y = function Y() {
const r4 = questDockWrapperSpecs.get();
return windowDimensions.get().height - top - r4.height;
};
Y.__closure = {
questDockWrapperSpecs,
windowDimensions,
safeAreaTop: top
};
Y.__workletHash = 8073454569923;
Y.__initData = __initData6;
const stateFromSharedValue2 = useStateFromSharedValue(useDerivedValue(Y));
const F = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() !== QuestDockMode.CLOSED ? activeQuestDockMode.get() === QuestDockMode.SOFT_DISMISSED ? 0 : 1 : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS)
});
F.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS
};
F.__workletHash = 6468803634518;
F.__initData = __initData7;
const animatedStyle4 = useAnimatedStyle(F);
const V = () => {
const r22 = {
borderTopLeftRadius: !c21034_7 && activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : token,
borderTopRightRadius: !c21034_7 && activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : token,
borderBottomLeftRadius: !c21034_7 && activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : c21034_9.get(),
borderBottomRightRadius: !c21034_7 && activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : c21034_9.get(),
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? 0 : 1, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
height: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? c21034_7 ? questDockWrapperSpecs.get().height : QUEST_DOCK_COLLAPSED_HEIGHT : questDockWrapperSpecs.get().height,
width: activeQuestDockMode.get() === QuestDockMode.EXPANDED && !c21034_7 ? questDockWrapperSpecs.get().width - 2 * QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : questDockWrapperSpecs.get().width,
transform: [{
translateX: c21034_7 ? 0 : _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}, {
translateY: c21034_7 ? 0 : _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}],
borderBottomWidth: c21034_9.get() > 0 ? 1 : 0
};
return r22;
};
V.__closure = {
isEnrolled,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_CONTENT_BORDER_RADII,
questDockBorderRadius: token,
bottomBorderRadius: questDockAnimatedBorderRadius,
withSpring: _spring.withSpring,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,
questDockWrapperSpecs,
QUEST_DOCK_COLLAPSED_HEIGHT,
QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED
};
V.__workletHash = 12859739915134;
V.__initData = __initData8;
const animatedStyle5 = useAnimatedStyle(V);
return <>
<View style={styles.wrapper} pointerEvents="auto">
<AccessibilityViewAnimated nativeID={id} style={styles.accessibilityWrapper} accessibilityViewIsModal={!!isScreenReaderEnabled && stateFromSharedValue} onAccessibilityEscape={callback3} pointerEvents="box-none">
<QuestDockGestureDetector>
<ReanimatedNativeView style={animatedStyle2}>
<ReanimatedNativeView style={[styles.questDockWrapper, {
bottom: youBarTotalHeight - 1
}, animatedStyle]} layout={dimensionsLayoutTransition}>
<Pressable style={styles.nestedPressable} onPressIn={callback2} onPressOut={callback} onPress={callback4} pointerEvents={stateFromSharedValue ? "none" : "auto"} accessibilityRole="button" accessibilityLabel={intl.string(t.rjVPdM)} accessibilityHint={stateFromSharedValue ? "" : intl.string(t.n0MlOB)} />
<ReanimatedNativeView style={[styles.questDockHeaderBorder, animatedStyle5]} layout={dimensionsLayoutTransition} pointerEvents="none" />
<ReanimatedNativeView style={[styles.questDockContentWrapper, animatedStyle4]}>
<View style={styles.questDockContentWrapper}>
<QuestDockContentCollapsed hideOnExpand={isEnrolled} />
<QuestDockContentExpanded />
</View>
{isEnrolled ? !isEnrolled : <QuestDockUnenrolledBackground />}
</ReanimatedNativeView>
<QuestDockDragHandle isExpanded={stateFromSharedValue} />
</ReanimatedNativeView>
</ReanimatedNativeView>
</QuestDockGestureDetector>
</AccessibilityViewAnimated>
</View>
<ReanimatedNativeView style={animatedStyle3} animatedProps={animatedProps}>
<Backdrop onDismiss={callback3} accessibleDismissStyle={{
height: stateFromSharedValue2
}} />
</ReanimatedNativeView>
</>;
};
QuestDockModeChangeTracker = function QuestDockModeChangeTracker(a0) {
useQuestBarOrDockModeChangeTracking({
mode: a0.mode,
questContent: QuestContent.QUEST_BAR_MOBILE,
questId: a0.questId,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
return null;
};
QuestBarRenderedTriggerPointWrapper = function QuestBarRenderedTriggerPointWrapper() {
useEffect(() => {
QuestBarRenderedTriggerPoint.trigger();
}, []);
return null;
};
QuestDockWithEntranceAnimation = function QuestDockWithEntranceAnimation() {
let ref, stateFromStores, staticUrl, questGameLogotypeAssetUrl, c21035_11, token2, c21035_13;
const context = useContext(QuestDockContext);
const { isRendered, isVisibleToUser, quest } = context;
const [state] = useState(() => performance.now());
ref = useRef(false);
const styles2 = useStyles2();
const [state2, setState] = useState({
width: 0,
height: 0
});
stateFromStores = useStateFromStores([QuestDockStore], () => QuestDockStore.prevRestingQuestDockMode);
const isEligibleForQuests = getIsEligibleForQuests();
const questBarImpressionSurvey = useQuestBarImpressionSurvey(quest);
const n = () => ({
opacity: _spring.withSpring(isRendered ? 1 : 0, ENTRANCE_ANIMATION_SPING_CONFIG, "animate-always"),
transform: [{
translateY: _spring.withSpring(isRendered ? 0 : state2.height, ENTRANCE_ANIMATION_SPING_CONFIG)
}]
});
n.__closure = {
withSpring: _spring.withSpring,
isRendered,
ENTRANCE_ANIMATION_SPING_CONFIG,
componentDimensions: state2
};
n.__workletHash = 15545726338295;
n.__initData = __initData9;
const animatedStyle = useAnimatedStyle(n);
const [state3, setState2] = useState(null);
staticUrl = useQuestDockHeroAsset(quest).staticUrl;
questGameLogotypeAssetUrl = useQuestGameLogotypeAssetUrl(quest);
c21035_11 = quest.userStatus?.enrolledAt != null;
const gradientBottom = useGradientBottom();
const token3 = useToken(Module712.colors.BACKGROUND_SURFACE_HIGH);
let r93 = gradientBottom?.backgroundColor;
if (r93 == null) {
r93 = token3;
}
token2 = r93;
useEffect(() => {
let _prefetchWithErrorReporting2, _preloadQuestDockAssets2;
const prefetchWithErrorReporting2 = function prefetchWithErrorReporting(a0) {
return _prefetchWithErrorReporting2.apply(this, arguments);
};
_prefetchWithErrorReporting2 = function _prefetchWithErrorReporting() {
const r9 = async (c31718_0) => {
let c31718_4 = 0;
let c32056_0;
try {
c32056_0 = c31718_0;
c31718_4 = 1;
await Image2.prefetch(c31718_0);
c31718_4 = 0;
} catch ($e) {
let r7 = $e;
if (c31718_4 !== 0) {
while (true) {
try {
c31718_4 = 0;
AnalyticsUtils.track(AnalyticEvents.QUEST_ASSET_LOADING_FAILURE, {
source: QuestsExperimentLocations.QUESTS_BAR_MOBILE,
quest_id: quest.id,
asset_id: c32056_0
});
} catch ($e) {
r7 = $e;
if (c31718_4 === 0) {
break;
}
continue;
}
return false;
}
}
throw r7;
}
return true;
};
_prefetchWithErrorReporting2 = r9;
return r9.apply(this, arguments);
};
_preloadQuestDockAssets2 = function _preloadQuestDockAssets() {
const r9 = async () => {
let c31719_1;
let env32057;
c31719_1 = void 0;
const r9 = env32057 = {};
let c31719_0 = r9;
env32057[0] = void 0;
const r10 = [];
if (staticUrl != null) {
r10.push(prefetchWithErrorReporting2(staticUrl));
}
if (questGameLogotypeAssetUrl != null) {
r10.push(prefetchWithErrorReporting2(questGameLogotypeAssetUrl));
}
env32057[0] = await Promise.all(r10);
(0, setState2)(env32057[0].every((item) => item === true));
};
_preloadQuestDockAssets2 = r9;
return r9.apply(this, arguments);
};
(function preloadQuestDockAssets() {
return _preloadQuestDockAssets2.apply(this, arguments);
})();
}, [staticUrl, questGameLogotypeAssetUrl, quest.id]);
useEffect(() => {
if (state3 === false) {
MonitoringAgent.increment({
name: MetricEvents.QUEST_CONTENT_RENDERING_FAILURE,
tags: [`quest_id:${quest.id}`, `quest_content:${getQuestContentName(QuestContent.QUEST_BAR_MOBILE)}`, "reason:asset_loading_error"]
});
}
}, [state3, quest.id]);
const r104 = quest == null || !isEligibleForQuests || !state3;
c21035_13 = r104;
useEffect(() => {
updateQuestDockVisibilityEligibility({
isEligibleToBeVisible: !c21035_13
});
return () => {
updateQuestDockVisibilityEligibility({
isEligibleToBeVisible: false
});
};
}, [r104]);
return r104 ? null : <ReanimatedRexport.View pointerEvents="box-none" style={[styles2.wrapperAnimated, animatedStyle]} onLayout={(event) => {
setState({
height: event.nativeEvent.layout.height,
width: event.nativeEvent.layout.width
});
if (!ref.current) {
ref.current = true;
if (Math.random() < 0.1) {
MonitoringAgent.distribution({
name: MetricEvents.QUEST_BAR_MOBILE_TIME_TO_FIRST_PAINT,
tags: [`quest_id:${quest.id}`]
}, Math.round(performance.now() - state));
}
}
}}>
<BillableAdPlacementImpressionTrackerNative overrideVisibility={isVisibleToUser} questContent={QuestContent.QUEST_BAR_MOBILE} questOrQuests={quest} onImpression={questBarImpressionSurvey} sourceQuestContent={QuestContent.QUEST_BAR_MOBILE}>
{() => <>
{[<QuestDockModeChangeTracker questId={quest.id} mode={stateFromStores} />, <QuestBarRenderedTriggerPointWrapper />, <QuestDockGestureContextProvider>
<ThemeContextProvider theme={c21035_11 ? void 0 : ThemeTypes.DARK}>
<QuestDockWithGestureAnimation appThemedBackgroundColor={token2} />
</ThemeContextProvider>
</QuestDockGestureContextProvider>]}
</>}
</BillableAdPlacementImpressionTrackerNative>
</ReanimatedRexport.View>;
};
useStyles = createStyles({
wrapper: {
position: "absolute",
left: "50%",
bottom: 0,
zIndex: 1
},
accessibilityWrapper: {
...StyleSheet.absoluteFillObject,
zIndex: 1
},
questDockWrapper: {
position: "absolute",
bottom: 0,
left: "50%",
overflow: "hidden",
display: "flex",
alignItems: "center",
justifyContent: "center",
borderRadius: Module712.modules.mobile.QUEST_DOCK_BORDER_RADIUS,
zIndex: 1
},
questDockContentWrapper: {
...StyleSheet.absoluteFillObject,
justifyContent: "flex-end",
zIndex: 4
},
questDockHeaderBorder: {
...StyleSheet.absoluteFillObject,
bottom: void 0,
right: void 0,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED,
zIndex: 5
},
nestedPressable: {
...StyleSheet.absoluteFillObject,
zIndex: 6
}
});
__initData = {
code: "function QuestDockTsx1(){const{restingQuestDockMode,QuestDockMode}=this.__closure;return restingQuestDockMode.get()===QuestDockMode.EXPANDED;}"
};
__initData2 = {
code: "function QuestDockTsx2(){const{appThemedBackgroundColor,withSpring,bottomBorderRadius,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,questDockWrapperSpecs,QUEST_DOCK_MODE_CHANGE_PHYSICS,roundToNearestPixel}=this.__closure;return{backgroundColor:appThemedBackgroundColor,borderBottomRightRadius:withSpring(bottomBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),borderBottomLeftRadius:withSpring(bottomBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),height:questDockWrapperSpecs.get().height,width:questDockWrapperSpecs.get().width,opacity:withSpring(1,QUEST_DOCK_MODE_CHANGE_PHYSICS),transform:[{translateX:withSpring(questDockWrapperSpecs.get().x+roundToNearestPixel(questDockWrapperSpecs.get().width/2)*-1,QUEST_DOCK_MODE_CHANGE_PHYSICS)},{translateY:withSpring(questDockWrapperSpecs.get().y,QUEST_DOCK_MODE_CHANGE_PHYSICS)}]};}"
};
__initData3 = {
code: "function QuestDockTsx3(){const{withSpring,interpolate,isPressed,springStandard}=this.__closure;return{transform:[{scale:withSpring(interpolate(isPressed.get(),[1,0],[1,1]),springStandard)}]};}"
};
__initData4 = {
code: "function QuestDockTsx4(){const{withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS,windowDimensions}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS),height:windowDimensions.get().height};}"
};
__initData5 = {
code: "function QuestDockTsx5(){const{activeQuestDockMode,QuestDockMode}=this.__closure;return{pointerEvents:activeQuestDockMode.get()===QuestDockMode.EXPANDED?'auto':'none'};}"
};
__initData6 = {
code: "function QuestDockTsx6(){const{questDockWrapperSpecs,windowDimensions,safeAreaTop}=this.__closure;const specs=questDockWrapperSpecs.get();const windowHeight=windowDimensions.get().height;return windowHeight-safeAreaTop-specs.height;}"
};
__initData7 = {
code: "function QuestDockTsx7(){const{withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.CLOSED||activeQuestDockMode.get()===QuestDockMode.SOFT_DISMISSED?0:1,QUEST_DOCK_MODE_CHANGE_PHYSICS)};}"
};
__initData8 = {
code: "function QuestDockTsx8(){const{isEnrolled,activeQuestDockMode,QuestDockMode,QUEST_DOCK_CONTENT_BORDER_RADII,questDockBorderRadius,bottomBorderRadius,withSpring,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,questDockWrapperSpecs,QUEST_DOCK_COLLAPSED_HEIGHT,QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED}=this.__closure;return{borderTopLeftRadius:!isEnrolled&&activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:questDockBorderRadius,borderTopRightRadius:!isEnrolled&&activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:questDockBorderRadius,borderBottomLeftRadius:!isEnrolled&&activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:bottomBorderRadius.get(),borderBottomRightRadius:!isEnrolled&&activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:bottomBorderRadius.get(),opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?0:1,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),height:activeQuestDockMode.get()===QuestDockMode.EXPANDED?isEnrolled?questDockWrapperSpecs.get().height:QUEST_DOCK_COLLAPSED_HEIGHT:questDockWrapperSpecs.get().height,width:activeQuestDockMode.get()===QuestDockMode.EXPANDED&&!isEnrolled?questDockWrapperSpecs.get().width-QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED*2:questDockWrapperSpecs.get().width,transform:[{translateX:isEnrolled?0:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)},{translateY:isEnrolled?0:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)}],borderBottomWidth:bottomBorderRadius.get()>0?1:0};}"
};
useStyles2 = createStyles(() => ({
wrapperAnimated: {
position: "absolute",
bottom: 0,
padding: 0,
width: "100%"
}
}));
ENTRANCE_ANIMATION_SPING_CONFIG = {
...SUBTLE_SPRING,
overshootClamping: true,
damping: 54
};
__initData9 = {
code: "function QuestDockTsx9(){const{withSpring,isRendered,ENTRANCE_ANIMATION_SPING_CONFIG,componentDimensions}=this.__closure;return{opacity:withSpring(isRendered?1:0,ENTRANCE_ANIMATION_SPING_CONFIG,'animate-always'),transform:[{translateY:withSpring(isRendered?0:componentDimensions.height,ENTRANCE_ANIMATION_SPING_CONFIG)}]};}"
};
const r115 = memo(function QuestDockWithQuestContext() {
const mobileQuestDock = useMobileQuestDock();
const isMobileQuestDockRenderedBase = useIsMobileQuestDockRenderedBase(mobileQuestDock);
const isMobileQuestDockVisibleToUser = useIsMobileQuestDockVisibleToUser(mobileQuestDock, isMobileQuestDockRenderedBase);
return mobileQuestDock != null ? <QuestDockContext.Provider value={{
isRendered: isMobileQuestDockRenderedBase,
isVisibleToUser: isMobileQuestDockVisibleToUser,
quest: mobileQuestDock
}}>
<QuestDockWithEntranceAnimation />
</QuestDockContext.Provider> : null;
});
export default r115;
export { QuestDockWithEntranceAnimation };
@@ -0,0 +1,11 @@
// Metro module 14184 (f14185).
import * as Module19 from "react";
import { useMemo } from "react";
import { StyleSheet } from "react-native";
import VisualEffectViewAnimated from "../../../visual_effect_view/native/VisualEffectViewAnimated";
const r23 = Module19.memo(function QuestDockBlurredContentBackground(props) {
const { animatedStyle, animatedLayout, blurTheme = "dark" } = props;
const memo = useMemo(() => blurTheme === "dark" ? "rgba(38, 39, 50, 0.65)" : "rgba(255, 255, 255, 0.1)", [blurTheme]);
return <VisualEffectViewAnimated nativeID="quest-dock-blurred-background" blurTintRgba={useMemo(() => blurTheme === "dark" ? "rgba(38, 39, 50, 0.1)" : "rgba(255, 255, 255, 0.1)", [blurTheme])} blurAmount={0.5} blurTheme="dark" android_fallbackColor={memo} style={[StyleSheet.absoluteFillObject, animatedStyle]} layout={animatedLayout} />;
});
export default r23;
@@ -0,0 +1,51 @@
// Metro module 14210 (f14211).
import * as Module19 from "react";
import { useContext, useMemo } from "react";
import { View, StyleSheet } from "react-native";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED, QUEST_DOCK_EXPANDED_HEIGHT } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { thumbHashToDataURL } from "../../../../_bundle/thumbHashToRGBA";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
const useStyles = createStyles({
image: {
...StyleSheet.absoluteFillObject,
height: QUEST_DOCK_EXPANDED_HEIGHT,
top: -QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED
},
overlay: {
...StyleSheet.absoluteFillObject,
backgroundColor: "rgba(38, 39, 50, 0.3)",
height: QUEST_DOCK_EXPANDED_HEIGHT
}
});
const __initData = {
code: "function QuestDockBlurredHeaderPlaceholderTsx1(){const{activeQuestDockMode,QuestDockMode,QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED,questDockWrapperSpecs}=this.__closure;return{left:activeQuestDockMode.get()===QuestDockMode.EXPANDED?-QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED:0,width:questDockWrapperSpecs.get().width+QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED};}"
};
const r50 = Module19.memo(function QuestDockBlurredContentBackground(props) {
const { animatedLayout, animatedStyle, placeholder } = props;
const context = useContext(QuestDockGestureContext);
const { questDockWrapperSpecs, activeQuestDockMode } = context;
const memo = useMemo(() => ({
uri: thumbHashToDataURL(Uint8Array.from(atob(placeholder), (a0) => a0.charCodeAt(0)))
}), [placeholder]);
const styles = useStyles();
const D = () => ({
left: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? -QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0,
width: questDockWrapperSpecs.get().width + QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED
});
D.__closure = {
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED,
questDockWrapperSpecs
};
D.__workletHash = 11176778421725;
D.__initData = __initData;
return <>
<ReanimatedRexport.Image source={memo} style={[styles.image, animatedStyle, useAnimatedStyle(D)]} layout={animatedLayout} />
<View style={styles.overlay} />
</>;
});
export default r50;
@@ -0,0 +1,46 @@
// Metro module 14122 (f14123).
import Module712 from "../../../../_bundle/Module712";
const PX_16 = Module712.space.PX_16;
const PX_12 = Module712.space.PX_12;
const PX_8 = Module712.space.PX_8;
const r31 = {
mass: 0.5,
damping: 80,
stiffness: 320
};
const r32 = {
...r31,
overshootClamping: true
};
const lg = Module712.radii.lg;
export const QUEST_DOCK_COLLAPSED_HEIGHT = 56;
export const QUEST_DOCK_CLOSED_HEIGHT = 22;
export const QUEST_DOCK_EXPANDED_HEIGHT = 400;
export { PX_16 as QUEST_DOCK_EXPANDED_PADDING_BOTTOM };
export { PX_12 as QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL };
export { PX_8 as QUEST_DOCK_EXPANDED_ENROLLED_PADDING_TOP };
export const QUEST_DOCK_COLLAPSED_MAX_WIDTH = 600;
export const QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED = 8;
export const QUEST_DOCK_VERTICAL_EDGE_GUTTER_COLLAPSED = 8;
export const QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED = 0;
export const QUEST_DOCK_VERTICAL_EDGE_GUTTER_CLOSED = 0;
export const QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED = 12;
export const QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM = 15;
export const QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM = 15;
export const QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT = 200;
export const QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT = 30;
export const QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY = 200;
export const QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD = 5;
export const QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR = 0.8;
export const QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR = 1.5;
export const QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR = 0.07;
export const QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD = 4;
export const QUEST_DOCK_EXTERNAL_OFFSET_COLLAPSED = 64;
export const QUEST_DOCK_EXTERNAL_OFFSET_COLLAPSED_WITH_YOU_BAR = 56;
export const QUEST_DOCK_EXTERNAL_OFFSET_EXPANDED = 64;
export const QUEST_DOCK_EXTERNAL_OFFSET_EXPANDED_WITH_YOU_BAR = 56;
export const QUEST_DOCK_EXTERNAL_OFFSET_CLOSED = 22;
export const QUEST_DOCK_EXPANDED_CONTENT_PADDING_VERTICAL = 16;
export { r31 as QUEST_DOCK_MODE_CHANGE_PHYSICS };
export { r32 as QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED };
export { lg as QUEST_DOCK_CONTENT_BORDER_RADII };
@@ -0,0 +1,65 @@
// Metro module 14208 (f14209).
import { memo, useContext } from "react";
import { StyleSheet } from "react-native";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_MODE_CHANGE_PHYSICS } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import QuestDockContext from "./QuestDockContext";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { useAnimatedStyle, useAnimatedProps } from "../../../reanimated/ReanimatedRexport";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import QuestDockUnenrolledHeader from "./QuestDockUnenrolledHeader";
import QuestDockEnrolledHeader from "./QuestDockEnrolledHeader";
const useStyles = createStyles({
questDockContentCollapsed: {
...StyleSheet.absoluteFillObject,
bottom: void 0,
zIndex: 2
}
});
const __initData = {
code: "function QuestDockContentCollapsedTsx1(){const{withSpring,activeQuestDockMode,QuestDockMode,hideOnExpand,QUEST_DOCK_MODE_CHANGE_PHYSICS}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.COLLAPSED||!hideOnExpand?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS)};}"
};
const __initData2 = {
code: "function QuestDockContentCollapsedTsx2(){const{activeQuestDockMode,QuestDockMode,hideOnExpand}=this.__closure;return{pointerEvents:activeQuestDockMode.get()===QuestDockMode.COLLAPSED||!hideOnExpand?'auto':'none'};}"
};
const r43 = memo(function QuestDockContentCollapsed(props) {
const hideOnExpand2 = props.hideOnExpand;
const hideOnExpand = hideOnExpand2 === void 0 || hideOnExpand2;
const quest = useContext(QuestDockContext).quest;
const styles = useStyles();
let r8 = quest.userStatus?.enrolledAt != null;
const activeQuestDockMode = useContext(QuestDockGestureContext).activeQuestDockMode;
const u = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() !== QuestDockMode.COLLAPSED ? hideOnExpand ? 0 : 1 : 1, QUEST_DOCK_MODE_CHANGE_PHYSICS)
});
u.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
hideOnExpand,
QUEST_DOCK_MODE_CHANGE_PHYSICS
};
u.__workletHash = 13361221764426;
u.__initData = __initData;
const animatedStyle = useAnimatedStyle(u);
const r44 = () => ({
pointerEvents: activeQuestDockMode.get() !== QuestDockMode.COLLAPSED ? hideOnExpand ? "none" : "auto" : "auto"
});
r44.__closure = {
activeQuestDockMode,
QuestDockMode,
hideOnExpand
};
r44.__workletHash = 14339269503421;
r44.__initData = __initData2;
const animatedProps = useAnimatedProps(r44);
const r60 = [r8 ? !r8 : <QuestDockUnenrolledHeader />, ,];
if (r8) {
r8 = <QuestDockEnrolledHeader />;
}
r60[1] = r8;
return <ReanimatedNativeView style={[styles.questDockContentCollapsed, animatedStyle]} animatedProps={animatedProps}>{r60}</ReanimatedNativeView>;
});
export default r43;
@@ -0,0 +1,60 @@
// Metro module 14215 (f14216).
import { memo, useContext } from "react";
import { StyleSheet } from "react-native";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_EXPANDED_HEIGHT, QUEST_DOCK_MODE_CHANGE_PHYSICS } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import QuestDockContext from "./QuestDockContext";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import QuestDockUnenrolledBody from "./QuestDockUnenrolledBody";
import QuestDockEnrolledBody from "./QuestDockEnrolledBody";
const useStyles = createStyles({
wrapper: {
...StyleSheet.absoluteFillObject,
bottom: void 0,
display: "flex",
zIndex: 1
}
});
const __initData = {
code: "function QuestDockContentExpandedTsx1(){const{isEnrolled,QUEST_DOCK_EXPANDED_HEIGHT,windowDimensions,withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS,questDockWrapperSpecs}=this.__closure;return{height:isEnrolled?undefined:QUEST_DOCK_EXPANDED_HEIGHT,width:windowDimensions.get().width,opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS),transform:[{translateX:withSpring((questDockWrapperSpecs.get().width-windowDimensions.get().width)/2,QUEST_DOCK_MODE_CHANGE_PHYSICS)}]};}"
};
const r44 = memo(function QuestDockContentExpanded() {
const quest = useContext(QuestDockContext).quest;
const styles = useStyles();
const context = useContext(QuestDockGestureContext);
const { activeQuestDockMode, questDockWrapperSpecs, windowDimensions } = context;
let isEnrolled = quest.userStatus?.enrolledAt != null;
let c21042_3 = isEnrolled;
const r33 = () => ({
height: c21042_3 ? void 0 : QUEST_DOCK_EXPANDED_HEIGHT,
width: windowDimensions.get().width,
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? 1 : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS),
transform: [{
translateX: _spring.withSpring((questDockWrapperSpecs.get().width - windowDimensions.get().width) / 2, QUEST_DOCK_MODE_CHANGE_PHYSICS)
}]
});
r33.__closure = {
isEnrolled,
QUEST_DOCK_EXPANDED_HEIGHT,
windowDimensions,
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS,
questDockWrapperSpecs
};
r33.__workletHash = 17161265612101;
r33.__initData = __initData;
const animatedStyle = useAnimatedStyle(r33);
const r52 = [isEnrolled ? !isEnrolled : <QuestDockUnenrolledBody />, ,];
if (isEnrolled) {
isEnrolled = <QuestDockEnrolledBody quest={quest} />;
}
r52[1] = isEnrolled;
return <ReanimatedNativeView style={[styles.wrapper, animatedStyle]}>{r52}</ReanimatedNativeView>;
});
export default r44;
@@ -0,0 +1,8 @@
// Metro module 14204 (f14205).
import { createContext } from "react";
const context = createContext({
quest: void 0,
isRendered: false,
isVisibleToUser: false
});
export default context;
@@ -0,0 +1,158 @@
// Metro module 14129 (f14130).
import { UserSettingsSections } from "../../../../Constants";
import * as _QuestUtils from "../../utils/QuestUtils";
import { useQuestPreviewActions } from "../../hooks/QuestHooks";
import { getExternalCtaLabel, copyShareLink } from "../../utils/QuestCopyUtils";
import { ActionSheet } from "../../../../design/components/Sheet/native/ActionSheet.native";
import { ActionSheetRow } from "../../../../design/components/Sheet/native/ActionSheetRow.native";
import { LinkExternalMediumIcon } from "../../../../design/components/Icon/native/redesign/generated/LinkExternalMediumIcon";
import { FormLabel } from "../../../../design/void/Form/native/index";
import { openGameLinkDirectly } from "../../utils/QuestPlatformUtils";
import { QuestContent } from "../../QuestTypes";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import { CopyIcon } from "../../../../design/components/Icon/native/redesign/generated/CopyIcon";
import { intl, t } from "../../../../intl/index.native";
import WreathIcon from "./WreathIcon";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { trackQuestContentClicked } from "../../lib/analytics/AnalyticsActions";
import { openQuestHome } from "../QuestUtils.native";
import { CircleQuestionIcon } from "../../../../design/components/Icon/native/redesign/generated/CircleQuestionIcon";
import QuestDisclosureModalActionCreators from "../QuestDisclosureModal/QuestDisclosureModalActionCreators";
import { XSmallIcon } from "../../../../design/components/Icon/native/redesign/generated/XSmallIcon";
import { dismissQuestContent, markAdContentUnseen } from "../../QuestActionCreators";
import { displayQuestDismissalToast } from "../QuestDockDismissalToast";
import { TrophyIcon } from "../../../../design/components/Icon/native/redesign/generated/TrophyIcon";
import { RedoIcon } from "../../../../design/components/Icon/native/redesign/generated/RedoIcon";
import { UndoIcon } from "../../../../design/components/Icon/native/redesign/generated/UndoIcon";
import { UnsendIcon } from "../../../../design/components/Icon/native/redesign/generated/UnsendIcon";
import { EyeIcon } from "../../../../design/components/Icon/native/redesign/generated/EyeIcon";
import { openUserSettings } from "../../../user_settings/core/native/openUserSettings";
import { copy } from "../../../../utils/ClipboardUtils.native";
export default function QuestDockContextMenuActionSheet(props) {
const quest = props.quest;
const isShareableQuest = _QuestUtils.isShareableQuest(quest.config);
const questPreviewActions = useQuestPreviewActions(quest.id);
const { handleComplete, handleProgress, handleResetDismissibilityClick, handleResetStatusClick } = questPreviewActions;
return <ActionSheet>
<ActionSheetRow.Group hasIcons>
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={LinkExternalMediumIcon} />} label={<FormLabel text={getExternalCtaLabel(quest)} />} onPress={() => {
openGameLinkDirectly(quest, {
content: QuestContent.QUEST_BAR_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_OPEN_GAME_LINK,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
ActionSheetActionCreators.hideActionSheet();
}} />
{isShareableQuest && <ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={CopyIcon} />} label={<FormLabel text={intl.string(t.WqhZss)} />} onPress={() => {
copyShareLink(quest.id, {
content: QuestContent.QUEST_BAR_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_COPY_LINK,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
ActionSheetActionCreators.hideActionSheet();
}} />}
</ActionSheetRow.Group>
<ActionSheetRow.Group hasIcons>
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={WreathIcon} />} label={<FormLabel text={intl.string(t.LLLLPD)} />} onPress={() => {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_dock_context_menu")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.CONTEXT_MENU_LEARN_MORE,
surfaceId: QuestContent.QUEST_BAR_MOBILE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
} else {
trackQuestContentClicked({
questId: quest.id,
questContent: QuestContent.QUEST_BAR_MOBILE,
questContentCTA: QuestContentCTA.CONTEXT_MENU_LEARN_MORE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
}
openQuestHome({
scrollToQuestId: quest.id,
fromContent: QuestContent.QUEST_BAR_MOBILE
});
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={CircleQuestionIcon} />} label={<FormLabel text={intl.string(t.GcsZKJ)} />} onPress={() => {
QuestDisclosureModalActionCreators.showModal({
quest,
isTargetedDisclosure: true,
trackingCtx: {
content: QuestContent.QUEST_BAR_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_OPEN_DISCLOSURE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
}
});
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={XSmallIcon} />} label={<FormLabel text={intl.string(t.NN79E9)} />} subLabel={intl.string(t.V6htN5)} onPress={async () => {
let c27643_0;
c27643_0 = void 0;
const r38 = dismissQuestContent(quest.id, QuestContent.QUEST_BAR_MOBILE);
ActionSheetActionCreators.hideActionSheet();
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_dock_context_menu")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.CONTEXT_MENU_HIDE_CONTENT,
surfaceId: QuestContent.QUEST_BAR_MOBILE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
} else {
trackQuestContentClicked({
questId: quest.id,
questContent: QuestContent.QUEST_BAR_MOBILE,
questContentCTA: QuestContentCTA.CONTEXT_MENU_HIDE_CONTENT,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
}
await r38;
displayQuestDismissalToast();
}} />
</ActionSheetRow.Group>
{quest.preview && <ActionSheetRow.Group title={intl.string(t["Ape+mm"])} hasIcons>
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={TrophyIcon} />} label={<FormLabel text={intl.string(t.jQEfRT)} />} onPress={() => {
handleComplete();
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={RedoIcon} />} label={<FormLabel text={intl.string(t.cKSLr4)} />} onPress={() => {
handleProgress(0.9 * Math.random() + 0.03);
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={UndoIcon} />} label={<FormLabel text={intl.string(t.taqkwK)} />} onPress={() => {
handleResetStatusClick();
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={UnsendIcon} />} label={<FormLabel text={intl.string(t.JF6W66)} />} onPress={() => {
handleResetDismissibilityClick();
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={EyeIcon} />} label={<FormLabel text={intl.string(t["lL6/zF"])} />} onPress={() => {
markAdContentUnseen(AdCreativeType.QUEST, [quest.id]);
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={EyeIcon} />} label={<FormLabel text={intl.string(t.tx5Ax5)} />} onPress={() => {
openUserSettings({
screen: UserSettingsSections.QUEST_PREVIEW_TOOL_2,
params: {
questId: quest.id
}
});
ActionSheetActionCreators.hideActionSheet();
}} />
<ActionSheetRow icon={<ActionSheetRow.Icon IconComponent={CopyIcon} />} label={<FormLabel text={intl.string(t.oisrFi)} />} onPress={() => {
copy(quest.id);
ActionSheetActionCreators.hideActionSheet();
}} />
</ActionSheetRow.Group>}
</ActionSheet>;
};
@@ -0,0 +1,128 @@
// Metro module 14219 (f14220).
import { memo, useContext } from "react";
import { StyleSheet } from "react-native";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_COLLAPSED_MAX_WIDTH, QUEST_DOCK_MODE_CHANGE_PHYSICS } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import QuestDockContext from "./QuestDockContext";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { useYouBarHorizontalMargin } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarMargins";
import { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { useMobileVisualRefreshConfig } from "../../../themes/experiments/MobileVisualRefreshExperiment";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import { dimensionsLayoutTransition } from "./QuestDockUtils";
import { ActionSheetHeaderBar } from "../../../../design/components/Sheet/native/ActionSheetHeaderBar.native";
import { intl, t } from "../../../../intl/index.native";
let getDragHandleOffsetLeft, __initData, __initData2, __initData3, __initData4;
const useStyles = createStyles({
dragHandleWrapper: {
...StyleSheet.absoluteFillObject,
bottom: void 0,
right: void 0,
zIndex: 4
},
dragHandleOverlay: {
...StyleSheet.absoluteFillObject,
bottom: void 0
}
});
const getDragHandleOffsetLeft2 = function getDragHandleOffsetLeft(a0, a1) {
return a0 !== QuestDockMode.EXPANDED ? -1 * a1 : 0;
};
getDragHandleOffsetLeft2.__closure = {
QuestDockMode
};
getDragHandleOffsetLeft2.__workletHash = 4145264969027;
getDragHandleOffsetLeft2.__initData = {
code: "function getDragHandleOffsetLeft_QuestDockDragHandleTsx1(activeQuestDockMode,horizontalEdgeGutter){const{QuestDockMode}=this.__closure;switch(activeQuestDockMode){case QuestDockMode.EXPANDED:return 0;default:return horizontalEdgeGutter*-1;}}"
};
getDragHandleOffsetLeft = getDragHandleOffsetLeft2;
__initData = {
code: "function QuestDockDragHandleTsx2(){const{windowDimensions,QUEST_DOCK_COLLAPSED_MAX_WIDTH}=this.__closure;return{width:Math.min(windowDimensions.get().width,QUEST_DOCK_COLLAPSED_MAX_WIDTH)};}"
};
__initData2 = {
code: "function QuestDockDragHandleTsx3(){const{getDragHandleOffsetLeft,activeQuestDockMode,questDockHorizontalGutterCollapsed,isVisualRefreshEnabled,QuestDockMode}=this.__closure;return{left:getDragHandleOffsetLeft(activeQuestDockMode.get(),questDockHorizontalGutterCollapsed),transform:[{translateY:isVisualRefreshEnabled&&activeQuestDockMode.get()!==QuestDockMode.CLOSED&&activeQuestDockMode.get()!==QuestDockMode.SOFT_DISMISSED?-4:0}]};}"
};
__initData3 = {
code: "function QuestDockDragHandleTsx4(){const{withSpring,isEnrolled,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS}=this.__closure;return{opacity:withSpring(isEnrolled||activeQuestDockMode.get()===QuestDockMode.CLOSED||activeQuestDockMode.get()===QuestDockMode.SOFT_DISMISSED?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS)};}"
};
__initData4 = {
code: "function QuestDockDragHandleTsx5(){const{withSpring,isEnrolled,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS}=this.__closure;return{opacity:withSpring(!isEnrolled&&activeQuestDockMode.get()!==QuestDockMode.CLOSED&&activeQuestDockMode.get()!==QuestDockMode.SOFT_DISMISSED?0.5:0,QUEST_DOCK_MODE_CHANGE_PHYSICS)};}"
};
const r54 = memo(function QuestDockDragHandle(props) {
let enabled;
const isExpanded = props.isExpanded;
const quest = useContext(QuestDockContext).quest;
const styles = useStyles();
const context = useContext(QuestDockGestureContext);
const { activeQuestDockMode, windowDimensions } = context;
const isEnrolled = quest.userStatus?.enrolledAt != null;
let c21047_2 = isEnrolled;
const youBarHorizontalMargin = useYouBarHorizontalMargin();
const n = () => ({
width: Math.min(windowDimensions.get().width, QUEST_DOCK_COLLAPSED_MAX_WIDTH)
});
n.__closure = {
windowDimensions,
QUEST_DOCK_COLLAPSED_MAX_WIDTH
};
n.__workletHash = 13640576219747;
n.__initData = __initData;
const animatedStyle = useAnimatedStyle(n);
enabled = useMobileVisualRefreshConfig({
location: "QuestDockDragHandle"
}).enabled;
const D = () => ({
left: activeQuestDockMode.get() !== QuestDockMode.EXPANDED ? -1 * youBarHorizontalMargin : 0,
transform: [{
translateY: enabled ? activeQuestDockMode.get() !== QuestDockMode.CLOSED ? activeQuestDockMode.get() !== QuestDockMode.SOFT_DISMISSED ? -4 : 0 : 0 : 0
}]
});
D.__closure = {
getDragHandleOffsetLeft,
activeQuestDockMode,
questDockHorizontalGutterCollapsed: youBarHorizontalMargin,
isVisualRefreshEnabled: enabled,
QuestDockMode
};
D.__workletHash = 2091098328770;
D.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(D);
const E = () => ({
opacity: _spring.withSpring(!c21047_2 && activeQuestDockMode.get() !== QuestDockMode.CLOSED ? activeQuestDockMode.get() === QuestDockMode.SOFT_DISMISSED ? 1 : 0 : 1, QUEST_DOCK_MODE_CHANGE_PHYSICS)
});
E.__closure = {
withSpring: _spring.withSpring,
isEnrolled,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS
};
E.__workletHash = 12299455640931;
E.__initData = __initData3;
const animatedStyle3 = useAnimatedStyle(E);
const h = () => ({
opacity: _spring.withSpring(!c21047_2 && activeQuestDockMode.get() !== QuestDockMode.CLOSED ? activeQuestDockMode.get() === QuestDockMode.SOFT_DISMISSED ? 0 : 0.5 : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS)
});
h.__closure = {
withSpring: _spring.withSpring,
isEnrolled,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS
};
h.__workletHash = 9632835517209;
h.__initData = __initData4;
return <ReanimatedNativeView style={[styles.dragHandleWrapper, animatedStyle]}>
<ReanimatedNativeView style={animatedStyle2} layout={dimensionsLayoutTransition}>
<ReanimatedNativeView style={[styles.dragHandleOverlay, useAnimatedStyle(h)]}>
<ActionSheetHeaderBar variant="overlay" accessibilityLabel={isExpanded ? intl.string(t["GQ+4bk"]) : intl.string(t.Yplnt6)} />
</ReanimatedNativeView>
<ReanimatedNativeView style={[styles.dragHandleOverlay, animatedStyle3]} pointerEvents="none" accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
<ActionSheetHeaderBar variant="default" />
</ReanimatedNativeView>
</ReanimatedNativeView>
</ReanimatedNativeView>;
});
export default r54;
@@ -0,0 +1,138 @@
// Metro module 14217 (f14218).
import { useContext, useEffect, memo, useCallback } from "react";
import { View } from "react-native";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode, QuestsExperimentLocations } from "../../QuestConstants";
import * as _QuestDockConstants from "./QuestDockConstants";
import { QUEST_DOCK_EXPANDED_HEIGHT, QUEST_DOCK_EXPANDED_PADDING_BOTTOM } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import useStateFromSharedValue from "../../../reanimated/native/useStateFromSharedValue";
import { useHasWatchVideoOnMobileTasks } from "../QuestHooks.native";
import openVideoQuestModal from "../VideoQuestModal/openVideoQuestModal";
import { QuestContent } from "../../QuestTypes";
import QuestBottomSheetHeader from "../QuestBottomSheet/QuestBottomSheetHeader";
import { QuestBottomSheetStep, QuestBottomSheetContent, useEnrolledQuestContentProps } from "../QuestBottomSheet/QuestBottomSheet";
import QuestBottomSheetFooter from "../QuestBottomSheet/QuestBottomSheetFooter";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { hasWatchVideoTasks } from "../../utils/QuestTaskUtils";
let useStyles, EnrolledBodyPlayStreamTask;
const EnrolledBodyWatchTask = function EnrolledBodyWatchTask(props) {
const quest = props.quest;
const styles = useStyles();
const context = useContext(QuestDockExternalCoordinationContext);
const { restingQuestDockMode, setRestingQuestDockMode } = context;
const questDockWrapperSpecs = useContext(QuestDockGestureContext).questDockWrapperSpecs;
const stateFromSharedValue = useStateFromSharedValue(restingQuestDockMode);
let c21044_3 = stateFromSharedValue;
const hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest.config);
useEffect(() => {
let _maybeOpenVideoQuestModal2 = function _maybeOpenVideoQuestModal() {
const r9 = async () => {
let c31720_0;
L17: {
c31720_0 = void 0;
if (questDockWrapperSpecs.get().prevDeltaY < 0 && c21044_3 === QuestDockMode.RESET_TO_PREVIOUS && QuestDockStore.prevRestingQuestDockMode === QuestDockMode.EXPANDED) {
await openVideoQuestModal({
questId: quest.id,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
(0, setRestingQuestDockMode)(QuestDockMode.COLLAPSED);
break L17;
}
return void 0;
}
};
_maybeOpenVideoQuestModal2 = r9;
return r9.apply(this, arguments);
};
if (hasWatchVideoOnMobileTasks) {
(function maybeOpenVideoQuestModal() {
return _maybeOpenVideoQuestModal2.apply(this, arguments);
})();
}
}, [stateFromSharedValue, questDockWrapperSpecs, quest.id, setRestingQuestDockMode, hasWatchVideoOnMobileTasks]);
return <>
<View style={styles.headerWrapper}>
<QuestBottomSheetHeader quest={quest} step={QuestBottomSheetStep.TASK_STATUS} withActionSheet location={QuestsExperimentLocations.QUESTS_BAR_MOBILE} />
</View>
<View style={styles.contentWrapper}>
<QuestBottomSheetContent quest={quest} location={QuestsExperimentLocations.QUESTS_BAR_MOBILE} step={QuestBottomSheetStep.TASK_STATUS} sourceQuestContent={QuestContent.QUEST_BAR_MOBILE} />
</View>
<View style={styles.footerWrapper}>
<QuestBottomSheetFooter quest={quest} step={QuestBottomSheetStep.TASK_STATUS} style={styles.footer} withSafeArea={false} sourceQuestContent={QuestContent.QUEST_BAR_MOBILE} />
</View>
</>;
};
EnrolledBodyPlayStreamTask = function EnrolledBodyPlayStreamTask(props) {
const quest2 = props.quest;
const styles = useStyles();
const enrolledQuestContentProps = useEnrolledQuestContentProps({
quest: quest2,
location: QuestsExperimentLocations.QUESTS_BAR_MOBILE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
const { step, defibrillator, stepActions } = enrolledQuestContentProps;
return <>
<View style={styles.headerWrapper}>
<QuestBottomSheetHeader quest={quest2} step={step} withActionSheet location={QuestsExperimentLocations.QUESTS_BAR_MOBILE} />
</View>
<View style={styles.contentWrapper}>
<QuestBottomSheetContent defibrillator={defibrillator} quest={quest2} handleTaskSelect={enrolledQuestContentProps.handleTaskSelect} location={QuestsExperimentLocations.QUESTS_BAR_MOBILE} showMicrophone={enrolledQuestContentProps.showMicrophone} step={step} sourceQuestContent={QuestContent.QUEST_BAR_MOBILE} />
</View>
<View style={styles.footerWrapper}>
<QuestBottomSheetFooter quest={quest2} step={step} isDefibrilating={defibrillator.isActive} onBack={stepActions.onBack} onDefib={defibrillator.start} onConnectConsoleNext={stepActions.onNext} style={styles.footer} withSafeArea={false} sourceQuestContent={QuestContent.QUEST_BAR_MOBILE} />
</View>
</>;
};
const { QUEST_DOCK_EXPANDED_ENROLLED_PADDING_TOP, QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL } = _QuestDockConstants;
useStyles = createStyles({
wrapper: {
flexGrow: 0,
flexShrink: 0,
paddingBottom: QUEST_DOCK_EXPANDED_PADDING_BOTTOM,
paddingTop: QUEST_DOCK_EXPANDED_ENROLLED_PADDING_TOP,
paddingHorizontal: QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL
},
headerWrapper: {
marginBottom: Module712.space.PX_16
},
contentWrapper: {
display: "flex",
gap: Module712.space.PX_16,
flexGrow: 0,
flexShrink: 0
},
footer: {
marginTop: Module712.space.PX_16
},
footerWrapper: {
marginLeft: -1 * QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL,
marginRight: -1 * QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL
}
});
const r66 = memo(function QuestDockEnrolledBody(props) {
const quest2 = props.quest;
const styles = useStyles();
const minExpandedContentHeight = useContext(QuestDockGestureContext).minExpandedContentHeight;
const bottom = useSafeAreaInsets_native().bottom;
const callback = useCallback((a0) => {
const height = a0.nativeEvent.layout.height;
if (minExpandedContentHeight.get() !== height) {
minExpandedContentHeight.set(height);
}
}, [minExpandedContentHeight]);
useEffect(() => () => {
if (minExpandedContentHeight.get() !== QUEST_DOCK_EXPANDED_HEIGHT) {
minExpandedContentHeight.set(QUEST_DOCK_EXPANDED_HEIGHT);
}
}, [minExpandedContentHeight]);
return <View style={[styles.wrapper, {
paddingBottom: Math.max(bottom, QUEST_DOCK_EXPANDED_PADDING_BOTTOM)
}]} onLayout={callback}>
{hasWatchVideoTasks(quest2) ? <EnrolledBodyWatchTask quest={quest2} /> : <EnrolledBodyPlayStreamTask quest={quest2} />}
</View>;
});
export default r66;
@@ -0,0 +1,55 @@
// Metro module 14214 (f14215).
import { memo, useContext } from "react";
import { View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import QuestDockContext from "./QuestDockContext";
import { useQuestTaskDetails, useTaskPlatformScreen } from "../../hooks/QuestHooks";
import { useQuestBarTitle, useQuestBarSubtitle } from "../../hooks/QuestCopyHooks";
import { QuestContent } from "../../QuestTypes";
import QuestProgressIndicator from "../QuestProgressIndicator";
import { Text } from "../../../../design/components/Text/native/Text";
const useStyles = createStyles({
wrapper: {
alignItems: "center",
display: "flex",
flexDirection: "row",
flexGrow: 1,
flexShrink: 1,
gap: 8,
justifyContent: "center",
padding: 8
},
progressIndicatorWrapper: {
flexGrow: 0,
flexShrink: 0
},
copy: {
flexGrow: 1,
flexShrink: 1
}
});
const r34 = memo(function QuestDockEnrolledHeader() {
const quest = useContext(QuestDockContext).quest;
const styles = useStyles();
const questTaskDetails = useQuestTaskDetails(quest);
const [activeScreen] = useTaskPlatformScreen(quest, questTaskDetails);
return <View style={styles.wrapper}>
<View style={styles.progressIndicatorWrapper}>
<QuestProgressIndicator quest={quest} size="x-sm" progress={questTaskDetails.percentComplete} loading={false} hasConfetti />
</View>
<View style={styles.copy}>
<Text variant="heading-md/semibold" color="mobile-text-heading-primary">
{useQuestBarTitle(quest)}
</Text>
<Text variant="text-sm/medium" color="text-muted">
{useQuestBarSubtitle({
quest,
isExpanded: false,
activeScreen,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
})}
</Text>
</View>
</View>;
});
export default r34;
@@ -0,0 +1,168 @@
// Metro module 14126 (f14127).
import { createContext, memo, useCallback, useMemo, useContext, useRef, useEffect } from "react";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD } from "./QuestDockConstants";
import Durations from "../../../../utils/Durations";
import { createFakeSharedValue } from "../../../reanimated/ReanimatedHelperTypes";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useSharedValue, useAnimatedReaction } from "../../../reanimated/ReanimatedRexport";
import { isSoftDismissed } from "./QuestDockUtils";
import { updatePrevRestingQuestDockMode } from "../../QuestActionCreators";
import * as _PlatformUtils from "../../../../utils/PlatformUtils";
let isAndroid, __initData, __initData2, __initData3;
let c9885_7 = 1 * Durations.Millis.SECOND;
const context = createContext({
restingQuestDockMode: createFakeSharedValue(QuestDockMode.COLLAPSED),
setRestingQuestDockMode: () => {},
lastScrollEventSourceId: createFakeSharedValue(null),
questDockOffset: createFakeSharedValue(0)
});
const r53 = memo(function QuestDockExternalCoordinationContextProviderInner(props) {
const sharedValue = useSharedValue(null);
const sharedValue2 = useSharedValue(0);
const sharedValue3 = useSharedValue(isSoftDismissed(QuestDockStore.questDockSoftDismissedAt) ? QuestDockMode.SOFT_DISMISSED : QuestDockMode.COLLAPSED);
const callback = useCallback((a0) => {
sharedValue2.set(0);
if (sharedValue3.get() !== a0) {
sharedValue3.set(a0);
}
if (a0 !== QuestDockMode.RESET_TO_PREVIOUS) {
updatePrevRestingQuestDockMode(a0);
}
}, [sharedValue3, sharedValue2]);
return <context.Provider value={useMemo(() => ({
lastScrollEventSourceId: sharedValue,
restingQuestDockMode: sharedValue3,
setRestingQuestDockMode: callback,
questDockOffset: sharedValue2
}), [sharedValue, sharedValue3, callback, sharedValue2])}>{props.children}</context.Provider>;
});
isAndroid = _PlatformUtils.isAndroid();
__initData = {
code: "function QuestDockExternalCoordinationContextTsx1(){const{restingQuestDockMode}=this.__closure;return restingQuestDockMode.get();}"
};
__initData2 = {
code: "function QuestDockExternalCoordinationContextTsx2(nextMode,prevMode){const{runOnJS,cancelReopenQuestDock}=this.__closure;if(nextMode!==prevMode){runOnJS(cancelReopenQuestDock)();}}"
};
__initData3 = {
code: "function QuestDockExternalCoordinationContextTsx3(contentOffsetY,contentHeight,layoutHeight){const{isScrollHandlerEnabled,restingQuestDockMode,QuestDockMode,lastContentOffsetY,lastScrollEventSourceId,id,runOnJS,cancelReopenQuestDock,IS_ANDROID,scheduleReopenQuestDock,setRestingQuestDockMode,QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD}=this.__closure;if(!isScrollHandlerEnabled.get())return;if(restingQuestDockMode.get()===QuestDockMode.SOFT_DISMISSED||restingQuestDockMode.get()===QuestDockMode.EXPANDED){return;}const lastContentOffsetYValue=lastContentOffsetY.get();lastContentOffsetY.set(contentOffsetY);if(lastContentOffsetYValue===contentOffsetY)return;const lastSourceId=lastScrollEventSourceId.get();if(id!=='guilds'){lastScrollEventSourceId.set(id);}const isFirstScrollEvent=id!=='guilds'&&id!==lastSourceId;if(isFirstScrollEvent)return;const isOverscrollingAtTop=contentOffsetY<0&&lastContentOffsetYValue<0;if(isOverscrollingAtTop){runOnJS(cancelReopenQuestDock)();return;}const hasLayoutData=layoutHeight!=null&&contentHeight!=null;const isOverscrollingAtBottom=hasLayoutData&&contentOffsetY+layoutHeight>=contentHeight;if(isOverscrollingAtBottom)return;const isScrolledToTop=contentOffsetY<=0&&(IS_ANDROID||lastContentOffsetYValue<=0);if(isScrolledToTop&&restingQuestDockMode.get()===QuestDockMode.CLOSED){if(IS_ANDROID){runOnJS(scheduleReopenQuestDock)();}else{runOnJS(setRestingQuestDockMode)(QuestDockMode.COLLAPSED);}return;}const isScrollingDown=contentOffsetY>lastContentOffsetYValue&&contentOffsetY>0&&lastContentOffsetYValue>0;const isScrollingUp=contentOffsetY<lastContentOffsetYValue;const scrollDistance=Math.abs(lastContentOffsetYValue-contentOffsetY);if(isScrollingDown&&restingQuestDockMode.get()===QuestDockMode.COLLAPSED){runOnJS(setRestingQuestDockMode)(QuestDockMode.CLOSED);}else if(isScrollingUp&&restingQuestDockMode.get()===QuestDockMode.CLOSED&&scrollDistance>=QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD){runOnJS(scheduleReopenQuestDock)();}}"
};
export { context as QuestDockExternalCoordinationContext };
export { r53 as QuestDockExternalCoordinationContextProvider };
export function useExternalScrollEventHandler({ id }) {
let callback3, sharedValue4, sharedValue5;
callback3 = void 0;
sharedValue4 = void 0;
sharedValue5 = void 0;
const context2 = useContext(context);
const { setRestingQuestDockMode: setRestingQuestDockMode2, restingQuestDockMode, lastScrollEventSourceId } = context2;
const ref = useRef(-1);
const callback2 = useCallback(() => {
if (ref.current !== -1) {
window.clearTimeout(ref.current);
}
ref.current = window.setTimeout(() => {
if (restingQuestDockMode.get() !== QuestDockMode.EXPANDED) {
setRestingQuestDockMode2(QuestDockMode.COLLAPSED);
}
}, 500);
}, [setRestingQuestDockMode2, restingQuestDockMode]);
callback3 = useCallback(() => {
if (ref.current !== -1) {
window.clearTimeout(ref.current);
}
}, []);
const D = () => restingQuestDockMode.get();
D.__closure = {
restingQuestDockMode
};
D.__workletHash = 14040596710288;
D.__initData = __initData;
const c = function c(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(callback3)();
}
};
c.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
cancelReopenQuestDock: callback3
};
c.__workletHash = 1848909508809;
c.__initData = __initData2;
useAnimatedReaction(D, c);
sharedValue4 = useSharedValue(0);
sharedValue5 = useSharedValue(false);
useEffect(() => {
let c27642_0 = setTimeout(() => {
sharedValue5.set(true);
}, c9885_7);
return () => {
clearTimeout(c27642_0);
};
}, [sharedValue5]);
const T = function T(a0, a1, a2) {
L32: {
if (sharedValue5.get() && restingQuestDockMode.get() !== QuestDockMode.SOFT_DISMISSED && restingQuestDockMode.get() !== QuestDockMode.EXPANDED) {
const r22 = sharedValue4.get();
sharedValue4.set(a0);
if (r22 !== a0) {
const r26 = lastScrollEventSourceId.get();
if (id !== "guilds") {
lastScrollEventSourceId.set(id);
}
if (id !== "guilds" && id !== r26) {
break L32;
}
if (a0 < 0 && r22 < 0) {
_ReanimatedRexport.runOnJS(callback3)();
break L32;
}
if (a2 != null && a1 != null && a0 + a2 >= a1) {
break L32;
}
L17: {
if (a0 <= 0) {
if (!isAndroid && !(r22 <= 0)) {
break L17;
}
if (restingQuestDockMode.get() === QuestDockMode.CLOSED) {
if (isAndroid) {
_ReanimatedRexport.runOnJS(callback2)();
break L32;
}
_ReanimatedRexport.runOnJS(setRestingQuestDockMode2)(QuestDockMode.COLLAPSED);
break L32;
}
}
}
const r40 = Math.abs(r22 - a0);
if (a0 > r22 && a0 > 0 && r22 > 0 && restingQuestDockMode.get() === QuestDockMode.COLLAPSED) {
_ReanimatedRexport.runOnJS(setRestingQuestDockMode2)(QuestDockMode.CLOSED);
break L32;
}
if (a0 < r22 && restingQuestDockMode.get() === QuestDockMode.CLOSED && r40 >= QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD) {
_ReanimatedRexport.runOnJS(callback2)();
}
}
}
}
};
T.__closure = {
isScrollHandlerEnabled: sharedValue5,
restingQuestDockMode,
QuestDockMode,
lastContentOffsetY: sharedValue4,
lastScrollEventSourceId,
id,
runOnJS: _ReanimatedRexport.runOnJS,
cancelReopenQuestDock: callback3,
IS_ANDROID: isAndroid,
scheduleReopenQuestDock: callback2,
setRestingQuestDockMode: setRestingQuestDockMode2,
QUEST_DOCK_EXTERNAL_SCROLL_DELTA_THRESHOLD
};
T.__workletHash = 9824540806898;
T.__initData = __initData3;
return useCallback(T, [id, sharedValue4, lastScrollEventSourceId, restingQuestDockMode, callback2, setRestingQuestDockMode2, callback3, sharedValue5]);
}
@@ -0,0 +1,64 @@
// Metro module 14123 (f14124).
import * as Module19 from "react";
import { createContext, useMemo, useEffect } from "react";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_COLLAPSED_HEIGHT, QUEST_DOCK_EXPANDED_HEIGHT } from "./QuestDockConstants";
import { createFakeSharedValue } from "../../../reanimated/ReanimatedHelperTypes";
import { getWindowDimensions } from "../../../screen/useWindowDimensions.native";
import { useSharedValue } from "../../../reanimated/ReanimatedRexport";
import { useYouBarHorizontalMargin } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarMargins";
import { getQuestDockCollapsedWidth, isSoftDismissed } from "./QuestDockUtils";
import subscribeToWindowDimensions_native from "../../../screen/subscribeToWindowDimensions.native";
const context = createContext({
questDockWrapperSpecs: createFakeSharedValue({
width: 0,
height: 0,
x: 0,
y: 0,
prevDeltaY: 0
}),
windowDimensions: createFakeSharedValue({
width: 0,
height: 0,
maxContentHeight: 0,
landscape: false
}),
activeQuestDockMode: createFakeSharedValue(QuestDockMode.COLLAPSED),
minExpandedContentHeight: createFakeSharedValue(0)
});
const r52 = Module19.memo(function QuestDockGestureContextProviderInner(props) {
const memo = useMemo(getWindowDimensions, []);
const sharedValue = useSharedValue({
width: memo.width,
height: memo.height,
landscape: memo.width > memo.height,
maxContentHeight: memo.height
});
const youBarHorizontalMargin = useYouBarHorizontalMargin();
const sharedValue2 = useSharedValue({
width: getQuestDockCollapsedWidth(memo.width, youBarHorizontalMargin, youBarHorizontalMargin),
height: QUEST_DOCK_COLLAPSED_HEIGHT,
x: 0,
y: -8,
prevDeltaY: 0
});
const sharedValue3 = useSharedValue(isSoftDismissed(QuestDockStore.questDockSoftDismissedAt) ? QuestDockMode.SOFT_DISMISSED : QuestDockMode.COLLAPSED);
const sharedValue4 = useSharedValue(QUEST_DOCK_EXPANDED_HEIGHT);
useEffect(() => subscribeToWindowDimensions_native(({ width, height }) => {
sharedValue.set({
width,
height,
landscape: width > height,
maxContentHeight: height
});
}), [sharedValue]);
return <context.Provider value={useMemo(() => ({
windowDimensions: sharedValue,
questDockWrapperSpecs: sharedValue2,
activeQuestDockMode: sharedValue3,
minExpandedContentHeight: sharedValue4
}), [sharedValue, sharedValue2, sharedValue3, sharedValue4])}>{props.children}</context.Provider>;
});
export { context as QuestDockGestureContext };
export { r52 as QuestDockGestureContextProvider };
@@ -0,0 +1,283 @@
// Metro module 14207 (f14208).
import * as Module19 from "react";
import { useContext, useEffect, useMemo } from "react";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_CLOSED_HEIGHT, QUEST_DOCK_COLLAPSED_HEIGHT, QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM, QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR, QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR, QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR, QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT, QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT, QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY, QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD, QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM, QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED } from "./QuestDockConstants";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import useSafeAreaInsetsSharedValue_native from "../../../safe_area/useSafeAreaInsetsSharedValue.native";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import QuestDockContext from "./QuestDockContext";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useSharedValue, useAnimatedReaction } from "../../../reanimated/ReanimatedRexport";
import { useYouBarTotalHeight } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarTotalHeight";
import { useYouBarHorizontalMargin } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarMargins";
import * as _Module5273 from "../../../../_bundle/Module5273";
import { Gesture, GestureDetector } from "../../../../_bundle/Module5273";
import * as _QuestDockUtils from "./QuestDockUtils";
import * as _HapticUtils_native from "../../../haptics/HapticUtils.native";
let __initData, __initData2, __initData3, __initData4, __initData5, __initData6;
const useQuestDockSwipeGesture = function useQuestDockSwipeGesture() {
const context = useContext(QuestDockGestureContext);
const { questDockWrapperSpecs, activeQuestDockMode, windowDimensions, minExpandedContentHeight } = context;
const safeArea = useSafeAreaInsetsSharedValue_native();
const context2 = useContext(QuestDockExternalCoordinationContext);
const { restingQuestDockMode, setRestingQuestDockMode, questDockOffset } = context2;
const isVisibleToUser = useContext(QuestDockContext).isVisibleToUser;
const sharedValue = useSharedValue({
absoluteX: 0,
absoluteY: 0,
x: 0,
y: 0,
height: 0,
isDrawer: restingQuestDockMode.get() === QuestDockMode.EXPANDED,
active: false
});
const sharedValue2 = useSharedValue(0);
const sharedValue3 = useSharedValue(isVisibleToUser);
const youBarTotalHeight = useYouBarTotalHeight();
const youBarHorizontalMargin = useYouBarHorizontalMargin();
useEffect(() => {
sharedValue3.set(isVisibleToUser);
}, [isVisibleToUser, sharedValue3]);
const memo = useMemo(() => {
const shouldCancelWhenOutside = Gesture.Pan().manualActivation(false).maxPointers(1).shouldCancelWhenOutside(false);
const I = function I(a0) {
sharedValue2.set(0);
sharedValue.set({
absoluteX: a0.changedTouches[0].absoluteX,
absoluteY: a0.changedTouches[0].absoluteY,
x: questDockWrapperSpecs.get().x,
y: questDockWrapperSpecs.get().y,
height: questDockWrapperSpecs.get().height,
isDrawer: restingQuestDockMode.get() === QuestDockMode.EXPANDED,
active: false
});
};
I.__closure = {
touchMoveCount: sharedValue2,
initialGestureOffset: sharedValue,
questDockWrapperSpecs,
restingQuestDockMode,
QuestDockMode
};
I.__workletHash = 15649211210155;
I.__initData = __initData4;
const r29 = shouldCancelWhenOutside.onTouchesDown(I);
const A = function A(a0) {
if (a0.state === _Module5273.State.BEGAN && !sharedValue.get().active) {
sharedValue2.set(sharedValue2.get() + 1);
const r2 = sharedValue2.get() <= QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD;
const r34 = a0.changedTouches[0];
const { absoluteY, absoluteX } = r34;
const r14 = sharedValue.get().absoluteY - absoluteY;
const r42 = Math.abs(r14);
if (!(restingQuestDockMode.get() === QuestDockMode.EXPANDED && r2 && r14 >= 0) && (restingQuestDockMode.get() === QuestDockMode.COLLAPSED && r14 > QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM || restingQuestDockMode.get() === QuestDockMode.EXPANDED && (r14 < -QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM || r14 > QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM) || restingQuestDockMode.get() === QuestDockMode.COLLAPSED && r14 < 0 && r42 > QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM || restingQuestDockMode.get() === QuestDockMode.CLOSED && r14 > 0 && r14 > QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM || restingQuestDockMode.get() === QuestDockMode.CLOSED && r14 < 0 && r42 > QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM)) {
sharedValue.set({
absoluteX,
absoluteY,
x: questDockWrapperSpecs.get().x,
y: questDockWrapperSpecs.get().y,
height: questDockWrapperSpecs.get().height,
isDrawer: restingQuestDockMode.get() === QuestDockMode.EXPANDED,
active: true
});
}
}
};
A.__closure = {
State: _Module5273.State,
initialGestureOffset: sharedValue,
touchMoveCount: sharedValue2,
QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD,
restingQuestDockMode,
QuestDockMode,
QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM,
QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM,
questDockWrapperSpecs
};
A.__workletHash = 16451041821957;
A.__initData = __initData3;
const r40 = r29.onTouchesMove(A);
const r42 = function(a0) {
const prevDeltaY = a0.absoluteY - sharedValue.get().absoluteY;
const r29 = minExpandedContentHeight.get();
const r33 = sharedValue.get().height - prevDeltaY;
const r15 = r33 > r29 && activeQuestDockMode.get() === QuestDockMode.EXPANDED ? r29 + (r33 - r29) * QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR : r33;
if (r15 >= (minExpandedContentHeight.get() > 0 ? Math.min(minExpandedContentHeight.get(), QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT) : QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT)) {
if (!sharedValue.get().isDrawer) {
sharedValue.set({
...sharedValue.get(),
isDrawer: true
});
}
questDockWrapperSpecs.set({
...questDockWrapperSpecs.get(),
x: 0,
y: youBarTotalHeight > 0 ? youBarTotalHeight : 0,
width: _QuestDockUtils.getQuestDockExpandedWidth(windowDimensions.get().width, safeArea.get().left, safeArea.get().right),
height: Math.min(r15, windowDimensions.get().height),
prevDeltaY
});
activeQuestDockMode.set(QuestDockMode.EXPANDED);
} else if (r15 < QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT) {
if (activeQuestDockMode.get() === QuestDockMode.CLOSED) {
const r157 = (1 - Math.min(r15, 0) / QUEST_DOCK_CLOSED_HEIGHT) * (QUEST_DOCK_CLOSED_HEIGHT - r15);
questDockWrapperSpecs.set({
...questDockWrapperSpecs.get(),
x: 0,
y: 0 < r157 ? r157 * QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR : 0,
width: _QuestDockUtils.getQuestDockClosedWidth(windowDimensions.get().width, safeArea.get().left, safeArea.get().right),
height: 0 < r157 ? QUEST_DOCK_CLOSED_HEIGHT : r15,
prevDeltaY
});
activeQuestDockMode.set(QuestDockMode.CLOSED);
}
} else {
const r62 = -1 * (r15 - QUEST_DOCK_COLLAPSED_HEIGHT) * (1 - r15 / QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT / QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR);
questDockOffset.set(youBarTotalHeight > 0 ? -Math.min(r62, 0) : 0);
if (sharedValue.get().isDrawer) {
sharedValue.set({
...sharedValue.get(),
isDrawer: false
});
}
if (QUEST_DOCK_COLLAPSED_HEIGHT !== questDockWrapperSpecs.get().height && activeQuestDockMode.get() !== QuestDockMode.EXPANDED) {
_ReanimatedRexport.runOnJS(_HapticUtils_native.triggerHapticFeedback)(_HapticUtils_native.HapticFeedbackTypes.IMPACT_MEDIUM);
}
questDockWrapperSpecs.set({
...questDockWrapperSpecs.get(),
x: 0,
y: -1 * QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED + (youBarTotalHeight > 0 ? Math.min(r62, 0) : r62),
width: _QuestDockUtils.getQuestDockCollapsedWidth(windowDimensions.get().width, youBarTotalHeight > 0 ? youBarHorizontalMargin : safeArea.get().left, youBarTotalHeight > 0 ? youBarHorizontalMargin : safeArea.get().right),
height: QUEST_DOCK_COLLAPSED_HEIGHT,
prevDeltaY
});
activeQuestDockMode.set(QuestDockMode.COLLAPSED);
}
};
r42.__closure = {
initialGestureOffset: sharedValue,
minExpandedContentHeight,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR,
QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT,
questDockWrapperSpecs,
youBarHeight: youBarTotalHeight,
getQuestDockExpandedWidth: _QuestDockUtils.getQuestDockExpandedWidth,
windowDimensions,
safeArea,
QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT,
QUEST_DOCK_CLOSED_HEIGHT,
QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR,
getQuestDockClosedWidth: _QuestDockUtils.getQuestDockClosedWidth,
QUEST_DOCK_COLLAPSED_HEIGHT,
QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR,
questDockOffset,
runOnJS: _ReanimatedRexport.runOnJS,
triggerHapticFeedback: _HapticUtils_native.triggerHapticFeedback,
HapticFeedbackTypes: _HapticUtils_native.HapticFeedbackTypes,
QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED,
getQuestDockCollapsedWidth: _QuestDockUtils.getQuestDockCollapsedWidth,
youBarHorizontalMargin
};
r42.__workletHash = 3375221025411;
r42.__initData = __initData2;
const r79 = r40.onChange(r42);
const t = function t(a0) {
let r7, r8, SOFT_DISMISSED;
L25: {
const velocityY = a0.velocityY;
r7 = a0.y;
const r10 = Math.abs(velocityY);
r8 = Math.abs(r7);
if (!(r10 > QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY && velocityY < 0) && !(r10 < QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY && sharedValue.get().isDrawer)) {
L7: {
if (restingQuestDockMode.get() === QuestDockMode.COLLAPSED) {
if (!(velocityY > QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY) && !(r7 > QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT)) {
break L7;
}
SOFT_DISMISSED = QuestDockMode.SOFT_DISMISSED;
break L25;
}
}
if (!(velocityY > QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY && restingQuestDockMode.get() !== QuestDockMode.COLLAPSED) && !(velocityY < 0 && (r10 > QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY && restingQuestDockMode.get() === QuestDockMode.CLOSED))) {
if (restingQuestDockMode.get() !== QuestDockMode.COLLAPSED && restingQuestDockMode.get() !== QuestDockMode.CLOSED) {
SOFT_DISMISSED = QuestDockMode.COLLAPSED;
break L25;
}
SOFT_DISMISSED = QuestDockMode.RESET_TO_PREVIOUS;
break L25;
}
SOFT_DISMISSED = QuestDockMode.COLLAPSED;
} else {
SOFT_DISMISSED = restingQuestDockMode.get() === QuestDockMode.EXPANDED ? QuestDockMode.RESET_TO_PREVIOUS : QuestDockMode.EXPANDED;
}
}
if (restingQuestDockMode.get() === QuestDockMode.CLOSED && SOFT_DISMISSED !== QuestDockMode.EXPANDED && r7 < 0 && r8 > QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT) {
SOFT_DISMISSED = QuestDockMode.COLLAPSED;
}
_ReanimatedRexport.runOnJS(setRestingQuestDockMode)(SOFT_DISMISSED);
};
t.__closure = {
QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY,
restingQuestDockMode,
QuestDockMode,
initialGestureOffset: sharedValue,
QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT,
runOnJS: _ReanimatedRexport.runOnJS,
setRestingQuestDockMode
};
t.__workletHash = 10107537449160;
t.__initData = __initData;
return r79.onEnd(t);
}, [restingQuestDockMode, sharedValue, safeArea, sharedValue2, windowDimensions, questDockWrapperSpecs, setRestingQuestDockMode, activeQuestDockMode, minExpandedContentHeight, youBarTotalHeight, youBarHorizontalMargin, questDockOffset]);
const V = () => ({
mode: activeQuestDockMode.get(),
isVisible: sharedValue3.get()
});
V.__closure = {
activeQuestDockMode,
isVisibleSharedValue: sharedValue3
};
V.__workletHash = 13629688537260;
V.__initData = __initData5;
const F = function F(a0, a1) {
if (a0.mode !== a1?.mode && a0.mode !== QuestDockMode.CLOSED && a1?.mode !== QuestDockMode.CLOSED && a0.isVisible) {
_ReanimatedRexport.runOnJS(_HapticUtils_native.triggerHapticFeedback)(_HapticUtils_native.HapticFeedbackTypes.IMPACT_MEDIUM);
}
};
F.__closure = {
QuestDockMode,
runOnJS: _ReanimatedRexport.runOnJS,
triggerHapticFeedback: _HapticUtils_native.triggerHapticFeedback,
HapticFeedbackTypes: _HapticUtils_native.HapticFeedbackTypes
};
F.__workletHash = 17417080823410;
F.__initData = __initData6;
useAnimatedReaction(V, F);
return memo;
};
__initData = {
code: "function QuestDockGestureDetectorTsx1(event){const{QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY,restingQuestDockMode,QuestDockMode,initialGestureOffset,QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT,runOnJS,setRestingQuestDockMode}=this.__closure;const{velocityY:velocityY,y:y}=event;const absoluteVelocityY=Math.abs(velocityY);const absoluteY=Math.abs(y);let resultingDockMode;if(absoluteVelocityY>QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY&&velocityY<0){if(restingQuestDockMode.get()===QuestDockMode.EXPANDED){resultingDockMode=QuestDockMode.RESET_TO_PREVIOUS;}else{resultingDockMode=QuestDockMode.EXPANDED;}}else if(absoluteVelocityY<QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY&&initialGestureOffset.get().isDrawer){if(restingQuestDockMode.get()===QuestDockMode.EXPANDED){resultingDockMode=QuestDockMode.RESET_TO_PREVIOUS;}else{resultingDockMode=QuestDockMode.EXPANDED;}}else if(restingQuestDockMode.get()===QuestDockMode.COLLAPSED&&(velocityY>QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY||y>QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT)){resultingDockMode=QuestDockMode.SOFT_DISMISSED;}else if(velocityY>QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY&&restingQuestDockMode.get()!==QuestDockMode.COLLAPSED){resultingDockMode=QuestDockMode.COLLAPSED;}else if(velocityY<0&&absoluteVelocityY>QUEST_DOCK_GESTURE_MODE_TRANSITION_VELOCITY&&restingQuestDockMode.get()===QuestDockMode.CLOSED){resultingDockMode=QuestDockMode.COLLAPSED;}else{if(restingQuestDockMode.get()===QuestDockMode.COLLAPSED||restingQuestDockMode.get()===QuestDockMode.CLOSED){resultingDockMode=QuestDockMode.RESET_TO_PREVIOUS;}else{resultingDockMode=QuestDockMode.COLLAPSED;}}if(restingQuestDockMode.get()===QuestDockMode.CLOSED&&resultingDockMode!==QuestDockMode.EXPANDED&&y<0&&absoluteY>QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT){resultingDockMode=QuestDockMode.COLLAPSED;}runOnJS(setRestingQuestDockMode)(resultingDockMode);}"
};
__initData2 = {
code: "function QuestDockGestureDetectorTsx2(event){const{initialGestureOffset,minExpandedContentHeight,activeQuestDockMode,QuestDockMode,QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR,QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT,questDockWrapperSpecs,youBarHeight,getQuestDockExpandedWidth,windowDimensions,safeArea,QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT,QUEST_DOCK_CLOSED_HEIGHT,QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR,getQuestDockClosedWidth,QUEST_DOCK_COLLAPSED_HEIGHT,QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR,questDockOffset,runOnJS,triggerHapticFeedback,HapticFeedbackTypes,QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED,getQuestDockCollapsedWidth,youBarHorizontalMargin}=this.__closure;const deltaY=event.absoluteY-initialGestureOffset.get().absoluteY;const expandedContentHeight=minExpandedContentHeight.get();let nextHeight=initialGestureOffset.get().height-deltaY;if(nextHeight>expandedContentHeight&&activeQuestDockMode.get()===QuestDockMode.EXPANDED){const overage=nextHeight-expandedContentHeight;const additionalHeight=overage*QUEST_DOCK_GESTURE_EXPANDED_EXCESS_HEIGHT_FACTOR;nextHeight=expandedContentHeight+additionalHeight;}const expandedModeTransitionHeight=minExpandedContentHeight.get()>0?Math.min(minExpandedContentHeight.get(),QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT):QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT;if(nextHeight>=expandedModeTransitionHeight){if(!initialGestureOffset.get().isDrawer){initialGestureOffset.set({...initialGestureOffset.get(),isDrawer:true});}questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:youBarHeight>0?youBarHeight:0,width:getQuestDockExpandedWidth(windowDimensions.get().width,safeArea.get().left,safeArea.get().right),height:Math.min(nextHeight,windowDimensions.get().height),prevDeltaY:deltaY});activeQuestDockMode.set(QuestDockMode.EXPANDED);}else if(nextHeight<QUEST_DOCK_GESTURE_MODE_CLOSED_TRANSITION_HEIGHT){if(activeQuestDockMode.get()===QuestDockMode.CLOSED){const progress=1-Math.min(nextHeight,0)/QUEST_DOCK_CLOSED_HEIGHT;const newChange=progress*(QUEST_DOCK_CLOSED_HEIGHT-nextHeight);const nextY=newChange*QUEST_DOCK_GESTURE_CLOSED_Y_OFFSET_FACTOR;const isDraggingDown=newChange>0;questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:isDraggingDown?nextY:0,width:getQuestDockClosedWidth(windowDimensions.get().width,safeArea.get().left,safeArea.get().right),height:isDraggingDown?QUEST_DOCK_CLOSED_HEIGHT:nextHeight,prevDeltaY:deltaY});activeQuestDockMode.set(QuestDockMode.CLOSED);}}else{const progress=nextHeight/QUEST_DOCK_GESTURE_MODE_TRANSITION_HEIGHT;const yOffset=(nextHeight-QUEST_DOCK_COLLAPSED_HEIGHT)*-1;const newChange=yOffset*(1-progress/QUEST_DOCK_GESTURE_COLLAPSED_Y_OFFSET_FACTOR);questDockOffset.set(youBarHeight>0?-Math.min(newChange,0):0);if(initialGestureOffset.get().isDrawer){initialGestureOffset.set({...initialGestureOffset.get(),isDrawer:false});}if(QUEST_DOCK_COLLAPSED_HEIGHT!==questDockWrapperSpecs.get().height&&activeQuestDockMode.get()!==QuestDockMode.EXPANDED){runOnJS(triggerHapticFeedback)(HapticFeedbackTypes.IMPACT_MEDIUM);}questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED*-1+(youBarHeight>0?Math.min(newChange,0):newChange),width:getQuestDockCollapsedWidth(windowDimensions.get().width,youBarHeight>0?youBarHorizontalMargin:safeArea.get().left,youBarHeight>0?youBarHorizontalMargin:safeArea.get().right),height:QUEST_DOCK_COLLAPSED_HEIGHT,prevDeltaY:deltaY});activeQuestDockMode.set(QuestDockMode.COLLAPSED);}}"
};
__initData3 = {
code: "function QuestDockGestureDetectorTsx3(event){const{State,initialGestureOffset,touchMoveCount,QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD,restingQuestDockMode,QuestDockMode,QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM,QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM,questDockWrapperSpecs}=this.__closure;if(event.state!==State.BEGAN||initialGestureOffset.get().active){return;}touchMoveCount.set(touchMoveCount.get()+1);const isDragging=touchMoveCount.get()<=QUEST_DOCK_GESTURE_TOUCH_MOVE_COUNT_THRESHOLD;const{absoluteY:absoluteY,absoluteX:absoluteX}=event.changedTouches[0];const computed=initialGestureOffset.get().absoluteY-absoluteY;const computedAbsolute=Math.abs(computed);if(restingQuestDockMode.get()===QuestDockMode.EXPANDED&&isDragging&&computed>=0){return;}if(restingQuestDockMode.get()===QuestDockMode.COLLAPSED&&computed>QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM||restingQuestDockMode.get()===QuestDockMode.EXPANDED&&(computed<-QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM||computed>QUEST_DOCK_GESTURE_VERTICAL_DELTA_MINIMUM)||restingQuestDockMode.get()===QuestDockMode.COLLAPSED&&computed<0&&computedAbsolute>QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM||restingQuestDockMode.get()===QuestDockMode.CLOSED&&computed>0&&computed>QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM||restingQuestDockMode.get()===QuestDockMode.CLOSED&&computed<0&&computedAbsolute>QUEST_DOCK_GESTURE_CLOSED_VERTICAL_DELTA_MINIMUM){initialGestureOffset.set({absoluteX:absoluteX,absoluteY:absoluteY,x:questDockWrapperSpecs.get().x,y:questDockWrapperSpecs.get().y,height:questDockWrapperSpecs.get().height,isDrawer:restingQuestDockMode.get()===QuestDockMode.EXPANDED,active:true});}}"
};
__initData4 = {
code: "function QuestDockGestureDetectorTsx4(event){const{touchMoveCount,initialGestureOffset,questDockWrapperSpecs,restingQuestDockMode,QuestDockMode}=this.__closure;touchMoveCount.set(0);initialGestureOffset.set({absoluteX:event.changedTouches[0].absoluteX,absoluteY:event.changedTouches[0].absoluteY,x:questDockWrapperSpecs.get().x,y:questDockWrapperSpecs.get().y,height:questDockWrapperSpecs.get().height,isDrawer:restingQuestDockMode.get()===QuestDockMode.EXPANDED,active:false});}"
};
__initData5 = {
code: "function QuestDockGestureDetectorTsx5(){const{activeQuestDockMode,isVisibleSharedValue}=this.__closure;return{mode:activeQuestDockMode.get(),isVisible:isVisibleSharedValue.get()};}"
};
__initData6 = {
code: "function QuestDockGestureDetectorTsx6(current,previous){const{QuestDockMode,runOnJS,triggerHapticFeedback,HapticFeedbackTypes}=this.__closure;if(current.mode===(previous===null||previous===void 0?void 0:previous.mode)||current.mode===QuestDockMode.CLOSED||(previous===null||previous===void 0?void 0:previous.mode)===QuestDockMode.CLOSED||!current.isVisible){return;}runOnJS(triggerHapticFeedback)(HapticFeedbackTypes.IMPACT_MEDIUM);}"
};
const r44 = Module19.memo(function QuestDockGestureDetector(props) {
return <GestureDetector gesture={useQuestDockSwipeGesture()}>{props.children}</GestureDetector>;
});
export default r44;
export { useQuestDockSwipeGesture };
@@ -0,0 +1,204 @@
// Metro module 14119 (f14120).
import { useContext, useMemo, useEffect, useCallback } from "react";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_CLOSED_HEIGHT, QUEST_DOCK_COLLAPSED_HEIGHT, QUEST_DOCK_EXTERNAL_OFFSET_CLOSED, QUEST_DOCK_EXTERNAL_OFFSET_COLLAPSED_WITH_YOU_BAR, QUEST_DOCK_EXTERNAL_OFFSET_EXPANDED_WITH_YOU_BAR, QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED } from "./QuestDockConstants";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import useSafeAreaInsetsSharedValue_native from "../../../safe_area/useSafeAreaInsetsSharedValue.native";
import { useYouBarHorizontalMargin } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarMargins";
import { useYouBarTotalHeight } from "../../../main_tabs_v2/native/you_bar/hooks/useYouBarTotalHeight";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useAnimatedReaction } from "../../../reanimated/ReanimatedRexport";
import * as _cheapWorkletShallowEqual from "../../../reanimated/native/cheapWorkletShallowEqual";
import * as _QuestDockUtils from "./QuestDockUtils";
import { isSoftDismissed } from "./QuestDockUtils";
import { useStateFromStoresArray } from "../../../../_bundle/Module589";
import Durations from "../../../../utils/Durations";
import { useTrackQuestContentClickedWithImpression } from "../../lib/analytics/AnalyticsHooks";
import { useQuestImpressionId } from "../../lib/analytics/ContentImpressionTrackerHooks";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../../_bundle/Module6013";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../QuestTypes";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
const __initData = {
code: "function QuestDockHooksTsx1(){const{restingQuestDockMode,minExpandedContentHeight,windowDimensions,safeArea}=this.__closure;return{restingQuestDockMode:restingQuestDockMode.get(),minExpandedContentHeight:minExpandedContentHeight.get(),windowWidth:windowDimensions.get().width,windowHeight:windowDimensions.get().height,safeArea:safeArea.get()};}"
};
const __initData2 = {
code: "function QuestDockHooksTsx2(props,previous){const{cheapWorkletShallowEqual,QuestDockMode,runOnJS,setRestingQuestDockMode,questDockWrapperSpecs,getQuestDockCollapsedWidth,youBarHorizontalMargin,QUEST_DOCK_COLLAPSED_HEIGHT,activeQuestDockMode,getQuestDockClosedWidth,QUEST_DOCK_CLOSED_HEIGHT,getQuestDockExpandedHeightLimits,youBarHeight,QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED,getQuestDockExpandedWidth}=this.__closure;var _previous$restingQues;if(cheapWorkletShallowEqual(props,previous!==null&&previous!==void 0?previous:undefined))return;const{restingQuestDockMode:restingQuestDockMode,minExpandedContentHeight:minExpandedContentHeight,windowWidth:windowWidth,windowHeight:windowHeight,safeArea:safeArea}=props;switch(restingQuestDockMode){case QuestDockMode.RESET_TO_PREVIOUS:runOnJS(setRestingQuestDockMode)((_previous$restingQues=previous===null||previous===void 0?void 0:previous.restingQuestDockMode)!==null&&_previous$restingQues!==void 0?_previous$restingQues:QuestDockMode.COLLAPSED);return;case QuestDockMode.COLLAPSED:questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:0,width:getQuestDockCollapsedWidth(windowWidth,youBarHorizontalMargin,youBarHorizontalMargin),height:QUEST_DOCK_COLLAPSED_HEIGHT});activeQuestDockMode.set(QuestDockMode.COLLAPSED);break;case QuestDockMode.CLOSED:case QuestDockMode.SOFT_DISMISSED:questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:0,width:getQuestDockClosedWidth(windowWidth,youBarHorizontalMargin,youBarHorizontalMargin),height:QUEST_DOCK_CLOSED_HEIGHT});activeQuestDockMode.set(restingQuestDockMode);break;case QuestDockMode.EXPANDED:const minContentHeight=minExpandedContentHeight;const{minHeight:minHeight,maxHeight:maxHeight}=getQuestDockExpandedHeightLimits(windowHeight,safeArea.top,minContentHeight);const heightMidpoint=(maxHeight+minHeight)/2;let height;if(questDockWrapperSpecs.get().height<=QUEST_DOCK_COLLAPSED_HEIGHT){height=maxHeight;}else if(previous!=null&&questDockWrapperSpecs.get().height===getQuestDockExpandedHeightLimits(previous.windowHeight,previous.safeArea.top,minContentHeight).maxHeight){height=maxHeight;}else if(questDockWrapperSpecs.get().height>=heightMidpoint){height=maxHeight;}else{height=maxHeight;}questDockWrapperSpecs.set({...questDockWrapperSpecs.get(),x:0,y:youBarHeight>0?youBarHeight:QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED,width:getQuestDockExpandedWidth(windowWidth,safeArea.left,safeArea.right),height:height});activeQuestDockMode.set(QuestDockMode.EXPANDED);break;}}"
};
export function useQuestDockModeAnimatedReaction() {
const context = useContext(QuestDockGestureContext);
const { questDockWrapperSpecs, windowDimensions, activeQuestDockMode, minExpandedContentHeight } = context;
const context2 = useContext(QuestDockExternalCoordinationContext);
const { restingQuestDockMode, setRestingQuestDockMode } = context2;
const safeAreaInsetsSharedValue_native = useSafeAreaInsetsSharedValue_native();
let c20926_6 = safeAreaInsetsSharedValue_native;
const youBarHorizontalMargin = useYouBarHorizontalMargin();
const youBarTotalHeight = useYouBarTotalHeight();
const r39 = () => ({
restingQuestDockMode: restingQuestDockMode.get(),
minExpandedContentHeight: minExpandedContentHeight.get(),
windowWidth: windowDimensions.get().width,
windowHeight: windowDimensions.get().height,
safeArea: c20926_6.get()
});
r39.__closure = {
restingQuestDockMode,
minExpandedContentHeight,
windowDimensions,
safeArea: safeAreaInsetsSharedValue_native
};
r39.__workletHash = 9502251090521;
r39.__initData = __initData;
const t = function t(a0, a1) {
const r26 = a1 == null ? void 0 : a1;
L24: {
if (!_cheapWorkletShallowEqual.cheapWorkletShallowEqual(a0, r26)) {
const { restingQuestDockMode: restingQuestDockMode2, minExpandedContentHeight: minExpandedContentHeight2, windowWidth, windowHeight, safeArea } = a0;
if (QuestDockMode.RESET_TO_PREVIOUS === restingQuestDockMode2) {
const r114 = _ReanimatedRexport.runOnJS(setRestingQuestDockMode);
let r116 = a1?.restingQuestDockMode;
if (r116 == null) {
r116 = QuestDockMode.COLLAPSED;
}
r114(r116);
return void 0;
}
if (QuestDockMode.COLLAPSED === restingQuestDockMode2) {
questDockWrapperSpecs.set({
...questDockWrapperSpecs.get(),
x: 0,
y: 0,
width: _QuestDockUtils.getQuestDockCollapsedWidth(windowWidth, youBarHorizontalMargin, youBarHorizontalMargin),
height: QUEST_DOCK_COLLAPSED_HEIGHT
});
activeQuestDockMode.set(QuestDockMode.COLLAPSED);
} else {
if (QuestDockMode.CLOSED !== restingQuestDockMode2 && QuestDockMode.SOFT_DISMISSED !== restingQuestDockMode2) {
if (QuestDockMode.EXPANDED !== restingQuestDockMode2) {
break L24;
}
const questDockExpandedHeightLimits = _QuestDockUtils.getQuestDockExpandedHeightLimits(windowHeight, safeArea.top, minExpandedContentHeight2);
questDockExpandedHeightLimits.minHeight;
const maxHeight = questDockExpandedHeightLimits.maxHeight;
if (!(questDockWrapperSpecs.get().height <= QUEST_DOCK_COLLAPSED_HEIGHT || a1 != null && questDockWrapperSpecs.get().height === _QuestDockUtils.getQuestDockExpandedHeightLimits(a1.windowHeight, a1.safeArea.top, minExpandedContentHeight2).maxHeight)) {
questDockWrapperSpecs.get().height;
}
const r58 = {
...questDockWrapperSpecs.get(),
x: 0
};
let r61 = youBarTotalHeight;
if (!(youBarTotalHeight > 0)) {
r61 = QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED;
}
r58.y = r61;
r58.width = _QuestDockUtils.getQuestDockExpandedWidth(windowWidth, safeArea.left, safeArea.right);
r58.height = maxHeight;
questDockWrapperSpecs.set(r58);
activeQuestDockMode.set(QuestDockMode.EXPANDED);
break L24;
}
questDockWrapperSpecs.set({
...questDockWrapperSpecs.get(),
x: 0,
y: 0,
width: _QuestDockUtils.getQuestDockClosedWidth(windowWidth, youBarHorizontalMargin, youBarHorizontalMargin),
height: QUEST_DOCK_CLOSED_HEIGHT
});
activeQuestDockMode.set(restingQuestDockMode2);
}
}
}
};
t.__closure = {
cheapWorkletShallowEqual: _cheapWorkletShallowEqual.cheapWorkletShallowEqual,
QuestDockMode,
runOnJS: _ReanimatedRexport.runOnJS,
setRestingQuestDockMode,
questDockWrapperSpecs,
getQuestDockCollapsedWidth: _QuestDockUtils.getQuestDockCollapsedWidth,
youBarHorizontalMargin,
QUEST_DOCK_COLLAPSED_HEIGHT,
activeQuestDockMode,
getQuestDockClosedWidth: _QuestDockUtils.getQuestDockClosedWidth,
QUEST_DOCK_CLOSED_HEIGHT,
getQuestDockExpandedHeightLimits: _QuestDockUtils.getQuestDockExpandedHeightLimits,
youBarHeight: youBarTotalHeight,
QUEST_DOCK_VERTICAL_EDGE_GUTTER_EXPANDED,
getQuestDockExpandedWidth: _QuestDockUtils.getQuestDockExpandedWidth
};
t.__workletHash = 2510234714195;
t.__initData = __initData2;
useAnimatedReaction(r39, t);
}
export function useQuestDockExternalOffset() {
let c20927_0, c20927_1;
const [r15, r16] = useStateFromStoresArray([QuestDockStore], () => [QuestDockStore.prevRestingQuestDockMode, QuestDockStore.isEligibleToBeVisible]);
c20927_0 = r15;
c20927_1 = r16;
return useMemo(() => {
if (c20927_1) {
if (QuestDockMode.COLLAPSED === c20927_0) {
return QUEST_DOCK_EXTERNAL_OFFSET_COLLAPSED_WITH_YOU_BAR;
}
if (QuestDockMode.EXPANDED === c20927_0) {
return QUEST_DOCK_EXTERNAL_OFFSET_EXPANDED_WITH_YOU_BAR;
}
if (QuestDockMode.CLOSED !== c20927_0 && QuestDockMode.SOFT_DISMISSED !== c20927_0) {
return 0;
}
return QUEST_DOCK_EXTERNAL_OFFSET_CLOSED;
}
return 0;
}, [r16, r15]);
}
export function useQuestDockDismissalReset() {
const setRestingQuestDockMode2 = useContext(QuestDockExternalCoordinationContext).setRestingQuestDockMode;
const activeQuestDockMode2 = useContext(QuestDockGestureContext).activeQuestDockMode;
useEffect(() => {
if (!(activeQuestDockMode2.get() !== QuestDockMode.SOFT_DISMISSED || isSoftDismissed(QuestDockStore.questDockSoftDismissedAt))) {
setRestingQuestDockMode2(QuestDockMode.COLLAPSED);
}
let c27641_0 = setInterval(function maybeResetSoftDismissal() {
if (!(activeQuestDockMode2.get() !== QuestDockMode.SOFT_DISMISSED || isSoftDismissed(QuestDockStore.questDockSoftDismissedAt))) {
setRestingQuestDockMode2(QuestDockMode.COLLAPSED);
}
}, 5 * Durations.Millis.MINUTE);
return () => {
clearInterval(c27641_0);
};
}, [setRestingQuestDockMode2, activeQuestDockMode2]);
}
export function useActionSheetPressHandler(a0) {
const quest = a0;
const trackQuestContentClickedWithImpression = useTrackQuestContentClickedWithImpression();
const questImpressionId = useQuestImpressionId();
return useCallback(() => {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_dock_action_sheet")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.QUEST,
adCreativeId: quest.id,
questContentCTA: QuestContentCTA.OPEN_CONTEXT_MENU,
surfaceId: QuestContent.QUEST_BAR_MOBILE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE,
impressionId: questImpressionId
});
} else {
trackQuestContentClickedWithImpression({
questId: quest.id,
questContent: QuestContent.QUEST_BAR_MOBILE,
questContentCTA: QuestContentCTA.OPEN_CONTEXT_MENU,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
}
ActionSheetActionCreators.openLazy(import("./QuestDockContextMenuActionSheet"), "QuestDockContextMenuActionSheet", {
quest
});
}, [a0, trackQuestContentClickedWithImpression, questImpressionId]);
}
@@ -0,0 +1,52 @@
// Metro module 14120 (f14121).
import { QuestDockMode } from "../../QuestConstants";
import Module589 from "../../../../_bundle/Module589";
import { isSoftDismissed } from "./QuestDockUtils";
import Dispatcher from "../../../../Dispatcher";
let isEligibleToBeVisible2 = false;
let COLLAPSED = QuestDockMode.COLLAPSED;
let questDockSoftDismissedAt2 = null;
isEligibleToBeVisible2 = false;
class QuestDockStore extends Module589.PersistedStore {
static displayName = "QuestDockStore";
static persistKey = "QuestDockStore";
initialize(a0) {
if (a0 != null) {
questDockSoftDismissedAt2 = a0.questDockSoftDismissedAt;
COLLAPSED = isSoftDismissed(questDockSoftDismissedAt2) ? QuestDockMode.SOFT_DISMISSED : QuestDockMode.COLLAPSED;
}
}
getState() {
return {
prevRestingQuestDockMode: COLLAPSED,
questDockSoftDismissedAt: questDockSoftDismissedAt2
};
}
get prevRestingQuestDockMode() {
return COLLAPSED;
}
get questDockSoftDismissedAt() {
return questDockSoftDismissedAt2;
}
get isEligibleToBeVisible() {
return isEligibleToBeVisible2;
}
}
const questDockStore = new QuestDockStore(Dispatcher, {
QUESTS_PREV_RESTING_QUEST_DOCK_MODE_UPDATE: function handlePrevRestingQuestDockModeUpdate(a0) {
const r0 = a0.mode !== COLLAPSED;
COLLAPSED = a0.mode;
if (r0) {
questDockSoftDismissedAt2 = a0.mode === QuestDockMode.SOFT_DISMISSED ? Date.now() : null;
}
return r0;
},
QUESTS_DOCK_RESET_SOFT_DISMISSAL: function handleResetSoftDismissal() {
COLLAPSED = QuestDockMode.COLLAPSED;
questDockSoftDismissedAt2 = null;
},
QUESTS_DOCK_VISIBILITY_ELIGIBILITY_UPDATE: function handleQuestDockEligibilityUpdate(a0) {
isEligibleToBeVisible2 = a0.isEligibleToBeVisible;
}
});
export default questDockStore;
@@ -0,0 +1,138 @@
// Metro module 14218 (f14219).
import * as Module19 from "react";
import { useContext, useMemo, useState, useEffect, useCallback } from "react";
import { AppState, StyleSheet } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED, QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED, QUEST_DOCK_EXPANDED_HEIGHT } from "./QuestDockConstants";
import { VerticalGradient } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import QuestDockContext from "./QuestDockContext";
import { useQuestDockHeroAsset } from "../QuestHooks.native";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import useStateFromSharedValue from "../../../reanimated/native/useStateFromSharedValue";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useToken } from "../../../../design/tokens/native/useToken";
import Module712 from "../../../../_bundle/Module712";
import Module689 from "../../../../_bundle/Module689";
import { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import { isIOS, isAndroid } from "../../../../utils/PlatformUtils";
import { isHeroVideoSupported } from "../QuestUtils.native";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import { VideoComponent } from "../../../../components_native/common/Video";
import FastImage from "../../../../components_native/common/FastImage";
import Module4611 from "../../../../_bundle/Module4611";
const useStyles = createStyles({
backgroundWrapper: {
...StyleSheet.absoluteFillObject,
right: void 0,
bottom: void 0,
height: QUEST_DOCK_EXPANDED_HEIGHT,
zIndex: 1
},
backgroundHeroAsset: {
...StyleSheet.absoluteFillObject,
height: QUEST_DOCK_EXPANDED_HEIGHT,
resizeMode: "cover"
},
backgroundHeroAssetVideo: {
...StyleSheet.absoluteFillObject
},
backgroundGradient: {
...StyleSheet.absoluteFillObject,
height: QUEST_DOCK_EXPANDED_HEIGHT
}
});
const __initData = {
code: "function QuestDockUnenrolledBackgroundTsx1(){const{withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,windowDimensions}=this.__closure;return{transform:[{translateX:withSpring(activeQuestDockMode.get()===QuestDockMode.COLLAPSED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED*-1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)},{translateY:withSpring(activeQuestDockMode.get()===QuestDockMode.COLLAPSED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED*-1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)}],width:windowDimensions.get().width};}"
};
const __initData2 = {
code: "function QuestDockUnenrolledBackgroundTsx2(){const{withSpring,activeQuestDockMode,QuestDockMode,videoLoaded,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()!==QuestDockMode.EXPANDED||!videoLoaded?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)};}"
};
const r66 = Module19.memo(function QuestDockUnenrolledBackground() {
let token;
const quest = useContext(QuestDockContext).quest;
const styles = useStyles();
const questDockHeroAsset = useQuestDockHeroAsset(quest);
const { staticUrl, videoAsset } = questDockHeroAsset;
const context = useContext(QuestDockGestureContext);
const { activeQuestDockMode, windowDimensions } = context;
const setRestingQuestDockMode = useContext(QuestDockExternalCoordinationContext).setRestingQuestDockMode;
const stateFromSharedValue = useStateFromSharedValue(activeQuestDockMode);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
token = useToken(Module712.colors.CARD_BACKGROUND_DEFAULT);
const memo = useMemo(() => {
const r4 = Module689(token);
return [r4.alpha(0).hex(), r4.alpha(0.1).hex(), r4.alpha(0.8).hex(), r4.alpha(1).hex()];
}, [token]);
const memo2 = useMemo(() => [0, 0.33, 0.76, 1], []);
const r68 = () => ({
transform: [{
translateX: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.COLLAPSED ? -1 * QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}, {
translateY: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.COLLAPSED ? -1 * QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}],
width: windowDimensions.get().width
});
r68.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,
windowDimensions
};
r68.__workletHash = 3565242281634;
r68.__initData = __initData;
const animatedStyle = useAnimatedStyle(r68);
const [state2, setState] = useState(AppState.currentState !== "active");
useEffect(() => {
let c27703_0 = AppState.addEventListener("change", (a0) => {
const r1 = a0 !== "active";
setState(r1);
if (isIOS() && r1 && activeQuestDockMode.get() === QuestDockMode.EXPANDED) {
setRestingQuestDockMode(QuestDockMode.COLLAPSED);
}
});
return () => {
c27703_0.remove();
};
}, [activeQuestDockMode, setRestingQuestDockMode]);
const isRendered = useContext(QuestDockContext).isRendered;
const r94 = (state2 ? !state2 : isRendered) && !stateFromStores && videoAsset != null && !isAndroid() && isHeroVideoSupported(videoAsset);
const [state, setState2] = useState(false);
const callback = useCallback(() => {
setState2(true);
}, []);
const G = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? state ? 0 : 1 : 1, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
});
G.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
videoLoaded: state,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED
};
G.__workletHash = 13084905891385;
G.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(G);
return <ReanimatedNativeView style={[styles.backgroundWrapper, animatedStyle]}>
{r94 ? <>
<VideoComponent style={styles.backgroundHeroAssetVideo} onLoad={callback} source={{
uri: videoAsset.url
}} paused={stateFromSharedValue !== QuestDockMode.EXPANDED} resizeMode="cover" muted disableFocus preventsDisplaySleepDuringVideoPlayback={false} />
<ReanimatedNativeView style={animatedStyle2}>
<FastImage style={styles.backgroundHeroAsset} source={{
uri: staticUrl
}} />
</ReanimatedNativeView>
</> : <FastImage style={styles.backgroundHeroAsset} source={{
uri: staticUrl
}} />}
<Module4611 locations={memo2} style={styles.backgroundGradient} start={VerticalGradient.START} end={VerticalGradient.END} colors={memo} />
</ReanimatedNativeView>;
});
export default r66;
@@ -0,0 +1,167 @@
// Metro module 14216 (f14217).
import { memo, useContext, useCallback } from "react";
import { View } from "react-native";
import QuestStore from "../../QuestStore";
import QuestDockStore from "./QuestDockStore";
import { QuestDockMode, QuestsExperimentLocations } from "../../QuestConstants";
import { QUEST_DOCK_EXPANDED_PADDING_BOTTOM, QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL } from "./QuestDockConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import QuestDockContext from "./QuestDockContext";
import { useStateFromStores } from "../../../../_bundle/defaultAreStatesEqual";
import { useHasWatchVideoOnMobileTasks, useMobileActivityQuest } from "../QuestHooks.native";
import { useQuestTaskDetails, useShouldShowBonusOrbsUX } from "../../hooks/QuestHooks";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useQuestOrbMultiplierEligibility } from "../../hooks/QuestOrbMultiplierHooks";
import { QuestOrbMultiplierEligibilityType } from "../../utils/QuestOrbMultiplierUtils";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import { enrollInQuest } from "../../QuestActionCreators";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../../QuestTypes";
import openVideoQuestModal from "../VideoQuestModal/openVideoQuestModal";
import { usePrimaryCtaCopy, useQuestsInstructionsToWinReward } from "../../hooks/QuestCopyHooks";
import PremiumRewardGradient from "../PremiumRewardGradient";
import QuestDockBlurredContentBackground from "./QuestDockBlurredContentBackground";
import QuestRewardTile from "../QuestRewardTile";
import { QuestOrbMultiplierPerkPill } from "../QuestOrbMultiplierPerkPill";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { ShinyButton } from "../../../../design/void/native";
import { getPrimaryCtaIcon } from "../QuestUtils.native";
const useStyles = createStyles({
wrapper: {
flexGrow: 1,
flexShrink: 0,
justifyContent: "flex-end",
paddingHorizontal: QUEST_DOCK_EXPANDED_PADDING_HORIZONTAL,
paddingBottom: QUEST_DOCK_EXPANDED_PADDING_BOTTOM
},
rewardContentWrapper: {
borderRadius: Module712.modules.mobile.QUEST_DOCK_BORDER_RADIUS,
overflow: "hidden",
padding: 8,
paddingRight: 16
},
rewardContent: {
alignItems: "center",
flexDirection: "row",
gap: 16
},
rewardContentCopy: {
flexGrow: 1,
flexShrink: 1,
gap: 4
},
premiumRewardPerkPill: {
alignSelf: "flex-start"
},
titleRow: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_8,
flexWrap: "wrap"
},
questDockRewardTile: {
borderRadius: Module712.radii.lg
},
questDockCtaWrapper: {
marginTop: 12,
paddingHorizontal: 4,
paddingTop: 16,
position: "relative"
},
questDockCta: {
borderRadius: Module712.radii.round
},
questDockCtaRow: {
alignSelf: "stretch"
},
questDockCtaSaparator: {
position: "absolute",
left: -12,
right: -12,
top: 0,
backgroundColor: Module712.colors.BORDER_SUBTLE,
height: 1,
opacity: 1
}
});
const r75 = memo(function QuestDockUnenrolledBody() {
let hasWatchVideoOnMobileTasks, isMobileActivityQuest, launchMobileActivity, setRestingQuestDockMode;
const context = useContext(QuestDockContext);
const { isRendered, quest } = context;
const styles = useStyles();
const stateFromStores = useStateFromStores([QuestDockStore], () => QuestDockStore.prevRestingQuestDockMode === QuestDockMode.EXPANDED);
const stateFromStores2 = useStateFromStores([QuestStore], () => QuestStore.isEnrolling(quest.id));
hasWatchVideoOnMobileTasks = useHasWatchVideoOnMobileTasks(quest.config);
const questTaskDetails = useQuestTaskDetails(quest);
const mobileActivityQuest = useMobileActivityQuest(quest);
isMobileActivityQuest = mobileActivityQuest.isMobileActivityQuest;
const questApplication = mobileActivityQuest.questApplication;
launchMobileActivity = mobileActivityQuest.launchMobileActivity;
const bottom = useSafeAreaInsets_native().bottom;
const questOrbMultiplierEligibility = useQuestOrbMultiplierEligibility();
const shouldShowBonusOrbsUX = useShouldShowBonusOrbsUX(quest, questOrbMultiplierEligibility);
const visible = shouldShowBonusOrbsUX ? questOrbMultiplierEligibility === QuestOrbMultiplierEligibilityType.NITRO : shouldShowBonusOrbsUX;
setRestingQuestDockMode = useContext(QuestDockExternalCoordinationContext).setRestingQuestDockMode;
const callback = useCallback(async () => {
let c27701_0;
c27701_0 = void 0;
await enrollInQuest(quest.id, {
questContentCTA: QuestContentCTA.ACCEPT_QUEST,
questContent: QuestContent.QUEST_BAR_MOBILE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
if (isMobileActivityQuest) {
await (0, launchMobileActivity)();
(0, setRestingQuestDockMode)(QuestDockMode.COLLAPSED);
} else if (hasWatchVideoOnMobileTasks) {
openVideoQuestModal({
questId: quest.id,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
(0, setRestingQuestDockMode)(QuestDockMode.COLLAPSED);
}
}, [quest.id, hasWatchVideoOnMobileTasks, setRestingQuestDockMode, isMobileActivityQuest, launchMobileActivity]);
const primaryCtaCopy = usePrimaryCtaCopy({
quest,
application: questApplication,
shortText: true
});
const questsInstructionsToWinReward = useQuestsInstructionsToWinReward({
quest,
location: QuestsExperimentLocations.QUESTS_BAR_MOBILE,
taskDetails: questTaskDetails,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
});
return <PremiumRewardGradient visible={visible} glow style={[styles.wrapper, {
paddingBottom: Math.max(bottom, QUEST_DOCK_EXPANDED_PADDING_BOTTOM)
}]}>
<View style={styles.rewardContentWrapper}>
<QuestDockBlurredContentBackground />
<View style={styles.rewardContent}>
<QuestRewardTile paused={stateFromStores ? !isRendered : !stateFromStores} height={80} width={80} quest={quest} style={styles.questDockRewardTile} withAnimation={stateFromStores && isRendered} />
<View style={styles.rewardContentCopy}>
{shouldShowBonusOrbsUX && <View style={styles.premiumRewardPerkPill}>
<QuestOrbMultiplierPerkPill questId={quest.config.id} orbMultiplierEligibility={questOrbMultiplierEligibility} />
</View>}
<View style={styles.titleRow}>
<Text variant="heading-md/medium" color="mobile-text-heading-primary">
{intl.format(t.EQa7os, {
questName: quest.config.messages.questName
})}
</Text>
</View>
<Text color="text-default" variant="text-sm/normal">{questsInstructionsToWinReward}</Text>
</View>
</View>
</View>
<View style={styles.questDockCtaWrapper}>
<View style={styles.questDockCtaSaparator} />
<View style={styles.questDockCtaRow}>
<ShinyButton style={styles.questDockCta} onPress={callback} loading={stateFromStores2} renderIcon={() => getPrimaryCtaIcon(quest, true)} text={primaryCtaCopy} shineDisabled={!stateFromStores} />
</View>
</View>
</PremiumRewardGradient>;
});
export default r75;
@@ -0,0 +1,313 @@
// Metro module 14209 (f14210).
import { memo, useContext, useState, useEffect, useCallback } from "react";
import { AccessibilityInfo, View } from "react-native";
import { QuestDockMode } from "../../QuestConstants";
import { QUEST_DOCK_CONTENT_BORDER_RADII, QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED, QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED, QUEST_DOCK_COLLAPSED_HEIGHT } from "./QuestDockConstants";
import { ThemeTypes } from "../../../../_bundle/Module505";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import QuestDockContext from "./QuestDockContext";
import { QuestDockGestureContext } from "./QuestDockGestureContext";
import { isIOS, isAndroid } from "../../../../_bundle/Module501";
import { useActionSheetPressHandler } from "./QuestDockHooks";
import QuestDisclosureModalActionCreators from "../QuestDisclosureModal/QuestDisclosureModalActionCreators";
import { QuestContent } from "../../QuestTypes";
import { QuestContentCTA } from "../../lib/analytics/AnalyticsTypes";
import useTheme from "../../../../hooks/useTheme";
import { isThemeDark } from "../../../../design/shared";
import { useToken } from "../../../../design/tokens/native/useToken";
import useQuestDockAnimatedBorderRadius from "./useQuestDockAnimatedBorderRadius";
import { useAnimatedStyle, useAnimatedProps } from "../../../reanimated/ReanimatedRexport";
import { useQuestGameLogotypeAssetUrl } from "../QuestHooks.native";
import ReanimatedNativeView from "../../../core/native/ReanimatedNativeView";
import QuestDockBlurredHeaderPlaceholder from "./QuestDockBlurredHeaderPlaceholder";
import QuestDockBlurredContentBackground from "./QuestDockBlurredContentBackground";
import FastImage from "../../../../components_native/common/FastImage";
import Module14212 from "../../../../_bundle/Module14212";
import Module14213 from "../../../../_bundle/Module14213";
import QuestGameLogotype from "../QuestGameLogotype";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { PressableOpacity } from "../../../../design/void/Pressables/native/Pressables";
import { CircleQuestionIcon } from "../../../../design/components/Icon/native/redesign/generated/CircleQuestionIcon";
import { MoreHorizontalIcon } from "../../../../design/components/Icon/native/redesign/generated/MoreHorizontalIcon";
let questDockHeaderLayoutAnimation, __initData, __initData2, __initData3, __initData4, __initData5, __initData6, __initData7;
const useStyles = createStyles({
questDockHeader: {
alignItems: "center",
justifyContent: "space-between",
flexDirection: "row",
height: QUEST_DOCK_COLLAPSED_HEIGHT,
overflow: "hidden",
paddingRight: 16,
paddingLeft: 8,
position: "absolute",
zIndex: 2
},
wreathImage: {
height: 35,
marginRight: 4,
width: 35
},
questDockHeaderPrimary: {
alignItems: "center",
flexDirection: "row"
},
logo: {
marginTop: 2
},
questDockHeaderSecondary: {
flexGrow: 0,
flexShrink: 0
},
questDockHeaderContentCollapsed: {
justifyContent: "center",
position: "absolute",
bottom: 0,
top: 0,
right: 0
},
questDockHeaderContentExpanded: {
alignItems: "center",
flexDirection: "row",
gap: 8
},
questDockHeaderActionDisclosures: {
alignItems: "center",
display: "flex",
flexDirection: "row",
gap: 4
},
questDockHeaderActionDisclosuresIcon: {
height: 14,
width: 14
},
questDockHeaderActionSeparator: {
backgroundColor: Module712.colors.TEXT_DEFAULT,
opacity: 0.2,
height: 18,
width: 1.5
},
questDockHeaderTertiaryContent: {
opacity: 0.7
}
});
const questDockHeaderLayoutAnimation2 = function questDockHeaderLayoutAnimation(a0) {
return {
initialValues: {
originX: a0.currentOriginX,
originY: a0.currentOriginY,
width: a0.currentWidth,
height: a0.currentHeight
},
animations: {
originX: _spring.withSpring(a0.targetOriginX, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
originY: _spring.withSpring(a0.targetOriginY, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
height: _spring.withSpring(a0.targetHeight, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
width: _spring.withSpring(a0.targetWidth, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}
};
};
questDockHeaderLayoutAnimation2.__closure = {
withSpring: _spring.withSpring,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED
};
questDockHeaderLayoutAnimation2.__workletHash = 6787168806966;
questDockHeaderLayoutAnimation2.__initData = {
code: "function questDockHeaderLayoutAnimation_QuestDockUnenrolledHeaderTsx1(values){const{withSpring,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED}=this.__closure;return{initialValues:{originX:values.currentOriginX,originY:values.currentOriginY,width:values.currentWidth,height:values.currentHeight},animations:{originX:withSpring(values.targetOriginX,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),originY:withSpring(values.targetOriginY,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),height:withSpring(values.targetHeight,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),width:withSpring(values.targetWidth,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)}};}"
};
questDockHeaderLayoutAnimation = questDockHeaderLayoutAnimation2;
__initData = {
code: "function QuestDockUnenrolledHeaderTsx2(){const{activeQuestDockMode,QuestDockMode,QUEST_DOCK_CONTENT_BORDER_RADII,questDockBorderRadius,withSpring,questDockAnimatedBorderRadius,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,questDockWrapperSpecs,QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED}=this.__closure;return{borderTopLeftRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:questDockBorderRadius,borderTopRightRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:questDockBorderRadius,borderBottomLeftRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:withSpring(questDockAnimatedBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),borderBottomRightRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:withSpring(questDockAnimatedBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),width:activeQuestDockMode.get()===QuestDockMode.EXPANDED?questDockWrapperSpecs.get().width-QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED*2:questDockWrapperSpecs.get().width,transform:[{translateX:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)},{translateY:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)}]};}"
};
__initData2 = {
code: "function QuestDockUnenrolledHeaderTsx3(){const{withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?0:1,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)};}"
};
__initData3 = {
code: "function QuestDockUnenrolledHeaderTsx4(){const{activeQuestDockMode,QuestDockMode,QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED}=this.__closure;return{right:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED*-1:0};}"
};
__initData4 = {
code: "function QuestDockUnenrolledHeaderTsx5(){const{withSpring,activeQuestDockMode,QuestDockMode,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED}=this.__closure;return{opacity:withSpring(activeQuestDockMode.get()===QuestDockMode.EXPANDED?1:0,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)};}"
};
__initData5 = {
code: "function QuestDockUnenrolledHeaderTsx6(){const{activeQuestDockMode,QuestDockMode,QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED}=this.__closure;return{right:activeQuestDockMode.get()===QuestDockMode.EXPANDED?0:QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED};}"
};
__initData6 = {
code: "function QuestDockUnenrolledHeaderTsx7(){const{activeQuestDockMode,QuestDockMode}=this.__closure;return{pointerEvents:activeQuestDockMode.get()===QuestDockMode.EXPANDED?'auto':'none'};}"
};
__initData7 = {
code: "function QuestDockUnenrolledHeaderTsx8(){const{activeQuestDockMode,QuestDockMode,QUEST_DOCK_CONTENT_BORDER_RADII,questDockBorderRadius,withSpring,questDockAnimatedBorderRadius,QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,questDockWrapperSpecs}=this.__closure;return{borderRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:questDockBorderRadius,borderBottomLeftRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:withSpring(questDockAnimatedBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),borderBottomRightRadius:activeQuestDockMode.get()===QuestDockMode.EXPANDED?QUEST_DOCK_CONTENT_BORDER_RADII:withSpring(questDockAnimatedBorderRadius.get(),QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),width:questDockWrapperSpecs.get().width};}"
};
const r75 = memo(function QuestDockUnenrolledHeader() {
let token, c21039_5;
const quest = useContext(QuestDockContext).quest;
const context = useContext(QuestDockGestureContext);
const { activeQuestDockMode, questDockWrapperSpecs } = context;
const [state, setState] = useState(false);
useEffect(() => {
if (isIOS()) {
AccessibilityInfo.isReduceTransparencyEnabled().then(setState);
let c27700_0 = AccessibilityInfo.addEventListener("reduceTransparencyChanged", setState);
return () => c27700_0.remove();
}
}, []);
const actionSheetPressHandler = useActionSheetPressHandler(quest);
const callback = useCallback(() => {
QuestDisclosureModalActionCreators.showModal({
quest,
isTargetedDisclosure: true,
trackingCtx: {
content: QuestContent.QUEST_BAR_MOBILE,
ctaContent: QuestContentCTA.CONTEXT_MENU_OPEN_DISCLOSURE,
sourceQuestContent: QuestContent.QUEST_BAR_MOBILE
}
});
}, [quest]);
const r11 = isThemeDark(useTheme()) ? ThemeTypes.DARK : ThemeTypes.LIGHT;
token = useToken(Module712.modules.mobile.QUEST_DOCK_BORDER_RADIUS);
const questDockAnimatedBorderRadius = useQuestDockAnimatedBorderRadius(token);
c21039_5 = questDockAnimatedBorderRadius;
const K = () => {
const borderTopLeftRadius = activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : token;
const borderTopRightRadius = activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : token;
const borderBottomLeftRadius = activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : _spring.withSpring(c21039_5.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED);
return {
borderTopLeftRadius,
borderTopRightRadius,
borderBottomLeftRadius,
borderBottomRightRadius: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : _spring.withSpring(c21039_5.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
width: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? questDockWrapperSpecs.get().width - 2 * QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : questDockWrapperSpecs.get().width,
transform: [{
translateX: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}, {
translateY: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
}]
};
};
K.__closure = {
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_CONTENT_BORDER_RADII,
questDockBorderRadius: token,
withSpring: _spring.withSpring,
questDockAnimatedBorderRadius,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,
questDockWrapperSpecs,
QUEST_DOCK_UNENROLLED_HEADER_INSET_EXPANDED
};
K.__workletHash = 15527986377887;
K.__initData = __initData;
const animatedStyle3 = useAnimatedStyle(K);
const X = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? 0 : 1, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
});
X.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED
};
X.__workletHash = 15527972438968;
X.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(X);
const q = () => ({
right: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? -1 * QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED : 0
});
q.__closure = {
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED
};
q.__workletHash = 7866036039040;
q.__initData = __initData3;
const animatedStyle = useAnimatedStyle(q);
const f = () => ({
opacity: _spring.withSpring(activeQuestDockMode.get() === QuestDockMode.EXPANDED ? 1 : 0, QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED)
});
f.__closure = {
withSpring: _spring.withSpring,
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED
};
f.__workletHash = 11647269239934;
f.__initData = __initData4;
const animatedStyle4 = useAnimatedStyle(f);
const B = () => ({
right: activeQuestDockMode.get() !== QuestDockMode.EXPANDED ? QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED : 0
});
B.__closure = {
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED
};
B.__workletHash = 14794727045076;
B.__initData = __initData5;
const animatedStyle5 = useAnimatedStyle(B);
const G = () => ({
pointerEvents: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? "auto" : "none"
});
G.__closure = {
activeQuestDockMode,
QuestDockMode
};
G.__workletHash = 6738114933032;
G.__initData = __initData6;
const animatedProps = useAnimatedProps(G);
const x = () => ({
borderRadius: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : token,
borderBottomLeftRadius: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : _spring.withSpring(c21039_5.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
borderBottomRightRadius: activeQuestDockMode.get() === QuestDockMode.EXPANDED ? QUEST_DOCK_CONTENT_BORDER_RADII : _spring.withSpring(c21039_5.get(), QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED),
width: questDockWrapperSpecs.get().width
});
x.__closure = {
activeQuestDockMode,
QuestDockMode,
QUEST_DOCK_CONTENT_BORDER_RADII,
questDockBorderRadius: token,
withSpring: _spring.withSpring,
questDockAnimatedBorderRadius,
QUEST_DOCK_MODE_CHANGE_PHYSICS_CLAMPED,
questDockWrapperSpecs
};
x.__workletHash = 16321960714067;
x.__initData = __initData7;
const animatedStyle6 = useAnimatedStyle(x);
const styles = useStyles();
const questGameLogotypeAssetUrl = useQuestGameLogotypeAssetUrl(quest);
const questBarHeroBlurhash = quest.config.assets.questBarHeroBlurhash;
return <ReanimatedNativeView style={[styles.questDockHeader, animatedStyle3]} layout={questDockHeaderLayoutAnimation}>
{!(!isAndroid() && !state) && questBarHeroBlurhash != null ? <QuestDockBlurredHeaderPlaceholder placeholder={questBarHeroBlurhash} animatedStyle={animatedStyle6} animatedLayout={questDockHeaderLayoutAnimation} /> : <QuestDockBlurredContentBackground animatedStyle={animatedStyle6} animatedLayout={questDockHeaderLayoutAnimation} />}
<View style={styles.questDockHeaderPrimary}>
<FastImage source={r11 === ThemeTypes.DARK ? Module14212 : Module14213} resizeMode="contain" style={styles.wreathImage} />
<QuestGameLogotype assetUrl={questGameLogotypeAssetUrl} height={36} maxWidth={120} style={styles.logo} />
</View>
<View style={styles.questDockHeaderSecondary}>
<ReanimatedNativeView style={[styles.questDockHeaderContentCollapsed, animatedStyle]} layout={questDockHeaderLayoutAnimation}>
<ReanimatedNativeView style={animatedStyle2}>
<Text style={styles.questDockHeaderTertiaryContent} variant="text-sm/medium" color="interactive-text-active">
{intl.string(t["3mgEQf"])}
</Text>
</ReanimatedNativeView>
</ReanimatedNativeView>
<ReanimatedNativeView animatedProps={animatedProps} style={animatedStyle5} layout={questDockHeaderLayoutAnimation}>
<ReanimatedNativeView style={[styles.questDockHeaderContentExpanded, animatedStyle4]}>
<PressableOpacity onPress={callback} accessibilityRole="button" style={[styles.questDockHeaderActionDisclosures, styles.questDockHeaderTertiaryContent]}>
<>
<Text color="interactive-text-active" variant="text-sm/medium">
{intl.string(t.o6FLcF)}
</Text>
<CircleQuestionIcon color={Module712.colors.INTERACTIVE_TEXT_ACTIVE} style={styles.questDockHeaderActionDisclosuresIcon} />
</>
</PressableOpacity>
<View style={styles.questDockHeaderActionSeparator} />
<PressableOpacity accessibilityRole="button" onPress={actionSheetPressHandler} style={styles.questDockHeaderTertiaryContent}>
<MoreHorizontalIcon color={Module712.colors.INTERACTIVE_TEXT_ACTIVE} />
</PressableOpacity>
</ReanimatedNativeView>
</ReanimatedNativeView>
</View>
</ReanimatedNativeView>;
});
export default r75;
@@ -0,0 +1,89 @@
// Metro module 14121 (f14122).
import { PixelRatio } from "react-native";
import { QUEST_DOCK_COLLAPSED_HEIGHT, QUEST_DOCK_COLLAPSED_MAX_WIDTH, QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED, QUEST_DOCK_MODE_CHANGE_PHYSICS } from "./QuestDockConstants";
import Durations from "../../../../utils/Durations";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
let c9882_7;
let c9882_6 = PixelRatio.get();
export function roundToNearestPixel(a0) {
return Math.round(a0 * c9882_6) / c9882_6;
}
roundToNearestPixel.__closure = {
PIXEL_DENSITY: c9882_6
};
roundToNearestPixel.__workletHash = 9602449563120;
roundToNearestPixel.__initData = {
code: "function roundToNearestPixel_QuestDockUtilsTsx1(position){const{PIXEL_DENSITY}=this.__closure;return Math.round(position*PIXEL_DENSITY)/PIXEL_DENSITY;}"
};
export function getQuestDockExpandedHeightLimits(a0, a1, a2) {
return {
minHeight: QUEST_DOCK_COLLAPSED_HEIGHT,
maxHeight: Math.min(a2, a0 - a1)
};
}
getQuestDockExpandedHeightLimits.__closure = {
QUEST_DOCK_COLLAPSED_HEIGHT
};
getQuestDockExpandedHeightLimits.__workletHash = 880847803554;
getQuestDockExpandedHeightLimits.__initData = {
code: "function getQuestDockExpandedHeightLimits_QuestDockUtilsTsx2(windowHeight,safeAreaTop,minContentHeight){const{QUEST_DOCK_COLLAPSED_HEIGHT}=this.__closure;return{minHeight:QUEST_DOCK_COLLAPSED_HEIGHT,maxHeight:Math.min(minContentHeight,windowHeight-safeAreaTop)};}"
};
export function getQuestDockCollapsedWidth(a0, a1, a2) {
return Math.min(a0 - Math.max(a1, QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED) - Math.max(a2, QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED), QUEST_DOCK_COLLAPSED_MAX_WIDTH);
}
getQuestDockCollapsedWidth.__closure = {
QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED,
QUEST_DOCK_COLLAPSED_MAX_WIDTH
};
getQuestDockCollapsedWidth.__workletHash = 1119343760780;
getQuestDockCollapsedWidth.__initData = {
code: "function getQuestDockCollapsedWidth_QuestDockUtilsTsx3(windowWidth,safeAreaLeft,safeAreaRight){const{QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED,QUEST_DOCK_COLLAPSED_MAX_WIDTH}=this.__closure;safeAreaLeft=Math.max(safeAreaLeft,QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED);safeAreaRight=Math.max(safeAreaRight,QUEST_DOCK_HORIZONTAL_EDGE_GUTTER_COLLAPSED);return Math.min(windowWidth-safeAreaLeft-safeAreaRight,QUEST_DOCK_COLLAPSED_MAX_WIDTH);}"
};
export function getQuestDockExpandedWidth(a0, a1, a2) {
return Math.min(a0 - a1 - a2, QUEST_DOCK_COLLAPSED_MAX_WIDTH);
}
getQuestDockExpandedWidth.__closure = {
QUEST_DOCK_COLLAPSED_MAX_WIDTH
};
getQuestDockExpandedWidth.__workletHash = 6480418564130;
getQuestDockExpandedWidth.__initData = {
code: "function getQuestDockExpandedWidth_QuestDockUtilsTsx4(windowWidth,safeAreaLeft,safeAreaRight){const{QUEST_DOCK_COLLAPSED_MAX_WIDTH}=this.__closure;return Math.min(windowWidth-safeAreaLeft-safeAreaRight,QUEST_DOCK_COLLAPSED_MAX_WIDTH);}"
};
export function getQuestDockClosedWidth(a0, a1, a2) {
return Math.min(a0 - a1 - a2, QUEST_DOCK_COLLAPSED_MAX_WIDTH);
}
getQuestDockClosedWidth.__closure = {
QUEST_DOCK_COLLAPSED_MAX_WIDTH
};
getQuestDockClosedWidth.__workletHash = 14159592925974;
getQuestDockClosedWidth.__initData = {
code: "function getQuestDockClosedWidth_QuestDockUtilsTsx5(windowWidth,safeAreaLeft,safeAreaRight){const{QUEST_DOCK_COLLAPSED_MAX_WIDTH}=this.__closure;return Math.min(windowWidth-safeAreaLeft-safeAreaRight,QUEST_DOCK_COLLAPSED_MAX_WIDTH);}"
};
c9882_7 = 3 * Durations.Millis.HOUR;
export function dimensionsLayoutTransition(a0) {
return {
initialValues: {
originX: a0.currentOriginX,
originY: a0.currentOriginY,
width: a0.currentWidth,
height: a0.currentHeight
},
animations: {
originX: _spring.withSpring(a0.targetOriginX, QUEST_DOCK_MODE_CHANGE_PHYSICS),
originY: _spring.withSpring(a0.targetOriginY, QUEST_DOCK_MODE_CHANGE_PHYSICS),
height: _spring.withSpring(a0.targetHeight, QUEST_DOCK_MODE_CHANGE_PHYSICS),
width: _spring.withSpring(a0.targetWidth, QUEST_DOCK_MODE_CHANGE_PHYSICS)
}
};
}
dimensionsLayoutTransition.__closure = {
withSpring: _spring.withSpring,
QUEST_DOCK_MODE_CHANGE_PHYSICS
};
dimensionsLayoutTransition.__workletHash = 4497154070776;
dimensionsLayoutTransition.__initData = {
code: "function dimensionsLayoutTransition_QuestDockUtilsTsx6(values){const{withSpring,QUEST_DOCK_MODE_CHANGE_PHYSICS}=this.__closure;return{initialValues:{originX:values.currentOriginX,originY:values.currentOriginY,width:values.currentWidth,height:values.currentHeight},animations:{originX:withSpring(values.targetOriginX,QUEST_DOCK_MODE_CHANGE_PHYSICS),originY:withSpring(values.targetOriginY,QUEST_DOCK_MODE_CHANGE_PHYSICS),height:withSpring(values.targetHeight,QUEST_DOCK_MODE_CHANGE_PHYSICS),width:withSpring(values.targetWidth,QUEST_DOCK_MODE_CHANGE_PHYSICS)}};}"
};
export function isSoftDismissed(a0) {
return a0 != null && Date.now() - a0 < c9882_7;
}
@@ -0,0 +1,8 @@
// Metro module 14130 (f14131).
import Module712 from "../../../../_bundle/Module712";
import { BaseIconImage } from "../../../../design/components/Icon/native/BaseIconImage";
import * as _Module14131 from "../../../../_bundle/Module14131";
export default function WreathIcon(props) {
const { style, color = Module712.colors.INTERACTIVE_TEXT_DEFAULT, ...rest } = props;
return <BaseIconImage source={_Module14131} color={color} style={style} {...rest} />;
};
@@ -0,0 +1,29 @@
// Metro module 14206 (f14207).
import { useContext } from "react";
import { QuestDockExternalCoordinationContext } from "./QuestDockExternalCoordinationContext";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useDerivedValue } from "../../../reanimated/ReanimatedRexport";
const __initData = {
code: "function useQuestDockAnimatedBorderRadiusTsx1(){const{interpolate,questDockOffset,minBorder,maxBorder,Extrapolation}=this.__closure;return interpolate(questDockOffset.get(),[0,50],[minBorder,maxBorder],Extrapolation.CLAMP);}"
};
export default function useQuestDockAnimatedBorderRadius(a0) {
let minBorder = arguments[1];
if (minBorder === void 0) {
minBorder = 0;
}
let c21036_1 = minBorder;
const questDockOffset = useContext(QuestDockExternalCoordinationContext).questDockOffset;
const u = function u() {
return _ReanimatedRexport.interpolate(questDockOffset.get(), [0, 50], [c21036_1, a0], _ReanimatedRexport.Extrapolation.CLAMP);
};
u.__closure = {
interpolate: _ReanimatedRexport.interpolate,
questDockOffset,
minBorder,
maxBorder: a0,
Extrapolation: _ReanimatedRexport.Extrapolation
};
u.__workletHash = 17005846780112;
u.__initData = __initData;
return useDerivedValue(u);
};
@@ -0,0 +1,46 @@
// Metro module 14135 (f14136).
import { Image as Image2, View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import Module6684 from "../../../_bundle/Module6684";
import ToastActionCreators from "../../toast/native/ToastActionCreators";
import Module6550 from "../../../_bundle/Module6550";
let useStyles;
const QuestDockDismissalNotification = function QuestDockDismissalNotification() {
const styles = useStyles();
return <Text color="mobile-text-heading-primary" variant="text-sm/semibold">
{intl.format(t.dYE1px, {
arrowHook: () => <View style={styles.toastArrowForwardIconContainer}>
<Image2 resizeMode="contain" source={Module6684} style={styles.toastArrowForwardIcon} />
</View>
})}
</Text>;
};
useStyles = createStyles(() => ({
toastArrowForwardIconContainer: {
height: 6,
width: 16
},
toastArrowForwardIcon: {
opacity: 0.35,
position: "absolute",
top: "50%",
left: 0,
height: 16,
width: 16,
tintColor: Module712.colors.INTERACTIVE_TEXT_ACTIVE,
transform: [{
translateY: -10
}]
}
}));
export function displayQuestDismissalToast() {
ToastActionCreators.open({
key: "QUEST_BAR_DISMISS_TOAST",
content: QuestDockDismissalNotification,
icon: Module6550,
position: "bottom"
});
}
+276
View File
@@ -0,0 +1,276 @@
// Metro module 12367 (f12368).
import { Image as Image2 } from "react-native";
import ThemeStore from "../../user_settings/ThemeStore";
import QuestStore from "../QuestStore";
import { QuestEmbedFallbackReason, QuestsExperimentLocations } from "../QuestConstants";
import { ThemeTypes } from "../../../Constants";
import { InviteTypes } from "../../instant_invite/Constants";
import * as _PlatformUtils from "../../../utils/PlatformUtils";
import { intl, t } from "../../../intl/index.native";
import { getQuestTaskDetails, getThirdPartyTaskDetails } from "../utils/QuestTaskUtils";
import { getQuestsInstructionsToWinReward } from "../hooks/QuestCopyHooks";
import { QuestContent } from "../QuestTypes";
import { isThemeDark } from "../../../design/shared";
import { getQuestAsset, QuestAssetType } from "../lib/AssetUtils";
import { isMetaQuest } from "../../device/MetaQuestUtils.android";
import Module12368 from "../../../_bundle/Module12368";
import { findQuestOrReplacement } from "../utils/QuestDataUtils";
import { trackQuestEmbedFallbackViewed } from "../lib/analytics/AnalyticsActions";
import { isShareableQuest } from "../utils/QuestUtils";
import getEmbedThemeColors from "../../messages/native/renderer/row_data/embeds/getEmbedThemeColors";
export function createQuestsEmbed(a0) {
let r91, r199, r200, r277, r328, r354, r399, acceptLabelText, subtitle2;
L54: {
const { questId, theme, currentUser } = a0;
const embedThemeColors = getEmbedThemeColors(theme);
if (isMetaQuest()) {
const titleText6 = intl.string(t["6LxbQM"]);
const subtitle5 = intl.string(t.CXEb9p);
const uri4 = Image2.resolveAssetSource(Module12368).uri;
const { baseColors: baseColors6, colors: colors7 } = embedThemeColors;
const r381 = {
...baseColors6,
headerColor: colors7.headerColor,
titleText: titleText6,
titleColor: colors7.titleColor,
subtitleColor: colors7.bodyTextColor,
bodyTextColor: colors7.bodyTextColor,
thumbnailUrl: uri4,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid6 = _PlatformUtils.isAndroid();
const r395 = {
...r381
};
if (isAndroid6) {
r395.headerText = null;
r395.subtitle = subtitle5;
r399 = r395;
} else {
r395.headerText = void 0;
r395.subtitle = subtitle5;
r399 = r395;
}
r91 = {
...r399,
acceptLabelText: intl.string(t.hvVgAZ),
acceptLabelBackgroundColor: embedThemeColors.colors.acceptBlurpleLabelBackgroundColor,
acceptLabelColor: embedThemeColors.colors.acceptLabelGreenColor
};
} else {
const quest = findQuestOrReplacement(questId, QuestStore.quests, QuestStore.excludedQuests);
const r40 = QuestStore.excludedQuests.get(questId);
if (quest == null && QuestStore.isFetchingCurrentQuests) {
const r329 = {
themeColors: embedThemeColors
};
const { titleText, bodyText, themeColors, thumbnailUrl } = r329;
const { baseColors: baseColors5, colors: colors6 } = themeColors;
const r336 = {
...baseColors5,
headerColor: colors6.headerColor,
titleText,
titleColor: colors6.titleColor,
subtitleColor: colors6.bodyTextColor,
bodyTextColor: colors6.bodyTextColor,
thumbnailUrl,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid5 = _PlatformUtils.isAndroid();
const r350 = {
...r336
};
if (isAndroid5) {
r350.headerText = null;
r350.subtitle = bodyText;
r354 = r350;
} else {
r350.headerText = void 0;
r350.subtitle = bodyText;
r354 = r350;
}
r91 = r354;
break L54;
}
if (quest == null) {
if (r40 != null) {
trackQuestEmbedFallbackViewed(questId, QuestEmbedFallbackReason.EXCLUDED_QUEST);
const titleText5 = intl.string(t.Dd6Daw);
const subtitle4 = intl.string(t.ii4mJo);
const uri3 = Image2.resolveAssetSource(Module12368).uri;
const { baseColors: baseColors4, colors: colors5 } = embedThemeColors;
const r310 = {
...baseColors4,
headerColor: colors5.headerColor,
titleText: titleText5,
titleColor: colors5.titleColor,
subtitleColor: colors5.bodyTextColor,
bodyTextColor: colors5.bodyTextColor,
thumbnailUrl: uri3,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid4 = _PlatformUtils.isAndroid();
const r324 = {
...r310
};
if (isAndroid4) {
r324.headerText = null;
r324.subtitle = subtitle4;
r328 = r324;
} else {
r324.headerText = void 0;
r324.subtitle = subtitle4;
r328 = r324;
}
r277 = r328;
} else {
trackQuestEmbedFallbackViewed(questId, QuestEmbedFallbackReason.UNKNOWN_QUEST);
const titleText4 = intl.string(t["rxf+nx"]);
const subtitle3 = intl.string(t.Ow5AQI);
const uri2 = Image2.resolveAssetSource(Module12368).uri;
const { baseColors: baseColors3, colors: colors4 } = embedThemeColors;
const r259 = {
...baseColors3,
headerColor: colors4.headerColor,
titleText: titleText4,
titleColor: colors4.titleColor,
subtitleColor: colors4.bodyTextColor,
bodyTextColor: colors4.bodyTextColor,
thumbnailUrl: uri2,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid3 = _PlatformUtils.isAndroid();
const r273 = {
...r259
};
if (isAndroid3) {
r273.headerText = null;
r273.subtitle = subtitle3;
r277 = r273;
} else {
r273.headerText = void 0;
r273.subtitle = subtitle3;
r277 = r273;
}
}
r91 = r277;
} else if (isShareableQuest(quest.config)) {
const colors2 = embedThemeColors.colors;
const r5 = quest.userStatus?.enrolledAt != null;
const r105 = quest.config.expiresAt < new Date().toISOString();
const r115 = isThemeDark(ThemeStore.getState().theme) ? ThemeTypes.DARK : ThemeTypes.LIGHT;
const r6 = QuestStore.questEnrollmentBlockedUntil != null;
const titleText3 = intl.formatToPlainString(t.EAYZAr, {
questName: quest.config.messages.questName
});
quest.config.messages.gamePublisher;
if (quest.config.expiresAt < new Date().toISOString()) {
subtitle2 = intl.formatToPlainString(t["ge+AJp"], {
questName: quest.config.messages.questName
});
} else {
const questTaskDetails = getQuestTaskDetails(quest);
let thirdPartyTaskDetails = getThirdPartyTaskDetails(quest);
if (thirdPartyTaskDetails == null) {
thirdPartyTaskDetails = void 0;
}
subtitle2 = getQuestsInstructionsToWinReward({
quest,
taskDetails: questTaskDetails,
location: QuestsExperimentLocations.EMBED_MOBILE,
sourceQuestContent: QuestContent.QUEST_EMBED_MOBILE,
thirdPartyTaskDetails,
withoutMarkdown: true,
currentUser
});
}
const url = getQuestAsset(quest, QuestAssetType.GAME_TILE, r115).url;
const { baseColors: baseColors2, colors: colors3 } = embedThemeColors;
const r182 = {
...baseColors2,
headerColor: colors3.headerColor,
titleText: titleText3,
titleColor: colors3.titleColor,
subtitleColor: colors3.bodyTextColor,
bodyTextColor: colors3.bodyTextColor,
thumbnailUrl: url,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid2 = _PlatformUtils.isAndroid();
const r195 = {
...r182
};
if (isAndroid2) {
r195.headerText = null;
r195.subtitle = subtitle2;
r199 = r195;
} else {
r195.headerText = void 0;
r195.subtitle = subtitle2;
r199 = r195;
}
L32: {
r200 = {
...r199
};
if (!r5 && !r105) {
if (r6) {
acceptLabelText = intl.string(t["th2+0j"]);
break L32;
}
acceptLabelText = intl.string(t.kUQLMJ);
} else {
acceptLabelText = r105 ? intl.string(t.hvVgAZ) : intl.string(t["th2+0j"]);
}
}
r200.acceptLabelText = acceptLabelText;
r200.acceptLabelBackgroundColor = colors2.acceptBlurpleLabelBackgroundColor;
r200.acceptLabelColor = embedThemeColors.colors.acceptLabelGreenColor;
r200.thumbnailCornerRadius = 8;
r91 = r200;
} else {
trackQuestEmbedFallbackViewed(questId, QuestEmbedFallbackReason.NOT_SHAREABLE_QUEST);
const titleText2 = intl.string(t.Dd6Daw);
const subtitle = intl.string(t.NXrP3N);
const uri = Image2.resolveAssetSource(Module12368).uri;
const { baseColors, colors } = embedThemeColors;
const r76 = {
...baseColors,
headerColor: colors.headerColor,
titleText: titleText2,
titleColor: colors.titleColor,
subtitleColor: colors.bodyTextColor,
bodyTextColor: colors.bodyTextColor,
thumbnailUrl: uri,
embedCanBeTapped: true,
canBeAccepted: true,
type: InviteTypes.GUILD
};
const isAndroid = _PlatformUtils.isAndroid();
const r87 = {
...r76
};
if (isAndroid) {
r87.headerText = null;
r87.subtitle = subtitle;
r91 = r87;
} else {
r87.headerText = void 0;
r87.subtitle = subtitle;
r91 = r87;
}
}
}
}
return r91;
}
@@ -0,0 +1,63 @@
// Metro module 14191 (f14192).
import { View } from "react-native";
import QuestStore from "../../QuestStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { QuestContentImpressionTrackerNative } from "../QuestContentImpressionTracker.native";
import { QuestContent } from "../../QuestTypes";
import useCountdown from "../../../../hooks/useCountdown";
import { BottomSheet } from "../../../../design/components/Sheet/native/BottomSheet.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
let useStyles;
const QuestEnrollmentBlockedBottomSheet = function QuestEnrollmentBlockedBottomSheet(props) {
const questEnrollmentBlockedUntil2 = props.questEnrollmentBlockedUntil;
const styles = useStyles();
let r30 = questEnrollmentBlockedUntil2;
if (r30 == null) {
r30 = new Date();
}
const countdown = useCountdown(r30);
const { hours, minutes, seconds } = countdown;
const r20 = String(hours).padStart(2, "0");
const r19 = String(minutes).padStart(2, "0");
const r18 = String(seconds).padStart(2, "0");
return questEnrollmentBlockedUntil2 == null ? null : <BottomSheet header={<View style={styles.heading}>
<Text variant="heading-xl/bold">
{intl.string(t["XEHDT/"])}
</Text>
</View>} footer={null} startExpanded>
<View style={styles.container}>
<Text variant="text-md/normal">
{intl.formatToPlainString(t["+5XVH+"], {
countdownString: `${r20}:${r19}:${r18}`
})}
</Text>
</View>
</BottomSheet>;
};
useStyles = createStyles({
heading: {
display: "flex",
justifyContent: "center",
alignItems: "center",
paddingHorizontal: Module712.space.PX_16,
paddingTop: Module712.space.PX_16,
gap: Module712.space.PX_24
},
container: {
display: "flex",
justifyContent: "center",
alignItems: "center",
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_32
}
});
export default function QuestEnrollmentBlockedBottomSheetConnected(props) {
const { questId, questEnrollmentBlockedUntil, questContentPosition, sourceQuestContent } = props;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuest(questId));
return stateFromStores != null ? <QuestContentImpressionTrackerNative overrideVisibility questOrQuests={stateFromStores} questContent={QuestContent.QUEST_ENROLLMENT_BLOCKED_BOTTOM_SHEET} questContentPosition={questContentPosition} sourceQuestContent={sourceQuestContent}>
{() => <QuestEnrollmentBlockedBottomSheet questId={questId} questEnrollmentBlockedUntil={questEnrollmentBlockedUntil} sourceQuestContent={sourceQuestContent} />}
</QuestContentImpressionTrackerNative> : null;
};
@@ -0,0 +1,79 @@
// Metro module 14175 (f14176).
import * as Module19 from "react";
import { useState, useMemo, useEffect } from "react";
import { Image as Image2, View } from "react-native";
import { springSlow } from "../../../design/animation/reanimated/spring/springPresets";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import ReanimatedRexport, { useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import * as _spring from "../../../design/animation/reanimated/spring/spring";
import { SvgUri } from "../../../_bundle/Module8531";
import FastImage from "../../../components_native/common/FastImage";
const SPRING_CONFIG = {
...springSlow,
overshootClamping: true
};
const useStyles = createStyles({
logo: {
marginBottom: Module712.space.PX_4
}
});
const __initData = {
code: "function QuestGameLogotypeTsx1(){const{withSpring,logoDimensionStyles,SPRING_CONFIG}=this.__closure;return{opacity:withSpring(logoDimensionStyles==null?0:1,SPRING_CONFIG,'animate-always')};}"
};
const r45 = Module19.memo(function(a0) {
const { assetUrl, width: width2 = 120 } = a0;
const width = width2;
const { height, maxWidth, maxHeight, style, onError } = a0;
const styles = useStyles();
const [state, setState] = useState(null);
const memo = useMemo(() => {
if (state != null) {
const r10 = state.width / state.height;
const r11 = height != null ? {
height,
width: height * r10
} : {
height: width / r10,
width
};
if (maxWidth != null) {
r11.width = Math.min(maxWidth, r11.width);
r11.height = r11.width / r10;
}
if (maxHeight != null) {
r11.height = Math.min(maxHeight, r11.height);
r11.width = r11.height * r10;
}
return r11;
}
}, [state, width, height, maxWidth, maxHeight]);
useEffect(() => {
Image2.getSize(assetUrl, (a0, a1) => {
if (a0 > 0 && a1 > 0) {
setState({
width: a0,
height: a1
});
}
});
}, [assetUrl]);
const C = () => ({
opacity: _spring.withSpring(memo == null ? 0 : 1, SPRING_CONFIG, "animate-always")
});
C.__closure = {
withSpring: _spring.withSpring,
logoDimensionStyles: memo,
SPRING_CONFIG
};
C.__workletHash = 11242802634598;
C.__initData = __initData;
return <ReanimatedRexport.View style={[useAnimatedStyle(C), style]}>
{useMemo(() => assetUrl.endsWith(".svg"), [assetUrl]) ? <View style={[memo, styles.logo]}>
<SvgUri height="100%" width="100%" uri={assetUrl} onError={onError} />
</View> : <FastImage source={{
uri: assetUrl
}} style={[memo, styles.logo]} onError={onError} />}
</ReanimatedRexport.View>;
});
export default r45;
+442
View File
@@ -0,0 +1,442 @@
// Metro module 14032 (f14033).
import * as Module19 from "react";
import { useCallback, useMemo, useEffect, useRef, useState } from "react";
import { ActivityIndicator, View, StyleSheet } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import QuestHomeNavigationStore from "../QuestHomeNavigationStore";
import QuestStore from "../QuestStore";
import QuestUtmStore from "../QuestUtmStore";
import { QuestsExperimentLocations } from "../QuestConstants";
import { AnalyticEvents, UserSettingsSections } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStoresArray, useStateFromStores } from "../../../_bundle/Module589";
import { useNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import BountiesModalActionCreators, { BOUNTIES_MODAL_KEY } from "./BountiesModal/BountiesModalActionCreators";
import Dispatcher from "../../../Dispatcher";
import { fireSurveyAction } from "../../qualtrics/QualtricsActionCreators";
import { SurveyActionTypes } from "../../../_bundle/Module9280";
import QuestHomeEmptyState from "./QuestHomeEmptyState";
import { Button } from "../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../intl/index.native";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { openUserSettings } from "../../user_settings/core/native/openUserSettings";
import { useShouldShowPreviewToolTab, useFilteredQuests, QuestTabs, useQuestHomeSortingFilteringAnalytics, useFetchQuestHomeBounties } from "../hooks/QuestHooks";
import { useBountiesExperience } from "../experiments/useBountiesExperience";
import { Text } from "../../../design/components/Text/native/Text";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import openBountiesNuxPromoSheet from "./openBountiesNuxPromoSheet";
import { CircleInformationIcon } from "../../../design/components/Icon/native/redesign/generated/CircleInformationIcon";
import QuestHomeBounties from "./QuestHomeBounties";
import { getIsEligibleForQuests } from "../lib/QuestsEligibility";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { isQuestExpired, findQuestOrReplacement } from "../utils/QuestDataUtils";
import { markAdContentSeen } from "../QuestActionCreators";
import { AdCreativeType } from "../../../_bundle/Module6013";
import ToastActionCreators from "../../toast/native/ToastActionCreators";
import Module9172 from "../../../_bundle/Module9172";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import useTrackImpression from "../../app_analytics/useTrackImpression";
import { ImpressionNames, ImpressionTypes } from "../../../_bundle/Module503";
import { QuestHomeOpenTriggerPoint } from "../../experiments/trigger_points/QuestHomeOpenTriggerPoint";
import { useVirtualCurrencyMobileEnabled } from "../../virtual_currency/hooks/native/useVirtualCurrencyMobileEnabled";
import { OrbsHoldoutExperiment } from "../experiments/OrbsHoldoutExperiment";
import { useRoute } from "../../../_bundle/Module1481";
import { QuestContent } from "../QuestTypes";
import * as _QuestUtils from "../utils/QuestUtils";
import { BountiesShopCarouselExperiment } from "../experiments/BountiesShopCarouselExperiment";
import { useQuestHomeOrbShopCarouselData } from "./QuestHomeOrbShopCarousel";
import { QuestContentImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
import { QuestCard } from "./QuestCard";
import QuestHomeRoundtripTracker from "../QuestHomeRoundtripTracker";
import { FlashList } from "../../../_bundle/noop_6676";
let useStyles, EmptyStateFiltered, HeaderPreviewButton, HeaderWithBounties, Component;
const EmptyStateNoQuestsAvailable = function EmptyStateNoQuestsAvailable() {
const navigation = useNavigation();
const callback5 = useCallback(() => navigation.goBack(), [navigation]);
return <QuestHomeEmptyState action={<Button variant="secondary" text={intl.string(t["/g10LC"])} onPress={callback5} />} />;
};
EmptyStateFiltered = function EmptyStateFiltered(props) {
const onClearFilters = props.onClearFilters;
return <QuestHomeEmptyState action={<Button variant="secondary" text={intl.string(t.urZl31)} onPress={onClearFilters} />} title={intl.string(t.PBfFnx)} subtitle={intl.string(t.nwdKFC)} />;
};
HeaderPreviewButton = function HeaderPreviewButton() {
const styles = useStyles();
const callback5 = useCallback(() => {
ModalActionCreators.popAll();
openUserSettings({
screen: UserSettingsSections.QUEST_PREVIEW_TOOL_2
});
}, []);
return useShouldShowPreviewToolTab() ? <View style={styles.previewButton}>
<Button grow onPress={callback5} variant="primary" text={intl.string(t.tx5Ax5)} />
</View> : null;
};
HeaderWithBounties = function HeaderWithBounties(props) {
const { orbShopProducts, obtainableOrbRewards: obtainableOrbRewards2, showOrbShopPlaceholderCarousel } = props;
const styles = useStyles();
const verticalScrollEnabled2 = useBountiesExperience(QuestsExperimentLocations.QUEST_HOME_MOBILE).verticalScrollEnabled;
return <>
<HeaderPreviewButton />
{verticalScrollEnabled2 ? !verticalScrollEnabled2 : <View style={[styles.sectionHeader, styles.sectionHeaderRow]}>
<Text variant="text-lg/semibold" color="text-strong">
{intl.string(t.qetVDw)}
</Text>
<PressableOpacity onPress={openBountiesNuxPromoSheet} hitSlop={14} aria-label={intl.string(t.hvVgAZ)} accessibilityRole="button">
<CircleInformationIcon size="xs" color={Module712.colors.ICON_SUBTLE} />
</PressableOpacity>
</View>}
<QuestHomeBounties verticalScrollEnabled={verticalScrollEnabled2} orbShopProducts={orbShopProducts} obtainableOrbRewards={obtainableOrbRewards2} showOrbShopPlaceholderCarousel={showOrbShopPlaceholderCarousel} />
<View style={[styles.sectionHeader, styles.sectionHeaderWithTag]}>
<Text variant="text-lg/semibold" color="text-strong">
{intl.string(t.JALI2K)}
</Text>
</View>
</>;
};
useStyles = createStyles({
container: {
flex: 1
},
loadingContainer: {
...StyleSheet.absoluteFillObject,
justifyContent: "center",
alignItems: "center"
},
sectionHeader: {
marginBottom: Module712.space.PX_16,
paddingHorizontal: Module712.space.PX_16
},
sectionHeaderRow: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
},
previewButton: {
marginBottom: Module712.space.PX_16,
paddingHorizontal: Module712.space.PX_16,
backgroundColor: "transparent"
},
sectionHeaderWithTag: {
gap: Module712.space.PX_4
}
});
Component = Module19.memo(function({ shouldShowBounties, onLayout: onLayout2, orbShopProducts, obtainableOrbRewards: obtainableOrbRewards2, showOrbShopPlaceholderCarousel }) {
return <View onLayout={onLayout2}>
{shouldShowBounties ? <HeaderWithBounties orbShopProducts={orbShopProducts} obtainableOrbRewards={obtainableOrbRewards2} showOrbShopPlaceholderCarousel={showOrbShopPlaceholderCarousel} /> : <HeaderPreviewButton />}
</View>;
});
const r91 = Module19.memo(function QuestHome(props) {
let quests, excludedQuests, isFetchingCurrentQuests, hasFetched, stateFromStoresArray, ref, ref2, callback, callback2, ref3, verticalScrollEnabled, previewAdCreativeIds, isLoading, questHomeBounties, shouldShowBountiesGivenFilters, products, obtainableOrbRewards, showPlaceholderCarousel, c20857_22, ref4;
let memo, stateFromStores, ref5, ref6, callback3, state, setState, callback4;
const { containerStyle, isNavigationComplete, scrollToQuestId, filters, sortMethod, onClearFilters } = props;
quests = void 0;
excludedQuests = void 0;
isFetchingCurrentQuests = void 0;
hasFetched = void 0;
stateFromStoresArray = void 0;
ref = void 0;
ref2 = void 0;
callback = void 0;
callback2 = void 0;
ref3 = void 0;
verticalScrollEnabled = void 0;
previewAdCreativeIds = void 0;
isLoading = void 0;
questHomeBounties = void 0;
shouldShowBountiesGivenFilters = void 0;
products = void 0;
obtainableOrbRewards = void 0;
showPlaceholderCarousel = void 0;
c20857_22 = void 0;
ref4 = void 0;
const isEligibleForQuests = getIsEligibleForQuests();
const styles = useStyles();
const bottom = useSafeAreaInsets_native().bottom;
const filteredQuests = useFilteredQuests(QuestTabs.ALL, useMemo(() => ({
filters,
sortMethod
}), [filters, sortMethod]));
quests = filteredQuests.quests;
excludedQuests = filteredQuests.excludedQuests;
let isFetchingCurrentQuests2 = filteredQuests.isFetchingCurrentQuests;
isFetchingCurrentQuests = isFetchingCurrentQuests2;
hasFetched = filteredQuests.hasFetched;
stateFromStoresArray = useStateFromStoresArray([QuestStore], () => Array.from(QuestStore.quests.values()).filter((item) => !isQuestExpired(item)).map((item) => item.id).sort(), []);
useEffect(() => {
if (stateFromStoresArray.length > 0) {
markAdContentSeen(AdCreativeType.QUEST, stateFromStoresArray);
}
}, [stateFromStoresArray]);
ref = useRef(null);
const memo2 = useMemo(() => {
if (scrollToQuestId == null) {
return null;
}
const r13 = findQuestOrReplacement(scrollToQuestId, quests, excludedQuests);
let c27612_0 = r13;
return r13 == null ? null : quests.findIndex((quest) => quest.id === c27612_0.id);
}, [scrollToQuestId, quests, excludedQuests]);
useEffect(() => {
if (scrollToQuestId != null && scrollToQuestId !== "" && hasFetched && !isFetchingCurrentQuests && findQuestOrReplacement(scrollToQuestId, quests, excludedQuests) == null && ref.current !== scrollToQuestId) {
ToastActionCreators.open({
key: "QUEST_HOME_MOBILE_DEEP_LINK_QUEST_NOT_FOUND",
content: intl.string(t.sIyHuY),
icon: Module9172,
toastDurationMs: 5000
});
AnalyticsUtils.track(AnalyticEvents.QUEST_HOME_MOBILE_DEEP_LINK_MISSING_QUEST, {
quest_id: scrollToQuestId
});
ref.current = scrollToQuestId;
}
}, [scrollToQuestId, quests, excludedQuests, hasFetched, isFetchingCurrentQuests]);
memo = memo2;
stateFromStores = void 0;
ref5 = void 0;
ref6 = void 0;
callback3 = void 0;
state = void 0;
setState = void 0;
callback4 = void 0;
stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
ref5 = useRef(null);
ref6 = useRef({
parent: {
scrollY: 0
},
children: {}
});
callback3 = useCallback((a0) => {
for (const item2 of Object.keys(ref6.current.children)) {
if (!(a0 != null && item2 !== a0)) {
const r36 = ref6.current.children[item2];
if (r36 != null) {
const calculateVisibility = r36.calculateVisibility;
if (calculateVisibility != null) {
calculateVisibility.call(r36);
}
}
}
}
}, []);
const callback5 = useCallback((a0) => {
ref6.current.parent.scrollY = a0.nativeEvent.contentOffset.y;
callback3();
}, [callback3]);
const callback6 = useCallback((a0) => {
ref6.current.parent.layout = a0.nativeEvent.layout;
callback3();
}, [callback3]);
[state, setState] = useState(false);
const callback7 = useCallback(() => {
setState(true);
}, []);
const callback8 = useCallback((a0, a1) => {
ref6.current.children[a1] = {
...ref6.current.children[a1],
layout: a0.nativeEvent.layout
};
callback3(a1);
}, [callback3]);
callback4 = useCallback((a0) => {
if (ref5.current != null) {
ref5.current.scrollToIndex({
index: a0,
animated: !stateFromStores,
viewOffset: Module712.space.PX_8
});
}
}, [stateFromStores]);
const callback9 = useCallback((a0) => {
ref6.current.parent.firstItemOffset = a0.nativeEvent.layout.height;
callback3();
}, [callback3]);
useEffect(() => {
if (memo != null && memo !== -1 && state) {
callback4(memo);
QuestHomeNavigationStore.setState({
scrollToQuestId: null
});
}
}, [state, stateFromStores, memo, callback4]);
ref2 = ref5;
callback = callback8;
callback2 = callback9;
ref3 = ref6;
const r123 = QuestUtmStore((a0) => a0.getUtmCurrentContext());
useTrackImpression({
name: ImpressionNames.QUEST_HOME,
type: ImpressionTypes.VIEW,
properties: {
utm_source_current: r123.utmSourceCurrent,
utm_medium_current: r123.utmMediumCurrent,
utm_campaign_current: r123.utmCampaignCurrent,
utm_content_current: r123.utmContentCurrent,
tab: QuestTabs.ALL
}
});
useEffect(() => {
if (isEligibleForQuests) {
QuestHomeOpenTriggerPoint.trigger();
}
}, [isEligibleForQuests]);
useEffect(() => {
if (ref2.current != null && hasFetched) {
ref2.current.scrollToOffset({
offset: 0,
animated: false
});
}
}, [filters, sortMethod, hasFetched, ref5]);
useQuestHomeSortingFilteringAnalytics({
selectedSortMethod: sortMethod,
selectedFilters: filters,
numQuestsVisible: quests.length
});
let enabled = useVirtualCurrencyMobileEnabled().enabled;
const bountiesExperience = useBountiesExperience(QuestsExperimentLocations.QUEST_HOME_MOBILE);
const showBounties = bountiesExperience.showBounties;
verticalScrollEnabled = bountiesExperience.verticalScrollEnabled;
const enabled2 = OrbsHoldoutExperiment.useConfig({
location: QuestsExperimentLocations.QUEST_HOME_MOBILE
}).enabled;
previewAdCreativeIds = useRoute().params?.previewAdCreativeIds;
const fetchQuestHomeBounties = useFetchQuestHomeBounties({
previewAdCreativeIds
});
isLoading = fetchQuestHomeBounties.isLoading;
questHomeBounties = fetchQuestHomeBounties.questHomeBounties;
useEffect(() => {
if (previewAdCreativeIds != null && previewAdCreativeIds.length !== 0 && verticalScrollEnabled && !isLoading) {
const r7 = questHomeBounties.find((questHomeBounty) => previewAdCreativeIds.includes(questHomeBounty.id));
if (r7 != null) {
BountiesModalActionCreators.showModal({
bountyId: r7.id,
sourceQuestContent: QuestContent.VIDEO_MODAL_MOBILE
});
}
}
}, [previewAdCreativeIds, verticalScrollEnabled, isLoading, questHomeBounties]);
if (enabled) {
enabled = showBounties;
}
if (enabled) {
enabled = !enabled2;
}
if (enabled) {
enabled = _QuestUtils.shouldShowBountiesGivenFilters(filters);
}
shouldShowBountiesGivenFilters = enabled;
const config = BountiesShopCarouselExperiment.useConfig({
location: QuestsExperimentLocations.QUEST_HOME_MOBILE
});
let enabled3 = config.enabled;
const variation = config.variation;
if (enabled3) {
enabled3 = shouldShowBountiesGivenFilters;
}
const questHomeOrbShopCarouselData = useQuestHomeOrbShopCarouselData({
enabled: enabled3,
variation
});
products = questHomeOrbShopCarouselData.products;
obtainableOrbRewards = questHomeOrbShopCarouselData.obtainableOrbRewards;
showPlaceholderCarousel = questHomeOrbShopCarouselData.showPlaceholderCarousel;
const r216 = (shouldShowBountiesGivenFilters ? !isLoading : shouldShowBountiesGivenFilters) && questHomeBounties.length > 0;
let c20859_0 = r216;
const navigation2 = useNavigation();
const ref7 = useRef(false);
const ref8 = useRef(false);
const ref9 = useRef(false);
useEffect(() => {
if (c20859_0) {
ref7.current = true;
}
}, [r216]);
useEffect(() => {
const handleBountiesModalPush2 = function handleBountiesModalPush(a0) {
if (a0.key === BOUNTIES_MODAL_KEY) {
ref8.current = true;
}
};
Dispatcher.subscribe("MODAL_PUSH", handleBountiesModalPush2);
return () => {
Dispatcher.unsubscribe("MODAL_PUSH", handleBountiesModalPush2);
};
}, []);
useEffect(() => {
const handleClaimSuccess2 = function handleClaimSuccess() {
ref9.current = true;
};
Dispatcher.subscribe("BOUNTIES_CLAIM_REWARD_SUCCESS", handleClaimSuccess2);
return () => {
Dispatcher.unsubscribe("BOUNTIES_CLAIM_REWARD_SUCCESS", handleClaimSuccess2);
};
}, []);
useEffect(() => navigation2.addListener("beforeRemove", () => {
if (ref7.current) {
if (ref9.current) {
fireSurveyAction(SurveyActionTypes.BOUNTY_SESSION_COMPLETED);
} else if (ref8.current) {
fireSurveyAction(SurveyActionTypes.BOUNTY_ABANDONED);
} else {
fireSurveyAction(SurveyActionTypes.BOUNTY_IMMEDIATE_DISMISSAL);
}
}
}), [navigation2]);
const callback10 = useCallback(() => <Component shouldShowBounties={shouldShowBountiesGivenFilters} onLayout={callback2} orbShopProducts={products} obtainableOrbRewards={obtainableOrbRewards} showOrbShopPlaceholderCarousel={showPlaceholderCarousel} />, [shouldShowBountiesGivenFilters, callback2, products, obtainableOrbRewards, showPlaceholderCarousel]);
const callback11 = useCallback(({ item, index }) => <QuestContentImpressionTrackerNative questOrQuests={item} questContent={QuestContent.QUEST_HOME_MOBILE} questContentPosition={index} trackGuildAndChannelMetadata={false} visibilityRef={ref3} skipRemountKey sourceQuestContent={QuestContent.QUEST_HOME_MOBILE}>
{() => <QuestCard quest={item} questContentPosition={index} containerPadding={0} sourceQuestContent={QuestContent.QUEST_HOME_MOBILE} />}
</QuestContentImpressionTrackerNative>, [ref6]);
const callback12 = useCallback((a0) => {
return <View {...a0} onLayout={(event) => {
const r7 = quests[a0.index];
if (r7 != null) {
callback(event, r7.id);
}
a0.onLayout(event);
}} />;
}, [quests, callback]);
let r257 = isNavigationComplete ? shouldShowBountiesGivenFilters ? isLoading : shouldShowBountiesGivenFilters : !isNavigationComplete;
if (!r257) {
if (isFetchingCurrentQuests) {
isFetchingCurrentQuests2 = quests.length === 0;
}
r257 = isFetchingCurrentQuests2;
}
c20857_22 = r257;
ref4 = useRef(shouldShowBountiesGivenFilters);
useEffect(() => {
ref4.current = shouldShowBountiesGivenFilters;
}, [shouldShowBountiesGivenFilters]);
useEffect(() => {
if (isEligibleForQuests) {
QuestHomeRoundtripTracker.startTracking({
includesBounties: ref4.current
});
return () => {
QuestHomeRoundtripTracker.clearTracking();
};
}
}, [isEligibleForQuests]);
useEffect(() => {
let r1 = isEligibleForQuests;
if (isEligibleForQuests) {
r1 = !c20857_22;
}
if (r1) {
QuestHomeRoundtripTracker.stopTracking({
includesBounties: ref4.current
});
}
}, [isEligibleForQuests, r257]);
const shouldShowPreviewToolTab = useShouldShowPreviewToolTab();
return isEligibleForQuests ? r257 ? <View style={[styles.loadingContainer, containerStyle]}>
<ActivityIndicator animating />
</View> : quests.length === 0 ? filters.length === 0 ? <EmptyStateNoQuestsAvailable /> : <EmptyStateFiltered onClearFilters={onClearFilters} /> : <FlashList ref={ref5} contentContainerStyle={{
paddingTop: verticalScrollEnabled ? shouldShowPreviewToolTab ? Module712.space.PX_16 : 0 : Module712.space.PX_16,
paddingBottom: bottom
}} style={[styles.container, containerStyle]} accessibilityLabel={intl.string(t.JALI2K)} data={quests} renderItem={callback11} showsHorizontalScrollIndicator={false} ListHeaderComponent={callback10} CellRendererComponent={callback12} onLayout={callback6} onScroll={callback5} onLoad={callback7} scrollEventThrottle={16} /> : null;
});
export default r91;
+362
View File
@@ -0,0 +1,362 @@
// Metro module 14093 (f14094).
import * as Module19 from "react";
import { useRef, useState, useCallback, useMemo, useEffect } from "react";
import { View } from "react-native";
import BountyStore from "../BountyStore";
import { BountyCarouselEmptyStateReason } from "../QuestConstants";
import { ContentDismissActionType } from "../../dismissible_content/DismissibleContentConstants";
import Module712 from "../../../_bundle/Module712";
import BountyCard, { CARD_WIDTH } from "./BountyCard";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { useBountyCarouselEmptyStateAnalytics } from "../lib/analytics/AnalyticsHooks";
import { intl, t } from "../../../intl/index.native";
import { BountiesPosterIllocon } from "../../../design/assets/native";
import { Text } from "../../../design/components/Text/native/Text";
import openBountiesNuxPromoSheet, { PROMO_SHEET_KEY } from "./openBountiesNuxPromoSheet";
import { DismissibleContent } from "../../../_bundle/Module1358";
import { useSelectedDismissibleContent } from "../../dismissible_content/hooks/useSelectedDismissibleContent";
import Dispatcher from "../../../Dispatcher";
import { MIN_PRODUCTS_FOR_ORB_SHOP_CAROUSEL } from "../../collectibles/native/hooks/usePopularOrbShopProducts";
import { triggerHapticFeedback, HapticFeedbackTypes } from "../../haptics/HapticUtils.native";
import { trackBountyCarouselScroll, trackAdContentClicked } from "../lib/analytics/AnalyticsActions";
import { BountyScrollingType, HorizontalScrollingDirection, QuestContentCTA } from "../lib/analytics/AnalyticsTypes";
import { QuestContent } from "../QuestTypes";
import BountiesModalActionCreators, { BOUNTIES_MODAL_KEY } from "./BountiesModal/BountiesModalActionCreators";
import { runAfterInteractions } from "../../../utils/native/RunAfterInteractionsUtils";
import { shouldMigrateToAdAnalyticsInterface, AdAnalyticsInterfaceExperimentStep } from "../experiments/AdAnalyticsInterfaceExperiment";
import { captureAdUserAction } from "../../ads/analytics/captureAdUserAction";
import { AdUserActionType } from "../../ads/analytics/captureAdUserActionTypes";
import { AdCreativeType } from "../../../_bundle/Module6013";
import useIsCarouselInView from "./useIsCarouselInView";
import { BillableAdPlacementImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
import { FlashList } from "../../../_bundle/noop_6676";
import QuestHomeOrbShopCarousel from "./QuestHomeOrbShopCarousel";
import { useQuestHomeBounties } from "../hooks/QuestHooks";
import { useStateFromStores } from "../../../_bundle/Module589";
import BountiesCtaHeader from "./BountiesCtaHeader";
let PX_16, PX_162, c9859_13, useStyles, ItemSeparator, keyExtractor, QuestHomeBountiesCarousel;
const EmptyState = function EmptyState(props) {
const reason = props.reason;
const styles = useStyles();
useBountyCarouselEmptyStateAnalytics(reason);
return <View style={styles.emptyState}>
<BountiesPosterIllocon size={32} />
<View style={styles.emptyStateText}>
<Text variant="text-sm/semibold" color="text-default">
{reason === BountyCarouselEmptyStateReason.COMPLETED ? intl.string(t.O2hRaZ) : intl.string(t.TKuW8z)}
</Text>
<Text variant="text-xs/medium" color="text-muted">
{intl.format(reason === BountyCarouselEmptyStateReason.COMPLETED ? t["D/790X"] : t.ReqPds, {
onClickLearnMore: function onClickLearnMore() {
openBountiesNuxPromoSheet();
}
})}
</Text>
</View>
</View>;
};
ItemSeparator = function ItemSeparator() {
return <View style={{
width: PX_162
}} />;
};
keyExtractor = function keyExtractor(a0) {
return a0.id;
};
QuestHomeBountiesCarousel = function QuestHomeBountiesCarousel(props) {
let ref5, ref6, ref7, ref8, callback2, callback3, isInView;
const { bounties, orbShopProducts, obtainableOrbRewards, showOrbShopPlaceholderCarousel = false } = props;
ref5 = void 0;
ref6 = void 0;
ref7 = void 0;
ref8 = void 0;
callback2 = void 0;
callback3 = void 0;
isInView = void 0;
const styles = useStyles();
const r16 = obtainableOrbRewards > 0 && (orbShopProducts.length >= MIN_PRODUCTS_FOR_ORB_SHOP_CAROUSEL || showOrbShopPlaceholderCarousel);
const ref = useRef(null);
const [state, setState] = useState(0);
const [state2, setState2] = useState(0);
const [state3, setState3] = useState(false);
const ref2 = useRef(null);
const ref3 = useRef(false);
const ref4 = useRef({
parent: {
scrollX: 0
},
children: {},
axis: "horizontal"
});
const callback = useCallback((a0) => {
if (a0 != null) {
if (!Object.hasOwn(ref4.current.children, a0)) {
return void 0;
}
const r42 = ref4.current.children[a0];
if (r42 != null) {
const calculateVisibility2 = r42.calculateVisibility;
if (calculateVisibility2 != null) {
calculateVisibility2.call(r42);
}
}
} else {
for (const item2 of Object.values(ref4.current.children)) {
if (item2 != null) {
const calculateVisibility = item2.calculateVisibility;
if (calculateVisibility != null) {
calculateVisibility.call(item2);
}
}
}
}
}, []);
const callback8 = useCallback((a0) => {
setState(a0.nativeEvent.layout.width);
ref4.current.parent.layout = a0.nativeEvent.layout;
callback();
}, [callback]);
const memo = useMemo(() => new Array(bounties.length).fill(0).map((item, index) => index * c9859_13), [bounties.length]);
const callback7 = useCallback(() => <View style={{
width: Math.max(0, state - CARD_WIDTH - PX_16)
}} />, [state]);
ref5 = useRef(state2);
ref6 = useRef(null);
const callback6 = useCallback((a0) => {
const current2 = Math.round(a0.nativeEvent.contentOffset.x / c9859_13);
if (current2 !== ref5.current) {
ref5.current = current2;
const current3 = Date.now();
if (ref6.current == null || current3 - ref6.current >= 50) {
ref6.current = current3;
triggerHapticFeedback(HapticFeedbackTypes.IMPACT_LIGHT);
}
}
ref4.current.parent.scrollX = a0.nativeEvent.contentOffset.x;
callback();
}, [callback]);
ref7 = useRef(false);
ref8 = useRef(null);
const callback5 = useCallback(() => {
ref7.current = false;
if (ref8.current != null) {
clearTimeout(ref8.current);
ref8.current = null;
}
}, []);
const callback4 = useCallback((a0) => {
const carouselPosition = Math.round(a0.nativeEvent.contentOffset.x / c9859_13);
const current2 = ref7.current;
ref7.current = false;
if (carouselPosition !== state2) {
trackBountyCarouselScroll({
scrollingType: current2 ? BountyScrollingType.AUTO : BountyScrollingType.MANUAL,
scrollingDirection: carouselPosition > state2 ? HorizontalScrollingDirection.RIGHT : HorizontalScrollingDirection.LEFT,
carouselPosition,
questContent: QuestContent.QUEST_HOME_MOBILE_CAROUSEL
});
setState2(carouselPosition);
}
}, [state2]);
callback2 = useCallback((c27625_0) => {
if (ref8.current != null) {
clearTimeout(ref8.current);
ref8.current = null;
}
ref8.current = setTimeout(() => {
ref7.current = true;
const current2 = ref.current;
if (current2 != null) {
current2.scrollToOffset({
offset: c27625_0 * c9859_13,
animated: true
});
}
ref8.current = null;
}, 350);
}, []);
useEffect(() => () => {
if (ref8.current != null) {
clearTimeout(ref8.current);
ref8.current = null;
}
}, []);
useEffect(() => {
const handleModalClose2 = function handleModalClose(a0) {
if (a0.key === BOUNTIES_MODAL_KEY) {
let c30698_1, c30698_2;
setState3(false);
const current = ref2.current;
ref2.current = null;
if (current != null) {
let r21 = BountyStore.isBountyCompleted(current) && !ref3.current;
ref3.current = false;
const r27 = bounties.findIndex((bounty) => bounty.id === current);
c30698_1 = r27;
if (r27 !== -1) {
const r30 = bounties.findIndex((bounty, index) => index > state2 && index > c30698_1 && !BountyStore.isBountyCompleted(bounty.id));
c30698_2 = r30;
if (r21) {
r21 = r30 !== -1;
}
if (r21) {
r21 = r30 <= state2 + 3;
}
if (r21) {
runAfterInteractions(() => {
callback2(c30698_2);
});
}
}
}
}
};
Dispatcher.subscribe("MODAL_POP", handleModalClose2);
return () => {
Dispatcher.unsubscribe("MODAL_POP", handleModalClose2);
};
}, [bounties, state2, callback2]);
callback3 = useCallback((a0, a1) => {
if (shouldMigrateToAdAnalyticsInterface(AdAnalyticsInterfaceExperimentStep.STEP_2_CLICKED_INTERNAL, "quest_home_bounties")) {
captureAdUserAction({
type: AdUserActionType.CLICK_INTERNAL,
adCreativeType: AdCreativeType.BOUNTY,
adCreativeId: a0.id,
questContentCTA: QuestContentCTA.START_BOUNTY,
surfaceId: QuestContent.QUEST_HOME_MOBILE_CAROUSEL,
sourceQuestContent: QuestContent.QUEST_HOME_MOBILE_CAROUSEL,
questContentPosition: a1
});
} else {
trackAdContentClicked({
adContentId: a0.id,
adCreativeType: AdCreativeType.BOUNTY,
questContent: QuestContent.QUEST_HOME_MOBILE_CAROUSEL,
questContentCTA: QuestContentCTA.START_BOUNTY,
sourceQuestContent: QuestContent.QUEST_HOME_MOBILE_CAROUSEL,
questContentPosition: a1
});
}
ref2.current = a0.id;
ref3.current = BountyStore.isBountyCompleted(a0.id);
setState3(true);
BountiesModalActionCreators.showModal({
bountyId: a0.id,
sourceQuestContent: QuestContent.QUEST_HOME_MOBILE_CAROUSEL
});
}, []);
const isCarouselInView = useIsCarouselInView();
const containerRef = isCarouselInView.containerRef;
isInView = isCarouselInView.isInView;
const callback9 = useCallback(({ item, index }) => <BillableAdPlacementImpressionTrackerNative key={item.id} adContentId={item.id} adCreativeType={AdCreativeType.BOUNTY} questContent={QuestContent.QUEST_HOME_MOBILE_CAROUSEL} questContentPosition={index} trackGuildAndChannelMetadata={false} visibilityRef={ref4} sourceQuestContent={QuestContent.QUEST_HOME_MOBILE_CAROUSEL} overrideVisibility={!!isInView && void 0}>
{() => <BountyCard bounty={item} index={index} isActive={index === state2} isModalVisible={state3} onPress={callback3} />}
</BillableAdPlacementImpressionTrackerNative>, [state2, callback3, isInView, state3]);
const callback10 = useCallback((a0) => {
return <View {...a0} onLayout={(event) => {
const r13 = bounties[a0.index];
if (r13 != null) {
ref4.current.children[r13.id] = {
...ref4.current.children[r13.id],
layout: event.nativeEvent.layout
};
callback(r13.id);
}
a0.onLayout(event);
}} />;
}, [bounties, callback]);
return <View style={styles.container}>
<View ref={containerRef} onLayout={callback8}>
<FlashList ref={ref} horizontal data={bounties} renderItem={callback9} keyExtractor={keyExtractor} contentContainerStyle={styles.listContentContainer} snapToOffsets={memo} snapToEnd={false} decelerationRate="fast" showsHorizontalScrollIndicator={false} ItemSeparatorComponent={ItemSeparator} ListFooterComponent={callback7} onScroll={callback6} onScrollBeginDrag={callback5} onMomentumScrollEnd={callback4} scrollEventThrottle={16} extraData={useMemo(() => ({
isInView,
activeIndex: state2,
isModalVisible: state3
}), [isInView, state2, state3])} CellRendererComponent={callback10} />
</View>
{r16 ? <QuestHomeOrbShopCarousel orbShopProducts={orbShopProducts} obtainableOrbRewards={obtainableOrbRewards} showOrbShopPlaceholderCarousel={showOrbShopPlaceholderCarousel} /> : null}
</View>;
};
PX_16 = Module712.space.PX_16;
PX_162 = Module712.space.PX_16;
c9859_13 = CARD_WIDTH + PX_162;
useStyles = createStyles(() => ({
container: {
marginBottom: Module712.space.PX_48
},
listContentContainer: {
paddingLeft: PX_16
},
emptyState: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_12,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderRadius: Module712.radii.lg,
overflow: "hidden",
paddingHorizontal: Module712.space.PX_16,
paddingVertical: 14,
marginHorizontal: Module712.space.PX_16
},
emptyStateText: {
flex: 1,
gap: 2
}
}));
const r55 = Module19.memo(function QuestHomeBounties(props) {
let r67, r89;
const { verticalScrollEnabled, orbShopProducts, obtainableOrbRewards, showOrbShopPlaceholderCarousel = false } = props;
const questHomeBounties = useQuestHomeBounties().questHomeBounties;
const styles = useStyles();
const r3 = questHomeBounties.length > 0;
const [r15, r12] = useSelectedDismissibleContent(r3 ? [DismissibleContent.BOUNTIES_NUX_PROMO_SHEET] : []);
let c20897_0 = r15;
let c20897_1 = r12;
const ref9 = useRef(false);
useEffect(() => {
if (!(c20897_0 !== DismissibleContent.BOUNTIES_NUX_PROMO_SHEET || ref9.current)) {
ref9.current = true;
openBountiesNuxPromoSheet();
}
}, [r15]);
useEffect(() => {
const handleHide2 = function handleHide(a0) {
if (a0.key === PROMO_SHEET_KEY) {
c20897_1(ContentDismissActionType.USER_DISMISS);
}
};
if (c20897_0 === DismissibleContent.BOUNTIES_NUX_PROMO_SHEET) {
Dispatcher.subscribe("HIDE_ACTION_SHEET", handleHide2);
return () => {
Dispatcher.unsubscribe("HIDE_ACTION_SHEET", handleHide2);
};
}
}, [r15, r12]);
let isEmptyOrCompleted = questHomeBounties.length === 0;
const stateFromStores = useStateFromStores([BountyStore], () => BountyStore.areAllBountiesCompleted());
const r17 = (isEmptyOrCompleted ? !isEmptyOrCompleted : !stateFromStores) && obtainableOrbRewards > 0 && (orbShopProducts.length >= MIN_PRODUCTS_FOR_ORB_SHOP_CAROUSEL || showOrbShopPlaceholderCarousel);
L30: {
if (!isEmptyOrCompleted && !stateFromStores) {
if (verticalScrollEnabled) {
r67 = <View style={styles.container}>
<BountiesCtaHeader bounties={questHomeBounties} />
{r17 ? <QuestHomeOrbShopCarousel orbShopProducts={orbShopProducts} obtainableOrbRewards={obtainableOrbRewards} showOrbShopPlaceholderCarousel={showOrbShopPlaceholderCarousel} /> : null}
</View>;
break L30;
}
r67 = <QuestHomeBountiesCarousel bounties={questHomeBounties} orbShopProducts={orbShopProducts} obtainableOrbRewards={obtainableOrbRewards} showOrbShopPlaceholderCarousel={showOrbShopPlaceholderCarousel} />;
} else {
if (verticalScrollEnabled) {
if (!isEmptyOrCompleted) {
isEmptyOrCompleted = stateFromStores;
}
r89 = <BountiesCtaHeader bounties={questHomeBounties} isEmptyOrCompleted={isEmptyOrCompleted} />;
} else {
r89 = <EmptyState reason={isEmptyOrCompleted ? BountyCarouselEmptyStateReason.EMPTY : BountyCarouselEmptyStateReason.COMPLETED} />;
}
r67 = <View style={styles.container}>{r89}</View>;
}
}
return r67;
});
export default r55;
@@ -0,0 +1,74 @@
// Metro module 14089 (f14090).
import { ImageBackground, View } from "react-native";
import { VerticalGradient } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { intl, t } from "../../../intl/index.native";
import { useToken } from "../../../design/tokens/native/useToken";
import useChatLayout from "../../chat/native/useChatLayout";
import { SafeAreaPaddingView } from "../../../components_native/common/SafeAreaView";
import { isAndroid } from "../../../utils/PlatformUtils";
import { Text } from "../../../design/components/Text/native/Text";
import Module14090 from "../../../_bundle/Module14090";
import Module4611 from "../../../_bundle/Module4611";
const useStyles = createStyles({
container: {
flex: 1
},
emptyStateContainer: {
justifyContent: "center",
alignItems: "center",
flex: 1
},
emptyStateContentContainer: {
top: -55,
paddingHorizontal: Module712.space.PX_32
},
emptyStateContentTitle: {
textAlign: "center"
},
emptyStateContentDescription: {
textAlign: "center",
marginTop: 4
},
emptyImage: {
flex: 1,
width: "100%",
aspectRatio: 1.6375545851528384,
minWidth: "100%",
position: "absolute",
bottom: 0,
zIndex: -1
},
gradient: {
height: 22,
width: "100%",
position: "absolute",
bottom: 0
},
actionWrapper: {
marginTop: 16,
alignSelf: "center"
}
});
export default function QuestHomeEmptyState(props) {
const { action, title = intl.string(t.SdlRnK), subtitle = intl.string(t["R7mv+G"]) } = props;
const styles = useStyles();
const token = useToken(Module712.colors.BACKGROUND_BASE_LOWER);
const isChatLockedOpen = useChatLayout().isChatLockedOpen;
return <SafeAreaPaddingView bottom={isAndroid()} style={styles.container}>
<View style={styles.container}>
<View style={styles.emptyStateContainer}>
<View style={styles.emptyStateContentContainer}>
<Text variant="heading-xl/bold" color="mobile-text-heading-primary" style={styles.emptyStateContentTitle}>{title}</Text>
<Text variant="text-md/normal" color="text-default" style={styles.emptyStateContentDescription}>{subtitle}</Text>
{action != null && <View style={styles.actionWrapper}>{action}</View>}
</View>
{isChatLockedOpen ? null : <>
<ImageBackground style={styles.emptyImage} source={Module14090} resizeMode="cover" />
<Module4611 style={styles.gradient} end={VerticalGradient.END} start={VerticalGradient.START} colors={["rgba(0, 0, 0, 0)", token]} />
</>}
</View>
</View>
</SafeAreaPaddingView>;
};
@@ -0,0 +1,139 @@
// Metro module 14108 (f14109).
import { useCallback, useState, useRef, useEffect } from "react";
import { View } from "react-native";
import BountyStore from "../BountyStore";
import { QuestsExperimentLocations } from "../QuestConstants";
import Module712 from "../../../_bundle/Module712";
import { COLLECTIBLES_SHOP_CARD_WIDTH } from "../../collectibles/native/CollectiblesShopCardV2";
import { MIN_PRODUCTS_FOR_ORB_SHOP_CAROUSEL, usePopularOrbShopProducts } from "../../collectibles/native/hooks/usePopularOrbShopProducts";
import { BountiesStage1Experiment } from "../experiments/BountiesStage1Experiment";
import { useStateFromStores } from "../../../_bundle/Module589";
import { Heading } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import SkeletonCard from "../../collectibles/native/SkeletonCard";
import QuestHomeOrbShopRewardCard, { QUEST_HOME_ORB_SHOP_REWARD_CARD_HEIGHT } from "./QuestHomeOrbShopRewardCard";
import { FlashList } from "../../../_bundle/noop_6676";
import { trackQuestHomeOrbShopCarouselViewed, trackQuestHomeOrbShopCarouselScroll } from "../lib/analytics/AnalyticsActions";
import { HorizontalScrollingDirection } from "../lib/analytics/AnalyticsTypes";
import { CollectiblesAnalyticsProvider } from "../../collectibles/CollectiblesAnalyticsContext";
import { LayerScope } from "../../../design/components/Layers/native/LayerScope.native";
let PX_16, PX_12, snapToInterval, ItemSeparator, data, QuestHomeOrbShopCarouselHeading, QuestHomeOrbShopCarouselPlaceholder;
const ListEdgeSpacer = function ListEdgeSpacer() {
return <View style={{
width: PX_16
}} />;
};
ItemSeparator = function ItemSeparator() {
return <View style={{
width: PX_12
}} />;
};
QuestHomeOrbShopCarouselHeading = function QuestHomeOrbShopCarouselHeading(props) {
return <View style={{
paddingHorizontal: Module712.space.PX_16,
marginBottom: Module712.space.PX_16
}}>
<Heading variant="text-md/semibold">
{intl.format(t.CXlsRP, {
orbAmount: props.orbRewardAmount
})}
</Heading>
</View>;
};
QuestHomeOrbShopCarouselPlaceholder = function QuestHomeOrbShopCarouselPlaceholder() {
const callback = useCallback(() => <SkeletonCard height={QUEST_HOME_ORB_SHOP_REWARD_CARD_HEIGHT} />, []);
const callback2 = useCallback((a0) => `placeholder-${a0}`, []);
return <FlashList horizontal accessibilityRole="list" accessibilityLabel={intl.string(t.hVV8Wi)} accessibilityState={{
busy: true
}} data={data} keyExtractor={callback2} renderItem={callback} decelerationRate="fast" snapToInterval={snapToInterval} showsHorizontalScrollIndicator={false} ListHeaderComponent={ListEdgeSpacer} ListFooterComponent={ListEdgeSpacer} ItemSeparatorComponent={ItemSeparator} />;
};
PX_16 = Module712.space.PX_16;
PX_12 = Module712.space.PX_12;
snapToInterval = COLLECTIBLES_SHOP_CARD_WIDTH + PX_12;
data = Array.from({
length: MIN_PRODUCTS_FOR_ORB_SHOP_CAROUSEL
}, (a0, a1) => a1);
export default function QuestHomeOrbShopCarousel(props) {
let r45;
const { orbShopProducts, obtainableOrbRewards, showOrbShopPlaceholderCarousel = false } = props;
let c20913_2 = showOrbShopPlaceholderCarousel;
const [state, setState] = useState(0);
const length = orbShopProducts.length;
const ref = useRef(false);
useEffect(() => {
if (!(ref.current || c20913_2 || orbShopProducts.length === 0)) {
ref.current = true;
trackQuestHomeOrbShopCarouselViewed({
obtainableOrbRewards,
carouselSize: orbShopProducts.length,
isPlaceholderCarousel: false
});
}
}, [obtainableOrbRewards, orbShopProducts.length, showOrbShopPlaceholderCarousel]);
const callback = useCallback((a0) => {
const carouselPosition = Math.round(a0.nativeEvent.contentOffset.x / snapToInterval);
if (carouselPosition !== state) {
trackQuestHomeOrbShopCarouselScroll({
scrollingDirection: carouselPosition > state ? HorizontalScrollingDirection.RIGHT : HorizontalScrollingDirection.LEFT,
carouselPosition,
carouselSize: length
});
setState(carouselPosition);
}
}, [state, length]);
const callback2 = useCallback((a0) => <CollectiblesAnalyticsProvider newValue={{
tilePosition: a0.index,
pageSection: "quest_home_orb_shop"
}}>
<QuestHomeOrbShopRewardCard product={a0.item} />
</CollectiblesAnalyticsProvider>, []);
const callback3 = useCallback((a0) => a0.skuId, []);
const r42 = obtainableOrbRewards <= 0;
let r43 = null;
if (!r42) {
L9: {
if (!showOrbShopPlaceholderCarousel) {
const length2 = orbShopProducts.length;
r45 = null;
if (length2 === 0) {
break L9;
}
}
r45 = <View style={{
marginTop: Module712.space.PX_48
}}>
<QuestHomeOrbShopCarouselHeading orbRewardAmount={obtainableOrbRewards} />
<View>
<LayerScope>
{showOrbShopPlaceholderCarousel ? <QuestHomeOrbShopCarouselPlaceholder /> : <FlashList horizontal accessibilityRole="list" accessibilityLabel={intl.string(t.hVV8Wi)} data={orbShopProducts} keyExtractor={callback3} renderItem={callback2} decelerationRate="fast" snapToInterval={snapToInterval} showsHorizontalScrollIndicator={false} ListHeaderComponent={ListEdgeSpacer} ListFooterComponent={ListEdgeSpacer} ItemSeparatorComponent={ItemSeparator} onMomentumScrollEnd={callback} />}
</LayerScope>
</View>
</View>;
}
r43 = r45;
}
return r43;
};
export function useQuestHomeOrbShopCarouselData({ enabled, variation }) {
const orbAmount = BountiesStage1Experiment.useConfig({
location: QuestsExperimentLocations.QUEST_HOME_MOBILE
}).orbAmount;
const stateFromStores = useStateFromStores([BountyStore], () => {
let r0 = 0;
for (const questHomeBounty of BountyStore.questHomeBounties) {
if (!BountyStore.isBountyCompleted(questHomeBounty.id)) {
r0 = r0 + orbAmount;
}
}
return r0;
});
const popularOrbShopProducts = usePopularOrbShopProducts({
enabled,
variation
});
return {
products: popularOrbShopProducts.products,
obtainableOrbRewards: stateFromStores,
showPlaceholderCarousel: popularOrbShopProducts.showPlaceholderCarousel
};
}
@@ -0,0 +1,39 @@
// Metro module 14110 (f14111).
import { useMemo } from "react";
import { View } from "react-native";
import UserStore from "../../../stores/UserStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { COLLECTIBLES_SHOP_CARD_WIDTH, COLLECTIBLES_SHOP_CARD_HEIGHT } from "../../collectibles/native/CollectiblesShopCardV2";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStores } from "../../../_bundle/Module589";
import PremiumUtils from "../../../utils/PremiumUtils";
import { getProductOrbPrice } from "../../collectibles/utils/CollectiblesProductUtils";
import { getProductName } from "../../collectibles/utils/getProductName";
import CollectiblesShopCardAssetTileV2 from "../../collectibles/native/CollectiblesShopCardAssetTileV2";
import CollectiblesShopCardCardDetailsV2 from "../../collectibles/native/CollectiblesShopCardCardDetailsV2";
const useStyles = createStyles({
card: {
width: COLLECTIBLES_SHOP_CARD_WIDTH,
height: COLLECTIBLES_SHOP_CARD_HEIGHT,
overflow: "hidden",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
borderWidth: 1,
borderColor: Module712.colors.BORDER_SUBTLE,
borderRadius: Module712.radii.sm
}
});
export default function QuestHomeOrbShopRewardCard(props) {
const product = props.product;
const styles = useStyles();
const stateFromStores = useStateFromStores([UserStore], () => PremiumUtils.canUseShopDiscounts(UserStore.getCurrentUser()));
const memo = useMemo(() => getProductOrbPrice({
product,
hasShopDiscount: stateFromStores
}), [product, stateFromStores]);
const productName = getProductName(product);
return memo != null ? <View style={styles.card} accessible accessibilityRole="text" accessibilityLabel={productName}>
<CollectiblesShopCardAssetTileV2 product={product} isPurchased={false} solidBackground />
<CollectiblesShopCardCardDetailsV2 product={product} collectibleProductState={null} hidePrice />
</View> : null;
};
export const QUEST_HOME_ORB_SHOP_REWARD_CARD_HEIGHT = COLLECTIBLES_SHOP_CARD_HEIGHT;
@@ -0,0 +1,96 @@
// Metro module 14027 (f14028).
import { useState, useEffect, useCallback } from "react";
import QuestHomeNavigationStore from "../QuestHomeNavigationStore";
import { QuestHomeSortMethods, getQuestHomeFilterOptionItem } from "../QuestConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import { shallow } from "../../../_bundle/Module3802";
import UserSettingsModalActionCreators from "../../../actions/UserSettingsModalActionCreators";
import useQuestHomeHeader from "./useQuestHomeHeader";
import QuestHome from "./QuestHome";
function $mk92453() {
return (a0) => a0 != null;
}
let $mk92452 = function() {
return (a0) => getQuestHomeFilterOptionItem(a0);
};
const useStyles = createStyles({
container: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST
}
});
let c9804_10 = [];
export default function QuestHomeSetting() {
let navigation, setState3;
const styles = useStyles();
const [selectedSortMethod, setState] = useState(() => {
let r6 = QuestHomeNavigationStore.getField("sort");
if (!(r6 != null && Object.values(QuestHomeSortMethods).includes(r6))) {
r6 = QuestHomeSortMethods.SUGGESTED;
}
return r6;
});
const [selectedFilters, setState2] = useState(() => {
let r16;
const field = QuestHomeNavigationStore.getField("filter");
if (field == null) {
r16 = c9804_10;
} else {
r16 = field.split(",").map($mk92452()).filter($mk92453());
if (!(r16.length > 0)) {
r16 = c9804_10;
}
}
return r16;
});
useEffect(() => QuestHomeNavigationStore.subscribe((a0) => ({
sort: a0.sort,
filter: a0.filter
}), (a0, a1) => {
let r35;
if (a0.sort !== a1.sort) {
let sort = a0.sort;
if (!(sort != null && Object.values(QuestHomeSortMethods).includes(sort))) {
sort = QuestHomeSortMethods.SUGGESTED;
}
setState(sort);
}
if (a0.filter !== a1.filter) {
const filter = a0.filter;
if (filter == null) {
r35 = c9804_10;
} else {
r35 = filter.split(",").map($mk92452()).filter($mk92453());
if (!(r35.length > 0)) {
r35 = c9804_10;
}
}
setState2(r35);
}
}, {
equalityFn: shallow,
fireImmediately: true
}), []);
navigation = void 0;
setState3 = void 0;
navigation = useNavigation();
let isNavigationComplete;
[isNavigationComplete, setState3] = useState(false);
useEffect(() => navigation.addListener("transitionEnd", () => setState3(true)), [navigation]);
const callback = useCallback(() => {
setState2(c9804_10);
}, []);
useEffect(() => () => {
UserSettingsModalActionCreators.close();
QuestHomeNavigationStore.resetState();
}, []);
const field = QuestHomeNavigationStore.useField("scrollToQuestId");
useQuestHomeHeader({
setSelectedSortMethod: setState,
setSelectedFilters: setState2,
selectedFilters,
selectedSortMethod
});
return <QuestHome containerStyle={styles.container} isNavigationComplete={isNavigationComplete} scrollToQuestId={field} sortMethod={selectedSortMethod} filters={selectedFilters} onClearFilters={callback} />;
};
@@ -0,0 +1,113 @@
// Metro module 14029 (f14030).
import { useState, useRef, useCallback } from "react";
import { View } from "react-native";
import { QuestHomeSortMethods } from "../QuestConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { SafeAreaPaddingView } from "../../../components_native/common/SafeAreaView";
import { ButtonGroup } from "../../../design/components/ButtonGroup/native/ButtonGroup.native";
import { Button } from "../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../intl/index.native";
import { useIsScreenReaderEnabled } from "../../a11y/native/useIsScreenReaderEnabled.native";
import { AccessibilityAnnouncer } from "../../../design/shared";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { useQuestHomeSortOptions, useQuestHomeFilterOptions } from "../hooks/QuestHooks";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { BottomSheetScrollView } from "../../../_bundle/Module5245";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import { TableRadioGroup } from "../../../design/components/TableRow/native/TableRadioGroup.native";
import { TableRadioRow } from "../../../design/components/TableRow/native/TableRadioRow.native";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableCheckboxRow } from "../../../design/components/TableRow/native/TableCheckboxRow.native";
import { getFilterTypeText } from "../utils/QuestCopyUtils";
let useStyles, c9806_10;
const FilterFooter = function FilterFooter(props) {
const { onConfirm, onReset, onLayout, inline = false } = props;
const styles = useStyles();
return <View style={inline ? styles.footerInline : [styles.footer, styles.content]} onLayout={onLayout}>
<SafeAreaPaddingView bottom>
<ButtonGroup direction="vertical" style={styles.footerButtonGroup}>
<Button size="lg" grow text={intl.string(t.i4jeWR)} onPress={onConfirm} />
<Button size="lg" grow text={intl.string(t.yBZMsQ)} onPress={onReset} variant="secondary" />
</ButtonGroup>
</SafeAreaPaddingView>
</View>;
};
useStyles = createStyles({
content: {
paddingHorizontal: Module712.space.PX_16
},
bodyContainer: {
flex: 1,
minHeight: 0
},
footerInline: {
paddingTop: Module712.space.PX_16
},
footer: {
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
footerButtonGroup: {
paddingBottom: 0
}
});
c9806_10 = [];
export default function QuestHomeSortingFilteringBottomSheet(props) {
let callback;
const { onSortMethodChange, onFiltersChange, initialSortMethod, initialFilters } = props;
const styles = useStyles();
let r11 = useIsScreenReaderEnabled();
const [state, setState] = useState(initialSortMethod);
const [state2, setState2] = useState(initialFilters);
const [paddingBottom, setState3] = useState(0);
const ref = useRef(null);
const callback3 = useCallback((a0) => {
setState3(a0.nativeEvent.layout.height);
}, []);
callback = useCallback((c27611_0, c27611_1) => {
setState2((prevState2) => c27611_1 ? [...prevState2, c27611_0] : prevState2.filter((item) => !(item.group === c27611_0.group && item.filter === c27611_0.filter)));
}, []);
const callback4 = useCallback(() => {
setState(QuestHomeSortMethods.SUGGESTED);
setState2(c9806_10);
const current = ref.current;
if (current != null) {
current.setValue(QuestHomeSortMethods.SUGGESTED);
}
AccessibilityAnnouncer.announce(intl.string(t.bK5N8u));
}, []);
const callback2 = useCallback(() => {
onSortMethodChange(state);
onFiltersChange(state2);
ActionSheetActionCreators.hideActionSheet("QuestHomeSortingFilteringBottomSheet");
}, [onSortMethodChange, onFiltersChange, state, state2]);
const questHomeSortOptions = useQuestHomeSortOptions();
const questHomeFilterOptions = useQuestHomeFilterOptions();
const props2 = {
header: <BottomSheetTitleHeader title={intl.string(t.UdhTtk)} />,
footer: r11 ? null : <FilterFooter onConfirm={callback2} onReset={callback4} onLayout={callback3} />,
scrollable: true,
startExpanded: true,
children: null
};
const contentContainerStyle = r11 ? void 0 : {
paddingBottom
};
const r125 = [<Stack spacing={Module712.space.PX_32}>
<TableRadioGroup groupRef={ref} hasIcons={false} defaultValue={state} onChange={setState} title={intl.string(t.tZXJIS)}>
{questHomeSortOptions.map((questHomeSortOption, index) => <TableRadioRow key={index} label={questHomeSortOption.label} value={questHomeSortOption.value} />)}
</TableRadioGroup>
{questHomeFilterOptions.map((questHomeFilterOption, index) => <TableRowGroup key={index} title={questHomeFilterOption.heading} hasIcons={false}>
{questHomeFilterOption.options.map((option, index) => {
return <TableCheckboxRow key={index} label={getFilterTypeText(option.filter)} onPress={(event) => callback(option, event)} checked={state2.some((item) => item.group === option.group && item.filter === option.filter)} />;
})}
</TableRowGroup>)}
</Stack>, ,];
if (r11) {
r11 = <FilterFooter onConfirm={callback2} onReset={callback4} inline />;
}
r125[1] = r11;
props2.children = <BottomSheetScrollView contentContainerStyle={contentContainerStyle} style={[styles.content, styles.bodyContainer]}>{r125}</BottomSheetScrollView>;
return <BottomSheet {...props2} />;
};
+215
View File
@@ -0,0 +1,215 @@
// Metro module 14118 (f14119).
import { useMemo, useEffect, useCallback } from "react";
import ActionSheetStore from "../../action_sheet/native/ActionSheetStore";
import ApplicationStore from "../../applications/ApplicationStore";
import QuestStore from "../QuestStore";
import { QUEST_REWARD_CODE_CLAIM_BOTTOM_SHEET_KEY, QuestVariants } from "../QuestConstants";
import { CAPTCHA_MODAL_KEY } from "../../captcha/CaptchaConstants";
import { ThemeTypes } from "../../../_bundle/Module505";
import { useQuestDockExternalOffset } from "./QuestDock/QuestDockHooks";
import NewAdRequestBehaviorExperiment from "../experiments/NewAdRequestBehaviorExperiment";
import { useStateFromStores } from "../../../_bundle/Module589";
import { QuestContent, AdPlacement } from "../QuestTypes";
import { isDismissed, getQuestForPlacement } from "../utils/QuestDataUtils";
import useQuestForPlacement from "../useQuestForPlacement";
import { useIsChannelFocused } from "../../panels/isChannelFocused.native";
import { coerceGuildsRoute, useCurrentNavigationRouteName } from "../../main_tabs_v2/helpers/NavigationRouteUtils.native";
import useIsWindowLarge from "../../screen/native/useIsWindowLarge";
import { useIsQuestExpired } from "../hooks/QuestHooks";
import { getIsEligibleForQuests } from "../lib/QuestsEligibility";
import { getQuestAsset, QuestAssetType, resolveAsset, EXTENSION_RE } from "../lib/AssetUtils";
import { hasWatchVideoOnMobileTasks, getActivityApplicationId } from "../utils/QuestTaskUtils";
import * as _canLaunchFrame from "../../frames/utils/canLaunchFrame";
import { canLaunchActivity } from "../utils/QuestUtils";
import isActivitySupportedOnClientPlatform from "../../activities/utils/isActivitySupportedOnClientPlatform";
import ApplicationActionCreators from "../../applications/ApplicationActionCreators";
import FramesActionCreators_native from "../../frames/FramesActionCreators.native";
import { launchActivityInBotDM } from "../../app_launcher/utils/AppLauncherPlayUtils";
let useIsMobileQuestDockRendered;
const useIsMobileQuestDockRenderedBase = function useIsMobileQuestDockRenderedBase(mobileQuestDock) {
let r42;
const isWindowLarge = useIsWindowLarge();
const stateFromStores3 = useStateFromStores([QuestStore], () => QuestStore.getQuestPreviewOverride(QuestContent.QUEST_BAR_MOBILE) != null, []);
const r21 = mobileQuestDock?.userStatus != null && isDismissed(mobileQuestDock.userStatus, QuestContent.QUEST_BAR_MOBILE);
const r30 = mobileQuestDock == null ? void 0 : mobileQuestDock.userStatus?.claimedAt;
L23: {
const r33 = r30 != null;
const isQuestExpired = useIsQuestExpired(mobileQuestDock);
const isEligibleForQuests = getIsEligibleForQuests();
if (stateFromStores3 && !r33) {
r42 = mobileQuestDock != null;
if (!r42) {
break L23;
}
r42 = !isWindowLarge;
} else {
r42 = mobileQuestDock != null && isEligibleForQuests && !isQuestExpired && !r33 && !r21 && !isWindowLarge;
}
}
return r42;
};
useIsMobileQuestDockRendered = function useIsMobileQuestDockRendered() {
let stateFromStores;
const enableNewRequestBehavior = NewAdRequestBehaviorExperiment.useConfig({
location: "QuestMobileDock"
}).enableNewRequestBehavior;
let r21 = useStateFromStores([QuestStore], () => QuestStore.getQuestPreviewOverride(QuestContent.QUEST_BAR_MOBILE), []);
let r27 = useStateFromStores([QuestStore], () => {
let r14 = getQuestForPlacement(QuestStore.quests, QuestStore.questToDeliverForPlacement, AdPlacement.MOBILE_HOME_DOCK_AREA);
if (r14 == null) {
r14 = null;
}
return r14;
});
stateFromStores = useStateFromStores([QuestStore], () => {
let r11 = QuestStore.questAdDecisionByPlacement.get(AdPlacement.MOBILE_HOME_DOCK_AREA);
if (r11 == null) {
r11 = null;
}
return r11;
});
const stateFromStores3 = useStateFromStores([QuestStore], () => {
const r7 = stateFromStores?.questId != null;
let r8 = null;
if (r7) {
let r12 = QuestStore.quests.get(stateFromStores.questId);
if (r12 == null) {
r12 = null;
}
r8 = r12;
}
return r8;
}, [stateFromStores]);
if (r21 == null) {
if (enableNewRequestBehavior) {
r27 = stateFromStores3;
}
r21 = r27;
}
return useIsMobileQuestDockRenderedBase(r21);
};
export function useMobileQuestDockHeight() {
const isMobileQuestDockRendered = useIsMobileQuestDockRendered();
const questDockExternalOffset = useQuestDockExternalOffset();
return isMobileQuestDockRendered ? questDockExternalOffset : 0;
}
export function useMobileQuestDock() {
const enableNewRequestBehavior = NewAdRequestBehaviorExperiment.useConfig({
location: "QuestMobileDock"
}).enableNewRequestBehavior;
let r18 = useStateFromStores([QuestStore], () => QuestStore.getQuestPreviewOverride(QuestContent.QUEST_BAR_MOBILE), []);
let r24 = useStateFromStores([QuestStore], () => {
let r14 = getQuestForPlacement(QuestStore.quests, QuestStore.questToDeliverForPlacement, AdPlacement.MOBILE_HOME_DOCK_AREA);
if (r14 == null) {
r14 = null;
}
return r14;
});
const questForPlacement = useQuestForPlacement(AdPlacement.MOBILE_HOME_DOCK_AREA);
if (r18 == null) {
if (enableNewRequestBehavior) {
r24 = questForPlacement;
}
r18 = r24;
}
return r18;
}
export function useIsMobileQuestDockVisibleToUser(c20921_0, a1) {
let r13 = a1;
const isChannelFocused = useIsChannelFocused();
let r22 = coerceGuildsRoute({
name: useCurrentNavigationRouteName()
}) != null;
let r28 = useStateFromStores([QuestStore], () => c20921_0 != null && QuestStore.isClaimingReward(c20921_0.id));
const stateFromStores3 = useStateFromStores([ActionSheetStore], () => {
const key = ActionSheetStore.getKey();
return key === CAPTCHA_MODAL_KEY || key === QUEST_REWARD_CODE_CLAIM_BOTTOM_SHEET_KEY;
});
if (a1) {
r13 = !isChannelFocused;
}
if (r13) {
if (!r22) {
if (r28) {
r28 = stateFromStores3;
}
r22 = r28;
}
r13 = r22;
}
return r13;
}
export { useIsMobileQuestDockRenderedBase };
export { useIsMobileQuestDockRendered };
export function useQuestGameLogotypeAssetUrl(a0) {
return useMemo(() => getQuestAsset(a0, QuestAssetType.LOGO_TYPE, ThemeTypes.DARK).url, [a0]);
}
export function useQuestDockHeroAsset(a0) {
return useMemo(() => {
const questAsset = getQuestAsset(a0, QuestAssetType.QUEST_BAR_HERO);
const videoAsset = a0.config.assets.questBarHeroVideo != null ? resolveAsset(a0.id, a0.config.assets.questBarHeroVideo) : null;
const { isAnimated, url } = questAsset;
return {
staticUrl: isAnimated ? url.replace(EXTENSION_RE, ".png") : url,
videoAsset
};
}, [a0]);
}
export function useHasWatchVideoOnMobileTasks(a0) {
const config = a0;
return useMemo(() => hasWatchVideoOnMobileTasks({
config
}), [a0]);
}
export function useMobileActivityQuest(a0) {
let canLaunchFrame, c20925_4;
const activityApplicationId = getActivityApplicationId(a0);
const stateFromStores2 = useStateFromStores([ApplicationStore], () => ApplicationStore.getApplication(activityApplicationId));
canLaunchFrame = _canLaunchFrame.canLaunchFrame(stateFromStores2);
let isMobileActivityQuest = canLaunchActivity(a0) && a0.config.features.includes(QuestVariants.MOBILE_ACTIVITY_QUEST) && isActivitySupportedOnClientPlatform(stateFromStores2 == null ? void 0 : stateFromStores2.embeddedActivityConfig?.supported_platforms);
if (isMobileActivityQuest) {
let r38 = canLaunchFrame;
if (!canLaunchFrame) {
r38 = (stateFromStores2 == null ? void 0 : stateFromStores2.bot?.id) != null;
}
isMobileActivityQuest = r38;
}
c20925_4 = isMobileActivityQuest;
useEffect(() => {
if (stateFromStores2 == null && activityApplicationId != null && a0.config.features.includes(QuestVariants.MOBILE_ACTIVITY_QUEST)) {
ApplicationActionCreators.fetchApplications([activityApplicationId], false);
}
}, [stateFromStores2, activityApplicationId, a0.config.features]);
return {
isMobileActivityQuest,
questApplication: stateFromStores2,
launchMobileActivity: useCallback(async () => {
L19: {
L18: {
L16: {
if (!c20925_4) {
break L19;
}
if (canLaunchFrame) {
await FramesActionCreators_native.launchFrame({
applicationId: stateFromStores2.id
});
break L18;
}
if ((stateFromStores2 == null ? void 0 : stateFromStores2.bot?.id) != null) {
await launchActivityInBotDM({
appId: stateFromStores2.id,
botId: stateFromStores2.bot.id,
analyticsLocations: []
});
break L16;
}
break L19;
}
return void 0;
}
return void 0;
}
}, [canLaunchFrame, stateFromStores2, isMobileActivityQuest])
};
}
@@ -0,0 +1,59 @@
// Metro module 14151 (f14152).
import { StyleSheet, View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import * as _themes from "../../../design/utils/shared/themes";
import { useTheme } from "../../../hooks/useTheme";
import Module4611 from "../../../_bundle/Module4611";
import FastImage from "../../../components_native/common/FastImage";
import Module14152 from "../../../_bundle/Module14152";
import Module14153 from "../../../_bundle/Module14153";
let _excluded, c9905_9;
const useStyles = createStyles((a0) => ({
wrapper: {
...StyleSheet.absoluteFillObject,
...a0 ? {
top: void 0
} : {
bottom: void 0
},
height: 380,
zIndex: 1
},
cloudsImage: {
...StyleSheet.absoluteFillObject,
...a0 ? {
top: void 0
} : {
bottom: void 0
},
...a0 ? {} : {
transform: [{
rotate: "180deg"
}]
},
width: "100%"
},
cloudsImageLight: {
...StyleSheet.absoluteFillObject,
bottom: void 0,
width: "100%"
},
gradient: {
...StyleSheet.absoluteFillObject,
opacity: 1
},
solidBackground: {
...StyleSheet.absoluteFillObject
}
}));
_excluded = ["#292252FF", "#1E1F2200"];
c9905_9 = _excluded.slice().reverse();
export default function QuestModalContentCloudBackground(props) {
const { align = "bottom", style, imgStyle, resizeMode: resizeMode2 = "cover" } = props;
const styles = useStyles(align === "bottom");
const isThemeDark = _themes.isThemeDark(useTheme());
return <View style={[styles.wrapper, style]}>
{isThemeDark ? <Module4611 colors={align === "top" ? _excluded : c9905_9} style={styles.gradient} /> : <View style={styles.solidBackground} />}
<FastImage style={[isThemeDark ? styles.cloudsImage : styles.cloudsImageLight, imgStyle]} source={isThemeDark ? Module14152 : Module14153} resizeMode={resizeMode2} />
</View>;
};
@@ -0,0 +1,123 @@
// Metro module 14190 (f14191).
import { useCallback, useMemo } from "react";
import { View } from "react-native";
import { AnalyticsPages, HelpdeskArticles, UserSettingsSections } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { openUserSettings } from "../../user_settings/core/native/openUserSettings";
import usePremiumFeatureUpsellGetNitro from "../../premium/roadblocks/native/hooks/usePremiumFeatureUpsellGetNitro";
import Linking from "../../../lib/native/Linking";
import HelpdeskUtils from "../../../utils/HelpdeskUtils";
import { Button } from "../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../intl/index.native";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { ActionSheetHeaderBar } from "../../../design/components/Sheet/native/ActionSheetHeaderBar.native";
import { NitroQuestOrbsMultiplierRive } from "../../../_bundle/Module3901";
import { Text } from "../../../design/components/Text/native/Text";
import * as _QuestOrbMultiplierUtils from "../utils/QuestOrbMultiplierUtils";
import { QuestOrbMultiplierEligibilityType } from "../utils/QuestOrbMultiplierUtils";
import Crepe_messages from "../../croissant/crepe/Crepe.messages";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import PremiumRewardGradient from "./PremiumRewardGradient";
let contentStyles, useStyles, SheetContent;
const Footer = function Footer(props) {
let props2;
const eligibleToReceivePremiumRewards = props.eligibleToReceivePremiumRewards;
const styles = useStyles();
const callback2 = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
openUserSettings({
screen: UserSettingsSections.PREMIUM
});
}, []);
const premiumFeatureUpsellGetNitro = usePremiumFeatureUpsellGetNitro(false, callback2, AnalyticsPages.QUEST_ORB_MULTIPLIER_PERK_INFO);
const { loading, onPress } = premiumFeatureUpsellGetNitro;
const callback = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
Linking.openURL(HelpdeskUtils.getArticleURL(HelpdeskArticles.VIRTUAL_CURRENCY_ORB_MULTIPLIER_LEARN_MORE));
}, []);
const callback3 = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
}, []);
const r36 = {
style: styles.buttonContainer,
children: null
};
if (eligibleToReceivePremiumRewards) {
r36.children = [<Button size="lg" text={intl.string(t.hvVgAZ)} variant="primary" onPress={callback} />, <Button size="lg" variant="secondary" text={intl.string(t.cpT0Cq)} onPress={callback3} />];
props2 = r36;
} else {
r36.children = [<Button size="lg" variant="primary" text={intl.string(t.pj0XBN)} onPress={onPress} loading={loading} />, <Button size="lg" variant="secondary" text={intl.string(t.PcTCB7)} onPress={callback2} />];
props2 = r36;
}
return <View {...props2} />;
};
SheetContent = function SheetContent(props) {
const { title, body, eligibleToReceivePremiumRewards } = props;
const styles = useStyles();
return <>
<ActionSheetHeaderBar variant="floating" />
<View style={[styles.container, {
marginBottom: useSafeAreaInsets_native().bottom
}]}>
<View style={styles.contentContainer}>
<View style={styles.riveContainer}>
<NitroQuestOrbsMultiplierRive />
</View>
<Text style={[styles.text, styles.title]} variant="display-md" color="mobile-text-heading-primary" accessibilityRole="header">{title}</Text>
<Text style={styles.text} variant="text-sm/normal">{body}</Text>
<Footer eligibleToReceivePremiumRewards={eligibleToReceivePremiumRewards} />
</View>
</View>
</>;
};
contentStyles = {
marginBottom: 0
};
useStyles = createStyles({
container: {
alignItems: "center",
paddingHorizontal: Module712.space.PX_16
},
contentContainer: {
alignItems: "center",
width: "100%",
marginTop: Module712.space.PX_48
},
text: {
textAlign: "center",
paddingHorizontal: Module712.space.PX_24,
paddingBottom: Module712.space.PX_16
},
buttonContainer: {
width: "100%",
gap: Module712.space.PX_12,
marginVertical: Module712.space.PX_16
},
title: {
textTransform: "uppercase",
textAlign: "center",
lineHeight: 34,
paddingHorizontal: 0
},
riveContainer: {
width: "100%",
height: 160
}
});
export default function QuestOrbMultiplierPerkInfoActionSheet(props) {
const { multiplier, orbMultiplierEligibility } = props;
const shouldReceiveQuestOrbMultiplier = _QuestOrbMultiplierUtils.shouldReceiveQuestOrbMultiplier(orbMultiplierEligibility);
return <BottomSheet scrollable={false} handleDisabled startExpanded contentStyles={contentStyles}>
<PremiumRewardGradient visible={orbMultiplierEligibility === QuestOrbMultiplierEligibilityType.NITRO || orbMultiplierEligibility === QuestOrbMultiplierEligibilityType.UPSELL}>
<SheetContent title={useMemo(() => orbMultiplierEligibility === QuestOrbMultiplierEligibilityType.CREPE ? intl.string(Crepe_messages.c5usUr) : intl.string(t.Csf5Ol), [orbMultiplierEligibility])} body={useMemo(() => orbMultiplierEligibility === QuestOrbMultiplierEligibilityType.CREPE ? intl.format(Crepe_messages.UkrcSH, {
bonusOrbMultiplier: multiplier
}) : shouldReceiveQuestOrbMultiplier ? intl.format(t.NpUfej, {
bonusOrbMultiplier: multiplier
}) : intl.format(t["G5k+lZ"], {
bonusOrbMultiplier: multiplier
}), [shouldReceiveQuestOrbMultiplier, orbMultiplierEligibility, multiplier])} eligibleToReceivePremiumRewards={shouldReceiveQuestOrbMultiplier} />
</PremiumRewardGradient>
</BottomSheet>;
};
@@ -0,0 +1,92 @@
// Metro module 14188 (f14189).
import { useMemo } from "react";
import { View, StyleSheet } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useTheme } from "../../../hooks/useTheme";
import * as _themes from "../../../design/utils/shared/themes";
import { useToken } from "../../../design/tokens/native/useToken";
import { hexOpacityToRgba } from "../../../utils/ColorUtils";
import { useQuestOrbRewardMultiplier } from "../hooks/QuestHooks";
import * as _QuestOrbMultiplierUtils from "../utils/QuestOrbMultiplierUtils";
import { QuestOrbMultiplierEligibilityType } from "../utils/QuestOrbMultiplierUtils";
import { intl, t } from "../../../intl/index.native";
import { NitroWheelIcon } from "../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import openQuestOrbMultiplierPerkInfoActionSheet from "./openQuestOrbMultiplierPerkInfoActionSheet";
import Module4611 from "../../../_bundle/Module4611";
const start = {
x: 0,
y: 0
};
const end = {
x: 1,
y: 0
};
const useStyles = createStyles({
fullGradientContainer: {
borderRadius: Module712.radii.round,
overflow: "hidden",
height: 19,
backgroundColor: "transparent"
},
fullGradient: {
...StyleSheet.absoluteFillObject,
borderRadius: Module712.radii.round
},
fullGradientContent: {
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
paddingHorizontal: Module712.space.PX_8,
gap: 4,
height: 19
}
});
export function QuestOrbMultiplierPerkPill(props) {
const { onPress: onPress2, questId, orbMultiplierEligibility } = props;
const styles = useStyles();
const isThemeDark = _themes.isThemeDark(useTheme());
const token3 = useToken(Module712.colors.EXPRESSIVE_GRADIENT_PINK_START, "dark");
const token4 = useToken(Module712.colors.EXPRESSIVE_GRADIENT_TENURE_BADGE_DIAMOND_END, "dark");
const token = useToken(Module712.colors.BACKGROUND_BASE_LOWEST, "dark");
const colors = [hexOpacityToRgba(token3, 1), hexOpacityToRgba(token4, 0.5)];
const token2 = useToken(Module712.colors.BACKGROUND_BRAND);
const questOrbRewardMultiplier = useQuestOrbRewardMultiplier(questId);
const shouldReceiveQuestOrbMultiplier = _QuestOrbMultiplierUtils.shouldReceiveQuestOrbMultiplier(orbMultiplierEligibility);
const r2 = orbMultiplierEligibility === QuestOrbMultiplierEligibilityType.CREPE;
let c21022_6 = r2;
const memo = useMemo(() => c21022_6 ? token2 : isThemeDark ? "transparent" : token, [r2, token, token2, isThemeDark]);
if (questOrbRewardMultiplier == null) {
return null;
}
const accessibilityLabel = shouldReceiveQuestOrbMultiplier ? intl.formatToPlainString(t.l2UfLG, {
bonusOrbMultiplier: questOrbRewardMultiplier
}) : intl.formatToPlainString(t["G+mKoo"], {
bonusOrbMultiplier: questOrbRewardMultiplier
});
let r98 = !r2;
const r112 = <>
{r2 ? r98 : <NitroWheelIcon size="xs" color="white" />}
<Text variant="text-xs/semibold" color="text-overlay-light">{accessibilityLabel}</Text>
</>;
if (!r2) {
r98 = <Module4611 style={styles.fullGradient} colors={colors} start={start} end={end} />;
}
return <PressableOpacity onPress={function onPress() {
if (questOrbRewardMultiplier != null) {
openQuestOrbMultiplierPerkInfoActionSheet(questOrbRewardMultiplier, orbMultiplierEligibility);
if (onPress2 != null) {
onPress2();
}
}
}} activeOpacity={0.8} accessibilityRole="button" accessibilityLabel={accessibilityLabel}>
<View style={[styles.fullGradientContainer, {
backgroundColor: memo
}]}>
{r98}
<View style={styles.fullGradientContent}>{r112}</View>
</View>
</PressableOpacity>;
}
@@ -0,0 +1,296 @@
// Metro module 10971 (f10972).
import { useState, useCallback, useEffect, memo, useRef } from "react";
import { ActivityIndicator, StyleSheet, View } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import UserStore from "../../../stores/UserStore";
import AppStateStore from "../../../stores/native/AppStateStore";
import { RewardFilterTypes } from "../QuestConstants";
import { Orientation } from "../../../Constants";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { OrbsIcon } from "../../../design/components/Icon/native/redesign/generated/OrbsIcon";
import { HeaderBackButton } from "../../../_bundle/Module5150";
import { XSmallIcon } from "../../../design/components/Icon/native/redesign/generated/XSmallIcon";
import { intl, t } from "../../../intl/index.native";
import FastImage from "../../../components_native/common/FastImage";
import { useAPNGPlayerControls, APNGPlayer } from "../../image/native/APNGPlayer.android";
import { isAndroid } from "../../../_bundle/Module501";
import Module10972 from "../../../_bundle/Module10972";
import { VideoComponent } from "../../../components_native/common/Video";
import Module10973 from "../../../_bundle/Module10973";
import Module10974 from "../../../_bundle/Module10974";
import Module10975 from "../../../_bundle/Module10975";
import Module10976 from "../../../_bundle/Module10976";
import { useStateFromStores } from "../../../_bundle/Module589";
import { useFetchVirtualCurrencyBalance } from "../../virtual_currency/hooks/index";
import { AppStates } from "../../../ConstantsIOS";
import { getQuestOrbRewardQuantityForUser } from "../utils/QuestRewardUtils";
import { lockOrientation, restoreDefaultOrientation } from "../../device/native/DeviceOrientation";
import { openQuestHome } from "./QuestUtils.native";
import { QuestContent } from "../QuestTypes";
import { SafeAreaPaddingView } from "../../../components_native/common/SafeAreaView";
import { Heading, Text } from "../../../design/components/Text/native/Text";
import { Button } from "../../../design/components/Button/native/Button.native";
let c7391_17, useStyles, useStyles2, useStyles3, CancelButton, Component3, Component2, Component, Component4, useStyles4, StaticOrb, AnimatedOrbContainer;
const OrbsBalance = function OrbsBalance(props) {
const balance2 = props.balance;
const styles3 = useStyles3();
return <>
<OrbsIcon size="xs" color={Module712.colors.WHITE} style={styles3.orbsIcon} />
<View style={styles3.spacer} />
{balance2}
</>;
};
CancelButton = function CancelButton() {
const styles = useStyles();
return <HeaderBackButton onPress={function onPress() {
ModalActionCreators.popWithKey(c7391_17);
}} backImage={() => <XSmallIcon size="lg" style={[styles.closeButtonIcon]} />} accessibilityLabel={intl.string(t.cpT0Cq)} labelVisible={false} style={styles.closeButton} />;
};
StaticOrb = function StaticOrb() {
return <View style={{
width: "100%",
height: "100%"
}}>
<FastImage source={{
uri: Module10974
}} style={useStyles4().animatedOrb} fade={false} />
</View>;
};
AnimatedOrbContainer = function AnimatedOrbContainer(props) {
const isAppActive = props.isAppActive;
const styles4 = useStyles4();
const [state, setState] = useState(false);
const [state2, setState2] = useState(false);
let [state3, setState3] = useState(true);
const callback = useCallback(() => {
setState(true);
}, []);
const callback2 = useCallback(() => {
setState2(true);
}, []);
useEffect(() => {
if (state && state2) {
let c26885_0 = setTimeout(() => {
setState3(false);
}, 1450);
return () => clearTimeout(c26885_0);
}
}, [state, state2]);
const r50 = [(state ? !state : !state2) && <View style={{
height: "100%"
}} />, <Component uri={Module10975} style={[styles4.animatedOrb, (state3 ? state3 : !state2) && {
opacity: 0
}]} onLoad={callback2} animate={state3 ? !state3 : isAppActive} />, ,];
if (state3) {
state3 = <Component uri={Module10976} style={[styles4.animatedOrb]} onLoad={callback} animate={isAppActive} />;
}
r50[2] = state3;
return <View style={{
width: "100%",
height: "100%"
}}>{r50}</View>;
};
c7391_17 = "QuestOrbsRewardModal";
useStyles = createStyles({
closeButton: {
alignSelf: "flex-start",
marginHorizontal: Module712.space.PX_16,
zIndex: 999
},
closeButtonIcon: {
tintColor: Module712.colors.WHITE
}
});
useStyles2 = createStyles(() => ({
root: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
background: StyleSheet.absoluteFillObject,
loading: {
justifyContent: "center",
alignItems: "center",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
...StyleSheet.absoluteFillObject
},
header: {
flexDirection: "row",
alignItems: "flex-end",
justifyContent: "flex-end"
},
main: {
flex: 2
},
animation: {
flex: 3
},
body: {
flex: 2,
flexDirection: "column",
justifyContent: "center",
gap: Module712.space.PX_16
},
title: {
textAlign: "center",
marginHorizontal: Module712.space.PX_32
},
buttonsContainer: {
padding: Module712.space.PX_24,
gap: Module712.space.PX_16
}
}));
useStyles3 = createStyles({
orbsIcon: {
transform: [{
translateY: 3
}]
},
spacer: {
width: 2
}
});
Component3 = memo(function({ uri, onLoad, animate = true }) {
useEffect(() => {
FastImage.preload(uri);
}, [uri]);
return <FastImage key={`orb-animate-${animate}`} source={{
uri
}} style={{
width: "100%",
height: "100%"
}} resizeMode="cover" enableAnimation={animate} onLoad={onLoad} usesSmallCache={false} fade={false} />;
});
Component2 = memo(function({ uri: uri2, onLoad, animate = true }) {
let c18424_0 = animate;
const ref = useRef(null);
const aPNGPlayerControls = useAPNGPlayerControls(ref);
useEffect(() => {
if (c18424_0) {
aPNGPlayerControls.play();
} else {
aPNGPlayerControls.stop();
}
}, [animate, aPNGPlayerControls]);
return <APNGPlayer ref={ref} url={uri2} autoplay={false} style={{
width: "100%",
height: "100%"
}} onLoad={onLoad} />;
});
Component = memo(function({ uri: uri2, style, onLoad, animate = true }) {
return <View style={style} renderToHardwareTextureAndroid needsOffscreenAlphaCompositing>
{isAndroid() ? <Component2 uri={uri2} onLoad={onLoad} animate={animate} /> : <Component3 uri={uri2} onLoad={onLoad} animate={animate} />}
</View>;
});
Component4 = memo(function({ useReducedMotion, style, onStaticBgLoad, onAnimatedBgLoad, isAppActive }) {
return <>
<FastImage source={{
uri: Module10972
}} style={style} resizeMode="cover" onLoad={onStaticBgLoad} />
{(useReducedMotion ? !useReducedMotion : isAppActive) && <VideoComponent source={{
uri: Module10973
}} style={style} resizeMode="cover" onLoad={onAnimatedBgLoad} disableFocus playInBackground preventsDisplaySleepDuringVideoPlayback={false} />}
</>;
});
useStyles4 = createStyles({
animatedOrb: {
position: "absolute",
height: "130%",
width: "130%",
left: "-15%",
top: "-15%",
pointerEvents: "none"
}
});
export default function QuestOrbsRewardModal(props) {
let balance, setState4, setState5;
const quest = props.quest;
balance = void 0;
setState4 = void 0;
setState5 = void 0;
const styles2 = useStyles2();
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
let balance2 = useFetchVirtualCurrencyBalance().balance;
balance = balance2;
let state;
[state, setState4] = useState(false);
let state2;
[state2, setState5] = useState(false);
const stateFromStores2 = useStateFromStores([AppStateStore], () => AppStateStore.getState());
const ACTIVE = AppStates.ACTIVE;
const stateFromStores3 = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
let count = quest.userStatus?.orbQuantityClaimed;
if (count == null) {
count = getQuestOrbRewardQuantityForUser(quest.config, stateFromStores3);
}
const isAppActive = stateFromStores2 === ACTIVE;
useEffect(() => {
lockOrientation(Orientation.PORTRAIT);
return () => {
restoreDefaultOrientation();
};
}, []);
const callback2 = useCallback(() => {
setState4(true);
}, []);
const callback3 = useCallback(() => {
setState5(true);
}, []);
const callback = useCallback(() => {
ModalActionCreators.popWithKey(c7391_17);
openQuestHome({
filter: RewardFilterTypes.VIRTUAL_CURRENCY,
fromContent: QuestContent.REWARD_MODAL
});
}, []);
const r95 = [<View style={StyleSheet.absoluteFill} accessible={false} accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
<Component4 useReducedMotion={stateFromStores} style={styles2.background} onStaticBgLoad={callback2} onAnimatedBgLoad={callback3} isAppActive={isAppActive} />
</View>, (state ? !state : stateFromStores || !state2) && <View style={styles2.loading}>
<ActivityIndicator animating />
</View>, ,];
if (!state) {
state = stateFromStores ? !stateFromStores : state2;
}
if (state) {
const r116 = [<View style={styles2.header}>
<CancelButton />
</View>, <View style={styles2.animation} accessible={false} accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
{stateFromStores ? <StaticOrb /> : <AnimatedOrbContainer isAppActive={isAppActive} />}
</View>, , ,];
const FIilK5 = t.FIilK5;
if (count == null) {
count = 0;
}
const r140 = [<Heading variant="heading-xl/bold" color="text-overlay-light" style={styles2.title}>
{intl.format(FIilK5, {
count
})}
</Heading>, ,];
if (balance == null) {
balance2 = 0;
}
r140[1] = <Text variant="text-md/normal" color="text-overlay-light" style={styles2.title}>
{balance2 >= 4100 ? intl.format(t["2dz2AL"], {
balanceHook: () => <OrbsBalance key="balance" balance={balance} />,
profileDecoHook: () => <Text key="profileDeco" variant="text-md/semibold" color="text-overlay-light">
{intl.string(t.pGDUH9)}
</Text>
}) : intl.format(t.rKHvlX, {
balanceHook: () => <OrbsBalance key="balance" balance={balance} />
})}
</Text>;
r116[2] = <View style={styles2.body}>{r140}</View>;
r116[3] = <View style={styles2.buttonsContainer}>
<Button onPress={callback} variant="primary" size="lg" text={intl.string(t.uJAMFX)} />
</View>;
state = <SafeAreaPaddingView style={[styles2.main]} top bottom left right>{r116}</SafeAreaPaddingView>;
}
r95[2] = state;
return <View style={styles2.root}>{r95}</View>;
};
export function openQuestOrbsRewardModal({ quest }) {
ModalActionCreators.pushLazy(async () => (await import("./QuestOrbsRewardModal.native")).default, {
quest
}, c7391_17);
}
@@ -0,0 +1,196 @@
// Metro module 15860 (f15861).
import { useCallback } from "react";
import { StyleSheet, View } from "react-native";
import QuestStore from "../QuestStore";
import { QuestsExperimentLocations } from "../QuestConstants";
import { ActivityPanelModes } from "../../activities/panel/ActivityPanelConstants";
import { createStyles, createStyleProperties } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStores } from "../../../_bundle/Module589";
import { QuestContentImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
import { QuestContent } from "../QuestTypes";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import Module8964 from "../../../_bundle/Module8964";
import { intl, t } from "../../../intl/index.native";
import { useIsScreenLandscape } from "../../screen/useIsScreenLandscape.native";
import { useGetOrFetchApplication } from "../../applications/useGetOrFetchApplications";
import { getActivityApplicationId } from "../utils/QuestTaskUtils";
import useEmbeddedActivityBackground from "../../activities/utils/useEmbeddedActivityBackground";
import { useQuestTaskDetails } from "../hooks/QuestHooks";
import { useQuestsInstructionsToWinReward } from "../hooks/QuestCopyHooks";
import { useQuestRewardClaimHandler } from "./QuestBottomSheet/QuestBottomSheetFooter";
import FramesActionCreators_native from "../../frames/FramesActionCreators.native";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { openQuestHome } from "./QuestUtils.native";
import { showShareActionSheet } from "../../action_sheet/native/showShareActionSheet";
import { getQuestUrl } from "../utils/QuestCopyUtils";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import FastImage from "../../../components_native/common/FastImage";
import Module4611 from "../../../_bundle/Module4611";
import { VerticalGradient } from "../../../ConstantsIOS";
import QuestRewardTile from "./QuestRewardTile";
import Module12238 from "../../../_bundle/Module12238";
import QuestContextMenu from "./QuestContextMenu";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import { Text } from "../../../design/components/Text/native/Text";
import { Button } from "../../../design/components/Button/native/Button.native";
let useStyles, styleProperties, QuestProgressBottomSheet;
const contextMenuButton = function contextMenuButton(a0) {
return <IconButton {...a0} icon={Module8964} variant="secondary-overlay" accessibilityLabel={intl.string(t["UKOtz+"])} size="sm" />;
};
QuestProgressBottomSheet = function QuestProgressBottomSheet(props) {
const quest = props.quest;
const isScreenLandscape = useIsScreenLandscape();
const styles = useStyles(isScreenLandscape);
const gradientEnd = styleProperties().gradientEnd;
const url = useEmbeddedActivityBackground({
applicationId: useGetOrFetchApplication(getActivityApplicationId(quest))?.id,
size: 600,
names: ["embedded_cover"]
}).url;
const questTaskDetails = useQuestTaskDetails(quest);
const r26 = intl.formatToPlainString(t.EAYZAr, {
questName: quest.config.messages.questName
});
const questsInstructionsToWinReward = useQuestsInstructionsToWinReward({
quest,
taskDetails: questTaskDetails,
location: QuestsExperimentLocations.QUEST_ACTIVITY_BOTTOM_SHEET,
sourceQuestContent: QuestContent.RUNNING_ACTIVITY
});
const r77 = quest.userStatus?.completedAt != null && quest.userStatus?.claimedAt == null;
const questRewardClaimHandler = useQuestRewardClaimHandler({
quest,
questContent: QuestContent.RUNNING_ACTIVITY,
sourceQuestContent: QuestContent.RUNNING_ACTIVITY
});
let isClaiming = questRewardClaimHandler.isClaiming;
const { claim, isLoading } = questRewardClaimHandler;
const callback3 = useCallback(async () => {
let c28169_0;
c28169_0 = void 0;
if (await claim()) {
FramesActionCreators_native.updateFramePanelMode(ActivityPanelModes.PIP);
}
}, [claim]);
let onPress = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
FramesActionCreators_native.updateFramePanelMode(ActivityPanelModes.PIP);
openQuestHome({
scrollToQuestId: quest.id,
fromContent: QuestContent.QUEST_BOTTOM_SHEET
});
}, [quest.id]);
const callback = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
showShareActionSheet({
message: getQuestUrl(quest.id)
});
}, [quest.id]);
const callback2 = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
}, []);
const r123 = [url != null && <FastImage source={{
uri: url
}} style={styles.heroImg} />, <Module4611 style={styles.heroGradient} start={VerticalGradient.START} end={VerticalGradient.END} colors={["rgba(0, 0, 0, 0)", gradientEnd]} />, , ,];
let width = 80;
const height = isScreenLandscape ? 56 : 80;
if (isScreenLandscape) {
width = 56;
}
r123[2] = <View style={styles.gameTileContainer}>
<QuestRewardTile quest={quest} height={height} width={width} />
</View>;
r123[3] = <View style={styles.contextMenuContainer}>
<IconButton icon={Module12238} onPress={callback} variant="secondary-overlay" size="sm" accessibilityLabel={intl.string(t.RDE0Sc)} />
<QuestContextMenu quest={quest} showShareLink location={QuestsExperimentLocations.QUEST_ACTIVITY_BOTTOM_SHEET} sourceQuestContent={QuestContent.RUNNING_ACTIVITY}>{contextMenuButton}</QuestContextMenu>
</View>;
const r177 = [<View style={styles.heroContainer}>{r123}</View>, ,];
const r204 = [<Stack direction="vertical" spacing={Module712.space.PX_8} style={styles.textContainer}>
<Text variant={isScreenLandscape ? "heading-md/bold" : "heading-lg/bold"} color="mobile-text-heading-primary">{r26}</Text>
<Text style={styles.questDescription} variant={isScreenLandscape ? "text-sm/normal" : "text-md/normal"} color="text-muted">{questsInstructionsToWinReward}</Text>
</Stack>, ,];
const props2 = {
size: "lg",
text: intl.string(r77 ? t.cfY4PE : t.LLLLPD),
onPress: null,
loading: null,
grow: true
};
if (r77) {
onPress = callback3;
}
props2.onPress = onPress;
if (!isClaiming) {
isClaiming = isLoading;
}
props2.loading = isClaiming;
r204[1] = <Stack direction="vertical" spacing={Module712.space.PX_12} style={styles.buttonsContainer}>
<Button {...props2} />
<Button size="lg" text={intl.string(t.cpT0Cq)} onPress={callback2} variant="secondary" grow />
</Stack>;
r177[1] = <View style={styles.contentContainer}>{r204}</View>;
return <BottomSheet handleDisabled startExpanded>{r177}</BottomSheet>;
};
useStyles = createStyles((a0) => ({
contentContainer: {
display: "flex",
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_16
},
heroContainer: {
height: a0 ? 125 : 140,
position: "relative",
marginBottom: a0 ? 0 : 52 + Module712.space.PX_8
},
heroImg: {
resizeMode: "cover",
...StyleSheet.absoluteFillObject,
borderTopLeftRadius: Module712.radii.lg,
borderTopRightRadius: Module712.radii.lg
},
heroGradient: {
...StyleSheet.absoluteFillObject,
borderTopLeftRadius: Module712.radii.lg,
borderTopRightRadius: Module712.radii.lg
},
gameTileContainer: {
position: "absolute",
bottom: a0 ? Module712.space.PX_12 : -52,
left: 0,
right: 0,
alignItems: "center"
},
contextMenuContainer: {
position: "absolute",
top: Module712.space.PX_16,
right: Module712.space.PX_16,
display: "flex",
flexDirection: "row",
gap: Module712.space.PX_16,
alignItems: "center"
},
textContainer: {
alignItems: "center",
paddingTop: a0 ? void 0 : Module712.space.PX_16,
gap: Module712.space.PX_8,
marginBottom: Module712.space.PX_16,
textAlign: "center"
},
questDescription: {
textAlign: "center"
},
buttonsContainer: {
paddingTop: a0 ? void 0 : Module712.space.PX_16
}
}));
styleProperties = createStyleProperties(() => ({
gradientEnd: Module712.colors.MOBILE_ACTIONSHEET_GRADIENT_BACKGROUND_DEFAULT
}));
export default function QuestProgressBottomSheetConnected(props) {
const questId = props.questId;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuest(questId));
return stateFromStores != null ? <QuestContentImpressionTrackerNative overrideVisibility questOrQuests={stateFromStores} questContent={QuestContent.RUNNING_ACTIVITY} sourceQuestContent={QuestContent.RUNNING_ACTIVITY}>
{() => <QuestProgressBottomSheet quest={stateFromStores} />}
</QuestContentImpressionTrackerNative> : null;
};
@@ -0,0 +1,237 @@
// Metro module 14155 (f14156).
import Module19, { useEffect, useMemo, useRef } from "react";
import { View } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle, useAnimatedProps, cancelAnimation } from "../../reanimated/ReanimatedRexport";
import { Circle, Svg, Defs, LinearGradient, Stop } from "../../../_bundle/Module8531";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStores } from "../../../_bundle/Module589";
import { withTiming } from "../../../design/animation/reanimated/timing/timing";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import { intl, t } from "../../../intl/index.native";
import LottieAnimationView from "../../../components_native/common/LottieAnimationView";
import * as _Module14156 from "../../../_bundle/Module14156";
import QuestRewardTile from "./QuestRewardTile";
let __initData, __initData2, __initData3;
const _excluded = ["#666777", "#535564"];
const AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Circle);
let c9907_13 = {
"x-sm": 40,
sm: 64,
md: 70,
"md-lg": 100,
lg: 128
};
const useStyles = createStyles((a0) => ({
wrapper: {
position: "relative"
},
container: {
position: "relative",
display: "flex",
justifyContent: "center",
alignItems: "center",
zIndex: 1
},
completionGlow: {
shadowOffset: {
width: 0,
height: 0
},
shadowRadius: 20,
shadowOpacity: 0,
elevation: 4,
shadowColor: "#30C77399"
},
canvas: {
transform: [{
rotate: "-90deg"
}]
},
imageContainer: {
position: "absolute",
height: 0.78 * a0,
width: 0.78 * a0,
borderRadius: Module712.radii.round,
overflow: "hidden"
},
progressPath: {
color: Module712.colors.STATUS_POSITIVE
},
confetti: {
position: "absolute",
pointerEvents: "none"
},
opacityMask: {
backgroundColor: Module712.colors.CARD_BACKGROUND_DEFAULT,
position: "absolute",
top: 0,
left: 0,
right: 0,
bottom: 0,
zIndex: 2
}
}));
__initData = {
code: "function QuestProgressIndicatorTsx1(){const{glowOpacity}=this.__closure;return{shadowOpacity:glowOpacity.get()};}"
};
__initData2 = {
code: "function QuestProgressIndicatorTsx2(){const{circumference,animatedProgress}=this.__closure;return{strokeDashoffset:circumference-circumference*animatedProgress.get()};}"
};
__initData3 = {
code: "function QuestProgressIndicatorTsx3(){const{underlayOpacity,styles}=this.__closure;return{opacity:underlayOpacity.get(),...styles.opacityMask};}"
};
const r47 = Module19.memo(function QuestProgressIndicator(props) {
let width, scale, c20961_5, styles, sharedValue, sharedValue2, c20961_9, sharedValue3, ref;
const { quest, size, progress, loading = false } = props;
let c20961_1 = loading;
const { hasConfetti = false, withAnimation, onPress, accessibilityLabel } = props;
width = void 0;
scale = void 0;
c20961_5 = void 0;
styles = void 0;
sharedValue = void 0;
sharedValue2 = void 0;
c20961_9 = void 0;
sharedValue3 = void 0;
ref = void 0;
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const strokeWidth = ({
"x-sm": 3,
sm: 3,
md: 3,
"md-lg": 4,
lg: 6
})[size];
width = c9907_13[size];
scale = ({
"x-sm": 1.6,
sm: 1,
md: 1.4,
"md-lg": 1.5,
lg: 1.6
})[size];
const r52 = width / 2 - strokeWidth / 2;
const circumference = 2 * Math.PI * r52;
c20961_5 = circumference;
styles = useStyles(width);
sharedValue = useSharedValue(progress);
sharedValue2 = useSharedValue(loading ? 0.7 : 0);
const r67 = quest.userStatus?.completedAt != null;
c20961_9 = r67;
sharedValue3 = useSharedValue(r67 ? 1 : 0);
const T = () => ({
shadowOpacity: sharedValue3.get()
});
T.__closure = {
glowOpacity: sharedValue3
};
T.__workletHash = 17183837725505;
T.__initData = __initData;
const animatedStyle = useAnimatedStyle(T);
const D = () => ({
strokeDashoffset: c20961_5 - c20961_5 * sharedValue.get()
});
D.__closure = {
circumference,
animatedProgress: sharedValue
};
D.__workletHash = 17281152506254;
D.__initData = __initData2;
const animatedProps = useAnimatedProps(D);
const R = () => ({
opacity: sharedValue2.get(),
...styles.opacityMask
});
R.__closure = {
underlayOpacity: sharedValue2,
styles
};
R.__workletHash = 4427598698568;
R.__initData = __initData3;
const animatedStyle2 = useAnimatedStyle(R);
useEffect(() => {
sharedValue.set(withTiming(progress, {
duration: stateFromStores ? 0 : 500
}));
return () => {
cancelAnimation(sharedValue);
};
}, [sharedValue, progress, stateFromStores]);
useEffect(() => {
sharedValue2.set(withTiming(c20961_1 ? 0.7 : 0, {
duration: 500
}));
return () => {
cancelAnimation(sharedValue2);
};
}, [sharedValue2, loading]);
ref = useRef(null);
const memo = useMemo(() => ({
...styles.confetti,
width,
height: width,
transform: [{
scale
}]
}), [styles.confetti, scale, width]);
useEffect(() => {
L6: {
if (!stateFromStores && c20961_9) {
sharedValue3.set(withTiming(1, {
duration: 500
}));
const current = ref.current;
if (current == null) {
break L6;
}
current.play();
} else {
sharedValue3.set(0);
const current2 = ref.current;
if (current2 != null) {
current2.reset();
}
}
}
}, [r67, sharedValue3, stateFromStores]);
const Component = onPress == null ? Module19.Fragment : PressableOpacity;
const percent = Math.round(100 * progress);
const r118 = onPress == null ? {} : {
onPress
};
let accessibilityLabel2 = accessibilityLabel;
if (accessibilityLabel2 == null) {
accessibilityLabel2 = intl.formatToPlainString(t.Gj8Jqn, {
percent
});
}
return <Component {...r118}>
<ReanimatedRexport.View style={[styles.wrapper, styles.completionGlow, animatedStyle]} accessible accessibilityRole="progressbar" accessibilityLabel={accessibilityLabel2} accessibilityValue={{
min: 0,
max: 100,
now: percent
}}>
<ReanimatedRexport.View style={animatedStyle2} />
<View style={styles.container}>
<Svg height={width} width={width} style={styles.canvas}>
<Defs>
<LinearGradient id="underlayGradient" x1="0" y1="0.5" x2="1" y2="0.5">
<Stop offset="0" stopColor={_excluded[0]} />
<Stop offset="1" stopColor={_excluded[1]} />
</LinearGradient>
</Defs>
<Circle cx={width / 2} cy={width / 2} r={r52} fill="none" stroke="url(#underlayGradient)" strokeWidth={strokeWidth} />
<AnimatedComponent cx={width / 2} cy={width / 2} r={r52} fill="none" stroke={styles.progressPath.color} strokeWidth={strokeWidth} strokeDasharray={circumference} strokeLinecap="round" animatedProps={animatedProps} />
</Svg>
{hasConfetti ? <LottieAnimationView ref={ref} style={memo} source={_Module14156} autoPlay={false} loop={false} /> : null}
<View style={styles.imageContainer}>
<QuestRewardTile quest={quest} height={0.78 * width} width={0.78 * width} withAnimation={withAnimation} accessibilityLabelPrefix={accessibilityLabel} />
</View>
</View>
</ReanimatedRexport.View>
</Component>;
});
export default r47;
export { c9907_13 as QUEST_PROGRESS_DIAMETER_BY_SIZE };
@@ -0,0 +1,171 @@
// Metro module 10964 (f10965).
import { useEffect, useMemo, useCallback } from "react";
import { ActivityIndicator, View } from "react-native";
import QuestStore from "../QuestStore";
import { REWARD_CODE_PLACEHOLDER } from "../QuestConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { useStateFromStoresObject, useStateFromStores } from "../../../_bundle/Module589";
import { useClaimOrFetchRewardCode, useClaimRewardCodePrimaryCtaClickHandler } from "../hooks/RewardCodeClaimHooks";
import ToastActionCreators from "../../toast/native/ToastActionCreators";
import { intl, t } from "../../../intl/index.native";
import Module9172 from "../../../_bundle/Module9172";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import * as _QuestRewardUtils from "../utils/QuestRewardUtils";
import { getRewardCodeQuestReward } from "../utils/QuestRewardUtils";
import { copy } from "../../../utils/ClipboardUtils.native";
import { CopyIcon } from "../../../design/components/Icon/native/redesign/generated/CopyIcon";
import { getRewardCodeRedemptionInstructions } from "../hooks/QuestCopyHooks";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { Text } from "../../../design/components/Text/native/Text";
import MarkupUtils from "../../markup/MarkupUtils";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../design/components/TableRow/native/TableRow.native";
import { Button } from "../../../design/components/Button/native/Button.native";
import { QuestContentImpressionTrackerNative } from "./QuestContentImpressionTracker.native";
let useStyles;
const QuestRewardCodeClaimBottomSheet = function QuestRewardCodeClaimBottomSheet(props) {
let rewardCode, hasError, isTieredRewardCodeQuest, memo;
const { quest, questContent: questContent2, questContentPosition: questContentPosition2, sourceQuestContent: sourceQuestContent2 } = props;
rewardCode = void 0;
hasError = void 0;
isTieredRewardCodeQuest = void 0;
memo = void 0;
const styles = useStyles(useSafeAreaInsets_native().bottom);
const stateFromStoresObject = useStateFromStoresObject([QuestStore], () => ({
rewardCode: QuestStore.getRewardCode(quest.id),
isFetchingRewardCode: QuestStore.isFetchingRewardCode(quest.id),
isClaimingReward: QuestStore.isClaimingReward(quest.id)
}));
rewardCode = stateFromStoresObject.rewardCode;
let isFetchingRewardCode = stateFromStoresObject.isFetchingRewardCode;
const isClaimingReward = stateFromStoresObject.isClaimingReward;
const claimOrFetchRewardCode = useClaimOrFetchRewardCode({
isClaimingReward,
isFetchingRewardCode,
quest,
questContent: questContent2,
rewardCode
});
const { claimCode, fetchCode } = claimOrFetchRewardCode;
hasError = claimOrFetchRewardCode.hasError;
useEffect(() => {
if (hasError) {
ToastActionCreators.open({
key: "CLAIM_QUEST_REWARD_ERROR",
content: intl.string(t.CKsXk3),
icon: Module9172
});
ActionSheetActionCreators.hideActionSheet();
}
}, [hasError]);
isTieredRewardCodeQuest = _QuestRewardUtils.isTieredRewardCodeQuest({
quest
});
memo = useMemo(() => isTieredRewardCodeQuest ? getRewardCodeQuestReward({
quest,
idx: rewardCode?.tier
}) : getRewardCodeQuestReward({
quest,
idx: 0
}), [isTieredRewardCodeQuest, quest, rewardCode?.tier]);
const memo2 = useMemo(() => {
if (memo?.redemptionLink != null && memo.redemptionLink !== "") {
return rewardCode?.code != null && rewardCode.code !== "" ? memo.redemptionLink.replace(REWARD_CODE_PLACEHOLDER, encodeURIComponent(rewardCode.code)) : memo.redemptionLink;
}
}, [memo, rewardCode]);
const claimRewardCodePrimaryCtaClickHandler = useClaimRewardCodePrimaryCtaClickHandler({
claimCode,
fetchCode,
hasError,
onDismiss: ActionSheetActionCreators.hideActionSheet,
quest,
questContent: questContent2,
questContentPosition: questContentPosition2,
redemptionLink: memo2,
sourceQuestContent: sourceQuestContent2
});
const callback = useCallback(() => {
if (rewardCode != null) {
copy(rewardCode.code, () => ToastActionCreators.open({
key: "TOAST_QUEST_REWARD_CODE_COPIED",
content: intl.string(t.MSaeTe),
icon: () => <CopyIcon />
}));
}
}, [rewardCode]);
const rewardCodeRedemptionInstructions = getRewardCodeRedemptionInstructions({
quest,
rewardCode
});
if (!isFetchingRewardCode) {
isFetchingRewardCode = isClaimingReward;
}
if (!isFetchingRewardCode) {
isFetchingRewardCode = rewardCode?.code == null;
}
const props2 = {
header: <BottomSheetTitleHeader title={intl.string(t.srzsU2)} />,
startExpanded: true,
children: <View style={styles.wrapper}>
<View>
{rewardCode != null && rewardCodeRedemptionInstructions != null && <Text style={styles.redemptionInstructions} variant="text-md/normal" color="text-default">
{MarkupUtils.parse(rewardCodeRedemptionInstructions, true, {
allowLinks: true
})}
</Text>}
<View>
<View style={rewardCode?.code == null && styles.codeCopyWrapperLoading}>
<TableRowGroup hasIcons={false}>
<TableRow label={rewardCode?.code} trailing={rewardCode?.code != null && <TableRow.Icon IconComponent={CopyIcon} />} onPress={rewardCode?.code != null ? callback : void 0} />
</TableRowGroup>
</View>
{rewardCode?.code == null && <ActivityIndicator style={styles.claimingIndicator} size={24} />}
</View>
</View>
<View style={styles.footer}>
<Button disabled={isFetchingRewardCode} onPress={claimRewardCodePrimaryCtaClickHandler} grow text={memo2 != null && memo2 !== "" ? intl.string(t["+zx47d"]) : intl.string(t["23SS+z"])} />
</View>
</View>
};
return <BottomSheet {...props2} />;
};
useStyles = createStyles((a0) => ({
wrapper: {
display: "flex",
paddingHorizontal: Module712.space.PX_16,
gap: Module712.space.PX_24
},
footer: {
paddingBottom: a0
},
claimingIndicator: {
position: "absolute",
left: "50%",
top: "50%",
marginLeft: -12,
marginTop: -12
},
codeCopyWrapperLoading: {
opacity: 0.5
},
redemptionInstructions: {
marginBottom: 24
}
}));
export default function QuestRewardCodeClaimBottomSheetConnected(props) {
let r24;
const { questId, questContent, questContentPosition, sourceQuestContent } = props;
const stateFromStores = useStateFromStores([QuestStore], () => QuestStore.getQuest(questId));
if (stateFromStores == null) {
ActionSheetActionCreators.hideActionSheet();
r24 = null;
} else {
r24 = <QuestContentImpressionTrackerNative overrideVisibility questOrQuests={stateFromStores} questContent={questContent} questContentPosition={questContentPosition} sourceQuestContent={sourceQuestContent}>
{() => <QuestRewardCodeClaimBottomSheet quest={stateFromStores} questContent={questContent} questContentPosition={questContentPosition} sourceQuestContent={sourceQuestContent} />}
</QuestContentImpressionTrackerNative>;
}
return r24;
};
Loaded 100 of 33051 files, more files were not shown because too many files have changed in this diff. Show more