feat: Implement mobile application and lead processing utilities.

This commit is contained in:
2026-02-19 14:21:51 +01:00
parent fca42db4d2
commit c53a71a5f9
120 changed files with 24080 additions and 851 deletions

View File

@@ -0,0 +1,67 @@
import { TouchableOpacity, Text, ActivityIndicator, StyleSheet } from 'react-native'
interface AnmeldeButtonProps {
terminId: string
isAngemeldet: boolean
onToggle: () => void
isLoading: boolean
}
export function AnmeldeButton({ isAngemeldet, onToggle, isLoading }: AnmeldeButtonProps) {
return (
<TouchableOpacity
onPress={onToggle}
disabled={isLoading}
style={[
styles.btn,
isAngemeldet ? styles.btnRegistered : styles.btnRegister,
isLoading && styles.disabled,
]}
activeOpacity={0.82}
>
{isLoading ? (
<ActivityIndicator color={isAngemeldet ? '#52525B' : '#FFFFFF'} />
) : (
<Text style={[styles.label, isAngemeldet && styles.labelRegistered]}>
{isAngemeldet ? '✓ Angemeldet Abmelden' : 'Jetzt anmelden'}
</Text>
)}
</TouchableOpacity>
)
}
const styles = StyleSheet.create({
btn: {
borderRadius: 14,
paddingVertical: 15,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
},
btnRegister: {
backgroundColor: '#003B7E',
shadowColor: '#003B7E',
shadowOffset: { width: 0, height: 4 },
shadowOpacity: 0.24,
shadowRadius: 10,
elevation: 5,
},
btnRegistered: {
backgroundColor: '#F4F4F5',
borderWidth: 1,
borderColor: '#E2E8F0',
},
disabled: {
opacity: 0.5,
},
label: {
fontSize: 15,
fontWeight: '600',
color: '#FFFFFF',
letterSpacing: 0.2,
},
labelRegistered: {
color: '#52525B',
},
})