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,51 @@
// Metro module 11400 (f11401).
import useKeyboardType from "../../keyboard/native/useKeyboardType";
import { useMobileVisualRefreshConfig } from "../../themes/experiments/MobileVisualRefreshExperiment";
import ReanimatedRexport, { useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import * as _KeyboardTypes from "../../keyboard/native/KeyboardTypes";
import * as _timing from "../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../design/animation/reanimated/timing/timingPresets";
import { PlusLargeIcon } from "../../../design/components/Icon/native/redesign/generated/PlusLargeIcon";
import { HermesBuiltin } from "../../../_hermes/prelude";
const __initData = {
code: "function MediaKeyboardButtonIconTsx1(){const{keyboard,KeyboardTypes,chatInputFloating,withTiming,timingStandard}=this.__closure;const isActive=keyboard===KeyboardTypes.MEDIA||chatInputFloating&&keyboard===KeyboardTypes.APP_LAUNCHER;return{transform:[{rotate:withTiming(isActive?'45deg':'0deg',timingStandard)}]};}"
};
export function MediaKeyboardButtonIcon(props) {
if (props == null) {
HermesBuiltin.throwTypeError("Cannot destructure 'undefined' or 'null'.");
throw new Error("unreachable");
}
const props2 = HermesBuiltin.copyDataProperties({}, props, void 0);
const keyboardType = useKeyboardType();
let c18805_0 = keyboardType;
const chatInputFloating = useMobileVisualRefreshConfig({
location: "MediaKeyboardButtonIcon"
}).chatInputFloating;
const r26 = function() {
let r13 = c18805_0 === _KeyboardTypes.KeyboardTypes.MEDIA;
if (!r13) {
let r14 = chatInputFloating;
if (chatInputFloating) {
r14 = c18805_0 === _KeyboardTypes.KeyboardTypes.APP_LAUNCHER;
}
r13 = r14;
}
return {
transform: [{
rotate: _timing.withTiming(r13 ? "45deg" : "0deg", _timingPresets.timingStandard)
}]
};
};
r26.__closure = {
keyboard: keyboardType,
KeyboardTypes: _KeyboardTypes.KeyboardTypes,
chatInputFloating,
withTiming: _timing.withTiming,
timingStandard: _timingPresets.timingStandard
};
r26.__workletHash = 12686941860647;
r26.__initData = __initData;
return <ReanimatedRexport.View style={useAnimatedStyle(r26)}>
<PlusLargeIcon {...props2} />
</ReanimatedRexport.View>;
}
@@ -0,0 +1,52 @@
// Metro module 1576 (f1577).
import { isMetaQuest } from "../../device/MetaQuestUtils.android";
import Module712 from "../../../_bundle/Module712";
const r8 = isMetaQuest() ? {
slotHeight: 24,
barColor: Module712.colors.BACKGROUND_MOD_STRONG,
barWidth: Module712.space.PX_64,
barHeight: Module712.space.PX_8,
barMarginTop: Module712.space.PX_16
} : {
slotHeight: 16,
barColor: Module712.colors.BACKGROUND_MOD_MUTED,
barWidth: Module712.space.PX_32,
barHeight: Module712.space.PX_4,
barMarginTop: Module712.space.PX_4
};
const slotHeight = r8.slotHeight;
const r52 = {
CHAT: 0,
0: "CHAT",
COMMAND: 1,
1: "COMMAND",
APP_LAUNCHER: 2,
2: "APP_LAUNCHER",
INTERACTION_MODAL: 3,
3: "INTERACTION_MODAL"
};
const r60 = {
FULLY_EXPANDED: "fully expanded"
};
const r61 = {
CAMERA_TILE: "camera tile",
CAMERA_BUTTON: "camera button",
TAKE_A_PHOTO_BUTTON: "take a photo button"
};
const r65 = {
FULLY_EXPANDED: "fully expanded",
VIEW_ALL_CLICKED: "view all clicked",
MEDIA_SELECTED: "media selected"
};
export { r8 as DRAG_HANDLE };
export { slotHeight as HEADER_HANDLE_HEIGHT };
export { r52 as MediaKeyboardTarget };
export { r60 as InAppCameraUsedViews };
export { r61 as InAppCameraUsedCameraPreviewTypes };
export { r65 as MediaPickerActionSheetEngagedActions };
export const MEDIA_PICKER_SEND_BUTTON_SPRING = {
mass: 1,
damping: 25,
stiffness: 400,
overshootClamping: false
};
@@ -0,0 +1,731 @@
// Metro module 9672 (f9673).
import _asyncToGenerator from "../../../_bundle/_asyncToGenerator";
import "../../user_settings/UnsyncedUserSettingsStore";
import ChannelStore from "../../../stores/ChannelStore";
import { DraftType } from "../../../stores/DraftStore";
import SelectedChannelStore from "../../../stores/SelectedChannelStore";
import UploadAttachmentStore from "../../../stores/UploadAttachmentStore";
import { MediaKeyboardTarget } from "./MediaKeyboardConstants";
import { AnalyticEvents, ChatInputComponentViewedTypes, ComponentActions, AnalyticsSections, AnalyticsObjects, AnalyticsObjectTypes, AnalyticsPages, MAX_UPLOAD_COUNT } from "../../../Constants";
import { NativePermissionTypes } from "../../native_permissions/NativePermissionConstants";
import { UploadOrigin, UploadPlatform } from "../../../lib/uploader/Upload";
import UploadAttachmentActionCreators from "../../../actions/UploadAttachmentActionCreators";
import { doesImageMatchUpload } from "../../../lib/uploader/UploadUtils";
import { getFileFromUploadItem } from "../../../utils/native/UploadUtils";
import NativePermissionUtils from "../../native_permissions/NativePermissionUtils";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { isIOS } from "../../../utils/PlatformUtils";
import { getSystemVersionMajor } from "../../../utils/native/DeviceUtils";
import { hideMediaKeyboardActionSheet, presentLimitedLibraryPicker, showMediaKeyboardActionSheet } from "./showMediaKeyboardActionSheet";
import { ComponentDispatch } from "../../../utils/ComponentDispatchUtils";
import { openGiftModal } from "../../premium/native/utils/openGiftModal";
import { setAccessibilityFocus } from "../../a11y/native/setAccessibilityFocus.android";
import { navigateToThreadCreation } from "../../threads/native/navigateToThreadCreation";
import { handleDocumentSelection } from "../../../utils/native/FilePickerUtils";
import Module12 from "../../../_bundle/Module12";
import { HermesBuiltin } from "../../../_hermes/prelude";
function $mk83052($env) {
return (a0) => {
const r4 = $env.$parent;
let env26507 = {
$parent: r4
};
env26507[0] = a0;
const r7 = $env[0];
return r7 != null && a0.uri != null && a0.uri !== "" && r4[8].findUpload(r7, r4[6].ChannelMessage, (a0) => {
const r1 = env26507.$parent;
return (0, r1[0])(r1[2][11]).doesImageMatchUpload(env26507[0], a0);
}) == null;
};
}
function $mk83053($env) {
return (a0) => ({
...a0,
origin: $env[1]
});
}
function $mk83054($env) {
return (a0) => {
if (a0) {
const r11 = $env;
const r5 = $env.$parent;
const r3 = r5[1];
const r6 = r5[2];
const r8 = r3(r6[14]);
const CHAT_INPUT_COMPONENT_VIEWED = r5[11].CHAT_INPUT_COMPONENT_VIEWED;
const r15 = r11[0];
r8.track(CHAT_INPUT_COMPONENT_VIEWED, {
type: r5[16].CAMERA,
channel_id: r15.id,
guild_id: r15.guild_id
});
(0, r11[2])();
r3(r6[15]).launchCamera({
mediaType: "mixed",
includeBase64: false,
quality: (0, r5[0])(r6[12]).getImageCompressionQuality(),
videoQuality: "high",
saveToPhotos: r5[4].saveCameraUploadsToDevice,
skipProcessing: true
}, $mk106644(r11));
}
};
}
function $mk83055($env) {
return (a0) => {
if (a0) {
const r5 = $env;
let env26508 = {
$parent: $env
};
const r6 = $env.$parent;
const r4 = r6[1];
const r3 = r6[2];
const r11 = r4(r3[14]);
const CHAT_INPUT_COMPONENT_VIEWED = r6[11].CHAT_INPUT_COMPONENT_VIEWED;
const r17 = r5[0];
r11.track(CHAT_INPUT_COMPONENT_VIEWED, {
type: r6[16].NATIVE_MEDIA_PICKER,
channel_id: r17.id,
guild_id: r17.guild_id
});
(0, r5[4])();
const uploads = r6[8].getUploads(r17.id, r5[1]);
env26508[0] = uploads;
const r27 = r5[3];
let r28 = uploads;
if (r27 != null) {
const r31 = uploads.filter($mk106645(r5));
env26508[0] = r31;
r28 = r31;
}
const r32 = r5[2];
const r44 = {
mediaType: "any",
includeBase64: false,
selectionLimit: r32 > 1 ? r32 - ((0, r6[0])(r3[16]).isIOS() ? r28.filter($mk106646(r6)).length : r28.length) : 1,
selections: r28.map((item) => item.id),
includeExtra: !(0, r6[0])(r3[16]).isIOS(),
skipProcessing: true
};
r4(r3[15]).launchImageLibrary(r44, (a0) => {
let r23;
let env30131;
L15: {
const r1 = env26508.$parent;
env30131 = {
$parent: r1
};
env30131[0] = a0;
(0, r1[5])();
if (!a0.didCancel && a0.errorCode == null) {
const r6 = env26508[0];
if (r6.length === 0) {
if (a0.assets == null) {
break L15;
}
if (a0.assets.length === 0) {
break L15;
}
}
if (a0.replaceSelection) {
r6.forEach((item) => {
const r2 = env30131.$parent.$parent;
let env31509 = {
$parent: r2
};
env31509[0] = item;
const origin = item.origin;
const r8 = r2[0];
const r4 = r2[2];
let r13 = origin !== r8(r4[9]).UploadOrigin.IMAGE_PICKER;
if (!r13) {
const assets = env30131[0].assets;
r13 = assets == null ? void 0 : assets.some((asset) => {
const r1 = env31509.$parent;
return (0, r1[0])(r1[2][11]).doesImageMatchUpload(asset, env31509[0]);
});
}
if (!r13) {
(0, r2[1])(r4[10]).remove(env30131.$parent[0].id, item.id, r2[6].ChannelMessage);
}
});
}
const r36 = [];
let r39 = a0.assets[Symbol.iterator]();
const next = r39.next;
const r41 = env26508.$parent.$parent;
while (true) {
const r42 = r39 === void 0 ? void 0 : (r23 = next.call(r39)).done ? r39 = void 0 : r23.value;
if (r39 === void 0) {
if (!(r36.length > 0)) {
break;
}
(0, r1[6])(r36);
break;
}
try {
if (r42.uri != null) {
r36.push({
id: r42.id,
uri: r42.uri,
originalUri: r42.uri,
mimeType: r42.mimeType,
width: r42.width,
height: r42.height,
filename: r42.fileName,
playableDuration: r42.duration,
platform: (0, r41[0])(r41[2][9]).UploadPlatform.REACT_NATIVE
});
}
} catch (r61) {
if (r39 !== void 0 && typeof r39.return === "function") {
try {
r39.return();
} catch {}
}
throw r61;
}
}
}
}
});
}
};
}
function $mk106644($env) {
return (a0) => {
let fileName2;
const r3 = $env;
if (a0.didCancel) {
(0, r3[3])();
} else if (a0.errorCode == null && a0.assets != null && a0.assets.length > 0) {
const r17 = a0.assets[0];
if (r17 != null && r17.uri != null && r17.height != null && r17.width != null) {
let type2 = r17.type;
if (type2 == null) {
const fileName = r17.fileName;
const r11 = fileName == null ? void 0 : fileName.split(".").pop();
type2 = r11 != null ? r17.fileType != null ? `${r17.fileType}/${r11}`.toLowerCase() : "image/jpeg" : "image/jpeg";
}
if (r17.fileName != null && r17.fileName !== "") {
fileName2 = r17.fileName;
} else {
let r47 = type2.split("/")[1];
if (r47 == null) {
r47 = "jpeg";
}
fileName2 = `camera_upload.${r47}`;
}
const r54 = $env.$parent;
const r55 = r54[0];
const r56 = r54[2];
(0, r3[4])([{
id: r17.id,
uri: r17.uri,
originalUri: r17.uri,
width: r17.width,
height: r17.height,
filename: fileName2,
playableDuration: r17.duration,
platform: r55(r56[9]).UploadPlatform.REACT_NATIVE,
createdUsingInAppCamera: true,
mimeType: type2
}]);
(0, r54[1])(r56[14]).track(r54[11].IN_APP_CAMERA_USED, {
camera_view: r54[10].FULLY_EXPANDED,
camera_preview_type: r3[1]
});
(0, r3[3])();
}
}
};
}
function $mk106645($env) {
return (a0) => $env[3].includes(a0.id);
}
function $mk106646($env) {
return (a0) => {
const r1 = $env;
return a0.origin !== (0, r1[0])(r1[2][9]).UploadOrigin.IMAGE_PICKER;
};
}
function $mk106653($env) {
return (a0) => {
let env30134;
const r4 = $env.$parent.$parent;
const id = $env.$parent[0].id;
const r6 = $env[0];
const r2 = env30134 = {
$parent: r4
};
env30134[0] = id;
env30134[1] = r6;
const r8 = r4[0];
const r12 = r4[2];
if (r6 !== r8(r12[9]).UploadOrigin.FILE_ATTACHMENT) {
const files = a0.filter($mk83052(r2)).map($mk83053(r2));
(0, r4[1])(r12[10]).addFiles({
files,
channelId: id,
draftType: r4[6].ChannelMessage
});
} else {
(0, r4[1])(r12[10]).addFiles({
files: a0,
channelId: id,
draftType: r4[6].ChannelMessage
});
}
};
}
function $mk115524($env) {
return function() {
let env31510 = {
$parent: $env
};
env31510[0] = (0, _asyncToGenerator)(function*(c31991_0) {
let env32130;
let c31991_5 = env31510;
const r10 = env32130 = {};
env32130[0] = c31991_0;
env32130[1] = void 0;
env32130[2] = void 0;
env32130[3] = void 0;
env32130[4] = void 0;
const uri = c31991_0.uri;
env32130[1] = uri;
const r28 = env31510.$parent.$parent;
const r32 = (0, r28[0])(r28[2][12]);
const name = c31991_0.name;
if (name == null) {
name = void 0;
}
const r41 = yield r32.getImageDimensionsIfMissing(uri, void 0, void 0, name);
env32130[2] = r41;
env32130[3] = env32130[2].width;
env32130[4] = env32130[2].height;
const r55 = c31991_5.$parent.$parent;
const r64 = {
id: (0, r55[1])(r55[2][24]).uniqueId(env32130[1]),
uri: env32130[1],
originalUri: env32130[1],
filename: null,
mimeType: null,
channelId: null,
platform: null,
origin: null,
width: null,
height: null
};
const name3 = env32130[0].name;
let name2 = name3;
if (name3 == null) {
name2 = env32130[1].split("/").at(-1);
}
r64.filename = name2;
const type = env32130[0].type;
if (type == null) {
type = void 0;
}
r64.mimeType = type;
r64.channelId = c31991_5.$parent[0].id;
const r88 = c31991_5.$parent.$parent;
r64.platform = (0, r88[0])(r88[2][9]).UploadPlatform.REACT_NATIVE;
r64.origin = (0, r88[0])(r88[2][9]).UploadOrigin.FILE_ATTACHMENT;
r64.width = env32130[3];
r64.height = env32130[4];
return r64;
});
return function() {
return env31510[0].apply(this, arguments);
};
};
}
let handleAttachFile, handleSelectKeyboardItem, showSimpleMediaKeyboard;
let $mk106651 = function() {
return () => hideMediaKeyboardActionSheet();
};
let env6398 = {};
export async function handleLimitedPickerDialog(c26509_0) {
let c30132_0 = c26509_0.onDismissKeyboard;
let c30132_1 = c26509_0.onRestoreKeyboard;
await void 0;
(0, c30132_0)();
await presentLimitedLibraryPicker();
(0, c30132_1)();
}
handleAttachFile = async function handleAttachFile(c26510_0) {
let env30133;
const r31 = env6398;
let c26510_2 = r31;
const r10 = env30133 = {
$parent: r31
};
let c26510_1 = r10;
env30133[0] = void 0;
env30133[1] = void 0;
env30133[2] = void 0;
env30133[3] = void 0;
env30133[4] = void 0;
env30133[5] = void 0;
env30133[0] = c26510_0.channel;
env30133[1] = c26510_0.uploadLimit;
env30133[2] = c26510_0.extensions;
env30133[3] = c26510_0.onDismissKeyboard;
env30133[4] = c26510_0.onRestoreKeyboard;
env30133[5] = c26510_0.onSelectFiles;
env30133[6] = void 0;
env30133[7] = void 0;
await void 0;
(0, env30133[3])();
AnalyticsUtils.track(AnalyticEvents.CHAT_INPUT_COMPONENT_VIEWED, {
type: ChatInputComponentViewedTypes.ATTACH_FILE,
channel_id: env30133[0].id,
guild_id: env30133[0].guild_id
});
env30133[6] = await handleDocumentSelection({
pickMultiple: env30133[1] > 1,
extensions: env30133[2]
});
(0, env30133[4])();
if (env30133[6] != null && !(env30133[6].length < 1)) {
env30133[7] = await Promise.all(Array.from(env30133[6]).map($mk115524(c26510_1)()));
(0, env30133[5])(env30133[7]);
}
};
handleSelectKeyboardItem = function handleSelectKeyboardItem(a0, a1, a2, a3) {
const image = a1.node.image;
if (a2) {
const r51 = UploadAttachmentStore.findUpload(a0, DraftType.ChannelMessage, (a0) => doesImageMatchUpload(image, a0));
if (r51 != null) {
UploadAttachmentActionCreators.remove(a0, r51.id, DraftType.ChannelMessage);
}
} else {
const image2 = a1.node.image;
let id = a1.node.id;
if (id == null) {
id = image2.uri;
}
UploadAttachmentActionCreators.addFile({
channelId: a0,
file: {
id,
origin: UploadOrigin.IMAGE_PICKER,
uri: image2.uri,
originalUri: image2.uri,
mimeType: image2.mimeType,
width: image2.width,
height: image2.height,
filename: image2.filename,
playableDuration: image2.playableDuration,
platform: UploadPlatform.REACT_NATIVE,
...a3 != null && {
createdUsingInAppCamera: a3
}
},
draftType: DraftType.ChannelMessage
});
}
};
export function animatedIndexThreshold(a0, a1) {
return a0.get().length === 1 ? a1 - 1 : a1 * (a0.get().length - 1);
}
animatedIndexThreshold.__closure = {};
animatedIndexThreshold.__workletHash = 97398083076;
animatedIndexThreshold.__initData = {
code: "function animatedIndexThreshold_MediaKeyboardUtilsTsx1(animatedSnapPoints,thresholdPercent){return animatedSnapPoints.get().length===1?thresholdPercent-1:thresholdPercent*(animatedSnapPoints.get().length-1);}"
};
export function addImagesFromPicker(a0, a1, a2) {
let env17393;
const r2 = env17393 = {
$parent: env6398
};
env17393[0] = a0;
env17393[1] = a2;
if (a2 !== UploadOrigin.FILE_ATTACHMENT) {
UploadAttachmentActionCreators.addFiles({
files: a1.filter($mk83052(r2)).map($mk83053(r2)),
channelId: a0,
draftType: DraftType.ChannelMessage
});
} else {
UploadAttachmentActionCreators.addFiles({
files: a1,
channelId: a0,
draftType: DraftType.ChannelMessage
});
}
}
export function addAttachmentForCommand(a0, a1, a2, a3, a4) {
const option = a3.option;
const filename = getFileFromUploadItem(a2).filename;
if (a3.target === MediaKeyboardTarget.COMMAND) {
const applicationCommandManager = a1.current.getApplicationCommandManager();
if (applicationCommandManager != null) {
applicationCommandManager.insertOrJumpCommandOption(option, void 0, false, {
displayText: filename,
preferred: true
});
}
}
const target = a3.target;
const draftType = MediaKeyboardTarget.CHAT === target ? DraftType.ChannelMessage : MediaKeyboardTarget.COMMAND === target ? DraftType.SlashCommand : MediaKeyboardTarget.APP_LAUNCHER === target ? DraftType.ApplicationLauncherCommand : MediaKeyboardTarget.INTERACTION_MODAL === target ? DraftType.InteractionModal : void 0;
UploadAttachmentActionCreators.remove(a0, a3.option.name, draftType);
UploadAttachmentActionCreators.addFile({
channelId: a0,
file: {
...a2,
origin: a4,
id: option.name,
filename
},
draftType,
allowOptimization: false
});
}
export function handleCameraDialog(a0) {
let env17394;
const r1 = env17394 = {
$parent: env6398
};
env17394[0] = a0.channel;
env17394[1] = a0.previewType;
env17394[2] = a0.onDismissKeyboard;
env17394[3] = a0.onRestoreKeyboard;
env17394[4] = a0.onSelectFiles;
NativePermissionUtils.requestPermission(NativePermissionTypes.CAMERA).then($mk83054(r1));
}
export function handleViewAllDialog(a0) {
let env17395;
const r3 = env17395 = {
$parent: env6398
};
env17395[0] = a0.channel;
env17395[1] = a0.draftType;
env17395[2] = a0.uploadLimit;
env17395[3] = a0.includedUploadIds;
env17395[4] = a0.onDismissKeyboard;
env17395[5] = a0.onRestoreKeyboard;
env17395[6] = a0.onSelectFiles;
(isIOS() && getSystemVersionMajor() >= 14 ? Promise.resolve(true) : NativePermissionUtils.requestPermission(NativePermissionTypes.PHOTOS)).then($mk83055(r3));
}
export function handleSelectGift(a0, a1, a2) {
const ref = a2;
const channelId = SelectedChannelStore.getChannelId();
a1.current.closeCustomKeyboard();
const channel = ChannelStore.getChannel(channelId);
ComponentDispatch.dispatch(ComponentActions.MEDIA_KEYBOARD_GIFT_SELECTED);
const analyticsLocation = {
section: AnalyticsSections.CHANNEL_TEXT_AREA,
object: AnalyticsObjects.BUTTON_ICON,
objectType: AnalyticsObjectTypes.GIFT,
page: channel?.guild_id != null ? AnalyticsPages.GUILD_CHANNEL : AnalyticsPages.DM_CHANNEL
};
AnalyticsUtils.track(AnalyticEvents.CHAT_INPUT_COMPONENT_VIEWED, {
type: ChatInputComponentViewedTypes.NITRO_GIFTING,
channel_id: channel?.id,
guild_id: channel?.guild_id
});
openGiftModal({
recipientUserId: channel != null ? channel.isDM() ? channel.getRecipientId() : void 0 : void 0,
analyticsLocation,
analyticsLocations: a0,
navigationParams: {
presentation: "card"
},
onDismiss: a2?.current != null ? () => setAccessibilityFocus({
ref
}) : void 0
});
}
export function handleSelectThread(a0, a1) {
AnalyticsUtils.track(AnalyticEvents.CHAT_INPUT_COMPONENT_VIEWED, {
type: ChatInputComponentViewedTypes.START_THREAD,
channel_id: a0.id,
guild_id: a0?.guild_id
});
if (a0 != null) {
a1.current.openSystemKeyboard();
if (isIOS()) {
a1.current.blur();
}
navigateToThreadCreation(a0, "Plus Button");
}
}
export { handleAttachFile };
export function mediaNodeToUploadItem(a0, a1) {
const image2 = a0.node.image;
let id = a0.node.id;
if (id == null) {
id = image2.uri;
}
return {
id,
origin: UploadOrigin.IMAGE_PICKER,
uri: image2.uri,
originalUri: image2.uri,
mimeType: image2.mimeType,
width: image2.width,
height: image2.height,
filename: image2.filename,
playableDuration: image2.playableDuration,
platform: UploadPlatform.REACT_NATIVE,
...a1 != null && {
createdUsingInAppCamera: a1
}
};
}
export function cropResultToUploadItem(a0) {
const r10 = a0.path.startsWith("file://");
const path = a0.path;
const uri = r10 ? path : `file://${path}`;
const filename = a0.path.split("/").pop();
return {
id: Module12.uniqueId(a0.path),
uri,
originalUri: uri,
mimeType: a0.mime,
width: a0.width,
height: a0.height,
filename,
platform: UploadPlatform.REACT_NATIVE
};
}
export { handleSelectKeyboardItem };
showSimpleMediaKeyboard = function showSimpleMediaKeyboard(a0) {
let $mk106652 = function() {
return () => {
showSimpleMediaKeyboard(env17398[0]);
};
};
let env17398 = {
$parent: env6398
};
env17398[0] = a0;
const CHAT = MediaKeyboardTarget.CHAT;
const draftType = MediaKeyboardTarget.CHAT === CHAT ? DraftType.ChannelMessage : MediaKeyboardTarget.COMMAND === CHAT ? DraftType.SlashCommand : MediaKeyboardTarget.APP_LAUNCHER === CHAT ? DraftType.ApplicationLauncherCommand : MediaKeyboardTarget.INTERACTION_MODAL === CHAT ? DraftType.InteractionModal : void 0;
env17398[1] = draftType;
showMediaKeyboardActionSheet({
channel: a0,
draftType,
uploadLimit: MAX_UPLOAD_COUNT,
disableWhenReachedLimit: true,
onAttachPress: () => {
let env26511;
const r1 = {};
const FILE_ATTACHMENT = UploadOrigin.FILE_ATTACHMENT;
const r14 = env26511 = {
$parent: env17398
};
env26511[0] = FILE_ATTACHMENT;
HermesBuiltin.copyDataProperties(r1, {
channel: env17398[0],
uploadLimit: MAX_UPLOAD_COUNT,
onDismissKeyboard: $mk106651(),
onRestoreKeyboard: $mk106652(),
onSelectFiles: $mk106653(r14)
});
handleAttachFile(r1);
},
onPressCamera: (a0) => {
let env26512;
let env26513;
const r2 = env6398;
const r4 = {};
const IMAGE_PICKER = UploadOrigin.IMAGE_PICKER;
const r13 = env26512 = {
$parent: env17398
};
env26512[0] = IMAGE_PICKER;
HermesBuiltin.copyDataProperties(r4, {
channel: env17398[0],
uploadLimit: MAX_UPLOAD_COUNT,
onDismissKeyboard: $mk106651(),
onRestoreKeyboard: $mk106652(),
onSelectFiles: $mk106653(r13)
});
r4.previewType = a0;
const r21 = env26513 = {
$parent: r2
};
env26513[0] = void 0;
env26513[1] = void 0;
env26513[2] = void 0;
env26513[3] = void 0;
env26513[4] = void 0;
env26513[0] = r4.channel;
env26513[1] = r4.previewType;
env26513[2] = r4.onDismissKeyboard;
env26513[3] = r4.onRestoreKeyboard;
env26513[4] = r4.onSelectFiles;
NativePermissionUtils.requestPermission(NativePermissionTypes.CAMERA).then($mk83054(r21));
},
onPressItem: ({ channelId, item, isIncluded }) => {
hideMediaKeyboardActionSheet();
handleSelectKeyboardItem(channelId, item, isIncluded);
},
onViewAll: () => {
let env26514;
let env26515;
const r4 = env6398;
const r6 = {};
const IMAGE_PICKER = UploadOrigin.IMAGE_PICKER;
const r9 = env26514 = {
$parent: env17398
};
env26514[0] = IMAGE_PICKER;
HermesBuiltin.copyDataProperties(r6, {
channel: env17398[0],
uploadLimit: MAX_UPLOAD_COUNT,
onDismissKeyboard: $mk106651(),
onRestoreKeyboard: $mk106652(),
onSelectFiles: $mk106653(r9)
});
r6.draftType = env17398[1];
const r23 = env26515 = {
$parent: r4
};
env26515[0] = void 0;
env26515[1] = void 0;
env26515[2] = void 0;
env26515[3] = void 0;
env26515[4] = void 0;
env26515[5] = void 0;
env26515[6] = void 0;
env26515[0] = r6.channel;
env26515[1] = r6.draftType;
env26515[2] = r6.uploadLimit;
env26515[3] = r6.includedUploadIds;
env26515[4] = r6.onDismissKeyboard;
env26515[5] = r6.onRestoreKeyboard;
env26515[6] = r6.onSelectFiles;
(isIOS() && getSystemVersionMajor() >= 14 ? Promise.resolve(true) : NativePermissionUtils.requestPermission(NativePermissionTypes.PHOTOS)).then($mk83055(r23));
},
onManageLimited: () => {
handleLimitedPickerDialog({
onDismissKeyboard: hideMediaKeyboardActionSheet,
onRestoreKeyboard: () => {
showSimpleMediaKeyboard(env17398[0]);
}
});
},
onClose: hideMediaKeyboardActionSheet,
onBack: hideMediaKeyboardActionSheet
});
};
export { showSimpleMediaKeyboard };
export function getMediaKeyboardDraftType(a0) {
if (MediaKeyboardTarget.CHAT === a0) {
return DraftType.ChannelMessage;
}
if (MediaKeyboardTarget.COMMAND === a0) {
return DraftType.SlashCommand;
}
if (MediaKeyboardTarget.APP_LAUNCHER === a0) {
return DraftType.ApplicationLauncherCommand;
}
if (MediaKeyboardTarget.INTERACTION_MODAL === a0) {
return DraftType.InteractionModal;
}
}
@@ -0,0 +1,368 @@
// Metro module 15589 (f15590).
import * as Module19 from "react";
import { useEffect, useRef, useMemo, useCallback } from "react";
import { DraftType } from "../../../../stores/DraftStore";
import UploadAttachmentStore from "../../../../stores/UploadAttachmentStore";
import { MediaKeyboardTarget, MediaPickerActionSheetEngagedActions } from "../MediaKeyboardConstants";
import { AnalyticEvents, ChatInputComponentViewedTypes } from "../../../../Constants";
import { AppLauncherRouteName } from "../../../app_launcher/native/AppLauncherNativeConstants";
import { KEYBOARD_ANIMATION_CONFIG } from "../../../keyboard/native/PortalKeyboardConstants";
import { jsx } from "react/jsx-runtime";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { useSharedValue } from "../../../reanimated/ReanimatedRexport";
import { useKeyboardContextForType } from "../../../keyboard/native/useKeyboardType";
import { KeyboardTypes } from "../../../keyboard/native/KeyboardTypes";
import { useAppLauncherActionSheet } from "../../../app_launcher/native/AppLauncherActionSheet";
import { useMobileVisualRefreshConfig } from "../../../themes/experiments/MobileVisualRefreshExperiment";
import { useToken } from "../../../../design/tokens/native/useToken";
import Module712 from "../../../../_bundle/Module712";
import { getIsAppLauncherEnabled } from "../../../activities/ActivitiesInTextUtils";
import useMediaKeyboardConfig from "./useMediaKeyboardConfig";
import { useFileTypeFiltering } from "../../../interactions/FileTypeFiltering";
import { addImagesFromPicker, addAttachmentForCommand, handleSelectKeyboardItem, mediaNodeToUploadItem, handleAttachFile, handleCameraDialog, handleViewAllDialog, handleLimitedPickerDialog, handleSelectThread } from "../MediaKeyboardUtils";
import { getFileFromUploadItem } from "../../../../utils/native/UploadUtils";
import { dismissKeyboard } from "../../../../utils/native/ChatInputUtils";
import { UploadOrigin } from "../../../../lib/uploader/Upload";
import { isAndroid } from "../../../../utils/PlatformUtils";
import { CloudUpload } from "../../../../lib/uploader/CloudUpload";
import showUploadPreviewActionSheet from "../../../media_uploads/native/showUploadPreviewActionSheet";
import { openCreatePollModal } from "../../../polls/native/PollCreationModalActionCreators";
import { intl, t } from "../../../../intl/index.native";
import { AppsIcon } from "../../../../design/components/Icon/native/redesign/generated/AppsIcon";
import { ThreadIcon } from "../../../../design/components/Icon/native/redesign/generated/ThreadIcon";
import { PollsIcon } from "../../../../design/components/Icon/native/redesign/generated/PollsIcon";
import { AttachmentIcon } from "../../../../design/components/Icon/native/redesign/generated/AttachmentIcon";
import { ImageIcon } from "../../../../design/components/Icon/native/redesign/generated/ImageIcon";
import MediaKeyboardBottomSheetHeaderSimple from "./MediaKeyboardBottomSheetHeaderSimple";
import MediaKeyboardAccessoriesContainer from "./MediaKeyboardAccessoriesContainer";
import MediaKeyboardFloatingSend from "./MediaKeyboardFloatingSend";
import MediaKeyboardBottomSheetActions from "./MediaKeyboardBottomSheetActions";
import MediaKeyboardBottomSheet from "./MediaKeyboardBottomSheet";
import MediaKeyboardList from "./MediaKeyboardList";
import { HermesBuiltin } from "../../../../_hermes/prelude";
function $mk116983($env) {
return (a0) => (0, $env.$parent[1])(a0, $env[0]);
}
let $mk116982 = function() {
return () => dismissKeyboard();
};
let env11114 = {};
const r40 = Module19.memo(function MediaKeyboard(props) {
let env22219 = {
$parent: env11114
};
const channel = props.channel;
env22219[0] = channel;
const chatInputRef = props.chatInputRef;
env22219[1] = chatInputRef;
const { onClose, transitionState } = props;
env22219[2] = void 0;
env22219[3] = void 0;
env22219[4] = void 0;
env22219[5] = void 0;
env22219[6] = void 0;
env22219[7] = void 0;
env22219[8] = void 0;
env22219[9] = void 0;
env22219[10] = void 0;
env22219[11] = void 0;
env22219[12] = void 0;
env22219[13] = void 0;
env22219[14] = void 0;
env22219[15] = void 0;
useEffect(() => {
const CHAT_INPUT_COMPONENT_VIEWED = AnalyticEvents.CHAT_INPUT_COMPONENT_VIEWED;
const r14 = env22219[0];
AnalyticsUtils.track(CHAT_INPUT_COMPONENT_VIEWED, {
type: ChatInputComponentViewedTypes.MEDIA_PICKER,
channel_id: r14.id,
guild_id: r14.guild_id
});
}, [channel.id, channel.guild_id]);
const ref = useRef(null);
env22219[2] = ref;
const sharedValue2 = useSharedValue(-1);
env22219[3] = sharedValue2;
const sharedValue = useSharedValue(0);
env22219[4] = sharedValue;
const keyboardContextForType = useKeyboardContextForType(KeyboardTypes.MEDIA);
env22219[5] = keyboardContextForType;
const appLauncherActionSheet = useAppLauncherActionSheet({
chatInputRef,
channel
}).appLauncherActionSheet;
let chatInputFloating = useMobileVisualRefreshConfig({
location: "MediaKeyboard"
}).chatInputFloating;
const token = useToken(Module712.modules.mobile.MEDIA_KEYBOARD_SEND_VERTICAL_INSET);
env22219[6] = token;
const r23 = chatInputFloating ? getIsAppLauncherEnabled(channel) : chatInputFloating;
env22219[7] = r23;
const mediaKeyboardConfig = useMediaKeyboardConfig({
channel,
context: keyboardContextForType
});
env22219[8] = mediaKeyboardConfig;
const fileTypeFiltering = useFileTypeFiltering(mediaKeyboardConfig.fileTypes);
const allowedExtensions = fileTypeFiltering.allowedExtensions;
env22219[9] = allowedExtensions;
const validateFilenames = fileTypeFiltering.validateFilenames;
env22219[10] = validateFilenames;
const showInvalidFileTypeAlert = fileTypeFiltering.showInvalidFileTypeAlert;
env22219[11] = showInvalidFileTypeAlert;
const mediaFilesAllowed = fileTypeFiltering.mediaFilesAllowed;
const memo = useMemo(() => {
let env28092 = {
$parent: env22219
};
env28092[0] = function onRestoreKeyboard() {
const context = env22219[5];
if (context.target !== MediaKeyboardTarget.APP_LAUNCHER) {
env22219[1].current.openCustomKeyboard({
type: KeyboardTypes.MEDIA,
context
});
}
};
env28092[1] = function onSelectFiles(a0, a1) {
const r11 = env22219[5];
if (r11.target === MediaKeyboardTarget.CHAT) {
addImagesFromPicker(env22219[0].id, a0, a1);
} else if (r11.target === MediaKeyboardTarget.COMMAND) {
if (env22219[9].length > 0 && !(0, env22219[10])([getFileFromUploadItem(a0[0]).filename])) {
return (0, env22219[11])();
}
addAttachmentForCommand(env22219[0].id, env22219[1], a0[0], r11, a1);
}
};
env28092[2] = function onSelectItem({ channelId: channelId2, item: item2, isIncluded: isIncluded2 }) {
AnalyticsUtils.track(AnalyticEvents.MEDIA_PICKER_ACTION_SHEET_ENGAGED, {
action: MediaPickerActionSheetEngagedActions.MEDIA_SELECTED
});
const r27 = env22219[5];
if (r27.target === MediaKeyboardTarget.CHAT) {
handleSelectKeyboardItem(channelId2, item2, isIncluded2, false);
} else if (r27.target === MediaKeyboardTarget.COMMAND) {
const r36 = mediaNodeToUploadItem(item2);
if (env22219[9].length > 0 && !(0, env22219[10])([getFileFromUploadItem(r36).filename])) {
return (0, env22219[11])();
}
addAttachmentForCommand(channelId2, env22219[1], r36, r27, UploadOrigin.IMAGE_PICKER);
}
};
return {
onAttachPress: () => {
let env30898;
const r11 = {};
const FILE_ATTACHMENT = UploadOrigin.FILE_ATTACHMENT;
const r16 = env30898 = {
$parent: env28092
};
env30898[0] = FILE_ATTACHMENT;
HermesBuiltin.copyDataProperties(r11, {
channel: env22219[0],
uploadLimit: env22219[8].uploadLimit,
extensions: env22219[9],
onDismissKeyboard: $mk116982(),
onRestoreKeyboard: env28092[0],
onSelectFiles: $mk116983(r16)
});
handleAttachFile(r11);
},
onPressCamera: (a0) => {
let env30899;
const r11 = {};
const IMAGE_PICKER = UploadOrigin.IMAGE_PICKER;
const r16 = env30899 = {
$parent: env28092
};
env30899[0] = IMAGE_PICKER;
HermesBuiltin.copyDataProperties(r11, {
channel: env22219[0],
uploadLimit: env22219[8].uploadLimit,
extensions: env22219[9],
onDismissKeyboard: $mk116982(),
onRestoreKeyboard: env28092[0],
onSelectFiles: $mk116983(r16)
});
r11.previewType = a0;
handleCameraDialog(r11);
},
onPressHeader: () => {
if (env22219[3].get() === 0) {
const current2 = env22219[2].current;
if (current2 != null) {
current2.expand();
}
} else {
const current = env22219[2].current;
if (current != null) {
current.collapse();
}
}
},
onViewAll: () => {
let env30900;
const r5 = {};
const IMAGE_PICKER = UploadOrigin.IMAGE_PICKER;
const r10 = env30900 = {
$parent: env28092
};
env30900[0] = IMAGE_PICKER;
const r20 = env22219[8];
HermesBuiltin.copyDataProperties(r5, {
channel: env22219[0],
uploadLimit: r20.uploadLimit,
extensions: env22219[9],
onDismissKeyboard: $mk116982(),
onRestoreKeyboard: env28092[0],
onSelectFiles: $mk116983(r10)
});
r5.draftType = r20.draftType;
handleViewAllDialog(r5);
if (isAndroid()) {
const current = env22219[2].current;
if (current != null) {
current.collapse();
}
}
},
onManageLimited: () => {
handleLimitedPickerDialog({
onDismissKeyboard: dismissKeyboard,
onRestoreKeyboard: env28092[0]
});
},
onPressItem: (a0) => {
(0, env28092[2])({
channelId: a0.channelId,
item: a0.item,
isIncluded: a0.isIncluded
});
},
onLongPressItem: ({ channelId, item, isIncluded }) => {
let c30901_3;
c30901_3 = void 0;
const cloudUpload = new CloudUpload(mediaNodeToUploadItem(item), channelId);
const r26 = isIncluded ? UploadAttachmentStore.getUpload(channelId, cloudUpload.id, DraftType.ChannelMessage) : void 0;
const onRemove = r26 == null ? void 0 : () => handleSelectKeyboardItem(channelId, item, isIncluded, false);
c30901_3 = onRemove;
let upload = r26;
if (upload == null) {
upload = cloudUpload;
}
showUploadPreviewActionSheet({
channelId,
disableAddDescription: r26 == null,
disableSpoiler: r26 == null,
upload,
onAdd: r26 == null ? () => (0, env28092[2])({
channelId,
item,
isIncluded
}) : void 0,
onEdit: (a0) => {
if (c30901_3 != null) {
c30901_3();
}
(0, env28092[1])([a0], UploadOrigin.IMAGE_EDITOR);
},
onRemove
});
},
onPollsPress: () => {
const CHAT_INPUT_COMPONENT_VIEWED = AnalyticEvents.CHAT_INPUT_COMPONENT_VIEWED;
const channel = env22219[0];
AnalyticsUtils.track(CHAT_INPUT_COMPONENT_VIEWED, {
type: ChatInputComponentViewedTypes.POLLS,
channel_id: channel.id,
guild_id: channel.guild_id
});
env22219[1].current.closeCustomKeyboard();
openCreatePollModal({
channel,
onCancel: env28092[0]
});
},
onAppsPress: () => {
env22219[1].current.openCustomKeyboard({
type: KeyboardTypes.APP_LAUNCHER,
context: {
initialRouteName: AppLauncherRouteName.HOME
}
});
},
onThreadPress: () => {
handleSelectThread(env22219[0], env22219[1]);
},
onSend: () => {
const current = env22219[2].current;
if (current != null) {
current.collapse();
}
env22219[1].current.handleSend();
}
};
}, [sharedValue2, channel, chatInputRef, keyboardContextForType, ref, mediaKeyboardConfig, allowedExtensions, validateFilenames, showInvalidFileTypeAlert]);
env22219[12] = memo;
if (chatInputFloating) {
chatInputFloating = mediaKeyboardConfig.canStartThreads;
}
env22219[13] = chatInputFloating;
const memo2 = useMemo(() => {
const r6 = env22219[7] ? [{
text: intl.string(t.PHjkRE),
IconComponent: AppsIcon,
onPress: env22219[12].onAppsPress,
disabled: false
}] : [];
const r35 = env22219[13] ? [{
text: intl.string(t["7Xm5QI"]),
IconComponent: ThreadIcon,
onPress: env22219[12].onThreadPress,
disabled: false
}] : [];
const r74 = {
text: intl.string(t.RgIi2B),
IconComponent: PollsIcon,
onPress: null,
disabled: null
};
const r80 = env22219[12];
r74.onPress = r80.onPollsPress;
const r82 = env22219[8];
r74.disabled = !r82.canPostPolls;
const r84 = [r74, ...r35, ...r6, {
text: intl.string(t["8Hvr3+"]),
IconComponent: AttachmentIcon,
onPress: r80.onAttachPress,
disabled: r82.uploadDisabled
}];
return [{
text: intl.string(t.Zmm6dN),
IconComponent: ImageIcon,
onPress: r80.onViewAll,
disabled: r82.uploadDisabled
}, ...r84];
}, [memo, mediaKeyboardConfig.uploadDisabled, mediaKeyboardConfig.canPostPolls, r23, chatInputFloating]);
env22219[14] = memo2;
env22219[15] = useRef(null);
const callback = useCallback((a0) => (0, jsx)(MediaKeyboardBottomSheetHeaderSimple, {
animatedIndex: a0.animatedIndex,
onPress: env22219[12].onPressHeader
}), [memo]);
return <MediaKeyboardBottomSheet animationConfigs={KEYBOARD_ANIMATION_CONFIG} animatedIndex={sharedValue2} animatedPosition={sharedValue} bottomSheetRef={ref} accessoriesComponent={useCallback(({ animateOnMount = false, initialPosition }) => {
const animatedIndex = env22219[3];
const r22 = env22219[8];
return <MediaKeyboardAccessoriesContainer animateOnMount={animateOnMount} animatedIndex={animatedIndex} animatedPosition={env22219[4]} initialPosition={initialPosition}>
<MediaKeyboardFloatingSend ref={env22219[15]} animatedIndex={animatedIndex} channelId={env22219[0].id} draftType={r22.draftType} onSend={env22219[12].onSend} />
<MediaKeyboardBottomSheetActions canPostPolls={r22.canPostPolls} onHeightChange={(event) => {
const current = env22219[15].current;
return current == null ? void 0 : current.setInsetFab(event + env22219[6]);
}} uploadDisabled={r22.uploadDisabled} overflowButtons={env22219[14]} />
</MediaKeyboardAccessoriesContainer>;
}, [sharedValue2, sharedValue, memo, channel.id, mediaKeyboardConfig, memo2, token])} handleComponent={callback} overlayComponent={appLauncherActionSheet} onClose={onClose} onAccessibilityFocusRestore={() => env22219[1].current.focusPhotosButton()} transitionState={transitionState}>
<MediaKeyboardList channel={channel} draftType={mediaKeyboardConfig.draftType} onPressCamera={memo.onPressCamera} onAttachPress={memo.onAttachPress} onPressItem={memo.onPressItem} onLongPressItem={memo.onLongPressItem} onViewAll={memo.onViewAll} onManageLimited={memo.onManageLimited} includedUploadIds={mediaKeyboardConfig.includedUploadIds} extensions={allowedExtensions} allowCamera={mediaFilesAllowed} uploadDisabled={mediaKeyboardConfig.uploadDisabled} uploadLimit={mediaKeyboardConfig.uploadLimit} disableWhenReachedLimit={mediaKeyboardConfig.disableWhenReachedLimit} />
</MediaKeyboardBottomSheet>;
});
export default r40;
@@ -0,0 +1,68 @@
// Metro module 15592 (f15593).
import { useMemo, useRef, useCallback } from "react";
import { StyleSheet } from "react-native";
import NativeMenuStore from "../../../native_menu/native/NativeMenuStore";
import * as _PlatformUtils from "../../../../utils/PlatformUtils";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { useStateFromStores } from "../../../../_bundle/Module589";
const isAndroid = _PlatformUtils.isAndroid();
const useStyles = createStyles({
androidContainer: {
flex: 1
},
iosContainer: {
...StyleSheet.absoluteFillObject
}
});
const __initData = {
code: "function MediaKeyboardAccessoriesContainerTsx1(){const{animateOnMount,initialLayout,animatedIndex,initialPosition,animatedPosition,interpolate,IS_ANDROID}=this.__closure;const animatedMountDisabledAndNotInitialLayout=!animateOnMount&&!initialLayout.get();const animatedSheetIndexOrDefault=animatedMountDisabledAndNotInitialLayout?0:Math.min(animatedIndex.get(),0);const animatedSheetPositionOrDefault=animatedMountDisabledAndNotInitialLayout?initialPosition:animatedPosition.get();const transform=[{translateY:interpolate(animatedSheetIndexOrDefault,[-1,0],[100,0])}];if(IS_ANDROID){return{marginTop:animatedSheetPositionOrDefault,transform:transform};}return{top:animatedSheetPositionOrDefault,transform:transform};}"
};
export default function MediaKeyboardAccessoriesContainer(props) {
let ref, sharedValue;
const { animatedIndex, animatedPosition, animateOnMount, children, initialPosition } = props;
ref = void 0;
sharedValue = void 0;
const styles = useStyles();
const memo = useMemo(() => ({
...isAndroid ? styles.androidContainer : styles.iosContainer,
overflow: "hidden"
}), [styles]);
ref = useRef(false);
sharedValue = useSharedValue(false);
const callback = useCallback(() => {
if (!ref.current) {
ref.current = true;
sharedValue.set(true);
}
}, [sharedValue]);
const _ = function _() {
const r1 = animateOnMount ? !animateOnMount : !sharedValue.get();
const r10 = r1 ? 0 : Math.min(animatedIndex.get(), 0);
const marginTop = r1 ? initialPosition : animatedPosition.get();
const transform = [{
translateY: _ReanimatedRexport.interpolate(r10, [-1, 0], [100, 0])
}];
return isAndroid ? {
marginTop,
transform
} : {
top: marginTop,
transform
};
};
_.__closure = {
animateOnMount,
initialLayout: sharedValue,
animatedIndex,
initialPosition,
animatedPosition,
interpolate: _ReanimatedRexport.interpolate,
IS_ANDROID: isAndroid
};
_.__workletHash = 10575537164844;
_.__initData = __initData;
const animatedStyle = useAnimatedStyle(_);
return <ReanimatedRexport.View importantForAccessibility={useStateFromStores([NativeMenuStore], () => NativeMenuStore.isOpen()) ? "no-hide-descendants" : void 0} style={[memo, animatedStyle]} onLayout={callback} pointerEvents="box-none">{children}</ReanimatedRexport.View>;
};
@@ -0,0 +1,57 @@
// Metro module 9674 (f9675).
import { useMemo, useCallback } from "react";
import { MediaPickerActionSheetEngagedActions } from "../MediaKeyboardConstants";
import { AnalyticEvents } from "../../../../Constants";
import { useSharedValue } from "../../../reanimated/ReanimatedRexport";
import { intl, t } from "../../../../intl/index.native";
import { PollsIcon } from "../../../../design/components/Icon/native/redesign/generated/PollsIcon";
import { AttachmentIcon } from "../../../../design/components/Icon/native/redesign/generated/AttachmentIcon";
import MediaKeyboardBottomSheetHeaderSimple from "./MediaKeyboardBottomSheetHeaderSimple";
import { triggerHapticFeedback } from "../../../haptics/HapticUtils.native";
import HapticFeedbackTypes from "../../../haptics/HapticFeedbackTypes";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import useMountEffect from "../../../../hooks/useMountEffect";
import MediaKeyboardBottomSheetActions from "./MediaKeyboardBottomSheetActions";
import { ImageIcon } from "../../../../design/components/Icon/native/redesign/generated/ImageIcon";
import { BottomSheet } from "../../../../design/components/Sheet/native/BottomSheet.native";
import { isMetaQuest } from "../../../device/MetaQuestUtils.android";
import MediaKeyboardList from "./MediaKeyboardList";
export default function MediaKeyboardActionSheet(props) {
let callback;
const { channel, draftType, uploadLimit, disableWhenReachedLimit, includedUploadIds, extensions, allowCamera, onPressCamera, onAttachPress, onPressItem, onLongPressItem, onViewAll, onManageLimited, onClose, onBack } = props;
callback = void 0;
const sharedValue = useSharedValue(-1);
const memo = useMemo(() => [{
text: intl.string(t.RgIi2B),
IconComponent: PollsIcon,
onPress: () => {},
disabled: true
}, {
text: intl.string(t["8Hvr3+"]),
IconComponent: AttachmentIcon,
onPress: onAttachPress,
disabled: false
}], [onAttachPress]);
const callback2 = useCallback(() => <MediaKeyboardBottomSheetHeaderSimple animatedIndex={sharedValue} onPress={onBack} />, [sharedValue, onBack]);
const callback3 = useCallback(() => {
triggerHapticFeedback(HapticFeedbackTypes.IMPACT_LIGHT);
AnalyticsUtils.track(AnalyticEvents.MEDIA_PICKER_ACTION_SHEET_ENGAGED, {
action: MediaPickerActionSheetEngagedActions.FULLY_EXPANDED
});
}, []);
callback = useCallback(() => {
if (onClose != null) {
onClose();
}
}, [onClose]);
useMountEffect(() => () => callback == null ? void 0 : callback());
const memo2 = useMemo(() => <MediaKeyboardBottomSheetActions canPostPolls={false} onHeightChange={() => {}} uploadDisabled={false} overflowButtons={[{
text: intl.string(t.Zmm6dN),
IconComponent: ImageIcon,
onPress: onViewAll,
disabled: false
}, ...memo]} />, [onViewAll, memo]);
return <BottomSheet handleComponent={callback2} scrollable startExpanded={isMetaQuest()} onExpand={callback3} onDismiss={callback} animatedIndex={sharedValue} footer={memo2}>
<MediaKeyboardList channel={channel} draftType={draftType} onPressCamera={onPressCamera} onAttachPress={onAttachPress} onPressItem={onPressItem} onLongPressItem={onLongPressItem} onViewAll={onViewAll} onManageLimited={onManageLimited} includedUploadIds={includedUploadIds} extensions={extensions} allowCamera={allowCamera} uploadLimit={uploadLimit} disableWhenReachedLimit={disableWhenReachedLimit} />
</BottomSheet>;
};
@@ -0,0 +1,200 @@
// Metro module 15594 (f15595).
import { memo, useCallback, useState, useRef, useLayoutEffect } from "react";
import { View } from "react-native";
import { HEADER_HANDLE_HEIGHT, MediaPickerActionSheetEngagedActions } from "../MediaKeyboardConstants";
import { AnalyticEvents } from "../../../../Constants";
import * as _MetaQuestUtils_android from "../../../device/MetaQuestUtils.android";
import * as _PlatformUtils from "../../../../utils/PlatformUtils";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { intl, t } from "../../../../intl/index.native";
import useCustomKeyboardBottomSheetConfig from "../../../action_sheet/native/useCustomKeyboardBottomSheetConfig";
import { TransitionStates } from "../../../../design/components/TransitionGroup/TransitionGroup";
import MobileVisualRefreshExperiment from "../../../themes/experiments/MobileVisualRefreshExperiment";
import useColorThemeBackground from "../../../client_themes/native/useColorThemeBackground";
import Module5245, { BottomSheetBackdrop } from "../../../../_bundle/Module5245";
import REAWorkaroundView from "../../../reanimated/native/REAWorkaroundView";
import { triggerHapticFeedback } from "../../../haptics/HapticUtils.native";
import HapticFeedbackTypes from "../../../haptics/HapticFeedbackTypes";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { useIsScreenReaderEnabled } from "../../../a11y/native/useIsScreenReaderEnabled.native";
import { setAccessibilityFocus } from "../../../a11y/native/setAccessibilityFocus.android";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useAnimatedReaction } from "../../../reanimated/ReanimatedRexport";
import useMountEffect from "../../../../hooks/useMountEffect";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { ThemeContextProvider } from "../../../../_bundle/Module3901";
import { AccessibilityViewAnimated } from "../../../../design/components/AccessibilityView/AccessibilityView.native";
import { dismissKeyboard } from "../../../../utils/native/ChatInputUtils";
let isMetaQuest, isIOS, useStyles, __initData, __initData2, __initData3, __initData4;
const MediaKeyboardBackground = function MediaKeyboardBackground(props) {
const { pointerEvents, style } = props;
const styles = useStyles();
return <View pointerEvents={pointerEvents} accessible accessibilityRole="adjustable" accessibilityLabel={intl.string(t.XONG6A)} style={[style, styles.background]} />;
};
isMetaQuest = _MetaQuestUtils_android.isMetaQuest();
isIOS = _PlatformUtils.isIOS();
useStyles = createStyles({
background: {
backgroundColor: Module712.colors.MOBILE_KEYBOARD_PANEL_BACKGROUND,
borderRadius: Module712.modules.mobile.MOBILE_MEDIA_KEYBOARD_TOP_BORDER_RADIUS
}
});
__initData = {
code: "function MediaKeyboardBottomSheetTsx1(){const{animatedIndex}=this.__closure;return animatedIndex.get()>=0;}"
};
__initData2 = {
code: "function MediaKeyboardBottomSheetTsx2(isOpen,wasOpen){const{IS_IOS,runOnJS,handleSheetOpenChange}=this.__closure;if(IS_IOS&&isOpen!==wasOpen&&(wasOpen!=null||isOpen)){runOnJS(handleSheetOpenChange)(isOpen);}}"
};
__initData3 = {
code: "function MediaKeyboardBottomSheetTsx3(){const{animatedIndex}=this.__closure;return Math.max(animatedIndex.get(),0)>0;}"
};
__initData4 = {
code: "function MediaKeyboardBottomSheetTsx4(result,previous){const{runOnJS,setAccessibilityViewIsModal}=this.__closure;if(result===previous)return;runOnJS(setAccessibilityViewIsModal)(result);}"
};
const r61 = memo(function MediaKeyboardBottomSheet(props) {
let isScreenReaderEnabled, setState, ref, ref2, ref3, callback;
const { accessoriesComponent, animatedIndex, animatedPosition, bottomSheetRef, children, handleComponent, onClose, onAccessibilityFocusRestore, transitionState, animationConfigs, overlayComponent } = props;
isScreenReaderEnabled = void 0;
setState = void 0;
ref = void 0;
ref2 = void 0;
ref3 = void 0;
callback = void 0;
const styles = useStyles();
const customKeyboardBottomSheetConfig = useCustomKeyboardBottomSheetConfig({
forceMaxHeight: false
});
const r4 = transitionState === TransitionStates.YEETED;
let c22226_4 = r4;
const r12 = MobileVisualRefreshExperiment("MediaKeyboardBottomSheet");
const colorThemeBackground = useColorThemeBackground();
const callback4 = useCallback((a0) => <MediaKeyboardBackground {...a0} />, []);
const callback3 = useCallback((a0) => <BottomSheetBackdrop {...a0} ViewComponent={REAWorkaroundView} pressBehavior="collapse" />, []);
const callback2 = useCallback((a0, a1) => {
L8: {
if (c22226_4 && a1 !== -1) {
if (onClose == null) {
break L8;
}
onClose();
} else if (a0 !== a1 && a0 === 0) {
triggerHapticFeedback(HapticFeedbackTypes.IMPACT_LIGHT);
AnalyticsUtils.track(AnalyticEvents.MEDIA_PICKER_ACTION_SHEET_ENGAGED, {
action: MediaPickerActionSheetEngagedActions.FULLY_EXPANDED
});
}
}
}, [r4, onClose]);
isScreenReaderEnabled = useIsScreenReaderEnabled();
const r27 = isScreenReaderEnabled ? isScreenReaderEnabled : r4;
let accessibilityViewIsModal;
[accessibilityViewIsModal, setState] = useState(false);
ref = useRef(null);
ref2 = useRef(false);
ref3 = useRef(null);
callback = useCallback((a0) => {
if (ref3.current != null) {
clearTimeout(ref3.current);
ref3.current = null;
}
if (a0) {
let r13 = isScreenReaderEnabled;
if (isScreenReaderEnabled) {
r13 = !ref2.current;
}
if (r13) {
ref3.current = setTimeout(() => {
ref3.current = null;
ref2.current = true;
setAccessibilityFocus({
ref
});
}, 100);
}
} else {
ref2.current = false;
}
}, [isScreenReaderEnabled]);
const T = () => animatedIndex.get() >= 0;
T.__closure = {
animatedIndex
};
T.__workletHash = 14174017487042;
T.__initData = __initData;
const D = function D(a0, a1) {
let r1 = isIOS;
if (isIOS) {
r1 = a0 !== a1;
}
if (r1) {
r1 = a1 != null || a0;
}
if (r1) {
_ReanimatedRexport.runOnJS(callback)(a0);
}
};
D.__closure = {
IS_IOS: isIOS,
runOnJS: _ReanimatedRexport.runOnJS,
handleSheetOpenChange: callback
};
D.__workletHash = 12464478404147;
D.__initData = __initData2;
useAnimatedReaction(T, D);
const H = () => Math.max(animatedIndex.get(), 0) > 0;
H.__closure = {
animatedIndex
};
H.__workletHash = 12101028946794;
H.__initData = __initData3;
const w = function w(a0, a1) {
if (a0 !== a1) {
_ReanimatedRexport.runOnJS(setState)(a0);
}
};
w.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
setAccessibilityViewIsModal: setState
};
w.__workletHash = 4587285719468;
w.__initData = __initData4;
useAnimatedReaction(H, w);
useMountEffect(() => () => {
if (ref3.current != null) {
clearTimeout(ref3.current);
}
if (onClose != null) {
onClose();
}
});
useLayoutEffect(() => {
if (c22226_4) {
if (bottomSheetRef.current != null) {
bottomSheetRef.current.forceClose();
let c28093_0 = setTimeout(() => onClose == null ? void 0 : onClose(), 500);
return () => clearTimeout(c28093_0);
}
if (onClose != null) {
onClose();
}
}
}, [bottomSheetRef, r4, onClose]);
const safeAreaInsets_native = useSafeAreaInsets_native();
return <ThemeContextProvider gradient={r12 ? colorThemeBackground : null}>
<Module5245 style={{
marginLeft: safeAreaInsets_native.left,
marginRight: safeAreaInsets_native.right
}} BodyComponent={REAWorkaroundView} ref={bottomSheetRef} animationConfigs={animationConfigs} animatedIndex={animatedIndex} animatedPosition={animatedPosition} enableContentPanningGesture={r27 ? !r27 : !isMetaQuest} enableHandlePanningGesture={!r27} handleComponent={handleComponent} backgroundComponent={callback4} backgroundStyle={styles.background} backdropComponent={callback3} onAnimate={callback2} handleHeight={HEADER_HANDLE_HEIGHT} onClose={onClose} {...customKeyboardBottomSheetConfig}>
<AccessibilityViewAnimated ref={ref} nativeID="media-keyboard-sheet" onAccessibilityEscape={function onAccessibilityEscape() {
if (onAccessibilityFocusRestore != null) {
onAccessibilityFocusRestore();
}
dismissKeyboard();
}} accessibilityViewIsModal={accessibilityViewIsModal}>{children}</AccessibilityViewAnimated>
</Module5245>
{accessoriesComponent(customKeyboardBottomSheetConfig)}
{overlayComponent}
</ThemeContextProvider>;
});
export default r61;
@@ -0,0 +1,115 @@
// Metro module 9681 (f9682).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { StyleSheet, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { isIOS } from "../../../../utils/PlatformUtils";
import { useGradientValue, GradientPercentage } from "../../../client_themes/native/ClientThemesUtils";
import Module689 from "../../../../_bundle/Module689";
import { useToken } from "../../../../design/tokens/native/useToken";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useMobileVisualRefreshConfig } from "../../../themes/experiments/MobileVisualRefreshExperiment";
import Module4611 from "../../../../_bundle/Module4611";
import { PressableOpacity } from "../../../../design/void/Pressables/native/Pressables";
import { Text } from "../../../../design/components/Text/native/Text";
const useStyles = createStyles((marginBottom, a1, a2, a3) => {
const wrap = {
...StyleSheet.absoluteFillObject,
alignItems: "center",
top: void 0
};
if (isIOS()) {
marginBottom = Module712.space.PX_24;
}
return {
wrap,
container: {
paddingVertical: Module712.space.PX_8,
marginHorizontal: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_MARGIN_HORIZONTAL,
marginBottom,
borderRadius: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_BORDER_RADIUS,
backgroundColor: a2 == null ? a1 : a2,
paddingHorizontal: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_PADDING_HORIZONTAL,
borderWidth: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_BORDER_WIDTH,
...Module712.shadows.SHADOW_HIGH,
...a3 ? {
borderColor: Module712.colors.BORDER_MUTED
} : {
borderTopColor: Module712.colors.BORDER_MUTED
}
},
buttonsContainer: {
gap: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_GAP,
alignItems: "stretch",
flexDirection: "row",
marginHorizontal: Module712.modules.mobile.MEDIA_KEYBOARD_BAR_BUTTONS_MARGIN_HORIZONTAL
},
button: {
flexBasis: 64,
minHeight: 48,
flexGrow: 1,
justifyContent: "center",
flexDirection: "column",
alignItems: "center",
padding: Module712.modules.mobile.MEDIA_KEYBOARD_BUTTON_PADDING,
borderRadius: Module712.modules.mobile.MEDIA_KEYBOARD_BUTTON_BORDER_RADIUS,
gap: 4
},
gradient: {
...StyleSheet.absoluteFillObject,
color: Module712.colors.BACKGROUND_BASE_LOW
}
};
});
const r30 = Module19.memo(function MediaKeyboardBottomSheetActions(props) {
const { onHeightChange, overflowButtons } = props;
const gradientValue = useGradientValue(GradientPercentage.END);
const r14 = gradientValue != null ? Module689(gradientValue).alpha(0.95).hex() : null;
let r50 = Module689(useToken(Module712.colors.CARD_BACKGROUND_DEFAULT)).alpha(0.95).hex();
const bottom = useSafeAreaInsets_native().bottom;
const enabled = useMobileVisualRefreshConfig({
location: "MediaKeyboardBottomSheetActions"
}).enabled;
const token4 = useToken(Module712.colors.MOBILE_FLOATINGBAR_BACKGROUND_HIGHER);
if (enabled) {
r50 = token4;
}
const styles = useStyles(bottom, r50, r14, enabled);
const token = useToken(Module712.modules.mobile.MEDIA_KEYBOARD_BUTTON_ICON_COLOR_ACTIVE);
const token2 = useToken(Module712.modules.mobile.MEDIA_KEYBOARD_BUTTON_TEXT_COLOR_ACTIVE);
const token3 = useToken(Module712.modules.mobile.MEDIA_KEYBOARD_BUTTON_TEXT_VARIANT);
const memo = useMemo(() => ({
start: {
x: 0,
y: 0
},
end: {
x: 0,
y: 1
},
colors: [Module689(styles.gradient.color).alpha(0).hex(), Module689(styles.gradient.color).alpha(1).hex()]
}), [styles.gradient.color]);
return <View style={styles.wrap} pointerEvents="box-none" onLayout={useCallback((a0) => {
onHeightChange(a0.nativeEvent.layout.height);
}, [onHeightChange])}>
<Module4611 style={styles.gradient} {...memo} pointerEvents="none" />
<View style={styles.container}>
<View style={styles.buttonsContainer}>
{overflowButtons.map((overflowButton, index) => {
const { IconComponent, disabled } = overflowButton;
let color = "text-muted";
const r25 = [<IconComponent size="md" color={disabled ? "text-muted" : token} />, ,];
if (!overflowButton.disabled) {
color = token2;
}
r25[1] = <Text lineClamp={1} variant={token3} color={color}>{overflowButton.text}</Text>;
return <PressableOpacity key={index} accessibilityRole="button" accessibilityLabel={overflowButton.text} accessibilityState={{
disabled: overflowButton.disabled
}} disabled={overflowButton.disabled} style={styles.button} onPress={overflowButton.onPress}>{r25}</PressableOpacity>;
})}
</View>
</View>
</View>;
});
export default r30;
@@ -0,0 +1,38 @@
// Metro module 9680 (f9681).
import { memo } from "react";
import { Pressable, View, StyleSheet } from "react-native";
import { DRAG_HANDLE } from "../MediaKeyboardConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useGradientBottom } from "../../../client_themes/native/ClientThemesOverrides";
import MobileVisualRefreshExperiment from "../../../themes/experiments/MobileVisualRefreshExperiment";
import { useDerivedStateFromSharedValue } from "../../../reanimated/native/useStateFromSharedValue";
import { intl, t } from "../../../../intl/index.native";
import { ActionSheetDragHandle } from "../../../../design/components/experimental/native";
const useStyles = createStyles({
headerHandleWrap: {
...StyleSheet.absoluteFillObject,
backgroundColor: "transparent",
height: DRAG_HANDLE.slotHeight,
alignItems: "center",
bottom: void 0
},
dragHandleBar: {
backgroundColor: DRAG_HANDLE.barColor,
borderRadius: Module712.radii.xs,
marginTop: DRAG_HANDLE.barMarginTop,
height: DRAG_HANDLE.barHeight,
width: DRAG_HANDLE.barWidth
}
});
const r50 = memo(function MediaKeyboardBottomSheetHandle(props) {
const { animatedIndex, onPress } = props;
const styles = useStyles();
const gradientBottom = useGradientBottom();
const r21 = MobileVisualRefreshExperiment("MediaKeyboardBottomSheetHandle");
const accessibilityLabel = useDerivedStateFromSharedValue(animatedIndex, (a0) => a0 > 0) ? intl.string(t.iTcuma) : intl.string(t.dcl9MQ);
return r21 ? <ActionSheetDragHandle onPress={onPress} accessibilityLabel={accessibilityLabel} aria-hidden={onPress == null} /> : <Pressable accessibilityLabel={accessibilityLabel} accessibilityRole="button" aria-hidden={onPress == null} style={[styles.headerHandleWrap, gradientBottom]} onPress={onPress}>
<View style={styles.dragHandleBar} />
</Pressable>;
});
export default r50;
@@ -0,0 +1,20 @@
// Metro module 9679 (f9680).
import { memo } from "react";
import { View } from "react-native";
import { HEADER_HANDLE_HEIGHT } from "../MediaKeyboardConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import MediaKeyboardBottomSheetHandle from "./MediaKeyboardBottomSheetHandle";
const useStyles = createStyles({
headerHandleOnlyWrap: {
height: HEADER_HANDLE_HEIGHT,
paddingBottom: Module712.space.PX_4
}
});
const r36 = memo(function MediaKeyboardBottomSheetHeaderSimple(props) {
const { animatedIndex, onPress } = props;
return <View style={useStyles().headerHandleOnlyWrap}>
<MediaKeyboardBottomSheetHandle animatedIndex={animatedIndex} onPress={onPress} />
</View>;
});
export default r36;
@@ -0,0 +1,49 @@
// Metro module 9696 (f9697).
import { Image as Image2, View } from "react-native";
import { NativePermissionStatus } from "../../../native_permissions/NativePermissionConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { Text } from "../../../../design/components/Text/native/Text";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { SettingsIcon } from "../../../../design/components/Icon/native/redesign/generated/SettingsIcon";
import { intl, t } from "../../../../intl/index.native";
import Module9697 from "../../../../_bundle/Module9697";
import { CameraIcon } from "../../../../design/components/Icon/native/redesign/generated/CameraIcon";
import Module9698 from "../../../../_bundle/Module9698";
let useStyles;
const MediaKeyboardEmptyState = function MediaKeyboardEmptyState(props) {
const { actionIcon, actionLabel, actionPress, imageSource, label } = props;
const styles = useStyles();
return <View style={styles.container}>
<Image2 source={imageSource} />
<Text variant="text-sm/semibold" color="text-muted" style={styles.label}>{label}</Text>
<Button icon={actionIcon} size="sm" text={actionLabel} onPress={actionPress} />
</View>;
};
useStyles = createStyles({
container: {
marginHorizontal: Module712.space.PX_8,
marginVertical: Module712.space.PX_32,
justifyContent: "center",
alignItems: "center"
},
label: {
textAlign: "center",
marginVertical: Module712.space.PX_16
}
});
export default MediaKeyboardEmptyState;
export function getMediaEmptyStateComponentOrNull({ photoPermissionStatus, photosEmpty, showCameraButton = true, onPressCamera, onManageLimited, onPressPrivacySettings }) {
if (photoPermissionStatus !== NativePermissionStatus.DENIED && photoPermissionStatus !== NativePermissionStatus.RESTRICTED) {
if (photosEmpty) {
if (photoPermissionStatus === NativePermissionStatus.LIMITED) {
return <MediaKeyboardEmptyState actionIcon={<SettingsIcon color="white" size="sm" />} actionLabel={intl.string(t.JuXTi6)} actionPress={onManageLimited} imageSource={Module9697} label={intl.string(t["5g7NcN"])} />;
}
if (showCameraButton) {
return <MediaKeyboardEmptyState actionIcon={<CameraIcon color="white" size="sm" />} actionLabel={intl.string(t.tpoWUd)} actionPress={onPressCamera} imageSource={Module9698} label={intl.string(t.YOvRBZ)} />;
}
}
return void 0;
}
return <MediaKeyboardEmptyState actionIcon={<SettingsIcon color="white" size="sm" />} actionLabel={intl.string(t["457oeG"])} actionPress={onPressPrivacySettings} imageSource={Module9697} label={intl.string(t["8p9jGu"])} />;
}
@@ -0,0 +1,119 @@
// Metro module 15593 (f15594).
import * as Module19 from "react";
import { forwardRef, useState, useMemo, useImperativeHandle } from "react";
import { StyleSheet } from "react-native";
import UploadAttachmentStore from "../../../../stores/UploadAttachmentStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import ReanimatedRexport, { useSharedValue, useAnimatedReaction, useAnimatedStyle, useAnimatedProps } from "../../../reanimated/ReanimatedRexport";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import * as _spring from "../../../../design/animation/reanimated/spring/spring";
import Module689 from "../../../../_bundle/Module689";
import Module4611 from "../../../../_bundle/Module4611";
import { FloatingActionButton } from "../../../../design/components/Button/native/FloatingActionButton.native";
import { intl, t } from "../../../../intl/index.native";
import { SendMessageIcon } from "../../../../design/components/Icon/native/redesign/generated/SendMessageIcon";
const useStyles = createStyles({
sendContainer: {
...StyleSheet.absoluteFillObject,
top: void 0,
...Module712.shadows.SHADOW_HIGH
},
gradient: {
...StyleSheet.absoluteFillObject,
color: Module712.colors.BACKGROUND_SURFACE_HIGH
}
});
const __initData = {
code: "function MediaKeyboardFloatingSendTsx1(){const{animatedIndex,INDEX_HEADER_CHANGE_THRESHOLD,hasUploads}=this.__closure;const isSheetOpen=animatedIndex.get()>INDEX_HEADER_CHANGE_THRESHOLD;return isSheetOpen&&hasUploads;}"
};
const __initData2 = {
code: "function MediaKeyboardFloatingSendTsx2(visible){const{isSendVisibleSharedValue}=this.__closure;isSendVisibleSharedValue.set(visible);}"
};
const __initData3 = {
code: "function MediaKeyboardFloatingSendTsx3(){const{insetFab,tokens,withSpring,sendVisibleSharedValue}=this.__closure;return{height:insetFab+tokens.space.PX_64+tokens.space.PX_32,opacity:withSpring(sendVisibleSharedValue.get()?1:0)};}"
};
const __initData4 = {
code: "function MediaKeyboardFloatingSendTsx4(){const{sendVisibleSharedValue}=this.__closure;return{pointerEvents:sendVisibleSharedValue.get()?'box-none':'none'};}"
};
const r58 = Module19.memo(forwardRef(function MediaKeyboardFloatingSendInner(props, a1) {
let sharedValue;
const { animatedIndex: animatedIndex2, channelId: channelId2, draftType: draftType2, onSend } = props;
sharedValue = void 0;
const styles = useStyles();
const safeAreaInsets_native = useSafeAreaInsets_native();
let [state, setState] = useState(null);
if (state == null) {
state = safeAreaInsets_native.bottom;
}
let sharedValue2;
const bottom = state;
const animatedIndex = animatedIndex2;
const channelId = channelId2;
const draftType = draftType2;
sharedValue2 = void 0;
const stateFromStores = useStateFromStores([UploadAttachmentStore], () => UploadAttachmentStore.getUploadCount(channelId, draftType) > 0, [channelId, draftType]);
sharedValue2 = useSharedValue(false);
const c = function c() {
return animatedIndex.get() > 0.7 && stateFromStores;
};
c.__closure = {
animatedIndex,
INDEX_HEADER_CHANGE_THRESHOLD: 0.7,
hasUploads: stateFromStores
};
c.__workletHash = 12206635621152;
c.__initData = __initData;
const l = function l(a0) {
sharedValue2.set(a0);
};
l.__closure = {
isSendVisibleSharedValue: sharedValue2
};
l.__workletHash = 10753585819648;
l.__initData = __initData2;
useAnimatedReaction(c, l);
sharedValue = sharedValue2;
const y = () => ({
height: bottom + Module712.space.PX_64 + Module712.space.PX_32,
opacity: _spring.withSpring(sharedValue.get() ? 1 : 0)
});
y.__closure = {
insetFab: bottom,
tokens: Module712,
withSpring: _spring.withSpring,
sendVisibleSharedValue: sharedValue2
};
y.__workletHash = 6402761213297;
y.__initData = __initData3;
const animatedStyle = useAnimatedStyle(y);
const f = () => ({
pointerEvents: sharedValue.get() ? "box-none" : "none"
});
f.__closure = {
sendVisibleSharedValue: sharedValue2
};
f.__workletHash = 1097586248797;
f.__initData = __initData4;
const animatedProps = useAnimatedProps(f);
const memo = useMemo(() => ({
start: {
x: 0,
y: 0
},
end: {
x: 0,
y: 1
},
colors: [Module689(styles.gradient.color).alpha(0).hex(), Module689(styles.gradient.color).hex()]
}), [styles.gradient.color]);
useImperativeHandle(a1, () => ({
setInsetFab: setState
}));
return <ReanimatedRexport.View style={[animatedStyle, styles.sendContainer]} animatedProps={animatedProps}>
<Module4611 style={styles.gradient} {...memo} pointerEvents="none" />
<FloatingActionButton accessibilityLabel={intl.string(t.TXNS7S)} icon={<SendMessageIcon />} onPress={onSend} positionBottom={bottom} />
</ReanimatedRexport.View>;
}));
export default r58;
@@ -0,0 +1,44 @@
// Metro module 9693 (f9694).
import { memo } from "react";
import { ActivityIndicator, Image as Image2, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import DeviceMedia from "../../../device/native/DeviceMedia";
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 Module9694 from "../../../../_bundle/Module9694";
const useStyles = createStyles({
container: {
padding: Module712.space.PX_16,
height: 280,
alignItems: "center"
},
label: {
textAlign: "center",
marginBottom: 16
},
buttonWrapper: {
marginBottom: Module712.space.PX_32,
height: Module712.space.PX_48
},
loadingSpinner: {
color: Module712.colors.BACKGROUND_SURFACE_HIGHEST,
margin: Module712.space.PX_16
}
});
const r56 = memo(function MediaKeyboardFooter(props) {
const { disabled, onViewAll } = props;
const styles = useStyles();
return DeviceMedia.useHasReachedEnd() ? <View style={styles.container}>
<Text variant="text-sm/normal" style={styles.label}>
{intl.string(t.mKSwAW)}
</Text>
<View style={styles.buttonWrapper}>
<Button variant="primary" size="sm" onPress={onViewAll} text={intl.string(t.ZT24In)} disabled={disabled} />
</View>
<Image2 source={Module9694} />
</View> : <ActivityIndicator style={styles.loadingSpinner} size="large" color={styles.loadingSpinner.color} />;
});
export default r56;
export const FOOTER_HEIGHT = 280;
@@ -0,0 +1,382 @@
// Metro module 9687 (f9688).
import * as Module19 from "react";
import { useMemo } from "react";
import { Pressable, View, StyleSheet } from "react-native";
import UploadAttachmentStore from "../../../../stores/UploadAttachmentStore";
import { ALAssetsType, DeviceMediaType } from "../../../device/native/DeviceConstants";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import { createStyles, createStyleProperties } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { hexWithOpacity } from "../../../../utils/ColorUtils";
import * as _native from "../../../../design/void/native";
import { ThumbnailImage } from "../../../../design/void/native";
import Module9630 from "../../../../_bundle/Module9630";
import { Text } from "../../../../design/components/Text/native/Text";
import { useStateFromStoresObject } from "../../../../_bundle/Module589";
import { doesImageMatchUpload } from "../../../../lib/uploader/UploadUtils";
import NativeMenuActionCreators from "../../../native_menu/native/NativeMenuActionCreators";
import { intl, t } from "../../../../intl/index.native";
import { getTimeFormat } from "../../../../utils/native/TimeUtils";
import { getType } from "../../../../utils/native/UploadUtils";
import { Caption } from "../../../media/native/Caption";
import Module9690 from "../../../../_bundle/Module9690";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
import { CameraIcon } from "../../../../design/components/Icon/native/redesign/generated/CameraIcon";
import { ImageIcon } from "../../../../design/components/Icon/native/redesign/generated/ImageIcon";
import { AttachmentIcon } from "../../../../design/components/Icon/native/redesign/generated/AttachmentIcon";
function $mk83097($env) {
return () => {
let borderBottomRightRadius;
const r7 = $env;
const r11 = r7[2];
const r10 = r11 !== 0 ? Math.floor((r11 - 1) / r7[1]) : 0;
const r13 = Math;
const r19 = r7[0];
const r20 = r7[1];
const r22 = r13.floor(r19 / r20);
let marginLeft = 4;
const r24 = {
borderTopLeftRadius: r19 === 0 ? 16 : 4,
borderTopRightRadius: (r11 >= r20 ? r19 === r20 - 1 : r19 === r11 - 1) ? 16 : 4,
borderBottomLeftRadius: null,
borderBottomRightRadius: null,
marginLeft: null
};
const borderBottomLeftRadius = r22 === r10 ? r19 % r20 == 0 ? 16 : 4 : 4;
L16: {
r24.borderBottomLeftRadius = borderBottomLeftRadius;
if (r19 !== r11 - 1) {
const r33 = r11 % r20;
borderBottomRightRadius = 4;
if (r33 == 0) {
break L16;
}
borderBottomRightRadius = r19 === (r10 - 1) * r20 + r20 - 1 ? 16 : 4;
} else {
borderBottomRightRadius = 16;
}
}
r24.borderBottomRightRadius = borderBottomRightRadius;
if (r19 % r20 == 0) {
marginLeft = 0;
}
r24.marginLeft = marginLeft;
return r24;
};
}
let AnimatedComponent, useStyles, MediaKeyboardImage, MediaKeyboardDummy, styleProperties, __initData, MediaKeyboardSpecialButton;
const NewCaption = function NewCaption(props) {
const { label, style, textStyle } = props;
const styles = useStyles();
return <View style={[styles.labelContainer, style]}>
<_native.Icon source={Module9630} style={styles.icon} />
<Text style={textStyle} color="text-overlay-light" variant="text-xs/bold">{label}</Text>
</View>;
};
MediaKeyboardImage = function MediaKeyboardImage(props) {
let r72, accessibilityLabel, disableWhenReachedLimit2, disabled2, index, numItemsPerRow, onLongPress2, onPress2, size2, styles, totalNumItems2, type, uploadCount, uploadLimit2;
let draftType, item, channelId, onPressItem, onLongPressItem, includedUploadIds, image, isIncluded;
L6: {
draftType = props.draftType;
item = props.item;
index = props.index;
totalNumItems2 = props.totalNumItems;
numItemsPerRow = props.numItemsPerRow;
size2 = props.size;
channelId = props.channelId;
onPressItem = props.onPressItem;
onLongPressItem = props.onLongPressItem;
disabled2 = props.disabled;
includedUploadIds = props.includedUploadIds;
uploadLimit2 = props.uploadLimit;
disableWhenReachedLimit2 = props.disableWhenReachedLimit;
image = void 0;
isIncluded = void 0;
styles = useStyles();
const node = item.node;
image = node.image;
type = node.type;
const stateFromStoresObject = useStateFromStoresObject([UploadAttachmentStore], () => {
const r2 = {
upload: UploadAttachmentStore.findUpload(channelId, draftType, (a0) => doesImageMatchUpload(image, a0) && (includedUploadIds == null || includedUploadIds.includes(a0.id))),
uploadCount: null
};
let uploadCount = includedUploadIds?.length;
if (uploadCount == null) {
uploadCount = UploadAttachmentStore.getUploadCount(channelId, draftType);
}
r2.uploadCount = uploadCount;
return r2;
}, [channelId, draftType, image, includedUploadIds]);
const upload = stateFromStoresObject.upload;
uploadCount = stateFromStoresObject.uploadCount;
isIncluded = upload != null;
const memo = useMemo(() => ({
onPress: () => {
NativeMenuActionCreators.hideNativeMenu();
onPressItem({
channelId,
item,
isIncluded
});
},
onLongPress: () => {
NativeMenuActionCreators.hideNativeMenu();
if (onLongPressItem != null) {
onLongPressItem({
channelId,
item,
isIncluded
});
}
}
}), [channelId, item, isIncluded, onPressItem, onLongPressItem]);
onPress2 = memo.onPress;
onLongPress2 = memo.onLongPress;
if (ALAssetsType.PHOTO !== type && DeviceMediaType.IMAGE !== type) {
if (ALAssetsType.VIDEO !== type) {
const VIDEO = DeviceMediaType.VIDEO;
accessibilityLabel = void 0;
if (VIDEO !== type) {
break L6;
}
}
accessibilityLabel = intl.string(t.FlNoSV);
} else {
accessibilityLabel = intl.string(t.SkfkEJ);
}
}
L13: {
if (ALAssetsType.VIDEO !== type && DeviceMediaType.VIDEO !== type) {
if (ALAssetsType.PHOTO !== type) {
const IMAGE = DeviceMediaType.IMAGE;
r72 = null;
if (IMAGE !== type) {
break L13;
}
}
const type2 = getType(image.uri);
r72 = null;
if (type2 !== "image/gif") {
break L13;
}
r72 = <Caption style={styles.mediaKeyboardItemLabelContainer} label="GIF" />;
} else {
r72 = <NewCaption label={getTimeFormat(image.playableDuration)} />;
}
}
const disabled3 = isIncluded ? !isIncluded : uploadCount >= uploadLimit2 && disableWhenReachedLimit2 || disabled2;
let env17407;
const r111 = <ReanimatedRexport.View style={styles.checkIconContainer}>
<_native.Icon source={Module9690} disableColor={false} color={styles.checkIcon.color} style={styles.checkIcon} />
</ReanimatedRexport.View>;
const r112 = env17407 = {};
env17407[0] = index;
env17407[1] = numItemsPerRow;
env17407[2] = totalNumItems2;
return <Pressable accessibilityRole="button" accessibilityLabel={accessibilityLabel} accessibilityState={{
selected: isIncluded
}} onPress={onPress2} onLongPress={onLongPress2} disabled={disabled3} style={[styles.imageContainer, disabled3 ? styles.imageDisabled : void 0, useMemo($mk83097(r112), [index, numItemsPerRow, totalNumItems2])]}>
<ThumbnailImage resizeMode="cover" resizeMethod="resize" style={[styles.image, {
height: size2,
width: size2
}]} source={{
uri: image.uri,
width: size2,
height: size2,
cache: "force-cache"
}} localImageSource={{
uri: image.uri,
width: size2,
height: size2
}} />
{r72}
{isIncluded ? <View style={[styles.selectedOverlay, {
height: size2,
width: size2
}]} /> : null}
{isIncluded ? r111 : null}
</Pressable>;
};
MediaKeyboardDummy = function MediaKeyboardDummy(props) {
const { size: size2, isFirstInRow } = props;
const styles = useStyles();
return <View style={[styles.imageContainer, isFirstInRow ? !isFirstInRow : {
marginLeft: 4
}]}>
<View style={[styles.image, {
height: size2,
width: size2
}]} />
</View>;
};
MediaKeyboardSpecialButton = function MediaKeyboardSpecialButton(props) {
let env17409;
const { size: size2, onPress: onPress2, disabled: disabled2, accessibilityLabel, children, index, totalNumItems: totalNumItems2, numItemsPerRow } = props;
const styles = useStyles();
const sharedValue = useSharedValue(0);
const r27 = styleProperties();
const { backgroundColor, pressedBackgroundColor } = r27;
const h = function h() {
return {
backgroundColor: _timing.withTiming(_ReanimatedRexport.interpolateColor(sharedValue.get(), [0, 1], [backgroundColor, pressedBackgroundColor]), {
duration: 200,
easing: _ReanimatedRexport.Easing.out(_ReanimatedRexport.Easing.quad)
})
};
};
h.__closure = {
withTiming: _timing.withTiming,
interpolateColor: _ReanimatedRexport.interpolateColor,
pressed: sharedValue,
backgroundColor,
pressedBackgroundColor,
Easing: _ReanimatedRexport.Easing
};
h.__workletHash = 15924448581794;
h.__initData = __initData;
const animatedStyle = useAnimatedStyle(h);
const r42 = env17409 = {};
env17409[0] = index;
env17409[1] = numItemsPerRow;
env17409[2] = totalNumItems2;
return <AnimatedComponent disabled={disabled2} accessibilityRole="button" accessibilityLabel={accessibilityLabel} onPressIn={() => {
sharedValue.set(1);
}} onPressOut={() => {
sharedValue.set(0);
}} onPress={onPress2} style={[animatedStyle, styles.imageContainer, styles.specialButton, {
width: size2,
height: size2
}, useMemo($mk83097(r42), [index, numItemsPerRow, totalNumItems2]), disabled2 ? styles.disabled : void 0]}>{children}</AnimatedComponent>;
};
AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Pressable);
useStyles = createStyles({
container: {
flexDirection: "row",
paddingHorizontal: 12,
alignItems: "center"
},
image: {
backgroundColor: Module712.colors.MOBILE_KEYBOARD_PANEL_BACKGROUND
},
imageContainer: {
borderRadius: Module712.radii.xs,
overflow: "hidden",
position: "relative"
},
labelContainer: {
flexDirection: "row",
alignItems: "center",
backgroundColor: hexWithOpacity(Module712.unsafe_rawColors.PRIMARY_700, 0.6),
borderRadius: Module712.radii.xs,
paddingHorizontal: 5,
paddingVertical: 4,
position: "absolute",
left: 8,
bottom: 8
},
mediaKeyboardItemLabelContainer: {
right: 10
},
icon: {
width: 12,
height: 12,
tintColor: Module712.colors.WHITE,
marginEnd: 4
},
checkIcon: {
width: 14,
height: 14,
color: Module712.colors.BACKGROUND_BRAND
},
checkIconContainer: {
width: 24,
height: 24,
position: "absolute",
justifyContent: "center",
alignItems: "center",
right: 6,
top: 6,
borderRadius: Module712.radii.round,
backgroundColor: Module712.colors.WHITE,
borderWidth: 1,
borderColor: hexWithOpacity(Module712.unsafe_rawColors.BLACK, 0.1)
},
selectedOverlay: {
...StyleSheet.absoluteFillObject,
borderRadius: Module712.radii.xs,
backgroundColor: hexWithOpacity(Module712.unsafe_rawColors.BLACK, 0.3)
},
specialButton: {
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
gap: 8
},
disabled: {
opacity: 0.4
},
imageDisabled: {
opacity: 0.2
}
});
styleProperties = createStyleProperties({
backgroundColor: Module712.colors.CONTROL_SECONDARY_BACKGROUND_DEFAULT,
pressedBackgroundColor: Module712.colors.CONTROL_SECONDARY_BACKGROUND_ACTIVE
});
__initData = {
code: "function MediaKeyboardItemTsx1(){const{withTiming,interpolateColor,pressed,backgroundColor,pressedBackgroundColor,Easing}=this.__closure;return{backgroundColor:withTiming(interpolateColor(pressed.get(),[0,1],[backgroundColor,pressedBackgroundColor]),{duration:200,easing:Easing.out(Easing.quad)})};}"
};
const r134 = Module19.memo(function({ items, channel, draftType: draftType2, onPressItem: onPressItem2, onLongPressItem: onLongPressItem2, rowIndex, totalNumItems, numPerRow, includedUploadIds: includedUploadIds2, uploadLimit, disableWhenReachedLimit, handleCameraPress, handleAttachPress, handleViewAllPhotosPress, disabled }) {
const styles = useStyles();
const size = (useWindowDimensions_native().width - (24 + 4 * (numPerRow - 1))) / numPerRow;
let c17410_12 = {
camera: {
text: t.uje3P9,
onPress: handleCameraPress,
Icon: CameraIcon
},
allphotos: {
text: t.Zmm6dN,
onPress: handleViewAllPhotosPress,
Icon: ImageIcon
},
attach: {
text: t["8Hvr3+"],
onPress: handleAttachPress,
Icon: AttachmentIcon
}
};
return <View style={styles.container}>
{items.map((a0, a1) => {
if (a0 == null) {
return <MediaKeyboardDummy key={a1} size={size} isFirstInRow={a1 === 0} />;
}
if ("type" in a0 && ["allphotos", "attach", "camera"].includes(a0.type)) {
const r35 = c17410_12[a0.type];
return <MediaKeyboardSpecialButton key={a1} size={size} onPress={r35.onPress} disabled={disabled} accessibilityLabel={intl.string(r35.text)} index={rowIndex * numPerRow + a1} totalNumItems={totalNumItems} numItemsPerRow={numPerRow}>
<r35.Icon color={Module712.colors.ICON_SUBTLE} size="lg" />
</MediaKeyboardSpecialButton>;
}
return <MediaKeyboardImage key={a1} channelId={channel.id} draftType={draftType2} index={rowIndex * numPerRow + a1} totalNumItems={totalNumItems} numItemsPerRow={numPerRow} item={a0} includedUploadIds={includedUploadIds2} uploadLimit={uploadLimit} disableWhenReachedLimit={disableWhenReachedLimit} size={size} onPressItem={onPressItem2} onLongPressItem={onLongPressItem2} disabled={disabled} />;
})}
</View>;
});
export default r134;
export const PARENT_PADDING = 24;
export const CHILD_PADDING = 4;
export const SEPARATOR_SIZE = 4;
export function isMediaCameraNode(a0) {
return "type" in a0 && a0.type === "camera";
}
export function isAttachFilesNode(a0) {
return "type" in a0 && a0.type === "attach";
}
export function isViewAllPhotosNode(a0) {
return "type" in a0 && a0.type === "allphotos";
}
export function isSpecialMediaGridNode(a0) {
return "type" in a0 && ["allphotos", "attach", "camera"].includes(a0.type);
}
@@ -0,0 +1,40 @@
// Metro module 9695 (f9696).
import { useCallback } from "react";
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";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flexDirection: "row",
paddingHorizontal: 16,
paddingVertical: 16,
alignItems: "center"
},
absoluteContainer: {
position: "absolute"
},
text: {
flex: 1
},
button: {
marginLeft: 16
}
});
export default function MediaKeyboardLimitedPickerNotice(props) {
const { onPress, onHeightChange } = props;
const styles = useStyles();
return <View style={[styles.container, onHeightChange != null ? styles.absoluteContainer : void 0]} onLayout={useCallback((a0) => {
if (onHeightChange != null) {
onHeightChange(a0.nativeEvent.layout.height);
}
}, [onHeightChange])}>
<Text style={styles.text} variant="text-sm/normal">
{intl.string(t["5g7NcN"])}
</Text>
<View style={styles.button}>
<Button size="sm" variant="tertiary" text={intl.string(t.JuXTi6)} onPress={onPress} />
</View>
</View>;
};
@@ -0,0 +1,263 @@
// Metro module 9682 (f9683).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import * as Module19 from "react";
import { useRef, useCallback, useState, useEffect, useMemo } from "react";
import { NativeModules, NativeEventEmitter } from "react-native";
import DimensionsStore_android from "../../../screen/native/DimensionsStore.android";
import { InAppCameraUsedCameraPreviewTypes } from "../MediaKeyboardConstants";
import { ACTION_SHEET_START_HEIGHT_RATIO } from "../../../action_sheet/native/ActionSheetConstants";
import { NativePermissionStatus } from "../../../native_permissions/NativePermissionConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { useAnimatedReaction, useSharedValue } from "../../../reanimated/ReanimatedRexport";
import DeviceMedia from "../../../device/native/DeviceMedia";
import { useMediaKeyboardItemsPerRow } from "../useMediaKeyboardItemsPerRow";
import { useAppEntryKey } from "../../../window/native/AppEntryKeyContext";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
import { NAV_BAR_HEIGHT_MULTILINE } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { useBottomSheetInternal } from "../../../../_bundle/Module5245";
import * as _cheapWorkletShallowEqual from "../../../reanimated/native/cheapWorkletShallowEqual";
import * as _ImagePickerUtils from "../../../image/native/ImagePickerUtils";
import Module12 from "../../../../_bundle/Module12";
import MediaKeyboardItem, { isMediaCameraNode, isAttachFilesNode, isViewAllPhotosNode, PARENT_PADDING, CHILD_PADDING, SEPARATOR_SIZE } from "./MediaKeyboardItem";
import MediaKeyboardFooter, { FOOTER_HEIGHT } from "./MediaKeyboardFooter";
import MediaKeyboardLimitedPickerNotice from "./MediaKeyboardLimitedPickerNotice";
import { useModalDismissGuardRefreshControl } from "../../../keyboard/native/useModalDismissGuardRefreshControl";
import { getMediaEmptyStateComponentOrNull } from "./MediaKeyboardEmptyState";
import openPrivacySettings_native from "../../../native_permissions/mobile/openPrivacySettings.native";
import FastList, { MINIMUM_BATCHES_TO_RENDER } from "../../../../lib/native/FastList";
import { intl, t } from "../../../../intl/index.native";
let c6406_11 = new NativeEventEmitter(NativeModules.PhotoLibraryHelper);
const useStyles = createStyles({
listContainer: {
backgroundColor: Module712.colors.MOBILE_KEYBOARD_PANEL_BACKGROUND,
marginTop: 8,
paddingTop: 8
}
});
const __initData = {
code: "function MediaKeyboardListTsx1(){const{animatedIndex}=this.__closure;return animatedIndex.get();}"
};
const __initData2 = {
code: "function MediaKeyboardListTsx2(currentIndex){const{latch,runOnJS,setIsExpanded}=this.__closure;if(currentIndex>0.1&&!latch.get()){latch.set(true);runOnJS(setIsExpanded)(true);}}"
};
const __initData3 = {
code: "function MediaKeyboardListTsx3(){const{animatedSnapPoints}=this.__closure;return animatedSnapPoints.get();}"
};
const __initData4 = {
code: "function MediaKeyboardListTsx4(snapPoints,previous){const{cheapWorkletArrayShallowEqual,runOnJS,setBottomSheetState,windowHeight,computedStartHeight,maxDynamicContentSize}=this.__closure;var _snapPoints$,_snapPoints;if(cheapWorkletArrayShallowEqual(snapPoints,previous!==null&&previous!==void 0?previous:undefined))return;runOnJS(setBottomSheetState)({minimum:windowHeight-((_snapPoints$=snapPoints[0])!==null&&_snapPoints$!==void 0?_snapPoints$:computedStartHeight),maximum:windowHeight-((_snapPoints=snapPoints[snapPoints.length-1])!==null&&_snapPoints!==void 0?_snapPoints:maxDynamicContentSize)});}"
};
const r58 = Module19.memo(function MediaKeyboardList(props) {
let state, setState, assets, itemsPerRow, itemsPageSizeRef, appEntryKey, height, c17401_21, c17401_22, animatedSnapPoints, setState2, isImageCaptureIntentSupported, totalNumItems, memo, callback, width, maximum, setState3;
const { channel, draftType, onPressCamera: onPressCamera2, onAttachPress, onPressItem, onLongPressItem, onViewAll, onManageLimited, includedUploadIds, extensions } = props;
let allowCamera = props.allowCamera;
if (allowCamera === void 0) {
allowCamera = true;
}
let uploadDisabled = props.uploadDisabled;
if (uploadDisabled === void 0) {
uploadDisabled = false;
}
let animatedIndex, setState4, sharedValue;
const disabled = uploadDisabled;
const { uploadLimit, disableWhenReachedLimit } = props;
state = void 0;
setState = void 0;
assets = void 0;
itemsPerRow = void 0;
itemsPageSizeRef = void 0;
appEntryKey = void 0;
height = void 0;
c17401_21 = void 0;
c17401_22 = void 0;
animatedSnapPoints = void 0;
setState2 = void 0;
isImageCaptureIntentSupported = void 0;
totalNumItems = void 0;
memo = void 0;
callback = void 0;
width = void 0;
maximum = void 0;
setState3 = void 0;
const ref = useRef(true);
const callback2 = useCallback((a0) => {
ref.current = a0.nativeEvent.contentOffset.y < 100;
}, [ref]);
[state, setState] = useState(null);
assets = DeviceMedia.useAssets();
const mediaKeyboardItemsPerRow = useMediaKeyboardItemsPerRow();
itemsPerRow = mediaKeyboardItemsPerRow.itemsPerRow;
itemsPageSizeRef = mediaKeyboardItemsPerRow.itemsPageSizeRef;
useEffect(() => {
NativeModules.NativePermissionManager.requestPhotoAuthorization().then((result) => {
setState(result);
});
}, []);
useEffect(() => {
if (state !== NativePermissionStatus.AUTHORIZED && state !== NativePermissionStatus.LIMITED) {
return void 0;
}
DeviceMedia.refreshAssets({
batchSize: itemsPageSizeRef.current,
extensions
});
const r21 = c6406_11 == null ? void 0 : c6406_11.addListener("photoLibraryChanged", () => {
if (ref.current) {
DeviceMedia.refreshAssets({
batchSize: itemsPageSizeRef.current,
extensions
});
}
});
let c26516_0 = r21;
return () => {
if (c26516_0 != null) {
c26516_0.remove();
}
};
}, [state, itemsPageSizeRef, extensions]);
appEntryKey = useAppEntryKey();
const top = useSafeAreaInsets_native().top;
height = useWindowDimensions_native({
ignoreKeyboard: true
}).height;
const minimum2 = height * ACTION_SHEET_START_HEIGHT_RATIO;
c17401_21 = minimum2;
const maximum3 = height - NAV_BAR_HEIGHT_MULTILINE - top;
c17401_22 = maximum3;
const bottomSheetInternal = useBottomSheetInternal();
animatedSnapPoints = bottomSheetInternal.animatedSnapPoints;
const animatedIndex2 = bottomSheetInternal.animatedIndex;
const r93 = _slicedToArray(useState({
minimum: minimum2,
maximum: maximum3
}), 2);
const r94 = r93[0];
let minimum = r94.minimum;
const maximum2 = r94.maximum;
setState2 = r93[1];
const G = () => animatedSnapPoints.get();
G.__closure = {
animatedSnapPoints
};
G.__workletHash = 7279123713809;
G.__initData = __initData3;
const r100 = function(a0, a1) {
if (!_cheapWorkletShallowEqual.cheapWorkletArrayShallowEqual(a0, a1 == null ? void 0 : a1)) {
const r17 = _ReanimatedRexport.runOnJS(setState2);
let r19 = a0[0];
if (r19 == null) {
r19 = c17401_21;
}
let r24 = a0[a0.length - 1];
if (r24 == null) {
r24 = c17401_22;
}
r17({
minimum: height - r19,
maximum: height - r24
});
}
};
r100.__closure = {
cheapWorkletArrayShallowEqual: _cheapWorkletShallowEqual.cheapWorkletArrayShallowEqual,
runOnJS: _ReanimatedRexport.runOnJS,
setBottomSheetState: setState2,
windowHeight: height,
computedStartHeight: minimum2,
maxDynamicContentSize: maximum3
};
r100.__workletHash = 4619753074319;
r100.__initData = __initData4;
useAnimatedReaction(G, r100);
animatedIndex = animatedIndex2;
setState4 = void 0;
sharedValue = void 0;
let state2;
[state2, setState4] = useState(false);
sharedValue = useSharedValue(false);
const i = () => animatedIndex.get();
i.__closure = {
animatedIndex
};
i.__workletHash = 8982138292467;
i.__initData = __initData;
const r127 = function(a0) {
if (a0 > 0.1 && !sharedValue.get()) {
sharedValue.set(true);
_ReanimatedRexport.runOnJS(setState4)(true);
}
};
r127.__closure = {
latch: sharedValue,
runOnJS: _ReanimatedRexport.runOnJS,
setIsExpanded: setState4
};
r127.__workletHash = 7990574449734;
r127.__initData = __initData2;
useAnimatedReaction(i, r127);
const styles = useStyles();
if (allowCamera) {
allowCamera = _ImagePickerUtils.isImageCaptureIntentSupported();
}
isImageCaptureIntentSupported = allowCamera;
let r141 = assets == null ? void 0 : assets.edges.length;
if (r141 == null) {
r141 = 0;
}
totalNumItems = r141 + (isImageCaptureIntentSupported ? 1 : 0);
memo = useMemo(() => {
const r6 = isImageCaptureIntentSupported ? [{
type: "camera"
}] : [];
if (assets == null) {
return Module12.chunk([...r6, ...Array(3 * itemsPerRow - r6.length).fill(null)], itemsPerRow);
}
let r16 = assets?.edges;
if (r16 == null) {
r16 = [];
}
return Module12.chunk([...r6, ...r16], itemsPerRow);
}, [assets, itemsPerRow, isImageCaptureIntentSupported]);
callback = useCallback(() => {
onPressCamera2(InAppCameraUsedCameraPreviewTypes.CAMERA_BUTTON);
}, [onPressCamera2]);
const callback3 = useCallback(() => {
DeviceMedia.getNextAssetPage({
batchSize: itemsPageSizeRef.current,
extensions
});
}, [itemsPageSizeRef, extensions]);
const callback4 = useCallback((a0, a1) => <MediaKeyboardItem key={memo[a1].reduce((acc, item) => item != null ? isMediaCameraNode(item) ? `${acc}-camera` : isAttachFilesNode(item) ? `${acc}-attach` : isViewAllPhotosNode(item) ? `${acc}-view-all` : `${acc}-${item.node.image.uri}` : acc, a1.toString())} draftType={draftType} rowIndex={a1} totalNumItems={totalNumItems} channel={channel} numPerRow={itemsPerRow} items={memo[a1]} onPressItem={onPressItem} onLongPressItem={onLongPressItem} includedUploadIds={includedUploadIds} uploadLimit={uploadLimit} disableWhenReachedLimit={disableWhenReachedLimit} handleCameraPress={callback} handleAttachPress={onAttachPress} handleViewAllPhotosPress={onViewAll} disabled={disabled} />, [channel, draftType, callback, onViewAll, onAttachPress, itemsPerRow, onPressItem, onLongPressItem, memo, includedUploadIds, disabled, uploadLimit, disableWhenReachedLimit, totalNumItems]);
width = useWindowDimensions_native().width;
const memo2 = useMemo(() => (width - (PARENT_PADDING + CHILD_PADDING * (itemsPerRow - 1))) / itemsPerRow + SEPARATOR_SIZE, [width, itemsPerRow]);
const callback5 = useCallback(() => <MediaKeyboardFooter disabled={disabled} onViewAll={onViewAll} />, [onViewAll, disabled]);
if (state2) {
minimum = maximum2;
}
maximum = minimum;
const memo3 = useMemo(() => ({
height: maximum
}), [maximum]);
const LIMITED = NativePermissionStatus.LIMITED;
let state3;
[state3, setState3] = useState(() => 32 + 36 * DimensionsStore_android.getState().byAppEntry[appEntryKey].fontScale);
const callback6 = useCallback(() => <MediaKeyboardLimitedPickerNotice onPress={onManageLimited} onHeightChange={setState3} />, [onManageLimited]);
const modalDismissGuardRefreshControl = useModalDismissGuardRefreshControl();
let r204 = getMediaEmptyStateComponentOrNull({
photoPermissionStatus: state,
photosEmpty: assets != null && assets.edges.length === 0,
showCameraButton: isImageCaptureIntentSupported,
onPressCamera: () => onPressCamera2(InAppCameraUsedCameraPreviewTypes.TAKE_A_PHOTO_BUTTON),
onManageLimited,
onPressPrivacySettings: openPrivacySettings_native
});
if (r204 == null) {
const r205 = state === LIMITED;
r204 = <FastList renderHeader={r205 ? callback6 : void 0} headerSize={r205 ? state3 : 0} style={[memo3, styles.listContainer]} renderItem={callback4} sections={[memo.length]} itemSize={memo2} inActionSheet refreshControl={modalDismissGuardRefreshControl} preserveScrollMomentum automaticallyAdjustsScrollIndicatorInsets={false} keyboardDismissMode="none" onEndReached={callback3} onScroll={callback2} endReachedThreshold={400} accessibilityRole="list" accessibilityLabel={intl.string(t.XONG6A)} showsVerticalScrollIndicator={false} footerSize={FOOTER_HEIGHT} renderFooter={callback5} chunkBase={maximum} batchesToRender={state2 ? void 0 : MINIMUM_BATCHES_TO_RENDER} />;
}
return r204;
});
export default r58;
@@ -0,0 +1,35 @@
// Metro module 15591 (f15592).
import { useMemo } from "react";
import { MediaKeyboardTarget } from "../MediaKeyboardConstants";
import { ChannelTypesSets, MAX_UPLOAD_COUNT } from "../../../../Constants";
import { useCanPostPollsInChannel } from "../../../polls/PollsUtils";
import useUploadDisabled from "../useUploadDisabled";
import { useCanStartThread } from "../../../threads/ThreadHooks";
import { useIsAppLauncherEnabled } from "../../../activities/ActivitiesInTextUtils";
import { getMediaKeyboardDraftType } from "../MediaKeyboardUtils";
import { ApplicationCommandOptionType } from "../../../../flow/Server";
export default function useMediaKeyboardConfig({ channel, context }) {
const r1 = context.target === MediaKeyboardTarget.COMMAND;
const canPostPolls = useCanPostPollsInChannel(channel) && !r1;
const uploadDisabled = useUploadDisabled(channel);
const canStartThreads = useCanStartThread(channel) && !ChannelTypesSets.GUILD_THREADS_ONLY.has(channel.type) && !channel.isThread() && !r1;
const isAppLauncherEnabled = useIsAppLauncherEnabled(channel.id) && !r1;
const mediaKeyboardDraftType = getMediaKeyboardDraftType(context.target);
return useMemo(() => {
const target = context.target;
if (target !== MediaKeyboardTarget.CHAT && target !== MediaKeyboardTarget.COMMAND) {
throw new Error(`MediaKeyboard does not support context target ${target}`);
}
return {
uploadLimit: target === MediaKeyboardTarget.CHAT ? MAX_UPLOAD_COUNT : 1,
disableWhenReachedLimit: target === MediaKeyboardTarget.CHAT,
includedUploadIds: target !== MediaKeyboardTarget.CHAT ? [context.option.name] : void 0,
fileTypes: target === MediaKeyboardTarget.COMMAND ? context.option.type === ApplicationCommandOptionType.ATTACHMENT ? context.option.fileTypes : void 0 : void 0,
canPostPolls,
canStartThreads,
isAppLauncherEnabled,
uploadDisabled,
draftType: mediaKeyboardDraftType
};
}, [context, canPostPolls, uploadDisabled, mediaKeyboardDraftType, canStartThreads, isAppLauncherEnabled]);
};
@@ -0,0 +1,23 @@
// Metro module 9673 (f9674).
import { NativeModules } from "react-native";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
let c6399_4 = "MEDIA_KEYBOARD_ACTION_SHEET";
export function hideMediaKeyboardActionSheet() {
ActionSheetActionCreators.hideActionSheet(c6399_4);
}
export function showMediaKeyboardActionSheet(a0) {
ActionSheetActionCreators.openLazy(import("./components/MediaKeyboardActionSheet"), c6399_4, a0);
}
export function presentLimitedLibraryPicker() {
const NativePermissionManager = NativeModules.NativePermissionManager;
const r2 = NativePermissionManager == null;
let r7 = void 0;
if (!r2) {
const presentLimitedLibraryPicker2 = NativePermissionManager.presentLimitedLibraryPicker;
r7 = presentLimitedLibraryPicker2 == null ? void 0 : presentLimitedLibraryPicker2.call(NativePermissionManager);
}
if (r7 == null) {
r7 = Promise.resolve();
}
return r7;
}
@@ -0,0 +1,34 @@
// Metro module 9686 (f9687).
import { useRef, useEffect } from "react";
import useWindowSizeClassifier, { WindowSizeClassifier } from "../../screen/native/useWindowSizeClassifier";
export function useMediaKeyboardItemsPerRow() {
const windowSizeClassifier = useWindowSizeClassifier();
const XLARGE = WindowSizeClassifier.XLARGE;
let itemsPerRow = 8;
if (XLARGE !== windowSizeClassifier) {
const LARGE = WindowSizeClassifier.LARGE;
itemsPerRow = 6;
if (LARGE !== windowSizeClassifier) {
const NORMAL = WindowSizeClassifier.NORMAL;
itemsPerRow = 4;
if (NORMAL !== windowSizeClassifier) {
const SMALL = WindowSizeClassifier.SMALL;
itemsPerRow = 3;
if (SMALL !== windowSizeClassifier) {
throw new Error(`Unknown window size classifier: ${windowSizeClassifier}`);
}
}
}
}
let c17405_0 = itemsPerRow;
const itemsPageSize = 17 * itemsPerRow;
const ref = useRef(itemsPageSize);
useEffect(() => {
ref.current = 17 * c17405_0;
}, [itemsPerRow]);
return {
itemsPerRow,
itemsPageSize,
itemsPageSizeRef: ref
};
}
@@ -0,0 +1,10 @@
// Metro module 11396 (f11397).
import { DraftType } from "../../../stores/DraftStore";
import PermissionStore from "../../../stores/PermissionStore";
import UploadAttachmentStore from "../../../stores/UploadAttachmentStore";
import { MAX_UPLOAD_COUNT, Permissions } from "../../../Constants";
import { useStateFromStores } from "../../../_bundle/Module589";
import { FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID } from "../../channel/FakePlaceholderPrivateChannel";
export default function useUploadDisabled(c18804_0) {
return useStateFromStores([PermissionStore, UploadAttachmentStore], () => UploadAttachmentStore.getUploads(c18804_0.id, DraftType.ChannelMessage).length >= MAX_UPLOAD_COUNT || (c18804_0.id === FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID || !(c18804_0.isPrivate() || PermissionStore.can(Permissions.ATTACH_FILES, c18804_0))));
};