feat: updated style for choose action overlay

created new ActionRow component
pull/3083/head
William Grant 1 year ago
parent 2a75a715a3
commit 093da15ba3

@ -101,6 +101,7 @@
"connectToServerSuccess": "Successfully connected to community", "connectToServerSuccess": "Successfully connected to community",
"contactAvatarAlt": "Avatar for contact $name$", "contactAvatarAlt": "Avatar for contact $name$",
"contactsHeader": "Contacts", "contactsHeader": "Contacts",
"contactsNone": "You don't have any contacts yet",
"contextMenuNoSuggestions": "No Suggestions", "contextMenuNoSuggestions": "No Suggestions",
"continue": "Continue", "continue": "Continue",
"conversationsHeader": "Contacts and Groups: $count$", "conversationsHeader": "Contacts and Groups: $count$",
@ -368,7 +369,7 @@
"onlyAdminCanRemoveMembers": "You are not the creator", "onlyAdminCanRemoveMembers": "You are not the creator",
"onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users",
"onlyGroupAdminsCanChange": "Only group admins can change this setting.", "onlyGroupAdminsCanChange": "Only group admins can change this setting.",
"onsErrorNotRecognised": "We couldn't recognise this ONS. Please check it and try again.", "onsErrorNotRecognized": "We couldn't recognize this ONS. Please check it and try again.",
"onsErrorUnableToSearch": "We were unable to search for this ONS. Please try again later.", "onsErrorUnableToSearch": "We were unable to search for this ONS. Please try again later.",
"open": "Open", "open": "Open",
"openGroupInvitation": "Community invitation", "openGroupInvitation": "Community invitation",

