From c54a438f7c06d7f611bad2d8f788d9f592d1d851 Mon Sep 17 00:00:00 2001
From: Audric Ackermann <audric@loki.network>
Date: Thu, 25 Aug 2022 15:50:28 +1000
Subject: [PATCH] fix: add some aria labels and match QA test

---
 _locales/en/messages.json                      |  6 +++++-
 stylesheets/_session.scss                      |  2 +-
 ts/components/MemberListItem.tsx               |  6 ++++--
 ts/components/button/MenuButton.tsx            | 11 +++--------
 .../leftpane/overlay/OverlayClosedGroup.tsx    |  7 +++++--
 .../leftpane/overlay/OverlayCommunity.tsx      | 15 +++++++--------
 .../leftpane/overlay/OverlayMessage.tsx        |  5 ++++-
 .../overlay/choose-action/ContactRow.tsx       |  2 +-
 .../choose-action/OverlayChooseAction.tsx      | 18 +++++++++++++++---
 ts/session/constants.ts                        |  2 +-
 ts/types/LocalizerKeys.ts                      | 13 ++++++++-----
 11 files changed, 54 insertions(+), 33 deletions(-)

diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index ed182279d..66698ad49 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -152,6 +152,10 @@
   "noNameOrMessage": "No name or content",
   "nameOnly": "Name Only",
   "newMessage": "New Message",
+  "createConversationNewContact": "Create a conversation with a new contact",
+  "createConversationNewGroup": "Create a group with existing contacts",
+  "joinACommunity": "Join a community",
+  "chooseAnAction": "Choose an action to start a conversation",
   "newMessages": "New Messages",
   "notificationMostRecentFrom": "Most recent from: $name$",
   "notificationFrom": "From:",
@@ -283,7 +287,7 @@
   "changePasswordToastDescription": "Your password has been changed. Please keep it safe.",
   "removePasswordToastDescription": "You have removed your password.",
   "publicChatExists": "You are already connected to this community",
-  "connectToServerFail": "Couldn't join group",
+  "connectToServerFail": "Couldn't join community",
   "connectingToServer": "Connecting...",
   "connectToServerSuccess": "Successfully connected to community",
   "setPasswordFail": "Failed to set password",
diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss
index f5be5ca56..29131282f 100644
--- a/stylesheets/_session.scss
+++ b/stylesheets/_session.scss
@@ -96,7 +96,7 @@ textarea {
   background-color: rgba(0, 0, 0, 0);
 
   &.disabled {
-    cursor: default;
+    cursor: not-allowed;
   }
 
   &.default,
diff --git a/ts/components/MemberListItem.tsx b/ts/components/MemberListItem.tsx
index bf54d7eab..8470224b1 100644
--- a/ts/components/MemberListItem.tsx
+++ b/ts/components/MemberListItem.tsx
@@ -18,7 +18,7 @@ const AvatarItem = (props: { memberPubkey: string; isAdmin: boolean }) => {
   );
 };
 
