import { useState } from "react"; import { Pressable, View } from "react-native"; import { KeyboardAwareScrollView } from "react-native-keyboard-controller"; import { Stack, useRouter } from "expo-router"; import { Button } from "@/components/ui/Button"; import CustomSafeAreaView from "@/components/ui/CustomSafeAreaView"; import { Input } from "@/components/ui/Input"; import PageTitle from "@/components/ui/PageTitle"; import { Text } from "@/components/ui/Text"; import useAppSettings from "@/lib/settings"; import { Plus, Trash2 } from "lucide-react-native"; import { useColorScheme } from "nativewind"; export default function ServerAddress() { const router = useRouter(); const { colorScheme } = useColorScheme(); const iconColor = colorScheme === "dark" ? "#d1d5db" : "#374151"; const { settings, setSettings } = useAppSettings(); const [address, setAddress] = useState( settings.address ?? "https://cloud.karakeep.app", ); const [error, setError] = useState(); // Custom headers state const [headers, setHeaders] = useState<{ key: string; value: string }[]>( Object.entries(settings.customHeaders || {}).map(([key, value]) => ({ key, value, })), ); const [newHeaderKey, setNewHeaderKey] = useState(""); const [newHeaderValue, setNewHeaderValue] = useState(""); const handleAddHeader = () => { if (!newHeaderKey.trim() || !newHeaderValue.trim()) { return; } // Check if header already exists const existingIndex = headers.findIndex((h) => h.key === newHeaderKey); if (existingIndex >= 0) { // Update existing header const updatedHeaders = [...headers]; updatedHeaders[existingIndex].value = newHeaderValue; setHeaders(updatedHeaders); } else { // Add new header setHeaders([...headers, { key: newHeaderKey, value: newHeaderValue }]); } setNewHeaderKey(""); setNewHeaderValue(""); }; const handleRemoveHeader = (index: number) => { setHeaders(headers.filter((_, i) => i !== index)); }; const handleSave = () => { // Validate the address if (!address.trim()) { setError("Server address is required"); return; } if (!address.startsWith("http://") && !address.startsWith("https://")) { setError("Server address must start with http:// or https://"); return; } // Convert headers array to object const headersObject = headers.reduce( (acc, { key, value }) => { if (key.trim() && value.trim()) { acc[key] = value; } return acc; }, {} as Record, ); // Remove trailing slash and save const cleanedAddress = address.trim().replace(/\/$/, ""); setSettings({ ...settings, address: cleanedAddress, customHeaders: headersObject, }); router.back(); }; return ( ( Save ), }} /> {/* Error Message */} {error && ( {error} )} {/* Server Address Section */} Server URL Enter the URL of your Karakeep server { setAddress(text); setError(undefined); }} autoCapitalize="none" keyboardType="url" autoFocus inputClasses="bg-background" /> Must start with http:// or https:// {/* Custom Headers Section */} Custom Headers {headers.length > 0 && ( ({headers.length}) )} Add custom HTTP headers for API requests {/* Existing Headers List */} {headers.length === 0 ? ( No custom headers configured ) : ( {headers.map((header, index) => ( {header.key} {header.value} handleRemoveHeader(index)} className="rounded-md p-2" hitSlop={8} > ))} )} {/* Add New Header Form */} Add New Header ); }