diff --git a/.claude/settings.json b/.claude/settings.json
index 27816aa5efb8..3a4e914bf1b0 100644
--- a/.claude/settings.json
+++ b/.claude/settings.json
@@ -14,7 +14,14 @@
"Bash(yarn tsc:*)",
"Bash(yarn ios:pod*)",
"Bash(yarn coverage:*)",
- "Bash(yarn maestro*)"
+ "Bash(yarn maestro*)",
+ "mcp__codegraph__codegraph_search",
+ "mcp__codegraph__codegraph_context",
+ "mcp__codegraph__codegraph_callers",
+ "mcp__codegraph__codegraph_callees",
+ "mcp__codegraph__codegraph_impact",
+ "mcp__codegraph__codegraph_node",
+ "mcp__codegraph__codegraph_status"
]
},
"hooks": {
diff --git a/.gitignore b/.gitignore
index a7e12fe22c49..e15aea4c0f76 100644
--- a/.gitignore
+++ b/.gitignore
@@ -94,3 +94,5 @@ shared/tests/results/
CLAUDE.md
.tsOuts
docs
+.codegraph
+.mcp.json
diff --git a/shared/crypto/decrypt.tsx b/shared/crypto/decrypt.tsx
index 4990f4760f5a..70e101218a6f 100644
--- a/shared/crypto/decrypt.tsx
+++ b/shared/crypto/decrypt.tsx
@@ -5,6 +5,7 @@ import * as React from 'react'
import * as T from '@/constants/types'
import * as TestIDs from '@/tests/e2e/shared/test-ids'
import {CryptoBanner, DragAndDrop, Input, InputActionsBar} from './input'
+import {KeyboardStickyView} from 'react-native-keyboard-controller'
import {CryptoOutput, CryptoOutputActionsBar, CryptoSignedSender} from './output'
import {
beginRun,
@@ -138,6 +139,8 @@ export const DecryptInput = (_props: unknown) => {
const {params} = useRoute() as RootRouteProps<'decryptTab'>
const controller = useDecryptState(params)
const navigateAppend = C.Router2.navigateAppend
+ const insets = Kb.useSafeAreaInsets()
+ const stickyOffset = React.useMemo(() => ({closed: -insets.bottom, opened: 0}), [insets.bottom])
const onRun = () => {
const f = async () => {
@@ -149,8 +152,31 @@ export const DecryptInput = (_props: unknown) => {
C.ignorePromise(f())
}
- const contents = (
- <>
+ if (!isMobile) {
+ return (
+
+
+
+
+ )
+ }
+
+ return (
+
{
onSetInput={controller.setInput}
onClearInput={controller.clearInput}
/>
- >
- )
-
- return isMobile ? (
-
- {contents}
-
-
- ) : (
-
- {contents}
+
+
+
)
}
diff --git a/shared/crypto/encrypt.tsx b/shared/crypto/encrypt.tsx
index dd2d8921ded4..517ec4b39b01 100644
--- a/shared/crypto/encrypt.tsx
+++ b/shared/crypto/encrypt.tsx
@@ -6,6 +6,7 @@ import * as T from '@/constants/types'
import Recipients from './recipients'
import {openURL} from '@/util/misc'
import {CryptoBanner, DragAndDrop, Input, InputActionsBar} from './input'
+import {KeyboardStickyView} from 'react-native-keyboard-controller'
import {CryptoOutput, CryptoOutputActionsBar, CryptoSignedSender, OutputInfoBanner} from './output'
import {
type CommonOutputRouteParams,
@@ -449,6 +450,8 @@ const EncryptInputBody = ({params}: {params?: EncryptRouteParams}) => {
const blurCBRef = React.useRef(() => {})
const navigateAppend = C.Router2.navigateAppend
const appendEncryptRecipientsBuilder = C.Router2.appendEncryptRecipientsBuilder
+ const insets = Kb.useSafeAreaInsets()
+ const stickyOffset = React.useMemo(() => ({closed: -insets.bottom, opened: 0}), [insets.bottom])
const onRun = () => {
const f = async () => {
@@ -460,32 +463,46 @@ const EncryptInputBody = ({params}: {params?: EncryptRouteParams}) => {
C.ignorePromise(f())
}
- const options = isMobile ? (
-
-
-
- ) : (
-
- )
+ if (!isMobile) {
+ return (
+
+
+
+
+
+
+ )
+ }
- const content = (
- <>
+ return (
+
{
onSetInput={controller.setInput}
onClearInput={controller.clearInput}
/>
- {options}
- >
- )
-
- return isMobile ? (
- {content}
- ) : (
-
- {content}
+
+
+
+
+
)
}
diff --git a/shared/crypto/sign.tsx b/shared/crypto/sign.tsx
index 017d05c18a17..a9efba6dbbd8 100644
--- a/shared/crypto/sign.tsx
+++ b/shared/crypto/sign.tsx
@@ -6,6 +6,7 @@ import * as T from '@/constants/types'
import * as TestIDs from '@/tests/e2e/shared/test-ids'
import {openURL} from '@/util/misc'
import {CryptoBanner, DragAndDrop, Input, InputActionsBar} from './input'
+import {KeyboardStickyView} from 'react-native-keyboard-controller'
import {CryptoOutput, CryptoOutputActionsBar, CryptoSignedSender, OutputInfoBanner} from './output'
import {
beginRun,
@@ -147,6 +148,8 @@ export const SignInput = (_props: unknown) => {
const controller = useSignState(params)
const blurCBRef = React.useRef(() => {})
const navigateAppend = C.Router2.navigateAppend
+ const insets = Kb.useSafeAreaInsets()
+ const stickyOffset = React.useMemo(() => ({closed: -insets.bottom, opened: 0}), [insets.bottom])
const onRun = () => {
const f = async () => {
@@ -158,8 +161,31 @@ export const SignInput = (_props: unknown) => {
C.ignorePromise(f())
}
- const content = (
- <>
+ if (!isMobile) {
+ return (
+
+
+
+
+ )
+ }
+
+ return (
+
{
onSetInput={controller.setInput}
onClearInput={controller.clearInput}
/>
- {isMobile ? : null}
- >
- )
-
- return isMobile ? (
- {content}
- ) : (
-
- {content}
+
+
+
)
}
diff --git a/shared/crypto/verify.tsx b/shared/crypto/verify.tsx
index aaf851864728..9a0b68172b11 100644
--- a/shared/crypto/verify.tsx
+++ b/shared/crypto/verify.tsx
@@ -5,6 +5,7 @@ import * as React from 'react'
import * as T from '@/constants/types'
import * as TestIDs from '@/tests/e2e/shared/test-ids'
import {CryptoBanner, DragAndDrop, Input, InputActionsBar} from './input'
+import {KeyboardStickyView} from 'react-native-keyboard-controller'
import {CryptoOutput, CryptoOutputActionsBar, CryptoSignedSender} from './output'
import {
beginRun,
@@ -138,6 +139,8 @@ export const VerifyInput = (_props: unknown) => {
const {params} = useRoute() as RootRouteProps<'verifyTab'>
const controller = useVerifyState(params)
const navigateAppend = C.Router2.navigateAppend
+ const insets = Kb.useSafeAreaInsets()
+ const stickyOffset = React.useMemo(() => ({closed: -insets.bottom, opened: 0}), [insets.bottom])
const onRun = () => {
const f = async () => {
@@ -149,8 +152,31 @@ export const VerifyInput = (_props: unknown) => {
C.ignorePromise(f())
}
- const content = (
- <>
+ if (!isMobile) {
+ return (
+
+
+
+
+ )
+ }
+
+ return (
+
{
onSetInput={controller.setInput}
onClearInput={controller.clearInput}
/>
- {isMobile ? : null}
- >
- )
-
- return isMobile ? (
- {content}
- ) : (
-
- {content}
+
+
+
)
}