-const StyledSessionMemberItem = styled.div<{
+const StyledSessionMemberItem = styled.button<{
   inMentions?: boolean;
   zombie?: boolean;
   selected?: boolean;
@@ -29,6 +29,9 @@ const StyledSessionMemberItem = styled.div<{
   padding: 0px var(--margins-sm);
   height: ${props => (props.inMentions ? '40px' : '50px')};
   display: flex;
+
+  align-items: center;
+
   justify-content: space-between;
   transition: var(--default-duration);
 
@@ -99,7 +102,6 @@ export const MemberListItem = (props: {
             }
           : {}
       }
-      role="button"
       data-testid={dataTestId}
       zombie={isZombie}
       inMentions={inMentions}
diff --git a/ts/components/button/MenuButton.tsx b/ts/components/button/MenuButton.tsx
index 889c966ca..c1626f30a 100644
--- a/ts/components/button/MenuButton.tsx
+++ b/ts/components/button/MenuButton.tsx
@@ -6,7 +6,7 @@ import { getOverlayMode } from '../../state/selectors/section';
 import { SessionIcon } from '../icon';
 // tslint:disable: use-simple-attributes
 
-const StyledMenuButton = styled.label`
+const StyledMenuButton = styled.button`
   position: relative;
   display: inline-block;
 
@@ -25,12 +25,6 @@ const StyledMenuButton = styled.label`
   }
 `;
 
-const StyledMenuInput = styled.input`
-  opacity: 0;
-  width: 0;
-  height: 0;
-`;
-
 /**
  * This is the Session Menu Botton. i.e. the button on top of the conversation list to start a new conversation.
  * It has two state: selected or not and so we use an checkbox input to keep the state in sync.
@@ -54,13 +48,14 @@ export const MenuButton = () => {
           '--fg-color': 'white',
         } as CSSProperties
       }
+      onClick={onClickFn}
     >
-      <StyledMenuInput type="checkbox" checked={isToggled} onClick={onClickFn} />
       <SessionIcon
         iconSize="small"
         iconType="plusFat"
         iconColor="var(--fg-color)"
         iconRotation={isToggled ? 45 : 0}
+        aria-label={window.i18n('chooseAnAction')}
       />
     </StyledMenuButton>
   );
diff --git a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
index c07acfd3d..ffd0eb72e 100644
--- a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
+++ b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx
@@ -17,6 +17,7 @@ import useKey from 'react-use/lib/useKey';
 import styled from 'styled-components';
 import { SessionSearchInput } from '../../SessionSearchInput';
 import { getSearchResults, isSearching } from '../../../state/selectors/search';
+import { VALIDATION } from '../../../session/constants';
 
 const StyledMemberListNoContacts = styled.div`
   font-family: var(--font-font-mono);
@@ -101,6 +102,8 @@ export const OverlayClosedGroup = () => {
   }
   const contactsToRender = isSearch ? sharedWithResults : privateContactsPubkeys;
 
+  const disableCreateButton = !selectedMemberIds.length && !groupName.length;
+
   return (
     <div className="module-left-pane-overlay">
       <OverlayHeader title={title} subtitle={subtitle} />
@@ -110,7 +113,7 @@ export const OverlayClosedGroup = () => {
           placeholder={placeholder}
           value={groupName}
           isGroup={true}
-          maxLength={100}
+          maxLength={VALIDATION.MAX_GROUP_NAME_LENGTH}
           onChange={setGroupName}
           onPressEnter={onEnterPressed}
           dataTestId="new-closed-group-name"
@@ -150,7 +153,7 @@ export const OverlayClosedGroup = () => {
         buttonColor={SessionButtonColor.Green}
         buttonType={SessionButtonType.BrandOutline}
         text={buttonText}
-        disabled={noContactsForClosedGroup}
+        disabled={disableCreateButton}
         onClick={onEnterPressed}
         dataTestId="next-button"
         margin="auto 0 var(--margins-lg) 0 " // just to keep that button at the bottom of the overlay (even with an empty list)
diff --git a/ts/components/leftpane/overlay/OverlayCommunity.tsx b/ts/components/leftpane/overlay/OverlayCommunity.tsx
index 8fac9962f..666dac439 100644
--- a/ts/components/leftpane/overlay/OverlayCommunity.tsx
+++ b/ts/components/leftpane/overlay/OverlayCommunity.tsx
@@ -78,14 +78,13 @@ export const OverlayCommunity = () => {
 
       <SessionSpinner loading={loading} />
       <SessionJoinableRooms onRoomClicked={closeOverlay} />
-      {groupUrl && (
-        <SessionButton
-          buttonColor={SessionButtonColor.Green}
-          buttonType={SessionButtonType.BrandOutline}
-          text={buttonText}
-          onClick={onEnterPressed}
-        />
-      )}
+      <SessionButton
+        buttonColor={SessionButtonColor.Green}
+        buttonType={SessionButtonType.BrandOutline}
+        text={buttonText}
+        disabled={!groupUrl}
+        onClick={onEnterPressed}
+      />
     </div>
   );
 };
diff --git a/ts/components/leftpane/overlay/OverlayMessage.tsx b/ts/components/leftpane/overlay/OverlayMessage.tsx
index a19836c37..781ec820b 100644
--- a/ts/components/leftpane/overlay/OverlayMessage.tsx
+++ b/ts/components/leftpane/overlay/OverlayMessage.tsx
@@ -45,6 +45,8 @@ export const OverlayMessage = () => {
   const subtitle = window.i18n('enterSessionIDOrONSName');
   const placeholder = window.i18n('enterSessionIDOfRecipient');
 
+  const disableNextButton = !pubkeyOrOns || loading;
+
   async function openConvoOnceResolved(resolvedSessionID: string) {
     const convo = await getConversationController().getOrCreateAndWait(
       resolvedSessionID,
@@ -105,6 +107,7 @@ export const OverlayMessage = () => {
         placeholder={placeholder}
         onChange={setPubkeyOrOns}
         dataTestId="new-session-conversation"
+        onPressEnter={handleMessageButtonClick}
       />
 
       <SessionSpinner loading={loading} />
@@ -128,7 +131,7 @@ export const OverlayMessage = () => {
         buttonColor={SessionButtonColor.Green}
         buttonType={SessionButtonType.BrandOutline}
         text={buttonText}
-        disabled={false}
+        disabled={disableNextButton}
         onClick={handleMessageButtonClick}
         dataTestId="next-new-conversation-button"
       />
diff --git a/ts/components/leftpane/overlay/choose-action/ContactRow.tsx b/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
index 853d235c1..06ae33b37 100644
--- a/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
+++ b/ts/components/leftpane/overlay/choose-action/ContactRow.tsx
@@ -41,7 +41,7 @@ const StyledContactRowName = styled.div`
   font-size: var(--font-size-lg);
 `;
 
-const StyledRowContainer = styled.div`
+const StyledRowContainer = styled.button`
   display: flex;
   align-items: center;
   padding: 0 var(--margins-lg);
diff --git a/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx b/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
index d662f5a78..4b1571e67 100644
--- a/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
+++ b/ts/components/leftpane/overlay/choose-action/OverlayChooseAction.tsx
@@ -66,15 +66,27 @@ export const OverlayChooseAction = () => {
 
   return (
     <div className="module-left-pane-overlay">
-      <StyledActionRow onClick={openNewMessage} data-testid="chooser-new-conversation-button">
+      <StyledActionRow
+        onClick={openNewMessage}
+        data-testid="chooser-new-conversation-button"
+        aria-label={window.i18n('createConversationNewContact')}
+      >
         <IconOnActionRow iconType="chatBubble" />
         <StyledChooseActionTitle>{window.i18n('newMessage')}</StyledChooseActionTitle>
       </StyledActionRow>
-      <StyledActionRow onClick={openCreateGroup} data-testid="chooser-new-group">
+      <StyledActionRow
+        onClick={openCreateGroup}
+        data-testid="chooser-new-group"
+        aria-label={window.i18n('createConversationNewGroup')}
+      >
         <IconOnActionRow iconType="group" />
         <StyledChooseActionTitle>{window.i18n('createGroup')}</StyledChooseActionTitle>
       </StyledActionRow>
-      <StyledActionRow onClick={openJoinCommunity} data-testid="chooser-new-community">
+      <StyledActionRow
+        onClick={openJoinCommunity}
+        data-testid="chooser-new-community"
+        aria-label={window.i18n('joinACommunity')}
+      >
         <IconOnActionRow iconType="communities" />
         <StyledChooseActionTitle>{window.i18n('joinOpenGroup')}</StyledChooseActionTitle>
       </StyledActionRow>
diff --git a/ts/session/constants.ts b/ts/session/constants.ts
index 44d64a627..9517c6a29 100644
--- a/ts/session/constants.ts
+++ b/ts/session/constants.ts
@@ -45,7 +45,7 @@ export const CONVERSATION = {
 export const MAX_ATTACHMENT_FILESIZE_BYTES = 6 * 1000 * 1000; // 6MB
 
 export const VALIDATION = {
-  MAX_GROUP_NAME_LENGTH: 64,
+  MAX_GROUP_NAME_LENGTH: 30,
   CLOSED_GROUP_SIZE_LIMIT: 100,
 };
 
diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts
index 7d504ef7c..0c9a2889b 100644
--- a/ts/types/LocalizerKeys.ts
+++ b/ts/types/LocalizerKeys.ts
@@ -62,12 +62,14 @@ export type LocalizerKeys =
   | 'timerOption_1_hour'
   | 'youGotKickedFromGroup'
   | 'cannotRemoveCreatorFromGroupDesc'
+  | 'contactAvatarAlt'
   | 'incomingError'
   | 'notificationsSettingsTitle'
   | 'ringing'
   | 'tookAScreenshot'
   | 'from'
   | 'thisMonth'
+  | 'chooseAnAction'
   | 'next'
   | 'addModerators'
   | 'sessionMessenger'
@@ -79,6 +81,7 @@ export type LocalizerKeys =
   | 'openMessageRequestInbox'
   | 'enterPassword'
   | 'enterSessionIDOfRecipient'
+  | 'join'
   | 'dialogClearAllDataDeletionFailedMultiple'
   | 'clearAllReactions'
   | 'pinConversationLimitToastDescription'
@@ -166,6 +169,7 @@ export type LocalizerKeys =
   | 'copyOpenGroupURL'
   | 'setPasswordInvalid'
   | 'timerOption_30_seconds_abbreviated'
+  | 'createConversationNewContact'
   | 'removeResidueMembers'
   | 'areYouSureDeleteEntireAccount'
   | 'noGivenPassword'
@@ -194,6 +198,7 @@ export type LocalizerKeys =
   | 'incomingCallFrom'
   | 'timerSetOnSync'
   | 'deleteMessages'
+  | 'searchForContactsOnly'
   | 'spellCheckTitle'
   | 'translation'
   | 'editMenuSelectAll'
@@ -236,7 +241,6 @@ export type LocalizerKeys =
   | 'invalidSessionId'
   | 'audioPermissionNeeded'
   | 'createGroup'
-  | 'create'
   | 'add'
   | 'messageRequests'
   | 'show'
@@ -255,6 +259,7 @@ export type LocalizerKeys =
   | 'hideMenuBarTitle'
   | 'imageCaptionIconAlt'
   | 'sendRecoveryPhraseTitle'
+  | 'joinACommunity'
   | 'multipleJoinedTheGroup'
   | 'messageRequestAcceptedOursNoName'
   | 'databaseError'
@@ -291,6 +296,7 @@ export type LocalizerKeys =
   | 'cancel'
   | 'decline'
   | 'originalMessageNotFound'
+  | 'create'
   | 'autoUpdateRestartButtonLabel'
   | 'deleteConversationConfirmation'
   | 'timerOption_6_hours_abbreviated'
@@ -313,7 +319,7 @@ export type LocalizerKeys =
   | 'error'
   | 'clearAllData'
   | 'pruningOpengroupDialogTitle'
-  | 'contactAvatarAlt'
+  | 'createConversationNewGroup'
   | 'disappearingMessages'
   | 'autoUpdateNewVersionTitle'
   | 'linkPreviewDescription'
@@ -371,7 +377,6 @@ export type LocalizerKeys =
   | 'audioMessageAutoplayTitle'
   | 'removePasswordInvalid'
   | 'password'
-  | 'usersCanShareTheir...'
   | 'nicknamePlaceholder'
   | 'linkPreviewsTitle'
   | 'continue'
@@ -399,7 +404,6 @@ export type LocalizerKeys =
   | 'closedGroupMaxSize'
   | 'messagesHeader'
   | 'joinOpenGroup'
-  | 'join'
   | 'callMediaPermissionsDialogContent'
   | 'timerOption_1_day_abbreviated'
   | 'about'
@@ -457,7 +461,6 @@ export type LocalizerKeys =
   | 'trustThisContactDialogDescription'
   | 'unknownCountry'
   | 'searchFor...'
-  | 'searchForContactsOnly'
   | 'joinedTheGroup'
   | 'editGroupName'
   | 'reportIssue';