diff --git a/app/containers/Chip/Chip.stories.tsx b/app/containers/Chip/Chip.stories.tsx index d81eaf0ed24..eb2563fa02b 100644 --- a/app/containers/Chip/Chip.stories.tsx +++ b/app/containers/Chip/Chip.stories.tsx @@ -15,9 +15,9 @@ export default { title: 'Chip' }; -const ChipWrapped = ({ avatar, text, onPress, testID, style }: IChip) => ( +const ChipWrapped = ({ avatar, text, onPress, testID, style, fullWidth }: IChip) => ( - + ); @@ -30,3 +30,5 @@ export const ChipWithoutAvatar = () => ; export const ChipWithoutAvatarAndIcon = () => ; + +export const ChipFullWidth = () => ; diff --git a/app/containers/Chip/__snapshots__/Chip.test.tsx.snap b/app/containers/Chip/__snapshots__/Chip.test.tsx.snap index 97e0d22a80b..e34fd48920c 100644 --- a/app/containers/Chip/__snapshots__/Chip.test.tsx.snap +++ b/app/containers/Chip/__snapshots__/Chip.test.tsx.snap @@ -1,5 +1,108 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Story Snapshots: ChipFullWidth should match snapshot 1`] = ` + + + + + + Full Width Text With Long Text That Should Be Wrapped + + + + + +`; + exports[`Story Snapshots: ChipText should match snapshot 1`] = ` ; + fullWidth?: boolean; } -const Chip = ({ avatar, text, onPress, testID, style }: IChip) => { +const Chip = ({ avatar, text, onPress, testID, style, fullWidth }: IChip) => { const { colors } = useTheme(); return ( @@ -49,7 +50,8 @@ const Chip = ({ avatar, text, onPress, testID, style }: IChip) => { style={({ pressed }) => [ styles.pressable, { - backgroundColor: pressed ? colors.surfaceNeutral : colors.surfaceHover + backgroundColor: pressed ? colors.surfaceNeutral : colors.surfaceHover, + maxWidth: fullWidth ? undefined : styles.pressable.maxWidth }, style ]} @@ -60,7 +62,7 @@ const Chip = ({ avatar, text, onPress, testID, style }: IChip) => { }}> {avatar ? : null} - + {text} diff --git a/app/containers/RoomItem/RoomItem.stories.tsx b/app/containers/RoomItem/RoomItem.stories.tsx index 962de2ab91d..026c0b56f8f 100644 --- a/app/containers/RoomItem/RoomItem.stories.tsx +++ b/app/containers/RoomItem/RoomItem.stories.tsx @@ -189,3 +189,10 @@ export const OmnichannelIcon = () => ( ); + +export const InvitedRoom = () => ( + <> + + + +); diff --git a/app/containers/RoomItem/RoomItem.tsx b/app/containers/RoomItem/RoomItem.tsx index 3b6454fbbc6..2c6ea72ccea 100644 --- a/app/containers/RoomItem/RoomItem.tsx +++ b/app/containers/RoomItem/RoomItem.tsx @@ -16,6 +16,8 @@ import { type IRoomItemProps } from './interfaces'; import { formatLastMessage } from '../../lib/methods/formatLastMessage'; import useStatusAccessibilityLabel from '../../lib/hooks/useStatusAccessibilityLabel'; import { useResponsiveLayout } from '../../lib/hooks/useResponsiveLayout/useResponsiveLayout'; +import { CustomIcon } from '../CustomIcon'; +import { useTheme } from '../../theme'; const RoomItem = ({ rid, @@ -53,10 +55,12 @@ const RoomItem = ({ displayMode, sourceType, hideMentionStatus, - accessibilityDate + accessibilityDate, + isInvited }: IRoomItemProps) => { 'use memo'; + const { colors } = useTheme(); const { isLargeFontScale } = useResponsiveLayout(); const memoizedMessage = useMemo( () => formatLastMessage({ lastMessage, username, useRealName, showLastMessage, alert, type }), @@ -137,6 +141,15 @@ const RoomItem = ({ hideMentionStatus={hideMentionStatus} hideUnreadStatus={hideUnreadStatus} /> + {isInvited ? ( + + ) : null} {isLargeFontScale ? : null} @@ -156,6 +169,15 @@ const RoomItem = ({ /> {autoJoin ? <Tag name={I18n.t('Auto-join')} /> : null} + {isInvited ? ( + <CustomIcon + size={24} + name='mail' + role='status' + accessibilityLabel={I18n.t('Invited')} + color={colors.badgeBackgroundLevel2} + /> + ) : null} <View style={styles.wrapUpdatedAndBadge}> {isLargeFontScale ? null : <UpdatedAt date={date} hideUnreadStatus={hideUnreadStatus} alert={alert} />} diff --git a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap index d71134badb7..5c1b513dc86 100644 --- a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap +++ b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap @@ -13850,6 +13850,1313 @@ exports[`Story Snapshots: ExpandedRoomItemWithoutAvatar should match snapshot 1` ] `; +exports[`Story Snapshots: InvitedRoom should match snapshot 1`] = ` +[ + <View + collapsable={false} + > + <View + pointerEvents="box-none" + style={ + [ + { + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "backgroundColor": "#1D74F5", + "right": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "height": 75, + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Mark read" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={127} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + </View> + <View + pointerEvents="box-none" + style={ + [ + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "height": 75, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#8E6300", + "left": "100%", + "width": 750, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Favorite" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={128} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#8E6300", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#9EA2A8", + "left": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 80, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Hide" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={129} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#9EA2A8", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + <View + style={ + { + "transform": [ + { + "translateX": 0, + }, + ], + } + } + > + <RNGestureHandlerButton + activeOpacity={1} + collapsable={false} + delayLongPress={600} + handlerTag={130} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + rippleColor="#E4E7EA" + style={ + [ + { + "backgroundColor": "#FFFFFF", + "borderRadius": undefined, + "margin": undefined, + "marginBottom": undefined, + "marginEnd": undefined, + "marginHorizontal": undefined, + "marginLeft": undefined, + "marginRight": undefined, + "marginStart": undefined, + "marginTop": undefined, + "marginVertical": undefined, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="#E4E7EA" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "#E4E7EA", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <View + style={{}} + > + <View + accessibilityLabel="rocket.cat. private channel. undefined. " + accessibilityRole="button" + accessible={true} + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "paddingLeft": 14, + }, + { + "height": 75, + }, + ] + } + > + <View + accessibilityLabel="rocket.cat's avatar" + accessible={true} + style={ + [ + { + "borderRadius": 4, + "height": 48, + "width": 48, + }, + { + "marginRight": 10, + }, + ] + } + testID="avatar" + > + <ViewManagerAdapter_ExpoImage + borderRadius={4} + containerViewRef={"[React.ref]"} + contentFit="cover" + contentPosition={ + { + "left": "50%", + "top": "50%", + } + } + height={48} + nativeViewRef={"[React.ref]"} + onError={[Function]} + onLoad={[Function]} + onLoadStart={[Function]} + onProgress={[Function]} + placeholder={[]} + priority="high" + source={ + [ + { + "headers": { + "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)", + }, + "uri": "https://open.rocket.chat/avatar/rocket.cat?format=png&size=96", + }, + ] + } + style={ + { + "borderRadius": 4, + "height": 48, + "width": 48, + } + } + transition={null} + width={48} + /> + </View> + <View + style={ + [ + { + "borderBottomWidth": 0.5, + "flex": 1, + "paddingRight": 14, + "paddingVertical": 10, + }, + { + "borderColor": "#CBCED1", + }, + ] + } + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + "width": "100%", + }, + { + "flex": 1, + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 22, + }, + [ + { + "lineHeight": 22, + }, + [ + { + "marginRight": 4, + }, + { + "marginRight": 8, + }, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "flex": 1, + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "500", + "textAlign": "left", + }, + undefined, + { + "color": "#1F2329", + }, + ] + } + > + rocket.cat + </Text> + <Text + accessibilityLabel="Invited" + allowFontScaling={false} + role="status" + selectable={false} + style={ + [ + { + "color": "#1D74F5", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <View + style={ + { + "alignItems": "flex-end", + } + } + > + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "400", + "marginLeft": 4, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + undefined, + ] + } + > + 10:00 + </Text> + </View> + </View> + </View> + </View> + </View> + </RNGestureHandlerButton> + </View> + </View>, + <View + collapsable={false} + > + <View + pointerEvents="box-none" + style={ + [ + { + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "backgroundColor": "#1D74F5", + "right": "100%", + "width": 1500, + }, + { + "height": 60, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "height": 60, + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Mark read" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={131} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + </View> + <View + pointerEvents="box-none" + style={ + [ + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "height": 60, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#8E6300", + "left": "100%", + "width": 750, + }, + { + "height": 60, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Favorite" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={132} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#8E6300", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#9EA2A8", + "left": "100%", + "width": 1500, + }, + { + "height": 60, + }, + { + "transform": [ + { + "translateX": 80, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Hide" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={133} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#9EA2A8", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + <View + style={ + { + "transform": [ + { + "translateX": 0, + }, + ], + } + } + > + <RNGestureHandlerButton + activeOpacity={1} + collapsable={false} + delayLongPress={600} + handlerTag={134} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + rippleColor="#E4E7EA" + style={ + [ + { + "backgroundColor": "#FFFFFF", + "borderRadius": undefined, + "margin": undefined, + "marginBottom": undefined, + "marginEnd": undefined, + "marginHorizontal": undefined, + "marginLeft": undefined, + "marginRight": undefined, + "marginStart": undefined, + "marginTop": undefined, + "marginVertical": undefined, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="#E4E7EA" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "#E4E7EA", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <View + style={{}} + > + <View + accessibilityLabel="rocket.cat. private channel. undefined. " + accessibilityRole="button" + accessible={true} + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "paddingLeft": 14, + }, + { + "height": 60, + }, + ] + } + > + <View + accessibilityLabel="rocket.cat's avatar" + accessible={true} + style={ + [ + { + "borderRadius": 4, + "height": 36, + "width": 36, + }, + { + "marginRight": 10, + }, + ] + } + testID="avatar" + > + <ViewManagerAdapter_ExpoImage + borderRadius={4} + containerViewRef={"[React.ref]"} + contentFit="cover" + contentPosition={ + { + "left": "50%", + "top": "50%", + } + } + height={36} + nativeViewRef={"[React.ref]"} + onError={[Function]} + onLoad={[Function]} + onLoadStart={[Function]} + onProgress={[Function]} + placeholder={[]} + priority="high" + source={ + [ + { + "headers": { + "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)", + }, + "uri": "https://open.rocket.chat/avatar/rocket.cat?format=png&size=72", + }, + ] + } + style={ + { + "borderRadius": 4, + "height": 36, + "width": 36, + } + } + transition={null} + width={36} + /> + </View> + <View + style={ + [ + { + "borderBottomWidth": 0.5, + "flex": 1, + "paddingRight": 14, + "paddingVertical": 10, + }, + { + "borderColor": "#CBCED1", + }, + ] + } + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + "width": "100%", + }, + { + "flex": 1, + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 22, + }, + [ + { + "lineHeight": 22, + }, + [ + { + "marginRight": 4, + }, + { + "marginRight": 8, + }, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "flex": 1, + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "500", + "textAlign": "left", + }, + undefined, + { + "color": "#1F2329", + }, + ] + } + > + rocket.cat + </Text> + <Text + accessibilityLabel="Invited" + allowFontScaling={false} + role="status" + selectable={false} + style={ + [ + { + "color": "#1D74F5", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <View + style={ + { + "alignItems": "flex-end", + } + } + > + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "400", + "marginLeft": 4, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + undefined, + ] + } + > + 10:00 + </Text> + </View> + </View> + </View> + </View> + </View> + </RNGestureHandlerButton> + </View> + </View>, +] +`; + exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` [ <View @@ -13921,7 +15228,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={127} + handlerTag={139} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14040,7 +15347,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={128} + handlerTag={140} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14142,7 +15449,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={129} + handlerTag={141} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14228,7 +15535,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={130} + handlerTag={142} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14575,7 +15882,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={131} + handlerTag={143} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14694,7 +16001,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={132} + handlerTag={144} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14796,7 +16103,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={133} + handlerTag={145} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -14882,7 +16189,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={134} + handlerTag={146} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -15229,7 +16536,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={135} + handlerTag={147} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -15348,7 +16655,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={136} + handlerTag={148} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -15450,7 +16757,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={137} + handlerTag={149} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -15536,7 +16843,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={138} + handlerTag={150} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -15883,7 +17190,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={139} + handlerTag={151} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16002,7 +17309,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={140} + handlerTag={152} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16104,7 +17411,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={141} + handlerTag={153} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16190,7 +17497,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={142} + handlerTag={154} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16537,7 +17844,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={143} + handlerTag={155} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16656,7 +17963,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={144} + handlerTag={156} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16758,7 +18065,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={145} + handlerTag={157} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -16844,7 +18151,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={146} + handlerTag={158} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -17247,7 +18554,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={147} + handlerTag={159} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -17366,7 +18673,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={148} + handlerTag={160} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -17468,7 +18775,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={149} + handlerTag={161} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -17554,7 +18861,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={150} + handlerTag={162} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -17957,7 +19264,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={151} + handlerTag={163} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18076,7 +19383,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={152} + handlerTag={164} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18178,7 +19485,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={153} + handlerTag={165} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18264,7 +19571,7 @@ exports[`Story Snapshots: LastMessage should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={154} + handlerTag={166} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18672,7 +19979,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={169} + handlerTag={181} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18791,7 +20098,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={170} + handlerTag={182} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18893,7 +20200,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={171} + handlerTag={183} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -18979,7 +20286,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={172} + handlerTag={184} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -19295,7 +20602,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={173} + handlerTag={185} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -19414,7 +20721,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={174} + handlerTag={186} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -19516,7 +20823,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={175} + handlerTag={187} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -19602,7 +20909,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={176} + handlerTag={188} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -19918,7 +21225,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={177} + handlerTag={189} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20037,7 +21344,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={178} + handlerTag={190} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20139,7 +21446,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={179} + handlerTag={191} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20225,7 +21532,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={180} + handlerTag={192} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20541,7 +21848,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={181} + handlerTag={193} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20660,7 +21967,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={182} + handlerTag={194} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20762,7 +22069,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={183} + handlerTag={195} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -20848,7 +22155,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={184} + handlerTag={196} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21164,7 +22471,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={185} + handlerTag={197} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21283,7 +22590,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={186} + handlerTag={198} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21385,7 +22692,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={187} + handlerTag={199} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21471,7 +22778,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={188} + handlerTag={200} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21787,7 +23094,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={189} + handlerTag={201} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -21906,7 +23213,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={190} + handlerTag={202} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22008,7 +23315,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={191} + handlerTag={203} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22094,7 +23401,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={192} + handlerTag={204} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22410,7 +23717,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={193} + handlerTag={205} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22529,7 +23836,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={194} + handlerTag={206} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22631,7 +23938,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={195} + handlerTag={207} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -22717,7 +24024,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={196} + handlerTag={208} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23033,7 +24340,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={197} + handlerTag={209} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23152,7 +24459,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={198} + handlerTag={210} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23254,7 +24561,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={199} + handlerTag={211} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23340,7 +24647,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={200} + handlerTag={212} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23656,7 +24963,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={201} + handlerTag={213} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23775,7 +25082,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={202} + handlerTag={214} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23877,7 +25184,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={203} + handlerTag={215} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -23963,7 +25270,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={204} + handlerTag={216} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -24279,7 +25586,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={205} + handlerTag={217} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -24398,7 +25705,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={206} + handlerTag={218} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -24500,7 +25807,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={207} + handlerTag={219} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -24586,7 +25893,7 @@ exports[`Story Snapshots: OmnichannelIcon should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={208} + handlerTag={220} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -24907,7 +26214,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={229} + handlerTag={241} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25026,7 +26333,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={230} + handlerTag={242} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25128,7 +26435,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={231} + handlerTag={243} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25214,7 +26521,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={232} + handlerTag={244} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25566,7 +26873,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={233} + handlerTag={245} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25685,7 +26992,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={234} + handlerTag={246} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25787,7 +27094,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={235} + handlerTag={247} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -25873,7 +27180,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={236} + handlerTag={248} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -26257,7 +27564,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={237} + handlerTag={249} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -26376,7 +27683,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={238} + handlerTag={250} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -26478,7 +27785,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={239} + handlerTag={251} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -26564,7 +27871,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={240} + handlerTag={252} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -26916,7 +28223,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={241} + handlerTag={253} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27035,7 +28342,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={242} + handlerTag={254} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27137,7 +28444,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={243} + handlerTag={255} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27223,7 +28530,7 @@ exports[`Story Snapshots: Tag should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={244} + handlerTag={256} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27611,7 +28918,7 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={253} + handlerTag={265} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27730,7 +29037,7 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={254} + handlerTag={266} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27832,7 +29139,7 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={255} + handlerTag={267} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -27918,7 +29225,7 @@ exports[`Story Snapshots: Touch should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={256} + handlerTag={268} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28238,7 +29545,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={259} + handlerTag={271} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28357,7 +29664,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={260} + handlerTag={272} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28459,7 +29766,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={261} + handlerTag={273} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28545,7 +29852,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={262} + handlerTag={274} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28868,7 +30175,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={263} + handlerTag={275} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -28987,7 +30294,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={264} + handlerTag={276} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29089,7 +30396,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={265} + handlerTag={277} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29175,7 +30482,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={266} + handlerTag={278} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29491,7 +30798,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={267} + handlerTag={279} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29610,7 +30917,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={268} + handlerTag={280} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29712,7 +31019,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={269} + handlerTag={281} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -29798,7 +31105,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={270} + handlerTag={282} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30114,7 +31421,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={271} + handlerTag={283} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30233,7 +31540,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={272} + handlerTag={284} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30335,7 +31642,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={273} + handlerTag={285} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30421,7 +31728,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={274} + handlerTag={286} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30737,7 +32044,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={275} + handlerTag={287} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30856,7 +32163,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={276} + handlerTag={288} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -30958,7 +32265,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={277} + handlerTag={289} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31044,7 +32351,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={278} + handlerTag={290} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31360,7 +32667,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={279} + handlerTag={291} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31479,7 +32786,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={280} + handlerTag={292} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31581,7 +32888,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={281} + handlerTag={293} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31667,7 +32974,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={282} + handlerTag={294} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -31983,7 +33290,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={283} + handlerTag={295} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32102,7 +33409,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={284} + handlerTag={296} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32204,7 +33511,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={285} + handlerTag={297} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32290,7 +33597,7 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={286} + handlerTag={298} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32611,7 +33918,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={301} + handlerTag={313} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32730,7 +34037,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={302} + handlerTag={314} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32832,7 +34139,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={303} + handlerTag={315} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32918,7 +34225,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={304} + handlerTag={316} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33241,7 +34548,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={305} + handlerTag={317} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33360,7 +34667,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={306} + handlerTag={318} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33462,7 +34769,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={307} + handlerTag={319} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33548,7 +34855,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={308} + handlerTag={320} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} diff --git a/app/containers/RoomItem/index.tsx b/app/containers/RoomItem/index.tsx index dd135367976..0f0d8058f60 100644 --- a/app/containers/RoomItem/index.tsx +++ b/app/containers/RoomItem/index.tsx @@ -5,6 +5,7 @@ import { isGroupChat } from '../../lib/methods/helpers'; import { formatDate, formatDateAccessibility } from '../../lib/methods/helpers/room'; import { type IRoomItemContainerProps } from './interfaces'; import RoomItem from './RoomItem'; +import { isInviteSubscription } from '../../lib/methods/isInviteSubscription'; const attrs = ['width', 'isFocused', 'showLastMessage', 'autoJoin', 'showAvatar', 'displayMode']; @@ -61,6 +62,7 @@ const RoomItemContainer = React.memo( name={name} avatar={avatar} isGroupChat={isGroupChat(item)} + isInvited={isInviteSubscription(item)} isRead={isRead} onPress={handleOnPress} onLongPress={handleOnLongPress} diff --git a/app/containers/RoomItem/interfaces.ts b/app/containers/RoomItem/interfaces.ts index fc26c2663cf..fa382c21568 100644 --- a/app/containers/RoomItem/interfaces.ts +++ b/app/containers/RoomItem/interfaces.ts @@ -107,6 +107,7 @@ export interface IRoomItemProps extends IBaseRoomItem { testID: string; status: TUserStatus; isGroupChat: boolean; + isInvited?: boolean; isRead: boolean; teamMain: boolean; date: string; diff --git a/app/definitions/ISubscription.ts b/app/definitions/ISubscription.ts index 17e09f329a1..cfade80e10e 100644 --- a/app/definitions/ISubscription.ts +++ b/app/definitions/ISubscription.ts @@ -116,6 +116,12 @@ export interface ISubscription { uploads: RelationModified<TUploadModel>; disableNotifications?: boolean; federated?: boolean; + inviter?: Required<Pick<IUser, '_id' | 'username'>> & Pick<IUser, 'name'>; +} + +export interface IInviteSubscription extends ISubscription { + status: 'INVITED'; + inviter: NonNullable<ISubscription['inviter']>; } export type TSubscriptionModel = ISubscription & diff --git a/app/definitions/rest/v1/rooms.ts b/app/definitions/rest/v1/rooms.ts index 2da03ec4539..fdb75dbc5d0 100644 --- a/app/definitions/rest/v1/rooms.ts +++ b/app/definitions/rest/v1/rooms.ts @@ -54,6 +54,9 @@ export type RoomsEndpoints = { success: boolean; }; }; + 'rooms.invite': { + POST: (params: { roomId: string; action: 'accept' | 'reject' }) => void; + }; }; export type TRoomsMediaResponse = { diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index c2779f0df04..2b782cb1420 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -195,6 +195,7 @@ "error-invalid-file-type": "نوع الملف غير صالح", "error-invalid-password": "كلمة مرور خاطئة", "error-invalid-room-name": "{{room_name}} اسم الغرفة غير صالح", + "error-invitation-reply-action": "خطأ أثناء إرسال رد الدعوة", "error-not-allowed": "غير مسموح", "error-save-image": "خطأ عند حفظ الصورة", "error-save-video": "خطأ عند حفظ الفيديو", @@ -255,6 +256,11 @@ "Invite_user_to_join_channel_all_from": "دعوة جميع المستخدمين من [‎#channel] إلى الانضمام إلى هذه القناة", "Invite_user_to_join_channel_all_to": "دعوة جميع المستخدمين من هذه القناة إلى الانضمام إلى [‎#channel]", "Invite_users": "دعوة المستخدمين", + "Invited": "مدعو", + "invited_room_description_channel": "تمت دعوتك بواسطة", + "invited_room_description_dm": "تمت دعوتك لإجراء محادثة مع", + "invited_room_title_channel": "دعوة للانضمام إلى {{room_name}}", + "invited_room_title_dm": "طلب رسالة", "IP": " عنوان بروتوكول الإنترنت (الآيبي)", "is_typing": "يكتب", "Join": "انضم", @@ -443,6 +449,7 @@ "Record_audio_message": "تسجيل رسالة صوتية", "Register": "تسجيل", "Registration_Succeeded": "تم التسجيل بنجاح", + "reject": "رفض", "Remove": "حذف", "remove": "حذف", "Remove_from_workspace_history": "إزالة من سجل مساحة العمل", diff --git a/app/i18n/locales/bn-IN.json b/app/i18n/locales/bn-IN.json index 55543988474..c7eaa1d30a5 100644 --- a/app/i18n/locales/bn-IN.json +++ b/app/i18n/locales/bn-IN.json @@ -299,6 +299,7 @@ "error-invalid-file-type": "অবৈধ ফাইল টাইপ", "error-invalid-password": "অবৈধ পাসওয়ার্ড", "error-invalid-room-name": "{{room_name}} একটি বৈধ রুম নয়", + "error-invitation-reply-action": "আমন্ত্রণের উত্তর পাঠাতে ত্রুটি", "error-not-allowed": "অনুমোদিত নয়", "error-not-permission-to-upload-file": "আপলোড করতে আপনার অনুমতি নেই", "error-save-image": "ছবি সংরক্ষণে সমস্যা হয়েছে", @@ -369,6 +370,11 @@ "Invalid_workspace_URL": "অবৈধ ওয়ার্কস্পেস URL", "Invite_Link": "আমন্ত্রণ লিঙ্ক", "Invite_users": "ব্যবহারকারীদের আমন্ত্রণ করুন", + "Invited": "আমন্ত্রিত", + "invited_room_description_channel": "আপনাকে আমন্ত্রণ জানিয়েছেন", + "invited_room_description_dm": "আপনাকে একটি কথোপকথনের জন্য আমন্ত্রণ জানানো হয়েছে", + "invited_room_title_channel": "{{room_name}} এ যোগদানের আমন্ত্রণ", + "invited_room_title_dm": "বার্তা অনুরোধ", "IP": "IP", "is_typing": "টাইপ করছে", "Jitsi_authentication_before_making_calls": "জিতসি কল করার আগে সত্যাপন প্রয়োজন হতে পারে। তাদের নীতি সম্পর্কে আরও জানতে, জিতসি ওয়েবসাইট দেখুন।", @@ -618,6 +624,7 @@ "Record_audio_message": "শব্দবার্তা রেকর্ড করুন", "Register": "নিবন্ধন করুন", "Registration_Succeeded": "নিবন্ধন সফল!", + "reject": "প্রত্যাখ্যান", "Remove": "মুছুন", "remove": "মুছুন", "Remove_from_room": "রুম থেকে সরান", diff --git a/app/i18n/locales/cs.json b/app/i18n/locales/cs.json index f208def25db..bb8669e8730 100644 --- a/app/i18n/locales/cs.json +++ b/app/i18n/locales/cs.json @@ -318,6 +318,7 @@ "error-invalid-file-type": "Neplatný typ souboru", "error-invalid-password": "Neplatné heslo", "error-invalid-room-name": "{{room_name}} není platný název místnosti", + "error-invitation-reply-action": "Chyba při odesílání odpovědi na pozvánku", "error-no-tokens-for-this-user": "Pro tohoto uživatele neexistují žádné tokeny", "error-not-allowed": "Nepovoleno", "error-not-permission-to-upload-file": "Nemáte oprávnění nahrávat soubory", @@ -397,6 +398,11 @@ "Invite_user_to_join_channel_all_from": "Pozvat všechny uživatele z [#channel], aby se připojili k tomuto kanálu", "Invite_user_to_join_channel_all_to": "Pozvat všechny uživatele z tohoto kanálu, aby se připojili ke [#channel]", "Invite_users": "Pozvat uživatele", + "Invited": "Pozván", + "invited_room_description_channel": "Byli jste pozváni uživatelem", + "invited_room_description_dm": "Byli jste pozváni k rozhovoru s", + "invited_room_title_channel": "Pozvánka k připojení k {{room_name}}", + "invited_room_title_dm": "Žádost o zprávu", "IP": "IP", "is_typing": "píše", "Italic": "kurzíva", @@ -662,6 +668,7 @@ "Recording_audio_in_progress": "Nahrávání zvukové zprávy", "Register": "Registrovat", "Registration_Succeeded": "Registrace byla úspěšná!", + "reject": "Odmítnout", "Remove": "Odstranit", "remove": "odstranit", "Remove_from_room": "Odebrat z místnosti", diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index 019cae092aa..64d1e4f2ee7 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -293,6 +293,7 @@ "error-invalid-file-type": "Ungültiger Dateityp", "error-invalid-password": "Ungültiges Passwort", "error-invalid-room-name": "{{room_name}} ist kein gültiger Room-Name", + "error-invitation-reply-action": "Fehler beim Senden der Einladungsantwort", "error-not-allowed": "Nicht erlaubt", "error-not-permission-to-upload-file": "Sie haben keine Berechtigung zum Hochladen von Dateien", "error-save-image": "Fehler beim Speichern des Bildes", @@ -365,6 +366,11 @@ "Invite_user_to_join_channel_all_from": "Alle Benutzer des Channels [#channel] einladen, diesem Channel zu folgen", "Invite_user_to_join_channel_all_to": "Alle Benutzer dieses Channels einladen, dem Channel [#channel] zu folgen", "Invite_users": "Benutzer einladen", + "Invited": "Eingeladen", + "invited_room_description_channel": "Sie wurden eingeladen von", + "invited_room_description_dm": "Sie wurden zu einem Gespräch eingeladen", + "invited_room_title_channel": "Einladung zum Beitritt zu {{room_name}}", + "invited_room_title_dm": "Nachrichtenanfrage", "IP": "IP", "is_typing": "schreibt", "Join": "Beitreten", @@ -605,6 +611,7 @@ "Record_audio_message": "Audioaufnahme aufzeichnen", "Register": "Registrieren", "Registration_Succeeded": "Registrierung erfolgreich!", + "reject": "Ablehnen", "Remove": "Entfernen", "remove": "entfernen", "Remove_from_room": "Aus dem Room entfernen", diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index a8157a29b8a..7cde36b99bb 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -337,6 +337,7 @@ "error-invalid-file-type": "Invalid file type", "error-invalid-password": "Invalid password", "error-invalid-room-name": "{{room_name}} is not a valid room name", + "error-invitation-reply-action": "Error while sending invitation reply", "error-no-tokens-for-this-user": "There are no tokens for this user", "error-not-allowed": "Not allowed", "error-not-permission-to-upload-file": "You don't have permission to upload files", @@ -416,6 +417,11 @@ "Invite_user_to_join_channel_all_from": "Invite all users from [#channel] to join this channel", "Invite_user_to_join_channel_all_to": "Invite all users from this channel to join [#channel]", "Invite_users": "Invite users", + "Invited": "Invited", + "invited_room_description_channel": "You've been invited by", + "invited_room_description_dm": "You've been invited to have a conversation with", + "invited_room_title_channel": "Invitation to join {{room_name}}", + "invited_room_title_dm": "Message request", "IP": "IP", "is_typing": "is typing", "Italic": "Italic", @@ -684,6 +690,7 @@ "Recording_audio_in_progress": "Recording audio message", "Register": "Register", "Registration_Succeeded": "Registration succeeded!", + "reject": "Reject", "Remove": "Remove", "remove": "remove", "Remove_from_room": "Remove from room", diff --git a/app/i18n/locales/es.json b/app/i18n/locales/es.json index e60f2c487db..28e449a8f29 100644 --- a/app/i18n/locales/es.json +++ b/app/i18n/locales/es.json @@ -160,6 +160,7 @@ "error-invalid-file-type": "El formato del archivo no es correcto", "error-invalid-password": "La contraseña no es correcta", "error-invalid-room-name": "No se puede asignar el nombre {{room_name}} a una sala.", + "error-invitation-reply-action": "Error al enviar respuesta de invitación", "error-not-allowed": "No permitido", "error-too-many-requests": "Error, demasiadas peticiones. Debes esperar {{seconds}} segundos antes de continuar. Por favor, sé paciente.", "error-you-are-last-owner": "Eres el único propietario existente. Debes establecer un nuevo propietario antes de abandonar la sala.", @@ -203,6 +204,12 @@ "Invite_user_to_join_channel": "Invitar a un usuario a unirse a este canal", "Invite_user_to_join_channel_all_from": "Invitar a todos los usuarios de [#channell] a que se unan a este canal", "Invite_user_to_join_channel_all_to": "Invitar a todos los usuarios de este canal a unirse a [#channel]", + "Invite_users": "Invitar usuarios", + "Invited": "Invitado", + "invited_room_description_channel": "Has sido invitado por", + "invited_room_description_dm": "Has sido invitado a tener una conversación con", + "invited_room_title_channel": "Invitación para unirse a {{room_name}}", + "invited_room_title_dm": "Solicitud de mensaje", "is_typing": "escribiendo", "Join": "Conectar", "Join_the_given_channel": "Unirse al canal dado", @@ -318,6 +325,7 @@ "Recently_used": "Recientemente usado", "Record_audio_message": "Grabar mensaje de audio", "Register": "Registrar", + "reject": "Rechazar", "Remove_from_workspace_history": "Eliminar del historial del espacio de trabajo", "Remove_someone_from_room": "Eliminar a alguien de la sala", "replies": "respuestas", diff --git a/app/i18n/locales/fi.json b/app/i18n/locales/fi.json index 13bcf9c1341..192533cc012 100644 --- a/app/i18n/locales/fi.json +++ b/app/i18n/locales/fi.json @@ -278,6 +278,7 @@ "error-invalid-file-type": "Virheellinen tiedostotyyppi", "error-invalid-password": "Virheellinen salasana", "error-invalid-room-name": "{{room_name}} ei ole kelvollinen huoneen nimi", + "error-invitation-reply-action": "Virhe kutsuun vastaamisen lähettämisessä", "error-not-allowed": "Ei sallittu", "error-not-permission-to-upload-file": "Sinulla ei ole oikeutta ladata tiedostoja", "error-save-image": "Virhe tallennettaessa kuvaa", @@ -347,6 +348,11 @@ "Invite_user_to_join_channel_all_from": "Kutsu kaikki käyttäjät kanavalta [#channel] liittymään tälle kanavalle", "Invite_user_to_join_channel_all_to": "Kutsu kaikki tämän kanavan käyttäjät liittymään kanavalle [#channel]", "Invite_users": "Kutsu käyttäjiä", + "Invited": "Kutsuttu", + "invited_room_description_channel": "Sinut on kutsuttu käyttäjän", + "invited_room_description_dm": "Sinut on kutsuttu keskustelemaan käyttäjän", + "invited_room_title_channel": "Kutsu liittyä {{room_name}}", + "invited_room_title_dm": "Viestipyyntö", "IP": "IP", "is_typing": "kirjoittaa", "Join": "Liity", @@ -580,6 +586,7 @@ "Record_audio_message": "Tallenna ääniviesti", "Register": "Rekisteröi", "Registration_Succeeded": "Rekisteröinti onnistui!", + "reject": "Hylkää", "Remove": "Poista", "remove": "poista", "Remove_from_room": "Poista huoneesta", diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 7fe4f69c73f..8d17aff1f10 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -244,6 +244,7 @@ "error-invalid-file-type": "Type de fichier invalide", "error-invalid-password": "Mot de passe incorrect", "error-invalid-room-name": "{{room_name}} n'est pas un nom de salon valide", + "error-invitation-reply-action": "Erreur lors de l'envoi de la réponse à l'invitation", "error-not-allowed": "Interdit", "error-not-permission-to-upload-file": "Vous n'êtes pas autorisé à envoyer des fichiers", "error-save-image": "Erreur lors de l'enregistrement de l'image", @@ -312,6 +313,11 @@ "Invite_user_to_join_channel_all_from": "Inviter tous les utilisateurs de [#channel] à rejoindre ce canal", "Invite_user_to_join_channel_all_to": "Inviter tous les utilisateurs de ce canal à rejoindre [#channel]", "Invite_users": "Inviter des utilisateurs", + "Invited": "Invité", + "invited_room_description_channel": "Vous avez été invité par", + "invited_room_description_dm": "Vous avez été invité à avoir une conversation avec", + "invited_room_title_channel": "Invitation à rejoindre {{room_name}}", + "invited_room_title_dm": "Demande de message", "IP": "IP", "is_typing": "est en train d'écrire", "Join": "Rejoindre", @@ -540,6 +546,7 @@ "Record_audio_message": "Enregistrer un message audio", "Register": "S'inscrire", "Registration_Succeeded": "Inscription réussie !", + "reject": "Rejeter", "Remove": "Supprimer", "remove": "supprimer", "Remove_from_room": "Retirer du salon", diff --git a/app/i18n/locales/hi-IN.json b/app/i18n/locales/hi-IN.json index 505935fe9d6..758612aacd1 100644 --- a/app/i18n/locales/hi-IN.json +++ b/app/i18n/locales/hi-IN.json @@ -299,6 +299,7 @@ "error-invalid-file-type": "अवैध फ़ाइल प्रकार", "error-invalid-password": "अवैध पासवर्ड", "error-invalid-room-name": "{{room_name}} एक वैध कमरा नाम नहीं है", + "error-invitation-reply-action": "आमंत्रण उत्तर भेजते समय त्रुटि", "error-not-allowed": "अनुमति नहीं है", "error-not-permission-to-upload-file": "आपको फ़ाइल अपलोड करने की अनुमति नहीं है", "error-save-image": "छवि सहेजते समय त्रुटि", @@ -369,6 +370,11 @@ "Invalid_workspace_URL": "अमान्य कार्यक्षेत्र URL", "Invite_Link": "निमंत्रण लिंक", "Invite_users": "उपयोगकर्ताओं को निमंत्रित करें", + "Invited": "आमंत्रित", + "invited_room_description_channel": "आपको आमंत्रित किया गया है", + "invited_room_description_dm": "आपको बातचीत करने के लिए आमंत्रित किया गया है", + "invited_room_title_channel": "{{room_name}} में शामिल होने का निमंत्रण", + "invited_room_title_dm": "संदेश अनुरोध", "IP": "आईपी", "is_typing": "टाइप कर रहा है", "Jitsi_authentication_before_making_calls": "कॉल करने से पहले जिट्सी को पहले से पहले प्रमाणीकरण की आवश्यकता हो सकती है। उनकी नीतियों के बारे में अधिक जानकारी प्राप्त करने के लिए, जिट्सी वेबसाइट पर जाएं।", @@ -618,6 +624,7 @@ "Record_audio_message": "ऑडियो संदेश रिकॉर्ड करें", "Register": "रजिस्टर", "Registration_Succeeded": "पंजीकरण सफल हुआ!", + "reject": "अस्वीकार", "Remove": "हटाएं", "remove": "हटाएं", "Remove_from_room": "कमरे से हटाएं", diff --git a/app/i18n/locales/hu.json b/app/i18n/locales/hu.json index 10628d7941b..0e561b31a27 100644 --- a/app/i18n/locales/hu.json +++ b/app/i18n/locales/hu.json @@ -299,6 +299,7 @@ "error-invalid-file-type": "Érvénytelen fájltípus", "error-invalid-password": "Érvénytelen jelszó", "error-invalid-room-name": "{{room_name}} nem érvényes szobanév", + "error-invitation-reply-action": "Hiba a meghívó válasz küldésekor", "error-not-allowed": "Nem engedélyezett", "error-not-permission-to-upload-file": "Nincs jogosultsága fájlok feltöltéséhez", "error-save-image": "Hiba a kép mentése közben", @@ -369,6 +370,11 @@ "Invalid_workspace_URL": "Érvénytelen munkaterület URL", "Invite_Link": "Meghívási hivatkozás", "Invite_users": "Felhasználók meghívása", + "Invited": "Meghívott", + "invited_room_description_channel": "Meghívottak", + "invited_room_description_dm": "Meghívottak beszélgetésre", + "invited_room_title_channel": "Meghívó a {{room_name}} csatlakozásához", + "invited_room_title_dm": "Üzenetkérés", "IP": "IP-cím", "is_typing": "éppen ír", "Jitsi_authentication_before_making_calls": "A Jitsi a hívások kezdeményezése előtt hitelesítést igényelhet. Ha többet szeretne megtudni az irányelveikről, látogasson el a Jitsi weboldalára.", @@ -619,6 +625,7 @@ "Record_audio_message": "Hangüzenet rögzítése", "Register": "Regisztráció", "Registration_Succeeded": "A regisztráció sikeres", + "reject": "Elutasít", "Remove": "Eltávolítás", "remove": "eltávolítás", "Remove_from_room": "Eltávolítás a szobából", diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index 0dbbc9b618c..7478b0eb589 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -219,6 +219,7 @@ "error-invalid-file-type": "Tipo di file non valido", "error-invalid-password": "Password non corretta", "error-invalid-room-name": "{{room_name}} non è un nome di stanza valido", + "error-invitation-reply-action": "Errore durante l'invio della risposta all'invito", "error-not-allowed": "Non permesso", "error-not-permission-to-upload-file": "Non hai l'autorizzazione per caricare file", "error-save-image": "Errore nel salvataggio dell'immagine", @@ -284,6 +285,11 @@ "Invite_user_to_join_channel_all_from": "Invita tutti gli utenti da [#channell] per unirsi a questo canale", "Invite_user_to_join_channel_all_to": "Invita tutti gli utenti di questo canale a unirsi [#channel]", "Invite_users": "Invita utenti", + "Invited": "Invitato", + "invited_room_description_channel": "Sei stato invitato da", + "invited_room_description_dm": "Sei stato invitato ad avere una conversazione con", + "invited_room_title_channel": "Invito a unirti a {{room_name}}", + "invited_room_title_dm": "Richiesta di messaggio", "IP": "Indirizzo IP", "is_typing": "sta scrivendo", "Join": "Entra", @@ -478,6 +484,7 @@ "Record_audio_message": "Registra messaggio audio", "Register": "Registrati", "Registration_Succeeded": "Registrazione completata!", + "reject": "Rifiuta", "Remove": "Rimuovi", "Remove_from_room": "Rimuovi dalla stanza", "Remove_from_workspace_history": "Rimuovi dalla cronologia dell'area di lavoro", diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 74a7f8ba6b9..b411d1f38d1 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -194,6 +194,7 @@ "error-invalid-file-type": "ファイルの種類が不正です", "error-invalid-password": "不正なパスワードです", "error-invalid-room-name": "{{room_name}}は正しいルーム名ではありません。", + "error-invitation-reply-action": "招待への返信送信中にエラーが発生しました", "error-not-allowed": "許可されていません。", "error-not-permission-to-upload-file": "ファイルをアップロードする権限がありません", "error-save-image": "画像の保存に失敗しました。", @@ -256,6 +257,11 @@ "Invite_user_to_join_channel_all_from": "[#channel]のすべてのユーザーをこのチャネルに招待", "Invite_user_to_join_channel_all_to": "このチャネルのすべてのユーザーを[#channel]に招待", "Invite_users": "ユーザーを招待", + "Invited": "招待済み", + "invited_room_description_channel": "招待されました", + "invited_room_description_dm": "会話に招待されました", + "invited_room_title_channel": "{{room_name}}への招待", + "invited_room_title_dm": "メッセージリクエスト", "IP": "IP", "is_typing": "が入力中", "Join": "参加", @@ -397,6 +403,7 @@ "Record_audio_message": "音声メッセージを記録する", "Register": "登録", "Registration_Succeeded": "登録が成功しました", + "reject": "拒否", "Remove_from_workspace_history": "ワークスペースの履歴から削除する", "Remove_someone_from_room": "ルームからいずれかのユーザーを削除", "replies": "返信", diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index 3ee4d220821..195bf9a0b4d 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -244,6 +244,7 @@ "error-invalid-file-type": "Ongeldig bestandstype", "error-invalid-password": "Ongeldig wachtwoord", "error-invalid-room-name": "{{room_name}} is geen geldige kamernaam", + "error-invitation-reply-action": "Fout bij het verzenden van uitnodigingsantwoord", "error-not-allowed": "Niet toegestaan", "error-not-permission-to-upload-file": "Je hebt geen toestemming om bestanden up te loaden", "error-save-image": "Fout bij het opslaan van afbeelding", @@ -312,6 +313,11 @@ "Invite_user_to_join_channel_all_from": "Nodig alle gebruikers van [#kanaal] uit om lid te worden van dit kanaal", "Invite_user_to_join_channel_all_to": "Alle gebruikers van dit kanaal uitnodigen om lid te worden van [#channel]", "Invite_users": "Gebruikers uitnodigen", + "Invited": "Uitgenodigd", + "invited_room_description_channel": "Je bent uitgenodigd door", + "invited_room_description_dm": "Je bent uitgenodigd om een gesprek te voeren met", + "invited_room_title_channel": "Uitnodiging om lid te worden van {{room_name}}", + "invited_room_title_dm": "Berichtverzoek", "IP": "IP", "is_typing": "is aan het typen", "Join": "Doe mee", @@ -540,6 +546,7 @@ "Record_audio_message": "Audiobericht opnemen", "Register": "Registreren", "Registration_Succeeded": "Registratie geslaagd!", + "reject": "Afwijzen", "Remove": "Verwijderen", "remove": "verwijderen", "Remove_from_room": "Verwijderen uit kamer", diff --git a/app/i18n/locales/nn.json b/app/i18n/locales/nn.json index dcf132c0910..b3607120999 100644 --- a/app/i18n/locales/nn.json +++ b/app/i18n/locales/nn.json @@ -156,6 +156,8 @@ "error-invalid-email": "Ugyldig e-post {{email}}", "error-invalid-file-type": "ugyldig filtype", "error-invalid-password": "Ugyldig passord", + "error-invalid-room-name": "{{room_name}} er ikke et godkjent romnavn", + "error-invitation-reply-action": "Feil ved sending av invitasjonssvar", "error-no-tokens-for-this-user": "Det er ingen tokens for denne brukeren", "error-not-allowed": "Ikke tillatt", "error-too-many-requests": "Feil, for mange forespørsler. Vennligst senke farten. Du må vente {{seconds}} sekunder før du prøver igjen.", @@ -192,6 +194,12 @@ "Invite_user_to_join_channel": "Be en bruker til å bli med på denne kanalen", "Invite_user_to_join_channel_all_from": "Inviter alle brukere fra [#kanal] for å bli med på denne kanalen", "Invite_user_to_join_channel_all_to": "Inviter alle brukere fra denne kanalen til å delta i [#kanal]", + "Invite_users": "Inviter brukere", + "Invited": "Invitert", + "invited_room_description_channel": "Du har blitt invitert av", + "invited_room_description_dm": "Du har blitt invitert til å ha ein samtale med", + "invited_room_title_channel": "Invitasjon til å bli med i {{room_name}}", + "invited_room_title_dm": "Meldingforespørsel", "IP": "IP", "is_typing": "skriver", "Italic": "Kursiv", @@ -283,6 +291,7 @@ "Quote": "Sitat", "Receive_Group_Mentions_Info": "Motta @all og @here nevner", "Register": "Registrer en ny konto", + "reject": "Avvis", "Remove": "Fjerne", "Remove_from_room": "Fjern fra rommet", "Remove_from_Team": "Fjern fra team", diff --git a/app/i18n/locales/no.json b/app/i18n/locales/no.json index 1505fdbcc80..f8b71710b9d 100644 --- a/app/i18n/locales/no.json +++ b/app/i18n/locales/no.json @@ -322,6 +322,7 @@ "error-invalid-file-type": "Ugyldig filtype", "error-invalid-password": "Ugyldig passord", "error-invalid-room-name": "{{room_name}} er ikke et godkjent romnavn", + "error-invitation-reply-action": "Feil ved sending av invitasjonssvar", "error-no-tokens-for-this-user": "Det er ingen tokens for denne brukeren", "error-not-allowed": "Ikke tillatt", "error-not-permission-to-upload-file": "Du har ikke tillatelse til å laste opp filer", @@ -392,6 +393,11 @@ "Invite_user_to_join_channel_all_from": "Inviter alle brukere fra [#channel] til å bli med i denne kanalen", "Invite_user_to_join_channel_all_to": "Inviter alle brukere fra denne kanalen til å bli med i [#channel]", "Invite_users": "Inviter brukere", + "Invited": "Invitert", + "invited_room_description_channel": "Du har blitt invitert av", + "invited_room_description_dm": "Du har blitt invitert til å ha en samtale med", + "invited_room_title_channel": "Invitasjon til å bli med i {{room_name}}", + "invited_room_title_dm": "Meldingforespørsel", "IP": "IP", "is_typing": "skriver", "Italic": "Kursiv", @@ -646,6 +652,7 @@ "Recording_audio_in_progress": "Tar opp lydmelding", "Register": "Register", "Registration_Succeeded": "Registreringen var vellykket!", + "reject": "Avvis", "Remove": "Fjerne", "remove": "fjerne", "Remove_from_room": "Fjern fra rommet", diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index e2eca7c1f85..93deb5bb7e4 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -328,6 +328,7 @@ "error-invalid-file-type": "Tipo de arquivo inválido", "error-invalid-password": "Senha inválida", "error-invalid-room-name": "{{room_name}} não é um nome de sala válido", + "error-invitation-reply-action": "Erro ao enviar resposta do convite", "error-no-tokens-for-this-user": "Não existem tokens para este usuário", "error-not-allowed": "Não permitido", "error-not-permission-to-upload-file": "Você não tem permissão para enviar arquivos", @@ -406,6 +407,11 @@ "Invite_user_to_join_channel_all_from": "Convidar todos os usuários de [#channel] para ingressar neste canal", "Invite_user_to_join_channel_all_to": "Convidar todos os usuários deste canal para ingressar no [#canal]", "Invite_users": "Convidar usuários", + "Invited": "Convidado", + "invited_room_description_channel": "Você foi convidado por", + "invited_room_description_dm": "Você foi convidado para ter uma conversa com", + "invited_room_title_channel": "Convite para participar de {{room_name}}", + "invited_room_title_dm": "Solicitação de mensagem", "IP": "IP", "is_typing": "está digitando", "Jitsi_authentication_before_making_calls": "Jitsi pode exigir autenticação antes de fazer chamadas. Para saber mais sobre suas políticas, visite o site do Jitsi.", @@ -671,6 +677,7 @@ "Record_audio_message": "Gravar mensagem de áudio", "Register": "Registrar", "Registration_Succeeded": "Registrado com sucesso!", + "reject": "Rejeitar", "Remove": "Remover", "remove": "remover", "Remove_from_room": "Remover do canal", diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index 7ee2fba8cfe..94f7625a314 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -190,6 +190,7 @@ "error-invalid-file-type": "Tipo de ficheiro inválido", "error-invalid-password": "Palavra-passe inválida", "error-invalid-room-name": "{{room_name}} não é um nome de sala válido", + "error-invitation-reply-action": "Erro ao enviar resposta do convite", "error-not-allowed": "Não permitido", "error-save-image": "Erro ao salvar imagem", "error-save-video": "Erro ao salvar vídeo", @@ -251,6 +252,11 @@ "Invite_user_to_join_channel_all_from": "Convide todos os utilizadores de [#channel] a participar deste canal", "Invite_user_to_join_channel_all_to": "Convide todos os utilizadores deste canal a participar [#canal]", "Invite_users": "Convidar utilizadores", + "Invited": "Convidado", + "invited_room_description_channel": "Foi convidado por", + "invited_room_description_dm": "Foi convidado para ter uma conversa com", + "invited_room_title_channel": "Convite para participar de {{room_name}}", + "invited_room_title_dm": "Pedido de mensagem", "IP": "IP", "is_typing": "está a escrever", "Join": "Entrar", @@ -410,6 +416,7 @@ "Recently_used": "Recentemente usado", "Record_audio_message": "Gravar mensagem de áudio", "Register": "Registar", + "reject": "Rejeitar", "Remove_from_workspace_history": "Remover do histórico do espaço de trabalho", "Remove_someone_from_room": "Remover alguém da sala", "Reply": "Responder", diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index eb9f96f2c0b..795bfa8cfe8 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -269,6 +269,7 @@ "error-invalid-file-type": "Неверный тип файла", "error-invalid-password": "Неверный пароль", "error-invalid-room-name": "{{room_name}} не является допустимым именем чата", + "error-invitation-reply-action": "Ошибка при отправке ответа на приглашение", "error-not-allowed": "Не допускается", "error-not-permission-to-upload-file": "У вас нет разрешения на загрузку файлов", "error-save-image": "Ошибка при попытке сохранить изображение", @@ -337,6 +338,11 @@ "Invite_user_to_join_channel_all_from": "Пригласить всех пользователей из [#channel] присоединиться к этому каналу", "Invite_user_to_join_channel_all_to": "Пригласить всех пользователей этого канала присоединиться к [#channel]", "Invite_users": "Приглашение пользователей", + "Invited": "Приглашен", + "invited_room_description_channel": "Вас пригласил", + "invited_room_description_dm": "Вас пригласили на беседу с", + "invited_room_title_channel": "Приглашение присоединиться к {{room_name}}", + "invited_room_title_dm": "Запрос сообщения", "IP": "IP", "is_typing": "печатает", "Join": "Присоединиться", @@ -570,6 +576,7 @@ "Record_audio_message": "Записать голосовое сообщение", "Register": "Зарегистрировать", "Registration_Succeeded": "Регистрация Успешна!", + "reject": "Отклонить", "Remove": "Удалить", "remove": "удалить", "Remove_from_room": "Удалить из чата", diff --git a/app/i18n/locales/sl-SI.json b/app/i18n/locales/sl-SI.json index 3b88d057d73..35942071711 100644 --- a/app/i18n/locales/sl-SI.json +++ b/app/i18n/locales/sl-SI.json @@ -255,6 +255,7 @@ "error-invalid-file-type": "Neveljavna vrsta datoteke", "error-invalid-password": "Neveljavno geslo", "error-invalid-room-name": "{{room_name}} ni veljavno ime sobe", + "error-invitation-reply-action": "Napaka pri pošiljanju odgovora na povabilo", "error-not-allowed": "Ni dovoljeno", "error-not-permission-to-upload-file": "Nimate pooblastil za nalaganje datotek", "error-save-image": "Napaka pri shranjevanju slike", @@ -322,6 +323,11 @@ "Invite_user_to_join_channel_all_from": "Povabi vse uporabnike iz [#channel], da se pridružijo kanalu", "Invite_user_to_join_channel_all_to": "Povabi vse uporabnike iz tega kanala, da se pridružijo [#channel]", "Invite_users": "Povabite uporabnike", + "Invited": "Povabljen", + "invited_room_description_channel": "Povabil vas je", + "invited_room_description_dm": "Povabljeni ste na pogovor z", + "invited_room_title_channel": "Povabilo za pridružitev {{room_name}}", + "invited_room_title_dm": "Zahteva za sporočilo", "IP": "IP", "is_typing": "piše", "Join": "Pridružite se", @@ -552,6 +558,7 @@ "Record_audio_message": "Posnemi zvočno sporočilo", "Register": "Registriraj novi račun", "Registration_Succeeded": "Registracija je bila uspešna", + "reject": "Zavrni", "Remove": "Odstrani", "remove": "Odstrani", "Remove_from_room": "Odstrani iz sobe", diff --git a/app/i18n/locales/sv.json b/app/i18n/locales/sv.json index 38d87e6e17e..bf0e806bfcd 100644 --- a/app/i18n/locales/sv.json +++ b/app/i18n/locales/sv.json @@ -278,6 +278,7 @@ "error-invalid-file-type": "Ogiltig filtyp", "error-invalid-password": "Ogiltigt lösenord", "error-invalid-room-name": "{{room_name}} är inte ett giltigt rumsnamn", + "error-invitation-reply-action": "Fel vid sändning av inbjudningssvar", "error-not-allowed": "Tillåts inte", "error-not-permission-to-upload-file": "Du har inte behörighet att ladda upp filer", "error-save-image": "Fel när bilden skulle sparas", @@ -346,6 +347,11 @@ "Invite_user_to_join_channel_all_from": "Bjud in alla användare från [#kanalen] för att gå med i den här kanalen", "Invite_user_to_join_channel_all_to": "Bjud in alla användare från den här kanalen till att delta i [#kanalen]", "Invite_users": "Bjud in användare", + "Invited": "Inbjuden", + "invited_room_description_channel": "Du har blivit inbjuden av", + "invited_room_description_dm": "Du har blivit inbjuden att ha en konversation med", + "invited_room_title_channel": "Inbjudan att gå med i {{room_name}}", + "invited_room_title_dm": "Meddelandeförfrågan", "IP": "IP", "is_typing": "skriver", "Join": "Gå med", @@ -579,6 +585,7 @@ "Record_audio_message": "Spela in röstmeddelande", "Register": "Registrera", "Registration_Succeeded": "Registreringen är klar.", + "reject": "Avvisa", "Remove": "Ta bort", "remove": "ta bort", "Remove_from_room": "Ta bort från rummet", diff --git a/app/i18n/locales/ta-IN.json b/app/i18n/locales/ta-IN.json index 18c261269af..88859ec70f9 100644 --- a/app/i18n/locales/ta-IN.json +++ b/app/i18n/locales/ta-IN.json @@ -299,6 +299,7 @@ "error-invalid-file-type": "தவறான கோப்பு வகை", "error-invalid-password": "தவறான கடவுச்சொல்", "error-invalid-room-name": "{{room_name}} என்ற அறைபெயர் செல்லுதலின்று அமைந்திருக்கவில்லை", + "error-invitation-reply-action": "அழைப்பு பதிலை அனுப்பும்போது பிழை", "error-not-allowed": "அனுமதி இல்லை", "error-not-permission-to-upload-file": "கோப்புகளை பதிவேற்ற உங்களுக்கு அனுமதி இல்லை", "error-save-image": "படம் சேமிக்கும் போது பிழை", @@ -369,6 +370,11 @@ "Invalid_workspace_URL": "தவறான வேலைத்தள URL", "Invite_Link": "அழைப்பு இணைப்பு", "Invite_users": "பயனர்களை அழை", + "Invited": "அழைக்கப்பட்டது", + "invited_room_description_channel": "நீங்கள் அழைக்கப்பட்டீர்கள்", + "invited_room_description_dm": "நீங்கள் ஒரு உரையாடலை நடத்த அழைக்கப்பட்டீர்கள்", + "invited_room_title_channel": "{{room_name}} இல் சேர அழைப்பு", + "invited_room_title_dm": "செய்தி கோரிக்கை", "IP": "IP", "is_typing": "எழுந்துகொள்ளின்றார்", "Jitsi_authentication_before_making_calls": "ஜிட்சி அங்கத்திற்கு அங்கீகாரம் கேட்கும்போது கால் பரிந்துரை செய்யும் முன். அவர்களின் கொள்கைகளை அறிந்துகொள்ள ஜிட்சி இணையத்திற்கு செல்க.", @@ -618,6 +624,7 @@ "Record_audio_message": "ஆடியோ செய்தியை பதிவுசெய்", "Register": "பதிவு செய்", "Registration_Succeeded": "பதிவு செய்தது வெற்றிகரமாகின்றது!", + "reject": "நிராகரி", "Remove": "அகற்று", "remove": "அகற்று", "Remove_from_room": "அலுவலகத்திலிருந்து அகற்று", diff --git a/app/i18n/locales/te-IN.json b/app/i18n/locales/te-IN.json index 4a5d534382a..1352e1c7ea4 100644 --- a/app/i18n/locales/te-IN.json +++ b/app/i18n/locales/te-IN.json @@ -298,6 +298,7 @@ "error-invalid-file-type": "చెల్లని ఫైలు రకం", "error-invalid-password": "చెల్లని పాస్‌వర్డ్", "error-invalid-room-name": "{{room_name}} చెల్లని కొరకు పేరు", + "error-invitation-reply-action": "ఆహ్వాన ప్రతిస్పందనను పంపించడంలో లోపం", "error-not-allowed": "అనుమతి లేదు", "error-not-permission-to-upload-file": "మీకు ఫైలులను అప్‌లోడ్ చేయడానికి అనుమతి లేదు", "error-save-image": "చిత్రం సేవ్ చేయడంలో లోపం", @@ -368,6 +369,11 @@ "Invalid_workspace_URL": "చెల్లని వర్క్‌స్పేస్ URL", "Invite_Link": "ఆమంత్రణ లింక్", "Invite_users": "వాడికి ఆమంత్రణం పంపండి", + "Invited": "ఆహ్వానించబడింది", + "invited_room_description_channel": "మీరు ఆహ్వానించబడ్డారు", + "invited_room_description_dm": "మీరు సంభాషణ కలిగి ఉండడానికి ఆహ్వానించబడ్డారు", + "invited_room_title_channel": "{{room_name}} లో చేరడానికి ఆహ్వానం", + "invited_room_title_dm": "సందేశ అభ్యర్థన", "IP": "IP", "is_typing": "టైపు చేస్తోంది", "Jitsi_authentication_before_making_calls": "కాల్స్ చేసే ముందు Jitsi పరిశోధన అవసరం ఉండవచ్చు. వారి నయంత్రాల గురించి అడగించడానికి, Jitsi వెబ్‌సైట్‌ను సందర్శించండి.", @@ -617,6 +623,7 @@ "Record_audio_message": "ऑडियो संदेश रिकॉर्ड करें", "Register": "నమోదు", "Registration_Succeeded": "నమోదు విజయవంతంగా చేయబడింది!", + "reject": "తిరస్కరించు", "Remove": "తొలగించండి", "remove": "తొలగించండి", "Remove_from_room": "కొరకున్ని తీసివేయండి", diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index a8e4ec80dc3..8f866b00b7c 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -208,6 +208,7 @@ "error-invalid-file-type": "Geçersiz dosya türü!", "error-invalid-password": "Geçersiz şifre!", "error-invalid-room-name": "{{room_name}}, geçerli bir oda adı değil!", + "error-invitation-reply-action": "Davet yanıtı gönderilirken hata oluştu", "error-not-allowed": "İzin verilmedi", "error-save-image": "Görüntüyü kaydederken hata oluştu!", "error-save-video": "Videoyu kaydederken hata oluştu!", @@ -270,6 +271,11 @@ "Invite_user_to_join_channel_all_from": "[#kanal] 'daki tüm kullanıcıları bu kanala katılmaya davet et", "Invite_user_to_join_channel_all_to": "Bu kanaldaki tüm kullanıcıları [#kanal] katılmaya davet edin", "Invite_users": "Kullanıcıları davet et", + "Invited": "Davet edildi", + "invited_room_description_channel": "Tarafından davet edildiniz", + "invited_room_description_dm": "Bir konuşma yapmak için davet edildiniz", + "invited_room_title_channel": "{{room_name}} katılma daveti", + "invited_room_title_dm": "Mesaj isteği", "IP": "IP", "is_typing": "yazıyor", "Join": "Katıl", @@ -461,6 +467,7 @@ "Record_audio_message": "Sesli mesaj kaydet", "Register": "Kayıt Ol", "Registration_Succeeded": "Kayıt Başarılı!", + "reject": "Reddet", "Remove": "Kaldır", "Remove_from_room": "Odadan çıkar", "Remove_from_workspace_history": "Çalışma alanı geçmişinden kaldır", diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index 0bd12910283..fd07bc6a02d 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -204,6 +204,7 @@ "error-invalid-file-type": "无效的文件类型", "error-invalid-password": "无效的密码", "error-invalid-room-name": "{{room_name}} 不是合法的聊天室名称", + "error-invitation-reply-action": "发送邀请回复时出错", "error-not-allowed": "不允许", "error-save-image": "错误,无法保存图片", "error-save-video": "错误,无法保存視頻", @@ -259,6 +260,11 @@ "Invalid_workspace_URL": "无效的工作区 URL", "Invite_Link": "邀请链接", "Invite_users": "邀请用戶", + "Invited": "已邀请", + "invited_room_description_channel": "您已被邀请", + "invited_room_description_dm": "您已被邀请进行对话", + "invited_room_title_channel": "加入 {{room_name}} 的邀请", + "invited_room_title_dm": "消息请求", "IP": "IP", "is_typing": "正在输入", "Join": "加入", @@ -444,6 +450,7 @@ "Record_audio_message": "录制语音消息", "Register": "注册", "Registration_Succeeded": "注册成功", + "reject": "拒绝", "Remove": "移除", "Remove_from_workspace_history": "从工作区历史记录中移除", "replies": "回覆", diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index f44d8f18169..95d76aa39b8 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -210,6 +210,7 @@ "error-invalid-file-type": "無效的檔案類型", "error-invalid-password": "無效的密碼", "error-invalid-room-name": "{{room_name}} 不是一個有效的聊天室名稱", + "error-invitation-reply-action": "發送邀請回覆時出錯", "error-not-allowed": "不允許", "error-not-permission-to-upload-file": "You don't have permission to upload files", "error-save-image": "錯誤,無法儲存圖片", @@ -272,6 +273,11 @@ "Invite_user_to_join_channel_all_from": "邀請[#channel]中的所有使用者加入此頻道", "Invite_user_to_join_channel_all_to": "邀請此頻道的所有使用者加入[#頻道]", "Invite_users": "邀請使用者", + "Invited": "已邀請", + "invited_room_description_channel": "您已被邀請", + "invited_room_description_dm": "您已被邀請進行對話", + "invited_room_title_channel": "加入 {{room_name}} 的邀請", + "invited_room_title_dm": "訊息請求", "IP": "IP", "is_typing": "正在輸入", "Join": "加入", @@ -461,6 +467,7 @@ "Record_audio_message": "錄製語音訊息", "Register": "註冊", "Registration_Succeeded": "註冊成功", + "reject": "拒絕", "Remove": "移除", "Remove_from_workspace_history": "從工作區歷史記錄中刪除", "Remove_someone_from_room": "從房間中刪除某人", diff --git a/app/lib/database/model/Subscription.js b/app/lib/database/model/Subscription.js index 396817283bb..8769d94e489 100644 --- a/app/lib/database/model/Subscription.js +++ b/app/lib/database/model/Subscription.js @@ -153,6 +153,10 @@ export default class Subscription extends Model { @field('federated') federated; + @field('status') status; + + @json('inviter', sanitizer) inviter; + asPlain() { return { _id: this._id, @@ -219,7 +223,9 @@ export default class Subscription extends Model { usersCount: this.usersCount, source: this.source, disableNotifications: this.disableNotifications, - federated: this.federated + federated: this.federated, + status: this.status, + inviter: this.inviter }; } } diff --git a/app/lib/database/model/migrations.js b/app/lib/database/model/migrations.js index 601ece52607..6889ffca8c9 100644 --- a/app/lib/database/model/migrations.js +++ b/app/lib/database/model/migrations.js @@ -331,6 +331,18 @@ export default schemaMigrations({ columns: [{ name: 'federated', type: 'boolean', isOptional: true }] }) ] + }, + { + toVersion: 28, + steps: [ + addColumns({ + table: 'subscriptions', + columns: [ + { name: 'status', type: 'string', isOptional: true }, + { name: 'inviter', type: 'string', isOptional: true } + ] + }) + ] } ] }); diff --git a/app/lib/database/schema/app.js b/app/lib/database/schema/app.js index acca231cc08..ad09acb04a7 100644 --- a/app/lib/database/schema/app.js +++ b/app/lib/database/schema/app.js @@ -1,7 +1,7 @@ import { appSchema, tableSchema } from '@nozbe/watermelondb'; export default appSchema({ - version: 27, + version: 28, tables: [ tableSchema({ name: 'subscriptions', @@ -70,7 +70,9 @@ export default appSchema({ { name: 'users_count', type: 'number', isOptional: true }, { name: 'unmuted', type: 'string', isOptional: true }, { name: 'disable_notifications', type: 'boolean', isOptional: true }, - { name: 'federated', type: 'boolean', isOptional: true } + { name: 'federated', type: 'boolean', isOptional: true }, + { name: 'status', type: 'string', isOptional: true }, + { name: 'inviter', type: 'string', isOptional: true } ] }), tableSchema({ diff --git a/app/lib/methods/getInvitationData.ts b/app/lib/methods/getInvitationData.ts new file mode 100644 index 00000000000..c4028f097a7 --- /dev/null +++ b/app/lib/methods/getInvitationData.ts @@ -0,0 +1,21 @@ +import { type IInviteSubscription } from '../../definitions'; +import I18n from '../../i18n'; +import { getRoomTitle } from './helpers'; +import { replyRoomInvite } from './replyRoomInvite'; + +export const getInvitationData = (room: IInviteSubscription) => { + const title = + room.t === 'd' + ? I18n.t('invited_room_title_dm') + : I18n.t('invited_room_title_channel', { room_name: getRoomTitle(room).slice(0, 30) }); + + const description = room.t === 'd' ? I18n.t('invited_room_description_dm') : I18n.t('invited_room_description_channel'); + + return { + title, + description, + inviter: room.inviter, + accept: () => replyRoomInvite(room.id, 'accept'), + reject: () => replyRoomInvite(room.id, 'reject') + }; +}; diff --git a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts index a120a8e920c..fe4e8816f9b 100644 --- a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts +++ b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts @@ -14,6 +14,7 @@ import { } from '../../../definitions'; import { compareServerVersion } from './compareServerVersion'; +// eslint-disable-next-line complexity export const merge = ( subscription: ISubscription | IServerSubscription, room?: IRoom | IServerRoom | IOmnichannelRoom @@ -112,6 +113,8 @@ export const merge = ( mergedSubscription.autoTranslate = false; } + mergedSubscription.status = mergedSubscription.status ?? undefined; + mergedSubscription.inviter = mergedSubscription.inviter ?? undefined; mergedSubscription.blocker = !!mergedSubscription.blocker; mergedSubscription.blocked = !!mergedSubscription.blocked; mergedSubscription.hideMentionStatus = !!mergedSubscription.hideMentionStatus; diff --git a/app/lib/methods/isInviteSubscription.ts b/app/lib/methods/isInviteSubscription.ts new file mode 100644 index 00000000000..1ded5edcfb8 --- /dev/null +++ b/app/lib/methods/isInviteSubscription.ts @@ -0,0 +1,4 @@ +import { type IInviteSubscription, type ISubscription } from '../../definitions'; + +export const isInviteSubscription = (subscription: ISubscription): subscription is IInviteSubscription => + subscription?.status === 'INVITED' && !!subscription.inviter; diff --git a/app/lib/methods/replyRoomInvite.ts b/app/lib/methods/replyRoomInvite.ts new file mode 100644 index 00000000000..cadde12b757 --- /dev/null +++ b/app/lib/methods/replyRoomInvite.ts @@ -0,0 +1,13 @@ +import i18n from '../../i18n'; +import { sendInvitationReply } from '../services/restApi'; +import { showErrorAlert } from './helpers'; +import log from './helpers/log'; + +export const replyRoomInvite = async (rid: string, action: 'accept' | 'reject') => { + try { + await sendInvitationReply(rid, action); + } catch (e) { + showErrorAlert(i18n.t('error-invitation-reply-action')); + log(e); + } +}; diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 6cb05cc5ab1..f38c096c315 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -1100,6 +1100,8 @@ export function getUserInfo(userId: string) { export const toggleFavorite = (roomId: string, favorite: boolean) => sdk.post('rooms.favorite', { roomId, favorite }); +export const sendInvitationReply = (roomId: string, action: 'accept' | 'reject') => sdk.post('rooms.invite', { roomId, action }); + export const videoConferenceJoin = (callId: string, cam?: boolean, mic?: boolean) => sdk.post('video-conference.join', { callId, state: { cam: !!cam, mic: mic === undefined ? true : mic } }); diff --git a/app/views/RoomView/RightButtons.tsx b/app/views/RoomView/RightButtons.tsx index 7b3b838b54f..2ad9a83367e 100644 --- a/app/views/RoomView/RightButtons.tsx +++ b/app/views/RoomView/RightButtons.tsx @@ -479,6 +479,10 @@ class RightButtonsContainer extends Component<IRightButtonsProps, IRigthButtonsS return null; } + if (status === 'INVITED') { + return null; + } + if (t === 'l') { if (!this.isOmnichannelPreview()) { return ( diff --git a/app/views/RoomView/components/InvitedRoom.tsx b/app/views/RoomView/components/InvitedRoom.tsx new file mode 100644 index 00000000000..68d64863351 --- /dev/null +++ b/app/views/RoomView/components/InvitedRoom.tsx @@ -0,0 +1,100 @@ +import React, { type ReactElement } from 'react'; +import { StyleSheet, Text, View } from 'react-native'; + +import { useTheme } from '../../../theme'; +import { CustomIcon } from '../../../containers/CustomIcon'; +import Button from '../../../containers/Button'; +import sharedStyles from '../../Styles'; +import I18n from '../../../i18n'; +import type { IInviteSubscription } from '../../../definitions'; +import Chip from '../../../containers/Chip'; + +const GAP = 32; + +type InvitedRoomProps = { + title: string; + description: string; + inviter: IInviteSubscription['inviter']; + loading?: boolean; + onAccept: () => Promise<void>; + onReject: () => Promise<void>; +}; + +export const InvitedRoom = ({ title, description, inviter, loading, onAccept, onReject }: InvitedRoomProps): ReactElement => { + const { colors } = useTheme(); + const styles = useStyle(); + + return ( + <View style={styles.root}> + <View style={styles.container}> + <View style={styles.textView}> + <View style={styles.icon}> + <CustomIcon name='mail' size={42} color={colors.fontSecondaryInfo} /> + </View> + <Text style={styles.title}>{title}</Text> + <Text style={styles.description}>{description}</Text> + <View style={styles.username}> + <Chip avatar={inviter.username} text={inviter.name || inviter.username} fullWidth /> + </View> + </View> + <Button title={I18n.t('accept')} loading={loading} onPress={onAccept} /> + <Button + title={I18n.t('reject')} + type='secondary' + loading={loading} + backgroundColor={colors.surfaceTint} + onPress={onReject} + /> + </View> + </View> + ); +}; + +const useStyle = () => { + const { colors } = useTheme(); + const styles = StyleSheet.create({ + root: { + flex: 1, + backgroundColor: colors.surfaceRoom + }, + container: { + flex: 1, + marginHorizontal: 24, + justifyContent: 'center' + }, + textView: { alignItems: 'center' }, + icon: { + width: 58, + height: 58, + borderRadius: 30, + marginBottom: GAP, + backgroundColor: colors.surfaceNeutral, + alignItems: 'center', + justifyContent: 'center' + }, + title: { + ...sharedStyles.textBold, + fontSize: 24, + lineHeight: 32, + textAlign: 'center', + color: colors.fontTitlesLabels, + marginBottom: GAP + }, + description: { + ...sharedStyles.textRegular, + fontSize: 16, + lineHeight: 24, + textAlign: 'center', + color: colors.fontDefault + }, + username: { + ...sharedStyles.textRegular, + fontSize: 16, + lineHeight: 24, + textAlign: 'center', + color: colors.fontDefault, + marginBottom: GAP + } + }); + return styles; +}; diff --git a/app/views/RoomView/constants.ts b/app/views/RoomView/constants.ts index e16cba75cb0..a94401bbc80 100644 --- a/app/views/RoomView/constants.ts +++ b/app/views/RoomView/constants.ts @@ -44,5 +44,7 @@ export const roomAttrsUpdate = [ 'autoTranslateLanguage', 'unmuted', 'E2EKey', - 'encrypted' + 'encrypted', + 'status', + 'inviter' ] as TRoomUpdate[]; diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index a6bfc5ba106..b963b6c33bd 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -102,6 +102,9 @@ import UserPreferences from '../../lib/methods/userPreferences'; import { type IRoomViewProps, type IRoomViewState } from './definitions'; import { roomAttrsUpdate, stateAttrsUpdate } from './constants'; import { EncryptedRoom, MissingRoomE2EEKey } from './components'; +import { InvitedRoom } from './components/InvitedRoom'; +import { getInvitationData } from '../../lib/methods/getInvitationData'; +import { isInviteSubscription } from '../../lib/methods/isInviteSubscription'; class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { private rid?: string; @@ -328,6 +331,11 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { ) { this.updateE2EEState(); } + + // init() is skipped for invite subscriptions. Initialize when invite has been accepted + if (prevState.roomUpdate.status === 'INVITED' && roomUpdate.status !== 'INVITED') { + this.init(); + } } updateOmnichannel = async () => { @@ -535,6 +543,7 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { onPress={this.goRoomActionsView} testID={`room-view-title-${title}`} sourceType={sourceType} + disabled={isInviteSubscription(iSubRoom)} /> ), headerRight: () => ( @@ -637,6 +646,12 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { if (!this.rid) { return; } + + if ('id' in room && isInviteSubscription(room)) { + this.setState({ loading: false }); + return; + } + if (this.tmid) { await loadThreadMessages({ tmid: this.tmid, rid: this.rid }); } else { @@ -1563,6 +1578,16 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { ({ bannerClosed, announcement } = room); } + if ('id' in room && isInviteSubscription(room)) { + const { title, description, inviter, accept, reject } = getInvitationData(room); + + return ( + <SafeAreaView style={{ backgroundColor: themes[theme].surfaceRoom }} testID='room-view-invited'> + <InvitedRoom title={title} description={description} inviter={inviter} onAccept={accept} onReject={reject} /> + </SafeAreaView> + ); + } + if ('encrypted' in room) { // Missing room encryption key if (showMissingE2EEKey) {