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

360 lines
17 KiB
TypeScript

// Metro module 16631 (f16632).
import _objectWithoutProperties from "../../../_bundle/_objectWithoutProperties";
import { useMemo, PureComponent } from "react";
import { View } from "react-native";
import { isGuildReadableType } from "../../../records/ChannelRecord";
import ChannelStore from "../../../stores/ChannelStore";
import GuildCategoryStore from "../../../stores/GuildCategoryStore";
import GuildMemberCountStore from "../../../stores/GuildMemberCountStore";
import GuildStore from "../../../stores/GuildStore";
import NotificationSettingsModalStore from "../../../stores/NotificationSettingsModalStore";
import RelationshipStore from "../../../stores/RelationshipStore";
import UserGuildSettingsStore from "../../../stores/UserGuildSettingsStore";
import UserStore from "../../../stores/UserStore";
import { AnalyticEvents, ChannelTypes, EMPTY_STRING_SNOWFLAKE_ID, GuildFeatures, HelpdeskArticles, HighlightSettings, MAX_MEMBERS_NOTIFY_ALL_MESSAGES, NotificationSettingsSections, SettingsPaneTypes, UserNotificationSettings } from "../../../Constants";
import { createLegacyClassComponentStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { ThemeContext } from "../../../_bundle/Module3901";
import AppAnalyticsUtils from "../../app_analytics/AppAnalyticsUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import NotificationSettingsModalActionCreators from "../../../actions/NotificationSettingsModalActionCreators";
import { NotificationLabel } from "../../../utils/NotificationSettingsUtils";
import { NotificationSettingsGuildPresets } from "../../notifications/settings/native/NotificationSettingsPresets";
import { NotificationSettingsGuildMessageNotification } from "../../notifications/settings/native/NotificationSettingsMessageNotification";
import { NotificationSettingsGuildMessageUnread } from "../../notifications/settings/native/NotificationSettingsMessageUnread";
import { TableRadioGroup } from "../../../design/components/TableRow/native/TableRadioGroup.native";
import { intl, t } from "../../../intl/index.native";
import { TableRadioRow } from "../../../design/components/TableRow/native/TableRadioRow.native";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableSwitchRow } from "../../../design/components/TableRow/native/TableSwitchRow.native";
import { Text } from "../../../design/components/Text/native/Text";
import { LegacyText } from "../../../design/void/native";
import Linking from "../../../lib/native/Linking";
import HelpdeskUtils from "../../../utils/HelpdeskUtils";
import { NotificationSettingsMuteBanner, getMuteBannerSubtitleFromConfig } from "../../notifications/settings/native/NotificationSettingsMuteBanner";
import { TableRow } from "../../../design/components/TableRow/native/TableRow.native";
import MutedUntilText, { MuteSettingType } from "../../main_tabs_v2/native/sidebar/details/screens/MutedUntilText";
import { TableRowIcon } from "../../../design/components/TableRow/native/TableRowIcon.native";
import { PlusMediumIcon } from "../../../design/components/Icon/native/redesign/generated/PlusMediumIcon";
import { computeIsMuted } from "../../../lib/MuteTimers";
import { presetName, presetFromSettings } from "../../notifications/settings/utils/notificationSettingsPresetUtils";
import { getChannelIconComponent } from "../../../utils/native/ChannelUtils";
import { computeChannelName } from "../../channel/useChannelName";
import { Form } from "../../../design/void/Form/native/index";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import { useShouldUseNewNotificationSystem, filterOverrides } from "../../notifications/NotificationUtils";
import { useNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import { useStateFromStoresObject, useStateFromStores } from "../../../_bundle/Module589";
import getFlattedChannelList from "../../channel/getFlattedChannelList";
import { NavScrim } from "../../../design/components/Navigator/native/NavScrim.android";
import { getHeaderCloseButton, getHeaderBackButton } from "../../../design/components/Navigator/native/NavigatorHeader.native";
import NotificationSettingChannelOverrides_native from "./NotificationSettingChannelOverrides.native";
import ChannelSettingsNotifications from "../../../components_native/channel_settings/ChannelSettingsNotifications";
import { Navigator } from "../../../design/components/Navigator/native/Navigator.native";
let _excluded, styles;
const ConnectedNotificationSettings = function ConnectedNotificationSettings(props) {
let categories;
const guildId = props.guildId;
categories = void 0;
const navigation = useNavigation();
const stateFromStoresObject = useStateFromStoresObject([UserGuildSettingsStore, GuildStore, GuildCategoryStore, GuildMemberCountStore], () => ({
guild: GuildStore.getGuild(guildId),
suppressEveryone: UserGuildSettingsStore.isSuppressEveryoneEnabled(guildId),
suppressRoles: UserGuildSettingsStore.isSuppressRolesEnabled(guildId),
mobilePush: UserGuildSettingsStore.isMobilePushEnabled(guildId),
muteEvents: UserGuildSettingsStore.isMuteScheduledEventsEnabled(guildId),
muted: UserGuildSettingsStore.isMuted(guildId),
muteConfig: UserGuildSettingsStore.getMuteConfig(guildId),
messageNotifications: UserGuildSettingsStore.getMessageNotifications(guildId),
channelOverrides: UserGuildSettingsStore.getChannelOverrides(guildId),
categories: GuildCategoryStore.getCategories(guildId),
guildMemberCount: GuildMemberCountStore.getMemberCount(guildId),
notifyHighlights: UserGuildSettingsStore.getNotifyHighlights(guildId)
}));
categories = stateFromStoresObject.categories;
const rest = _objectWithoutProperties(stateFromStoresObject, _excluded);
return <>
<NotificationSettings guildId={guildId} channels={useMemo(() => getFlattedChannelList(categories._categories, categories, (a0) => {
const type = a0.channel.type;
return isGuildReadableType(type) || type === ChannelTypes.GUILD_CATEGORY;
}), [categories])} navigation={navigation} shouldUseNewNotificationSystem={useShouldUseNewNotificationSystem("NotificationSettingsModalNative")} {...rest} />
<NavScrim />
</>;
};
_excluded = ["categories"];
styles = createLegacyClassComponentStyles({
highlightsLearnMore: {
fontSize: 12,
color: Module712.unsafe_rawColors.BLUE_345,
marginTop: 4
},
separator: {
height: 1,
backgroundColor: Module712.colors.BORDER_SUBTLE,
marginVertical: 24
},
formStack: {
paddingHorizontal: Module712.modules.mobile.TABLE_ROW_PADDING
}
});
class NotificationSettings extends PureComponent {
static contextType = ThemeContext;
handleMutePress = () => {
const props = this.props;
const { guildId: guildId3, muted } = props;
if (muted) {
NotificationSettingsModalActionCreators.updateGuildNotificationSettings(guildId3, {
muted: !muted
}, NotificationLabel.muted(!muted));
} else {
ActionSheetActionCreators.openLazy(import("../../main_tabs_v2/native/sidebar/details/screens/MuteSettingsActionSheet"), `muteSettings${guildId3}`, {
guildId: guildId3
});
}
};
handleToggleChange = (a0, a1, a2) => {
const guildId3 = this.props.guildId;
const r12 = {};
r12[a0] = a1;
NotificationSettingsModalActionCreators.updateGuildNotificationSettings(guildId3, r12, a2);
};
handleTypeChange = (a0) => {
NotificationSettingsModalActionCreators.updateGuildNotificationSettings(this.props.guildId, {
message_notifications: a0
}, NotificationLabel.notifications(a0));
};
handleAddOverride = () => {
const props = this.props;
props.navigation.push(NotificationSettingsSections.ADD_OVERRIDE, {
guildId: props.guildId
});
};
handleChannelSelect = (a0) => {
this.props.navigation.push(NotificationSettingsSections.CHANNEL_OVERRIDE, {
channelId: a0
});
};
componentDidMount() {
AppAnalyticsUtils.trackWithMetadata(AnalyticEvents.SETTINGS_PANE_VIEWED, {
settings_type: "guild",
destination_pane: SettingsPaneTypes.GUILD_NOTIFICATION_SETTINGS
});
}
renderServerSettings() {
const props = this.props;
const { messageNotifications, muted, guildMemberCount, shouldUseNewNotificationSystem } = props;
const r11 = styles(this.context);
return shouldUseNewNotificationSystem ? <>
<View>
<NotificationSettingsGuildPresets guildId={this.props.guildId} />
<NotificationSettingsGuildMessageNotification style={{
marginTop: 24
}} guildId={this.props.guildId} />
<NotificationSettingsGuildMessageUnread style={{
marginTop: 24
}} guildId={this.props.guildId} />
</View>
<View style={r11.separator} />
</> : <TableRadioGroup title={intl.string(t.lprV7V)} value={messageNotifications} onChange={this.handleTypeChange} hasIcons={false}>
<TableRadioRow label={intl.string(t["n/bTaY"])} disabled={muted} value={UserNotificationSettings.ALL_MESSAGES} subLabel={guildMemberCount != null ? guildMemberCount >= MAX_MEMBERS_NOTIFY_ALL_MESSAGES ? intl.string(t.Dh5p5j) : null : null} />
<TableRadioRow label={intl.format(t.L2hmYy, {})} value={UserNotificationSettings.ONLY_MENTIONS} disabled={muted} />
<TableRadioRow label={intl.string(t.CtVGyQ)} value={UserNotificationSettings.NO_MESSAGES} disabled={muted} />
</TableRadioGroup>;
}
renderNotificationOptions() {
const r18 = styles(this.context);
const props = this.props;
const muted = props.muted;
let suppressEveryone = props.suppressEveryone;
let suppressRoles = props.suppressRoles;
let mobilePush = props.mobilePush;
let muteEvents = props.muteEvents;
const { notifyHighlights, guildId: guildId2 } = props;
const props2 = {
label: intl.format(t.OWiWAp, {}),
value: null,
onValueChange: null
};
if (suppressEveryone == null) {
suppressEveryone = false;
}
props2.value = suppressEveryone;
props2.onValueChange = (a0) => {
this.handleToggleChange("suppress_everyone", a0, NotificationLabel.suppressEveryone(a0));
};
const r42 = [<TableSwitchRow {...props2} />, , ,];
const props3 = {
label: intl.string(t["O/QdoD"]),
value: null,
onValueChange: null
};
if (suppressRoles == null) {
suppressRoles = false;
}
props3.value = suppressRoles;
props3.onValueChange = (a0) => {
this.handleToggleChange("suppress_roles", a0, NotificationLabel.suppressRoles(a0));
};
r42[1] = <TableSwitchRow {...props3} />;
r42[2] = <TableSwitchRow disabled={muted} label={intl.string(t.gPuteJ)} value={muted || notifyHighlights === HighlightSettings.DISABLED} onValueChange={(value) => {
NotificationSettingsModalActionCreators.updateGuildNotificationSettings(guildId2, {
notify_highlights: value ? HighlightSettings.DISABLED : HighlightSettings.ENABLED
}, NotificationLabel.highlights(!value));
}} />;
const r112 = [<View>
<TableRowGroup hasIcons={false}>{r42}</TableRowGroup>
<Text variant="text-sm/medium" color="text-muted" style={{
marginTop: 8
}}>
{intl.string(t["Vw/Xn8"])}
</Text>
<LegacyText style={r18.highlightsLearnMore} accessibilityRole="link" onPress={() => Linking.openURL(HelpdeskUtils.getArticleURL(HelpdeskArticles.HIGHLIGHTS))}>
{intl.string(t.PRBn9K)}
</LegacyText>
</View>, ,];
const props4 = {
label: intl.string(t.ONG3Yz),
value: null,
onValueChange: null
};
if (muteEvents == null) {
muteEvents = false;
}
props4.value = muteEvents;
props4.onValueChange = (a0) => {
this.handleToggleChange("mute_scheduled_events", a0, NotificationLabel.mutedEvents(a0));
};
const r131 = [<TableSwitchRow {...props4} />, ,];
const props5 = {
disabled: muted,
label: intl.string(t.h1DL66),
value: null,
onValueChange: null
};
let value = !muted;
if (!muted) {
if (mobilePush == null) {
mobilePush = false;
}
value = mobilePush;
}
props5.value = value;
props5.onValueChange = (a0) => {
this.handleToggleChange("mobile_push", a0, NotificationLabel.mobilePush(a0));
};
r131[1] = <TableSwitchRow {...props5} />;
r112[1] = <TableRowGroup hasIcons={false}>{r131}</TableRowGroup>;
return <>{r112}</>;
}
renderMuteSection() {
const props = this.props;
const { muted, muteConfig, guild } = props;
if (props.shouldUseNewNotificationSystem) {
return muted ? <NotificationSettingsMuteBanner title={intl.string(t.ZSkXJY)} subtitle={getMuteBannerSubtitleFromConfig(muteConfig)} style={{
marginBottom: 16
}} onPressUnmute={this.handleMutePress} /> : null;
}
const label = muted ? intl.format(t.e8hzDQ, {
name: guild?.name
}) : intl.format(t["J+7D9E"], {
name: guild?.name
});
return [<TableRowGroup key="mute" helperText={intl.string(t["8wbTQ6"])} hasIcons={false}>
<TableRow label={label} onPress={this.handleMutePress} arrow={!muted} />
</TableRowGroup>, muted ? <MutedUntilText key="muted-until" muteConfig={muteConfig} type={MuteSettingType.SERVER} /> : null];
}
renderChannels() {
return [<TableRowGroup key="override-header" title={intl.string(t.O4TIvi)} hasIcons>
<TableRow icon={<TableRowIcon IconComponent={PlusMediumIcon} />} label={intl.string(t.quib7R)} onPress={this.handleAddOverride} />
</TableRowGroup>, <TableRowGroup key="override-channels" hasIcons>
{this.getOverriddenChannels().map((item) => this.renderChannel(item))}
</TableRowGroup>];
}
renderChannel(a0) {
let text;
if (a0 != null) {
const r18 = this.props.channelOverrides[a0.id];
const r15 = a0.parent_id != null ? ChannelStore.getChannel(a0.parent_id) : void 0;
if (computeIsMuted(r18)) {
text = intl.string(t.fpKdS1);
} else {
const message_notifications = r18.message_notifications;
text = UserNotificationSettings.ALL_MESSAGES === message_notifications ? intl.string(t["n/bTaY"]) : UserNotificationSettings.ONLY_MENTIONS === message_notifications ? intl.string(t["6fQPhu"]) : UserNotificationSettings.NO_MESSAGES === message_notifications ? intl.string(t.CtVGyQ) : void 0;
}
if (this.props.shouldUseNewNotificationSystem) {
text = presetName(presetFromSettings(UserGuildSettingsStore.resolveUnreadSetting(a0), UserGuildSettingsStore.resolvedMessageNotifications(a0)));
}
return <TableRow key={a0.id} icon={<TableRowIcon IconComponent={getChannelIconComponent(a0)} />} label={computeChannelName(a0, UserStore, RelationshipStore)} onPress={() => this.handleChannelSelect(a0.id)} subLabel={r15 != null ? computeChannelName(r15, UserStore, RelationshipStore) : null} trailing={text != null ? <TableRow.TrailingText text={text} /> : void 0} arrow />;
}
}
render() {
let r44;
const guild = this.props.guild;
const r8 = styles(this.context);
const r17 = guild == null ? void 0 : guild.features.has(GuildFeatures.HUB);
const props = {
contentContainerStyle: {
paddingTop: 16
},
children: null
};
if (r17) {
props.children = <Stack spacing={Module712.space.PX_24} style={r8.formStack}>
{this.renderMuteSection()}
</Stack>;
r44 = <Form {...props} />;
} else {
props.children = <Stack spacing={Module712.space.PX_24} style={r8.formStack}>
{this.renderMuteSection()}
{this.renderServerSettings()}
{this.renderNotificationOptions()}
{this.renderChannels()}
</Stack>;
r44 = <Form {...props} />;
}
return r44;
}
getOverriddenChannels() {
const props = this.props;
const channels = props.channels;
let c23346_0 = new Set(filterOverrides(props.channelOverrides, {
ignoreNotificationSetting: false,
ignoreMute: this.props.shouldUseNewNotificationSystem,
ignoreUnreadSetting: !this.props.shouldUseNewNotificationSystem
}));
return channels.map(({ channel }) => c23346_0.has(channel.id) ? channel : null).filter((item) => item != null);
}
}
export default function NotificationSettingsModal() {
let guildId3 = useStateFromStores([NotificationSettingsModalStore], () => NotificationSettingsModalStore.getProps().guildId);
const memo = useMemo(() => {
const r1 = {};
r1[NotificationSettingsSections.OVERVIEW] = {
headerLeft: getHeaderCloseButton(NotificationSettingsModalActionCreators.close),
title: intl.string(t.h850Ss),
render: (a0) => <ConnectedNotificationSettings guildId={a0.guildId} />
};
r1[NotificationSettingsSections.ADD_OVERRIDE] = {
title: intl.string(t.s7vIQT),
headerLeft: getHeaderBackButton(),
render: (a0, a1) => <NotificationSettingChannelOverrides_native guildId={a0.guildId} navigation={a1} />
};
r1[NotificationSettingsSections.CHANNEL_OVERRIDE] = {
headerLeft: getHeaderBackButton(),
title: intl.string(t.h850Ss),
render: (a0) => <ChannelSettingsNotifications channelId={a0.channelId} inGuildContext />
};
return r1;
}, []);
if (guildId3 == null) {
guildId3 = EMPTY_STRING_SNOWFLAKE_ID;
}
return <Navigator screens={memo} initialRouteStack={[{
name: NotificationSettingsSections.OVERVIEW,
params: {
guildId: guildId3
}
}]} />;
};
export { NotificationSettings };