diff --git a/src/components/ICONS.jsx b/src/components/ICONS.jsx index b77c7adf8b..56e6a72ee9 100644 --- a/src/components/ICONS.jsx +++ b/src/components/ICONS.jsx @@ -176,6 +176,8 @@ export const ICONS = { 'user-x': () => import('@iconify-icons/mingcute/user-x-line'), minimize: () => import('@iconify-icons/mingcute/arrows-down-line'), celebrate: () => import('@iconify-icons/mingcute/celebrate-line'), + locked: () => import('@iconify-icons/mingcute/lock-fill'), + unlocked: () => import('@iconify-icons/mingcute/unlock-line'), schedule: () => import('@iconify-icons/mingcute/calendar-time-add-line'), day: () => import('@iconify-icons/mingcute/calendar-day-line'), camera: () => import('@iconify-icons/mingcute/camera-line'), diff --git a/src/components/compose.jsx b/src/components/compose.jsx index d4918653fb..103e3317f2 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -34,6 +34,7 @@ import emojifyText from '../utils/emojify-text'; import getDomain from '../utils/get-domain'; import i18nDuration from '../utils/i18n-duration'; import isRTL from '../utils/is-rtl'; +import localPostingIconsMap from '../utils/local-posting-icons-map.js'; import localeMatch from '../utils/locale-match'; import localeCode2Text from '../utils/localeCode2Text'; import mem from '../utils/mem'; @@ -271,6 +272,7 @@ function Compose({ const spoilerTextRef = useRef(); const [visibility, setVisibility] = useState('public'); const [sensitive, setSensitive] = useState(false); + const [localOnly, setLocalOnly] = useState('federated'); const [language, setLanguage] = useState( store.session.get('currentLanguage') || DEFAULT_LANG, ); @@ -300,7 +302,11 @@ function Compose({ useEffect(() => { if (replyToStatus) { - const { spoilerText, visibility, language, sensitive } = replyToStatus; + const { spoilerText, visibility, language, sensitive, localOnly } = + replyToStatus; + if (showLocalOnlyButton) { + setLocalOnly(localOnly ? 'local-instance' : 'federated'); + } if (spoilerText && spoilerTextRef.current) { spoilerTextRef.current.value = spoilerText; } @@ -719,6 +725,13 @@ function Compose({ const [showMentionPicker, setShowMentionPicker] = useState(false); const [showEmoji2Picker, setShowEmoji2Picker] = useState(false); const [showGIFPicker, setShowGIFPicker] = useState(false); + const supportsLocalPosting = supports('@gotosocial/local-posting'); + const [localPostingLabel, setLocalPostingLabel] = useState(''); + const [showLocalOnlyButton, setShowLocalOnlyButton] = + useState(supportsLocalPosting); + if (supportsLocalPosting) { + setLocalPostingLabel(localOnly ? 'Local' : 'Federated'); + } const [autoDetectedLanguages, setAutoDetectedLanguages] = useState(null); const [topSupportedLanguages, restSupportedLanguages] = useMemo(() => { @@ -1167,6 +1180,9 @@ function Compose({ params.in_reply_to_id = replyToStatus?.id || undefined; params.scheduled_at = scheduledAt; } + if (supports('@gotosocial/local-posting')) { + params.local_only = localOnly === 'local-instance'; + } params = removeNullUndefined(params); console.log('POST', params); @@ -1254,6 +1270,30 @@ function Compose({ /> {' '} + {showLocalOnlyButton && ( + + )}