Files
vf_react/argon-pro-react-native/navigation/Screens.js
2026-01-13 15:10:13 +08:00

671 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Animated, Dimensions, Easing } from "react-native";
// header for screens
import { Header, Icon } from "../components";
import { argonTheme, tabs } from "../constants";
import AboutScreen from "../screens/About";
import AgreementScreen from "../screens/Agreement";
import Articles from "../screens/Articles";
import Beauty from "../screens/Beauty";
import Cart from "../screens/Cart";
import Category from "../screens/Category";
import Chat from "../screens/Chat";
// drawer
import CustomDrawerContent from "./Menu";
import Elements from "../screens/Elements";
import Fashion from "../screens/Fashion";
import Gallery from "../screens/Gallery";
// screens
import Home from "../screens/Home";
import NotificationsScreen from "../screens/Notifications";
// Notifications
import PersonalNotifications from "../screens/PersonalNotifications";
import PrivacyScreen from "../screens/Privacy";
// import Onboarding from "../screens/Onboarding";
import Pro from "../screens/Pro";
import Product from "../screens/Product";
import Profile from "../screens/Profile";
import React from "react";
import Register from "../screens/Register";
import Search from "../screens/Search";
// settings
import SettingsScreen from "../screens/Settings";
import SystemNotifications from "../screens/SystemNotifications";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { createDrawerNavigator } from "@react-navigation/drawer";
import { createStackNavigator } from "@react-navigation/stack";
// 事件中心页面
import { EventList, EventDetail } from "../src/screens/Events";
// 市场热点页面
import { MarketHot, SectorDetail, EventCalendar, StockDetail, TodayStats } from "../src/screens/Market";
// 认证页面
import { LoginScreen } from "../src/screens/Auth";
const { width } = Dimensions.get("screen");
const Stack = createStackNavigator();
const Drawer = createDrawerNavigator();
const Tab = createBottomTabNavigator();
function NotificationsStack(props) {
return (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color }) => {
let iconName;
if (route.name === "Personal") {
iconName = "user";
} else if (route.name === "System") {
iconName = "database";
}
// You can return any component that you like here!
return (
<Icon
name={iconName}
family="entypo"
size={22}
color={color}
style={{ marginTop: 10 }}
/>
);
},
})}
tabBarOptions={{
activeTintColor: argonTheme.COLORS.PRIMARY,
inactiveTintColor: "gray",
labelStyle: {
fontFamily: "open-sans-regular",
},
}}
>
<Tab.Screen name="Personal" component={PersonalNotifications} />
<Tab.Screen name="System" component={SystemNotifications} />
</Tab.Navigator>
);
}
function ElementsStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: "screen",
}}
>
<Stack.Screen
name="Elements"
component={Elements}
options={{
header: ({ navigation, scene }) => (
<Header title="Elements" navigation={navigation} scene={scene} />
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
</Stack.Navigator>
);
}
function SettingsStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: "screen",
}}
>
<Stack.Screen
name="Settings"
component={SettingsScreen}
options={{
header: ({ navigation, scene }) => (
<Header title="Settings" scene={scene} navigation={navigation} />
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Agreement"
component={AgreementScreen}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Agreement"
scene={scene}
navigation={navigation}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Privacy"
component={PrivacyScreen}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Privacy"
scene={scene}
navigation={navigation}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="About"
component={AboutScreen}
options={{
header: ({ navigation, scene }) => (
<Header back title="关于我们" scene={scene} navigation={navigation} />
),
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
<Stack.Screen
name="NotificationsSettings"
component={NotificationsScreen}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Notifications"
scene={scene}
navigation={navigation}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Cart"
component={Cart}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Shopping Cart"
scene={scene}
navigation={navigation}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Notifications"
component={NotificationsStack}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Notifications"
scene={scene}
navigation={navigation}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
</Stack.Navigator>
);
}
function ArticlesStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: "screen",
}}
>
<Stack.Screen
name="Articles"
component={Articles}
options={{
header: ({ navigation, scene }) => (
<Header title="Articles" navigation={navigation} scene={scene} />
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
</Stack.Navigator>
);
}
// 事件中心导航栈
function EventsStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: false, // 隐藏默认header使用自定义
}}
>
<Stack.Screen
name="EventList"
component={EventList}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
<Stack.Screen
name="EventDetail"
component={EventDetail}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
</Stack.Navigator>
);
}
// 市场热点导航栈
function MarketStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: false, // 使用自定义header
}}
>
<Stack.Screen
name="MarketHot"
component={MarketHot}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
<Stack.Screen
name="SectorDetail"
component={SectorDetail}
options={({ route }) => ({
header: ({ navigation, scene }) => (
<Header
title={route.params?.sectorName || "板块详情"}
back
navigation={navigation}
scene={scene}
/>
),
headerShown: true,
cardStyle: { backgroundColor: "#0F172A" },
})}
/>
<Stack.Screen
name="EventCalendar"
component={EventCalendar}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
<Stack.Screen
name="StockDetail"
component={StockDetail}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
<Stack.Screen
name="TodayStats"
component={TodayStats}
options={{
cardStyle: { backgroundColor: "#0F172A" },
}}
/>
</Stack.Navigator>
);
}
function ProfileStack(props) {
return (
<Stack.Navigator
initialRouteName="Profile"
screenOptions={{
mode: "card",
headerShown: "screen",
}}
>
<Stack.Screen
name="Profile"
component={Profile}
options={{
header: ({ navigation, scene }) => (
<Header
transparent
white
title="Profile"
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#FFFFFF" },
headerTransparent: true,
}}
/>
<Stack.Screen
name="Cart"
component={Cart}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Shopping Cart"
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#FFFFFF" },
}}
/>
<Stack.Screen
name="Notifications"
component={NotificationsStack}
options={{
header: ({ navigation, scene }) => (
<Header
back
title="Notifications"
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#FFFFFF" },
}}
/>
</Stack.Navigator>
);
}
function HomeStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: "screen",
}}
>
<Stack.Screen
name="Home"
component={Home}
options={{
header: ({ navigation, scene }) => (
<Header
title="Home"
search
options
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Beauty"
component={Beauty}
options={{
header: ({ navigation, scene }) => (
<Header
title="Beauty"
back
tabs={tabs.beauty}
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Category"
component={Category}
options={{
header: ({ navigation, scene }) => {
const { params } = scene.descriptor;
const title = (params && params.headerTitle) || "Category";
return (
<Header
title={title}
back
navigation={navigation}
scene={scene}
/>
);
},
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Fashion"
component={Fashion}
options={{
header: ({ navigation, scene }) => (
<Header
title="Fashion"
back
tabs={tabs.fashion}
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Product"
component={Product}
options={{
header: ({ navigation, scene }) => (
<Header
title=""
back
white
transparent
navigation={navigation}
scene={scene}
/>
),
headerTransparent: true,
}}
/>
<Stack.Screen
name="Gallery"
component={Gallery}
options={{
header: ({ navigation, scene }) => (
<Header
back
transparent
white
title=""
navigation={navigation}
scene={scene}
/>
),
headerTransparent: true,
}}
/>
<Stack.Screen
name="Chat"
component={Chat}
options={{
header: ({ navigation, scene }) => (
<Header
title="Rachel Brown"
back
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Search"
component={Search}
options={{
header: ({ navigation, scene }) => (
<Header title="Search" back navigation={navigation} scene={scene} />
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Cart"
component={Cart}
options={{
header: ({ navigation, scene }) => (
<Header
title="Shopping Cart"
back
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
<Stack.Screen
name="Notifications"
component={NotificationsStack}
options={{
header: ({ navigation, scene }) => (
<Header
title="Notifications"
back
navigation={navigation}
scene={scene}
/>
),
cardStyle: { backgroundColor: "#F8F9FE" },
}}
/>
</Stack.Navigator>
);
}
function AppStack(props) {
return (
<Drawer.Navigator
style={{ flex: 1 }}
drawerContent={(props) => <CustomDrawerContent {...props} />}
drawerStyle={{
backgroundColor: "white",
width: width * 0.8,
}}
screenOptions={{
activeTintcolor: "white",
inactiveTintColor: "#000",
activeBackgroundColor: "transparent",
itemStyle: {
width: width * 0.75,
backgroundColor: "transparent",
paddingVertical: 16,
paddingHorizonal: 12,
justifyContent: "center",
alignContent: "center",
alignItems: "center",
overflow: "hidden",
},
labelStyle: {
fontSize: 18,
marginLeft: 12,
fontWeight: "normal",
},
}}
initialRouteName="EventsDrawer"
>
<Drawer.Screen
name="EventsDrawer"
component={EventsStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="MarketDrawer"
component={MarketStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="HomeDrawer"
component={HomeStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="ProfileDrawer"
component={ProfileStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="AccountDrawer"
component={Register}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="ElementsDrawer"
component={ElementsStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="ArticlesDrawer"
component={ArticlesStack}
options={{
headerShown: false,
}}
/>
<Drawer.Screen
name="SettingsDrawer"
component={SettingsStack}
options={{
headerShown: false,
}}
/>
</Drawer.Navigator>
);
}
export default function OnboardingStack(props) {
return (
<Stack.Navigator
screenOptions={{
mode: "card",
headerShown: false,
}}
>
<Stack.Screen
name="Onboarding"
component={Pro}
option={{
headerTransparent: true,
}}
/>
<Stack.Screen name="App" component={AppStack} />
<Stack.Screen
name="Login"
component={LoginScreen}
options={{
presentation: "modal",
headerShown: false,
}}
/>
</Stack.Navigator>
);
}