@planningcenter/chat-react-native 3.38.1-rc.0 → 3.38.1-rc.1
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/screens/avatar_picker/avatar_picker_screen.d.ts.map +1 -1
- package/build/screens/avatar_picker/avatar_picker_screen.js +11 -10
- package/build/screens/avatar_picker/avatar_picker_screen.js.map +1 -1
- package/package.json +2 -2
- package/src/screens/avatar_picker/avatar_picker_screen.tsx +15 -10
|
@@ -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;
|
|
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;AAUtD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4CAA4C,CAAA;AAoBnD,eAAO,MAAM,yBAAyB,uEAIpC,CAAA;AAEF,eAAO,MAAM,+BAA+B,uEAI1C,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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { StackActions, useNavigation } from '@react-navigation/native';
|
|
2
2
|
import React, { useCallback, useReducer } from 'react';
|
|
3
3
|
import { Platform, StyleSheet, View } from 'react-native';
|
|
4
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
4
5
|
import { ConversationAvatar } from '../../components/display/conversation_avatar';
|
|
5
6
|
import { Tabs } from '../../components/display/tabs';
|
|
6
7
|
import { Text } from '../../components/display/text';
|
|
@@ -20,17 +21,13 @@ import { IconGrid } from './icon_grid';
|
|
|
20
21
|
import { UploadTab } from './upload_tab';
|
|
21
22
|
export const AvatarPickerScreenOptions = getFormSheetScreenOptions({
|
|
22
23
|
headerTitle: 'Update avatar',
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
default: [1],
|
|
26
|
-
}),
|
|
24
|
+
presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),
|
|
25
|
+
sheetAllowedDetents: [1],
|
|
27
26
|
});
|
|
28
27
|
export const AvatarPickerCreateScreenOptions = getFormSheetScreenOptions({
|
|
29
28
|
headerTitle: 'Choose avatar',
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
default: [1],
|
|
33
|
-
}),
|
|
29
|
+
presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),
|
|
30
|
+
sheetAllowedDetents: [1],
|
|
34
31
|
});
|
|
35
32
|
const TABS = ['icon', 'emoji', 'upload'];
|
|
36
33
|
const TAB_LABELS = {
|
|
@@ -95,8 +92,8 @@ function CreateModeContent({ sourceParams, existingSelection }) {
|
|
|
95
92
|
}
|
|
96
93
|
function AvatarPickerFormSheet({ state, dispatch, headerTitle, headerActions, fallbackPreview, }) {
|
|
97
94
|
const styles = useStyles();
|
|
98
|
-
return (<FormSheet.Root style={styles.formSheetRoot} contentStyle={styles.formSheetContent}>
|
|
99
|
-
<FormSheet.Header>
|
|
95
|
+
return (<FormSheet.Root style={styles.formSheetRoot} contentStyle={styles.formSheetContent} showAndroidSheetGrabber={false}>
|
|
96
|
+
<FormSheet.Header style={styles.header}>
|
|
100
97
|
<FormSheet.HeaderTitle>{headerTitle}</FormSheet.HeaderTitle>
|
|
101
98
|
<FormSheet.HeaderActions>{headerActions}</FormSheet.HeaderActions>
|
|
102
99
|
</FormSheet.Header>
|
|
@@ -153,6 +150,7 @@ function buildPayload(state) {
|
|
|
153
150
|
const useStyles = () => {
|
|
154
151
|
const { colors } = useTheme();
|
|
155
152
|
const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK });
|
|
153
|
+
const { top } = useSafeAreaInsets();
|
|
156
154
|
return StyleSheet.create({
|
|
157
155
|
formSheetRoot: {
|
|
158
156
|
flex: 1,
|
|
@@ -160,6 +158,9 @@ const useStyles = () => {
|
|
|
160
158
|
formSheetContent: {
|
|
161
159
|
flex: 1,
|
|
162
160
|
},
|
|
161
|
+
header: {
|
|
162
|
+
paddingTop: Platform.select({ ios: 20, android: 20 + top }),
|
|
163
|
+
},
|
|
163
164
|
tabs: {
|
|
164
165
|
minHeight: 52 * fontScale,
|
|
165
166
|
borderBottomWidth: 1,
|
|
@@ -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 { 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
|
+
{"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 { useSafeAreaInsets } from 'react-native-safe-area-context'\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 presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),\n sheetAllowedDetents: [1],\n})\n\nexport const AvatarPickerCreateScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'Choose avatar',\n presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),\n sheetAllowedDetents: [1],\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\n style={styles.formSheetRoot}\n contentStyle={styles.formSheetContent}\n showAndroidSheetGrabber={false}\n >\n <FormSheet.Header style={styles.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 const { top } = useSafeAreaInsets()\n\n return StyleSheet.create({\n formSheetRoot: {\n flex: 1,\n },\n formSheetContent: {\n flex: 1,\n },\n header: {\n paddingTop: Platform.select({ ios: 20, android: 20 + top }),\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "3.38.1-rc.
|
|
3
|
+
"version": "3.38.1-rc.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"react-native": "./src/index.tsx",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"react-native-url-polyfill": "^2.0.0",
|
|
73
73
|
"typescript": "~5.9.2"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "594da00f76ed17255cd11b6128be8687e3219e6c"
|
|
76
76
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'
|
|
2
2
|
import React, { useCallback, useReducer } from 'react'
|
|
3
3
|
import { Platform, StyleSheet, View } from 'react-native'
|
|
4
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
4
5
|
import { ConversationAvatar } from '../../components/display/conversation_avatar'
|
|
5
6
|
import { Tabs } from '../../components/display/tabs'
|
|
6
7
|
import { Text } from '../../components/display/text'
|
|
@@ -33,18 +34,14 @@ import { UploadTab } from './upload_tab'
|
|
|
33
34
|
|
|
34
35
|
export const AvatarPickerScreenOptions = getFormSheetScreenOptions({
|
|
35
36
|
headerTitle: 'Update avatar',
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
default: [1],
|
|
39
|
-
}),
|
|
37
|
+
presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),
|
|
38
|
+
sheetAllowedDetents: [1],
|
|
40
39
|
})
|
|
41
40
|
|
|
42
41
|
export const AvatarPickerCreateScreenOptions = getFormSheetScreenOptions({
|
|
43
42
|
headerTitle: 'Choose avatar',
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
default: [1],
|
|
47
|
-
}),
|
|
43
|
+
presentation: Platform.select({ android: 'modal', ios: 'formSheet' }),
|
|
44
|
+
sheetAllowedDetents: [1],
|
|
48
45
|
})
|
|
49
46
|
|
|
50
47
|
export type AvatarPickerScreenProps = StaticScreenProps<{
|
|
@@ -184,8 +181,12 @@ function AvatarPickerFormSheet({
|
|
|
184
181
|
const styles = useStyles()
|
|
185
182
|
|
|
186
183
|
return (
|
|
187
|
-
<FormSheet.Root
|
|
188
|
-
|
|
184
|
+
<FormSheet.Root
|
|
185
|
+
style={styles.formSheetRoot}
|
|
186
|
+
contentStyle={styles.formSheetContent}
|
|
187
|
+
showAndroidSheetGrabber={false}
|
|
188
|
+
>
|
|
189
|
+
<FormSheet.Header style={styles.header}>
|
|
189
190
|
<FormSheet.HeaderTitle>{headerTitle}</FormSheet.HeaderTitle>
|
|
190
191
|
<FormSheet.HeaderActions>{headerActions}</FormSheet.HeaderActions>
|
|
191
192
|
</FormSheet.Header>
|
|
@@ -286,6 +287,7 @@ function buildPayload(state: AvatarPickerState): AvatarUpdatePayload | null {
|
|
|
286
287
|
const useStyles = () => {
|
|
287
288
|
const { colors } = useTheme()
|
|
288
289
|
const fontScale = useFontScale({ maxFontSizeMultiplier: MAX_FONT_SIZE_MULTIPLIER_LANDMARK })
|
|
290
|
+
const { top } = useSafeAreaInsets()
|
|
289
291
|
|
|
290
292
|
return StyleSheet.create({
|
|
291
293
|
formSheetRoot: {
|
|
@@ -294,6 +296,9 @@ const useStyles = () => {
|
|
|
294
296
|
formSheetContent: {
|
|
295
297
|
flex: 1,
|
|
296
298
|
},
|
|
299
|
+
header: {
|
|
300
|
+
paddingTop: Platform.select({ ios: 20, android: 20 + top }),
|
|
301
|
+
},
|
|
297
302
|
tabs: {
|
|
298
303
|
minHeight: 52 * fontScale,
|
|
299
304
|
borderBottomWidth: 1,
|