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

242 lines
11 KiB
TypeScript

// Metro module 15896 (f15897).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { View } from "react-native";
import UserStore from "../../../stores/UserStore";
import * as _SoundboardStyleConstants from "./SoundboardStyleConstants";
import { SOUNDS_PER_ROW } from "./SoundboardStyleConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { SoundboardSoundGridSectionType, SoundboardSoundItemType } from "../SoundboardTypes";
import { intl, t } from "../../../intl/index.native";
import chunk from "../../../_bundle/chunk";
import { useStateFromStores } from "../../../_bundle/Module589";
import PremiumUtils from "../../../utils/PremiumUtils";
import * as _PremiumFeatureUpsellUtils from "../../premium/roadblocks/native/utils/PremiumFeatureUpsellUtils";
import { PremiumUpsellGradientBackground } from "../../premium/roadblocks/native/views/PremiumUpsellGradientBackground";
import { SoundButton } from "./SoundButton";
import { useFontScale } from "../../screen/native/useFontScale";
import { debounce } from "../../../_bundle/Module12";
import GuildIcon, { GuildIconSizes } from "../../guild/native/GuildIcon";
import { Icon } from "../../../design/void/native";
import Module15903 from "../../../_bundle/Module15903";
import Module9624 from "../../../_bundle/Module9624";
import { ClockIcon } from "../../../design/components/Icon/native/redesign/generated/ClockIcon";
import PremiumUpsellSectionDivider, { PremiumUpsellSectionDividerPosition, PREMIUM_UPSELL_SECTION_DIVIDER_HEIGHT, PREMIUM_UPSELL_SECTION_DIVIDER_MARGIN } from "../../premium/roadblocks/native/views/PremiumUpsellSectionDivider";
import FastList from "../../../lib/native/FastList";
import { Text } from "../../../design/components/Text/native/Text";
let c11382_9, useStyles, SoundPickerButtonRow;
const getSectionLabel = function getSectionLabel(a0) {
const type = a0.category.categoryInfo.type;
if (SoundboardSoundGridSectionType.GUILD === type) {
return a0.category.categoryInfo.guild.name;
}
if (SoundboardSoundGridSectionType.DEFAULTS === type) {
return intl.string(t.Rtvk9X);
}
if (SoundboardSoundGridSectionType.FAVORITES === type) {
return intl.string(t.y3LQCG);
}
if (SoundboardSoundGridSectionType.FREQUENTLY_USED === type) {
return intl.string(t["+cGVV6"]);
}
if (SoundboardSoundGridSectionType.SEARCH === type) {
return null;
}
};
SoundPickerButtonRow = function SoundPickerButtonRow(props) {
let isSoundboardSectionNitroLocked;
const { row, section, channel } = props;
isSoundboardSectionNitroLocked = void 0;
const styles = useStyles();
const stateFromStores2 = useStateFromStores([UserStore], () => PremiumUtils.canUseSoundboardEverywhere(UserStore.getCurrentUser()));
if (section == null) {
return null;
}
let r19 = stateFromStores2 ? !stateFromStores2 : _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel.guild_id, section.category.categoryInfo);
isSoundboardSectionNitroLocked = r19;
if (isSoundboardSectionNitroLocked) {
r19 = <PremiumUpsellGradientBackground />;
}
return <View style={[styles.row]}>
{r19}
{section.soundsByRow[row].map((item, index) => {
const type = item.type;
if (SoundboardSoundItemType.SOUND === type) {
const sound = item.sound;
return <SoundButton key={`${section.category.key}-${sound.soundId}`} sound={sound} channel={channel} style={index > 0 ? styles.soundButtonNotFirst : null} isSectionLocked={isSoundboardSectionNitroLocked} />;
}
if (SoundboardSoundItemType.ADD_SOUND === type) {
throw new Error("ADD_SOUND Not implemented");
}
})}
</View>;
};
const { SOUND_BUTTON_HEIGHT, SOUND_ROW_HORIZONTAL_PADDING, SOUND_ROW_SPACING } = _SoundboardStyleConstants;
c11382_9 = SOUND_BUTTON_HEIGHT + 8;
useStyles = createStyles({
row: {
height: c11382_9,
display: "flex",
flexDirection: "row",
paddingHorizontal: SOUND_ROW_HORIZONTAL_PADDING
},
sectionHeader: {
flex: 1,
display: "flex",
flexDirection: "row",
alignItems: "center",
paddingTop: 16,
paddingBottom: 8,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
paddingHorizontal: SOUND_ROW_HORIZONTAL_PADDING
},
sectionIcon: {
height: 16,
width: 16,
borderRadius: 8,
marginRight: 4
},
soundButtonNotFirst: {
marginLeft: SOUND_ROW_SPACING
}
});
const r49 = Module19.memo(function SoundboardSoundPickerListComponent(props) {
let styles2, fastListSectionsFromCategories, memo, c22579_8, c22579_9, stateFromStores;
const { channel: channel2, insetBottom = 0, listRef, scrollPosition, onScroll: onScroll2, setCategoryIndex, shouldShowPremiumUpsell, categories } = props;
styles2 = void 0;
fastListSectionsFromCategories = void 0;
memo = void 0;
c22579_8 = void 0;
c22579_9 = void 0;
stateFromStores = void 0;
const getSectionPosition2 = function getSectionPosition(a0) {
const r0 = a0 - 1;
const r3 = (stateFromStores ? !stateFromStores : fastListSectionsFromCategories[r0] != null) && _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel2.guild_id, fastListSectionsFromCategories[r0].category.categoryInfo);
const r23 = (stateFromStores ? !stateFromStores : fastListSectionsFromCategories[a0] != null) && _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel2.guild_id, fastListSectionsFromCategories[a0].category.categoryInfo);
const r39 = a0 + 1;
const r40 = (stateFromStores ? !stateFromStores : fastListSectionsFromCategories[r39] != null) && _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel2.guild_id, fastListSectionsFromCategories[r39].category.categoryInfo);
return !r23 && (r40 && !r3) ? PremiumUpsellSectionDividerPosition.START : r23 ? r40 ? null : PremiumUpsellSectionDividerPosition.END : null;
};
styles2 = useStyles();
const fontScale = useFontScale();
const sections = (function calculateRowsPerSection(a0, a1) {
const r0 = [];
for (const item of a0) {
r0.push(Math.ceil(item.items.length / a1));
}
return r0;
})(categories, SOUNDS_PER_ROW);
fastListSectionsFromCategories = (function getFastListSectionsFromCategories(a0, a1, a2) {
const r0 = [];
for (const item of a0) {
const soundsByRow = chunk(item.items, a1);
r0.push({
category: item,
height: soundsByRow.length * c11382_9 + (18 * a2 + 8),
soundsByRow
});
}
return r0;
})(categories, SOUNDS_PER_ROW, fontScale);
memo = useMemo(() => fastListSectionsFromCategories.map((fastListSectionsFromCategory) => fastListSectionsFromCategory.height), [fastListSectionsFromCategories]);
const callback = useCallback((a0, a1) => <SoundPickerButtonRow row={a1} section={fastListSectionsFromCategories[a0]} channel={channel2} />, [fastListSectionsFromCategories, channel2]);
c22579_8 = debounce((a0) => {
const r14 = Math.round(a0);
const r6 = 0 < memo.length;
let r4 = 0;
if (r6) {
let r18 = 0 + memo[0];
const r19 = r14 >= r18;
let r1 = 0;
let r0 = 0;
r4 = 0;
if (r19) {
do {
const r20 = r0 + 1;
const r3 = r1 + 1;
const length = memo.length;
const r11 = r18;
r4 = r20;
if (!(r3 < length)) {
break;
}
r18 = r11 + memo[r3];
r1 = r3;
r0 = r20;
r4 = r0;
} while (r14 >= r18);
}
}
setCategoryIndex(r4);
});
c22579_9 = debounce((a0, a1) => {
const r16 = -a1 / 2;
const r18 = Math.round(a0);
const r6 = 0 < memo.length;
let r4 = 0;
if (r6) {
let r22 = r16 + memo[0];
const r23 = r18 >= r22;
let r1 = 0;
let r24 = 0;
r4 = 0;
if (r23) {
do {
const r26 = r24 + 1;
const r3 = r1 + 1;
const length = memo.length;
const r14 = r22;
r4 = r26;
if (!(r3 < length)) {
break;
}
r22 = r14 + memo[r3];
r1 = r3;
r24 = r26;
r4 = r24;
} while (r18 >= r22);
}
}
const r38 = Math.min(r4, memo.length - 1);
shouldShowPremiumUpsell.set((stateFromStores ? !stateFromStores : fastListSectionsFromCategories[r38] != null) && _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel2.guild_id, fastListSectionsFromCategories[r38].category.categoryInfo));
});
stateFromStores = useStateFromStores([UserStore], () => PremiumUtils.canUseSoundboardEverywhere(UserStore.getCurrentUser()));
return <FastList onLayout={(event) => c22579_9(0, event.nativeEvent.layout.height)} sections={sections} sectionSize={function sectionSize(a0) {
const r6 = fastListSectionsFromCategories[a0];
return r6 != null ? getSectionLabel(r6) == null ? 0 : 42 : 0;
}} itemSize={function itemSize(a0) {
return fastListSectionsFromCategories[a0] == null ? 0 : c11382_9;
}} sectionFooterSize={function sectionFooterSize(a0) {
return getSectionPosition2(a0) == null ? 0 : PREMIUM_UPSELL_SECTION_DIVIDER_HEIGHT + PREMIUM_UPSELL_SECTION_DIVIDER_MARGIN;
}} ref={listRef} renderItem={callback} renderSection={function renderSection(a0) {
const r3 = fastListSectionsFromCategories[a0];
const r39 = [(stateFromStores ? !stateFromStores : fastListSectionsFromCategories[a0] != null) && _PremiumFeatureUpsellUtils.isSoundboardSectionNitroLocked(channel2.guild_id, fastListSectionsFromCategories[a0].category.categoryInfo) && <PremiumUpsellGradientBackground />, , ,];
const type = r3.category.categoryInfo.type;
r39[1] = SoundboardSoundGridSectionType.GUILD === type ? <GuildIcon size={GuildIconSizes.XXSMALL_12} guild={r3.category.categoryInfo.guild} style={styles2.sectionIcon} /> : SoundboardSoundGridSectionType.DEFAULTS === type ? <Icon source={Module15903} style={styles2.sectionIcon} /> : SoundboardSoundGridSectionType.FAVORITES === type ? <Icon source={Module9624} style={styles2.sectionIcon} /> : SoundboardSoundGridSectionType.FREQUENTLY_USED === type ? <ClockIcon style={styles2.sectionIcon} /> : SoundboardSoundGridSectionType.SEARCH === type ? null : void 0;
r39[2] = <Text accessibilityRole="header" lineClamp={1} variant="heading-sm/semibold">
{getSectionLabel(r3)}
</Text>;
return <View key={r3.category.key}>
<View style={styles2.sectionHeader}>{r39}</View>
</View>;
}} renderSectionFooter={function renderSectionFooter(a0) {
const sectionPosition2 = getSectionPosition2(a0);
return sectionPosition2 != null ? <PremiumUpsellSectionDivider position={sectionPosition2} /> : null;
}} insetEnd={insetBottom} onScroll={function onScroll(event) {
const nativeEvent = event.nativeEvent;
const r7 = nativeEvent.contentOffset.y;
c22579_8(r7);
c22579_9(r7, nativeEvent.layoutMeasurement.height);
if (!(nativeEvent.layoutMeasurement.height + nativeEvent.contentOffset.y >= nativeEvent.contentSize.height - 20)) {
if (scrollPosition != null) {
scrollPosition.set(r7);
}
if (onScroll2 != null) {
onScroll2(event);
}
}
}} keyboardShouldPersistTaps="handled" optimizeListItemRender inActionSheet />;
});
export { r49 as SoundboardSoundPickerList };