Move production to beenvoice.app with migrated accounts, refreshed auth and timer UX, and expanded invoice flows.

Official URL migration preserves sessions, shortcuts prefs, and last clock-in client; auth screens match web with legal links; time clock and invoice editor/send flows are updated for the new domain and UI patterns.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-26 03:40:48 -04:00
co-authored by Cursor
parent e17c4c6854
commit 6762a9bff3
60 changed files with 2544 additions and 1091 deletions
+24 -2
View File
@@ -3,9 +3,11 @@ import {
Pressable,
StyleSheet,
Text,
View,
type PressableProps,
type ViewStyle,
} from "react-native";
import { Ionicons } from "@expo/vector-icons";
import { useAppTheme } from "@/contexts/ThemeContext";
import { fonts, radii, spacing } from "@/constants/theme";
@@ -15,6 +17,7 @@ type ButtonProps = PressableProps & {
loading?: boolean;
variant?: "primary" | "secondary" | "danger" | "ghost";
style?: ViewStyle;
showArrow?: boolean;
};
export function Button({
@@ -23,6 +26,7 @@ export function Button({
variant = "primary",
disabled,
style,
showArrow = false,
...props
}: ButtonProps) {
const { colors } = useAppTheme();
@@ -68,7 +72,17 @@ export function Button({
color={variant === "primary" ? colors.primaryForeground : colors.primary}
/>
) : (
<Text style={[styles.label, labelStyles[variant]]}>{title}</Text>
<View style={styles.content}>
<Text style={[styles.label, labelStyles[variant]]}>{title}</Text>
{showArrow ? (
<Ionicons
name="arrow-forward"
size={16}
color={labelStyles[variant].color}
style={styles.arrow}
/>
) : null}
</View>
)}
</Pressable>
);
@@ -76,12 +90,20 @@ export function Button({
const styles = StyleSheet.create({
base: {
minHeight: 40,
minHeight: 44,
borderRadius: radii.lg,
alignItems: "center",
justifyContent: "center",
paddingHorizontal: spacing.md,
},
content: {
flexDirection: "row",
alignItems: "center",
gap: spacing.sm,
},
arrow: {
marginTop: 1,
},
pressed: {
opacity: 0.92,
},