fix: fixed timer alignment once and for all

pull/2660/head
William Grant 2 years ago
parent 162e66876e
commit a50ea95bf3

@ -4,11 +4,10 @@ import { getTimerBucketIcon } from '../../util/timer';
// tslint:disable-next-line: no-submodule-imports // tslint:disable-next-line: no-submodule-imports
import useInterval from 'react-use/lib/useInterval'; import useInterval from 'react-use/lib/useInterval';
import styled from 'styled-components'; import styled, { CSSProperties } from 'styled-components';
import { SessionIcon } from '../icon/SessionIcon'; import { SessionIcon } from '../icon/SessionIcon';
const ExpireTimerBucket = styled.div` const ExpireTimerBucket = styled.div`
margin-inline-start: 6px;
font-size: var(--font-size-xs); font-size: var(--font-size-xs);
line-height: 16px; line-height: 16px;
letter-spacing: 0.3px; letter-spacing: 0.3px;
@ -20,11 +19,11 @@ const ExpireTimerBucket = styled.div`
type Props = { type Props = {
expirationLength: number; // should be in milliseconds expirationLength: number; // should be in milliseconds
expirationTimestamp: number | null; expirationTimestamp: number | null;
isCorrectSide: boolean; style: CSSProperties;
}; };
export const ExpireTimer = (props: Props) => { export const ExpireTimer = (props: Props) => {
const { expirationLength, expirationTimestamp, isCorrectSide } = props; const { expirationLength, expirationTimestamp, style } = props;
const initialTimeLeft = Math.max(Math.round(((expirationTimestamp || 0) - Date.now()) / 1000), 0); const initialTimeLeft = Math.max(Math.round(((expirationTimestamp || 0) - Date.now()) / 1000), 0);
const [timeLeft, setTimeLeft] = useState(initialTimeLeft); const [timeLeft, setTimeLeft] = useState(initialTimeLeft);
@ -41,7 +40,7 @@ export const ExpireTimer = (props: Props) => {
const updateFrequency = 500; const updateFrequency = 500;
useInterval(update, updateFrequency); useInterval(update, updateFrequency);
if (!(isCorrectSide && expirationLength && expirationTimestamp)) { if (!(expirationLength && expirationTimestamp)) {
return null; return null;
} }
@ -50,7 +49,7 @@ export const ExpireTimer = (props: Props) => {
const bucket = getTimerBucketIcon(expirationTimestamp, expirationLength); const bucket = getTimerBucketIcon(expirationTimestamp, expirationLength);
return ( return (
<ExpireTimerBucket> <ExpireTimerBucket style={style}>
<SessionIcon iconType={bucket} iconSize="tiny" iconColor={expireTimerColor} /> <SessionIcon iconType={bucket} iconSize="tiny" iconColor={expireTimerColor} />
</ExpireTimerBucket> </ExpireTimerBucket>
); );

@ -12,11 +12,11 @@ import styled from 'styled-components';
const StyledTimerNotification = styled(Flex)` const StyledTimerNotification = styled(Flex)`
text-align: center; text-align: center;
`; `;
export const TimerNotification = (props: PropsForExpirationTimer) => { export const TimerNotification = (props: PropsForExpirationTimer) => {
const { const {
messageId, messageId,
receivedAt, receivedAt,
direction,
isUnread, isUnread,
pubkey, pubkey,
profileName, profileName,
@ -66,12 +66,15 @@ export const TimerNotification = (props: PropsForExpirationTimer) => {
<ExpirableReadableMessage <ExpirableReadableMessage
convoId={props.convoId} convoId={props.convoId}
messageId={messageId} messageId={messageId}
direction={direction} direction={type === 'fromOther' ? 'incoming' : 'outgoing'}
receivedAt={receivedAt} receivedAt={receivedAt}
isUnread={isUnread} isUnread={isUnread}
expirationLength={expirationLength} expirationLength={expirationLength}
expirationTimestamp={expirationTimestamp} expirationTimestamp={expirationTimestamp}
isExpired={props.isExpired} isExpired={props.isExpired}
isCentered={true}
marginInlineStart={`calc(var(--margins-lg) + 6px)`}
marginInlineEnd={`calc(var(--margins-lg) + 6px)`}
key={`readable-message-${messageId}`} key={`readable-message-${messageId}`}
> >
<StyledTimerNotification <StyledTimerNotification

@ -64,7 +64,9 @@ function useIsExpired(props: PropsForExpiringMessage) {
return { isExpired }; return { isExpired };
} }
const StyledReadableMessage = styled(ReadableMessage)<{ isIncoming: boolean }>` const StyledReadableMessage = styled(ReadableMessage)<{
isIncoming: boolean;
}>`
display: flex; display: flex;
justify-content: ${props => (props.isIncoming ? 'flex-start' : 'flex-end')}; justify-content: ${props => (props.isIncoming ? 'flex-start' : 'flex-end')};
align-items: center; align-items: center;
@ -75,6 +77,9 @@ export interface ExpirableReadableMessageProps
extends ReadableMessageProps, extends ReadableMessageProps,
PropsForExpiringMessage { PropsForExpiringMessage {
direction: MessageModelType; direction: MessageModelType;
isCentered?: boolean;
marginInlineStart?: string;
marginInlineEnd?: string;
} }
export const ExpirableReadableMessage = (props: ExpirableReadableMessageProps) => { export const ExpirableReadableMessage = (props: ExpirableReadableMessageProps) => {
@ -86,6 +91,9 @@ export const ExpirableReadableMessage = (props: ExpirableReadableMessageProps) =
isUnread, isUnread,
expirationLength, expirationLength,
expirationTimestamp, expirationTimestamp,
isCentered,
marginInlineStart = '6px',
marginInlineEnd = '6px',
} = props; } = props;
const expiringProps: PropsForExpiringMessage = { const expiringProps: PropsForExpiringMessage = {
@ -113,17 +121,25 @@ export const ExpirableReadableMessage = (props: ExpirableReadableMessageProps) =
> >
{expirationLength && expirationTimestamp && ( {expirationLength && expirationTimestamp && (
<ExpireTimer <ExpireTimer
isCorrectSide={!isIncoming}
expirationLength={expirationLength} expirationLength={expirationLength}
expirationTimestamp={expirationTimestamp} expirationTimestamp={expirationTimestamp}
style={{
display: !isCentered && isIncoming ? 'none' : 'block',
visibility: !isIncoming ? 'visible' : 'hidden',
marginInlineStart,
}}
/> />
)} )}
{props.children} {props.children}
{expirationLength && expirationTimestamp && ( {expirationLength && expirationTimestamp && (
<ExpireTimer <ExpireTimer
isCorrectSide={isIncoming}
expirationLength={expirationLength} expirationLength={expirationLength}
expirationTimestamp={expirationTimestamp} expirationTimestamp={expirationTimestamp}
style={{
display: !isCentered && !isIncoming ? 'none' : 'block',
visibility: isIncoming ? 'visible' : 'hidden',
marginInlineEnd,
}}
/> />
)} )}
</StyledReadableMessage> </StyledReadableMessage>

Loading…
Cancel
Save