From 80cc7c723f92d889d771f60aae9fa73bfed91b8d Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Mon, 9 Sep 2024 18:20:16 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8(frontend)=20enhance=20accessibilit?= =?UTF-8?q?y=20of=20'copy=20link'=20button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added user feedback for actions with explicit text indicating URL will be copied to clipboard. Modeled after Jitsi's button behavior for clarity and consistency in user experience. --- .../rooms/components/InviteDialog.tsx | 92 ++++++++++++------- src/frontend/src/locales/de/rooms.json | 1 + src/frontend/src/locales/en/rooms.json | 3 +- src/frontend/src/locales/fr/rooms.json | 3 +- 4 files changed, 64 insertions(+), 35 deletions(-) diff --git a/src/frontend/src/features/rooms/components/InviteDialog.tsx b/src/frontend/src/features/rooms/components/InviteDialog.tsx index 520468fa..2006586f 100644 --- a/src/frontend/src/features/rooms/components/InviteDialog.tsx +++ b/src/frontend/src/features/rooms/components/InviteDialog.tsx @@ -4,7 +4,13 @@ import { Div, Button, type DialogProps, P } from '@/primitives' import { HStack, styled, VStack } from '@/styled-system/jsx' import { Heading, Dialog } from 'react-aria-components' import { Text, text } from '@/primitives/Text' -import { RiCloseLine, RiFileCopyLine, RiSpam2Fill } from '@remixicon/react' +import { + RiCheckLine, + RiCloseLine, + RiFileCopyLine, + RiSpam2Fill, +} from '@remixicon/react' +import { useEffect, useState } from 'react' // fixme - extract in a proper primitive this dialog without overlay const StyledRACDialog = styled(Dialog, { @@ -34,17 +40,25 @@ export const InviteDialog = ({ const { t } = useTranslation('rooms') const roomUrl = getRouteUrl('room', roomId) + const [isCopied, setIsCopied] = useState(false) + + useEffect(() => { + if (isCopied) { + const timeout = setTimeout(() => setIsCopied(false), 3000) + return () => clearTimeout(timeout) + } + }, [isCopied]) + + const [isHovered, setIsHovered] = useState(false) + return ( {({ close }) => ( {t('shareDialog.heading')} @@ -63,36 +77,48 @@ export const InviteDialog = ({

{t('shareDialog.description')}

- { + navigator.clipboard.writeText(roomUrl) + setIsCopied(true) + }} + onHoverChange={setIsHovered} > -
- {roomUrl.replace(/^https?:\/\//, '')} -
- -
+ {isCopied ? ( + <> + + {t('shareDialog.copied')} + + ) : ( + <> + + {isHovered ? ( + t('shareDialog.copy') + ) : ( +
+ {roomUrl.replace(/^https?:\/\//, '')} +
+ )} + + )} +