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 && (
+
+ )}