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

+305
View File
@@ -0,0 +1,305 @@
// Metro module 8105 (f8106).
import { Endpoints } from "../../Constants";
import { BadgeId } from "../../_bundle/Module8106";
const r17 = {
FEATURED: "FEATURED",
USER_INFO: "USER_INFO",
BOT_INFO: "BOT_INFO",
ACTIVITY: "ACTIVITY",
MUTUALS: "MUTUALS",
MUTUAL_GUILDS: "MUTUAL_GUILDS",
MUTUAL_FRIENDS: "MUTUAL_FRIENDS",
BOT_DATA_ACCESS: "BOT_DATA_ACCESS",
WIDGETS: "WIDGETS",
WISHLIST: "WISHLIST",
MAIN: "MAIN"
};
const r16 = {
ROLES: "ROLES",
CONNECTIONS: "CONNECTIONS",
APPS: "APPS",
NOTE: "NOTE",
RECENT_ACTIVITY: "RECENT_ACTIVITY"
};
const r15 = {
LIVE: "live",
RECENT: "recent",
VOICE: "voice"
};
const r14 = {
POPOUT: "POPOUT",
MODAL: "MODAL",
MODAL_V2: "MODAL_V2",
SIDEBAR: "SIDEBAR",
ACCOUNT_POPOUT: "ACCOUNT_POPOUT",
ACTION_SHEET: "ACTION_SHEET",
YOU_SCREEN: "YOU_SCREEN"
};
const r13 = {
USER_SHEET: "User Sheet",
BLOCKED_USER_SHEET: "Blocked User Sheet",
IGNORED_USER_SHEET: "Ignored User Sheet"
};
const r12 = {
NICKNAME: 0,
0: "NICKNAME",
PRONOUNS: 1,
1: "PRONOUNS",
AVATAR: 2,
2: "AVATAR",
ANIMATED_AVATAR: 3,
3: "ANIMATED_AVATAR",
BANNER: 4,
4: "BANNER",
ANIMATED_BANNER: 5,
5: "ANIMATED_BANNER",
BIO: 6,
6: "BIO",
THEME: 7,
7: "THEME",
AVATAR_DECORATION: 8,
8: "AVATAR_DECORATION",
PROFILE_EFFECT: 9,
9: "PROFILE_EFFECT"
};
const r11 = {
VIEW: "VIEW",
SEND_MESSAGE: "SEND_MESSAGE",
SEND_DIRECT_MESSAGE: "SEND_DIRECT_MESSAGE",
SEND_FRIEND_REQUEST: "SEND_FRIEND_REQUEST",
ACCEPT_FRIEND_REQUEST: "ACCEPT_FRIEND_REQUEST",
IGNORE_FRIEND_REQUEST: "IGNORE_FRIEND_REQUEST",
CANCEL_FRIEND_REQUEST: "CANCEL_FRIEND_REQUEST",
REMOVE_FRIEND: "REMOVE_FRIEND",
REMOVE_GAME_FRIEND: "REMOVE_GAME_FRIEND",
BLOCK: "BLOCK",
UNBLOCK: "UNBLOCK",
IGNORE: "IGNORE",
UNIGNORE: "UNIGNORE",
REPORT: "REPORT",
COPY_USERNAME: "COPY_USERNAME",
COPY_USER_ID: "COPY_USER_ID",
COPY_APP_ID: "COPY_APP_ID",
COPY_APP_LINK: "COPY_APP_LINK",
PRESS_VIEW_PROFILE: "PRESS_VIEW_PROFILE",
PRESS_VIEW_MAIN_PROFILE: "PRESS_VIEW_MAIN_PROFILE",
PRESS_VIEW_SERVER_PROFILE: "PRESS_VIEW_SERVER_PROFILE",
PRESS_OPTIONS: "PRESS_OPTIONS",
HOVER_BADGE: "HOVER_BADGE",
PRESS_BADGE: "PRESS_BADGE",
PRESS_SECTION: "PRESS_SECTION",
PRESS_PRONOUNS: "PRESS_PRONOUNS",
PRESS_MUTUAL_FRIEND: "PRESS_MUTUAL_FRIEND",
PRESS_MUTUAL_GUILD: "PRESS_MUTUAL_GUILD",
PRESS_ADD_NOTE: "PRESS_ADD_NOTE",
PRESS_SET_STATUS: "PRESS_SET_STATUS",
PRESS_SET_CUSTOM_STATUS: "PRESS_SET_CUSTOM_STATUS",
HOVER_CUSTOM_STATUS: "HOVER_CUSTOM_STATUS",
PRESS_ADD_CUSTOM_STATUS: "PRESS_ADD_CUSTOM_STATUS",
PRESS_EDIT_CUSTOM_STATUS: "PRESS_EDIT_CUSTOM_STATUS",
PRESS_CLEAR_CUSTOM_STATUS: "PRESS_CLEAR_CUSTOM_STATUS",
PRESS_REACT_CUSTOM_STATUS: "PRESS_REACT_CUSTOM_STATUS",
PRESS_REPLY_CUSTOM_STATUS: "PRESS_REPLY_CUSTOM_STATUS",
SEND_REACT_CUSTOM_STATUS: "SEND_REACT_CUSTOM_STATUS",
SEND_REPLY_CUSTOM_STATUS: "SEND_REPLY_CUSTOM_STATUS",
PRESS_REACT_AVATAR: "PRESS_REACT_AVATAR",
PRESS_REPLY_AVATAR: "PRESS_REPLY_AVATAR",
SEND_REACT_AVATAR: "SEND_REACT_AVATAR",
SEND_REPLY_AVATAR: "SEND_REPLY_AVATAR",
PRESS_SWITCH_ACCOUNTS: "PRESS_SWITCH_ACCOUNTS",
PRESS_CLIPS: "PRESS_CLIPS",
PRESS_SET_FRIEND_NICKNAME: "PRESS_SET_FRIEND_NICKNAME",
PRESS_INVITE_TO_SERVER: "PRESS_INVITE_TO_SERVER",
PRESS_MOD_VIEW: "PRESS_MOD_VIEW",
PRESS_SHOW_MORE_ACTIVITY: "PRESS_SHOW_MORE_ACTIVITY",
JOIN_ACTIVITY: "JOIN_ACTIVITY",
SET_NOTE: "SET_NOTE",
SET_VOLUME: "SET_VOLUME",
SET_STREAM_VOLUME: "SET_STREAM_VOLUME",
EDIT_PROFILE: "EDIT_PROFILE",
EDIT_GUILD_PROFILE: "EDIT_GUILD_PROFILE",
VOICE_CALL: "VOICE_CALL",
VIDEO_CALL: "VIDEO_CALL",
MUTE: "MUTE",
SERVER_MUTE: "SERVER_MUTE",
MUTE_SOUNDBOARD: "MUTE_SOUNDBOARD",
DISABLE_VIDEO: "DISABLE_VIDEO",
DEAFEN: "DEAFEN",
DISCONNECT: "DISCONNECT",
ADD_ROLE: "ADD_ROLE",
REMOVE_ROLE: "REMOVE_ROLE",
PRESS_VIEW_APP_COMMANDS: "PRESS_VIEW_APP_COMMANDS",
PRESS_ADD_APP: "PRESS_ADD_APP",
PRESS_APP_COMMAND: "PRESS_APP_COMMAND",
PRESS_APP_STOREFRONT: "PRESS_APP_STOREFRONT",
PRESS_APP_CONNECTION: "PRESS_APP_CONNECTION",
VIEW_SECURE_FRAMES_VERIFICATION_CODE: "VIEW_SECURE_FRAMES_VERIFICATION_CODE",
EXPAND_ROLES: "EXPAND_ROLES",
COLLAPSE_ROLES: "COLLAPSE_ROLES",
EXPAND_GAME_TAGS: "EXPAND_GAME_TAGS",
COLLAPSE_GAME_TAGS: "COLLAPSE_GAME_TAGS",
ADD_GAME_TAGS: "ADD_GAME_TAGS",
REMOVE_GAME_TAGS: "REMOVE_GAME_TAGS",
VIEW_BLOCKED_PROFILE: "VIEW_BLOCKED_PROFILE",
VIEW_IGNORED_PROFILE: "VIEW_IGNORED_PROFILE",
DONT_SHOW_AGAIN_IGNORED_PROFILE: "DONT_SHOW_AGAIN_IGNORED_PROFILE",
PRESS_MOVE_TO_CHANNEL: "PRESS_MOVE_TO_CHANNEL",
PRESS_REMOVE_FROM_STAGE: "PRESS_REMOVE_FROM_STAGE",
PRESS_INVITE_TO_SPEAK: "PRESS_INVITE_TO_SPEAK",
PRESS_MANAGE_USER: "PRESS_MANAGE_USER",
PRESS_VERIFY_USER: "PRESS_VERIFY_USER",
PRESS_UNVERIFY_USER: "PRESS_UNVERIFY_USER",
PRESS_TIME_OUT_USER: "PRESS_TIME_OUT_USER",
PRESS_REMOVE_TIME_OUT: "PRESS_REMOVE_TIME_OUT",
PRESS_KICK_USER: "PRESS_KICK_USER",
PRESS_BAN_USER: "PRESS_BAN_USER",
COPY_CONNECTED_ACCOUNT: "COPY_CONNECTED_ACCOUNT",
PRESS_VIEW_CONNECTED_ACCOUNT: "PRESS_VIEW_CONNECTED_ACCOUNT",
PRESS_REACT_REPLY_TOAST: "PRESS_REACT_REPLY_TOAST",
VISIT_SHOP: "VISIT_SHOP",
GET_PREMIUM: "GET_NITRO",
VIEW_PREMIUM_PERKS: "VIEW_NITRO_PERKS",
ACCEPT_GAME_FRIEND_REQUEST: "ACCEPT_GAME_FRIEND_REQUEST",
IGNORE_GAME_FRIEND_REQUEST: "IGNORE_GAME_FRIEND_REQUEST",
RING: "RING",
STOP_RINGING: "STOP_RINGING",
MANAGE_APP: "MANAGE_APP",
PRESS_REMOVE_FROM_THREAD: "PRESS_REMOVE_FROM_THREAD",
PRESS_LEAVE_THREAD: "PRESS_LEAVE_THREAD",
VIEW_WIDGET: "VIEW_WIDGET",
VIEW_GAME_WIDGET_BREADCRUMB: "VIEW_GAME_WIDGET_BREADCRUMB",
PRESS_GAME_WIDGET_BREADCRUMB: "PRESS_GAME_WIDGET_BREADCRUMB",
EDIT_SAVED: "EDIT_SAVED",
VIEW_WIDGETS_EMPTY_STATE: "VIEW_WIDGETS_EMPTY_STATE",
VIEW_APPLICATION_WIDGETS_EMPTY_STATE: "VIEW_APPLICATION_WIDGETS_EMPTY_STATE",
PRESS_APPLICATION_WIDGET_UNLINKED_CONNECT: "PRESS_APPLICATION_WIDGET_UNLINKED_CONNECT",
PRESS_APPLICATION_WIDGET_LINKED_RECONNECT: "PRESS_APPLICATION_WIDGET_LINKED_RECONNECT",
PRESS_APPLICATION_WIDGET_PLACEHOLDER_CONNECT: "PRESS_APPLICATION_WIDGET_PLACEHOLDER_CONNECT",
VIEW_APPLICATION_WIDGET_PREVIEW: "VIEW_APPLICATION_WIDGET_PREVIEW",
PRESS_APPLICATION_WIDGET_PREVIEW: "PRESS_APPLICATION_WIDGET_PREVIEW",
PRESS_SHOW_MORE_WIDGETS: "PRESS_SHOW_MORE_WIDGETS",
VIEW_AVATAR: "VIEW_AVATAR",
COPY_AVATAR_IMAGE_LINK: "COPY_AVATAR_IMAGE_LINK",
COPY_BANNER_IMAGE_LINK: "COPY_BANNER_IMAGE_LINK",
GIFT: "GIFT",
SHOW_STYLES_PANEL: "SHOW_STYLES_PANEL",
HIDE_STYLES_PANEL: "HIDE_STYLES_PANEL"
};
const r10 = {
VIEW_ACTIVITY_CARD: "VIEW_ACTIVITY_CARD",
HOVER_ACTIVITY_CARD: "HOVER_ACTIVITY_CARD",
PRESS_CARD: "PRESS_CARD",
PRESS_TEXT: "PRESS_TEXT",
PRESS_IMAGE: "PRESS_IMAGE",
PRESS_JOIN_BUTTON: "PRESS_JOIN_BUTTON",
PRESS_ASK_TO_JOIN_BUTTON: "PRESS_ASK_TO_JOIN_BUTTON",
PRESS_PLAY_BUTTON: "PRESS_PLAY_BUTTON",
PRESS_WATCH_BUTTON: "PRESS_WATCH_BUTTON",
PRESS_JOIN_CALL_BUTTON: "PRESS_JOIN_CALL_BUTTON",
PRESS_CONNECT_ACCOUNT_BUTTON: "PRESS_CONNECT_ACCOUNT_BUTTON",
PRESS_CONNECT_XBOX_BUTTON: "PRESS_CONNECT_XBOX_BUTTON",
PRESS_CONNECT_PLAYSTATION_BUTTON: "PRESS_CONNECT_PLAYSTATION_BUTTON",
PRESS_CUSTOM_BUTTON: "PRESS_CUSTOM_BUTTON",
PRESS_NOTIFY_BUTTON: "PRESS_NOTIFY_BUTTON",
PRESS_STAGE_CHANNEL_LISTEN_BUTTON: "PRESS_STAGE_CHANNEL_LISTEN_BUTTON",
PRESS_PLAY_ON_SPOTIFY_BUTTON: "PRESS_PLAY_ON_SPOTIFY_BUTTON",
PRESS_LISTEN_ALONG_ON_SPOTIFY_BUTTON: "PRESS_LISTEN_ALONG_ON_SPOTIFY_BUTTON",
PRESS_WATCH_ON_CRUNCHYROLL_BUTTON: "PRESS_WATCH_ON_CRUNCHYROLL_BUTTON",
PRESS_CLEAR_HISTORY_BUTTON: "PRESS_CLEAR_HISTORY_BUTTON",
PRESS_CLEAR_HISTORY_DISCLAIMER: "PRESS_CLEAR_HISTORY_DISCLAIMER",
PRESS_VOICE_CHANNEL_ICON: "PRESS_VOICE_CHANNEL_ICON",
PRESS_VOICE_CHANNEL_AVATARS: "PRESS_VOICE_CHANNEL_AVATARS",
PRESS_VOICE_CHANNEL_STATUS: "PRESS_VOICE_CHANNEL_STATUS",
OPEN_VOICE_CHANNEL: "OPEN_VOICE_CHANNEL",
OPEN_VOICE_GUILD: "OPEN_VOICE_GUILD",
OPEN_SPOTIFY_ARTIST: "OPEN_SPOTIFY_ARTIST",
OPEN_SPOTIFY_ALBUM: "OPEN_SPOTIFY_ALBUM",
OPEN_SPOTIFY_TRACK: "OPEN_SPOTIFY_TRACK",
OPEN_MENU: "OPEN_MENU",
PRESS_MANAGE_PRIVACY_MENU_ITEM: "PRESS_MANAGE_PRIVACY_MENU_ITEM",
PRESS_VIEW_ALL_ACTIVITY_MENU_ITEM: "PRESS_VIEW_ALL_ACTIVITY_MENU_ITEM",
PRESS_DELETE_HISTORY_MENU_ITEM: "PRESS_DELETE_HISTORY_MENU_ITEM",
PRESS_WATCH_ON_CRUNCHYROLL_MENU_ITEM: "PRESS_WATCH_ON_CRUNCHYROLL_MENU_ITEM",
PRESS_PLAY_ON_SPOTIFY_MENU_ITEM: "PRESS_PLAY_ON_SPOTIFY_MENU_ITEM",
PRESS_CONNECT_CRUNCHYROLL_MENU_ITEM: "PRESS_CONNECT_CRUNCHYROLL_MENU_ITEM",
PRESS_CONNECT_SPOTIFY_MENU_ITEM: "PRESS_CONNECT_SPOTIFY_MENU_ITEM",
PRESS_VIEW_GAME_PROFILE_MENU_ITEM: "PRESS_VIEW_GAME_PROFILE_MENU_ITEM",
PRESS_VIEW_ACTIVITY_MENU_ITEM: "PRESS_VIEW_ACTIVITY_MENU_ITEM",
PRESS_REACT_ACTIVITY: "PRESS_REACT_ACTIVITY",
PRESS_REPLY_ACTIVITY: "PRESS_REPLY_ACTIVITY",
SEND_REACT_ACTIVITY: "SEND_REACT_ACTIVITY",
SEND_REPLY_ACTIVITY: "SEND_REPLY_ACTIVITY",
PRESS_CLOUD_PLAY_BUTTON: "PRESS_CLOUD_PLAY_BUTTON",
PRESS_ADD_TO_CURRENT_GAMES_WIDGET: "PRESS_ADD_TO_CURRENT_GAMES_WIDGET",
PRESS_APPLICATION_WIDGET_PREVIEW_VIEW_MORE: "PRESS_APPLICATION_WIDGET_PREVIEW_VIEW_MORE",
PRESS_PLAY_WITH_XBOX_GAME_PASS_BUTTON: "PRESS_PLAY_WITH_XBOX_GAME_PASS_BUTTON",
PRESS_PLAY_ON_STEAM_BUTTON: "PRESS_PLAY_ON_STEAM_BUTTON"
};
const r9 = {
PRESS_ADD_GAME: "PRESS_ADD_GAME",
GAME_SEARCH_SESSION_STARTED: "GAME_SEARCH_SESSION_STARTED",
GAME_SEARCH_SESSION_ENDED: "GAME_SEARCH_SESSION_ENDED",
GAME_ADDED: "GAME_ADDED",
GAME_REMOVED: "GAME_REMOVED",
PRESS_ADD_WIDGET: "PRESS_ADD_WIDGET",
WIDGET_ADDED: "WIDGET_ADDED",
WIDGET_REMOVED: "WIDGET_REMOVED",
PRESS_ADD_TAG: "PRESS_ADD_TAG",
TAG_ADDED: "TAG_ADDED",
TAG_REMOVED: "TAG_REMOVED",
PRESS_ADD_COMMENTARY: "PRESS_ADD_COMMENTARY",
COMMENTARY_EDITED: "COMMENTARY_EDITED"
};
const r8 = {
WISHLIST_ITEM_CLICKED: "WISHLIST_ITEM_CLICKED",
WISHLIST_TOGGLE_PRIVATE: "WISHLIST_TOGGLE_PRIVATE",
WISHLIST_TOGGLE_PUBLIC: "WISHLIST_TOGGLE_PUBLIC",
PRESS_WISHLIST_BREADCRUMB_CARD: "PRESS_WISHLIST_BREADCRUMB_CARD",
PRESS_WISHLIST_BREADCRUMB_OVERFLOW_CARD: "PRESS_WISHLIST_BREADCRUMB_OVERFLOW_CARD",
VIEW_WISHLIST: "VIEW_WISHLIST",
PRESS_EDIT_WISHLIST: "PRESS_EDIT_WISHLIST",
PRESS_ADD_WISHLIST_ITEM: "PRESS_ADD_WISHLIST_ITEM"
};
const r263 = {
USER_PROFILE: "USER_PROFILE",
PROFILE_FRAME: "PROFILE_FRAME"
};
const r266 = {
ACTIVITY: "ACTIVITY",
AVATAR: "AVATAR",
STATUS: "STATUS"
};
const r268 = {
REPLY: "REPLY",
REACT: "REACT"
};
const r271 = {
WIDGET_ADDED: "WIDGET_ADDED",
WIDGET_REMOVED: "WIDGET_REMOVED",
PROFILE_SAVE_GENERIC_FAILURE: "PROFILE_SAVE_GENERIC_FAILURE",
SOMETHING_WENT_WRONG: "SOMETHING_WENT_WRONG"
};
export const USER_PROFILE_TOOLTIP_DELAY = 300;
export function getBadgeName(a0) {
return BadgeId[a0].toLowerCase();
}
export const USER_PROFILE_POPOUT_KEY = "user-profile-popout";
export { r17 as UserProfileSections };
export { r16 as UserProfileSubsections };
export { r15 as UserProfileActivityDisplays };
export { r14 as TrackUserProfileLayouts };
export { r13 as UserProfileAnalyticsTypes };
export { r12 as TrackUserProfileProperties };
export { r11 as TrackUserProfileActions };
export { r10 as TrackUserProfileActivityActions };
export { r9 as TrackUserProfileEditActions };
export { r8 as TrackUserProfileWishlistActions };
export { r263 as TrackUserProfileUi };
export function getBadgeAssetFromCDN(a0) {
const GLOBAL_ENV = window.GLOBAL_ENV;
const { API_ENDPOINT, CDN_HOST } = GLOBAL_ENV;
return CDN_HOST != null ? `https://${CDN_HOST}/badge-icons/${a0}.png` : `${location.protocol}${API_ENDPOINT}${Endpoints.BADGE_ICON(a0)}`;
}
export { r266 as UserProfileInteractionSources };
export { r268 as UserProfileInteractionTypes };
export { r271 as UserProfileToastTypes };
+177
View File
@@ -0,0 +1,177 @@
// Metro module 7987 (f7988).
import { PremiumTypes } from "../premium/PremiumConstants";
import { isGameWidget } from "./UserProfileGameWidgetTypes";
import PremiumUtils from "../../utils/PremiumUtils";
import { getGuildMemberBannerURL, getUserBannerURL } from "../../utils/AvatarUtils";
import { getProfilePreviewValue } from "../profile_customization/ProfileCustomizationUtils";
import { HermesBuiltin } from "../../_hermes/prelude";
class DisplayProfile {
constructor(a0, a1) {
this.userId = a0.userId;
this.guildId = a1?.guildId;
let banner = a1?.banner;
if (banner == null) {
banner = a0.banner;
}
this.banner = banner;
const bio = a0.bio;
let bio2 = a1?.bio;
if (!(bio2 != null && bio2 !== "")) {
bio2 = bio;
}
this.bio = bio2;
const pronouns = a0.pronouns;
let pronouns2 = a1?.pronouns;
if (!(pronouns2 != null && pronouns2 !== "")) {
pronouns2 = pronouns;
}
this.pronouns = pronouns2;
this.accentColor = a0.accentColor;
let themeColors = a1?.themeColors;
if (themeColors == null) {
themeColors = a0.themeColors;
}
this.themeColors = themeColors;
let profileEffect = a1?.profileEffect;
if (profileEffect == null) {
profileEffect = a0.profileEffect;
}
this.profileEffect = profileEffect;
let profileFrame = a1?.profileFrame;
if (profileFrame == null) {
profileFrame = a0.profileFrame;
}
this.profileFrame = profileFrame;
let popoutAnimationParticleType = a1?.popoutAnimationParticleType;
if (popoutAnimationParticleType == null) {
popoutAnimationParticleType = a0.popoutAnimationParticleType;
}
this.popoutAnimationParticleType = popoutAnimationParticleType;
this.fetchStartedAt = a0.fetchStartedAt;
this.fetchEndedAt = a0.fetchEndedAt;
this._userProfile = a0;
this._guildMemberProfile = a1;
}
get premiumSince() {
return this._userProfile.premiumSince;
}
get premiumGuildSince() {
return this._userProfile.premiumGuildSince;
}
get premiumType() {
return this._userProfile.premiumType;
}
get private() {
return this._userProfile.private;
}
get widgets() {
return this._userProfile.widgets;
}
get gameWidgets() {
const widgets2 = this._userProfile.widgets;
return widgets2 == null ? void 0 : widgets2.filter(isGameWidget);
}
get primaryColor() {
const themeColors = this.themeColors;
let r2 = themeColors == null ? void 0 : themeColors[0];
if (r2 == null) {
r2 = this.accentColor;
}
return r2;
}
get canUsePremiumProfileCustomization() {
return PremiumUtils.isPremiumAtLeast(this.premiumType, PremiumTypes.TIER_2);
}
get canEditThemes() {
return this.canUsePremiumProfileCustomization;
}
get application() {
return this._userProfile.application;
}
get isLoaded() {
return this._userProfile !== void 0 && (this.guildId == null || this._guildMemberProfile !== void 0);
}
hasThemeColors() {
const themeColors = this.themeColors;
let r7 = (themeColors == null ? void 0 : themeColors[0]) != null;
if (!r7) {
const themeColors2 = this.themeColors;
r7 = (themeColors2 == null ? void 0 : themeColors2[1]) != null;
}
return r7;
}
hasPremiumCustomization() {
return this.isUsingGuildMemberBanner() || this.isUsingGuildMemberBio() || this.banner != null || this.hasThemeColors() || this.popoutAnimationParticleType != null;
}
isUsingGuildMemberBanner() {
return this._guildMemberProfile?.banner != null;
}
isUsingGuildMemberBio() {
return this._guildMemberProfile?.bio != null && this._guildMemberProfile?.bio !== "";
}
isUsingGuildMemberPronouns() {
return this._guildMemberProfile?.pronouns != null && this._guildMemberProfile?.pronouns !== "";
}
getBannerURL({ canAnimate, size }) {
return this.guildId != null && this.isUsingGuildMemberBanner() ? getGuildMemberBannerURL({
id: this.userId,
guildId: this.guildId,
banner: this.banner,
canAnimate,
size
}) : getUserBannerURL({
id: this.userId,
banner: this.banner,
canAnimate,
size
});
}
getPreviewBanner(a0, a1, size = 480) {
return a0 == null ? a0 === null ? this.isUsingGuildMemberBanner() ? getUserBannerURL({
id: this.userId,
banner: this._userProfile.banner,
canAnimate: a1,
size
}) : null : this.getBannerURL({
canAnimate: a1,
size
}) : a0;
}
getPreviewBio(a0) {
return getProfilePreviewValue({
pendingValue: a0,
userValue: this._userProfile.bio,
guildValue: this._guildMemberProfile?.bio,
guildId: this.guildId
});
}
getPreviewPronouns(a0) {
return getProfilePreviewValue({
pendingValue: a0,
userValue: this._userProfile.pronouns,
guildValue: this._guildMemberProfile?.pronouns,
guildId: this.guildId
});
}
getPreviewThemeColors(a0) {
return (a0 == null ? void 0 : a0[0]) != null ? (a0 == null ? void 0 : a0[1]) == null ? a0 !== void 0 ? this._userProfile.themeColors : this.themeColors : a0 : a0 !== void 0 ? this._userProfile.themeColors : this.themeColors;
}
getBadges() {
let badges = this._userProfile.badges;
if (badges == null) {
badges = [];
}
const r9 = [];
const r0 = HermesBuiltin.arraySpread(r9, badges, 0);
let r11 = this._guildMemberProfile?.badges;
if (r11 == null) {
r11 = [];
}
HermesBuiltin.arraySpread(r9, r11, r0);
return r9;
}
getLegacyUsername() {
return this._userProfile.legacyUsername;
}
}
export default DisplayProfile;
@@ -0,0 +1,39 @@
// Metro module 12183 (f12184).
import { createApexExperiment } from "../experiments/apex/index";
import { useIsInPrivateProfilesStrictExperiment, getIsInPrivateProfilesStrictExperiment } from "./PrivateProfilesStrictExperiment";
import { useIsInPrivateProfilesStrictGbExperiment, getIsInPrivateProfilesStrictGbExperiment } from "./PrivateProfilesStrictGbExperiment";
const apexExperiment = createApexExperiment({
name: "2026-02-private-profiles",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
0: {
enabled: false
},
1: {
enabled: true
}
}
});
export { apexExperiment as PrivateProfilesExperiment };
export function useIsInPrivateProfilesExperiment(a0) {
let enabled = apexExperiment.useConfig({
location: a0
}).enabled;
const isInPrivateProfilesStrictExperiment = useIsInPrivateProfilesStrictExperiment(a0);
const isInPrivateProfilesStrictGbExperiment = useIsInPrivateProfilesStrictGbExperiment(a0);
if (!enabled) {
enabled = isInPrivateProfilesStrictExperiment;
}
if (!enabled) {
enabled = isInPrivateProfilesStrictGbExperiment;
}
return enabled;
}
export function getIsInPrivateProfilesExperiment(a0) {
return apexExperiment.getConfig({
location: a0
}).enabled || getIsInPrivateProfilesStrictExperiment(a0) || getIsInPrivateProfilesStrictGbExperiment(a0);
}
@@ -0,0 +1,34 @@
// Metro module 12184 (f12185).
import { createApexExperiment } from "../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-03-private-profiles-strict",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
0: {
enabled: false
},
1: {
enabled: true
},
2: {
enabled: true
},
3: {
enabled: true
}
}
});
export { apexExperiment as PrivateProfilesStrictExperiment };
export function useIsInPrivateProfilesStrictExperiment(a0) {
return apexExperiment.useConfig({
location: a0
}).enabled;
}
export function getIsInPrivateProfilesStrictExperiment(a0) {
return apexExperiment.getConfig({
location: a0
}).enabled;
}
@@ -0,0 +1,34 @@
// Metro module 12185 (f12186).
import { createApexExperiment } from "../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-03-private-profiles-strict-gb",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
0: {
enabled: false
},
1: {
enabled: true
},
2: {
enabled: true
},
3: {
enabled: true
}
}
});
export { apexExperiment as PrivateProfilesStrictGbExperiment };
export function useIsInPrivateProfilesStrictGbExperiment(a0) {
return apexExperiment.useConfig({
location: a0
}).enabled;
}
export function getIsInPrivateProfilesStrictGbExperiment(a0) {
return apexExperiment.getConfig({
location: a0
}).enabled;
}
@@ -0,0 +1,135 @@
// Metro module 9798 (f9799).
import { AssetOriginTypes } from "../recent_avatars/RecentAvatarsTypes";
import getCurrentUserProfile from "./utils/getCurrentUserProfile";
import { CollectiblesItemType } from "../../_bundle/Module1901";
export function getProfileChangesForUpdateRequest(a0, a1) {
let r55;
const r4 = {};
if (a0.pendingBanner !== void 0) {
r4.banner = a0.pendingBanner;
if (a0.pendingBanner !== null) {
let pendingBannerOriginalMd5 = a0.pendingBannerOriginalMd5;
if (pendingBannerOriginalMd5 == null) {
pendingBannerOriginalMd5 = null;
}
r4.bannerOriginalMd5 = pendingBannerOriginalMd5;
}
}
if (a0.pendingBio != null) {
r4.bio = a0.pendingBio;
}
if (a0.pendingPronouns != null) {
r4.pronouns = a0.pendingPronouns;
}
if (a0.pendingAccentColor !== void 0) {
r4.accent_color = a0.pendingAccentColor;
}
if (a0.pendingThemeColors !== void 0) {
r4.theme_colors = a0.pendingThemeColors;
}
const { pendingProfileEffect, pendingProfileFrame } = a0;
if (pendingProfileEffect === void 0 && pendingProfileFrame === void 0) {
r55 = {};
} else {
let r32 = getCurrentUserProfile(a1)?.collectibles;
if (r32 == null) {
r32 = [];
}
const r10 = [...r32];
let r33 = r10;
if (pendingProfileEffect !== void 0) {
const r36 = r10.filter((item) => item.type !== CollectiblesItemType.PROFILE_EFFECT);
r33 = r36;
if (pendingProfileEffect !== null) {
r36.push({
skuId: pendingProfileEffect.skuId,
type: CollectiblesItemType.PROFILE_EFFECT
});
r33 = r36;
}
}
let r46 = r33;
if (pendingProfileFrame !== void 0) {
const r49 = r33.filter((item) => item.type !== CollectiblesItemType.PROFILE_FRAME);
r46 = r49;
if (pendingProfileFrame !== null) {
r49.push(pendingProfileFrame);
r46 = r49;
}
}
r55 = {
collectibles_sku_ids: r46.map((item) => item.skuId)
};
}
if (r55.collectibles_sku_ids !== void 0) {
r4.collectibles_sku_ids = r55.collectibles_sku_ids;
}
return r4;
}
export function getAccountUpdateForUpdateRequest(a0) {
const r2 = {};
if (a0.pendingGlobalName !== void 0) {
r2.globalName = a0.pendingGlobalName;
}
if (a0.pendingNameplate !== void 0) {
r2.nameplate = a0.pendingNameplate;
}
if (a0.pendingAvatar !== void 0) {
const pendingAvatar = a0.pendingAvatar;
if (pendingAvatar === null) {
r2.avatar = null;
} else if (pendingAvatar.assetOrigin === AssetOriginTypes.ARCHIVED_ASSET) {
r2.avatarId = pendingAvatar.originalAsset.id;
} else {
r2.avatar = pendingAvatar.imageUri;
r2.avatarDescription = pendingAvatar.description;
r2.avatarOriginalMd5 = pendingAvatar.originalMd5;
}
}
if (a0.pendingAvatarDecoration !== void 0) {
r2.avatarDecoration = a0.pendingAvatarDecoration;
}
if (a0.pendingDisplayNameStyles !== void 0) {
r2.displayNameStyles = a0.pendingDisplayNameStyles;
}
return r2;
}
export function getGuildMemberChangesForUpdateRequest(a0) {
const r2 = {};
if (a0.pendingAvatar !== void 0) {
const pendingAvatar = a0.pendingAvatar;
if (pendingAvatar === null) {
r2.avatar = null;
} else if (pendingAvatar.assetOrigin === AssetOriginTypes.ARCHIVED_ASSET) {
r2.avatarId = pendingAvatar.originalAsset.id;
} else {
r2.avatar = pendingAvatar.imageUri;
r2.avatarDescription = pendingAvatar.description;
r2.avatarOriginalMd5 = pendingAvatar.originalMd5;
}
}
if (a0.pendingNickname !== void 0) {
let pendingNickname = a0.pendingNickname;
if (pendingNickname == null) {
pendingNickname = "";
}
r2.nick = pendingNickname;
}
if (a0.pendingAvatarDecoration !== void 0) {
r2.avatarDecoration = a0.pendingAvatarDecoration;
}
if (a0.pendingNameplate !== void 0) {
r2.nameplate = a0.pendingNameplate;
}
if (a0.pendingDisplayNameStyles !== void 0) {
r2.displayNameStyles = a0.pendingDisplayNameStyles;
}
return r2;
}
export function getPrimaryGuildChangesForUpdateRequest(a0) {
const r1 = {};
if (a0.pendingPrimaryGuildId !== void 0) {
r1.primaryGuildId = a0.pendingPrimaryGuildId;
}
return r1;
}
@@ -0,0 +1,22 @@
// Metro module 5919 (f5920).
import { TENURE_BADGES } from "../premium/PremiumConstants";
import Module3771 from "../../_bundle/Module3771";
export function getTieredTenureBadgeData(a0) {
return TENURE_BADGES[a0];
}
export function getTieredTenureBadge(a0) {
return TENURE_BADGES[a0] != null ? a0 : null;
}
export function getEarnedOnDate(a0, a1) {
if (a1 == null) {
return null;
}
const r7 = TENURE_BADGES[a0];
if (r7 == null) {
return null;
}
const r12 = Module3771(a1);
r12.add(r7.tenureReqNumMonths, "months");
r12.add(1, "days");
return r12.toDate();
}
@@ -0,0 +1,209 @@
// Metro module 7944 (f7945).
import UserStore from "../../stores/UserStore";
import { AnalyticEvents, ComponentActions, Endpoints, ME } from "../../Constants";
import { AnalyticsPremiumFeatureNames, AnalyticsPremiumFeatureTiers } from "../premium/PremiumConstants";
import { ComponentDispatch } from "../../utils/ComponentDispatchUtils";
import { AccessibilityAnnouncer } from "../../design/shared";
import { intl, t } from "../../intl/index.native";
import AnalyticsUtils from "../../utils/AnalyticsUtils";
import { getShouldConvertBioEmoji } from "./hooks/useShouldConvertBioEmoji";
import MessageParser from "../messages/MessageParser";
import Dispatcher from "../../Dispatcher";
import { SafetyScannedUploadSurface } from "../../lib/uploader_inline/safetyScannedUploadSurfaces";
import { HTTP } from "../../_bundle/sendRequest";
import InlineUploader from "../../lib/uploader_inline/InlineUploader";
import { APIError } from "../../errors/index";
export function notifyUnsavedUserProfileChangesInModal() {
ComponentDispatch.dispatch(ComponentActions.SHAKE_PROFILE_MODAL);
ComponentDispatch.dispatch(ComponentActions.EMPHASIZE_NOTICE);
AccessibilityAnnouncer.announce(`${intl.string(t.GP7JLE)} ${intl.string(t.gKoO1D)}`);
}
export async function saveProfileChanges(body, guildId, c26065_2) {
let r126, r162;
let body2, c26065_6;
let c26065_7 = 0;
let c29867_0, c29867_1, c29867_2, c29867_3, c29867_4, c29867_5;
L21: {
try {
c29867_0 = guildId;
c29867_1 = void 0;
c29867_2 = void 0;
c29867_3 = void 0;
c29867_4 = void 0;
const id = UserStore.getCurrentUser()?.id;
c29867_1 = id;
if (id != null) {
const shouldConvertBioEmoji = getShouldConvertBioEmoji();
if (body.bio != null && shouldConvertBioEmoji) {
body.bio = MessageParser.parse(void 0, body.bio).content;
}
c26065_7 = 1;
Dispatcher.dispatch({
type: "USER_PROFILE_UPDATE_START",
userId: id,
guildId
});
const r69 = guildId != null ? {
url: Endpoints.USER_GUILD_PROFILE(guildId, ME),
bannerSurface: SafetyScannedUploadSurface.USER_GUILD_PROFILE_BANNER
} : {
url: Endpoints.USER_PROFILE(ME),
bannerSurface: SafetyScannedUploadSurface.USER_DEFAULT_PROFILE_BANNER
};
const { url, bannerSurface } = r69;
const r94 = {};
r94[bannerSurface] = c26065_2;
c29867_2 = await HTTP.patch({
url,
body,
headers: InlineUploader.buildHeadersForMd5(r94),
oldFormErrors: true,
rejectWithError: false
});
Dispatcher.dispatch({
type: "USER_PROFILE_UPDATE_SUCCESS",
userId: c29867_1,
guildId: c29867_0,
...c29867_2.body
});
r126 = c29867_2;
c26065_7 = 0;
break L21;
}
} catch ($e) {
const r30 = $e;
let r8 = r30;
c26065_6 = r30;
if (c26065_7 !== 0) {
while (true) {
try {
const r135 = c26065_6;
c26065_7 = 0;
c29867_5 = r135;
c29867_3 = new APIError(c29867_5);
const body3 = c29867_5?.body;
body2 = body3;
if (body3 == null) {
body2 = {};
}
c29867_4 = body2;
Dispatcher.dispatch({
type: "USER_PROFILE_UPDATE_FAILURE",
guildId: c29867_0,
errors: c29867_4,
apiError: c29867_3
});
r162 = c29867_5;
} catch (r131) {
r8 = r131;
c26065_6 = r131;
if (c26065_7 === 0) {
break;
}
continue;
}
return r162;
}
}
throw r8;
}
return void 0;
}
return r126;
}
export function pinUserProfileBadgesOnClient(a0, a1) {
const id = UserStore.getCurrentUser()?.id;
if (id != null) {
Dispatcher.dispatch({
type: "USER_PROFILE_PIN_BADGES_ON_CLIENT",
badges: a0,
ttlInSeconds: a1,
userId: id
});
}
}
export function resetPendingProfileChanges() {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_RESET_PENDING_PROFILE_CHANGES"
});
}
export function resetAllPendingChanges() {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_RESET_PENDING_CHANGES"
});
}
export function resetAllTryItOutChanges() {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_RESET_TRY_IT_OUT_CHANGES"
});
}
export function setTryItOutAvatar(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_AVATAR",
avatar: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.ANIMATED_AVATAR,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutAvatarDecoration(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_AVATAR_DECORATION",
avatarDecoration: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.AVATAR_DECORATION,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutProfileEffect(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_PROFILE_EFFECT",
profileEffect: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.PROFILE_EFFECT,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutBanner(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_BANNER",
banner: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.PROFILE_BANNER,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutThemeColors(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_THEME_COLORS",
themeColors: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.PROFILE_THEME_COLOR,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutDisplayNameStyles(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_DISPLAY_NAME_STYLES",
displayNameStyles: a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.DISPLAY_NAME_STYLES,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
export function setTryItOutPreset(a0) {
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_PRESET",
...a0
});
AnalyticsUtils.track(AnalyticEvents.PREMIUM_FEATURE_TRY_OUT, {
feature_name: AnalyticsPremiumFeatureNames.PRESET,
feature_tier: AnalyticsPremiumFeatureTiers.PREMIUM_STANDARD
});
}
@@ -0,0 +1,124 @@
// Metro module 8107 (f8108).
import { createContext, useRef, useEffect, useContext, useMemo, useCallback } from "react";
import useAnalyticsLocations from "../app_analytics/useAnalyticsLocations";
import * as _UserProfileAnalyticsUtils from "./UserProfileAnalyticsUtils";
import { maybeTrackUserProfileUiViewed } from "./UserProfileAnalyticsUtils";
import { v4 } from "../../_bundle/Module514";
const context = createContext(null);
export const UserProfileAnalyticsProvider = ({ value, children, openedAt, fetchStartedAt, fetchEndedAt, isLoaded = false }) => {
let c16252_3 = isLoaded;
const analyticsLocations2 = useAnalyticsLocations().analyticsLocations;
const ref = useRef(void 0);
const ref3 = useRef(openedAt);
if (ref3.current !== openedAt) {
ref3.current = openedAt;
ref.current = void 0;
}
const current = {
analyticsLocations: analyticsLocations2,
value
};
const ref2 = useRef(current);
useEffect(() => {
ref2.current = current;
});
useEffect(() => {
const r10 = Date.now();
if (ref.current == null && openedAt != null) {
ref.current = r10 - openedAt;
}
if (c16252_3) {
const current2 = ref2.current;
const { analyticsLocations: analyticsLocations2, value } = current2;
_UserProfileAnalyticsUtils.trackUserProfileAction({
action: "VIEW",
analyticsLocations: analyticsLocations2,
...value
});
maybeTrackUserProfileUiViewed({
profileUi: "USER_PROFILE",
timeToInteractiveMs: ref.current,
timeToLoadMs: openedAt != null ? r10 - openedAt : void 0,
timeToFetchMs: fetchStartedAt != null ? fetchEndedAt != null ? fetchEndedAt - fetchStartedAt : void 0 : void 0,
viewStartedAt: openedAt,
fetchStartedAt,
analyticsLocations: analyticsLocations2,
...value
});
}
}, [isLoaded]);
return <context.Provider value={value}>{children}</context.Provider>;
};
export function useCreateUserProfileAnalyticsContext({ layout, userId, guildId, channelId, messageId, roleId, sourceSessionId, showGuildProfile: showGuildProfile2 = true }) {
const showGuildProfile = showGuildProfile2;
const sessionId = useContext(context)?.sessionId;
return useMemo(() => {
const r1 = {
sessionId: v4(),
sourceSessionId: null,
layout: null,
userId: null,
guildId: null,
channelId: null,
messageId: null,
roleId: null,
showGuildProfile: null
};
let sourceSessionId2 = sourceSessionId;
if (sourceSessionId == null) {
sourceSessionId2 = sessionId;
}
r1.sourceSessionId = sourceSessionId2;
r1.layout = layout;
r1.userId = userId;
r1.guildId = guildId;
r1.channelId = channelId;
r1.messageId = messageId;
r1.roleId = roleId;
r1.showGuildProfile = showGuildProfile;
return r1;
}, [sessionId, layout, userId, guildId, channelId, messageId, roleId, sourceSessionId, showGuildProfile]);
}
export function useUserProfileAnalyticsContext() {
const context2 = useContext(context);
const analyticsLocations = useAnalyticsLocations().analyticsLocations;
return {
context: context2,
trackUserProfileAction: useCallback((a0) => {
if (context2 != null) {
_UserProfileAnalyticsUtils.trackUserProfileAction({
analyticsLocations,
...context2,
...a0
});
}
}, [context2, analyticsLocations]),
trackUserProfileEditAction: useCallback((a0) => {
if (context2 != null) {
_UserProfileAnalyticsUtils.trackUserProfileEditAction({
analyticsLocations,
...context2,
...a0
});
}
}, [context2, analyticsLocations]),
trackUserProfileEditSaved: useCallback((a0) => {
if (context2 != null) {
_UserProfileAnalyticsUtils.trackUserProfileEditSaved({
analyticsLocations,
...context2,
...a0
});
}
}, [context2, analyticsLocations]),
trackUserProfileWishlistAction: useCallback((a0) => {
if (context2 != null) {
_UserProfileAnalyticsUtils.trackUserProfileWishlistAction({
analyticsLocations,
...context2,
...a0
});
}
}, [context2, analyticsLocations])
};
}
@@ -0,0 +1,436 @@
// Metro module 8108 (f8109).
import BadgeDirectoryStore from "../badges/BadgeDirectoryStore";
import AuthorizedAppsStore, { FetchState } from "../oauth2/AuthorizedAppsStore";
import UserAffinitiesV2Store from "../user_affinities/UserAffinitiesV2Store";
import ApplicationStreamingStore from "../../stores/ApplicationStreamingStore";
import GuildMemberStore from "../../stores/GuildMemberStore";
import PresenceStore from "../../stores/PresenceStore";
import RelationshipStore from "../../stores/RelationshipStore";
import UserStore from "../../stores/UserStore";
import UserProfileStore from "./UserProfileStore";
import { TrackUserProfileProperties } from "./Constants";
import { ActivityTypes, AnalyticEvents } from "../../Constants";
import { StatusTypes } from "../../_bundle/Module505";
import { isAnimatedIconHash } from "../../utils/AvatarUtils";
import { getDisplayProfile } from "./hooks/useDisplayProfile";
import AnalyticsUtils from "../../utils/AnalyticsUtils";
import { collectGuildAnalyticsMetadata, collectChannelAnalyticsMetadataFromId } from "../app_analytics/AppAnalyticsUtils";
import { isUserProfilePerformanceAnalyticsEnabled } from "./experiments/UserProfilePerformanceAnalyticsExperiment";
import { HermesBuiltin } from "../../_hermes/prelude";
let getTrackUserProfileProperties, trackUserProfileAction;
const getProfileProperties = function getProfileProperties(a0) {
const user = a0.user;
let userProfile = a0.userProfile;
const { guildMember, guildMemberProfile } = a0;
if (userProfile == null) {
userProfile = guildMemberProfile;
}
const r10 = Boolean;
const nick = guildMember?.nick;
const r14 = [];
if (r10(nick)) {
r14.push(TrackUserProfileProperties.NICKNAME);
}
if (Boolean(userProfile?.pronouns)) {
r14.push(TrackUserProfileProperties.PRONOUNS);
}
if (Boolean(user?.avatar)) {
r14.push(isAnimatedIconHash(user?.avatar) ? TrackUserProfileProperties.ANIMATED_AVATAR : TrackUserProfileProperties.AVATAR);
}
if (Boolean(userProfile?.banner)) {
r14.push(isAnimatedIconHash(userProfile?.banner) ? TrackUserProfileProperties.ANIMATED_BANNER : TrackUserProfileProperties.BANNER);
}
if (Boolean(userProfile?.bio)) {
r14.push(TrackUserProfileProperties.BIO);
}
if (userProfile?.themeColors != null && userProfile.themeColors.find((themeColor) => themeColor !== null) !== void 0) {
r14.push(TrackUserProfileProperties.THEME);
}
if (user?.avatarDecoration != null) {
r14.push(TrackUserProfileProperties.AVATAR_DECORATION);
}
if (userProfile?.profileEffect != null) {
r14.push(TrackUserProfileProperties.PROFILE_EFFECT);
}
return r14;
};
getTrackUserProfileProperties = function getTrackUserProfileProperties({ layout, userId: userId2, guildId, sessionId, sourceSessionId, showGuildProfile = true }) {
let user_status;
const user = UserStore.getUser(userId2);
if (user == null) {
return {};
}
const displayProfile = getDisplayProfile(user?.id, showGuildProfile ? guildId : void 0);
const guildMember = showGuildProfile ? guildId != null ? GuildMemberStore.getMember(guildId, user?.id) : null : null;
const r29 = {
profile_layout: layout,
profile_session_id: sessionId,
source_profile_session_id: sourceSessionId,
profile_properties: getProfileProperties({
user,
userProfile: displayProfile?._userProfile
}),
guild_profile_properties: getProfileProperties({
guildMember,
guildMemberProfile: displayProfile?._guildMemberProfile
}),
profile_activity_types: PresenceStore.getActivities(user.id).map((item) => item.type).filter((item) => item !== void 0),
profile_badges: null,
avatar_decoration_sku_id: null,
profile_effect_sku_id: null,
profile_frame_sku_id: null,
user_status: null,
is_guild_profile: null,
is_bot_profile: null,
is_private_to_viewer: null
};
const r49 = displayProfile == null;
let profile_badges = void 0;
if (!r49) {
const badges = displayProfile.getBadges();
profile_badges = badges == null ? void 0 : badges.map((badge) => badge.id).filter((item) => typeof item === "string");
}
if (profile_badges == null) {
profile_badges = [];
}
r29.profile_badges = profile_badges;
r29.avatar_decoration_sku_id = user.avatarDecoration?.skuId;
r29.profile_effect_sku_id = displayProfile == null ? void 0 : displayProfile.profileEffect?.skuId;
r29.profile_frame_sku_id = displayProfile == null ? void 0 : displayProfile.profileFrame?.skuId;
const id = user.id;
const status = PresenceStore.getStatus(id);
const isMobileOnline = PresenceStore.isMobileOnline(id);
if (status === StatusTypes.ONLINE && isMobileOnline) {
user_status = `${status}-mobile`;
} else {
const ONLINE = StatusTypes.ONLINE;
user_status = status;
if (user_status === ONLINE) {
user_status = `${status}-desktop`;
}
}
r29.user_status = user_status;
r29.is_guild_profile = displayProfile?.guildId != null;
r29.is_bot_profile = user.bot;
let is_private_to_viewer = displayProfile?.private;
if (is_private_to_viewer == null) {
is_private_to_viewer = false;
}
r29.is_private_to_viewer = is_private_to_viewer;
return r29;
};
trackUserProfileAction = function trackUserProfileAction(a0) {
let r48;
const { guildId, channelId, messageId, roleId, widgetType, analyticsLocations, action, section, applicationId } = a0;
const USER_PROFILE_ACTION = AnalyticEvents.USER_PROFILE_ACTION;
const r28 = {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0)
};
const userId2 = a0.userId;
if (userId2 == null) {
r48 = {};
} else {
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId2);
r48 = {
related_user_id: userId2,
relationship_type: RelationshipStore.getRelationshipType(userId2),
related_since: RelationshipStore.getSince(userId2),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId2),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId2)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
HermesBuiltin.copyDataProperties(r28, r48);
HermesBuiltin.copyDataProperties(r28, {
application_id: applicationId,
application_linked: applicationId != null ? AuthorizedAppsStore.getFetchStateForApplication(applicationId) === FetchState.FETCHED ? AuthorizedAppsStore.getNewestTokenForApplication(applicationId) != null : null : null
});
r28.location_stack = analyticsLocations;
r28.profile_action = action;
r28.profile_section = section;
r28.source_message_id = messageId;
r28.source_role_id = roleId;
r28.widget_type = widgetType;
AnalyticsUtils.track(USER_PROFILE_ACTION, r28);
};
export function getActivityType(a0) {
return a0 != null ? a0 !== "VOICE" ? Object.keys(ActivityTypes)[Object.values(ActivityTypes).indexOf(a0)] : "VOICE" : a0;
}
export function getTrackUserRelationshipProperties({ userId: userId2 }) {
if (userId2 == null) {
return {};
}
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId2);
return {
related_user_id: userId2,
relationship_type: RelationshipStore.getRelationshipType(userId2),
related_since: RelationshipStore.getSince(userId2),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId2),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId2)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
export { trackUserProfileAction };
export function maybeTrackUserProfileUiViewed(a0) {
let r56;
if (isUserProfilePerformanceAnalyticsEnabled("UserProfileAnalyticsUtils")) {
const { guildId, channelId, analyticsLocations, profileUi, viewStartedAt, fetchStartedAt, timeToInteractiveMs, timeToLoadMs, timeToFetchMs } = a0;
let r28 = timeToInteractiveMs;
if (r28 == null) {
r28 = 0;
}
let r1 = r28 <= 0;
if (!r1) {
let r29 = timeToLoadMs;
if (r29 == null) {
r29 = 0;
}
r1 = r29 <= 0;
}
if (!r1) {
let r30 = timeToFetchMs;
if (r30 == null) {
r30 = 0;
}
r1 = r30 <= 0;
}
if (!r1) {
const USER_PROFILE_UI_VIEWED = AnalyticEvents.USER_PROFILE_UI_VIEWED;
const r36 = {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0)
};
const userId2 = a0.userId;
if (userId2 == null) {
r56 = {};
} else {
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId2);
r56 = {
related_user_id: userId2,
relationship_type: RelationshipStore.getRelationshipType(userId2),
related_since: RelationshipStore.getSince(userId2),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId2),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId2)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
HermesBuiltin.copyDataProperties(r36, r56);
r36.location_stack = analyticsLocations;
r36.profile_ui = profileUi;
r36.view_started_at = viewStartedAt;
r36.fetch_started_at = fetchStartedAt;
r36.time_to_interactive_ms = timeToInteractiveMs;
r36.time_to_load_ms = timeToLoadMs;
r36.time_to_fetch_ms = timeToFetchMs;
AnalyticsUtils.track(USER_PROFILE_UI_VIEWED, r36);
}
}
}
export function trackUserProfileActivityJoined(a0) {
let r47;
const { guildId, channelId, analyticsLocations, activityType, activityName, activityPlatform, activitySessionId, applicationId, voiceChannelId } = a0;
const USER_PROFILE_ACTIVITY_JOINED = AnalyticEvents.USER_PROFILE_ACTIVITY_JOINED;
const r27 = {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0)
};
const userId2 = a0.userId;
if (userId2 == null) {
r47 = {};
} else {
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId2);
r47 = {
related_user_id: userId2,
relationship_type: RelationshipStore.getRelationshipType(userId2),
related_since: RelationshipStore.getSince(userId2),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId2),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId2)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
HermesBuiltin.copyDataProperties(r27, r47);
r27.location_stack = analyticsLocations;
const r63 = voiceChannelId != null;
let activity_type = "VOICE";
if (!r63) {
let r66 = activityType;
if (r66 != null) {
r66 = activityType !== "VOICE" ? Object.keys(ActivityTypes)[Object.values(ActivityTypes).indexOf(activityType)] : "VOICE";
}
activity_type = r66;
}
r27.activity_type = activity_type;
r27.activity_name = activityName;
r27.activity_platform = activityPlatform;
r27.activity_session_id = activitySessionId;
r27.application_id = applicationId;
r27.voice_channel_id = voiceChannelId;
AnalyticsUtils.track(USER_PROFILE_ACTIVITY_JOINED, r27);
}
export function trackUserProfileActivityAction(a0) {
let r48;
const { guildId, channelId, analyticsLocations, action, display, activity, stream, entry, outbox, voiceChannelId } = a0;
const USER_PROFILE_ACTIVITY_ACTION = AnalyticEvents.USER_PROFILE_ACTIVITY_ACTION;
const r28 = {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0)
};
const userId2 = a0.userId;
if (userId2 == null) {
r48 = {};
} else {
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId2);
r48 = {
related_user_id: userId2,
relationship_type: RelationshipStore.getRelationshipType(userId2),
related_since: RelationshipStore.getSince(userId2),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId2),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId2)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
HermesBuiltin.copyDataProperties(r28, r48);
r28.location_stack = analyticsLocations;
r28.activity_action = action;
r28.activity_display = display;
const r65 = stream != null ? ActivityTypes.STREAMING : activity?.type;
let activity_type = r65;
if (activity_type != null) {
activity_type = r65 !== "VOICE" ? Object.keys(ActivityTypes)[Object.values(ActivityTypes).indexOf(r65)] : "VOICE";
}
r28.activity_type = activity_type;
r28.activity_name = activity?.name;
r28.activity_platform = activity?.platform;
r28.activity_session_id = activity?.session_id;
r28.activity_application_id = activity?.application_id;
r28.item_id = entry?.id;
r28.author_id_v2 = entry?.author_id;
r28.item_ids = outbox == null ? void 0 : outbox.entries.map((entry) => entry.id);
r28.author_ids_v2 = outbox == null ? void 0 : outbox.entries.map((entry) => entry.author_id);
r28.voice_channel_id = voiceChannelId;
AnalyticsUtils.track(USER_PROFILE_ACTIVITY_ACTION, r28);
}
export function trackUserProfileBadgeAction(a0) {
let r52;
const { guildId, channelId, analyticsLocations, badgeId, badgeAction, position, userId: userId2 } = a0;
const badge_tier = badgeId != null ? userId2 != null ? BadgeDirectoryStore.getBadgeById(badgeId, userId2)?.current_tier : void 0 : void 0;
const USER_PROFILE_BADGE_ACTION = AnalyticEvents.USER_PROFILE_BADGE_ACTION;
const r32 = {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0)
};
const userId3 = a0.userId;
if (userId3 == null) {
r52 = {};
} else {
const userAffinity = UserAffinitiesV2Store.getUserAffinity(userId3);
r52 = {
related_user_id: userId3,
relationship_type: RelationshipStore.getRelationshipType(userId3),
related_since: RelationshipStore.getSince(userId3),
num_mutual_friends: UserProfileStore.getMutualFriendsCount(userId3),
num_mutual_guilds: UserProfileStore.getMutualGuilds(userId3)?.length,
communication_probability: userAffinity?.communicationProbability,
communication_rank: userAffinity?.communicationRank
};
}
HermesBuiltin.copyDataProperties(r32, r52);
r32.location_stack = analyticsLocations;
r32.badge_action = badgeAction;
r32.badge_id = badgeId;
r32.badge_tier = badge_tier;
r32.position = position;
AnalyticsUtils.track(USER_PROFILE_BADGE_ACTION, r32);
}
export function trackDmProfileToggled({ displayProfile, isProfileOpen }) {
const userId = displayProfile?.userId;
const r14 = userId != null ? PresenceStore.findActivity(userId, ({ type }) => ApplicationStreamingStore.getAnyStreamForUser(userId) != null ? type === ActivityTypes.PLAYING : type !== ActivityTypes.CUSTOM_STATUS) : null;
const DM_PROFILE_TOGGLED = AnalyticEvents.DM_PROFILE_TOGGLED;
const r26 = {
...getTrackUserProfileProperties({
userId
}),
is_profile_open: isProfileOpen
};
const r29 = Boolean;
let r31 = r14 == null ? void 0 : r14.assets?.large_image;
if (r31 == null) {
r31 = r14 == null ? void 0 : r14.assets?.small_image;
}
r26.has_images = r29(r31);
r26.is_friend = RelationshipStore.isFriend(userId);
r26.viewed_profile_user_id = userId;
r26.profile_has_nitro_customization = displayProfile == null ? void 0 : displayProfile.hasPremiumCustomization();
r26.profile_has_theme_color_customized = displayProfile == null ? void 0 : displayProfile.hasThemeColors();
r26.profile_has_theme_animation = displayProfile?.popoutAnimationParticleType != null;
AnalyticsUtils.track(DM_PROFILE_TOGGLED, r26);
}
export function trackUserProfileEditAction(a0) {
const { guildId, channelId, analyticsLocations, action, widgetEdited, gameId, numResults, numCharacters, applicationId } = a0;
trackUserProfileAction({
...a0,
action
});
AnalyticsUtils.track(AnalyticEvents.USER_PROFILE_EDIT_ACTION, {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0),
...{
application_id: applicationId,
application_linked: applicationId != null ? AuthorizedAppsStore.getFetchStateForApplication(applicationId) === FetchState.FETCHED ? AuthorizedAppsStore.getNewestTokenForApplication(applicationId) != null : null : null
},
location_stack: analyticsLocations,
edit_action: action,
widget_edited: widgetEdited,
game_id: gameId,
num_results: numResults,
num_characters: numCharacters,
application_id: applicationId
});
}
export function trackUserProfileEditSaved(a0) {
const { guildId, channelId, analyticsLocations, widgetEdited, gameIds, tags, numCharactersCommentary, isWidgetRemoved } = a0;
trackUserProfileAction({
...a0,
action: "EDIT_SAVED"
});
AnalyticsUtils.track(AnalyticEvents.USER_PROFILE_EDIT_SAVED, {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0),
location_stack: analyticsLocations,
widget_edited: widgetEdited,
game_ids: gameIds,
tags,
num_characters_commentary: numCharactersCommentary,
is_widget_removed: isWidgetRemoved
});
}
export function trackUserProfileWishlistAction(a0) {
const { guildId, channelId, analyticsLocations, action, wishlistId, skuId, productLines } = a0;
trackUserProfileAction({
...a0,
action
});
AnalyticsUtils.track(AnalyticEvents.USER_PROFILE_WISHLIST_ACTION, {
...collectGuildAnalyticsMetadata(guildId),
...collectChannelAnalyticsMetadataFromId(channelId),
...getTrackUserProfileProperties(a0),
location_stack: analyticsLocations,
action_type: action,
wishlist_id: wishlistId,
sku_id: skuId,
product_lines: productLines != null ? Array.from(productLines) : []
});
}
@@ -0,0 +1,46 @@
// Metro module 5918 (f5919).
import { WidgetType } from "../../_bundle/Module5897";
class ApplicationWidget {
constructor({ id, applicationId }) {
this.id = id;
this.type = WidgetType.APPLICATION;
this.applicationId = applicationId;
}
toSubmission() {
return {
id: this.id,
data: {
type: this.type,
application_id: this.applicationId
}
};
}
isDiscardable() {
return false;
}
isValid() {
return true;
}
isEqual(a0) {
return a0 instanceof ApplicationWidget && a0.applicationId === this.applicationId;
}
getUniqueKey() {
return `${this.type}-${this.applicationId}`;
}
getProfileAnalyticsOptions() {
return {
widgetType: this.type,
applicationId: this.applicationId
};
}
getProfileEditAnalyticsOptions() {
return {
widgetEdited: this.type,
applicationId: this.applicationId
};
}
}
export { ApplicationWidget };
export function isApplicationWidgetWithId(a0, a1) {
return a1 != null && a0 instanceof ApplicationWidget && a0.applicationId === a1;
}
@@ -0,0 +1,17 @@
// Metro module 12059 (f12060).
import { WidgetGameTagIconRole, buildWidgetGameTagMetadata } from "./UserProfileGameWidgetTagMetadata";
import { RibbonIcon } from "../../design/components/Icon/native/redesign/generated/RibbonIcon";
import { ThumbsUpIcon } from "../../design/components/Icon/native/redesign/generated/ThumbsUpIcon";
import { ThumbsDownIcon } from "../../design/components/Icon/native/redesign/generated/ThumbsDownIcon";
import { FriendsIcon } from "../../design/components/Icon/native/redesign/generated/FriendsIcon";
const r15 = {};
r15[WidgetGameTagIconRole.RIBBON] = RibbonIcon;
r15[WidgetGameTagIconRole.THUMBS_UP] = ThumbsUpIcon;
r15[WidgetGameTagIconRole.THUMBS_DOWN] = ThumbsDownIcon;
r15[WidgetGameTagIconRole.FRIENDS] = FriendsIcon;
let c8295_0 = buildWidgetGameTagMetadata(r15);
export { c8295_0 as WIDGET_GAME_TAG_METADATA };
export function getWidgetGameTagMetadata(a0) {
const r4 = c8295_0[a0];
return r4 ?? null;
}
@@ -0,0 +1,82 @@
// Metro module 12060 (f12061).
import { WidgetGameTag } from "../../_bundle/Module5905";
import { intl, t } from "../../intl/index.native";
let c8296_2;
const r12 = {
RIBBON: "ribbon",
THUMBS_UP: "thumbsUp",
THUMBS_DOWN: "thumbsDown",
FRIENDS: "friends"
};
const r17 = {};
r17[WidgetGameTag.BETTER_THAN_YOU] = {
getText: () => intl.string(t.jbIRBE),
iconRole: r12.RIBBON
};
r17[WidgetGameTag.CASUAL] = {
getText: () => intl.string(t.xcFFv6),
iconRole: r12.RIBBON
};
r17[WidgetGameTag.INTERMEDIATE] = {
getText: () => intl.string(t["A/mIs/"]),
iconRole: r12.RIBBON
};
r17[WidgetGameTag.EXPERT] = {
getText: () => intl.string(t.RIOFc2),
iconRole: r12.RIBBON
};
r17[WidgetGameTag.OBSESSED] = {
getText: () => intl.string(t.isPJDu),
iconRole: r12.THUMBS_UP
};
r17[WidgetGameTag.LOVE_IT] = {
getText: () => intl.string(t["1rN7BF"]),
iconRole: r12.THUMBS_UP
};
r17[WidgetGameTag.KIND_OF_LOVE_IT] = {
getText: () => intl.string(t.bCBpVg),
iconRole: r12.THUMBS_UP
};
r17[WidgetGameTag.KIND_OF_HATE_IT] = {
getText: () => intl.string(t["/WcmcP"]),
iconRole: r12.THUMBS_DOWN
};
r17[WidgetGameTag.RAGE_QUITTING] = {
getText: () => intl.string(t["NXZ/MZ"]),
iconRole: r12.THUMBS_DOWN
};
r17[WidgetGameTag.OPEN_TO_PLAY] = {
getText: () => intl.string(t.q30PoH),
iconRole: r12.FRIENDS
};
r17[WidgetGameTag.LOOKING_FOR_GROUP] = {
getText: () => intl.string(t.DWWAAQ),
iconRole: r12.FRIENDS
};
r17[WidgetGameTag.LOOKING_FOR_TIPS] = {
getText: () => intl.string(t.KQDVvH),
iconRole: r12.FRIENDS
};
r17[WidgetGameTag.OPEN_TO_TEACH] = {
getText: () => intl.string(t["5HhQo+"]),
iconRole: r12.FRIENDS
};
r17[WidgetGameTag.LOOKING_TO_DISCUSS] = {
getText: () => intl.string(t.GipOCq),
iconRole: r12.FRIENDS
};
c8296_2 = r17;
export { r12 as WidgetGameTagIconRole };
export function buildWidgetGameTagMetadata(a0) {
const r0 = {};
for (const item of Object.keys(c8296_2)) {
const r33 = c8296_2[item];
if (r33 != null) {
r0[item] = {
getText: r33.getText,
icon: a0[r33.iconRole]
};
}
}
return r0;
}
@@ -0,0 +1,57 @@
// Metro module 5898 (f5899).
import { WidgetType } from "../../_bundle/Module5897";
import { GAME_WIDGET_LIMITS_BY_TYPE } from "../../_bundle/Module5899";
import { areWidgetGamesEqual } from "./WidgetUtils";
let c3692_2 = [WidgetType.CURRENT_GAMES, WidgetType.FAVORITE_GAMES, WidgetType.WANT_TO_PLAY_GAMES, WidgetType.PLAYED_GAMES];
class BaseGameWidget {
constructor({ id, type, games }) {
this.id = id;
this.type = type;
this.games = games;
}
toSubmission() {
return {
id: this.id,
data: {
type: this.type,
games: this.games.map(function(game) {
return {
game_id: game.applicationId,
comment: game.comment,
tags: game.tags
};
})
}
};
}
isDiscardable() {
return this.games.length === 0;
}
isValid() {
return this.games.length > 0 && this.games.length <= GAME_WIDGET_LIMITS_BY_TYPE[this.type];
}
isEqual(a0) {
return a0 instanceof BaseGameWidget && (a0.type === this.type && areWidgetGamesEqual(this.games, a0.games, this.type));
}
getUniqueKey() {
return this.type;
}
getProfileAnalyticsOptions() {
return {
widgetType: this.type
};
}
getProfileEditAnalyticsOptions() {
return {
widgetEdited: this.type
};
}
}
export { c3692_2 as GAME_WIDGET_TYPES };
export function isGameWidgetType(a0) {
return c3692_2.includes(a0);
}
export function isGameWidget(a0) {
return a0 instanceof BaseGameWidget;
}
export { BaseGameWidget };
@@ -0,0 +1,82 @@
// Metro module 7989 (f7990).
import _slicedToArray from "../../_bundle/_slicedToArray";
import { ThemeTypes } from "../../Constants";
import { hex2int, getDarkness, int2rgbArray, rgb2int, int2rgba } from "../../_bundle/int2hslRaw";
import Color from "../../utils/Color";
import { memoize, clamp } from "../../_bundle/Module12";
import { getContrastingColor, WCAGContrastRatios } from "../../design/shared";
import Module689 from "../../_bundle/Module689";
const r22 = memoize((a0) => hex2int(getContrastingColor(a0, {
base: "#ffffff",
contrastRatio: WCAGContrastRatios.HighContrastText
})), (a0) => a0);
const r28 = memoize((a0, a1, a2) => {
const r10 = a2 == null ? a0 == null ? null : getDarkness(a0) > 0.5 ? ThemeTypes.DARK : ThemeTypes.LIGHT : a2;
const LIGHT = ThemeTypes.LIGHT;
const r38 = Module689.mix(Module689(a0), Module689(a1), 0.5, "lab");
const r2 = Math.round(100 * r38.get("hsl.l")) / 100;
const r53 = r10 !== LIGHT ? clamp(r2, 0, 0.1) : clamp(r2, 0.8, 1);
return Module689(r38).set("hsl.l", r53).num();
}, (a0, a1, a2) => `${a0}-${a1}-${a2}`);
export function getProfileTheme(a0) {
return a0 != null ? getDarkness(a0) > 0.5 ? ThemeTypes.DARK : ThemeTypes.LIGHT : null;
}
export function getValueInColorGradientByPercentage(a0, a1, a2) {
const r11 = a2 / 100;
const r12 = 1 - r11;
return [Math.round(a0[0] * r12 + a1[0] * r11), Math.round(a0[1] * r12 + a1[1] * r11), Math.round(a0[2] * r12 + a1[2] * r11)];
}
export function calculateOverlayedColor(a0, a1) {
const r10 = int2rgbArray(a0);
if (a1 == null) {
return 0;
}
const r24 = Color.parseString(a1);
if (r24 == null) {
return 0;
}
const r27 = [r24.red, r24.green, r24.blue];
let c16152_0 = [r10[0], r10[1], r10[2]];
const alpha = r24.alpha;
const r38 = _slicedToArray(r27.map((item, index) => Math.floor(alpha * item + (1 - alpha) * c16152_0[index])), 3);
return rgb2int(`rgba(${r38[0]}, ${r38[1]}, ${r38[2]})`);
}
export { r22 as calculateButtonColor };
export { r28 as calculateModalV2BackgroundColor };
export function getGradientPercentageColorInRgb(a0, a1, a2) {
const r18 = a2 / 100;
const r19 = 1 - r18;
const r24 = [Math.round(a0[0] * r19 + a1[0] * r18), Math.round(a0[1] * r19 + a1[1] * r18), Math.round(a0[2] * r19 + a1[2] * r18)];
return `rgba(${r24[0]}, ${r24[1]}, ${r24[2]}, 1)`;
}
export function calculateGradientSplitColors(a0, a1, a2, a3, a4) {
if (a2 === 0) {
return [];
}
const r16 = int2rgbArray(a0);
const r31 = int2rgbArray(a1);
const r34 = 100 * a3 / a2 / 100;
const r2 = 1 - r34;
const r42 = [Math.round(r16[0] * r2 + r31[0] * r34), Math.round(r16[1] * r2 + r31[1] * r34), Math.round(r16[2] * r2 + r31[2] * r34)];
const r65 = [`rgba(${r42[0]}, ${r42[1]}, ${r42[2]}, 1)`, ,];
const r68 = 100 * a4 / a2 / 100;
const r69 = 1 - r68;
const r78 = [Math.round(r16[0] * r69 + r31[0] * r68), Math.round(r16[1] * r69 + r31[1] * r68), Math.round(r16[2] * r69 + r31[2] * r68)];
r65[1] = `rgba(${r78[0]}, ${r78[1]}, ${r78[2]}, 1)`;
return r65;
}
export function getUserProfileGradientContainerColors(a0, a1, a2) {
let r14;
let r5 = a2;
if (typeof a2 === "string") {
const r31 = [a0 != null ? int2rgba(a0, 1) : a2, ,];
if (a1 != null) {
r5 = int2rgba(a1, 1);
}
r31[1] = r5;
r14 = r31;
} else {
r14 = [a0 != null ? int2rgba(a0, 1) : a2[0], a1 != null ? int2rgba(a1, 1) : a2[1]];
}
return r14;
}
@@ -0,0 +1,125 @@
// Metro module 5904 (f5905).
import _objectWithoutProperties from "../../_bundle/_objectWithoutProperties";
import { WidgetType } from "../../_bundle/Module5897";
import isUndefinedOrNull from "../../_bundle/isUndefinedOrNull";
const _excluded = ["localDataUri"];
class UserProfilePersonalWidget {
constructor(a0) {
const id = a0.id;
let header = a0.header;
const { top, bottom } = a0;
this.id = id;
this.type = WidgetType.PERSONAL;
if (header == null) {
header = "";
}
this.header = header;
const r2 = top != null;
let top2 = void 0;
if (r2) {
let title = top.title;
if (title == null) {
title = "";
}
let subtitle = top.subtitle;
if (subtitle == null) {
subtitle = "";
}
top2 = {
title,
subtitle,
image: top.image
};
}
this.top = top2;
let r24 = bottom?.entries;
if (r24 == null) {
r24 = [];
}
this.bottom = {
entries: r24.map((item) => item.hideImage === true ? item.image != null ? {
...item,
image: void 0
} : item : item)
};
}
toSubmission() {
const r7 = JSON;
const r2 = this.top != null;
let top = void 0;
if (r2) {
const image = this.top.image;
let image2 = image;
if (image != null) {
const r25 = "localDataUri" in image;
image2 = image;
if (r25) {
image.localDataUri;
image2 = _objectWithoutProperties(image, _excluded);
}
}
top = {
...this.top,
image: image2
};
}
return {
id: this.id,
data: {
type: this.type,
title: r7.stringify({
header: this.header,
top,
bottom: {
...this.bottom,
entries: this.bottom.entries.map((entry) => {
const image = entry.image;
let image2 = image;
if (image != null) {
const r10 = "localDataUri" in image;
image2 = image;
if (r10) {
image.localDataUri;
image2 = _objectWithoutProperties(image, _excluded);
}
}
return {
...entry,
image: image2
};
})
}
})
}
};
}
isDiscardable() {
return this.header.trim() === "" && (this.top == null || this.top.title.trim() === "" && this.top.subtitle.trim() === "" && this.top.image == null) && this.bottom.entries.every((entry) => entry.value.trim() === "" && entry.label.trim() === "" && entry.image == null);
}
isValid() {
return !this.isDiscardable();
}
isEqual(a0) {
return a0 instanceof UserProfilePersonalWidget && (isUndefinedOrNull(this.header, a0.header) && isUndefinedOrNull(this.top, a0.top) && isUndefinedOrNull(this.bottom, a0.bottom));
}
getUniqueKey() {
return this.type;
}
getProfileAnalyticsOptions() {
return {
widgetType: this.type
};
}
getProfileEditAnalyticsOptions() {
return {
widgetEdited: this.type
};
}
}
export function createDefaultPersonalWidgetTop() {
return {
title: "",
subtitle: ""
};
}
export { UserProfilePersonalWidget };
@@ -0,0 +1,9 @@
// Metro module 5561 (f5562).
import { compareGuildRoles } from "../../utils/GuildRoleUtils";
export function sortRolesByVerification(a0, a1) {
const guild_connections = a0.tags?.guild_connections;
const guild_connections2 = a1.tags?.guild_connections;
const r11 = guild_connections !== void 0;
const r12 = guild_connections2 !== void 0;
return r11 ? r12 ? r11 ? compareGuildRoles(a0, a1) : r12 ? -1 : compareGuildRoles(a0, a1) : 1 : r11 ? compareGuildRoles(a0, a1) : r12 ? -1 : compareGuildRoles(a0, a1);
}
@@ -0,0 +1,243 @@
// Metro module 7941 (f7942).
import GuildMemberStore from "../../stores/GuildMemberStore";
import UserStore from "../../stores/UserStore";
import UserProfileStore from "./UserProfileStore";
import isEqual from "../../_bundle/isEqual_4349";
import { getUserPrimaryGuild } from "../guild_tag/GuildTagUtils";
import Dispatcher from "../../Dispatcher";
export function setPendingChanges({ guildId, ...rest }) {
let r25, r139, r159;
const currentUser = UserStore.getCurrentUser();
if (currentUser != null) {
let r10 = UserProfileStore.getUserProfile(currentUser.id);
if (guildId != null) {
r10 = UserProfileStore.getGuildMemberProfile(currentUser.id, guildId);
}
const r11 = guildId != null ? GuildMemberStore.getMember(guildId, currentUser.id) : null;
L11: {
r25 = {};
if ("globalName" in rest) {
L10: {
if (rest.globalName !== currentUser.globalName) {
if (rest.globalName === "" && currentUser.globalName === null) {
break L10;
}
r25.pendingGlobalName = rest.globalName;
break L11;
}
}
r25.pendingGlobalName = void 0;
}
}
L21: {
if ("nickname" in rest) {
const nickname = rest.nickname;
const nick = r11?.nick;
L20: {
if (nickname !== nick) {
if (rest.nickname === "" && r11?.nick === null) {
break L20;
}
r25.pendingNickname = rest.nickname;
break L21;
}
}
r25.pendingNickname = void 0;
}
}
if ("displayNameStyles" in rest) {
const displayNameStyles = rest.displayNameStyles;
let r13 = guildId != null ? r11?.displayNameStyles : currentUser.displayNameStyles;
let r54 = displayNameStyles;
if (r54 == null) {
r54 = null;
}
if (r13 == null) {
r13 = null;
}
if (isEqual(r54, r13)) {
r25.pendingDisplayNameStyles = void 0;
} else {
r25.pendingDisplayNameStyles = displayNameStyles;
}
}
if ("pronouns" in rest) {
if (rest.pronouns === r10?.pronouns) {
r25.pendingPronouns = void 0;
} else {
r25.pendingPronouns = rest.pronouns;
}
}
L53: {
if ("avatar" in rest) {
L52: {
if (guildId != null) {
if (rest.avatar?.imageUri === r11?.avatar) {
break L52;
}
}
if (guildId == null) {
if (rest.avatar?.imageUri === currentUser.avatar) {
break L52;
}
}
r25.pendingAvatar = rest.avatar;
break L53;
}
r25.pendingAvatar = void 0;
}
}
L69: {
if ("avatarDecoration" in rest) {
L68: {
if (guildId != null) {
if (rest.avatarDecoration?.skuId === (r11 == null ? void 0 : r11.avatarDecoration?.skuId)) {
break L68;
}
}
if (guildId == null) {
if (rest.avatarDecoration?.skuId === currentUser.avatarDecoration?.skuId) {
break L68;
}
}
r25.pendingAvatarDecoration = rest.avatarDecoration;
break L69;
}
r25.pendingAvatarDecoration = void 0;
}
}
L87: {
if ("nameplate" in rest) {
L86: {
if (guildId != null) {
const skuId = rest.nameplate?.skuId;
const r98 = r11 == null;
let r99 = void 0;
if (!r98) {
const collectibles = r11.collectibles;
r99 = collectibles == null ? void 0 : collectibles.nameplate?.skuId;
}
if (skuId === r99) {
break L86;
}
}
if (guildId == null) {
const skuId2 = rest.nameplate?.skuId;
const collectibles2 = currentUser.collectibles;
if (skuId2 === (collectibles2 == null ? void 0 : collectibles2.nameplate?.skuId)) {
break L86;
}
}
r25.pendingNameplate = rest.nameplate;
break L87;
}
r25.pendingNameplate = void 0;
}
}
if ("profileEffect" in rest) {
if (rest.profileEffect?.skuId === (r10 == null ? void 0 : r10.profileEffect?.skuId)) {
r25.pendingProfileEffect = void 0;
} else {
r25.pendingProfileEffect = rest.profileEffect;
}
}
if ("profileFrame" in rest) {
if (rest.profileFrame?.skuId === (r10 == null ? void 0 : r10.profileFrame?.skuId)) {
r25.pendingProfileFrame = void 0;
} else {
r25.pendingProfileFrame = rest.profileFrame;
}
}
if ("banner" in rest) {
let banner = rest.banner;
if (banner == null) {
banner = null;
}
if (guildId != null) {
let r141 = r10?.banner;
if (r141 == null) {
r141 = null;
}
r139 = r141;
} else {
r139 = currentUser.banner;
if (r139 == null) {
r139 = null;
}
}
if (banner === r139) {
r25.pendingBanner = void 0;
r25.pendingBannerOriginalMd5 = void 0;
} else {
r25.pendingBanner = rest.banner;
let bannerOriginalMd5 = rest.bannerOriginalMd5;
if (bannerOriginalMd5 == null) {
bannerOriginalMd5 = null;
}
r25.pendingBannerOriginalMd5 = bannerOriginalMd5;
}
}
if ("accentColor" in rest) {
let accentColor = rest.accentColor;
if (accentColor == null) {
accentColor = null;
}
let r149 = r10?.accentColor;
if (r149 == null) {
r149 = null;
}
r25.pendingAccentColor = accentColor !== r149 ? accentColor : void 0;
}
if ("themeColors" in rest) {
L140: {
if (guildId != null && rest.themeColors != null && rest.themeColors[0] == null) {
const r158 = rest.themeColors[1] == null;
r159 = null;
if (r158) {
break L140;
}
}
let themeColors = rest.themeColors;
if (themeColors == null) {
themeColors = null;
}
r159 = themeColors;
}
let r163 = r10?.themeColors;
if (r163 == null) {
r163 = null;
}
if (isEqual(r159, r163)) {
r25.pendingThemeColors = void 0;
} else {
r25.pendingThemeColors = rest.themeColors;
}
}
if ("bio" in rest) {
if (rest.bio === r10?.bio) {
r25.pendingBio = void 0;
} else {
r25.pendingBio = rest.bio;
}
}
if ("primaryGuildId" in rest) {
let guildId2 = getUserPrimaryGuild(currentUser.primaryGuild).guildId;
if (guildId2 == null) {
guildId2 = null;
}
if (rest.primaryGuildId === guildId2) {
r25.pendingPrimaryGuildId = void 0;
} else {
r25.pendingPrimaryGuildId = rest.primaryGuildId;
}
}
if ("legacyUsernameDisabled" in rest) {
r25.pendingLegacyUsernameDisabled = rest.legacyUsernameDisabled;
}
Dispatcher.dispatch({
type: "USER_PROFILE_SETTINGS_SET_PENDING_CHANGES",
guildId,
...r25
});
}
}
@@ -0,0 +1,283 @@
// Metro module 7938 (f7939).
import { BIO_MAX_LENGTH, FormStates, ME, UserSettingsSections } from "../../Constants";
import { FAVORITES_RAW_GUILD_ID } from "../favorites/FavoritesConstants";
import { NOTIFICATIONS_INBOX_RAW_GUILD_ID } from "../notifications_inbox/NotificationsInboxConstants";
import { PSEUDO_GUILD_IDS } from "../routing/RouteConstants";
import Module589 from "../../_bundle/Module589";
import Dispatcher from "../../Dispatcher";
let c5011_4, c5011_5, c5011_6, c5011_7, c5011_8, c5011_9, guildId, CLOSED, c5011_12;
const handleFormOpen = function handleFormOpen() {
CLOSED = FormStates.OPEN;
c5011_12 = {};
};
const handleReset = function handleReset() {
c5011_8 = {};
c5011_12 = {};
c5011_9 = c5011_5;
CLOSED = FormStates.CLOSED;
c5011_12 = {};
};
c5011_4 = {};
c5011_5 = {};
c5011_6 = {};
c5011_7 = new Set([...PSEUDO_GUILD_IDS, FAVORITES_RAW_GUILD_ID, NOTIFICATIONS_INBOX_RAW_GUILD_ID]);
c5011_8 = {};
c5011_9 = c5011_5;
guildId = void 0;
CLOSED = FormStates.CLOSED;
c5011_12 = {};
class UserProfileSettingsStore extends Module589.Store {
static displayName = "UserProfileSettingsStore";
get selectedGuildId() {
return guildId;
}
getFormState() {
return CLOSED;
}
getErrors(a0) {
let r3 = a0;
if (a0 == null) {
r3 = ME;
}
let r4 = c5011_12[r3];
if (r4 == null) {
r4 = c5011_6;
}
return r4;
}
getPendingChanges(a0) {
let r3 = a0;
if (a0 == null) {
r3 = ME;
}
let r4 = c5011_8[r3];
if (r4 == null) {
r4 = c5011_4;
}
return r4;
}
getTryItOutChanges() {
return c5011_9;
}
hasTryItOutChanges() {
return Object.values(c5011_9).some((item) => item !== void 0);
}
hasUnsavedChanges() {
return Object.values(c5011_8).some((item) => Object.values(item).some((item) => item !== void 0));
}
showNotice() {
return !!Object.values(this.getPendingChanges(ME)).some((item) => item !== void 0) || !!Object.values(this.getPendingChanges(guildId)).some((item) => item !== void 0);
}
canSubmit() {
for (const item of [ME, guildId]) {
const pendingChanges = this.getPendingChanges(item);
if (pendingChanges.pendingBio === void 0) {
continue;
}
if (!(pendingChanges.pendingBio.length > BIO_MAX_LENGTH)) {
continue;
}
return false;
}
return true;
}
}
const userProfileSettingsStore = new UserProfileSettingsStore(Dispatcher, {
USER_SETTINGS_MODAL_INIT: handleFormOpen,
USER_SETTINGS_MODAL_OPEN: handleFormOpen,
USER_SETTINGS_MODAL_SET_SECTION: function handleSectionChange(a0) {
if (a0.section !== UserSettingsSections.ACCOUNT) {
return false;
}
CLOSED = FormStates.OPEN;
c5011_12 = {};
},
USER_PROFILE_SETTINGS_INIT: function handleInit({ guildId: guildId2 }) {
guildId = guildId2 == null ? void 0 : c5011_7.has(guildId2) ? void 0 : guildId2;
CLOSED = FormStates.OPEN;
c5011_12 = {};
},
USER_PROFILE_SETTINGS_SET_GUILD: function handleSetGuild({ guildId: guildId2 }) {
guildId = guildId2 == null ? void 0 : c5011_7.has(guildId2) ? void 0 : guildId2;
c5011_12 = {};
},
USER_PROFILE_SETTINGS_CLOSE: function handleFormClose() {
CLOSED = FormStates.CLOSED;
c5011_12 = {};
},
USER_PROFILE_SETTINGS_RESET_AND_CLOSE_FORM: handleReset,
USER_PROFILE_SETTINGS_SUBMIT: function handleFormSubmit() {
CLOSED = FormStates.SUBMITTING;
c5011_12 = {};
},
USER_PROFILE_SETTINGS_SUBMIT_SUCCESS: function handleFormSubmitSuccess({ guildId: guildId2 }) {
if (CLOSED !== FormStates.SUBMITTING) {
return false;
}
CLOSED = FormStates.OPEN;
if (guildId2 == null) {
guildId2 = ME;
}
c5011_12[guildId2] = c5011_6;
},
USER_PROFILE_SETTINGS_SUBMIT_FAILURE: function handleFormSubmitFailure(a0) {
let guildId2 = a0.guildId;
let errors = a0.errors;
if (CLOSED !== FormStates.SUBMITTING) {
return false;
}
CLOSED = FormStates.OPEN;
if (guildId2 == null) {
guildId2 = ME;
}
if (errors == null) {
errors = c5011_6;
}
c5011_12[guildId2] = errors;
},
USER_PROFILE_SETTINGS_SET_PENDING_CHANGES: function handleSetPendingChanges(a0) {
a0.type;
const { type, guildId, ...rest } = a0;
let guildId2 = a0.guildId;
const r11 = guildId2 == null ? ME : guildId2;
if (guildId2 == null) {
guildId2 = ME;
}
c5011_8[r11] = {
...c5011_8[guildId2],
...rest
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_AVATAR: function handleSetTryItOutAvatar(a0) {
c5011_9 = {
...c5011_9,
tryItOutAvatar: a0.avatar
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_AVATAR_DECORATION: function handleSetTryItOutAvatarDecoration(a0) {
c5011_9 = {
...c5011_9,
tryItOutAvatarDecoration: a0.avatarDecoration
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_PROFILE_EFFECT: function handleSetTryItOutProfileEffect(a0) {
c5011_9 = {
...c5011_9,
tryItOutProfileEffect: a0.profileEffect
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_BANNER: function handleSetTryItOutBanner(a0) {
c5011_9 = {
...c5011_9,
tryItOutBanner: a0.banner
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_THEME_COLORS: function handleSetTryItOutThemeColors(a0) {
c5011_9 = {
...c5011_9,
tryItOutThemeColors: a0.themeColors
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_DISPLAY_NAME_STYLES: function handleSetTryItOutDisplayNameStyles(a0) {
c5011_9 = {
...c5011_9,
tryItOutDisplayNameStyles: a0.displayNameStyles
};
},
USER_PROFILE_SETTINGS_SET_TRY_IT_OUT_PRESET: function handleSetTryItOutPreset(a0) {
const { banner, themeColors } = a0;
let avatarDecoration = a0.avatarDecoration;
const displayNameStyles = a0.displayNameStyles;
if (avatarDecoration === void 0) {
avatarDecoration = c5011_9.tryItOutAvatarDecoration;
}
c5011_9 = {
...c5011_9,
tryItOutBanner: banner,
tryItOutThemeColors: themeColors,
tryItOutAvatarDecoration: avatarDecoration,
tryItOutDisplayNameStyles: displayNameStyles
};
},
USER_PROFILE_SETTINGS_CLEAR_ERRORS: function handleResetErrors() {
c5011_12 = {};
},
USER_PROFILE_SETTINGS_RESET_PENDING_ACCOUNT_CHANGES: function handleResetPendingAccountChanges() {
c5011_8 = Object.fromEntries(Object.entries(c5011_8).map((item) => {
const [r23, r24] = item;
return [r23, {
...r24,
pendingGlobalName: void 0,
pendingNickname: void 0,
pendingDisplayNameStyles: void 0,
pendingAvatar: void 0,
pendingAvatarDecoration: void 0,
pendingNameplate: void 0
}];
}));
},
USER_PROFILE_SETTINGS_RESET_PENDING_PROFILE_CHANGES: function handleResetPendingProfileChanges() {
c5011_8 = Object.fromEntries(Object.entries(c5011_8).map((item) => {
const [r23, r24] = item;
return [r23, {
...r24,
pendingPronouns: void 0,
pendingProfileEffect: void 0,
pendingProfileFrame: void 0,
pendingBanner: void 0,
pendingBannerOriginalMd5: void 0,
pendingAccentColor: void 0,
pendingThemeColors: void 0,
pendingBio: void 0
}];
}));
},
USER_PROFILE_SETTINGS_RESET_PENDING_CHANGES: function handleResetPendingChanges() {
c5011_8 = {};
c5011_12 = {};
},
USER_PROFILE_SETTINGS_RESET_TRY_IT_OUT_CHANGES: function handleResetTryItOutChanges() {
c5011_9 = c5011_5;
},
USER_PROFILE_SETTINGS_RESET_PENDING_LEGACY_USERNAME_DISABLED: function handleResetPendingLegacyUsernameDisabled() {
let r5 = c5011_8[ME];
if (r5 == null) {
r5 = {};
}
if (r5?.pendingLegacyUsernameDisabled === void 0) {
return false;
}
c5011_8[ME] = {
...c5011_8[ME],
pendingLegacyUsernameDisabled: void 0
};
},
USER_PROFILE_SETTINGS_RESET_PENDING_PRIMARY_GUILD_CHANGES: function handleResetPendingPrimaryGuildChanges() {
let r5 = c5011_8[ME];
if (r5 == null) {
r5 = {};
}
if (r5?.pendingPrimaryGuildId === void 0) {
return false;
}
c5011_8[ME] = {
...c5011_8[ME],
pendingPrimaryGuildId: void 0
};
},
USER_PROFILE_UPDATE_FAILURE: function handleProfileUpdateFailure(a0) {
let guildId2 = a0.guildId;
let errors = a0.errors;
CLOSED = FormStates.OPEN;
if (guildId2 == null) {
guildId2 = ME;
}
if (errors == null) {
errors = c5011_6;
}
c5011_12[guildId2] = errors;
},
LOGOUT: handleReset
});
export default userProfileSettingsStore;
export { c5011_7 as IGNORE_GUILD_IDS };
+691
View File
@@ -0,0 +1,691 @@
// Metro module 5896 (f5897).
import LocaleStore from "../user_settings/LocaleStore";
import UserRecord from "../../records/UserRecord";
import AuthenticationStore from "../../stores/AuthenticationStore";
import GuildStore from "../../stores/GuildStore";
import MobileCacheSnapshotStore from "../../stores/MobileCacheSnapshotStore";
import PresenceStore from "../../stores/PresenceStore";
import SortedGuildStore from "../../stores/SortedGuildStore";
import { MAX_TIMEOUT_MS } from "../../Constants";
import { WidgetType } from "../../_bundle/Module5897";
import Module12 from "../../_bundle/Module12";
import { BaseGameWidget } from "./UserProfileGameWidgetTypes";
import { ApplicationWidget } from "./UserProfileApplicationWidgetTypes";
import { UserProfilePersonalWidget } from "./UserProfilePersonalWidget";
import { Timeout } from "../../_bundle/Timeout";
import { CollectiblesItemType } from "../../_bundle/Module1901";
import { parseServerUserCollectibles } from "../collectibles/utils/mappers";
import { getTieredTenureBadgeData } from "./TieredTenureBadgeUtils";
import { intl, t } from "../../intl/index.native";
import parseUserProfileCollectibles from "./utils/parseUserProfileCollectibles";
import Platforms from "../../lib/Platforms";
import { isNotNullish } from "../../utils/GlobalUtils";
function $mk77310() {
return (a0) => a0.user.username.toLowerCase();
}
function $mk77316() {
return (a0) => a0.id;
}
function $mk77317($env) {
return (a0) => !$env[0].has(a0.id);
}
let c3691_10, c3691_11, c3691_12, c3691_13, c3691_14, c3691_15, c3691_16, c3691_17, c3691_18, c3691_19, c3691_20, c3691_22, c3691_23, checkUserProfileCollectiblesExpiration, handleLogout, handleMutualFriendsFetchStart, handleMutualFriendsFetchFailure, handleMutualFriendsFetchSuccess, handleProfileFetch, handleProfileFetchStart, handleProfileFetchFailure, handleProfileUpdateStart, handleProfileUpdateSuccess, handleProfileUpdateFailure, handleWidgetsUpdateSuccess, handlePinBadgesToProfile, handleUserUpdate, handleGuildStatusChange, handleGuildMemberStatusChange, handleRelationshipStatusChange, handleLocaleStoreChange, resetProfileFetch, c3691_43, $mk77309 = function() {
return (a0) => ({
key: a0.id,
user: new UserRecord({
...a0,
collectibles: parseServerUserCollectibles(a0.collectibles)
}),
status: PresenceStore.getStatus(a0.id)
});
};
const createUserWidgetFromServer = function createUserWidgetFromServer(a0) {
let userProfilePersonalWidget;
const type = a0.data.type;
if (WidgetType.CURRENT_GAMES !== type && WidgetType.FAVORITE_GAMES !== type && WidgetType.PLAYED_GAMES !== type && WidgetType.WANT_TO_PLAY_GAMES !== type) {
if (WidgetType.APPLICATION === type) {
return new ApplicationWidget({
id: a0.id,
applicationId: a0.data.application_id
});
}
if (WidgetType.PERSONAL === type) {
if (a0.data.title == null) {
return void 0;
}
try {
const r43 = JSON.parse(a0.data.title);
userProfilePersonalWidget = new UserProfilePersonalWidget({
id: a0.id,
header: r43.header,
top: r43.top,
bottom: r43.bottom
});
} catch ($e) {
return void 0;
}
return userProfilePersonalWidget;
}
return void 0;
}
return new BaseGameWidget({
id: a0.id,
type,
games: Module12.uniqBy(a0.data.games.map((game) => ({
applicationId: game.game_id,
comment: game.comment,
tags: game.tags
})), "applicationId")
});
};
checkUserProfileCollectiblesExpiration = function checkUserProfileCollectiblesExpiration(a0, guild_id) {
let r12;
let c15241_3;
if (guild_id != null) {
const r10 = c3691_14.get(a0);
r12 = r10 == null ? void 0 : r10.get(guild_id);
} else {
r12 = c3691_13.get(a0);
}
let c15241_2 = r12;
if (r12?.collectibles != null) {
const r18 = [];
c15241_3 = r18;
r12.collectibles.forEach((collectible) => {
if (collectible.expiresAt != null) {
const r10 = collectible.expiresAt.getTime() - Date.now();
if (r10 <= 0) {
c15241_3.push(collectible);
} else {
if (c3691_15[a0] == null) {
const r25 = {};
r25[c3691_10] = {};
c3691_15[a0] = r25;
}
const r26 = c3691_15[a0];
let r27 = guild_id;
if (r26[r27 == null ? c3691_10 : r27] == null) {
c3691_15[a0][r27 == null ? c3691_10 : r27] = {};
}
if (c3691_15[a0][r27 == null ? c3691_10 : r27][collectible.skuId] == null) {
c3691_15[a0][r27 == null ? c3691_10 : r27][collectible.skuId] = new Timeout();
}
const r48 = c3691_15[a0];
if (r27 == null) {
r27 = c3691_10;
}
r48[r27][collectible.skuId].start(Math.min(MAX_TIMEOUT_MS, r10), () => {
checkUserProfileCollectiblesExpiration(a0, guild_id);
});
}
}
});
if (r18.length !== 0) {
r12.collectibles = r12.collectibles.filter((collectible) => !c15241_3.includes(collectible));
r18.forEach((item) => {
if (item.type === CollectiblesItemType.PROFILE_EFFECT) {
c15241_2.profileEffect = void 0;
} else if (item.type === CollectiblesItemType.PROFILE_FRAME) {
c15241_2.profileFrame = void 0;
}
const r21 = c3691_15[a0];
if (r21 != null) {
let r22 = guild_id;
if (r22 == null) {
r22 = c3691_10;
}
const r23 = r21[r22];
if (r23 != null) {
delete r23[item.skuId];
}
}
});
if ("guildId" in r12) {
const r38 = c3691_14.get(a0);
if (r38 != null) {
r38.set(r12.guildId, r12);
}
} else {
c3691_13.set(a0, r12);
}
c3691_43.emitChange();
}
}
};
handleLogout = function handleLogout() {
c3691_11.clear();
c3691_12.clear();
c3691_13.clear();
c3691_14.clear();
c3691_16.clear();
c3691_17.clear();
c3691_18.clear();
c3691_22 = false;
};
handleMutualFriendsFetchStart = function handleMutualFriendsFetchStart(a0) {
c3691_12.add(a0.userId);
};
handleMutualFriendsFetchFailure = function handleMutualFriendsFetchFailure(a0) {
c3691_12.delete(a0.userId);
};
handleMutualFriendsFetchSuccess = function handleMutualFriendsFetchSuccess(a0) {
c3691_12.delete(a0.userId);
c3691_16.set(a0.userId, Module12(a0.mutualFriends).map($mk77309()).sortBy($mk77310()).value());
c3691_17.set(a0.userId, a0.mutualFriends.length);
};
handleProfileFetch = function handleProfileFetch(a0) {
let c15242_0, date, date2;
const { userProfile, fetchStartedAt } = a0;
let guildId = a0.guildId;
c15242_0 = void 0;
date = void 0;
date2 = void 0;
if (guildId == null) {
guildId = userProfile.guild_member_profile?.guild_id;
}
if (guildId == null) {
guildId = c3691_10;
}
const r31 = c3691_11.get(userProfile.user.id);
if (r31 != null) {
r31.delete(guildId);
}
c3691_12.delete(userProfile.user.id);
if (userProfile.mutual_guilds != null) {
c15242_0 = {};
userProfile.mutual_guilds.forEach(({ id, nick }) => {
const guild = GuildStore.getGuild(id);
if (guild != null) {
c15242_0[id] = {
guild,
nick
};
}
});
c3691_18.set(userProfile.user.id, SortedGuildStore.getFlattenedGuildIds().filter((item) => c15242_0[item] != null).map((item) => ({
guild: c15242_0[item].guild,
nick: c15242_0[item].nick
})));
}
if (userProfile.mutual_friends_count != null) {
const mutual_friends_count = userProfile.mutual_friends_count;
c3691_17.set(userProfile.user.id, mutual_friends_count);
if (mutual_friends_count === 0) {
c3691_16.set(userProfile.user.id, c3691_19);
}
}
if (userProfile.mutual_friends != null) {
c3691_16.set(userProfile.user.id, Module12(userProfile.mutual_friends).map($mk77309()).sortBy($mk77310()).value());
c3691_17.set(userProfile.user.id, userProfile.mutual_friends.length);
}
date = userProfile.premium_since != null ? new Date(userProfile.premium_since) : null;
date2 = userProfile.premium_guild_since != null ? new Date(userProfile.premium_guild_since) : null;
const application = userProfile.application;
const badges = userProfile.badges != null ? userProfile.badges.map((badge) => {
const tieredTenureBadgeData = getTieredTenureBadgeData(badge.id);
if (!(badge.id !== "premium" && tieredTenureBadgeData == null) && date != null) {
let description = intl.formatToPlainString(t["8zbGNR"], {
date
});
if (tieredTenureBadgeData != null) {
description = intl.formatToPlainString(t.Hu4jfi, {
date
});
}
return {
...badge,
description
};
}
return badge.id.startsWith("guild_booster_lvl") ? date2 != null ? {
...badge,
description: intl.formatToPlainString(t.IWkAq7, {
date: date2
})
} : badge : badge;
}) : [];
if (c3691_23 != null && c3691_23.userId === userProfile.user.id) {
if (Date.now() > c3691_23.expiresAtMs) {
c3691_23 = null;
} else {
const r127 = c3691_23;
if (badges != null) {
let env15243;
const r128 = env15243 = {};
env15243[0] = new Set(badges.map($mk77316()));
const r138 = r127 == null ? void 0 : r127.badges.filter($mk77317(r128));
if (r138.length > 0) {
badges.push.apply(badges, [...r138]);
}
}
}
}
const fetchEndedAt = Date.now();
const id = userProfile.user.id;
const r159 = {
...parseUserProfileCollectibles(userProfile.user_profile),
userId: userProfile.user.id,
banner: userProfile.user_profile?.banner,
accentColor: userProfile.user_profile?.accent_color,
themeColors: userProfile.user_profile?.theme_colors,
popoutAnimationParticleType: userProfile.user_profile?.popout_animation_particle_type
};
let bio = userProfile.user_profile?.bio;
if (bio == null) {
bio = "";
}
r159.bio = bio;
let pronouns = userProfile.user_profile?.pronouns;
if (pronouns == null) {
pronouns = "";
}
r159.pronouns = pronouns;
let connectedAccounts = userProfile.connected_accounts.filter((connected_account) => Platforms.isSupported(connected_account.type));
if (connectedAccounts == null) {
connectedAccounts = [];
}
r159.connectedAccounts = connectedAccounts;
let application_role_connections = userProfile.application_role_connections;
if (application_role_connections == null) {
application_role_connections = [];
}
r159.applicationRoleConnections = application_role_connections;
r159.premiumSince = date;
r159.premiumType = userProfile.premium_type;
r159.premiumGuildSince = date2;
r159.fetchStartedAt = fetchStartedAt;
r159.fetchEndedAt = fetchEndedAt;
r159.legacyUsername = userProfile.legacy_username;
r159.application = application != null ? {
id: application.id,
primarySkuId: application.primary_sku_id,
customInstallUrl: application.custom_install_url,
installParams: application.install_params,
integrationTypesConfig: application.integration_types_config,
flags: application.flags,
popularApplicationCommandIds: application.popular_application_command_ids,
storefront_available: application.storefront_available,
name: application.name,
termsOfServiceUrl: application.terms_of_service_url,
privacyPolicyUrl: application.privacy_policy_url
} : null;
r159.badges = badges;
const widgets = userProfile.widgets;
r159.widgets = widgets == null ? void 0 : widgets.map(createUserWidgetFromServer).filter(isNotNullish);
r159.wishlistSettings = userProfile.wishlist_settings;
r159.private = userProfile.private;
c3691_13.set(id, r159);
checkUserProfileCollectiblesExpiration(userProfile.user.id);
if (userProfile.guild_member_profile != null) {
const r226 = {
...parseUserProfileCollectibles(userProfile.guild_member_profile),
userId: userProfile.user.id,
guildId: userProfile.guild_member_profile.guild_id,
banner: userProfile.guild_member_profile.banner,
accentColor: userProfile.guild_member_profile.accent_color,
themeColors: userProfile.guild_member_profile?.theme_colors,
popoutAnimationParticleType: userProfile.guild_member_profile?.popout_animation_particle_type,
bio: userProfile.guild_member_profile.bio,
pronouns: userProfile.guild_member_profile.pronouns,
badges: userProfile.guild_badges,
fetchStartedAt,
fetchEndedAt
};
const r256 = c3691_14.get(userProfile.user.id);
if (r256 != null) {
r256.set(userProfile.guild_member_profile.guild_id, r226);
} else {
const map = new Map();
map.set(userProfile.guild_member_profile.guild_id, r226);
c3691_14.set(userProfile.user.id, map);
}
checkUserProfileCollectiblesExpiration(userProfile.user.id, userProfile.guild_member_profile.guild_id);
}
};
handleProfileFetchStart = function handleProfileFetchStart(a0) {
const userId = a0.userId;
let guildId = a0.guildId;
const withMutualFriends = a0.withMutualFriends;
if (guildId == null) {
guildId = c3691_10;
}
const r5 = c3691_11.get(userId);
if (r5 != null) {
r5.add(guildId);
} else {
const set = new Set();
set.add(guildId);
c3691_11.set(userId, set);
}
if (withMutualFriends) {
c3691_12.add(userId);
}
};
handleProfileFetchFailure = function handleProfileFetchFailure({ userId, guildId, apiError, fetchStartedAt }) {
const r9 = c3691_11.get(userId);
if (r9 != null) {
let r14 = guildId;
if (r14 == null) {
r14 = c3691_10;
}
r9.delete(r14);
}
c3691_12.delete(userId);
let r20 = c3691_13.get(userId);
if (r20 == null) {
r20 = {
connectedAccounts: [],
applicationRoleConnections: [],
premiumSince: null,
premiumGuildSince: null,
application: null,
legacyUsername: null,
userId,
banner: null,
accentColor: null,
bio: "",
pronouns: "",
premiumType: null,
fetchStartedAt: 0,
fetchEndedAt: 0,
fetchError: void 0
};
}
const fetchEndedAt = Date.now();
r20.fetchStartedAt = fetchStartedAt;
r20.fetchEndedAt = fetchEndedAt;
r20.fetchError = apiError;
c3691_13.set(userId, r20);
if (guildId != null) {
const r32 = c3691_14.get(userId);
const r33 = r32 == null ? void 0 : r32.get(guildId);
if (r33 != null) {
r33.fetchStartedAt = fetchStartedAt;
r33.fetchEndedAt = fetchEndedAt;
r33.fetchError = apiError;
}
}
if (apiError?.status === 404) {
c3691_17.set(userId, 0);
c3691_16.set(userId, c3691_19);
c3691_18.set(userId, c3691_20);
}
};
handleProfileUpdateStart = function handleProfileUpdateStart() {
c3691_22 = true;
};
handleProfileUpdateSuccess = function handleProfileUpdateSuccess(a0) {
c3691_22 = false;
if (a0.guild_id != null) {
const { userId: userId2, guild_id, accent_color: accent_color2, banner: banner2, bio: bio2, pronouns: pronouns2, popout_animation_particle_type: popout_animation_particle_type2, theme_colors: theme_colors2, collectibles: collectibles2 } = a0;
const r45 = c3691_14.get(userId2);
if (guild_id != null && r45 != null) {
const r47 = r45.get(guild_id);
if (r47 != null) {
r45.set(guild_id, {
...r47,
...parseUserProfileCollectibles({
collectibles: collectibles2
}),
accentColor: accent_color2,
banner: banner2,
bio: bio2,
pronouns: pronouns2,
popoutAnimationParticleType: popout_animation_particle_type2,
themeColors: theme_colors2
});
checkUserProfileCollectiblesExpiration(userId2, guild_id);
}
}
} else {
const { userId, accent_color, banner, bio, pronouns, popout_animation_particle_type, theme_colors, collectibles } = a0;
const r15 = c3691_13.get(userId);
if (r15 != null) {
c3691_13.set(userId, {
...r15,
...parseUserProfileCollectibles({
collectibles
}),
accentColor: accent_color,
banner,
bio,
pronouns,
popoutAnimationParticleType: popout_animation_particle_type,
themeColors: theme_colors
});
checkUserProfileCollectiblesExpiration(userId);
}
}
};
handleProfileUpdateFailure = function handleProfileUpdateFailure() {
c3691_22 = false;
};
handleWidgetsUpdateSuccess = function handleWidgetsUpdateSuccess({ userId, widgets }) {
const r6 = c3691_13.get(userId);
if (r6 == null) {
return false;
}
c3691_13.set(userId, {
...r6,
widgets: widgets.map(createUserWidgetFromServer).filter(isNotNullish)
});
};
handlePinBadgesToProfile = function handlePinBadgesToProfile({ badges, ttlInSeconds, userId }) {
c3691_23 = {
userId,
badges,
expiresAtMs: Date.now() + 1000 * ttlInSeconds
};
const r23 = c3691_13.get(userId);
if (r23 != null) {
let badges2 = r23.badges;
if (badges2 == null) {
badges2 = [];
}
const r25 = c3691_23;
if (badges2 != null) {
let env15244;
const r26 = env15244 = {};
const r11 = Set;
const map = badges2.map;
let r27 = void 0;
env15244[0] = new r11(map.call(badges2, $mk77316()));
if (r25 != null) {
r27 = r25.badges.filter($mk77317(r26));
}
if (r27.length > 0) {
badges2.push.apply(badges2, [...r27]);
}
}
c3691_13.set(userId, {
...r23,
badges: badges2
});
}
};
handleUserUpdate = function handleUserUpdate(a0) {
const id = a0.user.id;
let r10 = c3691_11.get(id)?.size;
if (r10 == null) {
r10 = 0;
}
return !(r10 > 0) && resetProfileFetch(id);
};
handleGuildStatusChange = function handleGuildStatusChange() {
return [...c3691_13.keys()].reduce((acc, item) => resetProfileFetch(item) || acc, false);
};
handleGuildMemberStatusChange = function handleGuildMemberStatusChange(a0) {
return resetProfileFetch(a0.user.id);
};
handleRelationshipStatusChange = function handleRelationshipStatusChange(a0) {
return resetProfileFetch(a0.relationship.id);
};
handleLocaleStoreChange = function handleLocaleStoreChange() {
c3691_11.clear();
c3691_12.clear();
c3691_13.clear();
c3691_14.clear();
};
resetProfileFetch = function resetProfileFetch(id) {
if (id == null) {
return false;
}
const r4 = c3691_13.get(id);
if (r4 == null) {
return false;
}
r4.fetchStartedAt = 0;
r4.fetchEndedAt = 0;
r4.fetchError = void 0;
const r21 = c3691_14.get(id);
if (r21 != null) {
for (const item of r21.values()) {
item.fetchStartedAt = 0;
item.fetchEndedAt = 0;
item.fetchError = void 0;
}
}
};
c3691_10 = Symbol("NO GUILD ID");
c3691_11 = new Map();
c3691_12 = new Set();
c3691_13 = new Map();
c3691_14 = new Map();
c3691_15 = {};
c3691_16 = new Map();
c3691_17 = new Map();
c3691_18 = new Map();
c3691_19 = [];
c3691_20 = [];
c3691_22 = false;
c3691_23 = null;
class UserProfileStore extends MobileCacheSnapshotStore {
static displayName = "UserProfileStore";
static LATEST_SNAPSHOT_VERSION = 1;
constructor() {
let c15246_0;
const r9 = {
CACHE_LOADED_LAZY: () => this.loadCache(),
USER_PROFILE_FETCH_START: handleProfileFetchStart,
USER_PROFILE_FETCH_FAILURE: handleProfileFetchFailure,
USER_PROFILE_FETCH_SUCCESS: handleProfileFetch,
USER_PROFILE_UPDATE_START: handleProfileUpdateStart,
USER_PROFILE_UPDATE_SUCCESS: handleProfileUpdateSuccess,
USER_PROFILE_UPDATE_FAILURE: handleProfileUpdateFailure,
WIDGET_PENDING_SAVE_SUCCESS: handleWidgetsUpdateSuccess,
USER_PROFILE_PIN_BADGES_ON_CLIENT: handlePinBadgesToProfile,
MUTUAL_FRIENDS_FETCH_START: handleMutualFriendsFetchStart,
MUTUAL_FRIENDS_FETCH_SUCCESS: handleMutualFriendsFetchSuccess,
MUTUAL_FRIENDS_FETCH_FAILURE: handleMutualFriendsFetchFailure,
USER_UPDATE: handleUserUpdate,
GUILD_MEMBER_UPDATE: handleUserUpdate,
GUILD_JOIN: handleGuildStatusChange,
GUILD_DELETE: handleGuildStatusChange,
INVITE_ACCEPT_SUCCESS: handleGuildStatusChange,
GUILD_MEMBER_ADD: handleGuildMemberStatusChange,
GUILD_MEMBER_REMOVE: handleGuildMemberStatusChange,
RELATIONSHIP_ADD: handleRelationshipStatusChange,
RELATIONSHIP_REMOVE: handleRelationshipStatusChange,
RELATIONSHIP_UPDATE: handleRelationshipStatusChange,
LOGOUT: handleLogout
};
super(r9);
c15246_0 = this;
this.loadCache = () => {
const r7 = c15246_0.readSnapshot(UserProfileStore.LATEST_SNAPSHOT_VERSION);
if (r7 != null) {
r7.forEach(({ userId, profile }) => {
if (userId != null) {
if (profile != null) {
c3691_13.set(userId, profile);
} else {
c3691_13.delete(userId);
}
}
});
}
};
}
initialize() {
this.waitFor(SortedGuildStore);
this.syncWith([LocaleStore], handleLocaleStoreChange);
}
isFetchingProfile(a0, a1) {
const r4 = c3691_11.get(a0);
return r4 != null && r4.has(a1 == null ? c3691_10 : a1);
}
isFetchingFriends(a0) {
return c3691_12.has(a0);
}
get isSubmitting() {
return c3691_22;
}
getUserProfile(a0) {
return c3691_13.get(a0);
}
getGuildMemberProfile(a0, a1) {
const r1 = a1 == null;
let r2 = null;
if (!r1) {
const r8 = c3691_14.get(a0);
let r10 = r8 == null ? void 0 : r8.get(a1);
if (r10 == null) {
r10 = null;
}
r2 = r10;
}
return r2;
}
getMutualFriends(a0) {
return c3691_16.get(a0);
}
getMutualFriendsCount(a0) {
return c3691_17.get(a0);
}
getMutualGuilds(a0) {
return c3691_18.get(a0);
}
getWidgets(a0) {
return c3691_13.get(a0)?.widgets;
}
getWishlistIds(a0) {
const r7 = c3691_13.get(a0);
return r7?.wishlistSettings != null ? Object.keys(r7.wishlistSettings) : [];
}
getFirstWishlistId(a0) {
if (a0 == null) {
return null;
}
const wishlistIds = this.getWishlistIds(a0);
return wishlistIds.length > 0 ? wishlistIds[0] : null;
}
getWishlistSettings(a0, a1) {
const r7 = c3691_13.get(a0);
const r2 = r7 == null;
let r8 = void 0;
if (!r2) {
const wishlistSettings = r7.wishlistSettings;
r8 = wishlistSettings == null ? void 0 : wishlistSettings[a1];
}
if (r8 == null) {
r8 = null;
}
return r8;
}
takeSnapshot() {
const id = AuthenticationStore.getId();
const profile = c3691_13.get(id);
return profile != null ? {
version: UserProfileStore.LATEST_SNAPSHOT_VERSION,
data: [{
userId: id,
profile
}]
} : {
version: UserProfileStore.LATEST_SNAPSHOT_VERSION,
data: []
};
}
}
c3691_43 = new UserProfileStore();
export default c3691_43;
@@ -0,0 +1,25 @@
// Metro module 5902 (f5903).
import ApplicationStore from "../applications/ApplicationStore";
import { WidgetType } from "../../_bundle/Module5897";
import { intl, t } from "../../intl/index.native";
const r18 = [WidgetType.PERSONAL, WidgetType.CLIPS_GALLERY, WidgetType.APPLICATION, WidgetType.FAVORITE_GAMES, WidgetType.PLAYED_GAMES, WidgetType.CURRENT_GAMES, WidgetType.WANT_TO_PLAY_GAMES];
const r43 = {};
r43[WidgetType.FAVORITE_GAMES] = () => intl.string(t.sUQar8);
r43[WidgetType.CURRENT_GAMES] = () => intl.string(t.SqNnus);
r43[WidgetType.WANT_TO_PLAY_GAMES] = () => intl.string(t.bWSQwW);
r43[WidgetType.PLAYED_GAMES] = () => intl.string(t.scOKET);
r43[WidgetType.APPLICATION] = (a0) => {
let r8 = ApplicationStore.getApplication(a0.applicationId)?.name;
if (r8 == null) {
r8 = "";
}
return r8;
};
r43[WidgetType.PERSONAL] = () => intl.string(t.AVkYMx);
r43[WidgetType.CLIPS_GALLERY] = () => intl.string(t.zY8Ghg);
const r83 = [WidgetType.FAVORITE_GAMES];
const r88 = [WidgetType.CURRENT_GAMES, WidgetType.FAVORITE_GAMES, WidgetType.CLIPS_GALLERY];
export { r18 as WIDGET_SORT_ORDER };
export { r43 as WIDGET_TITLES_BY_TYPE };
export { r83 as WIDGETS_SUPPORTING_COMMENT };
export { r88 as WIDGETS_SUPPORTING_TAGS };
@@ -0,0 +1,178 @@
// Metro module 5903 (f5904).
import UserStore from "../../stores/UserStore";
import { Endpoints } from "../../Constants";
import Dispatcher from "../../Dispatcher";
import { HTTP } from "../../_bundle/sendRequest";
import SentryUtils_native from "../../utils/SentryUtils.native";
const r20 = {
setPendingWidgets: (a0) => {
Dispatcher.dispatch({
type: "WIDGET_PENDING_SET",
widgets: a0
});
},
savePendingWidgets: async (c15259_0) => {
let body;
let c25639_0, c25639_1, c25639_2;
let c25639_3 = 0;
const r11 = void 0;
L14: {
try {
let env29631;
c25639_1 = r11;
const r16 = env29631 = {};
c25639_0 = r16;
env29631[0] = void 0;
env29631[1] = void 0;
const id = UserStore.getCurrentUser()?.id;
env29631[0] = id;
if (id != null) {
Dispatcher.dispatch({
type: "WIDGET_PENDING_SAVE_START"
});
const widgets = c15259_0.map((item) => item.toSubmission());
c25639_3 = 1;
env29631[1] = await HTTP.put({
url: Endpoints.USER_PROFILE_WIDGETS,
body: {
widgets
},
oldFormErrors: true,
rejectWithError: true
});
Dispatcher.dispatch({
type: "WIDGET_PENDING_SAVE_SUCCESS",
userId: env29631[0],
widgets: env29631[1].body.widgets
});
body = env29631[1].body;
c25639_3 = 0;
break L14;
}
} catch ($e) {
const r26 = $e;
let r8 = r26;
c25639_2 = r26;
if (c25639_3 !== 0) {
while (true) {
try {
const r94 = c25639_2;
c25639_3 = 0;
env29631[2] = r94;
Dispatcher.dispatch({
type: "WIDGET_PENDING_SAVE_FAILURE"
});
throw env29631[2];
} catch (r90) {
r8 = r90;
c25639_2 = r90;
if (c25639_3 === 0) {
break;
}
}
}
}
throw r8;
}
return void 0;
}
return body;
},
clearPendingWidgets: () => {
Dispatcher.dispatch({
type: "WIDGET_PENDING_CLEAR"
});
},
uploadWidgetAsset: async (c15260_0) => {
let c25640_1;
c25640_1 = void 0;
let c29632_0 = (await HTTP.post({
url: Endpoints.USER_PROFILE_WIDGET_ASSET_UPLOAD,
body: {
filename: c15260_0.name,
file_size: c15260_0.size
},
rejectWithError: true
})).body;
let c29632_1 = c29632_0.upload_url;
let c29632_2 = c29632_0.upload_filename;
let c29632_3 = await fetch(c29632_1, {
method: "PUT",
body: c15260_0,
headers: {
"Content-Type": c15260_0.type !== "" ? c15260_0.type : "application/octet-stream"
}
});
if (!c29632_3.ok) {
throw new Error(`Failed to upload widget asset: ${c29632_3.status}`);
}
return c29632_2;
},
fetchSuggestedGames: async () => {
let suggested_games, suggested_wishlist_games, c25641_4;
let c25641_5 = 0;
let c29633_0, c29633_1;
try {
c29633_0 = void 0;
Dispatcher.dispatch({
type: "WIDGET_SUGGESTED_FETCH_START"
});
c25641_5 = 1;
c29633_0 = await HTTP.get({
url: Endpoints.USER_PROFILE_SUGGESTED_GAMES,
rejectWithError: true
});
if (!(c29633_0.body?.suggested_games != null && c29633_0.body?.suggested_wishlist_games != null)) {
SentryUtils_native.captureMessage("Suggested games or wishlist games not found");
}
const suggested_games2 = c29633_0.body?.suggested_games;
suggested_games = suggested_games2;
if (suggested_games2 == null) {
suggested_games = [];
}
const suggested_wishlist_games2 = c29633_0.body?.suggested_wishlist_games;
suggested_wishlist_games = suggested_wishlist_games2;
if (suggested_wishlist_games2 == null) {
suggested_wishlist_games = [];
}
Dispatcher.dispatch({
type: "WIDGET_SUGGESTED_FETCH_SUCCESS",
suggestedGamesIds: suggested_games,
suggestedWishlistGamesIds: suggested_wishlist_games
});
c25641_5 = 0;
} catch ($e) {
const r27 = $e;
let r8 = r27;
c25641_4 = r27;
if (c25641_5 !== 0) {
while (true) {
try {
const r107 = c25641_4;
c25641_5 = 0;
c29633_1 = r107;
Dispatcher.dispatch({
type: "WIDGET_SUGGESTED_FETCH_FAILURE"
});
SentryUtils_native.captureException(c29633_1);
throw c29633_1;
} catch (r103) {
r8 = r103;
c25641_4 = r103;
if (c25641_5 === 0) {
break;
}
}
}
}
throw r8;
}
},
removeGameFromSuggestedGames: (a0) => {
Dispatcher.dispatch({
type: "WIDGET_SUGGESTED_REMOVE_GAME",
applicationId: a0
});
}
};
export default r20;
+169
View File
@@ -0,0 +1,169 @@
// Metro module 5901 (f5902).
import UserStore from "../../stores/UserStore";
import UserProfileStore from "./UserProfileStore";
import Module589 from "../../_bundle/Module589";
import Module12 from "../../_bundle/Module12";
import Dispatcher from "../../Dispatcher";
let widgets = null;
let c3694_6 = null;
let c3694_7 = false;
let c3694_8 = {
suggestedGamesIds: [],
suggestedWishlistGamesIds: []
};
let c3694_9 = false;
let c3694_10 = false;
let c3694_11 = false;
class WidgetStore extends Module589.Store {
initialize() {
this.waitFor(UserStore);
}
getPendingWidgets() {
return widgets;
}
getSaveablePendingWidgets() {
return widgets != null ? widgets.filter((widget) => !widget.isDiscardable()) : null;
}
hasPendingChanges() {
return widgets !== null && (c3694_6 === null || !Module12.isEqual(widgets, c3694_6));
}
getWidgetUpdates() {
let r94;
let changedWidgets = this.getSaveablePendingWidgets();
if (changedWidgets != null && c3694_6 != null) {
const map2 = new Map(c3694_6.map((item) => [item.id, item]));
const map = new Map(changedWidgets.map((changedWidget) => [changedWidget.id, changedWidget]));
const changedWidgets2 = [];
const removedWidgets = [];
for (const item of map) {
const [r52, r53] = item;
const r55 = map2.get(r52);
if (!(r55 != null && r53.isEqual(r55))) {
changedWidgets2.push(r53);
}
}
for (const item2 of map2) {
const [r71, r72] = item2;
if (!map.has(r71)) {
removedWidgets.push(r72);
}
}
const length = changedWidgets.length;
let r80 = 0;
const r81 = 0 < length;
let hasOrderChanges = false;
if (r81) {
do {
const r84 = changedWidgets[r80];
const r85 = r84 == null;
const r86 = r80;
const r87 = r85 ? void 0 : r84.id;
const id = c3694_6[r86]?.id;
hasOrderChanges = true;
if (r87 !== id) {
break;
}
const r92 = r86 + 1;
r94 = r92 < changedWidgets.length;
r80 = r92;
hasOrderChanges = false;
} while (r94);
}
return {
changedWidgets: changedWidgets2,
removedWidgets,
hasOrderChanges
};
}
if (changedWidgets == null) {
changedWidgets = [];
}
return {
changedWidgets,
removedWidgets: [],
hasOrderChanges: false
};
}
getChangedWidgets() {
return this.getWidgetUpdates().changedWidgets;
}
getRemovedWidgets() {
return this.getWidgetUpdates().removedWidgets;
}
hasUnsavedChanges() {
const widgetUpdates = this.getWidgetUpdates();
const { changedWidgets, removedWidgets, hasOrderChanges } = widgetUpdates;
return changedWidgets.length > 0 || removedWidgets.length > 0 || hasOrderChanges;
}
canSaveChanges() {
const saveablePendingWidgets = this.getSaveablePendingWidgets();
return saveablePendingWidgets != null && saveablePendingWidgets.every((saveablePendingWidget) => saveablePendingWidget.isValid());
}
get isSubmitting() {
return c3694_7;
}
get suggestedFetchError() {
return c3694_9;
}
get suggestedFetchIsLoading() {
return c3694_10;
}
get suggestedFetchAttempted() {
return c3694_11;
}
get suggestedGameIds() {
return c3694_8;
}
}
const widgetStore = new WidgetStore(Dispatcher, {
WIDGET_PENDING_SET: function handleSetPendingWidgets(a0) {
widgets = a0.widgets;
if (c3694_6 === null) {
const currentUser = UserStore.getCurrentUser();
if (currentUser != null) {
let r13 = UserProfileStore.getUserProfile(currentUser.id)?.widgets;
if (r13 == null) {
r13 = [];
}
c3694_6 = r13;
}
}
},
WIDGET_PENDING_SAVE_START: function handleSavePendingWidgetsStart() {
c3694_7 = true;
},
WIDGET_PENDING_SAVE_SUCCESS: function handleSavePendingWidgetsSuccess() {
c3694_7 = false;
if (widgets !== null) {
c3694_6 = null;
widgets = null;
}
},
WIDGET_PENDING_SAVE_FAILURE: function handleSavePendingWidgetsFailure() {
c3694_7 = false;
},
WIDGET_SUGGESTED_FETCH_SUCCESS: function handleSetSuggestedGameIds({ suggestedGamesIds, suggestedWishlistGamesIds }) {
c3694_8.suggestedGamesIds = suggestedGamesIds;
c3694_8.suggestedWishlistGamesIds = suggestedWishlistGamesIds;
c3694_10 = false;
c3694_9 = false;
},
WIDGET_SUGGESTED_FETCH_FAILURE: function handleSetSuggestedFetchFailure() {
c3694_9 = true;
c3694_10 = false;
},
WIDGET_SUGGESTED_FETCH_START: function handleSetSuggestedFetchStart() {
c3694_10 = true;
c3694_9 = false;
c3694_11 = true;
},
WIDGET_PENDING_CLEAR: function handleClearPendingWidgets() {
widgets = null;
c3694_6 = null;
},
WIDGET_SUGGESTED_REMOVE_GAME: function handleRemoveApplicationIdFromSuggestedGames({ applicationId }) {
c3694_8.suggestedGamesIds = c3694_8.suggestedGamesIds.filter((suggestedGamesId) => suggestedGamesId !== applicationId);
c3694_8.suggestedWishlistGamesIds = c3694_8.suggestedWishlistGamesIds.filter((suggestedWishlistGamesId) => suggestedWishlistGamesId !== applicationId);
}
});
export default widgetStore;
+441
View File
@@ -0,0 +1,441 @@
// Metro module 5900 (f5901).
import _slicedToArray from "../../_bundle/_slicedToArray";
import UserStore from "../../stores/UserStore";
import UserProfileStore from "./UserProfileStore";
import WidgetStore from "./WidgetStore";
import { WIDGETS_SUPPORTING_COMMENT, WIDGETS_SUPPORTING_TAGS, WIDGET_TITLES_BY_TYPE } from "./UserProfileWidgetConstants";
import { GAME_WIDGET_LIMITS_BY_TYPE, GAME_WIDGET_BANNED_APPLICATION_IDS } from "../../_bundle/Module5899";
import { intl, t } from "../../intl/index.native";
import { isGameWidget, BaseGameWidget } from "./UserProfileGameWidgetTypes";
import WidgetActionCreators from "./WidgetActionCreators";
import { UserProfilePersonalWidget, createDefaultPersonalWidgetTop } from "./UserProfilePersonalWidget";
import { WidgetGameTag } from "../../_bundle/Module5905";
import { useGame } from "../games/hooks/useGame";
import * as _utils from "../content_classification/utils";
import { HermesBuiltin } from "../../_hermes/prelude";
function $mk77324($env) {
return (a0) => a0.applicationId === $env[0];
}
function $mk77325($env) {
return (a0) => {
const r1 = $env;
return a0.applicationId === r1[0] ? r1[1] : a0;
};
}
let replaceWidgetInList;
const findGameWidget = function findGameWidget(c15247_0) {
let r16;
if (WidgetStore.hasPendingChanges()) {
let r18 = WidgetStore.getPendingWidgets();
if (r18 == null) {
r18 = [];
}
r16 = r18;
} else {
const currentUser = UserStore.getCurrentUser();
r16 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r16 == null) {
r16 = [];
}
}
let r30 = r16.filter(isGameWidget).find((item) => item.type === c15247_0);
if (r30 == null) {
r30 = null;
}
return r30;
};
replaceWidgetInList = function replaceWidgetInList(a0) {
let r20;
if (WidgetStore.hasPendingChanges()) {
let r22 = WidgetStore.getPendingWidgets();
if (r22 == null) {
r22 = [];
}
r20 = r22;
} else {
const currentUser = UserStore.getCurrentUser();
r20 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r20 == null) {
r20 = [];
}
}
const r26 = r20.findIndex((item) => item.getUniqueKey() === a0.getUniqueKey());
const r27 = r20;
if (r26 === -1) {
return [a0, ...r27];
}
const r28 = [...r27];
r28[r26] = a0;
return r28;
};
export function getWidgetTitle(a0) {
return WIDGET_TITLES_BY_TYPE[a0.type](a0);
}
export function getGameWidgetSubtitle(a0, { showEditingControls }) {
const r1 = a0.games.length > 0;
if (showEditingControls && r1) {
return GAME_WIDGET_LIMITS_BY_TYPE[a0.type] === 1 ? intl.string(t.wiXdEa) : intl.format(t["zR1+0/"], {
numGames: GAME_WIDGET_LIMITS_BY_TYPE[a0.type]
});
}
}
export function widgetSupportsComment(a0) {
return WIDGETS_SUPPORTING_COMMENT.includes(a0);
}
export function widgetSupportsTags(a0) {
return WIDGETS_SUPPORTING_TAGS.includes(a0);
}
export function widgetMaxGames(a0) {
return a0 in GAME_WIDGET_LIMITS_BY_TYPE ? GAME_WIDGET_LIMITS_BY_TYPE[a0] : 0;
}
export function getRandomElement(a0) {
return a0[Math.floor(Math.random() * a0.length)];
}
export function getRandomElements(a0, a1) {
return [...a0].sort(() => 0.5 - Math.random()).slice(0, a1);
}
export function getSavedWidgets() {
const currentUser = UserStore.getCurrentUser();
let r11 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r11 == null) {
r11 = [];
}
return r11;
}
export { replaceWidgetInList };
export function addWidgetToPending(a0) {
let r20;
if (WidgetStore.hasPendingChanges()) {
let r22 = WidgetStore.getPendingWidgets();
if (r22 == null) {
r22 = [];
}
r20 = r22;
} else {
const currentUser = UserStore.getCurrentUser();
r20 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r20 == null) {
r20 = [];
}
}
const r26 = r20.find((item) => item.getUniqueKey() === a0.getUniqueKey());
const r28 = r20;
if (r26 == null) {
WidgetActionCreators.setPendingWidgets([a0, ...r28]);
}
}
export function removeWidgetFromPending(c15251_0) {
let r16;
if (WidgetStore.hasPendingChanges()) {
let r18 = WidgetStore.getPendingWidgets();
if (r18 == null) {
r18 = [];
}
r16 = r18;
} else {
const currentUser = UserStore.getCurrentUser();
r16 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r16 == null) {
r16 = [];
}
}
WidgetActionCreators.setPendingWidgets(r16.filter((item) => item.getUniqueKey() !== c15251_0.getUniqueKey()));
}
export function updatePersonalWidget(a0) {
let r17;
if (WidgetStore.hasPendingChanges()) {
let r19 = WidgetStore.getPendingWidgets();
if (r19 == null) {
r19 = [];
}
r17 = r19;
} else {
const currentUser = UserStore.getCurrentUser();
r17 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r17 == null) {
r17 = [];
}
}
let r23 = r17.find((item) => item instanceof UserProfilePersonalWidget);
if (r23 == null) {
r23 = null;
}
if (r23 == null) {
r23 = new UserProfilePersonalWidget({
top: createDefaultPersonalWidgetTop()
});
}
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(a0(r23)));
}
export function updatePendingGameTags(a0, a1, a2) {
let env15249;
const r5 = env15249 = {};
env15249[0] = a1;
if (!(a2.length > Object.values(WidgetGameTag).length)) {
const r24 = findGameWidget(a0);
if (r24 != null) {
const r27 = r24.games.find($mk77324(r5));
if (r27 != null) {
env15249[1] = {
...r27,
tags: a2
};
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r24,
games: r24.games.map($mk77325(r5))
})));
}
}
}
}
export function removeTagFromGame(a0, a1, c15252_1) {
const r17 = findGameWidget(a0);
if (r17 != null) {
const r18 = r17.games.find((game) => game.applicationId === a1);
if (r18 != null && r18.tags != null && r18.tags.length !== 0) {
let tags2 = r18.tags.filter((tag) => tag !== c15252_1);
const type = r17.type;
if (!(tags2.length > 0)) {
tags2 = [];
}
let env15253;
const r28 = env15253 = {};
env15253[0] = a1;
if (!(tags2.length > Object.values(WidgetGameTag).length)) {
const r38 = findGameWidget(type);
if (r38 != null) {
const r42 = r38.games.find($mk77324(r28));
if (r42 != null) {
env15253[1] = {
...r42,
tags: tags2
};
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r38,
games: r38.games.map($mk77325(r28))
})));
}
}
}
}
}
}
export function updatePendingGameComment(a0, c15254_0, a2) {
let c15254_1;
const r8 = findGameWidget(a0);
if (r8 != null) {
const r15 = r8.games.find((game) => game.applicationId === c15254_0);
if (r15 != null && a2 !== r15.comment) {
c15254_1 = {
...r15,
comment: a2
};
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r8,
games: r8.games.map((game) => game.applicationId === c15254_0 ? c15254_1 : game)
})));
}
}
}
export function addPendingGameToWidget({ widgetType, game, ignoreMaxGames = false }) {
let games3;
const r8 = findGameWidget(widgetType);
const r11 = widgetType in GAME_WIDGET_LIMITS_BY_TYPE ? GAME_WIDGET_LIMITS_BY_TYPE[widgetType] : 0;
if (r8 != null) {
let r27 = r8.games?.length;
if (r27 == null) {
r27 = 0;
}
if (!ignoreMaxGames && r27 >= r11) {
return void 0;
}
let games = r8.games;
if (games == null) {
games = [];
}
if (games.some((a0) => a0.applicationId === game.applicationId)) {
return void 0;
}
}
const r33 = {
applicationId: game.applicationId,
comment: game.comment,
tags: game.tags
};
if (r8 != null) {
const r37 = [r33];
let games2 = r8.games;
if (games2 == null) {
games2 = [];
}
HermesBuiltin.arraySpread(r37, games2, 1);
games3 = r37;
} else {
games3 = [r33];
}
let r44 = r8;
if (r44 == null) {
r44 = {
type: widgetType
};
}
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r44,
games: games3
})));
useGame.fetchMany([game.applicationId]);
}
export function reorderWidgets(a0, a1) {
let r21;
if (a0 !== a1) {
if (WidgetStore.hasPendingChanges()) {
let r23 = WidgetStore.getPendingWidgets();
if (r23 == null) {
r23 = [];
}
r21 = r23;
} else {
const currentUser = UserStore.getCurrentUser();
r21 = (currentUser != null ? UserProfileStore.getUserProfile(currentUser.id) : null)?.widgets;
if (r21 == null) {
r21 = [];
}
}
if (!(a0 < 0) && !(a0 >= r21.length) && !(a1 < 0) && !(a1 >= r21.length)) {
const r27 = [...r21];
r27.splice(a1, 0, _slicedToArray(r27.splice(a0, 1), 1)[0]);
WidgetActionCreators.setPendingWidgets(r27);
}
}
}
export function reorderGamesInWidget(a0, a1, a2) {
const r9 = findGameWidget(a0);
if (r9 != null && r9.games != null && a1 !== a2) {
const games = [...r9.games];
if (!(a1 < 0) && !(a1 >= games.length) && !(a2 < 0) && !(a2 >= games.length)) {
games.splice(a2, 0, _slicedToArray(games.splice(a1, 1), 1)[0]);
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r9,
games
})));
}
}
}
export function removePendingGameFromWidget(a0, c15256_0) {
const r8 = findGameWidget(a0);
if (r8 != null) {
WidgetActionCreators.setPendingWidgets(replaceWidgetInList(new BaseGameWidget({
...r8,
games: (r8.games != null ? r8.games : []).filter((item) => item.applicationId !== c15256_0)
})));
}
}
export function isGameLimitReached(a0) {
const type = a0.type;
return a0.games.length >= (type in GAME_WIDGET_LIMITS_BY_TYPE ? GAME_WIDGET_LIMITS_BY_TYPE[type] : 0);
}
export function areWidgetGamesEqual(a0, a1, c15257_1) {
let c15257_0 = a1;
return a0.length === a1.length && a0.every((a0, a1) => {
let r20, r25, r32, r44, r54;
let tags;
L30: {
const r17 = c15257_0[a1];
tags = void 0;
const applicationId = a0.applicationId;
const applicationId2 = r17.applicationId;
r20 = false;
if (applicationId === applicationId2) {
if (WIDGETS_SUPPORTING_COMMENT.includes(c15257_1)) {
L7: {
const comment = a0.comment;
const r3 = comment == null;
r25 = null;
if (!r3) {
r25 = null;
if (comment !== "") {
if (Array.isArray(comment)) {
const length = comment.length;
r25 = null;
if (length === 0) {
break L7;
}
}
r25 = comment;
}
}
}
L12: {
const comment2 = r17.comment;
const r31 = comment2 == null;
r32 = null;
if (!r31) {
r32 = null;
if (comment2 !== "") {
if (Array.isArray(comment2)) {
const length2 = comment2.length;
r32 = null;
if (length2 === 0) {
break L12;
}
}
r32 = comment2;
}
}
}
r20 = false;
if (r25 !== r32) {
break L30;
}
}
const r41 = WIDGETS_SUPPORTING_TAGS.includes(c15257_1);
r20 = true;
if (r41) {
L19: {
const tags2 = a0.tags;
const r5 = tags2 == null;
r44 = null;
if (!r5) {
r44 = null;
if (tags2 !== "") {
if (Array.isArray(tags2)) {
const length3 = tags2.length;
r44 = null;
if (length3 === 0) {
break L19;
}
}
r44 = tags2;
}
}
}
L24: {
const tags3 = r17.tags;
const r53 = tags3 == null;
r54 = null;
if (!r53) {
r54 = null;
if (tags3 !== "") {
if (Array.isArray(tags3)) {
const length4 = tags3.length;
r54 = null;
if (length4 === 0) {
break L24;
}
}
r54 = tags3;
}
}
}
tags = r54;
r20 = r44 === null === (tags === null) ? r44 !== null ? tags !== null ? r44.length === tags.length ? r44.every((item, index) => item === tags[index]) ? true : false : false : true : true : false;
}
}
}
return r20;
});
}
export function isGameAllowedInGameWidgets(a0) {
const isAgeRestrictedContentClassification = _utils.isAgeRestrictedContentClassification(a0.contentClassification);
return isAgeRestrictedContentClassification ? !isAgeRestrictedContentClassification : !GAME_WIDGET_BANNED_APPLICATION_IDS.has(a0.id);
}
@@ -0,0 +1,19 @@
// Metro module 12172 (f12173).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-07-mobile-game-collection",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
1: {
enabled: true
}
}
});
export function useIsMobileGameCollectionExperimentEnabled(a0) {
return apexExperiment.useConfig({
location: a0
}).enabled;
}
@@ -0,0 +1,22 @@
// Metro module 8113 (f8114).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
kind: "user",
name: "2026-04-user-profile-performance-analytics",
defaultConfig: {
performanceAnalyticsEnabled: false
},
variations: {
0: {
performanceAnalyticsEnabled: false
},
1: {
performanceAnalyticsEnabled: true
}
}
});
export function isUserProfilePerformanceAnalyticsEnabled(a0) {
return apexExperiment.getConfig({
location: a0
}).performanceAnalyticsEnabled;
}
@@ -0,0 +1,24 @@
// Metro module 9802 (f9803).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-03-wysiwyg-user-profile-editing",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
1: {
enabled: true
}
}
});
export function useIsEligibleForUserProfileWYSIWYGEditing(a0) {
return apexExperiment.useConfig({
location: a0
}).enabled;
}
export function getIsEligibleForUserProfileWYSIWYGEditing(a0) {
return apexExperiment.getConfig({
location: a0
}).enabled;
}
@@ -0,0 +1,60 @@
// Metro module 12194 (f12195).
import { PROFILE_SIDE_PADDING } from "../../native/Constants";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
export default function useCardGridLayout(r9 = {}) {
const { minCardSize = 150, maxCardSize = 180, gap = 16 } = r9;
let containerWidth = r9.containerWidth;
let maxWidth = r9.maxWidth;
let sidePadding = r9.sidePadding;
if (sidePadding === void 0) {
sidePadding = PROFILE_SIDE_PADDING;
}
const width = useWindowDimensions_native().width;
const r13 = Math;
if (containerWidth == null) {
containerWidth = width;
}
if (maxWidth == null) {
maxWidth = Infinity;
}
const r6 = r13.min(containerWidth, maxWidth) - 2 * sidePadding;
const r37 = Math.max(1, Math.floor((r6 + gap) / (minCardSize + gap)));
const r2 = (r6 - gap * 0) / 1;
const r40 = r2 > maxCardSize;
let r5 = r2;
let columns = 1;
if (r40) {
const r42 = 1 < r37;
let r1 = 1;
r5 = r2;
columns = 1;
if (r42) {
do {
const r43 = r1 + 1;
const r46 = (r6 - gap * (r43 - 1)) / r43;
r5 = r46;
columns = r43;
if (!(r46 > maxCardSize)) {
break;
}
r1 = r43;
r5 = r46;
columns = r1;
} while (columns < r37);
}
}
const cardWidth = Math.min(Math.max(r5, minCardSize), maxCardSize);
const r53 = cardWidth * columns;
const r54 = columns - 1;
return r6 < r53 + gap * r54 ? {
columns: 1,
cardWidth: void 0,
rowWidth: void 0,
gap
} : {
columns,
cardWidth,
rowWidth: cardWidth * columns + gap * r54,
gap
};
};
@@ -0,0 +1,53 @@
// Metro module 12177 (f12178).
import { useState, useCallback } from "react";
import { UserProfileSections } from "../../Constants";
export function useProfileTabIndices(a0, a1) {
let wishlistTabIndex2 = -1;
const boardTabIndex2 = a0 ? 1 : -1;
if (a1) {
wishlistTabIndex2 = a0 ? 2 : 1;
}
return {
boardTabIndex: boardTabIndex2,
wishlistTabIndex: wishlistTabIndex2
};
}
export function useProfileSectionTabs({ initialUserProfileSection, wishlistTabIndex, boardTabIndex, onTabChange }) {
let setState, c19700_5;
setState = void 0;
c19700_5 = void 0;
let activeProfileTabSection;
[activeProfileTabSection, setState] = useState(() => {
if (UserProfileSections.WISHLIST === initialUserProfileSection) {
return UserProfileSections.WISHLIST;
}
if (UserProfileSections.WIDGETS === initialUserProfileSection) {
return UserProfileSections.WIDGETS;
}
return UserProfileSections.MAIN;
});
const r19 = UserProfileSections.WISHLIST !== activeProfileTabSection ? UserProfileSections.WIDGETS !== activeProfileTabSection ? UserProfileSections.MAIN === activeProfileTabSection ? 0 : void 0 : boardTabIndex : wishlistTabIndex;
if (r19 < 0) {
setState(UserProfileSections.MAIN);
}
const activeProfileTabSectionIndex = r19 >= 0 ? r19 : 0;
c19700_5 = activeProfileTabSectionIndex;
return {
activeProfileTabSection,
setActiveProfileTabSection: setState,
handleTabChange: useCallback((a0) => {
const r8 = wishlistTabIndex === a0 ? UserProfileSections.WISHLIST : boardTabIndex === a0 ? UserProfileSections.WIDGETS : UserProfileSections.MAIN;
setState(r8);
if (onTabChange != null) {
onTabChange(r8);
}
}, [wishlistTabIndex, boardTabIndex, onTabChange]),
restoreActiveIndex: useCallback((a0) => {
const r5 = a0.activeIndex.get();
if (r5 !== c19700_5) {
a0.setActiveIndex(c19700_5, false, true);
}
}, [activeProfileTabSectionIndex]),
activeProfileTabSectionIndex
};
}
@@ -0,0 +1,41 @@
// Metro module 13706 (f13707).
import { useRef, useEffect } from "react";
import { findNodeHandle } from "react-native";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import ProfileCustomizationNavigationStore from "../../../profile_customization/ProfileCustomizationNavigationStore";
import { useStateFromStores } from "../../../../_bundle/Module589";
export default function useScrollToUserProfileEditFormSection(c20652_0, c20652_1) {
const ref = useRef({});
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
useEffect(() => {
let r1 = c20652_1 != null;
if (r1) {
const current = ref.current;
r1 = (current == null ? void 0 : current[c20652_1]) != null;
}
if (r1) {
setTimeout(() => {
const r6 = ref.current[c20652_1];
const r11 = findNodeHandle(c20652_0.current);
if (r11 != null) {
if (r6 != null) {
r6.measureLayout(r11, (a0, a1) => {
const current = c20652_0.current;
if (current != null) {
current.scrollTo({
x: a0,
y: a1,
animated: !stateFromStores
});
}
});
}
ProfileCustomizationNavigationStore.setState({
scrollPosition: null
});
}
}, 0);
}
});
return ref;
};
@@ -0,0 +1,22 @@
// Metro module 12014 (f12015).
import { useEffect, useState } from "react";
import ContentInventoryOutboxStore from "../../../content_inventory/ContentInventoryOutboxStore";
import { useStateFromStores } from "../../../../_bundle/Module589";
export default function useTrackUserProfileActivityView({ userId, onAction }) {
let setState, c19333_3;
setState = void 0;
c19333_3 = void 0;
const stateFromStores = useStateFromStores([ContentInventoryOutboxStore], () => ContentInventoryOutboxStore.isFetchingUserOutbox(userId));
let state;
[state, setState] = useState(false);
const r24 = stateFromStores ? !stateFromStores : !state;
c19333_3 = r24;
useEffect(() => {
if (c19333_3) {
onAction({
action: "VIEW_ACTIVITY_CARD"
});
setState(true);
}
}, [r24, onAction]);
};
@@ -0,0 +1,33 @@
// Metro module 12196 (f12197).
import { useEffect, useRef } from "react";
import WishlistStore from "../../../wishlists/WishlistStore";
import { useStateFromStores } from "../../../../_bundle/Module589";
export default function useTrackUserProfileWishlistView({ wishlistId, onAction, productLines, isVisible = true }) {
let ref;
let c19721_3 = isVisible;
ref = void 0;
const stateFromStores = useStateFromStores([WishlistStore], () => WishlistStore.isFetching(wishlistId));
ref = useRef(false);
useEffect(() => {
if (c19721_3) {
let r6 = stateFromStores;
if (!stateFromStores) {
r6 = ref.current;
}
if (!r6) {
let productLines2 = productLines;
if (productLines == null) {
productLines2 = void 0;
}
onAction({
action: "VIEW_WISHLIST",
wishlistId,
productLines: productLines2
});
ref.current = true;
}
} else {
ref.current = false;
}
}, [isVisible, stateFromStores, onAction, wishlistId, productLines]);
};
@@ -0,0 +1,86 @@
// Metro module 13708 (f13709).
import { useCallback } from "react";
import UserStore from "../../../../stores/UserStore";
import { Base64GIFPrefix, UpsellTypes, AnalyticsPages, AnalyticsSections, UPLOAD_MEDIUM_SIZE } from "../../../../Constants";
import { PremiumUpsellTypes } from "../../../premium/PremiumConstants";
import { useStateFromStores } from "../../../../_bundle/defaultAreStatesEqual";
import PremiumUpsellUtils from "../../../../utils/native/PremiumUpsellUtils";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import UploadUtils from "../../../../utils/native/UploadUtils";
import PremiumUtils from "../../../../utils/PremiumUtils";
import { createPendingImage, generateAvatarDescription } from "../../../recent_avatars/RecentAvatarUtils";
import { setTryItOutAvatar } from "../../UserProfileActionCreators";
import { setPendingChanges } from "../../UserProfileSettingsActionCreators";
import { announcePendingAvatarChange } from "../../../profile_customization/ProfileCustomizationUtils";
function $mk116575($env) {
return function isGIF(a0) {
return a0.match(new RegExp("^" + Base64GIFPrefix, "i")) != null;
};
}
let env9523 = {};
export default function useUploadAvatar(a0) {
let c20654_4;
const { guildId, isTryItOut = false } = a0;
let c20654_1 = isTryItOut;
const analyticsLocations = a0.analyticsLocations;
c20654_4 = void 0;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const callback = useCallback(() => {
PremiumUpsellUtils.handleShowUpsellAlert({
initialUpsellKey: UpsellTypes.ANIMATED_AVATAR,
analyticsLocation: {
page: AnalyticsPages.USER_SETTINGS,
section: AnalyticsSections.SETTINGS_OVERVIEW
},
analyticsProperties: {
type: PremiumUpsellTypes.ANIMATED_USER_AVATAR_MODAL
},
analyticsLocations
});
}, [analyticsLocations]);
c20654_4 = callback;
return useCallback(async () => {
let c27564_0, c27564_1;
L18: {
let env30663;
c27564_1 = void 0;
const r25 = env30663 = {
$parent: env9523
};
c27564_0 = r25;
env30663[0] = void 0;
env30663[1] = void 0;
env30663[2] = void 0;
env30663[3] = void 0;
env30663[4] = void 0;
ActionSheetActionCreators.hideActionSheet();
env30663[0] = await UploadUtils.openImagePicker({
size: UPLOAD_MEDIUM_SIZE
});
env30663[1] = env30663[0].base64;
env30663[2] = env30663[0].originalMd5;
if (env30663[1] != null) {
env30663[3] = c20654_1 || PremiumUtils.canUseAnimatedAvatar(stateFromStores);
const r64 = env30663[1];
if ($mk116575(env9523)(r64) && !env30663[3]) {
(0, c20654_4)();
break L18;
}
env30663[4] = createPendingImage({
imageUri: env30663[1],
description: generateAvatarDescription(),
originalMd5: env30663[2]
});
if (c20654_1) {
setTryItOutAvatar(env30663[4]);
} else {
setPendingChanges({
guildId,
avatar: env30663[4]
});
announcePendingAvatarChange("set");
}
}
}
}, [stateFromStores, guildId, isTryItOut, callback]);
};
@@ -0,0 +1,34 @@
// Metro module 8362 (f8363).
import { useMemo } from "react";
import { UserProfileAnalyticsTypes } from "../../Constants";
export default function useUserProfileAnalyticsProperties({ userId, user, channelId, guildId, displayProfile, guildMember, profileEffectSkuId, type }) {
let memo2;
memo2 = void 0;
const memo = useMemo(() => {
let type2 = type;
if (type == null) {
type2 = UserProfileAnalyticsTypes.USER_SHEET;
}
return {
type: type2,
other_user_id: userId,
channel_id: channelId,
guild_id: guildId,
profile_has_nitro_customization: displayProfile != null && (displayProfile == null ? void 0 : displayProfile.hasPremiumCustomization()),
profile_has_theme_color_customized: displayProfile != null && displayProfile.hasThemeColors(),
profile_has_theme_animation: displayProfile?.popoutAnimationParticleType != null,
has_avatar_decoration: Boolean(guildMember?.avatarDecoration) || Boolean(user?.avatarDecoration),
has_profile_effect: profileEffectSkuId != null
};
}, [userId, channelId, guildId, displayProfile, guildMember?.avatarDecoration, user?.avatarDecoration, profileEffectSkuId, type]);
memo2 = useMemo(() => ({
has_nickname: Boolean(guildMember?.nick),
has_guild_member_avatar: Boolean(guildMember?.avatar),
has_guild_member_banner: displayProfile == null ? void 0 : displayProfile.isUsingGuildMemberBanner(),
has_guild_member_bio: displayProfile == null ? void 0 : displayProfile.isUsingGuildMemberBio()
}), [displayProfile, guildMember]);
return useMemo(() => guildId == null ? memo : {
...memo,
...memo2
}, [guildId, memo, memo2]);
};
@@ -0,0 +1,7 @@
// Metro module 8367 (f8368).
import { BANNER_ASPECT_RATIO } from "../../native/Constants";
import useWindowDimensions_native from "../../../screen/useWindowDimensions.native";
export default function useUserProfileBannerHeight(a0) {
const width = useWindowDimensions_native().width;
return Math.round((a0 != null ? Math.min(width, a0) : width) / BANNER_ASPECT_RATIO);
};
@@ -0,0 +1,47 @@
// Metro module 8081 (f8082).
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { ThemeTypes } from "../../../../_bundle/Module505";
import useTheme from "../../../../hooks/useTheme";
import { useProfileThemeValues } from "../../useProfileThemeValues.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import MobileVisualRefreshExperiment from "../../../themes/experiments/MobileVisualRefreshExperiment";
import { useToken } from "../../../../design/tokens/native/useToken";
import Module712 from "../../../../_bundle/Module712";
import { calculateOverlayedColor } from "../../UserProfileGradientUtils";
import { int2hex } from "../../../../_bundle/int2hslRaw";
export function useUserProfileColors({ theme, primaryColor, secondaryColor }) {
const theme2 = useTheme();
const profileThemeValues = useProfileThemeValues(theme);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.syncProfileThemeWithUserTheme);
const r31 = MobileVisualRefreshExperiment("useUserProfileColors");
const r39 = {
gradientFallbackBackground: useToken(Module712.colors.USER_PROFILE_GRADIENT_BACKGROUND, theme2),
gradientSecondaryBackground: useToken(Module712.colors.USER_PROFILE_GRADIENT_BACKGROUND, theme2),
containerBackground: useToken(r31 ? Module712.colors.CARD_MUTED_BG : Module712.colors.USER_PROFILE_CONTAINER_BACKGROUND, theme2),
containerBorderColor: useToken(Module712.colors.BORDER_MUTED, theme2),
avatarBackground: useToken(Module712.colors.BACKGROUND_BASE_LOWER, theme2),
statusBackground: useToken(Module712.colors.BACKGROUND_SURFACE_HIGH, theme2)
};
let containerBackground = useToken(Module712.colors.BACKGROUND_MOD_NORMAL, theme);
let OPACITY_WHITE_24 = Module712.unsafe_rawColors.OPACITY_WHITE_24;
if (theme === ThemeTypes.LIGHT) {
if (r31) {
OPACITY_WHITE_24 = r39.containerBackground;
}
containerBackground = OPACITY_WHITE_24;
} else if (r31) {
containerBackground = r39.containerBackground;
}
if (primaryColor != null && secondaryColor != null && profileThemeValues != null) {
const { sectionBox, overlay, overlaySyncedWithUserTheme } = profileThemeValues;
const r100 = calculateOverlayedColor(primaryColor, stateFromStores ? overlaySyncedWithUserTheme : overlay);
return {
...r39,
containerBackground,
gradientSecondaryBackground: int2hex(calculateOverlayedColor(secondaryColor, overlay)),
avatarBackground: int2hex(r100),
statusBackground: int2hex(calculateOverlayedColor(r100, sectionBox))
};
}
return r39;
}
@@ -0,0 +1,18 @@
// Metro module 8374 (f8375).
import { useMemo } from "react";
import AccessibilityStore from "../../../a11y/AccessibilityStore";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useThemeContext } from "../../../../_bundle/Module3901";
import { useProfileThemeValues } from "../../useProfileThemeValues.native";
import { calculateOverlayedColor, getUserProfileGradientContainerColors } from "../../UserProfileGradientUtils";
export function useUserProfileGradientColors(a0, a1, a2) {
let overlaySyncedWithUserTheme;
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.syncProfileThemeWithUserTheme);
const profileThemeValues = useProfileThemeValues(useThemeContext().theme);
const r25 = profileThemeValues == null;
overlaySyncedWithUserTheme = stateFromStores ? r25 ? void 0 : profileThemeValues.overlaySyncedWithUserTheme : r25 ? void 0 : profileThemeValues.overlay;
return useMemo(() => {
const r6 = a0 != null ? overlaySyncedWithUserTheme != null ? calculateOverlayedColor(a0, overlaySyncedWithUserTheme) : null : null;
return getUserProfileGradientContainerColors(r6, a1 != null ? overlaySyncedWithUserTheme != null ? calculateOverlayedColor(a1, overlaySyncedWithUserTheme) : null : null, a2);
}, [a2, a0, a1, overlaySyncedWithUserTheme]);
}
@@ -0,0 +1,12 @@
// Metro module 12179 (f12180).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useMemo } from "react";
import { DismissibleContent } from "../../../../_bundle/Module1358";
import { useSelectedDismissibleContent } from "../../../dismissible_content/hooks/useSelectedDismissibleContent";
export function useWishlistViewerCoachmark({ isCurrentUser, shouldShowWishlistTab }) {
const r19 = _slicedToArray(useSelectedDismissibleContent(useMemo(() => !isCurrentUser && shouldShowWishlistTab ? [DismissibleContent.WISHLIST_MOBILE_VIEWER_COACHMARK] : [], [isCurrentUser, shouldShowWishlistTab])), 2);
return {
isVisible: r19[0] === DismissibleContent.WISHLIST_MOBILE_VIEWER_COACHMARK,
markAsDismissed: r19[1]
};
}
@@ -0,0 +1,38 @@
// Metro module 12016 (f12017).
import { useEffect, useState } from "react";
import Durations from "../../../utils/Durations";
import { formatTimestampToA11yLabel } from "../../content_inventory/utils";
import { Interval } from "../../../_bundle/Timeout";
export default function useActivityTimer({ start, end }) {
let setState;
setState = void 0;
const [state] = useState(new Interval());
let state2;
[state2, setState] = useState(() => Date.now());
useEffect(() => {
state.start(Durations.Millis.HALF_SECOND, () => setState(Date.now()));
return () => state.stop();
}, [state]);
const duration = (end - start) / Durations.Millis.SECOND;
const elapsed = Math.max(Math.min((state2 - start) / Durations.Millis.SECOND, duration), 0);
return {
elapsed,
duration,
percentage: Math.max(Math.min(elapsed / duration, 1), 0)
};
};
export function formatTime(a0) {
const r23 = Math.floor(a0) % Durations.Seconds.MINUTE;
const r34 = Math.floor(a0 / Durations.Seconds.MINUTE) % Durations.Seconds.MINUTE;
const r42 = Math.floor(a0 / Durations.Seconds.HOUR);
return r42 === 0 ? `${String(r34).padStart(2, "0")}:${String(r23).padStart(2, "0")}` : `${String(r42).padStart(2, "0")}:${String(r34).padStart(2, "0")}:${String(r23).padStart(2, "0")}`;
}
export function formatTimeForA11yLabel(a0) {
const seconds = Math.floor(a0) % Durations.Seconds.MINUTE;
const minutes = Math.floor(a0 / Durations.Seconds.MINUTE) % Durations.Seconds.MINUTE;
return formatTimestampToA11yLabel({
hours: Math.floor(a0 / Durations.Seconds.HOUR),
minutes,
seconds
});
}
+28
View File
@@ -0,0 +1,28 @@
// Metro module 8095 (f8096).
import StreamerModeStore from "../../../stores/StreamerModeStore";
import UserStore from "../../../stores/UserStore";
import { LegacyUsernameDisabled } from "../../user_settings/UserSettings";
import { useStateFromStores } from "../../../_bundle/defaultAreStatesEqual";
import { intl, t } from "../../../intl/index.native";
let c5135_4 = "legacy_username";
export default function useBadges(a0, a1) {
let r14 = LegacyUsernameDisabled.useSetting();
if (a1 !== void 0) {
r14 = a1;
}
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const stateFromStores2 = useStateFromStores([StreamerModeStore], () => StreamerModeStore.hidePersonalInformation);
if (a0 == null) {
return [];
}
let r27 = a0 == null ? void 0 : a0.getBadges();
if (r27 == null) {
r27 = [];
}
const r32 = stateFromStores != null && stateFromStores.id === a0.userId && r14 ? r27.filter((item) => item.id !== c5135_4) : r27;
return stateFromStores2 ? r32.map((item) => ({
...item,
description: item.id === c5135_4 ? intl.string(t.Br1ls3) : item.description
})) : r32;
};
export const QUEST_COMPLETED_BADGE = "quest_completed";
+42
View File
@@ -0,0 +1,42 @@
// Metro module 12214 (f12215).
import GameRelationshipStore from "../../game_relationships/GameRelationshipStore";
import LurkingStore from "../../lurker_mode/LurkingStore";
import AuthenticationStore from "../../../stores/AuthenticationStore";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import RelationshipStore from "../../../stores/RelationshipStore";
import { RestrictedGuildIds, AllowGameFriendDmsInDiscord } from "../../user_settings/UserSettings";
import { useStateFromStores } from "../../../_bundle/Module589";
export default function useCanDM(c19736_0, c19736_1) {
let stateFromStores2, setting;
const stateFromStores = useStateFromStores([AuthenticationStore], () => AuthenticationStore.getId() === c19736_0);
stateFromStores2 = useStateFromStores([LurkingStore], () => c19736_1 != null && LurkingStore.isLurking(c19736_1));
setting = RestrictedGuildIds.useSetting();
return useStateFromStores([RelationshipStore, GuildMemberStore, GameRelationshipStore], () => {
let r2 = stateFromStores ? !stateFromStores : !stateFromStores2;
if (r2) {
r2 = RelationshipStore.isFriend(c19736_0) || GuildMemberStore.memberOf(c19736_0).find((item) => !setting.includes(item)) != null;
}
if (!r2) {
r2 = GameRelationshipStore.getGameFriendsForUser(c19736_0).length > 0 && AllowGameFriendDmsInDiscord.getSetting();
}
return r2;
});
};
export function canDm(a0, a1) {
const id = AuthenticationStore.getId();
const r11 = a1 != null && LurkingStore.isLurking(a1);
const r3 = id === a0;
const setting2 = RestrictedGuildIds.getSetting();
let r24 = RelationshipStore.isFriend(a0);
let r25 = r3 ? !r3 : !r11;
if (r25) {
if (!r24) {
r24 = GuildMemberStore.memberOf(a0).find((item) => !setting2.includes(item)) != null;
}
r25 = r24;
}
if (!r25) {
r25 = GameRelationshipStore.getGameFriendsForUser(a0).length > 0 && AllowGameFriendDmsInDiscord.getSetting();
}
return r25;
}
@@ -0,0 +1,69 @@
// Metro module 7983 (f7984).
import { useEffect } from "react";
import UserStore from "../../../stores/UserStore";
import UserProfileStore from "../UserProfileStore";
import { useStateFromStores } from "../../../_bundle/Module589";
import maybeFetchUserProfile from "../maybeFetchUserProfile";
import { cachedFunction } from "../../../utils/FunctionUtils";
import DisplayProfile from "../DisplayProfile";
function $mk79613($env) {
return () => {
const r5 = $env;
const r12 = r5[0];
const r2 = r12 == null;
let r4 = null;
if (!r2) {
const r7 = $env.$parent;
const r11 = r5[1];
const [r33, r10] = [r7[4], r7[5]];
let r36 = null;
if (r12 !== null) {
const user = r33.getUser(r12);
const userProfile = r10.getUserProfile(r12);
const guildMemberProfile = r10.getGuildMemberProfile(r12, r11);
r36 = user == null ? null : userProfile == null ? null : (0, r7[6])(userProfile, guildMemberProfile);
}
r4 = r36;
}
return r4;
};
}
let env5049 = {};
const c5049_6 = cachedFunction((a0, a1) => new DisplayProfile(a0, a1));
export default function useDisplayProfile(a0, a1) {
let env16145;
const r1 = env16145 = {
$parent: env5049
};
env16145[0] = a0;
env16145[1] = a1;
return useStateFromStores([UserStore, UserProfileStore], $mk79613(r1));
};
export function useDisplayProfileWithFetchEffect(a0, a1) {
let env16147;
useEffect(() => {
let guildId = a1;
if (guildId == null) {
guildId = void 0;
}
maybeFetchUserProfile(a0, void 0, {
guildId
});
}, [a1, a0]);
const r10 = env16147 = {
$parent: env5049
};
env16147[0] = a0;
env16147[1] = a1;
return useStateFromStores([UserStore, UserProfileStore], $mk79613(r10));
}
export function getDisplayProfile(a0, a1, r5 = [UserStore, UserProfileStore]) {
const [r29, r9] = r5;
if (a0 === null) {
return null;
}
const user = r29.getUser(a0);
const userProfile = r9.getUserProfile(a0);
const guildMemberProfile = r9.getGuildMemberProfile(a0, a1);
return user == null ? null : userProfile == null ? null : c5049_6(userProfile, guildMemberProfile);
}
@@ -0,0 +1,15 @@
// Metro module 12171 (f12172).
import { useMemo } from "react";
import { ApplicationWidget } from "../UserProfileApplicationWidgetTypes";
import { isGameWidget } from "../UserProfileGameWidgetTypes";
import { useIsMobileGameCollectionExperimentEnabled } from "../experiments/UserProfileMobileGameCollectionExperiment";
import useUserProfileWidgets from "./useUserProfileWidgets";
const isNonEmptyBoardWidget = function isNonEmptyBoardWidget(a0) {
return a0 instanceof ApplicationWidget || isGameWidget(a0) && a0.games.length > 0;
};
export function useDisplayableBoardWidgets(a0) {
const isMobileGameCollectionExperimentEnabled = useIsMobileGameCollectionExperimentEnabled("UserProfileWidgetsBoard");
const userProfileWidgets = useUserProfileWidgets(a0);
let c19696_1 = userProfileWidgets;
return useMemo(() => isMobileGameCollectionExperimentEnabled ? c19696_1.filter(isNonEmptyBoardWidget) : [], [isMobileGameCollectionExperimentEnabled, userProfileWidgets]);
}
@@ -0,0 +1,10 @@
// Metro module 11960 (f11961).
import LocaleStore from "../../user_settings/LocaleStore";
import RelationshipStore from "../../../stores/RelationshipStore";
import { RelationshipTypes } from "../../../Constants";
import { useStateFromStores } from "../../../_bundle/defaultAreStatesEqual";
import { getCreatedAtDate } from "../../connections/ConnectionsUtils";
export function useFriendsSinceDate(a0) {
const stateFromStores = useStateFromStores([LocaleStore], () => LocaleStore.locale);
return getCreatedAtDate(useStateFromStores([RelationshipStore], () => RelationshipStore.getRelationshipType(a0) === RelationshipTypes.FRIEND ? RelationshipStore.getSince(a0) : null, [a0]), stateFromStores);
}
@@ -0,0 +1,7 @@
// Metro module 11986 (f11987).
import UserProfileStore from "../UserProfileStore";
import { useStateFromStores } from "../../../_bundle/Module589";
export default function useIsUserProfileObfuscated(a0) {
const stateFromStores = useStateFromStores([UserProfileStore], () => UserProfileStore.getUserProfile(a0.id));
return stateFromStores?.bio === "" && stateFromStores?.pronouns === "" && stateFromStores?.banner === void 0 && stateFromStores?.accentColor === void 0 && a0.flags === a0.publicFlags && (stateFromStores?.badges == null || (stateFromStores == null ? void 0 : stateFromStores.badges?.length) === 0);
};
+79
View File
@@ -0,0 +1,79 @@
// Metro module 12045 (f12046).
import { useEffect } from "react";
import NoteStore from "../notes/NoteStore";
import { Endpoints } from "../../../Constants";
import { useStateFromStores } from "../../../_bundle/Module589";
import Dispatcher from "../../../Dispatcher";
import { HTTP } from "../../../_bundle/sendRequest";
let _fetchNote = function _fetchNote() {
const r8 = async (userId) => {
let c27224_4 = 0;
let c30481_0, c30481_1;
L12: {
try {
c30481_0 = userId;
c30481_1 = void 0;
Dispatcher.dispatch({
type: "USER_NOTE_LOAD_START",
userId
});
c27224_4 = 1;
c30481_1 = (await HTTP.get({
url: Endpoints.NOTE(userId),
oldFormErrors: true,
rejectWithError: true
})).body;
if (c30481_1.note_user_id !== c30481_0) {
throw new Error("Invalid response from server");
}
Dispatcher.dispatch({
type: "USER_NOTE_UPDATE",
id: c30481_0,
note: c30481_1.note
});
c27224_4 = 0;
} catch ($e) {
let r7 = $e;
if (c27224_4 !== 0) {
while (true) {
try {
c27224_4 = 0;
Dispatcher.dispatch({
type: "USER_NOTE_UPDATE",
id: c30481_0
});
break L12;
} catch ($e) {
r7 = $e;
if (c27224_4 === 0) {
break;
}
}
}
}
throw r7;
}
}
};
_fetchNote = r8;
return r8.apply(this, arguments);
};
export default function useNote(a0) {
let stateFromStores;
let r12 = useStateFromStores([NoteStore], () => NoteStore.getNote(a0));
stateFromStores = r12;
useEffect(() => {
if (stateFromStores == null) {
(function fetchNote() {
return _fetchNote.apply(this, arguments);
})(a0);
}
}, [stateFromStores, a0]);
if (stateFromStores == null) {
r12 = {
loading: true,
note: null
};
}
return r12;
};
@@ -0,0 +1,58 @@
// Metro module 7937 (f7938).
import { useCallback } from "react";
import UserProfileSettingsStore from "../UserProfileSettingsStore";
import useTrackCollectiblesItemTryOut from "../../collectibles/hooks/useTrackCollectiblesItemTryOut";
import { useStateFromStoresObject } from "../../../_bundle/defaultAreStatesEqual";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import { announcePendingAvatarChange } from "../../profile_customization/ProfileCustomizationUtils";
import { setTryItOutAvatar, setTryItOutAvatarDecoration } from "../UserProfileActionCreators";
export default function usePendingAvatarSettings({ isTryItOut, analyticsLocations, guildId }) {
const trackCollectiblesItemTryOut = useTrackCollectiblesItemTryOut(analyticsLocations);
let c16110_2 = trackCollectiblesItemTryOut;
const stateFromStoresObject = useStateFromStoresObject([UserProfileSettingsStore], () => {
if (isTryItOut) {
const tryItOutChanges = UserProfileSettingsStore.getTryItOutChanges();
return {
pendingAvatar: tryItOutChanges.tryItOutAvatar,
pendingAvatarDecoration: tryItOutChanges.tryItOutAvatarDecoration,
pendingErrors: UserProfileSettingsStore.getErrors(guildId).avatarDecoration
};
}
const pendingChanges = UserProfileSettingsStore.getPendingChanges(guildId);
return {
pendingAvatar: pendingChanges.pendingAvatar,
pendingAvatarDecoration: pendingChanges.pendingAvatarDecoration,
pendingErrors: UserProfileSettingsStore.getErrors(guildId).avatarDecoration
};
});
const { pendingAvatar, pendingAvatarDecoration, pendingErrors } = stateFromStoresObject;
let setPendingAvatar = useCallback((a0) => {
setPendingChanges({
guildId,
avatar: a0
});
announcePendingAvatarChange(a0 == null ? "remove" : "set");
}, [guildId]);
let setPendingAvatarDecoration = useCallback((a0) => {
setPendingChanges({
guildId,
avatarDecoration: a0
});
if (a0 != null) {
c16110_2(a0);
}
}, [trackCollectiblesItemTryOut, guildId]);
if (isTryItOut) {
setPendingAvatar = setTryItOutAvatar;
}
if (isTryItOut) {
setPendingAvatarDecoration = setTryItOutAvatarDecoration;
}
return {
pendingAvatar,
pendingAvatarDecoration,
pendingErrors,
setPendingAvatar,
setPendingAvatarDecoration
};
};
@@ -0,0 +1,24 @@
// Metro module 12018 (f12019).
import UserAffinitiesV2Store from "../../user_affinities/UserAffinitiesV2Store";
import ConsentStore from "../../../stores/ConsentStore";
import UserStore from "../../../stores/UserStore";
import SortedVoiceStateStore from "../../../stores/views/SortedVoiceStateStore";
import { Consents } from "../../../Constants";
import { useStateFromStoresArray, useStateFromStores } from "../../../_bundle/Module589";
export default function usePersonalizedVoiceChannelUsers(a0) {
let stateFromStores, stateFromStores2;
const stateFromStoresArray = useStateFromStoresArray([SortedVoiceStateStore], () => SortedVoiceStateStore.getVoiceStatesForChannelAlt(a0.id, a0.guild_id).map((item) => item.user.id), [a0.id, a0.guild_id]);
stateFromStores = useStateFromStores([UserAffinitiesV2Store], () => UserAffinitiesV2Store.getUserAffinitiesMap());
stateFromStores2 = useStateFromStores([ConsentStore], () => ConsentStore.hasConsented(Consents.PERSONALIZATION));
return useStateFromStoresArray([UserStore], () => (stateFromStores2 ? stateFromStoresArray.sort((a, b) => {
let r9 = stateFromStores.get(b)?.vcProbability;
if (r9 == null) {
r9 = 0;
}
let r13 = stateFromStores.get(a)?.vcProbability;
if (r13 == null) {
r13 = 0;
}
return r9 - r13;
}) : stateFromStoresArray).map((item) => UserStore.getUser(item)).filter((item) => item != null), [stateFromStores2, stateFromStores, stateFromStoresArray]);
};
@@ -0,0 +1,60 @@
// Metro module 8077 (f8078).
import AccessibilityStore from "../../a11y/AccessibilityStore";
import { useEffectiveThemeOverride } from "./useProfileThemeOverrideStore";
import { ThemeTypes } from "../../../Constants";
import useTheme from "../../../hooks/useTheme";
import { useStateFromStores } from "../../../_bundle/Module589";
import { unsafe_getResolvedRawColor } from "../../../_bundle/Module711";
import { useAvatarColors } from "../../avatar/useAvatarColor";
import { hex2int } from "../../../_bundle/int2hslRaw";
import { getProfileTheme } from "../UserProfileGradientUtils";
import { isThemeDark, isThemeLight } from "../../../design/shared";
export default function useProfileTheme(a0) {
const { user, displayProfile, pendingThemeColors } = a0;
let pendingAvatarSrc = a0.pendingAvatarSrc;
const { isPreview, forceUserTheme } = a0;
const theme = useTheme();
const effectiveThemeOverride = useEffectiveThemeOverride();
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.syncProfileThemeWithUserTheme);
if (pendingAvatarSrc == null) {
pendingAvatarSrc = user == null ? void 0 : user.getAvatarURL(displayProfile?.guildId, 80);
}
const [r45, r46] = useAvatarColors(pendingAvatarSrc, unsafe_getResolvedRawColor("PRIMARY_530", {
saturation: 1
}), false);
if (effectiveThemeOverride != null) {
return effectiveThemeOverride;
}
if (!displayProfile?.canEditThemes && !isPreview) {
return {
theme,
primaryColor: null,
secondaryColor: null
};
}
const r51 = displayProfile == null ? void 0 : displayProfile.getPreviewThemeColors(pendingThemeColors);
let primaryColor = r51 == null ? void 0 : r51[0];
if (primaryColor == null) {
primaryColor = hex2int(r45);
}
let secondaryColor = r51 == null ? void 0 : r51[1];
if (secondaryColor == null) {
secondaryColor = hex2int(r46);
}
let r63 = theme;
if (!stateFromStores) {
r63 = theme;
if (!forceUserTheme) {
let r67 = getProfileTheme(primaryColor);
if (r67 == null) {
r67 = theme;
}
r63 = r67;
}
}
return {
theme: r63 === ThemeTypes.DARK ? isThemeDark(theme) ? theme : r63 === ThemeTypes.DARK && isThemeLight(theme) ? ThemeTypes.DARKER : r63 : r63 === ThemeTypes.DARK && isThemeLight(theme) ? ThemeTypes.DARKER : r63,
primaryColor,
secondaryColor
};
};
@@ -0,0 +1,71 @@
// Metro module 8078 (f8079).
import { ThemeTypes } from "../../../Constants";
import { create } from "../../../_bundle/Module644";
import useTheme from "../../../hooks/useTheme";
import { getProfileTheme } from "../UserProfileGradientUtils";
import { isThemeDark, isThemeLight } from "../../../design/shared";
let c5123_4 = create()((c16237_0) => ({
themeOverride: null,
savedClientTheme: null,
setThemeOverride: (a0) => c16237_0({
themeOverride: a0
}),
setSavedClientTheme: (a0) => c16237_0({
savedClientTheme: a0
})
}));
export { c5123_4 as useProfileThemeOverrideStore };
export function useEffectiveThemeOverride() {
let r8, primaryColor, secondaryColor;
const r14 = c5123_4((a0) => a0.themeOverride);
const theme = useTheme();
if (r14 == null) {
return null;
}
if (r14.mode === "nitro") {
const themeColors = r14.themeColors;
let r6 = themeColors == null ? void 0 : themeColors[0];
if (r6 == null) {
r6 = null;
}
const themeColors2 = r14.themeColors;
let r23 = themeColors2 == null ? void 0 : themeColors2[1];
if (r23 == null) {
r23 = null;
}
let r24 = theme;
if (r6 != null) {
r24 = theme;
if (r23 != null) {
let r27 = getProfileTheme(r6);
if (r27 == null) {
r27 = theme;
}
r24 = r27;
}
}
r8 = r24;
secondaryColor = r23;
primaryColor = r6;
} else {
r8 = r14.themeType;
if (r8 == null) {
r8 = theme;
}
secondaryColor = null;
primaryColor = null;
}
return {
theme: r8 === ThemeTypes.DARK ? isThemeDark(theme) ? theme : r8 === ThemeTypes.DARK && isThemeLight(theme) ? ThemeTypes.DARKER : r8 : r8 === ThemeTypes.DARK && isThemeLight(theme) ? ThemeTypes.DARKER : r8,
primaryColor,
secondaryColor
};
}
export function useIsBannerDisabledByOverride() {
const r7 = c5123_4((a0) => a0.themeOverride);
return r7 != null && (r7.mode === "non-nitro" || r7.disableBanner === true);
}
export function useHasNonNitroThemeOverride() {
const r5 = c5123_4((a0) => a0.themeOverride);
return r5 != null && r5.mode === "non-nitro";
}
@@ -0,0 +1,13 @@
// Metro module 7945 (f7946).
import { UseLegacyChatInput, UseRichChatInput } from "../../user_settings/UserSettings";
export default function useShouldConvertBioEmoji() {
let r8 = UseLegacyChatInput.useSetting();
const setting = UseRichChatInput.useSetting();
if (!r8) {
r8 = !setting;
}
return r8;
};
export function getShouldConvertBioEmoji() {
return UseLegacyChatInput.getSetting() || !UseRichChatInput.getSetting();
}
@@ -0,0 +1,9 @@
// Metro module 11985 (f11986).
import UserStore from "../../../stores/UserStore";
import { useStateFromStores } from "../../../_bundle/Module589";
import useIsUserProfileObfuscated from "./useIsUserProfileObfuscated";
export default function useShouldShowMutualInfo(a0) {
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const isUserProfileObfuscated = useIsUserProfileObfuscated(a0);
return stateFromStores?.id !== a0.id && !isUserProfileObfuscated;
};
@@ -0,0 +1,36 @@
// Metro module 12013 (f12014).
import { useCallback } from "react";
import ContentInventoryOutboxStore from "../../content_inventory/ContentInventoryOutboxStore";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import { useStateFromStores } from "../../../_bundle/Module589";
import { trackUserProfileActivityAction } from "../UserProfileAnalyticsUtils";
export default function useTrackUserProfileActivityAction(a0) {
const { user, display, activity, entry, stream, voiceChannelId } = a0;
let analyticsLocations2 = a0.analyticsLocations;
const userProfileAnalyticsContext = useUserProfileAnalyticsContext();
const { context, trackUserProfileAction } = userProfileAnalyticsContext;
const analyticsLocations3 = useAnalyticsLocations().analyticsLocations;
if (analyticsLocations2 == null) {
analyticsLocations2 = analyticsLocations3;
}
const analyticsLocations = analyticsLocations2;
const stateFromStores = useStateFromStores([ContentInventoryOutboxStore], () => ContentInventoryOutboxStore.getUserOutbox(user.id));
return useCallback(({ action }) => {
trackUserProfileAction({
action,
analyticsLocations
});
trackUserProfileActivityAction({
action,
display,
activity,
entry,
stream,
outbox: stateFromStores,
voiceChannelId,
analyticsLocations,
...context
});
}, [trackUserProfileAction, context, display, activity, stream, entry, stateFromStores, voiceChannelId, analyticsLocations]);
};
@@ -0,0 +1,42 @@
// Metro module 12033 (f12034).
import { useMemo } from "react";
import ContentInventoryOutboxStore from "../../content_inventory/ContentInventoryOutboxStore";
import PresenceStore from "../../../stores/PresenceStore";
import useDiscoverableApplicationStream from "../../blocking/useDiscoverableApplicationStream";
import { useStateFromStores } from "../../../_bundle/Module589";
import { getUserProfileLiveActivities } from "../utils/UserProfileStackedActivityCardUtils";
import * as _utils from "../../content_inventory/utils";
import { isListenedSessionEntry, isWatchedMediaEntry, isRecentActivityEntry } from "../../content_inventory/ContentInventoryTypes";
import { isMatchingListeningActivity, isMatchingWatchActivity } from "../../content_inventory/matchUtils";
const live = [];
const recent = [];
export default function useUserProfileActivity(a0) {
let stateFromStores2;
const discoverableApplicationStream = useDiscoverableApplicationStream(a0);
const stateFromStores = useStateFromStores([PresenceStore], () => PresenceStore.getActivities(a0));
stateFromStores2 = useStateFromStores([ContentInventoryOutboxStore], () => ContentInventoryOutboxStore.getUserOutbox(a0));
const memo = useMemo(() => {
let live2 = getUserProfileLiveActivities(stateFromStores);
const userProfileLiveActivities = live2;
let recent2 = stateFromStores2 == null ? void 0 : stateFromStores2.entries.filter((entry) => {
const isEntryLive = _utils.isEntryLive(entry);
return isEntryLive ? !isEntryLive : isListenedSessionEntry(entry) ? entry.extra.entries.length > 0 && !userProfileLiveActivities.some((userProfileLiveActivity) => userProfileLiveActivity != null && isMatchingListeningActivity(entry, userProfileLiveActivity)) : isWatchedMediaEntry(entry) ? !userProfileLiveActivities.some((userProfileLiveActivity) => userProfileLiveActivity != null && isMatchingWatchActivity(entry, userProfileLiveActivity)) : isRecentActivityEntry(entry);
});
if (userProfileLiveActivities.length === 0) {
live2 = live;
}
if (!(recent2 != null && recent2.length !== 0)) {
recent2 = recent;
}
return {
live: live2,
recent: recent2
};
}, [stateFromStores, stateFromStores2?.entries]);
return {
live: memo.live,
recent: memo.recent,
stream: discoverableApplicationStream,
outbox: stateFromStores2
};
};
@@ -0,0 +1,9 @@
// Metro module 12191 (f12192).
import { useMemo } from "react";
import UserProfileStore from "../UserProfileStore";
import { useStateFromStores } from "../../../_bundle/Module589";
let c8421_4 = [];
export default function useUserProfileApplicationRoleConnections(c19717_0) {
const stateFromStores = useStateFromStores([UserProfileStore], () => UserProfileStore.getUserProfile(c19717_0));
return useMemo(() => stateFromStores?.applicationRoleConnections == null ? c8421_4 : stateFromStores.applicationRoleConnections, [stateFromStores?.applicationRoleConnections]);
};
@@ -0,0 +1,17 @@
// Metro module 12190 (f12191).
import { useMemo } from "react";
import UserProfileStore from "../UserProfileStore";
import { usePlatformAllowed } from "../../connections/ConnectionsHooks";
import { useStateFromStores } from "../../../_bundle/Module589";
import Platforms from "../../../lib/Platforms";
let c8420_5 = [];
export default function useUserProfileConnections(c19716_0) {
const platformAllowed = usePlatformAllowed({
forUserProfile: true
});
const stateFromStores = useStateFromStores([UserProfileStore], () => UserProfileStore.getUserProfile(c19716_0));
return useMemo(() => stateFromStores?.connectedAccounts == null ? c8420_5 : stateFromStores.connectedAccounts.filter(({ type }) => {
const r10 = Platforms.get(type);
return r10 != null && Platforms.isSupported(type) && platformAllowed(r10);
}), [stateFromStores?.connectedAccounts, platformAllowed]);
};
@@ -0,0 +1,55 @@
// Metro module 11696 (f11697).
import { useMemo } from "react";
import UserAffinitiesV2Store from "../../user_affinities/UserAffinitiesV2Store";
import SortedGuildStore from "../../../stores/SortedGuildStore";
import UserProfileStore from "../UserProfileStore";
import { useStateFromStoresArray, useStateFromStores } from "../../../_bundle/Module589";
import { sortBy } from "../../../_bundle/Module12";
import usePrevValue from "../../../hooks/usePrevValue";
export default function useUserProfileMutuals(c19081_0) {
let c19081_1, c19081_2, stateFromStores, stateFromStores2;
let [mutualFriendsCount, r13, r12, isFetching, isFetchingFriends] = useStateFromStoresArray([UserProfileStore], () => [UserProfileStore.getMutualFriendsCount(c19081_0.id), UserProfileStore.getMutualFriends(c19081_0.id), UserProfileStore.getMutualGuilds(c19081_0.id), UserProfileStore.isFetchingProfile(c19081_0.id), UserProfileStore.isFetchingFriends(c19081_0.id)]);
c19081_1 = r13;
c19081_2 = r12;
stateFromStores = useStateFromStores([UserAffinitiesV2Store], () => UserAffinitiesV2Store.getUserAffinitiesMap());
stateFromStores2 = useStateFromStores([SortedGuildStore], () => SortedGuildStore.getFlattenedGuildIds());
let mutualFriends = useMemo(() => c19081_1 != null ? c19081_1.length < 2 ? c19081_1 : sortBy(c19081_1, (a0) => {
let r10 = stateFromStores.get(a0.user.id)?.communicationProbability;
if (r10 == null) {
r10 = -1;
}
return -1 * r10;
}) : c19081_1, [r13, stateFromStores]);
let mutualGuilds = useMemo(() => {
if (c19081_2 != null && !(c19081_2.length < 2)) {
let c27131_0 = Object.fromEntries(stateFromStores2.map((item, index) => [item, index]));
return sortBy(c19081_2, (a0) => {
let r6 = c27131_0[a0.guild.id];
if (r6 == null) {
r6 = stateFromStores2.length;
}
return r6;
});
}
return c19081_2;
}, [r12, stateFromStores2]);
const prevValue = usePrevValue(mutualFriendsCount);
const prevValue2 = usePrevValue(mutualFriends);
const prevValue3 = usePrevValue(mutualGuilds);
if (mutualFriendsCount == null) {
mutualFriendsCount = prevValue;
}
if (mutualFriends == null) {
mutualFriends = prevValue2;
}
if (mutualGuilds == null) {
mutualGuilds = prevValue3;
}
return {
mutualFriendsCount,
mutualFriends,
mutualGuilds,
isFetching,
isFetchingFriends
};
};
@@ -0,0 +1,33 @@
// Metro module 12035 (f12036).
import PresenceStore from "../../../stores/PresenceStore";
import VoiceStateStore from "../../../stores/VoiceStateStore";
import isEmbeddedActivity from "../../activities/utils/isEmbeddedActivity";
import useUserVoiceActivity from "../../activity_status/useUserVoiceActivity";
import { useStateFromStores } from "../../../_bundle/Module589";
export default function useUserProfileVoiceActivity({ userId, guildId }) {
const userVoiceActivity = useUserVoiceActivity({
userId,
guildId
});
const { voiceState, voiceChannel } = userVoiceActivity;
const id = voiceChannel?.id;
return {
voiceState,
voiceChannel,
voiceActivity: useStateFromStores([PresenceStore, VoiceStateStore], () => {
if (userId != null && id != null) {
let r9 = PresenceStore.findActivity(userId, (a0) => {
const voiceStateForSession = VoiceStateStore.getVoiceStateForSession(userId, a0.session_id);
return isEmbeddedActivity(a0) && voiceStateForSession?.channelId === id;
});
if (r9 == null) {
r9 = void 0;
}
return r9;
}
})
};
};
export function isUserProfileVoiceActivityForChannel({ activity, voiceChannelId, voiceStateForSession }) {
return isEmbeddedActivity(activity) && voiceStateForSession?.channelId === voiceChannelId;
}
@@ -0,0 +1,23 @@
// Metro module 12173 (f12174).
import AuthenticationStore from "../../../stores/AuthenticationStore";
import UserProfileStore from "../UserProfileStore";
import WidgetStore from "../WidgetStore";
import { useStateFromStores, useStateFromStoresArray } from "../../../_bundle/Module589";
export default function useUserProfileWidgets(a0) {
const stateFromStores = useStateFromStores([AuthenticationStore], () => {
const id = AuthenticationStore.getId();
return a0 != null && id === a0;
}, [a0]);
const stateFromStores2 = useStateFromStores([WidgetStore], () => WidgetStore.getPendingWidgets());
const stateFromStoresArray = useStateFromStoresArray([UserProfileStore], () => {
if (a0 == null) {
return [];
}
let r8 = UserProfileStore.getUserProfile(a0)?.widgets;
if (r8 == null) {
r8 = [];
}
return r8;
}, [a0]);
return stateFromStores ? stateFromStores2 !== null ? stateFromStores2 : stateFromStoresArray : stateFromStoresArray;
};
@@ -0,0 +1,41 @@
// Metro module 12188 (f12189).
import { useMemo } from "react";
import useConnectionFilteredAppIdentities from "../../user_application_identity/hooks/useConnectionFilteredAppIdentities";
import useUserProfileConnections from "./useUserProfileConnections";
import useGetOrFetchApplications from "../../applications/useGetOrFetchApplications";
import { isNotNullish } from "../../../utils/GlobalUtils";
import Platforms from "../../../lib/Platforms";
export default function useVisibleUserProfileConnectionsAndAppIdentities(a0) {
let c19714_3;
const filteredAppIdentities = useConnectionFilteredAppIdentities(a0).filteredAppIdentities;
const userProfileConnections = useUserProfileConnections(a0);
let c19714_1 = userProfileConnections;
const memo = useMemo(() => {
const r5 = Set;
let r11 = filteredAppIdentities == null ? void 0 : filteredAppIdentities.map((filteredAppIdentity) => filteredAppIdentity.application_id);
if (r11 == null) {
r11 = [];
}
return new r5(r11);
}, [filteredAppIdentities]);
const r31 = useGetOrFetchApplications([...memo]).filter(isNotNullish);
c19714_3 = r31;
return {
appIdentities: useMemo(() => filteredAppIdentities.map((filteredAppIdentity) => {
return {
identity: filteredAppIdentity,
application: c19714_3.find((item) => item.id === filteredAppIdentity.application_id)
};
}).filter((item) => item.application != null), [filteredAppIdentities, r31]),
connections: useMemo(() => c19714_1.filter((item) => {
const r13 = Platforms.get(item.type);
const r2 = r13 == null;
let r14 = void 0;
if (!r2) {
const migrationData = r13.migrationData;
r14 = migrationData == null ? void 0 : migrationData.getMigrationExperimentEnabled("useVisibleUserProfileConnectionsAndAppIdentities");
}
return r14 ? !memo.has(r13.migrationData.replacedBy) : !r14;
}), [userProfileConnections, memo])
};
};
@@ -0,0 +1,76 @@
// Metro module 12200 (f12201).
import { useState, useCallback } from "react";
import UserProfileStore from "../UserProfileStore";
import { ContentDismissActionType } from "../../dismissible_content/DismissibleContentConstants";
import Durations from "../../../utils/Durations";
import { createApexExperiment } from "../../experiments/apex/index";
import { useStateFromStores } from "../../../_bundle/Module589";
import { useSelectedTimeRecurringDismissibleContent } from "../../dismissible_content/hooks/useSelectedDismissibleContent";
import { DismissibleContent } from "../../../_bundle/Module1358";
const cooldownDurationMs = 90 * Durations.Millis.DAY;
let c8429_7 = 90 * Durations.Millis.DAY;
const apexExperiment = createApexExperiment({
name: "2026-07-smag-wishlist-recommendations-dismiss-threshold",
kind: "user",
defaultConfig: {
minItemsToDismiss: 1
},
variations: {
0: {
minItemsToDismiss: 1
},
1: {
minItemsToDismiss: 3
},
2: {
minItemsToDismiss: 10
}
}
});
export default function useWishlistSuggestionsDismissibleContent(a0) {
let c19726_3;
const { userId, wishlist } = a0;
let hasFetchedWishlist = a0.hasFetchedWishlist;
c19726_3 = void 0;
const minItemsToDismiss = apexExperiment.useConfig({
location: "user_profile_wishlist_suggestions_grid"
}).minItemsToDismiss;
let r26 = wishlist == null ? void 0 : wishlist.items.length;
if (r26 == null) {
r26 = 0;
}
const isDismissible = r26 >= minItemsToDismiss;
const [state, setState] = useState(false);
if (!((hasFetchedWishlist ? isDismissible : !hasFetchedWishlist) || state)) {
setState(true);
}
const [r56, r57] = useSelectedTimeRecurringDismissibleContent(DismissibleContent.USER_PROFILE_WISHLIST_RECOMMENDATIONS, {
showAfterTimestamp: useStateFromStores([UserProfileStore], () => {
const r2 = wishlist != null;
let r3 = 0;
if (r2) {
const r12 = Date;
let r18 = UserProfileStore.getWishlistSettings(userId, wishlist.id)?.updated_at;
if (r18 == null) {
r18 = 0;
}
r3 = new r12(r18).valueOf();
}
return r3;
}, [wishlist, userId]) + c8429_7,
cooldownDurationMs
}, void 0, true);
c19726_3 = r57;
const USER_PROFILE_WISHLIST_RECOMMENDATIONS = DismissibleContent.USER_PROFILE_WISHLIST_RECOMMENDATIONS;
if (hasFetchedWishlist) {
hasFetchedWishlist = r56 === USER_PROFILE_WISHLIST_RECOMMENDATIONS || state || !isDismissible;
}
return {
isVisible: hasFetchedWishlist,
isDismissible,
markAsDismissed: useCallback(() => {
setState(false);
c19726_3(ContentDismissActionType.USER_DISMISS);
}, [r57])
};
};
@@ -0,0 +1,96 @@
// Metro module 7984 (f7985).
import ChannelStore from "../../stores/ChannelStore";
import GuildMemberStore from "../../stores/GuildMemberStore";
import UserProfileStore from "./UserProfileStore";
import { maybeFetchCollectiblesProduct } from "../collectibles/CollectiblesActionCreators";
import { maybeFetchColors } from "../avatar/useAvatarColor";
import { getVisibleConnectionsRole } from "../connections/ConnectionsUtils";
import Dispatcher from "../../Dispatcher";
import { fetchProfile } from "../../actions/UserActionCreators";
import preloadUserBannerImage from "./preloadUserBannerImage";
export default function maybeFetchUserProfile(a0, a1) {
let r38;
let r5 = arguments[2];
if (r5 === void 0) {
r5 = {};
}
const { type, withMutualGuilds = false, withMutualFriendsCount = false, withMutualFriends = false, dispatchWait = false, waitForRefetch = true, guildId, channelId, joinRequestId, abortSignal } = r5;
if (a0 === "") {
return Promise.resolve();
}
if (UserProfileStore.isFetchingProfile(a0, guildId)) {
return Promise.resolve();
}
const userProfile = UserProfileStore.getUserProfile(a0);
const guildMemberProfile = UserProfileStore.getGuildMemberProfile(a0, guildId);
const r24 = guildId != null ? guildMemberProfile : userProfile;
const r32 = Date.now();
let r33 = r24?.fetchEndedAt;
if (r33 == null) {
r33 = 0;
}
const r34 = r32 - r33;
const r36 = r24 == null ? void 0 : r24.fetchError?.status;
L30: {
r38 = r34 >= 60000;
if (r36 !== 404) {
if ((r24 == null ? void 0 : r24.fetchError?.status) !== 429) {
break L30;
}
}
if (!r38) {
return Promise.resolve();
}
}
const mutualGuilds = UserProfileStore.getMutualGuilds(a0);
const mutualFriends = UserProfileStore.getMutualFriends(a0);
const mutualFriendsCount = UserProfileStore.getMutualFriendsCount(a0);
const r54 = guildId == null ? userProfile == null : guildMemberProfile == null;
let r55 = !r54;
if (!r54) {
if (!r38) {
r38 = mutualGuilds == null && withMutualGuilds;
}
if (!r38) {
r38 = mutualFriends == null && withMutualFriends;
}
if (!r38) {
r38 = mutualFriendsCount == null && withMutualFriendsCount;
}
r55 = r38;
}
if (!r54 && !r55) {
return Promise.resolve();
}
const r63 = guildId != null ? guildMemberProfile?.profileEffect : userProfile?.profileEffect;
if (r63 != null) {
maybeFetchCollectiblesProduct(r63.skuId);
}
const r74 = guildId != null ? guildMemberProfile?.profileFrame : userProfile?.profileFrame;
if (r74 != null) {
maybeFetchCollectiblesProduct(r74.skuId);
}
if (a1 != null) {
maybeFetchColors(a1);
}
const r91 = {
type,
withMutualGuilds,
withMutualFriends,
withMutualFriendsCount,
guildId,
joinRequestId,
abortSignal,
connectionsRoleId: guildId == null ? void 0 : getVisibleConnectionsRole({
guildMember: GuildMemberStore.getMember(guildId, a0),
channel: ChannelStore.getChannel(channelId)
})?.id
};
let c16148_1 = r91;
if (dispatchWait) {
Dispatcher.wait(() => fetchProfile(a0, c16148_1, preloadUserBannerImage));
return Promise.resolve();
}
const r117 = fetchProfile(a0, r91, preloadUserBannerImage);
return r55 ? waitForRefetch ? r117 : Promise.resolve() : r117;
};
@@ -0,0 +1,86 @@
// Metro module 12228 (f12229).
import { useEffect } from "react";
import { View, StyleSheet } from "react-native";
import { ACTION_SHEET_START_HEIGHT_RATIO } from "../../action_sheet/native/ActionSheetConstants";
import * as _PlatformUtils from "../../../utils/PlatformUtils";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
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 ReanimatedRexport, { useSharedValue, withDelay, Easing, useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../design/animation/reanimated/timing/timing";
import { Text } from "../../../design/components/Text/native/Text";
const isIOS = _PlatformUtils.isIOS();
const useStyles = createStyles({
container: {
...StyleSheet.absoluteFillObject,
flex: 1,
alignItems: "center",
justifyContent: "center"
},
toast: {
position: "absolute",
bottom: 16,
backgroundColor: Module712.colors.MOBILE_TOAST_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.round,
paddingTop: 6,
paddingBottom: 8,
paddingHorizontal: 16
}
});
const __initData = {
code: "function ActionSheetBackdropToastTsx1(){const{isInIOS,isExpanded,maxDynamicContentSize,TOAST_BOTTOM_MARGIN,nonExpandedHeight,ACTION_SHEET_START_HEIGHT_RATIO,TOAST_BOTTOM_GAP,positionDelta,TOAST_ANIMATION_Y_DELTA,opacity}=this.__closure;return{bottom:(isInIOS?isExpanded?maxDynamicContentSize+TOAST_BOTTOM_MARGIN:nonExpandedHeight+TOAST_BOTTOM_MARGIN:isExpanded?maxDynamicContentSize+TOAST_BOTTOM_MARGIN:ACTION_SHEET_START_HEIGHT_RATIO*maxDynamicContentSize+TOAST_BOTTOM_GAP)+ +(1-positionDelta.get())*TOAST_ANIMATION_Y_DELTA,opacity:opacity.get()};}"
};
export function ActionSheetBackdropToast(props) {
const { text, isExpanded } = props;
const styles = useStyles();
const top = useSafeAreaInsets_native().top;
const height = useWindowDimensions_native().height;
const nonExpandedHeight = height * ACTION_SHEET_START_HEIGHT_RATIO;
let c19748_1 = nonExpandedHeight;
const maxDynamicContentSize = height - NAV_BAR_HEIGHT_MULTILINE - top;
let c19748_2 = maxDynamicContentSize;
const sharedValue = useSharedValue(0);
const sharedValue2 = useSharedValue(0);
useEffect(() => {
sharedValue.set(withDelay(100, withTiming(1, {
duration: 200,
easing: Easing.in(Easing.ease)
})));
sharedValue2.set(withTiming(1, {
duration: 300,
easing: Easing.in(Easing.linear)
}));
return () => {
sharedValue.set(withDelay(200, withTiming(0)));
sharedValue2.set(withTiming(0, {
duration: 200,
easing: Easing.out(Easing.exp)
}));
};
}, [sharedValue, sharedValue2]);
const x = () => ({
bottom: (isIOS ? isExpanded ? c19748_2 + 24 : c19748_1 + 24 : isExpanded ? c19748_2 + 24 : ACTION_SHEET_START_HEIGHT_RATIO * c19748_2 + 46) + 15 * (1 - sharedValue.get()),
opacity: sharedValue2.get()
});
x.__closure = {
isInIOS: isIOS,
isExpanded,
maxDynamicContentSize,
TOAST_BOTTOM_MARGIN: 24,
nonExpandedHeight,
ACTION_SHEET_START_HEIGHT_RATIO,
TOAST_BOTTOM_GAP: 46,
positionDelta: sharedValue,
TOAST_ANIMATION_Y_DELTA: 15,
opacity: sharedValue2
};
x.__workletHash = 9630436597435;
x.__initData = __initData;
return <View style={[styles.container]} pointerEvents="none">
<ReanimatedRexport.View style={[styles.toast, useAnimatedStyle(x)]}>
<Text variant="text-sm/medium" color="mobile-text-heading-primary">{text}</Text>
</ReanimatedRexport.View>
</View>;
}
@@ -0,0 +1,121 @@
// Metro module 12215 (f12216).
import { useState, useRef, useCallback } from "react";
import { View } from "react-native";
import RelationshipStore from "../../../stores/RelationshipStore";
import UserStore from "../../../stores/UserStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStores } from "../../../_bundle/Module589";
import { intl, t } from "../../../intl/index.native";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import RelationshipActionCreators from "../../../actions/RelationshipActionCreators";
import KeyboardAwareView from "../../keyboard/native/KeyboardAwareView";
import Alert from "../../../components_native/common/Alert";
import { Text } from "../../../design/components/Text/native/Text";
import { TextField } from "../../../design/components/TextField/native/TextField.native";
import UserUtils from "../../../utils/UserUtils";
const useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_SCRIM,
justifyContent: "center",
alignItems: "center"
},
title: {
textAlign: "center"
},
description: {
marginTop: 8,
marginBottom: 16,
textAlign: "center",
lineHeight: 18
}
});
export default function AddFriendNicknameModal(props) {
let state, setState, ref, callback;
const { userId, showUserProfile } = props;
state = void 0;
setState = void 0;
ref = void 0;
callback = void 0;
let _handleSubmit2 = function _handleSubmit() {
const r9 = async () => {
let current, c30512_3;
let c30512_4 = 0;
L15: {
try {
if (state) {
break L15;
}
setState(true);
c30512_4 = 1;
const current2 = ref.current;
current = current2;
if (current2 == null) {
current = "";
}
await RelationshipActionCreators.updateRelationship(userId, current);
(0, callback)();
c30512_4 = 0;
(0, setState)(false);
} catch ($e) {
const r27 = $e;
let r7 = r27;
c30512_3 = r27;
if (c30512_4 !== 0) {
while (true) {
try {
const r73 = c30512_3;
c30512_4 = 0;
(0, setState)(false);
throw r73;
} catch (r70) {
r7 = r70;
c30512_3 = r70;
if (c30512_4 === 0) {
break;
}
}
}
}
throw r7;
}
return void 0;
}
};
_handleSubmit2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
[state, setState] = useState(false);
const stateFromStores = useStateFromStores([RelationshipStore], () => RelationshipStore.getNickname(userId));
let r38 = stateFromStores;
if (r38 == null) {
r38 = null;
}
ref = useRef(r38);
const callback2 = useCallback((a0) => {
ref.current = a0;
}, []);
const stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getUser(userId));
const r19 = stateFromStores == null ? intl.string(t.BGYkaH) : intl.string(t["8pOYUE"]);
callback = useCallback(() => {
ModalActionCreators.pop();
if (showUserProfile != null) {
showUserProfile();
}
}, [showUserProfile]);
return <View style={styles.container}>
<KeyboardAwareView>
<Alert confirmText={intl.string(t["R3BPH+"])} onConfirm={function handleSubmit() {
return _handleSubmit2.apply(this, arguments);
}} cancelText={intl.string(t["ETE/oC"])} onCancel={callback}>
<Text style={styles.title} accessibilityRole="header" variant="heading-lg/extrabold" color="mobile-text-heading-primary">{r19}</Text>
<Text style={styles.description} variant="text-sm/medium" color="text-default">
{intl.string(t["NdQ+lP"])}
</Text>
<TextField onChange={callback2} autoFocus placeholder={UserUtils.getName(stateFromStores2)} defaultValue={stateFromStores} maxLength={32} isClearable />
</Alert>
</KeyboardAwareView>
</View>;
};
@@ -0,0 +1,161 @@
// Metro module 11988 (f11989).
import { useCallback, useMemo, useState } from "react";
import { getSection } from "../../application_commands/ApplicationCommandIndexStore";
import { AnalyticEvents } from "../../../Constants";
import { AppLauncherRouteName } from "../../app_launcher/native/AppLauncherNativeConstants";
import { jsx } from "react/jsx-runtime";
import useIsAppDM from "../../app_dms/useIsAppDM";
import { installApplication } from "../../../utils/native/ApplicationUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { copy } from "../../../utils/ClipboardUtils.native";
import { getApplicationInstallURL } from "../../applications/getApplicationInstallURL";
import { presentLinkCopied } from "../../toast/native/ToastUtils";
import { PlusSmallIcon } from "../../../design/components/Icon/native/redesign/generated/PlusSmallIcon";
import { intl, t } from "../../../intl/index.native";
import { Button } from "../../../design/components/Button/native/Button.native";
import ApplicationActionCreators from "../../applications/ApplicationActionCreators";
import ChannelActionCreators from "../../../actions/ChannelActionCreators";
import { getBestActiveInput } from "../../../utils/native/ChatInputUtils";
import { KeyboardTypes } from "../../keyboard/native/KeyboardTypes";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
function $mk116349($env) {
return () => {
const bestActiveInput = getBestActiveInput();
if (bestActiveInput != null) {
const r7 = $env;
const r21 = r7[0];
const isGuildInstalled = r21.isGuildInstalled;
bestActiveInput.openCustomKeyboard({
type: KeyboardTypes.APP_LAUNCHER,
context: {
initialRouteName: AppLauncherRouteName.APPLICATION_VIEW,
initiallyExpanded: true,
application: r7[1],
installOnDemand: isGuildInstalled ? !isGuildInstalled : !r21.isUserInstalled
}
});
}
};
}
let OpenAppButton;
let env8232 = {};
const AddAppButton = function AddAppButton(a0) {
let r14, r25, LinkExternalSmallIcon2, callback, callback2;
let application, guildId;
L4: {
application = a0.application;
guildId = a0.guildId;
callback2 = useCallback(() => {
installApplication({
applicationId: application.id,
customInstallUrl: application.customInstallUrl,
installParams: application.installParams,
integrationTypesConfig: application.integrationTypesConfig,
guildId
});
ActionSheetActionCreators.hideActionSheet();
}, [application.customInstallUrl, application.id, application.installParams, application.integrationTypesConfig, guildId]);
callback = useCallback(() => {
copy(getApplicationInstallURL(application));
presentLinkCopied();
}, [application]);
const customInstallUrl = application.customInstallUrl;
if (customInstallUrl != null) {
r25 = dependencyMap;
if (!importDefault(r25[13]).isDiscordUrl(customInstallUrl)) {
LinkExternalSmallIcon2 = require(r25[14]).LinkExternalSmallIcon;
r14 = require;
break L4;
}
}
LinkExternalSmallIcon2 = PlusSmallIcon;
r25 = dependencyMap;
r14 = require;
}
const memo = useMemo(() => [{
name: "longpress",
label: intl.string(t.XWDihq)
}], []);
const callback3 = useCallback((a0) => {
if (a0.nativeEvent.actionName === "longPress") {
copy(getApplicationInstallURL(application));
presentLinkCopied();
}
}, [application]);
return jsx(r14(r25[17]).Button, {
text: r14(r25[16]).intl.string(r14(r25[16]).t.NgXl3C),
onPress: callback2,
onLongPress: callback,
accessibilityActions: memo,
onAccessibilityAction: callback3,
icon: <LinkExternalSmallIcon2 size="sm" color={importDefault(r25[18]).colors.WHITE} />
});
};
OpenAppButton = function OpenAppButton(props) {
const { profileApplication, botUserId, channel } = props;
const [loading, setState] = useState(false);
const callback = useCallback(async () => {
let application2, c27218_1, c27218_2;
L21: {
L17: {
let env30477;
c27218_2 = void 0;
const r12 = env30477 = {
$parent: env8232
};
c27218_1 = r12;
env30477[0] = void 0;
env30477[1] = void 0;
const r33 = (0, getSection)({
type: "channel",
channel
}, profileApplication.id);
env30477[0] = r33;
if (r33.descriptor?.application == null) {
setState(true);
}
const application3 = r33.descriptor?.application;
application2 = application3;
if (application3 == null) {
application2 = await ApplicationActionCreators.fetchApplication(profileApplication.id);
env30477[1] = application2;
(0, setState)(false);
if (env30477[0] == null) {
break L21;
}
ActionSheetActionCreators.hideActionSheet();
await ChannelActionCreators.openPrivateChannel({
recipientIds: botUserId
});
} else {
env30477[1] = application2;
(0, setState)(false);
if (env30477[0] == null) {
break L17;
}
ActionSheetActionCreators.hideActionSheet();
await ChannelActionCreators.openPrivateChannel({
recipientIds: botUserId
});
}
setTimeout($mk116349(c27218_1), 0);
AnalyticsUtils.track(AnalyticEvents.APP_PROFILE_OPEN_APP_BUTTON_CLICKED, {
application_id: env30477[1].id
});
break L21;
}
return void 0;
}
}, [botUserId, channel, profileApplication.id]);
return <Button text={intl.string(t["Cia+A8"])} loading={loading} onPress={callback} />;
};
export default function AddOrOpenAppButton({ application: application3, botUserId: botUserId2, channel: channel2, guildId: guildId2 }) {
return useIsAppDM(channel2) && channel2 != null ? (0, jsx)(OpenAppButton, {
profileApplication: application3,
botUserId: botUserId2,
channel: channel2
}) : (0, jsx)(AddAppButton, {
application: application3,
guildId: guildId2
});
};
@@ -0,0 +1,29 @@
// Metro module 11721 (f11722).
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { Icon } from "../../../design/void/native";
import { Text } from "../../../design/components/Text/native/Text";
const useStyles = createStyles((a0) => ({
gameIcon: {
width: a0,
height: a0,
marginTop: -1,
marginRight: 4,
borderRadius: Module712.radii.xs
}
}));
export default function ApplicationIconAndName(props) {
const { application, textVariant, iconSize, useComma = false } = props;
const styles = useStyles(iconSize);
let uri = application.getIconURL(iconSize);
if (uri == null) {
uri = "";
}
return <>
{[<Icon key={application.id} style={styles.gameIcon} resizeMode="contain" source={{
uri
}} disableColor />, <Text variant={textVariant}>
{`${application.name}${useComma ? ", " : ""}`}
</Text>]}
</>;
};
@@ -0,0 +1,160 @@
// Metro module 11963 (f11964).
import { memo, useMemo } from "react";
import { View } from "react-native";
import UserStore from "../../../stores/UserStore";
import { PROFILE_CONTENT_BOTTOM_PADDING, PROFILE_CONTENT_WITHOUT_STATUS_TOP_PADDING } from "./Constants";
import { ACTION_SHEET_MAX_WIDTH } from "../../action_sheet/native/ActionSheetConstants";
import UserProfileSharedStyles from "./UserProfileSharedStyles";
import useUserProfileBannerHeight from "../hooks/native/useUserProfileBannerHeight";
import useUserProfileOverscrollStyles from "./useUserProfileOverscrollStyles";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import { useStateFromStores } from "../../../_bundle/Module589";
import NicknameUtils from "../../../utils/NicknameUtils";
import UserUtils from "../../../utils/UserUtils";
import { useSubscribeGuildMembers } from "../../../lib/guild/subscribeGuildMembers";
import useBadges from "../hooks/useBadges";
import useCustomStatusActivityForUser from "../../custom_status/utils/useCustomStatusActivityForUser";
import useProfileTheme from "../hooks/useProfileTheme";
import { useUserProfileColors } from "../hooks/native/useUserProfileColors";
import { copy } from "../../../utils/ClipboardUtils.native";
import { presentUsernameCopied, presentUserPronouns } from "../../toast/native/ToastUtils";
import UserProfileOverscrollBanner from "./UserProfileOverscrollBanner";
import ReanimatedRexport from "../../reanimated/ReanimatedRexport";
import BotUserProfileOverflowMenu from "./BotUserProfileOverflowMenu";
import { OpenableUserProfileAvatar } from "./UserProfileAvatar";
import UserProfileCustomStatusBubble from "./UserProfileCustomStatusBubble";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import UserProfilePrimaryInfo from "./UserProfilePrimaryInfo";
import { intl, t } from "../../../intl/index.native";
import UserProfileMutualGuilds from "./UserProfileMutualGuilds";
import UserProfileTextButtonGroup from "./UserProfileTextButtonGroup";
import { canInstallApplication } from "../../applications/utils/ApplicationInstallUtils";
import AddOrOpenAppButton from "./AddOrOpenAppButton";
import { Button } from "../../../design/components/Button/native/Button.native";
import { ChatIcon } from "../../../design/components/Icon/native/redesign/generated/ChatIcon";
import Module712 from "../../../_bundle/Module712";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import ChannelActionCreators from "../../../actions/ChannelActionCreators";
import UserProfileActivity from "./UserProfileActivity";
import UserProfileAboutMeCard from "./UserProfileAboutMeCard";
import UserProfileRolesCard from "./UserProfileRolesCard";
import UserProfileModeratorActions from "./UserProfileModeratorActions";
import UserProfileNote from "./UserProfileNote";
const r34 = memo(function BotUserProfileContent(props) {
let userTag, guild_id;
const { user, channel, displayProfile, showUserProfileActionSheet, disableMessage, scrollPosition } = props;
userTag = void 0;
guild_id = void 0;
const styles = UserProfileSharedStyles();
const userProfileBannerHeight = useUserProfileBannerHeight(ACTION_SHEET_MAX_WIDTH);
const styles2 = useUserProfileOverscrollStyles({
scrollPosition,
bannerHeight: userProfileBannerHeight
});
const { bannerAnimatedStyle, bannerImageAnimatedStyle, contentAnimatedStyle, blurAnimatedProps, showBlur } = styles2;
const bottom = useSafeAreaInsets_native().bottom;
const trackUserProfileAction = useUserProfileAnalyticsContext().trackUserProfileAction;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const name = NicknameUtils.useName(displayProfile?.guildId, channel?.id, user);
userTag = UserUtils.useUserTag(user);
const application = displayProfile?.application;
guild_id = channel?.guild_id;
useSubscribeGuildMembers(useMemo(() => {
let r6;
if (guild_id != null && user != null) {
const r2 = {};
r2[guild_id] = [user.id];
r6 = r2;
} else {
r6 = {};
}
return r6;
}, [guild_id, user]), "BotUserProfileContent");
const badges = useBadges(displayProfile);
const customStatusActivityForUser = useCustomStatusActivityForUser(user.id);
const profileTheme = useProfileTheme({
user,
displayProfile
});
const { theme, primaryColor } = profileTheme;
const userProfileColors = useUserProfileColors({
theme,
primaryColor,
secondaryColor: profileTheme.secondaryColor
});
const { containerBackground, avatarBackground, statusBackground } = userProfileColors;
if (user != null && stateFromStores != null) {
const r101 = [<UserProfileOverscrollBanner user={user} displayProfile={displayProfile} bannerHeight={userProfileBannerHeight} bannerAnimatedStyle={bannerAnimatedStyle} bannerImageAnimatedStyle={bannerImageAnimatedStyle} blurAnimatedProps={blurAnimatedProps} showBlur={showBlur} />, <ReanimatedRexport.View style={[styles.bannerButtons, bannerAnimatedStyle]}>
<BotUserProfileOverflowMenu user={user} application={application} channel={channel} />
</ReanimatedRexport.View>, ,];
let guildId = displayProfile?.guildId;
if (guildId == null) {
guildId = void 0;
}
const r125 = [<OpenableUserProfileAvatar user={user} guildId={guildId} backgroundColor={avatarBackground} statusStyle={{
backgroundColor: statusBackground
}} />, ,];
const style = [styles.profileContentWrapper, styles.profileContent, {
paddingTop: customStatusActivityForUser != null ? 0 : PROFILE_CONTENT_WITHOUT_STATUS_TOP_PADDING,
paddingBottom: bottom + PROFILE_CONTENT_BOTTOM_PADDING
}];
const r144 = [<UserProfileCustomStatusBubble customStatusActivity={customStatusActivityForUser} hasCustomProfileTheme={primaryColor != null} onPressTruncatedStatus={function onPressTruncatedStatus() {
ActionSheetActionCreators.openLazy(import("./UserProfileCustomStatusActionSheet"), "UserProfileCustomStatusActionSheet", {
user,
guildId: guild_id,
channelId: channel?.id
}, "stack");
}} style={styles.customStatusBubble} emojiOnlyStyle={styles.emojiOnlyCustomStatusBubble} />, , ,];
const pronouns = displayProfile?.pronouns;
const handleCopyUsername = function handleCopyUsername() {
trackUserProfileAction({
action: "COPY_USERNAME"
});
copy(userTag);
presentUsernameCopied();
};
r144[1] = <View style={styles.primaryInfo}>
<UserProfilePrimaryInfo user={user} guildId={guild_id} displayName={name} pronouns={pronouns} badges={badges} badgeContainerBackground={containerBackground} displayNameAccessibilityHint={intl.string(t.y5MwJy)} onPressDisplayName={handleCopyUsername} onPressUserTag={handleCopyUsername} onPressPronouns={function handlePressPronouns() {
trackUserProfileAction({
action: "PRESS_PRONOUNS"
});
presentUserPronouns();
}} showBadgeToastOnPress />
<UserProfileMutualGuilds user={user} />
<UserProfileTextButtonGroup style={styles.primaryButtons} maxWidth={ACTION_SHEET_MAX_WIDTH} primaryButton={application != null ? canInstallApplication(application) ? <AddOrOpenAppButton application={application} botUserId={user.id} channel={channel == null ? void 0 : channel} guildId={guild_id == null ? void 0 : guild_id} /> : void 0 : void 0} secondaryButton={<Button icon={<ChatIcon size="sm" color={Module712.colors.CONTROL_SECONDARY_TEXT_DEFAULT} />} text={intl.string(t.zROXEV)} variant="secondary" disabled={disableMessage} grow accessibilityHint={intl.formatToPlainString(t.zFfSFQ, {
name: UserUtils.getName(user)
})} onPress={() => {
trackUserProfileAction({
action: "SEND_MESSAGE"
});
ActionSheetActionCreators.hideActionSheet();
ModalActionCreators.popAll();
ChannelActionCreators.openPrivateChannel({
recipientIds: user.id
});
}} />} />
</View>;
const r225 = stateFromStores == null;
let r226 = null;
if (!r225) {
const style2 = [styles.card, {
backgroundColor: containerBackground
}];
r226 = <View style={styles.cards}>
<UserProfileActivity user={user} currentUser={stateFromStores} guildId={guild_id} style={style2} />
<UserProfileAboutMeCard userId={user.id} displayProfile={displayProfile} channel={channel} style={style2} />
{guild_id != null && <>
{[<UserProfileRolesCard userId={user.id} guildId={guild_id} style={style2} />, <UserProfileModeratorActions user={user} currentUser={stateFromStores} guildId={guild_id} channelId={channel?.id} showUserProfile={showUserProfileActionSheet} style={style2} />]}
</>}
<UserProfileNote userId={user.id} style={style2} onBack={showUserProfileActionSheet} />
</View>;
}
r144[2] = r226;
r125[1] = <View style={style}>{r144}</View>;
r101[2] = <ReanimatedRexport.View style={contentAnimatedStyle}>{r125}</ReanimatedRexport.View>;
return <>{r101}</>;
}
return null;
});
export default r34;
@@ -0,0 +1,266 @@
// Metro module 11965 (f11966).
import { useCallback } from "react";
import ChannelStore from "../../../stores/ChannelStore";
import RelationshipStore from "../../../stores/RelationshipStore";
import SelectedChannelStore from "../../../stores/SelectedChannelStore";
import UserStore from "../../../stores/UserStore";
import { AnalyticEvents, ApplicationFlags, ChannelTypesSets, RelationshipTypes } from "../../../Constants";
import { BLOCK_CONFIRMATION_ACTION_SHEET_KEY, IGNORE_CONFIRMATION_ACTION_SHEET_KEY } from "../../relationships/native/RestrictionConfirmationConstants";
import { useStateFromStoresObject, useStateFromStores } from "../../../_bundle/Module589";
import * as _SafetyExperienceIarUserReportingExperiment from "../../in_app_reports/SafetyExperienceIarUserReportingExperiment";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import showUserProfileActionSheet from "./showUserProfileActionSheet";
import { intl, t } from "../../../intl/index.native";
import RelationshipActionCreators from "../../../actions/RelationshipActionCreators";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { ImpressionNames } from "../../../_bundle/Module503";
import SafetyToastsActionCreators_native from "../../safety_common/SafetyToastsActionCreators.native";
import { BOT_REPORT_CHOOSER_KEY } from "../../in_app_reports/native/BotReportChooser";
import { isAndroid } from "../../../utils/PlatformUtils";
import { alertUserReported } from "./UserProfileAlertUtils";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { copy } from "../../../utils/ClipboardUtils.native";
import UserUtils from "../../../utils/UserUtils";
import { presentUsernameCopied, presentLinkCopied, presentIdCopied } from "../../toast/native/ToastUtils";
import * as _ApplicationFlagUtils from "../../applications/utils/ApplicationFlagUtils";
import { getInstallAppPropsFromProfileApplication } from "../../app_launcher/utils/AppLauncherUtils";
import { getActivityLaunchURL, getApplicationInstallURL } from "../../applications/getApplicationInstallURL";
import { DeveloperMode } from "../../user_settings/UserSettings";
import openUserContextMenuCommands from "./openUserContextMenuCommands";
import { ContextMenu } from "../../../design/components/ContextMenu/native/ContextMenu.native";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import { MoreHorizontalIcon } from "../../../design/components/Icon/native/redesign/generated/MoreHorizontalIcon";
import Module712 from "../../../_bundle/Module712";
export default function BotUserProfileOverflowMenu(props) {
let r224;
let stateFromStores, context, trackUserProfileAction, analyticsLocations, newestAnalyticsLocation, currentUser, callback, id, guildId, hasApplicationFlag, installAppPropsFromProfileApplication;
const { application, user, channel } = props;
stateFromStores = void 0;
context = void 0;
trackUserProfileAction = void 0;
analyticsLocations = void 0;
newestAnalyticsLocation = void 0;
currentUser = void 0;
callback = void 0;
id = void 0;
guildId = void 0;
hasApplicationFlag = void 0;
installAppPropsFromProfileApplication = void 0;
const stateFromStoresObject = useStateFromStoresObject([RelationshipStore], () => ({
relationshipType: RelationshipStore.getRelationshipType(user.id),
isIgnored: RelationshipStore.isIgnored(user.id)
}));
const { relationshipType, isIgnored } = stateFromStoresObject;
stateFromStores = useStateFromStores([SelectedChannelStore, ChannelStore], () => ChannelStore.getChannel(SelectedChannelStore.getChannelId()));
const isIarUserReportingEnabled = _SafetyExperienceIarUserReportingExperiment.isIarUserReportingEnabled("User Profile Options - Mobile");
const userProfileAnalyticsContext = useUserProfileAnalyticsContext();
context = userProfileAnalyticsContext.context;
trackUserProfileAction = userProfileAnalyticsContext.trackUserProfileAction;
const analyticsLocations2 = useAnalyticsLocations(AnalyticsLocation.USER_PROFILE_OVERFLOW_MENU);
analyticsLocations = analyticsLocations2.analyticsLocations;
newestAnalyticsLocation = analyticsLocations2.newestAnalyticsLocation;
currentUser = UserStore.getCurrentUser();
const r17 = [user.id, , , ,];
const id2 = channel?.id;
const r57 = (a0) => {
showUserProfileActionSheet({
...context,
showGuildProfile: a0,
userId: user.id,
channelId: channel?.id,
sourceAnalyticsLocations: analyticsLocations,
ignoreBlockedSpeedBump: true
});
};
r17[1] = id2;
r17[2] = context;
r17[3] = analyticsLocations;
callback = useCallback(r57, r17);
id = user.id;
const r61 = channel == null ? void 0 : channel.getGuildId();
const r63 = [];
guildId = r61;
const r66 = relationshipType === RelationshipTypes.BLOCKED;
if (isIgnored && !r66) {
r63.push({
label: intl.string(t["8wXU9B"]),
action: () => {
trackUserProfileAction({
action: "UNIGNORE",
analyticsLocations
});
RelationshipActionCreators.unignoreUser(id, newestAnalyticsLocation, channel?.id);
callback();
}
});
} else if (!r66) {
r63.push({
label: intl.string(t.ytCpKs),
action: () => {
trackUserProfileAction({
action: "IGNORE",
analyticsLocations
});
ActionSheetActionCreators.openLazy(import("../../relationships/native/IgnoreConfirmationActionSheet"), IGNORE_CONFIRMATION_ACTION_SHEET_KEY, {
userId: id,
onSuccess: () => {
callback();
},
impressionName: ImpressionNames.IGNORE_USER_CONFIRMATION
}, "stack");
}
});
}
if (r66) {
r63.push({
label: intl.string(t.XyHpKH),
action: () => {
trackUserProfileAction({
action: "UNBLOCK",
analyticsLocations
});
RelationshipActionCreators.unblockUser(id, {
location: newestAnalyticsLocation
});
SafetyToastsActionCreators_native.showUnblockSuccessToast(id, channel?.id);
callback();
}
});
}
if (!r66) {
r63.push({
label: intl.string(t.l4Emac),
variant: "destructive",
action: () => {
trackUserProfileAction({
action: "BLOCK",
analyticsLocations
});
ActionSheetActionCreators.openLazy(import("../../relationships/native/BlockConfirmationActionSheet"), BLOCK_CONFIRMATION_ACTION_SHEET_KEY, {
userId: id,
channelId: channel?.id,
onSuccess: () => {
callback();
},
impressionName: ImpressionNames.BLOCK_USER_CONFIRMATION
}, "stack");
}
});
if (isIarUserReportingEnabled) {
r63.push({
label: intl.string(t.jhJzez),
variant: "destructive",
action: () => {
trackUserProfileAction({
action: "REPORT",
analyticsLocations
});
const contextualGuildId = guildId !== "@me" ? guildId !== null ? guildId : void 0 : void 0;
ActionSheetActionCreators.openLazy(import("../../in_app_reports/native/BotReportChooser"), BOT_REPORT_CHOOSER_KEY, {
user,
entrypoint: "UserProfileOverflowMenu",
contextualGuildId,
contextualChannelId: channel?.id
}, "replaceAll");
}
});
} else if (isAndroid()) {
r63.push({
label: intl.string(t.TbHyMG),
variant: "destructive",
action: () => {
trackUserProfileAction({
action: "REPORT",
analyticsLocations
});
alertUserReported();
AnalyticsUtils.track(AnalyticEvents.TNS_USER_REPORT_SUBMITTED, {
reported_user_id: id
});
}
});
}
}
const r149 = [];
r149.push({
label: intl.string(t.y5MwJy),
action: () => {
trackUserProfileAction({
action: "COPY_USERNAME",
analyticsLocations
});
copy(UserUtils.getUserTag(user, {
decoration: "never",
identifiable: "always"
}));
presentUsernameCopied();
callback();
}
});
if (application != null) {
hasApplicationFlag = _ApplicationFlagUtils.hasApplicationFlag(application, ApplicationFlags.EMBEDDED);
installAppPropsFromProfileApplication = getInstallAppPropsFromProfileApplication(application);
r149.push({
label: intl.string(t.WqhZss),
action: () => {
trackUserProfileAction({
action: "COPY_APP_LINK",
analyticsLocations
});
copy(hasApplicationFlag ? getActivityLaunchURL({
applicationId: application.id,
referrerId: currentUser?.id
}) : getApplicationInstallURL({
id: application.id,
...installAppPropsFromProfileApplication
}));
presentLinkCopied();
}
});
}
if (DeveloperMode.getSetting()) {
r149.push({
label: intl.string(t["/AXYnE"]),
action: () => {
trackUserProfileAction({
action: "COPY_USER_ID",
analyticsLocations
});
copy(id);
presentIdCopied();
callback();
}
});
}
if (channel != null && stateFromStores != null && ChannelTypesSets.TEXTUAL.has(stateFromStores.type)) {
r149.push({
label: intl.string(t.PHjkRE),
action: () => openUserContextMenuCommands({
userId: id,
selectedChannel: stateFromStores,
showUserProfile: callback,
analyticsLocations
})
});
}
L29: {
if (r149.length === 0) {
const length = r63.length;
r224 = null;
if (length === 0) {
break L29;
}
}
r224 = <AnalyticsLocationProvider value={analyticsLocations}>
<ContextMenu items={[r149, r63]}>
{(a0) => {
const { ref, ...rest } = a0;
return <IconButton ref={a0.ref} {...rest} size="sm" variant="secondary-overlay" accessibilityLabel={intl.string(t["+zofAD"])} icon={<MoreHorizontalIcon size="sm" color={Module712.colors.WHITE} />} />;
}}
</ContextMenu>
</AnalyticsLocationProvider>;
}
return r224;
};
@@ -0,0 +1,95 @@
// Metro module 13709 (f13710).
import { View } from "react-native";
import UserStore from "../../../stores/UserStore";
import { AnalyticsObjects } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useStateFromStores } from "../../../_bundle/Module589";
import PremiumUtils from "../../../utils/PremiumUtils";
import { ActionSheet } from "../../../design/components/Sheet/native/ActionSheet.native";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { intl, t } from "../../../intl/index.native";
import { NitroWheelIcon } from "../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../design/components/TableRow/native/TableRow.native";
import { FormLabel, FormSubLabel } from "../../../design/void/Form/native/index";
import UserProfileUpsellButton from "./UserProfileUpsellButton";
const useStyles = createStyles({
nitroWheel: {
marginLeft: Module712.space.PX_8
},
sublabel: {
color: Module712.colors.TEXT_DEFAULT
},
label: {
marginBottom: 4,
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE,
alignItems: "center",
flexDirection: "row"
},
remove: {
color: Module712.colors.TEXT_FEEDBACK_CRITICAL
},
upsellButton: {
marginTop: Module712.space.PX_12,
marginBottom: Module712.space.PX_8
},
upsellTitleContainer: {
flexDirection: "row",
alignItems: "flex-end"
},
titleWrapper: {
flex: 0
},
titleContainer: {
justifyContent: "flex-start"
}
});
export default function ChangeAvatarActionSheet(props) {
const { handleUploadAvatarSelect, handleRemoveAvatarSelect, handleUploadGIFAvatarSelect, handleEditAvatarDecorationSelect } = props;
let showAnimatedAvatarUpsell = props.showAnimatedAvatarUpsell;
if (showAnimatedAvatarUpsell === void 0) {
showAnimatedAvatarUpsell = false;
}
let showRemoveAvatar = props.showRemoveAvatar;
if (showRemoveAvatar === void 0) {
showRemoveAvatar = false;
}
const styles = useStyles();
let trailing = PremiumUtils.isPremium(useStateFromStores([UserStore], () => UserStore.getCurrentUser()));
const props2 = {
title: intl.string(t.lqaIxI),
trailing: null,
titleWrapperStyle: null,
titleContainerStyle: null
};
if (trailing) {
trailing = <NitroWheelIcon />;
}
props2.trailing = trailing;
props2.titleWrapperStyle = styles.titleWrapper;
props2.titleContainerStyle = styles.titleContainer;
const r58 = [<BottomSheetTitleHeader {...props2} />, ,];
const r84 = [<TableRow label={intl.string(t["MsUY/S"])} subLabel={intl.string(t.r5hKOy)} onPress={handleUploadAvatarSelect} />, handleUploadGIFAvatarSelect != null && !showAnimatedAvatarUpsell && <TableRow label={intl.string(t["xsC+/y"])} onPress={handleUploadGIFAvatarSelect} />, , , ,];
if (showAnimatedAvatarUpsell) {
showAnimatedAvatarUpsell = <TableRow label={<View style={styles.upsellTitleContainer}>
<FormLabel text={intl.string(t.xZ0Wot)} />
<NitroWheelIcon style={styles.nitroWheel} size="sm" />
</View>} subLabel={<>
<FormSubLabel style={styles.sublabel} numberOfLines={3} text={intl.string(t.L3UPqR)} />
<View style={styles.upsellButton}>
<UserProfileUpsellButton analyticsObject={AnalyticsObjects.ANIMATED_AVATAR} label={intl.string(t.mr4K7D)} />
</View>
</>} />;
}
r84[2] = showAnimatedAvatarUpsell;
r84[3] = handleEditAvatarDecorationSelect != null && <TableRow label={<View style={styles.upsellTitleContainer}>
<FormLabel text={intl.string(t.BVcYCx)} />
</View>} onPress={handleEditAvatarDecorationSelect} />;
if (showRemoveAvatar) {
showRemoveAvatar = <TableRow label={<FormLabel style={[styles.label, styles.remove]} text={intl.string(t.twB3fz)} />} onPress={handleRemoveAvatarSelect} />;
}
r84[4] = showRemoveAvatar;
r58[1] = <TableRowGroup hasIcons={false}>{r84}</TableRowGroup>;
return <ActionSheet>{r58}</ActionSheet>;
};
@@ -0,0 +1,182 @@
// Metro module 13693 (f13694).
import { useCallback } from "react";
import { View } from "react-native";
import UserProfileSettingsStore from "../UserProfileSettingsStore";
import { AnalyticsObjects, UPLOAD_BANNER_SIZE } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import PremiumUtils from "../../../utils/PremiumUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import UploadUtils from "../../../utils/native/UploadUtils";
import { ActionSheet } from "../../../design/components/Sheet/native/ActionSheet.native";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { intl, t } from "../../../intl/index.native";
import { NitroWheelIcon } from "../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../design/components/TableRow/native/TableRow.native";
import { FormLabel, FormSubLabel } from "../../../design/void/Form/native/index";
import UserProfileUpsellButton from "./UserProfileUpsellButton";
import { useStateFromStoresObject } from "../../../_bundle/Module589";
import { getPendingAvatarSrc } from "../../recent_avatars/RecentAvatarUtils";
import useDisplayProfile from "../hooks/useDisplayProfile";
import { useDominantColorFromImage, memoizedImageSource } from "../../calls/native/VideoBackground";
import { rgb2int, int2hex } from "../../../_bundle/int2hslRaw";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import showCustomColorPickerActionSheet from "../../color_picker/native/showCustomColorPickerActionSheet";
import ColorBlock from "../../../components_native/common/color_picker/ColorBlock";
import { Text } from "../../../design/components/Text/native/Text";
import { Icon } from "../../../design/void/native";
import Module13702 from "../../../_bundle/Module13702";
let useStyles;
const ChangeBannerColorRow = function ChangeBannerColorRow(props) {
let c20640_0, color, callback;
const user = props.user;
c20640_0 = void 0;
color = void 0;
callback = void 0;
const styles = useStyles();
const stateFromStoresObject = useStateFromStoresObject([UserProfileSettingsStore], () => UserProfileSettingsStore.getPendingChanges());
const pendingAvatar = stateFromStoresObject.pendingAvatar;
let pendingAccentColor = stateFromStoresObject.pendingAccentColor;
let r12 = getPendingAvatarSrc({
userId: user.id,
image: pendingAvatar
});
const displayProfile = useDisplayProfile(user.id);
if (r12 == null) {
r12 = user.getAvatarURL(void 0, 80);
}
const r47 = rgb2int(useDominantColorFromImage(r12, memoizedImageSource(r12)));
c20640_0 = r47;
if (pendingAccentColor === void 0) {
pendingAccentColor = displayProfile?.primaryColor;
}
if (pendingAccentColor == null) {
pendingAccentColor = r47;
}
if (pendingAccentColor == null) {
pendingAccentColor = 0;
}
color = pendingAccentColor;
callback = useCallback((a0) => {
setPendingChanges({
accentColor: a0 === c20640_0 ? null : a0
});
}, [r47]);
return <TableRow label={<FormLabel style={styles.label} text={intl.string(t.xzNfPz)} />} trailing={<View style={styles.selectedColor}>
<ColorBlock style={styles.bannerColor} color={color} />
<Text style={styles.selectedColorHex} variant="text-md/medium" color="interactive-text-default">
{int2hex(color)}
</Text>
<Icon style={styles.rowArrow} size={Icon.Sizes.CUSTOM} source={Module13702} />
</View>} onPress={function handleChangeColor() {
showCustomColorPickerActionSheet({
color,
onSelect: callback
});
}} />;
};
useStyles = createStyles({
label: {
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE,
alignItems: "center",
flexDirection: "row"
},
sublabel: {
color: Module712.colors.TEXT_DEFAULT
},
nitroWheel: {
marginLeft: Module712.space.PX_8
},
bannerColor: {
borderColor: Module712.colors.INTERACTIVE_TEXT_DEFAULT,
borderWidth: 1,
borderRadius: Module712.radii.xs,
height: 24,
minWidth: 24
},
selectedColor: {
flexDirection: "row",
alignItems: "center"
},
selectedColorHex: {
textTransform: "uppercase"
},
rowArrow: {
height: 13,
width: 8,
marginLeft: 10,
marginTop: 2
},
upsellButton: {
marginTop: Module712.space.PX_8
},
remove: {
color: Module712.colors.TEXT_FEEDBACK_CRITICAL
},
titleWrapper: {
flex: 0
},
titleContainer: {
justifyContent: "flex-start"
}
});
export default function ChangeBannerActionSheet(props) {
const { user, analyticsLocations, onBannerChange } = props;
let removeText = props.removeText;
let showRemoveBanner = props.showRemoveBanner;
if (showRemoveBanner === void 0) {
showRemoveBanner = false;
}
let isTryItOut = props.isTryItOut;
if (isTryItOut === void 0) {
isTryItOut = false;
}
let _handleBannerUploadSelect2 = function _handleBannerUploadSelect() {
const r9 = async () => {
let c30660_1;
c30660_1 = void 0;
ActionSheetActionCreators.hideActionSheet();
let c31697_0 = await UploadUtils.openImagePicker(UPLOAD_BANNER_SIZE);
let c31697_1 = c31697_0.base64;
let c31697_2 = c31697_0.originalMd5;
if (c31697_1 != null) {
(0, onBannerChange)(c31697_1, c31697_2);
}
};
_handleBannerUploadSelect2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
const analyticsLocations2 = useAnalyticsLocations(analyticsLocations).analyticsLocations;
if (!isTryItOut) {
isTryItOut = PremiumUtils.canUsePremiumProfileCustomization(user);
}
const r61 = [<BottomSheetTitleHeader title={intl.string(t.Vgdusv)} trailing={isTryItOut && <NitroWheelIcon />} titleWrapperStyle={styles.titleWrapper} titleContainerStyle={styles.titleContainer} />, ,];
const r68 = [isTryItOut ? null : <ChangeBannerColorRow user={user} />, <TableRow label={<View style={styles.label}>
<FormLabel text={showRemoveBanner ? intl.string(t.N0bC3P) : intl.string(t["70CYsY"])} />
{isTryItOut ? !isTryItOut : <NitroWheelIcon style={styles.nitroWheel} size="sm" />}
</View>} subLabel={<>
<FormSubLabel style={styles.sublabel} numberOfLines={2} text={isTryItOut ? intl.string(t.IhzZlo) : intl.string(t.NSTmdO)} />
{isTryItOut ? !isTryItOut : <View style={styles.upsellButton}>
<UserProfileUpsellButton analyticsObject={AnalyticsObjects.EDIT_PROFILE_BANNER} />
</View>}
</>} onPress={isTryItOut ? function handleBannerUploadSelect() {
return _handleBannerUploadSelect2.apply(this, arguments);
} : void 0} />, ,];
if (showRemoveBanner) {
if (removeText == null) {
removeText = intl.string(t.tT9n7D);
}
showRemoveBanner = <TableRow label={<FormLabel style={[styles.label, styles.remove]} text={removeText} />} onPress={function handleBannerDelete() {
onBannerChange(null);
ActionSheetActionCreators.hideActionSheet();
}} />;
}
r68[2] = showRemoveBanner;
r61[1] = <TableRowGroup hasIcons={false}>{r68}</TableRowGroup>;
return <AnalyticsLocationProvider value={analyticsLocations2}>
<ActionSheet>{r61}</ActionSheet>
</AnalyticsLocationProvider>;
};
+34
View File
@@ -0,0 +1,34 @@
// Metro module 5563 (f5564).
import { AvatarSizes, AVATAR_SIZE_MAP } from "../../../design/void/native";
import { ICON_SIZE } from "../../../design/components/Icon/IconSize";
const XXLARGE = AvatarSizes.XXLARGE;
const r24 = AVATAR_SIZE_MAP[XXLARGE];
const r25 = r24 + 12;
const r0 = r24 / 2;
const md = ICON_SIZE.md;
const r30 = {
ACTION_SHEET: "action_sheet",
YOU_SCREEN: "you_screen",
PREVIEW: "preview",
EDIT_FORM: "edit_form"
};
export const ARBITRARY_LARGE_OFFSET = 250;
export const PROFILE_SIDE_PADDING = 16;
export { XXLARGE as AVATAR_SIZE_VARIANT };
export { r24 as AVATAR_SIZE };
export const AVATAR_PADDING = 6;
export { r25 as AVATAR_CONTAINER_SIZE };
export const AVATAR_CUSTOM_STATUS_GAP = 4;
export const BANNER_ASPECT_RATIO = 2.86;
export const PROFILE_CONTENT_WITHOUT_STATUS_TOP_PADDING = 12 + r0 + 6;
export const PROFILE_CONTENT_BOTTOM_PADDING = 20;
export const CARD_PADDING = 16;
export const CARD_ROWS_ICON_SIZE_VARIANT = "md";
export { md as CARD_ROWS_ICON_SIZE };
export const CARD_ROWS_COLUMN_GAP = 16;
export const WISHLIST_SUGGESTION_CARD_GAP = 8;
export const FLOATING_UPSELL_HEIGHT = 140;
export const COLLECTIBLES_PREVIEW_SIZE = 48;
export { r30 as UserProfileThemeTypes };
export const PROFILE_TOP_LAYER_Z_INDEX = 2;
export const DIVIDER_DOT = " ∙ ";
@@ -0,0 +1,40 @@
// Metro module 9454 (f9455).
import { View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { Text } from "../../../design/components/Text/native/Text";
import BotTag from "../../applications/native/BotTag";
const useStyles = createStyles({
container: {
flexGrow: 1,
alignItems: "center",
flexDirection: "row"
},
botTag: {
marginLeft: Module712.space.PX_4
}
});
export default function DiscordTag(props) {
let r7;
const { user, nick, usernameStyle, nicknameStyle, discriminatorStyle, hideBotTag = false } = props;
const styles = useStyles();
if (nick != null) {
r7 = <Text variant="text-md/semibold" maxFontSizeMultiplier={2} style={nicknameStyle} lineClamp={1}>{nick}</Text>;
} else {
const r2 = user != null;
r7 = null;
if (r2) {
const r27 = [user.toString(), ,];
const hasUniqueUsername = user.hasUniqueUsername();
r27[1] = hasUniqueUsername ? !hasUniqueUsername : <Text variant="text-md/semibold" color="text-muted" style={discriminatorStyle}>
#
{user.discriminator}
</Text>;
r7 = <Text variant="text-md/semibold" style={usernameStyle} lineClamp={1} maxFontSizeMultiplier={2}>{r27}</Text>;
}
}
return <View style={styles.container}>
{r7}
{user?.bot === true ? hideBotTag ? null : <BotTag style={styles.botTag} verified={user.isVerifiedBot()} /> : null}
</View>;
};
@@ -0,0 +1,141 @@
// Metro module 7936 (f7937).
import { useCallback, useMemo, useState } from "react";
import { View } from "react-native";
import CollectiblesPurchaseStore from "../../collectibles/CollectiblesPurchaseStore";
import { isAvatarDecorationRecord } from "../../collectibles/records/AvatarDecorationRecord";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import { AnalyticEvents } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import usePendingAvatarSettings from "../hooks/usePendingAvatarSettings";
import { getPendingAvatarSrc } from "../../recent_avatars/RecentAvatarUtils";
import { useBottomSheetRef } from "../../../design/components/Sheet/native/useBottomSheetRef";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { ThemeContextProvider } from "../../../_bundle/Module3901";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import EditCollectiblesCTAButton from "./EditCollectiblesCTAButton";
import { useGetOrFetchCollectiblesCategoriesAndPurchases } from "../../collectibles/hooks/useFetchCollectiblesCategoriesAndPurchases";
import { useStateFromStores } from "../../../_bundle/Module589";
import useAvatarDecorationSections from "../../collectibles/avatar_decorations/useAvatarDecorationSections";
import { getProfilePreviewValue } from "../../profile_customization/ProfileCustomizationUtils";
import { EditAvatarDecorationRow } from "../../collectibles/avatar_decorations/native/EditAvatarDecorationSection";
import EditCollectiblesPreviewDetails from "./EditCollectiblesPreviewDetails";
import { EditCollectiblesPickerList } from "../../collectibles/native/EditCollectiblesPickerList";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
import HeaderAvatar from "../../profile_customization/native/HeaderAvatar";
import { AvatarSizes } from "../../../design/void/native";
import AvatarGrid from "../../collectibles/avatar_decorations/native/AvatarGrid";
let useStyles, AvatarDecorationSectionPreview;
const EditAvatarDecorationInner = function EditAvatarDecorationInner(props) {
const { pendingAvatarSrc, user, selectedAvatarDecoration, setSelectedAvatarDecoration, guildId, isTryItOut: isTryItOut2 = false } = props;
const isTryItOut = isTryItOut2;
useGetOrFetchCollectiblesCategoriesAndPurchases();
const stateFromStores = useStateFromStores([CollectiblesPurchaseStore], () => CollectiblesPurchaseStore.isFetching);
const avatarDecorationSections = useAvatarDecorationSections();
const profilePreviewValue = getProfilePreviewValue({
pendingValue: selectedAvatarDecoration,
userValue: user?.avatarDecoration,
guildValue: useStateFromStores([GuildMemberStore], () => guildId != null ? GuildMemberStore.getMember(guildId, user.id) : null)?.avatarDecoration,
guildId
});
const callback = useCallback((a0) => <EditAvatarDecorationRow items={a0.items} size={a0.size} selectedSkuId={a0.selectedSkuId} setSelectedAvatarDecoration={setSelectedAvatarDecoration} guildId={guildId} isTryItOut={isTryItOut} />, [setSelectedAvatarDecoration, guildId, isTryItOut]);
return <>
{[<AvatarDecorationSectionPreview previewSkuId={profilePreviewValue?.skuId} user={user} guildId={guildId} pendingAvatarSrc={pendingAvatarSrc} />, <EditCollectiblesPreviewDetails user={user} previewSkuId={profilePreviewValue?.skuId} nitroJoinCTA={intl.string(t.FyBDiY)} nitroUpgradeCTA={intl.string(t.e1UiOa)} />, <EditCollectiblesPickerList sections={avatarDecorationSections} selectedSkuId={selectedAvatarDecoration?.skuId} renderRow={callback} isFetching={stateFromStores} />]}
</>;
};
AvatarDecorationSectionPreview = function AvatarDecorationSectionPreview(props) {
const { previewSkuId, user: user2, guildId: guildId2, pendingAvatarSrc } = props;
const styles = useStyles();
const collectiblesData = useCollectiblesData(previewSkuId);
const { product, purchase } = collectiblesData;
const memo = useMemo(() => {
let r3 = product == null ? void 0 : product.items[0];
if (r3 == null) {
r3 = purchase == null ? void 0 : purchase.items[0];
}
return isAvatarDecorationRecord(r3) ? r3 : null;
}, [purchase, product]);
return <View style={styles.avatarDisplayContainer} accessibilityLabel={memo != null ? intl.formatToPlainString(t.Do2lxE, {
a11y_text: memo.label
}) : intl.string(t["7hRBmC"])} accessibilityRole="image" accessible>
<HeaderAvatar user={user2} guildId={guildId2} pendingAvatarSrc={pendingAvatarSrc} pendingAvatarDecoration={memo} size={AvatarSizes.EDIT_AVATAR_DECORATION} />
<AvatarGrid user={user2} guildId={guildId2} pendingAvatarSrc={pendingAvatarSrc} pendingAvatarDecoration={memo} />
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
bounceOffset: {
position: "absolute",
top: -250,
height: 250,
right: 0,
left: 0
},
title: {
alignSelf: "center",
color: Module712.colors.MOBILE_TEXT_HEADING_PRIMARY,
margin: 25
},
avatarDisplayContainer: {
flexDirection: "row",
width: "100%",
justifyContent: "center",
alignItems: "center",
paddingVertical: 16
}
});
export default function EditAvatarDecorationActionSheet(props) {
const { user: user2, guildId: guildId2, currentAvatarDecoration, isTryItOut: isTryItOut2 } = props;
let analyticsLocations = props.analyticsLocations;
const styles = useStyles();
const pendingAvatarSettings = usePendingAvatarSettings({
analyticsLocations,
isTryItOut: isTryItOut2,
guildId: guildId2
});
const { pendingAvatar, setPendingAvatarDecoration } = pendingAvatarSettings;
const pendingAvatarSrc = getPendingAvatarSrc({
userId: user2.id,
image: pendingAvatar
});
const [state, setSelectedAvatarDecoration2] = useState(currentAvatarDecoration);
const bottomSheetRef = useBottomSheetRef().bottomSheetRef;
if (analyticsLocations == null) {
analyticsLocations = [];
}
const analyticsLocations2 = useAnalyticsLocations(analyticsLocations, AnalyticsLocation.EDIT_AVATAR_DECORATION_SHEET).analyticsLocations;
const callback = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
type: AnalyticsLocation.EDIT_AVATAR_DECORATION_SHEET,
is_fullscreen: true
});
}, []);
const callback2 = useCallback(() => {
let r3 = state;
if (state == null) {
r3 = null;
}
setPendingAvatarDecoration(r3);
}, [state, setPendingAvatarDecoration]);
return <ThemeContextProvider>
<AnalyticsLocationProvider value={analyticsLocations2}>
<BottomSheet scrollable ref={bottomSheetRef} onExpand={callback} startExpanded>
<View style={styles.container}>
<View style={styles.bounceOffset} />
<Text variant="redesign/heading-18/bold" style={styles.title} accessibilityRole="header">
{intl.string(t.HykynS)}
</Text>
<EditAvatarDecorationInner user={user2} guildId={guildId2} pendingAvatarSrc={pendingAvatarSrc} selectedAvatarDecoration={state} setSelectedAvatarDecoration={setSelectedAvatarDecoration2} isTryItOut={isTryItOut2} />
</View>
<EditCollectiblesCTAButton user={user2} currentSkuId={currentAvatarDecoration?.skuId} selectedSkuId={state?.skuId} isTryItOut={isTryItOut2} onApply={callback2} analyticsLocations={analyticsLocations2} analyticsSource={AnalyticsLocation.EDIT_AVATAR_DECORATION_SHEET} />
</BottomSheet>
</AnalyticsLocationProvider>
</ThemeContextProvider>;
};
@@ -0,0 +1,8 @@
// Metro module 7956 (f7957).
import { UserSettingsSections } from "../../../Constants";
import { openUserSettings } from "../../user_settings/core/native/openUserSettings";
export function navigateToNitroManagement() {
openUserSettings({
screen: UserSettingsSections.PREMIUM
});
}
@@ -0,0 +1,149 @@
// Metro module 7954 (f7955).
import * as Module19 from "react";
import { useEffect, useMemo, useCallback } from "react";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import { CollectiblesMobileShopScreen } from "../../collectibles/CollectiblesShopConstants";
import { MEDIA_PICKER_SEND_BUTTON_SPRING } from "../../media_keyboard/native/MediaKeyboardConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { useStateFromStores } from "../../../_bundle/Module589";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle, useAnimatedProps } from "../../reanimated/ReanimatedRexport";
import * as _spring from "../../../design/animation/reanimated/spring/spring";
import PremiumUtils from "../../../utils/PremiumUtils";
import { isPremiumCollectiblesProduct, isPremiumCollectiblesPurchase } from "../../collectibles/CollectiblesUtils";
import { intl, t } from "../../../intl/index.native";
import { triggerHapticFeedback, HapticFeedbackTypes } from "../../haptics/HapticUtils.native";
import { navigateToNitroManagement } from "./EditCollectiblesActionCreators";
import { openCollectiblesShopMobile } from "../../collectibles/CollectiblesActionCreators";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { Button } from "../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
buttonRowContainer: {
flexGrow: 0,
flexDirection: "row",
justifyContent: "flex-end",
paddingHorizontal: 12,
height: 48
},
buttonContainer: {
position: "absolute",
bottom: 0,
left: 0,
right: 0,
marginLeft: 24,
marginRight: 24,
flexDirection: "column",
justifyContent: "flex-end"
}
});
const __initData = {
code: "function EditCollectiblesCTAButtonTsx1(){const{shouldShowButton,APPLY_BUTTON_BOUNCE_DISTANCE,APPLY_BUTTON_SCALE_TRANSITION,reducedMotion,withSpring,MEDIA_PICKER_SEND_BUTTON_SPRING}=this.__closure;const targetTranslateY=shouldShowButton.get()?0:APPLY_BUTTON_BOUNCE_DISTANCE;const targetScale=shouldShowButton.get()?1:APPLY_BUTTON_SCALE_TRANSITION;return{transform:[{translateY:reducedMotion?targetTranslateY:withSpring(targetTranslateY,MEDIA_PICKER_SEND_BUTTON_SPRING)},{scale:reducedMotion?targetScale:withSpring(targetScale,MEDIA_PICKER_SEND_BUTTON_SPRING)}]};}"
};
const __initData2 = {
code: "function EditCollectiblesCTAButtonTsx2(){const{shouldShowButton}=this.__closure;return{pointerEvents:shouldShowButton.get()?'box-none':'none'};}"
};
const __initData3 = {
code: "function EditCollectiblesCTAButtonTsx3(){const{shouldShowButton,reducedMotion,withSpring,MEDIA_PICKER_SEND_BUTTON_SPRING}=this.__closure;const targetOpacity=shouldShowButton.get()?1:0;return{opacity:reducedMotion?targetOpacity:withSpring(targetOpacity,{...MEDIA_PICKER_SEND_BUTTON_SPRING,overshootClamping:true})};}"
};
const r38 = Module19.memo(function({ user, currentSkuId, selectedSkuId, isTryItOut: isTryItOut2, onApply, analyticsLocations, analyticsSource }) {
let sharedValue, isTryItOut, c16125_9;
sharedValue = void 0;
isTryItOut = void 0;
c16125_9 = void 0;
const styles = useStyles();
const bottom = useSafeAreaInsets_native().bottom;
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const collectiblesData = useCollectiblesData(selectedSkuId);
const { product, purchase } = collectiblesData;
sharedValue = useSharedValue(false);
useEffect(() => {
sharedValue.set(selectedSkuId !== currentSkuId);
}, [selectedSkuId, currentSkuId, sharedValue]);
const O = function O() {
const r0 = sharedValue.get() ? 0 : 60;
const r1 = sharedValue.get() ? 1 : 0.9;
return {
transform: [{
translateY: stateFromStores ? r0 : _spring.withSpring(r0, MEDIA_PICKER_SEND_BUTTON_SPRING)
}, {
scale: stateFromStores ? r1 : _spring.withSpring(r1, MEDIA_PICKER_SEND_BUTTON_SPRING)
}]
};
};
O.__closure = {
shouldShowButton: sharedValue,
APPLY_BUTTON_BOUNCE_DISTANCE: 60,
APPLY_BUTTON_SCALE_TRANSITION: 0.9,
reducedMotion: stateFromStores,
withSpring: _spring.withSpring,
MEDIA_PICKER_SEND_BUTTON_SPRING
};
O.__workletHash = 15594859424201;
O.__initData = __initData;
const animatedStyle = useAnimatedStyle(O);
const M = function M() {
return {
pointerEvents: sharedValue.get() ? "box-none" : "none"
};
};
M.__closure = {
shouldShowButton: sharedValue
};
M.__workletHash = 16151141699021;
M.__initData = __initData2;
const animatedProps = useAnimatedProps(M);
const R = function R() {
const r0 = sharedValue.get() ? 1 : 0;
return {
opacity: stateFromStores ? r0 : _spring.withSpring(r0, {
...MEDIA_PICKER_SEND_BUTTON_SPRING,
overshootClamping: true
})
};
};
R.__closure = {
shouldShowButton: sharedValue,
reducedMotion: stateFromStores,
withSpring: _spring.withSpring,
MEDIA_PICKER_SEND_BUTTON_SPRING
};
R.__workletHash = 13351061137085;
R.__initData = __initData3;
const animatedStyle2 = useAnimatedStyle(R);
const canUseCollectibles = PremiumUtils.canUseCollectibles(user);
let r81 = isPremiumCollectiblesProduct(product) || isPremiumCollectiblesPurchase(purchase);
const r85 = canUseCollectibles ? !canUseCollectibles : isPremiumCollectiblesPurchase(purchase);
isTryItOut = selectedSkuId == null || purchase != null && !r85 || (r81 ? isTryItOut2 : r81);
if (r81) {
r81 = !canUseCollectibles;
}
if (r81) {
r81 = !isTryItOut2;
}
c16125_9 = r81;
const memo = useMemo(() => isTryItOut ? intl.string(t.Jh8fJz) : c16125_9 ? PremiumUtils.isPremium(user) ? intl.string(t.KXLX7l) : intl.string(t.mr4K7D) : intl.string(t.fYfGgK), [isTryItOut, r81, user]);
return <ReanimatedRexport.View style={[styles.buttonContainer, animatedStyle2]} animatedProps={animatedProps}>
<ReanimatedRexport.View style={[styles.buttonRowContainer, animatedStyle, {
marginBottom: bottom
}]} pointerEvents="box-none">
<Button variant={r81 ? "active" : "primary"} onPress={useCallback(() => {
if (isTryItOut) {
triggerHapticFeedback(HapticFeedbackTypes.IMPACT_MEDIUM);
onApply();
} else if (c16125_9) {
navigateToNitroManagement();
} else {
openCollectiblesShopMobile({
analyticsLocations,
analyticsSource,
initialProductSkuId: selectedSkuId,
screen: CollectiblesMobileShopScreen.SHOP_ALL
});
}
ActionSheetActionCreators.hideActionSheet();
}, [isTryItOut, onApply, r81, analyticsLocations, analyticsSource, selectedSkuId])} size="md" text={memo} grow />
</ReanimatedRexport.View>
</ReanimatedRexport.View>;
});
export default r38;
@@ -0,0 +1,111 @@
// Metro module 7974 (f7975).
import { View } from "react-native";
import LocaleStore from "../../user_settings/LocaleStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { useStateFromStores } from "../../../_bundle/Module589";
import PremiumUtils from "../../../utils/PremiumUtils";
import { isPremiumCollectiblesProduct, isPremiumCollectiblesPurchase } from "../../collectibles/CollectiblesUtils";
import { diffAsUnits } from "../../../utils/DateUtils";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
let useStyles;
const EditCollectiblesPreviewDescription = function EditCollectiblesPreviewDescription(props) {
let r130, r140;
const { user, product, purchase, nitroJoinCTA, nitroUpgradeCTA } = props;
const stateFromStores = useStateFromStores([LocaleStore], () => LocaleStore.locale);
const canUseCollectibles = PremiumUtils.canUseCollectibles(user);
const r41 = isPremiumCollectiblesProduct(product) || isPremiumCollectiblesPurchase(purchase);
const r45 = canUseCollectibles ? !canUseCollectibles : isPremiumCollectiblesPurchase(purchase);
if (purchase != null && !r45) {
const r22 = purchase?.expiresAt != null ? diffAsUnits(new Date(), purchase.expiresAt) : null;
return <>
{[r22 != null && <Text variant="text-sm/medium" color="text-default">
{intl.format(t.Io7ozn, {
days: r22.days.toString()
})}
</Text>, <Text variant="text-sm/medium" color="text-default">
{intl.format(t.gW9R4B, {
date: purchase == null ? void 0 : purchase.purchasedAt.toLocaleDateString(stateFromStores, {
month: "long",
year: "numeric"
})
})}
</Text>, purchase?.expiresAt != null && <Text variant="text-sm/medium" color="text-default">
{intl.format(t.eZSTa5, {
date: purchase.expiresAt.toLocaleDateString(stateFromStores, {
minute: "numeric",
hour: "numeric",
day: "numeric",
month: "long",
year: "numeric"
})
})}
</Text>]}
</>;
}
if (r41) {
if (canUseCollectibles) {
r140 = <Text variant="text-sm/medium" color="text-default">
{intl.string(t.hmyYK8)}
</Text>;
} else {
const isPremium = PremiumUtils.isPremium(user);
const props2 = {
variant: "text-sm/medium",
color: "text-default",
children: null
};
if (isPremium) {
props2.children = nitroUpgradeCTA;
r140 = <Text {...props2} />;
} else {
props2.children = nitroJoinCTA;
r140 = <Text {...props2} />;
}
}
r130 = r140;
} else {
r130 = <Text variant="text-sm/medium" color="text-default">
{intl.string(t.fEGjVQ)}
</Text>;
}
return r130;
};
useStyles = createStyles({
productDetailsContainer: {
width: "100%",
marginTop: 16,
alignItems: "center",
gap: 2
}
});
export default function EditCollectiblesPreviewDetails(props) {
let r21;
L10: {
const { user, previewSkuId, nitroJoinCTA, nitroUpgradeCTA } = props;
const styles = useStyles();
const collectiblesData = useCollectiblesData(previewSkuId);
const { product, purchase } = collectiblesData;
const r2 = previewSkuId == null;
r21 = null;
if (!r2) {
if (product == null) {
const r22 = purchase == null;
r21 = null;
if (r22) {
break L10;
}
}
let r16 = product?.name;
if (r16 == null) {
r16 = purchase?.name;
}
r21 = <View style={styles.productDetailsContainer}>
<Text variant="text-md/bold" color="text-default">{r16}</Text>
<EditCollectiblesPreviewDescription user={user} product={product} purchase={purchase} nitroJoinCTA={nitroJoinCTA} nitroUpgradeCTA={nitroUpgradeCTA} />
</View>;
}
}
return r21;
};
@@ -0,0 +1,156 @@
// Metro module 13731 (f13732).
import { useCallback, useMemo, useState } from "react";
import { View } from "react-native";
import CollectiblesPurchaseStore from "../../collectibles/CollectiblesPurchaseStore";
import { isNameplateRecord } from "../../collectibles/records/NameplateRecord";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import { AnalyticEvents } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useBottomSheetRef } from "../../../design/components/Sheet/native/useBottomSheetRef";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import EditCollectiblesCTAButton from "./EditCollectiblesCTAButton";
import { useGetOrFetchCollectiblesCategoriesAndPurchases } from "../../collectibles/hooks/useFetchCollectiblesCategoriesAndPurchases";
import { useStateFromStores } from "../../../_bundle/Module589";
import useNameplateSections from "../../collectibles/nameplates/useNameplateSections";
import { getProfilePreviewValue } from "../../profile_customization/ProfileCustomizationUtils";
import { EditNameplateRow } from "../../collectibles/nameplates/native/EditNameplateSection";
import EditCollectiblesPreviewDetails from "./EditCollectiblesPreviewDetails";
import { EditCollectiblesPickerList } from "../../collectibles/native/EditCollectiblesPickerList";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
import { NameplateDummyUserPreview } from "../../collectibles/nameplates/native/NameplateDummyUserPreview";
import Module4611 from "../../../_bundle/Module4611";
import { NameplatePreview } from "../../collectibles/nameplates/native/NameplatePreview";
let useStyles, NameplateActionSheetPreview;
const EditNameplateInner = function EditNameplateInner(props) {
const { user, selectedNameplate, setSelectedNameplate, guildId } = props;
useGetOrFetchCollectiblesCategoriesAndPurchases();
const stateFromStores2 = useStateFromStores([CollectiblesPurchaseStore], () => CollectiblesPurchaseStore.isFetching);
const nameplateSections = useNameplateSections();
const stateFromStores = useStateFromStores([GuildMemberStore], () => guildId != null ? GuildMemberStore.getMember(guildId, user.id) : null);
const profilePreviewValue = getProfilePreviewValue({
pendingValue: selectedNameplate,
userValue: user == null ? void 0 : user.collectibles?.nameplate,
guildValue: stateFromStores == null ? void 0 : stateFromStores.collectibles?.nameplate,
guildId
});
const callback = useCallback((a0) => <EditNameplateRow items={a0.items} size={a0.size} selectedSkuId={a0.selectedSkuId} setSelectedNameplate={setSelectedNameplate} guildId={guildId} />, [setSelectedNameplate, guildId]);
return <>
{[<NameplateActionSheetPreview previewSkuId={profilePreviewValue?.skuId} user={user} guildId={guildId} />, <EditCollectiblesPreviewDetails user={user} previewSkuId={profilePreviewValue?.skuId} nitroJoinCTA={intl.string(t["V+IE93"])} nitroUpgradeCTA={intl.string(t.a6SrkR)} />, <EditCollectiblesPickerList sections={nameplateSections} selectedSkuId={selectedNameplate?.skuId} renderRow={callback} isFetching={stateFromStores2} />]}
</>;
};
NameplateActionSheetPreview = function NameplateActionSheetPreview(props) {
const { previewSkuId, user: user2, guildId: guildId3 } = props;
const styles = useStyles();
const collectiblesData = useCollectiblesData(previewSkuId);
const { product, purchase } = collectiblesData;
const memo = useMemo(() => {
let r3 = product == null ? void 0 : product.items[0];
if (r3 == null) {
r3 = purchase == null ? void 0 : purchase.items[0];
}
return isNameplateRecord(r3) ? r3 : null;
}, [purchase, product]);
return <View style={styles.nameplatePreviewContainer} accessibilityLabel={memo != null ? intl.formatToPlainString(t.YJig7C, {
a11y_text: memo.label
}) : intl.string(t.aqlsGS)} accessibilityRole="image" accessible>
<View style={styles.nameplateGradientContainer}>
<NameplateDummyUserPreview width={100} />
<NameplateDummyUserPreview width={140} />
<Module4611 style={styles.nameplatePreviewGradient} start={{
x: 0,
y: 0.1
}} end={{
x: 0,
y: 0.8
}} colors={[styles.nameplatePreviewGradient.color, `${styles.nameplatePreviewGradient.color}00`]} />
</View>
<NameplatePreview nameplate={memo} user={user2} guildId={guildId3} animate aria-hidden />
<View style={styles.nameplateGradientContainer}>
<NameplateDummyUserPreview width={140} />
<NameplateDummyUserPreview width={100} />
<Module4611 style={styles.nameplatePreviewGradient} start={{
x: 0,
y: 0.2
}} end={{
x: 0,
y: 0.9
}} colors={[`${styles.nameplatePreviewGradient.color}00`, styles.nameplatePreviewGradient.color]} />
</View>
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
bounceOffset: {
position: "absolute",
top: -250,
height: 250,
right: 0,
left: 0
},
title: {
alignSelf: "center",
color: Module712.colors.MOBILE_TEXT_HEADING_PRIMARY,
margin: 25
},
nameplatePreviewContainer: {
width: "80%",
alignSelf: "center",
justifyContent: "center",
alignItems: "center"
},
nameplateGradientContainer: {
width: "100%"
},
nameplatePreviewGradient: {
position: "absolute",
width: "100%",
height: "100%",
color: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
}
});
export default function EditNameplateActionSheet(props) {
const { user: user2, currentNameplate, guildId: guildId2 } = props;
const styles = useStyles();
const bottomSheetRef = useBottomSheetRef().bottomSheetRef;
const [state, setSelectedNameplate2] = useState(void 0);
const selectedNameplate = state !== void 0 ? state : currentNameplate;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.EDIT_NAMEPLATE_SHEET).analyticsLocations;
const callback = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
type: AnalyticsLocation.EDIT_NAMEPLATE_SHEET,
is_fullscreen: true
});
}, []);
const callback2 = useCallback(() => {
let nameplate = state;
if (state == null) {
nameplate = null;
}
setPendingChanges({
guildId: guildId2,
nameplate
});
}, [state, guildId2]);
return <AnalyticsLocationProvider value={analyticsLocations}>
<BottomSheet scrollable ref={bottomSheetRef} onExpand={callback} startExpanded>
<View style={styles.container}>
<View style={styles.bounceOffset} />
<Text variant="redesign/heading-18/bold" style={styles.title} accessibilityRole="header">
{intl.string(t.BwdeM1)}
</Text>
<EditNameplateInner user={user2} selectedNameplate={selectedNameplate} setSelectedNameplate={setSelectedNameplate2} guildId={guildId2} />
</View>
<EditCollectiblesCTAButton user={user2} currentSkuId={currentNameplate?.skuId} selectedSkuId={selectedNameplate?.skuId} onApply={callback2} analyticsLocations={analyticsLocations} analyticsSource={AnalyticsLocation.EDIT_NAMEPLATE_SHEET} />
</BottomSheet>
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,161 @@
// Metro module 13722 (f13723).
import { useEffect, useCallback, useMemo, useState } from "react";
import { View, StyleSheet } from "react-native";
import CollectiblesPurchaseStore from "../../collectibles/CollectiblesPurchaseStore";
import { isProfileEffectRecord } from "../../collectibles/records/ProfileEffectRecord";
import { AnalyticEvents } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import useDisplayProfile from "../hooks/useDisplayProfile";
import { useBottomSheetRef } from "../../../design/components/Sheet/native/useBottomSheetRef";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { setTryItOutProfileEffect } from "../UserProfileActionCreators";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import EditCollectiblesCTAButton from "./EditCollectiblesCTAButton";
import { useGetOrFetchCollectiblesCategoriesAndPurchases } from "../../collectibles/hooks/useFetchCollectiblesCategoriesAndPurchases";
import { useStateFromStores } from "../../../_bundle/Module589";
import useProfileEffectSections from "../../collectibles/profile_effects/useProfileEffectSections";
import { getProfilePreviewValue } from "../../profile_customization/ProfileCustomizationUtils";
import maybeFetchUserProfile from "../maybeFetchUserProfile";
import { EditProfileEffectRow } from "../../collectibles/profile_effects/native/EditProfileEffectSection";
import EditCollectiblesPreviewDetails from "./EditCollectiblesPreviewDetails";
import { EditCollectiblesPickerList } from "../../collectibles/native/EditCollectiblesPickerList";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
import ProfileEffectUserPreview from "../../collectibles/profile_effects/native/previews/ProfileEffectUserPreview";
import Module4611 from "../../../_bundle/Module4611";
let useStyles, ProfileEffectSectionPreview;
const EditProfileEffectInner = function EditProfileEffectInner(props) {
const { user, selectedProfileEffect, setSelectedProfileEffect, guildId, isTryItOut: isTryItOut3 = false } = props;
const isTryItOut = isTryItOut3;
useGetOrFetchCollectiblesCategoriesAndPurchases();
const stateFromStores = useStateFromStores([CollectiblesPurchaseStore], () => CollectiblesPurchaseStore.isFetching);
const profileEffectSections = useProfileEffectSections();
const displayProfile = useDisplayProfile(user.id, guildId);
const profilePreviewValue = getProfilePreviewValue({
pendingValue: selectedProfileEffect,
userValue: displayProfile == null ? void 0 : displayProfile._userProfile?.profileEffect,
guildValue: displayProfile == null ? void 0 : displayProfile._guildMemberProfile?.profileEffect,
guildId
});
useEffect(() => {
if (!(user == null || user.isNonUserBot())) {
maybeFetchUserProfile(user.id, user.getAvatarURL(null, 80), {
withMutualGuilds: true,
dispatchWait: true
});
}
}, [user]);
const callback = useCallback((a0) => <EditProfileEffectRow items={a0.items} size={a0.size} selectedSkuId={a0.selectedSkuId} setSelectedProfileEffect={setSelectedProfileEffect} guildId={guildId} isTryItOut={isTryItOut} />, [setSelectedProfileEffect, guildId, isTryItOut]);
return <>
{[<ProfileEffectSectionPreview previewSkuId={profilePreviewValue?.skuId} user={user} guildId={guildId} />, <EditCollectiblesPreviewDetails user={user} previewSkuId={profilePreviewValue?.skuId} nitroJoinCTA={intl.string(t.pertpd)} nitroUpgradeCTA={intl.string(t["5eotIZ"])} />, <EditCollectiblesPickerList sections={profileEffectSections} selectedSkuId={selectedProfileEffect?.skuId} renderRow={callback} isFetching={stateFromStores} />]}
</>;
};
ProfileEffectSectionPreview = function ProfileEffectSectionPreview(props) {
const { previewSkuId, user: user2, guildId: guildId3 } = props;
const styles = useStyles();
const collectiblesData = useCollectiblesData(previewSkuId);
const { product, purchase } = collectiblesData;
return <View style={styles.previewContainer}>
<ProfileEffectUserPreview user={user2} guildId={guildId3} profileEffect={useMemo(() => {
let r3 = product == null ? void 0 : product.items[0];
if (r3 == null) {
r3 = purchase == null ? void 0 : purchase.items[0];
}
return isProfileEffectRecord(r3) ? r3 : null;
}, [purchase, product])} maxWidth={250} />
<Module4611 style={styles.previewGradient} start={{
x: 0,
y: 0.6
}} end={{
x: 0,
y: 1
}} colors={[`${styles.previewGradient.color}00`, styles.previewGradient.color]} />
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
bounceOffset: {
position: "absolute",
top: -250,
height: 250,
right: 0,
left: 0
},
title: {
alignSelf: "center",
color: Module712.colors.MOBILE_TEXT_HEADING_PRIMARY,
margin: 25
},
previewContainer: {
overflow: "hidden",
height: 300,
alignItems: "center"
},
previewGradient: {
...StyleSheet.absoluteFillObject,
bottom: -1,
color: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
}
});
export default function EditProfileEffectActionSheet(props) {
const { user: user2, currentProfileEffect, guildId: guildId2, isTryItOut: isTryItOut2 } = props;
const styles = useStyles();
let id = user2.id;
if (id == null) {
id = "";
}
const displayProfile = useDisplayProfile(id);
let c20668_2 = displayProfile;
const [state, setSelectedProfileEffect2] = useState(currentProfileEffect);
const bottomSheetRef = useBottomSheetRef().bottomSheetRef;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.EDIT_PROFILE_EFFECT_SHEET).analyticsLocations;
const memo = useMemo(() => ({
type: AnalyticsLocation.EDIT_PROFILE_EFFECT_SHEET,
guild_id: guildId2,
profile_has_nitro_customization: c20668_2 != null && (c20668_2 == null ? void 0 : c20668_2.hasPremiumCustomization())
}), [guildId2, displayProfile]);
const callback = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
...memo,
is_fullscreen: true
});
}, [memo]);
const callback2 = useCallback(() => {
if (isTryItOut2) {
let r18 = state;
if (state == null) {
r18 = null;
}
setTryItOutProfileEffect(r18);
} else {
let profileEffect = state;
if (state == null) {
profileEffect = null;
}
setPendingChanges({
guildId: guildId2,
profileEffect
});
}
}, [state, guildId2, isTryItOut2]);
return <AnalyticsLocationProvider value={analyticsLocations}>
<BottomSheet scrollable ref={bottomSheetRef} onExpand={callback} startExpanded>
<View style={styles.container}>
<View style={styles.bounceOffset} />
<Text variant="redesign/heading-18/bold" style={styles.title} accessibilityRole="header">
{intl.string(t["/6nv6N"])}
</Text>
<EditProfileEffectInner user={user2} selectedProfileEffect={state} setSelectedProfileEffect={setSelectedProfileEffect2} guildId={guildId2} isTryItOut={isTryItOut2} />
</View>
<EditCollectiblesCTAButton user={user2} currentSkuId={currentProfileEffect?.skuId} selectedSkuId={state?.skuId} isTryItOut={isTryItOut2} onApply={callback2} analyticsLocations={analyticsLocations} analyticsSource={AnalyticsLocation.EDIT_PROFILE_EFFECT_SHEET} />
</BottomSheet>
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,151 @@
// Metro module 13726 (f13727).
import { useEffect, useCallback, useMemo, useState } from "react";
import { View, StyleSheet } from "react-native";
import CollectiblesPurchaseStore from "../../collectibles/CollectiblesPurchaseStore";
import { isProfileFrameRecord } from "../../collectibles/records/ProfileFrameRecord";
import { AnalyticEvents } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import useDisplayProfile from "../hooks/useDisplayProfile";
import { useBottomSheetRef } from "../../../design/components/Sheet/native/useBottomSheetRef";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { Heading } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import EditCollectiblesCTAButton from "./EditCollectiblesCTAButton";
import { useGetOrFetchCollectiblesCategoriesAndPurchases } from "../../collectibles/hooks/useFetchCollectiblesCategoriesAndPurchases";
import { useStateFromStores } from "../../../_bundle/Module589";
import useProfileFrameSections from "../../collectibles/profile_frames/hooks/useProfileFrameSections";
import { getProfilePreviewValue } from "../../profile_customization/ProfileCustomizationUtils";
import maybeFetchUserProfile from "../maybeFetchUserProfile";
import { EditProfileFrameRow } from "../../collectibles/profile_frames/native/EditProfileFrameSection";
import EditCollectiblesPreviewDetails from "./EditCollectiblesPreviewDetails";
import { EditCollectiblesPickerList } from "../../collectibles/native/EditCollectiblesPickerList";
import useCollectiblesData from "../../collectibles/hooks/useCollectiblesData";
import ProfileFrameUserPreview from "../../collectibles/profile_frames/native/previews/ProfileFrameUserPreview";
import Module4611 from "../../../_bundle/Module4611";
let useStyles, ProfileFrameSectionPreview;
const EditProfileFrameInner = function EditProfileFrameInner(props) {
const { user, selectedProfileFrame, setSelectedProfileFrame, guildId } = props;
useGetOrFetchCollectiblesCategoriesAndPurchases();
const stateFromStores = useStateFromStores([CollectiblesPurchaseStore], () => CollectiblesPurchaseStore.isFetching);
const profileFrameSections = useProfileFrameSections();
const displayProfile = useDisplayProfile(user.id, guildId);
const profilePreviewValue = getProfilePreviewValue({
pendingValue: selectedProfileFrame,
userValue: displayProfile == null ? void 0 : displayProfile._userProfile?.profileFrame,
guildValue: displayProfile == null ? void 0 : displayProfile._guildMemberProfile?.profileFrame,
guildId
});
useEffect(() => {
if (!(user == null || user.isNonUserBot())) {
maybeFetchUserProfile(user.id, user.getAvatarURL(null, 80), {
withMutualGuilds: true,
dispatchWait: true
});
}
}, [user]);
const callback = useCallback((a0) => <EditProfileFrameRow items={a0.items} size={a0.size} selectedSkuId={a0.selectedSkuId} setSelectedProfileFrame={setSelectedProfileFrame} guildId={guildId} />, [setSelectedProfileFrame, guildId]);
return <>
{[<ProfileFrameSectionPreview previewSkuId={profilePreviewValue?.skuId} user={user} guildId={guildId} />, <EditCollectiblesPreviewDetails user={user} previewSkuId={profilePreviewValue?.skuId} nitroJoinCTA={intl.string(t["JvNv+a"])} nitroUpgradeCTA={intl.string(t.hR2psy)} />, <EditCollectiblesPickerList sections={profileFrameSections} selectedSkuId={selectedProfileFrame?.skuId} renderRow={callback} isFetching={stateFromStores} />]}
</>;
};
ProfileFrameSectionPreview = function ProfileFrameSectionPreview(props) {
const { previewSkuId, user: user2, guildId: guildId3 } = props;
const styles = useStyles();
const collectiblesData = useCollectiblesData(previewSkuId);
const { product, purchase } = collectiblesData;
return <View style={styles.previewContainer}>
<ProfileFrameUserPreview user={user2} guildId={guildId3} profileFrame={useMemo(() => {
let r3 = product == null ? void 0 : product.items[0];
if (r3 == null) {
r3 = purchase == null ? void 0 : purchase.items[0];
}
return isProfileFrameRecord(r3) ? r3 : null;
}, [purchase, product])} maxWidth={280} />
<Module4611 style={styles.previewGradient} start={{
x: 0,
y: 0.6
}} end={{
x: 0,
y: 1
}} colors={[`${styles.previewGradient.color}00`, styles.previewGradient.color]} />
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
bounceOffset: {
position: "absolute",
top: -250,
height: 250,
right: 0,
left: 0
},
title: {
alignSelf: "center",
color: Module712.colors.MOBILE_TEXT_HEADING_PRIMARY,
margin: 25
},
previewContainer: {
overflow: "hidden",
height: 300,
alignItems: "center"
},
previewGradient: {
...StyleSheet.absoluteFillObject,
bottom: -1,
color: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
}
});
export default function EditProfileFrameActionSheet(props) {
const { user: user2, currentProfileFrame, guildId: guildId2 } = props;
const styles = useStyles();
let id = user2.id;
if (id == null) {
id = "";
}
const displayProfile = useDisplayProfile(id);
let c20675_1 = displayProfile;
const [state, setSelectedProfileFrame2] = useState(currentProfileFrame);
const bottomSheetRef = useBottomSheetRef().bottomSheetRef;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.EDIT_PROFILE_FRAME_SHEET).analyticsLocations;
const memo = useMemo(() => ({
type: AnalyticsLocation.EDIT_PROFILE_FRAME_SHEET,
guild_id: guildId2,
profile_has_nitro_customization: c20675_1 != null && (c20675_1 == null ? void 0 : c20675_1.hasPremiumCustomization())
}), [guildId2, displayProfile]);
const callback = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
...memo,
is_fullscreen: true
});
}, [memo]);
const callback2 = useCallback(() => {
let profileFrame = state;
if (state == null) {
profileFrame = null;
}
setPendingChanges({
guildId: guildId2,
profileFrame
});
}, [state, guildId2]);
return <AnalyticsLocationProvider value={analyticsLocations}>
<BottomSheet scrollable ref={bottomSheetRef} onExpand={callback} startExpanded>
<View style={styles.container}>
<View style={styles.bounceOffset} />
<Heading variant="redesign/heading-18/bold" style={styles.title}>
{intl.string(t["oTSa/q"])}
</Heading>
<EditProfileFrameInner user={user2} selectedProfileFrame={state} setSelectedProfileFrame={setSelectedProfileFrame2} guildId={guildId2} />
</View>
<EditCollectiblesCTAButton user={user2} currentSkuId={currentProfileFrame?.skuId} selectedSkuId={state?.skuId} onApply={callback2} analyticsLocations={analyticsLocations} analyticsSource={AnalyticsLocation.EDIT_PROFILE_FRAME_SHEET} />
</BottomSheet>
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,125 @@
// Metro module 13707 (f13708).
import { useCallback, useRef, useEffect } from "react";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import PremiumUtils from "../../../utils/PremiumUtils";
import usePendingAvatarSettings from "../hooks/usePendingAvatarSettings";
import { getPendingAvatarSrc } from "../../recent_avatars/RecentAvatarUtils";
import useUploadAvatar from "../hooks/native/useUploadAvatar";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { ProfileAssetType, GIFSelectionContext } from "./ProfileGIFSelectActionSheet";
import { openAvatarDecorationActionSheet } from "../../collectibles/avatar_decorations/native/AvatarDecorationUtils";
import * as _ProfileCustomizationUtils from "../../profile_customization/ProfileCustomizationUtils";
import { useStateFromStores } from "../../../_bundle/Module589";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle, withRepeat, Easing, cancelAnimation } from "../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../design/animation/reanimated/timing/timing";
import HeaderAvatar from "../../profile_customization/native/HeaderAvatar";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import { intl, t } from "../../../intl/index.native";
import EditIcon from "../../profile_customization/native/EditIcon";
import { AvatarSizes } from "../../../design/void/native";
const useStyles = createStyles({
editIcon: {
position: "absolute",
right: -3
}
});
const __initData = {
code: "function EditUserProfileAvatarTsx1(){const{rotation}=this.__closure;return{transform:[{rotateZ:rotation.get()+\"deg\"}]};}"
};
export default function EditUserProfileAvatar(props) {
let ref, sharedValue;
const { user, disabled, statusStyle, style, avatarStyle, editIconStyle, disableStatus = true, isTryItOut = false } = props;
let c20653_1 = isTryItOut;
let autoStartEditFlow = props.autoStartEditFlow;
if (autoStartEditFlow === void 0) {
autoStartEditFlow = false;
}
let c20653_2 = autoStartEditFlow;
const size = props.size;
ref = void 0;
sharedValue = void 0;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.EDIT_AVATAR).analyticsLocations;
const canUseAnimatedAvatar = PremiumUtils.canUseAnimatedAvatar(user);
const showAnimatedAvatarUpsell = canUseAnimatedAvatar ? !canUseAnimatedAvatar : !isTryItOut;
const pendingAvatarSettings = usePendingAvatarSettings({
isTryItOut,
analyticsLocations
});
const { pendingAvatar, pendingAvatarDecoration, setPendingAvatar } = pendingAvatarSettings;
const pendingAvatarSrc = getPendingAvatarSrc({
userId: user.id,
image: pendingAvatar
});
let r47 = pendingAvatarDecoration;
if (r47 === void 0) {
r47 = user.avatarDecoration;
}
const avatarDecoration = r47;
const handleUploadAvatarSelect = useUploadAvatar({
isTryItOut,
analyticsLocations
});
const callback = useCallback(() => {
ActionSheetActionCreators.openLazy(import("./ChangeAvatarActionSheet"), "Change Avatar", {
showAnimatedAvatarUpsell,
handleRemoveAvatarSelect: function handleRemoveAvatarSelect() {
ActionSheetActionCreators.hideActionSheet();
setPendingAvatar(null);
},
handleUploadAvatarSelect,
handleUploadGIFAvatarSelect: function handleUploadGIFAvatarSelect() {
ActionSheetActionCreators.hideActionSheet();
ActionSheetActionCreators.openLazy(import("./ProfileGIFSelectActionSheet"), "Select GIF Avatar", {
profileAssetType: ProfileAssetType.AVATAR,
selectionContext: c20653_1 ? GIFSelectionContext.PROFILE_TRY_IT_OUT : GIFSelectionContext.PROFILE_EDIT
});
},
handleEditAvatarDecorationSelect: function handleEditAvatarDecorationSelect() {
openAvatarDecorationActionSheet({
user,
currentAvatarDecoration: avatarDecoration,
analyticsLocations
});
},
showRemoveAvatar: _ProfileCustomizationUtils.showRemoveAvatar(pendingAvatar, user.avatar)
});
}, [user, analyticsLocations, pendingAvatar, setPendingAvatar, handleUploadAvatarSelect, showAnimatedAvatarUpsell, avatarDecoration, isTryItOut]);
ref = useRef(false);
useEffect(() => {
if (c20653_2 && !ref.current) {
ref.current = true;
callback();
}
}, [user, autoStartEditFlow, callback]);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
sharedValue = useSharedValue(0);
const z = function z() {
return {
transform: [{
rotateZ: `${sharedValue.get()}deg`
}]
};
};
z.__closure = {
rotation: sharedValue
};
z.__workletHash = 13368223692459;
z.__initData = __initData;
const animatedStyle = useAnimatedStyle(z);
useEffect(() => {
sharedValue.set(withRepeat(withTiming(360, {
duration: 3000,
easing: Easing.inOut(Easing.quad)
}), -1));
return () => cancelAnimation(sharedValue);
}, [sharedValue]);
const r90 = <HeaderAvatar style={avatarStyle} user={user} pendingAvatarSrc={pendingAvatarSrc} pendingAvatarDecoration={pendingAvatarDecoration} statusStyle={statusStyle} disableStatus={disableStatus} size={size} />;
return <PressableOpacity style={style} disabled={disabled} onPress={callback} accessibilityRole="button" accessibilityLabel={intl.string(t.MUgHIN)}>
{isTryItOut ? pendingAvatarDecoration == null ? stateFromStores ? r90 : <ReanimatedRexport.View style={animatedStyle}>{r90}</ReanimatedRexport.View> : r90 : r90}
<EditIcon style={[styles.editIcon, editIconStyle]} size={size === AvatarSizes.EDIT_AVATAR_DECORATION ? "sm" : "xs"} />
</PressableOpacity>;
};
@@ -0,0 +1,204 @@
// Metro module 12198 (f12199).
import { useState, useEffect, useMemo, useCallback } from "react";
import { ActivityIndicator, View } from "react-native";
import AccessibilityStore from "../../a11y/AccessibilityStore";
import WishlistStore from "../../wishlists/WishlistStore";
import { getWishlistProductLines } from "../../wishlists/records/WishlistRecord";
import UserStore from "../../../stores/UserStore";
import UserProfileStore from "../UserProfileStore";
import { TrackUserProfileWishlistActions } from "../Constants";
import { ACTION_SHEET_MAX_WIDTH } from "../../action_sheet/native/ActionSheetConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { LinearTransition } from "../../reanimated/ReanimatedRexport";
import * as _timing from "../../../design/animation/reanimated/timing/timing";
import { useStateFromStores } from "../../../_bundle/Module589";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import useCardGridLayout from "../hooks/native/useCardGridLayout";
import { WishlistVisibility } from "../../../_bundle/Module12195";
import { useIsEligibleForSocialLayerStorefrontMobilePurchasing } from "../../slayer_storefront/experiments/SocialLayerStorefrontMobilePurchasingExperiment";
import { isEligibleWishlistItemOnMobile } from "../../wishlists/WishlistUtils";
import WishlistActionCreators from "../../wishlists/WishlistActionCreators";
import { trackUserProfileWishlistAction } from "../UserProfileAnalyticsUtils";
import UserProfileStackedActionSheet from "./UserProfileStackedActionSheet";
import { intl, t } from "../../../intl/index.native";
import { BottomSheetScrollView } from "../../../_bundle/Module5245";
import { TableRowGroup } from "../../../design/components/TableRow/native/TableRowGroup.native";
import { TableSwitchRow } from "../../../design/components/TableRow/native/TableSwitchRow.native";
import ReanimatedNativeView from "../../core/native/ReanimatedNativeView";
import WishlistItemCard from "../../wishlists/native/WishlistItemCard";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import { TrashIcon } from "../../../design/components/Icon/native/redesign/generated/TrashIcon";
let exitingAnimation;
const useStyles = createStyles({
container: {
flex: 1,
paddingHorizontal: Module712.space.PX_16
},
loadingContainer: {
flex: 1,
justifyContent: "center",
alignItems: "center",
paddingTop: Module712.space.PX_48
},
toggleRow: {
marginBottom: Module712.space.PX_16
},
itemsContainer: {
alignSelf: "center",
flexDirection: "row",
flexWrap: "wrap",
gap: 16
},
itemWrapper: {
position: "relative"
},
deleteButton: {
position: "absolute",
top: Module712.space.PX_8,
right: Module712.space.PX_8,
zIndex: 1
}
});
const layout = LinearTransition.springify().mass(0.8).damping(100).stiffness(300);
const exitingAnimation2 = function exitingAnimation() {
return {
animations: {
opacity: _timing.withTiming(0, {
duration: 150
}),
transform: [{
scale: _timing.withTiming(0.8, {
duration: 150
})
}]
},
initialValues: {
opacity: 1,
transform: [{
scale: 1
}]
}
};
};
exitingAnimation2.__closure = {
withTiming: _timing.withTiming
};
exitingAnimation2.__workletHash = 17293915965800;
exitingAnimation2.__initData = {
code: "function exitingAnimation_EditWishlistActionSheetTsx1(_values){const{withTiming}=this.__closure;return{animations:{opacity:withTiming(0,{duration:150}),transform:[{scale:withTiming(0.8,{duration:150})}]},initialValues:{opacity:1,transform:[{scale:1}]}};}"
};
exitingAnimation = exitingAnimation2;
export default function EditWishlistActionSheet(props) {
let analyticsLocations, cardWidth, stateFromStores2, stateFromStores3, state, setState, isEligibleForSocialLayerStorefrontMobilePurchasing, callback;
const { wishlistId, analyticsContext } = props;
let analyticsLocations2 = props.analyticsLocations;
analyticsLocations = void 0;
cardWidth = void 0;
stateFromStores2 = void 0;
stateFromStores3 = void 0;
state = void 0;
setState = void 0;
isEligibleForSocialLayerStorefrontMobilePurchasing = void 0;
callback = void 0;
const styles = useStyles();
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const bottom = useSafeAreaInsets_native().bottom;
if (analyticsLocations2 == null) {
analyticsLocations2 = [];
}
analyticsLocations = useAnalyticsLocations(analyticsLocations2, AnalyticsLocation.USER_PROFILE_EDIT_WISHLIST_ACTION_SHEET).analyticsLocations;
const cardGridLayout = useCardGridLayout({
maxWidth: ACTION_SHEET_MAX_WIDTH
});
cardWidth = cardGridLayout.cardWidth;
const rowWidth = cardGridLayout.rowWidth;
const r19 = rowWidth != null ? {
width: rowWidth
} : void 0;
stateFromStores2 = useStateFromStores([WishlistStore], () => WishlistStore.getWishlist(wishlistId));
const stateFromStores4 = useStateFromStores([WishlistStore], () => WishlistStore.isFetching(wishlistId));
stateFromStores3 = useStateFromStores([UserStore, UserProfileStore], () => {
const currentUser = UserStore.getCurrentUser();
return currentUser != null ? UserProfileStore.getWishlistSettings(currentUser.id, wishlistId) : null;
});
[state, setState] = useState(true);
useEffect(() => {
if (stateFromStores3?.visibility != null) {
setState(stateFromStores3.visibility === WishlistVisibility.PUBLIC);
}
}, [stateFromStores3?.visibility]);
isEligibleForSocialLayerStorefrontMobilePurchasing = useIsEligibleForSocialLayerStorefrontMobilePurchasing({
location: "edit_wishlist_action_sheet"
});
const memo = useMemo(() => {
let r2 = stateFromStores2 == null ? void 0 : stateFromStores2.items.filter((item) => isEligibleWishlistItemOnMobile(item, {
isWishlistOwner: true,
isSocialLayerStorefrontMobilePurchasingEnabled: isEligibleForSocialLayerStorefrontMobilePurchasing
}));
if (r2 == null) {
r2 = [];
}
return r2;
}, [stateFromStores2, isEligibleForSocialLayerStorefrontMobilePurchasing]);
const callback2 = useCallback(() => {
const r4 = state ? WishlistVisibility.PRIVATE : WishlistVisibility.PUBLIC;
setState(!state);
WishlistActionCreators.updateWishlistVisibility(wishlistId, r4);
trackUserProfileWishlistAction({
...analyticsContext,
analyticsLocations,
wishlistId,
action: state ? TrackUserProfileWishlistActions.WISHLIST_TOGGLE_PRIVATE : TrackUserProfileWishlistActions.WISHLIST_TOGGLE_PUBLIC,
productLines: stateFromStores2 != null ? getWishlistProductLines(stateFromStores2) : void 0
});
}, [wishlistId, state, stateFromStores2, analyticsContext, analyticsLocations]);
callback = useCallback((a0) => {
WishlistActionCreators.removeSkuFromWishlist(wishlistId, a0, analyticsLocations);
}, [wishlistId, analyticsLocations]);
return <UserProfileStackedActionSheet scrollable startExpanded title={intl.string(t["OEgx/4"])}>
<BottomSheetScrollView contentContainerStyle={{
paddingBottom: bottom
}}>
<View style={styles.container}>
<View style={styles.toggleRow}>
<TableRowGroup hasIcons={false}>
<TableSwitchRow label={intl.string(t.b2nFyA)} subLabel={intl.string(t.dw58pE)} value={state} onValueChange={callback2} />
</TableRowGroup>
</View>
{stateFromStores4 && stateFromStores2 == null ? <View style={styles.loadingContainer}>
<ActivityIndicator />
</View> : memo.length !== 0 ? <View style={[styles.itemsContainer, r19]}>
{memo.map((item) => {
const sku = item.sku;
let r1 = null;
if (sku != null) {
const exiting = stateFromStores ? void 0 : exitingAnimation;
const layout2 = stateFromStores ? void 0 : layout;
const r31 = [<WishlistItemCard sku={item.sku} isOwned={item.isOwned} size={cardWidth} accessibilityHidden />, ,];
const props = {
variant: "primary-overlay",
size: "sm",
icon: <TrashIcon size="sm" color={Module712.colors.ICON_FEEDBACK_CRITICAL} />,
onPress: () => callback(item.skuId),
accessibilityLabel: null
};
const isOwned = item.isOwned;
const r57 = intl.formatToPlainString(t["IBBF8/"], {
productName: item.skuName
});
props.accessibilityLabel = isOwned ? `${r57}, ${intl.string(t["6cfuDj"])}` : r57;
r31[1] = <View style={styles.deleteButton}>
<IconButton {...props} />
</View>;
r1 = <ReanimatedNativeView key={item.skuId} style={styles.itemWrapper} exiting={exiting} layout={layout2}>{r31}</ReanimatedNativeView>;
}
return r1;
})}
</View> : null}
</View>
</BottomSheetScrollView>
</UserProfileStackedActionSheet>;
};
@@ -0,0 +1,334 @@
// Metro module 13746 (f13747).
import { useRef } from "react";
import { ScrollView, View } from "react-native";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import UserProfileStore from "../UserProfileStore";
import { FLOATING_UPSELL_HEIGHT } from "./Constants";
import { AnalyticsObjects, AnalyticsSections, BIO_MAX_LENGTH, DISPLAY_NAME_MAX_LENGTH, PRONOUNS_MAX_LENGTH, UpsellTypes, AnalyticsPages } from "../../../Constants";
import { PremiumUpsellTypes } from "../../premium/PremiumConstants";
import PremiumUtils from "../../../utils/PremiumUtils";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import UserProfileEditBannerButton from "./UserProfileEditBannerButton";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import * as _ProfileCustomizationUtils from "../../profile_customization/ProfileCustomizationUtils";
import { intl, t } from "../../../intl/index.native";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import PremiumUpsellUtils from "../../../utils/native/PremiumUpsellUtils";
import UserProfileSharedStyles from "./UserProfileSharedStyles";
import UserProfileEditFormSharedStyles from "./UserProfileEditFormSharedStyles";
import useKeyboardIsOpen from "../../keyboard/native/useKeyboardIsOpen";
import useSafeAreaInsetsKeyboardAware_native from "../../safe_area/useSafeAreaInsetsKeyboardAware.native";
import Module712 from "../../../_bundle/Module712";
import useSafeAreaAvoidingInputs_native from "../../safe_area/useSafeAreaAvoidingInputs.native";
import useGuildProfileEditForm from "../../user_settings/profiles/native/useGuildProfileEditForm";
import { useStateFromStores } from "../../../_bundle/Module589";
import useDisplayProfile from "../hooks/useDisplayProfile";
import { useCustomStatusActivity } from "../../custom_status/utils/userSettingToActivity";
import useBadges from "../hooks/useBadges";
import { getPendingAvatarSrc } from "../../recent_avatars/RecentAvatarUtils";
import { useGuildActionSheetPermissions } from "../../guild_action_sheet/native/GuildActionSheetUtils";
import * as _GuildIdentitySettingsUtils from "../../guild_identity/GuildIdentitySettingsUtils";
import useProfileTheme from "../hooks/useProfileTheme";
import { useUserProfileColors } from "../hooks/native/useUserProfileColors";
import { Text } from "../../../design/components/Text/native/Text";
import { ThemeContextProvider } from "../../../_bundle/Module3901";
import EditGuildIdentityAvatar from "../../guild_identity/native/EditGuildIdentityAvatar";
import UserProfileGradientContainer from "./UserProfileGradientContainer";
import UserProfileCustomStatusBubble from "./UserProfileCustomStatusBubble";
import UserProfilePrimaryInfo from "./UserProfilePrimaryInfo";
import UserProfileEditFormTextField from "./UserProfileEditFormTextField";
import UserUtils from "../../../utils/UserUtils";
import UserProfileDisplayNameStylesEditButton from "./UserProfileDisplayNameStylesEditButton";
import UserProfileEditTheme from "./UserProfileEditTheme";
import UserProfileAvatarDecorationEditButton from "./UserProfileAvatarDecorationEditButton";
import UserProfileEffectEditButton from "./UserProfileEffectEditButton";
import UserProfileFrameEditButton from "./UserProfileFrameEditButton";
import UserProfileNameplateEditButton from "./UserProfileNameplateEditButton";
import UserProfileUpsellCard from "./UserProfileUpsellCard";
import openPremiumModal from "../../../components_native/premium/openPremiumModal";
import { PremiumFeatureCardOrder } from "../../user_settings/premium/native/PremiumFeaturesCards";
let _excluded, c9561_20;
const EditGuildProfileBanner = function EditGuildProfileBanner(props) {
const { user, displayProfile, guildId, guildMember, guildMemberProfile, pendingAvatarSrc, pendingBanner, pendingThemeColors, disabled } = props;
let showEditButton = PremiumUtils.canUsePremiumGuildMemberProfile(user);
const canUsePremiumGuildMemberProfile = showEditButton;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.EDIT_BANNER).analyticsLocations;
if (canUsePremiumGuildMemberProfile) {
showEditButton = guildMember != null;
}
return <AnalyticsLocationProvider value={analyticsLocations}>
<UserProfileEditBannerButton user={user} displayProfile={displayProfile} pendingBanner={pendingBanner} pendingAvatarSrc={pendingAvatarSrc} pendingThemeColors={pendingThemeColors} showProfilePreviewButton={false} showEditButton={showEditButton} onPressEdit={function onPressEdit() {
if (canUsePremiumGuildMemberProfile) {
ActionSheetActionCreators.openLazy(import("./ChangeBannerActionSheet"), "Change Banner", {
user,
analyticsLocations,
showRemoveBanner: _ProfileCustomizationUtils.showRemoveBanner(pendingBanner, guildMemberProfile?.banner),
removeText: intl.string(t.jHlJNS),
onBannerChange: (a0, a1) => setPendingChanges({
guildId,
banner: a0,
bannerOriginalMd5: a1
})
});
} else {
PremiumUpsellUtils.handleShowUpsellAlert({
initialUpsellKey: UpsellTypes.PREMIUM_GUILD_PROFILE,
analyticsLocation: {
section: AnalyticsSections.PREMIUM_GUILD_MEMBER_PROFILE,
object: AnalyticsObjects.EDIT_GUILD_PROFILE_BANNER
},
analyticsLocations,
analyticsProperties: {
type: PremiumUpsellTypes.PREMIUM_GUILD_IDENTITY_MODAL
}
});
}
}} editButtonAccessibilityLabel={intl.string(t["95hPAe"])} editDisabled={disabled} />
</AnalyticsLocationProvider>;
};
_excluded = ["nick", "bio", "guild_tag"];
c9561_20 = {
page: AnalyticsPages.USER_SETTINGS,
section: AnalyticsSections.SETTINGS_CUSTOMIZE_PROFILE
};
export default function GuildProfileEditForm(props) {
let analyticsLocations2;
const currentUser = props.currentUser;
analyticsLocations2 = void 0;
const styles2 = UserProfileSharedStyles();
const styles = UserProfileEditFormSharedStyles();
const keyboardIsOpen = useKeyboardIsOpen();
const ref = useRef(null);
const ref4 = useRef(null);
const ref3 = useRef(null);
const ref2 = useRef(null);
const insets = useSafeAreaInsetsKeyboardAware_native({
includeKeyboardHeight: true
}).insets;
const PX_16 = Module712.space.PX_16;
const onFocus = useSafeAreaAvoidingInputs_native({
insets,
inputs: [{
ref: ref4,
offset: {
type: "toRef",
ref: ref3,
extraOffset: PX_16
}
}, {
ref: ref3,
offset: {
type: "toRef",
ref: ref2,
extraOffset: PX_16
}
}, {
ref: ref2,
offset: {
type: "toValue",
value: Module712.space.PX_64
}
}],
scrollViewRef: ref
}).onFocus;
const guildProfileEditForm = useGuildProfileEditForm();
const { guild, errors, isDisabled } = guildProfileEditForm;
let pendingNickname = guildProfileEditForm.pendingNickname;
const { pendingAvatar, pendingBanner: pendingBanner2, pendingThemeColors } = guildProfileEditForm;
let pendingPronouns = guildProfileEditForm.pendingPronouns;
let pendingBio = guildProfileEditForm.pendingBio;
const { pendingAvatarDecoration, pendingProfileEffect, pendingProfileFrame, pendingNameplate, pendingDisplayNameStyles } = guildProfileEditForm;
const stateFromStores2 = useStateFromStores([GuildMemberStore], () => guild != null ? GuildMemberStore.getMember(guild.id, currentUser.id) : null);
const stateFromStores = useStateFromStores([UserProfileStore], () => guild != null ? UserProfileStore.getGuildMemberProfile(currentUser.id, guild?.id) : null);
const displayProfile = useDisplayProfile(currentUser.id, guild?.id);
const customStatusActivity = useCustomStatusActivity();
const badges = useBadges(displayProfile);
const pendingAvatarSrc = getPendingAvatarSrc({
userId: currentUser.id,
image: pendingAvatar
});
const canEditNickname = useGuildActionSheetPermissions(guild).canEditNickname;
const canUsePremiumGuildMemberProfile2 = PremiumUtils.canUsePremiumGuildMemberProfile(currentUser);
const canResetThemeColors = _GuildIdentitySettingsUtils.canResetThemeColors(pendingThemeColors, stateFromStores?.themeColors);
let r11 = canUsePremiumGuildMemberProfile2 ? !canUsePremiumGuildMemberProfile2 : !keyboardIsOpen;
let r56 = stateFromStores2?.nick;
if (r56 == null) {
r56 = "";
}
let r141 = stateFromStores?.pronouns;
if (r141 == null) {
r141 = "";
}
let placeholder2 = displayProfile == null ? void 0 : displayProfile._userProfile.pronouns;
if (placeholder2 == null) {
placeholder2 = "";
}
if (pendingPronouns == null) {
pendingPronouns = r141;
}
let r47 = stateFromStores?.bio;
if (r47 == null) {
r47 = "";
}
let placeholder = displayProfile == null ? void 0 : displayProfile._userProfile.bio;
if (placeholder == null) {
placeholder = "";
}
analyticsLocations2 = useAnalyticsLocations([AnalyticsLocation.USER_SETTINGS]).analyticsLocations;
const profileTheme = useProfileTheme({
user: currentUser,
displayProfile,
pendingThemeColors
});
const { theme, primaryColor, secondaryColor } = profileTheme;
const userProfileColors = useUserProfileColors({
theme,
primaryColor,
secondaryColor
});
const { gradientFallbackBackground, gradientSecondaryBackground, containerBackground, avatarBackground } = userProfileColors;
const paddingBottom = insets.bottom + (r11 ? FLOATING_UPSELL_HEIGHT : 0) + Module712.space.PX_16;
const statusStyle = {
backgroundColor: avatarBackground
};
const { nick, bio, guild_tag, ...rest } = errors;
const errorMessage3 = nick == null ? void 0 : nick[0];
const pronouns = errors.pronouns;
const errorMessage2 = pronouns == null ? void 0 : pronouns[0];
const errorMessage = bio == null ? void 0 : bio[0];
let r61 = guild_tag == null ? void 0 : guild_tag[0];
if (guild == null) {
return null;
}
const r197 = [<View style={styles.bounceOffset} />, ,];
const r202 = [<EditGuildProfileBanner user={currentUser} displayProfile={displayProfile} guildId={guild.id} guildMember={stateFromStores2} guildMemberProfile={stateFromStores} pendingAvatarSrc={pendingAvatarSrc} pendingBanner={pendingBanner2} pendingThemeColors={pendingThemeColors} disabled={isDisabled} />, ,];
const r218 = [guild == null ? null : <View style={[styles2.avatarBackground, styles2.avatarPosition, styles.avatarContainer, statusStyle]}>
<EditGuildIdentityAvatar userId={currentUser.id} disabled={isDisabled ? isDisabled : !canUsePremiumGuildMemberProfile2} disableStatus={false} guildId={guild?.id} statusStyle={statusStyle} />
</View>, ,];
const r233 = [<UserProfileCustomStatusBubble customStatusActivity={customStatusActivity} hasCustomProfileTheme={primaryColor != null} style={styles2.customStatusBubble} emojiOnlyStyle={styles2.emojiOnlyCustomStatusBubble} editEnabled />, <UserProfilePrimaryInfo user={currentUser} displayName={pendingNickname == null ? r56 : pendingNickname} pronouns={pendingPronouns !== "" ? pendingPronouns : placeholder2} badges={badges} badgeContainerBackground={containerBackground} displayNameAccessibilityRole="header" guildId={guild.id} pendingDisplayNameStyles={pendingDisplayNameStyles} />, ,];
const r242 = guild == null;
let r243 = null;
if (!r242) {
const r248 = errorMessage != null;
let r249 = null;
if (!r248) {
const r250 = errorMessage3 != null;
r249 = null;
if (!r250) {
if (r61 == null) {
r61 = Object.keys(rest).length > 0 ? intl.string(t.s35OuK) : null;
}
r249 = r61 == null ? null : r61 !== "" ? <View style={styles.errorContainer}>
<Text variant="text-sm/bold" color="text-feedback-critical">{r61}</Text>
</View> : null;
}
}
const r275 = [r249, , , , , , , , , ,];
const props2 = {
inputRef: ref4,
label: intl.string(t.me1lRk),
errorMessage: errorMessage3,
value: null,
onFocus: null,
onChange: null,
placeholder: null,
maxLength: null,
isDisabled: null
};
if (pendingNickname == null) {
pendingNickname = r56;
}
props2.value = pendingNickname;
props2.onFocus = onFocus;
props2.onChange = (a0) => setPendingChanges({
guildId: guild.id,
nickname: a0
});
props2.placeholder = UserUtils.getName(currentUser);
props2.maxLength = DISPLAY_NAME_MAX_LENGTH;
props2.isDisabled = canEditNickname ? isDisabled : !canEditNickname;
r275[1] = <UserProfileEditFormTextField {...props2} />;
r275[2] = canUsePremiumGuildMemberProfile2 && <UserProfileDisplayNameStylesEditButton user={currentUser} guildId={guild.id} />;
r275[3] = <UserProfileEditFormTextField inputRef={ref3} label={intl.string(t["+T3RI/"])} errorMessage={errorMessage2} description={intl.string(t.NZqtIp)} value={pendingPronouns} onFocus={onFocus} onChange={(event) => setPendingChanges({
guildId: guild.id,
pronouns: event
})} placeholder={placeholder2} maxLength={PRONOUNS_MAX_LENGTH} isDisabled={isDisabled} />;
let r325 = null;
if (canUsePremiumGuildMemberProfile2) {
const props3 = {
inputRef: ref2,
label: intl.string(t.ZzAR2Y),
errorMessage,
description: intl.string(t.S5O8U2),
value: null,
onFocus: null,
onChange: null,
placeholder: null,
maxLength: null,
numberOfLines: 5,
isDisabled: null
};
if (pendingBio == null) {
pendingBio = r47;
}
props3.value = pendingBio;
props3.onFocus = onFocus;
props3.onChange = (a0) => setPendingChanges({
guildId: guild.id,
bio: a0
});
props3.placeholder = placeholder;
props3.maxLength = BIO_MAX_LENGTH;
props3.isDisabled = isDisabled;
r325 = <UserProfileEditFormTextField {...props3} />;
}
r275[4] = r325;
r275[5] = <UserProfileEditTheme pendingAvatarSrc={pendingAvatarSrc} pendingThemeColors={pendingThemeColors} user={currentUser} guildId={guild.id} onProfileThemeColorsChanged={(event) => setPendingChanges({
guildId: guild.id,
themeColors: event
})} showResetMenu={canResetThemeColors} />;
r275[6] = <UserProfileAvatarDecorationEditButton user={currentUser} guildId={guild.id} pendingAvatarDecoration={pendingAvatarDecoration} />;
r275[7] = <UserProfileEffectEditButton user={currentUser} guildId={guild.id} pendingProfileEffect={pendingProfileEffect} displayProfile={displayProfile} />;
r275[8] = <UserProfileFrameEditButton user={currentUser} guildId={guild.id} pendingProfileFrame={pendingProfileFrame} displayProfile={displayProfile} />;
r275[9] = <UserProfileNameplateEditButton user={currentUser} pendingNameplate={pendingNameplate} guildId={guild.id} />;
r243 = <View style={[styles.formContainer, {
backgroundColor: containerBackground,
paddingBottom: 20
}]}>{r275}</View>;
}
r233[2] = r243;
r218[1] = <UserProfileGradientContainer fallbackBackground={gradientFallbackBackground} primaryColor={primaryColor} secondaryColor={secondaryColor} containerStyle={[styles2.profileContentWrapper, styles2.profileContent, {
paddingTop: 0,
paddingBottom
}]}>{r233}</UserProfileGradientContainer>;
r202[1] = <View>{r218}</View>;
r197[1] = <View style={{
backgroundColor: gradientSecondaryBackground
}}>{r202}</View>;
const r380 = [<ScrollView ref={ref}>{r197}</ScrollView>, ,];
if (r11) {
r11 = <UserProfileUpsellCard style={[styles.floatingUpsell, {
bottom: Module712.space.PX_16 + insets.bottom
}]} ctaText={intl.string(t.pj0XBN)} onPress={function onPress() {
openPremiumModal({
analyticsLocation: {
...c9561_20,
object: AnalyticsObjects.BUTTON_CTA
},
analyticsLocations: analyticsLocations2,
premiumFeatureCardOrder: PremiumFeatureCardOrder.TIER_2_LEADING
});
}}>
<Text variant="text-sm/normal">
{intl.string(t.YIZS5B)}
</Text>
</UserProfileUpsellCard>;
}
r380[1] = r11;
return <ThemeContextProvider theme={theme} primaryColor={primaryColor} secondaryColor={secondaryColor}>
<View style={[styles.container, {
backgroundColor: gradientSecondaryBackground
}]}>{r380}</View>
</ThemeContextProvider>;
};
@@ -0,0 +1,442 @@
// Metro module 10023 (f10024).
import * as Module19 from "react";
import { useCallback, useMemo } from "react";
import { View, Pressable } from "react-native";
import LocaleStore from "../../user_settings/LocaleStore";
import UserRecord from "../../../records/UserRecord";
import StreamerModeStore from "../../../stores/StreamerModeStore";
import UserProfileStore from "../UserProfileStore";
import { PlatformTypes, ThemeTypes, AnalyticEvents } from "../../../Constants";
import { FORM_ROW_VERTICAL_PADDING } from "../../../design/void/Form/native/FormConstants";
import { MetadataFields } from "../../connections/Constants";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { getCreatedAtDate } from "../../connections/ConnectionsUtils";
import { generateRedditMetadataItems, generateSteamMetadataItems, generatePaypalMetadataItems, generateEbayMetadataItems, generateTikTokMetadataItems, generateTwitterMetadataItems, generateRoleConnectionMetadataItems } from "../../connections/native/ConnectionMetadataVanityItems";
import Platforms from "../../../lib/Platforms";
import { makeSource } from "../../../utils/AvatarUtils";
import * as _shared from "../../../design/shared";
import { Icon, Avatar, AvatarSizes } from "../../../design/void/native";
import Module10027 from "../../../_bundle/Module10027";
import Module10028 from "../../../_bundle/Module10028";
import { useToken } from "../../../design/tokens/native/useToken";
import Module10029 from "../../../_bundle/Module10029";
import Module10030 from "../../../_bundle/Module10030";
import { triggerHapticFeedback, HapticFeedbackTypes } from "../../haptics/HapticUtils.native";
import { copy } from "../../../utils/ClipboardUtils.native";
import { presentCopiedToClipboard } from "../../toast/native/ToastUtils";
import { intl, t } from "../../../intl/index.native";
import { handleClick } from "../../../utils/MaskedLinkUtils";
import { trackWithMetadata } from "../../app_analytics/AppAnalyticsUtils";
import Linking from "../../../lib/native/Linking";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import { Text } from "../../../design/components/Text/native/Text";
import { useThemeContext } from "../../../_bundle/Module3901";
import { useStateFromStores } from "../../../_bundle/Module589";
import { usePlatformAllowed } from "../../connections/ConnectionsHooks";
import UserProfileSection from "./UserProfileSection";
function $mk83792($env) {
return (a0, a1) => {
const r6 = $env;
const r1 = $env.$parent;
const r4 = r1[14];
return r4(r1[3].Fragment, {
children: r4(r1[19], {
applicationRoleConnection: a0,
theme: r6[1],
locale: r6[2],
style: r6[0]
})
}, a1);
};
}
function $mk83794($env) {
return (a0) => {
const r2 = $env.$parent;
const r10 = (0, r2[1])(r2[2][14]).get(a0.type);
return r10 != null && (0, $env[4])(r10);
};
}
function $mk83795($env) {
return (a0, a1) => {
const r6 = $env;
const r1 = $env.$parent;
const r4 = r1[14];
return r4(r1[3].Fragment, {
children: r4(r1[18], {
account: a0,
theme: r6[2],
locale: r6[3],
userId: r6[0],
style: r6[1]
})
}, a1);
};
}
let useStyles, c6667_18, c6667_19, c6667_20, c6667_21;
let $mk83791 = function() {
return () => LocaleStore.locale;
}, $mk83793 = function() {
return () => LocaleStore.locale;
};
let env6667 = {};
export function ConnectedUserAccount(props) {
let r17, r36;
const account = props.account;
let theme = props.theme;
const { locale, userId, style } = props;
let showMetadata = props.showMetadata;
const showInvisibleIcon = props.showInvisibleIcon;
if (showMetadata == null) {
showMetadata = true;
}
const styles = useStyles();
let metadata = account.metadata;
if (metadata == null) {
metadata = {};
}
const date = showMetadata ? getCreatedAtDate(metadata[MetadataFields.CREATED_AT], locale) : null;
L22: {
r36 = void 0;
r17 = void 0;
if (showMetadata) {
const type = account.type;
if (PlatformTypes.REDDIT === type) {
r17 = generateRedditMetadataItems(metadata, styles.metadataItem);
r36 = void 0;
} else if (PlatformTypes.STEAM === type) {
r17 = generateSteamMetadataItems(metadata, styles.metadataItem);
r36 = void 0;
} else {
if (PlatformTypes.BLUESKY !== type && PlatformTypes.MASTODON !== type && PlatformTypes.TWITTER !== type) {
if (PlatformTypes.PAYPAL === type) {
r17 = generatePaypalMetadataItems(metadata, styles.metadataItem);
r36 = void 0;
break L22;
}
if (PlatformTypes.EBAY === type) {
r17 = generateEbayMetadataItems(metadata, styles.metadataItem);
r36 = void 0;
break L22;
}
const TIKTOK = PlatformTypes.TIKTOK;
r36 = void 0;
r17 = void 0;
if (TIKTOK !== type) {
break L22;
}
r17 = generateTikTokMetadataItems(metadata, styles.metadataItem);
r36 = void 0;
break L22;
}
const r70 = generateTwitterMetadataItems(metadata, styles.metadataItem);
const r73 = metadata[MetadataFields.TWITTER_VERIFIED];
r36 = void 0;
r17 = r70;
if (r73 === "1") {
r36 = Platforms.get(PlatformTypes.TWITTER).color;
r17 = r70;
}
}
}
}
const r97 = Platforms.get(account.type);
let c17631_2 = r97;
const isThemeDark = _shared.isThemeDark(theme);
const r3 = r97 == null;
const source = makeSource(isThemeDark ? r3 ? void 0 : r97.icon.darkPNG : r3 ? void 0 : r97.icon.lightPNG);
const r110 = r97 == null;
let r111 = void 0;
if (!r110) {
const getPlatformUserUrl = r97.getPlatformUserUrl;
r111 = getPlatformUserUrl == null ? void 0 : getPlatformUserUrl.call(r97, account);
}
const platformUserUrl = r111;
const r115 = showInvisibleIcon != null && showInvisibleIcon ? (0, jsx)(Icon, {
style: styles.connectedAccountOpenHide,
source: Module10027
}) : platformUserUrl != null ? (0, jsx)(Icon, {
style: styles.connectedAccountOpenLink,
source: Module10028
}) : null;
const token = useToken(Module712.colors.BACKGROUND_MOD_MUTED, theme);
const INTERACTIVE_TEXT_ACTIVE = Module712.colors.INTERACTIVE_TEXT_ACTIVE;
if (r36 != null) {
theme = ThemeTypes.DARK;
}
let color = useToken(INTERACTIVE_TEXT_ACTIVE, theme);
let color2 = token;
if (r36 != null) {
color = Module712.unsafe_rawColors.WHITE;
color2 = r36;
}
const r151 = account.verified ? <View style={styles.verifiedCheckContainer}>
<Icon style={styles.verifiedCheck} size={Icon.Sizes.REFRESH_SMALL_16} source={Module10029} color={color2} />
<Icon style={styles.verifiedCheck} size={Icon.Sizes.REFRESH_SMALL_16} source={Module10030} color={color} />
</View> : null;
const callback = useCallback(() => {
triggerHapticFeedback(HapticFeedbackTypes.IMPACT_LIGHT);
copy(account.name);
presentCopiedToClipboard();
}, [account.name]);
const memo = useMemo(() => {
let r21;
if (platformUserUrl != null) {
r21 = intl.string(t.wuRE8M);
} else {
const OKzaN3 = t.OKzaN3;
let name = c17631_2?.name;
if (name == null) {
name = "";
}
r21 = intl.formatToPlainString(OKzaN3, {
name
});
}
return r21;
}, [r97?.name, platformUserUrl]);
const callback2 = useCallback(() => {
if (platformUserUrl != null) {
handleClick({
href: platformUserUrl,
trusted: account.type !== PlatformTypes.DOMAIN,
onConfirm: () => {
trackWithMetadata(AnalyticEvents.CONNECTED_ACCOUNT_VIEWED, {
platform_type: account.type,
other_user_id: userId
});
Linking.openURL(platformUserUrl);
}
});
}
}, [account.type, platformUserUrl, userId]);
const Component = platformUserUrl != null ? PressableOpacity : Pressable;
return <Component accessibilityLabel={memo} accessibilityRole="button" onPress={platformUserUrl != null ? callback2 : void 0} onLongPress={callback}>
<View style={[styles.connectedAccountContainer, style]}>
<View style={styles.connectedAccount}>
<Icon size={Icon.Sizes.MEDIUM} source={source} disableColor />
<View style={styles.connectedAccountNameContainer}>
<View style={styles.connectedAccountName}>
<Text variant="text-md/semibold" style={styles.connectedAccountNameText}>{account.name}</Text>
{r151}
</View>
{date != null ? <Text variant="heading-deprecated-12/medium" style={styles.connectedAccountNameCreatedAtText}>
{intl.format(t["9rfonh"], {
date
})}
</Text> : null}
{r17 != null ? r17.length > 0 ? <View style={styles.connectedAccountChildren}>{r17}</View> : null : null}
</View>
{r115}
</View>
</View>
</Component>;
}
export function ConnectedApplicationUserRoleAccount(props) {
const { applicationRoleConnection, style } = props;
const styles = useStyles();
let c17632_1 = styles;
const r12 = generateRoleConnectionMetadataItems(applicationRoleConnection);
return <View style={[styles.connectedAccountContainer, style]}>
{applicationRoleConnection.platform_name != null ? (0, jsx)(Text, {
variant: "eyebrow",
color: "interactive-text-default",
children: applicationRoleConnection.platform_name
}) : null}
<View style={styles.appConnectionNameContainer}>
{applicationRoleConnection.platform_username != null ? <Text variant="text-md/semibold" color="interactive-text-active">{applicationRoleConnection.platform_username}</Text> : null}
</View>
{r12 != null ? r12.length > 0 ? <View style={styles.connectedAccountChildren}>{r12}</View> : null : null}
<View style={{
flexDirection: "row"
}}>
<View style={styles.connectedAccountPoweredByContainer}>
<Text variant="text-xs/normal" color="text-muted">
{intl.format(t.zIT9YA, {
applicationHook: () => <View style={c17632_1.connectedAccountPoweredByText}>
{applicationRoleConnection.application.bot != null ? <Avatar style={c17632_1.connectedAccountPoweredByAvatar} user={new UserRecord(applicationRoleConnection.application.bot)} size={AvatarSizes.SIZE_16} guildId={void 0} /> : null}
{(0, jsx)(Text, {
variant: "text-xs/normal",
color: "text-default",
children: applicationRoleConnection.application.name
})}
</View>
})}
</Text>
</View>
<View style={{
flexGrow: 1
}} />
</View>
</View>;
}
useStyles = createStyles({
connectedAccountContainer: {
paddingHorizontal: 10,
paddingVertical: FORM_ROW_VERTICAL_PADDING / 2
},
connectedAccount: {
flexDirection: "row",
alignItems: "center"
},
connectedAccountNameContainer: {
flex: 1,
marginLeft: 8
},
connectedAccountName: {
flexDirection: "row",
alignItems: "center"
},
connectedAccountNameText: {
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE
},
connectedAccountNameCreatedAtText: {
color: Module712.colors.TEXT_SUBTLE
},
connectedAccountOpenLink: {
height: 24,
width: 24,
transform: [{
rotate: "135deg"
}],
tintColor: Module712.colors.INTERACTIVE_TEXT_ACTIVE
},
connectedAccountOpenHide: {
alignSelf: "flex-start",
margin: 4,
height: 16,
width: 16,
tintColor: Module712.colors.INTERACTIVE_TEXT_DEFAULT
},
verifiedCheckContainer: {
marginLeft: 4,
height: 16,
width: 16
},
verifiedCheck: {
position: "absolute",
left: 0,
top: 0
},
connectedAccountChildren: {
flexDirection: "row",
flexWrap: "wrap",
alignItems: "center",
overflow: "hidden"
},
metadataItem: {
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE
},
appConnectionNameContainer: {
flex: 1,
flexDirection: "row",
alignItems: "center",
marginTop: 4
},
connectedAccountPoweredByContainer: {
flexDirection: "row",
alignItems: "center",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
borderRadius: Module712.radii.sm,
borderWidth: 1,
borderColor: Module712.colors.BORDER_SUBTLE,
paddingHorizontal: 8,
paddingVertical: 4,
marginTop: 12
},
connectedAccountPoweredByAvatar: {
marginRight: 4
},
connectedAccountPoweredByText: {
marginTop: -4,
alignItems: "center",
flexDirection: "row"
}
});
c6667_18 = Module19.memo(ConnectedUserAccount);
c6667_19 = Module19.memo(ConnectedApplicationUserRoleAccount);
c6667_20 = [];
c6667_21 = [];
export default function LegacyUserProfileConnections(props) {
const user = props.user;
const stateFromStores = useStateFromStores([UserProfileStore], () => UserProfileStore.getUserProfile(user.id));
const stateFromStores2 = useStateFromStores([StreamerModeStore], () => StreamerModeStore.hidePersonalInformation);
const memo = useMemo(() => {
let r4 = stateFromStores?.applicationRoleConnections;
if (r4 == null) {
r4 = c6667_21;
}
return r4;
}, [stateFromStores?.applicationRoleConnections]);
const connectedAccounts = stateFromStores?.connectedAccounts;
let env17636;
let env17637;
const memo2 = useMemo(() => {
let r4 = stateFromStores?.connectedAccounts;
if (r4 == null) {
r4 = c6667_20;
}
return r4;
}, [connectedAccounts]);
const r39 = env17636 = {
$parent: env6667
};
env17636[0] = void 0;
env17636[1] = void 0;
env17636[2] = void 0;
env17636[1] = useThemeContext().theme;
env17636[2] = useStateFromStores([LocaleStore], $mk83791());
const children = memo.map($mk83792(r39));
const id = user.id;
const r55 = env17637 = {
$parent: env6667
};
env17637[0] = id;
env17637[1] = void 0;
env17637[2] = void 0;
env17637[3] = void 0;
env17637[4] = void 0;
env17637[2] = useThemeContext().theme;
env17637[3] = useStateFromStores([LocaleStore], $mk83793());
env17637[4] = usePlatformAllowed({
forUserProfile: true
});
const children2 = memo2.filter($mk83794(r55)).map($mk83795(r55));
return stateFromStores2 ? null : memo2.length !== 0 ? <>
{children != null && children.length > 0 && (0, jsx)(UserProfileSection, {
title: intl.string(t.PHjkRE),
showContainer: true,
children
})}
{(0, jsx)(UserProfileSection, {
title: intl.string(t["3fe7U5"]),
showContainer: true,
children: children2
})}
</> : null;
};
export function useAppplicationRoleConnectionItems(a0, a1) {
let env17633;
const r1 = env17633 = {
$parent: env6667
};
env17633[0] = a1;
env17633[1] = useThemeContext().theme;
env17633[2] = useStateFromStores([LocaleStore], $mk83791());
return a0.map($mk83792(r1));
}
export function useConnectedAccountItems(a0, a1, a2) {
let env17634;
const r1 = env17634 = {
$parent: env6667
};
env17634[0] = a1;
env17634[1] = a2;
env17634[2] = useThemeContext().theme;
env17634[3] = useStateFromStores([LocaleStore], $mk83793());
env17634[4] = usePlatformAllowed({
forUserProfile: true
});
return a0.filter($mk83794(r1)).map($mk83795(r1));
}
@@ -0,0 +1,87 @@
// Metro module 8375 (f8376).
import { memo } from "react";
import { View } from "react-native";
import { PROFILE_CONTENT_BOTTOM_PADDING, PROFILE_CONTENT_WITHOUT_STATUS_TOP_PADDING } from "./Constants";
import { ACTION_SHEET_MAX_WIDTH } from "../../action_sheet/native/ActionSheetConstants";
import UserProfileSharedStyles from "./UserProfileSharedStyles";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import NicknameUtils from "../../../utils/NicknameUtils";
import UserUtils from "../../../utils/UserUtils";
import useBadges from "../hooks/useBadges";
import useUserProfileBannerHeight from "../hooks/native/useUserProfileBannerHeight";
import useUserProfileOverscrollStyles from "./useUserProfileOverscrollStyles";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import useProfileTheme from "../hooks/useProfileTheme";
import { useUserProfileColors } from "../hooks/native/useUserProfileColors";
import { copy } from "../../../utils/ClipboardUtils.native";
import { presentUsernameCopied, presentUserPronouns } from "../../toast/native/ToastUtils";
import UserProfileOverscrollBanner from "./UserProfileOverscrollBanner";
import ReanimatedRexport from "../../reanimated/ReanimatedRexport";
import { OpenableUserProfileAvatar } from "./UserProfileAvatar";
import UserProfilePrimaryInfo from "./UserProfilePrimaryInfo";
import { intl, t } from "../../../intl/index.native";
import UserProfileAboutMeCard from "./UserProfileAboutMeCard";
const r32 = memo(function NonUserBotProfileContent(props) {
const { user, channel, displayProfile, scrollPosition } = props;
const styles = UserProfileSharedStyles();
const trackUserProfileAction = useUserProfileAnalyticsContext().trackUserProfileAction;
const name = NicknameUtils.useName(channel?.guild_id, channel?.id, user);
const userTag = UserUtils.useUserTag(user);
const badges = useBadges(displayProfile);
const userProfileBannerHeight = useUserProfileBannerHeight(ACTION_SHEET_MAX_WIDTH);
const styles2 = useUserProfileOverscrollStyles({
scrollPosition,
bannerHeight: userProfileBannerHeight
});
const { bannerAnimatedStyle, bannerImageAnimatedStyle, contentAnimatedStyle, blurAnimatedProps, showBlur } = styles2;
const bottom = useSafeAreaInsets_native().bottom;
const profileTheme = useProfileTheme({
user,
displayProfile
});
const userProfileColors = useUserProfileColors({
theme: profileTheme.theme,
primaryColor: profileTheme.primaryColor,
secondaryColor: profileTheme.secondaryColor
});
const { avatarBackground, containerBackground } = userProfileColors;
if (user == null) {
return null;
}
const r74 = [<UserProfileOverscrollBanner user={user} displayProfile={displayProfile} bannerHeight={userProfileBannerHeight} bannerAnimatedStyle={bannerAnimatedStyle} bannerImageAnimatedStyle={bannerImageAnimatedStyle} blurAnimatedProps={blurAnimatedProps} showBlur={showBlur} />, ,];
let guildId = displayProfile?.guildId;
if (guildId == null) {
guildId = void 0;
}
const r86 = [<OpenableUserProfileAvatar user={user} guildId={guildId} backgroundColor={avatarBackground} disableStatus />, ,];
const guild_id = channel?.guild_id;
const pronouns = displayProfile?.pronouns;
const handleCopyUsername = function handleCopyUsername() {
trackUserProfileAction({
action: "COPY_USERNAME"
});
copy(userTag);
presentUsernameCopied();
};
r86[1] = <View style={[styles.profileContentWrapper, styles.profileContent, {
paddingTop: PROFILE_CONTENT_WITHOUT_STATUS_TOP_PADDING,
paddingBottom: bottom + PROFILE_CONTENT_BOTTOM_PADDING
}]}>
<View style={styles.primaryInfo}>
<UserProfilePrimaryInfo user={user} guildId={guild_id} displayName={name} pronouns={pronouns} badges={badges} badgeContainerBackground={containerBackground} displayNameAccessibilityHint={intl.string(t.y5MwJy)} onPressDisplayName={handleCopyUsername} onPressUserTag={handleCopyUsername} onPressPronouns={function onPressPronouns() {
trackUserProfileAction({
action: "PRESS_PRONOUNS"
});
presentUserPronouns();
}} showBadgeToastOnPress />
</View>
<View style={styles.cards}>
<UserProfileAboutMeCard userId={user.id} displayProfile={displayProfile} channel={channel} style={[styles.card, {
backgroundColor: containerBackground
}]} />
</View>
</View>;
r74[1] = <ReanimatedRexport.View style={contentAnimatedStyle}>{r86}</ReanimatedRexport.View>;
return <>{r74}</>;
});
export default r32;
@@ -0,0 +1,127 @@
// Metro module 13710 (f13711).
import _slicedToArray from "../../../_bundle/_slicedToArray";
import { useRef } from "react";
import { View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import DiscordMd5 from "../../discord_md5/DiscordMd5";
import { createPendingImage, generateAvatarDescription } from "../../recent_avatars/RecentAvatarUtils";
import { setTryItOutAvatar, setTryItOutBanner } from "../UserProfileActionCreators";
import { setPendingChanges } from "../UserProfileSettingsActionCreators";
import { announcePendingAvatarChange } from "../../profile_customization/ProfileCustomizationUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { intl, t } from "../../../intl/index.native";
import { NitroWheelIcon } from "../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import GIFPicker from "../../gif_picker/native/GIFPicker";
function $mk118405($env) {
return (c32052_0) => {
const fileReader = new FileReader();
fileReader.onload = (a0) => {
const result = a0.target?.result;
c32052_0(typeof result === "string" ? result : "");
};
fileReader.readAsDataURL($env[0]);
};
}
const useStyles = createStyles({
titleWrapper: {
flex: 0
},
titleContainer: {
justifyContent: "flex-start"
},
gifPicker: {
flex: 1,
marginTop: Module712.space.PX_4,
marginLeft: Module712.space.PX_8,
marginRight: Module712.space.PX_8
}
});
let c9525_10 = {
AVATAR: 0,
0: "AVATAR",
BANNER: 1,
1: "BANNER"
};
let c9525_11 = {
PROFILE_EDIT: 0,
0: "PROFILE_EDIT",
PROFILE_TRY_IT_OUT: 1,
1: "PROFILE_TRY_IT_OUT"
};
export default function ProfileGIFSelectActionSheet(props) {
const { profileAssetType, selectionContext, guildId } = props;
let _onPressGIF2 = function _onPressGIF() {
const r9 = async (c30664_0) => {
let c30664_3;
let env31698;
c30664_3 = void 0;
const r9 = env31698 = {};
let c30664_2 = r9;
env31698[0] = void 0;
env31698[1] = void 0;
env31698[2] = void 0;
env31698[3] = void 0;
env31698[4] = void 0;
env31698[5] = void 0;
env31698[6] = void 0;
env31698[7] = void 0;
const gifSrc2 = c30664_0.gifSrc;
let gifSrc = gifSrc2;
if (gifSrc2 == null) {
gifSrc = c30664_0.src;
}
env31698[1] = await fetch(gifSrc);
const r62 = await env31698[1].blob();
env31698[2] = r62;
const r72 = Promise;
env31698[0] = env31698[2];
env31698[3] = await r72.all([new Promise($mk118405(c30664_2)), DiscordMd5.fromBlob(env31698[2]).catch(() => null)]);
env31698[4] = (0, _slicedToArray)(env31698[3], 2);
env31698[5] = env31698[4][0];
env31698[6] = env31698[4][1];
if (c9525_10.AVATAR === profileAssetType) {
env31698[7] = createPendingImage({
imageUri: env31698[5],
description: generateAvatarDescription(),
originalMd5: env31698[6]
});
if (selectionContext === c9525_11.PROFILE_TRY_IT_OUT) {
setTryItOutAvatar(env31698[7]);
} else {
setPendingChanges({
guildId,
avatar: env31698[7]
});
announcePendingAvatarChange("set");
}
} else if (c9525_10.BANNER === profileAssetType) {
if (selectionContext === c9525_11.PROFILE_TRY_IT_OUT) {
setTryItOutBanner(env31698[5]);
} else {
setPendingChanges({
banner: env31698[5],
bannerOriginalMd5: env31698[6]
});
}
}
ActionSheetActionCreators.hideActionSheet();
};
_onPressGIF2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
const ref = useRef(null);
return <BottomSheet ref={ref} scrollable startExpanded>
<BottomSheetTitleHeader title={intl.string(t["xsC+/y"])} trailing={<NitroWheelIcon />} titleWrapperStyle={styles.titleWrapper} titleContainerStyle={styles.titleContainer} />
<View style={styles.gifPicker}>
<GIFPicker bottomSheetRef={ref} onPressGIF={function onPressGIF(event) {
return _onPressGIF2.apply(this, arguments);
}} />
</View>
</BottomSheet>;
};
export { c9525_10 as ProfileAssetType };
export { c9525_11 as GIFSelectionContext };
@@ -0,0 +1,282 @@
// Metro module 11958 (f11959).
import { useCallback } from "react";
import { View } from "react-native";
import LocaleStore from "../../user_settings/LocaleStore";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import GuildStore from "../../../stores/GuildStore";
import { DIVIDER_DOT, UserProfileThemeTypes } from "./Constants";
import { Routes } from "../../../Constants";
import { AppLauncherRouteName } from "../../app_launcher/native/AppLauncherNativeConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { useToken } from "../../../design/tokens/native/useToken";
import Module712 from "../../../_bundle/Module712";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import BioText from "../../profile_customization/native/BioText";
import { useStateFromStores } from "../../../_bundle/Module589";
import { getCreatedAtDate } from "../../connections/ConnectionsUtils";
import SnowflakeUtils from "../../../utils/SnowflakeUtils";
import { ClydeIcon } from "../../../design/components/Icon/native/redesign/generated/ClydeIcon";
import GuildIcon, { GuildIconSizes } from "../../guild/native/GuildIcon";
import { useFriendsSinceDate } from "../hooks/useFriendsSinceDate";
import { PressableOpacity } from "../../../design/void/native";
import { handleClick } from "../../../utils/MaskedLinkUtils";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import useBotProfileCommands from "../useBotProfileCommands";
import showUserProfileActionSheet, { getUserProfileActionSheetKey } from "./showUserProfileActionSheet";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { getRootNavigationRef } from "../../main_tabs_v2/RootNavigationRef.native";
import { transitionTo } from "../../routing/router_utils";
import { runAfterInteractions } from "../../../utils/native/RunAfterInteractionsUtils";
import { getBestActiveInput } from "../../../utils/native/ChatInputUtils";
import { KeyboardTypes } from "../../keyboard/native/KeyboardTypes";
import UserProfileAboutMeCardCommand from "./UserProfileAboutMeCardCommand";
import { Button } from "../../../design/components/Button/native/Button.native";
import UserProfileCard from "./UserProfileCard";
let c8202_14, c8202_15, useStyles, TextWithIcon, Bio, MemberJoinDates, FriendsSinceDate, PolicyLinks, PolicyLink, BotSlashCommands;
const Heading = function Heading(props) {
const { children, themeType } = props;
let r4 = themeType != null ? c8202_15[themeType] : void 0;
if (r4 == null) {
r4 = c8202_14;
}
const { headingVariant, headingSpacing } = r4;
let variant = useToken(Module712.modules.mobile.USER_PROFILE_ABOUT_ME_HEADING_TEXT_STYLE);
if (variant == null) {
variant = headingVariant;
}
return <Text accessibilityRole="header" variant={variant} color="user-profile-about-me-heading-text" style={{
marginBottom: headingSpacing
}}>{children}</Text>;
};
TextWithIcon = function TextWithIcon(props) {
const { icon, children, themeType, accessibilityLabel } = props;
const styles = useStyles();
let r15 = themeType != null ? c8202_15[themeType] : void 0;
if (r15 == null) {
r15 = c8202_14;
}
return <View style={[styles.textWithIcon, {
columnGap: r15.columnGap
}]} accessible accessibilityLabel={accessibilityLabel}>
{icon}
<Text variant={r15.textVariant} color="text-default">{children}</Text>
</View>;
};
Bio = function Bio(props) {
const { userId: userId2, displayProfile, pendingBio, themeType, lineClamp } = props;
let r20 = themeType != null ? c8202_15[themeType] : void 0;
if (r20 == null) {
r20 = c8202_14;
}
const textVariant = r20.textVariant;
const bio = displayProfile == null ? void 0 : displayProfile.getPreviewBio(pendingBio);
return bio == null ? null : bio !== "" ? <View>
<Heading themeType={themeType}>
{intl.string(t.ZzAR2Y)}
</Heading>
<BioText bio={bio} userId={userId2} textVariant={textVariant} lineClamp={lineClamp} />
</View> : null;
};
MemberJoinDates = function MemberJoinDates(props) {
const { userId, guildId, themeType } = props;
const styles = useStyles();
let r25 = themeType != null ? c8202_15[themeType] : void 0;
if (r25 == null) {
r25 = c8202_14;
}
const { textVariant, columnGap } = r25;
const stateFromStores2 = useStateFromStores([LocaleStore], () => LocaleStore.locale);
const stateFromStores = useStateFromStores([GuildStore], () => guildId != null ? GuildStore.getGuild(guildId) : null);
const stateFromStores3 = useStateFromStores([GuildMemberStore], () => guildId != null ? GuildMemberStore.getMember(guildId, userId) : null);
const createdAtDate2 = getCreatedAtDate(SnowflakeUtils.extractTimestamp(userId), stateFromStores2);
const createdAtDate = getCreatedAtDate(stateFromStores3?.joinedAt, stateFromStores2);
return <View>
<Heading themeType={themeType}>
{intl.string(t.a6XYD9)}
</Heading>
<View style={[styles.memberJoinDates, {
columnGap
}]}>
<TextWithIcon themeType={themeType} icon={<ClydeIcon size="xs" />} accessibilityLabel={intl.formatToPlainString(t["9t7w53"], {
date: createdAtDate2
})}>{createdAtDate2}</TextWithIcon>
{stateFromStores != null && createdAtDate != null && <>
<Text variant={textVariant} color="text-default" accessibilityElementsHidden importantForAccessibility="no-hide-descendants">{DIVIDER_DOT}</Text>
<TextWithIcon themeType={themeType} icon={<GuildIcon guild={stateFromStores} size={GuildIconSizes.XXSMALL} />} accessibilityLabel={intl.formatToPlainString(t.FdLNDK, {
guildName: stateFromStores.name,
date: createdAtDate
})}>{createdAtDate}</TextWithIcon>
</>}
</View>
</View>;
};
FriendsSinceDate = function FriendsSinceDate(props) {
const { userId: userId2, themeType } = props;
let r3 = themeType != null ? c8202_15[themeType] : void 0;
if (r3 == null) {
r3 = c8202_14;
}
const textVariant = r3.textVariant;
const friendsSinceDate = useFriendsSinceDate(userId2);
return friendsSinceDate == null ? null : <View>
<Heading themeType={themeType}>
{intl.string(t.wlTO8v)}
</Heading>
<Text variant={textVariant} color="text-default">{friendsSinceDate}</Text>
</View>;
};
PolicyLinks = function PolicyLinks(props) {
let r21, r29;
const { termsOfServiceUrl, privacyPolicyUrl, themeType } = props;
const styles = useStyles();
if (termsOfServiceUrl == null) {
const r2 = privacyPolicyUrl == null;
r21 = null;
if (!r2) {
r29 = [<Heading themeType={themeType}>
{intl.string(t.l6DP2n)}
</Heading>, <View style={styles.policyLinks}>
{termsOfServiceUrl != null && <PolicyLink url={termsOfServiceUrl} label={intl.string(t.s7STcY)} themeType={themeType} />}
{privacyPolicyUrl != null && <PolicyLink url={privacyPolicyUrl} label={intl.string(t.kH3JR5)} themeType={themeType} />}
</View>];
r21 = <View>{r29}</View>;
}
} else {
r29 = [<Heading themeType={themeType}>
{intl.string(t.l6DP2n)}
</Heading>, <View style={styles.policyLinks}>
{termsOfServiceUrl != null && <PolicyLink url={termsOfServiceUrl} label={intl.string(t.s7STcY)} themeType={themeType} />}
{privacyPolicyUrl != null && <PolicyLink url={privacyPolicyUrl} label={intl.string(t.kH3JR5)} themeType={themeType} />}
</View>];
r21 = <View>{r29}</View>;
}
return r21;
};
PolicyLink = function PolicyLink(props) {
const { url, label, themeType } = props;
let r11 = themeType != null ? c8202_15[themeType] : void 0;
if (r11 == null) {
r11 = c8202_14;
}
return <PressableOpacity accessibilityRole="link" onPress={() => handleClick({
href: url
})}>
<Text variant={r11.textVariant} color="text-link">{label}</Text>
</PressableOpacity>;
};
BotSlashCommands = function BotSlashCommands(props) {
const { applicationId, channel, commandIds, themeType } = props;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations().analyticsLocations;
const context = useUserProfileAnalyticsContext().context;
const botProfileCommands = useBotProfileCommands(channel, applicationId, commandIds);
const { commands, application } = botProfileCommands;
const callback = useCallback(() => {
if (application != null && application.bot != null) {
const id = application.bot.id;
ActionSheetActionCreators.hideActionSheet(getUserProfileActionSheetKey(id));
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null && rootNavigationRef.isReady()) {
const state = rootNavigationRef.getState();
let r36 = state == null ? void 0 : state.routes?.length;
if (r36 == null) {
r36 = 0;
}
while (r36 > 1) {
rootNavigationRef.goBack();
r36 = r36 - 1;
}
transitionTo(Routes.CHANNEL(channel.guild_id, channel.id));
}
runAfterInteractions(() => {
const bestActiveInput = getBestActiveInput();
if (bestActiveInput != null) {
bestActiveInput.openCustomKeyboard({
type: KeyboardTypes.APP_LAUNCHER,
context: {
initialRouteName: AppLauncherRouteName.APPLICATION_VIEW,
initiallyExpanded: true,
application,
onPressBack: () => {
showUserProfileActionSheet({
...context,
userId: id,
channelId: channel.id,
sourceAnalyticsLocations: analyticsLocations
});
}
}
});
}
});
}
}, [application, channel.id, channel.guild_id, context, analyticsLocations]);
return commands == null ? null : commands.length !== 0 ? <View>
<Heading themeType={themeType}>
{intl.string(t["0hKkS+"])}
</Heading>
<View style={styles.slashCommands}>
{commands.map((a0) => <UserProfileAboutMeCardCommand key={a0.id} application={application} channel={channel} command={a0} />)}
</View>
{application != null && application.bot != null && <Button size="sm" variant="tertiary" text={intl.string(t.VEfKyb)} onPress={callback} />}
</View> : null;
};
c8202_14 = {
headingVariant: "text-sm/semibold",
textVariant: "text-md/normal",
headingSpacing: 8,
rowGap: 24,
columnGap: 6
};
const r48 = {};
r48[UserProfileThemeTypes.PREVIEW] = {
headingVariant: "text-xs/semibold",
textVariant: "text-sm/normal",
headingSpacing: 4,
rowGap: 12,
columnGap: 3
};
c8202_15 = r48;
useStyles = createStyles({
card: {
flexDirection: "column"
},
textWithIcon: {
flexDirection: "row",
alignItems: "center"
},
memberJoinDates: {
flexDirection: "row",
flexWrap: "wrap"
},
slashCommands: {
flex: 1,
flexDirection: "row",
flexWrap: "wrap",
marginBottom: 12
},
policyLinks: {
rowGap: 8
}
});
export default function UserProfileAboutMeCard(props) {
const { userId: userId2, displayProfile, channel: channel2, pendingBio, bioLineClamp, themeType, style } = props;
const styles = useStyles();
let r19 = themeType != null ? c8202_15[themeType] : void 0;
if (r19 == null) {
r19 = c8202_14;
}
const rowGap = r19.rowGap;
const application2 = displayProfile?.application;
return <UserProfileCard style={[styles.card, {
rowGap
}, style]}>
<Bio userId={userId2} displayProfile={displayProfile} pendingBio={pendingBio} themeType={themeType} lineClamp={bioLineClamp} />
<MemberJoinDates userId={userId2} guildId={displayProfile?.guildId} themeType={themeType} />
<FriendsSinceDate userId={userId2} themeType={themeType} />
<PolicyLinks termsOfServiceUrl={application2?.termsOfServiceUrl} privacyPolicyUrl={application2?.privacyPolicyUrl} themeType={themeType} />
{application2?.popularApplicationCommandIds != null && channel2 != null && <BotSlashCommands applicationId={application2.id} channel={channel2} commandIds={application2.popularApplicationCommandIds} themeType={themeType} />}
</UserProfileCard>;
};
@@ -0,0 +1,67 @@
// Metro module 11962 (f11963).
import { memo } from "react";
import { AnalyticEvents } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { Text } from "../../../design/components/Text/native/Text";
import { getBestActiveInput } from "../../../utils/native/ChatInputUtils";
import { handleTapCommandMention, handleLongPressCommandMention } from "../../markup/native/MarkupReactCommandRule";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { collectChannelAnalyticsMetadata } from "../../app_analytics/AppAnalyticsUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import navigateToLastChannel from "../../main_tabs_v2/native/navigateToLastChannel";
import { getApplicationCommandSection } from "../../application_commands/ApplicationCommandUtils";
import { ApplicationCommandTriggerLocations } from "../../application_commands/ApplicationCommandTypes";
const useStyles = createStyles({
commandClickable: {
color: Module712.colors.MENTION_FOREGROUND,
backgroundColor: Module712.colors.MENTION_BACKGROUND,
marginEnd: Module712.space.PX_12,
marginBottom: Module712.space.PX_12
}
});
const r45 = memo(function UserProfileAboutMeCardCommand(props) {
const { application, command, channel } = props;
return <Text variant="text-md/bold" onPress={() => {
const bestActiveInput = getBestActiveInput();
let currentText = bestActiveInput == null ? void 0 : bestActiveInput.getText();
if (currentText == null) {
currentText = "";
}
handleTapCommandMention({
channelId: channel.id,
currentText,
commandId: command.id,
commandName: command.displayName,
onOpenCustomKeyboard: (a0) => bestActiveInput == null ? void 0 : bestActiveInput.openCustomKeyboard(a0),
onSetCommand: () => {
AnalyticsUtils.track(AnalyticEvents.POPULAR_APPLICATION_COMMAND_CLICKED, {
application_id: application?.id,
command_id: command.id,
guild_id: channel.getGuildId(),
...collectChannelAnalyticsMetadata(channel)
});
ActionSheetActionCreators.hideActionSheet();
navigateToLastChannel();
if (bestActiveInput != null) {
bestActiveInput.openSystemKeyboard();
}
if (bestActiveInput != null) {
const applicationCommandManager = bestActiveInput.getApplicationCommandManager();
if (applicationCommandManager != null) {
applicationCommandManager.setCommand({
channelId: channel.id,
command,
section: application != null ? getApplicationCommandSection(application) : null,
location: ApplicationCommandTriggerLocations.POPULAR_COMMANDS
});
}
}
}
});
}} onLongPress={() => handleLongPressCommandMention(command.displayName, command.id)} style={useStyles().commandClickable}>
/
{command.displayName}
</Text>;
});
export default r45;
@@ -0,0 +1,454 @@
// Metro module 8365 (f8366).
import * as Module19 from "react";
import { useRef, useMemo, useState, useCallback, useEffect } from "react";
import { StyleSheet, View } from "react-native";
import ChannelStore from "../../../stores/ChannelStore";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import UserStore from "../../../stores/UserStore";
import UserProfileSettingsStore from "../UserProfileSettingsStore";
import { UserProfileThemeTypes } from "./Constants";
import { AnalyticEvents, EMPTY_STRING_SNOWFLAKE_ID, UserSettingsSections } from "../../../Constants";
import { ACTION_SHEET_MAX_WIDTH } from "../../action_sheet/native/ActionSheetConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import * as _Module5245 from "../../../_bundle/Module5245";
import { useBottomSheet, useScrollEventsHandlersDefault, useBottomSheetInternal, BottomSheetScrollView } from "../../../_bundle/Module5245";
import * as _ReanimatedRexport from "../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedReaction, useAnimatedStyle, useSharedValue, useWorkletCallback } from "../../reanimated/ReanimatedRexport";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { useStateFromStores, useStateFromStoresObject } from "../../../_bundle/Module589";
import useDisplayProfile from "../hooks/useDisplayProfile";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import { useBottomSheetRef } from "../../../design/components/Sheet/native/useBottomSheetRef";
import { ProfileVisibility } from "../../user_settings/UserSettings";
import { useCreateUserProfileAnalyticsContext, UserProfileAnalyticsProvider } from "../UserProfileAnalyticsContext";
import { useIsScreenLandscape } from "../../screen/useIsScreenLandscape.native";
import useMaybeFetchProfileFrame from "../../collectibles/profile_frames/hooks/useMaybeFetchProfileFrame";
import useMaybeTrackProfileFrameViewed from "../../collectibles/profile_frames/hooks/useMaybeTrackProfileFrameViewed";
import ProfileFrame from "../../collectibles/profile_frames/native/ProfileFrame";
import { ProfileFrameLayerOrder } from "../../../_bundle/Module8088";
import useProfileEffect from "../../collectibles/profile_effects/useProfileEffect";
import useProfileTheme from "../hooks/useProfileTheme";
import useUserProfileBannerHeight from "../hooks/native/useUserProfileBannerHeight";
import useWindowDimensions_native from "../../screen/useWindowDimensions.native";
import { NAV_BAR_HEIGHT_MULTILINE } from "../../../design/components/Navigator/native/NavigatorConstants.native";
import scaleProfileFrame from "../../collectibles/profile_frames/scaleProfileFrame";
import useTheme from "../../../hooks/useTheme";
import { useToken } from "../../../design/tokens/native/useToken";
import Module712 from "../../../_bundle/Module712";
import useUserProfileAnalyticsProperties from "../hooks/native/useUserProfileAnalyticsProperties";
import { shouldDisableUserPresenceInChannel } from "../../applications/ApplicationPresenceUtils";
import { getUser } from "../../../actions/UserActionCreators";
import isChangelogUser from "../../changelog/utils/isChangelogUser";
import maybeFetchUserProfile from "../maybeFetchUserProfile";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { getRootNavigationRef } from "../../main_tabs_v2/RootNavigationRef.native";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import showUserProfileActionSheet, { getUserProfileActionSheetKey } from "./showUserProfileActionSheet";
import { useNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { EmptyState } from "../../../design/void/native";
import { NoResults } from "../../../design/components/Illustration/native/redesign/generated/NoResults";
import { intl, t } from "../../../intl/index.native";
import { ThemeContextProvider } from "../../../_bundle/Module3901";
import UserProfileFixedBackground from "./UserProfileFixedBackground";
import { isIOS } from "../../../utils/PlatformUtils";
import { openUserSettings } from "../../user_settings/core/native/openUserSettings";
import NonUserBotProfileContent from "./NonUserBotProfileContent";
import BotUserProfileContent from "./BotUserProfileContent";
import UserProfileContent from "./UserProfileContent";
import ProfileEffect from "../../collectibles/profile_effects/native/ProfileEffect";
import { ActionSheetHeaderBar } from "../../../design/components/Sheet/native/ActionSheetHeaderBar.native";
import { ActionSheetBackdropToast } from "./ActionSheetBackdropToast";
import * as _Module1306 from "../../../_bundle/Module1306";
let useStyles, __initData, __initData2, __initData3, ActionSheetAlignedView, __initData4, __initData5;
const UseAnimatedPosition = function UseAnimatedPosition({ animatedPosition }) {
const animatedPosition2 = useBottomSheet().animatedPosition;
const n = () => animatedPosition2.get();
n.__closure = {
value: animatedPosition2
};
n.__workletHash = 5684011437075;
n.__initData = __initData;
const r19 = (a0) => animatedPosition.set(a0);
r19.__closure = {
animatedPosition
};
r19.__workletHash = 15360670503044;
r19.__initData = __initData2;
useAnimatedReaction(n, r19);
return null;
};
ActionSheetAlignedView = function ActionSheetAlignedView(props) {
const { animatedPosition: animatedPosition3, animatedIndex, safeAreaTop, children } = props;
const c = () => ({
transform: [{
translateY: animatedPosition3.get() + safeAreaTop
}],
opacity: _ReanimatedRexport.interpolate(animatedIndex.get(), [-1, 0], [0, 1], _ReanimatedRexport.Extrapolation.CLAMP)
});
c.__closure = {
animatedPosition: animatedPosition3,
safeAreaTop,
interpolate: _ReanimatedRexport.interpolate,
animatedIndex,
Extrapolation: _ReanimatedRexport.Extrapolation
};
c.__workletHash = 16546700050596;
c.__initData = __initData3;
return <ReanimatedRexport.View style={[StyleSheet.absoluteFill, useAnimatedStyle(c)]} pointerEvents="box-none">{children}</ReanimatedRexport.View>;
};
useStyles = createStyles({
container: {
flex: 1
},
profileContainer: {
position: "relative"
},
noPadding: {
paddingHorizontal: 0
},
profileEffect: {
position: "absolute",
top: 0,
left: 0,
right: 0,
zIndex: 1
}
});
__initData = {
code: "function UserProfileActionSheetTsx1(){const{value}=this.__closure;return value.get();}"
};
__initData2 = {
code: "function UserProfileActionSheetTsx2(prepared){const{animatedPosition}=this.__closure;return animatedPosition.set(prepared);}"
};
__initData3 = {
code: "function UserProfileActionSheetTsx3(){const{animatedPosition,safeAreaTop,interpolate,animatedIndex,Extrapolation}=this.__closure;return{transform:[{translateY:animatedPosition.get()+safeAreaTop}],opacity:interpolate(animatedIndex.get(),[-1,0],[0,1],Extrapolation.CLAMP)};}"
};
__initData4 = {
code: "function UserProfileActionSheetTsx4(payload,context){const{defaultHandleOnScroll,scrollPosition,animatedScrollableState,SCROLLABLE_STATE}=this.__closure;var _defaultHandleOnScrol;(_defaultHandleOnScrol=defaultHandleOnScroll)===null||_defaultHandleOnScrol===void 0||_defaultHandleOnScrol(payload,context);scrollPosition.set(animatedScrollableState.get()===SCROLLABLE_STATE.LOCKED?0:payload.contentOffset.y);}"
};
__initData5 = {
code: "function UserProfileActionSheetTsx5(){const{scrollPosition}=this.__closure;const transform=scrollPosition.get()<=0?[{translateY:scrollPosition.get()}]:[];return{transform:transform};}"
};
const r62 = Module19.memo(function UserProfileActionSheet(props) {
let r410;
let sharedValue, sharedValue2, top, stateFromStores, guild_id, stateFromStores2, c16538_11, analyticsLocations, sharedValue3, state, setState, state2, setState2, pendingAvatarDecoration, pendingProfileEffect, pendingProfileFrame, createUserProfileAnalyticsContext, frame, width, c16538_24, navigation;
const { userId, channelId, messageId, roleId, sessionId, disableCalls, disableMessage, isVoiceContext, onClose, location: location2, openedAt } = props;
let isPreviewingChanges = props.isPreviewingChanges;
if (isPreviewingChanges === void 0) {
isPreviewingChanges = false;
}
let c16538_3 = isPreviewingChanges;
const { showGuildProfile = true, sourceAnalyticsLocations = [] } = props;
const location_stack = sourceAnalyticsLocations;
const initialSection = props.initialSection;
sharedValue = void 0;
sharedValue2 = void 0;
top = void 0;
stateFromStores = void 0;
guild_id = void 0;
stateFromStores2 = void 0;
c16538_11 = void 0;
analyticsLocations = void 0;
sharedValue3 = void 0;
state = void 0;
setState = void 0;
state2 = void 0;
setState2 = void 0;
pendingAvatarDecoration = void 0;
pendingProfileEffect = void 0;
pendingProfileFrame = void 0;
createUserProfileAnalyticsContext = void 0;
frame = void 0;
width = void 0;
c16538_24 = void 0;
navigation = void 0;
const handleUserSettingsClose2 = function handleUserSettingsClose() {
navigation.goBack();
showUserProfileActionSheet({
sourceAnalyticsLocations: analyticsLocations,
...createUserProfileAnalyticsContext
});
};
const styles = useStyles();
sharedValue = useSharedValue(0);
sharedValue2 = useSharedValue(-1);
top = useSafeAreaInsets_native().top;
stateFromStores = useStateFromStores([UserStore], () => UserStore.getUser(userId));
const stateFromStores3 = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(channelId), [channelId]);
guild_id = stateFromStores3?.guild_id;
stateFromStores2 = useStateFromStores([GuildMemberStore], () => guild_id != null ? GuildMemberStore.getMember(guild_id, userId) : null);
let r94 = stateFromStores?.id;
if (r94 == null) {
r94 = EMPTY_STRING_SNOWFLAKE_ID;
}
const displayProfile = useDisplayProfile(r94, showGuildProfile ? guild_id : void 0);
c16538_11 = displayProfile;
analyticsLocations = useAnalyticsLocations([...location_stack, AnalyticsLocation.USER_PROFILE_ACTION_SHEET]).analyticsLocations;
const bottomSheetRef2 = useBottomSheetRef();
const { bottomSheetRef, bottomSheetClose } = bottomSheetRef2;
const ref = useRef(null);
sharedValue3 = useSharedValue(0);
const memo = useMemo(() => {
const sharedValue4 = sharedValue3;
return (a0, a1, a2) => {
const scrollEventsHandlersDefault = useScrollEventsHandlersDefault(a0, a1, a2);
const animatedScrollableState = useBottomSheetInternal().animatedScrollableState;
const handleOnScroll = scrollEventsHandlersDefault.handleOnScroll;
const r27 = function(a0, a1) {
if (handleOnScroll != null) {
handleOnScroll(a0, a1);
}
sharedValue4.set(animatedScrollableState.get() !== _Module5245.SCROLLABLE_STATE.LOCKED ? a0.contentOffset.y : 0);
};
r27.__closure = {
defaultHandleOnScroll: handleOnScroll,
scrollPosition: sharedValue4,
animatedScrollableState,
SCROLLABLE_STATE: _Module5245.SCROLLABLE_STATE
};
r27.__workletHash = 13254130622789;
r27.__initData = __initData4;
return {
...scrollEventsHandlersDefault,
handleOnScroll: useWorkletCallback(r27, [handleOnScroll, animatedScrollableState])
};
};
}, [sharedValue3]);
const V = function V() {
return {
transform: sharedValue3.get() <= 0 ? [{
translateY: sharedValue3.get()
}] : []
};
};
V.__closure = {
scrollPosition: sharedValue3
};
V.__workletHash = 6237718973214;
V.__initData = __initData5;
const animatedStyle = useAnimatedStyle(V);
[state, setState] = useState(false);
[state2, setState2] = useState(0);
const callback = useCallback((a0) => {
setState2(Math.floor(a0.nativeEvent.layout.width));
}, []);
const setting = ProfileVisibility.useSetting();
const stateFromStoresObject = useStateFromStoresObject([UserProfileSettingsStore], () => UserProfileSettingsStore.getPendingChanges());
const pendingThemeColors = stateFromStoresObject.pendingThemeColors;
pendingAvatarDecoration = stateFromStoresObject.pendingAvatarDecoration;
pendingProfileEffect = stateFromStoresObject.pendingProfileEffect;
pendingProfileFrame = stateFromStoresObject.pendingProfileFrame;
createUserProfileAnalyticsContext = useCreateUserProfileAnalyticsContext({
layout: "ACTION_SHEET",
sourceSessionId: sessionId,
userId,
guildId: guild_id,
channelId,
messageId,
roleId,
showGuildProfile
});
const r155 = isPreviewingChanges && pendingProfileFrame !== void 0 ? pendingProfileFrame?.skuId : displayProfile == null ? void 0 : displayProfile.profileFrame?.skuId;
const isScreenLandscape = useIsScreenLandscape();
frame = useMaybeFetchProfileFrame(isScreenLandscape ? void 0 : r155, "UserProfileActionSheet");
useMaybeTrackProfileFrameViewed({
skuId: isScreenLandscape ? void 0 : r155,
openedAt,
context: createUserProfileAnalyticsContext,
analyticsLocations
});
const memo2 = useMemo(() => frame != null ? <ActionSheetAlignedView animatedPosition={sharedValue} safeAreaTop={top} animatedIndex={sharedValue2}>
<ProfileFrame frame={frame} frameOrder={ProfileFrameLayerOrder.BACK} profileThemeType={UserProfileThemeTypes.ACTION_SHEET} containerWidth={state2} />
</ActionSheetAlignedView> : null, [frame, sharedValue, top, sharedValue2, state2]);
const profileEffect = useProfileEffect(isPreviewingChanges && pendingProfileEffect !== void 0 ? pendingProfileEffect?.skuId : displayProfile == null ? void 0 : displayProfile.profileEffect?.skuId);
const profileTheme = useProfileTheme({
user: stateFromStores,
displayProfile,
pendingThemeColors: isPreviewingChanges ? pendingThemeColors : void 0
});
const { theme, primaryColor, secondaryColor } = profileTheme;
const userProfileBannerHeight = useUserProfileBannerHeight(ACTION_SHEET_MAX_WIDTH);
const windowDimensions_native = useWindowDimensions_native();
const height = windowDimensions_native.height;
width = windowDimensions_native.width;
const gradientHeight = height - NAV_BAR_HEIGHT_MULTILINE - top;
const memo3 = useMemo(() => {
if (c16538_3 && frame != null) {
return scaleProfileFrame(frame, Math.min(width, ACTION_SHEET_MAX_WIDTH)).overflowTop;
}
return 0;
}, [isPreviewingChanges, frame, width]);
const theme2 = useTheme();
const token = useToken(Module712.colors.INTERACTIVE_TEXT_HOVER, theme);
const userProfileAnalyticsProperties = useUserProfileAnalyticsProperties({
userId,
user: stateFromStores,
channelId,
guildId: guild_id,
displayProfile,
guildMember: stateFromStores2
});
c16538_24 = userProfileAnalyticsProperties;
const memo4 = useMemo(() => stateFromStores != null && shouldDisableUserPresenceInChannel(stateFromStores, channelId), [stateFromStores, channelId]);
useEffect(() => {
if (stateFromStores == null) {
getUser(userId);
}
}, [stateFromStores, userId]);
useEffect(() => {
if (!(stateFromStores == null || stateFromStores.isNonUserBot() && !isChangelogUser(stateFromStores.id))) {
const id = stateFromStores.id;
const avatarURL = stateFromStores.getAvatarURL(guild_id, 80);
let channelId2 = channelId;
if (channelId == null) {
channelId2 = void 0;
}
maybeFetchUserProfile(id, avatarURL, {
type: "action_sheet",
withMutualGuilds: true,
withMutualFriends: true,
dispatchWait: true,
guildId: guild_id,
channelId: channelId2
});
}
}, [stateFromStores, guild_id, channelId]);
useEffect(() => {
let r4 = state;
if (!state) {
r4 = c16538_11 == null;
}
if (!r4 && (guild_id == null || stateFromStores2?.fullProfileLoadedTimestamp != null)) {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, c16538_24);
setState(true);
}
}, [userProfileAnalyticsProperties, displayProfile, guild_id, state, stateFromStores2]);
const r238 = [pendingAvatarDecoration?.skuId, pendingProfileEffect?.skuId, , ,];
const skuId = pendingProfileFrame?.skuId;
const r243 = () => {
if (location_stack.at(-1) === AnalyticsLocation.COLLECTIBLES_SHOP_PROFILE_PREVIEW) {
const OPEN_MODAL = AnalyticEvents.OPEN_MODAL;
let sku_id = pendingAvatarDecoration?.skuId;
if (sku_id == null) {
sku_id = pendingProfileEffect?.skuId;
}
if (sku_id == null) {
sku_id = pendingProfileFrame?.skuId;
}
AnalyticsUtils.track(OPEN_MODAL, {
type: "Collectibles Shop Details Modal Expanded",
location_stack,
sku_id
});
}
};
r238[2] = skuId;
r238[3] = location_stack;
useEffect(r243, r238);
useEffect(() => () => {
if (onClose != null) {
onClose();
}
}, [onClose]);
useEffect(() => {
let rootNavigationRef, key;
const handleNavigationChange2 = function handleNavigationChange() {
if ((rootNavigationRef == null ? void 0 : rootNavigationRef.getCurrentRoute()?.key) !== key) {
ActionSheetActionCreators.hideActionSheet(getUserProfileActionSheetKey(userId));
}
};
rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null && rootNavigationRef.isReady()) {
key = rootNavigationRef.getCurrentRoute()?.key;
rootNavigationRef.addListener("state", handleNavigationChange2);
return () => {
rootNavigationRef.removeListener("state", handleNavigationChange2);
};
}
}, [userId]);
navigation = useNavigation();
if (stateFromStores == null) {
r410 = <AnalyticsLocationProvider value={analyticsLocations}>
<UserProfileAnalyticsProvider value={createUserProfileAnalyticsContext} openedAt={openedAt} fetchStartedAt={displayProfile?.fetchStartedAt} fetchEndedAt={displayProfile?.fetchEndedAt} isLoaded={displayProfile?.isLoaded}>
<BottomSheet>
<EmptyState style={{
marginTop: 42
}} Illustration={NoResults} body={intl.string(t.eAn6z2)} />
</BottomSheet>
</UserProfileAnalyticsProvider>
</AnalyticsLocationProvider>;
} else {
const fetchStartedAt = displayProfile?.fetchStartedAt;
const fetchEndedAt = displayProfile?.fetchEndedAt;
const isLoaded = displayProfile?.isLoaded;
const r286 = [frame != null && <UseAnimatedPosition animatedPosition={sharedValue} />, <UserProfileFixedBackground gradientHeight={gradientHeight} bannerHeight={userProfileBannerHeight} />, , ,];
const pointerEvents = isPreviewingChanges ? "none" : void 0;
const scrollEventsHandlersHook = isIOS() ? memo : void 0;
const props2 = {
user: stateFromStores,
channel: stateFromStores3,
displayProfile,
disableCalls,
disableMessage,
isVoiceContext,
location: location2,
disableStatus: memo4,
scrollViewRef: ref,
isPreviewingChanges,
navigateToShop: () => openUserSettings({
screen: UserSettingsSections.COLLECTIBLES_SHOP,
onClose: handleUserSettingsClose2
}),
navigateToPremium: () => openUserSettings({
screen: UserSettingsSections.PREMIUM,
onClose: handleUserSettingsClose2
}),
showUserProfileActionSheet: function showUserProfileActionSheetWithParams() {
showUserProfileActionSheet({
sourceAnalyticsLocations: analyticsLocations,
...createUserProfileAnalyticsContext
});
},
initialSection,
scrollPosition: isIOS() ? sharedValue3 : void 0
};
r286[2] = <BottomSheetScrollView scrollsToTop={false} style={styles.container} contentContainerStyle={{
pointerEvents
}} scrollEventsHandlersHook={scrollEventsHandlersHook} ref={ref}>
<View>
<View style={styles.profileContainer} onLayout={callback}>
{stateFromStores.isNonUserBot() ? <NonUserBotProfileContent {...props2} /> : stateFromStores.bot ? <BotUserProfileContent {...props2} /> : <UserProfileContent {...props2} />}
{profileEffect != null && <ReanimatedRexport.View style={[styles.profileEffect, {
height: gradientHeight
}, animatedStyle]} pointerEvents="none">
<ProfileEffect skuId={profileEffect.skuId} bannerAdjustment={0} />
</ReanimatedRexport.View>}
</View>
</View>
</BottomSheetScrollView>;
r286[3] = frame == null && <ActionSheetHeaderBar variant="floating" tabStyle={{
backgroundColor: token
}} onPress={bottomSheetClose} />;
const r362 = [<BottomSheet ref={bottomSheetRef} handleDisabled scrollable startExpanded maxHeight={gradientHeight - memo3} contentStyles={styles.noPadding} backdropChildren={memo2} animatedIndex={sharedValue2}>{r286}</BottomSheet>, frame != null && <ActionSheetAlignedView animatedPosition={sharedValue} safeAreaTop={top} animatedIndex={sharedValue2}>
<ProfileFrame frame={frame} profileThemeType={UserProfileThemeTypes.ACTION_SHEET} frameOrder={ProfileFrameLayerOrder.FRONT} containerWidth={state2} />
<ActionSheetHeaderBar variant="floating" tabStyle={{
backgroundColor: token
}} onPress={bottomSheetClose} />
</ActionSheetAlignedView>, ,];
if (isPreviewingChanges) {
isPreviewingChanges = <ThemeContextProvider theme={theme2} primaryColor={null} secondaryColor={null}>
<ActionSheetBackdropToast text={intl.string(setting === _Module1306.ProfileVisibility.FRIENDS_ONLY ? t.mNZcD8 : t["wSnI/0"])} isExpanded />
</ThemeContextProvider>;
}
r362[2] = isPreviewingChanges;
r410 = <ThemeContextProvider theme={theme} primaryColor={primaryColor} secondaryColor={secondaryColor}>
<AnalyticsLocationProvider value={analyticsLocations}>
<UserProfileAnalyticsProvider value={createUserProfileAnalyticsContext} openedAt={openedAt} fetchStartedAt={fetchStartedAt} fetchEndedAt={fetchEndedAt} isLoaded={isLoaded}>{r362}</UserProfileAnalyticsProvider>
</AnalyticsLocationProvider>
</ThemeContextProvider>;
}
return r410;
});
export default r62;
@@ -0,0 +1,635 @@
// Metro module 11989 (f11990).
import { useCallback } from "react";
import { TouchableOpacity, TouchableWithoutFeedback, View } from "react-native";
import ApplicationStore from "../../applications/ApplicationStore";
import ApplicationStreamingStore from "../../../stores/ApplicationStreamingStore";
import ChannelStore from "../../../stores/ChannelStore";
import GuildStore from "../../../stores/GuildStore";
import PermissionStore from "../../../stores/PermissionStore";
import PresenceStore from "../../../stores/PresenceStore";
import SelfPresenceStore from "../../../stores/SelfPresenceStore";
import VoiceStateStore from "../../../stores/VoiceStateStore";
import UserProfileStore from "../UserProfileStore";
import { CARD_PADDING } from "./Constants";
import { ActivityTypes, Permissions, PlatformTypes, StatusTypes } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { isAndroid } from "../../../utils/PlatformUtils";
import { Text } from "../../../design/components/Text/native/Text";
import { handleClick } from "../../../utils/MaskedLinkUtils";
import { useImageForActivity } from "../../content_inventory/ContentInventoryActivityImageUtils";
import { useThemeContext } from "../../../_bundle/Module3901";
import isListeningOnSpotify from "../../activities/utils/isListeningOnSpotify";
import { intl, t } from "../../../intl/index.native";
import { openAlbum, SpotifyTrack, SpotifyArtists } from "../../now_playing/native/UserActivitySpotify";
import FastImage from "../../../components_native/common/FastImage";
import { makeSource } from "../../../utils/AvatarUtils";
import isCrunchyrollActivity from "../../activities/utils/isCrunchyrollActivity";
import { UnknownGameIcon } from "../../../design/components/Icon/native/redesign/generated/UnknownGameIcon";
import { isThemeDark } from "../../../design/shared";
import isGameActivity from "../../activities/utils/isGameActivity";
import isEmbeddedActivity from "../../activities/utils/isEmbeddedActivity";
import UserProfileActivityCardBadges from "./UserProfileActivityCardBadges";
import getActivityHeader from "../utils/getActivityHeader";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import useTrackUserProfileActivityAction from "../hooks/useTrackUserProfileActivityAction";
import useOpenGameProfileModal from "../../game_profile/hooks/useOpenGameProfileModal";
import { GameProfileSources } from "../../game_profile/GameProfileAnalyticUtils";
import useTrackUserProfileActivityView from "../hooks/native/useTrackUserProfileActivityView";
import { useStateFromStores } from "../../../_bundle/Module589";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import UserProfileCard from "./UserProfileCard";
import { Icon, IconSizes, LiveTag } from "../../../design/void/native";
import shouldShowActivityTimeBar from "../utils/shouldShowActivityTimeBar";
import UserProfileActivityTimebar from "./UserProfileActivityTimebar";
import UserProfileActivityVoiceChannel from "./UserProfileActivityVoiceChannel";
import isOnXbox from "../../activities/utils/isOnXbox";
import { ConnectPlatformButton, PlayOnSpotifyButton, JoinActivityButton, JoinGameActivityButton, WatchActivityButton, CustomActivityButton, VoiceChannelButtons } from "./UserProfileActivityButtons";
import isOnPlayStation from "../../activities/utils/isOnPlayStation";
import { getCurrentActivityGamePlatform } from "../../activities/utils/isActivityJoinableOnCurrentPlatform";
import isStreaming from "../../activities/utils/isStreaming";
import isOnConsole from "../../activities/utils/isOnConsole";
import useMuteAwareLocalVolume from "../../media_engine/useMuteAwareLocalVolume";
import { MediaEngineContextTypes } from "../../../_bundle/Module4286";
import { useCanWatchStream } from "../../go_live/utils/StreamPermissionUtils";
import MobileAudioOutputExperiment from "../../media_engine/MobileAudioOutputExperiment";
import { VoicePanelStreamPreview } from "../../voice_panel/native/shared/VoicePanelStreamPreview";
import SelectedChannelActionCreators from "../../../actions/SelectedChannelActionCreators";
import { watchStreamAndTransitionToStream } from "../../../actions/StreamActionCreators";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import VolumeSlider from "../../../components_native/common/VolumeSlider";
import usePersonalizedVoiceChannelUsers from "../hooks/usePersonalizedVoiceChannelUsers";
import useChannelName from "../../channel/useChannelName";
import GroupAvatar from "../../main_tabs_v2/native/shared_components/GroupAvatar";
import UserProfileVoiceActivityIcon from "./UserProfileVoiceActivityIcon";
import getChannelA11yLabel from "../../channel/getChannelA11yLabel";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { openGuildVoiceModal } from "../../../utils/native/PrivateChannelCallUtils";
import { transitionToGuild } from "../../routing/transitionToGuild.native";
import closeVoicePanels from "../../voice_panel/native/utils/closeVoicePanels";
import useUserProfileActivity from "../hooks/useUserProfileActivity";
import useUserProfileVoiceActivity from "../hooks/useUserProfileVoiceActivity";
import UserProfileVoiceSettings from "./UserProfileVoiceSettings";
let useStyles, MaybeLink, ActivityCardBody, ActivityCard, StreamActivityCard, VoiceCallActivityCard;
const ActivityCardText = function ActivityCardText(props) {
const { children, ...props2 } = props;
let r6 = children;
if (typeof r6 === "string") {
r6 = children.trim();
}
return r6 == null ? null : r6 !== "" ? <Text {...props2}>{r6}</Text> : null;
};
MaybeLink = function MaybeLink(props) {
const { href, children } = props;
return href != null ? <TouchableOpacity accessibilityRole="link" onPress={() => handleClick({
href
})}>{children}</TouchableOpacity> : children;
};
ActivityCardBody = function ActivityCardBody(props) {
let r63, r152, r183, r204, name;
const { user, activity, application, onAction } = props;
const styles2 = useStyles();
const imageForActivity = useImageForActivity(activity, application, "user_profile_activity_native");
const { largeImage, smallImage } = imageForActivity;
const theme = useThemeContext().theme;
const props2 = {
style: styles2.body,
children: null
};
const bot = user.bot;
let r8 = !bot;
if (!bot) {
if (largeImage != null && isListeningOnSpotify(activity)) {
r63 = <TouchableWithoutFeedback accessibilityRole="button" accessibilityLabel={largeImage.alt} accessibilityHint={intl.string(t.sjjOk2)} onPress={() => {
onAction({
action: "OPEN_SPOTIFY_ALBUM"
});
openAlbum(activity, user.id);
}}>
<View style={[styles2.imageContainer, styles2.imageAspectRatio]}>
<FastImage source={makeSource(largeImage.src)} alt={largeImage.alt} style={styles2.largeImage} />
</View>
</TouchableWithoutFeedback>;
} else if (largeImage != null) {
const style2 = [styles2.imageContainer, isCrunchyrollActivity(activity) ? styles2.crunchyrollImageAspectRatio : styles2.imageAspectRatio];
r63 = <View style={style2}>
<MaybeLink href={activity.assets?.large_url}>
<FastImage source={makeSource(largeImage.src)} alt={largeImage.alt} style={styles2.largeImage} />
</MaybeLink>
{smallImage != null && <View style={styles2.smallImageBackground}>
<MaybeLink href={activity.assets?.small_url}>
<FastImage source={makeSource(smallImage.src)} alt={smallImage.alt} style={styles2.smallImage} />
</MaybeLink>
</View>}
</View>;
} else {
r63 = <View style={[styles2.imageContainer, styles2.imageAspectRatio]}>
<UnknownGameIcon size="custom" style={styles2.largeImage} color={isThemeDark(theme) ? Module712.colors.WHITE : Module712.colors.BLACK} />
</View>;
}
r8 = r63;
}
const children = [r8, ,];
const props3 = {
style: styles2.content,
children: null
};
if (isListeningOnSpotify(activity)) {
r152 = <ActivityCardText variant="text-md/semibold">
<SpotifyTrack text={activity.details} activity={activity} onPress={() => onAction({
action: "OPEN_SPOTIFY_TRACK"
})} />
</ActivityCardText>;
} else {
if (isGameActivity(activity)) {
name = activity.name;
} else {
name = activity.details;
if (name == null) {
name = activity.name;
}
}
r152 = <MaybeLink href={activity.details_url}>
<ActivityCardText variant="text-md/semibold">{name}</ActivityCardText>
</MaybeLink>;
}
const children2 = [r152, , , ,];
if (isListeningOnSpotify(activity)) {
const state = activity.state;
const artists = state == null ? void 0 : state.trim();
r183 = artists == null ? null : artists !== "" ? <ActivityCardText variant="text-xs/medium" lineClamp={1}>
<SpotifyArtists artists={artists} activity={activity} userId={user.id} onPress={() => onAction({
action: "OPEN_SPOTIFY_ARTIST"
})} />
</ActivityCardText> : null;
} else {
let details = activity.details;
if (!(isGameActivity(activity) || activity.state == null)) {
details = activity.state;
}
r183 = <MaybeLink href={activity.state_url}>
<ActivityCardText variant="text-xs/medium" lineClamp={1}>{details}</ActivityCardText>
</MaybeLink>;
}
L62: {
children2[1] = r183;
const isListeningOnSpotify2 = isListeningOnSpotify(activity);
r204 = null;
if (!isListeningOnSpotify2) {
const type = activity.type;
const WATCHING = ActivityTypes.WATCHING;
r204 = null;
if (type !== WATCHING) {
if (isGameActivity(activity) && !isEmbeddedActivity(activity)) {
const r215 = activity.party != null;
r204 = null;
if (r215) {
break L62;
}
}
r204 = isGameActivity(activity) ? <ActivityCardText variant="text-xs/medium" lineClamp={1}>
{[activity.state, activity.party?.size != null && activity.party.size.length >= 2 ? activity.party.size[1] === 0 ? intl.formatToPlainString(t.IM4J4e, {
count: activity.party.size[0]
}) : intl.formatToPlainString(t["u//9By"], {
count: activity.party.size[0],
max: activity.party.size[1]
}) : ""].join(" ")}
</ActivityCardText> : <MaybeLink href={activity.assets?.large_url}>
<ActivityCardText variant="text-xs/medium" lineClamp={1}>
{activity.assets?.large_text}
</ActivityCardText>
</MaybeLink>;
}
}
}
children2[2] = r204;
const bot2 = user.bot;
children2[3] = bot2 ? !bot2 : <UserProfileActivityCardBadges style={styles2.badges} activity={activity} />;
props3.children = children2;
children[1] = <View {...props3} />;
props2.children = children;
return <View {...props2} />;
};
ActivityCard = function ActivityCard(props) {
let r153;
const { user: user2, currentUser: currentUser2, activity: activity2, voiceChannel: voiceChannel2, style: style2 } = props;
const styles2 = useStyles();
const activityHeader = getActivityHeader(activity2);
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.USER_PROFILE_LIVE_ACTIVITY_CARD).analyticsLocations;
const onAction2 = useTrackUserProfileActivityAction({
display: "live",
voiceChannelId: voiceChannel2?.id,
user: user2,
activity: activity2,
analyticsLocations
});
let application_id = activity2.application_id;
if (application_id == null) {
application_id = void 0;
}
const openGameProfileModal = useOpenGameProfileModal({
location: "User Profile Activity Card",
applicationId: application_id,
source: GameProfileSources.UserProfile,
trackEntryPointImpression: true,
sourceUserId: user2.id
});
let c19319_3 = openGameProfileModal;
const callback = useCallback(() => {
if (c19319_3 != null) {
c19319_3();
}
}, [openGameProfileModal]);
useTrackUserProfileActivityView({
userId: user2.id,
onAction: onAction2
});
const stateFromStores5 = useStateFromStores([GuildStore, VoiceStateStore, ChannelStore], () => {
if (isEmbeddedActivity(activity2)) {
const channel2 = ChannelStore.getChannel(VoiceStateStore.getVoiceStateForSession(user2.id, activity2?.session_id)?.channelId);
return GuildStore.getGuild(channel2 == null ? void 0 : channel2.getGuildId());
}
return null;
});
const stateFromStores4 = useStateFromStores([ApplicationStore], () => activity2.application_id != null ? ApplicationStore.getApplication(activity2.application_id) : activity2.name != null ? ApplicationStore.getApplicationByName(activity2.name) : null);
const type = activity2.type;
const CUSTOM_STATUS = ActivityTypes.CUSTOM_STATUS;
let r81 = null;
if (type !== CUSTOM_STATUS) {
const type2 = activity2.type;
const HANG_STATUS = ActivityTypes.HANG_STATUS;
r81 = null;
if (type2 !== HANG_STATUS) {
const props2 = {
value: analyticsLocations,
children: null
};
const props3 = {
onPress: callback,
disabled: openGameProfileModal == null,
accessibilityRole: "button",
accessibilityLabel: intl.formatToPlainString(t["9sZWVp"], {
gameName: activity2.name
}),
children: null
};
const props4 = {
style: [styles2.card, style2],
title: activityHeader.text,
titleStyle: styles2.cardTitle,
titleIcon: activityHeader.platformIcon != null && <Icon style={styles2.cardTitleIcon} source={makeSource(activityHeader.platformIcon?.whitePNG)} size={IconSizes.SMALL_14} disableColor />,
children: null
};
const children = [<ActivityCardBody user={user2} activity={activity2} application={stateFromStores4} onAction={onAction2} />, , , ,];
const shouldShowActivityTimeBar2 = shouldShowActivityTimeBar(activity2);
let r131 = null;
if (shouldShowActivityTimeBar2) {
const timestamps = activity2.timestamps;
r131 = <UserProfileActivityTimebar start={timestamps.start} end={timestamps.end} />;
}
children[1] = r131;
const r139 = voiceChannel2 == null ? null : stateFromStores5 == null ? null : <UserProfileActivityVoiceChannel guild={stateFromStores5} channel={voiceChannel2} onAction={onAction2} style={styles2.voiceChannelDivider} />;
L42: {
children[2] = r139;
if (isOnXbox(activity2)) {
r153 = <ConnectPlatformButton type={PlatformTypes.XBOX} onAction={onAction2} />;
} else if (isOnPlayStation(activity2)) {
r153 = <ConnectPlatformButton type={PlatformTypes.PLAYSTATION} onAction={onAction2} />;
} else {
const id = user2.id;
const id2 = currentUser2.id;
r153 = null;
if (id !== id2) {
if (isListeningOnSpotify(activity2)) {
r153 = <PlayOnSpotifyButton activity={activity2} onAction={onAction2} />;
} else if (isEmbeddedActivity(activity2)) {
r153 = <JoinActivityButton user={user2} currentUser={currentUser2} activity={activity2} application={stateFromStores4} onAction={onAction2} />;
} else {
if (isGameActivity(activity2)) {
const currentActivityGamePlatform = getCurrentActivityGamePlatform();
const r168 = Set;
let supported_platforms = activity2.supported_platforms;
if (supported_platforms == null) {
supported_platforms = [];
}
const r174 = new r168(supported_platforms).has(currentActivityGamePlatform);
const r176 = activity2.party != null;
if (r174 && r176 && stateFromStores4?.deepLinkUri != null && activity2.session_id != null && stateFromStores4 != null) {
r153 = <JoinGameActivityButton user={user2} currentUser={currentUser2} activity={activity2} application={stateFromStores4} onAction={onAction2} />;
break L42;
}
}
r153 = isStreaming(activity2) ? <WatchActivityButton activity={activity2} onAction={onAction2} /> : activity2.buttons != null ? activity2.buttons.length > 0 ? <View style={styles2.customButtons}>
{activity2.buttons.map((button, a1) => <CustomActivityButton key={a1} index={a1} user={user2} activity={activity2} onAction={onAction2} />)}
</View> : null : null;
}
}
}
}
children[3] = r153;
props4.children = children;
props3.children = <UserProfileCard {...props4} />;
props2.children = <PressableOpacity {...props3} />;
r81 = <AnalyticsLocationProvider {...props2} />;
}
}
return r81;
};
StreamActivityCard = function StreamActivityCard(props) {
let c19320_4;
const { user: user3, stream, activity: activity3, style: style2 } = props;
c19320_4 = void 0;
const styles2 = useStyles();
const stateFromStores = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(stream.channelId));
const stateFromStores5 = useStateFromStores([VoiceStateStore], () => VoiceStateStore.isInChannel(stateFromStores?.id));
const stateFromStores6 = useStateFromStores([GuildStore], () => GuildStore.getGuild(stream.guildId));
const stateFromStores8 = useStateFromStores([PresenceStore], () => PresenceStore.findActivity(user3.id, (a0) => isGameActivity(a0) && !isOnConsole(a0)));
const stateFromStores4 = useStateFromStores([ApplicationStreamingStore], () => ApplicationStreamingStore.getActiveStreamForUser(user3.id, void 0));
const muteAwareLocalVolume = useMuteAwareLocalVolume(stateFromStores4?.ownerId, MediaEngineContextTypes.STREAM);
const { effectiveVolume, handleVolumeChange } = muteAwareLocalVolume;
const stateFromStores7 = useStateFromStores([ApplicationStore], () => activity3?.application_id != null ? ApplicationStore.getApplication(activity3.application_id) : activity3?.name != null ? ApplicationStore.getApplicationByName(activity3.name) : null);
const [r31] = useCanWatchStream(stateFromStores);
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.USER_PROFILE_LIVE_ACTIVITY_CARD).analyticsLocations;
const trackUserProfileActivityAction = useTrackUserProfileActivityAction({
display: "live",
voiceChannelId: stateFromStores?.id,
user: user3,
stream,
analyticsLocations
});
c19320_4 = trackUserProfileActivityAction;
useTrackUserProfileActivityView({
userId: user3.id,
onAction: trackUserProfileActivityAction
});
const nonContextualStreamOutputPresent = MobileAudioOutputExperiment.useConfig({
location: "UserProfileVoiceSettings"
}).nonContextualStreamOutputPresent;
return <AnalyticsLocationProvider value={analyticsLocations}>
<UserProfileCard style={[styles2.card, style2]} title={stateFromStores8 != null ? intl.formatToPlainString(t["4CQq9Q"], {
name: stateFromStores8.name
}) : intl.string(t["Jpkr/q"])} titleStyle={styles2.cardTitle} titleIcon={<LiveTag />}>
<View style={styles2.streamPreview}>
<VoicePanelStreamPreview mode={void 0} stream={stream} disabled={!r31} onPress={function onPress() {
c19320_4({
action: "PRESS_IMAGE"
});
SelectedChannelActionCreators.selectVoiceChannel(stream.channelId);
watchStreamAndTransitionToStream(stream);
ActionSheetActionCreators.hideActionSheet();
}} />
</View>
{stateFromStores4 != null && !nonContextualStreamOutputPresent && <VolumeSlider key="set-stream-volume" value={effectiveVolume} onValueChange={handleVolumeChange} />}
{activity3 != null && isEmbeddedActivity(activity3) && <ActivityCardBody user={user3} activity={activity3} application={stateFromStores7} onAction={trackUserProfileActivityAction} />}
{stateFromStores6 != null && stateFromStores != null && <UserProfileActivityVoiceChannel guild={stateFromStores6} channel={stateFromStores} onAction={trackUserProfileActivityAction} style={styles2.voiceChannelDivider} />}
{stateFromStores != null && <VoiceChannelButtons channel={stateFromStores} isInChannel={stateFromStores5} onAction={trackUserProfileActivityAction} />}
</UserProfileCard>
</AnalyticsLocationProvider>;
};
VoiceCallActivityCard = function VoiceCallActivityCard(props) {
let channelName, isInChannel, personalizedVoiceChannelUsers, props2, stateFromStores4, styles2, title, trackUserProfileActivityAction;
let channel, stateFromStores2, newestAnalyticsLocation, c19321_3;
L7: {
const user5 = props.user;
channel = props.channel;
isInChannel = props.isInChannel;
const style2 = props.style;
stateFromStores2 = void 0;
newestAnalyticsLocation = void 0;
c19321_3 = void 0;
styles2 = useStyles();
personalizedVoiceChannelUsers = usePersonalizedVoiceChannelUsers(channel);
channelName = useChannelName(channel);
stateFromStores2 = useStateFromStores([GuildStore], () => GuildStore.getGuild(channel.guild_id));
stateFromStores4 = useStateFromStores([PermissionStore], () => channel.isPrivate() || PermissionStore.can(Permissions.CONNECT, channel));
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.USER_PROFILE_VOICE_ACTIVITY_CARD);
const analyticsLocations2 = analyticsLocations.analyticsLocations;
newestAnalyticsLocation = analyticsLocations.newestAnalyticsLocation;
trackUserProfileActivityAction = useTrackUserProfileActivityAction({
display: "voice",
activity: {
type: "VOICE"
},
voiceChannelId: channel.id,
user: user5,
analyticsLocations: analyticsLocations2
});
c19321_3 = trackUserProfileActivityAction;
useTrackUserProfileActivityView({
userId: user5.id,
onAction: trackUserProfileActivityAction
});
props2 = {
style: [styles2.card, style2],
title: null,
titleStyle: null,
children: null
};
if (!channel.isDM() && !channel.isGroupDM()) {
if (channel.isGuildStageVoice()) {
title = intl.string(t.QygGCN);
break L7;
}
title = intl.string(t.msxteM);
} else {
title = intl.string(t["9FaEzi"]);
}
}
props2.title = title;
props2.titleStyle = styles2.cardTitle;
props2.children = [<View style={styles2.body}>
<GroupAvatar users={personalizedVoiceChannelUsers} guildId={stateFromStores2?.id} />
<View style={styles2.voiceCallContent}>
{stateFromStores4 ? <PressableOpacity accessibilityRole="button" accessibilityLabel={getChannelA11yLabel({
channel
})} accessibilityHint={intl.string(t["9C444m"])} onPress={() => {
c19321_3({
action: "OPEN_VOICE_CHANNEL"
});
ActionSheetActionCreators.hideActionSheet();
ModalActionCreators.popAll();
openGuildVoiceModal(channel, newestAnalyticsLocation);
}}>
<Text variant="text-md/semibold" color="mobile-text-heading-primary">
<View style={styles2.voiceCallNameIconWrapper}>
<UserProfileVoiceActivityIcon channel={channel} size="sm" color="mobile-text-heading-primary" />
</View>
{channelName}
</Text>
</PressableOpacity> : <Text variant="text-md/semibold" color="mobile-text-heading-primary">
<View style={styles2.voiceCallNameIconWrapper}>
<UserProfileVoiceActivityIcon channel={channel} size="sm" color="mobile-text-heading-primary" />
</View>
{channelName}
</Text>}
{stateFromStores2 == null ? null : <PressableOpacity accessibilityRole="button" accessibilityHint={intl.string(t.KLOhbO)} accessibilityLabel={intl.formatToPlainString(t["hq/Qze"], {
guildName: stateFromStores2.name
})} onPress={() => {
c19321_3({
action: "OPEN_VOICE_GUILD"
});
transitionToGuild(stateFromStores2.id);
closeVoicePanels();
ActionSheetActionCreators.hideActionSheet();
}}>
<Text variant="text-xs/medium">
{intl.format(t["hq/Qze"], {
guildName: stateFromStores2.name
})}
</Text>
</PressableOpacity>}
</View>
</View>, <VoiceChannelButtons channel={channel} isInChannel={isInChannel} onAction={trackUserProfileActivityAction} />];
return <UserProfileCard {...props2} />;
};
useStyles = createStyles({
card: {
gap: 12
},
cardTitle: {
marginBottom: 0
},
cardTitleIcon: {
tintColor: Module712.colors.TEXT_SUBTLE
},
body: {
flexDirection: "row",
alignItems: "center",
gap: 16
},
content: {
flex: 1
},
imageContainer: {
position: "relative"
},
imageAspectRatio: {
width: 60,
maxHeight: 60,
aspectRatio: "1 / 1"
},
crunchyrollImageAspectRatio: {
width: 60,
maxHeight: 100,
aspectRatio: "2 / 3"
},
largeImage: {
borderRadius: Module712.radii.xs,
width: "100%",
height: "100%"
},
smallImageBackground: {
borderRadius: 16,
position: "absolute",
right: -4,
bottom: -4,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
smallImage: {
width: 24,
height: 24,
borderRadius: 12
},
badges: {
marginTop: 4,
flexDirection: "row",
flexWrap: "wrap",
columnGap: 8,
rowGap: 0
},
voiceChannelDivider: {
borderTopWidth: 1,
borderTopColor: Module712.colors.BORDER_SUBTLE,
paddingTop: 12
},
customButtons: {
flexDirection: "column",
gap: 8
},
streamPreview: {
aspectRatio: 1.7777777777777777,
borderRadius: Module712.radii.xs,
overflow: "hidden"
},
voiceActivityCard: {
padding: 0
},
voiceSettings: {
padding: 0,
marginBottom: -16
},
voiceSettingsDivider: {
borderTopWidth: 1,
borderTopColor: Module712.colors.BORDER_SUBTLE,
paddingTop: 16,
marginTop: 4,
marginHorizontal: -CARD_PADDING,
paddingHorizontal: CARD_PADDING
},
voiceCallContent: {
flex: 1,
gap: 4
},
voiceCallNameIconWrapper: {
width: 22,
height: isAndroid() ? 12 : 16,
justifyContent: "center"
}
});
export default function UserProfileActivity(props) {
let c19322_8;
const { user: user4, currentUser, guildId, style } = props;
c19322_8 = void 0;
const styles = useStyles();
const userProfileActivity = useUserProfileActivity(user4.id);
const { live, stream: stream2 } = userProfileActivity;
const userProfileVoiceActivity = useUserProfileVoiceActivity({
userId: user4.id,
guildId
});
const { voiceChannel, voiceActivity } = userProfileVoiceActivity;
const stateFromStores3 = useStateFromStores([VoiceStateStore], () => voiceChannel != null && VoiceStateStore.isInChannel(voiceChannel.id));
c19322_8 = user4.id === currentUser.id;
const stateFromStores4 = useStateFromStores([SelfPresenceStore, PresenceStore], () => {
const r8 = c19322_8 ? SelfPresenceStore.getStatus() : PresenceStore.getStatus(user4.id);
return r8 === StatusTypes.OFFLINE || r8 === StatusTypes.INVISIBLE;
});
const stateFromStores5 = useStateFromStores([UserProfileStore], () => UserProfileStore.getUserProfile(user4.id)?.private === true);
if (!(!stateFromStores4 && !stateFromStores5) && voiceChannel != null && stateFromStores3) {
return <UserProfileCard style={[styles.card, style]}>
<UserProfileVoiceSettings user={user4} currentUser={currentUser} channel={voiceChannel} style={[styles.voiceSettings, styles.voiceSettingsDivider]} />
</UserProfileCard>;
}
if (stateFromStores4) {
return null;
}
const r62 = voiceActivity != null ? live.filter((item) => item !== voiceActivity) : live;
let r67 = stateFromStores5 ? !stateFromStores5 : voiceChannel != null;
if (r67) {
const renderVoiceActivityCard = function renderVoiceActivityCard(a0) {
return stream2 != null && stream2.channelId === a0.id ? <StreamActivityCard user={user4} stream={stream2} activity={voiceActivity} style={styles.voiceActivityCard} /> : voiceActivity != null ? <ActivityCard user={user4} currentUser={currentUser} activity={voiceActivity} voiceChannel={a0} style={styles.voiceActivityCard} /> : <VoiceCallActivityCard user={user4} channel={a0} isInChannel={stateFromStores3} style={styles.voiceActivityCard} />;
};
r67 = stateFromStores3 ? <UserProfileCard style={[styles.card, style]}>
{renderVoiceActivityCard(voiceChannel)}
<UserProfileVoiceSettings user={user4} currentUser={currentUser} channel={voiceChannel} style={[styles.voiceSettings, styles.voiceSettingsDivider]} />
</UserProfileCard> : <UserProfileCard style={[styles.card, style]}>
{renderVoiceActivityCard(voiceChannel)}
</UserProfileCard>;
}
return <>
{[r67, (stateFromStores5 ? !stateFromStores5 : stream2 != null) && stream2.channelId !== voiceChannel?.id && <StreamActivityCard user={user4} stream={stream2} activity={voiceActivity} style={style} />, r62.map((item, index) => {
const props = {
user: user4,
currentUser,
activity: item,
style
};
let application_id = item.application_id;
if (application_id == null) {
application_id = index;
}
return <ActivityCard key={application_id} {...props} />;
})]}
</>;
};
@@ -0,0 +1,83 @@
// Metro module 11996 (f11997).
import { View } from "react-native";
import { ActivityTypes } from "../../../Constants";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { HourglassIcon } from "../../../design/components/Icon/native/redesign/generated/HourglassIcon";
import isEmbeddedActivity from "../../activities/utils/isEmbeddedActivity";
import { AppsIcon } from "../../../design/components/Icon/native/redesign/generated/AppsIcon";
import { TvIcon } from "../../../design/components/Icon/native/redesign/generated/TvIcon";
import { MusicIcon } from "../../../design/components/Icon/native/redesign/generated/MusicIcon";
import { GameControllerIcon } from "../../../design/components/Icon/native/redesign/generated/GameControllerIcon";
import { useTimestampTickedNow } from "../../content_inventory/memberlist/useTimestampTickedNow";
import shouldShowActivityTimeBar from "../utils/shouldShowActivityTimeBar";
import Module712 from "../../../_bundle/Module712";
import { ActiveTimestamp } from "../../icymi/native/content_inventory/Badges";
import { getRichGameStateBadgeText, getEpisodeBadgeText } from "../../content_inventory/utils";
import { GroupIcon } from "../../../design/components/Icon/native/redesign/generated/GroupIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { TopicsIcon } from "../../../design/components/Icon/native/redesign/generated/TopicsIcon";
const useStyles = createStyles({
container: {
display: "flex",
flexDirection: "row",
alignItems: "center",
gap: 4
},
bold: {
fontWeight: "bold"
}
});
export function TimestampBadge(props) {
const activity = props.activity;
const styles = useStyles();
const now = useTimestampTickedNow().now;
let start = activity.timestamps?.start;
if (start == null) {
start = activity.created_at;
}
if (start != null && !shouldShowActivityTimeBar(activity)) {
const end = activity.timestamps?.end;
let isCountDown = activity.timestamps?.isCountDown;
if (isCountDown == null) {
isCountDown = false;
}
let r30 = isCountDown && end != null && end > now;
if (r30 === void 0) {
r30 = false;
}
return <View style={styles.container}>
{jsx(r30 ? HourglassIcon : isEmbeddedActivity(activity) ? AppsIcon : activity.type === ActivityTypes.WATCHING ? TvIcon : activity.type === ActivityTypes.LISTENING ? MusicIcon : GameControllerIcon, {
size: "xxs",
color: Module712.colors.TEXT_FEEDBACK_POSITIVE
})}
<ActiveTimestamp entry={{
start,
end,
isCountDown
}} style={styles.bold} />
</View>;
}
return null;
}
export function PartyBadge(props) {
const activity = props.activity;
const styles = useStyles();
if (!isEmbeddedActivity(activity) && activity.party != null) {
const richGameStateBadgeText = getRichGameStateBadgeText(activity.state, activity.party);
return richGameStateBadgeText == null ? null : <View style={styles.container}>
<GroupIcon size="xxs" color={Module712.colors.TEXT_MUTED} />
<Text variant="text-sm/medium" color="text-muted">{richGameStateBadgeText}</Text>
</View>;
}
return null;
}
export function EpisodeBadge(props) {
const activity = props.activity;
const styles = useStyles();
const episodeBadgeText = getEpisodeBadgeText(activity.assets?.large_text);
return episodeBadgeText == null ? null : <View style={styles.container}>
<TopicsIcon size="xxs" color={Module712.colors.TEXT_MUTED} />
<Text variant="text-sm/medium" color="text-muted">{episodeBadgeText}</Text>
</View>;
}
@@ -0,0 +1,352 @@
// Metro module 12025 (f12026).
import EmbeddedActivitiesStore from "../../activities/EmbeddedActivitiesStore";
import ChannelStore from "../../../stores/ChannelStore";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import GuildMemberCountStore from "../../../stores/GuildMemberCountStore";
import GuildStore from "../../../stores/GuildStore";
import LocalActivityStore from "../../../stores/LocalActivityStore";
import PermissionStore from "../../../stores/PermissionStore";
import RelationshipStore from "../../../stores/RelationshipStore";
import SelectedChannelStore from "../../../stores/SelectedChannelStore";
import SelfPresenceStore from "../../../stores/SelfPresenceStore";
import VoiceStateStore from "../../../stores/VoiceStateStore";
import { PlatformTypes, UserSettingsSections } from "../../../Constants";
import { SpotifyResourceTypes, SpotifyEndpoints } from "../../spotify/SpotifyConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import { getEmbeddedActivityLocationChannelId } from "../../activities/utils/embeddedActivityLocationUtils";
import { useStateFromStores } from "../../../_bundle/defaultAreStatesEqual";
import getActivityChannelId from "../../activities/utils/getActivityChannelId";
import getActivityJoinability, { ActivityJoinability } from "../../activities/utils/getActivityJoinability";
import isEmbeddedActivity from "../../activities/utils/isEmbeddedActivity";
import { Button } from "../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../intl/index.native";
import { AppsIcon } from "../../../design/components/Icon/native/redesign/generated/AppsIcon";
import handleJoinEmbeddedActivity from "../../activities/handleJoinEmbeddedActivity";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import GamesActionCreators_native from "../../../actions/GamesActionCreators.native";
import isListeningOnSpotify from "../../activities/utils/isListeningOnSpotify";
import { Icon } from "../../../design/void/native";
import Module7920 from "../../../_bundle/Module7920";
import { canOpenSpotifyUrl, openUrl, attributeInstall } from "../../now_playing/native/UserActivitySpotify";
import Linking from "../../../lib/native/Linking";
import getStreamURL from "../../activities/utils/getStreamURL";
import isStreaming from "../../activities/utils/isStreaming";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { getRootNavigationRef } from "../../main_tabs_v2/RootNavigationRef.native";
import { connectAndOpen } from "../../stage_channels/StageChannelModalActionCreators";
import { openGuildVoiceModal } from "../../../utils/native/PrivateChannelCallUtils";
import Platforms from "../../../lib/Platforms";
import { makeSource } from "../../../utils/AvatarUtils";
import authorizeConnection_native from "../../connections/authorizeConnection.native";
import { openUserSettings } from "../../user_settings/core/native/openUserSettings";
import isCrunchyrollActivity from "../../activities/utils/isCrunchyrollActivity";
import { getMetadata } from "../../../actions/UserActivityActionCreators";
import URLUtils from "../../../utils/URLUtils";
import { handleClick } from "../../../utils/MaskedLinkUtils";
function $mk116350($env) {
return () => Linking.openURL($env[3]);
}
let env8265 = {};
const useStyles = createStyles({
icon: {
tintColor: Module712.colors.CONTROL_SECONDARY_TEXT_DEFAULT
}
});
export function JoinActivityButton(props) {
const { user, currentUser, activity, application, onAction } = props;
const analyticsLocations = useAnalyticsLocations().analyticsLocations;
const embeddedActivityLocationChannelId = getEmbeddedActivityLocationChannelId(EmbeddedActivitiesStore.getEmbeddedActivityForUserId(user.id, application?.id)?.location);
const stateFromStores = useStateFromStores([], () => getActivityChannelId({
channelId: embeddedActivityLocationChannelId,
userId: user.id,
activity
}));
const stateFromStores2 = useStateFromStores([ChannelStore, GuildStore, GuildMemberCountStore, RelationshipStore, SelectedChannelStore, VoiceStateStore, PermissionStore, LocalActivityStore, SelfPresenceStore, EmbeddedActivitiesStore], () => getActivityJoinability({
isEmbedded: true,
user,
currentUser,
activity,
application,
channelId: stateFromStores,
ChannelStore,
GuildStore,
GuildMemberCountStore,
RelationshipStore,
SelectedChannelStore,
VoiceStateStore,
PermissionStore,
LocalActivityStore,
SelfPresenceStore,
EmbeddedActivitiesStore
}));
return isEmbeddedActivity(activity) ? application != null ? stateFromStores2 !== ActivityJoinability.CANNOT_JOIN ? <Button text={stateFromStores2 === ActivityJoinability.JOINED ? intl.string(t.DPfdsq) : intl.string(t["4i2vj+"])} icon={<AppsIcon size="sm" color="white" />} variant="active" disabled={stateFromStores2 === ActivityJoinability.JOINED} onPress={() => {
onAction({
action: "PRESS_JOIN_BUTTON"
});
handleJoinEmbeddedActivity({
applicationId: application.id,
activityChannelId: stateFromStores,
locationObject: {},
analyticsLocations
});
ActionSheetActionCreators.hideActionSheet();
}} /> : null : null : null;
}
export function JoinGameActivityButton(props) {
const { user: user2, currentUser: currentUser2, activity: activity2, application: application2, onAction: onAction2 } = props;
const analyticsLocations2 = useAnalyticsLocations().analyticsLocations;
const application3 = {
id: application2.id,
deeplink_uri: application2.deepLinkUri
};
const stateFromStores2 = useStateFromStores([ChannelStore, GuildStore, GuildMemberCountStore, RelationshipStore, SelectedChannelStore, VoiceStateStore, PermissionStore, LocalActivityStore, SelfPresenceStore, EmbeddedActivitiesStore], () => getActivityJoinability({
user: user2,
currentUser: currentUser2,
activity: activity2,
application: application2,
channelId: null,
isEmbedded: false,
ChannelStore,
GuildStore,
GuildMemberCountStore,
RelationshipStore,
SelectedChannelStore,
VoiceStateStore,
PermissionStore,
LocalActivityStore,
SelfPresenceStore,
EmbeddedActivitiesStore
}));
return application2 == null ? null : stateFromStores2 !== ActivityJoinability.CANNOT_JOIN ? <Button text={stateFromStores2 === ActivityJoinability.JOINED ? intl.string(t.DPfdsq) : intl.string(t.VJlc0S)} variant="active" disabled={stateFromStores2 === ActivityJoinability.JOINED} onPress={() => {
onAction2({
action: "PRESS_JOIN_BUTTON"
});
GamesActionCreators_native.join({
userId: user2.id,
sessionId: activity2.session_id,
application: application3,
channelId: null,
messageId: null,
applicationActivity: activity2,
source: "UserProfile",
analyticsLocations: analyticsLocations2
});
ActionSheetActionCreators.hideActionSheet();
}} /> : null;
}
export function PlayOnSpotifyButton(props) {
const { activity: activity4, onAction: onAction3 } = props;
const styles = useStyles();
const sync_id = activity4.sync_id;
return isListeningOnSpotify(activity4) ? sync_id != null ? <Button text={intl.formatToPlainString(t.LEgD7t, {
platform: activity4.name
})} icon={<Icon size={Icon.Sizes.SMALL} source={Module7920} disableColor style={styles.icon} />} variant="secondary" onPress={async () => {
let r64;
let c27221_3 = 0;
let c30478_0;
try {
c30478_0 = void 0;
onAction3({
action: "PRESS_PLAY_ON_SPOTIFY_BUTTON"
});
c27221_3 = 1;
c30478_0 = await canOpenSpotifyUrl();
if (c30478_0) {
r64 = openUrl(c30478_0, SpotifyResourceTypes.TRACK, sync_id);
} else {
attributeInstall();
r64 = Linking.openURL(SpotifyEndpoints.APP_STORE);
}
c27221_3 = 0;
} catch ($e) {
let r7 = $e;
if (c27221_3 !== 0) {
while (true) {
try {
c27221_3 = 0;
} catch ($e) {
r7 = $e;
if (c27221_3 === 0) {
break;
}
continue;
}
return void 0;
}
}
throw r7;
}
return r64;
}} /> : null : null;
}
export function WatchActivityButton(props) {
const { activity: activity4, onAction: onAction4 } = props;
const streamURL = getStreamURL(activity4);
let c19344_1 = streamURL;
return isStreaming(activity4) ? streamURL != null ? <Button text={intl.string(t.I6JG46)} variant="secondary" onPress={() => {
onAction4({
action: "PRESS_WATCH_BUTTON"
});
Linking.openURL(c19344_1);
}} /> : null : null;
}
export function VoiceChannelButtons(props) {
let r52, isInChannel, text;
let channel, onAction5, newestAnalyticsLocation, isGuildStageVoice;
L17: {
channel = props.channel;
isInChannel = props.isInChannel;
onAction5 = props.onAction;
newestAnalyticsLocation = void 0;
isGuildStageVoice = void 0;
newestAnalyticsLocation = useAnalyticsLocations().newestAnalyticsLocation;
isGuildStageVoice = channel.isGuildStageVoice();
const isDM = channel.isDM();
if (isInChannel) {
L16: {
if (!isDM && !channel.isGroupDM()) {
if (isGuildStageVoice) {
r52 = intl.string(t.Acqcot);
break L16;
}
r52 = intl.string(t.BXxdl7);
} else {
r52 = intl.string(t["7hwn2A"]);
}
}
text = r52;
} else {
if (!isDM && !channel.isGroupDM()) {
if (isGuildStageVoice) {
text = intl.string(t["7vb2cc"]);
break L17;
}
text = intl.string(t["96ANUN"]);
break L17;
}
text = intl.string(t.ozoE2A);
}
}
return <Button text={text} variant={isInChannel ? "secondary" : "active"} grow onPress={() => {
onAction5({
action: "PRESS_JOIN_CALL_BUTTON"
});
ActionSheetActionCreators.hideActionSheet();
ModalActionCreators.popAll();
const rootNavigationRef = getRootNavigationRef();
if ((rootNavigationRef == null ? void 0 : rootNavigationRef.isReady()) === true && rootNavigationRef.getCurrentRoute()?.name === "you") {
rootNavigationRef.goBack();
}
if (isGuildStageVoice) {
connectAndOpen(channel);
} else {
openGuildVoiceModal(channel, newestAnalyticsLocation);
}
}} />;
}
export function ConnectPlatformButton(props) {
let c19346_3;
const { type, onAction: onAction6 } = props;
c19346_3 = void 0;
const styles = useStyles();
const newestAnalyticsLocation2 = useAnalyticsLocations().newestAnalyticsLocation;
if (useStateFromStores([ConnectedAccountsStore], () => ConnectedAccountsStore.getAccount(null, type) != null)) {
return null;
}
const r27 = Platforms.get(type);
c19346_3 = r27;
return <Button text={intl.formatToPlainString(t.XWSHTb, {
platform: r27.name
})} icon={<Icon size={Icon.Sizes.SMALL} source={makeSource(r27.icon.whitePNG)} disableColor style={styles.icon} />} variant="secondary" onPress={() => {
onAction6({
action: type === PlatformTypes.PLAYSTATION ? "PRESS_CONNECT_PLAYSTATION_BUTTON" : "PRESS_CONNECT_XBOX_BUTTON"
});
authorizeConnection_native({
platformType: c19346_3.type,
location: newestAnalyticsLocation2,
onClose: () => openUserSettings({
screen: UserSettingsSections.CONNECTIONS
})
});
}} />;
}
export function CustomActivityButton(props) {
const { user: user3, activity: activity3, index, onAction: onAction7 } = props;
return activity3.buttons == null ? null : index >= activity3.buttons.length ? null : <Button text={isCrunchyrollActivity(activity3) ? intl.string(t.I6JG46) : activity3.buttons[index]} variant="secondary" onPress={async () => {
let c27222_0, c27222_1, c27222_2;
let c27222_3 = 0;
const r12 = void 0;
const r11 = env8265;
L24: {
L21: {
L23: {
try {
let env30479;
c27222_1 = r12;
const r28 = env30479 = {
$parent: r11
};
c27222_0 = r28;
env30479[0] = void 0;
env30479[1] = void 0;
env30479[2] = void 0;
env30479[3] = void 0;
onAction7({
action: "PRESS_CUSTOM_BUTTON"
});
c27222_3 = 1;
env30479[0] = await getMetadata(activity3, user3.id);
if (env30479[0].button_urls.length <= index) {
c27222_3 = 0;
break L24;
}
env30479[1] = env30479[0].button_urls[index];
if (typeof env30479[1] !== "string") {
c27222_3 = 0;
break L23;
}
env30479[2] = URLUtils.safeParseWithQuery(env30479[1]);
if (env30479[2]?.protocol != null) {
if (env30479[2]?.hostname != null) {
const r88 = c27222_0;
env30479[3] = URLUtils.format(env30479[2]);
handleClick({
href: env30479[3],
onConfirm: $mk116350(r88),
trusted: false
});
c27222_3 = 0;
break L21;
}
}
c27222_3 = 0;
} catch ($e) {
const r26 = $e;
let r7 = r26;
c27222_2 = r26;
if (c27222_3 !== 0) {
while (true) {
try {
c27222_3 = 0;
break L21;
} catch (r110) {
r7 = r110;
c27222_2 = r110;
if (c27222_3 === 0) {
break;
}
}
}
}
throw r7;
}
return void 0;
}
return void 0;
}
return void 0;
}
}} />;
}
@@ -0,0 +1,14 @@
// Metro module 11995 (f11996).
import { View } from "react-native";
import { ActivityTypes } from "../../../Constants";
import { jsx } from "react/jsx-runtime";
import { PartyBadge, TimestampBadge, EpisodeBadge } from "./UserProfileActivityBadges";
export default function UserProfileActivityCardBadges(props) {
const { activity, style } = props;
const r15 = activity.type === ActivityTypes.PLAYING ? [PartyBadge, TimestampBadge] : activity.type === ActivityTypes.LISTENING ? [TimestampBadge] : activity.type === ActivityTypes.WATCHING ? [TimestampBadge, EpisodeBadge] : [];
return r15.length !== 0 ? <View style={style}>
{r15.map((item, index) => jsx(item, {
activity
}, index))}
</View> : null;
};
@@ -0,0 +1,54 @@
// Metro module 12015 (f12016).
import { View } from "react-native";
import { Fonts } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import MobileVisualRefreshExperiment from "../../themes/experiments/MobileVisualRefreshExperiment";
import useActivityTimer, { formatTime } from "../hooks/useActivityTimer";
import { Text } from "../../../design/components/Text/native/Text";
const useStyles = createStyles({
bar: {
backgroundColor: Module712.colors.BACKGROUND_MOD_MUTED,
borderRadius: Module712.radii.xs,
height: 4,
marginBottom: 4
},
progress: {
backgroundColor: Module712.colors.ACTIVITY_TIMEBAR_PROGRESS_BACKGROUND,
borderRadius: Module712.radii.xs,
height: "100%",
minWidth: 4
},
textRow: {
flexDirection: "row",
justifyContent: "space-between"
}
});
export default function UserProfileActivityTimebar(props) {
const { start, end, style } = props;
const r15 = MobileVisualRefreshExperiment("UserProfileActivityTimebar");
const styles = useStyles();
const activityTimer = useActivityTimer({
start,
end
});
const { elapsed, duration, percentage } = activityTimer;
const style2 = r15 ? void 0 : {
fontFamily: Fonts.CODE_NORMAL
};
return <View style={style}>
<View style={styles.bar}>
<View style={[styles.progress, {
width: 100 * percentage + "%"
}]} />
</View>
<View style={styles.textRow}>
<Text variant="text-xs/normal" style={style2} tabularNumbers={r15 ? r15 : void 0} color={r15 ? "text-subtle" : void 0}>
{formatTime(elapsed)}
</Text>
<Text variant="text-xs/normal" style={style2} tabularNumbers={r15 || void 0} color={r15 ? "text-subtle" : void 0}>
{formatTime(duration)}
</Text>
</View>
</View>;
};
@@ -0,0 +1,109 @@
// Metro module 12017 (f12018).
import { View } from "react-native";
import PermissionStore from "../../../stores/PermissionStore";
import { Permissions } from "../../../_bundle/Module505";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { isAndroid } from "../../../utils/PlatformUtils";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import { useUserProfileAnalyticsContext } from "../UserProfileAnalyticsContext";
import { useIsScreenReaderEnabled } from "../../a11y/native/useIsScreenReaderEnabled.native";
import usePersonalizedVoiceChannelUsers from "../hooks/usePersonalizedVoiceChannelUsers";
import useChannelName from "../../channel/useChannelName";
import { useStateFromStores } from "../../../_bundle/Module589";
import { StageIcon } from "../../../design/components/Icon/native/redesign/generated/StageIcon";
import { VoiceNormalIcon } from "../../../design/components/Icon/native/redesign/generated/VoiceNormalIcon";
import { intl, t } from "../../../intl/index.native";
import GuildIcon, { GuildIconSizes } from "../../guild/native/GuildIcon";
import { PressableOpacity } from "../../../design/void/Pressables/native/Pressables";
import ToastActionCreators from "../../toast/native/ToastActionCreators";
import { ChevronSmallRightIcon } from "../../../design/components/Icon/native/redesign/generated/ChevronSmallRightIcon";
import { Text } from "../../../design/components/Text/native/Text";
import getChannelA11yLabel from "../../channel/getChannelA11yLabel";
import { openGuildVoiceModal } from "../../../utils/native/PrivateChannelCallUtils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import showUserProfileActionSheet from "./showUserProfileActionSheet";
import { AvatarPile } from "../../../design/components/Pile/native/AvatarPile.native";
import { AvatarSizes, Avatar } from "../../../design/void/native";
const useStyles = createStyles({
container: {
flexDirection: "row",
alignItems: "center",
gap: 4,
overflow: "hidden"
},
channelButton: {
flex: 1,
flexDirection: "row",
alignItems: "center",
gap: 2
},
channelName: {
flex: 1,
overflow: "hidden",
marginTop: isAndroid() ? -2 : -1
}
});
export default function UserProfileActivityVoiceChannel(props) {
const { guild, channel, onAction, style } = props;
const styles = useStyles();
const newestAnalyticsLocation = useAnalyticsLocations().newestAnalyticsLocation;
const context = useUserProfileAnalyticsContext().context;
const isScreenReaderEnabled = useIsScreenReaderEnabled();
const users = usePersonalizedVoiceChannelUsers(channel);
const channelName = useChannelName(channel);
const stateFromStores = useStateFromStores([PermissionStore], () => channel.isPrivate() || PermissionStore.can(Permissions.CONNECT, channel));
const Component = channel.isGuildStageVoice() ? StageIcon : VoiceNormalIcon;
return <View style={[styles.container, style]}>
{isScreenReaderEnabled ? <View accessible accessibilityLabel={intl.formatToPlainString(t.xm6W9D, {
guildName: guild.name
})}>
<GuildIcon size={GuildIconSizes.XXSMALL} guild={guild} />
</View> : <PressableOpacity accessibilityRole="button" accessibilityLabel={guild.name} onPress={function onPress() {
onAction({
action: "PRESS_VOICE_CHANNEL_ICON"
});
ToastActionCreators.open({
key: "GUILD_NAME_TOAST",
content: guild.name,
icon: () => <GuildIcon size={GuildIconSizes.XSMALL} guild={guild} />
});
}}>
<GuildIcon size={GuildIconSizes.XXSMALL} guild={guild} />
</PressableOpacity>}
<ChevronSmallRightIcon size="xxs" color="text-default" />
{stateFromStores ? <PressableOpacity style={styles.channelButton} accessibilityRole="button" accessibilityLabel={getChannelA11yLabel({
channel
})} accessibilityHint={intl.string(t["9C444m"])} onPress={function onPress() {
onAction({
action: "OPEN_VOICE_CHANNEL"
});
openGuildVoiceModal(channel, newestAnalyticsLocation);
ActionSheetActionCreators.hideActionSheet();
}}>
<Component size="xxs" color="text-default" />
<Text style={styles.channelName} variant="text-xs/normal" lineClamp={1}>{channelName}</Text>
</PressableOpacity> : <View style={styles.channelButton}>
<Component size="xxs" color="text-default" />
<Text style={styles.channelName} variant="text-xs/normal" lineClamp={1}>{channelName}</Text>
</View>}
<PressableOpacity accessibilityRole="button" accessibilityLabel={intl.formatToPlainString(t.e95u3C, {
count: users.length
})} onPress={function onPress() {
onAction({
action: "PRESS_VOICE_CHANNEL_AVATARS"
});
ActionSheetActionCreators.openLazy(import("./UserProfileActivityVoiceChannelUsers"), "UserProfileActivityVoiceChannelUsers", {
users,
channel,
onPressUser: (a0) => showUserProfileActionSheet({
...context,
userId: a0
})
}, "stack");
}}>
<AvatarPile size={AvatarSizes.SIZE_16} totalCount={users.length} names={users.map((user) => user.username)}>
{(users.length <= 3 ? users : users.slice(0, 3)).map((item) => <Avatar key={item.id} size={AvatarSizes.SIZE_16} channel={channel} guildId={guild.id} user={item} />)}
</AvatarPile>
</PressableOpacity>
</View>;
};
@@ -0,0 +1,29 @@
// Metro module 12019 (f12020).
import PresenceStore from "../../../stores/PresenceStore";
import { useAvatarDecoration } from "../../collectibles/avatar_decorations/useAvatarDecoration";
import { useStateFromStoresObject } from "../../../_bundle/Module589";
import { TableRow } from "../../../design/components/TableRow/native/TableRow.native";
import NicknameUtils from "../../../utils/NicknameUtils";
import { Avatar, AvatarSizes } from "../../../design/void/native";
import UserProfileStackedActionSheet, { UserProfileStackedActionSheetList } from "./UserProfileStackedActionSheet";
import { intl, t } from "../../../intl/index.native";
const UserRow = function UserRow(props) {
const { user, channel: channel2, onPress: onPress2, start, end } = props;
const avatarDecoration = useAvatarDecoration(user, channel2.guild_id);
const stateFromStoresObject = useStateFromStoresObject([PresenceStore], () => ({
status: PresenceStore.getStatus(user.id),
isMobileOnline: PresenceStore.isMobileOnline(user.id),
isVROnline: PresenceStore.isVROnline(user.id)
}));
const { status, isMobileOnline, isVROnline } = stateFromStoresObject;
return <TableRow onPress={onPress2} label={NicknameUtils.getName(channel2.guild_id, channel2.id, user)} icon={<Avatar user={user} avatarDecoration={avatarDecoration} size={AvatarSizes.REFRESH_MEDIUM_32} guildId={channel2.guild_id} status={status} isMobileOnline={isMobileOnline} isVROnline={isVROnline} autoStatusCutout />} start={start} end={end} />;
};
export default function UserProfileActivityVoiceChannelUsers(props) {
const { users, channel, onBack, onPressUser } = props;
return <UserProfileStackedActionSheet title={intl.string(t["3xHUJ+"])} onBack={onBack} scrollable>
<UserProfileStackedActionSheetList data={users} keyExtractor={(item) => item.id} renderItem={(info) => {
const item = info.item;
return <UserRow key={item.id} user={item} channel={channel} onPress={() => onPressUser(item.id)} start={info.start} end={info.end} />;
}} />
</UserProfileStackedActionSheet>;
};
@@ -0,0 +1,9 @@
// Metro module 11718 (f11719).
import { AlertModal, AlertActionButton } from "../../../design/components/AlertModal/native/AlertModal.native";
import { intl, t } from "../../../intl/index.native";
import { AlertActions } from "../../../design/components/AlertModal/native/AlertModal.native";
export default function UserProfileAlertUserReported() {
return <AlertModal title={intl.string(t.IwHU3R)} content={intl.string(t.qxyRaq)} actions={<AlertActions>
<AlertActionButton key="okay" text={intl.string(t.BddRzS)} />
</AlertActions>} />;
};
@@ -0,0 +1,26 @@
// Metro module 11713 (f11714).
import { openAlert } from "../../../design/components/AlertModal/native/useAlertStore.native";
import UserProfileConfirmCancelFriendRequest from "./UserProfileConfirmCancelFriendRequest";
import UserProfileConfirmRemoveFriend from "./UserProfileConfirmRemoveFriend";
import UserProfileConfirmRemoveGameFriend from "./UserProfileConfirmRemoveGameFriend";
import UserProfileConfirmVideoUnstableConnection from "./UserProfileConfirmVideoUnstableConnection";
import UserProfileAlertUserReported from "./UserProfileAlertUserReported";
import UserProfileConfirmThreadRemove from "./UserProfileConfirmThreadRemove";
export function confirmCancelFriendRequest(a0) {
openAlert("cancel-friend-request", <UserProfileConfirmCancelFriendRequest {...a0} />);
}
export function confirmRemoveFriend(a0) {
openAlert("remove-friend", <UserProfileConfirmRemoveFriend {...a0} />);
}
export function confirmRemoveGameFriend(a0) {
openAlert("remove-game-friend", <UserProfileConfirmRemoveGameFriend {...a0} />);
}
export function confirmVideoUnstableConnection(a0) {
openAlert("video-unstable-connection", <UserProfileConfirmVideoUnstableConnection onConfirm={a0} />);
}
export function alertUserReported() {
openAlert("user-reported", <UserProfileAlertUserReported />);
}
export function confirmThreadRemove(a0) {
openAlert("thread-remove", <UserProfileConfirmThreadRemove {...a0} />);
}
@@ -0,0 +1,127 @@
// Metro module 12067 (f12068).
import { useMemo } from "react";
import { Image as Image2, Pressable, View } from "react-native";
import LocaleStore from "../../user_settings/LocaleStore";
import AuthenticationStore from "../../../stores/AuthenticationStore";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { ApplicationWidgetLayoutName } from "../../../_bundle/Module12068";
import UserProfileApplicationWidgetTopHeroLayout, { HERO_IMAGE_UNCLIPPED_TOP_BLEED } from "../../application_widget/native/UserProfileApplicationWidgetTopHeroLayout";
import UserProfileApplicationWidgetTopContainedLayout from "../../application_widget/native/UserProfileApplicationWidgetTopContainedLayout";
import UserProfileApplicationWidgetBottomStatsLayout from "../../application_widget/native/UserProfileApplicationWidgetBottomStatsLayout";
import UserProfileApplicationWidgetBottomProgressLayout from "../../application_widget/native/UserProfileApplicationWidgetBottomProgressLayout";
import UserProfileApplicationWidgetBottomCollectionLayout from "../../application_widget/native/UserProfileApplicationWidgetBottomCollectionLayout";
import { useStateFromStores } from "../../../_bundle/Module589";
import { createCompactNumberFormat, bindResolveFieldValue } from "../../../_bundle/Module12070";
import MobileVisualRefreshExperiment from "../../themes/experiments/MobileVisualRefreshExperiment";
import { useGetOrFetchApplication } from "../../applications/useGetOrFetchApplications";
import { useGame } from "../../games/hooks/useGame";
import useOpenGameProfileModal from "../../game_profile/hooks/useOpenGameProfileModal";
import { GameProfileSources } from "../../game_profile/GameProfileAnalyticUtils";
import useApplicationWidgetLayoutRendererProps from "../../application_widget/hooks/useApplicationWidgetLayoutRendererProps";
import { ApplicationWidgetConfigSurface } from "../../../_bundle/Module12153";
import UserProfileCard from "./UserProfileCard";
import { getWidgetTitle } from "../WidgetUtils";
import { HourglassIcon } from "../../../design/components/Icon/native/redesign/generated/HourglassIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
const useStyles = createStyles({
appIcon: {
width: 16,
height: 16,
borderRadius: Module712.radii.xs,
overflow: "hidden"
},
header: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
},
divider: {
borderBottomWidth: 1,
borderBottomColor: Module712.colors.BORDER_SUBTLE,
marginBottom: Module712.space.PX_24
},
stillSyncing: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
}
});
export default function UserProfileApplicationWidgetCard(props) {
let c19383_2;
const { userId, widget, cardStyle } = props;
let isFirstWidget = props.isFirstWidget;
if (isFirstWidget === void 0) {
isFirstWidget = false;
}
c19383_2 = void 0;
const styles = useStyles();
const stateFromStores = useStateFromStores([LocaleStore], () => LocaleStore.locale);
const memo = useMemo(() => createCompactNumberFormat(stateFromStores), [stateFromStores]);
const stateFromStores2 = useStateFromStores([AuthenticationStore], () => AuthenticationStore.getId() === userId);
const r23 = MobileVisualRefreshExperiment("UserProfileCard");
const getOrFetchApplication = useGetOrFetchApplication(widget.applicationId);
const uri = getOrFetchApplication == null ? void 0 : getOrFetchApplication.getIconURL(16);
const openGameProfileModal = useOpenGameProfileModal({
location: "UserProfileApplicationWidgetCard",
applicationId: useGame(getOrFetchApplication == null ? void 0 : getOrFetchApplication.getCanonicalGameId()).data?.id,
source: GameProfileSources.UserProfileApplicationWidget,
sourceUserId: userId,
trackEntryPointImpression: true,
stackingBehavior: "stack"
});
c19383_2 = openGameProfileModal;
const applicationWidgetLayoutRendererProps = useApplicationWidgetLayoutRendererProps(userId, widget.applicationId);
const { surfaceConfigs, resolutionContext, isLoading, hasIdentity } = applicationWidgetLayoutRendererProps;
const topConfig = surfaceConfigs[ApplicationWidgetConfigSurface.WIDGET_TOP];
const bottomConfig = surfaceConfigs[ApplicationWidgetConfigSurface.WIDGET_BOTTOM];
const titleLeadingIcon = uri != null ? <Image2 source={{
uri
}} style={styles.appIcon} /> : null;
if (stateFromStores2 && !isLoading && !hasIdentity) {
return <UserProfileCard style={cardStyle} title={getWidgetTitle(widget)} titleLeadingIcon={titleLeadingIcon}>
<View style={styles.stillSyncing}>
<HourglassIcon size="xs" color={Module712.colors.TEXT_MUTED} />
<Text variant="text-sm/medium" color="text-muted">
{intl.string(t.z5K4Uv)}
</Text>
</View>
</UserProfileCard>;
}
const resolveFieldValue = bindResolveFieldValue(resolutionContext);
const header = <Pressable style={styles.header} onPress={() => c19383_2 == null ? void 0 : c19383_2()} disabled={openGameProfileModal == null} accessibilityRole="button" accessibilityLabel={getWidgetTitle(widget)}>
{titleLeadingIcon}
<Text variant={r23 ? "text-sm/medium" : "text-sm/semibold"} color={r23 ? "text-strong" : "text-default"} lineClamp={1}>
{getWidgetTitle(widget)}
</Text>
</Pressable>;
const layout = topConfig?.layout;
const r158 = topConfig == null ? null : ApplicationWidgetLayoutName.WIDGET_TOP_HERO === layout ? <UserProfileApplicationWidgetTopHeroLayout header={header} topConfig={topConfig} resolveFieldValue={resolveFieldValue} numberFormat={memo} /> : ApplicationWidgetLayoutName.WIDGET_TOP_CONTAINED === layout ? <UserProfileApplicationWidgetTopContainedLayout header={header} topConfig={topConfig} resolveFieldValue={resolveFieldValue} numberFormat={memo} /> : null;
const layout2 = bottomConfig?.layout;
const r176 = bottomConfig == null ? null : ApplicationWidgetLayoutName.WIDGET_BOTTOM_STATS === layout2 ? <UserProfileApplicationWidgetBottomStatsLayout bottomConfig={bottomConfig} resolveFieldValue={resolveFieldValue} numberFormat={memo} /> : ApplicationWidgetLayoutName.WIDGET_BOTTOM_PROGRESS === layout2 ? <UserProfileApplicationWidgetBottomProgressLayout bottomConfig={bottomConfig} resolveFieldValue={resolveFieldValue} /> : ApplicationWidgetLayoutName.WIDGET_BOTTOM_COLLECTION === layout2 ? <UserProfileApplicationWidgetBottomCollectionLayout bottomConfig={bottomConfig} resolveFieldValue={resolveFieldValue} /> : null;
const r198 = r158 == null;
let r199 = null;
if (!r198) {
const r200 = r176 == null;
r199 = null;
if (!r200) {
const style = [cardStyle, ,];
if (isFirstWidget) {
isFirstWidget = topConfig?.layout === ApplicationWidgetLayoutName.WIDGET_TOP_HERO;
}
if (isFirstWidget) {
isFirstWidget = {
marginTop: HERO_IMAGE_UNCLIPPED_TOP_BLEED
};
}
style[1] = isFirstWidget;
r199 = <UserProfileCard style={style}>
{r158}
<View style={styles.divider} />
{r176}
</UserProfileCard>;
}
}
return r199;
};
@@ -0,0 +1,55 @@
// Metro module 12157 (f12158).
import { Image as Image2, View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { intl, t } from "../../../intl/index.native";
import { TextSkeleton } from "./UserProfileApplicationWidgetSkeletons";
import { Text } from "../../../design/components/Text/native/Text";
const useStyles = createStyles({
fieldTextRow: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4
},
fieldIcon: {
width: 16,
height: 16
}
});
export function formatDurationNarrow(a0) {
const r9 = Number.isFinite(a0) ? Math.max(0, Math.floor(a0)) : 0;
const hours = Math.floor(r9 / 3600000);
const minutes = Math.floor(r9 / 60000) % 60;
const seconds = Math.floor(r9 / 1000) % 60;
const r33 = [];
if (hours > 0) {
r33.push(intl.formatToPlainString(t.rhY1Rs, {
hours
}));
}
if (0 < minutes) {
r33.push(intl.formatToPlainString(t["XIGt+W"], {
minutes
}));
}
let r63 = seconds > 0;
if (!(0 < seconds)) {
r63 = r33.length === 0;
}
if (r63) {
r33.push(intl.formatToPlainString(t.pyvjRp, {
seconds
}));
}
return r33.join(" ");
}
export function FieldText(props) {
const { field, variant, color, skeletonWidthChars } = props;
const styles = useStyles();
return field.status !== "hidden" ? field.status === "skeleton" ? <TextSkeleton variant={variant} widthChars={skeletonWidthChars} /> : <View style={styles.fieldTextRow}>
<Text variant={variant} color={color} lineClamp={2}>{field.text}</Text>
{field.icon != null && <Image2 source={{
uri: field.icon.url
}} style={styles.fieldIcon} resizeMode="contain" />}
</View> : null;
}
@@ -0,0 +1,25 @@
// Metro module 12158 (f12159).
import { View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { TextStyleSheet } from "../../../design/components/Text/native/Text";
const useStyles = createStyles({
skeleton: {
borderRadius: Module712.radii.sm,
backgroundColor: Module712.colors.BACKGROUND_MOD_NORMAL
}
});
export function ImageSkeleton(props) {
const style = props.style;
return <View style={[useStyles().skeleton, style]} />;
}
export const APPROX_CHAR_WIDTH_RATIO = 0.46;
export function TextSkeleton(props) {
const { variant, widthChars = 15 } = props;
const styles = useStyles();
const r15 = TextStyleSheet[variant];
return <View style={[styles.skeleton, {
width: 0.46 * r15.fontSize * widthChars,
height: 0.8 * r15.lineHeight
}]} />;
}
Loaded 100 of 33051 files, more files were not shown because too many files have changed in this diff. Show more