From 39b9cf4eed096b398940ffba6d0f2449f4856363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Tue, 6 Dec 2022 22:17:23 +0100 Subject: [PATCH 1/2] Show Unauthorized modal for 'X people going' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/features/event/components/event-header.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/soapbox/features/event/components/event-header.tsx b/app/soapbox/features/event/components/event-header.tsx index b38ca8959..0cb0fbe75 100644 --- a/app/soapbox/features/event/components/event-header.tsx +++ b/app/soapbox/features/event/components/event-header.tsx @@ -329,9 +329,13 @@ const EventHeader: React.FC = ({ status }) => { e.preventDefault(); e.stopPropagation(); - dispatch(openModal('EVENT_PARTICIPANTS', { - statusId: status.id, - })); + if (!ownAccount) { + dispatch(openModal('UNAUTHORIZED')); + } else { + dispatch(openModal('EVENT_PARTICIPANTS', { + statusId: status.id, + })); + } }; return ( From 3855d966afef7141c8be01584cf9197510923b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Tue, 6 Dec 2022 22:23:43 +0100 Subject: [PATCH 2/2] Add 'View event on {domain}' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/components/status-action-bar.tsx | 16 ++-------- .../event/components/event-header.tsx | 30 +++++++++++-------- app/soapbox/utils/copy.ts | 23 ++++++++++++++ 3 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 app/soapbox/utils/copy.ts diff --git a/app/soapbox/components/status-action-bar.tsx b/app/soapbox/components/status-action-bar.tsx index bd9c824d2..6cb8fffb4 100644 --- a/app/soapbox/components/status-action-bar.tsx +++ b/app/soapbox/components/status-action-bar.tsx @@ -20,6 +20,7 @@ import { HStack } from 'soapbox/components/ui'; import DropdownMenuContainer from 'soapbox/containers/dropdown-menu-container'; import { useAppDispatch, useAppSelector, useFeatures, useOwnAccount, useSettings, useSoapboxConfig } from 'soapbox/hooks'; import { isLocal, isRemote } from 'soapbox/utils/accounts'; +import copy from 'soapbox/utils/copy'; import { getReactForStatus, reduceEmoji } from 'soapbox/utils/emoji-reacts'; import type { Menu } from 'soapbox/components/dropdown-menu'; @@ -267,21 +268,8 @@ const StatusActionBar: React.FC = ({ const handleCopy: React.EventHandler = (e) => { const { uri } = status; - const textarea = document.createElement('textarea'); - textarea.textContent = uri; - textarea.style.position = 'fixed'; - - document.body.appendChild(textarea); - - try { - textarea.select(); - document.execCommand('copy'); - } catch { - // Do nothing - } finally { - document.body.removeChild(textarea); - } + copy(uri); }; const onModerate: React.MouseEventHandler = (e) => { diff --git a/app/soapbox/features/event/components/event-header.tsx b/app/soapbox/features/event/components/event-header.tsx index 0cb0fbe75..4c2b1bc4b 100644 --- a/app/soapbox/features/event/components/event-header.tsx +++ b/app/soapbox/features/event/components/event-header.tsx @@ -19,6 +19,8 @@ import { Button, HStack, IconButton, Menu, MenuButton, MenuDivider, MenuItem, Me import SvgIcon from 'soapbox/components/ui/icon/svg-icon'; import VerificationBadge from 'soapbox/components/verification-badge'; import { useAppDispatch, useFeatures, useOwnAccount } from 'soapbox/hooks'; +import { isRemote } from 'soapbox/utils/accounts'; +import copy from 'soapbox/utils/copy'; import { download } from 'soapbox/utils/download'; import { shortNumberFormat } from 'soapbox/utils/numbers'; @@ -33,6 +35,7 @@ const messages = defineMessages({ bannerHeader: { id: 'event.banner', defaultMessage: 'Event banner' }, exportIcs: { id: 'event.export_ics', defaultMessage: 'Export to your calendar' }, copy: { id: 'event.copy', defaultMessage: 'Copy link to event' }, + external: { id: 'event.external', defaultMessage: 'View event on {domain}' }, bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, unbookmark: { id: 'status.unbookmark', defaultMessage: 'Remove bookmark' }, quotePost: { id: 'status.quote', defaultMessage: 'Quote post' }, @@ -105,21 +108,12 @@ const EventHeader: React.FC = ({ status }) => { const handleCopy = () => { const { uri } = status; - const textarea = document.createElement('textarea'); - textarea.textContent = uri; - textarea.style.position = 'fixed'; - - document.body.appendChild(textarea); + copy(uri); + }; - try { - textarea.select(); - document.execCommand('copy'); - } catch { - // Do nothing - } finally { - document.body.removeChild(textarea); - } + const handleExternalClick = () => { + window.open(status.uri, '_blank'); }; const handleBookmarkClick = () => { @@ -196,6 +190,8 @@ const EventHeader: React.FC = ({ status }) => { }; const makeMenu = (): MenuType => { + const domain = account.fqn.split('@')[1]; + const menu: MenuType = [ { text: intl.formatMessage(messages.exportIcs), @@ -209,6 +205,14 @@ const EventHeader: React.FC = ({ status }) => { }, ]; + if (features.federating && isRemote(account)) { + menu.push({ + text: intl.formatMessage(messages.external, { domain }), + action: handleExternalClick, + icon: require('@tabler/icons/external-link.svg'), + }); + } + if (!ownAccount) return menu; if (features.bookmarks) { diff --git a/app/soapbox/utils/copy.ts b/app/soapbox/utils/copy.ts new file mode 100644 index 000000000..4eea324f5 --- /dev/null +++ b/app/soapbox/utils/copy.ts @@ -0,0 +1,23 @@ +const copy = (text: string) => { + if (navigator.clipboard) { + navigator.clipboard.writeText(text); + } else { + const textarea = document.createElement('textarea'); + + textarea.textContent = text; + textarea.style.position = 'fixed'; + + document.body.appendChild(textarea); + + try { + textarea.select(); + document.execCommand('copy'); + } catch { + // Do nothing + } finally { + document.body.removeChild(textarea); + } + } +}; + +export default copy;