mirror of
https://github.com/stablyai/orca.git
synced 2026-09-28 08:02:43 +00:00
* Revert "test(ime): restore coverage the composition-ownership change removed (#13168)" This reverts commit25a8c517e1. * Revert "refactor(terminal): return IME composition ownership to xterm (#13128)" This reverts commit17b3dff3c4. * test(ime): keep the architecture-neutral Korean trace coverage The recorded IBus/fcitx5 and Windows MS-Korean traces from #13168 assert PTY byte order, not composition ownership, so they still hold once the terminal composition layer is restored. The mobile accessory-order test pinned the new handleLiveInputChange signature and does not. Co-authored-by: Orca <help@stably.ai> * fix(terminal): keep the macOS Backslash bypass through the revert The restored native-text forwarder only claims keys for input sources in its hardcoded CJK allowlist, so third-party IMEs off that list (Qingg, #10896) still get a raw backslash. #13128 added this bypass as a partial replacement; keep it rather than trade the open issue back. Scoped to the bare backslash key. The rest of shouldBypassXtermForMacNativeText bypassed all unmodified non-ASCII text, which would race the restored forwarder. Co-authored-by: Orca <help@stably.ai> * fix(mobile): move the mirror-step ref write out of render The restored hook assigned runMirrorStepRef during render, which is not replay-safe — React can discard render work, so the mutation can leak from UI that never commits. Its only read is inside the held-commit timer, which fires long after commit, and the ref has a safe default, so an effect is soon enough. Surfaced by the changed-lines React Doctor gate: the rule postdates this code, so restoring the file re-introduced it as a new violation. Co-authored-by: Orca <help@stably.ai> --------- Co-authored-by: Orca <help@stably.ai>
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import { StyleSheet, Text, View } from 'react-native'
|
|
import { colors, typography } from '../theme/mobile-theme'
|
|
|
|
type DictationStatus = {
|
|
readonly isStarting: boolean
|
|
readonly isRecording: boolean
|
|
readonly isProcessing: boolean
|
|
}
|
|
|
|
type MobileTerminalLiveInputStatusProps = {
|
|
readonly dictation: DictationStatus
|
|
readonly isAttaching: boolean
|
|
readonly liveInputText: string
|
|
}
|
|
|
|
export function MobileTerminalLiveInputStatus({
|
|
dictation,
|
|
isAttaching,
|
|
liveInputText
|
|
}: MobileTerminalLiveInputStatusProps) {
|
|
const title = dictation.isRecording
|
|
? 'Listening'
|
|
: dictation.isProcessing
|
|
? 'Processing'
|
|
: dictation.isStarting
|
|
? 'Starting mic'
|
|
: 'Live input'
|
|
const detail = dictation.isRecording
|
|
? 'Tap mic to stop'
|
|
: dictation.isProcessing
|
|
? 'Transcribing on desktop'
|
|
: dictation.isStarting
|
|
? 'Preparing microphone'
|
|
: isAttaching
|
|
? 'Uploading image to host'
|
|
: liveInputText || 'Tap to show keyboard'
|
|
|
|
return (
|
|
<View style={styles.status}>
|
|
<Text style={styles.title} numberOfLines={1}>
|
|
{title}
|
|
</Text>
|
|
<Text style={styles.detail} numberOfLines={1} ellipsizeMode="head">
|
|
{detail}
|
|
</Text>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
status: {
|
|
flex: 1,
|
|
gap: 1
|
|
},
|
|
title: {
|
|
color: colors.textPrimary,
|
|
fontSize: typography.metaSize,
|
|
fontWeight: '600'
|
|
},
|
|
detail: {
|
|
color: colors.textSecondary,
|
|
fontSize: typography.metaSize,
|
|
fontFamily: typography.monoFamily
|
|
}
|
|
})
|