[IMPROVE] Support Omnichannel icons (#3959)

* [IMPROVE] Support Channel Icons for Omnichannel

* Prop drilling sourceType

* create a column for source in WatermelonDB

* Add sms icon

* start of fetching

* removed usefetch

* custom icon to RoomHeader, RoomActions, RoomInfo

* minor tweak in interface

* fix margin

* add connected to sourceType

* make ts happy

* minor tweak

* fix storyshot

* refactor omnichannel source interface

* minor tweak roomActionsview

* Added storyshot

* minor tweak

* fix storyshot

* fix display extended without avatar

* fix connected object

* wip android build

Co-authored-by: Diego Mello <diegolmello@gmail.com>
Co-authored-by: GleidsonDaniel <gleidson10daniel@hotmail.com>
This commit is contained in:
Reinaldo Neto 2022-04-14 23:27:36 -03:00 committed by GitHub
parent 25c37c1a60
commit b75ac1de8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 768 additions and 485 deletions

View File

@ -282,6 +282,9 @@ dependencies {
playImplementation project(':@react-native-firebase_app') playImplementation project(':@react-native-firebase_app')
playImplementation project(':@react-native-firebase_analytics') playImplementation project(':@react-native-firebase_analytics')
playImplementation project(':@react-native-firebase_crashlytics') playImplementation project(':@react-native-firebase_crashlytics')
implementation(project(':react-native-jitsi-meet')) { // https://github.com/skrafft/react-native-jitsi-meet#side-note
exclude group: 'com.facebook.react',module:'react-native-svg'
}
implementation fileTree(dir: "libs", include: ["*.jar"]) implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion //noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules implementation "com.facebook.react:react-native:+" // From node_modules

View File

@ -2,13 +2,15 @@
import React from 'react'; import React from 'react';
import { Dimensions, View } from 'react-native'; import { Dimensions, View } from 'react-native';
import { storiesOf } from '@storybook/react-native'; import { storiesOf } from '@storybook/react-native';
import { Provider } from 'react-redux';
import Header from '../Header'; import Header from '../Header';
import { longText } from '../../../storybook/utils'; import { longText } from '../../../storybook/utils';
import { ThemeContext } from '../../theme'; import { ThemeContext } from '../../theme';
import { store } from '../../../storybook/stories';
import RoomHeaderComponent from './RoomHeader'; import RoomHeaderComponent from './RoomHeader';
const stories = storiesOf('RoomHeader', module); const stories = storiesOf('RoomHeader', module).addDecorator(story => <Provider store={store}>{story()}</Provider>);
// TODO: refactor after react-navigation v6 // TODO: refactor after react-navigation v6
const HeaderExample = ({ title }) => ( const HeaderExample = ({ title }) => (

View File

@ -6,7 +6,7 @@ import sharedStyles from '../../views/Styles';
import { themes } from '../../lib/constants'; import { themes } from '../../lib/constants';
import { MarkdownPreview } from '../markdown'; import { MarkdownPreview } from '../markdown';
import RoomTypeIcon from '../RoomTypeIcon'; import RoomTypeIcon from '../RoomTypeIcon';
import { TUserStatus } from '../../definitions'; import { TUserStatus, IOmnichannelSource } from '../../definitions';
import { useTheme } from '../../theme'; import { useTheme } from '../../theme';
const HIT_SLOP = { const HIT_SLOP = {
@ -72,6 +72,7 @@ interface IRoomHeader {
parentTitle: string; parentTitle: string;
onPress: () => void; onPress: () => void;
testID: string; testID: string;
sourceType?: IOmnichannelSource;
} }
const SubTitle = React.memo(({ usersTyping, subtitle, renderFunc, scale }: TRoomHeaderSubTitle) => { const SubTitle = React.memo(({ usersTyping, subtitle, renderFunc, scale }: TRoomHeaderSubTitle) => {
@ -135,7 +136,8 @@ const Header = React.memo(
isGroupChat, isGroupChat,
teamMain, teamMain,
testID, testID,
usersTyping = [] usersTyping = [],
sourceType
}: IRoomHeader) => { }: IRoomHeader) => {
const { theme } = useTheme(); const { theme } = useTheme();
const portrait = height > width; const portrait = height > width;
@ -171,7 +173,13 @@ const Header = React.memo(
hitSlop={HIT_SLOP}> hitSlop={HIT_SLOP}>
<View style={styles.titleContainer}> <View style={styles.titleContainer}>
{tmid ? null : ( {tmid ? null : (
<RoomTypeIcon type={prid ? 'discussion' : type} isGroupChat={isGroupChat} status={status} teamMain={teamMain} /> <RoomTypeIcon
type={prid ? 'discussion' : type}
isGroupChat={isGroupChat}
status={status}
teamMain={teamMain}
sourceType={sourceType}
/>
)} )}
<HeaderTitle title={title} tmid={tmid} prid={prid} scale={scale} testID={testID} /> <HeaderTitle title={title} tmid={tmid} prid={prid} scale={scale} testID={testID} />
</View> </View>

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@ import { dequal } from 'dequal';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { IApplicationState, TUserStatus } from '../../definitions'; import { IApplicationState, TUserStatus, IOmnichannelSource } from '../../definitions';
import { withDimensions } from '../../dimensions'; import { withDimensions } from '../../dimensions';
import I18n from '../../i18n'; import I18n from '../../i18n';
import RoomHeader from './RoomHeader'; import RoomHeader from './RoomHeader';
@ -27,12 +27,26 @@ interface IRoomHeaderContainerProps {
parentTitle: string; parentTitle: string;
isGroupChat: boolean; isGroupChat: boolean;
testID: string; testID: string;
sourceType?: IOmnichannelSource;
} }
class RoomHeaderContainer extends Component<IRoomHeaderContainerProps, any> { class RoomHeaderContainer extends Component<IRoomHeaderContainerProps, any> {
shouldComponentUpdate(nextProps: IRoomHeaderContainerProps) { shouldComponentUpdate(nextProps: IRoomHeaderContainerProps) {
const { type, title, subtitle, status, statusText, connecting, connected, onPress, usersTyping, width, height, teamMain } = const {
this.props; type,
title,
subtitle,
status,
statusText,
connecting,
connected,
onPress,
usersTyping,
width,
height,
teamMain,
sourceType
} = this.props;
if (nextProps.type !== type) { if (nextProps.type !== type) {
return true; return true;
} }
@ -63,6 +77,9 @@ class RoomHeaderContainer extends Component<IRoomHeaderContainerProps, any> {
if (!dequal(nextProps.usersTyping, usersTyping)) { if (!dequal(nextProps.usersTyping, usersTyping)) {
return true; return true;
} }
if (!dequal(nextProps.sourceType, sourceType)) {
return true;
}
if (nextProps.onPress !== onPress) { if (nextProps.onPress !== onPress) {
return true; return true;
} }
@ -90,7 +107,8 @@ class RoomHeaderContainer extends Component<IRoomHeaderContainerProps, any> {
height, height,
parentTitle, parentTitle,
isGroupChat, isGroupChat,
testID testID,
sourceType
} = this.props; } = this.props;
let subtitle; let subtitle;
@ -118,6 +136,7 @@ class RoomHeaderContainer extends Component<IRoomHeaderContainerProps, any> {
isGroupChat={isGroupChat} isGroupChat={isGroupChat}
testID={testID} testID={testID}
onPress={onPress} onPress={onPress}
sourceType={sourceType}
/> />
); );
} }

View File

@ -0,0 +1,51 @@
import React from 'react';
import { StyleProp, ViewStyle } from 'react-native';
import { SvgUri } from 'react-native-svg';
import { useSelector } from 'react-redux';
import { OmnichannelSourceType, IApplicationState, IOmnichannelSource } from '../../definitions';
import { STATUS_COLORS } from '../../lib/constants';
import { CustomIcon } from '../../lib/Icons';
const iconMap = {
widget: 'livechat-monochromatic',
email: 'mail',
sms: 'sms',
app: 'omnichannel',
api: 'omnichannel',
other: 'omnichannel'
};
interface IOmnichannelRoomIconProps {
size: number;
type: string;
style?: StyleProp<ViewStyle>;
status?: string;
sourceType?: IOmnichannelSource;
}
export const OmnichannelRoomIcon = ({ size, style, sourceType, status }: IOmnichannelRoomIconProps) => {
const baseUrl = useSelector((state: IApplicationState) => state.server?.server);
const connected = useSelector((state: IApplicationState) => state.meteor?.connected);
if (sourceType?.type === OmnichannelSourceType.APP && sourceType.id && sourceType.sidebarIcon && connected) {
return (
<SvgUri
height={size}
width={size}
color={STATUS_COLORS[status || 'offline']}
uri={`${baseUrl}/api/apps/public/${sourceType.id}/get-sidebar-icon?icon=${sourceType.sidebarIcon}`}
style={style}
/>
);
}
return (
<CustomIcon
name={iconMap[sourceType?.type || 'other']}
size={size}
style={style}
color={STATUS_COLORS[status || 'offline']}
/>
);
};

View File

@ -1,11 +1,12 @@
import React from 'react'; import React from 'react';
import { StyleSheet, ViewStyle } from 'react-native'; import { StyleSheet, ViewStyle } from 'react-native';
import { CustomIcon } from '../lib/Icons'; import { OmnichannelRoomIcon } from './OmnichannelRoomIcon';
import { STATUS_COLORS, themes } from '../lib/constants'; import { CustomIcon } from '../../lib/Icons';
import Status from './Status/Status'; import { STATUS_COLORS, themes } from '../../lib/constants';
import { useTheme } from '../theme'; import Status from '../Status/Status';
import { TUserStatus } from '../definitions'; import { useTheme } from '../../theme';
import { TUserStatus, IOmnichannelSource } from '../../definitions';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
icon: { icon: {
@ -20,13 +21,16 @@ interface IRoomTypeIcon {
status?: TUserStatus; status?: TUserStatus;
size?: number; size?: number;
style?: ViewStyle; style?: ViewStyle;
sourceType?: IOmnichannelSource;
} }
const RoomTypeIcon = React.memo(({ type, isGroupChat, status, style, teamMain, size = 16 }: IRoomTypeIcon) => { const RoomTypeIcon = React.memo(({ type, isGroupChat, status, style, teamMain, size = 16, sourceType }: IRoomTypeIcon) => {
const { theme } = useTheme(); const { theme } = useTheme();
if (!type) { if (!type) {
return null; return null;
} }
const color = themes[theme].titleText; const color = themes[theme].titleText;
const iconStyle = [styles.icon, { color }, style]; const iconStyle = [styles.icon, { color }, style];
@ -37,6 +41,10 @@ const RoomTypeIcon = React.memo(({ type, isGroupChat, status, style, teamMain, s
return <Status style={[iconStyle, { color: STATUS_COLORS[status] }]} size={size} status={status} />; return <Status style={[iconStyle, { color: STATUS_COLORS[status] }]} size={size} status={status} />;
} }
if (type === 'l') {
return <OmnichannelRoomIcon style={[styles.icon, style]} size={size} type={type} status={status} sourceType={sourceType} />;
}
// TODO: move this to a separate function // TODO: move this to a separate function
let icon = 'channel-private'; let icon = 'channel-private';
if (teamMain) { if (teamMain) {
@ -51,8 +59,6 @@ const RoomTypeIcon = React.memo(({ type, isGroupChat, status, style, teamMain, s
} else { } else {
icon = 'mention'; icon = 'mention';
} }
} else if (type === 'l') {
icon = 'omnichannel';
} }
return <CustomIcon name={icon} size={size} style={iconStyle} />; return <CustomIcon name={icon} size={size} style={iconStyle} />;

View File

@ -65,6 +65,24 @@ export enum OmnichannelSourceType {
API = 'api', API = 'api',
OTHER = 'other' // catch-all source type OTHER = 'other' // catch-all source type
} }
export interface IOmnichannelSource {
// The source, or client, which created the Omnichannel room
type: OmnichannelSourceType;
// An optional identification of external sources, such as an App
id?: string;
// A human readable alias that goes with the ID, for post analytical purposes
alias?: string;
// A label to be shown in the room info
label?: string;
// The sidebar icon
sidebarIcon?: string;
// The default sidebar icon
defaultIcon?: string;
_updatedAt?: Date;
queuedAt?: Date;
}
export interface IOmnichannelRoom extends Partial<Omit<IRoom, 'default' | 'featured' | 'broadcast'>> { export interface IOmnichannelRoom extends Partial<Omit<IRoom, 'default' | 'featured' | 'broadcast'>> {
_id: string; _id: string;
rid: string; rid: string;
@ -77,23 +95,7 @@ export interface IOmnichannelRoom extends Partial<Omit<IRoom, 'default' | 'featu
replyTo: string; replyTo: string;
subject: string; subject: string;
}; };
source: { source: IOmnichannelSource;
// TODO: looks like this is not so required as the definition suggests
// The source, or client, which created the Omnichannel room
type: OmnichannelSourceType;
// An optional identification of external sources, such as an App
id?: string;
// A human readable alias that goes with the ID, for post analytical purposes
alias?: string;
// A label to be shown in the room info
label?: string;
// The sidebar icon
sidebarIcon?: string;
// The default sidebar icon
defaultIcon?: string;
_updatedAt?: Date;
queuedAt?: Date;
};
transcriptRequest?: IRequestTranscript; transcriptRequest?: IRequestTranscript;
servedBy?: IServedBy; servedBy?: IServedBy;
onHold?: boolean; onHold?: boolean;

View File

@ -3,7 +3,7 @@ import Relation from '@nozbe/watermelondb/Relation';
import { ILastMessage, TMessageModel } from './IMessage'; import { ILastMessage, TMessageModel } from './IMessage';
import { IRocketChatRecord } from './IRocketChatRecord'; import { IRocketChatRecord } from './IRocketChatRecord';
import { RoomID, RoomType } from './IRoom'; import { IOmnichannelSource, RoomID, RoomType } from './IRoom';
import { IServedBy } from './IServedBy'; import { IServedBy } from './IServedBy';
import { TThreadModel } from './IThread'; import { TThreadModel } from './IThread';
import { TThreadMessageModel } from './IThreadMessage'; import { TThreadMessageModel } from './IThreadMessage';
@ -98,6 +98,7 @@ export interface ISubscription {
teamMain?: boolean; teamMain?: boolean;
unsubscribe: () => Promise<any>; unsubscribe: () => Promise<any>;
separator?: boolean; separator?: boolean;
source?: IOmnichannelSource;
// https://nozbe.github.io/WatermelonDB/Relation.html#relation-api // https://nozbe.github.io/WatermelonDB/Relation.html#relation-api
messages: RelationModified<TMessageModel>; messages: RelationModified<TMessageModel>;
threads: RelationModified<TThreadModel>; threads: RelationModified<TThreadModel>;

View File

@ -130,4 +130,6 @@ export default class Subscription extends Model {
@field('team_id') teamId; @field('team_id') teamId;
@field('team_main') teamMain; @field('team_main') teamMain;
@json('source', sanitizer) source;
} }

View File

@ -208,6 +208,15 @@ export default schemaMigrations({
columns: [{ name: 'draft_message', type: 'string', isOptional: true }] columns: [{ name: 'draft_message', type: 'string', isOptional: true }]
}) })
] ]
},
{
toVersion: 16,
steps: [
addColumns({
table: 'subscriptions',
columns: [{ name: 'source', type: 'string', isOptional: true }]
})
]
} }
] ]
}); });

View File

@ -1,7 +1,7 @@
import { appSchema, tableSchema } from '@nozbe/watermelondb'; import { appSchema, tableSchema } from '@nozbe/watermelondb';
export default appSchema({ export default appSchema({
version: 15, version: 16,
tables: [ tables: [
tableSchema({ tableSchema({
name: 'subscriptions', name: 'subscriptions',
@ -59,7 +59,8 @@ export default appSchema({
{ name: 'e2e_key_id', type: 'string', isOptional: true }, { name: 'e2e_key_id', type: 'string', isOptional: true },
{ name: 'avatar_etag', type: 'string', isOptional: true }, { name: 'avatar_etag', type: 'string', isOptional: true },
{ name: 'team_id', type: 'string', isIndexed: true }, { name: 'team_id', type: 'string', isIndexed: true },
{ name: 'team_main', type: 'boolean', isOptional: true } // Use `Q.notEq(true)` to get false or null { name: 'team_main', type: 'boolean', isOptional: true }, // Use `Q.notEq(true)` to get false or null
{ name: 'source', type: 'string', isOptional: true }
] ]
}), }),
tableSchema({ tableSchema({

View File

@ -4,10 +4,13 @@ import { Encryption } from '../../encryption';
import { store as reduxStore } from '../../store/auxStore'; import { store as reduxStore } from '../../store/auxStore';
import findSubscriptionsRooms from './findSubscriptionsRooms'; import findSubscriptionsRooms from './findSubscriptionsRooms';
import normalizeMessage from './normalizeMessage'; import normalizeMessage from './normalizeMessage';
import { ISubscription, IServerSubscription, IServerRoom, IRoom } from '../../../definitions'; import { ISubscription, IServerSubscription, IServerRoom, IRoom, IOmnichannelRoom } from '../../../definitions';
import { compareServerVersion } from './compareServerVersion'; import { compareServerVersion } from './compareServerVersion';
export const merge = (subscription: ISubscription | IServerSubscription, room?: IRoom | IServerRoom): ISubscription => { export const merge = (
subscription: ISubscription | IServerSubscription,
room?: IRoom | IServerRoom | IOmnichannelRoom
): ISubscription => {
const serverVersion = reduxStore.getState().server.version as string; const serverVersion = reduxStore.getState().server.version as string;
const mergedSubscription: ISubscription = EJSON.fromJSONValue(subscription); const mergedSubscription: ISubscription = EJSON.fromJSONValue(subscription);
@ -44,7 +47,9 @@ export const merge = (subscription: ISubscription | IServerSubscription, room?:
: lastRoomUpdate; : lastRoomUpdate;
} }
mergedSubscription.ro = room?.ro ?? false; mergedSubscription.ro = room?.ro ?? false;
mergedSubscription.broadcast = room?.broadcast; if (room && 'broadcast' in room) {
mergedSubscription.broadcast = room?.broadcast;
}
mergedSubscription.encrypted = room?.encrypted; mergedSubscription.encrypted = room?.encrypted;
mergedSubscription.e2eKeyId = room?.e2eKeyId; mergedSubscription.e2eKeyId = room?.e2eKeyId;
mergedSubscription.avatarETag = room?.avatarETag; mergedSubscription.avatarETag = room?.avatarETag;
@ -77,6 +82,9 @@ export const merge = (subscription: ISubscription | IServerSubscription, room?:
mergedSubscription.tags = room.tags; mergedSubscription.tags = room.tags;
} }
mergedSubscription.sysMes = room?.sysMes; mergedSubscription.sysMes = room?.sysMes;
if (room && 'source' in room) {
mergedSubscription.source = room?.source;
}
} }
if (!mergedSubscription.name) { if (!mergedSubscription.name) {

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,8 @@ const IconOrAvatar = ({
teamMain, teamMain,
showLastMessage, showLastMessage,
theme, theme,
displayMode displayMode,
sourceType
}) => { }) => {
if (showAvatar) { if (showAvatar) {
return ( return (
@ -38,6 +39,7 @@ const IconOrAvatar = ({
teamMain={teamMain} teamMain={teamMain}
size={24} size={24}
style={{ marginRight: 12 }} style={{ marginRight: 12 }}
sourceType={sourceType}
/> />
</View> </View>
); );

View File

@ -12,7 +12,7 @@ import Touchable from './Touchable';
import Tag from './Tag'; import Tag from './Tag';
import I18n from '../../i18n'; import I18n from '../../i18n';
import { DisplayMode } from '../../lib/constants'; import { DisplayMode } from '../../lib/constants';
import { TUserStatus } from '../../definitions'; import { TUserStatus, IOmnichannelSource } from '../../definitions';
import { TSupportedThemes } from '../../theme'; import { TSupportedThemes } from '../../theme';
interface IRoomItem { interface IRoomItem {
@ -62,6 +62,7 @@ interface IRoomItem {
size?: number; size?: number;
showAvatar: boolean; showAvatar: boolean;
displayMode: string; displayMode: string;
sourceType: IOmnichannelSource;
} }
const RoomItem = ({ const RoomItem = ({
@ -102,7 +103,8 @@ const RoomItem = ({
teamMain, teamMain,
autoJoin, autoJoin,
showAvatar, showAvatar,
displayMode displayMode,
sourceType
}: IRoomItem) => ( }: IRoomItem) => (
<Touchable <Touchable
onPress={onPress} onPress={onPress}
@ -133,12 +135,20 @@ const RoomItem = ({
teamMain={teamMain} teamMain={teamMain}
displayMode={displayMode} displayMode={displayMode}
showAvatar={showAvatar} showAvatar={showAvatar}
showLastMessage={showLastMessage}> showLastMessage={showLastMessage}
sourceType={sourceType}>
{showLastMessage && displayMode === DisplayMode.Expanded ? ( {showLastMessage && displayMode === DisplayMode.Expanded ? (
<> <>
<View style={styles.titleContainer}> <View style={styles.titleContainer}>
{showAvatar ? ( {showAvatar ? (
<TypeIcon type={type} prid={prid} status={status} isGroupChat={isGroupChat} teamMain={teamMain} /> <TypeIcon
type={type}
prid={prid}
status={status}
isGroupChat={isGroupChat}
teamMain={teamMain}
sourceType={sourceType}
/>
) : null} ) : null}
<Title name={name} theme={theme} hideUnreadStatus={hideUnreadStatus} alert={alert} /> <Title name={name} theme={theme} hideUnreadStatus={hideUnreadStatus} alert={alert} />
{autoJoin ? <Tag testID='auto-join-tag' name={I18n.t('Auto-join')} /> : null} {autoJoin ? <Tag testID='auto-join-tag' name={I18n.t('Auto-join')} /> : null}
@ -174,6 +184,7 @@ const RoomItem = ({
teamMain={teamMain} teamMain={teamMain}
size={22} size={22}
style={{ marginRight: 8 }} style={{ marginRight: 8 }}
sourceType={sourceType}
/> />
<Title name={name} theme={theme} hideUnreadStatus={hideUnreadStatus} alert={alert} /> <Title name={name} theme={theme} hideUnreadStatus={hideUnreadStatus} alert={alert} />
{autoJoin ? <Tag name={I18n.t('Auto-join')} /> : null} {autoJoin ? <Tag name={I18n.t('Auto-join')} /> : null}

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { TUserStatus } from '../../definitions'; import { TUserStatus, IOmnichannelSource } from '../../definitions';
import RoomTypeIcon from '../../containers/RoomTypeIcon'; import RoomTypeIcon from '../../containers/RoomTypeIcon';
interface ITypeIcon { interface ITypeIcon {
@ -11,9 +11,10 @@ interface ITypeIcon {
teamMain: boolean; teamMain: boolean;
size?: number; size?: number;
style?: object; style?: object;
sourceType?: IOmnichannelSource;
} }
const TypeIcon = React.memo(({ type, prid, status, isGroupChat, teamMain, size, style }: ITypeIcon) => ( const TypeIcon = React.memo(({ type, prid, status, isGroupChat, teamMain, size, style, sourceType }: ITypeIcon) => (
<RoomTypeIcon <RoomTypeIcon
type={prid ? 'discussion' : type} type={prid ? 'discussion' : type}
isGroupChat={isGroupChat} isGroupChat={isGroupChat}
@ -21,6 +22,7 @@ const TypeIcon = React.memo(({ type, prid, status, isGroupChat, teamMain, size,
teamMain={teamMain} teamMain={teamMain}
size={size} size={size}
style={style} style={style}
sourceType={sourceType}
/> />
)); ));

View File

@ -2,6 +2,7 @@ import React from 'react';
import { View } from 'react-native'; import { View } from 'react-native';
import { DisplayMode, themes } from '../../lib/constants'; import { DisplayMode, themes } from '../../lib/constants';
import { IOmnichannelSource } from '../../definitions';
import { TSupportedThemes } from '../../theme'; import { TSupportedThemes } from '../../theme';
import IconOrAvatar from './IconOrAvatar'; import IconOrAvatar from './IconOrAvatar';
import styles from './styles'; import styles from './styles';
@ -21,6 +22,7 @@ interface IWrapper {
isGroupChat: boolean; isGroupChat: boolean;
teamMain: boolean; teamMain: boolean;
showAvatar: boolean; showAvatar: boolean;
sourceType: IOmnichannelSource;
} }
const Wrapper = ({ accessibilityLabel, theme, children, displayMode, ...props }: IWrapper) => ( const Wrapper = ({ accessibilityLabel, theme, children, displayMode, ...props }: IWrapper) => (

View File

@ -218,6 +218,7 @@ class RoomItemContainer extends React.Component<IRoomItemContainerProps, any> {
autoJoin={autoJoin} autoJoin={autoJoin}
showAvatar={showAvatar} showAvatar={showAvatar}
displayMode={displayMode} displayMode={displayMode}
sourceType={item.source}
/> />
); );
} }

View File

@ -724,7 +724,7 @@ class RoomActionsView extends React.Component<IRoomActionsViewProps, IRoomAction
renderRoomInfo = () => { renderRoomInfo = () => {
const { room, member } = this.state; const { room, member } = this.state;
const { rid, name, t, topic } = room; const { rid, name, t, topic, source } = room;
const { theme, fontScale } = this.props; const { theme, fontScale } = this.props;
const avatar = RocketChat.getRoomAvatar(room); const avatar = RocketChat.getRoomAvatar(room);
@ -766,7 +766,12 @@ class RoomActionsView extends React.Component<IRoomActionsViewProps, IRoomAction
</Text> </Text>
) : ( ) : (
<View style={styles.roomTitleRow}> <View style={styles.roomTitleRow}>
<RoomTypeIcon type={room.prid ? 'discussion' : room.t} teamMain={room.teamMain} status={room.visitor?.status} /> <RoomTypeIcon
type={room.prid ? 'discussion' : room.t}
teamMain={room.teamMain}
status={room.visitor?.status}
sourceType={source}
/>
<Text style={[styles.roomTitle, { color: themes[theme].titleText }]} numberOfLines={1}> <Text style={[styles.roomTitle, { color: themes[theme].titleText }]} numberOfLines={1}>
{RocketChat.getRoomTitle(room)} {RocketChat.getRoomTitle(room)}
</Text> </Text>

View File

@ -68,6 +68,7 @@ const getRoomTitle = ({ room, type, name, username, statusText, theme }: IGetRoo
teamMain={room.teamMain} teamMain={room.teamMain}
key='room-info-type' key='room-info-type'
status={room.visitor?.status} status={room.visitor?.status}
sourceType={room.source}
/> />
<Text testID='room-info-view-name' style={[styles.roomTitle, { color: themes[theme].titleText }]} key='room-info-name'> <Text testID='room-info-view-name' style={[styles.roomTitle, { color: themes[theme].titleText }]} key='room-info-name'>
{RocketChat.getRoomTitle(room)} {RocketChat.getRoomTitle(room)}
@ -422,6 +423,7 @@ class RoomInfoView extends React.Component<IRoomInfoViewProps, IRoomInfoViewStat
render() { render() {
const { room, roomUser } = this.state; const { room, roomUser } = this.state;
const { theme } = this.props; const { theme } = this.props;
return ( return (
<ScrollView style={[styles.scroll, { backgroundColor: themes[theme].backgroundColor }]}> <ScrollView style={[styles.scroll, { backgroundColor: themes[theme].backgroundColor }]}>
<StatusBar /> <StatusBar />

View File

@ -70,6 +70,7 @@ import {
IBaseScreen, IBaseScreen,
ILoggedUser, ILoggedUser,
IMessage, IMessage,
IOmnichannelSource,
ISubscription, ISubscription,
IVisitor, IVisitor,
SubscriptionType, SubscriptionType,
@ -448,6 +449,7 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
let token: string | undefined; let token: string | undefined;
let avatar: string | undefined; let avatar: string | undefined;
let visitor: IVisitor | undefined; let visitor: IVisitor | undefined;
let sourceType: IOmnichannelSource | undefined;
if ('id' in room) { if ('id' in room) {
subtitle = room.topic; subtitle = room.topic;
t = room.t; t = room.t;
@ -459,6 +461,12 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
visitor = room.visitor; visitor = room.visitor;
} }
if ('source' in room) {
t = room.t;
sourceType = room.source;
visitor = room.visitor;
}
let numIconsRight = 2; let numIconsRight = 2;
if (tmid) { if (tmid) {
numIconsRight = 1; numIconsRight = 1;
@ -504,6 +512,7 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
isGroupChat={isGroupChat} isGroupChat={isGroupChat}
onPress={this.goRoomActionsView} onPress={this.goRoomActionsView}
testID={`room-view-title-${title}`} testID={`room-view-title-${title}`}
sourceType={sourceType}
/> />
), ),
headerRight: () => ( headerRight: () => (

View File

@ -582,6 +582,8 @@ PODS:
- React - React
- RNScreens (2.9.0): - RNScreens (2.9.0):
- React - React
- RNSVG (12.3.0):
- React-Core
- RNVectorIcons (8.1.0): - RNVectorIcons (8.1.0):
- React-Core - React-Core
- SDWebImage (5.8.4): - SDWebImage (5.8.4):
@ -712,6 +714,7 @@ DEPENDENCIES:
- RNReanimated (from `../node_modules/react-native-reanimated`) - RNReanimated (from `../node_modules/react-native-reanimated`)
- RNRootView (from `../node_modules/rn-root-view`) - RNRootView (from `../node_modules/rn-root-view`)
- RNScreens (from `../node_modules/react-native-screens`) - RNScreens (from `../node_modules/react-native-screens`)
- RNSVG (from `../node_modules/react-native-svg`)
- RNVectorIcons (from `../node_modules/react-native-vector-icons`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`)
- "simdjson (from `../node_modules/@nozbe/simdjson`)" - "simdjson (from `../node_modules/@nozbe/simdjson`)"
- UMAppLoader (from `../node_modules/unimodules-app-loader/ios`) - UMAppLoader (from `../node_modules/unimodules-app-loader/ios`)
@ -916,6 +919,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/rn-root-view" :path: "../node_modules/rn-root-view"
RNScreens: RNScreens:
:path: "../node_modules/react-native-screens" :path: "../node_modules/react-native-screens"
RNSVG:
:path: "../node_modules/react-native-svg"
RNVectorIcons: RNVectorIcons:
:path: "../node_modules/react-native-vector-icons" :path: "../node_modules/react-native-vector-icons"
simdjson: simdjson:
@ -1046,6 +1051,7 @@ SPEC CHECKSUMS:
RNReanimated: 241c586663f44f19a53883c63375fdd041253960 RNReanimated: 241c586663f44f19a53883c63375fdd041253960
RNRootView: 895a4813dedeaca82db2fa868ca1c333d790e494 RNRootView: 895a4813dedeaca82db2fa868ca1c333d790e494
RNScreens: c526239bbe0e957b988dacc8d75ac94ec9cb19da RNScreens: c526239bbe0e957b988dacc8d75ac94ec9cb19da
RNSVG: 302bfc9905bd8122f08966dc2ce2d07b7b52b9f8
RNVectorIcons: 31cebfcf94e8cf8686eb5303ae0357da64d7a5a4 RNVectorIcons: 31cebfcf94e8cf8686eb5303ae0357da64d7a5a4
SDWebImage: cf6922231e95550934da2ada0f20f2becf2ceba9 SDWebImage: cf6922231e95550934da2ada0f20f2becf2ceba9
SDWebImageWebPCoder: 36f8f47bd9879a8aea6044765c1351120fd8e3a8 SDWebImageWebPCoder: 36f8f47bd9879a8aea6044765c1351120fd8e3a8

View File

@ -85,8 +85,10 @@
7A0D62D2242AB187006D5C06 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */; }; 7A0D62D2242AB187006D5C06 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */; };
7A14FCED257FEB3A005BDCD4 /* Experimental.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCEC257FEB3A005BDCD4 /* Experimental.xcassets */; }; 7A14FCED257FEB3A005BDCD4 /* Experimental.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCEC257FEB3A005BDCD4 /* Experimental.xcassets */; };
7A14FCF4257FEB59005BDCD4 /* Official.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCF3257FEB59005BDCD4 /* Official.xcassets */; }; 7A14FCF4257FEB59005BDCD4 /* Official.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCF3257FEB59005BDCD4 /* Official.xcassets */; };
7A3268F624F04FFE0050E241 /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A3268F524F04FFE0050E241 /* custom.ttf */; }; 7A610CD227ECE38100B8ABDD /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A610CD127ECE38100B8ABDD /* custom.ttf */; };
7A3268F724F04FFE0050E241 /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A3268F524F04FFE0050E241 /* custom.ttf */; }; 7A610CD327ECE38100B8ABDD /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A610CD127ECE38100B8ABDD /* custom.ttf */; };
7A610CD427ECE38100B8ABDD /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A610CD127ECE38100B8ABDD /* custom.ttf */; };
7A610CD527ECE38100B8ABDD /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A610CD127ECE38100B8ABDD /* custom.ttf */; };
7AAB3E15257E6A6E00707CF6 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E01C8282511304100FEF824 /* Sender.swift */; }; 7AAB3E15257E6A6E00707CF6 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E01C8282511304100FEF824 /* Sender.swift */; };
7AAB3E16257E6A6E00707CF6 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E680ED82512990700C9257A /* Request.swift */; }; 7AAB3E16257E6A6E00707CF6 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E680ED82512990700C9257A /* Request.swift */; };
7AAB3E17257E6A6E00707CF6 /* ReplyNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED00BB02513E04400A1331F /* ReplyNotification.swift */; }; 7AAB3E17257E6A6E00707CF6 /* ReplyNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED00BB02513E04400A1331F /* ReplyNotification.swift */; };
@ -129,7 +131,6 @@
7AAB3E3E257E6A6E00707CF6 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 06BB44DD4855498082A744AD /* libz.tbd */; }; 7AAB3E3E257E6A6E00707CF6 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 06BB44DD4855498082A744AD /* libz.tbd */; };
7AAB3E3F257E6A6E00707CF6 /* libWatermelonDB.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BA7E862283664608B3894E34 /* libWatermelonDB.a */; }; 7AAB3E3F257E6A6E00707CF6 /* libWatermelonDB.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BA7E862283664608B3894E34 /* libWatermelonDB.a */; };
7AAB3E42257E6A6E00707CF6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 7AAB3E42257E6A6E00707CF6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
7AAB3E43257E6A6E00707CF6 /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A3268F524F04FFE0050E241 /* custom.ttf */; };
7AAB3E44257E6A6E00707CF6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A006F13229C83B600803143 /* GoogleService-Info.plist */; }; 7AAB3E44257E6A6E00707CF6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A006F13229C83B600803143 /* GoogleService-Info.plist */; };
7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */; }; 7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */; };
7AAB3E49257E6A6E00707CF6 /* ShareRocketChatRN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 7AAB3E49257E6A6E00707CF6 /* ShareRocketChatRN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@ -265,7 +266,7 @@
7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
7A14FCEC257FEB3A005BDCD4 /* Experimental.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Experimental.xcassets; sourceTree = "<group>"; }; 7A14FCEC257FEB3A005BDCD4 /* Experimental.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Experimental.xcassets; sourceTree = "<group>"; };
7A14FCF3257FEB59005BDCD4 /* Official.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Official.xcassets; sourceTree = "<group>"; }; 7A14FCF3257FEB59005BDCD4 /* Official.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Official.xcassets; sourceTree = "<group>"; };
7A3268F524F04FFE0050E241 /* custom.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = custom.ttf; sourceTree = "<group>"; }; 7A610CD127ECE38100B8ABDD /* custom.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = custom.ttf; sourceTree = "<group>"; };
7AAA749C23043B1D00F1ADE9 /* RocketChatRN-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RocketChatRN-Bridging-Header.h"; sourceTree = "<group>"; }; 7AAA749C23043B1D00F1ADE9 /* RocketChatRN-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RocketChatRN-Bridging-Header.h"; sourceTree = "<group>"; };
7AAB3E52257E6A6E00707CF6 /* Rocket.Chat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rocket.Chat.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7AAB3E52257E6A6E00707CF6 /* Rocket.Chat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rocket.Chat.app; sourceTree = BUILT_PRODUCTS_DIR; };
7ACD4853222860DE00442C55 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
@ -476,7 +477,6 @@
B9D2BCED708759575760AFDE /* Pods-defaults-ShareRocketChatRN.debug.xcconfig */, B9D2BCED708759575760AFDE /* Pods-defaults-ShareRocketChatRN.debug.xcconfig */,
1FD576942AB7B278424D7D91 /* Pods-defaults-ShareRocketChatRN.release.xcconfig */, 1FD576942AB7B278424D7D91 /* Pods-defaults-ShareRocketChatRN.release.xcconfig */,
); );
name = Pods;
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -520,7 +520,7 @@
AF5E16F0398347E6A80C8CBE /* Resources */ = { AF5E16F0398347E6A80C8CBE /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7A3268F524F04FFE0050E241 /* custom.ttf */, 7A610CD127ECE38100B8ABDD /* custom.ttf */,
); );
name = Resources; name = Resources;
sourceTree = "<group>"; sourceTree = "<group>";
@ -731,7 +731,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
7A3268F624F04FFE0050E241 /* custom.ttf in Resources */, 7A610CD227ECE38100B8ABDD /* custom.ttf in Resources */,
7A14FCED257FEB3A005BDCD4 /* Experimental.xcassets in Resources */, 7A14FCED257FEB3A005BDCD4 /* Experimental.xcassets in Resources */,
7A006F14229C83B600803143 /* GoogleService-Info.plist in Resources */, 7A006F14229C83B600803143 /* GoogleService-Info.plist in Resources */,
7A0D62D2242AB187006D5C06 /* LaunchScreen.storyboard in Resources */, 7A0D62D2242AB187006D5C06 /* LaunchScreen.storyboard in Resources */,
@ -742,7 +742,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7A3268F724F04FFE0050E241 /* custom.ttf in Resources */, 7A610CD327ECE38100B8ABDD /* custom.ttf in Resources */,
1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */, 1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */,
1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */, 1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */,
); );
@ -753,6 +753,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
1E6CC61F2513DBF400965591 /* GoogleService-Info.plist in Resources */, 1E6CC61F2513DBF400965591 /* GoogleService-Info.plist in Resources */,
7A610CD427ECE38100B8ABDD /* custom.ttf in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -761,8 +762,8 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7A14FCF4257FEB59005BDCD4 /* Official.xcassets in Resources */, 7A14FCF4257FEB59005BDCD4 /* Official.xcassets in Resources */,
7A610CD527ECE38100B8ABDD /* custom.ttf in Resources */,
7AAB3E42257E6A6E00707CF6 /* Images.xcassets in Resources */, 7AAB3E42257E6A6E00707CF6 /* Images.xcassets in Resources */,
7AAB3E43257E6A6E00707CF6 /* custom.ttf in Resources */,
7AAB3E44257E6A6E00707CF6 /* GoogleService-Info.plist in Resources */, 7AAB3E44257E6A6E00707CF6 /* GoogleService-Info.plist in Resources */,
7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */, 7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */,
); );
@ -1572,7 +1573,7 @@
"$(inherited)", "$(inherited)",
"$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**",
"$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**",
"$PODS_CONFIGURATION_BUILD_DIR/Firebase", $PODS_CONFIGURATION_BUILD_DIR/Firebase,
); );
INFOPLIST_FILE = ShareRocketChatRN/Info.plist; INFOPLIST_FILE = ShareRocketChatRN/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
@ -1638,7 +1639,7 @@
"$(inherited)", "$(inherited)",
"$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**",
"$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**",
"$PODS_CONFIGURATION_BUILD_DIR/Firebase", $PODS_CONFIGURATION_BUILD_DIR/Firebase,
); );
INFOPLIST_FILE = ShareRocketChatRN/Info.plist; INFOPLIST_FILE = ShareRocketChatRN/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;

Binary file not shown.

View File

@ -114,6 +114,7 @@
"react-native-scrollable-tab-view": "^1.0.0", "react-native-scrollable-tab-view": "^1.0.0",
"react-native-simple-crypto": "RocketChat/react-native-simple-crypto#0.5.0", "react-native-simple-crypto": "RocketChat/react-native-simple-crypto#0.5.0",
"react-native-slowlog": "^1.0.2", "react-native-slowlog": "^1.0.2",
"react-native-svg": "^12.3.0",
"react-native-ui-lib": "RocketChat/react-native-ui-lib#minor-improvements", "react-native-ui-lib": "RocketChat/react-native-ui-lib#minor-improvements",
"react-native-unimodules": "^0.14.8", "react-native-unimodules": "^0.14.8",
"react-native-vector-icons": "8.1.0", "react-native-vector-icons": "8.1.0",

View File

@ -182,3 +182,18 @@ stories.add('Expanded Room Item without Avatar', () => (
/> />
</> </>
)); ));
stories.add('Omnichannel Icon', () => (
<>
<RoomItem type='l' sourceType={{ type: 'widget' }} status='online' />
<RoomItem type='l' sourceType={{ type: 'widget' }} status='away' />
<RoomItem type='l' sourceType={{ type: 'widget' }} status='loading' />
<RoomItem type='l' sourceType={{ type: 'widget' }} />
<RoomItem type='l' sourceType={{ type: 'email' }} status='online' />
<RoomItem type='l' sourceType={{ type: 'email' }} />
<RoomItem type='l' sourceType={{ type: 'sms' }} status='online' />
<RoomItem type='l' sourceType={{ type: 'sms' }} />
<RoomItem type='l' sourceType={{ type: 'other' }} status='online' />
<RoomItem type='l' sourceType={{ type: 'other' }} />
</>
));

File diff suppressed because one or more lines are too long

View File

@ -6304,7 +6304,7 @@ body-parser@1.19.0:
raw-body "2.4.0" raw-body "2.4.0"
type-is "~1.6.17" type-is "~1.6.17"
boolbase@~1.0.0: boolbase@^1.0.0, boolbase@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
@ -7661,6 +7661,17 @@ css-select@^1.1.0:
domutils "1.5.1" domutils "1.5.1"
nth-check "~1.0.1" nth-check "~1.0.1"
css-select@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd"
integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==
dependencies:
boolbase "^1.0.0"
css-what "^5.1.0"
domhandler "^4.3.0"
domutils "^2.8.0"
nth-check "^2.0.1"
css-to-react-native@^2.2.1: css-to-react-native@^2.2.1:
version "2.3.2" version "2.3.2"
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d"
@ -7670,11 +7681,24 @@ css-to-react-native@^2.2.1:
css-color-keywords "^1.0.0" css-color-keywords "^1.0.0"
postcss-value-parser "^3.3.0" postcss-value-parser "^3.3.0"
css-tree@^1.0.0-alpha.39:
version "1.1.3"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
dependencies:
mdn-data "2.0.14"
source-map "^0.6.1"
css-what@2.1: css-what@2.1:
version "2.1.3" version "2.1.3"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
css-what@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
cssesc@^3.0.0: cssesc@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@ -8074,6 +8098,15 @@ dom-serializer@0:
domelementtype "^2.0.1" domelementtype "^2.0.1"
entities "^2.0.0" entities "^2.0.0"
dom-serializer@^1.0.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
dependencies:
domelementtype "^2.0.1"
domhandler "^4.2.0"
entities "^2.0.0"
dom-walk@^0.1.0: dom-walk@^0.1.0:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
@ -8094,6 +8127,11 @@ domelementtype@^2.0.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
domelementtype@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
domexception@^2.0.1: domexception@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@ -8108,6 +8146,13 @@ domhandler@^2.3.0:
dependencies: dependencies:
domelementtype "1" domelementtype "1"
domhandler@^4.2.0, domhandler@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
dependencies:
domelementtype "^2.2.0"
domutils@1.5.1: domutils@1.5.1:
version "1.5.1" version "1.5.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
@ -8124,6 +8169,15 @@ domutils@^1.5.1:
dom-serializer "0" dom-serializer "0"
domelementtype "1" domelementtype "1"
domutils@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.2.0"
domhandler "^4.2.0"
dot-case@^3.0.3: dot-case@^3.0.3:
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa"
@ -12369,6 +12423,11 @@ md5.js@^1.3.4:
inherits "^2.0.1" inherits "^2.0.1"
safe-buffer "^5.1.2" safe-buffer "^5.1.2"
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
"mdurl@~ 1.0.1": "mdurl@~ 1.0.1":
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
@ -13253,6 +13312,13 @@ npmlog@^4.1.2:
gauge "~2.7.3" gauge "~2.7.3"
set-blocking "~2.0.0" set-blocking "~2.0.0"
nth-check@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
dependencies:
boolbase "^1.0.0"
nth-check@~1.0.1: nth-check@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@ -14963,6 +15029,14 @@ react-native-slowlog@^1.0.2:
resolved "https://registry.yarnpkg.com/react-native-slowlog/-/react-native-slowlog-1.0.2.tgz#5520979e3ef9d5273495d431ff3be34f02e35c89" resolved "https://registry.yarnpkg.com/react-native-slowlog/-/react-native-slowlog-1.0.2.tgz#5520979e3ef9d5273495d431ff3be34f02e35c89"
integrity sha1-VSCXnj751Sc0ldQx/zvjTwLjXIk= integrity sha1-VSCXnj751Sc0ldQx/zvjTwLjXIk=
react-native-svg@^12.3.0:
version "12.3.0"
resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-12.3.0.tgz#40f657c5d1ee366df23f3ec8dae76fd276b86248"
integrity sha512-ESG1g1j7/WLD7X3XRFTQHVv0r6DpbHNNcdusngAODIxG88wpTWUZkhcM3A2HJTb+BbXTFDamHv7FwtRKWQ/ALg==
dependencies:
css-select "^4.2.1"
css-tree "^1.0.0-alpha.39"
react-native-swipe-gestures@^1.0.4: react-native-swipe-gestures@^1.0.4:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c" resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c"