moved files to monorepo and updated controllers to start with /api
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user