@ -48,11 +48,10 @@ const SessionIDDescription = styled.span`
text-align: center; text-align: center;
`; `;
const StyledLeftPaneOverlay = styled(Flex)` export const StyledLeftPaneOverlay = styled(Flex)`
background: var(--background-primary-color); background: var(--background-primary-color);
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
padding: var(--margins-md);
.session-button { .session-button {
width: 100%; width: 100%;
@ -121,7 +120,7 @@ export const OverlayMessage = () => {
// this might be an ONS, validate the regex first // this might be an ONS, validate the regex first
const mightBeOnsName = new RegExp(ONSResolve.onsNameRegex, 'g').test(pubkeyorOnsTrimmed); const mightBeOnsName = new RegExp(ONSResolve.onsNameRegex, 'g').test(pubkeyorOnsTrimmed);
if (!mightBeOnsName) { if (!mightBeOnsName) {
setPubkeyOrOnsError(window.i18n('onsErrorNotRecognised')); setPubkeyOrOnsError(window.i18n('onsErrorNotRecognized'));
return; return;
} }
@ -131,7 +130,7 @@ export const OverlayMessage = () => {
const idValidationError = PubKey.validateWithErrorNoBlinding(resolvedSessionID); const idValidationError = PubKey.validateWithErrorNoBlinding(resolvedSessionID);
if (idValidationError) { if (idValidationError) {
setPubkeyOrOnsError(window.i18n('onsErrorNotRecognised')); setPubkeyOrOnsError(window.i18n('onsErrorNotRecognized'));
return; return;
} }
@ -141,7 +140,7 @@ export const OverlayMessage = () => {
e instanceof SnodeResponseError e instanceof SnodeResponseError
? window.i18n('onsErrorUnableToSearch') ? window.i18n('onsErrorUnableToSearch')
: e instanceof NotFoundError : e instanceof NotFoundError
? window.i18n('onsErrorNotRecognised') ? window.i18n('onsErrorNotRecognized')
: window.i18n('failedResolveOns') : window.i18n('failedResolveOns')
); );
} finally { } finally {
@ -155,16 +154,8 @@ export const OverlayMessage = () => {
flexDirection={'column'} flexDirection={'column'}
flexGrow={1} flexGrow={1}
alignItems={'center'} alignItems={'center'}
padding={'var(--margins-md)'}
> >
{/* TODO[epic=893] Replace everywhere and test new error handling */}
{/* <SessionIdEditable
editable={!loading}
placeholder={placeholder}
onChange={setPubkeyOrOns}
dataTestId="new-session-conversation"
onPressEnter={handleMessageButtonClick}
/> */}
<SessionInput <SessionInput
autoFocus={true} autoFocus={true}
type="text" type="text"
@ -177,9 +168,7 @@ export const OverlayMessage = () => {
centerText={true} centerText={true}
inputDataTestId="new-session-conversation" inputDataTestId="new-session-conversation"
/> />
<SpacerMD /> <SpacerMD />
<SessionSpinner loading={loading} /> <SessionSpinner loading={loading} />
{!pubkeyOrOnsError && !loading ? ( {!pubkeyOrOnsError && !loading ? (

@ -0,0 +1,77 @@
import styled from 'styled-components';
import { Flex } from '../../../basic/Flex';
import { SessionIcon, SessionIconType } from '../../../icon';
const StyledActionRow = styled.button`
border: none;
padding: 0;
display: flex;
align-items: center;
transition-duration: var(--default-duration);
width: 100%;
:hover {
background: var(--conversation-tab-background-hover-color);
}
`;
export const StyledChooseActionTitle = styled.span`
color: var(--text-primary-color);
font-size: 18px;
padding: var(--margins-sm) 0;
text-align: start;
width: 100%;
`;
const StyledIcon = styled.div`
width: 58px;
margin: var(--margins-sm);
`;
const StyledHR = styled.hr`
height: 0px;
width: 100%;
border: 0.5px solid var(--border-color);
padding: 0;
margin: 0;
`;
export const StyledActionRowContainer = styled(Flex)`
width: 100%;
border-top: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
${StyledActionRow}:last-child ${StyledHR} {
border-color: transparent;
}
`;
type ActionRowProps = {
title: string;
ariaLabel: string;
iconType: SessionIconType;
onClick: () => void;
dataTestId: string;
};
export function ActionRow(props: ActionRowProps) {
const { title, ariaLabel, iconType, onClick, dataTestId } = props;
return (
<StyledActionRow onClick={onClick} data-testid={dataTestId} aria-label={ariaLabel}>
<StyledIcon>
<SessionIcon iconType={iconType} iconSize="large" iconColor="var(--text-primary-color)" />
</StyledIcon>
<Flex
container={true}
flexDirection={'column'}
justifyContent={'flex-start'}
alignItems={'flex-start'}
width={'100%'}
>
<StyledChooseActionTitle>{title}</StyledChooseActionTitle>
<StyledHR />
</Flex>
</StyledActionRow>
);
}

@ -3,47 +3,12 @@ import { useCallback, useEffect } from 'react';
import { isEmpty, isString } from 'lodash'; import { isEmpty, isString } from 'lodash';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import useKey from 'react-use/lib/useKey'; import useKey from 'react-use/lib/useKey';
import styled from 'styled-components';
import { resetLeftOverlayMode, setLeftOverlayMode } from '../../../../state/ducks/section'; import { resetLeftOverlayMode, setLeftOverlayMode } from '../../../../state/ducks/section';
import { SpacerSM } from '../../../basic/Text';
import { SessionIcon, SessionIconType } from '../../../icon'; import { StyledLeftPaneOverlay } from '../OverlayMessage';
import { ActionRow, StyledActionRowContainer } from './ActionRow';
import { ContactsListWithBreaks } from './ContactsListWithBreaks'; import { ContactsListWithBreaks } from './ContactsListWithBreaks';
const StyledActionRow = styled.button`
border: none;
display: flex;
align-items: center;
border-bottom: 1px var(--border-color) solid;
transition-duration: var(--default-duration);
width: 100%;
&:first-child {
border-top: 1px var(--border-color) solid;
}
:hover {
background: var(--conversation-tab-background-hover-color);
}
`;
export const StyledChooseActionTitle = styled.span`
color: var(--text-primary-color);
font-size: 18px;
padding: var(--margins-xs) var(--margins-lg);
`;
const StyledIcon = styled.div`
width: 58px;
`;
const IconOnActionRow = (props: { iconType: SessionIconType }) => {
return (
<StyledIcon>
<SessionIcon iconSize="medium" iconType={props.iconType} />
</StyledIcon>
);
};
export const OverlayChooseAction = () => { export const OverlayChooseAction = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
function closeOverlay() { function closeOverlay() {
@ -86,32 +51,42 @@ export const OverlayChooseAction = () => {
}, [openJoinCommunity, openNewMessage]); }, [openJoinCommunity, openNewMessage]);
return ( return (
<div className="module-left-pane-overlay"> <StyledLeftPaneOverlay
<StyledActionRow container={true}
onClick={openNewMessage} flexDirection={'column'}
data-testid="chooser-new-conversation-button" flexGrow={1}
aria-label={window.i18n('createConversationNewContact')} alignItems={'center'}
> >
<IconOnActionRow iconType="chatBubble" /> <StyledActionRowContainer
<StyledChooseActionTitle>{window.i18n('newMessage')}</StyledChooseActionTitle> container={true}
</StyledActionRow> flexDirection={'column'}
<StyledActionRow justifyContent={'flex-start'}
onClick={openCreateGroup} alignItems={'flex-start'}
data-testid="chooser-new-group"
aria-label={window.i18n('createConversationNewGroup')}
> >
<IconOnActionRow iconType="group" /> <ActionRow
<StyledChooseActionTitle>{window.i18n('createGroup')}</StyledChooseActionTitle> title={window.i18n('newMessage')}
</StyledActionRow> ariaLabel={window.i18n('createConversationNewContact')}
<StyledActionRow iconType={'chatBubble'}
onClick={openNewMessage}
dataTestId="chooser-new-conversation-button"
/>
<ActionRow
title={window.i18n('createGroup')}
ariaLabel={window.i18n('createConversationNewGroup')}
iconType={'group'}
onClick={openCreateGroup}
dataTestId="chooser-new-group"
/>
<ActionRow
title={window.i18n('joinOpenGroup')}
ariaLabel={window.i18n('joinACommunity')}
iconType={'communities'}
onClick={openJoinCommunity} onClick={openJoinCommunity}
data-testid="chooser-new-community" dataTestId="chooser-new-community"
aria-label={window.i18n('joinACommunity')} />
> </StyledActionRowContainer>
<IconOnActionRow iconType="communities" /> <SpacerSM />
<StyledChooseActionTitle>{window.i18n('joinOpenGroup')}</StyledChooseActionTitle>
</StyledActionRow>
<ContactsListWithBreaks /> <ContactsListWithBreaks />
</div> </StyledLeftPaneOverlay>
); );
}; };

@ -101,6 +101,7 @@ export type LocalizerKeys =
| 'connectingToServer' | 'connectingToServer'
| 'contactAvatarAlt' | 'contactAvatarAlt'
| 'contactsHeader' | 'contactsHeader'
| 'contactsNone'
| 'contextMenuNoSuggestions' | 'contextMenuNoSuggestions'
| 'continue' | 'continue'
| 'conversationId' | 'conversationId'
@ -368,7 +369,7 @@ export type LocalizerKeys =
| 'onlyAdminCanRemoveMembers' | 'onlyAdminCanRemoveMembers'
| 'onlyAdminCanRemoveMembersDesc' | 'onlyAdminCanRemoveMembersDesc'
| 'onlyGroupAdminsCanChange' | 'onlyGroupAdminsCanChange'
| 'onsErrorNotRecognised' | 'onsErrorNotRecognized'
| 'onsErrorUnableToSearch' | 'onsErrorUnableToSearch'
| 'open' | 'open'
| 'openGroupInvitation' | 'openGroupInvitation'

Loading…
Cancel
Save