@planningcenter/chat-react-native 3.44.1-qa-874.0 → 3.44.1-qa-876.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/components/conversation/attachments/giphy_attachment.js +2 -2
- package/build/components/conversation/attachments/giphy_attachment.js.map +1 -1
- package/build/components/conversation/attachments/image_attachment.d.ts.map +1 -1
- package/build/components/conversation/attachments/image_attachment.js +15 -14
- package/build/components/conversation/attachments/image_attachment.js.map +1 -1
- package/build/components/conversation/attachments/video_attachment.d.ts.map +1 -1
- package/build/components/conversation/attachments/video_attachment.js +2 -1
- package/build/components/conversation/attachments/video_attachment.js.map +1 -1
- package/build/components/conversation/message.d.ts.map +1 -1
- package/build/components/conversation/message.js +8 -1
- package/build/components/conversation/message.js.map +1 -1
- package/build/components/conversation/message_form.d.ts.map +1 -1
- package/build/components/conversation/message_form.js +7 -1
- package/build/components/conversation/message_form.js.map +1 -1
- package/build/components/conversation/reply_shadow_message.d.ts.map +1 -1
- package/build/components/conversation/reply_shadow_message.js +10 -3
- package/build/components/conversation/reply_shadow_message.js.map +1 -1
- package/build/components/display/badge.d.ts.map +1 -1
- package/build/components/display/badge.js +16 -3
- package/build/components/display/badge.js.map +1 -1
- package/build/hooks/use_conversation_layout_diagnostics.d.ts +21 -0
- package/build/hooks/use_conversation_layout_diagnostics.d.ts.map +1 -0
- package/build/hooks/use_conversation_layout_diagnostics.js +99 -0
- package/build/hooks/use_conversation_layout_diagnostics.js.map +1 -0
- package/build/hooks/use_conversation_messages.d.ts +1 -0
- package/build/hooks/use_conversation_messages.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages.js +10 -2
- package/build/hooks/use_conversation_messages.js.map +1 -1
- package/build/navigation/index.d.ts.map +1 -1
- package/build/navigation/index.js +2 -3
- package/build/navigation/index.js.map +1 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +22 -5
- package/build/screens/conversation_screen.js.map +1 -1
- package/build/screens/message_report_screen.d.ts.map +1 -1
- package/build/screens/message_report_screen.js +2 -4
- package/build/screens/message_report_screen.js.map +1 -1
- package/build/utils/aspect_ratio.d.ts +2 -0
- package/build/utils/aspect_ratio.d.ts.map +1 -0
- package/build/utils/aspect_ratio.js +11 -0
- package/build/utils/aspect_ratio.js.map +1 -0
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +1 -0
- package/build/utils/index.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/hooks/use_conversation_layout_diagnostics.test.tsx +142 -0
- package/src/components/conversation/attachments/giphy_attachment.tsx +2 -2
- package/src/components/conversation/attachments/image_attachment.tsx +30 -26
- package/src/components/conversation/attachments/video_attachment.tsx +2 -1
- package/src/components/conversation/message.tsx +8 -1
- package/src/components/conversation/message_form.tsx +14 -2
- package/src/components/conversation/reply_shadow_message.tsx +10 -3
- package/src/components/display/badge.tsx +20 -2
- package/src/hooks/use_conversation_layout_diagnostics.ts +123 -0
- package/src/hooks/use_conversation_messages.ts +10 -2
- package/src/navigation/index.tsx +2 -3
- package/src/screens/conversation_screen.tsx +25 -4
- package/src/screens/message_report_screen.tsx +6 -4
- package/src/utils/__tests__/aspect_ratio.test.ts +50 -0
- package/src/utils/aspect_ratio.ts +14 -0
- package/src/utils/index.ts +1 -0
|
@@ -2,6 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Pressable, StyleSheet, View } from 'react-native';
|
|
3
3
|
import Svg, { Defs, LinearGradient, Path, Stop } from 'react-native-svg';
|
|
4
4
|
import { useFontScale, useTheme } from '../../hooks';
|
|
5
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
6
|
+
import { useLayoutWidthProbe } from '../../hooks/use_conversation_layout_diagnostics';
|
|
5
7
|
import { platformFontWeightMedium } from '../../utils';
|
|
6
8
|
import { tokens } from '../../vendor/tapestry/tokens';
|
|
7
9
|
import { Icon } from './icon';
|
|
@@ -16,13 +18,18 @@ const PRODUCT_LOGO_COMPONENT_MAP = {
|
|
|
16
18
|
export function Badge({ appearance = 'neutral', metaLabel, style, iconName, iconNameRight, label, productLogoName, variant = 'default', maxFontSizeMultiplier, numberOfLinesMetaLabel = 1, onPress, }) {
|
|
17
19
|
const styles = useStyles({ appearance, maxFontSizeMultiplier, variant });
|
|
18
20
|
const { showBadgeProductLogo } = useTheme();
|
|
21
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
22
|
+
// Inset is metaLabel's remaining contentInset now that its left offset is
|
|
23
|
+
// a margin, not padding - see the CHAT-476 candidate fix on this style.
|
|
24
|
+
const onLabelLayout = useLayoutWidthProbe('badge.label', 0);
|
|
25
|
+
const onMetaLabelLayout = useLayoutWidthProbe('badge.metaLabel', styles.metaLabel.paddingHorizontal * 2);
|
|
19
26
|
const isMetaSubtle = variant === 'metaSubtle';
|
|
20
27
|
const hasMetaLabel = Boolean(metaLabel);
|
|
21
28
|
const showLogo = showBadgeProductLogo && productLogoName;
|
|
22
29
|
const isChatLogo = productLogoName?.toLowerCase() === 'chat';
|
|
23
30
|
const ProductLogoSvg = showLogo && PRODUCT_LOGO_COMPONENT_MAP[productLogoName];
|
|
24
31
|
const badgeLabel = isMetaSubtle && hasMetaLabel ? `${label}:` : label;
|
|
25
|
-
return (_jsxs(BadgeWrapper, { style: [styles.badgeWrapper, style], onPress: onPress, accessibilityRole: "button", children: [_jsxs(View, { style: styles.badge, children: [showLogo && ProductLogoSvg && _jsx(ProductLogoSvg, { logoSize: styles.logo.fontSize }), showLogo && isChatLogo && _jsx(Icon, { name: "general.textMessage", style: styles.icon }), iconName && _jsx(Icon, { name: iconName, style: styles.icon }), _jsx(Text, { variant: "footnote", style: styles.label, numberOfLines: 1, maxFontSizeMultiplier: maxFontSizeMultiplier, children: badgeLabel }), iconNameRight && _jsx(Icon, { name: iconNameRight, style: styles.iconRight })] }), hasMetaLabel && (_jsx(Text, { variant: "footnote", style: styles.metaLabel, numberOfLines: numberOfLinesMetaLabel, maxFontSizeMultiplier: maxFontSizeMultiplier, children: metaLabel }))] }));
|
|
32
|
+
return (_jsxs(BadgeWrapper, { style: [styles.badgeWrapper, style], onPress: onPress, accessibilityRole: "button", children: [_jsxs(View, { style: styles.badge, children: [showLogo && ProductLogoSvg && _jsx(ProductLogoSvg, { logoSize: styles.logo.fontSize }), showLogo && isChatLogo && _jsx(Icon, { name: "general.textMessage", style: styles.icon }), iconName && _jsx(Icon, { name: iconName, style: styles.icon }), _jsx(Text, { variant: "footnote", style: styles.label, numberOfLines: 1, maxFontSizeMultiplier: maxFontSizeMultiplier, onLayout: onLabelLayout, children: badgeLabel }), iconNameRight && _jsx(Icon, { name: iconNameRight, style: styles.iconRight })] }), hasMetaLabel && (_jsx(Text, { variant: "footnote", style: styles.metaLabel, numberOfLines: numberOfLinesMetaLabel, maxFontSizeMultiplier: maxFontSizeMultiplier, onLayout: onMetaLabelLayout, children: metaLabel }))] }));
|
|
26
33
|
}
|
|
27
34
|
const BadgeWrapper = ({ children, onPress, accessibilityRole, ...restProps }) => {
|
|
28
35
|
if (onPress) {
|
|
@@ -92,7 +99,10 @@ const useStyles = ({ appearance = 'neutral', maxFontSizeMultiplier, variant = 'd
|
|
|
92
99
|
paddingVertical: variantStylesMap[variant].paddingVertical,
|
|
93
100
|
paddingHorizontal: variantStylesMap[variant].paddingHorizontal,
|
|
94
101
|
backgroundColor: variantStylesMap[variant].backgroundColor,
|
|
95
|
-
|
|
102
|
+
// metaSubtle's borderRadius is 0, so this would otherwise resolve to -2.
|
|
103
|
+
// Neither platform clamps a negative radius; Android's BackgroundDrawable
|
|
104
|
+
// reads it as "no rounded borders" and skips the rounded path entirely.
|
|
105
|
+
borderRadius: Math.max(0, variantStylesMap[variant].borderRadius - 2),
|
|
96
106
|
},
|
|
97
107
|
icon: {
|
|
98
108
|
color: statusColorMap[appearance].icon,
|
|
@@ -116,7 +126,10 @@ const useStyles = ({ appearance = 'neutral', maxFontSizeMultiplier, variant = 'd
|
|
|
116
126
|
fontSize: badgeFontSize,
|
|
117
127
|
alignSelf: 'center',
|
|
118
128
|
flexShrink: 1,
|
|
119
|
-
|
|
129
|
+
// CHAT-476 candidate fix: margin (not padding) so this offset sits
|
|
130
|
+
// outside contentInsets - a shrunk Text can never see it as part of
|
|
131
|
+
// its own measured content width, so it can't go negative from this.
|
|
132
|
+
marginLeft: variantStylesMap[variant].metaLabelPaddingLeft,
|
|
120
133
|
},
|
|
121
134
|
});
|
|
122
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/components/display/badge.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { JSX } from 'react'\nimport type { TextStyle, ViewProps, ViewStyle } from 'react-native'\nimport { Pressable, StyleSheet, View } from 'react-native'\nimport Svg, { Defs, LinearGradient, Path, Stop } from 'react-native-svg'\nimport { useFontScale, useTheme } from '../../hooks'\nimport { platformFontWeightMedium } from '../../utils'\nimport { tokens } from '../../vendor/tapestry/tokens'\nimport { Icon, IconString } from './icon'\nimport { Text } from './text'\nimport { useStatusColorAppearanceMap, type StatusAppearanceUnion } from './utils/status_colors'\n\n// =================================\n// ====== Constants ================\n// =================================\n\ntype VariantUnion = 'default' | 'meta' | 'metaSubtle'\n\ntype VariantStyles = Record<\n VariantUnion,\n {\n backgroundColor: string\n paddingHorizontal: number\n paddingVertical: number\n borderWidth: number\n borderRadius: number\n textColor: string\n gap: number\n metaLabelPaddingLeft: number\n fontWeight: TextStyle['fontWeight']\n }\n>\n\ntype ProductLogoName = 'Groups' | 'Services' | 'groups' | 'services'\ntype ProductIconName = 'Chat' | 'chat'\ntype ProductLogoComponent = ({ logoSize }: { logoSize: number }) => JSX.Element\n\nconst PRODUCT_LOGO_COMPONENT_MAP: Record<ProductLogoName, ProductLogoComponent> = {\n Groups: GroupsLogo,\n groups: GroupsLogo,\n services: ServicesIcon,\n Services: ServicesIcon,\n}\n\n// =================================\n// ====== Component ================\n// =================================\n\nexport interface BadgeProps {\n /**\n * Renders the main text.\n */\n label: string\n /**\n * Renders secondary meta text to the right of the label.\n */\n metaLabel?: string\n /**\n * Changes the status color for the badge and icon.\n */\n appearance?: StatusAppearanceUnion\n /**\n * Changes form of the logo to support a meta label and badge\n */\n variant?: VariantUnion\n /**\n * Adds a product logo to the left of the text.\n */\n productLogoName?: ProductLogoName | ProductIconName\n /**\n * Shows an icon of the user choice to the left of the text.\n */\n iconName?: IconString\n /**\n * Shows an icon of the user choice to the right of the text.\n */\n iconNameRight?: IconString\n /**\n * Styles badge wrapper.\n */\n style?: ViewStyle\n /**\n * Specifies the maximum size a font can reach when allowFontScaling is enabled.\n */\n maxFontSizeMultiplier?: number\n /**\n * Callback function when the badge is pressed.\n */\n onPress?: () => void\n /**\n * Specifies the number of lines for the meta label before truncating.\n */\n numberOfLinesMetaLabel?: number\n}\n\nexport function Badge({\n appearance = 'neutral',\n metaLabel,\n style,\n iconName,\n iconNameRight,\n label,\n productLogoName,\n variant = 'default',\n maxFontSizeMultiplier,\n numberOfLinesMetaLabel = 1,\n onPress,\n}: BadgeProps) {\n const styles = useStyles({ appearance, maxFontSizeMultiplier, variant })\n const { showBadgeProductLogo } = useTheme()\n\n const isMetaSubtle = variant === 'metaSubtle'\n const hasMetaLabel = Boolean(metaLabel)\n\n const showLogo = showBadgeProductLogo && productLogoName\n const isChatLogo = productLogoName?.toLowerCase() === 'chat'\n const ProductLogoSvg = showLogo && PRODUCT_LOGO_COMPONENT_MAP[productLogoName as ProductLogoName]\n const badgeLabel = isMetaSubtle && hasMetaLabel ? `${label}:` : label\n\n return (\n <BadgeWrapper style={[styles.badgeWrapper, style]} onPress={onPress} accessibilityRole=\"button\">\n <View style={styles.badge}>\n {showLogo && ProductLogoSvg && <ProductLogoSvg logoSize={styles.logo.fontSize} />}\n {showLogo && isChatLogo && <Icon name=\"general.textMessage\" style={styles.icon} />}\n {iconName && <Icon name={iconName} style={styles.icon} />}\n <Text\n variant=\"footnote\"\n style={styles.label}\n numberOfLines={1}\n maxFontSizeMultiplier={maxFontSizeMultiplier}\n >\n {badgeLabel}\n </Text>\n {iconNameRight && <Icon name={iconNameRight} style={styles.iconRight} />}\n </View>\n {hasMetaLabel && (\n <Text\n variant=\"footnote\"\n style={styles.metaLabel}\n numberOfLines={numberOfLinesMetaLabel}\n maxFontSizeMultiplier={maxFontSizeMultiplier}\n >\n {metaLabel}\n </Text>\n )}\n </BadgeWrapper>\n )\n}\n\nconst BadgeWrapper = ({\n children,\n onPress,\n accessibilityRole,\n ...restProps\n}: ViewProps & Pick<BadgeProps, 'onPress'>) => {\n if (onPress) {\n return (\n <Pressable accessibilityRole={accessibilityRole} onPress={onPress} {...restProps}>\n {children}\n </Pressable>\n )\n }\n\n return <View {...restProps}>{children}</View>\n}\n\n// =================================\n// ====== Styles ===================\n// =================================\n\nconst useStyles = ({\n appearance = 'neutral',\n maxFontSizeMultiplier,\n variant = 'default',\n}: Partial<BadgeProps>) => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier })\n\n const statusColorMap = useStatusColorAppearanceMap()\n\n const badgeGap = 4 * fontScale\n const badgePaddingHorizontal = 8\n const badgePaddingVertical = 4\n const badgeFontSize = 12\n\n const variantStylesMap: VariantStyles = {\n default: {\n gap: badgeGap,\n backgroundColor: statusColorMap[appearance].background,\n metaLabelPaddingLeft: badgePaddingHorizontal,\n paddingHorizontal: badgePaddingHorizontal,\n paddingVertical: badgePaddingVertical,\n borderWidth: tokens.borderSizeDefault * fontScale,\n borderRadius: tokens.borderRadiusMd * fontScale,\n textColor: statusColorMap[appearance].text,\n fontWeight: 'normal',\n },\n meta: {\n gap: badgeGap,\n backgroundColor: statusColorMap[appearance].background,\n metaLabelPaddingLeft: badgePaddingHorizontal,\n paddingHorizontal: badgePaddingHorizontal,\n paddingVertical: badgePaddingVertical,\n borderWidth: tokens.borderSizeDefault * fontScale,\n borderRadius: tokens.borderRadiusMd * fontScale,\n textColor: statusColorMap[appearance].text,\n fontWeight: platformFontWeightMedium,\n },\n metaSubtle: {\n gap: badgeGap,\n backgroundColor: 'transparent',\n metaLabelPaddingLeft: badgeGap,\n paddingHorizontal: 0,\n paddingVertical: 0,\n borderWidth: 0,\n borderRadius: 0,\n textColor: colors.textColorDefaultSecondary,\n fontWeight: platformFontWeightMedium,\n },\n }\n\n return StyleSheet.create({\n badgeWrapper: {\n flexDirection: 'row',\n justifyContent: 'center',\n alignSelf: 'flex-start',\n borderRadius: variantStylesMap[variant].borderRadius,\n borderWidth: variantStylesMap[variant].borderWidth,\n borderColor: statusColorMap[appearance].background,\n },\n badge: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: variantStylesMap[variant].gap,\n paddingVertical: variantStylesMap[variant].paddingVertical,\n paddingHorizontal: variantStylesMap[variant].paddingHorizontal,\n backgroundColor: variantStylesMap[variant].backgroundColor,\n borderRadius: variantStylesMap[variant].borderRadius - 2,\n },\n icon: {\n color: statusColorMap[appearance].icon,\n fontSize: badgeFontSize,\n },\n iconRight: {\n color: statusColorMap[appearance].icon,\n fontSize: badgeFontSize - 2,\n },\n logo: {\n fontSize: badgeFontSize * fontScale,\n },\n label: {\n color: variantStylesMap[variant].textColor,\n fontWeight: variantStylesMap[variant].fontWeight,\n fontSize: badgeFontSize,\n flexShrink: 1,\n },\n metaLabel: {\n paddingHorizontal: variantStylesMap[variant].paddingHorizontal,\n fontSize: badgeFontSize,\n alignSelf: 'center',\n flexShrink: 1,\n paddingLeft: variantStylesMap[variant].metaLabelPaddingLeft,\n },\n })\n}\n\n// =================================\n// ====== Product Logos ============\n// =================================\n\ninterface ProductLogoProps {\n logoSize: number\n}\n\nfunction GroupsLogo({ logoSize }: ProductLogoProps) {\n return (\n <Svg width={logoSize} height={logoSize} viewBox=\"0 0 16 16\" fill=\"none\">\n <Path\n d=\"M9.06 6.14H6.94c-.152.36-.438.646-.797.798v2.12c.359.152.645.438.797.797h2.117c.152-.359.437-.645.796-.797V6.94a1.502 1.502 0 01-.793-.8zM8 0C1.6 0 0 1.595 0 8s1.6 8 8 8 8-1.595 8-8-1.595-8-8-8zm3.939 10.44a1.5 1.5 0 01-2.882.585H6.94a1.5 1.5 0 11-1.963-1.963v-2.12A1.501 1.501 0 116.94 4.98h2.12a1.5 1.5 0 111.963 1.968v2.11a1.501 1.501 0 01.916 1.383z\"\n fill=\"url(#paint0_linear_2632_26363)\"\n />\n <Defs>\n <LinearGradient\n id=\"paint0_linear_2632_26363\"\n x1={-5.6338}\n y1={5.6338}\n x2={5.6338}\n y2={16.9014}\n gradientUnits=\"userSpaceOnUse\"\n >\n <Stop stopColor=\"#FF962D\" />\n <Stop offset={1} stopColor=\"#FC7638\" />\n </LinearGradient>\n </Defs>\n </Svg>\n )\n}\n\nfunction ServicesIcon({ logoSize }: ProductLogoProps) {\n return (\n <Svg width={logoSize} height={logoSize} viewBox=\"0 0 16 16\" fill=\"none\">\n <Path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M.116 8c0-6.4 1.6-8 8-8s8 1.6 8 8-1.6 8-8 8-8-1.6-8-8zm4.123 3.464a.848.848 0 10.943-1.41.848.848 0 00-.943 1.41zm.001-2.76a.848.848 0 10.948-1.408.848.848 0 00-.948 1.407zm0-2.759a.849.849 0 10.948-1.408.849.849 0 00-.948 1.408zm8.1 5.34a.388.388 0 00.03-.149v-.755a.39.39 0 00-.39-.39H6.87a.39.39 0 00-.39.39v.755a.39.39 0 00.39.39h5.11a.39.39 0 00.36-.24zm0-2.758a.388.388 0 00.03-.149v-.757a.387.387 0 00-.39-.388H6.87a.388.388 0 00-.39.388v.757a.388.388 0 00.39.388h5.11a.388.388 0 00.36-.24zm0-2.76a.388.388 0 00.03-.148v-.754a.39.39 0 00-.39-.389H6.87a.39.39 0 00-.39.387v.756a.39.39 0 00.39.39h5.11a.389.389 0 00.36-.241z\"\n fill=\"url(#paint0_linear_2632_56586)\"\n />\n <Defs>\n <LinearGradient\n id=\"paint0_linear_2632_56586\"\n x1={-5.51759}\n y1={5.6338}\n x2={5.75001}\n y2={16.9014}\n gradientUnits=\"userSpaceOnUse\"\n >\n <Stop stopColor=\"#6BB23D\" />\n <Stop offset={1} stopColor=\"#659630\" />\n </LinearGradient>\n </Defs>\n </Svg>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/components/display/badge.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { JSX } from 'react'\nimport type { TextStyle, ViewProps, ViewStyle } from 'react-native'\nimport { Pressable, StyleSheet, View } from 'react-native'\nimport Svg, { Defs, LinearGradient, Path, Stop } from 'react-native-svg'\nimport { useFontScale, useTheme } from '../../hooks'\n// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts\nimport { useLayoutWidthProbe } from '../../hooks/use_conversation_layout_diagnostics'\nimport { platformFontWeightMedium } from '../../utils'\nimport { tokens } from '../../vendor/tapestry/tokens'\nimport { Icon, IconString } from './icon'\nimport { Text } from './text'\nimport { useStatusColorAppearanceMap, type StatusAppearanceUnion } from './utils/status_colors'\n\n// =================================\n// ====== Constants ================\n// =================================\n\ntype VariantUnion = 'default' | 'meta' | 'metaSubtle'\n\ntype VariantStyles = Record<\n VariantUnion,\n {\n backgroundColor: string\n paddingHorizontal: number\n paddingVertical: number\n borderWidth: number\n borderRadius: number\n textColor: string\n gap: number\n metaLabelPaddingLeft: number\n fontWeight: TextStyle['fontWeight']\n }\n>\n\ntype ProductLogoName = 'Groups' | 'Services' | 'groups' | 'services'\ntype ProductIconName = 'Chat' | 'chat'\ntype ProductLogoComponent = ({ logoSize }: { logoSize: number }) => JSX.Element\n\nconst PRODUCT_LOGO_COMPONENT_MAP: Record<ProductLogoName, ProductLogoComponent> = {\n Groups: GroupsLogo,\n groups: GroupsLogo,\n services: ServicesIcon,\n Services: ServicesIcon,\n}\n\n// =================================\n// ====== Component ================\n// =================================\n\nexport interface BadgeProps {\n /**\n * Renders the main text.\n */\n label: string\n /**\n * Renders secondary meta text to the right of the label.\n */\n metaLabel?: string\n /**\n * Changes the status color for the badge and icon.\n */\n appearance?: StatusAppearanceUnion\n /**\n * Changes form of the logo to support a meta label and badge\n */\n variant?: VariantUnion\n /**\n * Adds a product logo to the left of the text.\n */\n productLogoName?: ProductLogoName | ProductIconName\n /**\n * Shows an icon of the user choice to the left of the text.\n */\n iconName?: IconString\n /**\n * Shows an icon of the user choice to the right of the text.\n */\n iconNameRight?: IconString\n /**\n * Styles badge wrapper.\n */\n style?: ViewStyle\n /**\n * Specifies the maximum size a font can reach when allowFontScaling is enabled.\n */\n maxFontSizeMultiplier?: number\n /**\n * Callback function when the badge is pressed.\n */\n onPress?: () => void\n /**\n * Specifies the number of lines for the meta label before truncating.\n */\n numberOfLinesMetaLabel?: number\n}\n\nexport function Badge({\n appearance = 'neutral',\n metaLabel,\n style,\n iconName,\n iconNameRight,\n label,\n productLogoName,\n variant = 'default',\n maxFontSizeMultiplier,\n numberOfLinesMetaLabel = 1,\n onPress,\n}: BadgeProps) {\n const styles = useStyles({ appearance, maxFontSizeMultiplier, variant })\n const { showBadgeProductLogo } = useTheme()\n // CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts\n // Inset is metaLabel's remaining contentInset now that its left offset is\n // a margin, not padding - see the CHAT-476 candidate fix on this style.\n const onLabelLayout = useLayoutWidthProbe('badge.label', 0)\n const onMetaLabelLayout = useLayoutWidthProbe(\n 'badge.metaLabel',\n styles.metaLabel.paddingHorizontal * 2\n )\n\n const isMetaSubtle = variant === 'metaSubtle'\n const hasMetaLabel = Boolean(metaLabel)\n\n const showLogo = showBadgeProductLogo && productLogoName\n const isChatLogo = productLogoName?.toLowerCase() === 'chat'\n const ProductLogoSvg = showLogo && PRODUCT_LOGO_COMPONENT_MAP[productLogoName as ProductLogoName]\n const badgeLabel = isMetaSubtle && hasMetaLabel ? `${label}:` : label\n\n return (\n <BadgeWrapper style={[styles.badgeWrapper, style]} onPress={onPress} accessibilityRole=\"button\">\n <View style={styles.badge}>\n {showLogo && ProductLogoSvg && <ProductLogoSvg logoSize={styles.logo.fontSize} />}\n {showLogo && isChatLogo && <Icon name=\"general.textMessage\" style={styles.icon} />}\n {iconName && <Icon name={iconName} style={styles.icon} />}\n <Text\n variant=\"footnote\"\n style={styles.label}\n numberOfLines={1}\n maxFontSizeMultiplier={maxFontSizeMultiplier}\n onLayout={onLabelLayout}\n >\n {badgeLabel}\n </Text>\n {iconNameRight && <Icon name={iconNameRight} style={styles.iconRight} />}\n </View>\n {hasMetaLabel && (\n <Text\n variant=\"footnote\"\n style={styles.metaLabel}\n numberOfLines={numberOfLinesMetaLabel}\n maxFontSizeMultiplier={maxFontSizeMultiplier}\n onLayout={onMetaLabelLayout}\n >\n {metaLabel}\n </Text>\n )}\n </BadgeWrapper>\n )\n}\n\nconst BadgeWrapper = ({\n children,\n onPress,\n accessibilityRole,\n ...restProps\n}: ViewProps & Pick<BadgeProps, 'onPress'>) => {\n if (onPress) {\n return (\n <Pressable accessibilityRole={accessibilityRole} onPress={onPress} {...restProps}>\n {children}\n </Pressable>\n )\n }\n\n return <View {...restProps}>{children}</View>\n}\n\n// =================================\n// ====== Styles ===================\n// =================================\n\nconst useStyles = ({\n appearance = 'neutral',\n maxFontSizeMultiplier,\n variant = 'default',\n}: Partial<BadgeProps>) => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier })\n\n const statusColorMap = useStatusColorAppearanceMap()\n\n const badgeGap = 4 * fontScale\n const badgePaddingHorizontal = 8\n const badgePaddingVertical = 4\n const badgeFontSize = 12\n\n const variantStylesMap: VariantStyles = {\n default: {\n gap: badgeGap,\n backgroundColor: statusColorMap[appearance].background,\n metaLabelPaddingLeft: badgePaddingHorizontal,\n paddingHorizontal: badgePaddingHorizontal,\n paddingVertical: badgePaddingVertical,\n borderWidth: tokens.borderSizeDefault * fontScale,\n borderRadius: tokens.borderRadiusMd * fontScale,\n textColor: statusColorMap[appearance].text,\n fontWeight: 'normal',\n },\n meta: {\n gap: badgeGap,\n backgroundColor: statusColorMap[appearance].background,\n metaLabelPaddingLeft: badgePaddingHorizontal,\n paddingHorizontal: badgePaddingHorizontal,\n paddingVertical: badgePaddingVertical,\n borderWidth: tokens.borderSizeDefault * fontScale,\n borderRadius: tokens.borderRadiusMd * fontScale,\n textColor: statusColorMap[appearance].text,\n fontWeight: platformFontWeightMedium,\n },\n metaSubtle: {\n gap: badgeGap,\n backgroundColor: 'transparent',\n metaLabelPaddingLeft: badgeGap,\n paddingHorizontal: 0,\n paddingVertical: 0,\n borderWidth: 0,\n borderRadius: 0,\n textColor: colors.textColorDefaultSecondary,\n fontWeight: platformFontWeightMedium,\n },\n }\n\n return StyleSheet.create({\n badgeWrapper: {\n flexDirection: 'row',\n justifyContent: 'center',\n alignSelf: 'flex-start',\n borderRadius: variantStylesMap[variant].borderRadius,\n borderWidth: variantStylesMap[variant].borderWidth,\n borderColor: statusColorMap[appearance].background,\n },\n badge: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: variantStylesMap[variant].gap,\n paddingVertical: variantStylesMap[variant].paddingVertical,\n paddingHorizontal: variantStylesMap[variant].paddingHorizontal,\n backgroundColor: variantStylesMap[variant].backgroundColor,\n // metaSubtle's borderRadius is 0, so this would otherwise resolve to -2.\n // Neither platform clamps a negative radius; Android's BackgroundDrawable\n // reads it as \"no rounded borders\" and skips the rounded path entirely.\n borderRadius: Math.max(0, variantStylesMap[variant].borderRadius - 2),\n },\n icon: {\n color: statusColorMap[appearance].icon,\n fontSize: badgeFontSize,\n },\n iconRight: {\n color: statusColorMap[appearance].icon,\n fontSize: badgeFontSize - 2,\n },\n logo: {\n fontSize: badgeFontSize * fontScale,\n },\n label: {\n color: variantStylesMap[variant].textColor,\n fontWeight: variantStylesMap[variant].fontWeight,\n fontSize: badgeFontSize,\n flexShrink: 1,\n },\n metaLabel: {\n paddingHorizontal: variantStylesMap[variant].paddingHorizontal,\n fontSize: badgeFontSize,\n alignSelf: 'center',\n flexShrink: 1,\n // CHAT-476 candidate fix: margin (not padding) so this offset sits\n // outside contentInsets - a shrunk Text can never see it as part of\n // its own measured content width, so it can't go negative from this.\n marginLeft: variantStylesMap[variant].metaLabelPaddingLeft,\n },\n })\n}\n\n// =================================\n// ====== Product Logos ============\n// =================================\n\ninterface ProductLogoProps {\n logoSize: number\n}\n\nfunction GroupsLogo({ logoSize }: ProductLogoProps) {\n return (\n <Svg width={logoSize} height={logoSize} viewBox=\"0 0 16 16\" fill=\"none\">\n <Path\n d=\"M9.06 6.14H6.94c-.152.36-.438.646-.797.798v2.12c.359.152.645.438.797.797h2.117c.152-.359.437-.645.796-.797V6.94a1.502 1.502 0 01-.793-.8zM8 0C1.6 0 0 1.595 0 8s1.6 8 8 8 8-1.595 8-8-1.595-8-8-8zm3.939 10.44a1.5 1.5 0 01-2.882.585H6.94a1.5 1.5 0 11-1.963-1.963v-2.12A1.501 1.501 0 116.94 4.98h2.12a1.5 1.5 0 111.963 1.968v2.11a1.501 1.501 0 01.916 1.383z\"\n fill=\"url(#paint0_linear_2632_26363)\"\n />\n <Defs>\n <LinearGradient\n id=\"paint0_linear_2632_26363\"\n x1={-5.6338}\n y1={5.6338}\n x2={5.6338}\n y2={16.9014}\n gradientUnits=\"userSpaceOnUse\"\n >\n <Stop stopColor=\"#FF962D\" />\n <Stop offset={1} stopColor=\"#FC7638\" />\n </LinearGradient>\n </Defs>\n </Svg>\n )\n}\n\nfunction ServicesIcon({ logoSize }: ProductLogoProps) {\n return (\n <Svg width={logoSize} height={logoSize} viewBox=\"0 0 16 16\" fill=\"none\">\n <Path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M.116 8c0-6.4 1.6-8 8-8s8 1.6 8 8-1.6 8-8 8-8-1.6-8-8zm4.123 3.464a.848.848 0 10.943-1.41.848.848 0 00-.943 1.41zm.001-2.76a.848.848 0 10.948-1.408.848.848 0 00-.948 1.407zm0-2.759a.849.849 0 10.948-1.408.849.849 0 00-.948 1.408zm8.1 5.34a.388.388 0 00.03-.149v-.755a.39.39 0 00-.39-.39H6.87a.39.39 0 00-.39.39v.755a.39.39 0 00.39.39h5.11a.39.39 0 00.36-.24zm0-2.758a.388.388 0 00.03-.149v-.757a.387.387 0 00-.39-.388H6.87a.388.388 0 00-.39.388v.757a.388.388 0 00.39.388h5.11a.388.388 0 00.36-.24zm0-2.76a.388.388 0 00.03-.148v-.754a.39.39 0 00-.39-.389H6.87a.39.39 0 00-.39.387v.756a.39.39 0 00.39.39h5.11a.389.389 0 00.36-.241z\"\n fill=\"url(#paint0_linear_2632_56586)\"\n />\n <Defs>\n <LinearGradient\n id=\"paint0_linear_2632_56586\"\n x1={-5.51759}\n y1={5.6338}\n x2={5.75001}\n y2={16.9014}\n gradientUnits=\"userSpaceOnUse\"\n >\n <Stop stopColor=\"#6BB23D\" />\n <Stop offset={1} stopColor=\"#659630\" />\n </LinearGradient>\n </Defs>\n </Svg>\n )\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LayoutChangeEvent } from 'react-native';
|
|
2
|
+
export declare const __resetLayoutDiagnosticsForTests: () => void;
|
|
3
|
+
/**
|
|
4
|
+
* Attaches to a suspect Text/TextInput/View's onLayout and reports through
|
|
5
|
+
* Log.reportError the first time its resolved width drops to at or below
|
|
6
|
+
* its own horizontal inset (padding/border) — the shape that Android's
|
|
7
|
+
* unclamped text-measure path can turn into a negative width. Returns
|
|
8
|
+
* undefined on non-Android platforms so it's a no-op there.
|
|
9
|
+
*/
|
|
10
|
+
export declare const useLayoutWidthProbe: (label: string, inset?: number) => ((event: LayoutChangeEvent) => void) | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Mount once per conversation screen. Periodically flushes every probed
|
|
13
|
+
* label's latest known width as a single breadcrumb, so there's a timeline
|
|
14
|
+
* leading up to the crash even if no individual probe crosses the
|
|
15
|
+
* suspicious threshold. Capped at MAX_BREADCRUMB_FLUSHES per mount.
|
|
16
|
+
*/
|
|
17
|
+
export declare const useConversationLayoutDiagnostics: ({ conversationId, replyRootId, }: {
|
|
18
|
+
conversationId: number;
|
|
19
|
+
replyRootId?: string | null;
|
|
20
|
+
}) => void;
|
|
21
|
+
//# sourceMappingURL=use_conversation_layout_diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use_conversation_layout_diagnostics.d.ts","sourceRoot":"","sources":["../../src/hooks/use_conversation_layout_diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA6C,MAAM,cAAc,CAAA;AAsB3F,eAAO,MAAM,gCAAgC,YAG5C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,EAAE,cAAS,cAIhD,iBAAiB,sBAiC5B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAAI,kCAG9C;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,SAoCA,CAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { PixelRatio, Platform, useWindowDimensions } from 'react-native';
|
|
3
|
+
import { Log } from '../utils';
|
|
4
|
+
const BREADCRUMB_INTERVAL_MS = 500;
|
|
5
|
+
const MAX_BREADCRUMB_FLUSHES = 6;
|
|
6
|
+
const SUSPICIOUS_MARGIN = 1;
|
|
7
|
+
// Temporary instrumentation for CHAT-476 (Android-only `Layout: -2 < 0`
|
|
8
|
+
// conversation crash). Android's text layout hard-throws when a Text or
|
|
9
|
+
// TextInput resolves to a non-positive content width; this attaches to
|
|
10
|
+
// onLayout on suspect nodes and reports their resolved width through the
|
|
11
|
+
// host error reporter, so a QA repro surfaces which node it is before the
|
|
12
|
+
// native crash tears down the surface. Remove once CHAT-476 is resolved —
|
|
13
|
+
// this hook and every call site are tagged CHAT-476 for that reason.
|
|
14
|
+
const samplesByLabel = new Map();
|
|
15
|
+
const reportedSuspiciousLabels = new Set();
|
|
16
|
+
// Test-only: the maps above are module-scope so useConversationLayoutDiagnostics
|
|
17
|
+
// can flush every probe's latest sample in one breadcrumb. Reset between tests.
|
|
18
|
+
export const __resetLayoutDiagnosticsForTests = () => {
|
|
19
|
+
samplesByLabel.clear();
|
|
20
|
+
reportedSuspiciousLabels.clear();
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Attaches to a suspect Text/TextInput/View's onLayout and reports through
|
|
24
|
+
* Log.reportError the first time its resolved width drops to at or below
|
|
25
|
+
* its own horizontal inset (padding/border) — the shape that Android's
|
|
26
|
+
* unclamped text-measure path can turn into a negative width. Returns
|
|
27
|
+
* undefined on non-Android platforms so it's a no-op there.
|
|
28
|
+
*/
|
|
29
|
+
export const useLayoutWidthProbe = (label, inset = 0) => {
|
|
30
|
+
const mountedAtRef = useRef(Date.now());
|
|
31
|
+
const handleLayout = useCallback((event) => {
|
|
32
|
+
const { width, height, x } = event.nativeEvent.layout;
|
|
33
|
+
const previous = samplesByLabel.get(label);
|
|
34
|
+
if (previous && previous.width === width && previous.height === height && previous.x === x) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
samplesByLabel.set(label, { width, height, x });
|
|
38
|
+
const isSuspicious = width <= inset + SUSPICIOUS_MARGIN;
|
|
39
|
+
if (!isSuspicious || reportedSuspiciousLabels.has(label))
|
|
40
|
+
return;
|
|
41
|
+
reportedSuspiciousLabels.add(label);
|
|
42
|
+
Log.reportError(new Error(`CHAT-476: ${label} measured at or below its horizontal inset`), {
|
|
43
|
+
scope: 'component',
|
|
44
|
+
tags: { team: 'chat', chat476: 'near-zero-width' },
|
|
45
|
+
extra: {
|
|
46
|
+
label,
|
|
47
|
+
width,
|
|
48
|
+
height,
|
|
49
|
+
x,
|
|
50
|
+
inset,
|
|
51
|
+
msSinceMount: Date.now() - mountedAtRef.current,
|
|
52
|
+
pixelRatio: PixelRatio.get(),
|
|
53
|
+
fontScale: PixelRatio.getFontScale(),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}, [label, inset]);
|
|
57
|
+
if (Platform.OS !== 'android')
|
|
58
|
+
return undefined;
|
|
59
|
+
return handleLayout;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Mount once per conversation screen. Periodically flushes every probed
|
|
63
|
+
* label's latest known width as a single breadcrumb, so there's a timeline
|
|
64
|
+
* leading up to the crash even if no individual probe crosses the
|
|
65
|
+
* suspicious threshold. Capped at MAX_BREADCRUMB_FLUSHES per mount.
|
|
66
|
+
*/
|
|
67
|
+
export const useConversationLayoutDiagnostics = ({ conversationId, replyRootId, }) => {
|
|
68
|
+
const { width: windowWidth } = useWindowDimensions();
|
|
69
|
+
const mountedAtRef = useRef(Date.now());
|
|
70
|
+
const flushCountRef = useRef(0);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (Platform.OS !== 'android')
|
|
73
|
+
return;
|
|
74
|
+
samplesByLabel.clear();
|
|
75
|
+
reportedSuspiciousLabels.clear();
|
|
76
|
+
mountedAtRef.current = Date.now();
|
|
77
|
+
flushCountRef.current = 0;
|
|
78
|
+
const interval = setInterval(() => {
|
|
79
|
+
if (flushCountRef.current >= MAX_BREADCRUMB_FLUSHES || samplesByLabel.size === 0)
|
|
80
|
+
return;
|
|
81
|
+
flushCountRef.current += 1;
|
|
82
|
+
Log.reportError(new Error('CHAT-476: layout breadcrumb'), {
|
|
83
|
+
scope: 'component',
|
|
84
|
+
tags: { team: 'chat', chat476: 'breadcrumb' },
|
|
85
|
+
extra: {
|
|
86
|
+
conversationId,
|
|
87
|
+
replyRootId,
|
|
88
|
+
msSinceMount: Date.now() - mountedAtRef.current,
|
|
89
|
+
windowWidth,
|
|
90
|
+
pixelRatio: PixelRatio.get(),
|
|
91
|
+
fontScale: PixelRatio.getFontScale(),
|
|
92
|
+
samples: [...samplesByLabel.entries()].map(([label, { width, height, x }]) => `${label}|w=${width}|h=${height}|x=${x}`),
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}, BREADCRUMB_INTERVAL_MS);
|
|
96
|
+
return () => clearInterval(interval);
|
|
97
|
+
}, [conversationId, replyRootId, windowWidth]);
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=use_conversation_layout_diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use_conversation_layout_diagnostics.js","sourceRoot":"","sources":["../../src/hooks/use_conversation_layout_diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef } from 'react'\nimport { LayoutChangeEvent, PixelRatio, Platform, useWindowDimensions } from 'react-native'\nimport { Log } from '../utils'\n\nconst BREADCRUMB_INTERVAL_MS = 500\nconst MAX_BREADCRUMB_FLUSHES = 6\nconst SUSPICIOUS_MARGIN = 1\n\ntype LayoutSample = { width: number; height: number; x: number }\n\n// Temporary instrumentation for CHAT-476 (Android-only `Layout: -2 < 0`\n// conversation crash). Android's text layout hard-throws when a Text or\n// TextInput resolves to a non-positive content width; this attaches to\n// onLayout on suspect nodes and reports their resolved width through the\n// host error reporter, so a QA repro surfaces which node it is before the\n// native crash tears down the surface. Remove once CHAT-476 is resolved —\n// this hook and every call site are tagged CHAT-476 for that reason.\n\nconst samplesByLabel = new Map<string, LayoutSample>()\nconst reportedSuspiciousLabels = new Set<string>()\n\n// Test-only: the maps above are module-scope so useConversationLayoutDiagnostics\n// can flush every probe's latest sample in one breadcrumb. Reset between tests.\nexport const __resetLayoutDiagnosticsForTests = () => {\n samplesByLabel.clear()\n reportedSuspiciousLabels.clear()\n}\n\n/**\n * Attaches to a suspect Text/TextInput/View's onLayout and reports through\n * Log.reportError the first time its resolved width drops to at or below\n * its own horizontal inset (padding/border) — the shape that Android's\n * unclamped text-measure path can turn into a negative width. Returns\n * undefined on non-Android platforms so it's a no-op there.\n */\nexport const useLayoutWidthProbe = (label: string, inset = 0) => {\n const mountedAtRef = useRef(Date.now())\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const { width, height, x } = event.nativeEvent.layout\n const previous = samplesByLabel.get(label)\n if (previous && previous.width === width && previous.height === height && previous.x === x) {\n return\n }\n samplesByLabel.set(label, { width, height, x })\n\n const isSuspicious = width <= inset + SUSPICIOUS_MARGIN\n if (!isSuspicious || reportedSuspiciousLabels.has(label)) return\n\n reportedSuspiciousLabels.add(label)\n Log.reportError(new Error(`CHAT-476: ${label} measured at or below its horizontal inset`), {\n scope: 'component',\n tags: { team: 'chat', chat476: 'near-zero-width' },\n extra: {\n label,\n width,\n height,\n x,\n inset,\n msSinceMount: Date.now() - mountedAtRef.current,\n pixelRatio: PixelRatio.get(),\n fontScale: PixelRatio.getFontScale(),\n },\n })\n },\n [label, inset]\n )\n\n if (Platform.OS !== 'android') return undefined\n\n return handleLayout\n}\n\n/**\n * Mount once per conversation screen. Periodically flushes every probed\n * label's latest known width as a single breadcrumb, so there's a timeline\n * leading up to the crash even if no individual probe crosses the\n * suspicious threshold. Capped at MAX_BREADCRUMB_FLUSHES per mount.\n */\nexport const useConversationLayoutDiagnostics = ({\n conversationId,\n replyRootId,\n}: {\n conversationId: number\n replyRootId?: string | null\n}) => {\n const { width: windowWidth } = useWindowDimensions()\n const mountedAtRef = useRef(Date.now())\n const flushCountRef = useRef(0)\n\n useEffect(() => {\n if (Platform.OS !== 'android') return\n\n samplesByLabel.clear()\n reportedSuspiciousLabels.clear()\n mountedAtRef.current = Date.now()\n flushCountRef.current = 0\n\n const interval = setInterval(() => {\n if (flushCountRef.current >= MAX_BREADCRUMB_FLUSHES || samplesByLabel.size === 0) return\n\n flushCountRef.current += 1\n Log.reportError(new Error('CHAT-476: layout breadcrumb'), {\n scope: 'component',\n tags: { team: 'chat', chat476: 'breadcrumb' },\n extra: {\n conversationId,\n replyRootId,\n msSinceMount: Date.now() - mountedAtRef.current,\n windowWidth,\n pixelRatio: PixelRatio.get(),\n fontScale: PixelRatio.getFontScale(),\n samples: [...samplesByLabel.entries()].map(\n ([label, { width, height, x }]) => `${label}|w=${width}|h=${height}|x=${x}`\n ),\n },\n })\n }, BREADCRUMB_INTERVAL_MS)\n\n return () => clearInterval(interval)\n }, [conversationId, replyRootId, windowWidth])\n}\n"]}
|
|
@@ -9,6 +9,7 @@ export declare const useConversationMessages: ({ conversation_id, reply_root_id
|
|
|
9
9
|
isRefetching: boolean;
|
|
10
10
|
fetchNextPage: (options?: import("@tanstack/query-core").FetchNextPageOptions) => Promise<import("@tanstack/query-core").InfiniteQueryObserverResult<import("@tanstack/query-core").InfiniteData<import("..").ApiCollection<MessageResource>, unknown>, Response>>;
|
|
11
11
|
hasNextPage: boolean;
|
|
12
|
+
isFetchingNextPage: boolean;
|
|
12
13
|
queryKey: import("./use_suspense_api").RequestQueryKey;
|
|
13
14
|
};
|
|
14
15
|
//# sourceMappingURL=use_conversation_messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_conversation_messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,EAAE,wBAAwB,EAAwB,MAAM,oBAAoB,CAAA;AAEnF,eAAO,MAAM,uBAAuB,GAClC,oCAAoC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC9F,OAAO,wBAAwB
|
|
1
|
+
{"version":3,"file":"use_conversation_messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,EAAE,wBAAwB,EAAwB,MAAM,oBAAoB,CAAA;AAEnF,eAAO,MAAM,uBAAuB,GAClC,oCAAoC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC9F,OAAO,wBAAwB;;;;;;;;CA6BhC,CAAA"}
|
|
@@ -2,12 +2,20 @@ import { useMemo } from 'react';
|
|
|
2
2
|
import { getMessagesQueryKey, getMessagesRequestArgs } from '../utils/request/get_messages';
|
|
3
3
|
import { useSuspensePaginator } from './use_suspense_api';
|
|
4
4
|
export const useConversationMessages = ({ conversation_id, reply_root_id }, opts) => {
|
|
5
|
-
const { data, refetch, isRefetching, fetchNextPage, hasNextPage } = useSuspensePaginator(getMessagesRequestArgs({ conversation_id, reply_root_id }), opts);
|
|
5
|
+
const { data, refetch, isRefetching, fetchNextPage, hasNextPage, isFetchingNextPage } = useSuspensePaginator(getMessagesRequestArgs({ conversation_id, reply_root_id }), opts);
|
|
6
6
|
const queryKey = getMessagesQueryKey({ conversation_id, reply_root_id });
|
|
7
7
|
const messages = useMemo(() => data
|
|
8
8
|
.filter(message => (!message.deletedAt || message.replyRootId) &&
|
|
9
9
|
(message.attachments?.length || message.text?.length))
|
|
10
10
|
.sort((a, b) => -a.id.localeCompare(b.id)), [data]);
|
|
11
|
-
return {
|
|
11
|
+
return {
|
|
12
|
+
messages,
|
|
13
|
+
refetch,
|
|
14
|
+
isRefetching,
|
|
15
|
+
fetchNextPage,
|
|
16
|
+
hasNextPage,
|
|
17
|
+
isFetchingNextPage,
|
|
18
|
+
queryKey,
|
|
19
|
+
};
|
|
12
20
|
};
|
|
13
21
|
//# sourceMappingURL=use_conversation_messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_conversation_messages.js","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAA4B,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,EAAE,eAAe,EAAE,aAAa,EAA8D,EAC9F,IAA+B,EAC/B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"use_conversation_messages.js","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAA4B,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,EAAE,eAAe,EAAE,aAAa,EAA8D,EAC9F,IAA+B,EAC/B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,GACnF,oBAAoB,CAClB,sBAAsB,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,EAC1D,IAAI,CACL,CAAA;IACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CACH,IAAI;SACD,MAAM,CACL,OAAO,CAAC,EAAE,CACR,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;QAC3C,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CACxD;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9C,CAAC,IAAI,CAAC,CACP,CAAA;IAED,OAAO;QACL,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,aAAa;QACb,WAAW;QACX,kBAAkB;QAClB,QAAQ;KACT,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { useMemo } from 'react'\nimport { MessageResource } from '../types'\nimport { getMessagesQueryKey, getMessagesRequestArgs } from '../utils/request/get_messages'\nimport { SuspensePaginatorOptions, useSuspensePaginator } from './use_suspense_api'\n\nexport const useConversationMessages = (\n { conversation_id, reply_root_id }: { conversation_id: number; reply_root_id?: string | null },\n opts?: SuspensePaginatorOptions\n) => {\n const { data, refetch, isRefetching, fetchNextPage, hasNextPage, isFetchingNextPage } =\n useSuspensePaginator<MessageResource>(\n getMessagesRequestArgs({ conversation_id, reply_root_id }),\n opts\n )\n const queryKey = getMessagesQueryKey({ conversation_id, reply_root_id })\n const messages = useMemo(\n () =>\n data\n .filter(\n message =>\n (!message.deletedAt || message.replyRootId) &&\n (message.attachments?.length || message.text?.length)\n )\n .sort((a, b) => -a.id.localeCompare(b.id)),\n [data]\n )\n\n return {\n messages,\n refetch,\n isRefetching,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n queryKey,\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAGL,4BAA4B,EAC7B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAShE,OAAO,EACL,uBAAuB,EAExB,MAAM,yDAAyD,CAAA;AAChE,OAAO,EACL,kBAAkB,EAGnB,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,eAAe,EAA0B,MAAM,8BAA8B,CAAA;AACtF,OAAO,EACL,yBAAyB,EAE1B,MAAM,sDAAsD,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAWlF,OAAO,EACL,yCAAyC,EAE1C,MAAM,0DAA0D,CAAA;AACjE,OAAO,EAEL,kBAAkB,EAEnB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EAAE,+CAA+C,EAAE,MAAM,gGAAgG,CAAA;AAIhK,OAAO,EACL,4BAA4B,EAE7B,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAA;AAEnF,OAAO,EACL,kCAAkC,EAEnC,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,+CAA+C,CAAA;AAC/F,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAA8B,MAAM,kCAAkC,CAAA;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAA;AACvF,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAA;AACrF,OAAO,EAAE,eAAe,EAA0B,MAAM,8BAA8B,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EACL,yBAAyB,EAE1B,MAAM,yCAAyC,CAAA;AAGhD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAO/D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;kCALA,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoF3D,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;kCAtFW,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAA5B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAGL,4BAA4B,EAC7B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAShE,OAAO,EACL,uBAAuB,EAExB,MAAM,yDAAyD,CAAA;AAChE,OAAO,EACL,kBAAkB,EAGnB,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,eAAe,EAA0B,MAAM,8BAA8B,CAAA;AACtF,OAAO,EACL,yBAAyB,EAE1B,MAAM,sDAAsD,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAWlF,OAAO,EACL,yCAAyC,EAE1C,MAAM,0DAA0D,CAAA;AACjE,OAAO,EAEL,kBAAkB,EAEnB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EAAE,+CAA+C,EAAE,MAAM,gGAAgG,CAAA;AAIhK,OAAO,EACL,4BAA4B,EAE7B,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAA;AAEnF,OAAO,EACL,kCAAkC,EAEnC,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,+CAA+C,CAAA;AAC/F,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAA8B,MAAM,kCAAkC,CAAA;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAA;AACvF,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAA;AACrF,OAAO,EAAE,eAAe,EAA0B,MAAM,8BAA8B,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EACL,yBAAyB,EAE1B,MAAM,yCAAyC,CAAA;AAGhD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAO/D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;kCALA,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoF3D,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;kCAtFW,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAA5B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6S3D,CAAA;AAEF,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,SAAS,CAAC,CAAA;AAE3D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,eAAe,CAAC;QACxB,UAAU,aAAc,SAAQ,kBAAkB;SAAG;KACtD;CACF"}
|
|
@@ -105,9 +105,8 @@ export const ChatStack = createNativeStackNavigator({
|
|
|
105
105
|
screen: ConversationsScreen,
|
|
106
106
|
options: ({ route, navigation }) => composeOptions({
|
|
107
107
|
headerTitle: route.params?.title ?? 'Chat',
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
})),
|
|
108
|
+
headerBackVisible: false,
|
|
109
|
+
}, withRightClose({ onPress: navigation.goBack })),
|
|
111
110
|
},
|
|
112
111
|
ConversationFilters: {
|
|
113
112
|
screen: ConversationFiltersScreen,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,0BAA0B,GAG3B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,qDAAqD,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,EACL,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,yDAAyD,CAAA;AAChE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACtF,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,sDAAsD,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAClF,OAAO,EACL,0CAA0C,EAC1C,kCAAkC,GACnC,MAAM,iFAAiF,CAAA;AAExF,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAA;AAC3F,OAAO,EACL,yCAAyC,EACzC,gDAAgD,GACjD,MAAM,0DAA0D,CAAA;AACjE,OAAO,EAEL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yEAAyE,CAAA;AACpH,OAAO,EAAE,+CAA+C,EAAE,MAAM,gGAAgG,CAAA;AAChK,OAAO,EAAE,uCAAuC,EAAE,MAAM,uFAAuF,CAAA;AAC/I,OAAO,EAAE,4CAA4C,EAAE,MAAM,8FAA8F,CAAA;AAE3J,OAAO,EACL,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EACL,kCAAkC,EAClC,yCAAyC,GAC1C,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,+CAA+C,CAAA;AAC/F,OAAO,EACL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAA;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAA;AACvF,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACrF,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAE/D,MAAM,mBAAmB,GAAuC,GAAG,EAAE,CAAC,CAAC;IACrE,2BAA2B,EAAE,SAAS;IACtC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAClE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;IAC7D,gBAAgB,EAAE,sBAAsB;IACxC,aAAa,EAAE,mBAAmB;IAClC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE;QACP,oBAAoB,EAAE;YACpB,MAAM,EAAE,0BAA0B;YAClC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;gBACzB,iBAAiB,EAAE,KAAK;aACzB,EACD,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAC/C;SACJ;QACD,iCAAiC,EAAE;YACjC,MAAM,EAAE,uCAAuC;YAC/C,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;aAC1B,EACD,cAAc,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;aAC/D,CAAC,CACH;SACJ;QACD,sCAAsC,EAAE;YACtC,MAAM,EAAE,4CAA4C;YACpD,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;aAC1B,EACD,cAAc,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;aAC/D,CAAC,CACH;SACJ;QACD,yCAAyC,EAAE;YACzC,MAAM,EAAE,+CAA+C;YACvD,EAAE,EAAE,yBAAyB;YAC7B,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;aAC1B,EACD,cAAc,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;aAC/D,CAAC,CACH;SACJ;QACD,4BAA4B,EAAE;YAC5B,MAAM,EAAE,kCAAkC;YAC1C,OAAO,EAAE,0CAA0C;SACpD;QACD,eAAe,EAAE;YACf,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;gBACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACvB,EACD,cAAc,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAClD,KAAK,CAAC,MAA4C,CAAA;oBACpD,UAAU,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC,CAAA;gBACnF,CAAC;aACF,CAAC,CACH;SACJ;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,+BAA+B;SACzC;KACF;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,0BAA0B,CAAC;IAClD,aAAa,EAAE,mBAAmB;IAClC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE;QACP,aAAa,EAAE;YACb,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,WAAW,EAAG,KAAK,CAAC,MAA6B,EAAE,KAAK,IAAI,MAAM;aACnE,EACD,eAAe,CAAC;gBACd,OAAO,EAAE,UAAU,CAAC,MAAM;aAC3B,CAAC,CACH;SACJ;QACD,mBAAmB,EAAE;YACnB,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,gCAAgC;SAC1C;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ;gBACE,WAAW,EAAE,CAAC,KAAkC,EAAE,EAAE;oBAClD,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GACrD,KAAK,CAAC,MAAgC,CAAA;oBAExC,OAAO,CACL,KAAC,uBAAuB,IACtB,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,KACR,KAAK,YAER,KAAK,IAAI,cAAc,GACA,CAC3B,CAAA;gBACH,CAAC;aACF,EACD,eAAe,CAAC;gBACd,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,MAAM,GAAG,KAAK,CAAC,MAAgC,CAAA;oBACrD,IAAK,MAAoC,EAAE,mBAAmB,EAAE,CAAC;wBAC/D,oFAAoF;wBACpF,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAA;wBACtC,UAAU,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAA;oBAC5D,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,MAAM,EAAE,CAAA;oBACrB,CAAC;gBACH,CAAC;aACF,CAAC,EACF,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CACpE;SACJ;QACD,iBAAiB,EAAE;YACjB,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CACjC,cAAc,CACZ,EAAE,KAAK,EAAG,KAAK,CAAC,MAAiC,EAAE,KAAK,IAAI,OAAO,EAAE,EACrE,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAChD;SACJ;QACD,gBAAgB,EAAE;YAChB,MAAM,EAAE,sBAAsB;YAC9B,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE;gBACP,KAAK,EAAE,yBAAyB;gBAChC,SAAS,EAAE,MAAM;gBACjB,qBAAqB,EAAE,sBAAsB,CAAC,cAAc;aAC7D;SACF;QACD,mBAAmB,EAAE;YACnB,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CACZ;gBACE,YAAY,EAAE,OAAO;gBACrB,KAAK,EAAE,sBAAsB;aAC9B,EACD,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAC9C;SACJ;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,yBAAyB;SACnC;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;SAC9F;QACD,oBAAoB,EAAE;YACpB,MAAM,EAAE,0BAA0B;YAClC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,KAAK,CAAC;gBAC/B,CAAC,CAAC,cAAc,CACZ,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAC/B,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAC/C;gBACH,CAAC,CAAC,cAAc,CACZ,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAC/B,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAChD;SACR;QACD,qBAAqB,EAAE;YACrB,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;SAC9F;QACD,yBAAyB,EAAE;YACzB,MAAM,EAAE,+BAA+B;YACvC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;gBACjC,MAAM,KAAK,GAAI,KAAK,CAAC,MAA6B,EAAE,KAAK,IAAI,gBAAgB,CAAA;gBAE7E,oEAAoE;gBACpE,qEAAqE;gBACrE,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,KAAK,CAAC;oBACtC,CAAC,CAAC,cAAc,CACZ;wBACE,KAAK;qBACN,EACD,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAC/C;oBACH,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAChF,CAAC;SACF;QACD,4BAA4B,EAAE;YAC5B,MAAM,EAAE,kCAAkC;YAC1C,OAAO,EAAE,yCAAyC;SACnD;QACD,mCAAmC,EAAE;YACnC,MAAM,EAAE,yCAAyC;YACjD,OAAO,EAAE,gDAAgD;SAC1D;QACD,GAAG,EAAE;YACH,MAAM,EAAE,oBAAoB;YAC5B,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE;gBACP,WAAW,EAAE,KAAK;gBAClB,YAAY,EAAE,OAAO;aACtB;SACF;QACD,oBAAoB,EAAE;YACpB,MAAM,EAAE,qBAAqB;YAC7B,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CACZ;gBACE,KAAK,EAAE,kBAAkB;gBACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACvB,EACD,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CACpE;SACJ;QACD,SAAS,EAAE;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,sBAAsB;SAChC;QACD,cAAc,EAAE;YACd,MAAM,EAAE,oBAAoB;YAC5B,gEAAgE;YAChE,OAAO,EAAE,2BAA2B;SACrC;QACD,aAAa,EAAE;YACb,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,0BAA0B;SACpC;QACD,iBAAiB,EAAE;YACjB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,8BAA8B;SACxC;QACD,sBAAsB,EAAE;YACtB,MAAM,EAAE,4BAA4B;YACpC,OAAO,EAAE,mCAAmC;SAC7C;QACD,SAAS,EAAE;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,sBAAsB;SAChC;QACD,mBAAmB,EAAE;YACnB,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,gCAAgC;SAC1C;QACD,mBAAmB,EAAE;YACnB,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,gCAAgC;SAC1C;QACD,SAAS,EAAE;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,sBAAsB;SAChC;QACD,OAAO,EAAE;YACP,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,cAAc,CACZ;gBACE,WAAW,EAAE,UAAU;gBACvB,iBAAiB,EAAE,KAAK;gBACxB,YAAY,EAAE,OAAO;aACtB,EACD,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAC/C;SACJ;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,KAAK,EAAE,KAAK;aACb;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,GAAG;aACV;SACF;KACF;CACF,CAAC,CAAA","sourcesContent":["import { StaticParamList } from '@react-navigation/native'\nimport {\n createNativeStackNavigator,\n NativeStackHeaderRightProps,\n NativeStackNavigationOptions,\n} from '@react-navigation/native-stack'\nimport { CardStyleInterpolators } from '@react-navigation/stack'\nimport React from 'react'\nimport {\n composeOptions,\n withMinimalBack,\n withRightClose,\n withRightDone,\n} from '../components/display/platform_modal_header_buttons'\nimport { useDirectMessagesEligible, useQualifiedByAge } from '../hooks'\nimport {\n AttachmentActionsScreen,\n AttachmentActionsScreenOptions,\n} from '../screens/attachment_actions/attachment_actions_screen'\nimport {\n AvatarPickerScreen,\n AvatarPickerScreenOptions,\n AvatarPickerCreateScreenOptions,\n} from '../screens/avatar_picker/avatar_picker_screen'\nimport { BugReportScreen, BugReportScreenOptions } from '../screens/bug_report_screen'\nimport {\n MessageReadReceiptsScreen,\n MessageReadReceiptsScreenOptions,\n} from '../screens/conversation/message_read_receipts_screen'\nimport { ConversationDetailsScreen } from '../screens/conversation_details_screen'\nimport {\n ConversationFilterReceipientsScreenOptions,\n ConversationFilterRecipientsScreen,\n} from '../screens/conversation_filter_recipients/conversation_filter_recipients_screen'\nimport { ConversationFiltersParams } from '../screens/conversation_filters/screen_props'\nimport {\n ConversationFiltersScreen,\n ConversationFiltersScreenOptions,\n} from '../screens/conversation_filters_screen'\nimport { ConversationNewScreen } from '../screens/conversation_new/conversation_new_screen'\nimport {\n ConversationNotificationLevelSelectScreen,\n ConversationNotificationLevelSelectScreenOptions,\n} from '../screens/conversation_notification_level_select_screen'\nimport {\n ConversationRouteProps,\n ConversationScreen,\n ConversationScreenTitle,\n} from '../screens/conversation_screen'\nimport { ConversationNewEntryScreen } from '../screens/conversation_select_recipients/conversation_new_entry_screen'\nimport { ConversationSelectDirectMessageRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen'\nimport { ConversationSelectGroupRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_group_recipients_screen'\nimport { ConversationSelectTeamsILeadRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen'\nimport { ConversationSelectRecipientsParams } from '../screens/conversation_select_recipients/types/screen_props'\nimport {\n ConversationSelectTypeScreen,\n ConversationSelectTypeScreenOptions,\n} from '../screens/conversation_select_type_screen'\nimport { ConversationsScreen } from '../screens/conversations/conversations_screen'\nimport { GetHelpScreen } from '../screens/get_help_screen'\nimport {\n GroupNotificationLevelSelectScreen,\n GroupNotificationLevelSelectScreenOptions,\n} from '../screens/group_notification_level_select_screen'\nimport { GroupNotificationSettingsScreen } from '../screens/group_notification_settings_screen'\nimport {\n MessageActionsScreen,\n MessageActionsScreenOptions,\n} from '../screens/message_actions_screen'\nimport { MessageReportScreen, MessageReportScreenOptions } from '../screens/message_report_screen'\nimport { NotFound } from '../screens/not_found'\nimport { NotificationSettingsScreen } from '../screens/notification_settings_screen'\nimport { PreferredAppSelectionScreen } from '../screens/preferred_app_selection_screen'\nimport { ReactionsScreen, ReactionsScreenOptions } from '../screens/reactions_screen'\nimport { SendGiphyScreen, SendGiphyScreenOptions } from '../screens/send_giphy_screen'\nimport { SettingsScreen } from '../screens/settings_screen'\nimport {\n SystemMessagePeopleScreen,\n SystemMessagePeopleScreenOptions,\n} from '../screens/system_message_people_screen'\nimport { TeamConversationScreen } from '../screens/team_conversation_screen'\nimport { isLiquidGlassEnabled } from '../utils/liquid_glass'\nimport { ScreenLayoutWithChatAccessGate } from './screenLayout'\n\nconst globalScreenOptions: () => NativeStackNavigationOptions = () => ({\n headerBackButtonDisplayMode: 'minimal',\n ...(isLiquidGlassEnabled() ? { headerShadowVisible: false } : {}),\n})\n\nexport const NewConversationStack = createNativeStackNavigator({\n initialRouteName: 'ConversationNewEntry',\n screenOptions: globalScreenOptions,\n screenLayout: ScreenLayoutWithChatAccessGate,\n screens: {\n ConversationNewEntry: {\n screen: ConversationNewEntryScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerBackVisible: false,\n },\n withRightClose({ onPress: navigation.goBack })\n ),\n },\n ConversationSelectGroupRecipients: {\n screen: ConversationSelectGroupRecipientsScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationSelectTeamsILeadRecipients: {\n screen: ConversationSelectTeamsILeadRecipientsScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationSelectDirectMessageRecipients: {\n screen: ConversationSelectDirectMessageRecipientsScreen,\n if: useDirectMessagesEligible,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationFilterRecipients: {\n screen: ConversationFilterRecipientsScreen,\n options: ConversationFilterReceipientsScreenOptions,\n },\n ConversationNew: {\n screen: ConversationNewScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerLeft: () => null,\n },\n withRightClose({\n onPress: () => {\n const { chat_group_graph_id, group_source_app_name } =\n route.params as ConversationSelectRecipientsParams\n navigation.popTo('Conversations', { chat_group_graph_id, group_source_app_name })\n },\n })\n ),\n },\n AvatarPicker: {\n screen: AvatarPickerScreen,\n options: AvatarPickerCreateScreenOptions,\n },\n },\n})\n\nexport const ChatStack = createNativeStackNavigator({\n screenOptions: globalScreenOptions,\n screenLayout: ScreenLayoutWithChatAccessGate,\n screens: {\n Conversations: {\n screen: ConversationsScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n {\n headerTitle: (route.params as { title?: string })?.title ?? 'Chat',\n },\n withMinimalBack({\n onPress: navigation.goBack,\n })\n ),\n },\n ConversationFilters: {\n screen: ConversationFiltersScreen,\n options: ConversationFiltersScreenOptions,\n },\n Conversation: {\n screen: ConversationScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n {\n headerTitle: (props: NativeStackHeaderRightProps) => {\n const { conversation_id, title, badge, deleted, muted } =\n route.params as ConversationRouteProps\n\n return (\n <ConversationScreenTitle\n conversation_id={conversation_id}\n badge={badge}\n deleted={deleted}\n muted={muted}\n {...props}\n >\n {title ?? 'Conversation'}\n </ConversationScreenTitle>\n )\n },\n },\n withMinimalBack({\n onPress: () => {\n const params = route.params as ConversationRouteProps\n if ((params as ConversationFiltersParams)?.chat_group_graph_id) {\n // Ensure that conversations with a graph id pass them back to the conversation list\n const { chat_group_graph_id } = params\n navigation.popTo('Conversations', { chat_group_graph_id })\n } else {\n navigation.goBack()\n }\n },\n }),\n withRightClose({ onPress: () => navigation.getParent()?.goBack() })\n ),\n },\n ConversationReply: {\n screen: ConversationScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n { title: (route.params as ConversationRouteProps)?.title ?? 'Reply' },\n withMinimalBack({ onPress: navigation.goBack })\n ),\n },\n TeamConversation: {\n screen: TeamConversationScreen,\n if: useQualifiedByAge,\n options: {\n title: 'Finding conversation...',\n animation: 'none',\n cardStyleInterpolator: CardStyleInterpolators.forNoAnimation,\n },\n },\n ConversationDetails: {\n screen: ConversationDetailsScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n presentation: 'modal',\n title: 'Conversation details',\n },\n withRightDone({ onPress: navigation.goBack })\n ),\n },\n AvatarPicker: {\n screen: AvatarPickerScreen,\n options: AvatarPickerScreenOptions,\n },\n ChatSettings: {\n screen: SettingsScreen,\n options: ({ navigation }) =>\n composeOptions({ title: 'Chat settings' }, withMinimalBack({ onPress: navigation.goBack })),\n },\n NotificationSettings: {\n screen: NotificationSettingsScreen,\n options: ({ navigation }) =>\n navigation.getState().index === 0\n ? composeOptions(\n { title: 'Chat notifications' },\n withRightClose({ onPress: navigation.goBack })\n )\n : composeOptions(\n { title: 'Chat notifications' },\n withMinimalBack({ onPress: navigation.goBack })\n ),\n },\n PreferredAppSelection: {\n screen: PreferredAppSelectionScreen,\n options: ({ navigation }) =>\n composeOptions({ title: 'Preferred app' }, withMinimalBack({ onPress: navigation.goBack })),\n },\n GroupNotificationSettings: {\n screen: GroupNotificationSettingsScreen,\n options: ({ route, navigation }) => {\n const title = (route.params as { title?: string })?.title || 'Group Settings'\n\n // The dismiss button only shows when this is the entry screen (e.g.\n // deep links); deeper in the stack the back button covers dismissal.\n return navigation.getState().index === 0\n ? composeOptions(\n {\n title,\n },\n withRightClose({ onPress: navigation.goBack })\n )\n : composeOptions({ title }, withMinimalBack({ onPress: navigation.goBack }))\n },\n },\n GroupNotificationLevelSelect: {\n screen: GroupNotificationLevelSelectScreen,\n options: GroupNotificationLevelSelectScreenOptions,\n },\n ConversationNotificationLevelSelect: {\n screen: ConversationNotificationLevelSelectScreen,\n options: ConversationNotificationLevelSelectScreenOptions,\n },\n New: {\n screen: NewConversationStack,\n if: useQualifiedByAge,\n options: {\n headerShown: false,\n presentation: 'modal',\n },\n },\n GroupConversationNew: {\n screen: ConversationNewScreen,\n if: useQualifiedByAge,\n options: ({ navigation }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerLeft: () => null,\n },\n withRightClose({ onPress: () => navigation.getParent()?.goBack() })\n ),\n },\n SendGiphy: {\n screen: SendGiphyScreen,\n options: SendGiphyScreenOptions,\n },\n MessageActions: {\n screen: MessageActionsScreen,\n // Something about sheetAllowedDetents declared inline breaks TS\n options: MessageActionsScreenOptions,\n },\n MessageReport: {\n screen: MessageReportScreen,\n options: MessageReportScreenOptions,\n },\n AttachmentActions: {\n screen: AttachmentActionsScreen,\n options: AttachmentActionsScreenOptions,\n },\n ConversationSelectType: {\n screen: ConversationSelectTypeScreen,\n options: ConversationSelectTypeScreenOptions,\n },\n Reactions: {\n screen: ReactionsScreen,\n options: ReactionsScreenOptions,\n },\n SystemMessagePeople: {\n screen: SystemMessagePeopleScreen,\n options: SystemMessagePeopleScreenOptions,\n },\n MessageReadReceipts: {\n screen: MessageReadReceiptsScreen,\n options: MessageReadReceiptsScreenOptions,\n },\n BugReport: {\n screen: BugReportScreen,\n options: BugReportScreenOptions,\n },\n GetHelp: {\n screen: GetHelpScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n headerTitle: 'Get help',\n headerBackVisible: false,\n presentation: 'modal',\n },\n withRightClose({ onPress: navigation.goBack })\n ),\n },\n NotFound: {\n screen: NotFound,\n options: {\n title: '404',\n },\n linking: {\n path: '*',\n },\n },\n },\n})\n\ntype ChatStackParamList = StaticParamList<typeof ChatStack>\n\ndeclare global {\n namespace ReactNavigation {\n interface RootParamList extends ChatStackParamList {}\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { StaticParamList } from '@react-navigation/native'\nimport {\n createNativeStackNavigator,\n NativeStackHeaderRightProps,\n NativeStackNavigationOptions,\n} from '@react-navigation/native-stack'\nimport { CardStyleInterpolators } from '@react-navigation/stack'\nimport React from 'react'\nimport {\n composeOptions,\n withMinimalBack,\n withRightClose,\n withRightDone,\n} from '../components/display/platform_modal_header_buttons'\nimport { useDirectMessagesEligible, useQualifiedByAge } from '../hooks'\nimport {\n AttachmentActionsScreen,\n AttachmentActionsScreenOptions,\n} from '../screens/attachment_actions/attachment_actions_screen'\nimport {\n AvatarPickerScreen,\n AvatarPickerScreenOptions,\n AvatarPickerCreateScreenOptions,\n} from '../screens/avatar_picker/avatar_picker_screen'\nimport { BugReportScreen, BugReportScreenOptions } from '../screens/bug_report_screen'\nimport {\n MessageReadReceiptsScreen,\n MessageReadReceiptsScreenOptions,\n} from '../screens/conversation/message_read_receipts_screen'\nimport { ConversationDetailsScreen } from '../screens/conversation_details_screen'\nimport {\n ConversationFilterReceipientsScreenOptions,\n ConversationFilterRecipientsScreen,\n} from '../screens/conversation_filter_recipients/conversation_filter_recipients_screen'\nimport { ConversationFiltersParams } from '../screens/conversation_filters/screen_props'\nimport {\n ConversationFiltersScreen,\n ConversationFiltersScreenOptions,\n} from '../screens/conversation_filters_screen'\nimport { ConversationNewScreen } from '../screens/conversation_new/conversation_new_screen'\nimport {\n ConversationNotificationLevelSelectScreen,\n ConversationNotificationLevelSelectScreenOptions,\n} from '../screens/conversation_notification_level_select_screen'\nimport {\n ConversationRouteProps,\n ConversationScreen,\n ConversationScreenTitle,\n} from '../screens/conversation_screen'\nimport { ConversationNewEntryScreen } from '../screens/conversation_select_recipients/conversation_new_entry_screen'\nimport { ConversationSelectDirectMessageRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen'\nimport { ConversationSelectGroupRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_group_recipients_screen'\nimport { ConversationSelectTeamsILeadRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen'\nimport { ConversationSelectRecipientsParams } from '../screens/conversation_select_recipients/types/screen_props'\nimport {\n ConversationSelectTypeScreen,\n ConversationSelectTypeScreenOptions,\n} from '../screens/conversation_select_type_screen'\nimport { ConversationsScreen } from '../screens/conversations/conversations_screen'\nimport { GetHelpScreen } from '../screens/get_help_screen'\nimport {\n GroupNotificationLevelSelectScreen,\n GroupNotificationLevelSelectScreenOptions,\n} from '../screens/group_notification_level_select_screen'\nimport { GroupNotificationSettingsScreen } from '../screens/group_notification_settings_screen'\nimport {\n MessageActionsScreen,\n MessageActionsScreenOptions,\n} from '../screens/message_actions_screen'\nimport { MessageReportScreen, MessageReportScreenOptions } from '../screens/message_report_screen'\nimport { NotFound } from '../screens/not_found'\nimport { NotificationSettingsScreen } from '../screens/notification_settings_screen'\nimport { PreferredAppSelectionScreen } from '../screens/preferred_app_selection_screen'\nimport { ReactionsScreen, ReactionsScreenOptions } from '../screens/reactions_screen'\nimport { SendGiphyScreen, SendGiphyScreenOptions } from '../screens/send_giphy_screen'\nimport { SettingsScreen } from '../screens/settings_screen'\nimport {\n SystemMessagePeopleScreen,\n SystemMessagePeopleScreenOptions,\n} from '../screens/system_message_people_screen'\nimport { TeamConversationScreen } from '../screens/team_conversation_screen'\nimport { isLiquidGlassEnabled } from '../utils/liquid_glass'\nimport { ScreenLayoutWithChatAccessGate } from './screenLayout'\n\nconst globalScreenOptions: () => NativeStackNavigationOptions = () => ({\n headerBackButtonDisplayMode: 'minimal',\n ...(isLiquidGlassEnabled() ? { headerShadowVisible: false } : {}),\n})\n\nexport const NewConversationStack = createNativeStackNavigator({\n initialRouteName: 'ConversationNewEntry',\n screenOptions: globalScreenOptions,\n screenLayout: ScreenLayoutWithChatAccessGate,\n screens: {\n ConversationNewEntry: {\n screen: ConversationNewEntryScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerBackVisible: false,\n },\n withRightClose({ onPress: navigation.goBack })\n ),\n },\n ConversationSelectGroupRecipients: {\n screen: ConversationSelectGroupRecipientsScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationSelectTeamsILeadRecipients: {\n screen: ConversationSelectTeamsILeadRecipientsScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationSelectDirectMessageRecipients: {\n screen: ConversationSelectDirectMessageRecipientsScreen,\n if: useDirectMessagesEligible,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n },\n withRightClose({\n onPress: () => navigation.popTo('Conversations', route.params),\n })\n ),\n },\n ConversationFilterRecipients: {\n screen: ConversationFilterRecipientsScreen,\n options: ConversationFilterReceipientsScreenOptions,\n },\n ConversationNew: {\n screen: ConversationNewScreen,\n options: ({ navigation, route }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerLeft: () => null,\n },\n withRightClose({\n onPress: () => {\n const { chat_group_graph_id, group_source_app_name } =\n route.params as ConversationSelectRecipientsParams\n navigation.popTo('Conversations', { chat_group_graph_id, group_source_app_name })\n },\n })\n ),\n },\n AvatarPicker: {\n screen: AvatarPickerScreen,\n options: AvatarPickerCreateScreenOptions,\n },\n },\n})\n\nexport const ChatStack = createNativeStackNavigator({\n screenOptions: globalScreenOptions,\n screenLayout: ScreenLayoutWithChatAccessGate,\n screens: {\n Conversations: {\n screen: ConversationsScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n {\n headerTitle: (route.params as { title?: string })?.title ?? 'Chat',\n headerBackVisible: false,\n },\n withRightClose({ onPress: navigation.goBack })\n ),\n },\n ConversationFilters: {\n screen: ConversationFiltersScreen,\n options: ConversationFiltersScreenOptions,\n },\n Conversation: {\n screen: ConversationScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n {\n headerTitle: (props: NativeStackHeaderRightProps) => {\n const { conversation_id, title, badge, deleted, muted } =\n route.params as ConversationRouteProps\n\n return (\n <ConversationScreenTitle\n conversation_id={conversation_id}\n badge={badge}\n deleted={deleted}\n muted={muted}\n {...props}\n >\n {title ?? 'Conversation'}\n </ConversationScreenTitle>\n )\n },\n },\n withMinimalBack({\n onPress: () => {\n const params = route.params as ConversationRouteProps\n if ((params as ConversationFiltersParams)?.chat_group_graph_id) {\n // Ensure that conversations with a graph id pass them back to the conversation list\n const { chat_group_graph_id } = params\n navigation.popTo('Conversations', { chat_group_graph_id })\n } else {\n navigation.goBack()\n }\n },\n }),\n withRightClose({ onPress: () => navigation.getParent()?.goBack() })\n ),\n },\n ConversationReply: {\n screen: ConversationScreen,\n options: ({ route, navigation }) =>\n composeOptions(\n { title: (route.params as ConversationRouteProps)?.title ?? 'Reply' },\n withMinimalBack({ onPress: navigation.goBack })\n ),\n },\n TeamConversation: {\n screen: TeamConversationScreen,\n if: useQualifiedByAge,\n options: {\n title: 'Finding conversation...',\n animation: 'none',\n cardStyleInterpolator: CardStyleInterpolators.forNoAnimation,\n },\n },\n ConversationDetails: {\n screen: ConversationDetailsScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n presentation: 'modal',\n title: 'Conversation details',\n },\n withRightDone({ onPress: navigation.goBack })\n ),\n },\n AvatarPicker: {\n screen: AvatarPickerScreen,\n options: AvatarPickerScreenOptions,\n },\n ChatSettings: {\n screen: SettingsScreen,\n options: ({ navigation }) =>\n composeOptions({ title: 'Chat settings' }, withMinimalBack({ onPress: navigation.goBack })),\n },\n NotificationSettings: {\n screen: NotificationSettingsScreen,\n options: ({ navigation }) =>\n navigation.getState().index === 0\n ? composeOptions(\n { title: 'Chat notifications' },\n withRightClose({ onPress: navigation.goBack })\n )\n : composeOptions(\n { title: 'Chat notifications' },\n withMinimalBack({ onPress: navigation.goBack })\n ),\n },\n PreferredAppSelection: {\n screen: PreferredAppSelectionScreen,\n options: ({ navigation }) =>\n composeOptions({ title: 'Preferred app' }, withMinimalBack({ onPress: navigation.goBack })),\n },\n GroupNotificationSettings: {\n screen: GroupNotificationSettingsScreen,\n options: ({ route, navigation }) => {\n const title = (route.params as { title?: string })?.title || 'Group Settings'\n\n // The dismiss button only shows when this is the entry screen (e.g.\n // deep links); deeper in the stack the back button covers dismissal.\n return navigation.getState().index === 0\n ? composeOptions(\n {\n title,\n },\n withRightClose({ onPress: navigation.goBack })\n )\n : composeOptions({ title }, withMinimalBack({ onPress: navigation.goBack }))\n },\n },\n GroupNotificationLevelSelect: {\n screen: GroupNotificationLevelSelectScreen,\n options: GroupNotificationLevelSelectScreenOptions,\n },\n ConversationNotificationLevelSelect: {\n screen: ConversationNotificationLevelSelectScreen,\n options: ConversationNotificationLevelSelectScreenOptions,\n },\n New: {\n screen: NewConversationStack,\n if: useQualifiedByAge,\n options: {\n headerShown: false,\n presentation: 'modal',\n },\n },\n GroupConversationNew: {\n screen: ConversationNewScreen,\n if: useQualifiedByAge,\n options: ({ navigation }) =>\n composeOptions(\n {\n title: 'New conversation',\n headerLeft: () => null,\n },\n withRightClose({ onPress: () => navigation.getParent()?.goBack() })\n ),\n },\n SendGiphy: {\n screen: SendGiphyScreen,\n options: SendGiphyScreenOptions,\n },\n MessageActions: {\n screen: MessageActionsScreen,\n // Something about sheetAllowedDetents declared inline breaks TS\n options: MessageActionsScreenOptions,\n },\n MessageReport: {\n screen: MessageReportScreen,\n options: MessageReportScreenOptions,\n },\n AttachmentActions: {\n screen: AttachmentActionsScreen,\n options: AttachmentActionsScreenOptions,\n },\n ConversationSelectType: {\n screen: ConversationSelectTypeScreen,\n options: ConversationSelectTypeScreenOptions,\n },\n Reactions: {\n screen: ReactionsScreen,\n options: ReactionsScreenOptions,\n },\n SystemMessagePeople: {\n screen: SystemMessagePeopleScreen,\n options: SystemMessagePeopleScreenOptions,\n },\n MessageReadReceipts: {\n screen: MessageReadReceiptsScreen,\n options: MessageReadReceiptsScreenOptions,\n },\n BugReport: {\n screen: BugReportScreen,\n options: BugReportScreenOptions,\n },\n GetHelp: {\n screen: GetHelpScreen,\n options: ({ navigation }) =>\n composeOptions(\n {\n headerTitle: 'Get help',\n headerBackVisible: false,\n presentation: 'modal',\n },\n withRightClose({ onPress: navigation.goBack })\n ),\n },\n NotFound: {\n screen: NotFound,\n options: {\n title: '404',\n },\n linking: {\n path: '*',\n },\n },\n },\n})\n\ntype ChatStackParamList = StaticParamList<typeof ChatStack>\n\ndeclare global {\n namespace ReactNavigation {\n interface RootParamList extends ChatStackParamList {}\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAGL,iBAAiB,EAIlB,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"conversation_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAGL,iBAAiB,EAIlB,MAAM,0BAA0B,CAAA;AAwCjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AAOjF,MAAM,MAAM,sBAAsB,GAAG;IACnC,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAE/E,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,2CAkBpE;AAuPD,UAAU,4BAA6B,SAAQ,gBAAgB;IAC7D,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,eAAO,MAAM,uBAAuB,GAAI,8DAOrC,4BAA4B,4CAuC9B,CAAA"}
|
|
@@ -22,6 +22,8 @@ import { useTheme } from '../hooks';
|
|
|
22
22
|
import { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action';
|
|
23
23
|
import { useConversation } from '../hooks/use_conversation';
|
|
24
24
|
import { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events';
|
|
25
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
26
|
+
import { useConversationLayoutDiagnostics, useLayoutWidthProbe, } from '../hooks/use_conversation_layout_diagnostics';
|
|
25
27
|
import { useConversationMessages } from '../hooks/use_conversation_messages';
|
|
26
28
|
import { useConversationMessagesJoltEvents } from '../hooks/use_conversation_messages_jolt_events';
|
|
27
29
|
import { useMarkLatestMessageRead } from '../hooks/use_mark_latest_message_read';
|
|
@@ -45,12 +47,14 @@ function ConversationScreenContent({ route }) {
|
|
|
45
47
|
const navigation = useNavigation();
|
|
46
48
|
const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } = route.params;
|
|
47
49
|
const { data: conversation } = useConversation(route.params);
|
|
48
|
-
const { messages, fetchNextPage, hasNextPage } = useConversationMessages({
|
|
50
|
+
const { messages, fetchNextPage, hasNextPage, isFetchingNextPage } = useConversationMessages({
|
|
49
51
|
conversation_id,
|
|
50
52
|
reply_root_id,
|
|
51
53
|
});
|
|
52
54
|
useConversationJoltEvents({ conversationId: conversation_id });
|
|
53
55
|
useConversationMessagesJoltEvents({ conversationId: conversation_id });
|
|
56
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
57
|
+
useConversationLayoutDiagnostics({ conversationId: conversation_id, replyRootId: reply_root_id });
|
|
54
58
|
const { markHandledByMessageForm } = useVideoModerationJoltEvents();
|
|
55
59
|
useEnsureConversationsRouteExists();
|
|
56
60
|
useMarkLatestMessageRead({ conversation, messages });
|
|
@@ -110,7 +114,12 @@ function ConversationScreenContent({ route }) {
|
|
|
110
114
|
return _jsx(SystemMessage, { message: item, conversationId: conversation_id });
|
|
111
115
|
}
|
|
112
116
|
return (_jsx(Message, { ...item, canDeleteNonAuthoredMessages: canDeleteNonAuthoredMessages, conversation_id: conversation_id, latestReadMessageSortKey: conversation?.latestReadMessageSortKey, inReplyScreen: !!reply_root_id }));
|
|
113
|
-
}, onEndReached: () =>
|
|
117
|
+
}, onEndReached: () => {
|
|
118
|
+
// VirtualizedList dedupes onEndReached per content length, not
|
|
119
|
+
// per fetch, so it can refire while a page is already in flight.
|
|
120
|
+
if (hasNextPage && !isFetchingNextPage)
|
|
121
|
+
fetchNextPage();
|
|
122
|
+
}, ListHeaderComponent: _jsx(View, { style: styles.listHeader }) })), _jsx(JumpToBottomButton, { onPress: handleReturnToBottom, visible: showJumpToBottomButton }), !noMessages && _jsx(TypingIndicator, {}), showLeaderDisabledReplyBanner && _jsx(LeaderMessagesDisabledBanner, {}), _jsx(ConversationBottomBar, { conversation: conversation, canReply: canReply, replyRootAuthorFirstName: replyRootAuthorFirstName, replyRootId: reply_root_id, currentlyEditingMessage: currentlyEditingMessage, onFlaggedInMessageForm: markHandledByMessageForm })] }) }));
|
|
114
123
|
}
|
|
115
124
|
function ConversationBottomBar({ conversation, canReply, replyRootAuthorFirstName, replyRootId, currentlyEditingMessage, onFlaggedInMessageForm, }) {
|
|
116
125
|
const messageLink = useMessageAvailableMembersAction(conversation);
|
|
@@ -127,7 +136,9 @@ function InlineDateSeparator({ date }) {
|
|
|
127
136
|
const { isThisYear } = getRelativeDateStatus(date);
|
|
128
137
|
const showYear = !isThisYear;
|
|
129
138
|
const dateStamp = formatDate(date, { style: 'long', year: showYear });
|
|
130
|
-
|
|
139
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
140
|
+
const onDateTextLayout = useLayoutWidthProbe('dateSeparator.text', 16);
|
|
141
|
+
return (_jsxs(View, { style: styles.container, children: [_jsx(View, { style: styles.separator }), _jsx(Text, { variant: "footnote", style: styles.dateText, onLayout: onDateTextLayout, children: dateStamp }), _jsx(View, { style: styles.separator })] }));
|
|
131
142
|
}
|
|
132
143
|
const useDateSeparatorStyles = () => {
|
|
133
144
|
const theme = useTheme();
|
|
@@ -155,7 +166,9 @@ export const ConversationScreenTitle = ({ conversation_id, badge, children, styl
|
|
|
155
166
|
const resourceType = badge?.pcoResourceType || '';
|
|
156
167
|
const productName = badge?.appName;
|
|
157
168
|
const name = badge?.text || undefined;
|
|
158
|
-
|
|
169
|
+
// CHAT-476 diagnostics - remove with use_conversation_layout_diagnostics.ts
|
|
170
|
+
const onHeaderContainerLayout = useLayoutWidthProbe('header.container', 0);
|
|
171
|
+
return (_jsxs(PlatformPressable, { accessibilityHint: "Opens details about members and settings", style: styles.container, onLayout: onHeaderContainerLayout, onPress: () => {
|
|
159
172
|
if (deleted)
|
|
160
173
|
return;
|
|
161
174
|
navigation.navigate('ConversationDetails', { conversation_id });
|
|
@@ -164,7 +177,11 @@ export const ConversationScreenTitle = ({ conversation_id, badge, children, styl
|
|
|
164
177
|
const usePressableHeaderStyle = () => {
|
|
165
178
|
const { width } = useWindowDimensions();
|
|
166
179
|
const slotReserve = useHeaderSlotReserve();
|
|
167
|
-
|
|
180
|
+
// Guards narrow windows (split-screen, freeform, DeX) where slotReserve * 2
|
|
181
|
+
// exceeds the available width. A negative maxWidth can hand a descendant
|
|
182
|
+
// <Text> a negative measure width, and android.text.Layout hard-throws on
|
|
183
|
+
// that (`Layout: -2 < 0`) rather than clamping the way iOS does.
|
|
184
|
+
const headerContainerStyle = { maxWidth: Math.max(0, width - slotReserve * 2) };
|
|
168
185
|
return StyleSheet.create({
|
|
169
186
|
container: {
|
|
170
187
|
alignItems: Platform.select({ android: 'flex-start', default: 'center' }),
|