diff --git a/src/app/components/SyncConnectionStatus.tsx b/src/app/components/SyncConnectionStatus.tsx index a15e957f1..e4cb95bab 100644 --- a/src/app/components/SyncConnectionStatus.tsx +++ b/src/app/components/SyncConnectionStatus.tsx @@ -65,7 +65,7 @@ export function SyncConnectionStatusBanner({ status }: SyncConnectionStatusProps ( const handleKeydown: KeyboardEventHandler = useCallback( (evt) => { - // mobile ignores config option - if (mobileOrTablet() && evt.key === 'Enter' && !evt.shiftKey) { - return; - } - onKeyDown?.(evt); const shortcutToggled = toggleKeyboardShortcut(editor, evt, shortcutOverrides); diff --git a/src/app/components/global-banner/GlobalBannerRenderer.css.ts b/src/app/components/global-banner/GlobalBannerRenderer.css.ts index 37b9677cf..b1a1974a0 100644 --- a/src/app/components/global-banner/GlobalBannerRenderer.css.ts +++ b/src/app/components/global-banner/GlobalBannerRenderer.css.ts @@ -3,7 +3,7 @@ import { color, config, toRem } from 'folds'; export const Container = style({ position: 'fixed', - top: 'calc(env(safe-area-inset-top, 0px) + 16px)', + top: 'calc(var(--safe-area-inset-top, env(safe-area-inset-top, 0px)) + 16px)', left: '50%', transform: 'translateX(-50%)', zIndex: 9998, diff --git a/src/app/components/message/modals/Options.tsx b/src/app/components/message/modals/Options.tsx index f8613c7bb..0dd06a02a 100644 --- a/src/app/components/message/modals/Options.tsx +++ b/src/app/components/message/modals/Options.tsx @@ -359,7 +359,7 @@ export function OptionsEmojiBoard({ anchor={emojiBoardAnchor} style={isModal ? { width: '100%' } : {}} content={ - + {dragOpts?.dragHandle} {ActualMessage} ) { +function Editor() { const [enterForNewline, setEnterForNewline] = useSetting(settingsAtom, 'enterForNewline'); const [editorToolbar, setEditorToolbar] = useSetting(settingsAtom, 'editorToolbar'); const [editorOldAddFile, setEditorOldAddFile] = useSetting(settingsAtom, 'editorOldAddFile'); @@ -434,24 +434,12 @@ function Editor({ isMobile }: Readonly<{ isMobile: boolean }>) { return ( Editor - + - } + description={`Use ${isMacOS() ? KeySymbol.Command : 'Ctrl'} + ENTER to send message.`} + after={} /> @@ -1611,7 +1599,7 @@ export function General({ requestBack, requestClose }: Readonly) { - + diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index 44a4aa964..3e7c20c68 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -284,7 +284,7 @@ export const defaultSettings: Settings = { isPeopleDrawer: true, isWidgetDrawer: false, memberSortFilterIndex: 0, - enterForNewline: false, + enterForNewline: mobileOrTablet(), editorToolbar: false, editorOldAddFile: false, composerToolbarOpen: false, @@ -350,7 +350,7 @@ export const defaultSettings: Settings = { privacyBlurEmotes: false, showPronouns: true, parsePronouns: true, - pronounPillMaxCount: 3, + pronounPillMaxCount: mobileOrTablet() ? 1 : 3, pronounPillMaxLength: 16, renderGlobalNameColors: true, renderUserCards: 'both', diff --git a/src/app/styles/edgeToEdgeInsets.test.ts b/src/app/styles/edgeToEdgeInsets.test.ts index 43103ccff..714283cd7 100644 --- a/src/app/styles/edgeToEdgeInsets.test.ts +++ b/src/app/styles/edgeToEdgeInsets.test.ts @@ -108,7 +108,9 @@ describe('android edge-to-edge inset contract', () => { ); expect(notificationBannerStyles).toContain("position: 'fixed'"); - expect(notificationBannerStyles).toContain("top: 'env(safe-area-inset-top, 0)'"); + expect(notificationBannerStyles).toContain( + "top: 'var(--safe-area-inset-top, env(safe-area-inset-top, 0px))'" + ); expect(telemetryBannerStyles).toContain("position: 'fixed'"); }); }); diff --git a/src/app/utils/user-agent.ts b/src/app/utils/user-agent.ts index 504198fed..cbcf41140 100644 --- a/src/app/utils/user-agent.ts +++ b/src/app/utils/user-agent.ts @@ -1,8 +1,18 @@ +import { isTauri } from '@tauri-apps/api/core'; +import { type as osType } from '@tauri-apps/plugin-os'; import { UAParser } from 'ua-parser-js'; const result = new UAParser(window.navigator.userAgent).getResult(); const isMobileOrTablet = (() => { + if (isTauri()) { + try { + const tauriOs = osType(); + if (tauriOs === 'android' || tauriOs === 'ios') return true; + } catch { + // Fallback to UA parsing if plugin-os is not ready/available + } + } const { os, device } = result; if (device.type === 'mobile' || device.type === 'tablet') return true; if (os.name === 'Android' || os.name === 'iOS') return true;