feat: add about page

This commit is contained in:
Théo LUDWIG 2024-05-20 15:05:34 +02:00
parent 49dbd18606
commit 651e8e2633
Signed by: theoludwig
GPG Key ID: ADFE5A563D718F3B
11 changed files with 181 additions and 24 deletions

View File

@ -8,7 +8,7 @@ const TabLayout: React.FC = () => {
const { user } = useAuthentication() const { user } = useAuthentication()
if (user == null) { if (user == null) {
return <Redirect href="/authentication/login" /> return <Redirect href="/authentication/about" />
} }
return ( return (

View File

@ -1,7 +1,6 @@
import { Text } from "react-native"
import { Button } from "react-native-paper" import { Button } from "react-native-paper"
import { SafeAreaView } from "react-native-safe-area-context"
import { About } from "@/presentation/react-native/components/About"
import { useAuthentication } from "@/presentation/react/contexts/Authentication" import { useAuthentication } from "@/presentation/react/contexts/Authentication"
const SettingsPage: React.FC = () => { const SettingsPage: React.FC = () => {
@ -12,26 +11,19 @@ const SettingsPage: React.FC = () => {
} }
return ( return (
<SafeAreaView <About
style={[ actionButton={
{
flex: 1,
alignItems: "center",
justifyContent: "center",
},
]}
>
<Text>Settings</Text>
<Button <Button
mode="contained" mode="contained"
labelStyle={{ fontSize: 18 }}
onPress={handleLogout} onPress={handleLogout}
loading={logout.state === "loading"} loading={logout.state === "loading"}
disabled={logout.state === "loading"} disabled={logout.state === "loading"}
> >
Logout Logout
</Button> </Button>
</SafeAreaView> }
/>
) )
} }

View File

@ -17,6 +17,15 @@ const TabLayout: React.FC = () => {
headerShown: false, headerShown: false,
}} }}
> >
<Tabs.Screen
name="about"
options={{
title: "About",
tabBarIcon: ({ color }) => {
return <TabBarIcon name="info" color={color} />
},
}}
/>
<Tabs.Screen <Tabs.Screen
name="login" name="login"
options={{ options={{

View File

@ -0,0 +1,26 @@
import { Button } from "react-native-paper"
import { useRouter } from "expo-router"
import { About } from "@/presentation/react-native/components/About"
const AboutPage: React.FC = () => {
const router = useRouter()
return (
<About
actionButton={
<Button
mode="contained"
labelStyle={{ fontSize: 18 }}
onPress={() => {
router.push("/authentication/login")
}}
>
Get Started 🚀
</Button>
}
/>
)
}
export default AboutPage

View File

@ -67,6 +67,7 @@ const LoginPage: React.FC = () => {
<Button <Button
mode="contained" mode="contained"
labelStyle={{ fontSize: 18 }}
onPress={handleSubmit(onSubmit)} onPress={handleSubmit(onSubmit)}
loading={login.state === "loading"} loading={login.state === "loading"}
disabled={login.state === "loading"} disabled={login.state === "loading"}

View File

@ -107,6 +107,7 @@ const RegisterPage: React.FC = () => {
<Button <Button
mode="contained" mode="contained"
labelStyle={{ fontSize: 18 }}
onPress={handleSubmit(onSubmit)} onPress={handleSubmit(onSubmit)}
loading={register.state === "loading"} loading={register.state === "loading"}
disabled={register.state === "loading"} disabled={register.state === "loading"}

View File

@ -6,7 +6,7 @@ const HomePage: React.FC = () => {
const { user } = useAuthentication() const { user } = useAuthentication()
if (user == null) { if (user == null) {
return <Redirect href="/authentication/login" /> return <Redirect href="/authentication/about" />
} }
return <Redirect href="/application/habits/" /> return <Redirect href="/application/habits/" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,81 @@
import { View } from "react-native"
import { Text } from "react-native-paper"
import { SafeAreaView } from "react-native-safe-area-context"
import { ExternalLink } from "@/presentation/react-native/ui/ExternalLink"
import { getVersion } from "@/utils/version"
export interface AboutProps {
actionButton: React.ReactNode
}
export const About: React.FC<AboutProps> = (props) => {
const { actionButton } = props
const version = getVersion()
return (
<SafeAreaView
style={{
flex: 1,
paddingHorizontal: 20,
}}
>
<View style={{ alignItems: "center", marginVertical: 20 }}>
<Text
style={{
fontWeight: "bold",
fontSize: 28,
textAlign: "center",
}}
>
Habits Tracker
</Text>
<Text
style={{
marginTop: 6,
fontWeight: "bold",
fontSize: 18,
textAlign: "center",
}}
>
To perform at work and in everyday life.
</Text>
<Text
style={{
marginTop: 6,
fontWeight: "bold",
fontSize: 16,
textAlign: "center",
}}
>
v{version}
</Text>
</View>
<Text variant="bodyLarge" style={{ textAlign: "center" }}>
<ExternalLink href="https://unistra.fr" style={{ color: "#006CFF" }}>
Université de Strasbourg
</ExternalLink>
</Text>
<Text variant="bodyLarge" style={{ textAlign: "center" }}>
BUT Informatique - IUT Robert Schuman
</Text>
<Text variant="bodyLarge" style={{ textAlign: "center" }}>
P61 Mobile Development
</Text>
<View
style={{
justifyContent: "center",
alignItems: "center",
marginVertical: 20,
}}
>
{actionButton}
</View>
</SafeAreaView>
)
}

View File

@ -0,0 +1,39 @@
import { getVersion } from "../version"
import { version } from "@/package.json"
describe("utils/version", () => {
const env = process.env
beforeEach(() => {
jest.resetModules()
process.env = { ...env }
})
afterEach(() => {
process.env = env
jest.clearAllMocks()
})
it("should return '0.0.0-development' when NODE_ENV is 'development'", () => {
// Arrange - Given
process.env["NODE_ENV"] = "development"
// Act - When
const result = getVersion()
// Assert - Then
const expected = "0.0.0-development"
expect(result).toEqual(expected)
})
it("should return the version from package.json when NODE_ENV is not 'development'", () => {
// Arrange - Given
process.env["NODE_ENV"] = "production"
// Act - When
const result = getVersion()
// Assert - Then
expect(result).toEqual(version)
})
})

8
utils/version.ts Normal file
View File

@ -0,0 +1,8 @@
import { version } from "@/package.json"
export const getVersion = (): string => {
if (process.env["NODE_ENV"] === "development") {
return "0.0.0-development"
}
return version
}