etfoglasi-frontend/screens/HelpSupport.tsx
2026-05-12 21:33:41 +02:00

175 lines
8.2 KiB
TypeScript

import React from "react";
import {
View, Text, TouchableOpacity,
Linking, ScrollView, useColorScheme,
} from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
import { Ionicons } from "@expo/vector-icons";
const CONTACT_EMAIL = "contact@ksan.dev";
//TODO make github page because yea
const GITHUB_URL = "https://git.ksan.dev/ksan";
const APP_VERSION = "1.0.0";
export default function HelpSupport({ onClose }: { onClose: () => void }) {
const dark = useColorScheme() === "dark";
const accent = dark ? "#E07B45" : "#C4622D";
const contactLinks = [
{
icon: "mail-outline" as const,
label: "Contact support",
sub: CONTACT_EMAIL,
color: dark ? "#5E9EF4" : "#3B7DD8",
onPress: () => Linking.openURL(`mailto:${CONTACT_EMAIL}`),
},
{
icon: "logo-github" as const,
label: "Submit a fix on GitHub",
sub: "Open a pull request or report a bug",
color: dark ? "#4EC992" : "#2E9E6B",
onPress: () => Linking.openURL(GITHUB_URL),
},
];
const aboutRows = [
{ label: "Version", value: APP_VERSION },
{ label: "Platform", value: "React Native / Expo" },
{ label: "Source code", value: "GitHub", onPress: () => Linking.openURL(GITHUB_URL) },
{ label: "Contact", value: CONTACT_EMAIL, onPress: () => Linking.openURL(`mailto:${CONTACT_EMAIL}`) },
];
return (
<SafeAreaView className={`flex-1 ${dark ? "bg-obsidian-200" : "bg-parchment-50"}`}>
{/* Header */}
<View className={`flex-row items-center px-4 py-4 border-b ${dark ? "border-border-dark" : "border-border-light"
}`}>
<Text className={`flex-1 text-xl font-display font-bold ${dark ? "text-ink-dark" : "text-ink-light"}`}>
Help & Support
</Text>
<TouchableOpacity
onPress={onClose}
className={`w-8 h-8 rounded-full items-center justify-center ${dark ? "bg-obsidian-50" : "bg-parchment-200"}`}
>
<Ionicons name="close" size={18} color={dark ? "#706D67" : "#8A8278"} />
</TouchableOpacity>
</View>
<ScrollView
contentContainerStyle={{ padding: 16, paddingBottom: 48 }}
showsVerticalScrollIndicator={false}
>
{/* ── Contact section ── */}
<Text className={`px-1 pb-2 text-xs font-sans font-bold tracking-widest uppercase ${dark ? "text-muted-dark" : "text-muted-light"
}`}>
Contact
</Text>
<Text className={`px-1 text-sm font-sans leading-relaxed mb-4 ${dark ? "text-muted-dark" : "text-muted-light"
}`}>
Need help or found something broken? Reach out directly or open an issue on GitHub.
</Text>
<View className={`rounded-2xl overflow-hidden border mb-6 ${dark ? "bg-obsidian-100 border-border-dark" : "bg-surface-light border-border-light"
}`}>
{contactLinks.map((link, index) => (
<TouchableOpacity
key={link.label}
onPress={link.onPress}
activeOpacity={0.7}
className={`flex-row items-center px-4 py-4 ${index < contactLinks.length - 1
? `border-b ${dark ? "border-border-dark" : "border-border-light"}`
: ""
}`}
>
<View
className="w-10 h-10 rounded-xl items-center justify-center mr-3"
style={{ backgroundColor: link.color + "20" }}
>
<Ionicons name={link.icon} size={20} color={link.color} />
</View>
<View className="flex-1">
<Text className={`text-sm font-sans font-semibold ${dark ? "text-ink-dark" : "text-ink-light"}`}>
{link.label}
</Text>
<Text className={`text-xs font-sans mt-0.5 ${dark ? "text-muted-dark" : "text-muted-light"}`}>
{link.sub}
</Text>
</View>
<Ionicons name="open-outline" size={15} color={dark ? "#706D67" : "#8A8278"} />
</TouchableOpacity>
))}
</View>
{/* About section */}
<Text className={`px-1 pb-2 text-xs font-sans font-bold tracking-widest uppercase ${dark ? "text-muted-dark" : "text-muted-light"
}`}>
About
</Text>
{/* App identity card */}
<View
className={`items-center py-6 rounded-2xl border mb-4 ${dark ? "bg-obsidian-100 border-border-dark" : "bg-surface-light border-border-light"
}`}
>
<View
className="w-16 h-16 rounded-2xl items-center justify-center mb-3"
style={{ backgroundColor: accent + "20" }}
>
<Text style={{ fontSize: 32 }}>📰</Text>
</View>
<Text className={`text-lg font-display font-bold ${dark ? "text-ink-dark" : "text-ink-light"}`}>
ETF Oglasi
</Text>
<Text className={`text-xs font-sans mt-1 ${dark ? "text-muted-dark" : "text-muted-light"}`}>
Version {APP_VERSION}
</Text>
</View>
{/* About rows */}
<View className={`rounded-2xl overflow-hidden border ${dark ? "bg-obsidian-100 border-border-dark" : "bg-surface-light border-border-light"
}`}>
{aboutRows.map((row, index) => {
const isLast = index === aboutRows.length - 1;
const Inner = (
<View className={`flex-row items-center px-4 py-3.5 ${!isLast ? `border-b ${dark ? "border-border-dark" : "border-border-light"}` : ""
}`}>
<Text className={`flex-1 text-sm font-sans ${dark ? "text-muted-dark" : "text-muted-light"}`}>
{row.label}
</Text>
<Text
className="text-sm font-sans font-semibold"
style={{ color: row.onPress ? accent : dark ? "#F0EDE8" : "#1A1714" }}
>
{row.value}
</Text>
{row.onPress && (
<Ionicons
name="open-outline"
size={13}
color={accent}
style={{ marginLeft: 4 }}
/>
)}
</View>
);
return row.onPress ? (
<TouchableOpacity key={row.label} onPress={row.onPress} activeOpacity={0.7}>
{Inner}
</TouchableOpacity>
) : (
<View key={row.label}>{Inner}</View>
);
})}
</View>
{/* Footer note */}
<Text className={`text-center text-xs font-sans mt-6 ${dark ? "text-muted-dark" : "text-muted-light"}`}>
Built with contributions welcome on GitHub
</Text>
</ScrollView>
</SafeAreaView>
);
}