From 8380c8e091b025f1857eedaeabab5121a1f1bca5 Mon Sep 17 00:00:00 2001 From: danidfra Date: Thu, 3 Oct 2024 15:30:51 -0300 Subject: [PATCH 1/5] Update: Add NIP-05 warning to Post Composer --- src/features/compose/components/compose-form.tsx | 5 +++-- src/features/compose/editor/index.tsx | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/features/compose/components/compose-form.tsx b/src/features/compose/components/compose-form.tsx index 79946dcf6..ea0a5341d 100644 --- a/src/features/compose/components/compose-form.tsx +++ b/src/features/compose/components/compose-form.tsx @@ -17,7 +17,7 @@ import AutosuggestInput, { AutoSuggestion } from 'soapbox/components/autosuggest import { Button, HStack, Stack } from 'soapbox/components/ui'; import EmojiPickerDropdown from 'soapbox/features/emoji/containers/emoji-picker-dropdown-container'; import { ComposeEditor } from 'soapbox/features/ui/util/async-components'; -import { useAppDispatch, useAppSelector, useCompose, useDraggedFiles, useFeatures, useInstance, usePrevious } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useCompose, useDraggedFiles, useFeatures, useInstance, useOwnAccount, usePrevious } from 'soapbox/hooks'; import QuotedStatusContainer from '../containers/quoted-status-container'; import ReplyIndicatorContainer from '../containers/reply-indicator-container'; @@ -69,6 +69,7 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab const intl = useIntl(); const dispatch = useAppDispatch(); const { configuration } = useInstance(); + const { account } = useOwnAccount(); const compose = useCompose(id); const showSearch = useAppSelector((state) => state.search.submitted && !state.search.hidden); @@ -108,7 +109,7 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab const isEmpty = !(fulltext.trim() || anyMedia); const condensed = shouldCondense && !isDraggedOver && !composeFocused && isEmpty && !isUploading; const shouldAutoFocus = autoFocus && !showSearch; - const canSubmit = !!editorRef.current && !isSubmitting && !isUploading && !isChangingUpload && !isEmpty && length(fulltext) <= maxTootChars; + const canSubmit = !!editorRef.current && !isSubmitting && !isUploading && !isChangingUpload && !isEmpty && length(fulltext) <= maxTootChars && account?.source?.nostr?.nip05 !== undefined; const getClickableArea = () => { return clickableAreaRef ? clickableAreaRef.current : formRef.current; diff --git a/src/features/compose/editor/index.tsx b/src/features/compose/editor/index.tsx index eeb6c1f02..024268de2 100644 --- a/src/features/compose/editor/index.tsx +++ b/src/features/compose/editor/index.tsx @@ -18,7 +18,8 @@ import { $createParagraphNode, $createTextNode, $getRoot, type LexicalEditor } f import React, { useMemo, useState } from 'react'; import { FormattedMessage } from 'react-intl'; -import { useAppDispatch } from 'soapbox/hooks'; +import Warning from 'soapbox/features/compose/components/warning'; +import { useAppDispatch, useOwnAccount, useSettingsNotifications } from 'soapbox/hooks'; import { useNodes } from './nodes'; import AutosuggestPlugin from './plugins/autosuggest-plugin'; @@ -84,6 +85,8 @@ const ComposeEditor = React.forwardRef(({ }, ref) => { const dispatch = useAppDispatch(); const nodes = useNodes(); + const { account } = useOwnAccount(); + const settingsNotifications = useSettingsNotifications(); const [suggestionsHidden, setSuggestionsHidden] = useState(true); @@ -132,6 +135,9 @@ const ComposeEditor = React.forwardRef(({ return ( + { account?.source?.nostr?.nip05 === undefined ? + Identity\' before continuing.'} /> : } /> : null + }
Date: Thu, 3 Oct 2024 15:32:45 -0300 Subject: [PATCH 2/5] Add new translation messages --- src/locales/en.json | 2 ++ src/locales/pt-BR.json | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/locales/en.json b/src/locales/en.json index 0accc3497..f85730a24 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -501,6 +501,8 @@ "compose_form.spoiler_placeholder": "Write your warning here (optional)", "compose_form.spoiler_remove": "Remove sensitive", "compose_form.spoiler_title": "Sensitive content", + "compose_form.warning": "Warning: To post, you need a valid username. Please configure your username in 'Settings > Identity' before continuing.", + "compose_form.warning_waiting": "Warning: To post, you need a valid username. Your username request is pending validation. Please wait until your username is validated.", "compose_group.share_to_followers": "Share with my followers", "confirmation_modal.cancel": "Cancel", "confirmations.admin.deactivate_user.confirm": "Deactivate @{name}", diff --git a/src/locales/pt-BR.json b/src/locales/pt-BR.json index 8a0a94928..1064debe8 100644 --- a/src/locales/pt-BR.json +++ b/src/locales/pt-BR.json @@ -478,6 +478,8 @@ "compose_form.markdown.marked": "Markdown do post ativado", "compose_form.markdown.unmarked": "Markdown do post desativado", "compose_form.message": "Mensagem", + "compose_form.warning": "Aviso: Para postar, é necessário ter um nome de usuário válido. Por favor, configure seu nome de usuário em 'Configurações > Identidade', antes de continuar.", + "compose_form.warning_waiting": "Aviso: Para postar, é necessário ter um nome de usuário válido. Sua solicitação de nome de usuário está pendente de validação. Por favor, aguarde até que seu usuário seja validado.", "compose_form.placeholder": "No que você está pensando?", "compose_form.poll.add_option": "Adicionar uma resposta", "compose_form.poll.duration": "Duração da enquete", From adc783761c71b87970a59146a6d107fb352046e3 Mon Sep 17 00:00:00 2001 From: danidfra Date: Thu, 3 Oct 2024 15:34:44 -0300 Subject: [PATCH 3/5] Add export for useSettingsNotifications hook --- src/hooks/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 8d3b7a510..abfbd726c 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -21,4 +21,5 @@ export { useRegistrationStatus } from './useRegistrationStatus'; export { useSettings } from './useSettings'; export { useSoapboxConfig } from './useSoapboxConfig'; export { useSystemTheme } from './useSystemTheme'; -export { useTheme } from './useTheme'; \ No newline at end of file +export { useTheme } from './useTheme'; +export { useSettingsNotifications } from './useSettingsNotifications'; \ No newline at end of file From 29bdd54dd19e4c16f445632a1b3dc0bf2a7d73dc Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Oct 2024 11:50:51 -0500 Subject: [PATCH 4/5] Refactor NIP-05 warnings --- .../compose/components/compose-form.tsx | 30 ++--------- .../compose/containers/warning-container.tsx | 51 ++++++++++++++++++- src/features/compose/editor/index.tsx | 8 +-- src/locales/en.json | 5 +- 4 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/features/compose/components/compose-form.tsx b/src/features/compose/components/compose-form.tsx index 478a6c0db..8b0f7b19a 100644 --- a/src/features/compose/components/compose-form.tsx +++ b/src/features/compose/components/compose-form.tsx @@ -1,8 +1,8 @@ import clsx from 'clsx'; import { CLEAR_EDITOR_COMMAND, TextNode, type LexicalEditor, $getRoot } from 'lexical'; import React, { Suspense, useCallback, useEffect, useRef, useState } from 'react'; -import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { Link, useHistory } from 'react-router-dom'; +import { defineMessages, useIntl } from 'react-intl'; +import { useHistory } from 'react-router-dom'; import { length } from 'stringz'; import { @@ -17,7 +17,7 @@ import AutosuggestInput, { AutoSuggestion } from 'soapbox/components/autosuggest import { Button, HStack, Stack } from 'soapbox/components/ui'; import EmojiPickerDropdown from 'soapbox/features/emoji/containers/emoji-picker-dropdown-container'; import { ComposeEditor } from 'soapbox/features/ui/util/async-components'; -import { useAppDispatch, useAppSelector, useCompose, useDraggedFiles, useFeatures, useInstance, useOwnAccount, usePrevious } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useCompose, useDraggedFiles, useFeatures, useInstance, usePrevious } from 'soapbox/hooks'; import QuotedStatusContainer from '../containers/quoted-status-container'; import ReplyIndicatorContainer from '../containers/reply-indicator-container'; @@ -39,7 +39,6 @@ import SpoilerInput from './spoiler-input'; import TextCharacterCounter from './text-character-counter'; import UploadForm from './upload-form'; import VisualCharacterCounter from './visual-character-counter'; -import Warning from './warning'; import type { Emoji } from 'soapbox/features/emoji'; @@ -68,13 +67,11 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab const history = useHistory(); const intl = useIntl(); const dispatch = useAppDispatch(); - const { account } = useOwnAccount(); const { instance } = useInstance(); const compose = useCompose(id); const showSearch = useAppSelector((state) => state.search.submitted && !state.search.hidden); const maxTootChars = instance.configuration.statuses.max_characters; - const scheduledStatusCount = useAppSelector((state) => state.scheduled_statuses.size); const features = useFeatures(); const { @@ -109,7 +106,7 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab const isEmpty = !(fulltext.trim() || anyMedia); const condensed = shouldCondense && !isDraggedOver && !composeFocused && isEmpty && !isUploading; const shouldAutoFocus = autoFocus && !showSearch; - const canSubmit = !!editorRef.current && !isSubmitting && !isUploading && !isChangingUpload && !isEmpty && length(fulltext) <= maxTootChars && account?.source?.nostr?.nip05 !== undefined; + const canSubmit = !!editorRef.current && !isSubmitting && !isUploading && !isChangingUpload && !isEmpty && length(fulltext) <= maxTootChars; const getClickableArea = () => { return clickableAreaRef ? clickableAreaRef.current : formRef.current; @@ -247,25 +244,6 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab return ( - {scheduledStatusCount > 0 && !event && !group && ( - - - - ) }} - />) - } - /> - )} - {!shouldCondense && !event && !group && groupId && } diff --git a/src/features/compose/containers/warning-container.tsx b/src/features/compose/containers/warning-container.tsx index 858404c27..1ecc99359 100644 --- a/src/features/compose/containers/warning-container.tsx +++ b/src/features/compose/containers/warning-container.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; -import { useAppSelector, useCompose } from 'soapbox/hooks'; +import { useAppSelector, useCompose, useOwnAccount, useSettingsNotifications } from 'soapbox/hooks'; import { selectOwnAccount } from 'soapbox/selectors'; import Warning from '../components/warning'; @@ -15,11 +15,60 @@ interface IWarningWrapper { const WarningWrapper: React.FC = ({ composeId }) => { const compose = useCompose(composeId); + const scheduledStatusCount = useAppSelector((state) => state.scheduled_statuses.size); + const { account } = useOwnAccount(); + const settingsNotifications = useSettingsNotifications(); const needsLockWarning = useAppSelector((state) => compose.privacy === 'private' && !selectOwnAccount(state)!.locked); const hashtagWarning = (compose.privacy !== 'public' && compose.privacy !== 'group') && APPROX_HASHTAG_RE.test(compose.text); const directMessageWarning = compose.privacy === 'direct'; + if (scheduledStatusCount > 0) { + return ( + + + + ) }} + />) + } + /> + ); + } + + if (account?.source?.nostr?.nip05 === undefined) { + if (settingsNotifications.has('needsNip05')) { + return ( + + + + ), + }} + /> + ); + } else { + return ( + + ); + } + } + if (needsLockWarning) { return ( (({ }, ref) => { const dispatch = useAppDispatch(); const nodes = useNodes(); - const { account } = useOwnAccount(); - const settingsNotifications = useSettingsNotifications(); const [suggestionsHidden, setSuggestionsHidden] = useState(true); @@ -135,9 +132,6 @@ const ComposeEditor = React.forwardRef(({ return ( - { account?.source?.nostr?.nip05 === undefined ? - Identity\' before continuing.'} /> : } /> : null - }
Identity' before continuing.", - "compose_form.warning_waiting": "Warning: To post, you need a valid username. Your username request is pending validation. Please wait until your username is validated.", "compose_group.share_to_followers": "Share with my followers", "confirmation_modal.cancel": "Cancel", "confirmations.admin.deactivate_user.confirm": "Deactivate @{name}", From 9692b15715e6dbf56ef0aade3227048cbb7f10cf Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Oct 2024 11:57:25 -0500 Subject: [PATCH 5/5] Update nip05 portuguese translation --- src/locales/pt-BR.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/locales/pt-BR.json b/src/locales/pt-BR.json index 1064debe8..3176ebb46 100644 --- a/src/locales/pt-BR.json +++ b/src/locales/pt-BR.json @@ -478,8 +478,9 @@ "compose_form.markdown.marked": "Markdown do post ativado", "compose_form.markdown.unmarked": "Markdown do post desativado", "compose_form.message": "Mensagem", - "compose_form.warning": "Aviso: Para postar, é necessário ter um nome de usuário válido. Por favor, configure seu nome de usuário em 'Configurações > Identidade', antes de continuar.", - "compose_form.warning_waiting": "Aviso: Para postar, é necessário ter um nome de usuário válido. Sua solicitação de nome de usuário está pendente de validação. Por favor, aguarde até que seu usuário seja validado.", + "compose_form.nip05.pending": "Seu pedido de nome de usuário está em revisão.", + "compose_form.nip05.warning": "Você não tem um nome de usuário configurado. {click} para configurá-lo.", + "compose_form.nip05.warning.click": "Clique aqui", "compose_form.placeholder": "No que você está pensando?", "compose_form.poll.add_option": "Adicionar uma resposta", "compose_form.poll.duration": "Duração da enquete",