diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts
index 886334acc1..472734bf4e 100644
--- a/apps/mobile/app.config.ts
+++ b/apps/mobile/app.config.ts
@@ -2,12 +2,14 @@ import { resolve } from "node:path"
import type { ConfigContext, ExpoConfig } from "expo/config"
+import PKG from "./package.json"
+
// const roundedIconPath = resolve(__dirname, "../../resources/icon.png")
const iconPath = resolve(__dirname, "./assets/icon.png")
const adaptiveIconPath = resolve(__dirname, "./assets/adaptive-icon.png")
-
export default ({ config }: ConfigContext): ExpoConfig => ({
...config,
+
extra: {
eas: {
projectId: "a6335b14-fb84-45aa-ba80-6f6ab8926920",
@@ -23,7 +25,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({
name: "Follow",
slug: "follow",
- version: "1.0.0",
+ version: __DEV__ ? "dev" : PKG.version,
orientation: "portrait",
icon: iconPath,
scheme: "follow",
diff --git a/apps/mobile/package.json b/apps/mobile/package.json
index da2fa3afc0..c56382d3c6 100644
--- a/apps/mobile/package.json
+++ b/apps/mobile/package.json
@@ -92,6 +92,7 @@
"shiki": "1.24.1",
"tailwindcss": "3.4.16",
"usehooks-ts": "3.1.0",
+ "zeego": "2.0.4",
"zod": "3.24.1",
"zustand": "5.0.2"
},
diff --git a/apps/mobile/src/components/ui/tabview/TabBar.tsx b/apps/mobile/src/components/ui/tabview/TabBar.tsx
index 50461ecbb4..8153fdc58e 100644
--- a/apps/mobile/src/components/ui/tabview/TabBar.tsx
+++ b/apps/mobile/src/components/ui/tabview/TabBar.tsx
@@ -20,7 +20,7 @@ import type {
import { Pressable, ScrollView, StyleSheet, Text, View } from "react-native"
import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated"
-import { accentColor } from "@/src/theme/colors"
+import { accentColor, useColor } from "@/src/theme/colors"
import type { Tab } from "./types"
@@ -210,9 +210,12 @@ const styles = StyleSheet.create({
})
const TabItemInner = ({ tab, isSelected }: { tab: Tab; isSelected: boolean }) => {
+ const gray = useColor("gray")
return (
- {tab.name}
+
+ {tab.name}
+
)
}
diff --git a/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx b/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx
index 03892bcf84..eef4f36da6 100644
--- a/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx
+++ b/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx
@@ -47,7 +47,6 @@ export const SearchFeed = () => {
refreshing={isLoading}
onRefresh={refetch}
keyExtractor={keyExtractor}
- contentContainerClassName={"-mt-4"}
renderScrollComponent={RenderScrollComponent}
data={data?.data}
renderItem={renderItem}
@@ -68,7 +67,7 @@ const SearchFeedItem: FC> = ({ item }) => {
return (
{
if (item.feed?.id) {
router.push(`/follow?id=${item.feed.id}`)
diff --git a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx
index 9719a55176..8dd469676d 100644
--- a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx
+++ b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx
@@ -1,4 +1,5 @@
import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"
+import { getDefaultHeaderHeight } from "@react-navigation/elements"
import { useIsFocused } from "@react-navigation/native"
import { createNativeStackNavigator } from "@react-navigation/native-stack"
import { createContext, useCallback, useContext, useEffect, useRef, useState } from "react"
@@ -6,7 +7,7 @@ import type { NativeScrollEvent, NativeSyntheticEvent, ScrollView } from "react-
import { findNodeHandle, Text, UIManager } from "react-native"
import type { SharedValue } from "react-native-reanimated"
import Animated, { useAnimatedStyle, useSharedValue, withTiming } from "react-native-reanimated"
-import { useSafeAreaInsets } from "react-native-safe-area-context"
+import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-context"
import { useEventCallback } from "usehooks-ts"
import { ReAnimatedScrollView } from "@/src/components/common/AnimatedComponents"
@@ -114,13 +115,18 @@ function Settings() {
>
)
}
-
const SettingHeader = ({ scrollY }: { scrollY: SharedValue }) => {
+ const frame = useSafeAreaFrame()
+ const insets = useSafeAreaInsets()
+ const headerHeight = getDefaultHeaderHeight(frame, false, insets.top)
const styles = useAnimatedStyle(() => {
return {
opacity: scrollY.value / 100,
+ height: headerHeight,
+ paddingTop: insets.top,
}
})
+
return (
}) => {
>
- Settings
+ Settings
)
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ae2ffbed97..f7c8922794 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -643,6 +643,9 @@ importers:
usehooks-ts:
specifier: 3.1.0
version: 3.1.0(react@18.3.1)
+ zeego:
+ specifier: 2.0.4
+ version: 2.0.4(j3ti5ctilkzw4c72qtaivrgtti)
zod:
specifier: 3.24.1
version: 3.24.1
@@ -5023,6 +5026,12 @@ packages:
'@react-native-community/cli-tools@14.1.0':
resolution: {integrity: sha512-r1KxSu2+OSuhWFoE//1UR7aSTXMLww/UYWQprEw4bSo/kvutGX//4r9ywgXSWp+39udpNN4jQpNTHuWhGZd/Bg==}
+ '@react-native-menu/menu@1.2.1':
+ resolution: {integrity: sha512-ut3fLnhEDR1h1VFCr/Hyx7hQ0Btc7MOvF3LXuoIOZfvaepV2OUDhXPs6dI6YImUGZxabWymjWlyWqZ90gn4Dog==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
'@react-native-picker/picker@2.9.0':
resolution: {integrity: sha512-khEhIW/uhfMqq/+tvg4rEAiPGT8GX+Y6QydlP2TSMSmRHoSJK+ShXvXZXSr4Sii4imkj4BwvLunGywwtQDODqg==}
peerDependencies:
@@ -15198,6 +15207,14 @@ packages:
yoga-wasm-web@0.3.3:
resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}
+ zeego@2.0.4:
+ resolution: {integrity: sha512-mkKfUJmgcSGCTqWXW7ccqap8d8z6guQoLF5/mWlH17Jckd0BaFLVZ74y/uWvfBGaC9OawYVt/1MchPnQ8ieSxg==}
+ peerDependencies:
+ '@react-native-menu/menu': '*'
+ react: '*'
+ react-native: '*'
+ react-native-ios-context-menu: ~2.5.1
+
zip-stream@4.1.1:
resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
engines: {node: '>= 10'}
@@ -19810,6 +19827,11 @@ snapshots:
sudo-prompt: 9.2.1
optional: true
+ '@react-native-menu/menu@1.2.1(react-native@0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ react-native: 0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1)
+
'@react-native-picker/picker@2.9.0(react-native@0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1))(react@18.3.1)':
dependencies:
react: 18.3.1
@@ -32057,6 +32079,20 @@ snapshots:
yoga-wasm-web@0.3.3: {}
+ zeego@2.0.4(j3ti5ctilkzw4c72qtaivrgtti):
+ dependencies:
+ '@radix-ui/react-context-menu': 2.2.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dropdown-menu': 2.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@react-native-menu/menu': 1.2.1(react-native@0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-native: 0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1)
+ react-native-ios-context-menu: 3.1.0(react-native-ios-utilities@5.1.1(react-native@0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1))(react@18.3.1))(react-native@0.77.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(react@18.3.1))(react@18.3.1)
+ sf-symbols-typescript: 2.0.0
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+ - react-dom
+
zip-stream@4.1.1:
dependencies:
archiver-utils: 3.0.4