@planningcenter/chat-react-native 3.38.0-rc.1 → 3.38.0-rc.10
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/message_list.d.ts +10 -0
- package/build/components/conversation/message_list.d.ts.map +1 -0
- package/build/components/conversation/message_list.js +13 -0
- package/build/components/conversation/message_list.js.map +1 -0
- package/build/components/display/conversation_avatar.d.ts +2 -1
- package/build/components/display/conversation_avatar.d.ts.map +1 -1
- package/build/components/display/conversation_avatar.js +6 -5
- package/build/components/display/conversation_avatar.js.map +1 -1
- package/build/components/display/emoji_avatar.d.ts +3 -1
- package/build/components/display/emoji_avatar.d.ts.map +1 -1
- package/build/components/display/emoji_avatar.js +2 -2
- package/build/components/display/emoji_avatar.js.map +1 -1
- package/build/components/display/icon_avatar.d.ts +3 -1
- package/build/components/display/icon_avatar.d.ts.map +1 -1
- package/build/components/display/icon_avatar.js +2 -2
- package/build/components/display/icon_avatar.js.map +1 -1
- package/build/hooks/groups/use_group_chat_conversation_payload.d.ts.map +1 -1
- package/build/hooks/groups/use_group_chat_conversation_payload.js +1 -0
- package/build/hooks/groups/use_group_chat_conversation_payload.js.map +1 -1
- package/build/hooks/index.d.ts +1 -0
- package/build/hooks/index.d.ts.map +1 -1
- package/build/hooks/index.js +1 -0
- package/build/hooks/index.js.map +1 -1
- package/build/hooks/use_preview_avatar_diameter.d.ts +2 -0
- package/build/hooks/use_preview_avatar_diameter.d.ts.map +1 -0
- package/build/hooks/use_preview_avatar_diameter.js +11 -0
- package/build/hooks/use_preview_avatar_diameter.js.map +1 -0
- package/build/jest.js +1 -1
- package/build/jest.js.map +1 -1
- package/build/screens/avatar_picker/avatar_picker_screen.d.ts.map +1 -1
- package/build/screens/avatar_picker/avatar_picker_screen.js +11 -9
- package/build/screens/avatar_picker/avatar_picker_screen.js.map +1 -1
- package/build/screens/avatar_picker/avatar_preview.d.ts.map +1 -1
- package/build/screens/avatar_picker/avatar_preview.js +13 -5
- package/build/screens/avatar_picker/avatar_preview.js.map +1 -1
- package/build/screens/avatar_picker/emoji_tab.d.ts.map +1 -1
- package/build/screens/avatar_picker/emoji_tab.js +3 -7
- package/build/screens/avatar_picker/emoji_tab.js.map +1 -1
- package/build/screens/avatar_picker/upload_tab.d.ts.map +1 -1
- package/build/screens/avatar_picker/upload_tab.js +2 -1
- package/build/screens/avatar_picker/upload_tab.js.map +1 -1
- package/build/screens/conversation_details_screen.d.ts.map +1 -1
- package/build/screens/conversation_details_screen.js +5 -2
- package/build/screens/conversation_details_screen.js.map +1 -1
- package/build/screens/conversation_filter_recipients/components/header_row.d.ts.map +1 -1
- package/build/screens/conversation_filter_recipients/components/header_row.js +3 -2
- package/build/screens/conversation_filter_recipients/components/header_row.js.map +1 -1
- package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.d.ts.map +1 -1
- package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js +47 -18
- package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js.map +1 -1
- package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts +2 -1
- package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts.map +1 -1
- package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js +23 -26
- package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js.map +1 -1
- package/build/screens/conversation_filter_recipients/types.d.ts +1 -1
- package/build/screens/conversation_filter_recipients/types.d.ts.map +1 -1
- package/build/screens/conversation_filter_recipients/types.js.map +1 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +3 -7
- package/build/screens/conversation_screen.js.map +1 -1
- package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts +1 -1
- package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts.map +1 -1
- package/build/screens/conversation_select_recipients/components/recipient_link_row.js +3 -3
- package/build/screens/conversation_select_recipients/components/recipient_link_row.js.map +1 -1
- package/build/screens/conversation_select_recipients/components/team_recipient_row.d.ts.map +1 -1
- package/build/screens/conversation_select_recipients/components/team_recipient_row.js +1 -1
- package/build/screens/conversation_select_recipients/components/team_recipient_row.js.map +1 -1
- package/build/screens/team_conversation_screen.d.ts.map +1 -1
- package/build/screens/team_conversation_screen.js +24 -1
- package/build/screens/team_conversation_screen.js.map +1 -1
- package/build/utils/client/client.d.ts +1 -1
- package/build/utils/client/client.d.ts.map +1 -1
- package/build/utils/client/client.js +7 -6
- package/build/utils/client/client.js.map +1 -1
- package/build/utils/client/instrumented_fetch.js +3 -5
- package/build/utils/client/instrumented_fetch.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/hooks/use_group_chat_conversation_payload.test.tsx +50 -0
- package/src/__tests__/jest.ts +1 -1
- package/src/__tests__/utils/client.ts +32 -0
- package/src/components/conversation/__tests__/message_list.test.tsx +14 -0
- package/src/components/conversation/message_list.tsx +42 -0
- package/src/components/display/conversation_avatar.tsx +7 -5
- package/src/components/display/emoji_avatar.tsx +10 -2
- package/src/components/display/icon_avatar.tsx +10 -2
- package/src/hooks/groups/use_group_chat_conversation_payload.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use_preview_avatar_diameter.ts +12 -0
- package/src/jest.ts +1 -1
- package/src/screens/avatar_picker/avatar_picker_screen.tsx +25 -9
- package/src/screens/avatar_picker/avatar_preview.tsx +14 -5
- package/src/screens/avatar_picker/emoji_tab.tsx +3 -6
- package/src/screens/avatar_picker/upload_tab.tsx +2 -0
- package/src/screens/conversation_details_screen.tsx +10 -1
- package/src/screens/conversation_filter_recipients/components/header_row.tsx +3 -2
- package/src/screens/conversation_filter_recipients/hooks/__tests__/use_service_types_with_teams.test.ts +108 -0
- package/src/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.tsx +46 -19
- package/src/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.ts +31 -29
- package/src/screens/conversation_filter_recipients/types.tsx +1 -1
- package/src/screens/conversation_screen.tsx +5 -14
- package/src/screens/conversation_select_recipients/components/recipient_link_row.tsx +6 -4
- package/src/screens/conversation_select_recipients/components/team_recipient_row.tsx +2 -1
- package/src/screens/team_conversation_screen.tsx +33 -1
- package/src/utils/client/__tests__/instrumented_fetch.test.ts +9 -5
- package/src/utils/client/client.ts +9 -7
- package/src/utils/client/instrumented_fetch.ts +3 -6
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { type FlatListProps } from 'react-native';
|
|
3
|
+
import { FlatList } from 'react-native-gesture-handler';
|
|
4
|
+
import type { EnrichedMessage } from '../../utils/group_messages';
|
|
5
|
+
type MessageListProps = Pick<FlatListProps<EnrichedMessage>, 'data' | 'renderItem' | 'onScroll' | 'onScrollBeginDrag' | 'viewabilityConfigCallbackPairs' | 'onContentSizeChange' | 'onScrollToIndexFailed' | 'onEndReached' | 'ListHeaderComponent'> & {
|
|
6
|
+
listRef: RefObject<FlatList | null>;
|
|
7
|
+
};
|
|
8
|
+
export declare function MessageList({ listRef, ...props }: MessageListProps): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=message_list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message_list.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/message_list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAKjE,KAAK,gBAAgB,GAAG,IAAI,CAC1B,aAAa,CAAC,eAAe,CAAC,EAC5B,MAAM,GACN,YAAY,GACZ,UAAU,GACV,mBAAmB,GACnB,gCAAgC,GAChC,qBAAqB,GACrB,uBAAuB,GACvB,cAAc,GACd,qBAAqB,CACxB,GAAG;IACF,OAAO,EAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;CACpC,CAAA;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAYlE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StyleSheet } from 'react-native';
|
|
2
|
+
import { FlatList } from 'react-native-gesture-handler';
|
|
3
|
+
const extractItemKey = (item) => String(item.id);
|
|
4
|
+
const maintainVisibleContentPosition = { minIndexForVisible: 0 };
|
|
5
|
+
export function MessageList({ listRef, ...props }) {
|
|
6
|
+
return (<FlatList inverted ref={listRef} contentContainerStyle={styles.listContainer} maintainVisibleContentPosition={maintainVisibleContentPosition} keyExtractor={extractItemKey} scrollEventThrottle={64} {...props}/>);
|
|
7
|
+
}
|
|
8
|
+
const styles = StyleSheet.create({
|
|
9
|
+
listContainer: {
|
|
10
|
+
paddingVertical: 12,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=message_list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message_list.js","sourceRoot":"","sources":["../../../src/components/conversation/message_list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAGvD,MAAM,cAAc,GAAG,CAAC,IAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACjE,MAAM,8BAA8B,GAAG,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAA;AAiBhE,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,EAAoB;IACjE,OAAO,CACL,CAAC,QAAQ,CACP,QAAQ,CACR,GAAG,CAAC,CAAC,OAAO,CAAC,CACb,qBAAqB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAC5C,8BAA8B,CAAC,CAAC,8BAA8B,CAAC,CAC/D,YAAY,CAAC,CAAC,cAAc,CAAC,CAC7B,mBAAmB,CAAC,CAAC,EAAE,CAAC,CACxB,IAAI,KAAK,CAAC,EACV,CACH,CAAA;AACH,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,aAAa,EAAE;QACb,eAAe,EAAE,EAAE;KACpB;CACF,CAAC,CAAA","sourcesContent":["import { RefObject } from 'react'\nimport { StyleSheet, type FlatListProps } from 'react-native'\nimport { FlatList } from 'react-native-gesture-handler'\nimport type { EnrichedMessage } from '../../utils/group_messages'\n\nconst extractItemKey = (item: EnrichedMessage) => String(item.id)\nconst maintainVisibleContentPosition = { minIndexForVisible: 0 }\n\ntype MessageListProps = Pick<\n FlatListProps<EnrichedMessage>,\n | 'data'\n | 'renderItem'\n | 'onScroll'\n | 'onScrollBeginDrag'\n | 'viewabilityConfigCallbackPairs'\n | 'onContentSizeChange'\n | 'onScrollToIndexFailed'\n | 'onEndReached'\n | 'ListHeaderComponent'\n> & {\n listRef: RefObject<FlatList | null>\n}\n\nexport function MessageList({ listRef, ...props }: MessageListProps) {\n return (\n <FlatList\n inverted\n ref={listRef}\n contentContainerStyle={styles.listContainer}\n maintainVisibleContentPosition={maintainVisibleContentPosition}\n keyExtractor={extractItemKey}\n scrollEventThrottle={64}\n {...props}\n />\n )\n}\n\nconst styles = StyleSheet.create({\n listContainer: {\n paddingVertical: 12,\n },\n})\n"]}
|
|
@@ -10,7 +10,8 @@ interface ConversationAvatarProps {
|
|
|
10
10
|
showFallback?: boolean;
|
|
11
11
|
fallbackIconName?: IconString;
|
|
12
12
|
style?: ViewStyle;
|
|
13
|
+
maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier'];
|
|
13
14
|
}
|
|
14
|
-
export declare function ConversationAvatar({ conversation, size, showFallback, fallbackIconName, style, }: ConversationAvatarProps): React.JSX.Element;
|
|
15
|
+
export declare function ConversationAvatar({ conversation, size, showFallback, fallbackIconName, style, maxFontSizeMultiplier, }: ConversationAvatarProps): React.JSX.Element;
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=conversation_avatar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/conversation_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAGrF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAA;AAGxC,KAAK,sBAAsB,GAAG,IAAI,CAChC,oBAAoB,EAClB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,sBAAsB,GACtB,mBAAmB,CACtB,CAAA;AAgCD,UAAU,uBAAuB;IAC/B,YAAY,EAAE,sBAAsB,CAAA;IACpC,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,UAAU,CAAA;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"conversation_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/conversation_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAGrF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAA;AAGxC,KAAK,sBAAsB,GAAG,IAAI,CAChC,oBAAoB,EAClB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,sBAAsB,GACtB,mBAAmB,CACtB,CAAA;AAgCD,UAAU,uBAAuB;IAC/B,YAAY,EAAE,sBAAsB,CAAA;IACpC,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,UAAU,CAAA;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,qBAAqB,CAAC,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAA;CACjE;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,IAAW,EACX,YAAoB,EACpB,gBAAmC,EACnC,KAAK,EACL,qBAAqB,GACtB,EAAE,uBAAuB,qBA2BzB"}
|
|
@@ -23,21 +23,22 @@ function resolveAvatar(conversation) {
|
|
|
23
23
|
}
|
|
24
24
|
return { kind: 'group', sources: conversation.previewAvatarUrls };
|
|
25
25
|
}
|
|
26
|
-
export function ConversationAvatar({ conversation, size = 'lg', showFallback = false, fallbackIconName = 'general.person', style, }) {
|
|
26
|
+
export function ConversationAvatar({ conversation, size = 'lg', showFallback = false, fallbackIconName = 'general.person', style, maxFontSizeMultiplier, }) {
|
|
27
27
|
const avatar = resolveAvatar(conversation);
|
|
28
|
+
const sizeProps = { size, maxFontSizeMultiplier, style };
|
|
28
29
|
switch (avatar.kind) {
|
|
29
30
|
case 'image':
|
|
30
|
-
return (<AvatarPrimitive.Root
|
|
31
|
+
return (<AvatarPrimitive.Root {...sizeProps}>
|
|
31
32
|
<AvatarPrimitive.Mask>
|
|
32
33
|
<AvatarPrimitive.Image sourceUri={avatar.url}/>
|
|
33
34
|
</AvatarPrimitive.Mask>
|
|
34
35
|
</AvatarPrimitive.Root>);
|
|
35
36
|
case 'icon':
|
|
36
|
-
return <IconAvatar iconKey={avatar.iconKey} color={avatar.color}
|
|
37
|
+
return <IconAvatar iconKey={avatar.iconKey} color={avatar.color} {...sizeProps}/>;
|
|
37
38
|
case 'emoji':
|
|
38
|
-
return <EmojiAvatar emoji={avatar.emoji} color={avatar.color}
|
|
39
|
+
return <EmojiAvatar emoji={avatar.emoji} color={avatar.color} {...sizeProps}/>;
|
|
39
40
|
case 'group':
|
|
40
|
-
return (<AvatarGroup sourceUris={avatar.sources || []}
|
|
41
|
+
return (<AvatarGroup sourceUris={avatar.sources || []} showFallback={showFallback || !avatar.sources || avatar.sources.length === 0} fallbackIconName={fallbackIconName} {...sizeProps}/>);
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
//# sourceMappingURL=conversation_avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_avatar.js","sourceRoot":"","sources":["../../../src/components/display/conversation_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,eAAyC,MAAM,+BAA+B,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAiB1C,SAAS,aAAa,CAAC,YAAoC;IACzD,IAAI,YAAY,CAAC,gBAAgB,KAAK,OAAO,IAAI,YAAY,CAAC,oBAAoB,EAAE,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,oBAAoB,EAAE,CAAA;IAClE,CAAC;IAED,IAAI,YAAY,CAAC,gBAAgB,KAAK,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QAC7E,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,YAAY,CAAC,eAAe;YACrC,KAAK,EAAE,YAAY,CAAC,iBAAiB,IAAI,IAAI;SAC9C,CAAA;IACH,CAAC;IAED,IAAI,YAAY,CAAC,gBAAgB,KAAK,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,YAAY,CAAC,eAAe;YACnC,KAAK,EAAE,YAAY,CAAC,iBAAiB,IAAI,IAAI;SAC9C,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,iBAAiB,EAAE,CAAA;AACnE,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation_avatar.js","sourceRoot":"","sources":["../../../src/components/display/conversation_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,eAAyC,MAAM,+BAA+B,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAiB1C,SAAS,aAAa,CAAC,YAAoC;IACzD,IAAI,YAAY,CAAC,gBAAgB,KAAK,OAAO,IAAI,YAAY,CAAC,oBAAoB,EAAE,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,oBAAoB,EAAE,CAAA;IAClE,CAAC;IAED,IAAI,YAAY,CAAC,gBAAgB,KAAK,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QAC7E,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,YAAY,CAAC,eAAe;YACrC,KAAK,EAAE,YAAY,CAAC,iBAAiB,IAAI,IAAI;SAC9C,CAAA;IACH,CAAC;IAED,IAAI,YAAY,CAAC,gBAAgB,KAAK,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,YAAY,CAAC,eAAe;YACnC,KAAK,EAAE,YAAY,CAAC,iBAAiB,IAAI,IAAI;SAC9C,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,iBAAiB,EAAE,CAAA;AACnE,CAAC;AAWD,MAAM,UAAU,kBAAkB,CAAC,EACjC,YAAY,EACZ,IAAI,GAAG,IAAI,EACX,YAAY,GAAG,KAAK,EACpB,gBAAgB,GAAG,gBAAgB,EACnC,KAAK,EACL,qBAAqB,GACG;IACxB,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAA;IAExD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAClC;UAAA,CAAC,eAAe,CAAC,IAAI,CACnB;YAAA,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAC/C;UAAA,EAAE,eAAe,CAAC,IAAI,CACxB;QAAA,EAAE,eAAe,CAAC,IAAI,CAAC,CACxB,CAAA;QACH,KAAK,MAAM;YACT,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,EAAG,CAAA;QACpF,KAAK,OAAO;YACV,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,EAAG,CAAA;QACjF,KAAK,OAAO;YACV,OAAO,CACL,CAAC,WAAW,CACV,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CACjC,YAAY,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAC7E,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC,IAAI,SAAS,CAAC,EACd,CACH,CAAA;IACL,CAAC;AACH,CAAC","sourcesContent":["import React from 'react'\nimport type { ViewStyle } from 'react-native'\nimport type { ConversationResource } from '../../types'\nimport AvatarPrimitive, { type AvatarRootProps } from '../primitive/avatar_primitive'\nimport { AvatarGroup } from './avatar_group'\nimport { EmojiAvatar } from './emoji_avatar'\nimport { type IconString } from './icon'\nimport { IconAvatar } from './icon_avatar'\n\ntype ConversationAvatarData = Pick<\n ConversationResource,\n | 'customAvatarType'\n | 'customAvatarKey'\n | 'customAvatarColor'\n | 'customAvatarImageUrl'\n | 'previewAvatarUrls'\n>\n\ntype ResolvedAvatar =\n | { kind: 'image'; url: string }\n | { kind: 'icon'; iconKey: string; color: string | null }\n | { kind: 'emoji'; emoji: string; color: string | null }\n | { kind: 'group'; sources: string[] | undefined }\n\nfunction resolveAvatar(conversation: ConversationAvatarData): ResolvedAvatar {\n if (conversation.customAvatarType === 'image' && conversation.customAvatarImageUrl) {\n return { kind: 'image', url: conversation.customAvatarImageUrl }\n }\n\n if (conversation.customAvatarType === 'icon' && conversation.customAvatarKey) {\n return {\n kind: 'icon',\n iconKey: conversation.customAvatarKey,\n color: conversation.customAvatarColor ?? null,\n }\n }\n\n if (conversation.customAvatarType === 'emoji' && conversation.customAvatarKey) {\n return {\n kind: 'emoji',\n emoji: conversation.customAvatarKey,\n color: conversation.customAvatarColor ?? null,\n }\n }\n\n return { kind: 'group', sources: conversation.previewAvatarUrls }\n}\n\ninterface ConversationAvatarProps {\n conversation: ConversationAvatarData\n size?: AvatarRootProps['size']\n showFallback?: boolean\n fallbackIconName?: IconString\n style?: ViewStyle\n maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier']\n}\n\nexport function ConversationAvatar({\n conversation,\n size = 'lg',\n showFallback = false,\n fallbackIconName = 'general.person',\n style,\n maxFontSizeMultiplier,\n}: ConversationAvatarProps) {\n const avatar = resolveAvatar(conversation)\n const sizeProps = { size, maxFontSizeMultiplier, style }\n\n switch (avatar.kind) {\n case 'image':\n return (\n <AvatarPrimitive.Root {...sizeProps}>\n <AvatarPrimitive.Mask>\n <AvatarPrimitive.Image sourceUri={avatar.url} />\n </AvatarPrimitive.Mask>\n </AvatarPrimitive.Root>\n )\n case 'icon':\n return <IconAvatar iconKey={avatar.iconKey} color={avatar.color} {...sizeProps} />\n case 'emoji':\n return <EmojiAvatar emoji={avatar.emoji} color={avatar.color} {...sizeProps} />\n case 'group':\n return (\n <AvatarGroup\n sourceUris={avatar.sources || []}\n showFallback={showFallback || !avatar.sources || avatar.sources.length === 0}\n fallbackIconName={fallbackIconName}\n {...sizeProps}\n />\n )\n }\n}\n"]}
|
|
@@ -4,7 +4,9 @@ interface EmojiAvatarProps {
|
|
|
4
4
|
emoji: string;
|
|
5
5
|
color?: string | null;
|
|
6
6
|
size?: AvatarRootProps['size'];
|
|
7
|
+
maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier'];
|
|
8
|
+
style?: AvatarRootProps['style'];
|
|
7
9
|
}
|
|
8
|
-
export declare function EmojiAvatar({ emoji, color, size }: EmojiAvatarProps): React.JSX.Element;
|
|
10
|
+
export declare function EmojiAvatar({ emoji, color, size, maxFontSizeMultiplier, style, }: EmojiAvatarProps): React.JSX.Element;
|
|
9
11
|
export {};
|
|
10
12
|
//# sourceMappingURL=emoji_avatar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/emoji_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAwB,EACtB,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAA;AAYtC,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"emoji_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/emoji_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAwB,EACtB,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAA;AAYtC,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC9B,qBAAqB,CAAC,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAA;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CACjC;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,IAAW,EACX,qBAAqB,EACrB,KAAK,GACN,EAAE,gBAAgB,qBAgBlB"}
|
|
@@ -11,9 +11,9 @@ const EMOJI_SIZE = {
|
|
|
11
11
|
xl: 28,
|
|
12
12
|
'2xl': 40,
|
|
13
13
|
};
|
|
14
|
-
export function EmojiAvatar({ emoji, color, size = 'lg' }) {
|
|
14
|
+
export function EmojiAvatar({ emoji, color, size = 'lg', maxFontSizeMultiplier, style, }) {
|
|
15
15
|
const gradientProps = getAvatarGradientProps(color);
|
|
16
|
-
return (<AvatarPrimitive.Root size={size}>
|
|
16
|
+
return (<AvatarPrimitive.Root size={size} maxFontSizeMultiplier={maxFontSizeMultiplier} style={style}>
|
|
17
17
|
<AvatarPrimitive.Mask>
|
|
18
18
|
<LinearGradient {...gradientProps} style={styles.gradientFill}>
|
|
19
19
|
<View style={styles.contentContainer}>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji_avatar.js","sourceRoot":"","sources":["../../../src/components/display/emoji_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,eAGN,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,UAAU,GAA+B;IAC7C,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,EAAE;CACV,CAAA;
|
|
1
|
+
{"version":3,"file":"emoji_avatar.js","sourceRoot":"","sources":["../../../src/components/display/emoji_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,eAGN,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,UAAU,GAA+B;IAC7C,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,EAAE;CACV,CAAA;AAUD,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,IAAI,GAAG,IAAI,EACX,qBAAqB,EACrB,KAAK,GACY;IACjB,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAEnD,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAC3F;MAAA,CAAC,eAAe,CAAC,IAAI,CACnB;QAAA,CAAC,cAAc,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC5D;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;YAAA,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CACnE;cAAA,CAAC,KAAK,CACR;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,cAAc,CAClB;MAAA,EAAE,eAAe,CAAC,IAAI,CACxB;IAAA,EAAE,eAAe,CAAC,IAAI,CAAC,CACxB,CAAA;AACH,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;KACf;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC,CAAA","sourcesContent":["import React from 'react'\nimport { StyleSheet, Text, View } from 'react-native'\nimport LinearGradient from 'react-native-linear-gradient'\nimport AvatarPrimitive, {\n type AvatarRootProps,\n type AvatarSize,\n} from '../primitive/avatar_primitive'\nimport { getAvatarGradientProps } from './utils/avatar_gradient_colors'\n\nconst EMOJI_SIZE: Record<AvatarSize, number> = {\n xs: 8,\n sm: 10,\n md: 14,\n lg: 20,\n xl: 28,\n '2xl': 40,\n}\n\ninterface EmojiAvatarProps {\n emoji: string\n color?: string | null\n size?: AvatarRootProps['size']\n maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier']\n style?: AvatarRootProps['style']\n}\n\nexport function EmojiAvatar({\n emoji,\n color,\n size = 'lg',\n maxFontSizeMultiplier,\n style,\n}: EmojiAvatarProps) {\n const gradientProps = getAvatarGradientProps(color)\n\n return (\n <AvatarPrimitive.Root size={size} maxFontSizeMultiplier={maxFontSizeMultiplier} style={style}>\n <AvatarPrimitive.Mask>\n <LinearGradient {...gradientProps} style={styles.gradientFill}>\n <View style={styles.contentContainer}>\n <Text allowFontScaling={false} style={{ fontSize: EMOJI_SIZE[size] }}>\n {emoji}\n </Text>\n </View>\n </LinearGradient>\n </AvatarPrimitive.Mask>\n </AvatarPrimitive.Root>\n )\n}\n\nconst styles = StyleSheet.create({\n gradientFill: {\n width: '100%',\n height: '100%',\n },\n contentContainer: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n})\n"]}
|
|
@@ -4,7 +4,9 @@ interface IconAvatarProps {
|
|
|
4
4
|
iconKey: string;
|
|
5
5
|
color?: string | null;
|
|
6
6
|
size?: AvatarRootProps['size'];
|
|
7
|
+
maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier'];
|
|
8
|
+
style?: AvatarRootProps['style'];
|
|
7
9
|
}
|
|
8
|
-
export declare function IconAvatar({ iconKey, color, size }: IconAvatarProps): React.JSX.Element;
|
|
10
|
+
export declare function IconAvatar({ iconKey, color, size, maxFontSizeMultiplier, style, }: IconAvatarProps): React.JSX.Element;
|
|
9
11
|
export {};
|
|
10
12
|
//# sourceMappingURL=icon_avatar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/icon_avatar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAwB,EACtB,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAA;AAYtC,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"icon_avatar.d.ts","sourceRoot":"","sources":["../../../src/components/display/icon_avatar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAwB,EACtB,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAA;AAYtC,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC9B,qBAAqB,CAAC,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAA;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CACjC;AAMD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,KAAK,EACL,IAAW,EACX,qBAAqB,EACrB,KAAK,GACN,EAAE,eAAe,qBA6BjB"}
|
|
@@ -16,13 +16,13 @@ const ICON_SIZE = {
|
|
|
16
16
|
function findIcon(iconKey) {
|
|
17
17
|
return findIconDefinition({ prefix: 'fas', iconName: iconKey });
|
|
18
18
|
}
|
|
19
|
-
export function IconAvatar({ iconKey, color, size = 'lg' }) {
|
|
19
|
+
export function IconAvatar({ iconKey, color, size = 'lg', maxFontSizeMultiplier, style, }) {
|
|
20
20
|
const gradientProps = getAvatarGradientProps(color);
|
|
21
21
|
const iconDef = findIcon(iconKey);
|
|
22
22
|
if (__DEV__ && !iconDef) {
|
|
23
23
|
console.warn(`IconAvatar: unrecognized icon key "${iconKey}"`);
|
|
24
24
|
}
|
|
25
|
-
return (<AvatarPrimitive.Root size={size}>
|
|
25
|
+
return (<AvatarPrimitive.Root size={size} maxFontSizeMultiplier={maxFontSizeMultiplier} style={style}>
|
|
26
26
|
<AvatarPrimitive.Mask>
|
|
27
27
|
<LinearGradient {...gradientProps} style={styles.gradientFill}>
|
|
28
28
|
<View style={styles.contentContainer}>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon_avatar.js","sourceRoot":"","sources":["../../../src/components/display/icon_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAGnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAA;AACvE,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,eAGN,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,SAAS,GAA+B;IAC5C,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,EAAE;CACV,CAAA;
|
|
1
|
+
{"version":3,"file":"icon_avatar.js","sourceRoot":"","sources":["../../../src/components/display/icon_avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAGnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAA;AACvE,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,eAGN,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,SAAS,GAA+B;IAC5C,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,EAAE;CACV,CAAA;AAUD,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAmB,EAAE,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,KAAK,EACL,IAAI,GAAG,IAAI,EACX,qBAAqB,EACrB,KAAK,GACW;IAChB,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjC,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,sCAAsC,OAAO,GAAG,CAAC,CAAA;IAChE,CAAC;IAED,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAC3F;MAAA,CAAC,eAAe,CAAC,IAAI,CACnB;QAAA,CAAC,cAAc,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC5D;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;YAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CACT,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAG,CACxE,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC5D,kBAAkB,CAAC,cAAc,CACjC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAExB;;cACF,EAAE,IAAI,CAAC,CACR,CACH;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,cAAc,CAClB;MAAA,EAAE,eAAe,CAAC,IAAI,CACxB;IAAA,EAAE,eAAe,CAAC,IAAI,CAAC,CACxB,CAAA;AACH,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;KACf;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,MAAM;QAClB,OAAO,EAAE,GAAG;KACb;CACF,CAAC,CAAA","sourcesContent":["import {\n findIconDefinition,\n type IconDefinition,\n type IconName,\n} from '@fortawesome/fontawesome-svg-core'\nimport { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'\nimport React from 'react'\nimport { StyleSheet, Text, View } from 'react-native'\nimport LinearGradient from 'react-native-linear-gradient'\nimport AvatarPrimitive, {\n type AvatarRootProps,\n type AvatarSize,\n} from '../primitive/avatar_primitive'\nimport { getAvatarGradientProps } from './utils/avatar_gradient_colors'\n\nconst ICON_SIZE: Record<AvatarSize, number> = {\n xs: 10,\n sm: 12,\n md: 16,\n lg: 20,\n xl: 28,\n '2xl': 40,\n}\n\ninterface IconAvatarProps {\n iconKey: string\n color?: string | null\n size?: AvatarRootProps['size']\n maxFontSizeMultiplier?: AvatarRootProps['maxFontSizeMultiplier']\n style?: AvatarRootProps['style']\n}\n\nfunction findIcon(iconKey: string): IconDefinition | undefined {\n return findIconDefinition({ prefix: 'fas', iconName: iconKey as IconName })\n}\n\nexport function IconAvatar({\n iconKey,\n color,\n size = 'lg',\n maxFontSizeMultiplier,\n style,\n}: IconAvatarProps) {\n const gradientProps = getAvatarGradientProps(color)\n const iconDef = findIcon(iconKey)\n\n if (__DEV__ && !iconDef) {\n console.warn(`IconAvatar: unrecognized icon key \"${iconKey}\"`)\n }\n\n return (\n <AvatarPrimitive.Root size={size} maxFontSizeMultiplier={maxFontSizeMultiplier} style={style}>\n <AvatarPrimitive.Mask>\n <LinearGradient {...gradientProps} style={styles.gradientFill}>\n <View style={styles.contentContainer}>\n {iconDef ? (\n <FontAwesomeIcon icon={iconDef} size={ICON_SIZE[size]} color=\"white\" />\n ) : (\n <Text\n style={[styles.fallbackText, { fontSize: ICON_SIZE[size] }]}\n accessibilityLabel=\"Unknown icon\"\n allowFontScaling={false}\n >\n ?\n </Text>\n )}\n </View>\n </LinearGradient>\n </AvatarPrimitive.Mask>\n </AvatarPrimitive.Root>\n )\n}\n\nconst styles = StyleSheet.create({\n gradientFill: {\n width: '100%',\n height: '100%',\n },\n contentContainer: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n fallbackText: {\n color: 'white',\n fontWeight: 'bold',\n opacity: 0.7,\n },\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_group_chat_conversation_payload.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKzD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAc,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"use_group_chat_conversation_payload.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKzD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAc,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBjF;AAED,UAAU,4BAA6B,SAAQ,cAAc;IAC3D,IAAI,EAAE,8BAA8B,CAAA;IACpC,KAAK,EAAE,MAAM,CAAA;CACd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_group_chat_conversation_payload.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,0CAA0C;AAO/E,MAAM,UAAU,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAS;IAChF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,cAAc,OAAO,4BAA4B,CAAA;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAA4C;YAC/D,GAAG;YACH,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,8BAA8B;oBACpC,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC1B;aACF;SACF,CAAC;QACJ,SAAS,EAAE,aAAa;QACxB,OAAO;KACR,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiResource, ResourceObject } from '../../types'\nimport { useApiClient } from '../use_api_client'\n\nconst STALE_TIME_MS = 25 * 60 * 1000 // under Groups' 30-min server-side expiry\n\ninterface Props {\n groupId: number\n enabled?: boolean\n}\n\nexport function useGroupChatConversationPayload({ groupId, enabled = true }: Props) {\n const apiClient = useApiClient()\n const url = `/me/groups/${groupId}/chat_conversation_payload`\n\n const { data, ...rest } = useQuery({\n queryKey: ['groups', url],\n queryFn: () =>\n apiClient.groups.post<ApiResource<GroupChatConversationPayload>>({\n url,\n data: {\n data: {\n type: 'GroupChatConversationPayload',\n attributes: { title: '' },\n },\n },\n }),\n staleTime: STALE_TIME_MS,\n enabled,\n })\n\n return { payload: data?.data.value, ...rest }\n}\n\ninterface GroupChatConversationPayload extends ResourceObject {\n type: 'GroupChatConversationPayload'\n value: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use_group_chat_conversation_payload.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,0CAA0C;AAO/E,MAAM,UAAU,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAS;IAChF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,cAAc,OAAO,4BAA4B,CAAA;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAA4C;YAC/D,GAAG;YACH,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,8BAA8B;oBACpC,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC1B;aACF;SACF,CAAC;QACJ,SAAS,EAAE,aAAa;QACxB,cAAc,EAAE,QAAQ;QACxB,OAAO;KACR,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiResource, ResourceObject } from '../../types'\nimport { useApiClient } from '../use_api_client'\n\nconst STALE_TIME_MS = 25 * 60 * 1000 // under Groups' 30-min server-side expiry\n\ninterface Props {\n groupId: number\n enabled?: boolean\n}\n\nexport function useGroupChatConversationPayload({ groupId, enabled = true }: Props) {\n const apiClient = useApiClient()\n const url = `/me/groups/${groupId}/chat_conversation_payload`\n\n const { data, ...rest } = useQuery({\n queryKey: ['groups', url],\n queryFn: () =>\n apiClient.groups.post<ApiResource<GroupChatConversationPayload>>({\n url,\n data: {\n data: {\n type: 'GroupChatConversationPayload',\n attributes: { title: '' },\n },\n },\n }),\n staleTime: STALE_TIME_MS,\n refetchOnMount: 'always',\n enabled,\n })\n\n return { payload: data?.data.value, ...rest }\n}\n\ninterface GroupChatConversationPayload extends ResourceObject {\n type: 'GroupChatConversationPayload'\n value: string\n}\n"]}
|
package/build/hooks/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from './use_message_reaction_toggle';
|
|
|
16
16
|
export * from './use_new_conversation_entry';
|
|
17
17
|
export * from './use_organization';
|
|
18
18
|
export * from './use_people_person';
|
|
19
|
+
export * from './use_preview_avatar_diameter';
|
|
19
20
|
export * from './use_product_analytics';
|
|
20
21
|
export * from './use_qualified_by_age';
|
|
21
22
|
export * from './use_scalable_number_of_lines';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA"}
|
package/build/hooks/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from './use_message_reaction_toggle';
|
|
|
16
16
|
export * from './use_new_conversation_entry';
|
|
17
17
|
export * from './use_organization';
|
|
18
18
|
export * from './use_people_person';
|
|
19
|
+
export * from './use_preview_avatar_diameter';
|
|
19
20
|
export * from './use_product_analytics';
|
|
20
21
|
export * from './use_qualified_by_age';
|
|
21
22
|
export * from './use_scalable_number_of_lines';
|
package/build/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA","sourcesContent":["export * from './use_animated_message_background_color'\nexport { useApiClient } from './use_api_client'\nexport * from './use_api'\nexport * from './use_app_state'\nexport * from './use_async_storage'\nexport * from './use_at_font_scale_breakpoint'\nexport * from './use_chat_permissions'\nexport * from './use_create_android_ripple_color'\nexport * from './use_current_person'\nexport * from './use_deleting_ids'\nexport * from './use_font_scale'\nexport * from './use_groups_groups'\nexport * from './use_groups'\nexport * from './use_interaction_ghost_color'\nexport * from './use_message_reaction_toggle'\nexport * from './use_new_conversation_entry'\nexport * from './use_organization'\nexport * from './use_people_person'\nexport * from './use_product_analytics'\nexport * from './use_qualified_by_age'\nexport * from './use_scalable_number_of_lines'\nexport * from './use_submit_age_check'\nexport * from './use_suspense_api'\nexport * from './use_theme'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA","sourcesContent":["export * from './use_animated_message_background_color'\nexport { useApiClient } from './use_api_client'\nexport * from './use_api'\nexport * from './use_app_state'\nexport * from './use_async_storage'\nexport * from './use_at_font_scale_breakpoint'\nexport * from './use_chat_permissions'\nexport * from './use_create_android_ripple_color'\nexport * from './use_current_person'\nexport * from './use_deleting_ids'\nexport * from './use_font_scale'\nexport * from './use_groups_groups'\nexport * from './use_groups'\nexport * from './use_interaction_ghost_color'\nexport * from './use_message_reaction_toggle'\nexport * from './use_new_conversation_entry'\nexport * from './use_organization'\nexport * from './use_people_person'\nexport * from './use_preview_avatar_diameter'\nexport * from './use_product_analytics'\nexport * from './use_qualified_by_age'\nexport * from './use_scalable_number_of_lines'\nexport * from './use_submit_age_check'\nexport * from './use_suspense_api'\nexport * from './use_theme'\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use_preview_avatar_diameter.d.ts","sourceRoot":"","sources":["../../src/hooks/use_preview_avatar_diameter.ts"],"names":[],"mappings":"AAOA,wBAAgB,wBAAwB,WAIvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useWindowDimensions } from 'react-native';
|
|
2
|
+
import { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../utils';
|
|
3
|
+
import { useFontScale } from './use_font_scale';
|
|
4
|
+
const VIEWPORT_FRACTION = 0.22;
|
|
5
|
+
const BASE_DIAMETER = 80;
|
|
6
|
+
export function usePreviewAvatarDiameter() {
|
|
7
|
+
const { width } = useWindowDimensions();
|
|
8
|
+
const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK });
|
|
9
|
+
return Math.min(BASE_DIAMETER * fontScale, width * VIEWPORT_FRACTION);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=use_preview_avatar_diameter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use_preview_avatar_diameter.js","sourceRoot":"","sources":["../../src/hooks/use_preview_avatar_diameter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAC9B,MAAM,aAAa,GAAG,EAAE,CAAA;AAExB,MAAM,UAAU,wBAAwB;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,CAAA;IACvC,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,CAAC,CAAA;IAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,EAAE,KAAK,GAAG,iBAAiB,CAAC,CAAA;AACvE,CAAC","sourcesContent":["import { useWindowDimensions } from 'react-native'\nimport { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../utils'\nimport { useFontScale } from './use_font_scale'\n\nconst VIEWPORT_FRACTION = 0.22\nconst BASE_DIAMETER = 80\n\nexport function usePreviewAvatarDiameter() {\n const { width } = useWindowDimensions()\n const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK })\n return Math.min(BASE_DIAMETER * fontScale, width * VIEWPORT_FRACTION)\n}\n"]}
|
package/build/jest.js
CHANGED
package/build/jest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest.js","sourceRoot":"","sources":["../src/jest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mCAAmC;IACnC,
|
|
1
|
+
{"version":3,"file":"jest.js","sourceRoot":"","sources":["../src/jest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mCAAmC;IACnC,gCAAgC;IAChC,cAAc;CACf,CAAA","sourcesContent":["/**\n * Jest configuration helpers for consuming apps.\n *\n * Usage in jest.config.js:\n *\n * const { jestTransformPackages } = require('@planningcenter/chat-react-native/jest')\n *\n * const ignorePatterns = [\n * ...yourPatterns,\n * ...jestTransformPackages,\n * ].join('|')\n *\n * module.exports = {\n * transformIgnorePatterns: [`node_modules/(?!${ignorePatterns})`],\n * }\n */\nexport const jestTransformPackages = [\n '@planningcenter/chat-react-native',\n '@planningcenter/emoji-keyboard',\n '@fortawesome',\n]\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar_picker_screen.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_picker_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgB,iBAAiB,EAAiB,MAAM,0BAA0B,CAAA;AACzF,OAAO,KAAkC,MAAM,OAAO,CAAA;AAStD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4CAA4C,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar_picker_screen.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_picker_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgB,iBAAiB,EAAiB,MAAM,0BAA0B,CAAA;AACzF,OAAO,KAAkC,MAAM,OAAO,CAAA;AAStD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4CAA4C,CAAA;AAoBnD,eAAO,MAAM,yBAAyB,uEAMpC,CAAA;AAEF,eAAO,MAAM,+BAA+B,uEAM1C,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;IACtD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;CACvC,CAAC,CAAA;AAUF,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,qBAMpE"}
|
|
@@ -10,6 +10,8 @@ import { useTheme } from '../../hooks';
|
|
|
10
10
|
import { useConversation } from '../../hooks/use_conversation';
|
|
11
11
|
import { useConversationAvatarUpdate, } from '../../hooks/use_conversation_avatar_update';
|
|
12
12
|
import { useFontScale } from '../../hooks/use_font_scale';
|
|
13
|
+
import { usePreviewAvatarDiameter } from '../../hooks/use_preview_avatar_diameter';
|
|
14
|
+
import { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../utils';
|
|
13
15
|
import { avatarPickerReducer, initAvatarPickerState, initAvatarPickerStateFromPayload, initEmptyAvatarPickerState, } from './avatar_picker_state';
|
|
14
16
|
import { AvatarPreview } from './avatar_preview';
|
|
15
17
|
import { ColorPicker } from './color_picker';
|
|
@@ -47,6 +49,7 @@ function EditModeContent({ conversationId }) {
|
|
|
47
49
|
const navigation = useNavigation();
|
|
48
50
|
const { data: conversation } = useConversation({ conversation_id: conversationId });
|
|
49
51
|
const mutation = useConversationAvatarUpdate({ conversationId });
|
|
52
|
+
const previewDiameter = usePreviewAvatarDiameter();
|
|
50
53
|
const [state, dispatch] = useReducer(avatarPickerReducer, conversation, initAvatarPickerState);
|
|
51
54
|
const hasAvatar = state.selectedType !== null;
|
|
52
55
|
const handleDone = useCallback(() => {
|
|
@@ -70,7 +73,7 @@ function EditModeContent({ conversationId }) {
|
|
|
70
73
|
<FormSheet.HeaderTextButton onPress={handleDone} disabled={mutation.isPending}>
|
|
71
74
|
Done
|
|
72
75
|
</FormSheet.HeaderTextButton>
|
|
73
|
-
</>} fallbackPreview={<ConversationAvatar conversation={conversation} size="2xl"/>}/>);
|
|
76
|
+
</>} fallbackPreview={<ConversationAvatar conversation={conversation} size="2xl" maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK} style={{ width: previewDiameter, height: previewDiameter }}/>}/>);
|
|
74
77
|
}
|
|
75
78
|
function CreateModeContent({ sourceParams, existingSelection }) {
|
|
76
79
|
const navigation = useNavigation();
|
|
@@ -100,7 +103,7 @@ function AvatarPickerFormSheet({ state, dispatch, headerTitle, headerActions, fa
|
|
|
100
103
|
|
|
101
104
|
<AvatarPreview state={state} fallback={fallbackPreview}/>
|
|
102
105
|
|
|
103
|
-
<Tabs data={TABS} activeTab={state.activeTab} onTabPress={tab => dispatch({ type: 'SELECT_TAB', payload: tab })} renderItem={({ item }) => (<Text style={[styles.tabLabel, item === state.activeTab && styles.tabLabelActive]}>
|
|
106
|
+
<Tabs data={TABS} activeTab={state.activeTab} onTabPress={tab => dispatch({ type: 'SELECT_TAB', payload: tab })} renderItem={({ item }) => (<Text style={[styles.tabLabel, item === state.activeTab && styles.tabLabelActive]} maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}>
|
|
104
107
|
{TAB_LABELS[item]}
|
|
105
108
|
</Text>)} style={styles.tabs}/>
|
|
106
109
|
|
|
@@ -117,7 +120,11 @@ function AvatarPickerFormSheet({ state, dispatch, headerTitle, headerActions, fa
|
|
|
117
120
|
}
|
|
118
121
|
function EmptyAvatarPlaceholder() {
|
|
119
122
|
const styles = useStyles();
|
|
120
|
-
|
|
123
|
+
const diameter = usePreviewAvatarDiameter();
|
|
124
|
+
return (<View style={[
|
|
125
|
+
styles.emptyAvatarPlaceholder,
|
|
126
|
+
{ width: diameter, height: diameter, borderRadius: diameter / 2 },
|
|
127
|
+
]}/>);
|
|
121
128
|
}
|
|
122
129
|
function hasValidSelection(state) {
|
|
123
130
|
switch (state.selectedType) {
|
|
@@ -145,9 +152,7 @@ function buildPayload(state) {
|
|
|
145
152
|
}
|
|
146
153
|
const useStyles = () => {
|
|
147
154
|
const { colors } = useTheme();
|
|
148
|
-
const fontScale = useFontScale({ maxFontSizeMultiplier:
|
|
149
|
-
const uncappedFontScale = useFontScale();
|
|
150
|
-
const emptyAvatarDiameter = 80 * uncappedFontScale;
|
|
155
|
+
const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK });
|
|
151
156
|
return StyleSheet.create({
|
|
152
157
|
formSheetRoot: {
|
|
153
158
|
flex: 1,
|
|
@@ -181,9 +186,6 @@ const useStyles = () => {
|
|
|
181
186
|
borderTopColor: colors.borderColorDefaultBase,
|
|
182
187
|
},
|
|
183
188
|
emptyAvatarPlaceholder: {
|
|
184
|
-
width: emptyAvatarDiameter,
|
|
185
|
-
height: emptyAvatarDiameter,
|
|
186
|
-
borderRadius: emptyAvatarDiameter / 2,
|
|
187
189
|
borderWidth: 2,
|
|
188
190
|
borderStyle: 'dashed',
|
|
189
191
|
borderColor: colors.borderColorDefaultBase,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar_picker_screen.js","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_picker_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, { useCallback, useReducer } from 'react'\nimport { Platform, StyleSheet, View } from 'react-native'\nimport { ConversationAvatar } from '../../components/display/conversation_avatar'\nimport { Tabs } from '../../components/display/tabs'\nimport { Text } from '../../components/display/text'\nimport { coerceColorKey } from '../../components/display/utils/avatar_gradient_colors'\nimport FormSheet, { getFormSheetScreenOptions } from '../../components/primitive/form_sheet'\nimport { useTheme } from '../../hooks'\nimport { useConversation } from '../../hooks/use_conversation'\nimport {\n useConversationAvatarUpdate,\n type AvatarUpdatePayload,\n} from '../../hooks/use_conversation_avatar_update'\nimport { useFontScale } from '../../hooks/use_font_scale'\nimport type { ImagePickerAsset } from '../../utils/native_adapters/image_picker'\nimport {\n avatarPickerReducer,\n initAvatarPickerState,\n initAvatarPickerStateFromPayload,\n initEmptyAvatarPickerState,\n type AvatarPickerAction,\n type AvatarPickerState,\n type AvatarTab,\n} from './avatar_picker_state'\nimport { AvatarPreview } from './avatar_preview'\nimport { ColorPicker } from './color_picker'\nimport { EmojiTab } from './emoji_tab'\nimport { IconGrid } from './icon_grid'\nimport { UploadTab } from './upload_tab'\n\nexport const AvatarPickerScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'Update avatar',\n sheetAllowedDetents: Platform.select({\n android: [0.94],\n default: [1],\n }),\n})\n\nexport const AvatarPickerCreateScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'Choose avatar',\n sheetAllowedDetents: Platform.select({\n android: [0.94],\n default: [1],\n }),\n})\n\nexport type AvatarPickerScreenProps = StaticScreenProps<{\n conversation_id?: number\n source_params?: Record<string, unknown>\n avatar_selection?: AvatarUpdatePayload\n}>\n\nconst TABS: AvatarTab[] = ['icon', 'emoji', 'upload']\n\nconst TAB_LABELS: Record<AvatarTab, string> = {\n icon: 'Icon',\n emoji: 'Emoji',\n upload: 'Upload',\n}\n\nexport function AvatarPickerScreen({ route }: AvatarPickerScreenProps) {\n const { conversation_id, source_params, avatar_selection } = route.params\n if (conversation_id) {\n return <EditModeContent conversationId={conversation_id} />\n }\n return <CreateModeContent sourceParams={source_params} existingSelection={avatar_selection} />\n}\n\nfunction EditModeContent({ conversationId }: { conversationId: number }) {\n const navigation = useNavigation()\n const { data: conversation } = useConversation({ conversation_id: conversationId })\n const mutation = useConversationAvatarUpdate({ conversationId })\n\n const [state, dispatch] = useReducer(avatarPickerReducer, conversation, initAvatarPickerState)\n\n const hasAvatar = state.selectedType !== null\n\n const handleDone = useCallback(() => {\n if (!state.isDirty) {\n navigation.goBack()\n return\n }\n\n const payload = buildPayload(state)\n if (payload) {\n mutation.mutate(payload)\n }\n navigation.goBack()\n }, [state, mutation, navigation])\n\n const handleRemove = useCallback(() => {\n mutation.mutate({ kind: 'clear' }, { onSuccess: () => dispatch({ type: 'CLEAR' }) })\n }, [mutation, dispatch])\n\n return (\n <AvatarPickerFormSheet\n state={state}\n dispatch={dispatch}\n headerTitle=\"Update avatar\"\n headerActions={\n <>\n {hasAvatar && (\n <FormSheet.HeaderTextButton onPress={handleRemove} appearance=\"danger\">\n Remove\n </FormSheet.HeaderTextButton>\n )}\n <FormSheet.HeaderTextButton onPress={handleDone} disabled={mutation.isPending}>\n Done\n </FormSheet.HeaderTextButton>\n </>\n }\n fallbackPreview={<ConversationAvatar conversation={conversation} size=\"2xl\" />}\n />\n )\n}\n\ninterface CreateModeContentProps {\n sourceParams?: Record<string, unknown>\n existingSelection?: AvatarUpdatePayload\n}\n\nfunction CreateModeContent({ sourceParams, existingSelection }: CreateModeContentProps) {\n const navigation = useNavigation()\n\n const [state, dispatch] = useReducer(avatarPickerReducer, existingSelection, selection =>\n selection ? initAvatarPickerStateFromPayload(selection) : initEmptyAvatarPickerState()\n )\n\n const handleDone = useCallback(() => {\n if (!state.isDirty) {\n navigation.goBack()\n return\n }\n\n const payload = buildPayload(state)\n if (payload) {\n navigation.dispatch(\n StackActions.popTo('ConversationNew', { ...sourceParams, avatar_selection: payload })\n )\n } else {\n navigation.goBack()\n }\n }, [state, navigation, sourceParams])\n\n return (\n <AvatarPickerFormSheet\n state={state}\n dispatch={dispatch}\n headerTitle=\"Choose avatar\"\n headerActions={\n <FormSheet.HeaderTextButton onPress={handleDone}>Done</FormSheet.HeaderTextButton>\n }\n fallbackPreview={<EmptyAvatarPlaceholder />}\n />\n )\n}\n\ninterface AvatarPickerFormSheetProps {\n state: AvatarPickerState\n dispatch: React.Dispatch<AvatarPickerAction>\n headerTitle: string\n headerActions: React.ReactNode\n fallbackPreview: React.ReactNode\n}\n\nfunction AvatarPickerFormSheet({\n state,\n dispatch,\n headerTitle,\n headerActions,\n fallbackPreview,\n}: AvatarPickerFormSheetProps) {\n const styles = useStyles()\n\n return (\n <FormSheet.Root style={styles.formSheetRoot} contentStyle={styles.formSheetContent}>\n <FormSheet.Header>\n <FormSheet.HeaderTitle>{headerTitle}</FormSheet.HeaderTitle>\n <FormSheet.HeaderActions>{headerActions}</FormSheet.HeaderActions>\n </FormSheet.Header>\n\n <AvatarPreview state={state} fallback={fallbackPreview} />\n\n <Tabs\n data={TABS}\n activeTab={state.activeTab}\n onTabPress={tab => dispatch({ type: 'SELECT_TAB', payload: tab })}\n renderItem={({ item }) => (\n <Text style={[styles.tabLabel, item === state.activeTab && styles.tabLabelActive]}>\n {TAB_LABELS[item]}\n </Text>\n )}\n style={styles.tabs}\n />\n\n <View style={styles.body}>\n {state.activeTab === 'icon' && (\n <IconGrid\n selectedIconKey={state.selectedType === 'icon' ? state.selectedKey : null}\n onIconSelect={iconKey => dispatch({ type: 'SELECT_ICON', payload: iconKey })}\n />\n )}\n {state.activeTab === 'emoji' && (\n <EmojiTab onEmojiSelect={emoji => dispatch({ type: 'SELECT_EMOJI', payload: emoji })} />\n )}\n {state.activeTab === 'upload' && (\n <UploadTab\n imagePreviewUri={state.imagePreviewUri}\n onImageSelect={asset => dispatch({ type: 'SET_IMAGE', payload: asset })}\n />\n )}\n </View>\n\n {state.activeTab !== 'upload' && (\n <View style={styles.colorPickerWrapper}>\n <ColorPicker\n selectedColor={state.selectedColor}\n onColorSelect={color => dispatch({ type: 'SELECT_COLOR', payload: color })}\n />\n </View>\n )}\n </FormSheet.Root>\n )\n}\n\nfunction EmptyAvatarPlaceholder() {\n const styles = useStyles()\n return <View style={styles.emptyAvatarPlaceholder} />\n}\n\ntype ValidAvatarPickerState = AvatarPickerState &\n (\n | { selectedType: 'icon' | 'emoji'; selectedKey: string }\n | { selectedType: 'image'; imageAsset: ImagePickerAsset }\n )\n\nfunction hasValidSelection(state: AvatarPickerState): state is ValidAvatarPickerState {\n switch (state.selectedType) {\n case 'icon':\n case 'emoji':\n return state.selectedKey !== null\n case 'image':\n return state.imageAsset !== null\n case null:\n return false\n }\n}\n\nfunction buildPayload(state: AvatarPickerState): AvatarUpdatePayload | null {\n if (!hasValidSelection(state)) return null\n\n const color = coerceColorKey(state.selectedColor)\n\n switch (state.selectedType) {\n case 'icon':\n return { kind: 'icon', key: state.selectedKey, color }\n case 'emoji':\n return { kind: 'emoji', key: state.selectedKey, color }\n case 'image':\n return { kind: 'image', imageAsset: state.imageAsset, color }\n }\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier: 1.3 })\n const uncappedFontScale = useFontScale()\n const emptyAvatarDiameter = 80 * uncappedFontScale\n\n return StyleSheet.create({\n formSheetRoot: {\n flex: 1,\n },\n formSheetContent: {\n flex: 1,\n },\n tabs: {\n minHeight: 52 * fontScale,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n backgroundColor: colors.fillColorNeutral100Inverted,\n zIndex: 1,\n },\n tabLabel: {\n fontSize: 14,\n color: colors.textColorDefaultSecondary,\n paddingVertical: 14 * fontScale,\n minWidth: 56 * fontScale,\n textAlign: 'center',\n },\n tabLabelActive: {\n color: colors.textColorDefaultPrimary,\n },\n body: {\n flex: 1,\n overflow: 'hidden',\n },\n colorPickerWrapper: {\n borderTopWidth: 1,\n borderTopColor: colors.borderColorDefaultBase,\n },\n emptyAvatarPlaceholder: {\n width: emptyAvatarDiameter,\n height: emptyAvatarDiameter,\n borderRadius: emptyAvatarDiameter / 2,\n borderWidth: 2,\n borderStyle: 'dashed',\n borderColor: colors.borderColorDefaultBase,\n },\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"avatar_picker_screen.js","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_picker_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, { useCallback, useReducer } from 'react'\nimport { Platform, StyleSheet, View } from 'react-native'\nimport { ConversationAvatar } from '../../components/display/conversation_avatar'\nimport { Tabs } from '../../components/display/tabs'\nimport { Text } from '../../components/display/text'\nimport { coerceColorKey } from '../../components/display/utils/avatar_gradient_colors'\nimport FormSheet, { getFormSheetScreenOptions } from '../../components/primitive/form_sheet'\nimport { useTheme } from '../../hooks'\nimport { useConversation } from '../../hooks/use_conversation'\nimport {\n useConversationAvatarUpdate,\n type AvatarUpdatePayload,\n} from '../../hooks/use_conversation_avatar_update'\nimport { useFontScale } from '../../hooks/use_font_scale'\nimport { usePreviewAvatarDiameter } from '../../hooks/use_preview_avatar_diameter'\nimport { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../utils'\nimport type { ImagePickerAsset } from '../../utils/native_adapters/image_picker'\nimport {\n avatarPickerReducer,\n initAvatarPickerState,\n initAvatarPickerStateFromPayload,\n initEmptyAvatarPickerState,\n type AvatarPickerAction,\n type AvatarPickerState,\n type AvatarTab,\n} from './avatar_picker_state'\nimport { AvatarPreview } from './avatar_preview'\nimport { ColorPicker } from './color_picker'\nimport { EmojiTab } from './emoji_tab'\nimport { IconGrid } from './icon_grid'\nimport { UploadTab } from './upload_tab'\n\nexport const AvatarPickerScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'Update avatar',\n sheetAllowedDetents: Platform.select({\n android: [0.94],\n default: [1],\n }),\n})\n\nexport const AvatarPickerCreateScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'Choose avatar',\n sheetAllowedDetents: Platform.select({\n android: [0.94],\n default: [1],\n }),\n})\n\nexport type AvatarPickerScreenProps = StaticScreenProps<{\n conversation_id?: number\n source_params?: Record<string, unknown>\n avatar_selection?: AvatarUpdatePayload\n}>\n\nconst TABS: AvatarTab[] = ['icon', 'emoji', 'upload']\n\nconst TAB_LABELS: Record<AvatarTab, string> = {\n icon: 'Icon',\n emoji: 'Emoji',\n upload: 'Upload',\n}\n\nexport function AvatarPickerScreen({ route }: AvatarPickerScreenProps) {\n const { conversation_id, source_params, avatar_selection } = route.params\n if (conversation_id) {\n return <EditModeContent conversationId={conversation_id} />\n }\n return <CreateModeContent sourceParams={source_params} existingSelection={avatar_selection} />\n}\n\nfunction EditModeContent({ conversationId }: { conversationId: number }) {\n const navigation = useNavigation()\n const { data: conversation } = useConversation({ conversation_id: conversationId })\n const mutation = useConversationAvatarUpdate({ conversationId })\n const previewDiameter = usePreviewAvatarDiameter()\n\n const [state, dispatch] = useReducer(avatarPickerReducer, conversation, initAvatarPickerState)\n\n const hasAvatar = state.selectedType !== null\n\n const handleDone = useCallback(() => {\n if (!state.isDirty) {\n navigation.goBack()\n return\n }\n\n const payload = buildPayload(state)\n if (payload) {\n mutation.mutate(payload)\n }\n navigation.goBack()\n }, [state, mutation, navigation])\n\n const handleRemove = useCallback(() => {\n mutation.mutate({ kind: 'clear' }, { onSuccess: () => dispatch({ type: 'CLEAR' }) })\n }, [mutation, dispatch])\n\n return (\n <AvatarPickerFormSheet\n state={state}\n dispatch={dispatch}\n headerTitle=\"Update avatar\"\n headerActions={\n <>\n {hasAvatar && (\n <FormSheet.HeaderTextButton onPress={handleRemove} appearance=\"danger\">\n Remove\n </FormSheet.HeaderTextButton>\n )}\n <FormSheet.HeaderTextButton onPress={handleDone} disabled={mutation.isPending}>\n Done\n </FormSheet.HeaderTextButton>\n </>\n }\n fallbackPreview={\n <ConversationAvatar\n conversation={conversation}\n size=\"2xl\"\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n style={{ width: previewDiameter, height: previewDiameter }}\n />\n }\n />\n )\n}\n\ninterface CreateModeContentProps {\n sourceParams?: Record<string, unknown>\n existingSelection?: AvatarUpdatePayload\n}\n\nfunction CreateModeContent({ sourceParams, existingSelection }: CreateModeContentProps) {\n const navigation = useNavigation()\n\n const [state, dispatch] = useReducer(avatarPickerReducer, existingSelection, selection =>\n selection ? initAvatarPickerStateFromPayload(selection) : initEmptyAvatarPickerState()\n )\n\n const handleDone = useCallback(() => {\n if (!state.isDirty) {\n navigation.goBack()\n return\n }\n\n const payload = buildPayload(state)\n if (payload) {\n navigation.dispatch(\n StackActions.popTo('ConversationNew', { ...sourceParams, avatar_selection: payload })\n )\n } else {\n navigation.goBack()\n }\n }, [state, navigation, sourceParams])\n\n return (\n <AvatarPickerFormSheet\n state={state}\n dispatch={dispatch}\n headerTitle=\"Choose avatar\"\n headerActions={\n <FormSheet.HeaderTextButton onPress={handleDone}>Done</FormSheet.HeaderTextButton>\n }\n fallbackPreview={<EmptyAvatarPlaceholder />}\n />\n )\n}\n\ninterface AvatarPickerFormSheetProps {\n state: AvatarPickerState\n dispatch: React.Dispatch<AvatarPickerAction>\n headerTitle: string\n headerActions: React.ReactNode\n fallbackPreview: React.ReactNode\n}\n\nfunction AvatarPickerFormSheet({\n state,\n dispatch,\n headerTitle,\n headerActions,\n fallbackPreview,\n}: AvatarPickerFormSheetProps) {\n const styles = useStyles()\n\n return (\n <FormSheet.Root style={styles.formSheetRoot} contentStyle={styles.formSheetContent}>\n <FormSheet.Header>\n <FormSheet.HeaderTitle>{headerTitle}</FormSheet.HeaderTitle>\n <FormSheet.HeaderActions>{headerActions}</FormSheet.HeaderActions>\n </FormSheet.Header>\n\n <AvatarPreview state={state} fallback={fallbackPreview} />\n\n <Tabs\n data={TABS}\n activeTab={state.activeTab}\n onTabPress={tab => dispatch({ type: 'SELECT_TAB', payload: tab })}\n renderItem={({ item }) => (\n <Text\n style={[styles.tabLabel, item === state.activeTab && styles.tabLabelActive]}\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n >\n {TAB_LABELS[item]}\n </Text>\n )}\n style={styles.tabs}\n />\n\n <View style={styles.body}>\n {state.activeTab === 'icon' && (\n <IconGrid\n selectedIconKey={state.selectedType === 'icon' ? state.selectedKey : null}\n onIconSelect={iconKey => dispatch({ type: 'SELECT_ICON', payload: iconKey })}\n />\n )}\n {state.activeTab === 'emoji' && (\n <EmojiTab onEmojiSelect={emoji => dispatch({ type: 'SELECT_EMOJI', payload: emoji })} />\n )}\n {state.activeTab === 'upload' && (\n <UploadTab\n imagePreviewUri={state.imagePreviewUri}\n onImageSelect={asset => dispatch({ type: 'SET_IMAGE', payload: asset })}\n />\n )}\n </View>\n\n {state.activeTab !== 'upload' && (\n <View style={styles.colorPickerWrapper}>\n <ColorPicker\n selectedColor={state.selectedColor}\n onColorSelect={color => dispatch({ type: 'SELECT_COLOR', payload: color })}\n />\n </View>\n )}\n </FormSheet.Root>\n )\n}\n\nfunction EmptyAvatarPlaceholder() {\n const styles = useStyles()\n const diameter = usePreviewAvatarDiameter()\n return (\n <View\n style={[\n styles.emptyAvatarPlaceholder,\n { width: diameter, height: diameter, borderRadius: diameter / 2 },\n ]}\n />\n )\n}\n\ntype ValidAvatarPickerState = AvatarPickerState &\n (\n | { selectedType: 'icon' | 'emoji'; selectedKey: string }\n | { selectedType: 'image'; imageAsset: ImagePickerAsset }\n )\n\nfunction hasValidSelection(state: AvatarPickerState): state is ValidAvatarPickerState {\n switch (state.selectedType) {\n case 'icon':\n case 'emoji':\n return state.selectedKey !== null\n case 'image':\n return state.imageAsset !== null\n case null:\n return false\n }\n}\n\nfunction buildPayload(state: AvatarPickerState): AvatarUpdatePayload | null {\n if (!hasValidSelection(state)) return null\n\n const color = coerceColorKey(state.selectedColor)\n\n switch (state.selectedType) {\n case 'icon':\n return { kind: 'icon', key: state.selectedKey, color }\n case 'emoji':\n return { kind: 'emoji', key: state.selectedKey, color }\n case 'image':\n return { kind: 'image', imageAsset: state.imageAsset, color }\n }\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK })\n\n return StyleSheet.create({\n formSheetRoot: {\n flex: 1,\n },\n formSheetContent: {\n flex: 1,\n },\n tabs: {\n minHeight: 52 * fontScale,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultBase,\n backgroundColor: colors.fillColorNeutral100Inverted,\n zIndex: 1,\n },\n tabLabel: {\n fontSize: 14,\n color: colors.textColorDefaultSecondary,\n paddingVertical: 14 * fontScale,\n minWidth: 56 * fontScale,\n textAlign: 'center',\n },\n tabLabelActive: {\n color: colors.textColorDefaultPrimary,\n },\n body: {\n flex: 1,\n overflow: 'hidden',\n },\n colorPickerWrapper: {\n borderTopWidth: 1,\n borderTopColor: colors.borderColorDefaultBase,\n },\n emptyAvatarPlaceholder: {\n borderWidth: 2,\n borderStyle: 'dashed',\n borderColor: colors.borderColorDefaultBase,\n },\n })\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar_preview.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar_preview.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAA;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA8BD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,qBAIpE"}
|
|
@@ -3,20 +3,27 @@ import { StyleSheet, View } from 'react-native';
|
|
|
3
3
|
import { EmojiAvatar } from '../../components/display/emoji_avatar';
|
|
4
4
|
import { IconAvatar } from '../../components/display/icon_avatar';
|
|
5
5
|
import AvatarPrimitive from '../../components/primitive/avatar_primitive';
|
|
6
|
-
|
|
6
|
+
import { usePreviewAvatarDiameter } from '../../hooks/use_preview_avatar_diameter';
|
|
7
|
+
import { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../utils';
|
|
8
|
+
function getPreviewNode(state, diameter) {
|
|
9
|
+
const sizeProps = {
|
|
10
|
+
size: '2xl',
|
|
11
|
+
maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK,
|
|
12
|
+
style: { width: diameter, height: diameter },
|
|
13
|
+
};
|
|
7
14
|
switch (state.selectedType) {
|
|
8
15
|
case 'icon':
|
|
9
16
|
if (!state.selectedKey)
|
|
10
17
|
return null;
|
|
11
|
-
return <IconAvatar iconKey={state.selectedKey} color={state.selectedColor}
|
|
18
|
+
return <IconAvatar iconKey={state.selectedKey} color={state.selectedColor} {...sizeProps}/>;
|
|
12
19
|
case 'emoji':
|
|
13
20
|
if (!state.selectedKey)
|
|
14
21
|
return null;
|
|
15
|
-
return <EmojiAvatar emoji={state.selectedKey} color={state.selectedColor}
|
|
22
|
+
return <EmojiAvatar emoji={state.selectedKey} color={state.selectedColor} {...sizeProps}/>;
|
|
16
23
|
case 'image':
|
|
17
24
|
if (!state.imagePreviewUri)
|
|
18
25
|
return null;
|
|
19
|
-
return (<AvatarPrimitive.Root
|
|
26
|
+
return (<AvatarPrimitive.Root {...sizeProps}>
|
|
20
27
|
<AvatarPrimitive.Mask>
|
|
21
28
|
<AvatarPrimitive.Image sourceUri={state.imagePreviewUri}/>
|
|
22
29
|
</AvatarPrimitive.Mask>
|
|
@@ -26,7 +33,8 @@ function getPreviewNode(state) {
|
|
|
26
33
|
}
|
|
27
34
|
}
|
|
28
35
|
export function AvatarPreview({ state, fallback }) {
|
|
29
|
-
const
|
|
36
|
+
const diameter = usePreviewAvatarDiameter();
|
|
37
|
+
const preview = getPreviewNode(state, diameter);
|
|
30
38
|
return <View style={styles.container}>{preview ?? fallback}</View>;
|
|
31
39
|
}
|
|
32
40
|
const styles = StyleSheet.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar_preview.js","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACjE,OAAO,eAAe,MAAM,6CAA6C,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar_preview.js","sourceRoot":"","sources":["../../../src/screens/avatar_picker/avatar_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACjE,OAAO,eAAe,MAAM,6CAA6C,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAA;AAQ/D,SAAS,cAAc,CAAC,KAAwB,EAAE,QAAgB;IAChE,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,KAAK;QACX,qBAAqB,EAAE,iCAAiC;QACxD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;KACpC,CAAA;IAEV,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3B,KAAK,MAAM;YACT,IAAI,CAAC,KAAK,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YACnC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,EAAG,CAAA;QAC9F,KAAK,OAAO;YACV,IAAI,CAAC,KAAK,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YACnC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,EAAG,CAAA;QAC7F,KAAK,OAAO;YACV,IAAI,CAAC,KAAK,CAAC,eAAe;gBAAE,OAAO,IAAI,CAAA;YACvC,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAClC;UAAA,CAAC,eAAe,CAAC,IAAI,CACnB;YAAA,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAC1D;UAAA,EAAE,eAAe,CAAC,IAAI,CACxB;QAAA,EAAE,eAAe,CAAC,IAAI,CAAC,CACxB,CAAA;QACH;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAsB;IACnE,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAA;IAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC/C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;KAClB;CACF,CAAC,CAAA","sourcesContent":["import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport { EmojiAvatar } from '../../components/display/emoji_avatar'\nimport { IconAvatar } from '../../components/display/icon_avatar'\nimport AvatarPrimitive from '../../components/primitive/avatar_primitive'\nimport { usePreviewAvatarDiameter } from '../../hooks/use_preview_avatar_diameter'\nimport { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../utils'\nimport type { AvatarPickerState } from './avatar_picker_state'\n\ninterface AvatarPreviewProps {\n state: AvatarPickerState\n fallback: React.ReactNode\n}\n\nfunction getPreviewNode(state: AvatarPickerState, diameter: number): React.ReactNode {\n const sizeProps = {\n size: '2xl',\n maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK,\n style: { width: diameter, height: diameter },\n } as const\n\n switch (state.selectedType) {\n case 'icon':\n if (!state.selectedKey) return null\n return <IconAvatar iconKey={state.selectedKey} color={state.selectedColor} {...sizeProps} />\n case 'emoji':\n if (!state.selectedKey) return null\n return <EmojiAvatar emoji={state.selectedKey} color={state.selectedColor} {...sizeProps} />\n case 'image':\n if (!state.imagePreviewUri) return null\n return (\n <AvatarPrimitive.Root {...sizeProps}>\n <AvatarPrimitive.Mask>\n <AvatarPrimitive.Image sourceUri={state.imagePreviewUri} />\n </AvatarPrimitive.Mask>\n </AvatarPrimitive.Root>\n )\n default:\n return null\n }\n}\n\nexport function AvatarPreview({ state, fallback }: AvatarPreviewProps) {\n const diameter = usePreviewAvatarDiameter()\n const preview = getPreviewNode(state, diameter)\n return <View style={styles.container}>{preview ?? fallback}</View>\n}\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n paddingTop: 24,\n paddingBottom: 16,\n },\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji_tab.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/emoji_tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"emoji_tab.d.ts","sourceRoot":"","sources":["../../../src/screens/avatar_picker/emoji_tab.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAA;AAW1C,UAAU,aAAa;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC;AAED,wBAAgB,QAAQ,CAAC,EAAE,aAAa,EAAE,EAAE,aAAa,qBAyDxD"}
|