feat: add about page
This commit is contained in:
parent
49dbd18606
commit
651e8e2633
@ -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 (
|
||||||
|
@ -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={
|
||||||
{
|
<Button
|
||||||
flex: 1,
|
mode="contained"
|
||||||
alignItems: "center",
|
labelStyle={{ fontSize: 18 }}
|
||||||
justifyContent: "center",
|
onPress={handleLogout}
|
||||||
},
|
loading={logout.state === "loading"}
|
||||||
]}
|
disabled={logout.state === "loading"}
|
||||||
>
|
>
|
||||||
<Text>Settings</Text>
|
Logout
|
||||||
|
</Button>
|
||||||
<Button
|
}
|
||||||
mode="contained"
|
/>
|
||||||
onPress={handleLogout}
|
|
||||||
loading={logout.state === "loading"}
|
|
||||||
disabled={logout.state === "loading"}
|
|
||||||
>
|
|
||||||
Logout
|
|
||||||
</Button>
|
|
||||||
</SafeAreaView>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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={{
|
||||||
|
26
app/authentication/about.tsx
Normal file
26
app/authentication/about.tsx
Normal 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
|
@ -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"}
|
||||||
|
@ -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"}
|
||||||
|
@ -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 |
81
presentation/react-native/components/About.tsx
Normal file
81
presentation/react-native/components/About.tsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
39
utils/__tests__/version.test.ts
Normal file
39
utils/__tests__/version.test.ts
Normal 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
8
utils/version.ts
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user