You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/Avatar.tsx

142 lines
3.8 KiB
TypeScript

import React, { useCallback, useState } from 'react';
import classNames from 'classnames';
import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder';
import { ConversationAvatar } from './session/usingClosedConversationDetails';
import { useEncryptedFileFetch } from '../hooks/useEncryptedFileFetch';
import _ from 'underscore';
export enum AvatarSize {
XS = 28,
S = 36,
M = 48,
L = 64,
XL = 80,
HUGE = 300,
}
type Props = {
avatarPath?: string | null;
Session 1.7.2 (#1932) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * Fix path building (#1903) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * fix link preview cropped when received * make sure we fetch from seed if we end up with not enough snodes * try to download recent previews if we just trusted a user * throw if we need to rebuild path while fetching snode list from snode * fixup no refecthing of snode list while we are fetching them already * added test for fetch from db or seed * fetch snode list from snode every hour also make sure the path building does not try to get more snodes. It just throws * do not drop a path if an opengroup room is down and we get errors back * do not throw an error if the snode in error in not in any path * fix tests * bump to v1.7.11 * disable sending on enter while composing (#1909) Fixes #1899 #1497 * Speedup body update composition box (#1911) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * move drafts outside of redux to speedup body message writing * Ask confirm before delete account (#1910) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * fix app start delete db when passowrd error * fix double dialog issue with delete account * fixup login screen * use timestamp offset in for messages storage requests (#1892) * add using timestamp offset from network for sending part1 * remove MessageController as we now rely on the database * fix tests for message sending overriding timestamp * Fix today for translated date break (#1915) * add using timestamp offset from network for sending part1 * remove MessageController as we now rely on the database * fix tests for message sending overriding timestamp * Fixs date break translations of today etc Relates #1913 * Fix video play lightbox autostart (#1920) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * fix app start delete db when passowrd error * fix double dialog issue with delete account * fixup login screen * Fix video autoplay start when not initialized Relates #1904 * do not overwrite sent_at with network time for synced messages (#1921) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Out of sync message sync (#1923) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Allow scrolling in mentioning people in composition box Relates #1849 * Fix select colors for sent messages and link text not selectable (#1924) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Allow scrolling in mentioning people in composition box Relates #1849 * fix selection colors for sent messages and make link selectable Relates #1922 * Cleanup redux store (#1925) * do not consider expire timer update unread messages #1881 * cleanup conversation props in redux to only have what cannot be derived * fix app not starting without the await on convo creation * cleanup props of message model * Unsend messages (only message hashes saving for now is enabled) (#1891) * WIP unsending message. * retrieving message with hash from db on receiving unsend request. * outgoing messages hashes updated on message sent success * unsend messaging * unsend message - deleting messages and marking as isDeleted. * add msg hash to unprocessed records. * Message unsending working for closed groups provided the message has been updated with a hash from server. * adding 2-stage confirmation modal for message deletion * adding rendering of removed incoming messages, disabling rendering of unsent outgoing messages in coversation screen. * Adding logging * debugging. * outgoing only saved for sync message instead of regular message. * deleting locally * adding post unsend deletioncode. * starting adding feature flag. * Added feature flag. * addding mandatory messageHash pollling pipeline methods swarm polling. * Conversation list item message preview showing deletion placeholder text if deleted. * add condition to drop unsend requests not send by message author * refactoring deleteMessage. Saving response hash for closed group message sending * running yarn ready * removing logging. * Adding PR fixes * Minor changes and running yarn ready * fix typo * Moved feature flag to lokiFeatureFlags. Fixing linting errors Co-authored-by: Audric Ackermann <audric@loki.network> * fix reply for incoming messages (#1930) * bump to 1.7.2 (#1926) * do not consider expire timer update unread messages #1881 * cleanup conversation props in redux to only have what cannot be derived * fix app not starting without the await on convo creation * cleanup props of message model * bump to 1.7.2 * Session 1.7.1 (#1908) (#1931) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * Fix path building (#1903) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * fix link preview cropped when received * make sure we fetch from seed if we end up with not enough snodes * try to download recent previews if we just trusted a user * throw if we need to rebuild path while fetching snode list from snode * fixup no refecthing of snode list while we are fetching them already * added test for fetch from db or seed * fetch snode list from snode every hour also make sure the path building does not try to get more snodes. It just throws * do not drop a path if an opengroup room is down and we get errors back * do not throw an error if the snode in error in not in any path * fix tests * bump to v1.7.11 * disable unsend request on the UI for now (#1934) * disable unsend request on the UI too * do not stop propagation of events for message ctx menu Co-authored-by: Warrick <wcor690@aucklanduni.ac.nz>
4 years ago
name?: string; // display name, profileName or pubkey, whatever is set first
pubkey?: string;
size: AvatarSize;
base64Data?: string; // if this is not empty, it will be used to render the avatar with base64 encoded data
memberAvatars?: Array<ConversationAvatar>; // this is added by usingClosedConversationDetails
onAvatarClick?: () => void;
};
const Identicon = (props: Props) => {
const { size, name, pubkey } = props;
const userName = name || '0';
return (
<AvatarPlaceHolder
diameter={size}
name={userName}
pubkey={pubkey}
colors={['#5ff8b0', '#26cdb9', '#f3c615', '#fcac5a']}
borderColor={'#00000059'}
/>
);
};
const NoImage = (props: {
memberAvatars?: Array<ConversationAvatar>;
name?: string;
pubkey?: string;
size: AvatarSize;
onAvatarClick?: () => void;
}) => {
const { name, memberAvatars, size, pubkey } = props;
// if no image but we have conversations set for the group, renders group members avatars
if (memberAvatars) {
return (
<ClosedGroupAvatar
size={size}
memberAvatars={memberAvatars}
onAvatarClick={props.onAvatarClick}
/>
);
6 years ago
}
return <Identicon size={size} name={name} pubkey={pubkey} />;
};
const AvatarImage = (props: {
avatarPath?: string;
base64Data?: string;
Session 1.7.2 (#1932) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * Fix path building (#1903) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * fix link preview cropped when received * make sure we fetch from seed if we end up with not enough snodes * try to download recent previews if we just trusted a user * throw if we need to rebuild path while fetching snode list from snode * fixup no refecthing of snode list while we are fetching them already * added test for fetch from db or seed * fetch snode list from snode every hour also make sure the path building does not try to get more snodes. It just throws * do not drop a path if an opengroup room is down and we get errors back * do not throw an error if the snode in error in not in any path * fix tests * bump to v1.7.11 * disable sending on enter while composing (#1909) Fixes #1899 #1497 * Speedup body update composition box (#1911) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * move drafts outside of redux to speedup body message writing * Ask confirm before delete account (#1910) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * fix app start delete db when passowrd error * fix double dialog issue with delete account * fixup login screen * use timestamp offset in for messages storage requests (#1892) * add using timestamp offset from network for sending part1 * remove MessageController as we now rely on the database * fix tests for message sending overriding timestamp * Fix today for translated date break (#1915) * add using timestamp offset from network for sending part1 * remove MessageController as we now rely on the database * fix tests for message sending overriding timestamp * Fixs date break translations of today etc Relates #1913 * Fix video play lightbox autostart (#1920) * disable sending on enter while composing Fixes #1899 #1497 * ask confirmation before deleting account * fix app start delete db when passowrd error * fix double dialog issue with delete account * fixup login screen * Fix video autoplay start when not initialized Relates #1904 * do not overwrite sent_at with network time for synced messages (#1921) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Out of sync message sync (#1923) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Allow scrolling in mentioning people in composition box Relates #1849 * Fix select colors for sent messages and link text not selectable (#1924) * do not update sent_at for synced messages * reply to message context menu only visible if msg sent * Allow scrolling in mentioning people in composition box Relates #1849 * fix selection colors for sent messages and make link selectable Relates #1922 * Cleanup redux store (#1925) * do not consider expire timer update unread messages #1881 * cleanup conversation props in redux to only have what cannot be derived * fix app not starting without the await on convo creation * cleanup props of message model * Unsend messages (only message hashes saving for now is enabled) (#1891) * WIP unsending message. * retrieving message with hash from db on receiving unsend request. * outgoing messages hashes updated on message sent success * unsend messaging * unsend message - deleting messages and marking as isDeleted. * add msg hash to unprocessed records. * Message unsending working for closed groups provided the message has been updated with a hash from server. * adding 2-stage confirmation modal for message deletion * adding rendering of removed incoming messages, disabling rendering of unsent outgoing messages in coversation screen. * Adding logging * debugging. * outgoing only saved for sync message instead of regular message. * deleting locally * adding post unsend deletioncode. * starting adding feature flag. * Added feature flag. * addding mandatory messageHash pollling pipeline methods swarm polling. * Conversation list item message preview showing deletion placeholder text if deleted. * add condition to drop unsend requests not send by message author * refactoring deleteMessage. Saving response hash for closed group message sending * running yarn ready * removing logging. * Adding PR fixes * Minor changes and running yarn ready * fix typo * Moved feature flag to lokiFeatureFlags. Fixing linting errors Co-authored-by: Audric Ackermann <audric@loki.network> * fix reply for incoming messages (#1930) * bump to 1.7.2 (#1926) * do not consider expire timer update unread messages #1881 * cleanup conversation props in redux to only have what cannot be derived * fix app not starting without the await on convo creation * cleanup props of message model * bump to 1.7.2 * Session 1.7.1 (#1908) (#1931) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * Fix path building (#1903) * Keep line breaks when message has some new lines Relates #1758 and #1898 and #1901 * fix link preview cropped when received * make sure we fetch from seed if we end up with not enough snodes * try to download recent previews if we just trusted a user * throw if we need to rebuild path while fetching snode list from snode * fixup no refecthing of snode list while we are fetching them already * added test for fetch from db or seed * fetch snode list from snode every hour also make sure the path building does not try to get more snodes. It just throws * do not drop a path if an opengroup room is down and we get errors back * do not throw an error if the snode in error in not in any path * fix tests * bump to v1.7.11 * disable unsend request on the UI for now (#1934) * disable unsend request on the UI too * do not stop propagation of events for message ctx menu Co-authored-by: Warrick <wcor690@aucklanduni.ac.nz>
4 years ago
name?: string; // display name, profileName or pubkey, whatever is set first
imageBroken: boolean;
handleImageError: () => any;
}) => {
const { avatarPath, base64Data, name, imageBroken, handleImageError } = props;
const onDragStart = useCallback((e: any) => {
e.preventDefault();
return false;
}, []);
if ((!avatarPath && !base64Data) || imageBroken) {
return null;
}
const dataToDisplay = base64Data ? `data:image/jpeg;base64,${base64Data}` : avatarPath;
return (
<img
onError={handleImageError}
onDragStart={onDragStart}
alt={window.i18n('contactAvatarAlt', [name])}
src={dataToDisplay}
/>
);
};
const AvatarInner = (props: Props) => {
const { avatarPath, base64Data, size, memberAvatars, name } = props;
const [imageBroken, setImageBroken] = useState(false);
// contentType is not important
const { urlToLoad } = useEncryptedFileFetch(avatarPath || '', '');
const handleImageError = () => {
window.log.warn(
'Avatar: Image failed to load; failing over to placeholder',
urlToLoad,
avatarPath
);
setImageBroken(true);
};
const isClosedGroupAvatar = Boolean(memberAvatars?.length);
const hasImage = (base64Data || urlToLoad) && !imageBroken && !isClosedGroupAvatar;
const isClickable = !!props.onAvatarClick;
return (
<div
className={classNames(
'module-avatar',
`module-avatar--${size}`,
hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image',
isClickable && 'module-avatar-clickable'
)}
onClick={e => {
e.stopPropagation();
props.onAvatarClick?.();
}}
role="button"
>
{hasImage ? (
<AvatarImage
avatarPath={urlToLoad}
base64Data={base64Data}
imageBroken={imageBroken}
name={name}
handleImageError={handleImageError}
/>
) : (
<NoImage {...props} />
)}
</div>
);
};
export const Avatar = React.memo(AvatarInner, _.isEqual);