From e0218c2676c2c7b9bdb636435b4b5f982f55b752 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:08 -0500 Subject: [PATCH 01/93] fix(aura): scope local chat cache by user id --- app/(tabs)/ai.tsx | 16 ++++--- src/lib/localChatCache.ts | 90 +++++++++++++-------------------------- 2 files changed, 38 insertions(+), 68 deletions(-) diff --git a/app/(tabs)/ai.tsx b/app/(tabs)/ai.tsx index a8876bb..a40bc3d 100644 --- a/app/(tabs)/ai.tsx +++ b/app/(tabs)/ai.tsx @@ -246,7 +246,7 @@ export default function AIScreen() { setIsBooting(true); - const cached = await loadLatestChatCache(); + const cached = await loadLatestChatCache(uid); if (!cancelled && cached?.messages?.length) { setMessages(cached.messages); setActiveChatId(cached.chatId ?? null); @@ -264,7 +264,7 @@ export default function AIScreen() { setActiveChatId(routeChatId); setQuickChips(DEFAULT_CHIPS); setRecentThreads(recent); - await saveLatestChatCache(routeChatId, null, threadMessages); + await saveLatestChatCache(uid, routeChatId, null, threadMessages); } return; } @@ -276,7 +276,7 @@ export default function AIScreen() { setMessages(threadMessages); setActiveChatId(latestThread.chatId); setRecentThreads(recent); - await saveLatestChatCache(latestThread.chatId, latestThread.threadId, threadMessages); + await saveLatestChatCache(uid, latestThread.chatId, latestThread.threadId, threadMessages); } else if (!cancelled) { setRecentThreads(recent); } @@ -296,8 +296,8 @@ export default function AIScreen() { useEffect(() => { if (isBooting) return; - void saveLatestChatCache(activeChatId, null, messages); - }, [activeChatId, isBooting, messages]); + void saveLatestChatCache(uid, activeChatId, null, messages); + }, [activeChatId, isBooting, messages, uid]); useEffect(() => { const updateKeyboardHeight = (event: KeyboardEvent) => { @@ -623,7 +623,7 @@ export default function AIScreen() { const threadMessages = await loadChatMessages(uid, thread.chatId); setMessages(threadMessages); setActiveChatId(thread.chatId); - await saveLatestChatCache(thread.chatId, thread.threadId, threadMessages); + await saveLatestChatCache(uid, thread.chatId, thread.threadId, threadMessages); }, })), { text: "Cancel", style: "cancel" as const }, @@ -737,7 +737,9 @@ export default function AIScreen() { setMessages([]); setActiveChatId(null); setQuickChips(DEFAULT_CHIPS); - void clearLatestChatCache(); + if (uid) { + void clearLatestChatCache(uid); + } }} style={({ pressed }) => ({ width: 52, diff --git a/src/lib/localChatCache.ts b/src/lib/localChatCache.ts index 637310b..b6ad4bd 100644 --- a/src/lib/localChatCache.ts +++ b/src/lib/localChatCache.ts @@ -1,9 +1,6 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; const CACHE_PREFIX = "outfit-chat:"; -const LATEST_KEY = `${CACHE_PREFIX}latest-thread`; -const SESSIONS_KEY = `${CACHE_PREFIX}sessions-v2`; -const LATEST_CHAT_KEY = `${CACHE_PREFIX}latest-chat-v3`; const MAX_MESSAGES_PER_SESSION = 30; const MAX_SESSIONS = 6; @@ -35,6 +32,10 @@ function createSessionId() { return `session-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; } +function getScopedKey(uid: string, suffix: string) { + return `${CACHE_PREFIX}${uid}:${suffix}`; +} + function trimMessages(messages: T[]) { return messages.slice(-MAX_MESSAGES_PER_SESSION); } @@ -43,9 +44,9 @@ function sortSessions(sessions: LocalChatSession[]) { return [...sessions].sort((a, b) => b.updatedAt - a.updatedAt).slice(0, MAX_SESSIONS); } -async function loadRawStore(): Promise | null> { +async function loadRawStore(uid: string): Promise | null> { try { - const raw = await AsyncStorage.getItem(SESSIONS_KEY); + const raw = await AsyncStorage.getItem(getScopedKey(uid, "sessions-v2")); if (!raw) return null; const parsed = JSON.parse(raw) as SessionStore; if (!parsed || !Array.isArray(parsed.sessions)) return null; @@ -66,39 +67,8 @@ async function loadRawStore(): Promise | null> { } } -async function migrateLegacyStore(): Promise | null> { - try { - const raw = await AsyncStorage.getItem(LATEST_KEY); - if (!raw) return null; - const parsed = JSON.parse(raw) as CachePayload; - const now = Date.now(); - const migrated: SessionStore = { - latestSessionId: createSessionId(), - sessions: [ - { - sessionId: createSessionId(), - threadId: parsed?.threadId ?? null, - createdAt: now, - updatedAt: now, - messages: Array.isArray(parsed?.messages) ? trimMessages(parsed.messages) : [], - }, - ], - }; - migrated.latestSessionId = migrated.sessions[0]?.sessionId ?? null; - await AsyncStorage.setItem(SESSIONS_KEY, JSON.stringify(migrated)); - await AsyncStorage.removeItem(LATEST_KEY); - logSession("migrateLegacyStore", { - latestSessionId: migrated.latestSessionId, - sessionCount: migrated.sessions.length, - }); - return migrated; - } catch { - return null; - } -} - -async function loadStore(): Promise> { - const existing = await loadRawStore(); +async function loadStore(uid: string): Promise> { + const existing = await loadRawStore(uid); if (existing) { return { latestSessionId: existing.latestSessionId, @@ -106,16 +76,13 @@ async function loadStore(): Promise> { }; } - const migrated = await migrateLegacyStore(); - if (migrated) return migrated; - return { latestSessionId: null, sessions: [] }; } -async function persistStore(store: SessionStore): Promise { +async function persistStore(uid: string, store: SessionStore): Promise { try { await AsyncStorage.setItem( - SESSIONS_KEY, + getScopedKey(uid, "sessions-v2"), JSON.stringify({ latestSessionId: store.latestSessionId, sessions: sortSessions(store.sessions).map((session) => ({ @@ -140,8 +107,8 @@ export function createNewSession(): LocalChatSession { }; } -export async function loadLatestSession(): Promise | null> { - const store = await loadStore(); +export async function loadLatestSession(uid: string): Promise | null> { + const store = await loadStore(uid); const latest = store.sessions.find((session) => session.sessionId === store.latestSessionId) ?? store.sessions[0] ?? @@ -153,8 +120,8 @@ export async function loadLatestSession(): Promise | null return latest; } -export async function saveSession(session: LocalChatSession): Promise { - const store = await loadStore(); +export async function saveSession(uid: string, session: LocalChatSession): Promise { + const store = await loadStore(uid); const nextSession: LocalChatSession = { ...session, updatedAt: typeof session.updatedAt === "number" ? session.updatedAt : Date.now(), @@ -164,7 +131,7 @@ export async function saveSession(session: LocalChatSession): Promise entry.sessionId !== nextSession.sessionId), ]); - await persistStore({ + await persistStore(uid, { latestSessionId: nextSession.sessionId, sessions, }); @@ -176,12 +143,12 @@ export async function saveSession(session: LocalChatSession): Promise { - const store = await loadStore(); +export async function clearSession(uid: string, sessionId?: string): Promise { + const store = await loadStore(uid); const nextSessions = sessionId ? store.sessions.filter((session) => session.sessionId !== sessionId) : store.sessions.filter((session) => session.sessionId !== store.latestSessionId); - await persistStore({ + await persistStore(uid, { latestSessionId: nextSessions[0]?.sessionId ?? null, sessions: nextSessions, }); @@ -192,9 +159,9 @@ export async function clearSession(sessionId?: string): Promise { }); } -export async function loadLatestChatCache(): Promise | null> { +export async function loadLatestChatCache(uid: string): Promise | null> { try { - const raw = await AsyncStorage.getItem(LATEST_CHAT_KEY); + const raw = await AsyncStorage.getItem(getScopedKey(uid, "latest-chat-v3")); if (raw) { const parsed = JSON.parse(raw) as CachePayload; if (parsed && Array.isArray(parsed.messages)) { @@ -207,9 +174,9 @@ export async function loadLatestChatCache(): Promise | null> } } } catch { - // fall through to legacy session cache + // fall through to session cache } - const latest = await loadLatestSession(); + const latest = await loadLatestSession(uid); if (!latest) return null; return { chatId: latest.sessionId, @@ -220,17 +187,18 @@ export async function loadLatestChatCache(): Promise | null> } export async function saveLatestChatCache( + uid: string, chatId: string | null, threadId: string | null, messages: T[] ): Promise { try { if (!chatId) { - await AsyncStorage.removeItem(LATEST_CHAT_KEY); + await AsyncStorage.removeItem(getScopedKey(uid, "latest-chat-v3")); return; } await AsyncStorage.setItem( - LATEST_CHAT_KEY, + getScopedKey(uid, "latest-chat-v3"), JSON.stringify({ chatId, threadId, @@ -243,13 +211,13 @@ export async function saveLatestChatCache( } } -export async function clearLatestChatCache(): Promise { +export async function clearLatestChatCache(uid: string): Promise { try { - await AsyncStorage.removeItem(LATEST_CHAT_KEY); + await AsyncStorage.removeItem(getScopedKey(uid, "latest-chat-v3")); } catch { // ignore } - const latest = await loadLatestSession(); + const latest = await loadLatestSession(uid); if (!latest) return; - await clearSession(latest.sessionId); + await clearSession(uid, latest.sessionId); } From 13763be536c83f1d225db382b3de51d40792e2d6 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:15 -0500 Subject: [PATCH 02/93] feat(auth): add welcome, login, registration, and reset flows --- app/(auth)/forgot-password.tsx | 62 ++++++++++ app/(auth)/login.tsx | 104 ++++++----------- app/(auth)/register.tsx | 130 +++++++++------------ app/(auth)/welcome.tsx | 32 ++++++ app/_layout.tsx | 82 ++++++++++++-- src/components/auth/AuthScaffold.tsx | 162 +++++++++++++++++++++++++++ 6 files changed, 421 insertions(+), 151 deletions(-) create mode 100644 app/(auth)/forgot-password.tsx create mode 100644 app/(auth)/welcome.tsx create mode 100644 src/components/auth/AuthScaffold.tsx diff --git a/app/(auth)/forgot-password.tsx b/app/(auth)/forgot-password.tsx new file mode 100644 index 0000000..da7020b --- /dev/null +++ b/app/(auth)/forgot-password.tsx @@ -0,0 +1,62 @@ +import { router } from "expo-router"; +import { sendPasswordResetEmail } from "firebase/auth"; +import React, { useState } from "react"; +import { Alert, Text, View } from "react-native"; + +import { + AuthInlineLink, + AuthInput, + AuthScaffold, + PrimaryAuthButton, +} from "@/src/components/auth/AuthScaffold"; +import { auth } from "@/src/lib/firebase"; + +export default function ForgotPasswordScreen() { + const [email, setEmail] = useState(""); + const [loading, setLoading] = useState(false); + const [sent, setSent] = useState(false); + + async function onReset() { + const normalizedEmail = email.trim().toLowerCase(); + if (!normalizedEmail) return Alert.alert("Missing email", "Enter your email."); + + try { + setLoading(true); + await sendPasswordResetEmail(auth, normalizedEmail); + setSent(true); + } catch (error: any) { + Alert.alert("Reset failed", error?.message ?? "Unable to send reset email."); + } finally { + setLoading(false); + } + } + + return ( + + router.replace("/(auth)/login")} /> + + } + > + + + {sent ? ( + + Reset link sent. Check your inbox and spam folder. + + ) : null} + + ); +} + diff --git a/app/(auth)/login.tsx b/app/(auth)/login.tsx index d148e85..01283df 100644 --- a/app/(auth)/login.tsx +++ b/app/(auth)/login.tsx @@ -1,11 +1,17 @@ -import { Link, router } from "expo-router"; +import { router } from "expo-router"; import { signInWithEmailAndPassword } from "firebase/auth"; import React, { useState } from "react"; -import { Alert, Pressable, Text, TextInput, View } from "react-native"; +import { Alert, Text, View } from "react-native"; -import { auth } from "../../src/lib/firebase"; +import { + AuthInlineLink, + AuthInput, + AuthScaffold, + PrimaryAuthButton, +} from "@/src/components/auth/AuthScaffold"; +import { auth } from "@/src/lib/firebase"; -function norm(value: string) { +function normalize(value: string) { return value.trim(); } @@ -15,90 +21,52 @@ export default function LoginScreen() { const [loading, setLoading] = useState(false); async function onLogin() { - const e = norm(email).toLowerCase(); - const p = password; - - if (!e) return Alert.alert("Missing email", "Enter your email."); - if (!p) return Alert.alert("Missing password", "Enter your password."); + const normalizedEmail = normalize(email).toLowerCase(); + if (!normalizedEmail) return Alert.alert("Missing email", "Enter your email."); + if (!password) return Alert.alert("Missing password", "Enter your password."); try { setLoading(true); - await signInWithEmailAndPassword(auth, e, p); - router.replace("/(tabs)"); - } catch (err: any) { - Alert.alert("Login failed", err?.message ?? "Unable to sign in."); + await signInWithEmailAndPassword(auth, normalizedEmail, password); + } catch (error: any) { + Alert.alert("Sign in failed", error?.message ?? "Unable to sign in right now."); } finally { setLoading(false); } } return ( - - - Login - - - + router.push("/(auth)/register")} /> + router.push("/(auth)/forgot-password")} /> + + } + > + - - - - - {loading ? "Signing in..." : "Sign in"} - - - - - Create account - - - + + + Your styling profile, saved looks, and planner stay synced to this account. + + ); } -const input = { - borderWidth: 1, - borderColor: "#ddd", - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 12, - fontSize: 16, -} as const; - -const btnPrimary = { - marginTop: 4, - paddingVertical: 14, - borderRadius: 12, - backgroundColor: "#111", - alignItems: "center", -} as const; - -const btnPrimaryText = { - color: "#fff", - fontWeight: "900", -} as const; - -const btnSecondary = { - paddingVertical: 12, - borderRadius: 12, - borderWidth: 1, - borderColor: "#ddd", - alignItems: "center", -} as const; - -const btnSecondaryText = { - color: "#111", - fontWeight: "800", -} as const; diff --git a/app/(auth)/register.tsx b/app/(auth)/register.tsx index 67b4fb6..702c216 100644 --- a/app/(auth)/register.tsx +++ b/app/(auth)/register.tsx @@ -1,116 +1,94 @@ -import { Link, router } from "expo-router"; +import { router } from "expo-router"; import { createUserWithEmailAndPassword } from "firebase/auth"; import React, { useState } from "react"; -import { Alert, Pressable, Text, TextInput, View } from "react-native"; - -import { auth } from "../../src/lib/firebase"; - -function norm(value: string) { +import { Alert, View } from "react-native"; + +import { + AuthInlineLink, + AuthInput, + AuthScaffold, + PrimaryAuthButton, +} from "@/src/components/auth/AuthScaffold"; +import { auth } from "@/src/lib/firebase"; +import { EMPTY_USER_PROFILE_PREFERENCES, saveUserAccountProfile, saveUserProfilePreferences } from "@/src/lib/userProfile"; + +function normalize(value: string) { return value.trim(); } export default function RegisterScreen() { + const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [loading, setLoading] = useState(false); async function onRegister() { - const e = norm(email).toLowerCase(); - const p = password; - const cp = confirmPassword; - - if (!e) return Alert.alert("Missing email", "Enter your email."); - if (!p) return Alert.alert("Missing password", "Enter a password."); - if (p.length < 6) return Alert.alert("Weak password", "Use at least 6 characters."); - if (p !== cp) return Alert.alert("Password mismatch", "Passwords do not match."); + const normalizedName = normalize(name); + const normalizedEmail = normalize(email).toLowerCase(); + if (!normalizedName) return Alert.alert("Missing name", "Enter your first name."); + if (!normalizedEmail) return Alert.alert("Missing email", "Enter your email."); + if (!password) return Alert.alert("Missing password", "Enter a password."); + if (password.length < 6) return Alert.alert("Weak password", "Use at least 6 characters."); + if (password !== confirmPassword) { + return Alert.alert("Password mismatch", "Passwords do not match."); + } try { setLoading(true); - await createUserWithEmailAndPassword(auth, e, p); - router.replace("/(tabs)"); - } catch (err: any) { - Alert.alert("Registration failed", err?.message ?? "Unable to create account."); + const credential = await createUserWithEmailAndPassword(auth, normalizedEmail, password); + await Promise.all([ + saveUserAccountProfile(credential.user.uid, { name: normalizedName }), + saveUserProfilePreferences(credential.user.uid, { + ...EMPTY_USER_PROFILE_PREFERENCES, + firstName: normalizedName, + onboardingCompleted: false, + }), + ]); + router.replace("/(onboarding)"); + } catch (error: any) { + Alert.alert("Create account failed", error?.message ?? "Unable to create your account."); } finally { setLoading(false); } } return ( - - - Register - - - + router.replace("/(auth)/login")} /> + + } + > + + - - - - - - - {loading ? "Creating..." : "Create account"} - - - - - Back to login - - - + + ); } -const input = { - borderWidth: 1, - borderColor: "#ddd", - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 12, - fontSize: 16, -} as const; - -const btnPrimary = { - marginTop: 4, - paddingVertical: 14, - borderRadius: 12, - backgroundColor: "#111", - alignItems: "center", -} as const; - -const btnPrimaryText = { - color: "#fff", - fontWeight: "900", -} as const; - -const btnSecondary = { - paddingVertical: 12, - borderRadius: 12, - borderWidth: 1, - borderColor: "#ddd", - alignItems: "center", -} as const; - -const btnSecondaryText = { - color: "#111", - fontWeight: "800", -} as const; diff --git a/app/(auth)/welcome.tsx b/app/(auth)/welcome.tsx new file mode 100644 index 0000000..d5141f4 --- /dev/null +++ b/app/(auth)/welcome.tsx @@ -0,0 +1,32 @@ +import { router } from "expo-router"; +import React from "react"; +import { Text, View } from "react-native"; + +import { + AuthInlineLink, + AuthScaffold, + PrimaryAuthButton, + SecondaryAuthButton, +} from "@/src/components/auth/AuthScaffold"; + +export default function WelcomeScreen() { + return ( + + router.push("/(auth)/forgot-password")} /> + + No split UI. One premium experience, adapted through your style profile. + + + } + > + router.push("/(auth)/login")} /> + router.push("/(auth)/register")} /> + + ); +} + diff --git a/app/_layout.tsx b/app/_layout.tsx index f81506e..c973c52 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -2,11 +2,12 @@ import { DarkTheme, DefaultTheme, ThemeProvider } from "@react-navigation/native import { router, Stack, useSegments } from "expo-router"; import { StatusBar } from "expo-status-bar"; import "react-native-reanimated"; -import { useEffect } from "react"; +import { useEffect, useRef, useState } from "react"; import { ActivityIndicator, Platform, Text, View } from "react-native"; import { AuthProvider, useAuth } from "../src/contexts/AuthContext"; import { isVisionBackgroundRemovalAvailable } from "../src/bg/removeBackground"; +import { loadUserProfilePreferences } from "../src/lib/userProfile"; import { useColorScheme } from "@/hooks/use-color-scheme"; import { Colors } from "@/constants/theme"; import { SafeAreaProvider } from "react-native-safe-area-context"; @@ -20,26 +21,92 @@ function AuthGate() { const segments = useSegments(); const colorScheme = useColorScheme(); const palette = Colors[colorScheme === "dark" ? "dark" : "light"]; + const [profileLoading, setProfileLoading] = useState(true); + const [onboardingCompleted, setOnboardingCompleted] = useState(false); + const isRevalidatingOnboarding = useRef(false); useEffect(() => { - if (loading) return; + let cancelled = false; + + if (loading) return () => { cancelled = true; }; + + if (!user?.uid) { + setOnboardingCompleted(false); + setProfileLoading(false); + return () => { + cancelled = true; + }; + } + + setProfileLoading(true); + void loadUserProfilePreferences(user.uid) + .then((profile) => { + if (cancelled) return; + setOnboardingCompleted(Boolean(profile.onboardingCompleted)); + }) + .catch(() => { + if (cancelled) return; + setOnboardingCompleted(false); + }) + .finally(() => { + if (!cancelled) setProfileLoading(false); + }); + + return () => { + cancelled = true; + }; + }, [loading, user?.uid]); + + useEffect(() => { + if (loading || profileLoading) return; const inAuthGroup = segments[0] === "(auth)"; + const inOnboardingGroup = segments[0] === "(onboarding)"; if (!user && !inAuthGroup) { - router.replace("/(auth)/login"); + router.replace("/(auth)/welcome"); return; } - if (user && inAuthGroup) { + if (user && !onboardingCompleted && !inOnboardingGroup && !isRevalidatingOnboarding.current) { + let cancelled = false; + isRevalidatingOnboarding.current = true; + setProfileLoading(true); + void loadUserProfilePreferences(user.uid) + .then((profile) => { + if (cancelled) return; + const completed = Boolean(profile.onboardingCompleted); + setOnboardingCompleted(completed); + if (!completed) { + router.replace("/(onboarding)"); + } + }) + .catch(() => { + if (cancelled) return; + setOnboardingCompleted(false); + router.replace("/(onboarding)"); + }) + .finally(() => { + if (!cancelled) setProfileLoading(false); + isRevalidatingOnboarding.current = false; + }); + return () => { + cancelled = true; + isRevalidatingOnboarding.current = false; + }; + } + + if (user && onboardingCompleted && (inAuthGroup || inOnboardingGroup)) { router.replace("/(tabs)"); } - }, [loading, segments, user]); + }, [loading, onboardingCompleted, profileLoading, segments, user]); - if (loading) { + if (loading || profileLoading) { return ( - Checking session… + + {loading ? "Checking session…" : "Preparing your wardrobe profile…"} + ); } @@ -47,6 +114,7 @@ function AuthGate() { return ( + + + + + + {eyebrow} + + + {title} + + + {subtitle} + + + + + {children} + + + {footer ? {footer} : null} + + + + ); +} + +export function AuthInput(props: React.ComponentProps) { + const { colors } = useAppTheme(); + return ( + + ); +} + +export function PrimaryAuthButton({ + label, + onPress, + disabled, +}: { + label: string; + onPress: () => void; + disabled?: boolean; +}) { + const { colors } = useAppTheme(); + return ( + ({ + borderRadius: 18, + paddingVertical: 16, + alignItems: "center", + justifyContent: "center", + backgroundColor: colors.aiAccent, + opacity: disabled ? 0.55 : pressed ? 0.86 : 1, + })} + > + {label} + + ); +} + +export function SecondaryAuthButton({ + label, + onPress, +}: { + label: string; + onPress: () => void; +}) { + const { colors } = useAppTheme(); + return ( + ({ + borderRadius: 18, + paddingVertical: 15, + alignItems: "center", + justifyContent: "center", + borderWidth: 1, + borderColor: "rgba(255,255,255,0.08)", + backgroundColor: "rgba(255,255,255,0.03)", + opacity: pressed ? 0.82 : 1, + })} + > + {label} + + ); +} + +export function AuthInlineLink({ + label, + onPress, +}: { + label: string; + onPress: () => void; +}) { + const { colors } = useAppTheme(); + return ( + ({ opacity: pressed ? 0.75 : 1 })}> + {label} + + ); +} + From bd7454125c3b63bff81e855c84091646988e4170 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:25 -0500 Subject: [PATCH 03/93] feat(onboarding): add adaptive sizing and style-profile intake --- app/(onboarding)/_layout.tsx | 7 + app/(onboarding)/index.tsx | 808 ++++++++++++++++++++++++++++ src/lib/adaptiveSizing.ts | 274 ++++++++++ src/lib/userProfile.ts | 164 +++++- src/types/UserProfilePreferences.ts | 41 ++ 5 files changed, 1288 insertions(+), 6 deletions(-) create mode 100644 app/(onboarding)/_layout.tsx create mode 100644 app/(onboarding)/index.tsx create mode 100644 src/lib/adaptiveSizing.ts diff --git a/app/(onboarding)/_layout.tsx b/app/(onboarding)/_layout.tsx new file mode 100644 index 0000000..6e7951f --- /dev/null +++ b/app/(onboarding)/_layout.tsx @@ -0,0 +1,7 @@ +import { Stack } from "expo-router"; +import React from "react"; + +export default function OnboardingLayout() { + return ; +} + diff --git a/app/(onboarding)/index.tsx b/app/(onboarding)/index.tsx new file mode 100644 index 0000000..4812f4d --- /dev/null +++ b/app/(onboarding)/index.tsx @@ -0,0 +1,808 @@ +import { router } from "expo-router"; +import React, { useEffect, useMemo, useState } from "react"; +import { + Alert, + ActivityIndicator, + KeyboardAvoidingView, + Platform, + Pressable, + ScrollView, + Text, + TextInput, + View, +} from "react-native"; + +import { SafeScreen } from "@/src/components/SafeScreen"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useAppTheme } from "@/src/hooks/useAppTheme"; +import { + getAdaptiveSizeFields, + normalizeProfileSizePayload, + ONBOARDING_CATEGORY_OPTIONS, + shouldShowAdvancedBraSize, +} from "@/src/lib/adaptiveSizing"; +import { + EMPTY_USER_PROFILE_PREFERENCES, + loadUserProfilePreferences, + saveUserAccountProfile, + saveUserProfilePreferences, +} from "@/src/lib/userProfile"; +import type { UserProfilePreferences } from "@/src/types/UserProfilePreferences"; + +const WARDROBE_MODES = ["masculine", "feminine", "neutral", "mixed", "custom"] as const; +const STYLE_OPTIONS = [ + "streetwear", + "casual", + "smart_casual", + "formal", + "minimal", + "sporty", + "luxury", + "modest", + "vintage", + "edgy", +] as const; +const FIT_OPTIONS = ["slim", "regular", "relaxed", "oversized"] as const; +const ACCESSORY_OPTIONS = [ + "watches", + "jewelry", + "handbags", + "caps", + "belts", + "scarves", + "perfumes", + "sunglasses", +] as const; +const OCCASION_OPTIONS = [ + "daily", + "work", + "college", + "gym", + "party", + "date_night", + "travel", + "formal_events", +] as const; +const GOAL_OPTIONS = [ + "outfit_suggestions", + "shopping_suggestions", + "packing_help", + "laundry_reminders", + "styling_confidence", +] as const; +const COLOR_OPTIONS = [ + "black", + "white", + "navy", + "blue", + "grey", + "brown", + "beige", + "green", + "olive", + "red", + "pink", + "cream", +] as const; + +type StepKey = + | "basics" + | "wardrobeMode" + | "categories" + | "style" + | "body" + | "sizes" + | "preferences" + | "goals"; + +type Step = { + key: StepKey; + title: string; + subtitle: string; +}; + +const STEPS: Step[] = [ + { + key: "basics", + title: "Set your foundation", + subtitle: "Tell Wardrobe AI how to size, greet, and localize your experience.", + }, + { + key: "wardrobeMode", + title: "Choose your wardrobe mode", + subtitle: "This shapes organization, sizing emphasis, and styling logic, not a separate UI.", + }, + { + key: "categories", + title: "Choose what you actually wear", + subtitle: "We’ll only ask size questions for categories that matter to your real wardrobe.", + }, + { + key: "style", + title: "Define your style direction", + subtitle: "Pick the aesthetics you want AURA to lean into most.", + }, + { + key: "body", + title: "Add body & fit context", + subtitle: "This helps with fit-based sizing and better silhouette recommendations.", + }, + { + key: "sizes", + title: "Save your default sizes", + subtitle: "These defaults prefill new items and make shopping guidance more useful.", + }, + { + key: "preferences", + title: "Tune preferences", + subtitle: "Set colors, accessories, and occasions so recommendations feel more personal.", + }, + { + key: "goals", + title: "Choose what Wardrobe AI should help with first", + subtitle: "This changes what shows up first in Home, Closet, and AURA.", + }, +]; + +function toggleValue(list: string[], value: string) { + return list.includes(value) ? list.filter((entry) => entry !== value) : [...list, value]; +} + +function humanize(value: string) { + return value.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); +} + +function chipSelected(selected: string[] | undefined, value: string) { + return Array.isArray(selected) && selected.includes(value); +} + +function sizeSectionTitle(key: string) { + if (key === "tops") return "Tops"; + if (key === "outerwear") return "Outerwear"; + if (key === "bottoms" || key === "bottomsWaist" || key === "bottomsLength") return "Bottoms"; + if (key === "dresses") return "Dresses"; + if (key === "skirts") return "Skirts"; + if (key === "shoes") return "Footwear"; + return "Sizing"; +} + +export default function OnboardingScreen() { + const { user } = useAuth(); + const { colors } = useAppTheme(); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + const [stepIndex, setStepIndex] = useState(0); + const [advancedFitOpen, setAdvancedFitOpen] = useState(false); + const [draft, setDraft] = useState(EMPTY_USER_PROFILE_PREFERENCES); + + useEffect(() => { + let cancelled = false; + if (!user?.uid) { + router.replace("/(auth)/welcome"); + return; + } + void loadUserProfilePreferences(user.uid) + .then((profile) => { + if (cancelled) return; + setDraft((prev) => ({ + ...prev, + ...profile, + firstName: profile.firstName ?? prev.firstName ?? user.displayName ?? "", + })); + }) + .finally(() => { + if (!cancelled) setLoading(false); + }); + return () => { + cancelled = true; + }; + }, [user?.displayName, user?.uid]); + + const step = STEPS[stepIndex]; + const progress = (stepIndex + 1) / STEPS.length; + + const units = useMemo(() => { + if (draft.unitsPreference === "imperial") { + return { length: "in", weight: "lb", shoeRegion: "US", clothingRegion: "US" } as const; + } + return { length: "cm", weight: "kg", shoeRegion: "EU", clothingRegion: "INTL" } as const; + }, [draft.unitsPreference]); + + const adaptiveSizeFields = useMemo( + () => getAdaptiveSizeFields(draft.selectedCategories, draft.wardrobeMode), + [draft.selectedCategories, draft.wardrobeMode] + ); + const shouldRenderBraSize = useMemo( + () => shouldShowAdvancedBraSize(draft.selectedCategories, draft.wardrobeMode), + [draft.selectedCategories, draft.wardrobeMode] + ); + const groupedAdaptiveSizeFields = useMemo(() => { + const groups = new Map(); + adaptiveSizeFields.forEach((field) => { + const section = sizeSectionTitle(field.key); + const current = groups.get(section) ?? []; + current.push(field); + groups.set(section, current); + }); + return Array.from(groups.entries()).map(([title, fields]) => ({ title, fields })); + }, [adaptiveSizeFields]); + + async function onFinish() { + if (!user?.uid) return; + try { + setSaving(true); + const normalizedSizingDraft = normalizeProfileSizePayload(draft); + const profileToSave: UserProfilePreferences = { + ...normalizedSizingDraft, + onboardingCompleted: true, + units, + favoriteColors: normalizedSizingDraft.favoriteColors, + avoidedColors: normalizedSizingDraft.avoidedColors, + defaultSizes: { + ...normalizedSizingDraft.defaultSizes, + top: + normalizedSizingDraft.defaultSizes.top ?? + normalizedSizingDraft.defaultSizes.tops ?? + null, + tops: + normalizedSizingDraft.defaultSizes.tops ?? + normalizedSizingDraft.defaultSizes.top ?? + null, + bottomWaist: + normalizedSizingDraft.defaultSizes.bottomWaist ?? + normalizedSizingDraft.defaultSizes.bottomsWaist ?? + normalizedSizingDraft.defaultSizes.bottoms ?? + null, + bottomsWaist: + normalizedSizingDraft.defaultSizes.bottomsWaist ?? + normalizedSizingDraft.defaultSizes.bottomWaist ?? + null, + bottoms: + normalizedSizingDraft.defaultSizes.bottoms ?? + normalizedSizingDraft.defaultSizes.bottomWaist ?? + null, + bottomLength: + normalizedSizingDraft.defaultSizes.bottomLength ?? + normalizedSizingDraft.defaultSizes.bottomsLength ?? + null, + bottomsLength: + normalizedSizingDraft.defaultSizes.bottomsLength ?? + normalizedSizingDraft.defaultSizes.bottomLength ?? + null, + }, + height: { + value: normalizedSizingDraft.body.height ?? null, + unit: draft.unitsPreference === "imperial" ? "ft_in" : "cm", + }, + weight: { + value: normalizedSizingDraft.body.weight ?? null, + unit: draft.unitsPreference === "imperial" ? "lb" : "kg", + }, + stylePreferences: { + ...normalizedSizingDraft.stylePreferences, + preferredStyles: normalizedSizingDraft.styleAesthetics, + favoriteColors: normalizedSizingDraft.favoriteColors, + avoidedColors: normalizedSizingDraft.avoidedColors, + }, + fitPreferences: { + ...normalizedSizingDraft.fitPreferences, + tops: + normalizedSizingDraft.preferredFit ?? + normalizedSizingDraft.fitPreferences.tops ?? + null, + }, + }; + await Promise.all([ + saveUserProfilePreferences(user.uid, profileToSave), + saveUserAccountProfile(user.uid, { + name: (draft.firstName ?? "").trim() || user.displayName || user.email?.split("@")[0] || null, + }), + ]); + router.replace("/(tabs)"); + } finally { + setSaving(false); + } + } + + function nextStep() { + if (step.key === "categories" && draft.selectedCategories.length === 0) { + Alert.alert( + "Choose a few categories", + "Pick the clothing categories you actually wear so we can tailor the size questions." + ); + return; + } + if (step.key === "sizes") { + const missingRequiredFields = adaptiveSizeFields + .filter((field) => field.required) + .filter((field) => { + const value = draft.defaultSizes[field.key]; + return !String(value ?? "").trim(); + }); + if (missingRequiredFields.length > 0) { + Alert.alert( + "Finish the key sizes", + `Add ${missingRequiredFields[0].label.toLowerCase()} so Wardrobe AI can size recommendations more accurately.` + ); + return; + } + } + if (stepIndex === STEPS.length - 1) { + void onFinish(); + return; + } + setStepIndex((current) => Math.min(current + 1, STEPS.length - 1)); + } + + if (loading) { + return ( + + + + Preparing your style profile… + + + ); + } + + return ( + + + + + + WARDROBE AI SETUP + + + + + {step.title} + {step.subtitle} + + + + {step.key === "basics" ? ( + <> + setDraft((prev) => ({ ...prev, firstName: value }))} + placeholder="What should AURA call you?" + /> + setDraft((prev) => ({ ...prev, region: value }))} + placeholder="e.g. United States" + /> + setDraft((prev) => ({ ...prev, unitsPreference: value as UserProfilePreferences["unitsPreference"] }))} + /> + + ) : null} + + {step.key === "wardrobeMode" ? ( + setDraft((prev) => ({ ...prev, wardrobeMode: value as UserProfilePreferences["wardrobeMode"] }))} + /> + ) : null} + + {step.key === "categories" ? ( + + setDraft((prev) => ({ + ...prev, + selectedCategories: toggleValue(prev.selectedCategories, value), + })) + } + /> + ) : null} + + {step.key === "style" ? ( + + setDraft((prev) => ({ + ...prev, + styleAesthetics: toggleValue(prev.styleAesthetics, value), + })) + } + /> + ) : null} + + {step.key === "body" ? ( + <> + + setDraft((prev) => ({ + ...prev, + body: { ...prev.body, height: value ? Number(value) : null }, + })) + } + keyboardType="numeric" + /> + + setDraft((prev) => ({ + ...prev, + body: { ...prev.body, weight: value ? Number(value) : null }, + })) + } + keyboardType="numeric" + /> + setDraft((prev) => ({ ...prev, preferredFit: value as UserProfilePreferences["preferredFit"] }))} + /> + + ) : null} + + {step.key === "sizes" ? ( + <> + + We'll tailor sizing to what you actually wear. Core sizes stay upfront, and deeper fit details are always optional. + + + {groupedAdaptiveSizeFields.map((group) => ( + + + {group.title.toUpperCase()} + + {group.fields.map((field) => ( + + setDraft((prev) => { + const nextDefaultSizes = { ...prev.defaultSizes, [field.key]: value }; + if (field.key === "tops") nextDefaultSizes.top = value; + if (field.key === "bottoms") { + nextDefaultSizes.bottomWaist = + nextDefaultSizes.bottomWaist ?? value; + } + if (field.key === "bottomsWaist") { + nextDefaultSizes.bottomWaist = value; + nextDefaultSizes.bottomsWaist = value; + } + if (field.key === "bottomsLength") nextDefaultSizes.bottomLength = value; + return { + ...prev, + defaultSizes: nextDefaultSizes, + }; + }) + } + placeholder={field.placeholder} + /> + ))} + + ))} + + + setAdvancedFitOpen((current) => !current)} + style={({ pressed }) => ({ + paddingHorizontal: 16, + paddingVertical: 14, + opacity: pressed ? 0.84 : 1, + gap: 4, + })} + > + + Advanced fit details + + + Optional measurements for more precise tailoring and styling. + + + + {advancedFitOpen ? ( + + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, bust: value }, + })) + } + /> + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, waistMeasurement: value }, + })) + } + /> + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, hips: value }, + })) + } + /> + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, inseam: value }, + })) + } + /> + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, shoulderWidth: value }, + })) + } + /> + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, sleeveLength: value }, + })) + } + /> + {shouldRenderBraSize ? ( + + setDraft((prev) => ({ + ...prev, + advancedFit: { ...prev.advancedFit, braSize: value }, + })) + } + /> + ) : null} + + ) : null} + + + ) : null} + + {step.key === "preferences" ? ( + <> + + setDraft((prev) => ({ ...prev, favoriteColors: toggleValue(prev.favoriteColors, value) })) + } + /> + + setDraft((prev) => ({ ...prev, avoidedColors: toggleValue(prev.avoidedColors, value) })) + } + /> + + setDraft((prev) => ({ + ...prev, + accessoryPreferences: toggleValue(prev.accessoryPreferences, value), + })) + } + /> + + setDraft((prev) => ({ + ...prev, + occasionPriority: toggleValue(prev.occasionPriority, value), + })) + } + /> + + ) : null} + + {step.key === "goals" ? ( + + setDraft((prev) => ({ ...prev, goals: toggleValue(prev.goals, value) })) + } + /> + ) : null} + + + + + ({ + borderRadius: 18, + paddingVertical: 16, + alignItems: "center", + justifyContent: "center", + backgroundColor: colors.aiAccent, + opacity: saving ? 0.55 : pressed ? 0.86 : 1, + })} + > + + {stepIndex === STEPS.length - 1 ? (saving ? "Saving..." : "Finish setup") : "Continue"} + + + {stepIndex > 0 ? ( + setStepIndex((current) => Math.max(current - 1, 0))} + style={({ pressed }) => ({ alignItems: "center", paddingVertical: 8, opacity: pressed ? 0.72 : 1 })} + > + Back + + ) : null} + + + + ); +} + +function OnboardingInput({ + label, + value, + onChangeText, + placeholder, + keyboardType, +}: { + label: string; + value: string; + onChangeText: (value: string) => void; + placeholder?: string; + keyboardType?: "default" | "numeric"; +}) { + const { colors } = useAppTheme(); + return ( + + {label} + + + ); +} + +function ChipGroup({ + label, + values, + selected, + onToggle, +}: { + label: string; + values: string[]; + selected: string[]; + onToggle: (value: string) => void; +}) { + const { colors } = useAppTheme(); + return ( + + {label} + + {values.map((value) => { + const active = chipSelected(selected, value); + return ( + onToggle(value)} + style={({ pressed }) => ({ + paddingHorizontal: 14, + paddingVertical: 10, + borderRadius: 999, + backgroundColor: active ? "rgba(143,216,255,0.18)" : "rgba(255,255,255,0.04)", + borderWidth: 1, + borderColor: active ? "rgba(143,216,255,0.4)" : "rgba(255,255,255,0.08)", + opacity: pressed ? 0.82 : 1, + })} + > + + {humanize(value)} + + + ); + })} + + + ); +} diff --git a/src/lib/adaptiveSizing.ts b/src/lib/adaptiveSizing.ts new file mode 100644 index 0000000..993ba89 --- /dev/null +++ b/src/lib/adaptiveSizing.ts @@ -0,0 +1,274 @@ +import type { + UserProfilePreferences, + WardrobeMode, +} from "@/src/types/UserProfilePreferences"; + +export const ONBOARDING_CATEGORY_OPTIONS = [ + "tshirts", + "shirts", + "polos", + "blouses", + "tanks", + "crop_tops", + "sweaters", + "hoodies", + "jackets", + "coats", + "blazers", + "jeans", + "trousers", + "shorts", + "skirts", + "dresses", + "sneakers", + "loafers", + "boots", + "heels", + "sandals", +] as const; + +export type OnboardingCategory = (typeof ONBOARDING_CATEGORY_OPTIONS)[number]; + +export type AdaptiveSizeFieldKey = + | "tops" + | "outerwear" + | "bottoms" + | "bottomsWaist" + | "bottomsLength" + | "dresses" + | "skirts" + | "shoes"; + +export type AdaptiveSizeField = { + key: AdaptiveSizeFieldKey; + label: string; + placeholder: string; + required: boolean; + optional?: boolean; +}; + +const TOP_CORE = new Set([ + "tshirts", + "shirts", + "polos", + "sweaters", + "hoodies", + "blouses", + "tanks", + "crop_tops", +]); + +const OUTERWEAR_CORE = new Set(["jackets", "coats", "blazers"]); +const BOTTOMS_CORE = new Set(["jeans", "trousers", "shorts"]); +const FOOTWEAR_CORE = new Set([ + "heels", + "sandals", + "boots", + "sneakers", + "loafers", +]); +const BRA_RELEVANT = new Set([ + "dresses", + "blouses", + "tanks", + "crop_tops", +]); + +function hasAnyCategory( + selectedCategories: string[], + candidates: Set, +) { + return selectedCategories.some((category) => + candidates.has(category as OnboardingCategory), + ); +} + +export function shouldShowAdvancedBraSize( + selectedCategories: string[], + wardrobeMode: WardrobeMode, +) { + if ( + wardrobeMode !== "feminine" && + wardrobeMode !== "mixed" && + wardrobeMode !== "custom" + ) { + return false; + } + return hasAnyCategory(selectedCategories, BRA_RELEVANT); +} + +export function getAdaptiveSizeFields( + selectedCategories: string[], + wardrobeMode: WardrobeMode, +): AdaptiveSizeField[] { + const fields: AdaptiveSizeField[] = []; + const isMasculineMode = wardrobeMode === "masculine"; + const isFeminineMode = wardrobeMode === "feminine"; + + if (hasAnyCategory(selectedCategories, TOP_CORE)) { + fields.push({ + key: "tops", + label: "Tops size", + placeholder: isFeminineMode ? "e.g. S, M, 4, 6" : "e.g. M, L, 40", + required: true, + }); + } + + if (hasAnyCategory(selectedCategories, OUTERWEAR_CORE)) { + fields.push({ + key: "outerwear", + label: "Outerwear size", + placeholder: "e.g. M, L, 40, 8", + required: true, + }); + } + + if (selectedCategories.includes("dresses")) { + fields.push({ + key: "dresses", + label: "Dress size", + placeholder: "e.g. S, 4, 38", + required: true, + }); + } + + if (selectedCategories.includes("skirts")) { + fields.push({ + key: "skirts", + label: "Skirt size", + placeholder: "e.g. S, 4, 28", + required: true, + }); + } + + if (hasAnyCategory(selectedCategories, BOTTOMS_CORE)) { + if (isMasculineMode) { + fields.push({ + key: "bottomsWaist", + label: "Bottoms waist", + placeholder: "e.g. 30, 32, 34", + required: true, + }); + fields.push({ + key: "bottomsLength", + label: "Bottoms length", + placeholder: "e.g. 30, 32, regular", + required: false, + optional: true, + }); + fields.push({ + key: "bottoms", + label: "Bottoms size", + placeholder: "Optional fallback size", + required: false, + optional: true, + }); + } else if (isFeminineMode) { + fields.push({ + key: "bottoms", + label: "Bottoms size", + placeholder: "e.g. 4, 6, S, M", + required: true, + }); + fields.push({ + key: "bottomsWaist", + label: "Bottoms waist", + placeholder: "Optional waist measurement", + required: false, + optional: true, + }); + fields.push({ + key: "bottomsLength", + label: "Bottoms length", + placeholder: "Optional length / inseam", + required: false, + optional: true, + }); + } else { + fields.push({ + key: "bottoms", + label: "Bottoms size", + placeholder: "e.g. S, M, 30, 32", + required: true, + }); + fields.push({ + key: "bottomsWaist", + label: "Bottoms waist", + placeholder: "Optional waist measurement", + required: false, + optional: true, + }); + fields.push({ + key: "bottomsLength", + label: "Bottoms length", + placeholder: "Optional length / inseam", + required: false, + optional: true, + }); + } + } + + if (hasAnyCategory(selectedCategories, FOOTWEAR_CORE)) { + fields.push({ + key: "shoes", + label: "Shoe size", + placeholder: "e.g. US 9, EU 40", + required: true, + }); + } + + return fields; +} + +function stringOrNull(value: unknown) { + const next = String(value ?? "").trim(); + return next || null; +} + +export function normalizeProfileSizePayload( + draft: UserProfilePreferences, +): UserProfilePreferences { + const defaultSizes = { + ...draft.defaultSizes, + top: stringOrNull(draft.defaultSizes.top ?? draft.defaultSizes.tops), + tops: stringOrNull(draft.defaultSizes.tops ?? draft.defaultSizes.top), + outerwear: stringOrNull(draft.defaultSizes.outerwear), + bottoms: stringOrNull(draft.defaultSizes.bottoms), + bottomWaist: stringOrNull( + draft.defaultSizes.bottomWaist ?? draft.defaultSizes.bottomsWaist, + ), + bottomsWaist: stringOrNull( + draft.defaultSizes.bottomsWaist ?? draft.defaultSizes.bottomWaist, + ), + bottomLength: stringOrNull( + draft.defaultSizes.bottomLength ?? draft.defaultSizes.bottomsLength, + ), + bottomsLength: stringOrNull( + draft.defaultSizes.bottomsLength ?? draft.defaultSizes.bottomLength, + ), + dresses: stringOrNull(draft.defaultSizes.dresses), + skirts: stringOrNull(draft.defaultSizes.skirts), + shoes: stringOrNull(draft.defaultSizes.shoes), + }; + + const advancedFit = { + bust: stringOrNull(draft.advancedFit.bust), + waistMeasurement: stringOrNull(draft.advancedFit.waistMeasurement), + hips: stringOrNull(draft.advancedFit.hips), + inseam: stringOrNull(draft.advancedFit.inseam), + shoulderWidth: stringOrNull(draft.advancedFit.shoulderWidth), + sleeveLength: stringOrNull(draft.advancedFit.sleeveLength), + braSize: shouldShowAdvancedBraSize( + draft.selectedCategories, + draft.wardrobeMode, + ) + ? stringOrNull(draft.advancedFit.braSize) + : null, + }; + + return { + ...draft, + defaultSizes, + advancedFit, + }; +} diff --git a/src/lib/userProfile.ts b/src/lib/userProfile.ts index af7be3f..e1c2717 100644 --- a/src/lib/userProfile.ts +++ b/src/lib/userProfile.ts @@ -9,6 +9,29 @@ export type UserAccountProfile = { }; export const EMPTY_USER_PROFILE_PREFERENCES: UserProfilePreferences = { + onboardingCompleted: false, + firstName: null, + region: null, + unitsPreference: "metric", + wardrobeMode: "mixed", + selectedCategories: [], + styleAesthetics: [], + preferredFit: null, + favoriteColors: [], + avoidedColors: [], + accessoryPreferences: [], + occasionPriority: [], + goals: [], + height: { + value: null, + unit: "cm", + }, + weight: { + value: null, + unit: "kg", + }, + createdAt: null, + updatedAt: null, units: { length: "cm", weight: "kg", @@ -17,6 +40,7 @@ export const EMPTY_USER_PROFILE_PREFERENCES: UserProfilePreferences = { }, body: {}, defaultSizes: {}, + advancedFit: {}, fitPreferences: {}, stylePreferences: {}, closetPreferences: {}, @@ -53,13 +77,57 @@ export function normalizeUserProfilePreferences(value: unknown): UserProfilePref const root = readRecord(value); const units = readRecord(root.units); const body = readRecord(root.body); + const height = readRecord(root.height); + const weight = readRecord(root.weight); const defaultSizes = readRecord(root.defaultSizes); + const advancedFit = readRecord(root.advancedFit); const fitPreferences = readRecord(root.fitPreferences); const stylePreferences = readRecord(root.stylePreferences); const closetPreferences = readRecord(root.closetPreferences); const notifications = readRecord(root.notifications); return { + onboardingCompleted: typeof root.onboardingCompleted === "boolean" ? root.onboardingCompleted : false, + firstName: cleanString(root.firstName), + region: cleanString(root.region), + unitsPreference: + root.unitsPreference === "imperial" || root.unitsPreference === "metric" + ? root.unitsPreference + : units.length === "in" || units.weight === "lb" + ? "imperial" + : "metric", + wardrobeMode: + root.wardrobeMode === "masculine" || + root.wardrobeMode === "feminine" || + root.wardrobeMode === "neutral" || + root.wardrobeMode === "mixed" || + root.wardrobeMode === "custom" + ? root.wardrobeMode + : "mixed", + selectedCategories: cleanStringList(root.selectedCategories), + styleAesthetics: cleanStringList(root.styleAesthetics), + preferredFit: + root.preferredFit === "slim" || + root.preferredFit === "regular" || + root.preferredFit === "relaxed" || + root.preferredFit === "oversized" + ? root.preferredFit + : null, + favoriteColors: cleanStringList(root.favoriteColors), + avoidedColors: cleanStringList(root.avoidedColors), + accessoryPreferences: cleanStringList(root.accessoryPreferences), + occasionPriority: cleanStringList(root.occasionPriority), + goals: cleanStringList(root.goals), + height: { + value: cleanNumber(height.value ?? body.height), + unit: height.unit === "ft_in" ? "ft_in" : "cm", + }, + weight: { + value: cleanNumber(weight.value ?? body.weight), + unit: weight.unit === "lb" ? "lb" : "kg", + }, + createdAt: cleanNumber(root.createdAt), + updatedAt: cleanNumber(root.updatedAt), units: { length: units.length === "in" ? "in" : "cm", weight: units.weight === "lb" ? "lb" : "kg", @@ -87,15 +155,30 @@ export function normalizeUserProfilePreferences(value: unknown): UserProfilePref footLength: cleanNumber(body.footLength), }, defaultSizes: { + tops: cleanString(defaultSizes.tops ?? defaultSizes.top), top: cleanString(defaultSizes.top), outerwear: cleanString(defaultSizes.outerwear), hoodie: cleanString(defaultSizes.hoodie), formalShirt: cleanString(defaultSizes.formalShirt), + bottoms: cleanString(defaultSizes.bottoms ?? defaultSizes.bottomWaist), bottomWaist: cleanString(defaultSizes.bottomWaist), + bottomsWaist: cleanString(defaultSizes.bottomsWaist ?? defaultSizes.bottomWaist), + bottomsLength: cleanString(defaultSizes.bottomsLength ?? defaultSizes.bottomLength), bottomLength: cleanString(defaultSizes.bottomLength), jeans: cleanString(defaultSizes.jeans), + dresses: cleanString(defaultSizes.dresses), + skirts: cleanString(defaultSizes.skirts), shoes: cleanString(defaultSizes.shoes), }, + advancedFit: { + bust: cleanString(advancedFit.bust ?? body.chest), + waistMeasurement: cleanString(advancedFit.waistMeasurement ?? body.waist), + hips: cleanString(advancedFit.hips ?? body.hips), + inseam: cleanString(advancedFit.inseam ?? body.inseam), + shoulderWidth: cleanString(advancedFit.shoulderWidth ?? body.shoulders), + sleeveLength: cleanString(advancedFit.sleeveLength ?? body.sleeve), + braSize: cleanString(advancedFit.braSize), + }, fitPreferences: { tops: fitPreferences.tops === "slim" || @@ -132,9 +215,9 @@ export function normalizeUserProfilePreferences(value: unknown): UserProfilePref : null, }, stylePreferences: { - preferredStyles: cleanStringList(stylePreferences.preferredStyles), - favoriteColors: cleanStringList(stylePreferences.favoriteColors), - avoidedColors: cleanStringList(stylePreferences.avoidedColors), + preferredStyles: cleanStringList(stylePreferences.preferredStyles ?? root.styleAesthetics), + favoriteColors: cleanStringList(stylePreferences.favoriteColors ?? root.favoriteColors), + avoidedColors: cleanStringList(stylePreferences.avoidedColors ?? root.avoidedColors), preferredBrands: cleanStringList(stylePreferences.preferredBrands), }, closetPreferences: { @@ -201,10 +284,71 @@ export async function saveUserProfilePreferences( profilePreferences: UserProfilePreferences, ) { const normalized = normalizeUserProfilePreferences(profilePreferences); + const timestamp = Date.now(); await setDoc( doc(db, "users", uid), { - profilePreferences: normalized, + profilePreferences: { + ...normalized, + createdAt: normalized.createdAt ?? timestamp, + updatedAt: timestamp, + height: normalized.height, + weight: normalized.weight, + stylePreferences: { + ...normalized.stylePreferences, + preferredStyles: normalized.styleAesthetics, + favoriteColors: normalized.favoriteColors, + avoidedColors: normalized.avoidedColors, + }, + fitPreferences: { + ...normalized.fitPreferences, + tops: normalized.preferredFit ?? normalized.fitPreferences.tops ?? null, + }, + defaultSizes: { + ...normalized.defaultSizes, + top: normalized.defaultSizes.top ?? normalized.defaultSizes.tops ?? null, + tops: normalized.defaultSizes.tops ?? normalized.defaultSizes.top ?? null, + bottomWaist: + normalized.defaultSizes.bottomWaist ?? normalized.defaultSizes.bottoms ?? null, + bottomsWaist: + normalized.defaultSizes.bottomsWaist ?? + normalized.defaultSizes.bottomWaist ?? + normalized.defaultSizes.bottoms ?? + null, + bottoms: + normalized.defaultSizes.bottoms ?? normalized.defaultSizes.bottomWaist ?? null, + bottomLength: + normalized.defaultSizes.bottomLength ?? normalized.defaultSizes.bottomsLength ?? null, + bottomsLength: + normalized.defaultSizes.bottomsLength ?? normalized.defaultSizes.bottomLength ?? null, + dresses: normalized.defaultSizes.dresses ?? null, + skirts: normalized.defaultSizes.skirts ?? null, + }, + advancedFit: { + ...normalized.advancedFit, + bust: normalized.advancedFit.bust ?? null, + waistMeasurement: normalized.advancedFit.waistMeasurement ?? null, + hips: normalized.advancedFit.hips ?? null, + inseam: normalized.advancedFit.inseam ?? null, + shoulderWidth: normalized.advancedFit.shoulderWidth ?? null, + sleeveLength: normalized.advancedFit.sleeveLength ?? null, + braSize: normalized.advancedFit.braSize ?? null, + }, + body: { + ...normalized.body, + height: normalized.height.value ?? normalized.body.height ?? null, + weight: normalized.weight.value ?? normalized.body.weight ?? null, + chest: normalized.advancedFit.bust ?? normalized.body.chest ?? null, + waist: + normalized.advancedFit.waistMeasurement ?? normalized.body.waist ?? null, + hips: normalized.advancedFit.hips ?? normalized.body.hips ?? null, + inseam: normalized.advancedFit.inseam ?? normalized.body.inseam ?? null, + shoulders: + normalized.advancedFit.shoulderWidth ?? normalized.body.shoulders ?? null, + sleeve: + normalized.advancedFit.sleeveLength ?? normalized.body.sleeve ?? null, + }, + }, profileUpdatedAt: Date.now(), }, { merge: true }, @@ -221,15 +365,23 @@ export function getDefaultSizeForSelection( const defaults = profile.defaultSizes; if (category === Category.OUTERWEAR) return defaults.outerwear ?? ""; if (category === Category.FOOTWEAR) return defaults.shoes ?? ""; + if (category === Category.ONE_PIECE) { + if (sub === "dress" && defaults.dresses) return defaults.dresses; + return defaults.dresses ?? defaults.tops ?? defaults.top ?? ""; + } if (category === Category.BOTTOM) { if (sub === "jeans" && defaults.jeans) return defaults.jeans; - const parts = [defaults.bottomWaist, defaults.bottomLength].filter(Boolean); + if (sub === "skirt" && defaults.skirts) return defaults.skirts; + const parts = [ + defaults.bottoms ?? defaults.bottomsWaist ?? defaults.bottomWaist, + defaults.bottomsLength ?? defaults.bottomLength, + ].filter(Boolean); return parts.join(" / "); } if (category === Category.TOP) { if (sub === "hoodie" || sub === "sweatshirt") return defaults.hoodie ?? defaults.top ?? ""; if (sub === "shirt" || sub === "polo") return defaults.formalShirt ?? defaults.top ?? ""; - return defaults.top ?? ""; + return defaults.tops ?? defaults.top ?? ""; } return ""; } diff --git a/src/types/UserProfilePreferences.ts b/src/types/UserProfilePreferences.ts index 14d8c94..0737936 100644 --- a/src/types/UserProfilePreferences.ts +++ b/src/types/UserProfilePreferences.ts @@ -2,8 +2,34 @@ export type LengthUnit = "cm" | "in"; export type WeightUnit = "kg" | "lb"; export type ShoeRegion = "US" | "UK" | "EU"; export type ClothingRegion = "US" | "UK" | "EU" | "INTL"; +export type UnitsPreference = "imperial" | "metric"; +export type WardrobeMode = "masculine" | "feminine" | "neutral" | "mixed" | "custom"; +export type PreferredFit = "slim" | "regular" | "relaxed" | "oversized"; export type UserProfilePreferences = { + onboardingCompleted: boolean; + firstName?: string | null; + region?: string | null; + unitsPreference: UnitsPreference; + wardrobeMode: WardrobeMode; + selectedCategories: string[]; + styleAesthetics: string[]; + preferredFit?: PreferredFit | null; + favoriteColors: string[]; + avoidedColors: string[]; + accessoryPreferences: string[]; + occasionPriority: string[]; + goals: string[]; + height: { + value: number | null; + unit: "cm" | "ft_in"; + }; + weight: { + value: number | null; + unit: "kg" | "lb"; + }; + createdAt?: number | null; + updatedAt?: number | null; units: { length: LengthUnit; weight: WeightUnit; @@ -24,15 +50,30 @@ export type UserProfilePreferences = { footLength?: number | null; }; defaultSizes: { + tops?: string | null; top?: string | null; outerwear?: string | null; hoodie?: string | null; formalShirt?: string | null; + bottoms?: string | null; bottomWaist?: string | null; + bottomsLength?: string | null; bottomLength?: string | null; jeans?: string | null; + dresses?: string | null; + skirts?: string | null; + bottomsWaist?: string | null; shoes?: string | null; }; + advancedFit: { + bust?: string | null; + waistMeasurement?: string | null; + hips?: string | null; + inseam?: string | null; + shoulderWidth?: string | null; + sleeveLength?: string | null; + braSize?: string | null; + }; fitPreferences: { tops?: "slim" | "regular" | "relaxed" | "oversized" | null; outerwear?: "slim" | "regular" | "roomy" | null; From a942c83d320833f168d98991b0aec36685938aa3 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:36 -0500 Subject: [PATCH 04/93] feat(personalization): adapt home, closet, and aura to style profile --- app/(tabs)/closet.tsx | 84 ++++++- app/(tabs)/index.tsx | 205 +++++++++++++++-- functions/src/shared/buildAuraContext.ts | 16 ++ functions/src/shared/loadAuraUserProfile.ts | 47 ++++ src/lib/styleProfile.ts | 243 ++++++++++++++++++++ 5 files changed, 566 insertions(+), 29 deletions(-) create mode 100644 src/lib/styleProfile.ts diff --git a/app/(tabs)/closet.tsx b/app/(tabs)/closet.tsx index a0264f8..c18a4c1 100644 --- a/app/(tabs)/closet.tsx +++ b/app/(tabs)/closet.tsx @@ -24,32 +24,43 @@ import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; import { type CanonicalCategory, type ClosetItem, - type ClothingStatus, listenToItems, toCanonicalCategory, } from "@/src/lib/items"; +import { getStyleProfileConfig } from "@/src/lib/styleProfile"; +import { loadUserProfilePreferences } from "@/src/lib/userProfile"; import { sanitizeDisplayText } from "@/src/lib/text"; +import type { ClothingStatus } from "@/src/types/ClothingItem"; +import type { UserProfilePreferences } from "@/src/types/UserProfilePreferences"; type SortMode = "RECENTLY_ADDED" | "RECENTLY_WORN" | "BRAND" | "MOST_WORN"; type CategoryKey = CanonicalCategory; -const CATEGORY_ORDER: CategoryKey[] = ["top", "outerwear", "bottom", "shoes", "accessory"]; const CATEGORY_LABELS: Record = { top: "Tops", + one_piece: "One-pieces", outerwear: "Outerwear", bottom: "Bottoms", shoes: "Footwear", accessory: "Accessories", }; -const SUBCATEGORY_GROUPS: Record> = { +const SUBCATEGORY_GROUPS: Record = { top: [ { label: "T-shirts", matches: ["t-shirt", "tshirt", "tee"] }, { label: "Shirts", matches: ["shirt", "dress shirt"] }, + { label: "Blouses", matches: ["blouse"] }, + { label: "Crop tops", matches: ["crop_top", "crop top"] }, { label: "Polos", matches: ["polo"] }, + { label: "Tanks", matches: ["tank"] }, { label: "Sweaters", matches: ["sweater", "knit", "jumper"] }, { label: "Hoodies", matches: ["hoodie", "sweatshirt"] }, ], + one_piece: [ + { label: "Dresses", matches: ["dress"] }, + { label: "Jumpsuits & rompers", matches: ["jumpsuit", "romper"] }, + { label: "Matching sets", matches: ["set", "matching_set"] }, + ], outerwear: [ { label: "Jackets", matches: ["jacket"] }, { label: "Coats", matches: ["coat", "parka", "trench"] }, @@ -61,32 +72,35 @@ const SUBCATEGORY_GROUPS: Record = [ +const SORT_OPTIONS: { key: SortMode; label: string }[] = [ { key: "RECENTLY_ADDED", label: "Recently added" }, { key: "RECENTLY_WORN", label: "Recently worn" }, { key: "BRAND", label: "Brand" }, { key: "MOST_WORN", label: "Most worn" }, ]; -const STATUS_OPTIONS: Array<{ key: "ALL" | ClothingStatus; label: string }> = [ +const STATUS_OPTIONS: { key: "ALL" | ClothingStatus; label: string }[] = [ { key: "ALL", label: "All" }, { key: "AVAILABLE", label: "Available" }, { key: "WORN", label: "Worn" }, @@ -156,8 +170,12 @@ function sortItems(items: ClosetItem[], sortMode: SortMode) { return next; } -function buildSections(items: ClosetItem[]) { - return CATEGORY_ORDER.map((category) => { +function buildSections( + items: ClosetItem[], + categoryOrder: CategoryKey[], + emphasizedSubcategories: string[], +) { + return categoryOrder.map((category) => { const inCategory = items.filter((item) => toCanonicalCategory(item.category) === category); const buckets = new Map(); inCategory.forEach((item) => { @@ -169,6 +187,14 @@ function buildSections(items: ClosetItem[]) { const subcategories = Array.from(buckets.entries()) .map(([label, groupedItems]) => ({ label, items: groupedItems })) .sort((a, b) => { + const aMatches = SUBCATEGORY_GROUPS[category] + .find((option) => option.label === a.label) + ?.matches.some((term) => emphasizedSubcategories.includes(term)); + const bMatches = SUBCATEGORY_GROUPS[category] + .find((option) => option.label === b.label) + ?.matches.some((term) => emphasizedSubcategories.includes(term)); + if (aMatches && !bMatches) return -1; + if (bMatches && !aMatches) return 1; if (a.label === "Other") return 1; if (b.label === "Other") return -1; return a.label.localeCompare(b.label); @@ -188,6 +214,7 @@ export default function ClosetScreen() { const layout = useResponsiveLayout(); const uid = user?.uid ?? null; const [items, setItems] = useState([]); + const [profilePreferences, setProfilePreferences] = useState(null); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [sortMode, setSortMode] = useState("RECENTLY_ADDED"); @@ -198,6 +225,7 @@ export default function ClosetScreen() { const [filtersOpen, setFiltersOpen] = useState(false); const [expandedSections, setExpandedSections] = useState>({ top: true, + one_piece: true, outerwear: true, bottom: true, shoes: true, @@ -213,7 +241,7 @@ export default function ClosetScreen() { useEffect(() => { if (!uid) { setLoading(false); - router.replace("/(auth)/login"); + router.replace("/(auth)/welcome"); return; } setLoading(true); @@ -229,6 +257,35 @@ export default function ClosetScreen() { return () => unsub(); }, [uid]); + useEffect(() => { + let cancelled = false; + if (!uid) { + setProfilePreferences(null); + return () => { + cancelled = true; + }; + } + void loadUserProfilePreferences(uid) + .then((profile) => { + if (!cancelled) setProfilePreferences(profile); + }) + .catch(() => { + if (!cancelled) setProfilePreferences(null); + }); + return () => { + cancelled = true; + }; + }, [uid]); + + const styleProfile = useMemo( + () => getStyleProfileConfig(profilePreferences), + [profilePreferences] + ); + const categoryOrder = useMemo( + () => styleProfile.categoryOrder as CategoryKey[], + [styleProfile.categoryOrder] + ); + const brandOptions = useMemo(() => { const values = Array.from( new Set( @@ -269,7 +326,10 @@ export default function ClosetScreen() { ); }, [brandFilter, categoryFilter, colorFilter, items, search, sortMode, statusFilter]); - const sections = useMemo(() => buildSections(filteredItems), [filteredItems]); + const sections = useMemo( + () => buildSections(filteredItems, categoryOrder, styleProfile.emphasizedSubcategories), + [categoryOrder, filteredItems, styleProfile.emphasizedSubcategories] + ); const visibleCount = filteredItems.length; return ( @@ -369,7 +429,7 @@ export default function ClosetScreen() { colorFilter={colorFilter} sortOptions={SORT_OPTIONS} statusOptions={STATUS_OPTIONS} - categoryOptions={[{ key: "ALL", label: "All categories" }, ...CATEGORY_ORDER.map((key) => ({ key, label: CATEGORY_LABELS[key] }))]} + categoryOptions={[{ key: "ALL", label: "All categories" }, ...categoryOrder.map((key) => ({ key, label: CATEGORY_LABELS[key] }))]} brandOptions={brandOptions} colorOptions={colorOptions} onChangeSort={setSortMode} diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index b9eac39..13295a2 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -27,8 +27,11 @@ import { buildVisiblePreferenceHint, loadAssistantProfile } from "@/src/lib/assi import { loadChatMessages, loadLatestChatThread, type AIChatThread } from "@/src/lib/aiChats"; import { auraLookToPlannedOutfit, loadLatestSavedAuraLook, saveAuraLook } from "@/src/lib/auraLooks"; import { listenToItems } from "@/src/lib/items"; +import { getStyleProfileConfig } from "@/src/lib/styleProfile"; +import { loadUserProfilePreferences } from "@/src/lib/userProfile"; import type { ClothingItem } from "@/src/types/ClothingItem"; import type { AuraLookAction, AuraResponse } from "@/src/types/aura"; +import type { UserProfilePreferences } from "@/src/types/UserProfilePreferences"; import { savePlannedRecord, subscribeOutfitByDate, type DailyOutfitRecord } from "@/src/utils/dailyOutfits"; function toMillis(value: unknown): number { @@ -90,10 +93,11 @@ export default function HomeScreen() { const [latestChatThread, setLatestChatThread] = useState(null); const [latestAuraLookResponse, setLatestAuraLookResponse] = useState(null); const [latestSavedLook, setLatestSavedLook] = useState(null); + const [profilePreferences, setProfilePreferences] = useState(null); useEffect(() => { if (!uid) { - router.replace("/(auth)/login"); + router.replace("/(auth)/welcome"); return; } @@ -143,15 +147,17 @@ export default function HomeScreen() { return; } try { - const [profile, latestChat, savedLook] = await Promise.all([ + const [assistantProfile, latestChat, savedLook, userProfilePreferences] = await Promise.all([ loadAssistantProfile(uid), loadLatestChatThread(uid), loadLatestSavedAuraLook(uid), + loadUserProfilePreferences(uid), ]); if (!active) return; - setAssistantHint(buildVisiblePreferenceHint(profile)); + setAssistantHint(buildVisiblePreferenceHint(assistantProfile)); setLatestChatThread(latestChat); setLatestSavedLook(savedLook); + setProfilePreferences(userProfilePreferences); if (latestChat?.chatId) { const chatMessages = await loadChatMessages(uid, latestChat.chatId); if (!active) return; @@ -168,6 +174,7 @@ export default function HomeScreen() { setLatestChatThread(null); setLatestAuraLookResponse(null); setLatestSavedLook(null); + setProfilePreferences(null); } })(); return () => { @@ -177,8 +184,17 @@ export default function HomeScreen() { ); const itemsById = useMemo(() => new Map(items.map((item) => [item.id, item])), [items]); + const styleProfile = useMemo( + () => getStyleProfileConfig(profilePreferences), + [profilePreferences] + ); - const displayName = (user?.displayName ?? user?.email?.split("@")[0] ?? "there").trim(); + const displayName = ( + profilePreferences?.firstName ?? + user?.displayName ?? + user?.email?.split("@")[0] ?? + "there" + ).trim(); const headerGreeting = `${greeting}, ${displayName}`; const weatherLabel = useMemo(() => { @@ -203,7 +219,8 @@ export default function HomeScreen() { const unwornCount = useMemo( () => items.filter((item) => { - const wearCount = typeof item.wearCount === "number" ? item.wearCount : 0; + const wearCount = + typeof item.wearCountSinceWash === "number" ? item.wearCountSinceWash : 0; return item.status === "AVAILABLE" && wearCount === 0; }).length, [items] @@ -213,8 +230,16 @@ export default function HomeScreen() { () => [...items] .sort((a, b) => { - const aMs = Math.max(toMillis(a.updatedAt), toMillis(a.createdAt)); - const bMs = Math.max(toMillis(b.updatedAt), toMillis(b.createdAt)); + const aMs = Math.max( + toMillis(a.createdAt), + toMillis(a.cleanedUpdatedAt), + toMillis(a.colorUpdatedAt) + ); + const bMs = Math.max( + toMillis(b.createdAt), + toMillis(b.cleanedUpdatedAt), + toMillis(b.colorUpdatedAt) + ); return bMs - aMs; }) .slice(0, 8), @@ -224,6 +249,16 @@ export default function HomeScreen() { const hasMinimalWardrobe = availableCount < 4; const latestLook = latestAuraLookResponse?.look ?? latestSavedLook?.look ?? null; const proactiveLookMeta = useMemo(() => { + const leansDressy = styleProfile.recommendationEmphasis.some((value) => + ["date_night", "going_out", "dress_styling"].includes(value) + ); + const leansCasual = styleProfile.recommendationEmphasis.some((value) => + ["casual_everyday", "streetwear", "weekend"].includes(value) + ); + const leansTailored = styleProfile.recommendationEmphasis.some((value) => + ["smart_casual", "office", "formal"].includes(value) + ); + if (latestAuraLookResponse?.look) { return { eyebrow: latestAuraLookResponse.look.addToComplete.length ? "COMPLETE THE LOOK" : "BUILT FROM YOUR WARDROBE", @@ -282,6 +317,33 @@ export default function HomeScreen() { secondaryPrompt: "What should I buy first to unlock stronger outfits?", }; } + if (leansDressy) { + return { + eyebrow: "GOOD FOR TONIGHT", + fallbackTitle: "A polished night direction", + fallbackBody: "AURA can build around the dressier side of your wardrobe and still keep it closet-first.", + primaryPrompt: "Plan a date-night or going-out look using the categories I actually wear.", + secondaryPrompt: "Style a sharper evening outfit from my wardrobe.", + }; + } + if (leansTailored) { + return { + eyebrow: "SMARTER EVERYDAY", + fallbackTitle: "Pulled together and sharp", + fallbackBody: "AURA can lean into blazers, trousers, and cleaner layers for a more polished daily direction.", + primaryPrompt: "Build a smart casual or office-ready outfit using the categories I wear most.", + secondaryPrompt: "Show a sharper version that still feels easy.", + }; + } + if (leansCasual) { + return { + eyebrow: "BUILT FOR EVERYDAY", + fallbackTitle: "Easy and lived-in", + fallbackBody: "AURA can lean into your casual rotation and keep it intentional without overcomplicating it.", + primaryPrompt: "Build a casual everyday look using the categories I wear most.", + secondaryPrompt: "Give it a streetwear edge using only my closet.", + }; + } return { eyebrow: "GOOD FOR TONIGHT", fallbackTitle: "A sharper direction", @@ -293,22 +355,131 @@ export default function HomeScreen() { hasMinimalWardrobe, latestAuraLookResponse?.look, latestSavedLook, + styleProfile.recommendationEmphasis, unwornCount, weather.permission, weather.state, weather.tempC, ]); - const starterPrompts = useMemo( - () => [ - { key: "today", label: "Build today’s look", prompt: "Build an outfit for today from my wardrobe." }, - { key: "weather", label: "Dress for weather", prompt: "Build me a weather-aware outfit using what I own." }, - { key: "unworn", label: "Use unworn items", prompt: "Create a look using pieces I have not worn much." }, - { key: "trip", label: "Pack a trip", prompt: "Help me plan a compact travel wardrobe from my closet." }, - { key: "elevate", label: "Dress this up", prompt: "Elevate one of my casual outfits into something sharper." }, - ], - [] - ); + const starterPrompts = useMemo(() => { + const byKey: Record = { + today: { + key: "today", + label: "Style me today", + prompt: "Build an outfit for today from my wardrobe.", + }, + weather: { + key: "weather", + label: "Dress for weather", + prompt: "Build me a weather-aware outfit using what I own.", + }, + unworn: { + key: "unworn", + label: "Use unworn items", + prompt: "Create a look using pieces I have not worn much.", + }, + closet: { + key: "closet", + label: "Use only my closet", + prompt: "Build a strong outfit using only my closet.", + }, + elevate: { + key: "elevate", + label: "Dress this up", + prompt: "Elevate one of my casual outfits into something sharper.", + }, + shopping: { + key: "shopping", + label: "Find key gaps", + prompt: "Review my wardrobe and suggest the smartest missing pieces to buy next.", + }, + packing: { + key: "packing", + label: "Pack a trip", + prompt: "Help me plan a compact travel wardrobe from my closet.", + }, + confidence: { + key: "confidence", + label: "Build confidence", + prompt: "Give me an easy, confidence-boosting outfit from my wardrobe.", + }, + accessories: { + key: "accessories", + label: "Push accessories", + prompt: `Build an outfit that leans into ${styleProfile.emphasizedAccessories.slice(0, 2).join(" and ") || "my accessories"}.`, + }, + date_night: { + key: "date_night", + label: "Date night", + prompt: "Build a date-night look using the categories I actually wear.", + }, + dress_up: { + key: "dress_up", + label: "Going out", + prompt: "Style a more elevated going-out outfit from my wardrobe.", + }, + streetwear: { + key: "streetwear", + label: "More street", + prompt: "Build a streetwear-leaning look using hoodies, sneakers, and other categories I wear most.", + }, + casual: { + key: "casual", + label: "Casual clean", + prompt: "Build an easy casual outfit using the categories I actually wear most.", + }, + office: { + key: "office", + label: "Office ready", + prompt: "Build a smart office-ready outfit using blazers, trousers, and other categories I wear.", + }, + smart_casual: { + key: "smart_casual", + label: "Smart casual", + prompt: "Build a smart casual outfit that feels polished but wearable.", + }, + }; + + const goalOrder = styleProfile.prioritizedGoals.flatMap((goal) => { + if (goal === "shopping_suggestions") return ["shopping", "today"]; + if (goal === "packing_help") return ["packing", "weather"]; + if (goal === "laundry_reminders") return ["closet", "unworn"]; + if (goal === "styling_confidence") return ["confidence", "today"]; + return ["today", "elevate"]; + }); + + const aestheticOrder = profilePreferences?.styleAesthetics.includes("luxury") + ? ["elevate", "shopping"] + : profilePreferences?.styleAesthetics.includes("sporty") + ? ["weather", "closet"] + : profilePreferences?.styleAesthetics.includes("minimal") + ? ["closet", "today"] + : []; + + const orderedKeys = Array.from( + new Set([ + ...styleProfile.starterPromptPresets, + ...goalOrder, + ...aestheticOrder, + "today", + "weather", + "closet", + "elevate", + styleProfile.emphasizedAccessories.length ? "accessories" : "", + "packing", + "shopping", + "unworn", + ].filter(Boolean)) + ).slice(0, 5); + + return orderedKeys.map((key) => byKey[key]).filter(Boolean); + }, [ + profilePreferences?.styleAesthetics, + styleProfile.emphasizedAccessories, + styleProfile.prioritizedGoals, + styleProfile.starterPromptPresets, + ]); const openAIWithPrompt = React.useCallback((prompt?: string) => { if (prompt) { diff --git a/functions/src/shared/buildAuraContext.ts b/functions/src/shared/buildAuraContext.ts index 110509e..53dbfe4 100644 --- a/functions/src/shared/buildAuraContext.ts +++ b/functions/src/shared/buildAuraContext.ts @@ -12,6 +12,12 @@ type WardrobeItem = { status?: string; inLaundry?: boolean; isDraft?: boolean; + photoUrl?: string | null; + images?: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary?: boolean; + }[] | null; }; type AuraContextArgs = { @@ -177,6 +183,16 @@ export function buildAuraContext({ type: String(item.type ?? "").trim(), color: pickColor(item), status: String(item.status ?? "").trim(), + primaryImageUrl: + String( + item.images?.find((image) => image?.isPrimary)?.cleanedUrl ?? + item.images?.find((image) => image?.isPrimary)?.originalUrl ?? + item.images?.[0]?.cleanedUrl ?? + item.images?.[0]?.originalUrl ?? + item.photoUrl ?? + "", + ).trim(), + imageCount: String(Array.isArray(item.images) ? item.images.length : 0), }; if (item.isDraft) { diff --git a/functions/src/shared/loadAuraUserProfile.ts b/functions/src/shared/loadAuraUserProfile.ts index 5978d5c..39fb215 100644 --- a/functions/src/shared/loadAuraUserProfile.ts +++ b/functions/src/shared/loadAuraUserProfile.ts @@ -7,10 +7,57 @@ function cleanString(value: unknown) { return text || null; } +function cleanStringList(value: unknown) { + if (!Array.isArray(value)) return []; + return value + .map((entry) => cleanString(entry)) + .filter(Boolean) as string[]; +} + +function cleanWardrobeMode(value: unknown) { + const next = String(value ?? "").trim(); + if ( + next === "masculine" || + next === "feminine" || + next === "neutral" || + next === "mixed" || + next === "custom" + ) { + return next; + } + return "mixed"; +} + +function cleanPreferredFit(value: unknown) { + const next = String(value ?? "").trim(); + if ( + next === "slim" || + next === "regular" || + next === "relaxed" || + next === "oversized" + ) { + return next; + } + return null; +} + export async function loadAuraUserProfile(uid: string) { const snap = await db.collection("users").doc(uid).get(); const data = snap.data() ?? {}; + const profilePreferences = + data.profilePreferences && typeof data.profilePreferences === "object" + ? (data.profilePreferences as Record) + : {}; return { name: cleanString(data.name), + firstName: cleanString(profilePreferences.firstName), + region: cleanString(profilePreferences.region), + wardrobeMode: cleanWardrobeMode(profilePreferences.wardrobeMode), + selectedCategories: cleanStringList(profilePreferences.selectedCategories), + styleAesthetics: cleanStringList(profilePreferences.styleAesthetics), + preferredFit: cleanPreferredFit(profilePreferences.preferredFit), + occasionPriority: cleanStringList(profilePreferences.occasionPriority), + accessoryPreferences: cleanStringList(profilePreferences.accessoryPreferences), + goals: cleanStringList(profilePreferences.goals), }; } diff --git a/src/lib/styleProfile.ts b/src/lib/styleProfile.ts new file mode 100644 index 0000000..16ec2d4 --- /dev/null +++ b/src/lib/styleProfile.ts @@ -0,0 +1,243 @@ +import type { UserProfilePreferences, WardrobeMode } from "@/src/types/UserProfilePreferences"; + +export type StyleProfileCategory = + | "top" + | "one_piece" + | "outerwear" + | "bottom" + | "shoes" + | "accessory"; + +export type StyleProfileConfig = { + categoryOrder: StyleProfileCategory[]; + emphasizedSubcategories: string[]; + emphasizedAccessories: string[]; + prioritizedGoals: string[]; + recommendationEmphasis: string[]; + starterPromptPresets: string[]; +}; + +const MASCULINE_ORDER: StyleProfileCategory[] = [ + "top", + "outerwear", + "bottom", + "shoes", + "accessory", + "one_piece", +]; + +const FEMININE_ORDER: StyleProfileCategory[] = [ + "top", + "one_piece", + "outerwear", + "bottom", + "shoes", + "accessory", +]; + +const BALANCED_ORDER: StyleProfileCategory[] = [ + "top", + "one_piece", + "outerwear", + "bottom", + "shoes", + "accessory", +]; + +function unique(values: (string | null | undefined)[]) { + return Array.from( + new Set( + values + .map((value) => String(value ?? "").trim()) + .filter(Boolean), + ), + ); +} + +function modeSubcategories(mode: WardrobeMode) { + if (mode === "masculine") { + return ["shirt", "tshirt", "jacket", "jeans", "sneaker", "watch", "cap"]; + } + if (mode === "feminine") { + return ["dress", "skirt", "blouse", "crop_top", "heel", "handbag", "necklace"]; + } + if (mode === "neutral") { + return ["shirt", "blouse", "trousers", "sneaker", "loafer", "bag"]; + } + return ["shirt", "blouse", "dress", "jeans", "sneaker", "heel", "bag"]; +} + +function modeAccessories(mode: WardrobeMode) { + if (mode === "masculine") return ["watch", "cap", "belt", "sunglasses", "perfume"]; + if (mode === "feminine") return ["handbag", "necklace", "bracelet", "earrings", "sunglasses", "perfume"]; + if (mode === "neutral") return ["bag", "watch", "sunglasses", "scarf", "perfume"]; + return ["watch", "handbag", "necklace", "bracelet", "cap", "sunglasses"]; +} + +function orderForMode(mode: WardrobeMode) { + if (mode === "masculine") return MASCULINE_ORDER; + if (mode === "feminine") return FEMININE_ORDER; + return BALANCED_ORDER; +} + +function categoryBias(selectedCategories: string[]) { + const has = (value: string) => selectedCategories.includes(value); + return { + dresses: has("dresses"), + skirts: has("skirts"), + heels: has("heels"), + tops: selectedCategories.some((value) => + ["tshirts", "shirts", "polos", "blouses", "tanks", "crop_tops", "sweaters", "hoodies"].includes(value) + ), + casual: selectedCategories.some((value) => + ["tshirts", "hoodies", "sneakers", "shorts"].includes(value) + ), + tailoring: selectedCategories.some((value) => + ["shirts", "blazers", "trousers", "loafers"].includes(value) + ), + }; +} + +function orderForSelectedCategories(mode: WardrobeMode, selectedCategories: string[]) { + if (!selectedCategories.length) return orderForMode(mode); + const bias = categoryBias(selectedCategories); + if (bias.dresses || bias.skirts || bias.heels) { + return ["one_piece", "top", "bottom", "outerwear", "shoes", "accessory"] as StyleProfileCategory[]; + } + if (bias.tailoring) { + return ["outerwear", "bottom", "top", "shoes", "accessory", "one_piece"] as StyleProfileCategory[]; + } + if (bias.casual) { + return ["top", "shoes", "outerwear", "bottom", "accessory", "one_piece"] as StyleProfileCategory[]; + } + if (bias.tops) { + return ["top", "outerwear", "bottom", "shoes", "accessory", "one_piece"] as StyleProfileCategory[]; + } + return orderForMode(mode); +} + +function subcategoriesFromSelectedCategories(selectedCategories: string[]) { + return selectedCategories.flatMap((category) => { + switch (category) { + case "tshirts": + return ["tshirt", "tee"]; + case "shirts": + return ["shirt"]; + case "polos": + return ["polo"]; + case "blouses": + return ["blouse"]; + case "tanks": + return ["tank"]; + case "crop_tops": + return ["crop_top"]; + case "sweaters": + return ["sweater"]; + case "hoodies": + return ["hoodie"]; + case "jackets": + return ["jacket"]; + case "coats": + return ["coat"]; + case "blazers": + return ["blazer"]; + case "jeans": + return ["jeans"]; + case "trousers": + return ["trousers"]; + case "shorts": + return ["shorts"]; + case "skirts": + return ["skirt"]; + case "dresses": + return ["dress"]; + case "sneakers": + return ["sneaker"]; + case "loafers": + return ["loafer"]; + case "boots": + return ["boot"]; + case "heels": + return ["heel"]; + case "sandals": + return ["sandal"]; + default: + return []; + } + }); +} + +function accessoriesFromSelectedCategories(selectedCategories: string[]) { + const bias = categoryBias(selectedCategories); + const next: string[] = []; + if (bias.dresses || bias.heels || selectedCategories.includes("skirts")) { + next.push("handbag", "necklace", "bracelet", "earrings"); + } + if (bias.casual) { + next.push("cap", "watch", "sunglasses"); + } + if (bias.tailoring) { + next.push("watch", "belt", "bag", "perfume"); + } + return next; +} + +function recommendationEmphasisFromSelectedCategories(selectedCategories: string[]) { + const bias = categoryBias(selectedCategories); + const next: string[] = []; + if (bias.dresses || bias.heels) next.push("date_night", "going_out", "dress_styling"); + if (bias.casual) next.push("casual_everyday", "streetwear", "weekend"); + if (bias.tailoring) next.push("smart_casual", "office", "formal"); + if (!next.length && selectedCategories.length) next.push("everyday", "closet_first"); + return next; +} + +function starterPromptPresetsFromSelectedCategories(selectedCategories: string[]) { + const emphasis = recommendationEmphasisFromSelectedCategories(selectedCategories); + if (emphasis.includes("date_night")) return ["date_night", "dress_up", "closet", "shopping", "today"]; + if (emphasis.includes("streetwear")) return ["streetwear", "casual", "closet", "weather", "today"]; + if (emphasis.includes("office")) return ["office", "smart_casual", "closet", "elevate", "today"]; + if (!selectedCategories.length) return []; + return ["today", "closet", "weather", "unworn"]; +} + +export function getStyleProfileConfig( + profile: UserProfilePreferences | null | undefined, +): StyleProfileConfig { + const mode = profile?.wardrobeMode ?? "mixed"; + const aesthetics = profile?.styleAesthetics ?? []; + const goals = profile?.goals ?? []; + const accessories = profile?.accessoryPreferences ?? []; + const selectedCategories = profile?.selectedCategories ?? []; + const selectedSubcategories = subcategoriesFromSelectedCategories(selectedCategories); + const selectedAccessories = accessoriesFromSelectedCategories(selectedCategories); + const recommendationEmphasis = recommendationEmphasisFromSelectedCategories(selectedCategories); + + return { + categoryOrder: orderForSelectedCategories(mode, selectedCategories), + emphasizedSubcategories: unique([ + ...modeSubcategories(mode), + ...selectedSubcategories, + ...(aesthetics.includes("luxury") ? ["blazer", "loafer", "heel", "handbag"] : []), + ...(aesthetics.includes("sporty") ? ["hoodie", "joggers", "sneaker", "cap"] : []), + ...(aesthetics.includes("minimal") ? ["shirt", "trousers", "dress", "bag"] : []), + ]), + emphasizedAccessories: unique([ + ...modeAccessories(mode), + ...selectedAccessories, + ...accessories, + ]), + prioritizedGoals: goals, + recommendationEmphasis: unique([ + ...recommendationEmphasis, + ...(goals.includes("shopping_suggestions") ? ["shopping"] : []), + ...(goals.includes("outfit_suggestions") ? ["outfit_first"] : []), + ]), + starterPromptPresets: unique([ + ...starterPromptPresetsFromSelectedCategories(selectedCategories), + ...(goals.includes("packing_help") ? ["packing"] : []), + ...(goals.includes("styling_confidence") ? ["confidence"] : []), + ...(goals.includes("shopping_suggestions") ? ["shopping"] : []), + ]), + }; +} From a063ebb43dcac47d6e86c9547aa1a91b09981429 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:43 -0500 Subject: [PATCH 05/93] feat(wardrobe): expand taxonomy and render support for mixed wardrobes --- functions/src/shared/wardrobeTaxonomy.ts | 10 ++++- src/lib/items.ts | 34 ++++++++++++--- src/lib/renderProfiles.ts | 55 ++++++++++++++++++++++++ src/shared/wardrobeTaxonomy.ts | 10 ++++- src/types/ClothingItem.ts | 18 ++++++++ 5 files changed, 120 insertions(+), 7 deletions(-) diff --git a/functions/src/shared/wardrobeTaxonomy.ts b/functions/src/shared/wardrobeTaxonomy.ts index 7b579e4..6792565 100644 --- a/functions/src/shared/wardrobeTaxonomy.ts +++ b/functions/src/shared/wardrobeTaxonomy.ts @@ -71,6 +71,8 @@ export const SUB_CATEGORIES = { [Category.TOP]: [ "tshirt", "shirt", + "blouse", + "crop_top", "polo", "sweatshirt", "hoodie", @@ -84,6 +86,7 @@ export const SUB_CATEGORIES = { "trousers", "joggers", "shorts", + "skirt", "cargo", "trackpants", ], @@ -92,18 +95,23 @@ export const SUB_CATEGORIES = { "sneaker", "formal_shoe", "boot", + "heel", "slide", "sandal", "loafer", ], - [Category.ONE_PIECE]: ["jumpsuit", "set"], + [Category.ONE_PIECE]: ["dress", "jumpsuit", "romper", "set", "matching_set"], [Category.ACCESSORY]: [ "watch", "sunglasses", "glasses", + "necklace", + "bracelet", + "earrings", "belt", "cap", "bag", + "handbag", "socks", "perfume", ], diff --git a/src/lib/items.ts b/src/lib/items.ts index cee86d5..0532bac 100644 --- a/src/lib/items.ts +++ b/src/lib/items.ts @@ -22,6 +22,7 @@ export type ItemSort = "NEWEST" | "MOST_WORN"; export type StatusFilter = "ALL" | ClothingStatus; export type CanonicalCategory = | "top" + | "one_piece" | "bottom" | "shoes" | "outerwear" @@ -29,6 +30,7 @@ export type CanonicalCategory = export type CategoryFilter = | "ALL" | "TOP" + | "ONE_PIECE" | "BOTTOM" | "SHOES" | "OUTERWEAR" @@ -39,6 +41,7 @@ export type DraftState = "draft" | "photo_uploaded" | "ingesting" | "ready" | "f const CATEGORY_MAP: Record, string[]> = { TOP: ["top"], + ONE_PIECE: ["one_piece"], BOTTOM: ["bottom"], SHOES: ["shoes"], OUTERWEAR: ["outerwear"], @@ -111,6 +114,19 @@ export function isVisibleWardrobeItem( export function toCanonicalCategory(raw?: string | null): CanonicalCategory { const v = norm(raw).replace(/\s+/g, " "); + if ( + [ + "one_piece", + "dress", + "jumpsuit", + "romper", + "set", + "matching_set", + ].includes(v) + ) { + return "one_piece"; + } + if ( [ "top", @@ -120,22 +136,22 @@ export function toCanonicalCategory(raw?: string | null): CanonicalCategory { "tee", "polo", "sweater", - "one_piece", - "jumpsuit", - "set", + "blouse", + "crop_top", + "tank", ].includes(v) ) { return "top"; } if ( - ["bottom", "pants", "trousers", "jeans", "shorts", "joggers"].includes(v) + ["bottom", "pants", "trousers", "jeans", "shorts", "joggers", "skirt"].includes(v) ) { return "bottom"; } if ( - ["shoes", "footwear", "sneakers", "sneaker", "boots", "slides", "sandal", "loafer"].includes( + ["shoes", "footwear", "sneakers", "sneaker", "boots", "slides", "sandal", "loafer", "heel"].includes( v ) ) { @@ -155,6 +171,14 @@ export function toCanonicalCategory(raw?: string | null): CanonicalCategory { "watch", "sunglasses", "belt", + "handbag", + "bag", + "necklace", + "bracelet", + "ring", + "earrings", + "scarf", + "perfume", ].includes(v) ) { return "accessory"; diff --git a/src/lib/renderProfiles.ts b/src/lib/renderProfiles.ts index 2940813..f08d414 100644 --- a/src/lib/renderProfiles.ts +++ b/src/lib/renderProfiles.ts @@ -104,6 +104,26 @@ const PROFILES: Record = { minScale: 0.88, maxScale: 1.12, }, + blouse: { + slotType: "top", + anchor: "top", + defaultScale: 1.03, + defaultTranslateY: 3, + slotFillBias: "balanced", + overlapPriority: 2, + minScale: 0.9, + maxScale: 1.14, + }, + "crop top": { + slotType: "top", + anchor: "top", + defaultScale: 0.96, + defaultTranslateY: 1, + slotFillBias: "tight", + overlapPriority: 2, + minScale: 0.84, + maxScale: 1.08, + }, jeans: { slotType: "bottom", anchor: "waist", @@ -144,6 +164,16 @@ const PROFILES: Record = { minScale: 0.84, maxScale: 1.05, }, + skirt: { + slotType: "bottom", + anchor: "waist", + defaultScale: 0.98, + defaultTranslateY: -2, + slotFillBias: "balanced", + overlapPriority: 1, + minScale: 0.86, + maxScale: 1.08, + }, sneaker: { slotType: "footwear", anchor: "foot", @@ -174,6 +204,16 @@ const PROFILES: Record = { minScale: 0.82, maxScale: 1.04, }, + heel: { + slotType: "footwear", + anchor: "foot", + defaultScale: 0.94, + defaultTranslateY: 1, + slotFillBias: "tight", + overlapPriority: 1, + minScale: 0.8, + maxScale: 1.04, + }, watch: { slotType: "accessory", anchor: "center", @@ -204,6 +244,16 @@ const PROFILES: Record = { minScale: 0.9, maxScale: 1.18, }, + handbag: { + slotType: "accessory", + anchor: "center", + defaultScale: 1.08, + defaultTranslateY: 0, + slotFillBias: "loose", + overlapPriority: 0, + minScale: 0.9, + maxScale: 1.2, + }, perfume: { slotType: "accessory", anchor: "center", @@ -271,6 +321,8 @@ const MATCH_ORDER = [ "shirt", "t-shirt", "tee", + "blouse", + "crop top", "hoodie", "jacket", "coat", @@ -279,11 +331,14 @@ const MATCH_ORDER = [ "pants", "trousers", "shorts", + "skirt", "sneaker", "boot", "loafer", + "heel", "watch", "glasses", + "handbag", "bag", "perfume", "chain", diff --git a/src/shared/wardrobeTaxonomy.ts b/src/shared/wardrobeTaxonomy.ts index 7b579e4..6792565 100644 --- a/src/shared/wardrobeTaxonomy.ts +++ b/src/shared/wardrobeTaxonomy.ts @@ -71,6 +71,8 @@ export const SUB_CATEGORIES = { [Category.TOP]: [ "tshirt", "shirt", + "blouse", + "crop_top", "polo", "sweatshirt", "hoodie", @@ -84,6 +86,7 @@ export const SUB_CATEGORIES = { "trousers", "joggers", "shorts", + "skirt", "cargo", "trackpants", ], @@ -92,18 +95,23 @@ export const SUB_CATEGORIES = { "sneaker", "formal_shoe", "boot", + "heel", "slide", "sandal", "loafer", ], - [Category.ONE_PIECE]: ["jumpsuit", "set"], + [Category.ONE_PIECE]: ["dress", "jumpsuit", "romper", "set", "matching_set"], [Category.ACCESSORY]: [ "watch", "sunglasses", "glasses", + "necklace", + "bracelet", + "earrings", "belt", "cap", "bag", + "handbag", "socks", "perfume", ], diff --git a/src/types/ClothingItem.ts b/src/types/ClothingItem.ts index 020a8c2..0b19ca4 100644 --- a/src/types/ClothingItem.ts +++ b/src/types/ClothingItem.ts @@ -26,6 +26,13 @@ export type ClothingPattern = export type ClothingItem = { id: string; + images?: { + originalUrl: string; + cleanedUrl?: string | null; + isPrimary: boolean; + }[] | null; + originalImageUrl?: string | null; + cleanedImageUrl?: string | null; // core brand: string; @@ -35,6 +42,7 @@ export type ClothingItem = { wearSlot?: "core" | "accessory"; pattern?: ClothingPattern; material?: string; + materialConfidence?: number | null; style?: string | null; formality?: AllowedFormality | null; warmth?: AllowedWarmth | null; @@ -57,6 +65,11 @@ export type ClothingItem = { photos?: { originalUrl?: string | null; primaryUrl?: string | null; + images?: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary?: boolean; + }[] | null; normalizedUrl?: string | null; previewUrl?: string | null; urls?: string[]; @@ -84,7 +97,12 @@ export type ClothingItem = { pixelColors?: string[]; pixelColorHex?: string; colorConfidence?: number; + confidenceSummary?: { + overall: number; + notes: string; + } | null; colorNeedsReview?: boolean; + detailTags?: string[] | null; crop?: { x: number; y: number; w: number; h: number; source: "ai" }; cleanedUpdatedAt?: number; aiDebug?: { From 7386d51aeaf7befd24161a2cd81b9874b720eea3 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:46:50 -0500 Subject: [PATCH 06/93] feat(add-item): support multi-photo ingestion and draft flow improvements --- functions/src/ingestItemFromPhotos.ts | 137 +++++- src/addItem/hooks/useItemDraft.ts | 21 +- src/addItem/hooks/useItemExtraction.ts | 14 +- src/addItem/hooks/usePhotoStep.ts | 628 ++++++++++++++++++------- src/addItem/sections/PhotoStep.tsx | 128 ++++- src/addItem/useAddItemController.ts | 3 + src/lib/uploadImage.ts | 17 +- 7 files changed, 749 insertions(+), 199 deletions(-) diff --git a/functions/src/ingestItemFromPhotos.ts b/functions/src/ingestItemFromPhotos.ts index 286309c..fc6bdd5 100644 --- a/functions/src/ingestItemFromPhotos.ts +++ b/functions/src/ingestItemFromPhotos.ts @@ -26,6 +26,11 @@ if (!getApps().length) { type IngestionStatus = "pending" | "processing" | "done" | "failed"; type ItemDoc = { + images?: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary?: boolean; + }[] | null; brand?: string | null; name?: string | null; brandConfidence?: number; @@ -55,8 +60,14 @@ type ItemDoc = { visualWeight?: string | null; versatilityScore?: number | null; photos?: { + originalUrl?: string | null; primaryUrl?: string | null; urls?: string[]; + images?: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary?: boolean; + }[]; cleanedUrl?: string | null; cleanedPhotoUrl?: string | null; normalizedUrl?: string | null; @@ -64,6 +75,8 @@ type ItemDoc = { thumbUrl?: string; }; photoUrl?: string | null; + originalImageUrl?: string | null; + cleanedImageUrl?: string | null; photoUri?: string | null; colors?: string[]; colorLabel?: string; @@ -123,6 +136,7 @@ type RawExtraction = { displayColors?: string[] | null; pattern?: string; material?: string; + materialConfidence?: number; fit?: | "slim" | "regular" @@ -184,6 +198,12 @@ type RawExtraction = { subCategory?: number; colors?: number; brand?: number; + material?: number; + }; + detailTags?: string[]; + confidenceSummary?: { + overall?: number; + notes?: string; }; formalityScore?: number; warmthScore?: number; @@ -332,9 +352,18 @@ function toMillis(value: LastRunAtValue): number | null { function extractPhotoUrls(item: ItemDoc): string[] { const values = [ + ...(Array.isArray(item.images) + ? item.images.flatMap((image) => [image?.cleanedUrl ?? "", image?.originalUrl ?? ""]) + : []), + ...(Array.isArray(item.photos?.images) + ? item.photos.images.flatMap((image) => [image?.cleanedUrl ?? "", image?.originalUrl ?? ""]) + : []), item.photos?.cleanedUrl ?? "", item.photos?.cleanedPhotoUrl ?? "", + item.photos?.originalUrl ?? "", item.photos?.primaryUrl ?? "", + item.cleanedImageUrl ?? "", + item.originalImageUrl ?? "", item.photoUrl ?? "", item.photoUri ?? "", ...(Array.isArray(item.photos?.urls) ? item.photos!.urls : []), @@ -355,10 +384,19 @@ function getIngestionStatus(item: ItemDoc | undefined): IngestionStatus | "" { function extractIngestionSourceUrls(item: ItemDoc): string[] { const values = [ + ...(Array.isArray(item.images) + ? item.images.flatMap((image) => [image?.cleanedUrl ?? "", image?.originalUrl ?? ""]) + : []), + ...(Array.isArray(item.photos?.images) + ? item.photos.images.flatMap((image) => [image?.cleanedUrl ?? "", image?.originalUrl ?? ""]) + : []), item.photos?.cleanedUrl ?? "", item.photos?.cleanedPhotoUrl ?? "", item.photos?.normalizedUrl ?? "", + item.photos?.originalUrl ?? "", item.photos?.primaryUrl ?? "", + item.cleanedImageUrl ?? "", + item.originalImageUrl ?? "", item.photoUrl ?? "", item.photoUri ?? "", ...(Array.isArray(item.photos?.urls) ? item.photos!.urls : []), @@ -663,6 +701,20 @@ function normalizeDisplayColors(values: unknown): string[] { return out; } +function normalizeDetailTags(values: unknown): string[] { + if (!Array.isArray(values)) return []; + const out: string[] = []; + for (const value of values) { + const normalized = normalizeFreeTextLabel(value, 24) + ?.toLowerCase() + .replace(/\s+/g, "_"); + if (!normalized || out.includes(normalized)) continue; + out.push(normalized); + if (out.length >= 6) break; + } + return out; +} + function toHex(r: number, g: number, b: number): string { const parts = [r, g, b].map((n) => Math.max(0, Math.min(255, Math.round(n)))); return `#${parts @@ -1056,7 +1108,7 @@ function safeJsonExtract(text: string): RawExtraction | null { } } -async function extractWithOpenAI(photoUrl: string): Promise { +async function extractWithOpenAI(photoUrls: string[]): Promise { const apiKey = process.env.OPENAI_API_KEY; if (!apiKey) { throw new Error("OPENAI_API_KEY is not configured"); @@ -1076,9 +1128,9 @@ async function extractWithOpenAI(photoUrl: string): Promise { { role: "system", content: [ - "You are a fashion catalog parser and wardrobe stylist. Analyze one clothing item from the image and output ONLY one JSON object matching the schema. No markdown. No prose. No extra keys.", + "You are a fashion catalog parser and wardrobe stylist. You are given multiple images of the same clothing item. Combine information across all images to determine the most accurate attributes and output ONLY one JSON object matching the schema. No markdown. No prose. No extra keys.", "Be visually grounded. Use only what is visible in the garment image. Prefer null over guessing when uncertain.", - "Schema keys only: category, subCategory, type, name, brand, brandConfidence, colors, primaryColor, displayColor, displayColors, pattern, material, fit, style, sleeveLength, neckline, closure, length, rise, legShape, hasLogo, logoPlacement, formality, warmth, layerRole, aestheticTags, occasionTags, seasonTags, visualWeight, versatilityScore, confidence.", + "Schema keys only: category, subCategory, type, name, brand, brandConfidence, colors, primaryColor, displayColor, displayColors, pattern, material, materialConfidence, fit, style, sleeveLength, neckline, closure, length, rise, legShape, hasLogo, logoPlacement, formality, warmth, layerRole, aestheticTags, occasionTags, seasonTags, visualWeight, versatilityScore, detailTags, confidenceSummary, confidence.", "HARD category disambiguation priority:", "1) If two leg openings, inseam, crotch seam, fly, waistband, belt loops, or drawstring at the waist are visible, category MUST be bottom.", "2) If collar or neckline plus sleeves are visible, category is top unless it is clearly open-front outerwear.", @@ -1125,7 +1177,9 @@ async function extractWithOpenAI(photoUrl: string): Promise { { type: "text", text: [ - "Analyze this garment photo.", + "Analyze these garment photos together as one item.", + "Use all images to improve brand, material, pattern, color, and visible-detail accuracy.", + "If the images conflict, choose the most consistent signal and lower confidence.", "Prefer visible garment type and visible logo/text/tag only.", "Use waistband/fly/two-leg cues to avoid misclassifying pants as tops.", "If uncertain, return null instead of guessing.", @@ -1134,10 +1188,10 @@ async function extractWithOpenAI(photoUrl: string): Promise { "If a piece has multiple visible garment colors, include them and choose the main one as primaryColor.", ].join(" "), }, - { - type: "image_url", + ...photoUrls.map((photoUrl) => ({ + type: "image_url" as const, image_url: { url: photoUrl }, - }, + })), ], }, ], @@ -1152,7 +1206,7 @@ async function extractWithOpenAI(photoUrl: string): Promise { } const data = (await response.json()) as { - choices?: Array<{ message?: { content?: string } }>; + choices?: { message?: { content?: string } }[]; }; const content = data.choices?.[0]?.message?.content ?? ""; @@ -1397,8 +1451,30 @@ export const ingestItemFromPhotos = onDocumentWritten( ); try { - const extracted = await extractWithOpenAI(photoUrls[0]); + const extracted = await extractWithOpenAI(photoUrls); let warning: string | null = null; + const storedImageCandidates: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary?: boolean; + }[] = Array.isArray(after.images) + ? after.images + : Array.isArray(after.photos?.images) + ? after.photos.images + : photoUrls.map((url, index) => ({ + originalUrl: url, + isPrimary: index === 0, + })); + + const storedImages = storedImageCandidates + .map((image) => ({ + originalUrl: String(image?.originalUrl ?? "").trim(), + ...(String(image?.cleanedUrl ?? "").trim() + ? { cleanedUrl: String(image?.cleanedUrl ?? "").trim() } + : {}), + isPrimary: Boolean(image?.isPrimary), + })) + .filter((image) => image.originalUrl); let category = normalizeCategory(extracted.category); let subCategory = normalizeSubCategory(extracted.subCategory); @@ -1438,6 +1514,9 @@ export const ingestItemFromPhotos = onDocumentWritten( const pattern = normalizePattern(extracted.pattern); const material = normalizeMaterial(extracted.material); + const materialConfidence = clamp01( + extracted.materialConfidence ?? extracted.confidence?.material ?? 0, + ); const fit = normalizeEnum(extracted.fit, ALLOWED_FITS); const style = normalizeEnum(extracted.style, ALLOWED_STYLES); const sleeveLength = normalizeEnum( @@ -1543,6 +1622,7 @@ export const ingestItemFromPhotos = onDocumentWritten( extracted.confidence?.subCategory ?? 0, ); const colorsConfidence = clamp01(extracted.confidence?.colors ?? 0); + const detailTags = normalizeDetailTags(extracted.detailTags); const { colors: aiColorsRaw, colorLabel } = normalizeColors( extracted.colors, ); @@ -1665,6 +1745,24 @@ export const ingestItemFromPhotos = onDocumentWritten( ); let formalityScore = constrainedScores.formalityScore; let warmthScore = constrainedScores.warmthScore; + const confidenceOverall = Number( + ( + (categoryConfidence + + subCategoryConfidence + + colorsConfidence + + brandConfidence + + materialConfidence) / + 5 + ).toFixed(3), + ); + const confidenceSummary = { + overall: confidenceOverall, + notes: + normalizeFreeTextLabel(extracted.confidenceSummary?.notes, 180) ?? + (photoUrls.length > 1 + ? "Combined multiple images for a more reliable extraction." + : "Built from a single item image."), + }; if (subCategory === "tshirt") { formalityScore = Math.min(formalityScore, 0.5); @@ -1694,6 +1792,8 @@ export const ingestItemFromPhotos = onDocumentWritten( wearSlot: wearSlot(category), pattern, material, + materialConfidence, + ...(detailTags.length > 0 ? { detailTags } : {}), fit, style, formality, @@ -1716,6 +1816,7 @@ export const ingestItemFromPhotos = onDocumentWritten( photos: { primaryUrl: photoUrls[0], urls: photoUrls, + images: storedImages, croppedUrl, thumbUrl, }, @@ -1724,6 +1825,8 @@ export const ingestItemFromPhotos = onDocumentWritten( finalPrimaryColor, finalDisplayColor, finalDisplayColors, + detailTags, + confidenceSummary, generatedName: inferredName, colorSource: hasUserColorOverride ? "user" : "ai", formalityScore, @@ -1754,6 +1857,7 @@ export const ingestItemFromPhotos = onDocumentWritten( subCategory, type: itemType, colors: finalColors, + detailTags, brand: hasUserBrandOverride || shouldPreserveLegacyManualBrand ? (after.brand ?? null) @@ -1780,6 +1884,17 @@ export const ingestItemFromPhotos = onDocumentWritten( await ref.set( { cleanedFromHash: currentSourceHash, + originalImageUrl: + storedImages.find((image) => image.isPrimary)?.originalUrl ?? + storedImages[0]?.originalUrl ?? + after.originalImageUrl ?? + photoUrls[0], + cleanedImageUrl: + storedImages.find((image) => image.isPrimary)?.cleanedUrl ?? + storedImages[0]?.cleanedUrl ?? + after.cleanedImageUrl ?? + null, + images: storedImages, ...(after.isDraft === true ? { draftState: "photo_uploaded" } : {}), ...(!String(after.name ?? "").trim() && inferredName ? { name: inferredName } @@ -1790,6 +1905,9 @@ export const ingestItemFromPhotos = onDocumentWritten( wearSlot: wearSlot(category), pattern, material, + materialConfidence, + ...(detailTags.length > 0 ? { detailTags } : {}), + confidenceSummary, fit, style, ...(formality ? { formality } : {}), @@ -1864,6 +1982,7 @@ export const ingestItemFromPhotos = onDocumentWritten( photos: { primaryUrl: photoUrls[0], urls: photoUrls, + images: storedImages, croppedUrl, thumbUrl, }, diff --git a/src/addItem/hooks/useItemDraft.ts b/src/addItem/hooks/useItemDraft.ts index bee5520..b1e4080 100644 --- a/src/addItem/hooks/useItemDraft.ts +++ b/src/addItem/hooks/useItemDraft.ts @@ -357,10 +357,11 @@ export function useItemDraft({ extractionIngestionStatus !== "done"; const b = cleanBrandInput(brand); const n = norm(name); - const hasAtLeastOnePhoto = !!( - photo.state.pendingPhotoUri || - photo.state.photoUrl || - photo.state.photoUri + const hasAtLeastOnePhoto = !!( + (photo.state.selectedPhotos?.length ?? 0) > 0 || + photo.state.pendingPhotoUri || + photo.state.photoUrl || + photo.state.photoUri ); try { @@ -429,13 +430,17 @@ export function useItemDraft({ ...payloadBase, photoUrl: nextPhoto.photoUrl, photoUri: nextPhoto.photoUri, + originalImageUrl: nextPhoto.originalUrl ?? nextPhoto.photoUrl, + cleanedImageUrl: nextPhoto.cleanedUrl, + images: nextPhoto.images, }; if (isEdit) { const updatePayload: Record = { ...payload, "photos.originalUrl": nextPhoto.originalUrl ?? nextPhoto.photoUrl, "photos.primaryUrl": nextPhoto.photoUrl, - "photos.urls": nextPhoto.photoUrl ? [nextPhoto.photoUrl] : [], + "photos.urls": nextPhoto.imageUrls, + "photos.images": nextPhoto.images, draftState: "ready", ...(photo.state.pendingPhotoUri && canKickoffIngestion ? { @@ -467,7 +472,8 @@ export function useItemDraft({ ...payload, "photos.originalUrl": nextPhoto.originalUrl ?? nextPhoto.photoUrl, "photos.primaryUrl": nextPhoto.photoUrl, - "photos.urls": nextPhoto.photoUrl ? [nextPhoto.photoUrl] : [], + "photos.urls": nextPhoto.imageUrls, + "photos.images": nextPhoto.images, isDraft: false, draftState: "ready", updatedAt: Date.now(), @@ -516,7 +522,8 @@ export function useItemDraft({ photos: { originalUrl: nextPhoto.originalUrl ?? nextPhoto.photoUrl, primaryUrl: nextPhoto.photoUrl, - urls: nextPhoto.photoUrl ? [nextPhoto.photoUrl] : [], + urls: nextPhoto.imageUrls, + images: nextPhoto.images, ...(nextPhoto.cleanedUrl ? { cleanedUrl: nextPhoto.cleanedUrl, diff --git a/src/addItem/hooks/useItemExtraction.ts b/src/addItem/hooks/useItemExtraction.ts index 34fd4f8..4172313 100644 --- a/src/addItem/hooks/useItemExtraction.ts +++ b/src/addItem/hooks/useItemExtraction.ts @@ -705,7 +705,6 @@ export function useItemExtraction({ } } const summaryCategory = norm(locked.category ?? finalCategoryCandidate ?? data?.category); - const summaryColors: string[] = locked.colors && locked.colors.length ? locked.colors : finalColors; const rawSummaryName = norm(data?.name); const displayColorForName = norm(String(data?.displayColor ?? "")) || @@ -738,7 +737,7 @@ export function useItemExtraction({ if (summaryParts.length) { const summary = `AI found: ${summaryParts.join(" • ")}`; setLastAutofillSummary(summary); - if (effectiveStatus === "pending" || effectiveStatus === "processing") { + if (normalizedStatus === "pending" || normalizedStatus === "processing") { setAutofillStatusThrottled(summary); } else if (effectiveStatus === "done") { const doneBits = [summaryCategory].filter(Boolean).join(" • "); @@ -753,7 +752,7 @@ export function useItemExtraction({ } } } - if (!isPlaceholderDraftCategory || normalizedStatus === "done") { + if (!isPlaceholderDraftCategory || effectiveStatus === "done") { aiCommittedRef.current = { source: incomingSource, category: finalCategoryCandidate, @@ -844,7 +843,6 @@ export function useItemExtraction({ if (!uid || isEdit) return; const runId = params.runId ?? aiRunIdRef.current; if (runId !== aiRunIdRef.current) return; - let failingStep = "upload"; try { const { photoHash, @@ -924,10 +922,12 @@ export function useItemExtraction({ const now = Date.now(); const nextCleanedPhotoUrl = uploaded.cleanedUrl; const nextNormalizedPhotoUrl = uploaded.normalizedUrl; - failingStep = "create"; const draftPayload = { photoUrl: uploaded.primaryUrl, photoUri: null, + originalImageUrl: uploaded.originalUrl, + cleanedImageUrl: uploaded.cleanedUrl, + images: uploaded.images, createdAt: now, updatedAt: now, status: "AVAILABLE", @@ -953,7 +953,8 @@ export function useItemExtraction({ photos: { originalUrl: uploaded.originalUrl, primaryUrl: uploaded.primaryUrl, - urls: [uploaded.primaryUrl], + urls: uploaded.imageUrls, + images: uploaded.images, ...(nextCleanedPhotoUrl ? { cleanedUrl: nextCleanedPhotoUrl, @@ -989,6 +990,7 @@ export function useItemExtraction({ photo.actions.setServerCleanedUrl(nextCleanedPhotoUrl); photo.actions.setPendingNormalizedPreviewUri?.(nextNormalizedPhotoUrl ?? null); photo.actions.setUploadedPhotoRecord?.({ + imageId: "primary", itemId: draftRef.id, photoHash, originalUrl: uploaded.originalUrl, diff --git a/src/addItem/hooks/usePhotoStep.ts b/src/addItem/hooks/usePhotoStep.ts index 3b5a934..237c0b9 100644 --- a/src/addItem/hooks/usePhotoStep.ts +++ b/src/addItem/hooks/usePhotoStep.ts @@ -25,6 +25,7 @@ import { uploadItemPhoto } from "../../lib/uploadImage"; import { analyzeCutoutVisualNormalization, type VisualNormalization } from "../../lib/visualNormalization"; type UploadedPhotoRecord = { + imageId: string; itemId: string; photoHash: string; originalUrl: string; @@ -35,10 +36,66 @@ type UploadedPhotoRecord = { visualNormalization?: VisualNormalization | null; }; +type SelectedPhotoEntry = { + id: string; + source: "camera" | "library"; + localUri: string; + originalUri: string; + photoHash: string; + originalWidth: number | null; + originalHeight: number | null; + cleanedLocalUri: string | null; + normalizedLocalUri: string | null; + hasTransparency: boolean; + transparentPixelRatio: number; + maskUri: string | null; + visualNormalization: VisualNormalization | null; + uploaded?: UploadedPhotoRecord | null; +}; + +type ResolvedPhotoFields = { + originalUrl: string | null; + photoUrl: string | null; + photoUri: string | null; + cleanedPhotoUrl: string | null; + cleanedUrl: string | null; + normalizedUrl: string | null; + visualNormalization: VisualNormalization | null; + imageUrls: string[]; + cleanedImageUrls: string[]; + images: { + originalUrl: string; + cleanedUrl?: string | null; + isPrimary: boolean; + }[]; +}; + const MIN_USABLE_CUTOUT_TRANSPARENCY = 0.05; const TRIM_GUARD_PIXELS = 2; const NORMALIZED_CANVAS_PADDING_RATIO = 0.14; +function makeSelectedPhotoId() { + return randomId(); +} + +function sanitizePhotoImageRecord(input: { + originalUrl?: string | null; + cleanedUrl?: string | null; + isPrimary: boolean; +}) { + const originalUrl = String(input.originalUrl ?? "").trim(); + const cleanedUrl = String(input.cleanedUrl ?? "").trim(); + return { + originalUrl, + ...(cleanedUrl ? { cleanedUrl } : {}), + isPrimary: input.isPrimary, + }; +} + +function randomId() { + return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`; +} + export function usePhotoStep({ uid, isEdit, @@ -85,6 +142,8 @@ export function usePhotoStep({ const [pendingVisualNormalization, setPendingVisualNormalization] = useState( null ); + const [selectedPhotos, setSelectedPhotos] = useState([]); + const [primaryPhotoId, setPrimaryPhotoId] = useState(null); const lastCompletedRefineKeyRef = useRef(""); const latestRefineRequestIdRef = useRef(0); @@ -191,6 +250,55 @@ export function usePhotoStep({ } }, []); + const syncLegacyStateFromPrimary = useCallback((entry: SelectedPhotoEntry | null) => { + if (!entry) { + setPendingPhotoHash(null); + setOriginalPickedPhotoUri(null); + setPendingPhotoUri(null); + commitPendingCutoutState("sync-primary-clear", { + cutoutUri: null, + previewUri: null, + maskUri: null, + hasTransparency: false, + transparentPixelRatio: 0, + updateAutofillCutout: true, + }); + setPendingPhotoWidth(null); + setPendingVisualNormalization(null); + setUploadedPhotoRecord(null); + setPhotoUrl(null); + setCleanedPhotoUrl(null); + setServerCleanedUrl(null); + return; + } + + setPendingPhotoHash(entry.photoHash); + setOriginalPickedPhotoUri(entry.localUri); + setPendingPhotoUri(entry.localUri); + commitPendingCutoutState("sync-primary", { + cutoutUri: entry.cleanedLocalUri, + previewUri: entry.normalizedLocalUri, + maskUri: entry.maskUri, + hasTransparency: entry.hasTransparency, + transparentPixelRatio: entry.transparentPixelRatio, + updateAutofillCutout: true, + }); + setPendingPhotoWidth(entry.originalWidth); + setPendingVisualNormalization(entry.visualNormalization); + setUploadedPhotoRecord(entry.uploaded ?? null); + setPhotoUrl(entry.uploaded?.primaryUrl ?? null); + setCleanedPhotoUrl(entry.uploaded?.cleanedUrl ?? null); + setServerCleanedUrl(entry.uploaded?.cleanedUrl ?? null); + }, [commitPendingCutoutState]); + + useEffect(() => { + const primary = + selectedPhotos.find((entry) => entry.id === primaryPhotoId) ?? + selectedPhotos[0] ?? + null; + syncLegacyStateFromPrimary(primary); + }, [primaryPhotoId, selectedPhotos, syncLegacyStateFromPrimary]); + const estimateFileSizeBytes = useCallback(async (uri: string) => { try { const info = await FileSystem.getInfoAsync(uri); @@ -460,6 +568,7 @@ export function usePhotoStep({ cleanupRadius: number; feather: number; edgeTighten: number; + edgePolish: number; maskToAlpha: boolean; } ) => { @@ -648,56 +757,14 @@ export function usePhotoStep({ [currentDebugRefineOptions, refineValue, scheduleRefine] ); - const pickPhoto = useCallback(async (source: "library" | "camera") => { - try { - const perm = - source === "camera" - ? await ImagePicker.requestCameraPermissionsAsync() - : await ImagePicker.requestMediaLibraryPermissionsAsync(); - if (!perm.granted) { - Alert.alert( - "Permission needed", - source === "camera" - ? "Allow camera access to capture an item photo." - : "Allow photo access to pick an item photo." - ); - return; - } - - const res = - source === "camera" - ? await ImagePicker.launchCameraAsync({ - mediaTypes: ["images"], - quality: 1, - allowsEditing: true, - aspect: [1, 1], - }) - : await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ["images"], - quality: 1, - allowsEditing: true, - aspect: [1, 1], - }); - if (res.canceled || !res.assets[0]) return; - - const asset = res.assets[0]; - const nextPhotoHash = buildPhotoHash(asset); - setPendingPhotoHash(nextPhotoHash); - setUploadError(null); - - const extraction = extractionRef.current; - if (!isEdit && extraction?.state?.draftPhotoHash === nextPhotoHash && extraction?.state?.draftItemId) { - return; - } - - const previousDraftId = !isEdit ? extraction?.state?.draftItemId ?? null : null; - - const previousSelectionId = latestPhotoSelectionIdRef.current + 1; - latestPhotoSelectionIdRef.current = previousSelectionId; - extraction?.actions?.prepareForNewPhoto?.(); - setUploadedPhotoRecord(null); - + const processPickedAsset = useCallback( + async ( + asset: ImagePicker.ImagePickerAsset, + source: "library" | "camera", + selectionId: number + ): Promise => { const originalUri = asset.uri; + const nextPhotoHash = buildPhotoHash(asset); const normalized = await normalizeImageForCutout({ uri: originalUri, width: asset.width, @@ -706,13 +773,7 @@ export function usePhotoStep({ const normalizedUri = normalized.uri || originalUri; const effectiveWidth = normalized.width ?? asset.width ?? null; const effectiveHeight = normalized.height ?? asset.height ?? null; - setOriginalPickedPhotoUri(normalizedUri); - setPendingPhotoUri(normalizedUri); - clearPendingCutoutState("pick-start"); const initialOptions = getRefineOptions(DEFAULT_REFINE_VALUE); - setDetectedBrand(null); - setDetectedBrandConfidence(null); - setBgRemovalError(null); const brandPromise = detectBrandLogo(originalUri).catch(() => null); let cutoutUri: string | null = null; @@ -730,6 +791,7 @@ export function usePhotoStep({ | null = null; let cutoutWidth: number | null = null; let cutoutHeight: number | null = null; + try { const cutout = await runBackgroundRemoval({ inputUri: normalizedUri, @@ -760,31 +822,125 @@ export function usePhotoStep({ cutoutHasTransparency = false; cutoutTransparencyRatio = 0; cutoutMaskUri = null; - setBgRemovalError("BG removal failed"); } } catch { - setBgRemovalError("BG removal failed"); cutoutUri = null; + previewCutoutUri = null; cutoutHasTransparency = false; cutoutTransparencyRatio = 0; cutoutMaskUri = null; } - if (previousSelectionId !== latestPhotoSelectionIdRef.current) { - return; + + if (selectionId !== latestPhotoSelectionIdRef.current) { + throw new Error("Photo selection superseded."); } - const finalDisplayUri = cutoutUri || normalizedUri; - void finalDisplayUri; - void shortenUri; + const visualNormalization = cutoutUri && cutoutContentBounds && cutoutWidth && cutoutHeight - ? await analyzeCutoutVisualNormalization({ - contentBounds: cutoutContentBounds, - imageWidth: cutoutWidth, - imageHeight: cutoutHeight, - }) - : null; + ? await analyzeCutoutVisualNormalization({ + contentBounds: cutoutContentBounds, + imageWidth: cutoutWidth, + imageHeight: cutoutHeight, + }) + : null; + + const brandResult = await brandPromise; + if (selectionId !== latestPhotoSelectionIdRef.current) { + throw new Error("Photo selection superseded."); + } + + if (brandResult?.brand) { + setDetectedBrand(brandResult.brand); + setDetectedBrandConfidence( + typeof brandResult.confidence === "number" ? brandResult.confidence : null + ); + } + + return { + id: makeSelectedPhotoId(), + source, + localUri: normalizedUri, + originalUri, + photoHash: nextPhotoHash, + originalWidth: effectiveWidth, + originalHeight: effectiveHeight, + cleanedLocalUri: cutoutUri, + normalizedLocalUri: previewCutoutUri, + hasTransparency: cutoutHasTransparency, + transparentPixelRatio: cutoutTransparencyRatio, + maskUri: cutoutMaskUri, + visualNormalization, + uploaded: null, + }; + }, + [buildNormalizedPreviewCutout, normalizeImageForCutout, runBackgroundRemoval] + ); + + const pickPhoto = useCallback(async (source: "library" | "camera") => { + try { + const perm = + source === "camera" + ? await ImagePicker.requestCameraPermissionsAsync() + : await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (!perm.granted) { + Alert.alert( + "Permission needed", + source === "camera" + ? "Allow camera access to capture an item photo." + : "Allow photo access to pick an item photo." + ); + return; + } + + const res = + source === "camera" + ? await ImagePicker.launchCameraAsync({ + mediaTypes: ["images"], + quality: 1, + }) + : await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ["images"], + quality: 1, + allowsMultipleSelection: true, + selectionLimit: 8, + }); + if (res.canceled || !res.assets.length) return; + + setUploadError(null); + + const extraction = extractionRef.current; + const previousDraftId = !isEdit ? extraction?.state?.draftItemId ?? null : null; + const previousSelectionId = latestPhotoSelectionIdRef.current + 1; + latestPhotoSelectionIdRef.current = previousSelectionId; + extraction?.actions?.prepareForNewPhoto?.(); + setDetectedBrand(null); + setDetectedBrandConfidence(null); + setBgRemovalError(null); + setUploadedPhotoRecord(null); + clearPendingCutoutState("pick-start"); + void shortenUri; + + const nextEntries: SelectedPhotoEntry[] = []; + for (const asset of res.assets) { + const entry = await processPickedAsset(asset, source, previousSelectionId); + if ( + !isEdit && + extraction?.state?.draftPhotoHash === entry.photoHash && + extraction?.state?.draftItemId + ) { + continue; + } + nextEntries.push(entry); + } + if (previousSelectionId !== latestPhotoSelectionIdRef.current) { + return; + } + if (!nextEntries.length) { + return; + } + lastCompletedRefineKeyRef.current = getRefineRequestKey( - normalizedUri, + nextEntries[0].localUri, DEFAULT_REFINE_VALUE ); latestRefineRequestIdRef.current = 0; @@ -795,30 +951,14 @@ export function usePhotoStep({ setDebugCleanupRadius(resetOptions.cleanupRadius); setDebugFeather(resetOptions.feather); setDebugEdgeTighten(resetOptions.edgeTighten); - setPendingPhotoUri(normalizedUri); - commitPendingCutoutState("pick", { - cutoutUri, - previewUri: previewCutoutUri, - maskUri: cutoutMaskUri, - hasTransparency: cutoutHasTransparency, - transparentPixelRatio: cutoutTransparencyRatio, + setSelectedPhotos((prev) => { + const merged = [...prev, ...nextEntries]; + return merged; }); - setPendingVisualNormalization(visualNormalization); + setPrimaryPhotoId((prev) => prev ?? nextEntries[0]?.id ?? null); setCleanedPhotoUrl(null); setServerCleanedUrl(null); extraction?.actions?.setIngestionStatus?.(isEdit ? null : "pending"); - setPendingPhotoWidth(effectiveWidth); - - const brandResult = await brandPromise; - if (previousSelectionId !== latestPhotoSelectionIdRef.current) { - return; - } - if (brandResult?.brand) { - setDetectedBrand(brandResult.brand); - setDetectedBrandConfidence( - typeof brandResult.confidence === "number" ? brandResult.confidence : null - ); - } if (!isEdit && uid) { if (previousDraftId) { @@ -835,85 +975,107 @@ export function usePhotoStep({ } }, [ clearPendingCutoutState, - commitPendingCutoutState, - buildNormalizedPreviewCutout, extractionRef, isEdit, - normalizeImageForCutout, - runBackgroundRemoval, + processPickedAsset, uid, ]); - const resolvePhotoFields = useCallback(async (currentUid: string, itemId: string) => { - const reusableUpload = - !!pendingPhotoHash && - uploadedPhotoRecord && - uploadedPhotoRecord.itemId === itemId && - uploadedPhotoRecord.photoHash === pendingPhotoHash; - if (reusableUpload) { - setPhotoUrl(uploadedPhotoRecord.primaryUrl); - setCleanedPhotoUrl(uploadedPhotoRecord.cleanedUrl); - setServerCleanedUrl(uploadedPhotoRecord.cleanedUrl); - setPendingNormalizedPreviewUri(uploadedPhotoRecord.normalizedUrl); - setPendingVisualNormalization(uploadedPhotoRecord.visualNormalization ?? null); - syncedPreviewUriRef.current = pendingPhotoUri; - setUploadError(null); + const resolvePhotoFields = useCallback(async (currentUid: string, itemId: string): Promise => { + const activeEntries = + selectedPhotos.length > 0 + ? selectedPhotos + : pendingPhotoUri + ? [ + { + id: makeSelectedPhotoId(), + source: "library" as const, + localUri: pendingPhotoUri, + originalUri: originalPickedPhotoUri ?? pendingPhotoUri, + photoHash: pendingPhotoHash ?? `${pendingPhotoUri}-${pendingPhotoWidth ?? "w"}`, + originalWidth: pendingPhotoWidth, + originalHeight: null, + cleanedLocalUri: pendingCleanedPhotoUri, + normalizedLocalUri: pendingNormalizedPreviewUri, + hasTransparency: pendingCutoutHasTransparency, + transparentPixelRatio: pendingCutoutTransparencyRatio, + maskUri: pendingCutoutMaskUri, + visualNormalization: pendingVisualNormalization, + uploaded: uploadedPhotoRecord, + }, + ] + : []; + + if (!activeEntries.length) { return { - originalUrl: uploadedPhotoRecord.originalUrl, - photoUrl: uploadedPhotoRecord.primaryUrl, - photoUri: null, - cleanedPhotoUrl: uploadedPhotoRecord.cleanedUrl, - cleanedUrl: uploadedPhotoRecord.cleanedUrl, - normalizedUrl: uploadedPhotoRecord.normalizedUrl, - visualNormalization: uploadedPhotoRecord.visualNormalization ?? null, + originalUrl: photoUrl, + photoUrl, + photoUri, + cleanedPhotoUrl, + cleanedUrl: serverCleanedUrl, + normalizedUrl: pendingNormalizedPreviewUri, + visualNormalization: pendingVisualNormalization, + imageUrls: photoUrl ? [photoUrl] : [], + cleanedImageUrls: serverCleanedUrl ? [serverCleanedUrl] : [], + images: photoUrl + ? [sanitizePhotoImageRecord({ originalUrl: photoUrl, cleanedUrl: serverCleanedUrl, isPrimary: true })] + : [], }; } - const needsUpload = - !!pendingPhotoUri && - (!photoUrl || !pendingPhotoHash || !uploadedPhotoRecord || uploadedPhotoRecord.photoHash !== pendingPhotoHash); - if (needsUpload) { + const primaryId = primaryPhotoId ?? activeEntries[0]?.id ?? null; + const reusableUpload = + activeEntries.every( + (entry) => + entry.uploaded && + entry.uploaded.itemId === itemId && + entry.uploaded.photoHash === entry.photoHash + ); + + let uploadedEntries = activeEntries; + if (!reusableUpload) { const attemptId = beginUploadAttempt("resolve-photo-fields"); try { - const uploadedUrl = await uploadWithTimeout( - uploadItemPhoto({ - uid: currentUid, - itemId, - localUri: pendingPhotoUri, - cleanedLocalUri: pendingCleanedPhotoUri, - normalizedLocalUri: pendingNormalizedPreviewUri, - originalWidth: pendingPhotoWidth, - }), - UPLOAD_TIMEOUT_MS, - "Photo upload" + uploadedEntries = await Promise.all( + activeEntries.map(async (entry, index) => { + if ( + entry.uploaded && + entry.uploaded.itemId === itemId && + entry.uploaded.photoHash === entry.photoHash + ) { + return entry; + } + const uploadedUrl = await uploadWithTimeout( + uploadItemPhoto({ + uid: currentUid, + itemId, + imageId: `image-${index + 1}`, + localUri: entry.localUri, + cleanedLocalUri: entry.cleanedLocalUri, + normalizedLocalUri: entry.normalizedLocalUri, + originalWidth: entry.originalWidth, + }), + UPLOAD_TIMEOUT_MS, + "Photo upload" + ); + return { + ...entry, + uploaded: { + imageId: entry.id, + itemId, + photoHash: entry.photoHash, + originalUrl: uploadedUrl.originalUrl, + primaryUrl: uploadedUrl.primaryUrl, + cleanedUrl: uploadedUrl.cleanedUrl, + normalizedUrl: uploadedUrl.normalizedUrl, + cleanedSource: uploadedUrl.cleanedUrl ? "vision" : null, + visualNormalization: entry.visualNormalization, + }, + }; + }) ); - setPhotoUrl(uploadedUrl.primaryUrl); - setCleanedPhotoUrl(uploadedUrl.cleanedUrl); - setServerCleanedUrl(uploadedUrl.cleanedUrl); - setPendingNormalizedPreviewUri(uploadedUrl.normalizedUrl); - if (pendingPhotoHash) { - setUploadedPhotoRecord({ - itemId, - photoHash: pendingPhotoHash, - originalUrl: uploadedUrl.originalUrl, - primaryUrl: uploadedUrl.primaryUrl, - cleanedUrl: uploadedUrl.cleanedUrl, - normalizedUrl: uploadedUrl.normalizedUrl, - cleanedSource: uploadedUrl.cleanedUrl ? "vision" : null, - visualNormalization: pendingVisualNormalization, - }); - } - syncedPreviewUriRef.current = pendingPhotoUri; + setSelectedPhotos(uploadedEntries); setUploadError(null); - return { - originalUrl: uploadedUrl.originalUrl, - photoUrl: uploadedUrl.primaryUrl, - photoUri: null, - cleanedPhotoUrl: uploadedUrl.cleanedUrl, - cleanedUrl: uploadedUrl.cleanedUrl, - normalizedUrl: uploadedUrl.normalizedUrl, - visualNormalization: pendingVisualNormalization, - }; } catch (error) { const message = error instanceof Error ? error.message : "Photo upload failed. Please retry."; @@ -923,40 +1085,67 @@ export function usePhotoStep({ endUploadAttempt(attemptId, "resolve-photo-fields"); } } - if (!photoUrl && !photoUri) { - return { - originalUrl: photoUrl, - photoUrl: null, - photoUri: null, - cleanedPhotoUrl, - cleanedUrl: serverCleanedUrl, - normalizedUrl: pendingNormalizedPreviewUri, - visualNormalization: pendingVisualNormalization, - }; + + const sortedUploads = uploadedEntries.filter((entry) => entry.uploaded); + const primaryEntry = + sortedUploads.find((entry) => entry.id === primaryId) ?? + sortedUploads[0] ?? + null; + const primaryUpload = primaryEntry?.uploaded ?? null; + if (primaryEntry?.localUri) { + syncedPreviewUriRef.current = primaryEntry.localUri; } + setUploadedPhotoRecord(primaryUpload); + setPhotoUrl(primaryUpload?.primaryUrl ?? null); + setCleanedPhotoUrl(primaryUpload?.cleanedUrl ?? null); + setServerCleanedUrl(primaryUpload?.cleanedUrl ?? null); + setPendingNormalizedPreviewUri(primaryUpload?.normalizedUrl ?? null); + setPendingVisualNormalization(primaryEntry?.visualNormalization ?? null); + return { - originalUrl: photoUrl, - photoUrl, - photoUri, - cleanedPhotoUrl, - cleanedUrl: serverCleanedUrl, - normalizedUrl: pendingNormalizedPreviewUri, - visualNormalization: pendingVisualNormalization, + originalUrl: primaryUpload?.originalUrl ?? null, + photoUrl: primaryUpload?.primaryUrl ?? null, + photoUri: null, + cleanedPhotoUrl: primaryUpload?.cleanedUrl ?? null, + cleanedUrl: primaryUpload?.cleanedUrl ?? null, + normalizedUrl: primaryUpload?.normalizedUrl ?? null, + visualNormalization: primaryEntry?.visualNormalization ?? null, + imageUrls: sortedUploads + .map((entry) => entry.uploaded?.primaryUrl ?? "") + .filter(Boolean), + cleanedImageUrls: sortedUploads + .map((entry) => entry.uploaded?.cleanedUrl ?? "") + .filter(Boolean), + images: sortedUploads + .map((entry) => + sanitizePhotoImageRecord({ + originalUrl: entry.uploaded?.primaryUrl ?? "", + cleanedUrl: entry.uploaded?.cleanedUrl ?? null, + isPrimary: entry.id === (primaryEntry?.id ?? ""), + }) + ) + .filter((entry) => entry.originalUrl), }; }, [ beginUploadAttempt, cleanedPhotoUrl, endUploadAttempt, + originalPickedPhotoUri, + pendingCutoutHasTransparency, + pendingCutoutMaskUri, + pendingCutoutTransparencyRatio, pendingCleanedPhotoUri, pendingNormalizedPreviewUri, + pendingPhotoHash, pendingPhotoUri, pendingPhotoWidth, pendingVisualNormalization, photoUri, photoUrl, + primaryPhotoId, + selectedPhotos, serverCleanedUrl, uploadedPhotoRecord, - pendingPhotoHash, ]); const retryPhotoUpload = useCallback(async () => { @@ -980,10 +1169,26 @@ export function usePhotoStep({ ); await updateDoc(doc(db, "users", uid, "items", extraction.state.draftItemId), { photoUrl: uploaded.primaryUrl, + originalImageUrl: uploaded.originalUrl, + cleanedImageUrl: uploaded.cleanedUrl, + images: [ + sanitizePhotoImageRecord({ + originalUrl: uploaded.primaryUrl, + cleanedUrl: uploaded.cleanedUrl, + isPrimary: true, + }), + ], updatedAt: Date.now(), "photos.originalUrl": uploaded.originalUrl, "photos.primaryUrl": uploaded.primaryUrl, "photos.urls": [uploaded.primaryUrl], + "photos.images": [ + sanitizePhotoImageRecord({ + originalUrl: uploaded.primaryUrl, + cleanedUrl: uploaded.cleanedUrl, + isPrimary: true, + }), + ], ...(uploaded.cleanedUrl ? { "photos.cleanedUrl": uploaded.cleanedUrl, @@ -1007,6 +1212,7 @@ export function usePhotoStep({ setPendingNormalizedPreviewUri(uploaded.normalizedUrl); if (pendingPhotoHash) { setUploadedPhotoRecord({ + imageId: "primary", itemId: extraction.state.draftItemId, photoHash: pendingPhotoHash, originalUrl: uploaded.originalUrl, @@ -1078,6 +1284,47 @@ export function usePhotoStep({ setDebugEdgeTighten(defaultRefineOptions.edgeTighten); setDetectedBrand(null); setDetectedBrandConfidence(null); + const hydratedImages = Array.isArray(data.images) + ? data.images + : Array.isArray(data.photos?.images) + ? data.photos.images + : []; + const entries: SelectedPhotoEntry[] = hydratedImages + .map((image: any, index: number) => { + const originalUrl = String(image?.originalUrl ?? "").trim(); + if (!originalUrl) return null; + return { + id: String(image?.id ?? `hydrated-${index + 1}`), + source: "library" as const, + localUri: originalUrl, + originalUri: originalUrl, + photoHash: String(image?.photoHash ?? originalUrl), + originalWidth: null, + originalHeight: null, + cleanedLocalUri: String(image?.cleanedUrl ?? "").trim() || null, + normalizedLocalUri: null, + hasTransparency: Boolean(image?.cleanedUrl), + transparentPixelRatio: image?.cleanedUrl ? 1 : 0, + maskUri: null, + visualNormalization: data.visualNormalization ?? null, + uploaded: { + imageId: String(image?.id ?? `hydrated-${index + 1}`), + itemId: String(data?.id ?? ""), + photoHash: String(image?.photoHash ?? originalUrl), + originalUrl, + primaryUrl: originalUrl, + cleanedUrl: String(image?.cleanedUrl ?? "").trim() || null, + normalizedUrl: null, + cleanedSource: image?.cleanedUrl ? "vision" : null, + visualNormalization: data.visualNormalization ?? null, + }, + } satisfies SelectedPhotoEntry; + }) + .filter(Boolean) as SelectedPhotoEntry[]; + setSelectedPhotos(entries); + const primaryHydrated = + entries.find((entry, index) => hydratedImages[index]?.isPrimary) ?? entries[0] ?? null; + setPrimaryPhotoId(primaryHydrated?.id ?? null); }, [ clearPendingCutoutState, defaultRefineOptions.cleanupRadius, @@ -1113,6 +1360,8 @@ export function usePhotoStep({ setDetectedBrand(null); setDetectedBrandConfidence(null); setUploadedPhotoRecord(null); + setSelectedPhotos([]); + setPrimaryPhotoId(null); lastCompletedRefineKeyRef.current = ""; latestRefineRequestIdRef.current = 0; latestPhotoSelectionIdRef.current = 0; @@ -1125,6 +1374,33 @@ export function usePhotoStep({ defaultRefineOptions.threshold, ]); + const setPrimaryPhoto = useCallback((photoId: string) => { + setPrimaryPhotoId(photoId); + }, []); + + const movePhoto = useCallback((photoId: string, direction: -1 | 1) => { + setSelectedPhotos((prev) => { + const index = prev.findIndex((entry) => entry.id === photoId); + if (index < 0) return prev; + const nextIndex = index + direction; + if (nextIndex < 0 || nextIndex >= prev.length) return prev; + const next = [...prev]; + const [entry] = next.splice(index, 1); + next.splice(nextIndex, 0, entry); + return next; + }); + }, []); + + const removeSelectedPhoto = useCallback((photoId: string) => { + setSelectedPhotos((prev) => { + const next = prev.filter((entry) => entry.id !== photoId); + if (primaryPhotoId === photoId) { + setPrimaryPhotoId(next[0]?.id ?? null); + } + return next; + }); + }, [primaryPhotoId]); + useEffect(() => { return () => { if (refineTimeoutRef.current) { @@ -1162,6 +1438,8 @@ export function usePhotoStep({ detectedBrand, detectedBrandConfidence, uploadedPhotoRecord, + selectedPhotos, + primaryPhotoId, }; const derived = { @@ -1203,6 +1481,10 @@ export function usePhotoStep({ setDetectedBrand, setDetectedBrandConfidence, setUploadedPhotoRecord, + setPrimaryPhoto, + movePhotoLeft: (photoId: string) => movePhoto(photoId, -1), + movePhotoRight: (photoId: string) => movePhoto(photoId, 1), + removeSelectedPhoto, handleRefineValueChange, handleRefineValueComplete, handleRefineReset, diff --git a/src/addItem/sections/PhotoStep.tsx b/src/addItem/sections/PhotoStep.tsx index 8555d6d..4bb1333 100644 --- a/src/addItem/sections/PhotoStep.tsx +++ b/src/addItem/sections/PhotoStep.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Alert, Pressable, Text, View } from "react-native"; +import { Alert, Image, Pressable, ScrollView, Text, View } from "react-native"; import { PhotoEditorSection } from "../../components/PhotoEditorSection"; import { makeDevThrottleLogger } from "../devPerf"; import { SectionCard } from "../ui/SectionCard"; @@ -167,6 +167,132 @@ export const PhotoStep = React.memo(function PhotoStep({ controller }: { control onAdjust={() => {}} onRotate={() => Alert.alert("Coming soon", "Rotate is coming soon.")} /> + {state.selectedPhotos?.length ? ( + + + + Item photos + + + Mark a primary image and reorder before save + + + + + {state.selectedPhotos.map((entry: any, index: number) => { + const previewUri = + entry.normalizedLocalUri ?? + entry.cleanedLocalUri ?? + entry.localUri ?? + null; + const isPrimary = state.primaryPhotoId === entry.id; + return ( + + actions.setPrimaryPhoto(entry.id)} + style={{ + borderRadius: 16, + borderWidth: 2, + borderColor: isPrimary ? "#111" : "rgba(17,17,17,0.12)", + overflow: "hidden", + backgroundColor: "#f3f4f6", + }} + > + {previewUri ? ( + + ) : ( + + )} + + + actions.setPrimaryPhoto(entry.id)} + style={[ + controller.styles.btnSecondary, + { + paddingVertical: 8, + backgroundColor: isPrimary ? "#111" : "#fff", + borderColor: isPrimary ? "#111" : "rgba(17,17,17,0.12)", + }, + ]} + > + + {isPrimary ? "Primary" : "Make primary"} + + + + actions.movePhotoLeft(entry.id)} + disabled={index === 0} + style={[controller.styles.btnSecondary, { flex: 1, opacity: index === 0 ? 0.4 : 1 }]} + > + Left + + actions.movePhotoRight(entry.id)} + disabled={index === state.selectedPhotos.length - 1} + style={[ + controller.styles.btnSecondary, + { + flex: 1, + opacity: index === state.selectedPhotos.length - 1 ? 0.4 : 1, + }, + ]} + > + Right + + + actions.removeSelectedPhoto(entry.id)} + style={[controller.styles.btnSecondary, { borderColor: "#b91c1c" }]} + > + + Remove + + + + + ); + })} + + + + void actions.pickPhoto("library")} + style={[controller.styles.btnSecondary, { flex: 1 }]} + > + Add from library + + void actions.pickPhoto("camera")} + style={[controller.styles.btnSecondary, { flex: 1 }]} + > + Add from camera + + + + ) : null} {!state.isEdit && state.ingestionStatus === "done" && state.lastAutofillSummary ? ( diff --git a/src/addItem/useAddItemController.ts b/src/addItem/useAddItemController.ts index 90014b0..4898753 100644 --- a/src/addItem/useAddItemController.ts +++ b/src/addItem/useAddItemController.ts @@ -330,6 +330,7 @@ export function useAddItemController({ const hasPhoto = useMemo( () => !!( + photo.state.selectedPhotos?.length || photo.state.pendingCleanedPhotoUri || photo.state.pendingPhotoUri || photo.state.photoUri || @@ -339,6 +340,7 @@ export function useAddItemController({ ), [ photo.state.cleanedPhotoUrl, + photo.state.selectedPhotos, photo.state.pendingCleanedPhotoUri, photo.state.pendingPhotoUri, photo.state.photoUri, @@ -666,6 +668,7 @@ export function useAddItemController({ rowKeys, touched, isDirty: + (photo.state.selectedPhotos?.length ?? 0) > 0 || !!photo.state.pendingPhotoUri || !!draft.state.brand || !!draft.state.name || diff --git a/src/lib/uploadImage.ts b/src/lib/uploadImage.ts index 1d936f4..fb429f0 100644 --- a/src/lib/uploadImage.ts +++ b/src/lib/uploadImage.ts @@ -6,6 +6,7 @@ type UploadItemPhotoParams = { uid: string; itemId: string; localUri: string; + imageId?: string; cleanedLocalUri?: string | null; normalizedLocalUri?: string | null; originalWidth?: number | null; @@ -62,6 +63,7 @@ export async function uploadItemPhoto(params: UploadItemPhotoParams) { uid, itemId, localUri, + imageId = "", cleanedLocalUri = null, normalizedLocalUri = null, originalWidth = null, @@ -77,7 +79,8 @@ export async function uploadItemPhoto(params: UploadItemPhotoParams) { }); const primaryBlob = await blobFromFileUri(processedUri); - const storagePath = `users/${uid}/items/${itemId}.jpg`; + const suffix = imageId ? `/${imageId}` : ""; + const storagePath = `users/${uid}/items/${itemId}${suffix}.jpg`; const fileRef = ref(storage, storagePath); await uploadBytes(fileRef, primaryBlob, { contentType: "image/jpeg", @@ -90,7 +93,7 @@ export async function uploadItemPhoto(params: UploadItemPhotoParams) { let cleanedUrl: string | null = null; if (cleanedCandidateUri) { const cleanedBlob = await blobFromFileUri(cleanedCandidateUri); - const cleanedPath = `users/${uid}/items/${itemId}.cleaned.png`; + const cleanedPath = `users/${uid}/items/${itemId}${suffix}.cleaned.png`; const cleanedRef = ref(storage, cleanedPath); await uploadBytes(cleanedRef, cleanedBlob, { contentType: "image/png", @@ -101,7 +104,7 @@ export async function uploadItemPhoto(params: UploadItemPhotoParams) { let normalizedUrl: string | null = null; if (normalizedLocalUri) { const normalizedBlob = await blobFromFileUri(normalizedLocalUri); - const normalizedPath = `users/${uid}/items/${itemId}.normalized.png`; + const normalizedPath = `users/${uid}/items/${itemId}${suffix}.normalized.png`; const normalizedRef = ref(storage, normalizedPath); await uploadBytes(normalizedRef, normalizedBlob, { contentType: "image/png", @@ -115,5 +118,13 @@ export async function uploadItemPhoto(params: UploadItemPhotoParams) { cleanedUrl, normalizedUrl, cleanedSource: cleanedUrl ? "vision" : null, + imageUrls: [primaryUrl], + images: [ + { + originalUrl: primaryUrl, + ...(cleanedUrl ? { cleanedUrl } : {}), + isPrimary: true, + }, + ], }; } From 113555097b74aa47ed2a38fcff299ee4688192b6 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:47:32 -0500 Subject: [PATCH 07/93] feat(images): improve item image selection and normalized presentation --- app/(tabs)/item/[id].tsx | 312 ++++++++++++++++++++--- src/components/closet/ClosetItemCard.tsx | 15 +- src/lib/itemImage.ts | 287 +++++++++++++++++++++ src/lib/visualNormalization.ts | 82 +++++- 4 files changed, 635 insertions(+), 61 deletions(-) diff --git a/app/(tabs)/item/[id].tsx b/app/(tabs)/item/[id].tsx index 63a1dd6..f933526 100644 --- a/app/(tabs)/item/[id].tsx +++ b/app/(tabs)/item/[id].tsx @@ -1,7 +1,19 @@ import { router, useLocalSearchParams } from "expo-router"; import { deleteDoc, deleteField, doc, onSnapshot, updateDoc } from "firebase/firestore"; import React, { useEffect, useMemo, useState } from "react"; -import { Alert, Image, Modal, Pressable, ScrollView, Text, TextInput, View } from "react-native"; +import { + Alert, + Dimensions, + Image, + Modal, + NativeScrollEvent, + NativeSyntheticEvent, + Pressable, + ScrollView, + Text, + TextInput, + View, +} from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { SafeScreen } from "../../../src/components/SafeScreen"; @@ -10,7 +22,7 @@ import { useAuth } from "../../../src/hooks/useAuth"; import { useAppTheme } from "../../../src/hooks/useAppTheme"; import { useResponsiveLayout } from "../../../src/hooks/useResponsiveLayout"; import { db } from "../../../src/lib/firebase"; -import { getItemImageUrl } from "../../../src/lib/itemImage"; +import { getItemImagePresentation, getItemImageUrl } from "../../../src/lib/itemImage"; import { getIngestionStatus, markWashed as markWashedItem, @@ -23,6 +35,83 @@ type ItemDetails = ClothingItem & { id: string; }; +type DetailImageAsset = { + uri: string; + isPrimary: boolean; +}; + +function isValidUrl(value?: string | null) { + const url = String(value ?? "").trim(); + if (!url) return false; + return url.startsWith("file://") || /^https?:\/\//i.test(url); +} + +function dedupeImageAssets(images: DetailImageAsset[]) { + const seen = new Set(); + return images.filter((image) => { + const key = image.uri.trim(); + if (!key || seen.has(key)) return false; + seen.add(key); + return true; + }); +} + +function getItemDetailImages(item: ItemDetails | null): DetailImageAsset[] { + if (!item) return []; + + const next: DetailImageAsset[] = []; + const sources = [ + ...(item.images ?? []), + ...(item.photos?.images ?? []), + ]; + + for (const image of sources) { + const candidate = getItemImageUrl( + { + ...item, + images: image + ? [ + { + originalUrl: image.originalUrl ?? null, + cleanedUrl: image.cleanedUrl ?? null, + isPrimary: Boolean(image.isPrimary), + }, + ] + : [], + photos: { + ...item.photos, + images: image + ? [ + { + originalUrl: image.originalUrl ?? null, + cleanedUrl: image.cleanedUrl ?? null, + isPrimary: Boolean(image.isPrimary), + }, + ] + : [], + primaryUrl: image?.originalUrl ?? item.photos?.primaryUrl ?? null, + }, + }, + { variant: "hero" }, + ); + + if (candidate && isValidUrl(candidate)) { + next.push({ + uri: candidate, + isPrimary: Boolean(image?.isPrimary), + }); + } + } + + const fallback = getItemImageUrl(item, { variant: "hero" }); + if (fallback && isValidUrl(fallback)) { + next.push({ uri: fallback, isPrimary: next.length === 0 }); + } + + const deduped = dedupeImageAssets(next); + return deduped.sort((a, b) => Number(b.isPrimary) - Number(a.isPrimary)); +} + function formatDate(value?: any | null) { if (!value) return "—"; if (typeof value?.toDate === "function") { @@ -39,7 +128,7 @@ function formatDateOrNotSet(value?: any | null) { return formatDate(value); } -function ingestionStatusLabel(item: ItemDetails) { +function ingestionStatusLabel(item: ItemDetails | null | undefined) { const status = getIngestionStatus(item) ?? "pending"; if (status === "done") return "done"; if (status === "failed") return "failed"; @@ -133,10 +222,15 @@ export default function ItemDetailsScreen() { const [colorSaving, setColorSaving] = useState(false); const [colorSavedAt, setColorSavedAt] = useState(null); const [detailImageOpen, setDetailImageOpen] = useState(false); + const [activeImageIndex, setActiveImageIndex] = useState(0); const [patternDraft, setPatternDraft] = useState(""); const [materialDraft, setMaterialDraft] = useState(""); const [footerHeight, setFooterHeight] = useState(0); const itemImageUri = getItemImageUrl(item, { variant: "hero" }); + const detailImages = useMemo(() => getItemDetailImages(item), [item]); + const imagePresentation = getItemImagePresentation(item, { + surface: "item_detail", + }); const footerOffset = layout.composerOffset; const quickFacts = item ? [ @@ -186,6 +280,11 @@ export default function ItemDetailsScreen() { ] : []; + useEffect(() => { + if (activeImageIndex <= Math.max(detailImages.length - 1, 0)) return; + setActiveImageIndex(0); + }, [activeImageIndex, detailImages.length]); + useEffect(() => { if (!itemImageUri) return; const baseUri = itemImageUri.split("?")[0]?.toLowerCase() ?? ""; @@ -394,7 +493,8 @@ export default function ItemDetailsScreen() { setDetailImageOpen(false)} /> - {itemImageUri ? ( - setDetailImageOpen(true)} - style={{ width: "100%", height: 216, borderRadius: 18 }} - > - - - - + {detailImages.length > 0 ? ( + setDetailImageOpen(true)} + containerAspectRatio={imagePresentation.containerAspectRatio} + imageStyle={imagePresentation.imageStyle} + resizeMode={imagePresentation.resizeMode} + /> ) : ( void; }) { - const { visible, uri, onClose } = props; + const { visible, images, initialIndex, onClose } = props; const insets = useSafeAreaInsets(); + const [activeIndex, setActiveIndex] = useState(initialIndex); + const windowWidth = Dimensions.get("window").width; + + useEffect(() => { + if (!visible) return; + setActiveIndex(initialIndex); + }, [initialIndex, visible]); + + const imageWidth = Math.max(windowWidth - 32, 1); + + function onMomentumScrollEnd(event: NativeSyntheticEvent) { + const nextIndex = Math.round(event.nativeEvent.contentOffset.x / imageWidth); + setActiveIndex(Math.max(0, Math.min(images.length - 1, nextIndex))); + } return ( @@ -864,23 +965,154 @@ function ItemImageModal(props: { bouncesZoom={false} centerContent > - {uri ? ( + {images.length > 0 ? ( + + {images.map((image) => ( + + + + + + ))} + + ) : null} + {images.length > 1 ? ( + + {images.map((image, index) => ( + + ))} + + {activeIndex + 1} / {images.length} + + + ) : null} + + + + ); +} + +function DetailImageCarousel(props: { + images: DetailImageAsset[]; + activeIndex: number; + onIndexChange: (index: number) => void; + onPressImage: () => void; + containerAspectRatio: number; + imageStyle: object; + resizeMode: "contain"; +}) { + const { + images, + activeIndex, + onIndexChange, + onPressImage, + containerAspectRatio, + imageStyle, + resizeMode, + } = props; + const layout = useResponsiveLayout(); + const windowWidth = Dimensions.get("window").width; + const cardWidth = Math.max(windowWidth - layout.horizontalPadding * 2 - 36, 1); + const cardHeight = Math.min(520, Math.max(280, cardWidth / Math.max(containerAspectRatio, 0.55))); + + function onMomentumScrollEnd(event: NativeSyntheticEvent) { + const nextIndex = Math.round(event.nativeEvent.contentOffset.x / cardWidth); + onIndexChange(Math.max(0, Math.min(images.length - 1, nextIndex))); + } + + return ( + + + {images.map((image) => ( + - + - ) : null} - - - + + ))} + + {images.length > 1 ? ( + + + {images.map((image, index) => ( + + ))} + + + {activeIndex + 1} / {images.length} + + + ) : null} + ); } diff --git a/src/components/closet/ClosetItemCard.tsx b/src/components/closet/ClosetItemCard.tsx index d45e743..3388af6 100644 --- a/src/components/closet/ClosetItemCard.tsx +++ b/src/components/closet/ClosetItemCard.tsx @@ -3,7 +3,7 @@ import { Image, Pressable, Text, View } from "react-native"; import { useAppTheme } from "@/src/hooks/useAppTheme"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; -import { getItemImageUrl } from "@/src/lib/itemImage"; +import { getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; import type { ClosetItem } from "@/src/lib/items"; import { sanitizeDisplayText } from "@/src/lib/text"; @@ -26,6 +26,7 @@ export function ClosetItemCard({ const { colors } = useAppTheme(); const layout = useResponsiveLayout(); const imageUrl = getItemImageUrl(item, { variant: "thumb" }); + const imagePresentation = getItemImagePresentation(item, { surface: "closet_card" }); return ( {imageUrl ? ( ) : ( image?.isPrimary) ?? + item.images?.[0] ?? + item.photos?.images?.find((image) => image?.isPrimary) ?? + item.photos?.images?.[0] ?? + null; + return { + originalUrl: String(primary?.originalUrl ?? item.originalImageUrl ?? "").trim() || null, + cleanedUrl: String(primary?.cleanedUrl ?? item.cleanedImageUrl ?? "").trim() || null, + }; +} + +function clamp(value: number, min: number, max: number) { + return Math.max(min, Math.min(max, value)); +} + +function normalizeToken(value?: string | null) { + return String(value ?? "") + .trim() + .toLowerCase() + .replace(/[_-]+/g, " "); +} + +function getFrameAspectRatio(item: ImageLikeItem | null | undefined): number { + const joined = [ + normalizeToken(item?.category), + normalizeToken(item?.subCategory), + normalizeToken(item?.type), + ].join(" "); + + if ( + joined.includes("jeans") || + joined.includes("pants") || + joined.includes("trousers") || + joined.includes("dress") || + joined.includes("skirt") || + joined.includes("jumpsuit") || + joined.includes("romper") + ) { + return 0.72; + } + if ( + joined.includes("shirt") || + joined.includes("blouse") || + joined.includes("tee") || + joined.includes("top") || + joined.includes("crop top") || + joined.includes("jacket") || + joined.includes("coat") || + joined.includes("hoodie") + ) { + return 0.82; + } + if ( + joined.includes("shoe") || + joined.includes("sneaker") || + joined.includes("boot") || + joined.includes("loafer") || + joined.includes("heel") + ) { + return 1.18; + } + if ( + joined.includes("glasses") || + joined.includes("watch") || + joined.includes("bag") || + joined.includes("handbag") || + joined.includes("bracelet") || + joined.includes("necklace") || + joined.includes("hat") || + joined.includes("cap") + ) { + return 1.0; + } + return 0.86; +} + +type SurfaceProfile = { + aspectRatioMin: number; + aspectRatioMax: number; + aspectRatioWeight: number; + fillTargetHeight: number; + fillTargetWidth: number; + fillAggressiveness: number; + minScale: number; + maxScale: number; + translateMin: number; + translateMax: number; + verticalBiasStrength: number; +}; + +const SURFACE_PROFILES: Record = { + closet_card: { + aspectRatioMin: 0.66, + aspectRatioMax: 0.92, + aspectRatioWeight: 0.76, + fillTargetHeight: 96, + fillTargetWidth: 90, + fillAggressiveness: 1.12, + minScale: 1.02, + maxScale: 1.58, + translateMin: -10, + translateMax: 20, + verticalBiasStrength: 0.2, + }, + item_detail: { + aspectRatioMin: 0.62, + aspectRatioMax: 1.06, + aspectRatioWeight: 0.68, + fillTargetHeight: 95, + fillTargetWidth: 92, + fillAggressiveness: 1.08, + minScale: 1, + maxScale: 1.5, + translateMin: -12, + translateMax: 22, + verticalBiasStrength: 0.18, + }, + home_today: { + aspectRatioMin: 0.72, + aspectRatioMax: 1.02, + aspectRatioWeight: 0.58, + fillTargetHeight: 92, + fillTargetWidth: 88, + fillAggressiveness: 1.02, + minScale: 0.98, + maxScale: 1.38, + translateMin: -10, + translateMax: 16, + verticalBiasStrength: 0.12, + }, + home_continue: { + aspectRatioMin: 0.72, + aspectRatioMax: 0.98, + aspectRatioWeight: 0.62, + fillTargetHeight: 93, + fillTargetWidth: 88, + fillAggressiveness: 1.05, + minScale: 1, + maxScale: 1.42, + translateMin: -10, + translateMax: 18, + verticalBiasStrength: 0.14, + }, + ai_outfit: { + aspectRatioMin: 0.78, + aspectRatioMax: 1.08, + aspectRatioWeight: 0.56, + fillTargetHeight: 90, + fillTargetWidth: 86, + fillAggressiveness: 1, + minScale: 0.96, + maxScale: 1.34, + translateMin: -10, + translateMax: 14, + verticalBiasStrength: 0.1, + }, +}; + +function clampAspectRatio(value: number, min: number, max: number) { + return clamp(value, min, max); +} + +function getContentAspectRatio(item: ImageLikeItem | null | undefined, fallback: number) { + const widthPct = item?.visualNormalization?.contentWidthPct ?? item?.visualNormalization?.contentBounds?.widthPct; + const heightPct = + item?.visualNormalization?.contentHeightPct ?? item?.visualNormalization?.contentBounds?.heightPct; + if (!widthPct || !heightPct) return fallback; + return clampAspectRatio(widthPct / heightPct, 0.45, 1.6); +} + +export function getItemImagePresentation( + item: ImageLikeItem | null | undefined, + options: + | { surface: ItemImageSurface } + | { variant: "thumb" | "hero" }, +) { + const surface: ItemImageSurface = + "surface" in options + ? options.surface + : options.variant === "hero" + ? "item_detail" + : "closet_card"; + const surfaceProfile = SURFACE_PROFILES[surface]; + const normalization = mergeVisualNormalization( + getVisualNormalizationDefaults({ + category: item?.category, + subCategory: item?.subCategory, + type: item?.type, + }), + item?.visualNormalization, + ); + const fallbackAspectRatio = getFrameAspectRatio(item); + const contentWidthPct = + normalization.contentWidthPct ?? normalization.contentBounds?.widthPct ?? 82; + const contentHeightPct = + normalization.contentHeightPct ?? normalization.contentBounds?.heightPct ?? 88; + const contentAspectRatio = getContentAspectRatio(item, fallbackAspectRatio); + const containerAspectRatio = clampAspectRatio( + fallbackAspectRatio * (1 - surfaceProfile.aspectRatioWeight) + + contentAspectRatio * surfaceProfile.aspectRatioWeight, + surfaceProfile.aspectRatioMin, + surfaceProfile.aspectRatioMax, + ); + const fillHeightBoost = surfaceProfile.fillTargetHeight / contentHeightPct; + const fillWidthBoost = surfaceProfile.fillTargetWidth / contentWidthPct; + const fillBoost = clamp( + Math.max(fillHeightBoost, fillWidthBoost) * surfaceProfile.fillAggressiveness, + surfaceProfile.minScale, + surfaceProfile.maxScale, + ); + const anchorBias = + normalization.anchor === "top" + ? 4 + : normalization.anchor === "waist" + ? 3 + : normalization.anchor === "foot" + ? 2 + : 0; + const verticalBias = normalization.verticalBias ?? 0; + const scale = clamp( + (normalization.recommendedScale ?? 1) * fillBoost, + surfaceProfile.minScale, + surfaceProfile.maxScale, + ); + const translateY = clamp( + (normalization.recommendedTranslateY ?? 0) + + anchorBias + + verticalBias * surfaceProfile.verticalBiasStrength, + surfaceProfile.translateMin, + surfaceProfile.translateMax, + ); + + return { + resizeMode: "contain" as const, + containerAspectRatio, + imageStyle: { + transform: [{ translateY }, { scale }], + } as const, + }; +} + export function getItemImageUrl( item: ImageLikeItem | null | undefined, options: { variant: "thumb" | "hero" } ): string | null { if (!item) return null; + const primaryImage = getPrimaryImage(item); const cleanedSource = getCleanedSource(item); const preferredVisionCleaned = cleanedSource === "vision" ? [ + primaryImage.cleanedUrl, item.photos?.normalizedUrl, item.normalizedUrl, item.photos?.previewUrl, @@ -85,6 +369,7 @@ export function getItemImageUrl( ] : []; const fallbackCleaned = [ + primaryImage.cleanedUrl, item.photos?.normalizedUrl, item.normalizedUrl, item.photos?.previewUrl, @@ -97,6 +382,7 @@ export function getItemImageUrl( if (options.variant === "hero") { return firstValidUrl([ ...preferredVisionCleaned, + primaryImage.originalUrl, item.photos?.primaryUrl, item.photoUrl, item.photoUri, @@ -112,6 +398,7 @@ export function getItemImageUrl( return firstValidUrl([ ...preferredVisionCleaned, + primaryImage.originalUrl, item.photos?.primaryUrl, item.photoUrl, item.photoUri, diff --git a/src/lib/visualNormalization.ts b/src/lib/visualNormalization.ts index 39c5086..4eee385 100644 --- a/src/lib/visualNormalization.ts +++ b/src/lib/visualNormalization.ts @@ -7,6 +7,10 @@ export type VisualNormalization = { widthPct: number; heightPct: number; }; + contentWidthPct?: number; + contentHeightPct?: number; + visualFillRatio?: number; + verticalBias?: number; recommendedScale?: number; recommendedTranslateY?: number; anchor?: VisualNormalizationAnchor; @@ -64,11 +68,14 @@ function inferAnchor(input: { } if ( tokens.includes("shirt") || + tokens.includes("blouse") || tokens.includes("tee") || tokens.includes("t-shirt") || + tokens.includes("crop top") || tokens.includes("jacket") || tokens.includes("coat") || - tokens.includes("hoodie") + tokens.includes("hoodie") || + tokens.includes("dress") ) { return "top"; } @@ -86,10 +93,16 @@ export function getVisualNormalizationDefaults(input: { const joined = `${category} ${subCategory} ${type}`; if (joined.includes("shirt")) { - return { recommendedScale: 1.02, recommendedTranslateY: 6, anchor: "top" }; + return { recommendedScale: 1.1, recommendedTranslateY: 10, anchor: "top" }; + } + if (joined.includes("blouse")) { + return { recommendedScale: 1.08, recommendedTranslateY: 8, anchor: "top" }; + } + if (joined.includes("crop top")) { + return { recommendedScale: 1.04, recommendedTranslateY: 6, anchor: "top" }; } if (joined.includes("tee") || joined.includes("t-shirt")) { - return { recommendedScale: 0.98, recommendedTranslateY: 4, anchor: "top" }; + return { recommendedScale: 1.06, recommendedTranslateY: 8, anchor: "top" }; } if ( joined.includes("jacket") || @@ -97,27 +110,39 @@ export function getVisualNormalizationDefaults(input: { joined.includes("overshirt") || joined.includes("hoodie") ) { - return { recommendedScale: 1.04, recommendedTranslateY: 2, anchor: "top" }; + return { recommendedScale: 1.1, recommendedTranslateY: 6, anchor: "top" }; } if (joined.includes("jeans") || joined.includes("pants") || joined.includes("trousers")) { - return { recommendedScale: 1.0, recommendedTranslateY: 0, anchor: "waist" }; + return { recommendedScale: 1.08, recommendedTranslateY: 4, anchor: "waist" }; + } + if (joined.includes("skirt")) { + return { recommendedScale: 1.06, recommendedTranslateY: 3, anchor: "waist" }; + } + if (joined.includes("dress") || joined.includes("romper") || joined.includes("jumpsuit")) { + return { recommendedScale: 1.1, recommendedTranslateY: 4, anchor: "top" }; } if ( joined.includes("shoe") || joined.includes("sneaker") || joined.includes("loafer") || - joined.includes("boot") + joined.includes("boot") || + joined.includes("heel") ) { - return { recommendedScale: 0.98, recommendedTranslateY: 2, anchor: "foot" }; + return { recommendedScale: 1.04, recommendedTranslateY: 4, anchor: "foot" }; } if (joined.includes("watch")) { - return { recommendedScale: 0.96, recommendedTranslateY: 0, anchor: "center" }; + return { recommendedScale: 1.0, recommendedTranslateY: 0, anchor: "center" }; } if (joined.includes("glasses") || joined.includes("sunglasses")) { - return { recommendedScale: 0.96, recommendedTranslateY: 0, anchor: "center" }; + return { recommendedScale: 1.0, recommendedTranslateY: 0, anchor: "center" }; } - if (joined.includes("bag") || joined.includes("backpack") || joined.includes("crossbody")) { - return { recommendedScale: 1.02, recommendedTranslateY: 0, anchor: "center" }; + if ( + joined.includes("bag") || + joined.includes("handbag") || + joined.includes("backpack") || + joined.includes("crossbody") + ) { + return { recommendedScale: 1.08, recommendedTranslateY: 0, anchor: "center" }; } return { recommendedScale: 1, recommendedTranslateY: 0, anchor: inferAnchor(input) }; } @@ -136,10 +161,10 @@ export function buildVisualNormalizationFromContentBounds( const heightPct = clamp((contentBounds.height / imageHeight) * 100, 0.1, 100); const defaults = getVisualNormalizationDefaults(input); - const fillHeightTarget = 84; - const fillCompensation = clamp(fillHeightTarget / heightPct, 0.88, 1.22); + const fillHeightTarget = 92; + const fillCompensation = clamp(fillHeightTarget / heightPct, 0.95, 1.35); const topBias = 10 - topPct; - const translateFromTopBias = clamp(topBias * 0.6, -12, 12); + const translateFromTopBias = clamp(topBias * 0.75, -14, 16); return { contentBounds: { @@ -148,6 +173,12 @@ export function buildVisualNormalizationFromContentBounds( widthPct, heightPct, }, + contentWidthPct: widthPct, + contentHeightPct: heightPct, + visualFillRatio: Number(((widthPct * heightPct) / 10000).toFixed(4)), + verticalBias: Number( + (100 - (topPct + heightPct) - topPct).toFixed(2), + ), recommendedScale: Number(((defaults.recommendedScale ?? 1) * fillCompensation).toFixed(3)), recommendedTranslateY: Math.round((defaults.recommendedTranslateY ?? 0) + translateFromTopBias), anchor: defaults.anchor ?? inferAnchor(input), @@ -164,6 +195,29 @@ export function mergeVisualNormalization( ): VisualNormalization { return { contentBounds: itemLevel?.contentBounds, + contentWidthPct: + itemLevel?.contentWidthPct ?? itemLevel?.contentBounds?.widthPct, + contentHeightPct: + itemLevel?.contentHeightPct ?? itemLevel?.contentBounds?.heightPct, + visualFillRatio: + itemLevel?.visualFillRatio ?? + (() => { + const widthPct = + itemLevel?.contentWidthPct ?? itemLevel?.contentBounds?.widthPct; + const heightPct = + itemLevel?.contentHeightPct ?? itemLevel?.contentBounds?.heightPct; + if (!widthPct || !heightPct) return undefined; + return Number(((widthPct * heightPct) / 10000).toFixed(4)); + })(), + verticalBias: + itemLevel?.verticalBias ?? + (() => { + const topPct = itemLevel?.contentBounds?.topPct; + const heightPct = + itemLevel?.contentHeightPct ?? itemLevel?.contentBounds?.heightPct; + if (topPct == null || heightPct == null) return undefined; + return Number((100 - (topPct + heightPct) - topPct).toFixed(2)); + })(), recommendedScale: itemLevel?.recommendedScale ?? defaults.recommendedScale ?? 1, recommendedTranslateY: itemLevel?.recommendedTranslateY ?? defaults.recommendedTranslateY ?? 0, From 917130cf47b68e57614deb32741f1d2acbcf0003 Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 01:47:53 -0500 Subject: [PATCH 08/93] feat(ui): update aura and home components for new wardrobe data --- src/components/ai/OutfitMessage.tsx | 18 ++++++++++++++---- src/components/home/ContinueSection.tsx | 16 ++++++++++++---- src/components/home/TodayOutfitCard.tsx | 11 +++++++++-- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/components/ai/OutfitMessage.tsx b/src/components/ai/OutfitMessage.tsx index d81be3b..1351bad 100644 --- a/src/components/ai/OutfitMessage.tsx +++ b/src/components/ai/OutfitMessage.tsx @@ -3,7 +3,7 @@ import React from "react"; import { Image, Pressable, Text, View } from "react-native"; import type { AppColors } from "@/constants/theme"; -import { getItemImageUrl } from "@/src/lib/itemImage"; +import { getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; import { sanitizeDisplayText } from "@/src/lib/text"; import type { ClothingItem } from "@/src/types/ClothingItem"; @@ -114,6 +114,11 @@ export default function OutfitMessage({ const imageUri = getItemImageUrl(item, { variant: "thumb" }); return ( + {(() => { + const imagePresentation = getItemImagePresentation(item, { + surface: "ai_outfit", + }); + return ( ) : ( )} + ); + })()} {slotLabel(slot)} diff --git a/src/components/home/ContinueSection.tsx b/src/components/home/ContinueSection.tsx index b0f0742..496bd16 100644 --- a/src/components/home/ContinueSection.tsx +++ b/src/components/home/ContinueSection.tsx @@ -3,7 +3,7 @@ import { Image, Pressable, ScrollView, Text, View } from "react-native"; import type { AppColors } from "@/constants/theme"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; -import { getItemImageUrl } from "@/src/lib/itemImage"; +import { getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; import type { ClothingItem } from "@/src/types/ClothingItem"; function itemTitle(item: ClothingItem) { @@ -35,6 +35,9 @@ export default function ContinueSection({ {items.map((item) => { const imageUri = getItemImageUrl(item, { variant: "thumb" }); + const imagePresentation = getItemImagePresentation(item, { + surface: "home_continue", + }); return ( {imageUri ? ( - + ) : ( No image )} diff --git a/src/components/home/TodayOutfitCard.tsx b/src/components/home/TodayOutfitCard.tsx index fbdf958..0dc1be7 100644 --- a/src/components/home/TodayOutfitCard.tsx +++ b/src/components/home/TodayOutfitCard.tsx @@ -3,7 +3,7 @@ import { Image, Pressable, Text, View } from "react-native"; import type { AppColors } from "@/constants/theme"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; -import { getItemImageUrl } from "@/src/lib/itemImage"; +import { getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; import type { ClothingItem } from "@/src/types/ClothingItem"; import type { DailyOutfitRecord } from "@/src/utils/dailyOutfits"; @@ -72,6 +72,9 @@ export default function TodayOutfitCard({ {slots.map((slot) => { const item = itemForSlot(record, itemsById, slot); const imageUri = item ? getItemImageUrl(item, { variant: "thumb" }) : null; + const imagePresentation = getItemImagePresentation(item, { + surface: "home_today", + }); return ( {imageUri ? ( - + ) : null} From 2ea49d269b2aa4ed605b0b220e3e1d3334af2cbb Mon Sep 17 00:00:00 2001 From: Athfan Date: Tue, 21 Apr 2026 03:13:36 -0500 Subject: [PATCH 09/93] fix(app): resolve lint/typecheck regressions after onboarding refactor --- app/(tabs)/_layout.tsx | 1 - app/(tabs)/ai.tsx | 1 + app/(tabs)/calendar.tsx | 2 + eslint.config.js | 4 +- src/addItem/sections/DetailsStep.tsx | 2 - src/components/FloatingGlassTabBar.tsx | 6 ++- src/components/home/AuraLookModule.tsx | 2 +- src/lib/firebase.ts | 43 +++++++++++++++++++- src/profile/screens.tsx | 56 +++++++++++++++----------- 9 files changed, 85 insertions(+), 32 deletions(-) diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 1d53ff5..b219833 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -44,7 +44,6 @@ export default function TabLayout() { name="add" options={{ href: null, - unmountOnBlur: true, }} /> { if (isBooting) return; + if (!uid) return; void saveLatestChatCache(uid, activeChatId, null, messages); }, [activeChatId, isBooting, messages, uid]); diff --git a/app/(tabs)/calendar.tsx b/app/(tabs)/calendar.tsx index c0524a4..79bff7a 100644 --- a/app/(tabs)/calendar.tsx +++ b/app/(tabs)/calendar.tsx @@ -390,6 +390,7 @@ export default function CalendarScreen() { const contextEventSummary = useMemo(() => { if (events.events.length === 0) return "No events for this day"; const next = events.events[0]; + if (!next) return "No events for this day"; return `Next: ${next.timeLabel} — ${next.title}`; }, [events.events]); @@ -455,6 +456,7 @@ export default function CalendarScreen() { if (!selectedLook) return null; const planned = lookToPlanned(selectedLook); const next = await setPlanned(uid, selectedDayKey, planned); + if (!next) return null; setRecord(next); return next.plannedOutfit ?? null; }, [record?.plannedOutfit, selectedDayKey, selectedLook, uid]); diff --git a/eslint.config.js b/eslint.config.js index 5025da6..0fb026d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,8 +3,8 @@ const { defineConfig } = require('eslint/config'); const expoConfig = require('eslint-config-expo/flat'); module.exports = defineConfig([ - expoConfig, { - ignores: ['dist/*'], + ignores: ['dist/**', '.expo/**', 'functions/lib/**'], }, + expoConfig, ]); diff --git a/src/addItem/sections/DetailsStep.tsx b/src/addItem/sections/DetailsStep.tsx index eca2510..dc59b4d 100644 --- a/src/addItem/sections/DetailsStep.tsx +++ b/src/addItem/sections/DetailsStep.tsx @@ -193,13 +193,11 @@ export const DetailsStep = React.memo(function DetailsStep({ controller }: { con { actions.markUserEdited("displayColor"); actions.setDisplayColor(value); }} placeholder="e.g., light blue" - autoCapitalize="words" /> {state.displayColors.length ? ( diff --git a/src/components/FloatingGlassTabBar.tsx b/src/components/FloatingGlassTabBar.tsx index 1525da2..98696c8 100644 --- a/src/components/FloatingGlassTabBar.tsx +++ b/src/components/FloatingGlassTabBar.tsx @@ -22,6 +22,10 @@ const TAB_META: Record state.routes.filter((route) => { - const options = descriptors[route.key]?.options; + const options = descriptors[route.key]?.options as ExpoRouterTabOptions | undefined; if (options?.href === null) return false; return !!TAB_META[route.name]; }), diff --git a/src/components/home/AuraLookModule.tsx b/src/components/home/AuraLookModule.tsx index 8477678..e084137 100644 --- a/src/components/home/AuraLookModule.tsx +++ b/src/components/home/AuraLookModule.tsx @@ -109,7 +109,7 @@ export default function AuraLookModule({ ) : null} - + ); } diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts index 346918c..f9a6978 100644 --- a/src/lib/firebase.ts +++ b/src/lib/firebase.ts @@ -1,6 +1,6 @@ import { initializeApp, getApps, getApp } from "firebase/app"; import AsyncStorage from "@react-native-async-storage/async-storage"; -import { initializeAuth, getReactNativePersistence } from "firebase/auth"; +import { initializeAuth, type Persistence } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; import { getStorage } from "firebase/storage"; @@ -15,8 +15,47 @@ const firebaseConfig = { export const app = getApps().length ? getApp() : initializeApp(firebaseConfig); +function getAsyncStoragePersistence(storage: typeof AsyncStorage): Persistence { + return class ReactNativeAsyncStoragePersistence { + static type = "LOCAL" as const; + readonly type = "LOCAL" as const; + + async _isAvailable() { + try { + const testKey = "__firebase_auth_storage_test__"; + await storage.setItem(testKey, "1"); + await storage.removeItem(testKey); + return true; + } catch { + return false; + } + } + + _set(key: string, value: unknown) { + return storage.setItem(key, JSON.stringify(value)); + } + + async _get(key: string): Promise { + const value = await storage.getItem(key); + return value ? (JSON.parse(value) as T) : null; + } + + _remove(key: string) { + return storage.removeItem(key); + } + + _addListener() { + return; + } + + _removeListener() { + return; + } + } as unknown as Persistence; +} + export const auth = initializeAuth(app, { - persistence: getReactNativePersistence(AsyncStorage), + persistence: getAsyncStoragePersistence(AsyncStorage), }); export const db = getFirestore(app); export const storage = getStorage(app); diff --git a/src/profile/screens.tsx b/src/profile/screens.tsx index 0031268..8821fd2 100644 --- a/src/profile/screens.tsx +++ b/src/profile/screens.tsx @@ -1,6 +1,6 @@ import { router } from "expo-router"; import { signOut } from "firebase/auth"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { ActivityIndicator, Alert, @@ -66,6 +66,16 @@ const SHOE_SIZE_OPTIONS = { EU: ["EU 38", "EU 39", "EU 40", "EU 41", "EU 42", "EU 43", "EU 44", "EU 45", "EU 46", "EU 47"], } as const; +const TOP_FIT_OPTIONS = ["slim", "regular", "relaxed", "oversized"] as const; +const OUTERWEAR_FIT_OPTIONS = ["slim", "regular", "roomy"] as const; +const BOTTOM_RISE_OPTIONS = ["low", "mid", "high"] as const; +const BOTTOM_LEG_OPTIONS = ["skinny", "slim", "straight", "tapered", "wide"] as const; +const SHOE_FIT_OPTIONS = ["true_to_size", "half_up", "half_down"] as const; +const LENGTH_UNIT_OPTIONS = ["cm", "in"] as const; +const WEIGHT_UNIT_OPTIONS = ["kg", "lb"] as const; +const SHOE_REGION_OPTIONS = ["US", "UK", "EU"] as const; +const CLOTHING_REGION_OPTIONS = ["US", "UK", "EU", "INTL"] as const; + function commaText(values?: string[]) { return Array.isArray(values) && values.length ? values.join(", ") : ""; } @@ -430,7 +440,7 @@ export function BodyFitScreen() { setProfile((prev) => ({ ...prev, @@ -441,7 +451,7 @@ export function BodyFitScreen() { setProfile((prev) => ({ ...prev, @@ -452,7 +462,7 @@ export function BodyFitScreen() { setProfile((prev) => ({ ...prev, @@ -463,7 +473,7 @@ export function BodyFitScreen() { setProfile((prev) => ({ ...prev, @@ -474,7 +484,7 @@ export function BodyFitScreen() { setProfile((prev) => ({ ...prev, @@ -508,21 +518,21 @@ export function DefaultSizesScreen() { return DEFAULT_SIZE_FIELDS.find((field) => field.key === activePicker)?.label ?? ""; }, [activePicker]); - const pickerOptions = useMemo(() => { + const pickerOptions = useMemo(() => { switch (activePicker) { case "top": case "outerwear": case "hoodie": case "formalShirt": - return ALPHA_SIZE_OPTIONS; + return [...ALPHA_SIZE_OPTIONS]; case "bottomWaist": - return BOTTOM_WAIST_OPTIONS; + return [...BOTTOM_WAIST_OPTIONS]; case "bottomLength": - return BOTTOM_LENGTH_OPTIONS; + return [...BOTTOM_LENGTH_OPTIONS]; case "jeans": return jeansOptions; case "shoes": - return SHOE_SIZE_OPTIONS[profile.units.shoeRegion] ?? SHOE_SIZE_OPTIONS.US; + return [...(SHOE_SIZE_OPTIONS[profile.units.shoeRegion] ?? SHOE_SIZE_OPTIONS.US)]; default: return []; } @@ -745,35 +755,35 @@ export function UnitsRegionScreen() { - setProfile((prev) => ({ ...prev, units: { ...prev.units, length: value as any } })) + setProfile((prev) => ({ ...prev, units: { ...prev.units, length: value } })) } /> - setProfile((prev) => ({ ...prev, units: { ...prev.units, weight: value as any } })) + setProfile((prev) => ({ ...prev, units: { ...prev.units, weight: value } })) } /> - setProfile((prev) => ({ ...prev, units: { ...prev.units, shoeRegion: value as any } })) + setProfile((prev) => ({ ...prev, units: { ...prev.units, shoeRegion: value } })) } /> setProfile((prev) => ({ ...prev, - units: { ...prev.units, clothingRegion: value as any }, + units: { ...prev.units, clothingRegion: value }, })) } /> @@ -1039,7 +1049,7 @@ function ProfileSelectorRow({ ); } -function ProfilePillField({ +function ProfilePillField({ label, value, options, @@ -1047,9 +1057,9 @@ function ProfilePillField({ labelFormatter, }: { label: string; - value: string; - options: string[]; - onSelect: (value: string) => void; + value: T | ""; + options: readonly T[]; + onSelect: (value: T) => void; labelFormatter?: (value: string) => string; }) { const { colors } = useAppTheme(); From fc4318e627af433bab7139ea1fe74ca1ecbba664 Mon Sep 17 00:00:00 2001 From: Athfan Date: Mon, 27 Apr 2026 02:05:57 -0500 Subject: [PATCH 10/93] feat: app shell, auth, onboarding, and base UI setup --- .gitignore | 1 + app.json | 8 +- app/(auth)/register.tsx | 3 +- app/(auth)/welcome.tsx | 88 +- app/(onboarding)/index.tsx | 1464 +++++++++++++++--------- app/_layout.tsx | 146 ++- assets/icon.png | Bin 0 -> 1330759 bytes constants/theme.ts | 222 ++-- src/components/FloatingGlassTabBar.tsx | 137 ++- src/components/auth/AuthScaffold.tsx | 115 +- src/constants/dock.ts | 23 +- src/hooks/useAppTheme.ts | 4 +- src/hooks/useResponsiveLayout.ts | 14 +- 13 files changed, 1457 insertions(+), 768 deletions(-) create mode 100644 assets/icon.png diff --git a/.gitignore b/.gitignore index 8d2729b..63f01dd 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ ios/ android/ ios.build/ android.build/ +.claude/ diff --git a/app.json b/app.json index b0d7a6f..4756d21 100644 --- a/app.json +++ b/app.json @@ -1,14 +1,15 @@ { "expo": { - "name": "closet", + "name": "AURA", "slug": "closet", "version": "1.0.0", "orientation": "portrait", - "icon": "./assets/images/icon.png", + "icon": "./assets/icon.png", "scheme": "closet", "userInterfaceStyle": "automatic", "newArchEnabled": true, "ios": { + "icon": "./assets/icon.png", "supportsTablet": true, "bundleIdentifier": "com.anonymous.closet", "deploymentTarget": "17.0", @@ -53,7 +54,8 @@ "deploymentTarget": "17.0" } } - ] + ], + "expo-audio" ], "experiments": { "typedRoutes": true, diff --git a/app/(auth)/register.tsx b/app/(auth)/register.tsx index 702c216..f944541 100644 --- a/app/(auth)/register.tsx +++ b/app/(auth)/register.tsx @@ -57,7 +57,7 @@ export default function RegisterScreen() { router.replace("/(auth)/login")} /> @@ -91,4 +91,3 @@ export default function RegisterScreen() { ); } - diff --git a/app/(auth)/welcome.tsx b/app/(auth)/welcome.tsx index d5141f4..4f33ac2 100644 --- a/app/(auth)/welcome.tsx +++ b/app/(auth)/welcome.tsx @@ -1,32 +1,74 @@ import { router } from "expo-router"; import React from "react"; -import { Text, View } from "react-native"; +import { Pressable, Text, View } from "react-native"; +import Animated, { Easing, FadeIn, FadeInDown, FadeInUp } from "react-native-reanimated"; -import { - AuthInlineLink, - AuthScaffold, - PrimaryAuthButton, - SecondaryAuthButton, -} from "@/src/components/auth/AuthScaffold"; +import { Fonts } from "@/constants/theme"; +import AuraGlowBackground from "@/src/components/aura/AuraGlowBackground"; +import AuraGradientButton from "@/src/components/aura/AuraGradientButton"; +import AuraLogoHero from "@/src/components/aura/AuraLogoHero"; +import { SafeScreen } from "@/src/components/SafeScreen"; +import { useAppTheme } from "@/src/hooks/useAppTheme"; export default function WelcomeScreen() { + const { colors, theme } = useAppTheme(); + return ( - - router.push("/(auth)/forgot-password")} /> - - No split UI. One premium experience, adapted through your style profile. - + + + + + + + + + + + + + Your personal AI stylist. + + + + + + router.push("/(auth)/register")} /> + + router.push("/(auth)/login")} style={({ pressed }) => ({ opacity: pressed ? 0.72 : 1 })}> + + Already have an account? Sign In + + + router.push("/(auth)/forgot-password")} style={({ pressed }) => ({ opacity: pressed ? 0.72 : 1 })}> + + Forgot password + + + + - } - > - router.push("/(auth)/login")} /> - router.push("/(auth)/register")} /> - + + ); } - diff --git a/app/(onboarding)/index.tsx b/app/(onboarding)/index.tsx index 4812f4d..652a06e 100644 --- a/app/(onboarding)/index.tsx +++ b/app/(onboarding)/index.tsx @@ -1,25 +1,31 @@ +import Slider from "@react-native-community/slider"; import { router } from "expo-router"; -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { - Alert, ActivityIndicator, + Alert, KeyboardAvoidingView, + LayoutChangeEvent, + NativeScrollEvent, + NativeSyntheticEvent, Platform, Pressable, ScrollView, + StyleSheet, Text, TextInput, View, + useWindowDimensions, } from "react-native"; +import { Gesture, GestureDetector } from "react-native-gesture-handler"; +import Animated, { Easing, FadeInUp, runOnJS } from "react-native-reanimated"; import { SafeScreen } from "@/src/components/SafeScreen"; import { useAuth } from "@/src/hooks/useAuth"; import { useAppTheme } from "@/src/hooks/useAppTheme"; import { - getAdaptiveSizeFields, - normalizeProfileSizePayload, ONBOARDING_CATEGORY_OPTIONS, - shouldShowAdvancedBraSize, + normalizeProfileSizePayload, } from "@/src/lib/adaptiveSizing"; import { EMPTY_USER_PROFILE_PREFERENCES, @@ -27,9 +33,44 @@ import { saveUserAccountProfile, saveUserProfilePreferences, } from "@/src/lib/userProfile"; -import type { UserProfilePreferences } from "@/src/types/UserProfilePreferences"; +import type { + UnitsPreference, + UserProfilePreferences, + WardrobeMode, +} from "@/src/types/UserProfilePreferences"; + +const WARDROBE_MODE_CARDS: { + value: Exclude; + icon: string; + label: string; + description: string; +}[] = [ + { + value: "masculine", + icon: "M", + label: "Masculine", + description: "Menswear cuts and silhouettes", + }, + { + value: "feminine", + icon: "F", + label: "Feminine", + description: "Womenswear cuts and silhouettes", + }, + { + value: "neutral", + icon: "N", + label: "Neutral", + description: "Unisex and gender-neutral pieces", + }, + { + value: "mixed", + icon: "A", + label: "Mixed", + description: "Across all categories freely", + }, +]; -const WARDROBE_MODES = ["masculine", "feminine", "neutral", "mixed", "custom"] as const; const STYLE_OPTIONS = [ "streetwear", "casual", @@ -42,17 +83,7 @@ const STYLE_OPTIONS = [ "vintage", "edgy", ] as const; -const FIT_OPTIONS = ["slim", "regular", "relaxed", "oversized"] as const; -const ACCESSORY_OPTIONS = [ - "watches", - "jewelry", - "handbags", - "caps", - "belts", - "scarves", - "perfumes", - "sunglasses", -] as const; + const OCCASION_OPTIONS = [ "daily", "work", @@ -63,37 +94,12 @@ const OCCASION_OPTIONS = [ "travel", "formal_events", ] as const; -const GOAL_OPTIONS = [ - "outfit_suggestions", - "shopping_suggestions", - "packing_help", - "laundry_reminders", - "styling_confidence", -] as const; -const COLOR_OPTIONS = [ - "black", - "white", - "navy", - "blue", - "grey", - "brown", - "beige", - "green", - "olive", - "red", - "pink", - "cream", -] as const; -type StepKey = - | "basics" - | "wardrobeMode" - | "categories" - | "style" - | "body" - | "sizes" - | "preferences" - | "goals"; +const FIT_OPTIONS = ["slim", "regular", "relaxed", "oversized"] as const; +const SHOE_SIZES_EU = Array.from({ length: 14 }, (_, index) => 35 + index); +const IMPERIAL_REGIONS = new Set(["US", "LR", "MM"]); + +type StepKey = "wardrobeMode" | "style" | "categories" | "profile"; type Step = { key: StepKey; @@ -102,78 +108,104 @@ type Step = { }; const STEPS: Step[] = [ - { - key: "basics", - title: "Set your foundation", - subtitle: "Tell Wardrobe AI how to size, greet, and localize your experience.", - }, { key: "wardrobeMode", - title: "Choose your wardrobe mode", - subtitle: "This shapes organization, sizing emphasis, and styling logic, not a separate UI.", - }, - { - key: "categories", - title: "Choose what you actually wear", - subtitle: "We’ll only ask size questions for categories that matter to your real wardrobe.", + title: "How do you dress?", + subtitle: "Choose the wardrobe language AURA should use for silhouettes and styling.", }, { key: "style", - title: "Define your style direction", - subtitle: "Pick the aesthetics you want AURA to lean into most.", - }, - { - key: "body", - title: "Add body & fit context", - subtitle: "This helps with fit-based sizing and better silhouette recommendations.", - }, - { - key: "sizes", - title: "Save your default sizes", - subtitle: "These defaults prefill new items and make shopping guidance more useful.", + title: "What's your style?", + subtitle: "Pick up to three aesthetics, then add where you usually dress up.", }, { - key: "preferences", - title: "Tune preferences", - subtitle: "Set colors, accessories, and occasions so recommendations feel more personal.", + key: "categories", + title: "What's in your wardrobe?", + subtitle: "AURA will only suggest items in these categories.", }, { - key: "goals", - title: "Choose what Wardrobe AI should help with first", - subtitle: "This changes what shows up first in Home, Closet, and AURA.", + key: "profile", + title: "Quick profile", + subtitle: "A few fit basics so AURA can personalize recommendations without the long form.", }, ]; function toggleValue(list: string[], value: string) { - return list.includes(value) ? list.filter((entry) => entry !== value) : [...list, value]; + return list.includes(value) + ? list.filter((entry) => entry !== value) + : [...list, value]; } function humanize(value: string) { return value.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); } -function chipSelected(selected: string[] | undefined, value: string) { - return Array.isArray(selected) && selected.includes(value); +function getLocaleParts() { + const locale = + Intl.DateTimeFormat().resolvedOptions().locale || + (typeof navigator !== "undefined" ? navigator.language : "") || + "en-US"; + const region = locale.split("-").find((part) => part.length === 2)?.toUpperCase() ?? "US"; + const unitsPreference: UnitsPreference = IMPERIAL_REGIONS.has(region) ? "imperial" : "metric"; + return { locale, region, unitsPreference }; } -function sizeSectionTitle(key: string) { - if (key === "tops") return "Tops"; - if (key === "outerwear") return "Outerwear"; - if (key === "bottoms" || key === "bottomsWaist" || key === "bottomsLength") return "Bottoms"; - if (key === "dresses") return "Dresses"; - if (key === "skirts") return "Skirts"; - if (key === "shoes") return "Footwear"; - return "Sizing"; +function unitsForPreference(unitsPreference: UnitsPreference) { + if (unitsPreference === "imperial") { + return { length: "in", weight: "lb", shoeRegion: "US", clothingRegion: "US" } as const; + } + return { length: "cm", weight: "kg", shoeRegion: "EU", clothingRegion: "INTL" } as const; +} + +function formatHeight(value: number, unitsPreference: UnitsPreference) { + if (unitsPreference === "imperial") { + const feet = Math.floor(value / 12); + const inches = value % 12; + return `${feet}'${inches}"`; + } + return `${value} cm`; +} + +function euShoeConversion(euSize: number) { + const usMen = Math.max(1, euSize - 33.5); + const usWomen = Math.max(1, euSize - 31); + const uk = Math.max(1, euSize - 34); + return `US M ${formatShoeHalf(usMen)} / US W ${formatShoeHalf(usWomen)} / UK ${formatShoeHalf(uk)}`; +} + +function formatShoeHalf(value: number) { + return Number.isInteger(value) ? String(value) : value.toFixed(1); +} + +function shoeValueFromDraft(draft: UserProfilePreferences) { + const raw = String(draft.defaultSizes.shoes ?? "").match(/\d+/)?.[0]; + const next = raw ? Number(raw) : 42; + return SHOE_SIZES_EU.includes(next) ? next : 42; } export default function OnboardingScreen() { const { user } = useAuth(); const { colors } = useAppTheme(); + const { width } = useWindowDimensions(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); + const [autoAdvancing, setAutoAdvancing] = useState(false); const [stepIndex, setStepIndex] = useState(0); - const [advancedFitOpen, setAdvancedFitOpen] = useState(false); const [draft, setDraft] = useState(EMPTY_USER_PROFILE_PREFERENCES); + const autoAdvanceTimer = useRef | null>(null); + + const detected = useMemo(() => getLocaleParts(), []); + const step = STEPS[stepIndex]; + const progress = (stepIndex + 1) / STEPS.length; + const isFirstStep = step.key === "wardrobeMode"; + const canContinue = + step.key === "style" + ? draft.styleAesthetics.length > 0 + : step.key === "categories" + ? draft.selectedCategories.length > 0 + : step.key === "profile" + ? Boolean((draft.firstName ?? "").trim()) && Boolean(draft.preferredFit) + : true; useEffect(() => { let cancelled = false; @@ -181,65 +213,109 @@ export default function OnboardingScreen() { router.replace("/(auth)/welcome"); return; } + void loadUserProfilePreferences(user.uid) .then((profile) => { if (cancelled) return; - setDraft((prev) => ({ - ...prev, + const unitsPreference = profile.onboardingCompleted + ? profile.unitsPreference + : detected.unitsPreference; + const heightDefault = unitsPreference === "imperial" ? 67 : 170; + setDraft({ + ...EMPTY_USER_PROFILE_PREFERENCES, ...profile, - firstName: profile.firstName ?? prev.firstName ?? user.displayName ?? "", - })); + region: profile.region ?? detected.region, + unitsPreference, + units: unitsForPreference(unitsPreference), + firstName: + profile.firstName ?? + user.displayName?.split(" ")[0] ?? + user.email?.split("@")[0] ?? + "", + body: { + ...profile.body, + height: profile.body.height ?? profile.height.value ?? heightDefault, + }, + height: { + value: profile.height.value ?? profile.body.height ?? heightDefault, + unit: unitsPreference === "imperial" ? "ft_in" : "cm", + }, + defaultSizes: { + ...profile.defaultSizes, + shoes: profile.defaultSizes.shoes ?? "EU 42", + }, + preferredFit: profile.preferredFit ?? "regular", + }); }) .finally(() => { if (!cancelled) setLoading(false); }); + return () => { cancelled = true; + if (autoAdvanceTimer.current) clearTimeout(autoAdvanceTimer.current); }; - }, [user?.displayName, user?.uid]); + }, [detected.region, detected.unitsPreference, user?.displayName, user?.email, user?.uid]); - const step = STEPS[stepIndex]; - const progress = (stepIndex + 1) / STEPS.length; + const units = useMemo( + () => unitsForPreference(draft.unitsPreference), + [draft.unitsPreference], + ); - const units = useMemo(() => { - if (draft.unitsPreference === "imperial") { - return { length: "in", weight: "lb", shoeRegion: "US", clothingRegion: "US" } as const; - } - return { length: "cm", weight: "kg", shoeRegion: "EU", clothingRegion: "INTL" } as const; - }, [draft.unitsPreference]); + function goToStep(nextIndex: number) { + setStepIndex(Math.max(0, Math.min(nextIndex, STEPS.length - 1))); + } - const adaptiveSizeFields = useMemo( - () => getAdaptiveSizeFields(draft.selectedCategories, draft.wardrobeMode), - [draft.selectedCategories, draft.wardrobeMode] - ); - const shouldRenderBraSize = useMemo( - () => shouldShowAdvancedBraSize(draft.selectedCategories, draft.wardrobeMode), - [draft.selectedCategories, draft.wardrobeMode] - ); - const groupedAdaptiveSizeFields = useMemo(() => { - const groups = new Map(); - adaptiveSizeFields.forEach((field) => { - const section = sizeSectionTitle(field.key); - const current = groups.get(section) ?? []; - current.push(field); - groups.set(section, current); - }); - return Array.from(groups.entries()).map(([title, fields]) => ({ title, fields })); - }, [adaptiveSizeFields]); + function goBack() { + if (stepIndex > 0) goToStep(stepIndex - 1); + } + + function selectWardrobeMode(value: Exclude) { + setDraft((prev) => ({ ...prev, wardrobeMode: value })); + setAutoAdvancing(true); + if (autoAdvanceTimer.current) clearTimeout(autoAdvanceTimer.current); + autoAdvanceTimer.current = setTimeout(() => { + setAutoAdvancing(false); + goToStep(1); + }, 400); + } async function onFinish() { if (!user?.uid) return; try { setSaving(true); - const normalizedSizingDraft = normalizeProfileSizePayload(draft); + const normalizedSizingDraft = normalizeProfileSizePayload({ + ...draft, + region: draft.region ?? detected.region, + units, + favoriteColors: [], + avoidedColors: [], + accessoryPreferences: [], + goals: ["outfit_suggestions"], + defaultSizes: { + ...draft.defaultSizes, + shoes: draft.defaultSizes.shoes ?? "EU 42", + }, + }); + + const heightValue = + normalizedSizingDraft.body.height ?? + normalizedSizingDraft.height.value ?? + (draft.unitsPreference === "imperial" ? 67 : 170); + const profileToSave: UserProfilePreferences = { ...normalizedSizingDraft, onboardingCompleted: true, + region: normalizedSizingDraft.region ?? detected.region, + unitsPreference: draft.unitsPreference, units, - favoriteColors: normalizedSizingDraft.favoriteColors, - avoidedColors: normalizedSizingDraft.avoidedColors, + favoriteColors: [], + avoidedColors: [], + accessoryPreferences: [], + goals: ["outfit_suggestions"], defaultSizes: { ...normalizedSizingDraft.defaultSizes, + shoes: normalizedSizingDraft.defaultSizes.shoes ?? "EU 42", top: normalizedSizingDraft.defaultSizes.top ?? normalizedSizingDraft.defaultSizes.tops ?? @@ -271,18 +347,32 @@ export default function OnboardingScreen() { null, }, height: { - value: normalizedSizingDraft.body.height ?? null, + value: heightValue, unit: draft.unitsPreference === "imperial" ? "ft_in" : "cm", }, weight: { - value: normalizedSizingDraft.body.weight ?? null, + value: null, unit: draft.unitsPreference === "imperial" ? "lb" : "kg", }, + body: { + ...normalizedSizingDraft.body, + height: heightValue, + weight: null, + }, + advancedFit: { + bust: null, + waistMeasurement: null, + hips: null, + inseam: null, + shoulderWidth: null, + sleeveLength: null, + braSize: null, + }, stylePreferences: { ...normalizedSizingDraft.stylePreferences, preferredStyles: normalizedSizingDraft.styleAesthetics, - favoriteColors: normalizedSizingDraft.favoriteColors, - avoidedColors: normalizedSizingDraft.avoidedColors, + favoriteColors: [], + avoidedColors: [], }, fitPreferences: { ...normalizedSizingDraft.fitPreferences, @@ -292,10 +382,15 @@ export default function OnboardingScreen() { null, }, }; + await Promise.all([ saveUserProfilePreferences(user.uid, profileToSave), saveUserAccountProfile(user.uid, { - name: (draft.firstName ?? "").trim() || user.displayName || user.email?.split("@")[0] || null, + name: + (draft.firstName ?? "").trim() || + user.displayName || + user.email?.split("@")[0] || + null, }), ]); router.replace("/(tabs)"); @@ -305,424 +400,506 @@ export default function OnboardingScreen() { } function nextStep() { - if (step.key === "categories" && draft.selectedCategories.length === 0) { - Alert.alert( - "Choose a few categories", - "Pick the clothing categories you actually wear so we can tailor the size questions." - ); - return; - } - if (step.key === "sizes") { - const missingRequiredFields = adaptiveSizeFields - .filter((field) => field.required) - .filter((field) => { - const value = draft.defaultSizes[field.key]; - return !String(value ?? "").trim(); - }); - if (missingRequiredFields.length > 0) { - Alert.alert( - "Finish the key sizes", - `Add ${missingRequiredFields[0].label.toLowerCase()} so Wardrobe AI can size recommendations more accurately.` - ); - return; + if (!canContinue) { + if (step.key === "style") { + Alert.alert("Choose your style", "Pick at least one style aesthetic."); + } else if (step.key === "categories") { + Alert.alert("Choose categories", "Pick the categories you actually wear."); + } else if (step.key === "profile") { + Alert.alert("Finish your profile", "Add your name and choose a preferred fit."); } + return; } + if (stepIndex === STEPS.length - 1) { void onFinish(); return; } - setStepIndex((current) => Math.min(current + 1, STEPS.length - 1)); + goToStep(stepIndex + 1); } + const swipeGesture = Gesture.Pan() + .activeOffsetX([-999, 24]) + .failOffsetY([-18, 18]) + .onEnd((event) => { + if (event.translationX > 84 && event.velocityX > 250) { + runOnJS(goBack)(); + } + }); + if (loading) { return ( - - - - Preparing your style profile… - + + + + Preparing your style profile... + ); } return ( - - - + + - - - WARDROBE AI SETUP - - - + + AURA SETUP + + - {step.title} - {step.subtitle} + {step.title} + {step.subtitle} - - {step.key === "basics" ? ( - <> - setDraft((prev) => ({ ...prev, firstName: value }))} - placeholder="What should AURA call you?" - /> - setDraft((prev) => ({ ...prev, region: value }))} - placeholder="e.g. United States" - /> - setDraft((prev) => ({ ...prev, unitsPreference: value as UserProfilePreferences["unitsPreference"] }))} + + {step.key === "wardrobeMode" ? ( + - - ) : null} - - {step.key === "wardrobeMode" ? ( - setDraft((prev) => ({ ...prev, wardrobeMode: value as UserProfilePreferences["wardrobeMode"] }))} - /> - ) : null} - - {step.key === "categories" ? ( - - setDraft((prev) => ({ - ...prev, - selectedCategories: toggleValue(prev.selectedCategories, value), - })) - } - /> - ) : null} - - {step.key === "style" ? ( - - setDraft((prev) => ({ - ...prev, - styleAesthetics: toggleValue(prev.styleAesthetics, value), - })) - } - /> - ) : null} - - {step.key === "body" ? ( - <> - + ) : null} + + {step.key === "style" ? ( + setDraft((prev) => ({ ...prev, - body: { ...prev.body, height: value ? Number(value) : null }, + styleAesthetics: toggleValue(prev.styleAesthetics, value), })) } - keyboardType="numeric" - /> - + onOccasionToggle={(value) => setDraft((prev) => ({ ...prev, - body: { ...prev.body, weight: value ? Number(value) : null }, + occasionPriority: toggleValue(prev.occasionPriority, value), })) } - keyboardType="numeric" /> - setDraft((prev) => ({ ...prev, preferredFit: value as UserProfilePreferences["preferredFit"] }))} - /> - - ) : null} - - {step.key === "sizes" ? ( - <> - - We'll tailor sizing to what you actually wear. Core sizes stay upfront, and deeper fit details are always optional. - + ) : null} - {groupedAdaptiveSizeFields.map((group) => ( - - - {group.title.toUpperCase()} - - {group.fields.map((field) => ( - - setDraft((prev) => { - const nextDefaultSizes = { ...prev.defaultSizes, [field.key]: value }; - if (field.key === "tops") nextDefaultSizes.top = value; - if (field.key === "bottoms") { - nextDefaultSizes.bottomWaist = - nextDefaultSizes.bottomWaist ?? value; - } - if (field.key === "bottomsWaist") { - nextDefaultSizes.bottomWaist = value; - nextDefaultSizes.bottomsWaist = value; - } - if (field.key === "bottomsLength") nextDefaultSizes.bottomLength = value; - return { - ...prev, - defaultSizes: nextDefaultSizes, - }; - }) - } - placeholder={field.placeholder} - /> - ))} - - ))} - - - setAdvancedFitOpen((current) => !current)} - style={({ pressed }) => ({ - paddingHorizontal: 16, - paddingVertical: 14, - opacity: pressed ? 0.84 : 1, - gap: 4, - })} - > - - Advanced fit details - - - Optional measurements for more precise tailoring and styling. - - - - {advancedFitOpen ? ( - - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, bust: value }, - })) - } - /> - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, waistMeasurement: value }, - })) - } - /> - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, hips: value }, - })) - } - /> - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, inseam: value }, - })) - } - /> - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, shoulderWidth: value }, - })) - } - /> - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, sleeveLength: value }, - })) - } - /> - {shouldRenderBraSize ? ( - - setDraft((prev) => ({ - ...prev, - advancedFit: { ...prev.advancedFit, braSize: value }, - })) - } - /> - ) : null} - - ) : null} - - - ) : null} - - {step.key === "preferences" ? ( - <> - - setDraft((prev) => ({ ...prev, favoriteColors: toggleValue(prev.favoriteColors, value) })) - } - /> - - setDraft((prev) => ({ ...prev, avoidedColors: toggleValue(prev.avoidedColors, value) })) - } - /> - setDraft((prev) => ({ ...prev, - accessoryPreferences: toggleValue(prev.accessoryPreferences, value), + selectedCategories: toggleValue(prev.selectedCategories, value), })) } - /> - - setDraft((prev) => ({ - ...prev, - occasionPriority: toggleValue(prev.occasionPriority, value), - })) + onSetAll={(selectedCategories) => + setDraft((prev) => ({ ...prev, selectedCategories })) } /> - - ) : null} - - {step.key === "goals" ? ( - - setDraft((prev) => ({ ...prev, goals: toggleValue(prev.goals, value) })) - } - /> - ) : null} - - - - + ) : null} + + {step.key === "profile" ? ( + + ) : null} + + + + {!isFirstStep ? ( + + [ + styles.primaryButton, + { + backgroundColor: colors.aiAccent, + opacity: saving || !canContinue ? 0.45 : pressed ? 0.86 : 1, + }, + ]} + > + + {stepIndex === STEPS.length - 1 + ? saving + ? "Saving..." + : "Finish setup" + : "Continue"} + + + [ + styles.backButton, + { opacity: pressed ? 0.72 : 1 }, + ]} + > + Back + + + ) : null} + + + + ); +} + +function WardrobeModeStep({ + selected, + disabled, + onSelect, +}: { + selected: WardrobeMode; + disabled: boolean; + onSelect: (value: Exclude) => void; +}) { + const { colors } = useAppTheme(); + return ( + + {WARDROBE_MODE_CARDS.map((card) => { + const active = selected === card.value; + return ( ({ - borderRadius: 18, - paddingVertical: 16, - alignItems: "center", - justifyContent: "center", - backgroundColor: colors.aiAccent, - opacity: saving ? 0.55 : pressed ? 0.86 : 1, - })} + key={card.value} + onPress={() => onSelect(card.value)} + disabled={disabled} + style={({ pressed }) => [ + styles.modeCard, + { + backgroundColor: active ? "rgba(255,255,255,0.05)" : "#1A1A1A", + borderColor: active ? "rgba(255,255,255,0.92)" : "transparent", + borderWidth: active ? 2 : 0, + opacity: pressed ? 0.86 : 1, + }, + ]} > - - {stepIndex === STEPS.length - 1 ? (saving ? "Saving..." : "Finish setup") : "Continue"} + {card.icon} + {card.label} + + {card.description} - {stepIndex > 0 ? ( - setStepIndex((current) => Math.max(current - 1, 0))} - style={({ pressed }) => ({ alignItems: "center", paddingVertical: 8, opacity: pressed ? 0.72 : 1 })} - > - Back - - ) : null} + ); + })} + + ); +} + +function StyleStep({ + styleAesthetics, + occasionPriority, + onStyleToggle, + onOccasionToggle, +}: { + styleAesthetics: string[]; + occasionPriority: string[]; + onStyleToggle: (value: string) => void; + onOccasionToggle: (value: string) => void; +}) { + const capped = styleAesthetics.length >= 3; + return ( + + + {styleAesthetics.length}/3 selected + + capped && !styleAesthetics.includes(value)} + /> + + + + ); +} + +function CategoriesStep({ + selected, + onToggle, + onSetAll, +}: { + selected: string[]; + onToggle: (value: string) => void; + onSetAll: (value: string[]) => void; +}) { + const { colors } = useAppTheme(); + const allSelected = selected.length === ONBOARDING_CATEGORY_OPTIONS.length; + return ( + + + + + What do you actually wear? + + + AURA will only suggest items in these categories + - - + onSetAll(allSelected ? [] : [...ONBOARDING_CATEGORY_OPTIONS])} + style={({ pressed }) => [ + styles.selectAllButton, + { + borderColor: "rgba(255,255,255,0.12)", + opacity: pressed ? 0.72 : 1, + }, + ]} + > + + {allSelected ? "Clear all" : "Select all"} + + + + + + ); +} + +function QuickProfileStep({ + draft, + width, + onDraftChange, +}: { + draft: UserProfilePreferences; + width: number; + onDraftChange: React.Dispatch>; +}) { + const { colors } = useAppTheme(); + const heightMin = draft.unitsPreference === "imperial" ? 55 : 140; + const heightMax = draft.unitsPreference === "imperial" ? 84 : 215; + const heightValue = + draft.body.height ?? + draft.height.value ?? + (draft.unitsPreference === "imperial" ? 67 : 170); + const shoeValue = shoeValueFromDraft(draft); + + return ( + + + onDraftChange((prev) => ({ ...prev, firstName: value })) + } + placeholder="First name" + /> + + + Height + + onDraftChange((prev) => ({ + ...prev, + body: { ...prev.body, height: value }, + height: { + value, + unit: prev.unitsPreference === "imperial" ? "ft_in" : "cm", + }, + })) + } + /> + + + + Shoe size + + onDraftChange((prev) => ({ + ...prev, + defaultSizes: { ...prev.defaultSizes, shoes: `EU ${value}` }, + })) + } + /> + + + + onDraftChange((prev) => ({ + ...prev, + preferredFit: value as UserProfilePreferences["preferredFit"], + })) + } + singleSelect + /> + + ); +} + +function HeightSlider({ + min, + max, + value, + unitsPreference, + onChange, +}: { + min: number; + max: number; + value: number; + unitsPreference: UnitsPreference; + onChange: (value: number) => void; +}) { + const { colors } = useAppTheme(); + const [trackWidth, setTrackWidth] = useState(0); + const clamped = Math.max(min, Math.min(max, Math.round(value))); + const progress = (clamped - min) / (max - min); + const pillLeft = trackWidth > 0 ? progress * Math.max(trackWidth - 64, 1) : 0; + + return ( + setTrackWidth(event.nativeEvent.layout.width)} + > + + + {formatHeight(clamped, unitsPreference)} + + + onChange(Math.round(next))} + style={styles.slider} + /> + + ); +} + +function ShoeSizePicker({ + value, + width, + onChange, +}: { + value: number; + width: number; + onChange: (value: number) => void; +}) { + const { colors } = useAppTheme(); + const itemWidth = 64; + const pickerWidth = Math.min(width - 40, 360); + const sidePadding = Math.max((pickerWidth - itemWidth) / 2, 0); + const scrollRef = useRef(null); + + useEffect(() => { + const index = SHOE_SIZES_EU.indexOf(value); + const id = requestAnimationFrame(() => { + scrollRef.current?.scrollTo({ x: Math.max(index, 0) * itemWidth, animated: false }); + }); + return () => cancelAnimationFrame(id); + }, [itemWidth, value]); + + function updateFromOffset(offsetX: number) { + const index = Math.max( + 0, + Math.min(SHOE_SIZES_EU.length - 1, Math.round(offsetX / itemWidth)), + ); + const next = SHOE_SIZES_EU[index]; + if (next !== value) onChange(next); + } + + return ( + + + ) => + updateFromOffset(event.nativeEvent.contentOffset.x) + } + onMomentumScrollEnd={(event) => updateFromOffset(event.nativeEvent.contentOffset.x)} + scrollEventThrottle={16} + > + {SHOE_SIZES_EU.map((size) => { + const active = size === value; + return ( + + + {size} + + + ); + })} + + + EU {value} · {euShoeConversion(value)} + + ); } @@ -731,34 +908,30 @@ function OnboardingInput({ value, onChangeText, placeholder, - keyboardType, }: { label: string; value: string; onChangeText: (value: string) => void; placeholder?: string; - keyboardType?: "default" | "numeric"; }) { const { colors } = useAppTheme(); return ( - {label} + {label} ); @@ -769,34 +942,47 @@ function ChipGroup({ values, selected, onToggle, + disabledValue, + singleSelect, }: { - label: string; + label?: string; values: string[]; selected: string[]; onToggle: (value: string) => void; + disabledValue?: (value: string) => boolean; + singleSelect?: boolean; }) { const { colors } = useAppTheme(); return ( - {label} - + {label ? {label} : null} + {values.map((value) => { - const active = chipSelected(selected, value); + const active = selected.includes(value); + const disabled = disabledValue?.(value) ?? false; return ( onToggle(value)} - style={({ pressed }) => ({ - paddingHorizontal: 14, - paddingVertical: 10, - borderRadius: 999, - backgroundColor: active ? "rgba(143,216,255,0.18)" : "rgba(255,255,255,0.04)", - borderWidth: 1, - borderColor: active ? "rgba(143,216,255,0.4)" : "rgba(255,255,255,0.08)", - opacity: pressed ? 0.82 : 1, - })} + disabled={disabled} + onPress={() => { + if (singleSelect && active) return; + onToggle(value); + }} + style={({ pressed }) => [ + styles.chip, + { + backgroundColor: active ? "rgba(217,207,255,0.17)" : "rgba(255,255,255,0.04)", + borderColor: active ? "rgba(217,207,255,0.52)" : "rgba(255,255,255,0.08)", + opacity: disabled ? 0.5 : pressed ? 0.82 : 1, + }, + ]} > - + {humanize(value)} @@ -806,3 +992,215 @@ function ChipGroup({ ); } + +const styles = StyleSheet.create({ + screen: { + flex: 1, + }, + loadingScreen: { + flex: 1, + alignItems: "center", + justifyContent: "center", + gap: 12, + }, + loadingText: { + fontSize: 14, + fontWeight: "700", + }, + header: { + paddingHorizontal: 20, + paddingTop: 12, + gap: 10, + }, + eyebrow: { + fontSize: 12, + fontWeight: "800", + letterSpacing: 1.2, + }, + progressTrack: { + height: 6, + borderRadius: 999, + backgroundColor: "rgba(255,255,255,0.06)", + overflow: "hidden", + }, + progressFill: { + height: "100%", + borderRadius: 999, + }, + title: { + fontSize: 32, + lineHeight: 38, + fontWeight: "900", + }, + subtitle: { + fontSize: 15, + lineHeight: 22, + }, + content: { + flexGrow: 1, + paddingHorizontal: 20, + paddingTop: 22, + }, + stepBody: { + flex: 1, + }, + cardGrid: { + flexDirection: "row", + flexWrap: "wrap", + gap: 12, + }, + modeCard: { + width: "48%", + minHeight: 158, + borderRadius: 8, + padding: 16, + justifyContent: "space-between", + }, + modeIcon: { + fontSize: 24, + fontWeight: "900", + }, + modeLabel: { + fontSize: 19, + fontWeight: "900", + }, + modeDescription: { + fontSize: 13, + lineHeight: 18, + fontWeight: "600", + }, + sectionStack: { + gap: 22, + }, + sectionHeader: { + alignItems: "flex-start", + }, + sectionKicker: { + color: "rgba(255,255,255,0.54)", + fontSize: 12, + fontWeight: "800", + }, + sectionDivider: { + height: 1, + backgroundColor: "rgba(255,255,255,0.07)", + }, + sectionLabel: { + fontSize: 14, + fontWeight: "800", + }, + sectionSubtext: { + fontSize: 13, + lineHeight: 19, + }, + categoryHeader: { + flexDirection: "row", + alignItems: "flex-start", + gap: 12, + }, + selectAllButton: { + borderWidth: 1, + borderRadius: 999, + paddingHorizontal: 12, + paddingVertical: 8, + }, + selectAllText: { + fontSize: 12, + fontWeight: "900", + }, + chipWrap: { + flexDirection: "row", + flexWrap: "wrap", + gap: 10, + }, + chip: { + paddingHorizontal: 14, + paddingVertical: 10, + borderRadius: 999, + borderWidth: 1, + }, + chipText: { + fontWeight: "800", + fontSize: 13, + }, + controlSection: { + gap: 12, + }, + input: { + borderWidth: 1, + borderRadius: 18, + paddingHorizontal: 16, + paddingVertical: 15, + fontSize: 16, + }, + sliderWrap: { + paddingTop: 34, + }, + heightPill: { + position: "absolute", + top: 0, + minWidth: 64, + alignItems: "center", + borderRadius: 999, + borderWidth: 1, + paddingHorizontal: 10, + paddingVertical: 6, + }, + heightPillText: { + fontSize: 12, + fontWeight: "900", + }, + slider: { + width: "100%", + height: 44, + }, + pickerShell: { + alignSelf: "center", + gap: 8, + }, + pickerCenter: { + position: "absolute", + top: 0, + height: 56, + borderRadius: 8, + borderWidth: 1, + }, + shoeItem: { + height: 56, + alignItems: "center", + justifyContent: "center", + }, + shoeValue: { + fontWeight: "900", + }, + shoeConversion: { + textAlign: "center", + fontSize: 12, + fontWeight: "700", + }, + footer: { + paddingHorizontal: 20, + paddingTop: 12, + paddingBottom: 20, + gap: 10, + borderTopWidth: 1, + borderTopColor: "rgba(255,255,255,0.06)", + }, + primaryButton: { + borderRadius: 18, + paddingVertical: 16, + alignItems: "center", + justifyContent: "center", + }, + primaryButtonText: { + color: "#071018", + fontSize: 16, + fontWeight: "900", + }, + backButton: { + alignItems: "center", + paddingVertical: 8, + }, + backButtonText: { + fontWeight: "800", + }, +}); diff --git a/app/_layout.tsx b/app/_layout.tsx index c973c52..e5bd2ce 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,9 +1,17 @@ -import { DarkTheme, DefaultTheme, ThemeProvider } from "@react-navigation/native"; +import { DarkTheme, ThemeProvider } from "@react-navigation/native"; import { router, Stack, useSegments } from "expo-router"; import { StatusBar } from "expo-status-bar"; -import "react-native-reanimated"; -import { useEffect, useRef, useState } from "react"; -import { ActivityIndicator, Platform, Text, View } from "react-native"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { Platform, StyleSheet, View } from "react-native"; +import LottieView from "lottie-react-native"; +import Animated, { + Easing, + runOnJS, + useAnimatedStyle, + useReducedMotion, + useSharedValue, + withTiming, +} from "react-native-reanimated"; import { AuthProvider, useAuth } from "../src/contexts/AuthContext"; import { isVisionBackgroundRemovalAvailable } from "../src/bg/removeBackground"; @@ -11,16 +19,64 @@ import { loadUserProfilePreferences } from "../src/lib/userProfile"; import { useColorScheme } from "@/hooks/use-color-scheme"; import { Colors } from "@/constants/theme"; import { SafeAreaProvider } from "react-native-safe-area-context"; +import AuraRing, { RING_SIZE_LG } from "@/src/components/brand/AuraRing"; export const unstable_settings = { anchor: "(tabs)", }; +const LOADING_MESSAGES = [ + "Reading your style profile...", + "Mapping your wardrobe preferences...", + "Calibrating your AURA...", + "Almost ready...", +]; + +function BrandedLoadingScreen() { + const reducedMotion = useReducedMotion(); + const [messageIndex, setMessageIndex] = useState(0); + const opacity = useSharedValue(1); + const advanceMessage = useCallback(() => { + setMessageIndex((current) => (current + 1) % LOADING_MESSAGES.length); + }, []); + + useEffect(() => { + if (reducedMotion) return; + const interval = setInterval(() => { + opacity.value = withTiming(0, { duration: 300, easing: Easing.inOut(Easing.quad) }, (finished) => { + if (!finished) return; + runOnJS(advanceMessage)(); + opacity.value = withTiming(1, { duration: 300, easing: Easing.inOut(Easing.quad) }); + }); + }, 2000); + return () => clearInterval(interval); + }, [advanceMessage, opacity, reducedMotion]); + + const messageStyle = useAnimatedStyle(() => ({ + opacity: reducedMotion ? 1 : opacity.value, + })); + + return ( + + + + + {LOADING_MESSAGES[messageIndex]} + + + + + ); +} + function AuthGate() { const { user, loading } = useAuth(); const segments = useSegments(); - const colorScheme = useColorScheme(); - const palette = Colors[colorScheme === "dark" ? "dark" : "light"]; const [profileLoading, setProfileLoading] = useState(true); const [onboardingCompleted, setOnboardingCompleted] = useState(false); const isRevalidatingOnboarding = useRef(false); @@ -101,14 +157,7 @@ function AuthGate() { }, [loading, onboardingCompleted, profileLoading, segments, user]); if (loading || profileLoading) { - return ( - - - - {loading ? "Checking session…" : "Preparing your wardrobe profile…"} - - - ); + return ; } return ( @@ -116,6 +165,7 @@ function AuthGate() { + { if (Platform.OS !== "ios" || !__DEV__) return; @@ -168,7 +232,7 @@ export default function RootLayout() { - + ); diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e6594d2f8f587d1a0e9fe67a9c786a46b1056785 GIT binary patch literal 1330759 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 z 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⁡ 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�r4eDh%UFq0wGfI(!Wzr1KrcGl977|GGokAY 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 z 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 z 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%0DdCn7WvpU>IY*{OXc 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 CAQ&sd}J)GU(N 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%0Ae(LnbObRu65?%UjJOj$q{fEM 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�>S!7k`*IqE%HYG(H#1X=a$7+V0O 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 D!ITXt literal 0 HcmV?d00001 diff --git a/constants/theme.ts b/constants/theme.ts index 0fa7bd9..03e78d1 100644 --- a/constants/theme.ts +++ b/constants/theme.ts @@ -3,94 +3,168 @@ * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc. */ -import { Platform } from 'react-native'; +import { Platform } from "react-native"; -const tintColorLight = '#0a7ea4'; -const tintColorDark = '#8bd3ff'; +const tintColor = "#E9E3D5"; -export const Colors = { - light: { - background: '#f7f7f8', - surface: '#ffffff', - card: '#ffffff', - input: '#ffffff', - text: '#11181C', - textSecondary: '#64748b', - border: '#e5e7eb', - tint: tintColorLight, - accent: '#111827', - accentSoft: '#f5f8ff', - success: '#0a7a5a', - warning: '#b7791f', - danger: '#c0392b', - muted: '#f3f4f6', - shadow: 'rgba(15,23,42,0.12)', - overlay: 'rgba(255,255,255,0.16)', - glassBorder: 'rgba(255,255,255,0.30)', - glassInnerBorder: 'rgba(0,0,0,0.06)', - glassEdge: 'rgba(255,255,255,0.60)', - lens: 'rgba(255,255,255,0.22)', - lensInner: 'rgba(255,255,255,0.10)', - scrimTop: 'rgba(255,255,255,0)', - scrimMid: 'rgba(255,255,255,0.20)', - scrimBottom: 'rgba(255,255,255,0.36)', - dockIcon: 'rgba(15,23,42,0.55)', - aiAccent: '#6fbfff', - icon: '#687076', - tabIconDefault: '#687076', - tabIconSelected: tintColorLight, +const auraSpacing = { + xs: 4, + sm: 8, + md: 12, + lg: 16, + xl: 20, + xxl: 24, + xxxl: 32, +} as const; + +const auraTypography = { + eyebrow: { + fontSize: 12, + letterSpacing: 2.4, + fontWeight: "700" as const, + }, + body: { + fontSize: 15, + lineHeight: 22, + fontWeight: "500" as const, + }, + subtitle: { + fontSize: 17, + lineHeight: 26, + fontWeight: "500" as const, }, - dark: { - background: '#101215', - surface: '#171a1f', - card: '#1a1e24', - input: '#171a1f', - text: '#ECEDEE', - textSecondary: '#9aa4b2', - border: '#2b313a', - tint: tintColorDark, - accent: '#e5e7eb', - accentSoft: '#182233', - success: '#34d399', - warning: '#fbbf24', - danger: '#f87171', - muted: '#222833', - shadow: 'rgba(0,0,0,0.35)', - overlay: 'rgba(12,16,24,0.56)', - glassBorder: 'rgba(255,255,255,0.10)', - glassInnerBorder: 'rgba(255,255,255,0.05)', - glassEdge: 'rgba(255,255,255,0.12)', - lens: 'rgba(255,255,255,0.08)', - lensInner: 'rgba(255,255,255,0.04)', - scrimTop: 'rgba(16,18,21,0)', - scrimMid: 'rgba(16,18,21,0.26)', - scrimBottom: 'rgba(16,18,21,0.44)', - dockIcon: 'rgba(236,237,238,0.70)', - aiAccent: '#8fd8ff', - icon: '#9BA1A6', - tabIconDefault: '#9BA1A6', - tabIconSelected: tintColorDark, + title: { + fontSize: 34, + lineHeight: 40, + fontWeight: "700" as const, + }, + hero: { + fontSize: 46, + lineHeight: 52, + fontWeight: "700" as const, + }, + wordmark: { + fontSize: 28, + letterSpacing: 11, + fontWeight: "500" as const, + }, +} as const; + +const auraTokens = { + colors: { + background: "#080808", + surface: "rgba(15, 17, 22, 0.92)", + surfaceGlass: "rgba(24, 28, 36, 0.62)", + surface1: "#111111", + surface2: "#1A1A1A", + surface3: "#222222", + surfaceWarm: "#130F0A", + warmGlow: "rgba(200,160,120,0.04)", + textPrimary: "#F7F1E8", + textSecondary: "#AEA9B3", + borderSoft: "rgba(255, 245, 234, 0.11)", + auraPink: "#F3BEDD", + auraChampagne: "#F3DFC3", + auraBlue: "#B8D9FF", + auraLavender: "#D8C8FF", + iridescentStart: "#C084FC", + iridescentMid: "#A78BFA", + iridescentEnd: "#818CF8", }, -}; + gradients: { + aura: ["#F3DFC3", "#F3BEDD", "#D8C8FF", "#B8D9FF"] as const, + background: ["#020304", "#06080D", "#0A0D14"] as const, + }, + shadows: { + auraGlow: "rgba(214, 199, 255, 0.24)", + }, + radii: { + card: 28, + pill: 999, + button: 20, + }, + spacing: auraSpacing, + typography: auraTypography, +} as const; + +function buildPalette() { + return { + background: auraTokens.colors.background, + surface: "#11141A", + surfaceGlass: auraTokens.colors.surfaceGlass, + card: "rgba(16,18,24,0.92)", + input: "rgba(14,17,24,0.94)", + surface1: auraTokens.colors.surface1, + surface2: auraTokens.colors.surface2, + surface3: auraTokens.colors.surface3, + surfaceWarm: auraTokens.colors.surfaceWarm, + warmGlow: auraTokens.colors.warmGlow, + text: auraTokens.colors.textPrimary, + textPrimary: auraTokens.colors.textPrimary, + textSecondary: auraTokens.colors.textSecondary, + border: "rgba(255,245,234,0.09)", + borderSoft: auraTokens.colors.borderSoft, + tint: tintColor, + accent: "#EDE6D8", + accentSoft: "rgba(227,216,198,0.12)", + auraPink: auraTokens.colors.auraPink, + auraChampagne: auraTokens.colors.auraChampagne, + auraBlue: auraTokens.colors.auraBlue, + auraLavender: auraTokens.colors.auraLavender, + iridescentStart: auraTokens.colors.iridescentStart, + iridescentMid: auraTokens.colors.iridescentMid, + iridescentEnd: auraTokens.colors.iridescentEnd, + success: "#7BC8A4", + warning: "#D7B47E", + danger: "#F19999", + muted: "#1E232C", + shadow: "rgba(0,0,0,0.42)", + overlay: "rgba(7,9,13,0.58)", + glassBorder: "rgba(255,245,234,0.12)", + glassInnerBorder: "rgba(255,255,255,0.05)", + glassEdge: "rgba(255,255,255,0.14)", + lens: "rgba(255,255,255,0.10)", + lensInner: "rgba(255,255,255,0.04)", + scrimTop: "rgba(5,6,8,0)", + scrimMid: "rgba(5,6,8,0.22)", + scrimBottom: "rgba(5,6,8,0.46)", + dockIcon: "rgba(247,241,232,0.72)", + aiAccent: "#D9CFFF", + icon: "#B7B0BA", + tabIconDefault: "#9F99A2", + tabIconSelected: tintColor, + }; +} + +export const ThemeTokens = { + light: auraTokens, + dark: auraTokens, +} as const; + +export const Colors = { + light: buildPalette(), + dark: buildPalette(), +} as const; -export type AppColors = typeof Colors.light; +export type AppColors = typeof Colors.dark; +export type AppThemeTokens = typeof ThemeTokens.dark; export const Fonts = Platform.select({ ios: { /** iOS `UIFontDescriptorSystemDesignDefault` */ - sans: 'system-ui', + sans: "system-ui", /** iOS `UIFontDescriptorSystemDesignSerif` */ - serif: 'ui-serif', + serif: "ui-serif", /** iOS `UIFontDescriptorSystemDesignRounded` */ - rounded: 'ui-rounded', + rounded: "ui-rounded", /** iOS `UIFontDescriptorSystemDesignMonospaced` */ - mono: 'ui-monospace', + mono: "ui-monospace", }, default: { - sans: 'normal', - serif: 'serif', - rounded: 'normal', - mono: 'monospace', + sans: "normal", + serif: "serif", + rounded: "normal", + mono: "monospace", }, web: { sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif", diff --git a/src/components/FloatingGlassTabBar.tsx b/src/components/FloatingGlassTabBar.tsx index 98696c8..3cca598 100644 --- a/src/components/FloatingGlassTabBar.tsx +++ b/src/components/FloatingGlassTabBar.tsx @@ -4,6 +4,12 @@ import { LinearGradient } from 'expo-linear-gradient'; import type { BottomTabBarProps } from '@react-navigation/bottom-tabs'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Animated, Pressable, StyleSheet, Text, View } from 'react-native'; +import Reanimated, { + useAnimatedStyle, + useSharedValue, + withSpring, + withTiming, +} from 'react-native-reanimated'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { @@ -11,8 +17,10 @@ import { DOCK_ITEM_COUNT, DOCK_RADIUS, DOCK_SIDE_MARGIN, + floatingTabBarBottomInset, } from '../constants/dock'; import { useAppTheme } from '../hooks/useAppTheme'; +import { useReduceMotion } from '@/hooks/useReduceMotion'; const TAB_META: Record = { index: { label: 'Home', icon: 'home-outline' }, @@ -40,7 +48,7 @@ export default function FloatingGlassTabBar({ state, descriptors, navigation }: const insets = useSafeAreaInsets(); const [dockWidth, setDockWidth] = useState(0); const bubbleX = useRef(new Animated.Value(0)).current; - const dockBottom = Math.max(16, insets.bottom * 0.35); + const dockBottom = floatingTabBarBottomInset(insets.bottom); const visibleRoutes = useMemo( () => @@ -53,9 +61,14 @@ export default function FloatingGlassTabBar({ state, descriptors, navigation }: ); const currentKey = state.routes[state.index]?.key; + const currentRoute = state.routes[state.index]; + const hiddenRouteSourceTab = + (currentRoute?.params as { sourceTab?: string } | undefined)?.sourceTab ?? null; const focusedVisibleIndex = Math.max( 0, - visibleRoutes.findIndex((route) => route.key === currentKey) + visibleRoutes.findIndex( + (route) => route.key === currentKey || route.name === hiddenRouteSourceTab + ) ); const segmentWidth = dockWidth > 0 ? dockWidth / DOCK_ITEM_COUNT : 0; @@ -143,29 +156,16 @@ export default function FloatingGlassTabBar({ state, descriptors, navigation }: }; return ( - - - - {meta.label} - - + /> ); })} @@ -174,6 +174,92 @@ export default function FloatingGlassTabBar({ state, descriptors, navigation }: ); } +function TabBarItem({ + isFocused, + iconName, + iconSize, + label, + color, + onPress, + onLongPress, +}: { + isFocused: boolean; + iconName: keyof typeof Ionicons.glyphMap; + iconSize: number; + label: string; + color: string; + onPress: () => void; + onLongPress: () => void; +}) { + const { colors } = useAppTheme(); + const reduceMotion = useReduceMotion(); + const dotOpacity = useSharedValue(isFocused ? 1 : 0); + const dotScale = useSharedValue(isFocused ? 1 : 0); + const iconScale = useSharedValue(isFocused ? 1.12 : 1); + + useEffect(() => { + if (reduceMotion) { + dotOpacity.value = isFocused ? 1 : 0; + dotScale.value = isFocused ? 1 : 0; + iconScale.value = isFocused ? 1.12 : 1; + return; + } + dotOpacity.value = withTiming(isFocused ? 1 : 0, { + duration: isFocused ? 200 : 150, + }); + dotScale.value = isFocused + ? withSpring(1, { damping: 10 }) + : withTiming(0, { duration: 150 }); + iconScale.value = isFocused + ? withSpring(1.12, { damping: 10 }) + : withTiming(1, { duration: 150 }); + }, [dotOpacity, dotScale, iconScale, isFocused, reduceMotion]); + + const dotStyle = useAnimatedStyle(() => ({ + opacity: dotOpacity.value, + transform: [{ scale: dotScale.value }], + })); + + const iconStyle = useAnimatedStyle(() => ({ + transform: [{ scale: iconScale.value }], + })); + + return ( + + + + + + + {label} + + + ); +} + const styles = StyleSheet.create({ scrim: { position: 'absolute', @@ -237,7 +323,12 @@ const styles = StyleSheet.create({ height: '100%', alignItems: 'center', justifyContent: 'center', - gap: 2, + gap: 3, + }, + activeDot: { + width: 4, + height: 4, + borderRadius: 2, }, label: { fontSize: 11, diff --git a/src/components/auth/AuthScaffold.tsx b/src/components/auth/AuthScaffold.tsx index ebb10ce..d054199 100644 --- a/src/components/auth/AuthScaffold.tsx +++ b/src/components/auth/AuthScaffold.tsx @@ -1,6 +1,10 @@ import React from "react"; -import { KeyboardAvoidingView, Platform, Pressable, ScrollView, Text, TextInput, View } from "react-native"; +import { KeyboardAvoidingView, Platform, Pressable, ScrollView, Text, TextInput, useWindowDimensions, View } from "react-native"; +import { Fonts } from "@/constants/theme"; +import AuraGlassCard from "@/src/components/aura/AuraGlassCard"; +import AuraGlowBackground from "@/src/components/aura/AuraGlowBackground"; +import AuraGradientButton from "@/src/components/aura/AuraGradientButton"; import { SafeScreen } from "@/src/components/SafeScreen"; import { useAppTheme } from "@/src/hooks/useAppTheme"; @@ -17,53 +21,60 @@ export function AuthScaffold({ children: React.ReactNode; footer?: React.ReactNode; }) { - const { colors } = useAppTheme(); + const { colors, theme } = useAppTheme(); + const { width, height } = useWindowDimensions(); + const compactAuth = width < 390 || height < 760; + const titleSize = compactAuth ? 34 : 38; + const titleLineHeight = compactAuth ? 38 : 42; + const contentGap = compactAuth ? 22 : 28; + const headerGap = compactAuth ? 8 : 10; return ( - - - + + - - - {eyebrow} - - - {title} - - - {subtitle} - - - - - {children} - + + + {eyebrow} + + + {title} + + + {subtitle} + + - {footer ? {footer} : null} - - - + + {children} + + + {footer ? {footer} : null} + + + + ); } @@ -99,23 +110,8 @@ export function PrimaryAuthButton({ onPress: () => void; disabled?: boolean; }) { - const { colors } = useAppTheme(); - return ( - ({ - borderRadius: 18, - paddingVertical: 16, - alignItems: "center", - justifyContent: "center", - backgroundColor: colors.aiAccent, - opacity: disabled ? 0.55 : pressed ? 0.86 : 1, - })} - > - {label} - - ); + useAppTheme(); + return ; } export function SecondaryAuthButton({ @@ -159,4 +155,3 @@ export function AuthInlineLink({ ); } - diff --git a/src/constants/dock.ts b/src/constants/dock.ts index 95e0e95..88f22f0 100644 --- a/src/constants/dock.ts +++ b/src/constants/dock.ts @@ -1,8 +1,23 @@ -export const DOCK_HEIGHT = 62; +export const FLOATING_TAB_BAR_HEIGHT = 62; +export const DOCK_HEIGHT = FLOATING_TAB_BAR_HEIGHT; export const DOCK_RADIUS = 26; export const DOCK_SIDE_MARGIN = 16; -export const DOCK_BOTTOM_GAP = 0; +export const FLOATING_TAB_BAR_BOTTOM_INSET_MIN = 16; +export const DOCK_BOTTOM_GAP = FLOATING_TAB_BAR_BOTTOM_INSET_MIN; export const DOCK_ITEM_COUNT = 5; +export const FLOATING_CONTROL_GAP = 14; +export const SCREEN_BOTTOM_EXTRA_PADDING = 30; -export const dockSpace = (insetsBottom: number) => - DOCK_HEIGHT + DOCK_BOTTOM_GAP + insetsBottom; +export const floatingTabBarBottomInset = (insetsBottom: number) => + Math.max(FLOATING_TAB_BAR_BOTTOM_INSET_MIN, insetsBottom * 0.35); + +export const floatingTabBarTopOffset = (insetsBottom: number) => + floatingTabBarBottomInset(insetsBottom) + FLOATING_TAB_BAR_HEIGHT; + +export const screenBottomContentPadding = (insetsBottom: number) => + floatingTabBarTopOffset(insetsBottom) + SCREEN_BOTTOM_EXTRA_PADDING; + +export const composerBottomOffset = (insetsBottom: number) => + floatingTabBarTopOffset(insetsBottom) + FLOATING_CONTROL_GAP; + +export const dockSpace = screenBottomContentPadding; diff --git a/src/hooks/useAppTheme.ts b/src/hooks/useAppTheme.ts index 0030457..7f909a7 100644 --- a/src/hooks/useAppTheme.ts +++ b/src/hooks/useAppTheme.ts @@ -1,14 +1,16 @@ -import { Colors, type AppColors } from "@/constants/theme"; +import { Colors, ThemeTokens, type AppColors, type AppThemeTokens } from "@/constants/theme"; import { useColorScheme } from "@/hooks/use-color-scheme"; export function useAppTheme() { const scheme = useColorScheme() ?? "light"; const isDark = scheme === "dark"; const colors: AppColors = Colors[scheme]; + const theme: AppThemeTokens = ThemeTokens[scheme]; return { scheme, isDark, colors, + theme, }; } diff --git a/src/hooks/useResponsiveLayout.ts b/src/hooks/useResponsiveLayout.ts index 8cc55cf..6433910 100644 --- a/src/hooks/useResponsiveLayout.ts +++ b/src/hooks/useResponsiveLayout.ts @@ -2,7 +2,11 @@ import { useMemo } from "react"; import { useWindowDimensions } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { dockSpace } from "@/src/constants/dock"; +import { + composerBottomOffset, + floatingTabBarBottomInset, + screenBottomContentPadding, +} from "@/src/constants/dock"; import { layoutTokens, type ResponsiveSizeCategory } from "@/src/constants/layout"; import { SCREEN_BOTTOM_PADDING, SCREEN_TOP_PADDING } from "@/src/components/SafeScreen"; @@ -27,12 +31,13 @@ export function useResponsiveLayout() { const continueCardWidth = screenSize === "compact" ? 150 : screenSize === "large" ? 180 : 164; const titleScale = screenSize === "compact" ? 0.94 : screenSize === "large" ? 1.05 : 1; const topContentInset = insets.top + SCREEN_TOP_PADDING; + const floatingDockBottom = floatingTabBarBottomInset(insets.bottom); const bottomDockPadding = Math.max( insets.bottom + SCREEN_BOTTOM_PADDING, - dockSpace(insets.bottom) + 24, - 100 + screenBottomContentPadding(insets.bottom), + 112 ); - const composerOffset = dockSpace(insets.bottom) + 10; + const composerOffset = composerBottomOffset(insets.bottom); const composerHeight = screenSize === "compact" ? 118 : 126; return { @@ -51,6 +56,7 @@ export function useResponsiveLayout() { continueCardWidth, titleScale, topContentInset, + floatingDockBottom, bottomDockPadding, composerOffset, composerHeight, From 520eb247de3cc8ea4f8db5f0aa00cd9aa76c469e Mon Sep 17 00:00:00 2001 From: Athfan Date: Mon, 27 Apr 2026 02:06:44 -0500 Subject: [PATCH 11/93] feat: enhance AURA chat, input system, and personalization memory --- app/(tabs)/ai.tsx | 1529 ++++++++++++++++++++------ src/components/ai/AuraChatDrawer.tsx | 365 ++++++ src/components/ai/AuraHeader.tsx | 136 +++ src/components/ai/AuraOrb.tsx | 85 ++ src/components/ai/AuraQuickChips.tsx | 131 ++- src/components/ai/AuraReplyCard.tsx | 1051 +++++++++++++++--- src/components/ai/ChatList.tsx | 124 ++- src/components/ai/ChatMessage.tsx | 531 +++++++-- src/components/ai/InputBar.tsx | 666 ++++++++--- src/components/ai/OutfitMessage.tsx | 95 +- src/components/ai/aiTheme.ts | 38 + src/components/ai/chatTypes.ts | 26 + src/lib/aiChats.ts | 173 ++- src/lib/aura.ts | 472 +++++++- src/lib/auraAttachments.ts | 952 ++++++++++++++++ src/lib/auraIntent.ts | 89 ++ src/lib/auraLooks.ts | 87 +- src/lib/auraMemory.ts | 396 +++++++ src/lib/auraOutfitFeedback.ts | 219 ++++ src/lib/formatChatText.ts | 42 + src/lib/localChatCache.ts | 14 +- src/types/aura.ts | 49 +- 22 files changed, 6342 insertions(+), 928 deletions(-) create mode 100644 src/components/ai/AuraChatDrawer.tsx create mode 100644 src/components/ai/AuraHeader.tsx create mode 100644 src/components/ai/AuraOrb.tsx create mode 100644 src/components/ai/aiTheme.ts create mode 100644 src/lib/auraAttachments.ts create mode 100644 src/lib/auraIntent.ts create mode 100644 src/lib/auraMemory.ts create mode 100644 src/lib/auraOutfitFeedback.ts create mode 100644 src/lib/formatChatText.ts diff --git a/app/(tabs)/ai.tsx b/app/(tabs)/ai.tsx index 0a50c10..6f23140 100644 --- a/app/(tabs)/ai.tsx +++ b/app/(tabs)/ai.tsx @@ -1,30 +1,40 @@ import { LinearGradient } from "expo-linear-gradient"; -import { useLocalSearchParams } from "expo-router"; +import * as ImagePicker from "expo-image-picker"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import React, { useEffect, useMemo, useRef, useState } from "react"; -import { - Animated, - Alert, - Keyboard, - KeyboardEvent, - Platform, - Pressable, - Text, - View, -} from "react-native"; -import { Ionicons } from "@expo/vector-icons"; +import { Animated, Alert, Keyboard, KeyboardEvent, Platform, Pressable, Text, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { Fonts } from "@/constants/theme"; +import AuraHeader from "@/src/components/ai/AuraHeader"; +import AuraChatDrawer from "@/src/components/ai/AuraChatDrawer"; import AuraQuickChips from "@/src/components/ai/AuraQuickChips"; import ChatList from "@/src/components/ai/ChatList"; import InputBar from "@/src/components/ai/InputBar"; -import type { AIMessage } from "@/src/components/ai/chatTypes"; +import { auraTheme } from "@/src/components/ai/aiTheme"; +import AuraGlowBackground from "@/src/components/aura/AuraGlowBackground"; +import type { + AIMessage, + ChatAttachment, + ChatAttachmentGroupRole, + ChatImageAttachment, +} from "@/src/components/ai/chatTypes"; import { useAuth } from "@/src/hooks/useAuth"; import { useAppTheme } from "@/src/hooks/useAppTheme"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; -import { askAuraStream } from "@/src/lib/aura"; +import { askAuraStream, transcribeAuraAudio } from "@/src/lib/aura"; +import { logAuraLookStyleEvent, updateAuraSessionContextFromPrompt } from "@/src/lib/auraMemory"; +import { + type AuraCandidateLocalPhoto, + createAuraItemDraftsFromCandidates, + uploadAuraAttachment, + uploadAuraAttachments, +} from "@/src/lib/auraAttachments"; +import { classifyAuraImageIntent } from "@/src/lib/auraIntent"; import { auraLookToPlannedOutfit, saveAuraLook } from "@/src/lib/auraLooks"; +import { saveAuraOutfitFeedback } from "@/src/lib/auraOutfitFeedback"; +import { generateAuraSwipeBatch } from "@/src/lib/auraSwipe"; import { listenToItems } from "@/src/lib/items"; +import { Toast } from "@/src/lib/toast"; import { appendMessageToChat, createChatThread, @@ -34,43 +44,40 @@ import { type AIChatThread, } from "@/src/lib/aiChats"; import { clearLatestChatCache, loadLatestChatCache, saveLatestChatCache } from "@/src/lib/localChatCache"; -import type { AuraResponse } from "@/src/types/aura"; +import type { AuraCandidateAction, AuraCandidateItem, AuraLookAction, AuraLookOptionMeta, AuraResponse } from "@/src/types/aura"; import type { ClothingItem } from "@/src/types/ClothingItem"; import { savePlannedRecord } from "@/src/utils/dailyOutfits"; const DEFAULT_CHIPS = [ + "Style me today", + "Show safe, balanced, and bold options", "Build a casual look", + "Fix this outfit", + "What am I missing?", + "Use only my closet", "What should I buy first?", - "Help me style this", - "Give me style advice", -]; - -const STARTER_CARDS = [ - { - title: "Build a casual look", - subtitle: "Start from scratch or use what I already own", - prompt: "Build a casual look", - }, - { - title: "What should I buy first?", - subtitle: "Build a wardrobe that gets smarter fast", - prompt: "What should I buy first to build a stronger wardrobe?", - }, - { - title: "Plan an outfit for tonight", - subtitle: "Give me a sharp direction for tonight", - prompt: "Plan an outfit for tonight", - }, - { - title: "Find gaps in my closet", - subtitle: "Use what I own and show me what is missing", - prompt: "Find gaps in my closet", - }, + "Plan a cleaner outfit", ]; const consumedPromptTokens = new Set(); const consumedChatTokens = new Set(); -const DEFAULT_COMPOSER_HEIGHT = 70; +const DEFAULT_COMPOSER_HEIGHT = 56; +const AURA_OFFLINE_MESSAGE = "AURA is having trouble connecting right now. Try again in a moment."; +const AURA_DRAFT_FAILURE_MESSAGE = "I couldn't create that wardrobe draft. Please try again."; +const AURA_ATTACHMENT_FAILURE_MESSAGE = "I couldn't upload that attachment. Please try again."; +const DEBUG_AURA_CLIENT = + __DEV__ && process.env.EXPO_PUBLIC_AURA_DEBUG === "1"; +const MULTI_OUTFIT_REQUEST_RE = + /\b((?:2|3|4|two|three|four)\s+(?:outfits?|looks?|options?|directions?)|multiple\s+(?:outfits?|looks?|options?)|few\s+outfits?)\b/i; +const OUTERWEAR_REQUEST_RE = + /\b(with jacket|with jackets|jackets?|outerwear|coat|blazer|hoodie|cardigan|overshirt|layered|layers)\b/i; + +type OptionalAudioRecorder = { + uri: string | null; + prepareToRecordAsync: () => Promise; + record: () => void; + stop: () => Promise; +}; function createMessageId() { return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; @@ -86,25 +93,438 @@ function createUserMessage(text: string): AIMessage { }; } -function createAssistantMessage(data: AuraResponse, overrides?: Partial): AIMessage { +function createUserMessageWithAttachments(text: string, attachments: ChatAttachment[]): AIMessage { + return { + ...createUserMessage(text), + attachments, + }; +} + +function createLocalAttachmentId() { + return `att-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; +} + +function candidateImageSet(candidate: AuraCandidateItem) { + return new Set( + [ + candidate.primaryImageUrl, + ...(candidate.imageUrls ?? []), + ...(candidate.secondaryImageUrls ?? []), + ] + .map((url) => String(url ?? "").trim()) + .filter(Boolean) + ); +} + +function cleanIntroText(value: unknown) { + return String(value ?? "").replace(/\s+/g, " ").trim(); +} + +function buildAssistantCardIntro(data: AuraResponse, userRequest?: string) { + const request = cleanIntroText(userRequest).toLowerCase(); + const reply = cleanIntroText(data.reply); + if (reply) return reply; + + const candidateItems = data.candidateItems ?? data.candidates ?? []; + const hasCandidates = candidateItems.length > 0; + const hasLooks = !!data.look || !!data.lookOptions?.length; + const lookCount = data.lookOptions?.length ?? (data.look ? 1 : 0); + + if (hasCandidates) { + if (/\b(add|save|store|closet|wardrobe|item)\b/.test(request)) { + return "I found this item. Review it before I add it to your wardrobe."; + } + return "I found this item. Give it a quick review and I can take the next step."; + } + + if (hasLooks) { + if (/\bjacket|jackets|coat|coats|blazer|blazers|outerwear\b/.test(request)) { + return "Got you — I kept jackets as the main layer and built the outfits around them."; + } + if (/\bformal|cleaner|dressier|more formal|tailored|polished\b/.test(request)) { + return "Done — I pushed these cleaner and more formal while keeping them wearable."; + } + if (/\bstreetwear|street\b/.test(request)) { + return "Done — I made these lean more streetwear without losing balance."; + } + if (/\bsafe\b/.test(request) && /\bbalanced\b/.test(request) && /\bbold\b/.test(request)) { + return "Got you — I built a few directions so you can compare the safer, balanced, and bolder takes side by side."; + } + if (lookCount > 1) { + return "Got you — I built a few looks from your closet that match that direction."; + } + return "Got you — I pulled a look together that stays close to that direction."; + } + + if (data.presentation === "candidate_preview") { + return "I found this item. Review it before I add it to your wardrobe."; + } + + if (/\bswipe|training|taste|learn\b/.test(request)) { + return "Here are a few quick outfit edits. Swipe through them so I can learn your taste."; + } + + return "Got you — here’s what I’d do."; +} + +function buildAuraLookFeedbackPrompt(action: AuraLookAction, promptBase: string) { + if (action === "notMyVibe") { + return `Take this in a different direction from ${promptBase}. Keep it polished, but shift the palette, silhouette, or overall attitude so it feels more like me.`; + } + if (action === "showMoreLikeThis") { + return `Show me 3 more looks in the same lane as ${promptBase}, but vary the styling so they do not feel repetitive.`; + } + if (action === "lessLikeThis") { + return `Pull away from ${promptBase}. Keep the same level of polish, but give me a noticeably different palette, silhouette, or vibe.`; + } + return ""; +} + +function resolveLocalPhotosForAuraCandidates( + messages: AIMessage[], + sourceMessage: AIMessage, + candidates: AuraCandidateItem[] +): Record { + const previousUserMessages = messages + .filter( + (message) => + message.type === "user" && + message.createdAt <= sourceMessage.createdAt && + message.attachments?.some((attachment) => attachment.type === "image") + ) + .sort((a, b) => b.createdAt - a.createdAt); + const imageAttachments = previousUserMessages.flatMap((message) => + (message.attachments ?? []).filter( + (attachment): attachment is ChatImageAttachment => attachment.type === "image" + ) + ); + const localByCandidateId: Record = {}; + + for (const candidate of candidates) { + const urls = candidateImageSet(candidate); + const matchedAttachment = + imageAttachments.find((attachment) => urls.has(String(attachment.uri ?? "").trim())) ?? + (candidates.length === 1 && imageAttachments.length === 1 ? imageAttachments[0] : undefined); + if (!matchedAttachment?.localUri) continue; + localByCandidateId[candidate.candidateId] = { + localUri: matchedAttachment.localUri, + attachmentUri: matchedAttachment.uri, + width: matchedAttachment.width ?? null, + height: matchedAttachment.height ?? null, + }; + } + + return localByCandidateId; +} + +function createAssistantMessage( + data: AuraResponse, + overrides?: Partial, + options?: { userRequest?: string } +): AIMessage { + const candidateItems = data.candidateItems ?? data.candidates ?? []; + const normalizedData = candidateItems.length + ? { + ...data, + presentation: "candidate_preview" as const, + candidateItems, + candidates: candidateItems, + } + : data; const shouldUseCard = - data.presentation === "card" || - !!data.look || - ((!!data.outfitItems?.length || - !!data.ownedPieces?.length || - !!data.recommendedAdditions?.length) && - (!!data.reason?.trim() || !!data.swapSuggestion?.trim())); + normalizedData.presentation === "card" || + normalizedData.presentation === "candidate_preview" || + !!normalizedData.look || + !!normalizedData.lookOptions?.length || + !!candidateItems.length || + ((!!normalizedData.outfitItems?.length || + !!normalizedData.ownedPieces?.length || + !!normalizedData.recommendedAdditions?.length) && + (!!normalizedData.reason?.trim() || !!normalizedData.swapSuggestion?.trim())); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_FRONTEND_PAYLOAD]", "createAssistantMessage payload", { + messageId: overrides?.id ?? null, + presentation: normalizedData.presentation, + hasLook: !!normalizedData.look, + lookOptionsCount: normalizedData.lookOptions?.length ?? 0, + candidateItemsCount: candidateItems.length, + shouldUseCard, + replyPreview: String(normalizedData.reply ?? "").slice(0, 120), + }); + } + if (DEBUG_AURA_CLIENT && candidateItems.length) { + console.log("[AURA_PARSE]", "creating assistant candidate message", { + candidateCount: candidateItems.length, + kind: shouldUseCard ? "aura_card" : "aura_text", + presentation: normalizedData.presentation, + rawKeys: Object.keys(data), + }); + } + const assistantIntroText = shouldUseCard + ? buildAssistantCardIntro(normalizedData, options?.userRequest) + : cleanIntroText(normalizedData.reply); return { id: overrides?.id ?? createMessageId(), type: "assistant", kind: shouldUseCard ? "aura_card" : "aura_text", - text: data.reply, + text: assistantIntroText || normalizedData.reply, + assistantIntroText: assistantIntroText || undefined, streaming: overrides?.streaming, - aura: shouldUseCard ? data : undefined, + aura: shouldUseCard ? normalizedData : undefined, createdAt: overrides?.createdAt ?? Date.now(), }; } +function requestedOutfitCount(prompt: string) { + const normalized = prompt.toLowerCase(); + if (/\b(4|four)\s+(?:outfits?|looks?|options?|directions?)\b/.test(normalized)) return 4; + if (/\b(3|three)\s+(?:outfits?|looks?|options?|directions?)\b/.test(normalized)) return 3; + if (/\b(2|two)\s+(?:outfits?|looks?|options?|directions?)\b/.test(normalized)) return 2; + return 3; +} + +const OUTFIT_REFINEMENT_RE = + /\b(with|without|more|less|make|push|safer|balanced|bold|dressier|casual|formal|streetwear|jackets?|outerwear|bags?|glasses|watch|accessor(?:y|ies)|heels?|boots?|sneakers?|loafers?)\b/i; + +function latestAuraLookCount(messages: AIMessage[]) { + for (let index = messages.length - 1; index >= 0; index -= 1) { + const message = messages[index]; + const count = message.aura?.lookOptions?.length ?? (message.aura?.look ? 1 : 0); + if (count > 0) return count; + } + return 0; +} + +function previousUserPrompt(messages: AIMessage[]) { + for (let index = messages.length - 1; index >= 0; index -= 1) { + const message = messages[index]; + if (message.type !== "user") continue; + const text = String(message.text ?? "").trim(); + if (text) return text; + } + return ""; +} + +function buildStructuredOutfitBatchPrompt(prompt: string, messages: AIMessage[]) { + const current = String(prompt ?? "").trim(); + if (!current) return current; + if (MULTI_OUTFIT_REQUEST_RE.test(current)) return current; + if (!OUTFIT_REFINEMENT_RE.test(current)) return current; + const prior = previousUserPrompt(messages); + if (!prior || prior === current) { + return `Give me ${requestedOutfitCount(current)} outfits. ${current}`; + } + return `${prior}. Refine those outfit options: ${current}`; +} + +function wantsStructuredOutfitBatch( + prompt: string, + attachmentCount: number, + messages: AIMessage[], +) { + if (attachmentCount !== 0) return false; + if (MULTI_OUTFIT_REQUEST_RE.test(prompt)) return true; + return latestAuraLookCount(messages) > 0 && OUTFIT_REFINEMENT_RE.test(prompt); +} + +function promptRequestsOuterwear(prompt: string) { + return OUTERWEAR_REQUEST_RE.test(String(prompt ?? "")); +} + +function lookHasOuterwear(look?: AuraResponse["look"] | null) { + return Boolean( + look?.pieces?.some((piece) => { + const tokens = `${String(piece.role ?? "")} ${String(piece.itemName ?? "")}`.toLowerCase(); + return ( + piece.role === "outerwear" || + /\b(jacket|coat|outerwear|overshirt|blazer|hoodie|cardigan|shacket|trench|parka|bomber)\b/.test(tokens) + ); + }), + ); +} + +function closetHasOuterwear(items: ClothingItem[]) { + return items.some((item) => { + const tokens = [ + String(item.category ?? ""), + String(item.subCategory ?? ""), + String(item.type ?? ""), + String(item.name ?? ""), + ] + .join(" ") + .toLowerCase(); + + return ( + String(item.category ?? "").trim().toLowerCase() === "outerwear" || + /\b(jacket|coat|outerwear|overshirt|blazer|hoodie|cardigan|shacket|trench|parka|bomber)\b/.test(tokens) + ); + }); +} + +function countClosetOuterwear(items: ClothingItem[]) { + return items.filter((item) => { + const tokens = [ + String(item.category ?? ""), + String(item.subCategory ?? ""), + String(item.type ?? ""), + String(item.name ?? ""), + ] + .join(" ") + .toLowerCase(); + + return ( + String(item.category ?? "").trim().toLowerCase() === "outerwear" || + /\b(jacket|coat|outerwear|overshirt|blazer|hoodie|cardigan|shacket|trench|parka|bomber)\b/.test(tokens) + ); + }).length; +} + +function listClosetOuterwear(items: ClothingItem[]) { + return items.filter((item) => { + const tokens = [ + String(item.category ?? ""), + String(item.subCategory ?? ""), + String(item.type ?? ""), + String(item.name ?? ""), + ] + .join(" ") + .toLowerCase(); + + return ( + String(item.category ?? "").trim().toLowerCase() === "outerwear" || + /\b(jacket|coat|outerwear|overshirt|blazer|hoodie|cardigan|shacket|trench|parka|bomber|denim jacket)\b/.test(tokens) + ); + }); +} + +function buildOuterwearPiece(item: ClothingItem) { + const imageUrl = + item.photos?.normalizedUrl ?? + item.cleanedImageUrl ?? + item.photos?.cleanedUrl ?? + item.photos?.cleanedPhotoUrl ?? + item.originalImageUrl ?? + item.photoUrl ?? + null; + + return { + role: "outerwear" as const, + itemName: + String(item.name ?? "").trim() || + String(item.subCategory ?? "").trim() || + String(item.type ?? "").trim() || + "Outerwear piece", + source: "closet" as const, + itemId: item.id, + imageUrl, + }; +} + +function repairLookForOuterwearRequirement( + look: NonNullable, + outerwearPool: ClothingItem[], + usedOuterwearIds: Set, +) { + if (lookHasOuterwear(look) || outerwearPool.length === 0) return look; + + const chosen = + outerwearPool.find((item) => !usedOuterwearIds.has(item.id)) ?? + outerwearPool[0]; + if (!chosen) return look; + usedOuterwearIds.add(chosen.id); + const outerwearPiece = buildOuterwearPiece(chosen); + const fromCloset = Array.from( + new Set([outerwearPiece.itemName, ...(look.fromCloset ?? [])].filter(Boolean)), + ); + const lookTitle = String(look.lookTitle ?? "").trim(); + const nextTitle = lookTitle.toLowerCase().includes(outerwearPiece.itemName.toLowerCase()) + ? lookTitle + : `${outerwearPiece.itemName} + ${lookTitle || "Layered outfit"}`; + + return { + ...look, + lookTitle: nextTitle, + stylingNote: look.stylingNote + ? `${look.stylingNote} Layer in ${outerwearPiece.itemName.toLowerCase()} to complete the silhouette.` + : `Layer in ${outerwearPiece.itemName.toLowerCase()} to complete the silhouette.`, + pieces: [outerwearPiece, ...(look.pieces ?? [])], + fromCloset, + }; +} + +function ensureOuterwearLooks( + lookOptions: NonNullable, + items: ClothingItem[], +) { + const outerwearPool = listClosetOuterwear(items); + const usedOuterwearIds = new Set(); + return lookOptions.map((look) => + repairLookForOuterwearRequirement(look, outerwearPool, usedOuterwearIds), + ); +} + +function buildAuraResponseFromSwipeBatch( + batch: Awaited>, + options?: { prompt?: string; items?: ClothingItem[] }, +): AuraResponse { + const wantsOuterwear = promptRequestsOuterwear(options?.prompt ?? ""); + const availableOuterwearCount = countClosetOuterwear(options?.items ?? []); + const repairedLookOptions = + wantsOuterwear && availableOuterwearCount > 0 + ? ensureOuterwearLooks(batch.lookOptions.map((entry) => entry.look), options?.items ?? []) + : batch.lookOptions.map((entry) => entry.look); + const lookOptions = repairedLookOptions; + const primaryLook = lookOptions[0] ?? null; + const count = lookOptions.length; + const hasOuterwearLooks = lookOptions.some((look) => lookHasOuterwear(look)); + const hasOuterwearInCloset = closetHasOuterwear(options?.items ?? []); + if (__DEV__) { + console.log("[AURA_OUTERWEAR]", "frontend structured batch summary", { + prompt: options?.prompt ?? "", + requiresOuterwear: wantsOuterwear, + availableOuterwearCount, + finalLookIds: batch.lookOptions.map((entry) => entry.id), + lookOuterwearCounts: lookOptions.map((look, index) => ({ + index, + count: look.pieces?.filter((piece) => piece.role === "outerwear").length ?? 0, + title: look.lookTitle, + })), + }); + } + return { + presentation: "card", + title: + wantsOuterwear && hasOuterwearLooks + ? count > 1 + ? `${count} Jacket Options` + : "Jacket Option" + : count > 1 + ? `${count} Outfit Options` + : "Outfit Option", + reply: + wantsOuterwear && !hasOuterwearLooks && !hasOuterwearInCloset + ? "I couldn't build jacket looks because I couldn't find outerwear in your closet yet." + : wantsOuterwear && !hasOuterwearLooks + ? "I couldn't build reliable jacket looks from the current generator, so I repaired the closest structured options with outerwear from your closet." + : count > 1 + ? `I pulled ${count} structured outfit options from your closet so you can compare them side by side.` + : "I pulled one structured outfit option from your closet.", + reason: "", + outfitItems: primaryLook?.fromCloset ?? [], + ownedPieces: primaryLook?.fromCloset ?? [], + recommendedAdditions: primaryLook?.addToComplete ?? [], + swapSuggestion: "", + chips: [ + "Show me 3 more", + "Make them more formal", + "Push it more streetwear", + "Use only basics", + ], + look: primaryLook, + lookOptions, + }; +} + function buildAuraHistory(messages: AIMessage[]) { return messages .filter((message) => message.type === "user" || message.type === "assistant") @@ -133,6 +553,42 @@ function createSystemMessage(text: string): AIMessage { }; } +function appendUniqueSystemMessage( + messages: AIMessage[], + text: string, + removeMessageId?: string +) { + const withoutRemoved = removeMessageId + ? messages.filter((entry) => entry.id !== removeMessageId) + : messages; + const alreadyShown = withoutRemoved.some( + (entry) => entry.type === "system/action" && entry.text === text + ); + return alreadyShown ? withoutRemoved : [...withoutRemoved, createSystemMessage(text)]; +} + +function userFacingAuraError(error: unknown) { + const messageText = + error instanceof Error ? error.message : String((error as { message?: unknown })?.message ?? ""); + const lower = messageText.toLowerCase(); + if (lower.includes("permission") || lower.includes("denied")) { + return "I couldn't save that item because permission was denied."; + } + if (lower.includes("upload") || lower.includes("storage")) { + return AURA_ATTACHMENT_FAILURE_MESSAGE; + } + if (lower.includes("draft") || lower.includes("firestore") || lower.includes("item")) { + return AURA_DRAFT_FAILURE_MESSAGE; + } + if (lower.includes("parse") || lower.includes("json")) { + return "I couldn't parse AURA's response. Please try again."; + } + if (lower.includes("network") || lower.includes("request failed") || lower.includes("timed out")) { + return "I couldn't reach AURA right now. Please try again in a moment."; + } + return AURA_OFFLINE_MESSAGE; +} + export default function AIScreen() { const params = useLocalSearchParams<{ prompt?: string | string[]; @@ -155,12 +611,25 @@ export default function AIScreen() { const [isComposerFocused, setIsComposerFocused] = useState(false); const [keyboardHeight, setKeyboardHeight] = useState(0); const [composerHeight, setComposerHeight] = useState(DEFAULT_COMPOSER_HEIGHT); + const [pendingAttachments, setPendingAttachments] = useState([]); + const [attachmentRole, setAttachmentRole] = useState("reference"); + const [recordingAudio, setRecordingAudio] = useState(false); + const [chatDrawerOpen, setChatDrawerOpen] = useState(false); + const [focusScrollSignal, setFocusScrollSignal] = useState(0); const latestMessagesRef = useRef([]); + const audioRecorderRef = useRef(null); + const recordingStartedAtRef = useRef(null); const auraPulse = useRef(new Animated.Value(0)).current; const auraThinking = useRef(new Animated.Value(0)).current; const uid = user?.uid ?? null; const itemsById = useMemo(() => new Map(items.map((item) => [item.id, item])), [items]); + useFocusEffect( + React.useCallback(() => { + setFocusScrollSignal((value) => value + 1); + }, []) + ); + const routePrompt = useMemo(() => { const raw = Array.isArray(params.prompt) ? params.prompt[0] : params.prompt; return typeof raw === "string" ? raw.trim() : ""; @@ -233,6 +702,119 @@ export default function AIScreen() { ]).start(); }, [auraThinking]); + const addImageAssets = React.useCallback( + (assets: ImagePicker.ImagePickerAsset[]) => { + const groupId = `grp-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`; + const next: ChatImageAttachment[] = assets + .filter((asset) => !!asset.uri) + .map((asset) => ({ + id: createLocalAttachmentId(), + type: "image", + uri: asset.uri, + localUri: asset.uri, + groupId, + role: attachmentRole, + width: asset.width ?? null, + height: asset.height ?? null, + })); + if (!next.length) return; + setPendingAttachments((prev) => [...prev, ...next].slice(0, 8)); + }, + [attachmentRole], + ); + + const handlePickImages = React.useCallback(async () => { + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (!permission.granted) { + Alert.alert("Photos", "Please allow photo access to attach images."); + return; + } + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ["images"], + allowsMultipleSelection: true, + quality: 0.9, + exif: false, + }); + if (result.canceled) return; + addImageAssets(result.assets ?? []); + }, [addImageAssets]); + + const handleTakePhoto = React.useCallback(async () => { + const permission = await ImagePicker.requestCameraPermissionsAsync(); + if (!permission.granted) { + Alert.alert("Camera", "Please allow camera access to attach a photo."); + return; + } + const result = await ImagePicker.launchCameraAsync({ + mediaTypes: ["images"], + allowsEditing: false, + quality: 0.9, + exif: false, + }); + if (result.canceled) return; + addImageAssets(result.assets ?? []); + }, [addImageAssets]); + + const handleMicPress = React.useCallback(async () => { + if (!uid) return; + try { + if (recordingAudio && audioRecorderRef.current) { + const recorder = audioRecorderRef.current; + await recorder.stop(); + const uri = recorder.uri; + const startedAt = recordingStartedAtRef.current; + audioRecorderRef.current = null; + recordingStartedAtRef.current = null; + setRecordingAudio(false); + if (!uri) return; + const localAudio: ChatAttachment = { + id: createLocalAttachmentId(), + type: "audio", + uri, + localUri: uri, + durationMs: startedAt ? Date.now() - startedAt : null, + }; + const uploaded = await uploadAuraAttachment(uid, localAudio); + const transcript = await transcribeAuraAudio(uploaded.uri); + const withTranscript = { ...uploaded, transcript }; + setPendingAttachments((prev) => [...prev, withTranscript].slice(0, 8)); + if (transcript) { + setMessage((prev) => (prev.trim() ? `${prev.trim()} ${transcript}` : transcript)); + } + return; + } + + const audio = await import("expo-audio").catch(() => null); + if (!audio) { + Alert.alert("Voice", "Voice input needs the latest native build. Image and text chat still work."); + return; + } + + const permission = await audio.requestRecordingPermissionsAsync(); + if (!permission.granted) { + Alert.alert("Voice", "Please allow microphone access to record a message."); + return; + } + const recorder = new audio.AudioRecorder(audio.RecordingPresets.LOW_QUALITY); + await recorder.prepareToRecordAsync(); + recorder.record(); + audioRecorderRef.current = recorder; + recordingStartedAtRef.current = Date.now(); + setRecordingAudio(true); + } catch (error: any) { + audioRecorderRef.current = null; + recordingStartedAtRef.current = null; + setRecordingAudio(false); + const messageText = String(error?.message ?? ""); + Alert.alert( + "Voice", + messageText.includes("ExpoAudio") + ? "Voice input needs the latest native build. Image and text chat still work." + : messageText || "Unable to record right now." + ); + } + }, [recordingAudio, uid]); + useEffect(() => { let cancelled = false; @@ -281,7 +863,9 @@ export default function AIScreen() { setRecentThreads(recent); } } catch (error) { - console.log("[AURA] hydrate failed", error); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA] hydrate failed", error); + } } finally { if (!cancelled) setIsBooting(false); } @@ -328,13 +912,57 @@ export default function AIScreen() { } const prompt = String(override ?? message).trim(); - if (!prompt || loading) return; + const outgoingAttachments = override ? [] : pendingAttachments; + if ((!prompt && outgoingAttachments.length === 0) || loading) return; - const userMessage = createUserMessage(prompt); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_SEND]", "sending message", { + uid, + hasPrompt: !!prompt, + attachmentCount: outgoingAttachments.length, + attachmentTypes: outgoingAttachments.map((attachment) => attachment.type), + }); + } + setLoading(true); + let uploadedAttachments = outgoingAttachments; + try { + uploadedAttachments = outgoingAttachments.length + ? await uploadAuraAttachments(uid, outgoingAttachments) + : []; + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_UPLOAD]", "attachment batch ready for send", { + uid, + count: uploadedAttachments.length, + attachments: uploadedAttachments.map((attachment) => ({ + id: attachment.id, + type: attachment.type, + uri: attachment.uri, + role: attachment.type === "image" ? attachment.role ?? null : null, + groupId: attachment.type === "image" ? attachment.groupId ?? null : null, + })), + }); + } + } catch (error: any) { + console.log("[AURA_ERROR]", "attachment upload failed", error); + setLoading(false); + setMessages((prev) => appendUniqueSystemMessage(prev, AURA_ATTACHMENT_FAILURE_MESSAGE)); + Alert.alert("Attachments", error?.message ?? AURA_ATTACHMENT_FAILURE_MESSAGE); + return; + } + + const userMessage = createUserMessageWithAttachments(prompt, uploadedAttachments); const nextLocalMessages = [...latestMessagesRef.current, userMessage]; + const structuredBatchPrompt = buildStructuredOutfitBatchPrompt(prompt, latestMessagesRef.current); + const shouldForceStructuredBatch = wantsStructuredOutfitBatch( + prompt, + uploadedAttachments.length, + latestMessagesRef.current, + ); setMessages(nextLocalMessages); - if (!override) setMessage(""); - setLoading(true); + if (!override) { + setMessage(""); + setPendingAttachments([]); + } triggerThinkingPulse(); const streamingMessageId = createMessageId(); const streamingMessageCreatedAt = Date.now(); @@ -349,7 +977,103 @@ export default function AIScreen() { setActiveChatId(chat.chatId); } - await appendMessageToChat(uid, chatId, userMessage, { titleFromUserText: prompt }); + void updateAuraSessionContextFromPrompt(uid, chatId, prompt); + await appendMessageToChat(uid, chatId, userMessage, { titleFromUserText: prompt || "Image message" }); + + const imageIntent = classifyAuraImageIntent(prompt, uploadedAttachments); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_INTENT]", "classified image intent", { + uid, + prompt, + imageIntent, + attachmentCount: uploadedAttachments.length, + attachmentRoles: uploadedAttachments.map((attachment) => + attachment.type === "image" ? attachment.role ?? null : attachment.type + ), + }); + } + + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_STREAM_REQUEST]", "ai screen request args", { + prompt, + clientIntent: imageIntent, + attachmentCount: uploadedAttachments.length, + attachments: uploadedAttachments.map((attachment) => ({ + type: attachment.type, + uri: attachment.uri, + role: attachment.type === "image" ? attachment.role ?? null : null, + groupId: attachment.type === "image" ? attachment.groupId ?? null : null, + })), + }); + } + + if (shouldForceStructuredBatch) { + const desiredLookCount = + latestAuraLookCount(latestMessagesRef.current) || requestedOutfitCount(structuredBatchPrompt); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_MULTI]", "frontend structured batch request", { + prompt, + structuredBatchPrompt, + desiredLookCount, + latestLookCount: latestAuraLookCount(latestMessagesRef.current), + }); + } + if (promptRequestsOuterwear(structuredBatchPrompt) && !closetHasOuterwear(items)) { + const noOuterwearResponse: AuraResponse = { + title: "No outerwear found", + reply: + "I couldn't build jacket looks because I couldn't find outerwear in your closet yet. Add a jacket, blazer, hoodie, coat, or overshirt and I can redo this.", + reason: "", + outfitItems: [], + ownedPieces: [], + recommendedAdditions: [], + swapSuggestion: "", + chips: DEFAULT_CHIPS, + }; + const assistantMessage = createAssistantMessage(noOuterwearResponse, { + id: streamingMessageId, + createdAt: streamingMessageCreatedAt, + streaming: false, + }, { + userRequest: prompt, + }); + setMessages([...nextLocalMessages, assistantMessage]); + await appendMessageToChat(uid, chatId, assistantMessage); + const recent = await loadRecentChatThreads(uid, 6); + setRecentThreads(recent); + return; + } + const outfitBatch = await generateAuraSwipeBatch({ + intentText: structuredBatchPrompt, + numOutfits: desiredLookCount, + items, + }); + const batchResponse = buildAuraResponseFromSwipeBatch(outfitBatch, { + prompt: structuredBatchPrompt, + items, + }); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_MULTI]", "frontend batch fallback response", { + prompt, + structuredBatchPrompt, + lookOptionsCount: batchResponse.lookOptions?.length ?? 0, + lookTitles: batchResponse.lookOptions?.map((look) => look.lookTitle) ?? [], + }); + } + const assistantMessage = createAssistantMessage(batchResponse, { + id: streamingMessageId, + createdAt: streamingMessageCreatedAt, + streaming: false, + }, { + userRequest: structuredBatchPrompt, + }); + setMessages([...nextLocalMessages, assistantMessage]); + setQuickChips(batchResponse.chips?.length ? batchResponse.chips : DEFAULT_CHIPS); + await appendMessageToChat(uid, chatId, assistantMessage); + const recent = await loadRecentChatThreads(uid, 6); + setRecentThreads(recent); + return; + } setMessages([ ...nextLocalMessages, @@ -366,10 +1090,16 @@ export default function AIScreen() { const result = await askAuraStream( { message: prompt, + chatId, + attachments: uploadedAttachments, history: buildAuraHistory(nextLocalMessages), + clientIntent: imageIntent, }, { onStatus: () => { + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_STREAM]", "stream status received", { uid, chatId }); + } setMessages((prev) => { const hasMessage = prev.some((entry) => entry.id === streamingMessageId); if (hasMessage) return prev; @@ -400,6 +1130,16 @@ export default function AIScreen() { ); }, onFinal: (finalData) => { + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_STREAM_FINAL]", "frontend final received", { + uid, + chatId, + hasLook: !!finalData.look, + candidateItemsCount: finalData.candidateItems?.length ?? 0, + candidatesCount: finalData.candidates?.length ?? 0, + presentation: finalData.presentation, + }); + } setMessages((prev) => prev.map((entry) => entry.id === streamingMessageId @@ -407,6 +1147,8 @@ export default function AIScreen() { id: streamingMessageId, createdAt: streamingMessageCreatedAt, streaming: false, + }, { + userRequest: prompt, }) : entry ) @@ -414,64 +1156,135 @@ export default function AIScreen() { }, } ); + let finalResult = result; + if ( + shouldForceStructuredBatch && + !result.look && + !(result.lookOptions?.length) + ) { + const desiredLookCount = + latestAuraLookCount(nextLocalMessages) || requestedOutfitCount(structuredBatchPrompt); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_MULTI]", "stream returned no structured looks; using frontend batch fallback", { + prompt, + structuredBatchPrompt, + desiredLookCount, + presentation: result.presentation, + outfitItemsCount: result.outfitItems?.length ?? 0, + ownedPiecesCount: result.ownedPieces?.length ?? 0, + }); + } + const outfitBatch = await generateAuraSwipeBatch({ + intentText: structuredBatchPrompt, + numOutfits: desiredLookCount, + items, + }); + finalResult = buildAuraResponseFromSwipeBatch(outfitBatch, { + prompt: structuredBatchPrompt, + items, + }); + } const elapsed = Date.now() - startedAt; if (elapsed < 300) { await new Promise((resolve) => setTimeout(resolve, 300 - elapsed)); } - const assistantMessage = createAssistantMessage(result, { + const assistantMessage = createAssistantMessage(finalResult, { id: streamingMessageId, createdAt: streamingMessageCreatedAt, streaming: false, + }, { + userRequest: structuredBatchPrompt || prompt, }); setMessages((prev) => prev.map((entry) => (entry.id === streamingMessageId ? assistantMessage : entry)) ); - setQuickChips(result.chips?.length ? result.chips : DEFAULT_CHIPS); + setQuickChips(finalResult.chips?.length ? finalResult.chips : DEFAULT_CHIPS); await appendMessageToChat(uid, chatId, assistantMessage); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_STREAM]", "stream flow complete", { uid, chatId }); + } const recent = await loadRecentChatThreads(uid, 6); setRecentThreads(recent); } catch (error) { - console.log("[AURA] ask failed", error); - const fallback = createSystemMessage("AURA is offline right now."); - setMessages((prev) => [ - ...prev.filter((entry) => entry.id !== streamingMessageId), - fallback, - ]); - if (chatId) { - await appendMessageToChat(uid, chatId, fallback); - } + console.log("[AURA_ERROR]", "ask failed", { + uid, + chatId, + prompt, + attachmentCount: uploadedAttachments.length, + error, + }); + const fallback = userFacingAuraError(error); + setMessages((prev) => appendUniqueSystemMessage(prev, fallback, streamingMessageId)); } finally { setLoading(false); } }, - [activeChatId, loading, message, triggerThinkingPulse, uid] + [activeChatId, items, loading, message, pendingAttachments, triggerThinkingPulse, uid] ); const handleAuraLookAction = React.useCallback( - async (action: import("@/src/types/aura").AuraLookAction, sourceMessage: AIMessage) => { - const look = sourceMessage.aura?.look; + async ( + action: AuraLookAction, + sourceMessage: AIMessage, + selectedLook?: import("@/src/types/aura").AuraLook, + lookOption?: AuraLookOptionMeta, + ) => { + const look = selectedLook ?? sourceMessage.aura?.look; const promptBase = look?.lookTitle || sourceMessage.aura?.title || "this look"; if (!look || !uid) return; + if (loading) return; if (action === "saveLook") { try { await saveAuraLook(uid, look, { title: sourceMessage.aura?.title }); - Alert.alert("Saved", "Look saved to your profile."); + Toast.saved(); } catch (error: any) { - Alert.alert("Save failed", error?.message ?? "Unable to save this look."); + Toast.error("Save failed", error?.message ?? "Unable to save this look."); } return; } if (action === "planForToday") { try { await savePlannedRecord(uid, new Date(), auraLookToPlannedOutfit(look)); - Alert.alert("Planned", "This look is now attached to today."); + Toast.success("Planned", "This look is now attached to today."); } catch (error: any) { - Alert.alert("Plan failed", error?.message ?? "Unable to plan this look for today."); + Toast.error("Plan failed", error?.message ?? "Unable to plan this look for today."); } return; } + if (action === "likeLook") { + await logAuraLookStyleEvent(uid, "outfit_liked", look, { source: "aura" }); + await saveAuraOutfitFeedback(uid, { + feedbackType: "outfit_liked", + look, + chatId: activeChatId, + messageId: sourceMessage.id, + option: lookOption, + source: "aura", + }); + Alert.alert("Noted", "AURA will keep more of this energy in rotation."); + return; + } + if (action === "notMyVibe") { + await logAuraLookStyleEvent(uid, "outfit_disliked", look, { source: "aura" }); + await saveAuraOutfitFeedback(uid, { + feedbackType: "outfit_disliked", + look, + chatId: activeChatId, + messageId: sourceMessage.id, + option: lookOption, + source: "aura", + }); + void handleAsk(buildAuraLookFeedbackPrompt(action, promptBase)); + return; + } if (action === "showMoreLikeThis") { - void handleAsk(`Show me 3 more looks like ${promptBase}.`); + void logAuraLookStyleEvent(uid, "more_like_this", look, { source: "aura" }); + void handleAsk(buildAuraLookFeedbackPrompt(action, promptBase)); + return; + } + if (action === "lessLikeThis") { + await logAuraLookStyleEvent(uid, "less_like_this", look, { source: "aura" }); + void handleAsk(buildAuraLookFeedbackPrompt(action, promptBase)); return; } if (action === "shopMissingPieces") { @@ -486,7 +1299,10 @@ export default function AIScreen() { { text: "Close", style: "cancel" }, { text: "Create shopping brief", - onPress: () => void handleAsk(`Turn ${promptBase} into a concise shopping brief for the missing pieces.`), + onPress: () => + void handleAsk( + `Turn ${promptBase} into a concise shopping brief. Tell me what is actually missing from my wardrobe, what matters most to buy first, and what can wait.` + ), }, ] : [{ text: "Close", style: "cancel" }] @@ -494,14 +1310,127 @@ export default function AIScreen() { return; } if (action === "useOnlyMyCloset") { - void handleAsk(`Rebuild ${promptBase} using only my closet.`); + void handleAsk(`Fix ${promptBase} using only my closet. Keep the same overall intent, but make it feel more resolved with pieces I already own.`); return; } if (action === "makeItDressier") { - void handleAsk(`Make ${promptBase} dressier.`); + void handleAsk(`Fix ${promptBase} and make it dressier. Keep it polished, tasteful, and still like me.`); } }, - [handleAsk, uid] + [activeChatId, handleAsk, loading, uid] + ); + + const updateCandidateStatuses = React.useCallback( + (sourceMessage: AIMessage, candidateIds: string[], status: AuraCandidateItem["status"]) => { + const ids = new Set(candidateIds); + const nextAura = sourceMessage.aura + ? { + ...sourceMessage.aura, + candidateItems: (sourceMessage.aura.candidateItems ?? sourceMessage.aura.candidates)?.map((candidate) => + ids.has(candidate.candidateId) ? { ...candidate, status } : candidate + ), + candidates: (sourceMessage.aura.candidateItems ?? sourceMessage.aura.candidates)?.map((candidate) => + ids.has(candidate.candidateId) ? { ...candidate, status } : candidate + ), + } + : null; + if (!nextAura) return; + setMessages((prev) => + prev.map((entry) => + entry.id === sourceMessage.id + ? { + ...entry, + aura: nextAura, + text: nextAura.reply, + } + : entry + ) + ); + }, + [] + ); + + const handleAuraCandidateAction = React.useCallback( + async (action: AuraCandidateAction, sourceMessage: AIMessage) => { + if (!uid) { + Alert.alert("AURA", "Please sign in to add items."); + return; + } + const candidates = sourceMessage.aura?.candidates ?? []; + const candidateItems = sourceMessage.aura?.candidateItems ?? candidates; + const targetCandidates = + action.type === "add_all_candidates" + ? candidateItems.filter((candidate) => candidate.status === "awaiting_confirmation") + : candidateItems.filter((candidate) => candidate.candidateId === action.candidateId); + if (!targetCandidates.length) return; + + if (action.type === "cancel_candidate") { + updateCandidateStatuses(sourceMessage, targetCandidates.map((candidate) => candidate.candidateId), "cancelled"); + return; + } + + try { + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_CONFIRM]", "candidate confirm started", { + uid, + action, + candidateIds: targetCandidates.map((candidate) => candidate.candidateId), + candidateCount: targetCandidates.length, + }); + } + const localPhotosByCandidateId = resolveLocalPhotosForAuraCandidates( + latestMessagesRef.current, + sourceMessage, + targetCandidates + ); + if (DEBUG_AURA_CLIENT) { + console.log("[AURA_CONFIRM]", "candidate local photo resolution", { + uid, + candidateIds: targetCandidates.map((candidate) => candidate.candidateId), + localPhotoCandidateIds: Object.keys(localPhotosByCandidateId).filter( + (candidateId) => !!localPhotosByCandidateId[candidateId]?.localUri + ), + }); + } + const created = await createAuraItemDraftsFromCandidates({ + uid, + candidates: targetCandidates, + prompt: sourceMessage.text ?? sourceMessage.aura?.reply ?? "", + mode: action.type === "edit_candidate" ? "awaiting_confirmation" : "pending", + localPhotosByCandidateId, + }); + if (action.type === "edit_candidate") { + const first = created[0]; + if (first?.itemId) { + router.push({ + pathname: "/(tabs)/add", + params: { editId: first.itemId }, + }); + } + return; + } + updateCandidateStatuses(sourceMessage, targetCandidates.map((candidate) => candidate.candidateId), "added"); + const systemMessage = createSystemMessage( + created.length === 1 + ? "Added to your wardrobe. Processing it now." + : `Added ${created.length} items to your wardrobe. Processing them now.` + ); + setMessages((prev) => appendUniqueSystemMessage(prev, systemMessage.text ?? "")); + if (activeChatId) { + await appendMessageToChat(uid, activeChatId, systemMessage); + } + } catch (error) { + console.log("[AURA_CONFIRM_ERROR]", "candidate action failed", { + uid, + action, + errorCode: (error as { code?: unknown })?.code ?? null, + errorMessage: error instanceof Error ? error.message : String(error), + error, + }); + updateCandidateStatuses(sourceMessage, targetCandidates.map((candidate) => candidate.candidateId), "failed"); + } + }, + [activeChatId, uid, updateCandidateStatuses] ); useEffect(() => { @@ -523,65 +1452,39 @@ export default function AIScreen() { const heroChips = latestReply?.chips?.length ? latestReply.chips : quickChips; const orbScale = auraPulse.interpolate({ inputRange: [0, 1], - outputRange: [1, 1.08], + outputRange: [1, 1.035], }); const orbGlow = auraPulse.interpolate({ inputRange: [0, 1], - outputRange: [0.16, 0.34], + outputRange: [0.08, 0.18], }); - const thinkingScale = auraThinking.interpolate({ + const activityGlow = auraThinking.interpolate({ inputRange: [0, 1], - outputRange: [1, 1.08], + outputRange: [0.02, 0.12], }); - const thinkingGlow = auraThinking.interpolate({ - inputRange: [0, 1], - outputRange: [0, 0.18], - }); - const restingComposerBottom = Math.max(10, layout.composerOffset - 18); + const restingComposerBottom = layout.composerOffset; const isComposerActive = isComposerFocused || keyboardHeight > 0; - const composerBottom = keyboardHeight > 0 ? keyboardHeight + 6 : restingComposerBottom; + const keyboardComposerBottom = + keyboardHeight > 0 + ? Math.max(12, keyboardHeight + (Platform.OS === "ios" ? 8 : 4)) + : 0; + const composerBottom = keyboardHeight > 0 ? keyboardComposerBottom : restingComposerBottom; const composerContentPadding = - composerBottom + composerHeight + Math.max(layout.bottomDockPadding * 0.48, insets.bottom + 34); - const starterCardsPadding = composerBottom + composerHeight + 28 + Math.max(0, insets.bottom - 8); + composerBottom + composerHeight + Math.max(48, insets.bottom + 28); + const showEmptyState = messages.length === 0 && !loading && !isBooting && !message.trim(); + const showKeyboardWatermark = keyboardHeight > 0 && messages.length < 2; return ( - - + - + - setChatDrawerOpen(true)} + onReset={() => { + setMessage(""); + setMessages([]); + setActiveChatId(null); + setQuickChips(DEFAULT_CHIPS); + if (uid) { + void clearLatestChatCache(uid); + } + }} + /> + + + void handleAsk(chip)} + /> + + + + style={{ + borderRadius: 20, + overflow: "hidden", + borderWidth: 1, + borderColor: "rgba(243,223,195,0.18)", + }} + > { - if (!recentThreads.length || !uid) { - Alert.alert("AURA", "No recent chats yet."); - return; - } - Alert.alert( - "Recent chats", - undefined, - [ - ...recentThreads.slice(0, 5).map((thread) => ({ - text: thread.title || "AURA chat", - onPress: async () => { - const threadMessages = await loadChatMessages(uid, thread.chatId); - setMessages(threadMessages); - setActiveChatId(thread.chatId); - await saveLatestChatCache(uid, thread.chatId, thread.threadId, threadMessages); - }, - })), - { text: "Cancel", style: "cancel" as const }, - ] - ); - }} - style={({ pressed }) => ({ - width: 52, - height: 52, - borderRadius: 999, - alignItems: "center", - justifyContent: "center", - backgroundColor: "rgba(255,255,255,0.06)", - borderWidth: 1, - borderColor: "rgba(255,255,255,0.06)", - shadowColor: "#000", - shadowOpacity: 0.16, - shadowRadius: 12, - shadowOffset: { width: 0, height: 6 }, - opacity: pressed ? 0.84 : 1, - })} - > - - - - - - router.push("/aura/swipe")} + style={({ pressed }) => ({ + paddingHorizontal: 14, + paddingVertical: 12, + backgroundColor: pressed ? auraTheme.accentTintStrong : "rgba(18,21,28,0.88)", + })} + > + + + - + AURA TRAINING + + - - - - - - + Swipe through outfit edits + + + - AURA - - - - { - setMessage(""); - setMessages([]); - setActiveChatId(null); - setQuickChips(DEFAULT_CHIPS); - if (uid) { - void clearLatestChatCache(uid); - } - }} - style={({ pressed }) => ({ - width: 52, - height: 52, - borderRadius: 999, - alignItems: "center", - justifyContent: "center", - backgroundColor: "rgba(255,255,255,0.06)", - borderWidth: 1, - borderColor: "rgba(255,255,255,0.06)", - shadowColor: "#000", - shadowOpacity: 0.16, - shadowRadius: 12, - shadowOffset: { width: 0, height: 6 }, - opacity: pressed ? 0.82 : 1, - })} - > - + + Open + + + - - {messages.length === 0 ? null : ( - void handleAsk(chip)} /> - )} - - - {messages.length === 0 && !loading && !isBooting && !message.trim() ? ( - - - - AURA - - - Talk through a look, ask a style question, or just start chatting. - - - AURA can build looks, help you shop smarter, style a piece, or use your closet when it has something to work with. - - - - void handleAsk(chip)} - /> - ) : ( - + } + contentBottomPadding={Math.max(layout.bottomDockPadding + 150, composerContentPadding + 96)} + autoScrollSignal={focusScrollSignal} + emptyState={showEmptyState ? : } onSaveOutfit={() => {}} onMoreLikeThis={(outfit) => { if (outfit.reason) void handleAsk(`Refine this direction: ${outfit.reason}`); @@ -836,10 +1613,30 @@ export default function AIScreen() { if (outfit.reason) void handleAsk(`Keep the mood, but swap one piece: ${outfit.reason}`); }} onAuraAction={handleAuraLookAction} - /> - )} + onAuraCandidateAction={handleAuraCandidateAction} + /> + {showKeyboardWatermark ? ( + + AURA + + ) : null} + - void handleAsk()} - onPlusPress={() => Alert.alert("AURA", "Image styling is coming soon.")} - /> - + onPickImages={() => void handlePickImages()} + onTakePhoto={() => void handleTakePhoto()} + attachments={pendingAttachments} + attachmentRole={attachmentRole} + onAttachmentRoleChange={(role) => { + setAttachmentRole(role); + setPendingAttachments((prev) => + prev.map((attachment) => + attachment.type === "image" ? { ...attachment, role } : attachment + ) + ); + }} + onRemoveAttachment={(id) => + setPendingAttachments((prev) => prev.filter((attachment) => attachment.id !== id)) + } + onMicPress={() => void handleMicPress()} + recording={recordingAudio} + /> + setChatDrawerOpen(false)} + onSelectChat={async (thread) => { + if (!uid) return; + const threadMessages = await loadChatMessages(uid, thread.chatId); + setMessages(threadMessages); + setActiveChatId(thread.chatId); + await saveLatestChatCache(uid, thread.chatId, thread.threadId, threadMessages); + setChatDrawerOpen(false); + }} + /> + + ); } diff --git a/src/components/ai/AuraChatDrawer.tsx b/src/components/ai/AuraChatDrawer.tsx new file mode 100644 index 0000000..aa820dd --- /dev/null +++ b/src/components/ai/AuraChatDrawer.tsx @@ -0,0 +1,365 @@ +import React from "react"; +import { + Animated, + Easing, + Modal, + PanResponder, + Pressable, + ScrollView, + StyleSheet, + Text, + TextInput, + View, +} from "react-native"; +import { BlurView } from "expo-blur"; +import { Ionicons } from "@expo/vector-icons"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; + +import { Fonts, type AppColors } from "@/constants/theme"; +import type { AIChatThread } from "@/src/lib/aiChats"; + +import { auraTheme } from "./aiTheme"; + +type Section = { + title: string; + items: AIChatThread[]; +}; + +export default function AuraChatDrawer({ + visible, + colors, + activeChatId, + threads, + onClose, + onSelectChat, +}: { + visible: boolean; + colors: AppColors; + activeChatId: string | null; + threads: AIChatThread[]; + onClose: () => void; + onSelectChat: (thread: AIChatThread) => void; +}) { + const insets = useSafeAreaInsets(); + const [mounted, setMounted] = React.useState(visible); + const [query, setQuery] = React.useState(""); + const drawerWidth = 320; + const translateX = React.useRef(new Animated.Value(-drawerWidth)).current; + + const filteredThreads = React.useMemo(() => { + const normalized = query.trim().toLowerCase(); + if (!normalized) return threads; + return threads.filter((thread) => { + const haystack = `${thread.title} ${thread.lastMessagePreview}`.toLowerCase(); + return haystack.includes(normalized); + }); + }, [query, threads]); + + const sections = React.useMemo(() => buildSections(filteredThreads), [filteredThreads]); + + const overlayOpacity = translateX.interpolate({ + inputRange: [-drawerWidth, 0], + outputRange: [0, 0.45], + extrapolate: "clamp", + }); + + const closeDrawer = React.useCallback(() => { + Animated.timing(translateX, { + toValue: -drawerWidth, + duration: 260, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(({ finished }) => { + if (finished) { + setMounted(false); + onClose(); + } + }); + }, [drawerWidth, onClose, translateX]); + + React.useEffect(() => { + if (visible) { + setMounted(true); + Animated.timing(translateX, { + toValue: 0, + duration: 260, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + return; + } + if (mounted) { + closeDrawer(); + } + }, [closeDrawer, mounted, translateX, visible]); + + const panResponder = React.useMemo( + () => + PanResponder.create({ + onMoveShouldSetPanResponder: (_, gestureState) => + Math.abs(gestureState.dx) > Math.abs(gestureState.dy) && gestureState.dx < -6, + onPanResponderMove: (_, gestureState) => { + translateX.setValue(Math.max(-drawerWidth, Math.min(0, gestureState.dx))); + }, + onPanResponderRelease: (_, gestureState) => { + if (gestureState.dx < -drawerWidth * 0.18 || gestureState.vx < -0.65) { + closeDrawer(); + return; + } + Animated.timing(translateX, { + toValue: 0, + duration: 180, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + }, + onPanResponderTerminate: () => { + Animated.timing(translateX, { + toValue: 0, + duration: 180, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + }, + }), + [closeDrawer, drawerWidth, translateX], + ); + + if (!mounted) return null; + + return ( + + + + + + + + + + + + Chats + + + + + + + + + {sections.map((section) => ( + + {section.title} + {section.items.map((thread) => { + const isActive = thread.chatId === activeChatId; + return ( + { + onSelectChat(thread); + closeDrawer(); + }} + style={({ pressed }) => [ + styles.chatRow, + isActive ? styles.chatRowActive : null, + pressed ? styles.chatRowPressed : null, + ]} + > + + + {thread.title || "AURA chat"} + + + {thread.lastMessagePreview || "New stylist chat"} + + + {formatTimestamp(thread.updatedAt)} + + ); + })} + + ))} + {!sections.length ? ( + No chats yet. + ) : null} + + + + + ); +} + +function buildSections(threads: AIChatThread[]): Section[] { + const today: AIChatThread[] = []; + const yesterday: AIChatThread[] = []; + const previous: AIChatThread[] = []; + const now = new Date(); + const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); + const startOfYesterday = startOfToday - 86400000; + + threads.forEach((thread) => { + if (thread.updatedAt >= startOfToday) { + today.push(thread); + return; + } + if (thread.updatedAt >= startOfYesterday) { + yesterday.push(thread); + return; + } + previous.push(thread); + }); + + return [ + { title: "Today", items: today }, + { title: "Yesterday", items: yesterday }, + { title: "Previous", items: previous }, + ].filter((section) => section.items.length); +} + +function formatTimestamp(value: number) { + const date = new Date(value); + const now = new Date(); + const sameDay = + date.getFullYear() === now.getFullYear() && + date.getMonth() === now.getMonth() && + date.getDate() === now.getDate(); + if (sameDay) { + return date.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" }); + } + return date.toLocaleDateString([], { month: "short", day: "numeric" }); +} + +const styles = StyleSheet.create({ + root: { + flex: 1, + justifyContent: "flex-start", + }, + overlay: { + ...StyleSheet.absoluteFillObject, + backgroundColor: "#000", + }, + drawer: { + flex: 1, + backgroundColor: "rgba(10,16,24,0.92)", + borderRightWidth: 1, + borderRightColor: "rgba(255,255,255,0.06)", + }, + drawerOverlay: { + ...StyleSheet.absoluteFillObject, + backgroundColor: "rgba(7,12,19,0.78)", + }, + header: { + paddingHorizontal: 18, + paddingBottom: 14, + }, + title: { + fontFamily: Fonts.sans, + fontSize: 27, + lineHeight: 30, + fontWeight: "700", + letterSpacing: -0.8, + }, + searchShell: { + marginHorizontal: 18, + marginBottom: 18, + borderRadius: 16, + borderWidth: 1, + borderColor: "rgba(255,255,255,0.06)", + backgroundColor: "rgba(255,255,255,0.03)", + flexDirection: "row", + alignItems: "center", + gap: 8, + paddingHorizontal: 12, + paddingVertical: 10, + }, + searchInput: { + flex: 1, + fontFamily: Fonts.sans, + fontSize: 14.5, + lineHeight: 18, + paddingVertical: 0, + }, + content: { + paddingHorizontal: 12, + paddingBottom: 24, + gap: 16, + }, + section: { + gap: 8, + }, + sectionTitle: { + paddingHorizontal: 6, + color: auraTheme.textFaint, + fontFamily: Fonts.sans, + fontSize: 11, + fontWeight: "700", + letterSpacing: 0.8, + textTransform: "uppercase", + }, + chatRow: { + borderRadius: 16, + paddingHorizontal: 12, + paddingVertical: 10, + flexDirection: "row", + alignItems: "flex-start", + gap: 10, + }, + chatRowActive: { + backgroundColor: "rgba(143,216,255,0.12)", + }, + chatRowPressed: { + opacity: 0.82, + }, + chatBody: { + flex: 1, + gap: 3, + }, + chatTitle: { + fontFamily: Fonts.sans, + fontSize: 14.5, + lineHeight: 18, + fontWeight: "600", + }, + chatPreview: { + color: auraTheme.textMuted, + fontFamily: Fonts.sans, + fontSize: 12.5, + lineHeight: 16, + }, + chatTime: { + minWidth: 52, + textAlign: "right", + color: auraTheme.textFaint, + fontFamily: Fonts.sans, + fontSize: 11.5, + lineHeight: 16, + fontWeight: "600", + }, + emptyText: { + paddingHorizontal: 8, + color: auraTheme.textMuted, + fontFamily: Fonts.sans, + fontSize: 13.5, + lineHeight: 18, + }, +}); diff --git a/src/components/ai/AuraHeader.tsx b/src/components/ai/AuraHeader.tsx new file mode 100644 index 0000000..75986b0 --- /dev/null +++ b/src/components/ai/AuraHeader.tsx @@ -0,0 +1,136 @@ +import { Ionicons } from "@expo/vector-icons"; +import React from "react"; +import { Animated, Pressable, Text, View } from "react-native"; + +import { Fonts, type AppColors } from "@/constants/theme"; +import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; + +import AuraOrb from "./AuraOrb"; +import { auraTheme } from "./aiTheme"; + +export default function AuraHeader({ + colors, + recentThreadsCount, + onOpenRecent, + onReset, + orbScale, + orbGlow, + activityGlow, + streaming, +}: { + colors: AppColors; + recentThreadsCount: number; + onOpenRecent: () => void; + onReset: () => void; + orbScale: Animated.AnimatedInterpolation; + orbGlow: Animated.AnimatedInterpolation; + activityGlow: Animated.AnimatedInterpolation; + streaming: boolean; +}) { + const layout = useResponsiveLayout(); + + return ( + + + + + + + + AURA + + + + + + + ); +} + +function HeaderAction({ + colors, + icon, + label, + onPress, +}: { + colors: AppColors; + icon: keyof typeof Ionicons.glyphMap; + label: string; + onPress: () => void; +}) { + return ( + ({ + flexDirection: "row", + alignItems: "center", + gap: 6, + borderRadius: 999, + paddingHorizontal: 9, + paddingVertical: 6, + backgroundColor: pressed ? "rgba(255,255,255,0.05)" : "rgba(255,255,255,0.015)", + borderWidth: 1, + borderColor: auraTheme.borderSoft, + })} + > + + + {label} + + + ); +} diff --git a/src/components/ai/AuraOrb.tsx b/src/components/ai/AuraOrb.tsx new file mode 100644 index 0000000..413ef33 --- /dev/null +++ b/src/components/ai/AuraOrb.tsx @@ -0,0 +1,85 @@ +import { LinearGradient } from "expo-linear-gradient"; +import React from "react"; +import { Animated, View } from "react-native"; + +import { auraTheme } from "./aiTheme"; + +export default function AuraOrb({ + scale, + glow, + activityGlow, +}: { + scale: Animated.AnimatedInterpolation; + glow: Animated.AnimatedInterpolation; + activityGlow: Animated.AnimatedInterpolation; +}) { + return ( + + + + + + + + + + ); +} diff --git a/src/components/ai/AuraQuickChips.tsx b/src/components/ai/AuraQuickChips.tsx index 143b2fd..bb4896b 100644 --- a/src/components/ai/AuraQuickChips.tsx +++ b/src/components/ai/AuraQuickChips.tsx @@ -1,9 +1,11 @@ import React from "react"; -import { Animated, Pressable, ScrollView, Text, View } from "react-native"; +import { Animated, Pressable, ScrollView, Text } from "react-native"; import { Fonts } from "@/constants/theme"; import { useAppTheme } from "@/src/hooks/useAppTheme"; +import { auraTheme } from "./aiTheme"; + const DEFAULT_CHIPS = [ "What should I wear today?", "Build a fit for tonight", @@ -23,27 +25,22 @@ export default function AuraQuickChips({ onPress: (chip: string) => void; }) { const { colors } = useAppTheme(); - - if (variant === "cards" && items?.length) { - return ( - - {items.map((item) => ( - - ))} - - ); - } + const source = variant === "cards" && items?.length ? items : chips; return ( - - {chips.map((chip) => ( - - ))} - + + {source.map((item, index) => + typeof item === "string" ? ( + + ) : ( + + ) + )} + ); } @@ -51,12 +48,33 @@ function ChipCard({ item, onPress, colors, + index, }: { item: { title: string; subtitle: string; prompt: string }; onPress: (chip: string) => void; colors: ReturnType["colors"]; + index: number; }) { const scale = React.useRef(new Animated.Value(1)).current; + const opacity = React.useRef(new Animated.Value(0)).current; + const translateY = React.useRef(new Animated.Value(6)).current; + + React.useEffect(() => { + Animated.parallel([ + Animated.timing(opacity, { + toValue: 1, + duration: 180, + delay: index * 30, + useNativeDriver: true, + }), + Animated.timing(translateY, { + toValue: 0, + duration: 180, + delay: index * 30, + useNativeDriver: true, + }), + ]).start(); + }, [index, opacity, translateY]); function animateTo(value: number) { Animated.timing(scale, { @@ -67,31 +85,35 @@ function ChipCard({ } return ( - + onPress(item.prompt)} onPressIn={() => animateTo(0.98)} onPressOut={() => animateTo(1)} style={{ - width: 286, - minHeight: 104, - borderRadius: 28, - backgroundColor: "rgba(255,255,255,0.062)", + width: 164, + minHeight: 46, + borderRadius: 15, + backgroundColor: "rgba(255,255,255,0.018)", borderWidth: 1, - borderColor: "rgba(255,255,255,0.05)", - paddingHorizontal: 18, - paddingVertical: 16, - justifyContent: "flex-end", - shadowColor: "#000", - shadowOpacity: 0.13, - shadowRadius: 16, - shadowOffset: { width: 0, height: 10 }, + borderColor: auraTheme.borderSoft, + paddingHorizontal: 10, + paddingVertical: 7, + justifyContent: "center", }} > - + {item.title} - + {item.subtitle} @@ -103,12 +125,33 @@ function Chip({ label, onPress, colors, + index, }: { label: string; onPress: (chip: string) => void; colors: ReturnType["colors"]; + index: number; }) { const scale = React.useRef(new Animated.Value(1)).current; + const opacity = React.useRef(new Animated.Value(0)).current; + const translateY = React.useRef(new Animated.Value(6)).current; + + React.useEffect(() => { + Animated.parallel([ + Animated.timing(opacity, { + toValue: 1, + duration: 180, + delay: index * 30, + useNativeDriver: true, + }), + Animated.timing(translateY, { + toValue: 0, + duration: 180, + delay: index * 30, + useNativeDriver: true, + }), + ]).start(); + }, [index, opacity, translateY]); function animateTo(value: number) { Animated.timing(scale, { @@ -119,22 +162,26 @@ function Chip({ } return ( - + onPress(label)} onPressIn={() => animateTo(0.97)} onPressOut={() => animateTo(1)} style={{ - paddingHorizontal: 13, - paddingVertical: 7, + maxWidth: 210, + paddingHorizontal: 10, + paddingVertical: 5, borderRadius: 999, - backgroundColor: "rgba(255,255,255,0.03)", + backgroundColor: "rgba(255,255,255,0.018)", borderWidth: 1, - borderColor: "rgba(255,255,255,0.04)", + borderColor: auraTheme.borderSoft, }} > - + {label} diff --git a/src/components/ai/AuraReplyCard.tsx b/src/components/ai/AuraReplyCard.tsx index 54cf07b..9c3ddd2 100644 --- a/src/components/ai/AuraReplyCard.tsx +++ b/src/components/ai/AuraReplyCard.tsx @@ -1,5 +1,6 @@ +import { Ionicons } from "@expo/vector-icons"; import React from "react"; -import { Text, View } from "react-native"; +import { Animated, FlatList, Image, NativeScrollEvent, NativeSyntheticEvent, Pressable, Text, View, useWindowDimensions } from "react-native"; import { Fonts } from "@/constants/theme"; import { AuraLookCard } from "@/src/components/aura/AuraLookCard"; @@ -7,81 +8,319 @@ import { useAppTheme } from "@/src/hooks/useAppTheme"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; import { sanitizeDisplayText } from "@/src/lib/text"; import type { ClothingItem } from "@/src/types/ClothingItem"; -import type { AuraResponse } from "@/src/types/aura"; +import type { AuraCandidateAction, AuraCandidateItem, AuraLook, AuraLookOptionMeta, AuraResponse } from "@/src/types/aura"; + +import { auraShadow, auraTheme } from "./aiTheme"; + +const DEBUG_AURA_CLIENT = + __DEV__ && process.env.EXPO_PUBLIC_AURA_DEBUG === "1"; +const AnimatedFlatList = Animated.createAnimatedComponent(FlatList); export default function AuraReplyCard({ data, itemsById, onAction, + onCandidateAction, }: { data: AuraResponse; itemsById: Map; - onAction?: (action: import("@/src/types/aura").AuraLookAction) => void; + onAction?: (action: import("@/src/types/aura").AuraLookAction, look: AuraLook, option?: AuraLookOptionMeta) => void; + onCandidateAction?: (action: AuraCandidateAction) => void; }) { const { colors } = useAppTheme(); const layout = useResponsiveLayout(); + const { width: windowWidth } = useWindowDimensions(); const ownedPieces = data.ownedPieces?.filter(Boolean) ?? []; const recommendedAdditions = data.recommendedAdditions?.filter(Boolean) ?? []; + const levelUpSuggestions = buildLevelUpSuggestions(data); const fallbackItems = - !ownedPieces.length && !recommendedAdditions.length - ? data.outfitItems?.filter(Boolean).slice(0, 5) ?? [] - : []; + !ownedPieces.length && !recommendedAdditions.length ? data.outfitItems?.filter(Boolean).slice(0, 5) ?? [] : []; + const candidateItems = data.candidateItems ?? data.candidates ?? []; + const lookOptions = data.lookOptions?.filter(Boolean) ?? []; + const [selectedLookIndex, setSelectedLookIndex] = React.useState(0); + const [feedbackState, setFeedbackState] = React.useState>({}); + const scrollX = React.useRef(new Animated.Value(0)).current; + + React.useEffect(() => { + if (!DEBUG_AURA_CLIENT) return; + console.log("[AURA_FRONTEND_PAYLOAD]", "AuraReplyCard payload", { + presentation: data.presentation, + hasLook: !!data.look, + lookOptionsCount: lookOptions.length, + candidateItemsCount: candidateItems.length, + ownedPiecesCount: ownedPieces.length, + outfitItemsCount: data.outfitItems?.length ?? 0, + title: data.title, + }); + }, [ + candidateItems.length, + data.look, + data.outfitItems?.length, + data.presentation, + data.title, + lookOptions.length, + ownedPieces.length, + ]); - if (data.look) { + React.useEffect(() => { + if (selectedLookIndex >= lookOptions.length && lookOptions.length > 0) { + setSelectedLookIndex(0); + } + }, [lookOptions.length, selectedLookIndex]); + + if (candidateItems.length) { return ( - - {(!!data.reply || !!data.title) && ( - - - AURA + + {candidateItems.length > 1 ? ( + onCandidateAction?.({ type: "add_all_candidates" })} + style={({ pressed }) => ({ + alignSelf: "flex-start", + borderRadius: 999, + paddingHorizontal: 11, + paddingVertical: 6, + backgroundColor: pressed ? auraTheme.accentTintStrong : auraTheme.accentTint, + borderWidth: 1, + borderColor: auraTheme.borderAccent, + })} + > + + Add All - {!!data.reply && ( - - {sanitizeDisplayText(data.reply)} - - )} + + ) : null} + + {candidateItems.map((candidate) => ( + + ))} + + ); + } + + if (data.presentation === "candidate_preview") { + return ( + + + Candidate preview expected but no candidate items were delivered. + + + ); + } + + if (data.look || lookOptions.length) { + const looks = lookOptions.length ? lookOptions : data.look ? [data.look] : []; + const sidePeek = 10; + const railWidth = Math.max( + 288, + Math.min(windowWidth * 0.89, windowWidth - layout.horizontalPadding * 2 - 22), + ); + const railGap = 10; + const railStride = railWidth + railGap; + const selectedLook = looks[selectedLookIndex] ?? looks[0]; + const selectedMeta = getLookOptionMeta(selectedLookIndex, selectedLook); + const horizontalInset = Math.max(0, (windowWidth - railWidth) / 2 - layout.horizontalPadding - sidePeek); + const feedbackKey = String(selectedMeta.optionId ?? `look-option-${selectedLookIndex + 1}`); + const selectedFeedback = feedbackState[feedbackKey] ?? null; + + function handleFeedback(next: "like" | "dislike") { + setFeedbackState((prev) => ({ + ...prev, + [feedbackKey]: prev[feedbackKey] === next ? null : next, + })); + if (next === "like") { + onAction?.("likeLook", selectedLook, selectedMeta); + } else { + onAction?.("notMyVibe", selectedLook, selectedMeta); + } + } + + function handleTryAgain() { + onAction?.("showMoreLikeThis", selectedLook, selectedMeta); + } + + function handleLookScroll(event: NativeSyntheticEvent) { + if (!lookOptions.length) return; + const nextIndex = Math.round(event.nativeEvent.contentOffset.x / railStride); + if (nextIndex !== selectedLookIndex && nextIndex >= 0 && nextIndex < looks.length) { + setSelectedLookIndex(nextIndex); + } + } + + return ( + + {looks.length > 1 ? ( + + {selectedLook ? ( + handleFeedback("dislike")} + onTryAgain={handleTryAgain} + onLike={() => handleFeedback("like")} + /> + ) : null} + `${look.lookTitle}-${index}`} + horizontal + showsHorizontalScrollIndicator={false} + decelerationRate="fast" + snapToAlignment="start" + snapToInterval={railStride} + disableIntervalMomentum + pagingEnabled={false} + onMomentumScrollEnd={handleLookScroll} + onScroll={Animated.event( + [{ nativeEvent: { contentOffset: { x: scrollX } } }], + { useNativeDriver: true } + )} + scrollEventThrottle={16} + contentContainerStyle={{ paddingLeft: horizontalInset, paddingRight: horizontalInset }} + renderItem={({ item: look, index }) => { + const option = getLookOptionMeta(index, look); + const inputRange = [ + (index - 1) * railStride, + index * railStride, + (index + 1) * railStride, + ]; + const cardScale = scrollX.interpolate({ + inputRange, + outputRange: [0.97, 1, 0.97], + extrapolate: "clamp", + }); + const cardOpacity = scrollX.interpolate({ + inputRange, + outputRange: [0.8, 1, 0.8], + extrapolate: "clamp", + }); + return ( + + + + ); + }} + /> + + {looks.map((look, index) => { + const active = index === selectedLookIndex; + return ( + + ); + })} + + {selectedLook ? ( + <> + + + Swipe to compare options. Actions apply to {selectedMeta.optionLabel?.toLowerCase() ?? "this look"}. + + + ) : null} + + ) : ( + + { + const option = getLookOptionMeta(0, looks[0]); + const key = String(option.optionId ?? "look-option-1"); + setFeedbackState((prev) => ({ + ...prev, + [key]: prev[key] === "dislike" ? null : "dislike", + })); + onAction?.("notMyVibe", looks[0], option); + }} + onTryAgain={() => onAction?.("showMoreLikeThis", looks[0], getLookOptionMeta(0, looks[0]))} + onLike={() => { + const option = getLookOptionMeta(0, looks[0]); + const key = String(option.optionId ?? "look-option-1"); + setFeedbackState((prev) => ({ + ...prev, + [key]: prev[key] === "like" ? null : "like", + })); + onAction?.("likeLook", looks[0], option); + }} + /> + + )} - - + ); } return ( - + + {!!ownedPieces.length && !data.look ? ( + + {ownedPieces.slice(0, 5).map((item) => ( + + ))} + + ) : null} + + {!!recommendedAdditions.length && !data.look ? ( + + {recommendedAdditions.slice(0, 5).map((item) => ( + + ))} + + ) : null} + + {!!fallbackItems.length && !data.look ? ( + + {fallbackItems.map((item) => ( + + ))} + + ) : null} + + {!!data.reason ? ( + + ) : null} + + {!!data.swapSuggestion && !data.look ? ( + + ) : null} + + + + ); +} + +function buildLevelUpSuggestions(data: AuraResponse) { + const suggestionsFromItems = + data.upgradeSuggestionItems + ?.map((item) => ({ + label: sanitizeDisplayText(item.label), + searchQuery: item.searchQuery ?? undefined, + })) + .filter((item) => item.label) ?? []; + const suggestionsFromStrings = (data.upgradeSuggestions ?? []) + .map((label) => ({ + label: sanitizeDisplayText(label), + })) + .filter((item) => item.label); + const missingPieces = (data.missingPieces ?? []) + .map((label) => ({ + label: sanitizeDisplayText(label), + })) + .filter((item) => item.label); + + return Array.from( + new Map( + [...missingPieces, ...suggestionsFromItems, ...suggestionsFromStrings].map((item) => [ + item.label.toLowerCase(), + item, + ]) + ).values() + ).slice(0, 3); +} + +function LevelThisUpSection({ + suggestions, + colors, +}: { + suggestions: { label: string; searchQuery?: string }[]; + colors: ReturnType["colors"]; +}) { + if (!suggestions.length) return null; + + return ( + - {sanitizeDisplayText(data.reply)} + Level this up - - {!!ownedPieces.length && !data.look && ( - - + {suggestions.map((item) => ( + - FROM YOUR CLOSET - - - {ownedPieces.slice(0, 5).map((item) => ( - - ))} + + {item.label} + - - )} + ))} + + + ); +} + +function getLookOptionMeta(index: number, look?: AuraLook | null): AuraLookOptionMeta { + const preferredLabel = sanitizeDisplayText(look?.personalizationLabel) || sanitizeDisplayText(look?.vibe); + const normalized = preferredLabel.toLowerCase(); + const derivedLabel = + normalized.includes("safe") + ? "Safe" + : normalized.includes("balanced") + ? "Balanced" + : normalized.includes("bold") + ? "Bold" + : index === 0 + ? "Safe" + : index === 1 + ? "Balanced" + : index === 2 + ? "Bold" + : `Option ${index + 1}`; + return { + optionIndex: index, + optionLabel: derivedLabel, + optionId: `look-option-${index + 1}`, + }; +} - {!!recommendedAdditions.length && !data.look && ( - - ["colors"]; + selected: "like" | "dislike" | null; + onDislike: () => void; + onTryAgain: () => void; + onLike: () => void; +}) { + return ( + + + + + + ); +} + +function FeedbackChip({ + label, + icon, + active, + colors, + onPress, +}: { + label: string; + icon: keyof typeof Ionicons.glyphMap; + active: boolean; + colors: ReturnType["colors"]; + onPress: () => void; +}) { + const scale = React.useRef(new Animated.Value(1)).current; + + function animateTo(value: number) { + Animated.timing(scale, { + toValue: value, + duration: 120, + useNativeDriver: true, + }).start(); + } + + return ( + + animateTo(0.96)} + onPressOut={() => animateTo(1)} + style={({ pressed }) => ({ + flex: 1, + minHeight: 34, + borderRadius: 999, + paddingHorizontal: 10, + paddingVertical: 7, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 6, + backgroundColor: active + ? label === "Not it" + ? "rgba(255,255,255,0.07)" + : auraTheme.accentTint + : "rgba(255,255,255,0.02)", + borderWidth: 1, + borderColor: active ? auraTheme.borderAccent : "rgba(255,255,255,0.08)", + opacity: pressed ? 0.88 : 1, + })} + > + + + {label} + + + + ); +} + +function LookActionRow({ + look, + option, + onAction, +}: { + look: AuraLook; + option: AuraLookOptionMeta; + onAction?: (action: import("@/src/types/aura").AuraLookAction, look: AuraLook, option?: AuraLookOptionMeta) => void; +}) { + if (!onAction) return null; + + return ( + + onAction("saveLook", look, option)} + pressedBackground={auraTheme.accentTintStrong} + backgroundColor={auraTheme.accentTint} + borderColor="rgba(255,255,255,0.12)" + > + + Save look + + + onAction("planForToday", look, option)} + pressedBackground="rgba(255,255,255,0.08)" + backgroundColor={auraTheme.surfaceStrong} + borderColor={auraTheme.borderSoft} + > + + Plan today + + + + ); +} + +function ActionButton({ + children, + onPress, + backgroundColor, + pressedBackground, + borderColor, +}: { + children: React.ReactNode; + onPress: () => void; + backgroundColor: string; + pressedBackground: string; + borderColor: string; +}) { + const scale = React.useRef(new Animated.Value(1)).current; + + function animateTo(value: number) { + Animated.timing(scale, { + toValue: value, + duration: 100, + useNativeDriver: true, + }).start(); + } + + return ( + + animateTo(0.97)} + onPressOut={() => animateTo(1)} + style={({ pressed }) => ({ + minHeight: 52, + borderRadius: 18, + alignItems: "center", + justifyContent: "center", + borderWidth: 1, + borderColor, + backgroundColor: pressed ? pressedBackground : backgroundColor, + opacity: pressed ? 0.96 : 1, + })} + > + {children} + + + ); +} + +function Group({ + title, + titleColor, + children, +}: { + title: string; + titleColor: string; + children: React.ReactNode; +}) { + return ( + + + {title} + + {children} + + ); +} + +function MetaRow({ + label, + value, + colors, + emphasis, +}: { + label: string; + value: string; + colors: ReturnType["colors"]; + emphasis?: boolean; +}) { + return ( + + + {label} + + + {sanitizeDisplayText(value)} + + + ); +} + +function CandidateCard({ + candidate, + colors, + onAction, +}: { + candidate: AuraCandidateItem; + colors: ReturnType["colors"]; + onAction?: (action: AuraCandidateAction) => void; +}) { + const disabled = candidate.status === "added" || candidate.status === "cancelled"; + const title = + sanitizeDisplayText(candidate.title ?? "") || + [candidate.color, candidate.subCategory ?? candidate.category].filter(Boolean).join(" ") || + "Item preview"; + const fields = [ + ["Category", candidate.category], + ["Subcategory", candidate.subCategory], + ["Color", candidate.color], + ["Brand", candidate.brand], + ["Material", candidate.material], + ["Fit", candidate.fit], + ["Pattern", candidate.pattern], + ].filter((entry): entry is [string, string] => !!entry[1]); + const categoryLabel = displayCategory(candidate.category, candidate.subCategory); + const needsReview = candidate.status === "needs_review"; + + return ( + + + - ADD TO COMPLETE IT - - - {recommendedAdditions.slice(0, 5).map((item) => ( - + resizeMode="cover" + /> + + + + {title} + + + {candidate.status === "added" + ? "ADDED" + : candidate.status === "cancelled" + ? "CANCELLED" + : candidate.status === "needs_review" + ? "NEEDS REVIEW" + : candidate.status === "failed" + ? "COULDN'T SAVE THIS ITEM" + : "REVIEW ITEM"} + + + {needsReview ? ( + + I couldn't fully read this item. Review the details before adding. + + ) : null} + {candidate.status === "failed" ? ( + + Could not save this item. Retry, edit, or cancel. + + ) : null} + + {fields.slice(0, 6).map(([label, value]) => ( + + + {label}: {label === "Category" ? categoryLabel : sanitizeDisplayText(value)} + + ))} - )} + - {!!fallbackItems.length && !data.look && ( - - {fallbackItems.map((item) => ( - - ))} - - )} - - {!!data.reason && ( - - - WHY - - - {sanitizeDisplayText(data.reason)} - - - )} - - {!!data.swapSuggestion && !data.look && ( - - - SWAP - - - {sanitizeDisplayText(data.swapSuggestion)} - - - )} + + onAction?.({ type: "add_candidate", candidateId: candidate.candidateId })} + /> + onAction?.({ type: "edit_candidate", candidateId: candidate.candidateId })} + /> + onAction?.({ type: "cancel_candidate", candidateId: candidate.candidateId })} + /> + ); } +function displayCategory(category?: string | null, subCategory?: string | null) { + const raw = String(category ?? "").trim().toLowerCase(); + const sub = String(subCategory ?? "").trim().toLowerCase(); + const combined = `${raw} ${sub}`; + if (raw === "clothing" || raw === "apparel" || !raw) { + if (/\b(shirt|tee|tshirt|t-shirt|polo|blouse|tank|top|hoodie|sweater)\b/.test(combined)) return "Top"; + if (/\b(jacket|coat|blazer)\b/.test(combined)) return "Outerwear"; + if (/\b(pant|trouser|jean|short|skirt)\b/.test(combined)) return "Bottom"; + if (/\b(shoe|sneaker|boot|loafer|heel|sandal)\b/.test(combined)) return "Footwear"; + if (/\b(dress|jumpsuit|romper)\b/.test(combined)) return "One piece"; + if (/\b(watch|bag|cap|hat|glasses|necklace|bracelet|ring|belt|scarf|perfume)\b/.test(combined)) return "Accessory"; + } + if (raw === "tops") return "Top"; + if (raw === "bottoms") return "Bottom"; + if (raw === "shoes") return "Footwear"; + return sanitizeDisplayText(category); +} + +function CandidateButton({ + label, + tone, + disabled, + onPress, +}: { + label: string; + tone: "primary" | "secondary" | "ghost"; + disabled?: boolean; + onPress: () => void; +}) { + const backgroundColor = + tone === "primary" ? auraTheme.accentTint : tone === "secondary" ? auraTheme.surfaceSoft : "transparent"; + const borderColor = + tone === "primary" ? auraTheme.borderAccent : tone === "secondary" ? auraTheme.border : auraTheme.borderSoft; + const scale = React.useRef(new Animated.Value(1)).current; + + function animateTo(value: number) { + Animated.timing(scale, { + toValue: value, + duration: 100, + useNativeDriver: true, + }).start(); + } + + return ( + + animateTo(0.97)} + onPressOut={() => animateTo(1)} + style={({ pressed }) => ({ + borderRadius: 999, + paddingHorizontal: 10, + paddingVertical: 6, + backgroundColor: pressed ? "rgba(255,255,255,0.12)" : backgroundColor, + borderWidth: 1, + borderColor, + opacity: disabled ? 0.42 : pressed ? 0.94 : 1, + })} + > + {label} + + + ); +} + function Tag({ label, colors, @@ -238,20 +986,15 @@ function Tag({ tone: "owned" | "suggested" | "default"; }) { const backgroundColor = - tone === "owned" - ? "rgba(143,216,255,0.12)" - : tone === "suggested" - ? "rgba(255,255,255,0.05)" - : "rgba(255,255,255,0.04)"; - const borderColor = - tone === "owned" ? "rgba(143,216,255,0.18)" : "rgba(255,255,255,0.04)"; + tone === "owned" ? auraTheme.accentTint : tone === "suggested" ? auraTheme.surfaceSoft : auraTheme.surfaceSofter; + const borderColor = tone === "owned" ? auraTheme.borderAccent : auraTheme.borderSoft; const textColor = tone === "owned" ? "#d7f2ff" : colors.text; return ( { const loop = Animated.loop( Animated.sequence([ - Animated.timing(pulse, { toValue: 1, duration: 500, useNativeDriver: true }), - Animated.timing(pulse, { toValue: 0.4, duration: 500, useNativeDriver: true }), + Animated.timing(pulse, { toValue: 1, duration: 560, useNativeDriver: true }), + Animated.timing(pulse, { toValue: 0.45, duration: 560, useNativeDriver: true }), ]) ); loop.start(); @@ -26,12 +27,12 @@ function TypingBubble({ colors }: { colors: AppColors }) { void; onMoreLikeThis: (outfit: import("./chatTypes").ChatOutfit) => void; onSwapOutfit: (outfit: import("./chatTypes").ChatOutfit) => void; - onAuraAction?: (action: AuraLookAction, message: AIMessage) => void; + onAuraAction?: ( + action: AuraLookAction, + message: AIMessage, + look?: import("@/src/types/aura").AuraLook, + lookOption?: AuraLookOptionMeta, + ) => void; + onAuraCandidateAction?: (action: AuraCandidateAction, message: AIMessage) => void; }) { const listRef = useRef>(null); const previousCountRef = useRef(messages.length); const hasStreamingMessage = messages.some((message) => message.streaming); const shouldPinToBottomRef = useRef(true); + const previousBottomPaddingRef = useRef(contentBottomPadding); const lastMessage = messages[messages.length - 1]; - const showTypingBubble = - loading && - !hasStreamingMessage && - !!lastMessage && - lastMessage.type === "user"; + const showTypingBubble = loading && !hasStreamingMessage && !!lastMessage && lastMessage.type === "user"; function scrollToLatest(animated: boolean) { requestAnimationFrame(() => { @@ -99,8 +106,7 @@ export default function ChatList({ function handleScroll(event: NativeSyntheticEvent) { const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent; - const distanceFromBottom = - contentSize.height - (contentOffset.y + layoutMeasurement.height); + const distanceFromBottom = contentSize.height - (contentOffset.y + layoutMeasurement.height); shouldPinToBottomRef.current = distanceFromBottom < 72; } @@ -115,9 +121,30 @@ export default function ChatList({ return () => clearTimeout(timer); }, [hasStreamingMessage, loading, messages]); + useEffect(() => { + const paddingDelta = Math.abs(contentBottomPadding - previousBottomPaddingRef.current); + previousBottomPaddingRef.current = contentBottomPadding; + if (!messages.length || paddingDelta < 8) return; + + shouldPinToBottomRef.current = true; + const timer = setTimeout(() => scrollToLatest(false), 90); + return () => clearTimeout(timer); + }, [contentBottomPadding, messages.length]); + + useEffect(() => { + if (!messages.length) return; + shouldPinToBottomRef.current = true; + const timers = [ + setTimeout(() => scrollToLatest(false), 140), + setTimeout(() => scrollToLatest(false), 420), + ]; + return () => timers.forEach(clearTimeout); + }, [autoScrollSignal, messages.length]); + return ( item.id} keyboardShouldPersistTaps="handled" @@ -129,39 +156,56 @@ export default function ChatList({ scrollToLatest(false); } }} + onLayout={() => { + if (messages.length && (shouldPinToBottomRef.current || hasStreamingMessage)) { + scrollToLatest(false); + } + }} contentContainerStyle={{ flexGrow: 1, - justifyContent: "flex-end", - paddingTop: 22, - paddingHorizontal: 2, - paddingBottom: Math.max(20, contentBottomPadding + 8), - gap: 18, + justifyContent: messages.length ? "flex-start" : "flex-end", + paddingTop: 0, + paddingHorizontal: 4, + paddingBottom: Math.max(12, contentBottomPadding), + gap: 12, }} - contentInset={{ bottom: Math.max(8, contentBottomPadding * 0.35) }} - scrollIndicatorInsets={{ bottom: contentBottomPadding + 12 }} + contentInset={{ bottom: Math.max(4, contentBottomPadding * 0.18) }} + scrollIndicatorInsets={{ bottom: contentBottomPadding + 6 }} ListEmptyComponent={emptyState ?? null} - renderItem={({ item }) => ( - - )} - ItemSeparatorComponent={() => } + renderItem={({ item, index }) => { + const isLastMessage = index === messages.length - 1; + const hasOutfitActions = + (item.kind === "aura_card" && !!(item.aura?.look || item.aura?.lookOptions?.length)) || + (item.type === "outfit" && !!item.outfits?.length); + const finalOutfitSpacer = + isLastMessage && hasOutfitActions ? Math.max(148, contentBottomPadding * 0.5) : 0; + + return ( + + + + ); + }} + ItemSeparatorComponent={() => } ListFooterComponent={ showTypingBubble ? ( - + - + ) : ( - + ) } showsVerticalScrollIndicator={false} diff --git a/src/components/ai/ChatMessage.tsx b/src/components/ai/ChatMessage.tsx index b505915..faf0f47 100644 --- a/src/components/ai/ChatMessage.tsx +++ b/src/components/ai/ChatMessage.tsx @@ -1,15 +1,46 @@ import React, { useEffect, useRef } from "react"; -import { Animated, Easing, Text, View } from "react-native"; +import { Animated, Easing, Image, Text, View } from "react-native"; +import * as Haptics from "expo-haptics"; +import Reanimated, { + Easing as ReanimatedEasing, + useAnimatedStyle, + useSharedValue, + withTiming, +} from "react-native-reanimated"; import { Fonts, type AppColors } from "@/constants/theme"; +import { useReduceMotion } from "@/hooks/useReduceMotion"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; +import { formatUrlForDisplay, isUrlOnlyMessage } from "@/src/lib/formatChatText"; import { sanitizeDisplayText } from "@/src/lib/text"; import type { ClothingItem } from "@/src/types/ClothingItem"; +import type { AuraCandidateAction, AuraLook, AuraLookAction, AuraLookOptionMeta } from "@/src/types/aura"; import AuraReplyCard from "./AuraReplyCard"; import OutfitMessage from "./OutfitMessage"; import type { AIMessage } from "./chatTypes"; -import type { AuraLookAction } from "@/src/types/aura"; +import { auraShadow, auraTheme } from "./aiTheme"; + +function cleanIntroText(value?: string | null) { + return sanitizeDisplayText(value)?.replace(/\s+/g, " ").trim() ?? ""; +} + +function fallbackStructuredIntro(message: AIMessage) { + const candidateItems = message.aura?.candidateItems ?? message.aura?.candidates ?? []; + if (candidateItems.length) { + return "I found this item. Review it before I add it to your wardrobe."; + } + if (message.aura?.look || message.aura?.lookOptions?.length) { + if ((message.aura?.lookOptions?.length ?? 0) > 1) { + return "Got you — I built a few looks from your closet that match that direction."; + } + return "Got you — I pulled a look together that stays close to that direction."; + } + if (message.outfits?.length) { + return "Got you — I built a few looks from your closet that match that direction."; + } + return "Got you — here’s what I’d do."; +} export default function ChatMessage({ colors, @@ -21,6 +52,7 @@ export default function ChatMessage({ onMoreLikeThis, onSwapOutfit, onAuraAction, + onAuraCandidateAction, }: { colors: AppColors; message: AIMessage; @@ -30,70 +62,180 @@ export default function ChatMessage({ onSaveOutfit: (outfitId: string) => void; onMoreLikeThis: (outfit: import("./chatTypes").ChatOutfit) => void; onSwapOutfit: (outfit: import("./chatTypes").ChatOutfit) => void; - onAuraAction?: (action: AuraLookAction, message: AIMessage) => void; + onAuraAction?: (action: AuraLookAction, message: AIMessage, look?: AuraLook, lookOption?: AuraLookOptionMeta) => void; + onAuraCandidateAction?: (action: AuraCandidateAction, message: AIMessage) => void; }) { const layout = useResponsiveLayout(); const fade = useRef(new Animated.Value(0)).current; - const rise = useRef(new Animated.Value(12)).current; + const rise = useRef(new Animated.Value(8)).current; + const scale = useRef(new Animated.Value(0.98)).current; + const introFade = useRef(new Animated.Value(0)).current; + const cardFade = useRef(new Animated.Value(0)).current; + const cardRise = useRef(new Animated.Value(14)).current; + const cardScale = useRef(new Animated.Value(0.98)).current; + const pulse = useRef(new Animated.Value(0.45)).current; + const isStructuredCard = (message.kind === "aura_card" && !!message.aura) || (message.type === "outfit" && !!message.outfits?.length); + const structuredIntroText = cleanIntroText(message.assistantIntroText ?? message.text) || fallbackStructuredIntro(message); + const isUser = message.kind === "user_text" || message.type === "user"; + const isAuraText = message.kind === "aura_text"; + const displayText = isUser ? message.text : sanitizeDisplayText(message.text); + const isStreamingPlaceholder = !isUser && !!message.streaming && !displayText; + const isUserUrlOnly = isUser && isUrlOnlyMessage(displayText); + const formattedUserText = isUserUrlOnly ? formatUrlForDisplay(String(displayText ?? "")) : displayText; useEffect(() => { + if (isStructuredCard) { + Animated.sequence([ + Animated.parallel([ + Animated.timing(introFade, { + toValue: 1, + duration: 200, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(rise, { + toValue: 0, + duration: 200, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(scale, { + toValue: 1, + duration: 200, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + ]), + Animated.delay(140), + Animated.parallel([ + Animated.timing(cardFade, { + toValue: 1, + duration: 240, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(cardRise, { + toValue: 0, + duration: 240, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(cardScale, { + toValue: 1, + duration: 240, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + ]), + ]).start(); + return; + } + Animated.parallel([ Animated.timing(fade, { toValue: 1, - duration: 260, + duration: isUser ? 180 : 210, easing: Easing.out(Easing.cubic), useNativeDriver: true, }), Animated.timing(rise, { toValue: 0, - duration: 260, + duration: isUser ? 180 : 210, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(scale, { + toValue: 1, + duration: isUser ? 180 : 210, easing: Easing.out(Easing.cubic), useNativeDriver: true, }), ]).start(); - }, [fade, rise]); + }, [cardFade, cardRise, cardScale, fade, introFade, isStructuredCard, isUser, rise, scale]); + + useEffect(() => { + if (!isStreamingPlaceholder) { + pulse.stopAnimation(); + pulse.setValue(0.45); + return; + } + const loop = Animated.loop( + Animated.sequence([ + Animated.timing(pulse, { + toValue: 1, + duration: 520, + easing: Easing.inOut(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(pulse, { + toValue: 0.45, + duration: 520, + easing: Easing.inOut(Easing.cubic), + useNativeDriver: true, + }), + ]) + ); + loop.start(); + return () => loop.stop(); + }, [isStreamingPlaceholder, pulse]); if (message.type === "outfit" && message.outfits?.length) { return ( - - {message.outfits.map((outfit, index) => ( - onSaveOutfit(outfit.id)} - onMoreLikeThis={onMoreLikeThis} - onSwap={onSwapOutfit} - /> - ))} - + + + + + + + {message.outfits.map((outfit, index) => ( + onSaveOutfit(outfit.id)} + onMoreLikeThis={onMoreLikeThis} + onSwap={onSwapOutfit} + /> + ))} + + + ); } if (message.kind === "aura_card" && message.aura) { - const isLookSurface = !!message.aura.look; + const isLookSurface = !!message.aura.look || !!message.aura.lookOptions?.length; return ( - - - onAuraAction(action, message) : undefined} - /> - - + + + + + + + onAuraAction(action, message, look, lookOption) : undefined} + onCandidateAction={ + onAuraCandidateAction ? (action) => onAuraCandidateAction(action, message) : undefined + } + /> + + + + ); } @@ -103,20 +245,28 @@ export default function ChatMessage({ (displayText ?? "").startsWith("Try this today:") || (displayText ?? "").startsWith("Stylist note:"); return ( - + {isSuggestion ? ( - + AURA NOTE @@ -131,41 +281,123 @@ export default function ChatMessage({ ); } - const isUser = message.kind === "user_text" || message.type === "user"; - const isAuraText = message.kind === "aura_text"; - const displayText = isUser ? message.text : sanitizeDisplayText(message.text); - const isStreamingPlaceholder = !isUser && !!message.streaming && !displayText; + if (isAuraText) { + return ( + + + + + AURA + + + + {isStreamingPlaceholder ? ( + + {[0, 1, 2].map((index) => ( + + ))} + + ) : displayText ? ( + + {displayText} + + ) : null} + + ); + } return ( - + {!isUser ? ( @@ -173,22 +405,20 @@ export default function ChatMessage({ ) : null} + {isStreamingPlaceholder ? ( @@ -206,19 +436,152 @@ export default function ChatMessage({ ))} ) : ( - - {displayText} - + <> + {message.attachments?.length ? ( + + {message.attachments.map((attachment) => ( + + {attachment.type === "image" ? ( + + ) : ( + + + Voice note + + + )} + + ))} + + ) : null} + {formattedUserText ? ( + + {formattedUserText} + + ) : null} + )} ); } + +function OutfitCardEntry({ + children, +}: { + children: React.ReactNode; +}) { + const reduceMotion = useReduceMotion(); + const opacity = useSharedValue(reduceMotion ? 1 : 0); + const translateY = useSharedValue(reduceMotion ? 0 : 16); + + useEffect(() => { + void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => undefined); + if (reduceMotion) { + opacity.value = 1; + translateY.value = 0; + return; + } + opacity.value = withTiming(1, { + duration: 380, + easing: ReanimatedEasing.out(ReanimatedEasing.cubic), + }); + translateY.value = withTiming(0, { + duration: 380, + easing: ReanimatedEasing.out(ReanimatedEasing.cubic), + }); + }, [opacity, reduceMotion, translateY]); + + const entryStyle = useAnimatedStyle(() => ({ + opacity: opacity.value, + transform: [{ translateY: translateY.value }], + })); + + return {children}; +} + +function StructuredAuraIntro({ + colors, + text, + compact = false, +}: { + colors: AppColors; + text: string; + compact?: boolean; +}) { + return ( + + + + + AURA + + + + + {text} + + + ); +} diff --git a/src/components/ai/InputBar.tsx b/src/components/ai/InputBar.tsx index a3afada..b2c7da9 100644 --- a/src/components/ai/InputBar.tsx +++ b/src/components/ai/InputBar.tsx @@ -4,18 +4,31 @@ import React from "react"; import { Animated, Easing, + Image, NativeSyntheticEvent, Platform, Pressable, StyleSheet, + Text, TextInput, TextInputContentSizeChangeEventData, View, } from "react-native"; import { Fonts, type AppColors } from "@/constants/theme"; +import { getAttachmentGroupingLabel } from "@/src/lib/auraIntent"; import { useResponsiveLayout } from "@/src/hooks/useResponsiveLayout"; +import type { ChatAttachment, ChatAttachmentGroupRole } from "./chatTypes"; +import { auraTheme } from "./aiTheme"; + +const BASE_COMPOSER_HEIGHT = 44; +const BASE_INPUT_HEIGHT = 26; +const MAX_INPUT_LINES = 4; +const INPUT_LINE_HEIGHT = 20; +const MAX_INPUT_HEIGHT = INPUT_LINE_HEIGHT * MAX_INPUT_LINES; +const AnimatedTextInput = Animated.createAnimatedComponent(TextInput); + export default function InputBar({ colors, value, @@ -27,7 +40,14 @@ export default function InputBar({ onFocusChange, onHeightChange, onSend, - onPlusPress, + onPickImages, + onTakePhoto, + onRemoveAttachment, + attachmentRole, + onAttachmentRoleChange, + onMicPress, + recording, + attachments = [], }: { colors: AppColors; value: string; @@ -39,25 +59,31 @@ export default function InputBar({ onFocusChange: (focused: boolean) => void; onHeightChange?: (height: number) => void; onSend: () => void; - onPlusPress: () => void; + onPickImages: () => void; + onTakePhoto: () => void; + onRemoveAttachment: (id: string) => void; + attachmentRole: ChatAttachmentGroupRole; + onAttachmentRoleChange: (role: ChatAttachmentGroupRole) => void; + onMicPress: () => void; + recording?: boolean; + attachments?: ChatAttachment[]; }) { const layout = useResponsiveLayout(); - const canSend = value.trim().length > 0 && !loading; + const canSend = (value.trim().length > 0 || attachments.length > 0) && !loading; + const [menuOpen, setMenuOpen] = React.useState(false); + const [inputHeight, setInputHeight] = React.useState(BASE_INPUT_HEIGHT); const focusAnim = React.useRef(new Animated.Value(active ? 1 : 0)).current; const bottomAnim = React.useRef(new Animated.Value(bottom)).current; - const heightAnim = React.useRef(new Animated.Value(20)).current; - const [contentHeight, setContentHeight] = React.useState(20); - const minComposerHeight = layout.screenSize === "compact" ? 56 : 58; - const maxComposerHeight = layout.screenSize === "compact" ? 132 : 140; - const maxTextHeight = layout.screenSize === "compact" ? 82 : 92; - const clampedContentHeight = Math.max(20, Math.min(contentHeight, maxTextHeight)); - const shouldScrollInput = contentHeight > maxTextHeight; + const menuAnim = React.useRef(new Animated.Value(0)).current; + const inputHeightAnim = React.useRef(new Animated.Value(BASE_INPUT_HEIGHT)).current; + const sendVisibilityAnim = React.useRef(new Animated.Value(canSend ? 1 : 0)).current; + const sendMotionAnim = React.useRef(new Animated.Value(0)).current; React.useEffect(() => { Animated.timing(focusAnim, { toValue: active ? 1 : 0, - duration: 260, - easing: Easing.bezier(0.22, 1, 0.36, 1), + duration: 160, + easing: Easing.out(Easing.cubic), useNativeDriver: false, }).start(); }, [active, focusAnim]); @@ -65,25 +91,51 @@ export default function InputBar({ React.useEffect(() => { Animated.timing(bottomAnim, { toValue: bottom, - duration: Platform.OS === "ios" ? 260 : 180, + duration: Platform.OS === "ios" ? 220 : 160, easing: Easing.bezier(0.22, 1, 0.36, 1), useNativeDriver: false, }).start(); }, [bottom, bottomAnim]); React.useEffect(() => { - Animated.timing(heightAnim, { - toValue: clampedContentHeight, + Animated.timing(menuAnim, { + toValue: menuOpen ? 1 : 0, duration: 180, + easing: Easing.bezier(0.22, 1, 0.36, 1), + useNativeDriver: false, + }).start(); + }, [menuAnim, menuOpen]); + + React.useEffect(() => { + Animated.timing(inputHeightAnim, { + toValue: inputHeight, + duration: 160, easing: Easing.out(Easing.cubic), useNativeDriver: false, }).start(); - }, [clampedContentHeight, heightAnim]); + }, [inputHeight, inputHeightAnim]); - const estimatedComposerHeight = Math.max( - minComposerHeight, - Math.min(maxComposerHeight, clampedContentHeight + 18) - ); + React.useEffect(() => { + Animated.parallel([ + Animated.timing(sendVisibilityAnim, { + toValue: canSend ? 1 : 0, + duration: 140, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + ]).start(); + }, [canSend, sendVisibilityAnim]); + + const attachmentRailHeight = attachments.length > 0 ? 58 : 0; + const menuHeight = menuOpen ? 70 : 0; + const rowHeightDelta = Math.max(0, inputHeight - BASE_INPUT_HEIGHT); + const estimatedComposerHeight = BASE_COMPOSER_HEIGHT + attachmentRailHeight + menuHeight + rowHeightDelta; + + React.useEffect(() => { + if (!value) { + setInputHeight((current) => (current === BASE_INPUT_HEIGHT ? current : BASE_INPUT_HEIGHT)); + } + }, [value]); React.useEffect(() => { onHeightChange?.(estimatedComposerHeight); @@ -93,25 +145,31 @@ export default function InputBar({ bottom: bottomAnim, borderRadius: focusAnim.interpolate({ inputRange: [0, 1], - outputRange: [layout.largeRadius + 6, layout.largeRadius + 1], + outputRange: [22, 20], }), borderColor: focusAnim.interpolate({ inputRange: [0, 1], - outputRange: ["rgba(255,255,255,0.07)", "rgba(143,216,255,0.18)"], + outputRange: ["rgba(255,245,234,0.08)", "rgba(122,182,255,0.26)"], }), backgroundColor: focusAnim.interpolate({ inputRange: [0, 1], - outputRange: ["rgba(20,24,30,0.82)", "rgba(17,21,28,0.9)"], + outputRange: ["rgba(14,17,24,0.9)", "rgba(18,21,28,0.96)"], }), shadowOpacity: focusAnim.interpolate({ inputRange: [0, 1], - outputRange: [0.24, 0.18], + outputRange: [0.14, 0.22], }), shadowRadius: focusAnim.interpolate({ inputRange: [0, 1], - outputRange: [22, 14], + outputRange: [12, 18], }), transform: [ + { + scale: focusAnim.interpolate({ + inputRange: [0, 1], + outputRange: [1, 1.015], + }), + }, { translateY: focusAnim.interpolate({ inputRange: [0, 1], @@ -121,151 +179,204 @@ export default function InputBar({ ], } as const; - const chromeStyle = { - paddingHorizontal: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [8, 7], - }), - paddingTop: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [4, 3], - }), - paddingBottom: focusAnim.interpolate({ + const menuTrayStyle = { + maxHeight: menuAnim.interpolate({ inputRange: [0, 1], - outputRange: [4, 3], - }), - } as const; - - const plusWrapStyle = { - width: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [30, 29], - }), - height: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [30, 29], - }), - opacity: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [1, 0.96], - }), - marginRight: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [0, 1], - }), - } as const; - - const inputLaneStyle = { - minHeight: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [36, 35], - }), - borderRadius: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [layout.pillRadius, layout.pillRadius - 2], - }), - paddingHorizontal: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [12, 11], - }), - paddingTop: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [7, 6], - }), - paddingBottom: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [7, 6], - }), - backgroundColor: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: ["rgba(255,255,255,0.028)", "rgba(255,255,255,0.018)"], + outputRange: [0, 78], }), + opacity: menuAnim, + transform: [ + { + translateY: menuAnim.interpolate({ + inputRange: [0, 1], + outputRange: [6, 0], + }), + }, + ], } as const; - const sendWrapStyle = { - width: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [31, 30], - }), - height: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [31, 30], - }), - marginLeft: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [0, 1], - }), - marginBottom: focusAnim.interpolate({ - inputRange: [0, 1], - outputRange: [0, 1], - }), - } as const; + const sendOpacity = sendVisibilityAnim; +const sendScale = sendVisibilityAnim.interpolate({ + inputRange: [0, 1], + outputRange: [0.85, 1], +}); + const micOpacity = sendVisibilityAnim.interpolate({ + inputRange: [0, 1], + outputRange: [1, 0], + }); + const micScale = sendVisibilityAnim.interpolate({ + inputRange: [0, 1], + outputRange: [1, 0.92], + }); function handleContentSizeChange( - event: NativeSyntheticEvent + event: NativeSyntheticEvent, ) { - const nextHeight = event.nativeEvent.contentSize.height; - if (Math.abs(nextHeight - contentHeight) > 1) { - setContentHeight(nextHeight); + const nextHeight = Math.max( + BASE_INPUT_HEIGHT, + Math.min(MAX_INPUT_HEIGHT, Math.ceil(event.nativeEvent.contentSize.height)), + ); + if (Math.abs(nextHeight - inputHeight) > 1) { + setInputHeight(nextHeight); + } + } + + function handleComposerPress() { + setMenuOpen(false); + } + + function handleTextChange(next: string) { + onChangeText(next); + if (!next) { + setInputHeight(BASE_INPUT_HEIGHT); } } + function handleSendPress() { + if (!canSend || loading) return; + Animated.sequence([ + Animated.timing(sendMotionAnim, { + toValue: -6, + duration: 90, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }), + Animated.timing(sendMotionAnim, { + toValue: 0, + duration: 120, + easing: Easing.inOut(Easing.cubic), + useNativeDriver: true, + }), + ]).start(); + setInputHeight(BASE_INPUT_HEIGHT); + onSend(); + } + return ( - - - - + + + + {attachments.length ? ( + + + ATTACHMENTS + {(["same_item", "separate_items", "reference"] as const).map((role) => ( + onAttachmentRoleChange(role)} + style={[ + styles.attachmentRoleChip, + attachmentRole === role ? styles.attachmentRoleChipActive : null, + ]} + > + + {getAttachmentGroupingLabel(role)} + + + ))} + + + {attachments.map((attachment) => ( + + {attachment.type === "image" ? ( + + ) : ( + + + + )} + onRemoveAttachment(attachment.id)} style={styles.removeAttachmentButton}> + + + + ))} + + + ) : null} + + + { + setMenuOpen(false); + onPickImages(); + }} + colors={colors} + /> + { + setMenuOpen(false); + onTakePhoto(); + }} + colors={colors} + /> + + + + setMenuOpen((prev) => !prev)} + style={({ pressed }) => [ + styles.sideButton, + menuOpen ? styles.sideButtonActive : null, + pressed ? styles.sideButtonPressed : null, + ]} > - + - + - - + {!value ? ( + + + {placeholder} + + + ) : null} + onFocusChange(true)} onBlur={() => onFocusChange(false)} - onContentSizeChange={handleContentSizeChange} onSubmitEditing={() => { - if (canSend) onSend(); + if (canSend) handleSendPress(); }} - placeholder={placeholder} - placeholderTextColor={colors.textSecondary} + onContentSizeChange={handleContentSizeChange} + placeholder="" multiline blurOnSubmit={false} autoCapitalize="sentences" @@ -273,50 +384,255 @@ export default function InputBar({ spellCheck returnKeyType="send" keyboardAppearance="dark" - scrollEnabled={shouldScrollInput} + scrollEnabled={inputHeight >= MAX_INPUT_HEIGHT} selectionColor={colors.aiAccent} cursorColor={colors.aiAccent} maxLength={600} - style={{ - color: colors.text, - fontFamily: Fonts.sans, - fontSize: 15, - lineHeight: 19, - minHeight: 20, - maxHeight: maxTextHeight, - height: clampedContentHeight, - paddingTop: 0, - paddingBottom: 0, - paddingVertical: 0, - includeFontPadding: false, - textAlignVertical: clampedContentHeight > 24 ? "top" : "center", - }} + style={[ + styles.input, + { + color: colors.text, + height: inputHeight, + }, + ]} /> - + [ + styles.sideButton, + styles.trailingButton, + canSend ? styles.trailingButtonSend : null, + recording && !canSend ? styles.trailingButtonRecording : null, + pressed ? styles.sideButtonPressed : null, + loading ? styles.sideButtonDisabled : null, + ]} > - + + + + + + - - - + + + ); } + +function AttachmentOption({ + label, + icon, + onPress, + colors, +}: { + label: string; + icon: keyof typeof Ionicons.glyphMap; + onPress: () => void; + colors: AppColors; +}) { + return ( + [styles.attachmentOption, pressed ? styles.sideButtonPressed : null]}> + + {label} + + ); +} + +const styles = StyleSheet.create({ + shell: { + position: "absolute", + overflow: "hidden", + borderWidth: 1, + zIndex: 30, + shadowColor: "#000", + shadowOffset: { width: 0, height: 8 }, + elevation: 16, + }, + chrome: { + paddingHorizontal: 10, + paddingTop: 3, + paddingBottom: 3, + }, + attachmentRail: { + gap: 4, + paddingHorizontal: 1, + paddingBottom: 3, + }, + attachmentHeader: { + flexDirection: "row", + alignItems: "center", + gap: 8, + flexWrap: "wrap", + }, + attachmentLabel: { + color: auraTheme.textFaint, + fontSize: 9.5, + fontWeight: "800", + letterSpacing: 0.7, + }, + attachmentRoleChip: { + borderRadius: 999, + paddingHorizontal: 8, + paddingVertical: 3, + }, + attachmentRoleChipActive: { + backgroundColor: "rgba(243,190,221,0.14)", + }, + attachmentRoleText: { + color: auraTheme.textMuted, + fontSize: 10, + fontWeight: "800", + }, + attachmentRoleTextActive: { + color: "#F4FBFF", + }, + attachmentItems: { + flexDirection: "row", + gap: 7, + }, + attachmentThumb: { + width: 36, + height: 36, + borderRadius: 9, + overflow: "hidden", + backgroundColor: auraTheme.surfaceSoft, + borderWidth: 1, + borderColor: auraTheme.borderSoft, + }, + attachmentFallback: { + flex: 1, + alignItems: "center", + justifyContent: "center", + }, + removeAttachmentButton: { + position: "absolute", + top: 3, + right: 3, + width: 18, + height: 18, + borderRadius: 999, + alignItems: "center", + justifyContent: "center", + backgroundColor: "rgba(0,0,0,0.56)", + }, + menuTray: { + overflow: "hidden", + paddingHorizontal: 2, + gap: 3, + }, + attachmentOption: { + borderRadius: 14, + paddingHorizontal: 11, + paddingVertical: 7, + backgroundColor: "rgba(255,255,255,0.03)", + borderWidth: 1, + borderColor: auraTheme.borderSoft, + flexDirection: "row", + alignItems: "center", + gap: 10, + marginBottom: 3, + }, + attachmentOptionText: { + color: "#F0F6FB", + fontSize: 12.5, + fontWeight: "800", + }, + row: { + flexDirection: "row", + alignItems: "center", + gap: 2, + }, + iconLane: { + width: 34, + alignItems: "center", + justifyContent: "center", + }, + sideButton: { + width: 30, + height: 30, + borderRadius: 11, + alignItems: "center", + justifyContent: "center", + backgroundColor: "rgba(255,255,255,0.025)", + borderWidth: 1, + borderColor: "rgba(255,245,234,0.07)", + }, + sideButtonActive: { + backgroundColor: "rgba(243,190,221,0.14)", + borderColor: "rgba(243,190,221,0.18)", + }, + trailingButton: { + position: "relative", + }, + trailingButtonSend: { + backgroundColor: "rgba(222,211,248,0.18)", + borderColor: "rgba(222,211,248,0.28)", + }, + trailingButtonRecording: { + backgroundColor: "rgba(255,99,99,0.18)", + }, + sideButtonPressed: { + opacity: 0.82, + }, + sideButtonDisabled: { + opacity: 0.48, + }, + inputSlot: { + flex: 1, + minWidth: 0, + borderRadius: 0, + backgroundColor: "transparent", + justifyContent: "center", + minHeight: 30, + position: "relative", + }, + placeholderLayer: { + position: "absolute", + left: 4, + right: 4, + top: 0, + bottom: 0, + justifyContent: "center", + }, + placeholderText: { + fontFamily: Fonts.sans, + fontSize: 13.5, + lineHeight: INPUT_LINE_HEIGHT, + includeFontPadding: false, + }, + input: { + borderRadius: 0, + paddingHorizontal: 4, + paddingTop: Platform.OS === "ios" ? 2 : 1, + paddingBottom: Platform.OS === "ios" ? 2 : 1, + marginTop: 0, + fontFamily: Fonts.sans, + fontSize: 13.5, + lineHeight: INPUT_LINE_HEIGHT, + letterSpacing: 0.1, + backgroundColor: "transparent", + includeFontPadding: false, + textAlignVertical: Platform.OS === "android" ? "center" : "top", + }, +}); diff --git a/src/components/ai/OutfitMessage.tsx b/src/components/ai/OutfitMessage.tsx index 1351bad..546ce69 100644 --- a/src/components/ai/OutfitMessage.tsx +++ b/src/components/ai/OutfitMessage.tsx @@ -1,13 +1,15 @@ +import FastImage from "@d11/react-native-fast-image"; import { LinearGradient } from "expo-linear-gradient"; import React from "react"; -import { Image, Pressable, Text, View } from "react-native"; +import { Pressable, Text, View } from "react-native"; import type { AppColors } from "@/constants/theme"; -import { getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; +import { getItemImageDecoration, getItemImagePresentation, getItemImageUrl } from "@/src/lib/itemImage"; import { sanitizeDisplayText } from "@/src/lib/text"; import type { ClothingItem } from "@/src/types/ClothingItem"; import type { ChatOutfit } from "./chatTypes"; +import { auraShadow, auraTheme } from "./aiTheme"; function displayName(item: ClothingItem) { return item.name || `${item.displayColor ?? item.primaryColor ?? ""} ${item.category}`.trim(); @@ -49,28 +51,24 @@ export default function OutfitMessage({ return ( - + LOOK {index + 1} - + Styled for right now @@ -79,10 +77,12 @@ export default function OutfitMessage({ paddingHorizontal: 12, paddingVertical: 7, borderRadius: 999, - backgroundColor: "rgba(139,157,255,0.14)", + backgroundColor: "rgba(243,190,221,0.12)", + borderWidth: 1, + borderColor: "rgba(243,223,195,0.18)", }} > - + {Math.round(outfit.score * 100)}% match @@ -94,9 +94,9 @@ export default function OutfitMessage({ paddingHorizontal: 12, paddingVertical: 10, borderRadius: 16, - backgroundColor: "rgba(255,255,255,0.045)", + backgroundColor: "rgba(255,255,255,0.04)", borderWidth: 1, - borderColor: "rgba(255,255,255,0.06)", + borderColor: auraTheme.borderSoft, }} > @@ -105,36 +105,54 @@ export default function OutfitMessage({ ) : null} - + {cleanReason} {pickedItems.map(({ slot, item }) => { const imageUri = getItemImageUrl(item, { variant: "thumb" }); + const imagePresentation = getItemImagePresentation(item, { surface: "ai_outfit" }); + const imageDecoration = getItemImageDecoration(item, "ai_outfit"); return ( - {(() => { - const imagePresentation = getItemImagePresentation(item, { - surface: "ai_outfit", - }); - return ( + {imageUri ? ( - )} - ); - })()} - + {slotLabel(slot)} - + {displayName(item)} @@ -174,13 +190,13 @@ export default function OutfitMessage({ paddingHorizontal: 14, paddingVertical: 10, borderRadius: 999, - backgroundColor: colors.aiAccent, + backgroundColor: "rgba(243,223,195,0.16)", + borderWidth: 1, + borderColor: "rgba(243,223,195,0.24)", opacity: pressed ? 0.86 : 1, })} > - - {saving ? "Saving..." : "Save to Today"} - + {saving ? "Saving..." : "Save to Today"} onSwap(outfit)} @@ -188,13 +204,13 @@ export default function OutfitMessage({ paddingHorizontal: 14, paddingVertical: 10, borderRadius: 999, - backgroundColor: "rgba(255,255,255,0.02)", + backgroundColor: auraTheme.surfaceSoft, borderWidth: 1, - borderColor: "rgba(255,255,255,0.08)", + borderColor: auraTheme.borderSoft, opacity: pressed ? 0.82 : 1, })} > - Swap item + Swap item onMoreLikeThis(outfit)} @@ -202,11 +218,12 @@ export default function OutfitMessage({ paddingHorizontal: 14, paddingVertical: 10, borderRadius: 999, - backgroundColor: "transparent", + borderWidth: 1, + borderColor: "rgba(255,255,255,0.04)", opacity: pressed ? 0.82 : 1, })} > - More like this + More like this diff --git a/src/components/ai/aiTheme.ts b/src/components/ai/aiTheme.ts new file mode 100644 index 0000000..f7d370e --- /dev/null +++ b/src/components/ai/aiTheme.ts @@ -0,0 +1,38 @@ +import { ThemeTokens } from "@/constants/theme"; + +const palette = ThemeTokens.dark; + +export const auraTheme = { + backgroundTop: palette.gradients.background[0], + backgroundMid: palette.gradients.background[1], + backgroundBottom: palette.gradients.background[2], + gradientAura: palette.gradients.aura, + surface: "rgba(13,16,22,0.84)", + surfaceStrong: "rgba(16,19,26,0.94)", + surfaceSoft: "rgba(255,255,255,0.05)", + surfaceSofter: "rgba(255,255,255,0.028)", + border: "rgba(255,245,234,0.09)", + borderSoft: palette.colors.borderSoft, + borderAccent: "rgba(220,210,255,0.18)", + accent: palette.colors.auraLavender, + accentStrong: palette.colors.textPrimary, + accentTint: "rgba(216,200,255,0.12)", + accentTintStrong: "rgba(216,200,255,0.18)", + glow: "rgba(216,200,255,0.18)", + textMuted: "rgba(247,241,232,0.68)", + textFaint: "rgba(247,241,232,0.42)", + userBubble: "rgba(232,222,208,0.15)", + userBubbleEdge: "rgba(243,223,195,0.18)", + danger: "rgba(255,120,120,0.16)", + dangerBorder: "rgba(255,120,120,0.26)", +}; + +export function auraShadow(opacity = 0.22) { + return { + shadowColor: "#000", + shadowOpacity: opacity, + shadowRadius: 24, + shadowOffset: { width: 0, height: 14 }, + elevation: 18, + } as const; +} diff --git a/src/components/ai/chatTypes.ts b/src/components/ai/chatTypes.ts index 1bd6066..e68fad1 100644 --- a/src/components/ai/chatTypes.ts +++ b/src/components/ai/chatTypes.ts @@ -1,5 +1,29 @@ import type { AuraResponse } from "@/src/types/aura"; +export type ChatAttachmentGroupRole = "same_item" | "separate_items" | "reference"; + +export type ChatImageAttachment = { + id: string; + type: "image"; + uri: string; + localUri?: string | null; + groupId?: string | null; + role?: ChatAttachmentGroupRole; + width?: number | null; + height?: number | null; +}; + +export type ChatAudioAttachment = { + id: string; + type: "audio"; + uri: string; + localUri?: string | null; + durationMs?: number | null; + transcript?: string | null; +}; + +export type ChatAttachment = ChatImageAttachment | ChatAudioAttachment; + export type ChatOutfit = { id: string; picks: { slot: string; itemId: string }[]; @@ -12,6 +36,8 @@ export type AIMessage = { type: "user" | "assistant" | "outfit" | "system/action"; kind?: "user_text" | "aura_text" | "aura_card" | "system"; text?: string; + assistantIntroText?: string; + attachments?: ChatAttachment[]; streaming?: boolean; outfits?: ChatOutfit[]; aura?: AuraResponse; diff --git a/src/lib/aiChats.ts b/src/lib/aiChats.ts index 478fb0a..5b1bb7c 100644 --- a/src/lib/aiChats.ts +++ b/src/lib/aiChats.ts @@ -11,8 +11,17 @@ import { } from "firebase/firestore"; import { db } from "@/src/lib/firebase"; -import type { AIMessage } from "@/src/components/ai/chatTypes"; -import type { AuraLook, AuraLookAction, AuraLookPiece, AuraResponse } from "@/src/types/aura"; +import type { AIMessage, ChatAttachment } from "@/src/components/ai/chatTypes"; +import type { + AuraLook, + AuraLookAction, + AuraLookPiece, + AuraResponse, + AuraSuggestionItem, +} from "@/src/types/aura"; + +const DEBUG_AURA_CLIENT = + __DEV__ && process.env.EXPO_PUBLIC_AURA_DEBUG === "1"; export type AIChatThread = { chatId: string; @@ -69,6 +78,15 @@ function toChatMessage(snapshot: { id: string; data: () => Record Record(value: T): T { + if (Array.isArray(value)) { + return value.map((entry) => stripUndefinedDeep(entry)) as T; + } + if (value && typeof value === "object") { + return Object.fromEntries( + Object.entries(value as Record) + .filter(([, entry]) => entry !== undefined) + .map(([key, entry]) => [key, stripUndefinedDeep(entry)]) + ) as T; + } + return value; +} + +function parseChatAttachments(value: unknown): ChatAttachment[] | undefined { + if (!Array.isArray(value)) return undefined; + const attachments = value.reduce((out, entry) => { + if (!entry || typeof entry !== "object") return out; + const candidate = entry as Record; + const type = candidate.type === "audio" ? "audio" : candidate.type === "image" ? "image" : null; + const uri = typeof candidate.uri === "string" ? candidate.uri : ""; + const id = typeof candidate.id === "string" ? candidate.id : ""; + if (!type || !uri || !id) return out; + if (type === "image") { + out.push({ + id, + type, + uri, + localUri: typeof candidate.localUri === "string" ? candidate.localUri : null, + groupId: typeof candidate.groupId === "string" ? candidate.groupId : null, + role: + candidate.role === "same_item" || + candidate.role === "separate_items" || + candidate.role === "reference" + ? candidate.role + : undefined, + width: typeof candidate.width === "number" ? candidate.width : null, + height: typeof candidate.height === "number" ? candidate.height : null, + }); + return out; + } + out.push({ + id, + type, + uri, + localUri: typeof candidate.localUri === "string" ? candidate.localUri : null, + durationMs: typeof candidate.durationMs === "number" ? candidate.durationMs : null, + transcript: typeof candidate.transcript === "string" ? candidate.transcript : null, + }); + return out; + }, []); + return attachments.length ? attachments : undefined; +} + function isAuraResponse(value: unknown): value is AuraResponse { if (!value || typeof value !== "object") return false; const candidate = value as Record; return ( (candidate.presentation === undefined || candidate.presentation === "chat" || - candidate.presentation === "card") && + candidate.presentation === "card" || + candidate.presentation === "candidate_preview") && typeof candidate.title === "string" && typeof candidate.reply === "string" && typeof candidate.reason === "string" && Array.isArray(candidate.outfitItems) && (candidate.ownedPieces === undefined || Array.isArray(candidate.ownedPieces)) && (candidate.recommendedAdditions === undefined || Array.isArray(candidate.recommendedAdditions)) && + (candidate.missingPieces === undefined || Array.isArray(candidate.missingPieces)) && + (candidate.upgradeSuggestions === undefined || Array.isArray(candidate.upgradeSuggestions)) && + (candidate.upgradeSuggestionItems === undefined || + (Array.isArray(candidate.upgradeSuggestionItems) && + candidate.upgradeSuggestionItems.every(isAuraSuggestionItem))) && Array.isArray(candidate.chips) && typeof candidate.swapSuggestion === "string" && - (candidate.look === undefined || candidate.look === null || isAuraLook(candidate.look)) + (candidate.look === undefined || candidate.look === null || isAuraLook(candidate.look)) && + (candidate.lookOptions === undefined || + (Array.isArray(candidate.lookOptions) && candidate.lookOptions.every(isAuraLook))) && + (candidate.candidates === undefined || + (Array.isArray(candidate.candidates) && candidate.candidates.every(isAuraCandidateItem))) && + (candidate.candidateItems === undefined || + (Array.isArray(candidate.candidateItems) && candidate.candidateItems.every(isAuraCandidateItem))) + ); +} + +function isAuraSuggestionItem(value: unknown): value is AuraSuggestionItem { + if (!value || typeof value !== "object") return false; + const candidate = value as Record; + return ( + typeof candidate.label === "string" && + (candidate.searchQuery === undefined || + candidate.searchQuery === null || + typeof candidate.searchQuery === "string") + ); +} + +function isAuraCandidateItem(value: unknown): boolean { + if (!value || typeof value !== "object") return false; + const candidate = value as Record; + return ( + typeof candidate.candidateId === "string" && + Array.isArray(candidate.imageUrls) && + candidate.imageUrls.every((url) => typeof url === "string") && + (candidate.primaryImageUrl === undefined || candidate.primaryImageUrl === null || typeof candidate.primaryImageUrl === "string") && + (candidate.secondaryImageUrls === undefined || + (Array.isArray(candidate.secondaryImageUrls) && candidate.secondaryImageUrls.every((url) => typeof url === "string"))) && + (candidate.title === undefined || candidate.title === null || typeof candidate.title === "string") && + (candidate.category === undefined || candidate.category === null || typeof candidate.category === "string") && + (candidate.subCategory === undefined || candidate.subCategory === null || typeof candidate.subCategory === "string") && + (candidate.color === undefined || candidate.color === null || typeof candidate.color === "string") && + (candidate.brand === undefined || candidate.brand === null || typeof candidate.brand === "string") && + (candidate.material === undefined || candidate.material === null || typeof candidate.material === "string") && + (candidate.fit === undefined || candidate.fit === null || typeof candidate.fit === "string") && + (candidate.pattern === undefined || candidate.pattern === null || typeof candidate.pattern === "string") && + (candidate.confidence === undefined || candidate.confidence === null || typeof candidate.confidence === "number") && + (candidate.sourceType === "image" || candidate.sourceType === "link" || candidate.sourceType === "batch") && + (candidate.sourceUrl === undefined || candidate.sourceUrl === null || typeof candidate.sourceUrl === "string") && + (candidate.status === "awaiting_confirmation" || + candidate.status === "added" || + candidate.status === "cancelled" || + candidate.status === "failed") ); } @@ -144,7 +282,10 @@ function isAuraLookAction(value: unknown): value is AuraLookAction { return ( value === "saveLook" || value === "planForToday" || + value === "likeLook" || + value === "notMyVibe" || value === "showMoreLikeThis" || + value === "lessLikeThis" || value === "shopMissingPieces" || value === "useOnlyMyCloset" || value === "makeItDressier" @@ -208,16 +349,36 @@ export async function appendMessageToChat( existingChat.exists() && typeof existingChat.data()?.messageCount === "number" ? (existingChat.data()?.messageCount as number) : 0; + const sanitizedAura = message.aura ? stripUndefinedDeep(message.aura) : undefined; const batch = writeBatch(db); batch.set(messageRef, { type: message.type, ...(message.kind ? { kind: message.kind } : {}), ...(message.text ? { text: message.text } : {}), + ...(message.assistantIntroText ? { assistantIntroText: message.assistantIntroText } : {}), + ...(message.attachments?.length ? { attachments: message.attachments } : {}), ...(typeof message.streaming === "boolean" ? { streaming: message.streaming } : {}), ...(message.outfits ? { outfits: message.outfits } : {}), - ...(message.aura ? { aura: message.aura } : {}), + ...(sanitizedAura ? { aura: sanitizedAura } : {}), createdAt: typeof message.createdAt === "number" ? message.createdAt : now, }); + if (DEBUG_AURA_CLIENT && sanitizedAura?.lookOptions?.length) { + console.log("[AURA_MULTI]", "storing multi-look chat message", { + messageId: message.id, + lookOptionsCount: sanitizedAura.lookOptions.length, + hasLook: !!sanitizedAura.look, + presentation: sanitizedAura.presentation, + }); + } + if (DEBUG_AURA_CLIENT && (sanitizedAura?.candidateItems?.length || sanitizedAura?.candidates?.length)) { + console.log("[AURA_STORE]", "storing candidate preview message", { + messageId: message.id, + kind: message.kind, + candidateItemsCount: sanitizedAura.candidateItems?.length ?? 0, + candidatesCount: sanitizedAura.candidates?.length ?? 0, + auraKeys: Object.keys(sanitizedAura), + }); + } batch.set( chatRef, { diff --git a/src/lib/aura.ts b/src/lib/aura.ts index 3aa2d73..2d18102 100644 --- a/src/lib/aura.ts +++ b/src/lib/aura.ts @@ -3,9 +3,12 @@ import { Platform } from "react-native"; import { auth, app } from "@/src/lib/firebase"; import type { AuraResponse } from "@/src/types/aura"; +import type { ChatAttachment } from "@/src/components/ai/chatTypes"; type AskAuraArgs = { message: string; + chatId?: string | null; + attachments?: ChatAttachment[]; history?: { role: "user" | "assistant"; text: string; @@ -16,16 +19,46 @@ type AskAuraArgs = { tempF?: number | null; condition?: string | null; } | null; + clientIntent?: string | null; + linkPreview?: { + sourceUrl: string; + title?: string | null; + imageUrl?: string | null; + imageUrls?: string[]; + description?: string | null; + } | null; }; +const URL_RE = /https?:\/\/[^\s<>"']+/i; +const LINK_PREVIEW_TIMEOUT_MS = 9000; + +function normalizeAuraCandidatePayload(data: AuraResponse): AuraResponse { + const candidateItems = data.candidateItems ?? data.candidates ?? []; + if (!candidateItems.length) return data; + const normalized = { + ...data, + presentation: "candidate_preview" as const, + candidateItems, + candidates: candidateItems, + }; + console.log("[AURA_PARSE]", "normalized candidate preview payload", { + candidateCount: candidateItems.length, + candidateIds: candidateItems.map((candidate) => candidate.candidateId), + presentation: normalized.presentation, + rawKeys: Object.keys(data), + }); + return normalized; +} + export async function askAura(args: AskAuraArgs): Promise { const functions = getFunctions(app); + logAuraRequest("callable_send", args); const callable = httpsCallable( functions, "askAura" ); const result = await callable(args); - return result.data.data; + return normalizeAuraCandidatePayload(result.data.data); } type AskAuraStreamCallbacks = { @@ -42,6 +75,327 @@ function getAskAuraStreamUrl() { return `https://us-central1-${projectId}.cloudfunctions.net/askAuraStream`; } +function logAuraRequest(label: string, args: AskAuraArgs, url?: string) { + console.log("[AURA_STREAM_REQUEST]", label, { + url: url ?? null, + projectId: process.env.EXPO_PUBLIC_FIREBASE_PROJECT_ID ?? null, + requestKeys: Object.keys(args), + prompt: args.message, + attachmentCount: args.attachments?.length ?? 0, + attachments: args.attachments?.map((attachment) => ({ + type: attachment.type, + hasUri: !!attachment.uri, + role: attachment.type === "image" ? attachment.role ?? null : null, + groupId: attachment.type === "image" ? attachment.groupId ?? null : null, + })), + clientIntent: args.clientIntent ?? null, + hasLinkPreview: !!args.linkPreview, + linkPreviewHasImage: !!args.linkPreview?.imageUrl, + }); +} + +function firstUrlFromText(text: string) { + const match = String(text ?? "").match(URL_RE)?.[0]; + if (!match) return null; + try { + const url = new URL(match.replace(/[),.;!?]+$/g, "")); + if (url.protocol !== "http:" && url.protocol !== "https:") return null; + return url.toString(); + } catch { + return null; + } +} + +function decodeHtmlEntities(value: string) { + return value + .replace(/&/g, "&") + .replace(/"/g, "\"") + .replace(/'|'/g, "'") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/\s+/g, " ") + .trim(); +} + +function metaContent(html: string, key: string) { + const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const patterns = [ + new RegExp(`]+property=["']${escaped}["'][^>]+content=["']([^"']+)["'][^>]*>`, "i"), + new RegExp(`]+content=["']([^"']+)["'][^>]+property=["']${escaped}["'][^>]*>`, "i"), + new RegExp(`]+name=["']${escaped}["'][^>]+content=["']([^"']+)["'][^>]*>`, "i"), + new RegExp(`]+content=["']([^"']+)["'][^>]+name=["']${escaped}["'][^>]*>`, "i"), + ]; + for (const pattern of patterns) { + const value = html.match(pattern)?.[1]; + if (value) return decodeHtmlEntities(value).slice(0, 500); + } + return null; +} + +function titleTag(html: string) { + const value = html.match(/]*>([\s\S]*?)<\/title>/i)?.[1]; + return value ? decodeHtmlEntities(value).slice(0, 220) : null; +} + +function normalizePreviewImage(sourceUrl: string, value?: string | null) { + const raw = String(value ?? "").trim(); + if (!raw || raw.startsWith("data:")) return null; + try { + const url = new URL(raw, sourceUrl); + if (url.protocol !== "http:" && url.protocol !== "https:") return null; + url.hash = ""; + return url.toString(); + } catch { + return null; + } +} + +function isHmProductUrl(sourceUrl: string) { + try { + const url = new URL(sourceUrl); + return ( + (url.hostname === "hm.com" || url.hostname.endsWith(".hm.com")) && + /\/productpage\.\d+\.html$/i.test(url.pathname) + ); + } catch { + return false; + } +} + +function hmClientFallbackUrls(sourceUrl: string) { + if (!isHmProductUrl(sourceUrl)) return []; + const url = new URL(sourceUrl); + return [ + new URL(`${url.pathname}/_jcr_content.product.json`, url).toString(), + new URL(`${url.pathname}/_jcr_content/product.json`, url).toString(), + ]; +} + +function hmArticleIdFromUrl(sourceUrl: string) { + try { + return new URL(sourceUrl).pathname.match(/\/productpage\.(\d+)\.html$/i)?.[1] ?? null; + } catch { + return null; + } +} + +function normalizeJsonLdImages(sourceUrl: string, imageValue: unknown) { + const values = Array.isArray(imageValue) ? imageValue : [imageValue]; + return values + .flatMap((image) => { + if (typeof image === "string") return [image]; + if (image && typeof image === "object") { + return [ + (image as { url?: string }).url, + (image as { contentUrl?: string }).contentUrl, + ]; + } + return []; + }) + .map((image) => normalizePreviewImage(sourceUrl, image)) + .filter((image): image is string => !!image); +} + +function jsonLdProductNodes(html: string) { + const nodes: Record[] = []; + const append = (value: unknown) => { + if (!value || typeof value !== "object") return; + if (Array.isArray(value)) { + value.forEach(append); + return; + } + const object = value as Record; + nodes.push(object); + append(object["@graph"]); + }; + const jsonLdRe = /]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi; + let match: RegExpExecArray | null; + while ((match = jsonLdRe.exec(html))) { + try { + append(JSON.parse(String(match[1] ?? "").trim())); + } catch { + // Ignore malformed JSON-LD; the generic image scan can still run for non-H&M pages. + } + } + return nodes.filter((node) => { + const type = Array.isArray(node["@type"]) ? node["@type"] : [node["@type"]]; + return type.some((entry) => String(entry).toLowerCase() === "product"); + }); +} + +function scopedHmPreviewImages(sourceUrl: string, html: string) { + if (!isHmProductUrl(sourceUrl)) return null; + const articleId = hmArticleIdFromUrl(sourceUrl); + const products = jsonLdProductNodes(html); + const product = articleId + ? products.find((node) => + [node.sku, node.mpn, node.productID, node.productId, node.url] + .map((value) => String(value ?? "")) + .some((value) => value.includes(articleId)), + ) + : products[0]; + const images = product ? normalizeJsonLdImages(sourceUrl, product.image) : []; + const seen = new Set(); + const scoped = images.filter((image) => { + const key = image.toLowerCase().replace(/([?&])(imwidth|width|height|w|h)=\d+/g, "$1"); + if (seen.has(key)) return false; + seen.add(key); + return true; + }).slice(0, 8); + console.log("[LINK_PRODUCT_SCOPE]", "client H&M preview scope", { + sourceUrl, + articleId, + productNodeCount: products.length, + matchedSku: product?.sku ?? null, + matchedTitle: product?.name ?? null, + scopedImageCount: scoped.length, + }); + console.log("[LINK_IMAGE_CANDIDATES_SCOPED]", "client H&M preview images", { + sourceUrl, + articleId, + candidateCount: scoped.length, + urls: scoped, + }); + return scoped.length ? scoped : null; +} + +function stablePreviewImages(sourceUrl: string, html: string) { + const scopedHmImages = scopedHmPreviewImages(sourceUrl, html); + if (scopedHmImages) return scopedHmImages; + + const urls: string[] = []; + const push = (value?: string | null) => { + const normalized = normalizePreviewImage(sourceUrl, value); + if (normalized) urls.push(normalized); + }; + push(metaContent(html, "og:image")); + push(metaContent(html, "og:image:secure_url")); + push(metaContent(html, "twitter:image")); + + for (const node of jsonLdProductNodes(html)) { + for (const image of normalizeJsonLdImages(sourceUrl, node.image)) { + push(image); + } + } + + const quotedImageRe = /["']((?:https?:)?\/\/[^\s"']+\.(?:jpg|jpeg|png|webp)(?:\?[^\s"']*)?)["']/gi; + let match: RegExpExecArray | null; + while ((match = quotedImageRe.exec(html))) push(match[1]); + + const seen = new Set(); + return urls.filter((url) => { + const lower = url.toLowerCase(); + if (/(logo|icon|sprite|favicon|placeholder|badge|payment|loader)/.test(lower)) return false; + if (/\s/.test(url)) return false; + const key = lower.replace(/([?&])(imwidth|width|height|w|h)=\d+/g, "$1"); + if (seen.has(key)) return false; + seen.add(key); + return true; + }).slice(0, 32); +} + +async function fetchPreviewHtml(url: string, signal: AbortSignal) { + const response = await fetch(url, { + signal, + headers: { + accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "accept-language": "en-US,en;q=0.9", + "user-agent": + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148", + }, + }); + const html = await response.text(); + return { response, html }; +} + +async function bestClientPreviewHtml(sourceUrl: string, signal: AbortSignal) { + const attempts = [sourceUrl, ...hmClientFallbackUrls(sourceUrl)]; + let best: { url: string; status: number; html: string; imageCount: number } | null = null; + const isHm = isHmProductUrl(sourceUrl); + for (const attemptUrl of attempts) { + try { + const { response, html } = await fetchPreviewHtml(attemptUrl, signal); + const scopedHmImages = scopedHmPreviewImages(sourceUrl, html); + const imageCount = (scopedHmImages ?? stablePreviewImages(sourceUrl, html)).length; + console.log("[AURA_LINK_PREVIEW]", "client preview html attempt", { + sourceHost: new URL(sourceUrl).host, + attemptPath: new URL(attemptUrl).pathname, + status: response.status, + htmlLength: html.length, + imageCount, + scopedHmImageCount: scopedHmImages?.length ?? 0, + }); + if (isHm && scopedHmImages?.length) { + best = { url: attemptUrl, status: response.status, html, imageCount }; + break; + } + if (!best || imageCount > best.imageCount || (!best.imageCount && html.length > best.html.length)) { + best = { url: attemptUrl, status: response.status, html, imageCount }; + } + if (!isHm && imageCount > 1) break; + } catch (error) { + console.log("[AURA_LINK_PREVIEW]", "client preview html attempt failed", { + sourceHost: new URL(sourceUrl).host, + attemptPath: new URL(attemptUrl).pathname, + error: error instanceof Error ? error.message : String(error), + }); + } + } + return best; +} + +async function buildClientLinkPreview(sourceUrl: string) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), LINK_PREVIEW_TIMEOUT_MS); + try { + console.log("[AURA_LINK_PREVIEW]", "client preview fetch start", { + host: new URL(sourceUrl).host, + }); + const best = await bestClientPreviewHtml(sourceUrl, controller.signal); + if (!best) return null; + const html = best.html; + const imageUrl = normalizePreviewImage( + sourceUrl, + metaContent(html, "og:image") ?? metaContent(html, "twitter:image"), + ); + const imageUrls = stablePreviewImages(sourceUrl, html); + const preview = { + sourceUrl, + title: metaContent(html, "og:title") ?? titleTag(html), + imageUrl: imageUrls[0] ?? imageUrl, + imageUrls, + description: metaContent(html, "og:description") ?? metaContent(html, "description"), + }; + console.log("[AURA_LINK_PREVIEW]", "client preview fetch complete", { + host: new URL(sourceUrl).host, + status: best.status, + htmlSourcePath: new URL(best.url).pathname, + htmlLength: html.length, + hasTitle: !!preview.title, + hasImageUrl: !!preview.imageUrl, + imageCount: preview.imageUrls.length, + hasDescription: !!preview.description, + }); + return preview.imageUrl || preview.title || preview.description ? preview : null; + } catch (error) { + console.log("[AURA_LINK_PREVIEW]", "client preview fetch failed", { + host: new URL(sourceUrl).host, + error: error instanceof Error ? error.message : String(error), + }); + return null; + } finally { + clearTimeout(timeout); + } +} + +async function withClientLinkPreview(args: AskAuraArgs): Promise { + if (args.linkPreview) return args; + const sourceUrl = firstUrlFromText(args.message); + if (!sourceUrl) return args; + const linkPreview = await buildClientLinkPreview(sourceUrl); + return linkPreview ? { ...args, linkPreview } : args; +} + function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -90,8 +444,22 @@ function processEventLines( await emitDeltaSmoothly(event.delta, callbacks.onDelta); } if (event.type === "final") { - setFinalData(event.data); - callbacks.onFinal?.(event.data); + console.log("[AURA_STREAM_RAW_FINAL]", trimmed); + console.log("[AURA_STREAM_RAW]", "raw final stream payload", { + keys: Object.keys(event.data ?? {}), + presentation: event.data?.presentation, + candidateItemsCount: event.data?.candidateItems?.length ?? 0, + candidatesCount: event.data?.candidates?.length ?? 0, + payload: event.data, + }); + const data = normalizeAuraCandidatePayload(event.data); + console.log("[AURA_STREAM_FINAL]", "parsed final stream payload", { + presentation: data.presentation, + hasLook: !!data.look, + candidateCount: data.candidateItems?.length ?? data.candidates?.length ?? 0, + }); + setFinalData(data); + callbacks.onFinal?.(data); } if (event.type === "error") { throw new Error(event.error || "AURA stream failed."); @@ -179,11 +547,12 @@ async function askAuraStreamWithXhr( xhr.onerror = () => settleError(new Error("AURA stream request failed.")); xhr.ontimeout = () => settleError(new Error("AURA stream request timed out.")); - xhr.send( - JSON.stringify({ - ...args, - }) - ); + const body = JSON.stringify({ + ...args, + }); + logAuraRequest("xhr_send", args, getAskAuraStreamUrl()); + console.log("[AURA_STREAM_REQUEST]", "xhr raw body", body); + xhr.send(body); }); } @@ -191,33 +560,65 @@ export async function askAuraStream( args: AskAuraArgs, callbacks: AskAuraStreamCallbacks = {} ): Promise { + const enrichedArgs = await withClientLinkPreview(args); const currentUser = auth.currentUser; const token = await currentUser?.getIdToken(); if (!token) { - return askAura(args); + logAuraRequest("callable_fallback_no_token", enrichedArgs); + return askAura(enrichedArgs); } if (Platform.OS !== "web") { - return askAuraStreamWithXhr(args, token, callbacks); + try { + return await askAuraStreamWithXhr(enrichedArgs, token, callbacks); + } catch (error) { + console.log("[AURA_STREAM_FALLBACK]", "xhr stream failed, using callable fallback", { + error: error instanceof Error ? error.message : String(error), + }); + const fallback = await askAura(enrichedArgs); + callbacks.onFinal?.(fallback); + return fallback; + } } - const response = await fetch(getAskAuraStreamUrl(), { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify(args), - }); + const url = getAskAuraStreamUrl(); + logAuraRequest("fetch_send", enrichedArgs, url); + const body = JSON.stringify(enrichedArgs); + console.log("[AURA_STREAM_REQUEST]", "fetch raw body", body); + let response: Response; + try { + response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body, + }); + } catch (error) { + console.log("[AURA_STREAM_FALLBACK]", "fetch stream failed before response, using callable fallback", { + error: error instanceof Error ? error.message : String(error), + }); + const fallback = await askAura(enrichedArgs); + callbacks.onFinal?.(fallback); + return fallback; + } if (!response.ok) { const errorText = await response.text(); - throw new Error(errorText || "AURA stream failed."); + console.log("[AURA_STREAM_FALLBACK]", "fetch stream returned non-200, using callable fallback", { + status: response.status, + errorText, + }); + const fallback = await askAura(enrichedArgs); + callbacks.onFinal?.(fallback); + return fallback; } if (!response.body || typeof response.body.getReader !== "function") { - const fallback = await askAura(args); + logAuraRequest("callable_fallback_no_reader", args); + const fallback = await askAura(enrichedArgs); callbacks.onFinal?.(fallback); return fallback; } @@ -241,7 +642,36 @@ export async function askAuraStream( if (finalData) return finalData; - const fallback = await askAura(args); + const fallback = await askAura(enrichedArgs); callbacks.onFinal?.(fallback); return fallback; } + +export async function transcribeAuraAudio(audioUrl: string): Promise { + const functions = getFunctions(app); + const callable = httpsCallable<{ audioUrl: string }, { ok: boolean; transcript: string }>( + functions, + "transcribeAuraAudio" + ); + const result = await callable({ audioUrl }); + return result.data.transcript; +} + +export async function importProductLinkToWardrobe( + url: string, + itemId?: string +): Promise<{ itemId: string; imageCount: number }> { + const functions = getFunctions(app); + const callable = httpsCallable< + { url: string; itemId?: string }, + { ok: boolean; itemId: string; imageCount: number } + >( + functions, + "importProductLink" + ); + const result = await callable({ url, ...(itemId ? { itemId } : {}) }); + return { + itemId: result.data.itemId, + imageCount: result.data.imageCount, + }; +} diff --git a/src/lib/auraAttachments.ts b/src/lib/auraAttachments.ts new file mode 100644 index 0000000..1a02c9b --- /dev/null +++ b/src/lib/auraAttachments.ts @@ -0,0 +1,952 @@ +import * as FileSystem from "expo-file-system/legacy"; +import { getDownloadURL, ref, uploadBytes } from "firebase/storage"; +import { addDoc, collection, doc, setDoc, updateDoc } from "firebase/firestore"; + +import type { ChatAttachment, ChatImageAttachment } from "@/src/components/ai/chatTypes"; +import { removeBackground } from "@/src/bg/removeBackground"; +import { normalizeCutoutImage } from "@/src/lib/cutoutNormalize"; +import { db, storage } from "@/src/lib/firebase"; +import { uploadItemPhoto } from "@/src/lib/uploadImage"; +import { analyzeCutoutVisualNormalization } from "@/src/lib/visualNormalization"; +import type { AuraCandidateItem } from "@/src/types/aura"; + +const AURA_UPLOAD_LOG = "[AURA_UPLOAD]"; +const AURA_DRAFT_LOG = "[AURA_DRAFT]"; +const AURA_CUTOUT_LOG = "[AURA_CUTOUT]"; +const MIN_USABLE_CUTOUT_TRANSPARENCY = 0.05; +const AURA_CUTOUT_TIMEOUT_MS = 25_000; +const fileSystem = FileSystem as unknown as { + cacheDirectory?: string | null; + downloadAsync?: (uri: string, fileUri: string) => Promise<{ uri: string }>; +}; +const fileSystemCacheDirectory = fileSystem.cacheDirectory ?? null; + +export type AuraCandidateLocalPhoto = { + localUri: string; + attachmentUri?: string | null; + width?: number | null; + height?: number | null; +}; + +function normalizeFileUri(uri: string) { + const value = String(uri ?? "").trim(); + if (!value) return ""; + if (value.startsWith("file://")) return value; + if (value.startsWith("/")) return `file://${value}`; + return value; +} + +async function blobFromFileUri(localUri: string): Promise { + const fileUri = normalizeFileUri(localUri); + if (!fileUri) throw new Error("Missing local file URI for upload."); + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.onerror = () => reject(new Error("Failed to read local file.")); + xhr.ontimeout = () => reject(new Error("Timed out reading local file.")); + xhr.onload = () => resolve(xhr.response as Blob); + xhr.responseType = "blob"; + xhr.timeout = 20_000; + xhr.open("GET", fileUri, true); + xhr.send(null); + }); +} + +function extensionForAttachment(attachment: ChatAttachment) { + if (attachment.type === "audio") return "m4a"; + return "jpg"; +} + +function contentTypeForAttachment(attachment: ChatAttachment) { + if (attachment.type === "audio") return "audio/mp4"; + return "image/jpeg"; +} + +export async function uploadAuraAttachment(uid: string, attachment: ChatAttachment) { + const sourceUri = attachment.localUri || attachment.uri; + if (!sourceUri) throw new Error("Missing attachment URI."); + if (/^https?:\/\//i.test(sourceUri)) return attachment; + + console.log(AURA_UPLOAD_LOG, "starting attachment upload", { + uid, + attachmentId: attachment.id, + type: attachment.type, + }); + const blob = await blobFromFileUri(sourceUri); + const storagePath = `users/${uid}/auraAttachments/${Date.now()}-${attachment.id}.${extensionForAttachment(attachment)}`; + const fileRef = ref(storage, storagePath); + await uploadBytes(fileRef, blob, { + contentType: contentTypeForAttachment(attachment), + }); + const uri = await getDownloadURL(fileRef); + console.log(AURA_UPLOAD_LOG, "attachment upload complete", { + uid, + attachmentId: attachment.id, + type: attachment.type, + storagePath, + uri, + }); + return { + ...attachment, + uri, + localUri: attachment.localUri ?? sourceUri, + }; +} + +export async function uploadAuraAttachments(uid: string, attachments: ChatAttachment[]) { + console.log(AURA_UPLOAD_LOG, "uploading attachment batch", { + uid, + count: attachments.length, + types: attachments.map((attachment) => attachment.type), + }); + return Promise.all(attachments.map((attachment) => uploadAuraAttachment(uid, attachment))); +} + +function imageRecordForAttachment(attachment: ChatImageAttachment, isPrimary: boolean) { + return { + originalUrl: attachment.uri, + isPrimary, + }; +} + +export async function createAuraItemDraftsFromImages(params: { + uid: string; + images: ChatImageAttachment[]; + mode: "same_item" | "separate_items"; + prompt: string; +}) { + const { uid, images, mode, prompt } = params; + const itemGroups = mode === "separate_items" ? images.map((image) => [image]) : [images]; + const created: { itemId: string; imageCount: number }[] = []; + + console.log(AURA_DRAFT_LOG, "creating item drafts from AURA images", { + uid, + mode, + imageCount: images.length, + groupCount: itemGroups.length, + prompt, + images: images.map((image) => ({ + id: image.id, + uri: image.uri, + role: image.role ?? null, + groupId: image.groupId ?? null, + })), + }); + + for (const group of itemGroups) { + const primary = group[0]; + if (!primary) continue; + const records = group.map((image, index) => imageRecordForAttachment(image, index === 0)); + const now = Date.now(); + const sourceHash = records.map((record) => record.originalUrl).join("|"); + const docRef = await addDoc(collection(db, "users", uid, "items"), { + isDraft: true, + draftState: "photo_uploaded", + itemLifecycleStatus: "processing", + status: "AVAILABLE", + category: "top", + subCategory: "", + wearCountSinceWash: 0, + ingestionStatus: "pending", + ingestion: { + status: "pending", + lastRunAt: now, + }, + ingestionSource: { + sourceHash, + sourceType: "aura_chat", + }, + source: "aura_chat", + auraPrompt: prompt, + images: records, + imageUrls: records.map((record) => record.originalUrl), + originalImageUrl: primary.uri, + cleanedImageUrl: null, + photoUrl: primary.uri, + cleanedSource: null, + photos: { + primaryUrl: primary.uri, + urls: records.map((record) => record.originalUrl), + images: records, + }, + primaryImageProcessingStatus: "processing", + primaryImageProcessingError: null, + primaryImageProcessingStartedAt: now, + primaryImageProcessedAt: null, + createdAt: now, + updatedAt: now, + }); + console.log(AURA_DRAFT_LOG, "created item draft", { + uid, + itemId: docRef.id, + imageCount: group.length, + primaryUrl: primary.uri, + draftState: "photo_uploaded", + ingestionStatus: "pending", + }); + void runPostSavePrimaryImageCutout({ + uid, + itemId: docRef.id, + candidateId: primary.id, + sourceType: "image", + primaryUrl: primary.uri, + secondaryUrls: records.slice(1).map((record) => record.originalUrl), + category: "top", + subCategory: null, + localPhoto: { + localUri: primary.localUri ?? primary.uri, + attachmentUri: primary.uri, + width: primary.width ?? null, + height: primary.height ?? null, + }, + }).catch((error) => { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid, + itemId: docRef.id, + candidateId: primary.id, + reason: error instanceof Error ? error.message : String(error), + error, + }); + }); + created.push({ itemId: docRef.id, imageCount: group.length }); + } + + if (!created.length) { + throw new Error("No wardrobe drafts were created from the attached images."); + } + + console.log(AURA_DRAFT_LOG, "item draft creation finished", { + uid, + created, + }); + return created; +} + +export async function createProductLinkProcessingDraft(params: { + uid: string; + url: string; + prompt: string; +}) { + const { uid, url, prompt } = params; + const now = Date.now(); + const docRef = await addDoc(collection(db, "users", uid, "items"), { + isDraft: true, + draftState: "photo_uploaded", + itemLifecycleStatus: "processing", + status: "AVAILABLE", + category: "top", + subCategory: "", + wearCountSinceWash: 0, + ingestionStatus: "pending", + ingestion: { + status: "pending", + lastRunAt: now, + }, + ingestionSource: { + sourceHash: `link:${url}`, + sourceType: "aura_product_link", + sourceUrl: url, + }, + source: "aura_product_link", + sourceUrl: url, + auraPrompt: prompt, + name: "Importing from link", + createdAt: now, + updatedAt: now, + }); + console.log(AURA_DRAFT_LOG, "created product link processing draft", { + uid, + itemId: docRef.id, + url, + }); + return { itemId: docRef.id }; +} + +function imageRecordForUrl(url: string, isPrimary: boolean) { + return { + originalUrl: url, + isPrimary, + }; +} + +async function runPostSavePrimaryImageCutout(params: { + uid: string; + itemId: string; + candidateId: string; + sourceType: "image" | "link" | "batch"; + primaryUrl: string; + secondaryUrls: string[]; + category: string; + subCategory?: string | null; + localPhoto?: AuraCandidateLocalPhoto | undefined; +}) { + const { + uid, + itemId, + candidateId, + sourceType, + primaryUrl, + secondaryUrls, + category, + subCategory, + localPhoto, + } = params; + console.log("[PRIMARY_POSTSAVE_CUTOUT] item save processing start", { + uid, + itemId, + candidateId, + sourceType, + primaryUrl, + }); + console.log("[PRIMARY_POSTSAVE_CUTOUT] primary source used", { + uid, + itemId, + candidateId, + source: localPhoto?.localUri ? "local_review_photo" : "remote_primary_download", + hasLocalPhoto: !!localPhoto?.localUri, + }); + console.log("[PRIMARY_POSTSAVE_CUTOUT] secondaries untouched count", { + uid, + itemId, + candidateId, + secondaryCount: secondaryUrls.length, + }); + + const itemRef = doc(db, "users", uid, "items", itemId); + const resolvedLocalPhoto = + localPhoto ?? + (await downloadCandidateImageToLocal({ + uid, + candidateId, + imageUrl: primaryUrl, + })) ?? + undefined; + + if (!resolvedLocalPhoto?.localUri) { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid, + itemId, + candidateId, + reason: "primary image unavailable locally", + }); + await updateDoc(itemRef, { + primaryImageProcessingStatus: "failed", + primaryImageProcessingError: "primary image unavailable locally", + primaryImageProcessedAt: Date.now(), + updatedAt: Date.now(), + }); + return; + } + + const cutout = await prepareAuraCandidateCutout({ + uid, + candidateId, + localPhoto: resolvedLocalPhoto, + category, + subCategory: subCategory ?? null, + }); + + if (!cutout?.cleanedLocalUri) { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid, + itemId, + candidateId, + reason: "cutout unavailable", + }); + await updateDoc(itemRef, { + primaryImageProcessingStatus: "failed", + primaryImageProcessingError: "cutout unavailable", + primaryImageProcessedAt: Date.now(), + updatedAt: Date.now(), + }); + return; + } + + try { + const uploaded = await uploadItemPhoto({ + uid, + itemId, + localUri: resolvedLocalPhoto.localUri, + cleanedLocalUri: cutout.cleanedLocalUri, + normalizedLocalUri: cutout.normalizedLocalUri, + originalWidth: resolvedLocalPhoto.width ?? null, + saveNormalizedAsCleaned: true, + }); + const nextImages = [ + { + originalUrl: uploaded.primaryUrl, + ...(uploaded.cleanedUrl ? { cleanedUrl: uploaded.cleanedUrl } : {}), + isPrimary: true, + sourceOriginalUrl: primaryUrl, + }, + ...secondaryUrls.map((url) => imageRecordForUrl(url, false)), + ]; + const nextImageUrls = [uploaded.primaryUrl, ...secondaryUrls]; + const primaryDisplayUrl = uploaded.cleanedUrl ?? uploaded.primaryUrl; + await updateDoc(itemRef, { + images: nextImages, + imageUrls: nextImageUrls, + originalImageUrl: uploaded.originalUrl, + photoUrl: primaryDisplayUrl, + cleanedImageUrl: uploaded.cleanedUrl ?? null, + cleanedSource: uploaded.cleanedUrl ? "vision" : null, + "photos.originalUrl": uploaded.originalUrl, + "photos.primaryUrl": primaryDisplayUrl, + "photos.urls": nextImageUrls, + "photos.images": nextImages, + "photos.cleanedUrl": uploaded.cleanedUrl ?? null, + "photos.cleanedSource": uploaded.cleanedUrl ? "vision" : null, + "photos.normalizedUrl": uploaded.normalizedUrl ?? null, + ...(cutout.visualNormalization ? { visualNormalization: cutout.visualNormalization } : {}), + primaryImageProcessingStatus: "complete", + primaryImageProcessingError: null, + primaryImageProcessedAt: Date.now(), + updatedAt: Date.now(), + }); + console.log("[PRIMARY_POSTSAVE_CUTOUT] success with cleaned fields written", { + uid, + itemId, + candidateId, + originalImageUrl: uploaded.originalUrl, + photoUrl: primaryDisplayUrl, + cleanedImageUrl: uploaded.cleanedUrl ?? null, + photosPrimaryUrl: primaryDisplayUrl, + photosCleanedUrl: uploaded.cleanedUrl ?? null, + }); + } catch (error) { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid, + itemId, + candidateId, + reason: error instanceof Error ? error.message : String(error), + error, + }); + await updateDoc(itemRef, { + primaryImageProcessingStatus: "failed", + primaryImageProcessingError: error instanceof Error ? error.message : String(error), + primaryImageProcessedAt: Date.now(), + updatedAt: Date.now(), + }); + } +} + +function candidateSourceType(candidate: AuraCandidateItem) { + if (candidate.sourceType === "link") return "aura_product_link"; + if (candidate.sourceType === "batch") return "aura_candidate_batch"; + return "aura_chat"; +} + +function normalizedText(value?: string | null) { + return String(value ?? "").trim().toLowerCase().replace(/[\s-]+/g, "_"); +} + +function brandFromSourceUrl(sourceUrl?: string | null) { + try { + const host = new URL(String(sourceUrl ?? "")).hostname.replace(/^www\d*\./, "").toLowerCase(); + if (host.endsWith("hm.com")) return "H&M"; + if (host.endsWith("zara.com")) return "Zara"; + if (host.endsWith("nike.com")) return "Nike"; + const domain = host.split(".")[0] ?? ""; + return domain ? domain.charAt(0).toUpperCase() + domain.slice(1) : ""; + } catch { + return ""; + } +} + +function normalizeLinkBrandAndTitle(candidate: AuraCandidateItem) { + const sourceBrand = brandFromSourceUrl(candidate.sourceUrl); + const rawBrand = String(candidate.brand ?? "").trim(); + const brand = + rawBrand && !/^no brand$/i.test(rawBrand) + ? rawBrand + : sourceBrand; + let title = String(candidate.title ?? "").replace(/\s+/g, " ").trim(); + title = title + .replace(/\s*\|\s*H\s*&\s*M(?:\s+[A-Z]{2})?\s*$/i, "") + .replace(/\s*\|\s*Zara\s*$/i, "") + .replace(/\s*\|\s*Nike\s*$/i, "") + .replace(/^Men[’']s\s+/i, "") + .replace(/^Women[’']s\s+/i, "") + .replace(/^Ladies[’']?\s+/i, "") + .trim(); + if (brand) { + title = title + .replace(new RegExp(`^${brand.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s+`, "i"), "") + .trim(); + } + console.log("[LINK_BRAND_NORMALIZE]", { + sourceUrl: candidate.sourceUrl ?? null, + rawBrand: candidate.brand ?? null, + rawTitle: candidate.title ?? null, + savedBrand: brand, + savedTitle: title, + }); + return { brand, title }; +} + +function imagePathKey(url: string) { + try { + const parsed = new URL(url); + return `${parsed.hostname}${parsed.pathname}`.toLowerCase(); + } catch { + return String(url ?? "").toLowerCase(); + } +} + +function hmMediaFamily(url: string) { + try { + const parsed = new URL(url); + if (!parsed.hostname.toLowerCase().endsWith("image.hm.com")) return null; + const parts = parsed.pathname.split("/").filter(Boolean); + const assetIndex = parts.indexOf("hm"); + if (assetIndex < 0 || parts.length <= assetIndex + 3) return null; + return parts[assetIndex + 3]?.replace(/\.(jpg|jpeg|png|webp)$/i, "").toLowerCase() ?? null; + } catch { + return null; + } +} + +function sameRetailerImageHost(a: string, b: string) { + try { + return new URL(a).hostname.toLowerCase() === new URL(b).hostname.toLowerCase(); + } catch { + return false; + } +} + +function buildFinalLinkImageSet(candidate: AuraCandidateItem) { + const rawPrimary = String(candidate.primaryImageUrl ?? candidate.imageUrls?.[0] ?? "").trim(); + const rawCandidates = [ + candidate.primaryImageUrl, + ...(candidate.imageUrls ?? []), + ...(candidate.secondaryImageUrls ?? []), + ].map((url) => String(url ?? "").trim()).filter(Boolean); + const primaryUrl = rawPrimary || rawCandidates[0] || ""; + const seen = new Set(); + const finalUrls: string[] = []; + const rejected: { url: string; reason: string }[] = []; + if (primaryUrl) { + finalUrls.push(primaryUrl); + seen.add(imagePathKey(primaryUrl)); + } + const primaryHmFamily = hmMediaFamily(primaryUrl); + const isHmLink = (() => { + try { + const host = new URL(String(candidate.sourceUrl ?? "")).hostname.toLowerCase(); + return host === "hm.com" || host.endsWith(".hm.com"); + } catch { + return false; + } + })(); + + for (const url of rawCandidates) { + if (!url || url === primaryUrl) continue; + const key = imagePathKey(url); + if (seen.has(key)) continue; + const family = hmMediaFamily(url); + const accepted = + isHmLink && sameRetailerImageHost(primaryUrl, url) + ? true + : primaryHmFamily && family + ? family === primaryHmFamily + : sameRetailerImageHost(primaryUrl, url) && finalUrls.length === 1; + console.log("[LINK_IMAGE_SECONDARY_VALIDATE]", { + sourceUrl: candidate.sourceUrl ?? null, + primaryUrl, + url, + accepted, + reason: accepted + ? isHmLink + ? "reviewed H&M product image set" + : primaryHmFamily + ? "same H&M media family" + : "same image host fallback" + : primaryHmFamily + ? "different H&M media family" + : "weak same-product evidence", + }); + if (!accepted) { + rejected.push({ + url, + reason: primaryHmFamily ? "different H&M media family" : "weak same-product evidence", + }); + continue; + } + finalUrls.push(url); + seen.add(key); + if (finalUrls.length >= 6) break; + } + + console.log("[LINK_IMAGE_FINAL_SET]", { + sourceUrl: candidate.sourceUrl ?? null, + primaryUrl, + finalUrls, + rejectedCount: rejected.length, + rejected: rejected.slice(0, 8), + }); + return finalUrls; +} + +function finalImageSetForCandidate(candidate: AuraCandidateItem) { + if (candidate.sourceType === "link") return buildFinalLinkImageSet(candidate); + const urls = [ + candidate.primaryImageUrl, + ...(candidate.imageUrls ?? []), + ...(candidate.secondaryImageUrls ?? []), + ].map((url) => String(url ?? "").trim()).filter(Boolean); + return Array.from(new Set(urls)); +} + +function normalizeCandidateCategory(candidate: AuraCandidateItem) { + const rawCategory = normalizedText(candidate.category); + const rawSubcategory = normalizedText(candidate.subCategory); + const combined = `${rawCategory} ${rawSubcategory}`; + + if (["top", "tops"].includes(rawCategory)) return "top"; + if (["bottom", "bottoms"].includes(rawCategory)) return "bottom"; + if (["outerwear"].includes(rawCategory)) return "outerwear"; + if (["footwear", "shoes", "shoe"].includes(rawCategory)) return "footwear"; + if (["one_piece", "dress", "dresses", "jumpsuit", "romper"].includes(rawCategory)) return "one_piece"; + if (["accessory", "accessories"].includes(rawCategory)) return "accessory"; + + if (/\b(shirt|tee|tshirt|t-shirt|polo|blouse|tank|crop_top|sweater|hoodie)\b/.test(combined)) return "top"; + if (/\b(pant|trouser|jean|short|skirt|legging)\b/.test(combined)) return "bottom"; + if (/\b(jacket|coat|blazer|outerwear)\b/.test(combined)) return "outerwear"; + if (/\b(sneaker|shoe|boot|loafer|heel|sandal)\b/.test(combined)) return "footwear"; + if (/\b(dress|jumpsuit|romper)\b/.test(combined)) return "one_piece"; + if (/\b(watch|bag|handbag|cap|hat|sunglasses|glasses|necklace|chain|bracelet|ring|earring|belt|scarf|perfume)\b/.test(combined)) { + return "accessory"; + } + + return "top"; +} + +function withTimeout(promise: Promise, timeoutMs: number, label: string) { + return Promise.race([ + promise, + new Promise((_, reject) => { + setTimeout(() => reject(new Error(`${label} timed out.`)), timeoutMs); + }), + ]); +} + +async function prepareAuraCandidateCutout(params: { + uid: string; + candidateId: string; + localPhoto: AuraCandidateLocalPhoto; + category: string; + subCategory?: string | null; +}) { + const { uid, candidateId, localPhoto, category, subCategory } = params; + const localUri = normalizeFileUri(localPhoto.localUri); + if (!localUri) return null; + + try { + console.log(AURA_CUTOUT_LOG, "starting client cutout for AURA candidate", { + uid, + candidateId, + hasAttachmentUri: !!localPhoto.attachmentUri, + width: localPhoto.width ?? null, + height: localPhoto.height ?? null, + }); + const cutout = await withTimeout( + removeBackground(localUri, { + threshold: 0.6, + cleanupRadius: 2, + feather: 1, + edgeTighten: 0.03, + edgePolish: 0.5, + maskToAlpha: true, + }), + AURA_CUTOUT_TIMEOUT_MS, + "AURA background removal" + ); + const usableCutout = + cutout.uri && + cutout.uri !== localUri && + cutout.hasTransparency && + cutout.transparentPixelRatio >= MIN_USABLE_CUTOUT_TRANSPARENCY; + const canNormalizePrimary = + !!cutout.contentBounds && !!cutout.width && !!cutout.height && !!(cutout.uri || localUri); + console.log(AURA_CUTOUT_LOG, "client cutout finished", { + uid, + candidateId, + usableCutout, + canNormalizePrimary, + hasTransparency: cutout.hasTransparency, + transparentPixelRatio: cutout.transparentPixelRatio, + hasContentBounds: !!cutout.contentBounds, + }); + if (!usableCutout && !canNormalizePrimary) return null; + + const visualNormalization = + cutout.contentBounds && cutout.width && cutout.height + ? await analyzeCutoutVisualNormalization({ + contentBounds: cutout.contentBounds, + imageWidth: cutout.width, + imageHeight: cutout.height, + category, + subCategory: subCategory ?? null, + }) + : null; + const normalizedCutout = canNormalizePrimary + ? await normalizeCutoutImage({ + cutoutUri: cutout.uri || localUri, + contentBounds: cutout.contentBounds, + imageWidth: cutout.width, + imageHeight: cutout.height, + category, + subCategory: subCategory ?? null, + }) + : null; + + return { + cleanedLocalUri: usableCutout ? cutout.uri : normalizedCutout?.uri ?? null, + normalizedLocalUri: normalizedCutout?.uri ?? null, + visualNormalization, + }; + } catch (error) { + console.log(AURA_CUTOUT_LOG, "client cutout failed; saving original only", { + uid, + candidateId, + errorMessage: error instanceof Error ? error.message : String(error), + error, + }); + return null; + } +} + +async function downloadCandidateImageToLocal(params: { + uid: string; + candidateId: string; + imageUrl: string; +}): Promise { + const url = String(params.imageUrl ?? "").trim(); + if (!/^https?:\/\//i.test(url)) { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid: params.uid, + candidateId: params.candidateId, + reason: "primary image URL is not http/https", + imageUrl: url || null, + }); + return null; + } + if (!fileSystemCacheDirectory || !fileSystem.downloadAsync) { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid: params.uid, + candidateId: params.candidateId, + reason: "expo file downloader unavailable", + hasCacheDirectory: !!fileSystemCacheDirectory, + hasDownloadAsync: !!fileSystem.downloadAsync, + }); + return null; + } + try { + const destination = `${fileSystemCacheDirectory}aura-${params.candidateId}-${Date.now()}.jpg`; + console.log(AURA_CUTOUT_LOG, "downloading remote candidate image for cutout", { + uid: params.uid, + candidateId: params.candidateId, + url, + }); + const result = await fileSystem.downloadAsync(url, destination); + return { + localUri: result.uri, + attachmentUri: url, + width: null, + height: null, + }; + } catch (error) { + console.log(AURA_CUTOUT_LOG, "remote candidate download failed", { + uid: params.uid, + candidateId: params.candidateId, + errorMessage: error instanceof Error ? error.message : String(error), + error, + }); + return null; + } +} + +export async function createAuraItemDraftsFromCandidates(params: { + uid: string; + candidates: AuraCandidateItem[]; + prompt: string; + mode: "pending" | "awaiting_confirmation"; + localPhotosByCandidateId?: Record; +}) { + const { uid, candidates, prompt, mode, localPhotosByCandidateId = {} } = params; + const created: { itemId: string; imageCount: number; candidateId: string }[] = []; + + console.log(AURA_DRAFT_LOG, "creating item drafts from AURA candidates", { + uid, + mode, + candidateCount: candidates.length, + }); + + for (const candidate of candidates) { + const normalizedLinkFields = + candidate.sourceType === "link" ? normalizeLinkBrandAndTitle(candidate) : null; + console.log("[LINK_IMAGE_SOURCE]", { + sourceUrl: candidate.sourceUrl ?? null, + candidateId: candidate.candidateId, + primaryImageUrl: candidate.primaryImageUrl ?? null, + imageUrls: candidate.imageUrls ?? [], + secondaryImageUrls: candidate.secondaryImageUrls ?? [], + }); + const uniqueUrls = finalImageSetForCandidate(candidate); + const primaryUrl = uniqueUrls[0]; + if (!primaryUrl) continue; + const records = uniqueUrls.map((url, index) => imageRecordForUrl(url, index === 0)); + const now = Date.now(); + const sourceHash = uniqueUrls.join("|"); + const draftState = mode === "awaiting_confirmation" ? "draft" : "photo_uploaded"; + const ingestionStatus = "pending"; + const category = normalizeCandidateCategory(candidate); + const matchedLocalPhoto = localPhotosByCandidateId[candidate.candidateId]; + const localPhoto = matchedLocalPhoto ?? undefined; + const docRef = doc(collection(db, "users", uid, "items")); + const payload = { + isDraft: true, + draftState, + auraCandidateState: mode === "awaiting_confirmation" ? "candidate" : "confirmed", + itemLifecycleStatus: mode === "awaiting_confirmation" ? "candidate" : "processing", + status: "AVAILABLE", + category, + subCategory: candidate.subCategory || "", + wearCountSinceWash: 0, + ingestionStatus, + ingestion: { + status: ingestionStatus, + lastRunAt: now, + }, + ingestionSource: { + sourceHash, + sourceType: candidateSourceType(candidate), + candidateId: candidate.candidateId, + ...(candidate.sourceUrl ? { sourceUrl: candidate.sourceUrl } : {}), + }, + source: candidateSourceType(candidate), + ...(candidate.sourceUrl ? { sourceUrl: candidate.sourceUrl } : {}), + auraPrompt: prompt, + auraCandidate: candidate, + name: normalizedLinkFields?.title ?? candidate.title ?? "", + brand: normalizedLinkFields?.brand ?? candidate.brand ?? "", + colorLabel: candidate.color || "", + displayColor: candidate.color || null, + material: candidate.material || null, + pattern: candidate.pattern || null, + fit: candidate.fit || null, + images: records, + imageUrls: uniqueUrls, + originalImageUrl: primaryUrl, + cleanedImageUrl: null, + photoUrl: primaryUrl, + cleanedSource: null, + photos: { + originalUrl: primaryUrl, + primaryUrl: primaryUrl, + urls: uniqueUrls, + images: records, + }, + primaryImageProcessingStatus: mode === "pending" ? "processing" : "idle", + primaryImageProcessingError: null, + primaryImageProcessingStartedAt: mode === "pending" ? now : null, + primaryImageProcessedAt: null, + createdAt: now, + updatedAt: now, + }; + console.log(AURA_DRAFT_LOG, "confirming AURA candidate item", { + uid, + path: `users/${uid}/items/{new}`, + mode, + createMode: "addDoc", + payloadKeys: Object.keys(payload), + candidateId: candidate.candidateId, + rawCategory: candidate.category ?? null, + rawSubCategory: candidate.subCategory ?? null, + category, + hasLocalPhoto: !!localPhoto?.localUri, + hasCleanedUrl: false, + }); + await setDoc(docRef, payload); + if (candidate.sourceType === "link") { + console.log("[LINK_IMAGE_CLEANUP]", { + uid, + candidateId: candidate.candidateId, + selectedPrimaryImage: primaryUrl, + hasLocalPhoto: !!localPhoto?.localUri, + cleanedOutputUrl: null, + finalPrimaryUrl: primaryUrl, + }); + console.log("[LINK_IMAGE_SAVE]", { + uid, + candidateId: candidate.candidateId, + primaryUrl, + imageUrls: uniqueUrls, + savedFields: { + originalImageUrl: primaryUrl, + photoUrl: primaryUrl, + photosPrimaryUrl: primaryUrl, + cleanedImageUrl: null, + }, + }); + console.log("[LINK_IMAGE_SAVE_SET]", { + uid, + candidateId: candidate.candidateId, + rawCandidateImageCount: [ + candidate.primaryImageUrl, + ...(candidate.imageUrls ?? []), + ...(candidate.secondaryImageUrls ?? []), + ].filter(Boolean).length, + finalImageCount: uniqueUrls.length, + finalImageUrls: uniqueUrls, + }); + console.log("[LINK_SAVE_FIELDS]", { + uid, + candidateId: candidate.candidateId, + brand: payload.brand, + title: payload.name, + category: payload.category, + subCategory: payload.subCategory, + originalImageUrl: payload.originalImageUrl, + cleanedImageUrl: payload.cleanedImageUrl, + photoUrl: payload.photoUrl, + photosPrimaryUrl: payload.photos.primaryUrl, + }); + } + if (mode === "pending") { + void runPostSavePrimaryImageCutout({ + uid, + itemId: docRef.id, + candidateId: candidate.candidateId, + sourceType: candidate.sourceType, + primaryUrl, + secondaryUrls: uniqueUrls.slice(1), + category, + subCategory: candidate.subCategory, + localPhoto, + }).catch((error) => { + console.log("[PRIMARY_POSTSAVE_CUTOUT] failure fallback", { + uid, + itemId: docRef.id, + candidateId: candidate.candidateId, + reason: error instanceof Error ? error.message : String(error), + error, + }); + }); + } + created.push({ + itemId: docRef.id, + imageCount: uniqueUrls.length, + candidateId: candidate.candidateId, + }); + } + + if (!created.length) { + throw new Error("No wardrobe drafts were created from these item previews."); + } + + console.log(AURA_DRAFT_LOG, "candidate draft creation finished", { + uid, + created, + }); + return created; +} diff --git a/src/lib/auraIntent.ts b/src/lib/auraIntent.ts new file mode 100644 index 0000000..a96b562 --- /dev/null +++ b/src/lib/auraIntent.ts @@ -0,0 +1,89 @@ +import type { ChatAttachment, ChatAttachmentGroupRole } from "@/src/components/ai/chatTypes"; + +export type AuraImageIntent = + | "general_chat" + | "style_advice" + | "analyze_image" + | "identify_item" + | "add_item" + | "add_items_batch" + | "analyze_link" + | "add_from_link" + | "add_from_links_batch" + | "compare_items" + | "build_outfit"; + +export type ExtractedAuraUrl = { + raw: string; + normalized: string; +}; + +const ADD_RE = /\b(add|save|store|put|upload|log)\b.*\b(closet|wardrobe|item|items|these|this)\b|\b(add|save)\s+(this|these|all)\b/i; +const BATCH_RE = /\b(these|all|each|separate|multiple|items)\b/i; +const COMPARE_RE = /\b(compare|which one|better|pick between|versus|vs\.?)\b/i; +const OUTFIT_RE = /\b(outfit|look|style me|wear|fit|build)\b/i; +const IDENTIFY_RE = /\b(what is this|identify|brand|material|what item|what are these)\b/i; +const URL_RE = /\bhttps?:\/\/[^\s<>"')\]]+/gi; +const TRAILING_PUNCTUATION_RE = /[.,!?;:]+$/; + +export function extractUrlsFromText(text: string): ExtractedAuraUrl[] { + const matches = String(text ?? "").match(URL_RE) ?? []; + const seen = new Set(); + const urls: ExtractedAuraUrl[] = []; + + for (const match of matches) { + const raw = match.replace(TRAILING_PUNCTUATION_RE, ""); + try { + const parsed = new URL(raw); + if (parsed.protocol !== "http:" && parsed.protocol !== "https:") continue; + parsed.hash = ""; + const normalized = parsed.toString(); + if (seen.has(normalized)) continue; + seen.add(normalized); + urls.push({ raw, normalized }); + } catch { + // Ignore malformed URL-like text; server validation is authoritative. + } + } + + return urls; +} + +export function classifyAuraImageIntent( + text: string, + attachments: ChatAttachment[], +): AuraImageIntent { + const prompt = text.trim(); + const urls = extractUrlsFromText(prompt); + if (urls.length > 0 && ADD_RE.test(prompt)) { + return urls.length > 1 || BATCH_RE.test(prompt) + ? "add_from_links_batch" + : "add_from_link"; + } + if (urls.length > 0) return "analyze_link"; + + const imageAttachments = attachments.filter((attachment) => attachment.type === "image"); + if (!imageAttachments.length) return OUTFIT_RE.test(prompt) ? "build_outfit" : "general_chat"; + + const grouping = imageAttachments[0]?.role; + if (ADD_RE.test(prompt)) { + if ( + imageAttachments.length > 1 && + (grouping === "separate_items" || BATCH_RE.test(prompt)) + ) { + return "add_items_batch"; + } + return "add_item"; + } + + if (COMPARE_RE.test(prompt) && imageAttachments.length > 1) return "compare_items"; + if (OUTFIT_RE.test(prompt)) return "style_advice"; + if (IDENTIFY_RE.test(prompt)) return "identify_item"; + return "analyze_image"; +} + +export function getAttachmentGroupingLabel(role?: ChatAttachmentGroupRole | null) { + if (role === "same_item") return "Same item"; + if (role === "separate_items") return "Separate items"; + return "Reference"; +} diff --git a/src/lib/auraLooks.ts b/src/lib/auraLooks.ts index 7a41ac5..4736e09 100644 --- a/src/lib/auraLooks.ts +++ b/src/lib/auraLooks.ts @@ -1,6 +1,13 @@ import { collection, doc, getDocs, limit, orderBy, query, setDoc } from "firebase/firestore"; -import { db } from "@/src/lib/firebase"; +import { + buildAuraLookSnapshot, + buildStableAuraLookId, + cleanAuraString, + getAuraLookItemIds, +} from "@/src/lib/auraLookDocument"; +import { logAuraLookStyleEvent } from "@/src/lib/auraMemory"; +import { auth, db } from "@/src/lib/firebase"; import type { AuraLook } from "@/src/types/aura"; import type { PlannedOutfit } from "@/src/utils/dailyOutfits"; @@ -12,15 +19,23 @@ export type SavedAuraLookRecord = { updatedAt: number; }; +export type SavedAuraOutfitRecord = { + id: string; + title: string; + createdAt: number; + updatedAt: number; + source: "aura_swipe" | "aura"; + sessionId: string | null; + itemIds: string[]; + stylingNote: string; + previewImageUrls: string[]; + outfitSnapshot: ReturnType; +}; + function savedLooksCollection(uid: string) { return collection(db, "users", uid, "savedLooks"); } -function cleanString(value: unknown) { - const text = String(value ?? "").trim(); - return text || ""; -} - export function auraLookToPlannedOutfit(look: AuraLook): PlannedOutfit { const roleMap = look.pieces.reduce>((acc, piece) => { if (piece.source !== "closet" || !piece.itemId) return acc; @@ -34,7 +49,7 @@ export function auraLookToPlannedOutfit(look: AuraLook): PlannedOutfit { return { itemsByCategory: roleMap, score: 0.86, - reasons: [look.shortExplanation, cleanString(look.stylingNote)].filter(Boolean), + reasons: [look.shortExplanation, cleanAuraString(look.stylingNote)].filter(Boolean), createdAt: Date.now(), }; } @@ -48,11 +63,12 @@ export async function saveAuraLook( const now = Date.now(); const payload = { look, - title: cleanString(options?.title) || cleanString(look.lookTitle) || "Saved look", + title: cleanAuraString(options?.title) || cleanAuraString(look.lookTitle) || "Saved look", createdAt: now, updatedAt: now, }; await setDoc(ref, payload, { merge: true }); + void logAuraLookStyleEvent(uid, "outfit_saved", look, { source: "aura" }); return { id: ref.id, ...payload } satisfies SavedAuraLookRecord; } @@ -65,8 +81,61 @@ export async function loadLatestSavedAuraLook(uid: string) { return { id: docSnap.id, look: data.look as AuraLook, - title: cleanString(data.title) || cleanString((data.look as AuraLook).lookTitle) || "Saved look", + title: cleanAuraString(data.title) || cleanAuraString((data.look as AuraLook).lookTitle) || "Saved look", createdAt: typeof data.createdAt === "number" ? data.createdAt : Date.now(), updatedAt: typeof data.updatedAt === "number" ? data.updatedAt : Date.now(), } satisfies SavedAuraLookRecord; } + +export async function saveAuraFavoriteOutfit( + uid: string, + look: AuraLook, + options?: { + source?: "aura_swipe" | "aura"; + sessionId?: string | null; + title?: string | null; + }, +) { + const id = buildStableAuraLookId("saved", look); + const authUid = auth.currentUser?.uid ?? null; + if (!authUid) { + console.warn("No user auth, skipping remote save"); + return null; + } + if (authUid !== uid) { + console.warn("Auth UID mismatch, skipping remote save", { authUid, uid }); + return null; + } + + const ref = doc(savedLooksCollection(uid), id); + const now = Date.now(); + const payload = { + id, + title: cleanAuraString(options?.title) || cleanAuraString(look.lookTitle) || "Saved outfit", + createdAt: now, + updatedAt: now, + source: options?.source ?? "aura_swipe", + sessionId: cleanAuraString(options?.sessionId) || null, + itemIds: getAuraLookItemIds(look), + stylingNote: cleanAuraString(look.stylingNote), + previewImageUrls: (look.pieces ?? []) + .map((piece) => cleanAuraString(piece.imageUrl)) + .filter(Boolean) + .slice(0, 4), + outfitSnapshot: buildAuraLookSnapshot(look), + look, + }; + console.log("Saving look for uid:", uid, "look:", id, "path:", `users/${uid}/savedLooks/${id}`); + try { + await setDoc(ref, payload, { merge: true }); + } catch (e) { + console.error("SAVE LOOK ERROR:", e); + throw e; + } + void logAuraLookStyleEvent(uid, "outfit_saved", look, { + source: options?.source === "aura_swipe" ? "aura" : (options?.source ?? "aura"), + }); + return { + ...payload, + } satisfies SavedAuraOutfitRecord; +} diff --git a/src/lib/auraMemory.ts b/src/lib/auraMemory.ts new file mode 100644 index 0000000..5b2f247 --- /dev/null +++ b/src/lib/auraMemory.ts @@ -0,0 +1,396 @@ +import { + collection, + doc, + getDoc, + getDocs, + limit, + orderBy, + query, + setDoc, +} from "firebase/firestore"; + +import { db } from "@/src/lib/firebase"; +import type { AuraLook } from "@/src/types/aura"; +import type { ClothingItem } from "@/src/types/ClothingItem"; +import type { WornOutfit } from "@/src/utils/dailyOutfits"; +import { + AURA_MEMORY_VERSION, + LEARNED_STYLE_MEMORY_DOC_ID, + SESSION_CONTEXT_DOC_ID, + STYLE_PROFILE_DOC_ID, + buildStyleProfileFromLegacyPreferences, + computeLearnedStyleMemory, + emptyLearnedStyleMemory, + normalizeAuraSessionContext, + normalizeLearnedStyleMemory, + normalizeStyleEvent, + normalizeStyleProfile, + type AuraSessionContext, + type LearnedStyleMemory, + type StyleEvent, + type StyleEventDerivedTraits, + type StyleEventOutfit, + type StyleEventType, + type StyleProfile, +} from "@/shared/auraMemory"; + +function userDocRef(uid: string) { + return doc(db, "users", uid); +} + +function profileDocRef(uid: string, docId: string) { + return doc(db, "users", uid, "profile", docId); +} + +function sessionContextDocRef(uid: string, chatId: string) { + return doc(db, "users", uid, "aiChats", chatId, "sessionContext", SESSION_CONTEXT_DOC_ID); +} + +function styleEventsCollection(uid: string) { + return collection(db, "users", uid, "styleEvents"); +} + +function cleanString(value: unknown) { + const next = String(value ?? "").trim(); + return next || null; +} + +function normalizeToken(value: unknown) { + return cleanString(value)?.toLowerCase().replace(/[_-]+/g, " ").replace(/\s+/g, " ") ?? null; +} + +function uniqueTokens(values: (string | null | undefined)[], limit = 8) { + const seen = new Set(); + const next: string[] = []; + for (const value of values) { + const token = normalizeToken(value); + if (!token || seen.has(token)) continue; + seen.add(token); + next.push(token); + if (next.length >= limit) break; + } + return next; +} + +function itemDocRef(uid: string, itemId: string) { + return doc(db, "users", uid, "items", itemId); +} + +function normalizeCategory(value?: string | null) { + const token = normalizeToken(value); + if (!token) return null; + + if (["tee", "t shirt", "tshirt", "shirt", "blouse", "tank", "polo", "sweater", "hoodie"].includes(token)) { + return token; + } + if (["jacket", "coat", "blazer", "outerwear"].includes(token)) return token; + if (["jeans", "trousers", "pants", "shorts", "skirt", "bottom"].includes(token)) return token; + if (["sneakers", "sneaker", "boots", "boot", "loafer", "loafers", "heels", "heel", "sandals", "sandal", "shoes", "footwear"].includes(token)) { + return token; + } + return token; +} + +function pickItemColor(item: Partial) { + return ( + cleanString(item.aiColorLabel) || + cleanString(item.aiColors?.[0]) || + cleanString(item.colors?.[0]) || + cleanString(item.colorLabel) || + cleanString(item.primaryColor) + ); +} + +function deriveTraitsFromItems( + items: ClothingItem[], + options?: { + formula?: string | null; + vibe?: string[] | null; + occasion?: string | null; + } +): StyleEventDerivedTraits { + const colors = uniqueTokens(items.map((item) => pickItemColor(item)), 6); + const categories = uniqueTokens( + items.map((item) => normalizeCategory(item.subCategory) ?? normalizeCategory(item.category)), + 6 + ); + const fits = uniqueTokens( + items.flatMap((item) => [ + normalizeToken(item.fit), + normalizeToken(item.rise), + normalizeToken(item.legShape), + ]), + 6 + ); + const brands = uniqueTokens(items.map((item) => cleanString(item.brand)), 4); + const vibe = uniqueTokens(options?.vibe ?? [], 4); + + const derivedTraits: StyleEventDerivedTraits = {}; + if (colors.length) derivedTraits.colors = colors; + if (categories.length) derivedTraits.categories = categories; + if (fits.length) derivedTraits.fits = fits; + if (brands.length) derivedTraits.brands = brands; + if (options?.formula) derivedTraits.formula = normalizeToken(options.formula) ?? undefined; + if (vibe.length) derivedTraits.vibe = vibe; + if (options?.occasion) derivedTraits.occasion = normalizeToken(options.occasion) ?? undefined; + return derivedTraits; +} + +function lookFormula(look: AuraLook) { + const roles = [ + look.pieces.some((piece) => piece.role === "outerwear") ? "outerwear" : null, + look.pieces.some((piece) => piece.role === "top") ? "top" : null, + look.pieces.some((piece) => piece.role === "bottom") ? "bottom" : null, + look.pieces.some((piece) => piece.role === "shoes") ? "shoes" : null, + look.pieces.some((piece) => piece.role === "accessory") ? "accessory" : null, + ].filter(Boolean); + return roles.join(" + "); +} + +function buildLookOutfit(look: AuraLook): StyleEventOutfit { + const firstPieceIdForRole = (role: AuraLook["pieces"][number]["role"]) => + look.pieces.find((piece) => piece.role === role && piece.itemId)?.itemId; + + const accessories = look.pieces + .filter((piece) => piece.role === "accessory" && piece.itemId) + .map((piece) => piece.itemId as string); + + return { + top: firstPieceIdForRole("top") ?? undefined, + outerwear: firstPieceIdForRole("outerwear") ?? undefined, + bottom: firstPieceIdForRole("bottom") ?? undefined, + footwear: firstPieceIdForRole("shoes") ?? undefined, + accessories: accessories.length ? accessories : undefined, + }; +} + +async function loadItemsByIds(uid: string, itemIds: string[]) { + const ids = Array.from(new Set(itemIds.map((id) => String(id ?? "").trim()).filter(Boolean))); + const snaps = await Promise.all(ids.map((itemId) => getDoc(itemDocRef(uid, itemId)))); + return snaps + .filter((snap) => snap.exists()) + .map((snap) => ({ ...(snap.data() as ClothingItem), id: snap.id })); +} + +function buildSessionPatchFromPrompt(prompt: string) { + const text = prompt.toLowerCase(); + const currentConstraints = uniqueTokens([ + text.includes("only my closet") || text.includes("use my closet") ? "closet first" : null, + text.includes("dressier") ? "dressier" : null, + text.includes("casual") ? "casual" : null, + text.includes("comfortable") ? "comfortable" : null, + text.includes("weather") ? "weather aware" : null, + ], 4); + const currentOccasion = (() => { + if (text.includes("date")) return "date night"; + if (text.includes("office") || text.includes("work")) return "work"; + if (text.includes("wedding")) return "wedding"; + if (text.includes("travel")) return "travel"; + if (text.includes("party")) return "party"; + if (text.includes("brunch")) return "brunch"; + if (text.includes("gym")) return "gym"; + return null; + })(); + const vibeForThisSession = (() => { + if (text.includes("clean")) return "clean"; + if (text.includes("sharp")) return "sharp"; + if (text.includes("layered")) return "layered"; + if (text.includes("bold")) return "bold"; + if (text.includes("minimal")) return "minimal"; + return null; + })(); + + return { + ...(currentOccasion ? { currentOccasion } : {}), + ...(currentConstraints.length ? { currentConstraints } : {}), + ...(vibeForThisSession ? { vibeForThisSession } : {}), + }; +} + +export async function loadStyleProfile(uid: string) { + const explicitSnap = await getDoc(profileDocRef(uid, STYLE_PROFILE_DOC_ID)); + if (explicitSnap.exists()) { + return normalizeStyleProfile(explicitSnap.data()); + } + + const userSnap = await getDoc(userDocRef(uid)); + const profilePreferences = userSnap.data()?.profilePreferences; + return buildStyleProfileFromLegacyPreferences(profilePreferences); +} + +export async function saveStyleProfile(uid: string, profile: StyleProfile) { + const normalized = normalizeStyleProfile(profile, { version: AURA_MEMORY_VERSION }); + const now = Date.now(); + const payload = { + ...normalized, + version: AURA_MEMORY_VERSION, + updatedAt: now, + } satisfies StyleProfile; + await setDoc(profileDocRef(uid, STYLE_PROFILE_DOC_ID), payload, { merge: true }); + return payload; +} + +export async function loadLearnedStyleMemory(uid: string) { + const snap = await getDoc(profileDocRef(uid, LEARNED_STYLE_MEMORY_DOC_ID)); + return snap.exists() ? normalizeLearnedStyleMemory(snap.data()) : emptyLearnedStyleMemory(); +} + +export async function saveLearnedStyleMemory(uid: string, learned: LearnedStyleMemory) { + const normalized = normalizeLearnedStyleMemory(learned); + const payload = { + ...normalized, + version: AURA_MEMORY_VERSION, + updatedAt: Date.now(), + } satisfies LearnedStyleMemory; + await setDoc(profileDocRef(uid, LEARNED_STYLE_MEMORY_DOC_ID), payload, { merge: true }); + return payload; +} + +export async function loadAuraSessionContext(uid: string, chatId: string) { + const snap = await getDoc(sessionContextDocRef(uid, chatId)); + return snap.exists() ? normalizeAuraSessionContext(snap.data()) : null; +} + +export async function saveAuraSessionContext(uid: string, chatId: string, session: AuraSessionContext) { + const normalized = normalizeAuraSessionContext(session) ?? { + updatedAt: Date.now(), + }; + await setDoc( + sessionContextDocRef(uid, chatId), + { + ...normalized, + updatedAt: Date.now(), + }, + { merge: true } + ); + return loadAuraSessionContext(uid, chatId); +} + +export async function mergeAuraSessionContext( + uid: string, + chatId: string, + patch: Partial +) { + const current = await loadAuraSessionContext(uid, chatId); + const mergedBase: AuraSessionContext = { + ...(current ?? { updatedAt: 0 }), + ...patch, + updatedAt: Date.now(), + }; + const merged = normalizeAuraSessionContext({ + ...mergedBase, + currentConstraints: patch.currentConstraints ?? current?.currentConstraints ?? [], + selectedItems: patch.selectedItems ?? current?.selectedItems ?? [], + }) ?? { updatedAt: Date.now() }; + await setDoc(sessionContextDocRef(uid, chatId), merged, { merge: true }); + return merged; +} + +export async function updateAuraSessionContextFromPrompt(uid: string, chatId: string, prompt: string) { + return mergeAuraSessionContext(uid, chatId, { + ...buildSessionPatchFromPrompt(prompt), + expiresAt: Date.now() + 1000 * 60 * 60 * 24, + }); +} + +export async function recomputeLearnedStyleMemory(uid: string, maxEvents = 200) { + const snap = await getDocs( + query(styleEventsCollection(uid), orderBy("createdAt", "desc"), limit(maxEvents)) + ); + const events = snap.docs + .map((docSnap) => normalizeStyleEvent(docSnap.data())) + .filter((event): event is StyleEvent => !!event); + const learned = computeLearnedStyleMemory(events, Date.now()); + await saveLearnedStyleMemory(uid, learned); + return learned; +} + +export async function logStyleEvent(uid: string, event: StyleEvent) { + const ref = doc(styleEventsCollection(uid)); + const normalized = normalizeStyleEvent({ + ...event, + createdAt: typeof event.createdAt === "number" ? event.createdAt : Date.now(), + }); + if (!normalized) { + throw new Error("Invalid style event"); + } + await setDoc(ref, normalized); + await recomputeLearnedStyleMemory(uid); + return { + id: ref.id, + ...normalized, + }; +} + +export async function logAuraLookStyleEvent( + uid: string, + type: Extract, + look: AuraLook, + options?: { + source?: StyleEvent["source"]; + occasion?: string | null; + } +) { + const closetItemIds = look.pieces + .filter((piece) => piece.source === "closet" && piece.itemId) + .map((piece) => piece.itemId as string); + const items = await loadItemsByIds(uid, closetItemIds); + return logStyleEvent(uid, { + type, + itemIds: closetItemIds, + outfit: buildLookOutfit(look), + derivedTraits: deriveTraitsFromItems(items, { + formula: lookFormula(look), + vibe: look.vibe.split(/[,/]/g).map((entry) => entry.trim()).filter(Boolean), + occasion: options?.occasion ?? null, + }), + source: options?.source ?? "aura", + createdAt: Date.now(), + }); +} + +export async function logWornOutfitStyleEvent(uid: string, wornOutfit: WornOutfit) { + const itemIds = [ + wornOutfit.itemsByCategory.outerwear, + wornOutfit.itemsByCategory.top, + wornOutfit.itemsByCategory.bottom, + wornOutfit.itemsByCategory.shoes, + ].filter(Boolean) as string[]; + const items = await loadItemsByIds(uid, itemIds); + return logStyleEvent(uid, { + type: "outfit_worn", + itemIds, + outfit: { + outerwear: wornOutfit.itemsByCategory.outerwear, + top: wornOutfit.itemsByCategory.top, + bottom: wornOutfit.itemsByCategory.bottom, + footwear: wornOutfit.itemsByCategory.shoes, + }, + derivedTraits: deriveTraitsFromItems(items, { + formula: [ + wornOutfit.itemsByCategory.outerwear ? "outerwear" : null, + wornOutfit.itemsByCategory.top ? "top" : null, + wornOutfit.itemsByCategory.bottom ? "bottom" : null, + wornOutfit.itemsByCategory.shoes ? "shoes" : null, + ] + .filter(Boolean) + .join(" + "), + }), + source: "planner", + createdAt: wornOutfit.wornAt, + }); +} + +export async function logItemStyleEvent( + uid: string, + type: Extract, + item: ClothingItem +) { + return logStyleEvent(uid, { + type, + itemIds: [item.id], + derivedTraits: deriveTraitsFromItems([item]), + source: "closet", + createdAt: Date.now(), + }); +} diff --git a/src/lib/auraOutfitFeedback.ts b/src/lib/auraOutfitFeedback.ts new file mode 100644 index 0000000..9739d3f --- /dev/null +++ b/src/lib/auraOutfitFeedback.ts @@ -0,0 +1,219 @@ +import { + collection, + doc, + getDoc, + getDocs, + limit, + orderBy, + query, + setDoc, +} from "firebase/firestore"; + +import { auth, db } from "@/src/lib/firebase"; +import { + type AuraLookSnapshot, + buildAuraLookSnapshot, + buildStableAuraLookId, + cleanAuraString, + getAuraLookItemIds, + hashAuraText, +} from "@/src/lib/auraLookDocument"; +import type { AuraLook, AuraLookOptionMeta } from "@/src/types/aura"; + +export type OutfitFeedbackType = + | "outfit_liked" + | "outfit_disliked" + | "outfit_favorited" + | "outfit_skipped"; + +export type OutfitFeedbackSnapshot = AuraLookSnapshot; + +export type OutfitFeedbackRecord = { + id: string; + feedbackType: OutfitFeedbackType; + createdAt: number; + updatedAt: number; + source: "aura" | "aura_swipe"; + sessionId: string | null; + chatId: string | null; + messageId: string | null; + optionIndex: number | null; + optionLabel: string; + optionId: string; + batchPosition: number | null; + directionLabel: string | null; + itemIds: string[]; + title: string; + stylingNote: string; + personalizationLabel: string; + personalizationNote: string; + outfitSnapshot: OutfitFeedbackSnapshot; +}; + +function outfitFeedbackCollection(uid: string) { + return collection(db, "users", uid, "outfitFeedback"); +} + +function buildFeedbackId(input: { + chatId?: string | null; + messageId?: string | null; + optionIndex?: number | null; + optionLabel?: string | null; + sessionId?: string | null; + batchPosition?: number | null; + feedbackType: OutfitFeedbackType; + look: AuraLook; +}) { + const raw = [ + input.feedbackType, + cleanAuraString(input.sessionId) || "no-session", + cleanAuraString(input.chatId) || "no-chat", + cleanAuraString(input.messageId) || "no-message", + typeof input.optionIndex === "number" ? String(input.optionIndex) : "no-option", + typeof input.batchPosition === "number" ? String(input.batchPosition) : "no-position", + cleanAuraString(input.optionLabel).toLowerCase() || "no-label", + buildStableAuraLookId("feedback", input.look), + ].join("|"); + return `aura_${hashAuraText(raw)}`; +} + +function toRecord( + id: string, + data: Record, +): OutfitFeedbackRecord | null { + const snapshot = data.outfitSnapshot; + if (!snapshot || typeof snapshot !== "object") return null; + const outfitSnapshot = snapshot as OutfitFeedbackSnapshot; + const feedbackType = + data.feedbackType === "outfit_disliked" || data.feedbackType === "disliked" + ? "outfit_disliked" + : data.feedbackType === "outfit_liked" || data.feedbackType === "liked" + ? "outfit_liked" + : data.feedbackType === "outfit_favorited" + ? "outfit_favorited" + : data.feedbackType === "outfit_skipped" + ? "outfit_skipped" + : null; + if (!feedbackType) return null; + return { + id, + feedbackType, + createdAt: typeof data.createdAt === "number" ? data.createdAt : Date.now(), + updatedAt: typeof data.updatedAt === "number" ? data.updatedAt : Date.now(), + source: data.source === "aura_swipe" ? "aura_swipe" : "aura", + sessionId: cleanAuraString(data.sessionId) || null, + chatId: cleanAuraString(data.chatId) || null, + messageId: cleanAuraString(data.messageId) || null, + optionIndex: typeof data.optionIndex === "number" ? data.optionIndex : null, + optionLabel: cleanAuraString(data.optionLabel), + optionId: cleanAuraString(data.optionId), + batchPosition: typeof data.batchPosition === "number" ? data.batchPosition : null, + directionLabel: cleanAuraString(data.directionLabel) || null, + itemIds: Array.isArray(data.itemIds) ? data.itemIds.map((entry) => cleanAuraString(entry)).filter(Boolean) : [], + title: cleanAuraString(data.title), + stylingNote: cleanAuraString(data.stylingNote), + personalizationLabel: cleanAuraString(data.personalizationLabel), + personalizationNote: cleanAuraString(data.personalizationNote), + outfitSnapshot, + }; +} + +export async function saveAuraOutfitFeedback( + uid: string, + input: { + feedbackType: OutfitFeedbackType; + look: AuraLook; + chatId?: string | null; + messageId?: string | null; + option?: AuraLookOptionMeta | null; + source?: "aura" | "aura_swipe"; + sessionId?: string | null; + batchPosition?: number | null; + directionLabel?: string | null; + }, +) { + const authUid = auth.currentUser?.uid ?? null; + if (!authUid) { + console.warn("No user auth, skipping remote save"); + return null; + } + if (authUid !== uid) { + console.warn("Auth UID mismatch, skipping remote save", { authUid, uid }); + return null; + } + + const optionIndex = typeof input.option?.optionIndex === "number" ? input.option.optionIndex : null; + const optionLabel = cleanAuraString(input.option?.optionLabel); + const optionId = + cleanAuraString(input.option?.optionId) || + (typeof optionIndex === "number" ? `option-${optionIndex + 1}` : "default"); + const id = buildFeedbackId({ + feedbackType: input.feedbackType, + sessionId: input.sessionId, + chatId: input.chatId, + messageId: input.messageId, + optionIndex, + batchPosition: input.batchPosition, + optionLabel, + look: input.look, + }); + const ref = doc(outfitFeedbackCollection(uid), id); + const existing = await getDoc(ref); + const now = Date.now(); + const snapshot = buildAuraLookSnapshot(input.look); + const createdAt = + existing.exists() && typeof existing.data()?.createdAt === "number" + ? (existing.data()?.createdAt as number) + : now; + const payload = { + feedbackType: input.feedbackType, + createdAt, + updatedAt: now, + source: input.source ?? "aura", + sessionId: cleanAuraString(input.sessionId) || null, + chatId: cleanAuraString(input.chatId) || null, + messageId: cleanAuraString(input.messageId) || null, + optionIndex, + optionLabel, + optionId, + batchPosition: typeof input.batchPosition === "number" ? input.batchPosition : null, + directionLabel: cleanAuraString(input.directionLabel) || null, + itemIds: getAuraLookItemIds(input.look), + title: cleanAuraString(input.look.lookTitle) || "AURA look", + stylingNote: cleanAuraString(input.look.stylingNote), + personalizationLabel: cleanAuraString(input.look.personalizationLabel), + personalizationNote: cleanAuraString(input.look.personalizationNote), + outfitSnapshot: snapshot, + }; + console.log("Saving outfit feedback for uid:", uid, "feedback:", id, "path:", `users/${uid}/outfitFeedback/${id}`); + try { + await setDoc(ref, payload, { merge: true }); + } catch (e) { + console.error("SAVE LOOK ERROR:", e); + throw e; + } + return { + id, + ...payload, + } satisfies OutfitFeedbackRecord; +} + +export async function loadRecentOutfitFeedback( + uid: string, + options?: { + feedbackType?: OutfitFeedbackType; + max?: number; + }, +) { + const max = Math.max(1, Math.min(options?.max ?? 12, 50)); + const snap = await getDocs( + query(outfitFeedbackCollection(uid), orderBy("updatedAt", "desc"), limit(options?.feedbackType ? max * 3 : max)), + ); + const records = snap.docs + .map((entry) => toRecord(entry.id, entry.data() as Record)) + .filter((entry): entry is OutfitFeedbackRecord => !!entry); + const filtered = options?.feedbackType + ? records.filter((entry) => entry.feedbackType === options.feedbackType) + : records; + return filtered.slice(0, max); +} diff --git a/src/lib/formatChatText.ts b/src/lib/formatChatText.ts new file mode 100644 index 0000000..85ae84a --- /dev/null +++ b/src/lib/formatChatText.ts @@ -0,0 +1,42 @@ +function trimCommonPrefix(value: string) { + return value.replace(/^https?:\/\//i, "").replace(/^www\./i, ""); +} + +function humanizeSlug(value: string) { + return value + .replace(/[-_]+/g, " ") + .replace(/\s+/g, " ") + .trim() + .replace(/\b\w/g, (char) => char.toUpperCase()); +} + +export function isUrlOnlyMessage(text?: string | null) { + const value = String(text ?? "").trim(); + if (!value) return false; + return /^https?:\/\/\S+$/i.test(value); +} + +export function formatUrlForDisplay(url: string) { + try { + const parsed = new URL(url); + const host = trimCommonPrefix(parsed.host.toLowerCase()); + const firstPathSegment = parsed.pathname + .split("/") + .map((part) => part.trim()) + .filter(Boolean) + .find((part) => /[a-z]/i.test(part) && !/^dp$/i.test(part) && !/^[A-Z0-9]{6,}$/i.test(part)); + + const title = + parsed.searchParams.get("title") || + parsed.searchParams.get("product") || + parsed.searchParams.get("name") || + (firstPathSegment ? humanizeSlug(decodeURIComponent(firstPathSegment)) : ""); + + if (title) { + return `${host} • ${title}`; + } + return host; + } catch { + return url; + } +} diff --git a/src/lib/localChatCache.ts b/src/lib/localChatCache.ts index b6ad4bd..60db615 100644 --- a/src/lib/localChatCache.ts +++ b/src/lib/localChatCache.ts @@ -1,4 +1,4 @@ -import AsyncStorage from "@react-native-async-storage/async-storage"; +import { Storage } from "@/src/lib/storage"; const CACHE_PREFIX = "outfit-chat:"; const MAX_MESSAGES_PER_SESSION = 30; @@ -46,7 +46,7 @@ function sortSessions(sessions: LocalChatSession[]) { async function loadRawStore(uid: string): Promise | null> { try { - const raw = await AsyncStorage.getItem(getScopedKey(uid, "sessions-v2")); + const raw = await Storage.getItem(getScopedKey(uid, "sessions-v2")); if (!raw) return null; const parsed = JSON.parse(raw) as SessionStore; if (!parsed || !Array.isArray(parsed.sessions)) return null; @@ -81,7 +81,7 @@ async function loadStore(uid: string): Promise> { async function persistStore(uid: string, store: SessionStore): Promise { try { - await AsyncStorage.setItem( + await Storage.setItem( getScopedKey(uid, "sessions-v2"), JSON.stringify({ latestSessionId: store.latestSessionId, @@ -161,7 +161,7 @@ export async function clearSession(uid: string, sessionId?: string): Promise(uid: string): Promise | null> { try { - const raw = await AsyncStorage.getItem(getScopedKey(uid, "latest-chat-v3")); + const raw = await Storage.getItem(getScopedKey(uid, "latest-chat-v3")); if (raw) { const parsed = JSON.parse(raw) as CachePayload; if (parsed && Array.isArray(parsed.messages)) { @@ -194,10 +194,10 @@ export async function saveLatestChatCache( ): Promise { try { if (!chatId) { - await AsyncStorage.removeItem(getScopedKey(uid, "latest-chat-v3")); + await Storage.removeItem(getScopedKey(uid, "latest-chat-v3")); return; } - await AsyncStorage.setItem( + await Storage.setItem( getScopedKey(uid, "latest-chat-v3"), JSON.stringify({ chatId, @@ -213,7 +213,7 @@ export async function saveLatestChatCache( export async function clearLatestChatCache(uid: string): Promise { try { - await AsyncStorage.removeItem(getScopedKey(uid, "latest-chat-v3")); + await Storage.removeItem(getScopedKey(uid, "latest-chat-v3")); } catch { // ignore } diff --git a/src/types/aura.ts b/src/types/aura.ts index f40aac5..fda1a2a 100644 --- a/src/types/aura.ts +++ b/src/types/aura.ts @@ -9,16 +9,51 @@ export type AuraLookPiece = { export type AuraLookAction = | "saveLook" | "planForToday" + | "likeLook" + | "notMyVibe" | "showMoreLikeThis" + | "lessLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier"; +export type AuraSuggestionItem = { + label: string; + searchQuery?: string | null; +}; + +export type AuraCandidateItem = { + candidateId: string; + imageUrls: string[]; + primaryImageUrl?: string | null; + secondaryImageUrls?: string[]; + title?: string | null; + category?: string | null; + subCategory?: string | null; + color?: string | null; + brand?: string | null; + material?: string | null; + fit?: string | null; + pattern?: string | null; + confidence?: number | null; + sourceType: "image" | "link" | "batch"; + sourceUrl?: string | null; + status: "awaiting_confirmation" | "needs_review" | "added" | "cancelled" | "failed"; +}; + +export type AuraCandidateAction = + | { type: "add_candidate"; candidateId: string } + | { type: "edit_candidate"; candidateId: string } + | { type: "cancel_candidate"; candidateId: string } + | { type: "add_all_candidates" }; + export type AuraLook = { lookTitle: string; vibe: string; shortExplanation: string; stylingNote?: string; + personalizationLabel?: string; + personalizationNote?: string; pieces: AuraLookPiece[]; fromCloset: string[]; addToComplete: string[]; @@ -26,8 +61,14 @@ export type AuraLook = { actions: AuraLookAction[]; }; +export type AuraLookOptionMeta = { + optionIndex: number; + optionLabel?: string | null; + optionId?: string | null; +}; + export type AuraResponse = { - presentation?: "chat" | "card"; + presentation?: "chat" | "card" | "candidate_preview"; title: string; reply: string; reason: string; @@ -35,6 +76,12 @@ export type AuraResponse = { ownedPieces?: string[]; recommendedAdditions?: string[]; swapSuggestion: string; + missingPieces?: string[]; + upgradeSuggestions?: string[]; + upgradeSuggestionItems?: AuraSuggestionItem[]; chips: string[]; look?: AuraLook | null; + lookOptions?: AuraLook[]; + candidates?: AuraCandidateItem[]; + candidateItems?: AuraCandidateItem[]; }; From 19206e84ef3acbe236891984ad33185e84eb1976 Mon Sep 17 00:00:00 2001 From: Athfan Date: Mon, 27 Apr 2026 02:07:02 -0500 Subject: [PATCH 12/93] feat: add AURA swipe-based outfit exploration --- app/aura/swipe.tsx | 976 ++++++++++++++++++++++++ functions/src/generateAuraSwipeBatch.ts | 268 +++++++ src/lib/auraSwipe.ts | 232 ++++++ 3 files changed, 1476 insertions(+) create mode 100644 app/aura/swipe.tsx create mode 100644 functions/src/generateAuraSwipeBatch.ts create mode 100644 src/lib/auraSwipe.ts diff --git a/app/aura/swipe.tsx b/app/aura/swipe.tsx new file mode 100644 index 0000000..cd01925 --- /dev/null +++ b/app/aura/swipe.tsx @@ -0,0 +1,976 @@ +import { Ionicons } from "@expo/vector-icons"; +import { LinearGradient } from "expo-linear-gradient"; +import { router } from "expo-router"; +import * as Haptics from "expo-haptics"; +import React from "react"; +import { + Alert, + Animated, + Modal, + PanResponder, + Pressable, + ScrollView, + StyleSheet, + Text, + View, + useWindowDimensions, +} from "react-native"; +import Reanimated, { + useAnimatedStyle, + useSharedValue, + withRepeat, + withSequence, + withTiming, +} from "react-native-reanimated"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; + +import { Fonts } from "@/constants/theme"; +import { AuraLookCard } from "@/src/components/aura/AuraLookCard"; +import AuraRing, { RING_SIZE_MD } from "@/src/components/brand/AuraRing"; +import { auraShadow, auraTheme } from "@/src/components/ai/aiTheme"; +import { useReduceMotion } from "@/hooks/useReduceMotion"; +import { useAppTheme } from "@/src/hooks/useAppTheme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { logAuraLookStyleEvent } from "@/src/lib/auraMemory"; +import { saveAuraFavoriteOutfit } from "@/src/lib/auraLooks"; +import { saveAuraOutfitFeedback } from "@/src/lib/auraOutfitFeedback"; +import { Toast } from "@/src/lib/toast"; +import { + feedbackTypeForSwipe, + generateAuraSwipeBatch, + type AuraSwipeBatchLook, + type AuraSwipeDirectionLabel, +} from "@/src/lib/auraSwipe"; +import { isVisibleWardrobeItem, listenToItems, toCanonicalCategory } from "@/src/lib/items"; +import type { ClothingItem } from "@/src/types/ClothingItem"; + +const SWIPE_X_THRESHOLD = 110; +const SWIPE_Y_THRESHOLD = -110; +const DOMINANT_AXIS_RATIO = 1.15; +const NON_DOMINANT_DAMPING = 0.14; + +function createEmptyItemsMap(items: ClothingItem[]) { + return new Map(items.map((item) => [item.id, item])); +} + +function wardrobeCounts(items: ClothingItem[]) { + return items.reduce( + (acc, item) => { + if (!isVisibleWardrobeItem(item)) return acc; + const category = toCanonicalCategory(item.category); + if (category === "top") acc.tops += 1; + if (category === "bottom") acc.bottoms += 1; + if (category === "shoes") acc.shoes += 1; + return acc; + }, + { tops: 0, bottoms: 0, shoes: 0 }, + ); +} + +function getConstrainedPan(dx: number, dy: number) { + const absX = Math.abs(dx); + const absY = Math.abs(dy); + + if (dy < 0 && absY > absX * DOMINANT_AXIS_RATIO) { + return { x: dx * NON_DOMINANT_DAMPING, y: dy }; + } + + if (absX > absY * DOMINANT_AXIS_RATIO) { + return { x: dx, y: dy * NON_DOMINANT_DAMPING }; + } + + if (dy < 0 && absY >= absX) { + return { x: dx * NON_DOMINANT_DAMPING, y: dy * 0.92 }; + } + + return { x: dx, y: dy * 0.22 }; +} + +export default function AuraSwipeScreen() { + const { user } = useAuth(); + const insets = useSafeAreaInsets(); + const { width, height } = useWindowDimensions(); + const uid = user?.uid ?? null; + + const [items, setItems] = React.useState([]); + const [batch, setBatch] = React.useState([]); + const [batchId, setBatchId] = React.useState(""); + const [currentIndex, setCurrentIndex] = React.useState(0); + const [loading, setLoading] = React.useState(false); + const [error, setError] = React.useState(null); + const [detailsLook, setDetailsLook] = React.useState(null); + const [processingSwipe, setProcessingSwipe] = React.useState(false); + + const itemsById = React.useMemo(() => createEmptyItemsMap(items), [items]); + const counts = React.useMemo(() => wardrobeCounts(items), [items]); + const canGenerate = counts.tops > 0 && counts.bottoms > 0 && counts.shoes > 0; + const pan = React.useRef(new Animated.ValueXY()).current; + const activeLookRef = React.useRef(null); + const touchStartRef = React.useRef({ moved: false }); + + const visibleLooks = batch.slice(currentIndex, currentIndex + 3); + const activeLook = visibleLooks[0] ?? null; + const remaining = Math.max(0, batch.length - currentIndex); + + React.useEffect(() => { + activeLookRef.current = activeLook; + }, [activeLook]); + + React.useEffect(() => { + if (!uid) return undefined; + return listenToItems(uid, (nextItems) => setItems(nextItems)); + }, [uid]); + + const loadBatch = React.useCallback(async () => { + if (!uid || !canGenerate) { + setLoading(false); + return; + } + setLoading(true); + setError(null); + try { + const result = await generateAuraSwipeBatch({ items, numOutfits: 8 }); + console.log("[AURA_SWIPE] normalized response", result); + setBatch(result.lookOptions); + setBatchId(result.batchId); + setCurrentIndex(0); + pan.setValue({ x: 0, y: 0 }); + } catch (loadError) { + console.log("[AURA_SWIPE] loadBatch failed", loadError); + setError(loadError instanceof Error ? loadError.message : "Unable to load swipe looks."); + } finally { + setLoading(false); + } + }, [canGenerate, items, pan, uid]); + + React.useEffect(() => { + if (!uid) return; + if (!canGenerate) { + setLoading(false); + return; + } + if (items.length === 0) return; + if (batch.length > 0 || loading) return; + void loadBatch(); + }, [batch.length, canGenerate, items.length, loadBatch, loading, uid]); + + const persistSwipe = React.useCallback( + async (lookEntry: AuraSwipeBatchLook, direction: AuraSwipeDirectionLabel) => { + if (!uid) { + console.warn("No user auth, skipping remote save"); + return; + } + const feedbackType = feedbackTypeForSwipe(direction); + try { + await saveAuraOutfitFeedback(uid, { + feedbackType, + look: lookEntry.look, + source: "aura_swipe", + sessionId: batchId, + batchPosition: lookEntry.position, + directionLabel: lookEntry.directionLabel ?? direction, + }); + + if (direction === "right") { + await logAuraLookStyleEvent(uid, "outfit_liked", lookEntry.look, { source: "aura" }); + } + if (direction === "left") { + await logAuraLookStyleEvent(uid, "outfit_disliked", lookEntry.look, { source: "aura" }); + } + if (direction === "up") { + await saveAuraFavoriteOutfit(uid, lookEntry.look, { + source: "aura_swipe", + sessionId: batchId, + title: lookEntry.look.lookTitle, + }); + Toast.saved(); + } + } catch (e) { + console.error("SAVE LOOK ERROR:", e); + throw e; + } + }, + [batchId, uid], + ); + + const advanceDeck = React.useCallback((direction: AuraSwipeDirectionLabel) => { + if (processingSwipe || !activeLookRef.current) return; + const lookEntry = activeLookRef.current; + setProcessingSwipe(true); + void Haptics.impactAsync( + direction === "up" ? Haptics.ImpactFeedbackStyle.Medium : Haptics.ImpactFeedbackStyle.Light, + ); + + const target = + direction === "left" + ? { x: -width * 1.1, y: 30 } + : direction === "right" + ? { x: width * 1.1, y: 30 } + : { x: 0, y: -height * 0.7 }; + + Animated.timing(pan, { + toValue: target, + duration: 220, + useNativeDriver: true, + }).start(() => { + pan.setValue({ x: 0, y: 0 }); + setCurrentIndex((previous) => previous + 1); + setProcessingSwipe(false); + void persistSwipe(lookEntry, direction).catch((persistError) => { + Alert.alert( + "Swipe saved locally", + persistError instanceof Error + ? persistError.message + : "We could not finish saving that feedback.", + ); + }); + }); + }, [height, pan, persistSwipe, processingSwipe, width]); + + const panResponder = React.useMemo( + () => + PanResponder.create({ + onMoveShouldSetPanResponder: (_, gestureState) => + Math.abs(gestureState.dx) > 6 || Math.abs(gestureState.dy) > 6, + onPanResponderGrant: () => { + touchStartRef.current = { moved: false }; + }, + onPanResponderMove: (_, gestureState) => { + touchStartRef.current.moved = true; + pan.setValue(getConstrainedPan(gestureState.dx, gestureState.dy)); + }, + onPanResponderRelease: (_, gestureState) => { + const absX = Math.abs(gestureState.dx); + const absY = Math.abs(gestureState.dy); + + if (gestureState.dy <= SWIPE_Y_THRESHOLD && absY > absX * 0.8) { + advanceDeck("up"); + return; + } + + if (gestureState.dx >= SWIPE_X_THRESHOLD) { + advanceDeck("right"); + return; + } + + if (gestureState.dx <= -SWIPE_X_THRESHOLD) { + advanceDeck("left"); + return; + } + + if (!touchStartRef.current.moved && activeLookRef.current) { + setDetailsLook(activeLookRef.current); + } + + Animated.spring(pan, { + toValue: { x: 0, y: 0 }, + useNativeDriver: true, + friction: 10, + tension: 120, + }).start(); + }, + }), + [advanceDeck, pan], + ); + + const likeOpacity = pan.x.interpolate({ + inputRange: [0, 60, 140], + outputRange: [0, 0.4, 1], + extrapolate: "clamp", + }); + const nopeOpacity = pan.x.interpolate({ + inputRange: [-140, -60, 0], + outputRange: [1, 0.4, 0], + extrapolate: "clamp", + }); + const favoriteOpacity = pan.y.interpolate({ + inputRange: [-150, -80, 0], + outputRange: [1, 0.45, 0], + extrapolate: "clamp", + }); + const revealProgress = Animated.add( + pan.x.interpolate({ + inputRange: [-160, 0, 160], + outputRange: [1, 0, 1], + extrapolate: "clamp", + }), + pan.y.interpolate({ + inputRange: [-180, 0], + outputRange: [1, 0], + extrapolate: "clamp", + }), + ).interpolate({ + inputRange: [0, 1], + outputRange: [0, 1], + extrapolate: "clamp", + }); + + const topCardStyle = { + transform: [{ translateX: pan.x }, { translateY: pan.y }], + }; + + return ( + + + router.back()} /> + + AURA SWIPE + Train your taste + + void loadBatch()} /> + + + + + + Remaining + {remaining} + + + Favorites save to + savedLooks + + + + + + {loading ? ( + + ) : !canGenerate ? ( + + ) : error ? ( + void loadBatch()} /> + ) : !activeLook ? ( + void loadBatch()} /> + ) : ( + + + {visibleLooks + .slice() + .reverse() + .map((lookEntry, reverseIndex) => { + const actualIndex = visibleLooks.length - 1 - reverseIndex; + const isTop = actualIndex === 0; + const depthOffset = actualIndex * 8; + const scale = 1 - actualIndex * 0.018; + const card = ( + + {isTop ? ( + <> + + PASS + + + LIKE + + + SAVE + + + ) : null} + + {isTop ? ( + + ) : ( + + + + )} + + ); + + if (!isTop) return {card}; + + return ( + + setDetailsLook(lookEntry)}> + {card} + + + ); + })} + + + )} + + + + Left to pass, right to like, up to save. Tap to inspect. + + advanceDeck("left")} disabled={!activeLook || processingSwipe} /> + advanceDeck("right")} disabled={!activeLook || processingSwipe} primary /> + advanceDeck("up")} disabled={!activeLook || processingSwipe} /> + + + + setDetailsLook(null)} + > + + + + + LOOK DETAILS + {detailsLook?.look.lookTitle ?? "Outfit details"} + + setDetailsLook(null)} /> + + {detailsLook ? ( + + + + PIECES + {detailsLook.look.pieces.map((piece) => ( + + {piece.role.toUpperCase()} + {piece.itemName} + + ))} + + + ) : null} + + + + + ); +} + +function CaughtUpStateCard({ onRefresh }: { onRefresh: () => void }) { + const { colors } = useAppTheme(); + const reduceMotion = useReduceMotion(); + const scale = useSharedValue(1); + + React.useEffect(() => { + if (reduceMotion) { + scale.value = 1; + return; + } + scale.value = withRepeat( + withSequence( + withTiming(1.04, { duration: 1000 }), + withTiming(1, { duration: 1000 }), + ), + -1, + true, + ); + }, [reduceMotion, scale]); + + const markStyle = useAnimatedStyle(() => ({ + transform: [{ scale: scale.value }], + })); + + return ( + + + + + {"You're all caught up"} + Refresh to get your next batch. + + + + Refresh + + + + ); +} + +function HeaderButton({ + icon, + label, + onPress, +}: { + icon: keyof typeof Ionicons.glyphMap; + label: string; + onPress: () => void; +}) { + return ( + + + {label} + + ); +} + +function ActionButton({ + label, + icon, + onPress, + disabled, + primary, +}: { + label: string; + icon: keyof typeof Ionicons.glyphMap; + onPress: () => void; + disabled: boolean; + primary?: boolean; +}) { + return ( + [ + styles.actionButton, + primary ? styles.actionPrimary : styles.actionSecondary, + disabled ? { opacity: 0.45 } : null, + pressed && !disabled ? { transform: [{ scale: 0.98 }] } : null, + ]} + > + + {label} + + ); +} + +function StateCard({ + title, + body, + actionLabel, + onAction, +}: { + title: string; + body: string; + actionLabel?: string; + onAction?: () => void; +}) { + return ( + + {title} + {body} + {actionLabel && onAction ? ( + + {actionLabel} + + ) : null} + + ); +} + +function DeckCardShell({ depth }: { depth: number }) { + return ( + + + + + + + 1 ? styles.shellBoardDeep : null]} /> + + + + + ); +} + +const styles = StyleSheet.create({ + headerRow: { + flexDirection: "row", + alignItems: "center", + justifyContent: "space-between", + gap: 12, + }, + headerCopy: { + alignItems: "center", + gap: 2, + }, + headerEyebrow: { + color: auraTheme.accentStrong, + fontSize: 11, + fontWeight: "800", + letterSpacing: 1.4, + fontFamily: Fonts.sans, + }, + headerTitle: { + color: "#F6F8FB", + fontSize: 18, + fontWeight: "800", + letterSpacing: -0.35, + fontFamily: Fonts.sans, + }, + headerButton: { + flexDirection: "row", + alignItems: "center", + gap: 6, + borderRadius: 999, + borderWidth: 1, + borderColor: auraTheme.borderSoft, + backgroundColor: auraTheme.surfaceSoft, + paddingHorizontal: 10, + paddingVertical: 8, + }, + headerButtonText: { + color: "#E7ECF4", + fontSize: 12, + fontWeight: "700", + fontFamily: Fonts.sans, + }, + summaryRow: { + flexDirection: "row", + gap: 10, + }, + summaryPill: { + flex: 1, + borderRadius: 16, + borderWidth: 1, + borderColor: auraTheme.borderSoft, + backgroundColor: auraTheme.surfaceSoft, + paddingHorizontal: 13, + paddingVertical: 11, + gap: 2, + }, + summaryLabel: { + color: auraTheme.textFaint, + fontSize: 11, + fontWeight: "700", + letterSpacing: 0.8, + fontFamily: Fonts.sans, + }, + summaryValue: { + color: "#F6F8FB", + fontSize: 13, + fontWeight: "700", + fontFamily: Fonts.sans, + }, + deckArea: { + flex: 1, + paddingHorizontal: 18, + paddingTop: 18, + alignItems: "center", + justifyContent: "center", + }, + deckCard: { + position: "absolute", + left: 0, + right: 0, + overflow: "visible", + }, + deckShellWrap: { + flex: 1, + }, + overlayBadge: { + position: "absolute", + zIndex: 20, + borderRadius: 999, + borderWidth: 1, + borderColor: auraTheme.borderAccent, + backgroundColor: "rgba(9,17,25,0.92)", + paddingHorizontal: 12, + paddingVertical: 8, + }, + overlayLeft: { + top: 14, + left: 14, + }, + overlayRight: { + top: 14, + right: 14, + }, + overlayTop: { + top: 14, + alignSelf: "center", + }, + overlayText: { + color: auraTheme.accentStrong, + fontSize: 11, + fontWeight: "900", + letterSpacing: 1.2, + fontFamily: Fonts.sans, + }, + footer: { + paddingHorizontal: 18, + paddingTop: 12, + gap: 14, + }, + footerHint: { + textAlign: "center", + color: auraTheme.textMuted, + fontSize: 12.5, + lineHeight: 18, + fontFamily: Fonts.sans, + }, + footerActions: { + flexDirection: "row", + gap: 10, + }, + actionButton: { + flex: 1, + minHeight: 48, + borderRadius: 16, + alignItems: "center", + justifyContent: "center", + flexDirection: "row", + gap: 7, + borderWidth: 1, + }, + actionPrimary: { + backgroundColor: auraTheme.accent, + borderColor: "rgba(255,255,255,0.14)", + }, + actionSecondary: { + backgroundColor: auraTheme.surfaceStrong, + borderColor: auraTheme.borderSoft, + }, + actionButtonText: { + color: "#E8EDF5", + fontSize: 13, + fontWeight: "800", + fontFamily: Fonts.sans, + }, + stateCard: { + width: "100%", + maxWidth: 420, + borderRadius: 28, + paddingHorizontal: 22, + paddingVertical: 24, + borderWidth: 1, + borderColor: auraTheme.border, + backgroundColor: auraTheme.surfaceStrong, + gap: 10, + ...auraShadow(0.18), + }, + stateTitle: { + color: "#F6F8FB", + fontSize: 24, + lineHeight: 28, + fontWeight: "800", + fontFamily: Fonts.sans, + }, + stateBody: { + color: auraTheme.textMuted, + fontSize: 14, + lineHeight: 21, + fontFamily: Fonts.sans, + }, + stateButton: { + alignSelf: "flex-start", + borderRadius: 999, + backgroundColor: auraTheme.accentTint, + borderWidth: 1, + borderColor: auraTheme.borderAccent, + paddingHorizontal: 13, + paddingVertical: 8, + }, + stateButtonText: { + color: "#F6F8FB", + fontSize: 12.5, + fontWeight: "800", + fontFamily: Fonts.sans, + }, + caughtUpMark: { + width: 58, + height: 58, + borderRadius: 29, + borderWidth: 1, + alignItems: "center", + justifyContent: "center", + backgroundColor: "rgba(255,255,255,0.04)", + marginBottom: 2, + }, + caughtUpMarkText: { + fontSize: 24, + fontWeight: "900", + letterSpacing: -0.5, + fontFamily: Fonts.sans, + }, + caughtUpButton: { + alignSelf: "flex-start", + borderRadius: 999, + overflow: "hidden", + marginTop: 2, + }, + caughtUpButtonGradient: { + flexDirection: "row", + alignItems: "center", + gap: 7, + paddingHorizontal: 14, + paddingVertical: 9, + }, + caughtUpButtonText: { + fontSize: 12.5, + fontWeight: "900", + fontFamily: Fonts.sans, + }, + modalScrim: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.45)", + justifyContent: "flex-end", + }, + modalCard: { + maxHeight: "88%", + borderTopLeftRadius: 28, + borderTopRightRadius: 28, + backgroundColor: "#09111A", + paddingHorizontal: 18, + paddingTop: 18, + }, + modalHeader: { + flexDirection: "row", + alignItems: "center", + gap: 12, + marginBottom: 14, + }, + modalEyebrow: { + color: auraTheme.textFaint, + fontSize: 11, + fontWeight: "800", + letterSpacing: 1.2, + fontFamily: Fonts.sans, + }, + modalTitle: { + color: "#F6F8FB", + fontSize: 22, + lineHeight: 26, + fontWeight: "800", + fontFamily: Fonts.sans, + marginTop: 2, + }, + detailsSection: { + marginTop: 16, + borderRadius: 20, + borderWidth: 1, + borderColor: auraTheme.borderSoft, + backgroundColor: auraTheme.surfaceSoft, + padding: 14, + gap: 10, + }, + detailsLabel: { + color: auraTheme.textFaint, + fontSize: 11, + fontWeight: "800", + letterSpacing: 1, + fontFamily: Fonts.sans, + }, + pieceRow: { + flexDirection: "row", + alignItems: "center", + gap: 10, + }, + pieceRole: { + width: 84, + color: auraTheme.accentStrong, + fontSize: 11, + fontWeight: "800", + fontFamily: Fonts.sans, + }, + pieceName: { + flex: 1, + color: "#EDF1F7", + fontSize: 13.5, + lineHeight: 18, + fontFamily: Fonts.sans, + }, + shellCard: { + flex: 1, + gap: 14, + paddingTop: 16, + paddingHorizontal: 16, + paddingBottom: 14, + borderRadius: 32, + backgroundColor: "#0D141D", + borderWidth: 1, + borderColor: "rgba(177, 197, 223, 0.1)", + }, + shellHeader: { + gap: 10, + }, + shellChip: { + width: 84, + height: 22, + borderRadius: 999, + backgroundColor: "rgba(140, 168, 198, 0.09)", + borderWidth: 1, + borderColor: "rgba(160, 185, 214, 0.08)", + }, + shellLine: { + borderRadius: 999, + backgroundColor: "rgba(160, 185, 214, 0.08)", + }, + shellTitleLine: { + width: "58%", + height: 18, + }, + shellBodyLine: { + width: "76%", + height: 12, + }, + shellBoard: { + flex: 1, + minHeight: 388, + borderRadius: 28, + backgroundColor: "rgba(244, 240, 235, 0.2)", + borderWidth: 1, + borderColor: "rgba(236, 239, 244, 0.08)", + }, + shellBoardDeep: { + minHeight: 372, + opacity: 0.8, + }, + shellSummary: { + gap: 8, + paddingTop: 4, + }, + shellSummaryLine: { + width: "66%", + height: 11, + }, +}); diff --git a/functions/src/generateAuraSwipeBatch.ts b/functions/src/generateAuraSwipeBatch.ts new file mode 100644 index 0000000..16af55a --- /dev/null +++ b/functions/src/generateAuraSwipeBatch.ts @@ -0,0 +1,268 @@ +import { getApps, initializeApp } from "firebase-admin/app"; +import { getFirestore } from "firebase-admin/firestore"; +import { HttpsError, onCall } from "firebase-functions/v2/https"; +import { logger } from "firebase-functions/v2"; + +import { + MODEL, + clampNumOutfits, + fetchWardrobeItems, + generateOutfitCandidates, + inferRequestedOutfitCount, + normalizeParsedIntent, + safeJsonExtract, + type OutfitIntentV1, + type WardrobeItem, +} from "./shared/outfitEngine"; +import { loadCompactAuraMemoryContext } from "./shared/auraMemory"; + +if (!getApps().length) { + initializeApp(); +} + +type SwipeLookPayload = { + id: string; + position: number; + score: number; + reason: string; + directionLabel: "safe" | "balanced" | "bold" | null; + itemIds: string[]; + look: { + lookTitle: string; + vibe: string; + shortExplanation: string; + stylingNote: string; + personalizationLabel?: string; + personalizationNote?: string; + pieces: Array<{ + role: "top" | "bottom" | "shoes" | "outerwear" | "accessory"; + itemName: string; + source: "closet"; + itemId: string; + imageUrl?: string | null; + }>; + fromCloset: string[]; + addToComplete: string[]; + alternates: string[]; + actions: []; + }; +}; + +type GeneratedSwipeCandidate = ReturnType["outfits"][number]; + +async function parseSwipeIntent( + intentText: string, +): Promise<{ intent: OutfitIntentV1; numOutfits: number | null }> { + const apiKey = process.env.OPENAI_API_KEY; + if (!apiKey) { + return { + intent: normalizeParsedIntent(null, intentText), + numOutfits: inferRequestedOutfitCount(intentText), + }; + } + + try { + const response = await fetch("https://api.openai.com/v1/chat/completions", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ + model: MODEL, + temperature: 0, + response_format: { type: "json_object" }, + messages: [ + { + role: "system", + content: [ + "Extract outfit intent from user text.", + "Return JSON only with keys: occasion, formalityTarget, warmthTarget, needs, niceToHave, colorsWanted, colorsAvoid, avoidLogos, excludeLaundry, numOutfits.", + "No markdown. No prose. No additional keys.", + "occasion enum: casual, smart_casual, formal, gym, date, work, party, travel, unknown.", + "needs defaults to [top,bottom,footwear]. niceToHave may include outerwear and accessory.", + "excludeLaundry defaults true.", + "If the user asks for a count of outfits, set numOutfits to that number. Otherwise set numOutfits to null.", + ].join(" "), + }, + { role: "user", content: intentText }, + ], + }), + }); + + if (!response.ok) { + return { + intent: normalizeParsedIntent(null, intentText), + numOutfits: inferRequestedOutfitCount(intentText), + }; + } + + const data = (await response.json()) as { + choices?: Array<{ message?: { content?: string } }>; + }; + const content = data.choices?.[0]?.message?.content ?? ""; + const parsed = safeJsonExtract & { numOutfits?: number | null }>(content); + return { + intent: normalizeParsedIntent(parsed, intentText), + numOutfits: + parsed?.numOutfits == null ? inferRequestedOutfitCount(intentText) : Number(parsed.numOutfits), + }; + } catch { + return { + intent: normalizeParsedIntent(null, intentText), + numOutfits: inferRequestedOutfitCount(intentText), + }; + } +} + +function cleanString(value: unknown) { + return String(value ?? "").trim(); +} + +function itemLabel(item?: WardrobeItem | null) { + return ( + cleanString(item?.name) || + cleanString(item?.subCategory) || + cleanString(item?.category) || + "Wardrobe piece" + ); +} + +function itemImageUrl(item?: WardrobeItem | null) { + return ( + cleanString(item?.photos?.cleanedPhotoUrl) || + cleanString(item?.photos?.cleanedUrl) || + cleanString(item?.photos?.primaryUrl) || + cleanString(item?.photoUrl) || + cleanString(item?.photos?.thumbUrl) || + null + ); +} + +function buildLookTitle(outfit: GeneratedSwipeCandidate, itemsById: Map, index: number) { + const top = outfit.picks.find((pick) => pick.slot === "top"); + const bottom = outfit.picks.find((pick) => pick.slot === "bottom"); + const topName = itemLabel(top ? itemsById.get(top.itemId) : null); + const bottomName = itemLabel(bottom ? itemsById.get(bottom.itemId) : null); + if (topName && bottomName) { + return `${topName} + ${bottomName}`; + } + return `Aura edit ${index + 1}`; +} + +function buildStylingNote(outfit: GeneratedSwipeCandidate, itemsById: Map) { + const categories = outfit.picks + .map((pick) => itemLabel(itemsById.get(pick.itemId))) + .filter(Boolean) + .slice(0, 3); + return categories.length + ? `Lean into ${categories.join(", ").toLowerCase()} for a clean, wearable finish.` + : "Keep the proportions clean and let the outfit breathe."; +} + +function buildDirectionLabel(index: number, total: number): "safe" | "balanced" | "bold" | null { + if (total < 3) return null; + if (index === 0) return "safe"; + if (index === total - 1) return "bold"; + return "balanced"; +} + +function toSwipeLook( + outfit: GeneratedSwipeCandidate, + itemsById: Map, + index: number, + total: number, + learnedSummary: string | null, +): SwipeLookPayload { + const pieces = outfit.picks.flatMap((pick) => { + const item = itemsById.get(pick.itemId); + if (!item) return []; + return [{ + role: (pick.slot === "footwear" ? "shoes" : pick.slot) as "top" | "bottom" | "shoes" | "outerwear", + itemName: itemLabel(item), + source: "closet" as const, + itemId: pick.itemId, + imageUrl: itemImageUrl(item), + }]; + }); + + const fromCloset = pieces.map((piece) => piece.itemName).filter(Boolean); + const directionLabel = buildDirectionLabel(index, total); + + return { + id: `swipe_${index + 1}`, + position: index, + score: Math.round(outfit.score * 100) / 100, + reason: cleanString(outfit.reason), + directionLabel, + itemIds: outfit.picks.map((pick) => pick.itemId), + look: { + lookTitle: buildLookTitle(outfit, itemsById, index), + vibe: directionLabel ? `${directionLabel} direction` : "wardrobe direction", + shortExplanation: cleanString(outfit.reason) || "AURA built this from your wardrobe.", + stylingNote: buildStylingNote(outfit, itemsById), + personalizationLabel: directionLabel ? directionLabel.toUpperCase() : undefined, + personalizationNote: learnedSummary || undefined, + pieces, + fromCloset, + addToComplete: [], + alternates: [], + actions: [], + }, + }; +} + +export const generateAuraSwipeBatch = onCall( + { secrets: ["OPENAI_API_KEY"] }, + async (request) => { + const uid = request.auth?.uid; + if (!uid) { + throw new HttpsError("unauthenticated", "Authentication required"); + } + + const intentText = cleanString(request.data?.intentText) || + "Build a varied batch of outfit directions from my wardrobe. Keep them polished, wearable, and distinct."; + const parsed = await parseSwipeIntent(intentText); + const requestedNumOutfits = + request.data?.numOutfits ?? parsed.numOutfits ?? inferRequestedOutfitCount(intentText) ?? 8; + const numOutfits = clampNumOutfits(requestedNumOutfits, 8); + + const db = getFirestore(); + const allItems = await fetchWardrobeItems(db, uid); + const memory = await loadCompactAuraMemoryContext(db, uid, null); + const generated = generateOutfitCandidates(allItems, parsed.intent, { + numOutfits, + memory, + }); + + logger.info("generateAuraSwipeBatch built batch", { + uid, + requestedNumOutfits, + numOutfits, + eligibleCount: generated.eligibleCount, + slotCounts: generated.slotCounts, + returned: generated.outfits.length, + fallbackMode: generated.fallbackMode ?? "strict", + }); + + const itemsById = new Map(allItems.map((item) => [item.id, item])); + const lookOptions = generated.outfits.map((outfit, index) => + toSwipeLook(outfit, itemsById, index, generated.outfits.length, memory.learnedProfile?.summaryShort ?? null), + ); + + logger.info("generateAuraSwipeBatch response payload", { + uid, + lookCount: lookOptions.length, + lookTitles: lookOptions.map((entry) => entry.look.lookTitle), + itemCounts: lookOptions.map((entry) => entry.look.pieces.length), + }); + + return { + batchId: `swipe_${Date.now()}`, + intentText, + lookOptions, + primaryLook: lookOptions[0] ?? null, + looks: lookOptions, + }; + }, +); diff --git a/src/lib/auraSwipe.ts b/src/lib/auraSwipe.ts new file mode 100644 index 0000000..06eceaf --- /dev/null +++ b/src/lib/auraSwipe.ts @@ -0,0 +1,232 @@ +import { getFunctions, httpsCallable } from "firebase/functions"; + +import { app } from "@/src/lib/firebase"; +import { getItemImageUrl } from "@/src/lib/itemImage"; +import type { ClothingItem } from "@/src/types/ClothingItem"; +import type { AuraLook } from "@/src/types/aura"; + +const DEBUG_AURA_SWIPE = + __DEV__ && process.env.EXPO_PUBLIC_AURA_DEBUG === "1"; + +export type AuraSwipeDirectionLabel = "left" | "right" | "up"; +export type AuraSwipeFeedbackType = + | "outfit_liked" + | "outfit_disliked" + | "outfit_favorited" + | "outfit_skipped"; + +export type AuraSwipeBatchLook = { + id: string; + position: number; + score: number; + reason: string; + directionLabel: "safe" | "balanced" | "bold" | null; + itemIds: string[]; + look: AuraLook; +}; + +type GenerateAuraSwipeBatchArgs = { + intentText?: string; + numOutfits?: number; +}; + +type OutfitResult = { + id?: string; + picks?: { slot: "top" | "bottom" | "footwear" | "outerwear"; itemId: string }[]; + score?: number; + reason?: string; +}; + +type SwipeBackendResponse = { + batchId?: string; + intentText?: string; + lookOptions?: AuraSwipeBatchLook[]; + looks?: AuraSwipeBatchLook[]; + primaryLook?: AuraSwipeBatchLook | AuraLook | null; + outfits?: OutfitResult[]; +}; + +type GenerateAuraSwipeBatchResponse = { + batchId: string; + intentText: string; + lookOptions: AuraSwipeBatchLook[]; + primaryLook: AuraSwipeBatchLook | null; +}; + +function cleanString(value: unknown) { + return String(value ?? "").trim(); +} + +function buildDirectionLabel(index: number, total: number): "safe" | "balanced" | "bold" | null { + if (total < 3) return null; + if (index === 0) return "safe"; + if (index === total - 1) return "bold"; + return "balanced"; +} + +function itemLabel(item?: ClothingItem | null) { + return ( + cleanString(item?.name) || + cleanString(item?.subCategory) || + cleanString(item?.category) || + "Wardrobe piece" + ); +} + +function buildLookFromOutfitResult( + outfit: OutfitResult, + itemsById: Map, + index: number, + total: number, +): AuraSwipeBatchLook { + const pieces = (outfit.picks ?? []).flatMap((pick) => { + const item = itemsById.get(pick.itemId); + if (!item) return []; + return [{ + role: (pick.slot === "footwear" ? "shoes" : pick.slot) as "top" | "bottom" | "shoes" | "outerwear", + itemName: itemLabel(item), + source: "closet" as const, + itemId: pick.itemId, + imageUrl: getItemImageUrl(item, { variant: "hero" }) ?? getItemImageUrl(item, { variant: "thumb" }) ?? null, + }]; + }); + const outerwearPiece = pieces.find((piece) => piece.role === "outerwear"); + const topPiece = pieces.find((piece) => piece.role === "top"); + const secondaryPiece = pieces.find( + (piece) => piece.role !== "outerwear" && piece.role !== "top", + ); + const directionLabel = buildDirectionLabel(index, total); + return { + id: cleanString(outfit.id) || `swipe_${index + 1}`, + position: index, + score: typeof outfit.score === "number" ? outfit.score : 0, + reason: cleanString(outfit.reason), + directionLabel, + itemIds: pieces.map((piece) => piece.itemId), + look: { + lookTitle: + outerwearPiece && topPiece + ? `${outerwearPiece.itemName} + ${topPiece.itemName}` + : topPiece && secondaryPiece + ? `${topPiece.itemName} + ${secondaryPiece.itemName}` + : pieces.length >= 2 + ? `${pieces[0].itemName} + ${pieces[1].itemName}` + : `Aura edit ${index + 1}`, + vibe: directionLabel ? `${directionLabel} direction` : "wardrobe direction", + shortExplanation: cleanString(outfit.reason) || "AURA built this from your wardrobe.", + stylingNote: + pieces.length > 0 + ? `Lean into ${pieces.slice(0, 3).map((piece) => piece.itemName.toLowerCase()).join(", ")} for a clean, wearable finish.` + : "Keep the proportions clean and let the outfit breathe.", + personalizationLabel: directionLabel ? directionLabel.toUpperCase() : undefined, + personalizationNote: undefined, + pieces, + fromCloset: pieces.map((piece) => piece.itemName), + addToComplete: [], + alternates: [], + actions: [], + }, + }; +} + +function normalizeLookOptions( + response: SwipeBackendResponse, + itemsById: Map, +): AuraSwipeBatchLook[] { + if (Array.isArray(response.lookOptions) && response.lookOptions.length > 0) { + return response.lookOptions; + } + if (Array.isArray(response.looks) && response.looks.length > 0) { + return response.looks; + } + if (response.primaryLook && "look" in response.primaryLook) { + return [response.primaryLook as AuraSwipeBatchLook]; + } + if (Array.isArray(response.outfits) && response.outfits.length > 0) { + return response.outfits.map((outfit, index, list) => + buildLookFromOutfitResult(outfit, itemsById, index, list.length), + ); + } + return []; +} + +async function callGenerateAuraSwipeBatch(args: GenerateAuraSwipeBatchArgs) { + const functions = getFunctions(app); + const callable = httpsCallable( + functions, + "generateAuraSwipeBatch", + ); + return callable(args); +} + +async function callGenerateOutfitsV1(args: GenerateAuraSwipeBatchArgs) { + const functions = getFunctions(app); + const callable = httpsCallable( + functions, + "generateOutfitsV1", + ); + return callable(args); +} + +export async function generateAuraSwipeBatch( + args?: GenerateAuraSwipeBatchArgs & { items?: ClothingItem[] }, +): Promise { + const request = { + intentText: + args?.intentText ?? + "Build a varied batch of outfit directions from my wardrobe. Keep them polished, wearable, and distinct.", + numOutfits: args?.numOutfits ?? 8, + }; + const itemsById = new Map((args?.items ?? []).map((item) => [item.id, item])); + + try { + const result = await callGenerateAuraSwipeBatch(request); + if (DEBUG_AURA_SWIPE) { + console.log("[AURA_SWIPE]", "callable generateAuraSwipeBatch response", result.data); + } + const lookOptions = normalizeLookOptions(result.data ?? {}, itemsById); + if (lookOptions.length > 0) { + return { + batchId: cleanString(result.data?.batchId) || `swipe_${Date.now()}`, + intentText: cleanString(result.data?.intentText) || request.intentText, + lookOptions, + primaryLook: lookOptions[0] ?? null, + }; + } + if (DEBUG_AURA_SWIPE) { + console.log("[AURA_SWIPE]", "generateAuraSwipeBatch returned empty lookOptions", result.data); + } + } catch (error) { + const code = cleanString((error as { code?: unknown })?.code); + if (code.includes("not-found")) { + console.log("[AURA_SWIPE] generateAuraSwipeBatch not deployed; using generateOutfitsV1 fallback"); + } else { + console.log("[AURA_SWIPE] generateAuraSwipeBatch failed; using fallback"); + } + if (code && !code.includes("not-found")) { + throw error instanceof Error ? error : new Error(String(error)); + } + } + + const fallback = await callGenerateOutfitsV1(request); + if (DEBUG_AURA_SWIPE) { + console.log("[AURA_SWIPE]", "fallback generateOutfitsV1 response", fallback.data); + } + const lookOptions = normalizeLookOptions(fallback.data ?? {}, itemsById); + if (lookOptions.length === 0) { + console.log("[AURA_SWIPE] no lookOptions after fallback"); + throw new Error("Unable to load swipe looks – empty lookOptions"); + } + return { + batchId: cleanString(fallback.data?.batchId) || `swipe_${Date.now()}`, + intentText: cleanString(fallback.data?.intentText) || request.intentText, + lookOptions, + primaryLook: lookOptions[0] ?? null, + }; +} + +export function feedbackTypeForSwipe(direction: AuraSwipeDirectionLabel): AuraSwipeFeedbackType { + if (direction === "left") return "outfit_disliked"; + if (direction === "up") return "outfit_favorited"; + return "outfit_liked"; +} From 74045f27a2b86fe0ad9742964ec9927d28206227 Mon Sep 17 00:00:00 2001 From: Athfan Date: Mon, 27 Apr 2026 02:07:14 -0500 Subject: [PATCH 13/93] feat: upgrade AURA backend, memory integration, and outfit generation --- functions/src/askAura.ts | 881 +++++++++++- functions/src/askAuraStream.ts | 1327 +++++++++++++++++- functions/src/generateOutfitsV1.ts | 129 +- functions/src/index.ts | 3 + functions/src/outfitChatV1.ts | 5 +- functions/src/shared/auraCandidatePreview.ts | 560 ++++++++ functions/src/shared/auraLinkIntent.ts | 49 + functions/src/shared/auraMemory.ts | 89 ++ functions/src/shared/auraPrompt.ts | 53 +- functions/src/shared/buildAuraContext.ts | 68 +- functions/src/shared/detectWardrobeGaps.ts | 140 ++ functions/src/shared/outfitEngine.ts | 572 ++++++-- functions/src/shared/productLinkExtractor.ts | 1219 ++++++++++++++++ functions/src/shared/productUrlMetadata.ts | 404 ++++++ 14 files changed, 5333 insertions(+), 166 deletions(-) create mode 100644 functions/src/shared/auraCandidatePreview.ts create mode 100644 functions/src/shared/auraLinkIntent.ts create mode 100644 functions/src/shared/auraMemory.ts create mode 100644 functions/src/shared/detectWardrobeGaps.ts create mode 100644 functions/src/shared/productLinkExtractor.ts create mode 100644 functions/src/shared/productUrlMetadata.ts diff --git a/functions/src/askAura.ts b/functions/src/askAura.ts index 91f5197..1c58003 100644 --- a/functions/src/askAura.ts +++ b/functions/src/askAura.ts @@ -4,13 +4,30 @@ import OpenAI from "openai"; import { getFirestore } from "firebase-admin/firestore"; import { AURA_INSTRUCTIONS } from "./shared/auraPrompt"; +import { + candidatePreviewResponse, + candidatesFromProductExtractions, + extractImageCandidates, + fallbackImageCandidates, + type AuraCandidateItem, +} from "./shared/auraCandidatePreview"; +import { classifyAuraLinkIntent, extractUrlsFromText } from "./shared/auraLinkIntent"; import { buildAuraContext } from "./shared/buildAuraContext"; +import { loadCompactAuraMemoryContext } from "./shared/auraMemory"; +import { type WardrobeGapSuggestion } from "./shared/detectWardrobeGaps"; import { loadAuraUserProfile } from "./shared/loadAuraUserProfile"; +import { + ProductLinkError, + extractProductFromUrl, +} from "./shared/productLinkExtractor"; const db = getFirestore(); +const AURA_BACKEND_VERSION = "candidate-preview-url-v9-zara-product-api"; +const DEBUG_AURA_SPARSE = + process.env.FUNCTIONS_EMULATOR === "true" || process.env.NODE_ENV !== "production"; type AuraResponse = { - presentation: "chat" | "card"; + presentation: "chat" | "card" | "candidate_preview"; title: string; reply: string; reason: string; @@ -18,12 +35,20 @@ type AuraResponse = { ownedPieces: string[]; recommendedAdditions: string[]; swapSuggestion: string; + missingPieces?: string[]; + upgradeSuggestions?: string[]; + upgradeSuggestionItems?: { + label: string; + searchQuery?: string; + }[]; chips: string[]; look: { lookTitle: string; vibe: string; shortExplanation: string; stylingNote: string; + personalizationLabel?: string; + personalizationNote?: string; pieces: { role: "top" | "bottom" | "shoes" | "outerwear" | "accessory"; itemName: string; @@ -35,11 +60,46 @@ type AuraResponse = { addToComplete: string[]; alternates: string[]; actions: ( - "saveLook" | "planForToday" | "showMoreLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" + "saveLook" | "planForToday" | "likeLook" | "notMyVibe" | "showMoreLikeThis" | "lessLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" )[]; } | null; + lookOptions?: { + lookTitle: string; + vibe: string; + shortExplanation: string; + stylingNote: string; + personalizationLabel?: string; + personalizationNote?: string; + pieces: { + role: "top" | "bottom" | "shoes" | "outerwear" | "accessory"; + itemName: string; + source: "closet" | "suggested"; + itemId: string | null; + imageUrl: string | null; + }[]; + fromCloset: string[]; + addToComplete: string[]; + alternates: string[]; + actions: ( + "saveLook" | "planForToday" | "likeLook" | "notMyVibe" | "showMoreLikeThis" | "lessLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" + )[]; + }[]; + candidates?: AuraCandidateItem[]; + candidateItems?: AuraCandidateItem[]; +}; + +type AuraAttachment = { + type?: "image" | "audio"; + uri?: string; + role?: string | null; + groupId?: string | null; + transcript?: string | null; }; +const ADD_IMAGE_RE = + /\b(add|save|store|put|upload|log)\b[\s\S]{0,80}\b(closet|wardrobe|item|items|these|this|all)\b|\b(add|save)\s+(this|these|all|item|items)\b/i; +const BATCH_IMAGE_RE = /\b(these|all|each|separate|multiple|items)\b/i; + function fallbackAuraResponse(raw: string): AuraResponse { return { presentation: "chat", @@ -50,11 +110,84 @@ function fallbackAuraResponse(raw: string): AuraResponse { ownedPieces: [], recommendedAdditions: [], swapSuggestion: "", + missingPieces: [], + upgradeSuggestions: [], + upgradeSuggestionItems: [], chips: [], look: null, + lookOptions: [], }; } +function uniqueTrimmed(values: string[] | undefined, max = 3) { + return Array.from( + new Set( + (values ?? []) + .map((value) => String(value ?? "").trim()) + .filter(Boolean) + ) + ).slice(0, max); +} + +function normalizeSuggestionItems( + items: AuraResponse["upgradeSuggestionItems"] | undefined, + fallbackSuggestions: string[], + contextSuggestions: WardrobeGapSuggestion[] +) { + const entries: [string, { label: string; searchQuery?: string }][] = []; + for (const item of items ?? []) { + const label = String(item?.label ?? "").trim(); + if (!label) continue; + const searchQuery = String(item?.searchQuery ?? "").trim(); + entries.push([label.toLowerCase(), { label, searchQuery: searchQuery || undefined }]); + } + const normalizedItems = Array.from(new Map(entries).values()); + + if (normalizedItems.length) return normalizedItems.slice(0, 3); + + return fallbackSuggestions + .map((label) => { + const match = contextSuggestions.find( + (suggestion) => suggestion.label.toLowerCase() === label.toLowerCase() + ); + return { + label, + searchQuery: match?.searchQuery, + }; + }) + .filter((item) => item.label) + .slice(0, 3); +} + +const MULTI_LOOK_REQUEST_RE = + /\b((?:2|3|4|two|three|four)\s+(?:outfits?|looks?|options?|directions?)|multiple\s+(?:outfits?|looks?|options?|directions?)|safe,\s*balanced,\s*(?:and\s*)?bold|safe\s+balanced\s+bold|different\s+directions|few\s+outfits?)\b/i; + +function parseRequestedLookCount(message: string) { + const text = String(message ?? "").toLowerCase(); + if (/\b(4|four)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 4; + if (/\b(3|three)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 3; + if (/\b(2|two)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 2; + if (/\bsafe,\s*balanced,\s*(?:and\s*)?bold\b|\bsafe\s+balanced\s+bold\b/.test(text)) return 3; + if (/\bmultiple\s+(?:outfits?|looks?|options?|directions?)\b|\bdifferent\s+directions\b|\bfew\s+outfits?\b/.test(text)) return 3; + return 1; +} + +function wantsMultipleLooks(message: string) { + return MULTI_LOOK_REQUEST_RE.test(String(message ?? "")); +} + +function buildMultiLookRequestNote(userMessage: string) { + if (!wantsMultipleLooks(userMessage)) return ""; + const count = Math.min(3, Math.max(2, parseRequestedLookCount(userMessage))); + return ( + "\n\nMulti-look requirement:\n" + + "The user is explicitly asking for multiple outfit options.\n" + + `Return presentation "card" and provide ${count} structured looks in lookOptions whenever you can do so safely.\n` + + "Do not answer this with only prose, outfitItems, ownedPieces, or recommendedAdditions if structured looks are possible.\n" + + "If only one structured look is possible, still return that one structured look and leave a concise reply." + ); +} + function shortenLookReply(text: string) { const trimmed = String(text ?? "").trim(); if (!trimmed) return trimmed; @@ -64,36 +197,257 @@ function shortenLookReply(text: string) { return `${trimmed.slice(0, 117).trimEnd()}...`; } +function uniqueActions(actions: string[]) { + return Array.from(new Set(actions.filter(Boolean))); +} + +const PERSONALIZATION_BLOCKLIST = [ + /stored preferences?/i, + /profile data/i, + /learned memory/i, + /memory suggests/i, + /your profile says/i, + /\bdata suggests\b/i, +]; + +function cleanPersonalizationText(text: string, maxLength: number) { + const trimmed = String(text ?? "") + .replace(/\s+/g, " ") + .replace(/^["'`\-–—\s]+|["'`\-–—\s]+$/g, "") + .trim(); + if (!trimmed) return ""; + if (PERSONALIZATION_BLOCKLIST.some((pattern) => pattern.test(trimmed))) { + return ""; + } + if (trimmed.length <= maxLength) return trimmed; + return `${trimmed.slice(0, maxLength - 3).trimEnd()}...`; +} + +function fallbackPersonalization( + auraContext?: { + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + favoriteColors?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; + } +) { + const explicit = auraContext?.preferenceContext?.explicitProfile; + const learned = auraContext?.preferenceContext?.learnedProfile; + const session = auraContext?.preferenceContext?.session; + const learnedConfidence = learned?.confidence ?? 0; + + if (session?.currentOccasion && session?.vibeForThisSession) { + return { + label: `Right for ${session.currentOccasion}`, + note: `It keeps the ${session.vibeForThisSession} tone, but still feels polished enough for ${session.currentOccasion}.`, + }; + } + + if (session?.vibeForThisSession) { + return { + label: `Set to ${session.vibeForThisSession}`, + note: `This keeps the mood pointed toward ${session.vibeForThisSession} without losing polish.`, + }; + } + if (session?.currentOccasion) { + return { + label: `Built for ${session.currentOccasion}`, + note: `It is shaped around ${session.currentOccasion} first, so it feels right for the moment instead of generic.`, + }; + } + if (explicit?.styleVibes?.length && explicit?.favoriteColors?.length) { + const vibe = explicit.styleVibes[0]; + const color = explicit.favoriteColors[0]; + if (explicit.experimentationLevel === "high") { + return { + label: "A touch bolder", + note: `It still sits inside your ${vibe} lane, just with a slightly bolder ${color}-leaning twist.`, + }; + } + return { + label: `Feels like your ${vibe} side`, + note: `It stays close to your ${vibe} direction and keeps the palette near shades that already feel easy on you.`, + }; + } + if (explicit?.preferredFits?.length) { + const fit = explicit.preferredFits[0]; + return { + label: `Leans ${fit} in fit`, + note: `The proportions stay closer to your natural ${fit} fit.`, + }; + } + if (explicit?.styleVibes?.length) { + const vibe = explicit.styleVibes[0]; + if (explicit.experimentationLevel === "high") { + return { + label: "A little bolder than usual", + note: `It still sits inside your ${vibe} lane, just with a more adventurous edge.`, + }; + } + if (explicit.experimentationLevel === "low") { + return { + label: "Closer to your usual lane", + note: `This keeps things grounded in your usual ${vibe} direction.`, + }; + } + return { + label: `Works for your ${vibe} style`, + note: `It stays close to the ${vibe} direction that already feels natural on you.`, + }; + } + if (learnedConfidence >= 0.62 && learned?.inferredFavoriteColors?.length) { + return { + label: "Closer to your usual palette", + note: "The palette stays near the colors you seem to keep coming back to, so it still feels familiar in a good way.", + }; + } + if (learnedConfidence >= 0.62 && learned?.inferredFits?.length) { + return { + label: `Feels more ${learned.inferredFits[0]}`, + note: "The proportions stay near the shapes you seem to respond to best.", + }; + } + if (learnedConfidence >= 0.42 && learned?.inferredFavoriteColors?.length) { + return { + label: "Still feels like you", + note: "This keeps the palette in a range that already seems easy for you to wear.", + }; + } + return {label: "", note: ""}; +} + +function normalizeLookSurface( + look: NonNullable, + auraContext?: { + wardrobe?: { + footwear?: Record[]; + }; + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + favoriteColors?: string[]; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; + } +) { + if (look.stylingNote) { + look.stylingNote = shortenLookReply(look.stylingNote); + } + + const ownedPieces = look.pieces + .filter((piece) => piece.source === "closet") + .map((piece) => piece.itemName) + .filter(Boolean); + const suggestedPieces = look.pieces + .filter((piece) => piece.source === "suggested") + .map((piece) => piece.itemName) + .filter(Boolean); + + look.fromCloset = Array.from(new Set(ownedPieces)); + look.addToComplete = Array.from( + new Set(suggestedPieces.filter((piece) => !look.fromCloset.includes(piece))) + ); + look.actions = uniqueActions([ + ...(look.actions ?? []), + "likeLook", + "notMyVibe", + "showMoreLikeThis", + "lessLikeThis", + "useOnlyMyCloset", + "makeItDressier", + "shopMissingPieces", + ]) as NonNullable["actions"]; + + const personalization = fallbackPersonalization(auraContext); + look.personalizationLabel = + cleanPersonalizationText(String(look.personalizationLabel ?? ""), 38) || + personalization.label; + look.personalizationNote = + cleanPersonalizationText(String(look.personalizationNote ?? ""), 150) || + personalization.note; + + return { + ownedPieces: look.fromCloset, + recommendedAdditions: look.addToComplete, + }; +} + function normalizeAuraResponse( response: AuraResponse, + userMessage?: string, auraContext?: { wardrobe?: { footwear?: Record[]; }; + categoryCounts?: { + tops: number; + bottoms: number; + footwear: number; + outerwear: number; + accessories: number; + }; + isSparseWardrobe?: boolean; + wardrobeGaps?: { + missingCore?: { label: string }[]; + weakAreas?: { label: string }[]; + suggestions?: WardrobeGapSuggestion[]; + }; + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; } ) { - if (response.look) { + const multiRequested = wantsMultipleLooks(userMessage ?? ""); + if (response.lookOptions?.length) { + response.lookOptions = response.lookOptions.slice(0, 3); + } + + if (response.look || response.lookOptions?.length) { response.reply = shortenLookReply(response.reply); response.reason = ""; - if (response.look.stylingNote) { - response.look.stylingNote = shortenLookReply(response.look.stylingNote); - } + } - const ownedPieces = response.look.pieces - .filter((piece) => piece.source === "closet") - .map((piece) => piece.itemName) - .filter(Boolean); - const suggestedPieces = response.look.pieces - .filter((piece) => piece.source === "suggested") - .map((piece) => piece.itemName) - .filter(Boolean); - - response.ownedPieces = Array.from(new Set(ownedPieces)); - response.recommendedAdditions = Array.from( - new Set(suggestedPieces.filter((piece) => !response.ownedPieces.includes(piece))) - ); - response.look.fromCloset = response.ownedPieces; - response.look.addToComplete = response.recommendedAdditions; + if (response.look) { + const normalized = normalizeLookSurface(response.look, auraContext); + response.ownedPieces = normalized.ownedPieces; + response.recommendedAdditions = normalized.recommendedAdditions; const eligibleFootwear = auraContext?.wardrobe?.footwear ?? []; const selectedOwnedFootwear = response.look.pieces.filter( @@ -111,18 +465,245 @@ function normalizeAuraResponse( }); } } + + if (!response.look && response.lookOptions?.length) { + response.look = response.lookOptions[0]; + } + if (response.lookOptions?.length) { + response.lookOptions = response.lookOptions.map((look) => { + normalizeLookSurface(look, auraContext); + return look; + }); + } + if (multiRequested && !response.lookOptions?.length && response.look) { + logger.warn("[AURA_MULTI] multi-look request returned only one structured look", { + requestedCount: parseRequestedLookCount(userMessage ?? ""), + lookTitle: response.look.lookTitle, + }); + response.lookOptions = [response.look]; + } + if (multiRequested && !response.look && !response.lookOptions?.length) { + logger.warn("[AURA_MULTI] multi-look request returned no structured looks", { + requestedCount: parseRequestedLookCount(userMessage ?? ""), + title: response.title, + reply: response.reply, + ownedPiecesCount: response.ownedPieces?.length ?? 0, + recommendedAdditionsCount: response.recommendedAdditions?.length ?? 0, + outfitItemsCount: response.outfitItems?.length ?? 0, + }); + } + + const gapContext = auraContext?.wardrobeGaps; + const derivedMissing = uniqueTrimmed([ + ...(response.missingPieces ?? []), + ...(auraContext?.isSparseWardrobe + ? [ + ...(gapContext?.missingCore?.map((gap) => gap.label) ?? []), + ...(gapContext?.weakAreas?.slice(0, 1).map((gap) => gap.label) ?? []), + ] + : gapContext?.missingCore?.map((gap) => gap.label) ?? []), + ]); + const derivedSuggestions = uniqueTrimmed([ + ...(response.upgradeSuggestions ?? []), + ...((gapContext?.suggestions ?? []).map((suggestion) => suggestion.label) ?? []), + ]); + + const maxSuggestionCount = auraContext?.isSparseWardrobe ? 3 : 2; + response.missingPieces = derivedMissing.slice(0, maxSuggestionCount); + response.upgradeSuggestions = derivedSuggestions + .filter((suggestion) => !response.missingPieces?.includes(suggestion)) + .slice(0, maxSuggestionCount); + response.upgradeSuggestionItems = normalizeSuggestionItems( + response.upgradeSuggestionItems, + response.upgradeSuggestions, + gapContext?.suggestions ?? [] + ).filter((item) => !response.missingPieces?.includes(item.label)); + + if (!auraContext?.isSparseWardrobe && !(gapContext?.missingCore?.length ?? 0)) { + response.missingPieces = response.missingPieces?.slice(0, 1) ?? []; + response.upgradeSuggestions = response.upgradeSuggestions?.slice(0, 1) ?? []; + response.upgradeSuggestionItems = response.upgradeSuggestionItems?.slice(0, 1) ?? []; + } + + if (DEBUG_AURA_SPARSE) { + logger.info("[AURA_SPARSE_NORMALIZED]", { + isSparseWardrobe: auraContext?.isSparseWardrobe ?? false, + categoryCounts: auraContext?.categoryCounts ?? null, + detectedGaps: { + missingCore: gapContext?.missingCore?.map((gap) => gap.label) ?? [], + weakAreas: gapContext?.weakAreas?.map((gap) => gap.label) ?? [], + }, + missingPieces: response.missingPieces ?? [], + upgradeSuggestions: response.upgradeSuggestions ?? [], + upgradeSuggestionItems: response.upgradeSuggestionItems ?? [], + }); + } + return response; } +function parseAuraAttachments(input: unknown): AuraAttachment[] { + if (!Array.isArray(input)) return []; + return input.reduce((out, entry) => { + if (!entry || typeof entry !== "object") return out; + const candidate = entry as Record; + const type = candidate.type === "audio" ? "audio" : candidate.type === "image" ? "image" : null; + const uri = String(candidate.uri ?? "").trim(); + if (!type || !uri) return out; + out.push({ + type, + uri, + role: typeof candidate.role === "string" ? candidate.role : null, + groupId: typeof candidate.groupId === "string" ? candidate.groupId : null, + transcript: typeof candidate.transcript === "string" ? candidate.transcript : null, + }); + return out; + }, []) + .slice(0, 8); +} + +function attachmentContextText(attachments: AuraAttachment[]) { + if (!attachments.length) return "No attachments."; + return JSON.stringify( + attachments.map((attachment, index) => ({ + index, + type: attachment.type, + role: attachment.role ?? null, + groupId: attachment.groupId ?? null, + transcript: attachment.transcript ?? null, + uri: attachment.uri, + })), + null, + 2 + ); +} + +function safeUrlHost(uri: string | undefined) { + if (!uri) return null; + try { + return new URL(uri).host; + } catch { + return null; + } +} + +function auraLinkErrorMessage(error: unknown) { + if (error instanceof ProductLinkError) { + if (error.code === "invalid_url") return "That product link does not look valid."; + if (error.code === "unsafe_url") return "I cannot fetch that kind of link."; + if (error.code === "fetch_failed") { + return "I couldn't read that product link. Try another link or upload a photo."; + } + if (error.code === "no_metadata") { + return "I couldn't find product details on that page. Try another link or upload a photo."; + } + if (error.code === "no_images") { + return "I couldn't find usable product images on that page. Try another link or upload a photo."; + } + if (error.code === "draft_failed") { + return "I found the product, but couldn't create a wardrobe draft."; + } + } + return "I couldn't read that product link. Try another link or upload a photo."; +} + +function productContextText( + products: Awaited>[], +) { + return JSON.stringify( + products.map((product) => ({ + metadata: product.metadata, + imageUrls: product.imageUrls.slice(0, 4), + })), + null, + 2, + ); +} + +type ClientAuraIntent = + | "add_item" + | "add_items_batch" + | "add_from_link" + | "add_from_links_batch" + | string + | null; + +function imageGroupsForAddIntent( + text: string, + attachments: AuraAttachment[], + clientIntent?: ClientAuraIntent, +) { + const images = attachments.filter( + (attachment): attachment is AuraAttachment & { uri: string } => + attachment.type === "image" && !!attachment.uri, + ); + const forceAdd = + clientIntent === "add_item" || clientIntent === "add_items_batch"; + if (!images.length || (!forceAdd && !ADD_IMAGE_RE.test(text))) return []; + const shouldSplit = + images.length > 1 && + (clientIntent === "add_items_batch" || + images[0]?.role === "separate_items" || + BATCH_IMAGE_RE.test(text)); + return shouldSplit ? images.map((image) => [image.uri]) : [images.map((image) => image.uri)]; +} + +function logCallableCandidatePayload( + uid: string, + source: "image" | "link", + data: ReturnType, +) { + const payload = { ok: true, data }; + const serialized = JSON.stringify(payload); + logger.info("[AURA_CANDIDATE_BACKEND] callable final candidate payload", { + uid, + source, + dataKeys: Object.keys(data), + payloadKeys: Object.keys(payload), + candidateItemsCount: data.candidateItems.length, + candidatesCount: data.candidates.length, + presentation: data.presentation, + serializedLength: serialized.length, + serializedPreview: serialized.slice(0, 1200), + }); +} + export const askAura = onCall( { secrets: ["OPENAI_API_KEY"] }, async (request) => { + logger.info("[AURA_BACKEND_VERSION] askAura callable entry", { + version: AURA_BACKEND_VERSION, + requestKeys: Object.keys(request.data ?? {}), + prompt: typeof request.data?.message === "string" ? request.data.message : null, + attachmentCount: Array.isArray(request.data?.attachments) ? request.data.attachments.length : 0, + clientIntent: typeof request.data?.clientIntent === "string" ? request.data.clientIntent : null, + }); const uid = request.auth?.uid; if (!uid) { throw new HttpsError("unauthenticated", "User must be signed in."); } const userMessage = String(request.data?.message || "").trim(); + const attachments = parseAuraAttachments(request.data?.attachments); + const clientIntent = typeof request.data?.clientIntent === "string" ? request.data.clientIntent : null; + const linkIntent = classifyAuraLinkIntent(userMessage); + const detectedUrls = extractUrlsFromText(userMessage); + logger.info("[AURA_SEND] callable request received", { + uid, + hasMessage: !!userMessage, + linkIntent, + clientIntent, + detectedUrlCount: detectedUrls.length, + detectedDomains: detectedUrls.map((entry) => safeUrlHost(entry.normalized)), + attachmentCount: attachments.length, + attachments: attachments.map((attachment) => ({ + type: attachment.type, + role: attachment.role ?? null, + groupId: attachment.groupId ?? null, + hasUri: !!attachment.uri, + uriHost: safeUrlHost(attachment.uri), + })), + }); const history = Array.isArray(request.data?.history) ? request.data.history .map((entry: unknown) => { @@ -142,8 +723,106 @@ export const askAura = onCall( const selectedDate = request.data?.selectedDate || null; const occasion = request.data?.occasion || null; - if (!userMessage) { - throw new HttpsError("invalid-argument", "Message is required."); + if (!userMessage && attachments.length === 0) { + throw new HttpsError("invalid-argument", "Message or attachment is required."); + } + + const client = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + }); + const imageCandidateGroups = imageGroupsForAddIntent(userMessage, attachments, clientIntent); + + if (imageCandidateGroups.length > 0) { + logger.info("[AURA_CANDIDATE] image add intent classified", { + uid, + candidateCount: imageCandidateGroups.length, + }); + try { + let candidates = await extractImageCandidates({ + client, + imageGroups: imageCandidateGroups, + }); + if (!candidates.length) { + logger.warn("[AURA_CANDIDATE_BACKEND] callable image extraction returned no candidates; using fallback", { + uid, + groupCount: imageCandidateGroups.length, + }); + candidates = fallbackImageCandidates(imageCandidateGroups); + } + logger.info("[AURA_CANDIDATE] callable image preview response", { + uid, + candidateCount: candidates.length, + candidateIds: candidates.map((candidate) => candidate.candidateId), + }); + const data = candidatePreviewResponse(candidates); + logger.info("[AURA_CANDIDATE_BACKEND] callable raw image candidate object", { + uid, + keys: Object.keys(data), + candidateItems: data.candidateItems, + }); + logCallableCandidatePayload(uid, "image", data); + return { + ok: true, + data, + }; + } catch (error) { + logger.error("[AURA_LINK_ERROR] image candidate extraction failed", { + uid, + error, + }); + return { + ok: true, + data: fallbackAuraResponse("I couldn't read that item photo. Try another photo or add it manually."), + }; + } + } + + if ( + linkIntent === "add_from_link" || + linkIntent === "add_from_links_batch" || + clientIntent === "add_from_link" || + clientIntent === "add_from_links_batch" + ) { + if (!detectedUrls.length) { + throw new HttpsError("invalid-argument", "A product link is required."); + } + logger.info("[AURA_LINK] add intent classified", { + uid, + linkIntent, + urlCount: detectedUrls.length, + }); + try { + const extractions = []; + for (const detectedUrl of detectedUrls.slice(0, 5)) { + extractions.push(await extractProductFromUrl(detectedUrl.normalized)); + } + logger.info("[AURA_CANDIDATE] callable link preview response", { + uid, + candidateCount: extractions.length, + domains: extractions.map((extraction) => extraction.metadata.domain), + }); + const data = candidatePreviewResponse(candidatesFromProductExtractions(extractions)); + logger.info("[AURA_CANDIDATE_BACKEND] callable raw link candidate object", { + uid, + keys: Object.keys(data), + candidateItems: data.candidateItems, + }); + logCallableCandidatePayload(uid, "link", data); + return { + ok: true, + data, + }; + } catch (error) { + logger.error("[AURA_LINK_ERROR] add from link failed", { + uid, + linkIntent, + error, + }); + return { + ok: true, + data: fallbackAuraResponse(auraLinkErrorMessage(error)), + }; + } } const itemsSnap = await db.collection("users").doc(uid).collection("items").get(); @@ -152,23 +831,49 @@ export const askAura = onCall( ...doc.data(), })) as (Record & { id: string })[]; + const auraMemory = await loadCompactAuraMemoryContext( + db, + uid, + typeof request.data?.chatId === "string" ? request.data.chatId : null + ); const auraContext = buildAuraContext({ items, weather: request.data?.weather || null, occasion, selectedDate, + memory: auraMemory, }); logger.info("AURA closet context", { counts: auraContext.counts, + isSparseWardrobe: auraContext.isSparseWardrobe, + categoryCounts: auraContext.categoryCounts, + detectedGaps: auraContext.wardrobeGaps, footwearAvailable: auraContext.wardrobeDebug?.footwearAvailable ?? [], excludedFootwear: auraContext.wardrobeDebug?.excludedFootwear ?? [], }); const userProfile = await loadAuraUserProfile(uid); + let linkProductContext = "No product links."; + if (linkIntent === "analyze_link" && detectedUrls.length > 0) { + logger.info("[AURA_LINK] analyze intent classified", { + uid, + urlCount: detectedUrls.length, + }); + try { + const products = []; + for (const detectedUrl of detectedUrls.slice(0, 3)) { + products.push(await extractProductFromUrl(detectedUrl.normalized)); + } + linkProductContext = productContextText(products); + } catch (error) { + logger.error("[AURA_LINK_ERROR] analyze link extraction failed", { + uid, + error, + }); + linkProductContext = auraLinkErrorMessage(error); + } + } try { - const client = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, - }); const response = await client.responses.create({ model: "gpt-5.4", input: [ @@ -184,9 +889,20 @@ export const askAura = onCall( text: `User profile:\n${JSON.stringify(userProfile, null, 2)}\n\n` + `Aura context:\n${JSON.stringify(auraContext, null, 2)}\n\n` + + `Stylist brief:\n${auraContext.stylistBrief || "Personalize lightly."}\n\n` + `Recent conversation:\n${JSON.stringify(history, null, 2)}\n\n` + - `User request:\n${userMessage}`, + `Product link context:\n${linkProductContext}\n\n` + + `Attachments:\n${attachmentContextText(attachments)}\n\n` + + `User request:\n${userMessage}` + + buildMultiLookRequestNote(userMessage), }, + ...attachments + .filter((attachment) => attachment.type === "image") + .map((attachment) => ({ + type: "input_image" as const, + image_url: attachment.uri ?? "", + detail: "auto" as const, + })), ], }, ], @@ -234,6 +950,29 @@ export const askAura = onCall( type: "string", description: "One short direct swap suggestion. Leave empty if not needed.", }, + missingPieces: { + type: "array", + description: "Short labels for missing or thin wardrobe areas.", + items: { type: "string" }, + }, + upgradeSuggestions: { + type: "array", + description: "Short, human-readable upgrade ideas for improving future outfits.", + items: { type: "string" }, + }, + upgradeSuggestionItems: { + type: "array", + description: "Optional structured suggestion metadata for future shopping hooks.", + items: { + type: "object", + additionalProperties: false, + properties: { + label: { type: "string" }, + searchQuery: { type: "string" }, + }, + required: ["label"], + }, + }, chips: { type: "array", description: "Useful next prompts for AURA, short and action-oriented.", @@ -250,6 +989,8 @@ export const askAura = onCall( vibe: { type: "string" }, shortExplanation: { type: "string" }, stylingNote: { type: "string" }, + personalizationLabel: { type: "string" }, + personalizationNote: { type: "string" }, pieces: { type: "array", items: { @@ -272,7 +1013,7 @@ export const askAura = onCall( type: "array", items: { type: "string", - enum: ["saveLook", "planForToday", "showMoreLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], + enum: ["saveLook", "planForToday", "likeLook", "notMyVibe", "showMoreLikeThis", "lessLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], }, }, }, @@ -280,6 +1021,47 @@ export const askAura = onCall( }, ], }, + lookOptions: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + lookTitle: { type: "string" }, + vibe: { type: "string" }, + shortExplanation: { type: "string" }, + stylingNote: { type: "string" }, + personalizationLabel: { type: "string" }, + personalizationNote: { type: "string" }, + pieces: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + role: { type: "string", enum: ["top", "bottom", "shoes", "outerwear", "accessory"] }, + itemName: { type: "string" }, + source: { type: "string", enum: ["closet", "suggested"] }, + itemId: { type: ["string", "null"] }, + imageUrl: { type: ["string", "null"] }, + }, + required: ["role", "itemName", "source", "itemId", "imageUrl"], + }, + }, + fromCloset: { type: "array", items: { type: "string" } }, + addToComplete: { type: "array", items: { type: "string" } }, + alternates: { type: "array", items: { type: "string" } }, + actions: { + type: "array", + items: { + type: "string", + enum: ["saveLook", "planForToday", "likeLook", "notMyVibe", "showMoreLikeThis", "lessLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], + }, + }, + }, + required: ["lookTitle", "vibe", "shortExplanation", "stylingNote", "pieces", "fromCloset", "addToComplete", "alternates", "actions"], + }, + }, }, required: [ "presentation", @@ -290,8 +1072,12 @@ export const askAura = onCall( "ownedPieces", "recommendedAdditions", "swapSuggestion", + "missingPieces", + "upgradeSuggestions", + "upgradeSuggestionItems", "chips", "look", + "lookOptions", ], }, }, @@ -306,12 +1092,47 @@ export const askAura = onCall( } catch { parsed = fallbackAuraResponse(raw); } + logger.info("[AURA_MULTI] structured response parsed", { + uid, + multiRequested: wantsMultipleLooks(userMessage), + requestedCount: parseRequestedLookCount(userMessage), + rawPresentation: parsed.presentation, + rawHasLook: !!parsed.look, + rawLookOptionsCount: parsed.lookOptions?.length ?? 0, + rawOwnedPiecesCount: parsed.ownedPieces?.length ?? 0, + rawOutfitItemsCount: parsed.outfitItems?.length ?? 0, + }); + const normalized = normalizeAuraResponse(parsed, userMessage, auraContext); + logger.info("[AURA_MULTI] structured response normalized", { + uid, + multiRequested: wantsMultipleLooks(userMessage), + normalizedPresentation: normalized.presentation, + normalizedHasLook: !!normalized.look, + normalizedLookOptionsCount: normalized.lookOptions?.length ?? 0, + normalizedOwnedPiecesCount: normalized.ownedPieces?.length ?? 0, + missingPiecesCount: normalized.missingPieces?.length ?? 0, + upgradeSuggestionsCount: normalized.upgradeSuggestions?.length ?? 0, + }); + logger.info("[AURA_RESPONSE_FINAL] callable final response", { + uid, + presentation: normalized.presentation, + hasLook: !!normalized.look, + lookOptionsCount: normalized.lookOptions?.length ?? 0, + ownedPiecesCount: normalized.ownedPieces?.length ?? 0, + recommendedAdditionsCount: normalized.recommendedAdditions?.length ?? 0, + missingPiecesCount: normalized.missingPieces?.length ?? 0, + upgradeSuggestionsCount: normalized.upgradeSuggestions?.length ?? 0, + outfitItemsCount: normalized.outfitItems?.length ?? 0, + title: normalized.title, + replyPreview: String(normalized.reply ?? "").slice(0, 160), + }); - return { ok: true, data: normalizeAuraResponse(parsed, auraContext) }; + return { ok: true, data: normalized }; } catch (error) { - logger.error("askAura failed", { + logger.error("[AURA_ERROR] askAura failed", { uid, message: userMessage, + attachmentCount: attachments.length, error, }); throw new HttpsError("internal", "Aura could not respond right now."); diff --git a/functions/src/askAuraStream.ts b/functions/src/askAuraStream.ts index eeba31c..57e9b1b 100644 --- a/functions/src/askAuraStream.ts +++ b/functions/src/askAuraStream.ts @@ -5,13 +5,33 @@ import { onRequest } from "firebase-functions/v2/https"; import OpenAI from "openai"; import { AURA_INSTRUCTIONS, AURA_STREAM_INSTRUCTIONS } from "./shared/auraPrompt"; +import { + candidatePreviewResponse, + candidatesFromProductExtractions, + extractImageCandidates, + fallbackImageCandidates, + productCategoryHintsFromText, + rankProductLinkImages, + type AuraCandidateItem, +} from "./shared/auraCandidatePreview"; +import { classifyAuraLinkIntent, extractUrlsFromText } from "./shared/auraLinkIntent"; import { buildAuraContext } from "./shared/buildAuraContext"; +import { loadCompactAuraMemoryContext } from "./shared/auraMemory"; +import { type WardrobeGapSuggestion } from "./shared/detectWardrobeGaps"; import { loadAuraUserProfile } from "./shared/loadAuraUserProfile"; +import { extractProductUrlMetadata } from "./shared/productUrlMetadata"; +import { + ProductLinkError, + extractProductFromUrl, +} from "./shared/productLinkExtractor"; const db = getFirestore(); +const AURA_BACKEND_VERSION = "candidate-preview-url-v9-zara-product-api"; +const DEBUG_AURA_SPARSE = + process.env.FUNCTIONS_EMULATOR === "true" || process.env.NODE_ENV !== "production"; type AuraResponse = { - presentation: "chat" | "card"; + presentation: "chat" | "card" | "candidate_preview"; title: string; reply: string; reason: string; @@ -19,12 +39,20 @@ type AuraResponse = { ownedPieces: string[]; recommendedAdditions: string[]; swapSuggestion: string; + missingPieces?: string[]; + upgradeSuggestions?: string[]; + upgradeSuggestionItems?: { + label: string; + searchQuery?: string; + }[]; chips: string[]; look: { lookTitle: string; vibe: string; shortExplanation: string; stylingNote: string; + personalizationLabel?: string; + personalizationNote?: string; pieces: { role: "top" | "bottom" | "shoes" | "outerwear" | "accessory"; itemName: string; @@ -36,11 +64,83 @@ type AuraResponse = { addToComplete: string[]; alternates: string[]; actions: ( - "saveLook" | "planForToday" | "showMoreLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" + "saveLook" | "planForToday" | "likeLook" | "notMyVibe" | "showMoreLikeThis" | "lessLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" )[]; } | null; + lookOptions?: { + lookTitle: string; + vibe: string; + shortExplanation: string; + stylingNote: string; + personalizationLabel?: string; + personalizationNote?: string; + pieces: { + role: "top" | "bottom" | "shoes" | "outerwear" | "accessory"; + itemName: string; + source: "closet" | "suggested"; + itemId: string | null; + imageUrl: string | null; + }[]; + fromCloset: string[]; + addToComplete: string[]; + alternates: string[]; + actions: ( + "saveLook" | "planForToday" | "likeLook" | "notMyVibe" | "showMoreLikeThis" | "lessLikeThis" | "shopMissingPieces" | "useOnlyMyCloset" | "makeItDressier" + )[]; + }[]; + candidates?: AuraCandidateItem[]; + candidateItems?: AuraCandidateItem[]; +}; + +type AuraAttachment = { + type?: "image" | "audio"; + uri?: string; + role?: string | null; + groupId?: string | null; + transcript?: string | null; }; +type AuraLinkPreview = { + sourceUrl: string; + title: string | null; + imageUrl: string | null; + imageUrls?: string[]; + description: string | null; +}; + +const MULTI_LOOK_REQUEST_RE = + /\b((?:2|3|4|two|three|four)\s+(?:outfits?|looks?|options?|directions?)|multiple\s+(?:outfits?|looks?|options?|directions?)|safe,\s*balanced,\s*(?:and\s*)?bold|safe\s+balanced\s+bold|different\s+directions|few\s+outfits?)\b/i; + +function parseRequestedLookCount(message: string) { + const text = String(message ?? "").toLowerCase(); + if (/\b(4|four)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 4; + if (/\b(3|three)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 3; + if (/\b(2|two)\s+(?:outfits?|looks?|options?|directions?)\b/.test(text)) return 2; + if (/\bsafe,\s*balanced,\s*(?:and\s*)?bold\b|\bsafe\s+balanced\s+bold\b/.test(text)) return 3; + if (/\bmultiple\s+(?:outfits?|looks?|options?|directions?)\b|\bdifferent\s+directions\b|\bfew\s+outfits?\b/.test(text)) return 3; + return 1; +} + +function wantsMultipleLooks(message: string) { + return MULTI_LOOK_REQUEST_RE.test(String(message ?? "")); +} + +function buildMultiLookRequestNote(userMessage: string) { + if (!wantsMultipleLooks(userMessage)) return ""; + const count = Math.min(3, Math.max(2, parseRequestedLookCount(userMessage))); + return ( + "\n\nMulti-look requirement:\n" + + "The user is explicitly asking for multiple outfit options.\n" + + `Return presentation "card" and provide ${count} structured looks in lookOptions whenever you can do so safely.\n` + + "Do not answer this with only prose, outfitItems, ownedPieces, or recommendedAdditions if structured looks are possible.\n" + + "If only one structured look is possible, still return that one structured look and leave a concise reply." + ); +} + +const ADD_IMAGE_RE = + /\b(add|save|store|put|upload|log)\b[\s\S]{0,80}\b(closet|wardrobe|item|items|these|this|all)\b|\b(add|save)\s+(this|these|all|item|items)\b/i; +const BATCH_IMAGE_RE = /\b(these|all|each|separate|multiple|items)\b/i; + function shortenLookReply(text: string) { const trimmed = String(text ?? "").trim(); if (!trimmed) return trimmed; @@ -50,36 +150,257 @@ function shortenLookReply(text: string) { return `${trimmed.slice(0, 117).trimEnd()}...`; } +function uniqueActions(actions: string[]) { + return Array.from(new Set(actions.filter(Boolean))); +} + +const PERSONALIZATION_BLOCKLIST = [ + /stored preferences?/i, + /profile data/i, + /learned memory/i, + /memory suggests/i, + /your profile says/i, + /\bdata suggests\b/i, +]; + +function cleanPersonalizationText(text: string, maxLength: number) { + const trimmed = String(text ?? "") + .replace(/\s+/g, " ") + .replace(/^["'`\-–—\s]+|["'`\-–—\s]+$/g, "") + .trim(); + if (!trimmed) return ""; + if (PERSONALIZATION_BLOCKLIST.some((pattern) => pattern.test(trimmed))) { + return ""; + } + if (trimmed.length <= maxLength) return trimmed; + return `${trimmed.slice(0, maxLength - 3).trimEnd()}...`; +} + +function fallbackPersonalization( + auraContext?: { + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + favoriteColors?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; + } +) { + const explicit = auraContext?.preferenceContext?.explicitProfile; + const learned = auraContext?.preferenceContext?.learnedProfile; + const session = auraContext?.preferenceContext?.session; + const learnedConfidence = learned?.confidence ?? 0; + + if (session?.currentOccasion && session?.vibeForThisSession) { + return { + label: `Right for ${session.currentOccasion}`, + note: `It keeps the ${session.vibeForThisSession} tone, but still feels polished enough for ${session.currentOccasion}.`, + }; + } + + if (session?.vibeForThisSession) { + return { + label: `Set to ${session.vibeForThisSession}`, + note: `This keeps the mood pointed toward ${session.vibeForThisSession} without losing polish.`, + }; + } + if (session?.currentOccasion) { + return { + label: `Built for ${session.currentOccasion}`, + note: `It is shaped around ${session.currentOccasion} first, so it feels right for the moment instead of generic.`, + }; + } + if (explicit?.styleVibes?.length && explicit?.favoriteColors?.length) { + const vibe = explicit.styleVibes[0]; + const color = explicit.favoriteColors[0]; + if (explicit.experimentationLevel === "high") { + return { + label: "A touch bolder", + note: `It still sits inside your ${vibe} lane, just with a slightly bolder ${color}-leaning twist.`, + }; + } + return { + label: `Feels like your ${vibe} side`, + note: `It stays close to your ${vibe} direction and keeps the palette near shades that already feel easy on you.`, + }; + } + if (explicit?.preferredFits?.length) { + const fit = explicit.preferredFits[0]; + return { + label: `Leans ${fit} in fit`, + note: `The proportions stay closer to the ${fit} fit you naturally wear well.`, + }; + } + if (explicit?.styleVibes?.length) { + const vibe = explicit.styleVibes[0]; + if (explicit.experimentationLevel === "high") { + return { + label: "A little bolder than usual", + note: `It still sits inside your ${vibe} lane, just with a slightly more adventurous edge.`, + }; + } + if (explicit.experimentationLevel === "low") { + return { + label: "Closer to your usual lane", + note: `This keeps things grounded in the ${vibe} direction you already gravitate toward.`, + }; + } + return { + label: `Works for your ${vibe} style`, + note: `It stays close to the ${vibe} direction that already feels natural on you.`, + }; + } + if (learnedConfidence >= 0.62 && learned?.inferredFavoriteColors?.length) { + return { + label: "Closer to your usual palette", + note: "The palette stays near the colors you seem to keep coming back to, so it still feels familiar in a good way.", + }; + } + if (learnedConfidence >= 0.62 && learned?.inferredFits?.length) { + return { + label: `Feels more ${learned.inferredFits[0]}`, + note: "The proportions stay near the shapes you seem to respond to best.", + }; + } + if (learnedConfidence >= 0.42 && learned?.inferredFavoriteColors?.length) { + return { + label: "Still feels like you", + note: "This keeps the palette in a range that already seems easy for you to wear.", + }; + } + return {label: "", note: ""}; +} + +function normalizeLookSurface( + look: NonNullable, + auraContext?: { + wardrobe?: { + footwear?: Record[]; + }; + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + favoriteColors?: string[]; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; + } +) { + if (look.stylingNote) { + look.stylingNote = shortenLookReply(look.stylingNote); + } + + const ownedPieces = look.pieces + .filter((piece) => piece.source === "closet") + .map((piece) => piece.itemName) + .filter(Boolean); + const suggestedPieces = look.pieces + .filter((piece) => piece.source === "suggested") + .map((piece) => piece.itemName) + .filter(Boolean); + + look.fromCloset = Array.from(new Set(ownedPieces)); + look.addToComplete = Array.from( + new Set(suggestedPieces.filter((piece) => !look.fromCloset.includes(piece))) + ); + look.actions = uniqueActions([ + ...(look.actions ?? []), + "likeLook", + "notMyVibe", + "showMoreLikeThis", + "lessLikeThis", + "useOnlyMyCloset", + "makeItDressier", + "shopMissingPieces", + ]) as NonNullable["actions"]; + + const personalization = fallbackPersonalization(auraContext); + look.personalizationLabel = + cleanPersonalizationText(String(look.personalizationLabel ?? ""), 38) || + personalization.label; + look.personalizationNote = + cleanPersonalizationText(String(look.personalizationNote ?? ""), 150) || + personalization.note; + + return { + ownedPieces: look.fromCloset, + recommendedAdditions: look.addToComplete, + }; +} + function normalizeAuraResponse( response: AuraResponse, + userMessage?: string, auraContext?: { wardrobe?: { footwear?: Record[]; }; + categoryCounts?: { + tops: number; + bottoms: number; + footwear: number; + outerwear: number; + accessories: number; + }; + isSparseWardrobe?: boolean; + wardrobeGaps?: { + missingCore?: { label: string }[]; + weakAreas?: { label: string }[]; + suggestions?: WardrobeGapSuggestion[]; + }; + preferenceContext?: { + explicitProfile?: { + styleVibes?: string[]; + preferredFits?: string[]; + experimentationLevel?: "low" | "medium" | "high"; + } | null; + learnedProfile?: { + confidence?: number; + inferredFavoriteColors?: string[]; + inferredFits?: string[]; + } | null; + session?: { + currentOccasion?: string; + vibeForThisSession?: string; + } | null; + } | null; } ) { - if (response.look) { + const multiRequested = wantsMultipleLooks(userMessage ?? ""); + if (response.lookOptions?.length) { + response.lookOptions = response.lookOptions.slice(0, 3); + } + + if (response.look || response.lookOptions?.length) { response.reply = shortenLookReply(response.reply); response.reason = ""; - if (response.look.stylingNote) { - response.look.stylingNote = shortenLookReply(response.look.stylingNote); - } + } - const ownedPieces = response.look.pieces - .filter((piece) => piece.source === "closet") - .map((piece) => piece.itemName) - .filter(Boolean); - const suggestedPieces = response.look.pieces - .filter((piece) => piece.source === "suggested") - .map((piece) => piece.itemName) - .filter(Boolean); - - response.ownedPieces = Array.from(new Set(ownedPieces)); - response.recommendedAdditions = Array.from( - new Set(suggestedPieces.filter((piece) => !response.ownedPieces.includes(piece))) - ); - response.look.fromCloset = response.ownedPieces; - response.look.addToComplete = response.recommendedAdditions; + if (response.look) { + const normalized = normalizeLookSurface(response.look, auraContext); + response.ownedPieces = normalized.ownedPieces; + response.recommendedAdditions = normalized.recommendedAdditions; const eligibleFootwear = auraContext?.wardrobe?.footwear ?? []; const selectedOwnedFootwear = response.look.pieces.filter( @@ -97,6 +418,79 @@ function normalizeAuraResponse( }); } } + if (!response.look && response.lookOptions?.length) { + response.look = response.lookOptions[0]; + } + if (response.lookOptions?.length) { + response.lookOptions = response.lookOptions.map((look) => { + normalizeLookSurface(look, auraContext); + return look; + }); + } + if (multiRequested && !response.lookOptions?.length && response.look) { + logger.warn("[AURA_MULTI] stream multi-look request returned only one structured look", { + requestedCount: parseRequestedLookCount(userMessage ?? ""), + lookTitle: response.look.lookTitle, + }); + response.lookOptions = [response.look]; + } + if (multiRequested && !response.look && !response.lookOptions?.length) { + logger.warn("[AURA_MULTI] stream multi-look request returned no structured looks", { + requestedCount: parseRequestedLookCount(userMessage ?? ""), + title: response.title, + reply: response.reply, + ownedPiecesCount: response.ownedPieces?.length ?? 0, + recommendedAdditionsCount: response.recommendedAdditions?.length ?? 0, + outfitItemsCount: response.outfitItems?.length ?? 0, + }); + } + + const gapContext = auraContext?.wardrobeGaps; + const derivedMissing = uniqueTrimmed([ + ...(response.missingPieces ?? []), + ...(auraContext?.isSparseWardrobe + ? [ + ...(gapContext?.missingCore?.map((gap) => gap.label) ?? []), + ...(gapContext?.weakAreas?.slice(0, 1).map((gap) => gap.label) ?? []), + ] + : gapContext?.missingCore?.map((gap) => gap.label) ?? []), + ]); + const derivedSuggestions = uniqueTrimmed([ + ...(response.upgradeSuggestions ?? []), + ...((gapContext?.suggestions ?? []).map((suggestion) => suggestion.label) ?? []), + ]); + + const maxSuggestionCount = auraContext?.isSparseWardrobe ? 3 : 2; + response.missingPieces = derivedMissing.slice(0, maxSuggestionCount); + response.upgradeSuggestions = derivedSuggestions + .filter((suggestion) => !response.missingPieces?.includes(suggestion)) + .slice(0, maxSuggestionCount); + response.upgradeSuggestionItems = normalizeSuggestionItems( + response.upgradeSuggestionItems, + response.upgradeSuggestions, + gapContext?.suggestions ?? [] + ).filter((item) => !response.missingPieces?.includes(item.label)); + + if (!auraContext?.isSparseWardrobe && !(gapContext?.missingCore?.length ?? 0)) { + response.missingPieces = response.missingPieces?.slice(0, 1) ?? []; + response.upgradeSuggestions = response.upgradeSuggestions?.slice(0, 1) ?? []; + response.upgradeSuggestionItems = response.upgradeSuggestionItems?.slice(0, 1) ?? []; + } + + if (DEBUG_AURA_SPARSE) { + logger.info("[AURA_SPARSE_NORMALIZED]", { + isSparseWardrobe: auraContext?.isSparseWardrobe ?? false, + categoryCounts: auraContext?.categoryCounts ?? null, + detectedGaps: { + missingCore: gapContext?.missingCore?.map((gap) => gap.label) ?? [], + weakAreas: gapContext?.weakAreas?.map((gap) => gap.label) ?? [], + }, + missingPieces: response.missingPieces ?? [], + upgradeSuggestions: response.upgradeSuggestions ?? [], + upgradeSuggestionItems: response.upgradeSuggestionItems ?? [], + }); + } + return response; } @@ -121,11 +515,472 @@ function fallbackAuraResponse(reply: string): AuraResponse { ownedPieces: [], recommendedAdditions: [], swapSuggestion: "", + missingPieces: [], + upgradeSuggestions: [], + upgradeSuggestionItems: [], chips: [], look: null, + lookOptions: [], + }; +} + +function uniqueTrimmed(values: string[] | undefined, max = 3) { + return Array.from( + new Set( + (values ?? []) + .map((value) => String(value ?? "").trim()) + .filter(Boolean) + ) + ).slice(0, max); +} + +function normalizeSuggestionItems( + items: AuraResponse["upgradeSuggestionItems"] | undefined, + fallbackSuggestions: string[], + contextSuggestions: WardrobeGapSuggestion[] +) { + const entries: [string, { label: string; searchQuery?: string }][] = []; + for (const item of items ?? []) { + const label = String(item?.label ?? "").trim(); + if (!label) continue; + const searchQuery = String(item?.searchQuery ?? "").trim(); + entries.push([label.toLowerCase(), { label, searchQuery: searchQuery || undefined }]); + } + const normalizedItems = Array.from(new Map(entries).values()); + + if (normalizedItems.length) return normalizedItems.slice(0, 3); + + return fallbackSuggestions + .map((label) => { + const match = contextSuggestions.find( + (suggestion) => suggestion.label.toLowerCase() === label.toLowerCase() + ); + return { + label, + searchQuery: match?.searchQuery, + }; + }) + .filter((item) => item.label) + .slice(0, 3); +} + +function parseAuraAttachments(input: unknown): AuraAttachment[] { + if (!Array.isArray(input)) return []; + return input.reduce((out, entry) => { + if (!entry || typeof entry !== "object") return out; + const candidate = entry as Record; + const type = candidate.type === "audio" ? "audio" : candidate.type === "image" ? "image" : null; + const uri = String(candidate.uri ?? "").trim(); + if (!type || !uri) return out; + out.push({ + type, + uri, + role: typeof candidate.role === "string" ? candidate.role : null, + groupId: typeof candidate.groupId === "string" ? candidate.groupId : null, + transcript: typeof candidate.transcript === "string" ? candidate.transcript : null, + }); + return out; + }, []) + .slice(0, 8); +} + +function attachmentContextText(attachments: AuraAttachment[]) { + if (!attachments.length) return "No attachments."; + return JSON.stringify( + attachments.map((attachment, index) => ({ + index, + type: attachment.type, + role: attachment.role ?? null, + groupId: attachment.groupId ?? null, + transcript: attachment.transcript ?? null, + uri: attachment.uri, + })), + null, + 2 + ); +} + +function safeUrlHost(uri: string | undefined) { + if (!uri) return null; + try { + return new URL(uri).host; + } catch { + return null; + } +} + +function isHmProductUrl(rawUrl?: string | null) { + try { + const url = new URL(String(rawUrl ?? "")); + const host = url.hostname.toLowerCase(); + return ( + (host === "hm.com" || host.endsWith(".hm.com")) && + /\/productpage\.\d+\.html$/i.test(url.pathname) + ); + } catch { + return false; + } +} + +function auraLinkErrorMessage(error: unknown) { + if (error instanceof ProductLinkError) { + if (error.code === "invalid_url") return "That product link does not look valid."; + if (error.code === "unsafe_url") return "I cannot fetch that kind of link."; + if (error.code === "fetch_failed") { + return "I couldn't read that product link. Try another link or upload a photo."; + } + if (error.code === "no_metadata") { + return "I couldn't find product details on that page. Try another link or upload a photo."; + } + if (error.code === "no_images") { + return "I couldn't find usable product images on that page. Try another link or upload a photo."; + } + if (error.code === "draft_failed") { + return "I found the product, but couldn't create a wardrobe draft."; + } + } + return "I couldn't read that product link. Try another link or upload a photo."; +} + +function productContextText( + products: Awaited>[], +) { + return JSON.stringify( + products.map((product) => ({ + metadata: product.metadata, + imageUrls: product.imageUrls.slice(0, 4), + })), + null, + 2, + ); +} + +type ClientAuraIntent = + | "add_item" + | "add_items_batch" + | "add_item_from_url" + | "add_from_link" + | "add_from_links_batch" + | string + | null; + +function imageGroupsForAddIntent( + text: string, + attachments: AuraAttachment[], + clientIntent?: ClientAuraIntent, +) { + const images = attachments.filter( + (attachment): attachment is AuraAttachment & { uri: string } => + attachment.type === "image" && !!attachment.uri, + ); + const forceAdd = + clientIntent === "add_item" || clientIntent === "add_items_batch"; + if (!images.length || (!forceAdd && !ADD_IMAGE_RE.test(text))) return []; + const shouldSplit = + images.length > 1 && + (clientIntent === "add_items_batch" || + images[0]?.role === "separate_items" || + BATCH_IMAGE_RE.test(text)); + return shouldSplit ? images.map((image) => [image.uri]) : [images.map((image) => image.uri)]; +} + +function logStreamCandidateEmit( + uid: string, + source: "image" | "link", + data: ReturnType, +) { + const payload = { type: "final", data }; + const serialized = JSON.stringify(payload); + logger.info("[AURA_STREAM_EMIT] candidate final payload", { + uid, + source, + dataKeys: Object.keys(data), + payloadKeys: Object.keys(payload), + candidateItemsCount: data.candidateItems.length, + candidatesCount: data.candidates.length, + presentation: data.presentation, + serializedLength: serialized.length, + serializedPreview: serialized.slice(0, 1200), + }); +} + +function mergeUrlMetadataIntoCandidate( + candidate: AuraCandidateItem, + metadata: Awaited> | AuraLinkPreview, +): AuraCandidateItem { + return { + ...candidate, + candidateId: `url-${Date.now()}-0`, + imageUrls: + "imageUrls" in metadata && Array.isArray(metadata.imageUrls) && metadata.imageUrls.length + ? metadata.imageUrls + : metadata.imageUrl + ? [metadata.imageUrl] + : candidate.imageUrls, + title: candidate.title ?? metadata.title, + category: candidate.category ?? ("category" in metadata ? metadata.category ?? null : null), + subCategory: candidate.subCategory ?? ("subCategory" in metadata ? metadata.subCategory ?? null : null), + brand: candidate.brand ?? ("brand" in metadata ? metadata.brand ?? null : null), + confidence: candidate.confidence ?? ("confidence" in metadata ? metadata.confidence ?? null : null), + sourceType: "link", + sourceUrl: metadata.sourceUrl, + status: "status" in metadata && metadata.status === "needs_review" + ? "needs_review" + : "awaiting_confirmation", + }; +} + +function brandFromSourceUrl(sourceUrl?: string | null) { + try { + const host = new URL(String(sourceUrl ?? "")).hostname.replace(/^www\d*\./, "").toLowerCase(); + if (host.endsWith("hm.com")) return "H&M"; + if (host.endsWith("zara.com")) return "Zara"; + if (host.endsWith("nike.com")) return "Nike"; + const domain = host.split(".")[0] ?? ""; + return domain ? domain.charAt(0).toUpperCase() + domain.slice(1) : null; + } catch { + return null; + } +} + +function cleanProductTitle(title?: string | null, brand?: string | null) { + let next = String(title ?? "").replace(/\s+/g, " ").trim(); + next = next + .replace(/\s*\|\s*H\s*&\s*M(?:\s+[A-Z]{2})?\s*$/i, "") + .replace(/\s*\|\s*Zara\s*$/i, "") + .replace(/\s*\|\s*Nike\s*$/i, "") + .replace(/^Men[’']s\s+/i, "") + .replace(/^Women[’']s\s+/i, "") + .replace(/^Ladies[’']?\s+/i, "") + .trim(); + if (brand) { + next = next + .replace(new RegExp(`^${brand.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s+`, "i"), "") + .trim(); + } + return next || title || null; +} + +function cleanPreviewText(value: unknown, maxLength = 500) { + const text = String(value ?? "").replace(/\s+/g, " ").trim(); + return text ? text.slice(0, maxLength) : null; +} + +function normalizePreviewImage(sourceUrl: URL, value: unknown) { + const raw = String(value ?? "").trim(); + if (!raw || raw.startsWith("data:")) return null; + try { + const imageUrl = new URL(raw, sourceUrl); + if (imageUrl.protocol !== "http:" && imageUrl.protocol !== "https:") return null; + imageUrl.hash = ""; + return imageUrl.toString(); + } catch { + return null; + } +} + +function clientLinkPreviewFromRequest(value: unknown, detectedUrl: string | null): AuraLinkPreview | null { + if (!value || typeof value !== "object" || !detectedUrl) return null; + const candidate = value as Record; + if (typeof candidate.sourceUrl !== "string") return null; + try { + const detected = new URL(detectedUrl); + const source = new URL(candidate.sourceUrl); + detected.hash = ""; + source.hash = ""; + if (detected.toString() !== source.toString()) return null; + const imageUrl = normalizePreviewImage(source, candidate.imageUrl); + const imageUrls = Array.isArray(candidate.imageUrls) + ? candidate.imageUrls + .map((url) => normalizePreviewImage(source, url)) + .filter((url): url is string => !!url) + : []; + const preview = { + sourceUrl: detected.toString(), + title: cleanPreviewText(candidate.title, 220), + imageUrl, + imageUrls: imageUrls.length ? imageUrls : imageUrl ? [imageUrl] : [], + description: cleanPreviewText(candidate.description, 500), + }; + return preview.imageUrls.length || preview.title || preview.description ? preview : null; + } catch { + return null; + } +} + +function hmSingleImageClientPreview(preview: AuraLinkPreview | null): AuraLinkPreview | null { + if (!preview || !isHmProductUrl(preview.sourceUrl) || !preview.imageUrl) return null; + return { + ...preview, + imageUrls: [preview.imageUrl], }; } +function hmSanitizedClientPreview(preview: AuraLinkPreview | null): AuraLinkPreview | null { + if (!preview || !isHmProductUrl(preview.sourceUrl)) return null; + const urls = [ + ...(Array.isArray(preview.imageUrls) ? preview.imageUrls : []), + preview.imageUrl, + ] + .map((url) => String(url ?? "").trim()) + .filter((url) => { + try { + const parsed = new URL(url); + return parsed.hostname.toLowerCase() === "image.hm.com"; + } catch { + return false; + } + }); + const seen = new Set(); + const imageUrls = urls + .filter((url) => { + const key = url.toLowerCase().replace(/([?&])(imwidth|width|height|w|h)=\d+/g, "$1"); + if (seen.has(key)) return false; + seen.add(key); + return true; + }) + .slice(0, 24); + const imageUrl = imageUrls[0] ?? preview.imageUrl; + return imageUrl + ? { + ...preview, + imageUrl, + imageUrls, + } + : null; +} + +async function emitUrlCandidatePreview(params: { + res: Parameters[0] & { end: () => void }; + client: OpenAI; + uid: string; + metadata: Awaited> | AuraLinkPreview; +}) { + const rawImageUrls = [ + ...("imageUrls" in params.metadata && Array.isArray(params.metadata.imageUrls) + ? params.metadata.imageUrls + : []), + params.metadata.imageUrl, + ].filter((url): url is string => !!url); + logger.info("[LINK_IMAGE_SOURCE] URL metadata image source", { + uid: params.uid, + sourceUrl: params.metadata.sourceUrl, + rawImageCount: rawImageUrls.length, + rawImageUrls, + }); + const rankedImages = await rankProductLinkImages({ + client: params.client, + imageUrls: rawImageUrls, + title: params.metadata.title, + description: params.metadata.description, + sourceUrl: params.metadata.sourceUrl, + }); + const rankedImageUrls = rankedImages.map((image) => image.url); + const primaryImageUrl = rankedImageUrls[0] ?? null; + const titleHints = productCategoryHintsFromText(params.metadata.title, params.metadata.description); + logger.info("[LINK_EXTRACTION_TARGET]", { + uid: params.uid, + sourceUrl: params.metadata.sourceUrl, + title: params.metadata.title, + description: params.metadata.description, + hintedCategory: titleHints.category, + hintedSubCategory: titleHints.subCategory, + chosenImage: primaryImageUrl, + chosenImageReasons: rankedImages[0]?.reasons ?? [], + rawImageCount: rawImageUrls.length, + rankedImageCount: rankedImageUrls.length, + }); + + let candidates = primaryImageUrl + ? await extractImageCandidates({ + client: params.client, + imageGroups: [[primaryImageUrl]], + }) + : []; + if (!candidates.length && primaryImageUrl) { + candidates = fallbackImageCandidates([[primaryImageUrl]]); + } + if (!candidates.length) { + candidates = [ + { + candidateId: `url-${Date.now()}-0`, + imageUrls: [], + title: params.metadata.title, + category: null, + subCategory: null, + color: null, + brand: null, + material: null, + fit: null, + pattern: null, + confidence: null, + sourceType: "link", + sourceUrl: params.metadata.sourceUrl, + status: "awaiting_confirmation", + }, + ]; + } + const candidate = mergeUrlMetadataIntoCandidate(candidates[0], params.metadata); + const needsReview = "status" in params.metadata && params.metadata.status === "needs_review"; + candidate.imageUrls = rankedImageUrls.length ? rankedImageUrls : candidate.imageUrls; + candidate.primaryImageUrl = candidate.imageUrls[0] ?? null; + candidate.secondaryImageUrls = candidate.imageUrls.slice(1); + logger.info("[LINK_IMAGE_REVIEW_SET]", { + uid: params.uid, + sourceUrl: params.metadata.sourceUrl, + candidateId: candidate.candidateId, + primaryImageUrl: candidate.primaryImageUrl, + imageUrls: candidate.imageUrls, + secondaryImageUrls: candidate.secondaryImageUrls, + }); + if (!needsReview) { + candidate.category = titleHints.category ?? candidate.category; + candidate.subCategory = titleHints.subCategory ?? candidate.subCategory; + candidate.brand = candidate.brand && !/^no brand$/i.test(candidate.brand) + ? candidate.brand + : brandFromSourceUrl(params.metadata.sourceUrl); + } else { + candidate.category = candidate.category ?? null; + candidate.subCategory = candidate.subCategory ?? null; + candidate.brand = candidate.brand ?? null; + } + candidate.title = cleanProductTitle(params.metadata.title ?? candidate.title, candidate.brand); + logger.info("[LINK_BRAND_NORMALIZE] candidate brand/title normalized", { + uid: params.uid, + sourceUrl: params.metadata.sourceUrl, + rawTitle: params.metadata.title, + savedBrand: candidate.brand, + savedTitle: candidate.title, + }); + logger.info("[AURA_URL_TO_CANDIDATE] converted URL metadata to candidate", { + uid: params.uid, + sourceUrl: params.metadata.sourceUrl, + imageUrl: params.metadata.imageUrl, + title: params.metadata.title, + candidateId: candidate.candidateId, + category: candidate.category, + subCategory: candidate.subCategory, + color: candidate.color, + brand: candidate.brand, + }); + const data = candidatePreviewResponse([candidate]); + if (needsReview) { + data.reply = "I couldn’t fully read this item — review before adding"; + } + logger.info("[AURA_STREAM_PRE_EMIT] URL candidate final object", { + uid: params.uid, + branchChosen: "url_candidate_preview", + finalPayloadKeys: Object.keys(data), + presentation: data.presentation, + candidateItemsLength: data.candidateItems.length, + candidatesLength: data.candidates.length, + }); + logStreamCandidateEmit(params.uid, "link", data); + writeEvent(params.res, { type: "delta", delta: data.reply }); + writeEvent(params.res, { type: "final", data }); + params.res.end(); +} + export const askAuraStream = onRequest( { cors: true, secrets: ["OPENAI_API_KEY"] }, async (req, res) => { @@ -155,9 +1010,62 @@ export const askAuraStream = onRequest( } try { + logger.info("[AURA_BACKEND_VERSION] askAuraStream entry", { + version: AURA_BACKEND_VERSION, + method: req.method, + requestKeys: Object.keys(req.body ?? {}), + prompt: typeof req.body?.message === "string" ? req.body.message : null, + attachmentCount: Array.isArray(req.body?.attachments) ? req.body.attachments.length : 0, + clientIntent: typeof req.body?.clientIntent === "string" ? req.body.clientIntent : null, + }); const decodedToken = await getAuth().verifyIdToken(idToken); const uid = decodedToken.uid; const userMessage = String(req.body?.message ?? "").trim(); + const attachments = parseAuraAttachments(req.body?.attachments); + const clientIntent = typeof req.body?.clientIntent === "string" ? req.body.clientIntent : null; + const linkIntent = classifyAuraLinkIntent(userMessage); + const detectedUrls = extractUrlsFromText(userMessage); + const firstDetectedUrl = detectedUrls[0]?.normalized ?? null; + const rawClientLinkPreview = clientLinkPreviewFromRequest(req.body?.linkPreview, firstDetectedUrl); + const hmClientFallback = hmSanitizedClientPreview(rawClientLinkPreview) ?? hmSingleImageClientPreview(rawClientLinkPreview); + const clientLinkPreview = isHmProductUrl(firstDetectedUrl) ? null : rawClientLinkPreview; + const effectiveClientIntent = firstDetectedUrl ? "add_item_from_url" : clientIntent; + if (firstDetectedUrl) { + if (rawClientLinkPreview && !clientLinkPreview) { + logger.info("[LINK_PRODUCT_SCOPE] ignored client H&M link preview; server scope required", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + clientImageCount: rawClientLinkPreview.imageUrls?.length ?? 0, + clientImageUrl: rawClientLinkPreview.imageUrl ?? null, + sanitizedFallbackImageCount: hmClientFallback?.imageUrls?.length ?? 0, + }); + } + logger.info("[AURA_URL_DETECTED] URL detected in AURA message", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + clientIntent, + effectiveClientIntent, + hasClientLinkPreview: !!clientLinkPreview, + clientLinkPreviewHasImage: !!clientLinkPreview?.imageUrl, + }); + } + logger.info("[AURA_STREAM] request received", { + uid, + hasAuth: !!uid, + hasMessage: !!userMessage, + linkIntent, + clientIntent: effectiveClientIntent, + detectedUrlCount: detectedUrls.length, + detectedDomains: detectedUrls.map((entry) => safeUrlHost(entry.normalized)), + attachmentCount: attachments.length, + attachments: attachments.map((attachment) => ({ + type: attachment.type, + role: attachment.role ?? null, + groupId: attachment.groupId ?? null, + hasUri: !!attachment.uri, + uriHost: safeUrlHost(attachment.uri), + })), + }); const history = Array.isArray(req.body?.history) ? req.body.history .map((entry: unknown) => { @@ -180,41 +1088,280 @@ export const askAuraStream = onRequest( .slice(-8) : []; - if (!userMessage) { - res.status(400).json({ error: "Message is required." }); + if (!userMessage && attachments.length === 0) { + res.status(400).json({ error: "Message or attachment is required." }); return; } + const client = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + }); + const imageCandidateGroups = imageGroupsForAddIntent(userMessage, attachments, effectiveClientIntent); + + if (firstDetectedUrl) { + try { + const metadata = await extractProductUrlMetadata(firstDetectedUrl); + if (!metadata.imageUrl) { + const fallbackPreview = clientLinkPreview ?? hmClientFallback; + if (fallbackPreview?.imageUrl) { + logger.info("[AURA_URL_METADATA] using client link preview after missing server image", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + hasTitle: !!fallbackPreview.title, + hasImageUrl: !!fallbackPreview.imageUrl, + imageCount: fallbackPreview.imageUrls?.length ?? 0, + sanitizedHmFallback: fallbackPreview === hmClientFallback, + }); + await emitUrlCandidatePreview({ + res, + client, + uid, + metadata: fallbackPreview, + }); + return; + } + logger.warn("[AURA_URL_METADATA] no product image found for URL", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + }); + const reply = "Couldn't read that link. Try a screenshot."; + writeEvent(res, { type: "delta", delta: reply }); + writeEvent(res, { type: "final", data: fallbackAuraResponse(reply) }); + res.end(); + return; + } + + await emitUrlCandidatePreview({ + res, + client, + uid, + metadata, + }); + return; + } catch (error) { + const fallbackPreview = clientLinkPreview ?? hmClientFallback; + if (fallbackPreview?.imageUrl) { + logger.info("[AURA_URL_METADATA] using client link preview after server fetch failure", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + hasTitle: !!fallbackPreview.title, + hasImageUrl: !!fallbackPreview.imageUrl, + imageCount: fallbackPreview.imageUrls?.length ?? 0, + sanitizedHmFallback: fallbackPreview === hmClientFallback, + }); + await emitUrlCandidatePreview({ + res, + client, + uid, + metadata: fallbackPreview, + }); + return; + } + logger.error("[AURA_URL_FETCH] failed to read product URL", { + uid, + urlHost: safeUrlHost(firstDetectedUrl), + error, + }); + const reply = "Couldn't read that link. Try a screenshot."; + writeEvent(res, { type: "delta", delta: reply }); + writeEvent(res, { type: "final", data: fallbackAuraResponse(reply) }); + res.end(); + return; + } + } + + if (imageCandidateGroups.length > 0) { + writeEvent(res, { + type: "status", + status: "extracting_preview", + }); + logger.info("[AURA_CANDIDATE] image add intent classified", { + uid, + candidateCount: imageCandidateGroups.length, + }); + try { + let candidates = await extractImageCandidates({ + client, + imageGroups: imageCandidateGroups, + }); + if (!candidates.length) { + logger.warn("[AURA_CANDIDATE_BACKEND] image extraction returned no candidates; using fallback", { + uid, + groupCount: imageCandidateGroups.length, + }); + candidates = fallbackImageCandidates(imageCandidateGroups); + } + const data = candidatePreviewResponse(candidates); + logger.info("[AURA_CANDIDATE_BACKEND] raw image candidate object before stream", { + uid, + keys: Object.keys(data), + candidateItems: data.candidateItems, + }); + logger.info("[AURA_STREAM_FINAL] emitting image candidate final", { + uid, + clientIntent, + candidateCount: data.candidateItems.length, + presentation: data.presentation, + hasCandidateItems: !!data.candidateItems.length, + }); + logger.info("[AURA_STREAM_PRE_EMIT] image candidate final object", { + uid, + branchChosen: "image_candidate_preview", + finalPayloadKeys: Object.keys(data), + presentation: data.presentation, + candidateItemsLength: data.candidateItems.length, + candidatesLength: data.candidates.length, + }); + logStreamCandidateEmit(uid, "image", data); + writeEvent(res, { type: "delta", delta: data.reply }); + writeEvent(res, { type: "final", data }); + res.end(); + return; + } catch (error) { + logger.error("[AURA_LINK_ERROR] image candidate extraction failed", { + uid, + error, + }); + const reply = "I couldn't read that item photo. Try another photo or add it manually."; + writeEvent(res, { type: "delta", delta: reply }); + writeEvent(res, { type: "final", data: fallbackAuraResponse(reply) }); + res.end(); + return; + } + } + + if ( + linkIntent === "add_from_link" || + linkIntent === "add_from_links_batch" || + clientIntent === "add_from_link" || + clientIntent === "add_from_links_batch" + ) { + if (!detectedUrls.length) { + writeEvent(res, { + type: "error", + error: "A product link is required.", + }); + res.end(); + return; + } + + writeEvent(res, { + type: "status", + status: "extracting_preview", + }); + logger.info("[AURA_LINK] add intent classified", { + uid, + linkIntent, + urlCount: detectedUrls.length, + }); + + try { + const extractions = []; + for (const detectedUrl of detectedUrls.slice(0, 5)) { + extractions.push(await extractProductFromUrl(detectedUrl.normalized)); + } + const data = candidatePreviewResponse(candidatesFromProductExtractions(extractions)); + logger.info("[AURA_CANDIDATE_BACKEND] raw link candidate object before stream", { + uid, + keys: Object.keys(data), + candidateItems: data.candidateItems, + }); + logger.info("[AURA_STREAM_FINAL] emitting link candidate final", { + uid, + candidateCount: data.candidateItems.length, + presentation: data.presentation, + hasCandidateItems: !!data.candidateItems.length, + }); + logger.info("[AURA_STREAM_PRE_EMIT] link candidate final object", { + uid, + branchChosen: "link_candidate_preview", + finalPayloadKeys: Object.keys(data), + presentation: data.presentation, + candidateItemsLength: data.candidateItems.length, + candidatesLength: data.candidates.length, + }); + logStreamCandidateEmit(uid, "link", data); + writeEvent(res, { type: "delta", delta: data.reply }); + writeEvent(res, { type: "final", data }); + res.end(); + return; + } catch (error) { + logger.error("[AURA_LINK_ERROR] add from link failed", { + uid, + linkIntent, + error, + }); + const reply = auraLinkErrorMessage(error); + writeEvent(res, { type: "delta", delta: reply }); + writeEvent(res, { type: "final", data: fallbackAuraResponse(reply) }); + res.end(); + return; + } + } + const itemsSnap = await db.collection("users").doc(uid).collection("items").get(); const items = itemsSnap.docs.map((doc) => ({ id: doc.id, ...doc.data(), })) as (Record & { id: string })[]; + const auraMemory = await loadCompactAuraMemoryContext( + db, + uid, + typeof req.body?.chatId === "string" ? req.body.chatId : null + ); const auraContext = buildAuraContext({ items, weather: req.body?.weather || null, occasion: req.body?.occasion || null, selectedDate: req.body?.selectedDate || null, + memory: auraMemory, }); logger.info("AURA stream closet context", { counts: auraContext.counts, + isSparseWardrobe: auraContext.isSparseWardrobe, + categoryCounts: auraContext.categoryCounts, + detectedGaps: auraContext.wardrobeGaps, footwearAvailable: auraContext.wardrobeDebug?.footwearAvailable ?? [], excludedFootwear: auraContext.wardrobeDebug?.excludedFootwear ?? [], }); const userProfile = await loadAuraUserProfile(uid); - - const client = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, - }); + let linkProductContext = "No product links."; + if (linkIntent === "analyze_link" && detectedUrls.length > 0) { + logger.info("[AURA_LINK] analyze intent classified", { + uid, + urlCount: detectedUrls.length, + }); + try { + const products = []; + for (const detectedUrl of detectedUrls.slice(0, 3)) { + products.push(await extractProductFromUrl(detectedUrl.normalized)); + } + linkProductContext = productContextText(products); + } catch (error) { + logger.error("[AURA_LINK_ERROR] analyze link extraction failed", { + uid, + error, + }); + linkProductContext = auraLinkErrorMessage(error); + } + } const requestText = `User profile:\n${JSON.stringify(userProfile, null, 2)}\n\n` + `Aura context:\n${JSON.stringify(auraContext, null, 2)}\n\n` + + `Stylist brief:\n${auraContext.stylistBrief || "Personalize lightly."}\n\n` + `Recent conversation:\n${JSON.stringify(history, null, 2)}\n\n` + - `User request:\n${userMessage}`; + `Product link context:\n${linkProductContext}\n\n` + + `Attachments:\n${attachmentContextText(attachments)}\n\n` + + `User request:\n${userMessage}` + + buildMultiLookRequestNote(userMessage); writeEvent(res, { type: "status", status: "responding" }); + logger.info("[AURA_STREAM] starting OpenAI stream", { + uid, + attachmentCount: attachments.length, + }); let streamedText = ""; const stream = client.responses.stream({ @@ -231,6 +1378,13 @@ export const askAuraStream = onRequest( type: "input_text", text: requestText, }, + ...attachments + .filter((attachment) => attachment.type === "image") + .map((attachment) => ({ + type: "input_image" as const, + image_url: attachment.uri ?? "", + detail: "auto" as const, + })), ], }, ], @@ -244,6 +1398,10 @@ export const askAuraStream = onRequest( } const finalReply = streamedText.trim(); + logger.info("[AURA_STREAM] OpenAI stream finished", { + uid, + textLength: finalReply.length, + }); const structured = await client.responses.create({ model: "gpt-5.4", @@ -262,6 +1420,13 @@ export const askAuraStream = onRequest( `Draft assistant reply already shown to the user:\n${finalReply}\n\n` + "Use that draft reply as the final reply unless a tiny cleanup is needed. Do not materially rewrite the response.", }, + ...attachments + .filter((attachment) => attachment.type === "image") + .map((attachment) => ({ + type: "input_image" as const, + image_url: attachment.uri ?? "", + detail: "auto" as const, + })), ], }, ], @@ -281,6 +1446,20 @@ export const askAuraStream = onRequest( ownedPieces: { type: "array", items: { type: "string" } }, recommendedAdditions: { type: "array", items: { type: "string" } }, swapSuggestion: { type: "string" }, + missingPieces: { type: "array", items: { type: "string" } }, + upgradeSuggestions: { type: "array", items: { type: "string" } }, + upgradeSuggestionItems: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + label: { type: "string" }, + searchQuery: { type: "string" }, + }, + required: ["label"], + }, + }, chips: { type: "array", items: { type: "string" } }, look: { anyOf: [ @@ -293,6 +1472,8 @@ export const askAuraStream = onRequest( vibe: { type: "string" }, shortExplanation: { type: "string" }, stylingNote: { type: "string" }, + personalizationLabel: { type: "string" }, + personalizationNote: { type: "string" }, pieces: { type: "array", items: { @@ -315,7 +1496,7 @@ export const askAuraStream = onRequest( type: "array", items: { type: "string", - enum: ["saveLook", "planForToday", "showMoreLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], + enum: ["saveLook", "planForToday", "likeLook", "notMyVibe", "showMoreLikeThis", "lessLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], }, }, }, @@ -323,6 +1504,47 @@ export const askAuraStream = onRequest( }, ], }, + lookOptions: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + lookTitle: { type: "string" }, + vibe: { type: "string" }, + shortExplanation: { type: "string" }, + stylingNote: { type: "string" }, + personalizationLabel: { type: "string" }, + personalizationNote: { type: "string" }, + pieces: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + role: { type: "string", enum: ["top", "bottom", "shoes", "outerwear", "accessory"] }, + itemName: { type: "string" }, + source: { type: "string", enum: ["closet", "suggested"] }, + itemId: { type: ["string", "null"] }, + imageUrl: { type: ["string", "null"] }, + }, + required: ["role", "itemName", "source", "itemId", "imageUrl"], + }, + }, + fromCloset: { type: "array", items: { type: "string" } }, + addToComplete: { type: "array", items: { type: "string" } }, + alternates: { type: "array", items: { type: "string" } }, + actions: { + type: "array", + items: { + type: "string", + enum: ["saveLook", "planForToday", "likeLook", "notMyVibe", "showMoreLikeThis", "lessLikeThis", "shopMissingPieces", "useOnlyMyCloset", "makeItDressier"], + }, + }, + }, + required: ["lookTitle", "vibe", "shortExplanation", "stylingNote", "pieces", "fromCloset", "addToComplete", "alternates", "actions"], + }, + }, }, required: [ "presentation", @@ -333,8 +1555,12 @@ export const askAuraStream = onRequest( "ownedPieces", "recommendedAdditions", "swapSuggestion", + "missingPieces", + "upgradeSuggestions", + "upgradeSuggestionItems", "chips", "look", + "lookOptions", ], }, }, @@ -350,12 +1576,51 @@ export const askAuraStream = onRequest( parsed.reply = parsed.reply?.trim() ? parsed.reply.trim() : finalReply; if (!parsed.reply) parsed.reply = finalReply; - parsed = normalizeAuraResponse(parsed, auraContext); + logger.info("[AURA_MULTI] stream structured response parsed", { + uid, + multiRequested: wantsMultipleLooks(userMessage), + requestedCount: parseRequestedLookCount(userMessage), + rawPresentation: parsed.presentation, + rawHasLook: !!parsed.look, + rawLookOptionsCount: parsed.lookOptions?.length ?? 0, + rawOwnedPiecesCount: parsed.ownedPieces?.length ?? 0, + rawOutfitItemsCount: parsed.outfitItems?.length ?? 0, + }); + parsed = normalizeAuraResponse(parsed, userMessage, auraContext); + logger.info("[AURA_MULTI] stream structured response normalized", { + uid, + multiRequested: wantsMultipleLooks(userMessage), + normalizedPresentation: parsed.presentation, + normalizedHasLook: !!parsed.look, + normalizedLookOptionsCount: parsed.lookOptions?.length ?? 0, + normalizedOwnedPiecesCount: parsed.ownedPieces?.length ?? 0, + missingPiecesCount: parsed.missingPieces?.length ?? 0, + upgradeSuggestionsCount: parsed.upgradeSuggestions?.length ?? 0, + }); + logger.info("[AURA_RESPONSE_FINAL] stream final response", { + uid, + presentation: parsed.presentation, + hasLook: !!parsed.look, + lookOptionsCount: parsed.lookOptions?.length ?? 0, + ownedPiecesCount: parsed.ownedPieces?.length ?? 0, + recommendedAdditionsCount: parsed.recommendedAdditions?.length ?? 0, + missingPiecesCount: parsed.missingPieces?.length ?? 0, + upgradeSuggestionsCount: parsed.upgradeSuggestions?.length ?? 0, + outfitItemsCount: parsed.outfitItems?.length ?? 0, + title: parsed.title, + replyPreview: String(parsed.reply ?? "").slice(0, 160), + }); writeEvent(res, { type: "final", data: parsed }); + logger.info("[AURA_STREAM] final response emitted", { + uid, + presentation: parsed.presentation, + hasLook: !!parsed.look, + lookOptionsCount: parsed.lookOptions?.length ?? 0, + }); res.end(); } catch (error) { - logger.error("askAuraStream failed", error); + logger.error("[AURA_ERROR] askAuraStream failed", error); writeEvent(res, { type: "error", error: "AURA could not respond right now.", diff --git a/functions/src/generateOutfitsV1.ts b/functions/src/generateOutfitsV1.ts index e00dd68..00c276d 100644 --- a/functions/src/generateOutfitsV1.ts +++ b/functions/src/generateOutfitsV1.ts @@ -13,11 +13,94 @@ import { persistGeneratedOutfits, safeJsonExtract, } from "./shared/outfitEngine"; +import { loadCompactAuraMemoryContext } from "./shared/auraMemory"; if (!getApps().length) { initializeApp(); } +function normalizedText(value: unknown): string { + return String(value ?? "") + .toLowerCase() + .replace(/[^a-z0-9\s]/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function isOuterwearItem(item: { category?: string | null; subCategory?: string | null; type?: string | null; name?: string | null }) { + const category = String(item.category ?? "").trim().toLowerCase(); + const tokens = normalizedText( + [item.category, item.subCategory, item.type, item.name].filter(Boolean).join(" "), + ); + return ( + category === "outerwear" || + /\b(jacket|coat|outerwear|overshirt|blazer|hoodie|cardigan|shacket|trench|parka|bomber|denim jacket)\b/.test( + tokens, + ) + ); +} + +function enforceOuterwearOnOutfits(params: { + outfits: Array<{ + picks: Array<{ slot: "top" | "bottom" | "footwear" | "outerwear"; itemId: string }>; + score: number; + reason: string; + itemIds: string[]; + }>; + allItems: Array<{ id: string; category?: string; subCategory?: string; type?: string | null; name?: string | null }>; + requireOuterwear: boolean; +}) { + const { outfits, allItems, requireOuterwear } = params; + const outerwearPool = allItems.filter(isOuterwearItem); + if (!requireOuterwear || outerwearPool.length === 0) { + return { + outfits, + availableOuterwearCount: outerwearPool.length, + repairedCount: 0, + }; + } + + const usedOuterwearIds = new Set(); + let repairedCount = 0; + const repaired = outfits.map((outfit) => { + if (outfit.picks.some((pick) => pick.slot === "outerwear")) { + const currentOuterwearId = outfit.picks.find((pick) => pick.slot === "outerwear")?.itemId; + if (currentOuterwearId) usedOuterwearIds.add(currentOuterwearId); + return { + ...outfit, + itemIds: outfit.itemIds, + }; + } + + const existingIds = new Set(outfit.picks.map((pick) => pick.itemId)); + const candidate = + outerwearPool.find((item) => !existingIds.has(item.id) && !usedOuterwearIds.has(item.id)) ?? + outerwearPool.find((item) => !existingIds.has(item.id)) ?? + outerwearPool[0]; + + if (!candidate) { + return outfit; + } + + usedOuterwearIds.add(candidate.id); + repairedCount += 1; + return { + ...outfit, + picks: [{ slot: "outerwear" as const, itemId: candidate.id }, ...outfit.picks], + itemIds: [candidate.id, ...outfit.itemIds], + reason: outfit.reason.includes("outerwear") + ? outfit.reason + : `${outfit.reason.replace(/\.\s*$/, "")}, layered with ${candidate.name ?? "outerwear"}.`, + }; + }); + + return { + outfits: repaired.filter((outfit) => outfit.picks.some((pick) => pick.slot === "outerwear")), + availableOuterwearCount: outerwearPool.length, + repairedCount, + }; +} + async function parseOutfitIntent( intentText: string ): Promise<{intent: OutfitIntentV1; numOutfits: number | null}> { @@ -110,13 +193,53 @@ export const generateOutfitsV1 = onCall( const db = getFirestore(); const allItems = await fetchWardrobeItems(db, uid); - const generated = generateOutfitCandidates(allItems, parsedIntent, {numOutfits}); + const memory = await loadCompactAuraMemoryContext(db, uid, null); + const generated = generateOutfitCandidates(allItems, parsedIntent, { + numOutfits, + memory, + }); + const outerwearAvailable = allItems.filter((item) => + isOuterwearItem({ + category: item.category, + subCategory: item.subCategory, + type: (item as { type?: string | null }).type ?? null, + name: item.name ?? null, + }), + ).length; logger.info("generateOutfitsV1 slot counts", { uid, total: allItems.length, eligible: generated.eligibleCount, ...generated.slotCounts, + fallbackMode: generated.fallbackMode ?? "strict", + requiresOuterwear: parsedIntent.requireOuterwear === true, + availableOuterwearCount: outerwearAvailable, + }); + + const enforced = enforceOuterwearOnOutfits({ + outfits: generated.outfits, + allItems: allItems.map((item) => ({ + id: item.id, + category: item.category, + subCategory: item.subCategory, + type: (item as { type?: string | null }).type ?? null, + name: item.name ?? null, + })), + requireOuterwear: parsedIntent.requireOuterwear === true, + }); + const enforcedOutfits = enforced.outfits; + + logger.info("generateOutfitsV1 outerwear enforcement", { + uid, + requiresOuterwear: parsedIntent.requireOuterwear === true, + availableOuterwearCount: enforced.availableOuterwearCount, + generatedCount: generated.outfits.length, + enforcedCount: enforcedOutfits.length, + repairedCount: enforced.repairedCount, + outerwearCountPerLook: enforcedOutfits.map( + (outfit) => outfit.picks.filter((pick) => pick.slot === "outerwear").length, + ), }); const outfits = await persistGeneratedOutfits({ @@ -124,17 +247,19 @@ export const generateOutfitsV1 = onCall( uid, intentText, intent: generated.intent, - outfits: generated.outfits, + outfits: enforcedOutfits, }); logger.info("generateOutfitsV1 selected outfits", { uid, requestedNumOutfits, numOutfits, + fallbackMode: generated.fallbackMode ?? "strict", outfits: outfits.map((outfit) => ({ id: outfit.id, score: outfit.score, itemIds: outfit.picks.map((pick) => pick.itemId), + outerwearCount: outfit.picks.filter((pick) => pick.slot === "outerwear").length, })), }); diff --git a/functions/src/index.ts b/functions/src/index.ts index 04c3d5d..951f0b1 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -3,9 +3,12 @@ import { getFirestore } from "firebase-admin/firestore"; import { onRequest } from "firebase-functions/v2/https"; import { parseOutfitIntentFromPrompt } from "./parseOutfitIntent"; export { generateOutfitsV1 } from "./generateOutfitsV1"; +export { generateAuraSwipeBatch } from "./generateAuraSwipeBatch"; export { outfitChatV1 } from "./outfitChatV1"; export { askAura } from "./askAura"; export { askAuraStream } from "./askAuraStream"; +export { transcribeAuraAudio } from "./transcribeAuraAudio"; +export { importProductLink } from "./importProductLink"; export { ingestItemFromPhotos } from "./ingestItemFromPhotos"; export { generateCleanedProductImages } from "./generateCleanedProductImages"; diff --git a/functions/src/outfitChatV1.ts b/functions/src/outfitChatV1.ts index e1ca02a..b6f0457 100644 --- a/functions/src/outfitChatV1.ts +++ b/functions/src/outfitChatV1.ts @@ -27,6 +27,7 @@ import { loadAssistantProfile, loadBehaviorProfile, } from "./shared/assistantMemory"; +import { loadCompactAuraMemoryContext } from "./shared/auraMemory"; import { getOrRefreshWardrobeSummary } from "./shared/wardrobeSummary"; if (!getApps().length) { @@ -433,12 +434,13 @@ export const outfitChatV1 = onCall( }, {merge: true}); } - const [recentMessagesSnap, userSnap, allItems, assistantProfile, behaviorProfile] = await Promise.all([ + const [recentMessagesSnap, userSnap, allItems, assistantProfile, behaviorProfile, memory] = await Promise.all([ threadRef.collection("messages").orderBy("createdAt", "asc").limitToLast(12).get(), userRef.get(), fetchWardrobeItems(db, uid), loadAssistantProfile(db, uid), loadBehaviorProfile(db, uid), + loadCompactAuraMemoryContext(db, uid, null), ]); const recentMessages = recentMessagesSnap.docs.map((docSnap) => docSnap.data() as ChatMessageDoc); @@ -555,6 +557,7 @@ export const outfitChatV1 = onCall( constraints: mergedConstraints, excludeItemIds: explicitExcludes, lockedItemsBySlot, + memory, }); logger.info("outfitChatV1 slot counts", { diff --git a/functions/src/shared/auraCandidatePreview.ts b/functions/src/shared/auraCandidatePreview.ts new file mode 100644 index 0000000..5bf53e6 --- /dev/null +++ b/functions/src/shared/auraCandidatePreview.ts @@ -0,0 +1,560 @@ +import OpenAI from "openai"; +import type { ProductExtraction } from "./productLinkExtractor"; + +export type AuraCandidateItem = { + candidateId: string; + imageUrls: string[]; + primaryImageUrl?: string | null; + secondaryImageUrls?: string[]; + title?: string | null; + category?: string | null; + subCategory?: string | null; + color?: string | null; + brand?: string | null; + material?: string | null; + fit?: string | null; + pattern?: string | null; + confidence?: number | null; + sourceType: "image" | "link" | "batch"; + sourceUrl?: string | null; + status: "awaiting_confirmation" | "needs_review" | "added" | "cancelled" | "failed"; +}; + +export type RankedProductImage = { + url: string; + score: number; + reasons: string[]; + isGarmentOnly: boolean; + isModelImage: boolean; + isFrontFacing: boolean; + bucket?: ProductImageBucket; +}; + +type ProductImageBucket = "garment_only" | "model_editorial" | "unknown"; + +type RawProductImageRanking = { + index: number; + score: number; + isGarmentOnly: boolean; + isModelImage: boolean; + isFrontFacing: boolean; + containsMultipleGarments: boolean; + reasons: string[]; +}; + +export function candidatePreviewResponse(candidates: AuraCandidateItem[]) { + const needsReview = candidates.some((candidate) => candidate.status === "needs_review"); + const response = { + presentation: "candidate_preview" as const, + title: candidates.length === 1 ? "Review item" : "Review items", + reply: needsReview + ? "I couldn’t fully read this item — review before adding" + : candidates.length === 1 + ? "I found this item. Want me to add it?" + : `I found ${candidates.length} items. Review them before I add them.`, + reason: "", + outfitItems: [], + ownedPieces: [], + recommendedAdditions: [], + swapSuggestion: "", + chips: [], + look: null, + candidateItems: candidates, + candidates, + }; + console.info("[AURA_CANDIDATE_BACKEND] preview payload created", { + candidateCount: candidates.length, + candidateIds: candidates.map((candidate) => candidate.candidateId), + sourceTypes: candidates.map((candidate) => candidate.sourceType), + hasCandidateItems: true, + hasCandidatesAlias: true, + keys: Object.keys(response), + }); + return response; +} + +export function fallbackImageCandidates(imageGroups: string[][]): AuraCandidateItem[] { + const batch = imageGroups.length > 1; + return imageGroups + .filter((imageUrls) => imageUrls.length > 0) + .map((imageUrls, index) => + cleanCandidate( + { + title: null, + category: null, + subCategory: null, + color: null, + brand: null, + material: null, + fit: null, + pattern: null, + confidence: null, + }, + imageUrls, + index, + batch, + ), + ); +} + +export function candidatesFromProductExtractions( + extractions: ProductExtraction[], +): AuraCandidateItem[] { + return extractions.map((extraction, index) => ({ + candidateId: `link-${Date.now()}-${index}`, + imageUrls: extraction.imageUrls, + primaryImageUrl: extraction.imageUrls[0] ?? null, + secondaryImageUrls: extraction.imageUrls.slice(1), + title: extraction.metadata.title ?? null, + category: extraction.metadata.categoryHints?.[0] ?? null, + subCategory: extraction.metadata.categoryHints?.[1] ?? null, + color: extraction.metadata.color ?? null, + brand: + extraction.status === "needs_review" + ? extraction.metadata.brand ?? null + : extraction.metadata.brand ?? extraction.metadata.retailer ?? null, + material: extraction.metadata.material ?? null, + fit: null, + pattern: null, + confidence: extraction.confidence ?? null, + sourceType: extractions.length > 1 ? "batch" : "link", + sourceUrl: extraction.metadata.sourceUrl, + status: extraction.status === "needs_review" ? "needs_review" : "awaiting_confirmation", + })); +} + +function stableUniqueUrls(urls: string[]) { + const seen = new Set(); + return urls + .map((url) => String(url ?? "").trim()) + .filter(Boolean) + .filter((url) => { + const key = url.toLowerCase(); + if (seen.has(key)) return false; + seen.add(key); + return true; + }); +} + +function productImageReasonText(result: RawProductImageRanking | undefined) { + return (result?.reasons ?? []).join(" ").toLowerCase(); +} + +function productImageReasonSuggestsModel(result: RawProductImageRanking | undefined) { + const text = productImageReasonText(result).replace( + /\b(no visible|without|no)\s+(person|model|human|body|torso|leg|arm|head)s?\b/g, + "", + ); + return /\b(model|person|human|wearing|worn|body|torso|leg|arm|head|full[-\s]?body|editorial)\b/.test( + text, + ); +} + +function productImageReasonSuggestsGarmentOnly(result: RawProductImageRanking | undefined) { + return /\b(garment[-\s]?only|product[-\s]?only|standalone|isolated|flat[-\s]?lay|plain background|studio product|no visible (person|model|human))\b/.test( + productImageReasonText(result), + ); +} + +function productImageBucket(result: RawProductImageRanking | undefined): ProductImageBucket { + if (result?.isModelImage || productImageReasonSuggestsModel(result)) return "model_editorial"; + if (result?.isGarmentOnly || productImageReasonSuggestsGarmentOnly(result)) return "garment_only"; + return "unknown"; +} + +function productImageScore(result: RawProductImageRanking | undefined, bucket: ProductImageBucket) { + const baseScore = Math.max(0, Math.min(100, Number(result?.score ?? 20))); + if (bucket === "garment_only") { + return ( + baseScore + + (result?.isFrontFacing ? 40 : 0) - + (result?.containsMultipleGarments ? 45 : 0) + ); + } + if (bucket === "model_editorial") { + return ( + baseScore + + (result?.isFrontFacing ? 10 : 0) - + 120 - + (result?.containsMultipleGarments ? 60 : 0) + ); + } + return baseScore - (result?.containsMultipleGarments ? 35 : 0); +} + +function sortProductImages(items: RankedProductImage[]) { + return [...items].sort((a, b) => b.score - a.score); +} + +function orderProductImageBuckets(items: RankedProductImage[]) { + const garmentOnly = items.filter((item) => item.bucket === "garment_only"); + const modelEditorial = items.filter((item) => item.bucket === "model_editorial"); + const unknown = items.filter((item) => item.bucket === "unknown"); + + if (garmentOnly.length > 0) { + return [ + ...sortProductImages(garmentOnly), + ...sortProductImages(unknown), + ...sortProductImages(modelEditorial), + ]; + } + + return sortProductImages(items); +} + +function logProductImageBuckets(params: { + sourceUrl?: string | null; + items: RankedProductImage[]; +}) { + const buckets: Record = { + garment_only: [], + model_editorial: [], + unknown: [], + }; + for (const item of params.items) { + buckets[item.bucket ?? "unknown"].push(item.url); + } + console.info("[LINK_PRIMARY_BUCKETS]", { + sourceUrl: params.sourceUrl ?? null, + garmentOnlyCount: buckets.garment_only.length, + modelEditorialCount: buckets.model_editorial.length, + unknownCount: buckets.unknown.length, + garmentOnlyUrls: buckets.garment_only, + modelEditorialUrls: buckets.model_editorial, + unknownUrls: buckets.unknown, + }); + console.info("[LINK_IMAGE_BUCKETS]", { + sourceUrl: params.sourceUrl ?? null, + garmentOnlyCount: buckets.garment_only.length, + modelEditorialCount: buckets.model_editorial.length, + unknownCount: buckets.unknown.length, + garmentOnlyUrls: buckets.garment_only, + modelEditorialUrls: buckets.model_editorial, + unknownUrls: buckets.unknown, + }); +} + +export async function rankProductLinkImages(params: { + client: OpenAI; + imageUrls: string[]; + title?: string | null; + description?: string | null; + sourceUrl?: string | null; +}): Promise { + const imageUrls = stableUniqueUrls(params.imageUrls).slice(0, 24); + console.info("[LINK_IMAGE_CANDIDATES]", { + sourceUrl: params.sourceUrl ?? null, + candidateCount: imageUrls.length, + urls: imageUrls, + title: params.title ?? null, + }); + if (imageUrls.length <= 1) { + return imageUrls.map((url) => ({ + url, + score: 50, + reasons: ["only image candidate"], + isGarmentOnly: false, + isModelImage: false, + isFrontFacing: false, + bucket: "unknown", + })); + } + + try { + const response = await params.client.responses.create({ + model: "gpt-5.4-mini", + input: [ + { + role: "developer", + content: + "Rank retail product images for wardrobe item ingestion. Classify product-only images separately from model/editorial images. A garment-only/product-only image has no visible person, model, limbs, head, torso, mannequin, or full outfit; it is usually a standalone garment on a plain studio background or flat lay. Any image with a person wearing the item, even if the target product is visible, is model/editorial. If the title says shirt, shorts, jeans, or another specific garment, a full-body model wearing other garments is not garment-only.", + }, + { + role: "user", + content: [ + { + type: "input_text", + text: + `Product title: ${params.title ?? "unknown"}\n` + + `Description: ${params.description ?? "unknown"}\n` + + "For each image index, score 0-100 for usefulness as the primary wardrobe item image and classify whether it is garment-only/product-only, model/editorial, front-facing/canonical, and whether it contains multiple visible garments. Return JSON only.", + }, + ...imageUrls.flatMap((url, index) => [ + { + type: "input_text" as const, + text: `Image index ${index}: ${url}`, + }, + { + type: "input_image" as const, + image_url: url, + detail: "high" as const, + }, + ]), + ], + }, + ], + text: { + format: { + type: "json_schema", + name: "product_image_ranking", + schema: { + type: "object", + additionalProperties: false, + properties: { + rankings: { + type: "array", + items: { + type: "object", + additionalProperties: false, + properties: { + index: { type: "number" }, + score: { type: "number" }, + isGarmentOnly: { type: "boolean" }, + isModelImage: { type: "boolean" }, + isFrontFacing: { type: "boolean" }, + containsMultipleGarments: { type: "boolean" }, + reasons: { + type: "array", + items: { type: "string" }, + }, + }, + required: [ + "index", + "score", + "isGarmentOnly", + "isModelImage", + "isFrontFacing", + "containsMultipleGarments", + "reasons", + ], + }, + }, + }, + required: ["rankings"], + }, + }, + }, + }); + const parsed = JSON.parse(String(response.output_text || "{}")) as { + rankings?: { + index: number; + score: number; + isGarmentOnly: boolean; + isModelImage: boolean; + isFrontFacing: boolean; + containsMultipleGarments: boolean; + reasons: string[]; + }[]; + }; + const byIndex = new Map((parsed.rankings ?? []).map((entry) => [Math.trunc(entry.index), entry])); + const scored = imageUrls.map((url, index) => { + const result = byIndex.get(index); + const bucket = productImageBucket(result); + const score = productImageScore(result, bucket); + const item = { + url, + score, + reasons: result?.reasons?.slice(0, 4) ?? ["not ranked by model"], + isGarmentOnly: !!result?.isGarmentOnly, + isModelImage: !!result?.isModelImage, + isFrontFacing: !!result?.isFrontFacing, + bucket, + }; + console.info("[LINK_PRIMARY_SCORE]", { + sourceUrl: params.sourceUrl ?? null, + index, + url, + bucket: item.bucket, + baseScore: result?.score ?? null, + score: item.score, + isGarmentOnly: item.isGarmentOnly, + isModelImage: item.isModelImage, + isFrontFacing: item.isFrontFacing, + containsMultipleGarments: !!result?.containsMultipleGarments, + reasons: item.reasons, + }); + console.info("[LINK_IMAGE_SCORE]", { + sourceUrl: params.sourceUrl ?? null, + index, + url, + score: item.score, + isGarmentOnly: item.isGarmentOnly, + isModelImage: item.isModelImage, + isFrontFacing: item.isFrontFacing, + reasons: item.reasons, + }); + return item; + }); + logProductImageBuckets({ sourceUrl: params.sourceUrl, items: scored }); + const ranked = orderProductImageBuckets(scored); + console.info("[LINK_PRIMARY_CHOSEN]", { + sourceUrl: params.sourceUrl ?? null, + primaryImageUrl: ranked[0]?.url ?? null, + bucket: ranked[0]?.bucket ?? null, + score: ranked[0]?.score ?? null, + reasons: ranked[0]?.reasons ?? [], + garmentOnlyAvailable: scored.some((item) => item.bucket === "garment_only"), + }); + console.info("[LINK_IMAGE_PRIMARY]", { + sourceUrl: params.sourceUrl ?? null, + primaryImageUrl: ranked[0]?.url ?? null, + primaryReasons: ranked[0]?.reasons ?? [], + primaryIsGarmentOnly: ranked[0]?.isGarmentOnly ?? false, + }); + console.info("[LINK_IMAGE_SECONDARY]", { + sourceUrl: params.sourceUrl ?? null, + secondaryImageUrls: ranked.slice(1).map((item) => item.url), + }); + return ranked; + } catch (error) { + console.warn("[LINK_IMAGE_SCORE]", "visual ranking failed; using stable URL order", { + sourceUrl: params.sourceUrl ?? null, + error, + }); + const ranked = imageUrls.map((url, index) => ({ + url, + score: imageUrls.length - index, + reasons: ["visual ranking unavailable"], + isGarmentOnly: false, + isModelImage: false, + isFrontFacing: false, + bucket: "unknown" as const, + })); + logProductImageBuckets({ sourceUrl: params.sourceUrl, items: ranked }); + console.info("[LINK_PRIMARY_CHOSEN]", { + sourceUrl: params.sourceUrl ?? null, + primaryImageUrl: ranked[0]?.url ?? null, + bucket: ranked[0]?.bucket ?? null, + score: ranked[0]?.score ?? null, + reasons: ranked[0]?.reasons ?? [], + garmentOnlyAvailable: false, + }); + return ranked; + } +} + +export function productCategoryHintsFromText(title?: string | null, description?: string | null) { + const text = `${title ?? ""} ${description ?? ""}`.toLowerCase(); + if (/\b(shorts?|trousers?|pants?|jeans?|skirt|leggings?)\b/.test(text)) { + return { category: "bottom", subCategory: text.includes("short") ? "shorts" : null }; + } + if (/\b(shirt|t-shirt|tee|polo|sweater|hoodie|blouse|top)\b/.test(text)) { + return { category: "top", subCategory: text.includes("sweater") ? "sweater" : null }; + } + if (/\b(jacket|coat|blazer)\b/.test(text)) return { category: "outerwear", subCategory: null }; + if (/\b(shoe|sneaker|boot|loafer|sandal)\b/.test(text)) return { category: "footwear", subCategory: null }; + if (/\b(dress|jumpsuit|romper)\b/.test(text)) return { category: "one_piece", subCategory: null }; + return { category: null, subCategory: null }; +} + +type ImageCandidateExtraction = { + title?: string | null; + category?: string | null; + subCategory?: string | null; + color?: string | null; + brand?: string | null; + material?: string | null; + fit?: string | null; + pattern?: string | null; + confidence?: number | null; +}; + +function cleanCandidate(value: ImageCandidateExtraction, imageUrls: string[], index: number, batch: boolean): AuraCandidateItem { + return { + candidateId: `image-${Date.now()}-${index}`, + imageUrls, + primaryImageUrl: imageUrls[0] ?? null, + secondaryImageUrls: imageUrls.slice(1), + title: value.title ?? null, + category: value.category ?? null, + subCategory: value.subCategory ?? null, + color: value.color ?? null, + brand: value.brand ?? null, + material: value.material ?? null, + fit: value.fit ?? null, + pattern: value.pattern ?? null, + confidence: typeof value.confidence === "number" ? value.confidence : null, + sourceType: batch ? "batch" : "image", + sourceUrl: null, + status: "awaiting_confirmation", + }; +} + +export async function extractImageCandidates(params: { + client: OpenAI; + imageGroups: string[][]; +}): Promise { + const candidates: AuraCandidateItem[] = []; + const batch = params.imageGroups.length > 1; + + for (let index = 0; index < params.imageGroups.length; index += 1) { + const imageUrls = params.imageGroups[index] ?? []; + if (!imageUrls.length) continue; + const response = await params.client.responses.create({ + model: "gpt-5.4-mini", + input: [ + { + role: "developer", + content: + "Extract concise clothing item preview details from the image(s). Return JSON only. Do not invent brand/material if not visible.", + }, + { + role: "user", + content: [ + { + type: "input_text", + text: + "Return JSON with keys: title, category, subCategory, color, brand, material, fit, pattern, confidence. Use null for unknown values.", + }, + ...imageUrls.map((url) => ({ + type: "input_image" as const, + image_url: url, + detail: "auto" as const, + })), + ], + }, + ], + text: { + format: { + type: "json_schema", + name: "aura_candidate_item", + schema: { + type: "object", + additionalProperties: false, + properties: { + title: { type: ["string", "null"] }, + category: { type: ["string", "null"] }, + subCategory: { type: ["string", "null"] }, + color: { type: ["string", "null"] }, + brand: { type: ["string", "null"] }, + material: { type: ["string", "null"] }, + fit: { type: ["string", "null"] }, + pattern: { type: ["string", "null"] }, + confidence: { type: ["number", "null"] }, + }, + required: [ + "title", + "category", + "subCategory", + "color", + "brand", + "material", + "fit", + "pattern", + "confidence", + ], + }, + }, + }, + }); + let parsed: ImageCandidateExtraction = {}; + try { + parsed = JSON.parse(String(response.output_text || "{}")) as ImageCandidateExtraction; + } catch { + parsed = {}; + } + candidates.push(cleanCandidate(parsed, imageUrls, index, batch)); + } + + return candidates; +} diff --git a/functions/src/shared/auraLinkIntent.ts b/functions/src/shared/auraLinkIntent.ts new file mode 100644 index 0000000..a1016e7 --- /dev/null +++ b/functions/src/shared/auraLinkIntent.ts @@ -0,0 +1,49 @@ +export type AuraLinkIntent = + | "none" + | "analyze_link" + | "add_from_link" + | "add_from_links_batch"; + +export type ExtractedUrl = { + raw: string; + normalized: string; +}; + +const URL_RE = /\bhttps?:\/\/[^\s<>"')\]]+/gi; +const TRAILING_PUNCTUATION_RE = /[.,!?;:]+$/; +const ADD_RE = + /\b(add|save|store|put|upload|log)\b[\s\S]{0,80}\b(closet|wardrobe|item|items|these|this|links?|all)\b|\b(add|save)\s+(this|these|all|item|items|links?)\b|\bput\s+(this|these|all|item|items|links?)\s+in\s+(my\s+)?(closet|wardrobe)\b/i; + +export function extractUrlsFromText(text: string): ExtractedUrl[] { + const matches = String(text ?? "").match(URL_RE) ?? []; + const seen = new Set(); + const urls: ExtractedUrl[] = []; + + for (const match of matches) { + const raw = match.replace(TRAILING_PUNCTUATION_RE, ""); + try { + const parsed = new URL(raw); + if (parsed.protocol !== "http:" && parsed.protocol !== "https:") { + continue; + } + parsed.hash = ""; + const normalized = parsed.toString(); + if (seen.has(normalized)) continue; + seen.add(normalized); + urls.push({ raw, normalized }); + } catch { + continue; + } + } + + return urls; +} + +export function classifyAuraLinkIntent(text: string): AuraLinkIntent { + const urls = extractUrlsFromText(text); + if (!urls.length) return "none"; + if (ADD_RE.test(text)) { + return urls.length > 1 ? "add_from_links_batch" : "add_from_link"; + } + return "analyze_link"; +} diff --git a/functions/src/shared/auraMemory.ts b/functions/src/shared/auraMemory.ts new file mode 100644 index 0000000..72783a8 --- /dev/null +++ b/functions/src/shared/auraMemory.ts @@ -0,0 +1,89 @@ +import {Firestore} from "firebase-admin/firestore"; + +import { + LEARNED_STYLE_MEMORY_DOC_ID, + SESSION_CONTEXT_DOC_ID, + STYLE_PROFILE_DOC_ID, + buildCompactAuraMemoryContext, + buildStyleProfileFromLegacyPreferences, + emptyLearnedStyleMemory, + normalizeAuraSessionContext, + normalizeLearnedStyleMemory, + normalizeStyleProfile, + type AuraSessionContext, + type CompactAuraMemoryContext, + type LearnedStyleMemory, + type StyleProfile, +} from "../../../shared/auraMemory"; + +function userDocRef(db: Firestore, uid: string) { + return db.collection("users").doc(uid); +} + +function profileDocRef(db: Firestore, uid: string, docId: string) { + return userDocRef(db, uid).collection("profile").doc(docId); +} + +function sessionContextDocRef(db: Firestore, uid: string, chatId: string) { + return userDocRef(db, uid).collection("aiChats").doc(chatId) + .collection("sessionContext").doc(SESSION_CONTEXT_DOC_ID); +} + +export async function loadAuraStyleProfile( + db: Firestore, + uid: string +): Promise { + const [styleSnap, userSnap] = await Promise.all([ + profileDocRef(db, uid, STYLE_PROFILE_DOC_ID).get(), + userDocRef(db, uid).get(), + ]); + + if (styleSnap.exists) { + return normalizeStyleProfile(styleSnap.data()); + } + + const userData = userSnap.data() ?? {}; + const legacy = userData.profilePreferences ?? {}; + const profile = buildStyleProfileFromLegacyPreferences(legacy); + return profile; +} + +export async function loadLearnedAuraStyleMemory( + db: Firestore, + uid: string +): Promise { + const snap = await profileDocRef(db, uid, LEARNED_STYLE_MEMORY_DOC_ID).get(); + return snap.exists ? normalizeLearnedStyleMemory(snap.data()) : emptyLearnedStyleMemory(); +} + +export async function loadAuraSessionContext( + db: Firestore, + uid: string, + chatId?: string | null +): Promise { + if (!chatId) return null; + const snap = await sessionContextDocRef(db, uid, chatId).get(); + if (!snap.exists) return null; + const session = normalizeAuraSessionContext(snap.data()); + if (!session) return null; + if (session.expiresAt && session.expiresAt <= Date.now()) return null; + return session; +} + +export async function loadCompactAuraMemoryContext( + db: Firestore, + uid: string, + chatId?: string | null +): Promise { + const [explicitProfile, learnedProfile, session] = await Promise.all([ + loadAuraStyleProfile(db, uid), + loadLearnedAuraStyleMemory(db, uid), + loadAuraSessionContext(db, uid, chatId), + ]); + + return buildCompactAuraMemoryContext({ + explicitProfile, + learnedProfile, + session, + }); +} diff --git a/functions/src/shared/auraPrompt.ts b/functions/src/shared/auraPrompt.ts index f179ee4..775f0b5 100644 --- a/functions/src/shared/auraPrompt.ts +++ b/functions/src/shared/auraPrompt.ts @@ -84,22 +84,42 @@ ${AURA_BASE_IDENTITY} Structured behavior: * Respect weather, occasion, season, color harmony, and item availability. +* Personalize using the wardrobe, explicit style preferences, learned behavior, and current session context when they are present. +* Treat explicit preferences as the strongest signal, learned behavior as secondary, and current-session context as immediate nuance. +* Use personalization naturally and sparingly. Do not recite profile fields or analytics back to the user unless they ask. +* If learned confidence is light, personalize softly and avoid overstating certainty. * Avoid recommending unavailable or in-laundry items. * Prefer realistic, wearable combinations. * For visual looks, build from the closet first and only add missing pieces when there is no reasonable owned option. * Footwear and bottoms should be treated as high-priority closet-first categories. * When several owned shoes could work, pick the best reasonable option instead of inventing a missing ideal. * Clean sneakers, loafers, derby shoes, boots, sandals, and other owned footwear can all be valid if they fit the vibe well enough. +* Never hallucinate owned items. If it is not in the wardrobe context, treat it as suggested. +* Always keep owned pieces and suggested pieces clearly separated. * Suggest at most one swap. * If something is weak, say so cleanly. * If something is missing, mention the gap gracefully and keep helping. * If something works, say it with confidence. * Use conversation history when it matters. Do not answer as if every message is isolated. +* When memory is helpful, weave it in like a premium stylist would: + - "This stays closer to your lane: clean, layered, and easy to wear." + - "I kept this sharper and more mature since that seems closer to what you gravitate toward." + - "This is a slightly bolder take on your usual palette." + - "This still feels like you, just a little more dressed up." +* Vary personalization phrasing. Do not recycle the same sentence shape every time. +* Avoid making every outfit sound like a lesson. Personalization should feel noticed, not explained. +* When you mention why something feels right for the user, prefer a stylist's shorthand over explicit reasoning language. +* If you are generating multiple looks, vary the angle of each one: one can lean cleaner, one sharper, one bolder, one more relaxed. +* Make the personalization feel specific without sounding clinical. * For outfit, styling, occasion, or "what should I wear" requests, prefer returning a visual look object the UI can render. * When you return a visual look, keep the reply shorter and let the card do more of the work. * If look is present, reply should usually be 1 short sentence, with a hard preference for under 18 words. * Do not repeat the card contents in the reply when look is present. * Visual looks should feel like premium "complete the look" styling recommendations, not inventory dumps. +* If the user asks for options, versions, or a range like safe / balanced / bold, prefer returning multiple visual looks instead of a long paragraph. +* For safe / balanced / bold requests, make the three directions meaningfully different in risk level while still feeling like the same person. +* If the user asks for multiple outfits, multiple options, several directions, or a numbered set like "three outfits", you must return structured multi-look output in lookOptions instead of prose-only recommendations. +* For multi-look requests, do not collapse the answer into one look plus generic outfitItems/ownedPieces. The UI needs one full structured look per option. Presentation decision: @@ -118,16 +138,31 @@ Presentation decision: * Set look for outfit-related requests when the user would benefit from a visual recommendation. * In a visual look, use closet pieces where possible and fill missing gaps with suggested pieces. * The look should include a small set of meaningful actions the UI can surface. +* If Aura context says isSparseWardrobe is true: + - You must still generate at least one outfit using the available owned items, even if the wardrobe is tiny. + - Acknowledge the limitation naturally and briefly, never with robotic or defeatist phrasing. + - Include 1-2 upgrade suggestions that would make the outfit system stronger. + - Keep the tone encouraging, like a stylist refining the closet, not criticizing it. + - If you suggest a missing item, make it obvious that it is a suggestion, not an owned piece. + - Good tone example: "This works, but you're missing a layer - a jacket would elevate it instantly." +* If the wardrobe is not sparse and there are no obvious core gaps, keep missingPieces and upgradeSuggestions empty unless they genuinely add value. +* Never overwhelm the user with more than 3 total missingPieces + upgradeSuggestions. Disallowed response style examples: * "Based on the current wardrobe metadata..." +* "Your stored preferences indicate..." +* "Based on your profile data..." +* "The learned memory suggests..." * "I think this could work because..." * "You may want to consider..." * "I am not recommending..." * "This is the most polished pairing in your current closet because..." * "I can't build a complete outfit yet." * "You need bottoms and footwear first." +* "Your profile says..." +* "The data suggests..." +* "This aligns with your stored preferences." Output requirements: @@ -141,16 +176,32 @@ Output requirements: * ownedPieces must list only pieces present in the user's wardrobe. * recommendedAdditions must list only suggested pieces that are not in the wardrobe. * swapSuggestion must be short and direct, and only included when useful. +* missingPieces should be short labels for missing or thin wardrobe areas. +* upgradeSuggestions should be short, human-readable upgrade ideas. +* upgradeSuggestionItems can mirror upgradeSuggestions with optional searchQuery values for future shopping hooks. * look must be null unless this is truly an outfit/look recommendation. +* lookOptions should be empty unless the user clearly asked for multiple directions, multiple versions, or safe / balanced / bold. +* If the user asked for multiple outfits/options/directions, lookOptions must contain those structured looks whenever you can produce them safely. * If look is present: - lookTitle should be short and premium. - vibe should be 1-3 words. - shortExplanation should be 1 sentence. - stylingNote should be 1 short sentence explaining why the look works. + - personalizationLabel should be a very short premium UI chip, 3-7 words, only when it adds value. + - personalizationNote should be a single subtle sentence about why this feels right for the user, not raw reasoning. + - personalizationLabel should read like polished UI copy, not metadata. + - personalizationNote should sound like a stylist aside, not an explanation of memory or logic. + - When confidence is low, keep personalization softer and broader instead of making bold claims. - pieces should usually contain 3-5 entries. - pieces from the closet should use source "closet" and include itemId when available. - suggested pieces should use source "suggested". - if the user owns workable shoes, bottoms, or accessories for this look, prefer them in pieces before adding a suggested substitute. - if the request is closet-first or "use my closet", choose the best workable owned shoe even if it is not perfect. - - actions should contain 2-4 useful action ids. + - actions should contain 3-6 useful action ids and usually include likeLook, notMyVibe, showMoreLikeThis, and lessLikeThis for strong look cards. +* If lookOptions is present: + - return 2-3 looks max. + - for requests like "give me three outfits" or "show me 3 directions", use lookOptions as the primary structured payload. + - safe / balanced / bold is the preferred progression when the user asks for multiple directions. + - keep each look concise, distinct, and action-ready. + - each option should be renderable on its own, with its own pieces, fromCloset, addToComplete, and actions. `; diff --git a/functions/src/shared/buildAuraContext.ts b/functions/src/shared/buildAuraContext.ts index 53dbfe4..2982ace 100644 --- a/functions/src/shared/buildAuraContext.ts +++ b/functions/src/shared/buildAuraContext.ts @@ -1,3 +1,9 @@ +import type {CompactAuraMemoryContext} from "../../../shared/auraMemory"; +import { + detectWardrobeGaps, + type WardrobeCategoryCounts, +} from "./detectWardrobeGaps"; + type WardrobeItem = { id: string; name?: string; @@ -28,6 +34,7 @@ type AuraContextArgs = { } | null; occasion?: string | null; selectedDate?: string | null; + memory?: CompactAuraMemoryContext | null; }; type AuraCategory = @@ -159,7 +166,10 @@ export function buildAuraContext({ weather, occasion, selectedDate, + memory, }: AuraContextArgs) { + const DEBUG_AURA_SPARSE = + process.env.FUNCTIONS_EMULATOR === "true" || process.env.NODE_ENV !== "production"; const excluded = { drafts: [] as Record[], laundry: [] as Record[], @@ -219,6 +229,34 @@ export function buildAuraContext({ wardrobe[category].push(summary); }); + const categoryCounts: WardrobeCategoryCounts = { + tops: wardrobe.tops.length, + outerwear: wardrobe.outerwear.length, + bottoms: wardrobe.bottoms.length, + footwear: wardrobe.footwear.length, + accessories: wardrobe.accessories.length, + }; + const totalItemCount = + categoryCounts.tops + + categoryCounts.outerwear + + categoryCounts.bottoms + + categoryCounts.footwear + + categoryCounts.accessories; + const isSparseWardrobe = totalItemCount < 15; + const wardrobeGaps = detectWardrobeGaps(categoryCounts); + + if (DEBUG_AURA_SPARSE) { + console.log("[AURA_SPARSE_CONTEXT]", { + isSparseWardrobe, + categoryCounts, + detectedGaps: { + missingCore: wardrobeGaps.missingCore.map((gap) => gap.label), + weakAreas: wardrobeGaps.weakAreas.map((gap) => gap.label), + }, + suggestions: wardrobeGaps.suggestions.map((suggestion) => suggestion.label), + }); + } + return { selectedDate: selectedDate ?? null, occasion: occasion ?? null, @@ -227,27 +265,15 @@ export function buildAuraContext({ condition: weather?.condition ?? null, }, wardrobe, - counts: { - tops: wardrobe.tops.length, - outerwear: wardrobe.outerwear.length, - bottoms: wardrobe.bottoms.length, - footwear: wardrobe.footwear.length, - accessories: wardrobe.accessories.length, - }, + counts: categoryCounts, + categoryCounts, + isSparseWardrobe, + wardrobeGaps, inventory: { - total: - wardrobe.tops.length + - wardrobe.outerwear.length + - wardrobe.bottoms.length + - wardrobe.footwear.length + - wardrobe.accessories.length, - hasAnyItems: - wardrobe.tops.length + - wardrobe.outerwear.length + - wardrobe.bottoms.length + - wardrobe.footwear.length + - wardrobe.accessories.length > - 0, + total: totalItemCount, + totalItemCount, + hasAnyItems: totalItemCount > 0, + isSparseWardrobe, missingCoreCategories: [ ...(wardrobe.tops.length ? [] : ["tops"]), ...(wardrobe.bottoms.length ? [] : ["bottoms"]), @@ -268,5 +294,7 @@ export function buildAuraContext({ preferOwnedBottoms: true, suggestMissingPiecesOnlyWhenNoReasonableOwnedOptionExists: true, }, + preferenceContext: memory ?? null, + stylistBrief: memory?.stylistBrief ?? "", }; } diff --git a/functions/src/shared/detectWardrobeGaps.ts b/functions/src/shared/detectWardrobeGaps.ts new file mode 100644 index 0000000..a991316 --- /dev/null +++ b/functions/src/shared/detectWardrobeGaps.ts @@ -0,0 +1,140 @@ +export type WardrobeCategoryCounts = { + tops: number; + bottoms: number; + footwear: number; + outerwear: number; + accessories: number; +}; + +export type WardrobeGapSuggestion = { + label: string; + reason: string; + searchQuery?: string; +}; + +export type WardrobeGap = { + key: string; + label: string; + reason: string; + severity: "critical" | "notice" | "soft"; + searchQuery?: string; +}; + +export type WardrobeGapDetection = { + missingCore: WardrobeGap[]; + weakAreas: WardrobeGap[]; + suggestions: WardrobeGapSuggestion[]; +}; + +function dedupeSuggestions(suggestions: WardrobeGapSuggestion[]) { + const seen = new Set(); + return suggestions.filter((suggestion) => { + const key = suggestion.label.trim().toLowerCase(); + if (!key || seen.has(key)) return false; + seen.add(key); + return true; + }); +} + +export function detectWardrobeGaps( + categoryCounts: WardrobeCategoryCounts +): WardrobeGapDetection { + const missingCore: WardrobeGap[] = []; + const weakAreas: WardrobeGap[] = []; + const suggestions: WardrobeGapSuggestion[] = []; + + if (categoryCounts.tops === 0) { + missingCore.push({ + key: "tops", + label: "Tops", + reason: "No tops means AURA has almost nothing to build around.", + severity: "critical", + searchQuery: "men's essential tops", + }); + } else if (categoryCounts.tops === 1) { + weakAreas.push({ + key: "top-variety", + label: "Top variety", + reason: "Only one top keeps outfit variation tight.", + severity: "notice", + searchQuery: "men's versatile tops", + }); + } + + if (categoryCounts.bottoms === 0) { + missingCore.push({ + key: "bottoms", + label: "Bottoms", + reason: "No bottoms is a hard wardrobe gap for outfit generation.", + severity: "critical", + searchQuery: "men's versatile pants", + }); + } else if (categoryCounts.bottoms === 1) { + weakAreas.push({ + key: "bottom-variety", + label: "Bottom variety", + reason: "One bottom limits how many distinct outfits AURA can build.", + severity: "notice", + searchQuery: "men's everyday pants", + }); + } + + if (categoryCounts.outerwear === 0) { + missingCore.push({ + key: "outerwear", + label: "Outerwear", + reason: "A layer adds polish and makes simple outfits feel more intentional.", + severity: "notice", + searchQuery: "lightweight denim jacket or overshirt", + }); + suggestions.push({ + label: "Lightweight jacket", + reason: "A lightweight jacket would instantly level up your outfits.", + searchQuery: "lightweight denim jacket or overshirt", + }); + } + + if (categoryCounts.footwear === 0) { + missingCore.push({ + key: "footwear", + label: "Shoes", + reason: "Without shoes in the closet, every outfit has to lean on a suggestion.", + severity: "critical", + searchQuery: "versatile men's sneakers", + }); + } else if (categoryCounts.footwear === 1) { + missingCore.push({ + key: "footwear-variety", + label: "Second pair of shoes", + reason: "A second pair opens up far more outfit range.", + severity: "notice", + searchQuery: "white sneakers versatile men's shoes", + }); + suggestions.push({ + label: "Second pair of shoes", + reason: "Adding a second pair of shoes would give you more versatility.", + searchQuery: "white sneakers versatile men's shoes", + }); + } + + if (categoryCounts.accessories === 0) { + weakAreas.push({ + key: "accessories", + label: "Accessories", + reason: "No accessories makes it harder to finish a look cleanly.", + severity: "soft", + searchQuery: "minimal men's watch", + }); + suggestions.push({ + label: "Minimal watch", + reason: "A watch or simple accessory would make your outfits feel more complete.", + searchQuery: "minimal men's watch", + }); + } + + return { + missingCore, + weakAreas, + suggestions: dedupeSuggestions(suggestions).slice(0, 3), + }; +} diff --git a/functions/src/shared/outfitEngine.ts b/functions/src/shared/outfitEngine.ts index 2d5edf2..8417333 100644 --- a/functions/src/shared/outfitEngine.ts +++ b/functions/src/shared/outfitEngine.ts @@ -4,6 +4,7 @@ import { AllowedColor, Category, } from "./wardrobeTaxonomy"; +import type {CompactAuraMemoryContext} from "../../../shared/auraMemory"; export const MODEL = "gpt-4.1-mini"; const ALLOWED_COLOR_SET = new Set(ALLOWED_COLORS); @@ -54,6 +55,7 @@ export type OutfitIntentV1 = { colorsAvoid: AllowedColor[]; avoidLogos: boolean; excludeLaundry: boolean; + requireOuterwear?: boolean; }; export type OutfitChatConstraints = { @@ -95,6 +97,9 @@ export type WardrobeItem = { id: string; category?: string; subCategory?: string; + fit?: string | null; + rise?: string | null; + legShape?: string | null; colors?: string[]; primaryColor?: string; status?: string; @@ -148,6 +153,21 @@ type OutfitCandidate = { itemIds: string[]; }; +type PreferenceBiasContext = { + explicitFavoriteColors: AllowedColor[]; + explicitAvoidColors: AllowedColor[]; + learnedFavoriteColors: AllowedColor[]; + learnedAvoidColors: AllowedColor[]; + explicitFavoriteCategories: string[]; + explicitAvoidCategories: string[]; + learnedFavoriteCategories: string[]; + learnedAvoidCategories: string[]; + preferredFits: string[]; + learnedFits: string[]; + learnedConfidence: number; + experimentationLevel: "low" | "medium" | "high"; +}; + function clamp01(value: unknown, fallback = 0.5): number { const n = Number(value); if (!Number.isFinite(n)) return fallback; @@ -223,19 +243,52 @@ export function inferWarmth(prompt: string): number { return 0.5; } +function wantsOuterwear(prompt: string): boolean { + const normalized = normalizedText(prompt); + if (!normalized) return false; + const outerwearHints = [ + "with jacket", + "with jackets", + "jacket look", + "jacket looks", + "outerwear", + "with outerwear", + "layered", + "layers", + "layer up", + "hoodie", + "blazer", + "coat", + "coats", + "cardigan", + "cardigans", + "overshirt", + "overshirts", + "shacket", + "shackets", + "parka", + "parkas", + "bomber", + "bombers", + ]; + return outerwearHints.some((hint) => normalized.includes(hint)); +} + export function fallbackIntent(prompt: string): OutfitIntentV1 { const normalized = prompt.toLowerCase(); const occasion = ( ["casual", "formal", "gym", "date", "work", "party", "travel"] as const ).find((value) => normalized.includes(value)) ?? "unknown"; const warmthTarget = inferWarmth(prompt); + const needsOuterwear = wantsOuterwear(prompt); return { occasion, formalityTarget: FORMALITY_BY_OCCASION[occasion] ?? 0.5, warmthTarget, needs: ["top", "bottom", "footwear"], - niceToHave: warmthTarget > 0.65 ? ["outerwear"] : [], + niceToHave: + warmthTarget > 0.65 || needsOuterwear ? ["outerwear"] : [], colorsWanted: normalizeColorList( ALLOWED_COLORS.filter((color) => normalized.includes(color)), 2 @@ -243,6 +296,7 @@ export function fallbackIntent(prompt: string): OutfitIntentV1 { colorsAvoid: [], avoidLogos: normalized.includes("no logo") || normalized.includes("avoid logo"), excludeLaundry: true, + requireOuterwear: needsOuterwear, }; } @@ -278,6 +332,11 @@ export function normalizeParsedIntent( value === "outerwear" || value === "accessory" ) : []; + const needsOuterwear = wantsOuterwear(sourceText); + const enrichedNiceToHave: Array<"outerwear" | "accessory"> = + needsOuterwear && !niceToHave.includes("outerwear") + ? [...niceToHave, "outerwear"] + : niceToHave; return { occasion, @@ -287,11 +346,12 @@ export function normalizeParsedIntent( ), warmthTarget: clamp01(parsed.warmthTarget, inferWarmth(sourceText)), needs: needs.length > 0 ? needs : ["top", "bottom", "footwear"], - niceToHave, + niceToHave: enrichedNiceToHave, colorsWanted: normalizeColorList(parsed.colorsWanted, 2), colorsAvoid: normalizeColorList(parsed.colorsAvoid, 2), avoidLogos: !!parsed.avoidLogos, excludeLaundry: parsed.excludeLaundry !== false, + requireOuterwear: needsOuterwear, }; } @@ -319,12 +379,49 @@ function normalizeItemColors(item: WardrobeItem): AllowedColor[] { return out; } +function normalizeCategoryToken(value: unknown): string { + return String(value ?? "") + .trim() + .toLowerCase() + .replace(/[_-]+/g, " ") + .replace(/\s+/g, " "); +} + +function normalizeTokenList(values: unknown, limit: number): string[] { + if (!Array.isArray(values)) return []; + const seen = new Set(); + const next: string[] = []; + for (const value of values) { + const token = normalizeCategoryToken(value); + if (!token || seen.has(token)) continue; + seen.add(token); + next.push(token); + if (next.length >= limit) break; + } + return next; +} + function bucketForItem(item: WardrobeItem): Slot | null { const category = String(item.category ?? "").trim().toLowerCase(); + const joined = normalizedText( + [ + item.category, + item.subCategory, + (item as { type?: string | null }).type, + item.name, + ] + .filter(Boolean) + .join(" "), + ); + if ( + category === Category.OUTERWEAR || + /\b(jacket|coat|outerwear|overshirt|blazer|trench|parka|bomber|shacket|cardigan)\b/.test(joined) + ) { + return "outerwear"; + } if (category === Category.TOP || category === Category.ONE_PIECE) return "top"; if (category === Category.BOTTOM) return "bottom"; if (category === Category.FOOTWEAR || category === "shoes") return "footwear"; - if (category === Category.OUTERWEAR) return "outerwear"; return null; } @@ -376,6 +473,97 @@ function itemHintScore(item: WardrobeItem, hint: string): number { return score; } +function buildPreferenceBiasContext( + memory?: CompactAuraMemoryContext | null +): PreferenceBiasContext { + const explicit = memory?.explicitProfile; + const learned = memory?.learnedProfile; + + return { + explicitFavoriteColors: normalizeColorList(explicit?.favoriteColors ?? [], 3), + explicitAvoidColors: normalizeColorList(explicit?.avoidColors ?? [], 3), + learnedFavoriteColors: + (learned?.confidence ?? 0) >= 0.35 + ? normalizeColorList(learned?.inferredFavoriteColors ?? [], 3) + : [], + learnedAvoidColors: + (learned?.confidence ?? 0) >= 0.35 + ? normalizeColorList(learned?.inferredAvoidColors ?? [], 2) + : [], + explicitFavoriteCategories: normalizeTokenList(explicit?.favoriteCategories ?? [], 4), + explicitAvoidCategories: normalizeTokenList(explicit?.avoidCategories ?? [], 3), + learnedFavoriteCategories: + (learned?.confidence ?? 0) >= 0.45 + ? normalizeTokenList(learned?.inferredFavoriteCategories ?? [], 4) + : [], + learnedAvoidCategories: + (learned?.confidence ?? 0) >= 0.45 + ? normalizeTokenList(learned?.inferredAvoidCategories ?? [], 3) + : [], + preferredFits: normalizeTokenList(explicit?.preferredFits ?? [], 3), + learnedFits: + (learned?.confidence ?? 0) >= 0.45 + ? normalizeTokenList(learned?.inferredFits ?? [], 3) + : [], + learnedConfidence: clamp01(learned?.confidence, 0), + experimentationLevel: explicit?.experimentationLevel ?? "medium", + }; +} + +function itemCategoryTokens(item: WardrobeItem): string[] { + return [ + normalizeCategoryToken(item.category), + normalizeCategoryToken(item.subCategory), + normalizeCategoryToken(bucketForItem(item)), + ].filter(Boolean); +} + +function categoryPreferenceScore( + item: WardrobeItem, + preferenceBias: PreferenceBiasContext +): number { + const tokens = itemCategoryTokens(item); + const learnedWeight = 0.04 + 0.05 * preferenceBias.learnedConfidence; + let score = 0; + if (tokens.some((token) => preferenceBias.explicitFavoriteCategories.includes(token))) score += 0.12; + if (tokens.some((token) => preferenceBias.learnedFavoriteCategories.includes(token))) score += learnedWeight; + if (tokens.some((token) => preferenceBias.explicitAvoidCategories.includes(token))) score -= 0.14; + if (tokens.some((token) => preferenceBias.learnedAvoidCategories.includes(token))) score -= learnedWeight; + return score; +} + +function fitPreferenceScore( + item: WardrobeItem, + preferenceBias: PreferenceBiasContext +): number { + const tokens = [ + normalizeCategoryToken(item.fit), + normalizeCategoryToken(item.rise), + normalizeCategoryToken(item.legShape), + ].filter(Boolean); + let score = 0; + if (tokens.some((token) => preferenceBias.preferredFits.includes(token))) score += 0.09; + if (tokens.some((token) => preferenceBias.learnedFits.includes(token))) { + score += 0.03 + 0.04 * preferenceBias.learnedConfidence; + } + return score; +} + +function experimentationBias( + item: WardrobeItem, + preferenceBias: PreferenceBiasContext +): number { + const colors = normalizeItemColors(item); + const nonNeutralCount = colors.filter((color) => !NEUTRAL_COLORS.has(color)).length; + if (preferenceBias.experimentationLevel === "low") { + return nonNeutralCount > 1 ? -0.08 : 0.03; + } + if (preferenceBias.experimentationLevel === "high") { + return nonNeutralCount > 1 ? 0.06 : nonNeutralCount > 0 ? 0.03 : 0; + } + return nonNeutralCount > 1 ? -0.01 : 0.01; +} + export function resolveItemHints( items: WardrobeItem[], hints: Array<{slot?: Slot | null; itemHint?: string | null}> | undefined @@ -494,13 +682,30 @@ function recencyPenalty(item: WardrobeItem): number { return 0; } -function scoreItem(item: WardrobeItem, intent: OutfitIntentV1): number { +function scoreItem( + item: WardrobeItem, + intent: OutfitIntentV1, + preferenceBias: PreferenceBiasContext +): number { const formalityScore = clamp01(item.formalityScore, 0.5); const warmthScore = clamp01(item.warmthScore, 0.5); const itemColors = normalizeItemColors(item); const logoPenalty = intent.avoidLogos && item.hasLogo ? 0.5 : 0; const missingPenalty = item.formalityScore == null || item.warmthScore == null ? 0.05 : 0; + const explicitColorBias = colorMatchScore( + itemColors, + preferenceBias.explicitFavoriteColors, + preferenceBias.explicitAvoidColors + ); + const learnedColorBias = colorMatchScore( + itemColors, + preferenceBias.learnedFavoriteColors, + preferenceBias.learnedAvoidColors + ); + const categoryBias = categoryPreferenceScore(item, preferenceBias); + const fitBias = fitPreferenceScore(item, preferenceBias); + const experimentationScore = experimentationBias(item, preferenceBias); const score = 0.35 * closeness(formalityScore, intent.formalityTarget) + @@ -509,16 +714,34 @@ function scoreItem(item: WardrobeItem, intent: OutfitIntentV1): number { 0.1 * tagMatchScore(item, intent) - 0.05 * recencyPenalty(item) - logoPenalty - - missingPenalty; + missingPenalty + + 0.18 * explicitColorBias + + 0.12 * learnedColorBias + + categoryBias + + fitBias + + experimentationScore; return score; } -function compatibilityBonus(items: WardrobeItem[]): number { +function compatibilityBonus( + items: WardrobeItem[], + preferenceBias: PreferenceBiasContext +): number { const colors = items.flatMap((item) => normalizeItemColors(item)); if (colors.length === 0) return 0; const unique = new Set(colors); const neutralCount = colors.filter((color) => NEUTRAL_COLORS.has(color)).length; + if (preferenceBias.experimentationLevel === "low") { + if (neutralCount >= 2) return 0.07; + if (unique.size >= 4) return -0.08; + return 0; + } + if (preferenceBias.experimentationLevel === "high") { + if (unique.size >= 3) return 0.04; + if (neutralCount >= 2) return 0.03; + return 0; + } if (neutralCount >= 2) return 0.05; if (unique.size >= 4) return -0.05; return 0; @@ -529,11 +752,15 @@ function buildReason( picks: Array<{slot: Slot; item: WardrobeItem}> ): string { const reasons: string[] = []; + const hasOuterwear = picks.some((pick) => pick.slot === "outerwear"); if (intent.warmthTarget > 0.65) { reasons.push("Warm enough for colder weather"); } else if (intent.warmthTarget < 0.35) { reasons.push("Light enough for warmer weather"); } + if ((intent.requireOuterwear || intent.niceToHave.includes("outerwear")) && hasOuterwear) { + reasons.push("layered with outerwear"); + } const occasionLabel = intent.occasion === "unknown" @@ -561,10 +788,11 @@ function selectTopCandidates( items: WardrobeItem[], slot: Slot, intent: OutfitIntentV1, - limit: number + limit: number, + preferenceBias: PreferenceBiasContext ): ScoredItem[] { return items - .map((item) => ({item, slot, score: scoreItem(item, intent)})) + .map((item) => ({item, slot, score: scoreItem(item, intent, preferenceBias)})) .sort((a, b) => b.score - a.score) .slice(0, limit); } @@ -575,6 +803,7 @@ function assembleOutfits( footwearItems: ScoredItem[], outerwearItems: ScoredItem[], intent: OutfitIntentV1, + preferenceBias: PreferenceBiasContext, count: number, lockedBySlot?: Partial> ): OutfitCandidate[] { @@ -590,79 +819,154 @@ function assembleOutfits( const outerwearCandidates = lockedBySlot?.outerwear ? outerwearItems.filter((item) => item.item.id === lockedBySlot.outerwear?.id).slice(0, 1) : outerwearItems.slice(0, 5); + const shouldIncludeOuterwear = + intent.warmthTarget > 0.65 || intent.niceToHave.includes("outerwear"); + const requiresOuterwear = intent.requireOuterwear === true; + + if (requiresOuterwear && outerwearCandidates.length === 0) { + return []; + } const combos: OutfitCandidate[] = []; for (const top of topCandidates) { for (const bottom of bottomCandidates) { for (const footwear of footwearCandidates) { const base = [top, bottom, footwear]; - let chosen = base; - let bonus = compatibilityBonus(base.map((value) => value.item)); - - if (intent.warmthTarget > 0.65 && outerwearCandidates.length > 0) { - const outerwear = outerwearCandidates.find( - (candidate) => - candidate.item.id !== top.item.id && - candidate.item.id !== bottom.item.id && - candidate.item.id !== footwear.item.id - ); - if (outerwear) { - chosen = [...base, outerwear]; - bonus += 0.03; - } + const outfitOuterwearCandidates = + (shouldIncludeOuterwear || requiresOuterwear) && outerwearCandidates.length > 0 + ? outerwearCandidates.filter( + (candidate) => + candidate.item.id !== top.item.id && + candidate.item.id !== bottom.item.id && + candidate.item.id !== footwear.item.id + ) + : []; + + const variantChoices = outfitOuterwearCandidates.length + ? outfitOuterwearCandidates.map((outerwear) => ({ + chosen: [...base, outerwear], + bonus: intent.niceToHave.includes("outerwear") || requiresOuterwear ? 0.09 : 0.03, + })) + : requiresOuterwear + ? [] + : [{chosen: base, bonus: 0}]; + + for (const variant of variantChoices) { + const itemScores = variant.chosen.map((value) => value.score); + const outfitScore = + itemScores.reduce((sum, value) => sum + value, 0) / itemScores.length + + compatibilityBonus( + variant.chosen.map((value) => value.item), + preferenceBias + ) + + variant.bonus; + const picks = variant.chosen.map((value) => ({ + slot: value.slot, + itemId: value.item.id, + })); + combos.push({ + picks, + score: outfitScore, + reason: buildReason( + intent, + variant.chosen.map((value) => ({slot: value.slot, item: value.item})) + ), + itemIds: picks.map((pick) => pick.itemId), + }); } - - const itemScores = chosen.map((value) => value.score); - const outfitScore = - itemScores.reduce((sum, value) => sum + value, 0) / itemScores.length + bonus; - const picks = chosen.map((value) => ({ - slot: value.slot, - itemId: value.item.id, - })); - combos.push({ - picks, - score: outfitScore, - reason: buildReason( - intent, - chosen.map((value) => ({slot: value.slot, item: value.item})) - ), - itemIds: picks.map((pick) => pick.itemId), - }); } } } - combos.sort((a, b) => b.score - a.score); + const dedupedCombos = Array.from( + new Map(combos.map((combo) => [combo.itemIds.slice().sort().join("|"), combo])).values() + ).sort((a, b) => b.score - a.score); const selected: OutfitCandidate[] = []; const usedTops = new Set(); const usedBottoms = new Set(); const usedFootwear = new Set(); - for (const combo of combos) { + const usedOuterwear = new Set(); + const usedSignatures = new Set(); + + const candidatePool = dedupedCombos + .slice(0, Math.max(count * 6, 18)) + .map((combo) => ({ + combo, + score: combo.score, + randomSeed: Math.random(), + })); + + while (selected.length < count && candidatePool.length > 0) { + const rankedPool = [...candidatePool].sort((a, b) => { + const aCombo = a.combo; + const bCombo = b.combo; + const aTopId = aCombo.picks.find((pick) => pick.slot === "top")?.itemId ?? ""; + const bTopId = bCombo.picks.find((pick) => pick.slot === "top")?.itemId ?? ""; + const aBottomId = aCombo.picks.find((pick) => pick.slot === "bottom")?.itemId ?? ""; + const bBottomId = bCombo.picks.find((pick) => pick.slot === "bottom")?.itemId ?? ""; + const aFootwearId = aCombo.picks.find((pick) => pick.slot === "footwear")?.itemId ?? ""; + const bFootwearId = bCombo.picks.find((pick) => pick.slot === "footwear")?.itemId ?? ""; + const aOuterwearId = aCombo.picks.find((pick) => pick.slot === "outerwear")?.itemId ?? ""; + const bOuterwearId = bCombo.picks.find((pick) => pick.slot === "outerwear")?.itemId ?? ""; + const aAdjusted = + a.score + + (!aTopId || !usedTops.has(aTopId) ? 0.07 : 0) + + (!aBottomId || !usedBottoms.has(aBottomId) ? 0.06 : 0) + + (!aFootwearId || !usedFootwear.has(aFootwearId) ? 0.04 : 0) + + (!aOuterwearId || !usedOuterwear.has(aOuterwearId) ? 0.05 : 0) + + a.randomSeed * 0.035; + const bAdjusted = + b.score + + (!bTopId || !usedTops.has(bTopId) ? 0.07 : 0) + + (!bBottomId || !usedBottoms.has(bBottomId) ? 0.06 : 0) + + (!bFootwearId || !usedFootwear.has(bFootwearId) ? 0.04 : 0) + + (!bOuterwearId || !usedOuterwear.has(bOuterwearId) ? 0.05 : 0) + + b.randomSeed * 0.035; + return bAdjusted - aAdjusted; + }); + + const choice = rankedPool[0]; + const combo = choice.combo; + const signature = combo.itemIds.slice().sort().join("|"); + if (usedSignatures.has(signature)) continue; const topId = combo.picks.find((pick) => pick.slot === "top")?.itemId ?? ""; const bottomId = combo.picks.find((pick) => pick.slot === "bottom")?.itemId ?? ""; const footwearId = combo.picks.find((pick) => pick.slot === "footwear")?.itemId ?? ""; + const outerwearId = combo.picks.find((pick) => pick.slot === "outerwear")?.itemId ?? ""; const canUseFresh = - (!usedTops.has(topId) || selected.length >= combos.length - 1) && - (!usedBottoms.has(bottomId) || selected.length >= combos.length - 1) && - (!usedFootwear.has(footwearId) || selected.length >= combos.length - 1); + (!topId || !usedTops.has(topId) || selected.length >= dedupedCombos.length - 1) && + (!bottomId || !usedBottoms.has(bottomId) || selected.length >= dedupedCombos.length - 1) && + (!footwearId || !usedFootwear.has(footwearId) || selected.length >= dedupedCombos.length - 1) && + (!outerwearId || !usedOuterwear.has(outerwearId) || selected.length >= dedupedCombos.length - 1); if (!canUseFresh && selected.length < count - 1) { + candidatePool.splice( + candidatePool.findIndex((entry) => entry.combo === combo), + 1, + ); continue; } selected.push(combo); + usedSignatures.add(signature); usedTops.add(topId); usedBottoms.add(bottomId); usedFootwear.add(footwearId); - if (selected.length >= count) break; + if (outerwearId) usedOuterwear.add(outerwearId); + candidatePool.splice( + candidatePool.findIndex((entry) => entry.combo === combo), + 1, + ); } if (selected.length < count) { - for (const combo of combos) { - if (selected.find((value) => value.itemIds.join("|") === combo.itemIds.join("|"))) { + for (const combo of dedupedCombos) { + const signature = combo.itemIds.slice().sort().join("|"); + if (usedSignatures.has(signature)) { continue; } selected.push(combo); + usedSignatures.add(signature); if (selected.length >= count) break; } } @@ -754,48 +1058,82 @@ export function filterEligibleItems( }); } -export function generateOutfitCandidates( - allItems: WardrobeItem[], +function filterEligibleItemsRelaxed(items: WardrobeItem[]): WardrobeItem[] { + return items.filter((item) => { + const draftState = String(item.draftState ?? "").trim().toLowerCase(); + if (item.isDraft === true) return false; + if (draftState === "cancelled" || draftState === "failed") return false; + return !!bucketForItem(item); + }); +} + +function slotCountsForItems(items: WardrobeItem[]) { + return { + top: items.filter((item) => bucketForItem(item) === "top").length, + bottom: items.filter((item) => bucketForItem(item) === "bottom").length, + footwear: items.filter((item) => bucketForItem(item) === "footwear").length, + outerwear: items.filter((item) => bucketForItem(item) === "outerwear").length, + }; +} + +function hasRequiredCoreSlots(slotCounts: Record) { + return slotCounts.top > 0 && slotCounts.bottom > 0 && slotCounts.footwear > 0; +} + +function buildCandidatesFromPool( + pool: WardrobeItem[], baseIntent: OutfitIntentV1, - options?: { - numOutfits?: number; + options: { constraints?: OutfitChatConstraints; - preferredSlot?: Slot | null; excludeItemIds?: string[]; + memory?: CompactAuraMemoryContext | null; + numOutfits: number; + preferredSlot?: Slot | null; lockedItemsBySlot?: Partial>; - } -): { - outfits: OutfitCandidate[]; - slotCounts: Record; - eligibleCount: number; - intent: OutfitIntentV1; -} { - const count = clampNumOutfits(options?.numOutfits ?? 3, 3); - const eligible = filterEligibleItems(allItems, baseIntent); - const constrained = applyConstraints(eligible, baseIntent, options?.constraints); - const explicitExclude = new Set(options?.excludeItemIds ?? []); + }, +) { + const memory = options.memory ?? null; + const memoryConstraints: OutfitChatConstraints = { + ...(options.constraints ?? {}), + ...(options.constraints?.occasion ? {} : memory?.session?.currentOccasion ? {occasion: memory.session.currentOccasion} : {}), + ...(Array.isArray(options.constraints?.colorsWanted) && options.constraints?.colorsWanted.length + ? {} + : memory?.explicitProfile?.favoriteColors?.length + ? {colorsWanted: memory.explicitProfile.favoriteColors.slice(0, 2)} + : (memory?.learnedProfile?.confidence ?? 0) >= 0.62 && memory?.learnedProfile?.inferredFavoriteColors?.length + ? {colorsWanted: memory.learnedProfile.inferredFavoriteColors.slice(0, 2)} + : {}), + ...(Array.isArray(options.constraints?.colorsAvoid) && options.constraints?.colorsAvoid.length + ? {} + : memory?.explicitProfile?.avoidColors?.length + ? {colorsAvoid: memory.explicitProfile.avoidColors.slice(0, 2)} + : (memory?.learnedProfile?.confidence ?? 0) >= 0.62 && memory?.learnedProfile?.inferredAvoidColors?.length + ? {colorsAvoid: memory.learnedProfile.inferredAvoidColors.slice(0, 2)} + : {}), + }; + const constrained = applyConstraints(pool, baseIntent, memoryConstraints); + const preferenceBias = buildPreferenceBiasContext(memory); + const explicitExclude = new Set(options.excludeItemIds ?? []); const finalItems = constrained.items.filter((item) => !explicitExclude.has(item.id)); - const topBucket = finalItems.filter((item) => bucketForItem(item) === "top"); const bottomBucket = finalItems.filter((item) => bucketForItem(item) === "bottom"); const footwearBucket = finalItems.filter((item) => bucketForItem(item) === "footwear"); const outerwearBucket = finalItems.filter((item) => bucketForItem(item) === "outerwear"); + const slotCounts = slotCountsForItems(finalItems); - const slotCounts = { - top: topBucket.length, - bottom: bottomBucket.length, - footwear: footwearBucket.length, - outerwear: outerwearBucket.length, - }; - - if (topBucket.length === 0 || bottomBucket.length === 0 || footwearBucket.length === 0) { - return {outfits: [], slotCounts, eligibleCount: finalItems.length, intent: constrained.intent}; + if (!hasRequiredCoreSlots(slotCounts)) { + return { + outfits: [] as OutfitCandidate[], + slotCounts, + eligibleCount: finalItems.length, + intent: constrained.intent, + }; } - const scoredTop = selectTopCandidates(topBucket, "top", constrained.intent, 25); - const scoredBottom = selectTopCandidates(bottomBucket, "bottom", constrained.intent, 25); - const scoredFootwear = selectTopCandidates(footwearBucket, "footwear", constrained.intent, 25); - const scoredOuterwear = selectTopCandidates(outerwearBucket, "outerwear", constrained.intent, 5); + const scoredTop = selectTopCandidates(topBucket, "top", constrained.intent, 25, preferenceBias); + const scoredBottom = selectTopCandidates(bottomBucket, "bottom", constrained.intent, 25, preferenceBias); + const scoredFootwear = selectTopCandidates(footwearBucket, "footwear", constrained.intent, 25, preferenceBias); + const scoredOuterwear = selectTopCandidates(outerwearBucket, "outerwear", constrained.intent, 5, preferenceBias); let outfits = assembleOutfits( scoredTop, @@ -803,11 +1141,12 @@ export function generateOutfitCandidates( scoredFootwear, scoredOuterwear, constrained.intent, - count, - options?.lockedItemsBySlot + preferenceBias, + options.numOutfits, + options.lockedItemsBySlot, ); - if (options?.preferredSlot) { + if (options.preferredSlot) { outfits = outfits.sort((a, b) => { const aHas = a.picks.some((pick) => pick.slot === options.preferredSlot); const bHas = b.picks.some((pick) => pick.slot === options.preferredSlot); @@ -816,7 +1155,78 @@ export function generateOutfitCandidates( }); } - return {outfits, slotCounts, eligibleCount: finalItems.length, intent: constrained.intent}; + return { + outfits, + slotCounts, + eligibleCount: finalItems.length, + intent: constrained.intent, + }; +} + +export function generateOutfitCandidates( + allItems: WardrobeItem[], + baseIntent: OutfitIntentV1, + options?: { + numOutfits?: number; + constraints?: OutfitChatConstraints; + preferredSlot?: Slot | null; + excludeItemIds?: string[]; + lockedItemsBySlot?: Partial>; + memory?: CompactAuraMemoryContext | null; + } +): { + outfits: OutfitCandidate[]; + slotCounts: Record; + eligibleCount: number; + intent: OutfitIntentV1; + fallbackMode?: "relaxed_filters" | "relaxed_filters_no_constraints"; +} { + const count = clampNumOutfits(options?.numOutfits ?? 3, 3); + const eligible = filterEligibleItems(allItems, baseIntent); + const strictResult = buildCandidatesFromPool(eligible, baseIntent, { + constraints: options?.constraints, + excludeItemIds: options?.excludeItemIds, + memory: options?.memory, + numOutfits: count, + preferredSlot: options?.preferredSlot, + lockedItemsBySlot: options?.lockedItemsBySlot, + }); + if (strictResult.outfits.length > 0) { + return strictResult; + } + + const relaxedPool = filterEligibleItemsRelaxed(allItems); + const relaxedResult = buildCandidatesFromPool(relaxedPool, baseIntent, { + constraints: options?.constraints, + excludeItemIds: options?.excludeItemIds, + memory: options?.memory, + numOutfits: count, + preferredSlot: options?.preferredSlot, + lockedItemsBySlot: options?.lockedItemsBySlot, + }); + if (relaxedResult.outfits.length > 0) { + return { + ...relaxedResult, + fallbackMode: "relaxed_filters", + }; + } + + const unconstrainedRelaxedResult = buildCandidatesFromPool(relaxedPool, baseIntent, { + constraints: undefined, + excludeItemIds: options?.excludeItemIds, + memory: options?.memory, + numOutfits: count, + preferredSlot: options?.preferredSlot, + lockedItemsBySlot: options?.lockedItemsBySlot, + }); + if (unconstrainedRelaxedResult.outfits.length > 0) { + return { + ...unconstrainedRelaxedResult, + fallbackMode: "relaxed_filters_no_constraints", + }; + } + + return strictResult; } export function swapOutfitSlot( diff --git a/functions/src/shared/productLinkExtractor.ts b/functions/src/shared/productLinkExtractor.ts new file mode 100644 index 0000000..10366d3 --- /dev/null +++ b/functions/src/shared/productLinkExtractor.ts @@ -0,0 +1,1219 @@ +import { createHash } from "node:crypto"; +import { lookup } from "node:dns/promises"; +import { isIP } from "node:net"; +import { FieldValue, getFirestore } from "firebase-admin/firestore"; +import { logger } from "firebase-functions/v2"; + +export type ProductMetadata = { + sourceUrl: string; + domain: string; + retailer: string; + brand?: string | null; + title?: string | null; + price?: string | null; + currency?: string | null; + color?: string | null; + description?: string | null; + categoryHints?: string[]; + material?: string | null; + sizeHints?: string[]; + sku?: string | null; +}; + +export type ProductExtraction = { + metadata: ProductMetadata; + imageUrls: string[]; + confidence?: number | null; + status?: "ready" | "needs_review"; + partialData?: { + title?: string | null; + imageUrls?: string[]; + }; +}; + +export type ProductExtractionOverride = { + metadata?: Partial; + imageUrls?: string[]; +}; + +type JsonObject = Record; + +type ProductLinkAdapter = { + hostMatches: (host: string) => boolean; + extract?: (params: { + url: URL; + html: string; + metadata: ProductMetadata; + imageUrls: string[]; + }) => Partial; +}; + +const FETCH_TIMEOUT_MS = 9000; +const MAX_HTML_CHARS = 1_500_000; +const USER_AGENT = + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) " + + "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"; + +const adapters: ProductLinkAdapter[] = [ + { + hostMatches: (host) => + host.endsWith("hm.com") || + host.endsWith("zara.com") || + host.endsWith("nike.com"), + }, +]; + +type FetchedProductPage = { + html: string; + finalUrl: URL; +}; + +type AmazonExtractionResult = { + metadata: ProductMetadata; + imageUrls: string[]; + confidence: number; + status: "ready" | "needs_review"; + partialData?: { + title?: string | null; + imageUrls?: string[]; + }; +}; + +export class ProductLinkError extends Error { + constructor( + message: string, + public readonly code: + | "invalid_url" + | "unsafe_url" + | "fetch_failed" + | "no_metadata" + | "no_images" + | "draft_failed", + ) { + super(message); + } +} + +function cleanText(value: unknown, maxLength = 240): string | null { + if (typeof value !== "string" && typeof value !== "number") return null; + const normalized = String(value) + .replace(/<[^>]*>/g, " ") + .replace(/\s+/g, " ") + .trim(); + if (!normalized) return null; + return normalized.slice(0, maxLength); +} + +function cleanList(values: unknown, maxItems = 6): string[] { + if (!Array.isArray(values)) return []; + return values + .map((value) => cleanText(value, 80)) + .filter((value): value is string => !!value) + .slice(0, maxItems); +} + +function decodeHtmlEntities(value: string): string { + return value + .replace(/&/g, "&") + .replace(/"/g, "\"") + .replace(/'/g, "'") + .replace(/</g, "<") + .replace(/>/g, " "); +} + +function extractMeta(html: string, key: string): string | null { + const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const patterns = [ + new RegExp( + `]+property=["']${escaped}["'][^>]+content=["']([^"']+)["'][^>]*>`, + "i", + ), + new RegExp( + `]+name=["']${escaped}["'][^>]+content=["']([^"']+)["'][^>]*>`, + "i", + ), + new RegExp( + `]+content=["']([^"']+)["'][^>]+property=["']${escaped}["'][^>]*>`, + "i", + ), + new RegExp( + `]+content=["']([^"']+)["'][^>]+name=["']${escaped}["'][^>]*>`, + "i", + ), + ]; + for (const pattern of patterns) { + const match = html.match(pattern)?.[1]; + if (match) return cleanText(decodeHtmlEntities(match), 500); + } + return null; +} + +function extractTitle(html: string): string | null { + const match = html.match(/]*>([\s\S]*?)<\/title>/i)?.[1]; + return match ? cleanText(decodeHtmlEntities(match), 180) : null; +} + +function parseJsonLdBlocks(html: string): unknown[] { + const blocks: unknown[] = []; + const scriptRe = + /]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi; + let match: RegExpExecArray | null; + while ((match = scriptRe.exec(html))) { + const body = decodeHtmlEntities(match[1] ?? "").trim(); + if (!body) continue; + try { + blocks.push(JSON.parse(body)); + } catch { + const compact = body.replace(/,\s*}/g, "}").replace(/,\s*]/g, "]"); + try { + blocks.push(JSON.parse(compact)); + } catch { + // Ignore malformed structured data; meta fallback still runs. + } + } + } + return blocks; +} + +function flattenJsonLd(value: unknown): JsonObject[] { + if (!value) return []; + if (Array.isArray(value)) return value.flatMap(flattenJsonLd); + if (typeof value !== "object") return []; + const object = value as JsonObject; + const graph = object["@graph"]; + return [object, ...flattenJsonLd(graph)]; +} + +function isProductNode(node: JsonObject): boolean { + const type = node["@type"]; + const values = Array.isArray(type) ? type : [type]; + return values.some((entry) => String(entry).toLowerCase() === "product"); +} + +function getOffer(node: JsonObject): JsonObject | null { + const offers = node.offers; + if (Array.isArray(offers)) { + return (offers.find((offer) => offer && typeof offer === "object") ?? + null) as JsonObject | null; + } + return offers && typeof offers === "object" ? (offers as JsonObject) : null; +} + +function getBrand(node: JsonObject): string | null { + const brand = node.brand; + if (typeof brand === "object" && brand) { + return cleanText((brand as JsonObject).name, 120); + } + return cleanText(brand, 120); +} + +function extractJsonLdProduct(html: string): Partial { + const nodes = parseJsonLdBlocks(html).flatMap(flattenJsonLd); + const product = nodes.find(isProductNode); + if (!product) return {}; + const offer = getOffer(product); + return { + brand: getBrand(product), + title: cleanText(product.name, 180), + description: cleanText(product.description, 700), + price: cleanText(offer?.price ?? product.price, 60), + currency: cleanText(offer?.priceCurrency ?? product.priceCurrency, 12), + color: cleanText(product.color, 80), + categoryHints: cleanList( + [ + product.category, + product.audience, + product.additionalType, + product.itemCondition, + ].filter(Boolean), + ), + material: cleanText(product.material, 160), + sizeHints: cleanList(product.size), + sku: cleanText(product.sku ?? product.mpn ?? product.productID, 120), + }; +} + +function normalizeUrl(baseUrl: URL, value: string): string | null { + const cleaned = decodeHtmlEntities(value).trim(); + if (!cleaned || cleaned.startsWith("data:")) return null; + try { + const parsed = new URL(cleaned, baseUrl); + if (parsed.protocol !== "http:" && parsed.protocol !== "https:") { + return null; + } + parsed.hash = ""; + return parsed.toString(); + } catch { + return null; + } +} + +function scoreImageUrl(url: string): number { + const lower = url.toLowerCase(); + let score = 0; + if (/\.(jpe?g|png|webp)(\?|$)/i.test(lower)) score += 3; + if (/(product|pdp|gallery|image|photo|model|main)/i.test(lower)) score += 4; + if (/(clean|cutout|transparent|isolated|packshot)/i.test(lower)) score += 6; + if (/(screenshot|screen[-_ ]?shot|share|social|swatch|color|variant|thumb|thumbnail|detail|icon|sprite|logo|banner|header|footer|ui|nav)/i.test(lower)) { + score -= 10; + } + if (/(logo|icon|sprite|favicon|placeholder|badge|payment|loader)/i.test(lower)) { + score -= 12; + } + const dims = [...lower.matchAll(/(?:_|-|\/)(\d{3,4})(?:x|_|-)(\d{3,4})/g)]; + for (const dim of dims) { + score += Math.min(6, (Number(dim[1]) + Number(dim[2])) / 500); + } + return score; +} + +function dedupeStableImageUrls(urls: string[]): string[] { + const seen = new Set(); + return urls.filter((url) => { + if (/\s/.test(url)) return false; + const key = url.replace(/([?&])(imwidth|width|height|w|h)=\d+/gi, "$1").toLowerCase(); + if (seen.has(key)) return false; + seen.add(key); + return scoreImageUrl(url) >= -2; + }); +} + +function isHmProductUrl(url: URL) { + const host = url.hostname.toLowerCase(); + return ( + (host === "hm.com" || host.endsWith(".hm.com")) && + /\/productpage\.\d+\.html$/i.test(url.pathname) + ); +} + +function isNikeProductUrl(url: URL) { + return url.hostname.toLowerCase().endsWith("nike.com"); +} + +export function isAmazonProductUrl(url: URL) { + const host = url.hostname.toLowerCase(); + return host.includes("amazon."); +} + +function nikeStyleColorFromUrl(url: URL) { + return url.pathname.match(/\/([A-Z0-9]{6,}-\d{3})(?:[/?]|$)/i)?.[1]?.toUpperCase() ?? null; +} + +function hmArticleIdFromUrl(url: URL) { + return url.pathname.match(/\/productpage\.(\d+)\.html$/i)?.[1] ?? null; +} + +function imageValuesFromJsonLd(value: unknown, baseUrl: URL) { + const values = Array.isArray(value) ? value : [value]; + return values + .flatMap((entry) => { + if (typeof entry === "object" && entry) { + const object = entry as JsonObject; + return [object.url, object.contentUrl]; + } + return [entry]; + }) + .map((entry) => (typeof entry === "string" ? normalizeUrl(baseUrl, entry) : null)) + .filter((entry): entry is string => !!entry); +} + +function productNodeMatchesArticle(product: JsonObject, articleId: string) { + const offer = getOffer(product); + const candidates = [ + product.sku, + product.mpn, + product.productID, + product.productId, + product.url, + offer?.url, + ].map((value) => String(value ?? "")); + return candidates.some((value) => value.includes(articleId)); +} + +function extractHmScopedProductImages(html: string, baseUrl: URL): string[] | null { + if (!isHmProductUrl(baseUrl)) return null; + const articleId = hmArticleIdFromUrl(baseUrl); + const products = parseJsonLdBlocks(html).flatMap(flattenJsonLd).filter(isProductNode); + const scopedProduct = articleId + ? products.find((product) => productNodeMatchesArticle(product, articleId)) + : products[0]; + const rawImages = scopedProduct ? imageValuesFromJsonLd(scopedProduct.image, baseUrl) : []; + const scopedImages = dedupeStableImageUrls(rawImages).slice(0, 8); + logger.info("[LINK_PRODUCT_SCOPE]", { + sourceUrl: baseUrl.toString(), + retailer: "hm", + articleId, + productNodeCount: products.length, + matchedSku: scopedProduct ? cleanText(scopedProduct.sku, 120) : null, + matchedTitle: scopedProduct ? cleanText(scopedProduct.name, 180) : null, + scopedImageCount: scopedImages.length, + }); + logger.info("[LINK_IMAGE_CANDIDATES_SCOPED]", { + sourceUrl: baseUrl.toString(), + retailer: "hm", + articleId, + candidateCount: scopedImages.length, + urls: scopedImages, + }); + return scopedImages.length ? scopedImages : null; +} + +function extractJsonLdImages(html: string, baseUrl: URL): string[] { + const nodes = parseJsonLdBlocks(html).flatMap(flattenJsonLd); + const product = nodes.find(isProductNode); + if (!product) return []; + return imageValuesFromJsonLd(product.image, baseUrl); +} + +function extractMarkupImages(html: string, baseUrl: URL): string[] { + const out: string[] = []; + const imageRe = + /<(?:img|source)[^>]+(?:src|data-src|data-original|data-zoom-image|srcset)=["']([^"']+)["'][^>]*>/gi; + let match: RegExpExecArray | null; + while ((match = imageRe.exec(html))) { + const attr = match[1] ?? ""; + const candidates = attr + .split(",") + .map((part) => part.trim().split(/\s+/)[0]) + .filter(Boolean); + for (const candidate of candidates) { + const normalized = normalizeUrl(baseUrl, candidate); + if (normalized) out.push(normalized); + } + } + + const quotedUrlRe = + /["'](https?:\/\/[^\s"']+\.(?:jpg|jpeg|png|webp)(?:\?[^\s"']*)?)["']/gi; + while ((match = quotedUrlRe.exec(html))) { + const normalized = normalizeUrl(baseUrl, match[1] ?? ""); + if (normalized) out.push(normalized); + } + return out; +} + +function parseNextDataPageProps(html: string): JsonObject | null { + const match = html.match( + / + + +
+

Light blue/Kodak Loose Fit Printed football shirt

+
Sizes XS S M L XL
+
Care instructions: Machine wash cold.
+
+ + + `, + expected: { + brand: "H&M", + title: "Light blue loose striped football shirt", + graphicText: "Kodak", + color: "Light blue", + fit: "loose", + pattern: "striped", + material: "cotton", + priceAmount: 19.99, + priceCurrency: "USD", + }, +}; + +export function runHmKodakProductFixture() { + const metadata = extractProductMetadataFromHtml(hmKodakProductFixture.url, hmKodakProductFixture.html); + return { + metadata, + passed: + metadata.brand === hmKodakProductFixture.expected.brand && + metadata.title === hmKodakProductFixture.expected.title && + !metadata.title?.includes("/Kodak") && + metadata.graphicText === hmKodakProductFixture.expected.graphicText && + metadata.material === hmKodakProductFixture.expected.material && + metadata.priceAmount === hmKodakProductFixture.expected.priceAmount, + }; +} diff --git a/functions/src/shared/productLinkExtractor.ts b/functions/src/shared/productLinkExtractor.ts index 49a73b0..9402760 100644 --- a/functions/src/shared/productLinkExtractor.ts +++ b/functions/src/shared/productLinkExtractor.ts @@ -12,14 +12,37 @@ export type ProductMetadata = { sourceUrl: string; domain: string; retailer: string; + merchantBrand?: string | null; brand?: string | null; + brandSource?: "json_ld" | "merchant" | "site_name" | "meta" | "title" | null; title?: string | null; price?: string | null; currency?: string | null; + priceAmount?: number | null; + priceCurrency?: string | null; + priceDisplay?: string | null; + salePrice?: number | null; + originalPrice?: number | null; + priceExtractionSource?: "json_ld" | "meta" | "visible_text" | null; color?: string | null; + displayColor?: string | null; + displayColors?: string[] | null; description?: string | null; + productDescription?: string | null; categoryHints?: string[]; material?: string | null; + materials?: string[]; + fit?: string | null; + sleeveLength?: string | null; + collar?: string | null; + length?: string | null; + pattern?: string | null; + sizeOptions?: string[]; + availableSizes?: string[]; + careInstructions?: string[]; + graphicText?: string | null; + motif?: string | null; + collaborationName?: string | null; sizeHints?: string[]; sku?: string | null; }; @@ -27,6 +50,8 @@ export type ProductMetadata = { export type ProductExtraction = { metadata: ProductMetadata; imageUrls: string[]; + imageExtractionSource?: ProductImageExtractionSource | null; + imageCandidateCount?: number | null; confidence?: number | null; status?: "ready" | "needs_review"; partialData?: { @@ -57,6 +82,26 @@ const MAX_HTML_CHARS = 1_500_000; const USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) " + "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"; +export const BLOCKED_STORE_MESSAGE = "This store blocked automatic reading. Paste another link or add from screenshot/photo."; +const BLOCKED_STORE_SUBTEXT = "You can try again, paste another link, or add the item from a screenshot."; +const DEBUG_PRODUCT_LINK_LOGS = + process.env.DEBUG_AURA_CANDIDATE_LOGS === "1" || + process.env.DEBUG_AURA_CANDIDATE_LOGS === "true" || + process.env.AURA_DEBUG === "1" || + process.env.AURA_DEBUG === "true"; + +export type ProductImageExtractionSource = + | "json_ld" + | "og_image" + | "twitter" + | "html_image" + | "fallback"; + +type ProductImageExtraction = { + urls: string[]; + source: ProductImageExtractionSource | null; + candidateCount: number; +}; const adapters: ProductLinkAdapter[] = [ { @@ -90,14 +135,22 @@ export class ProductLinkError extends Error { | "invalid_url" | "unsafe_url" | "fetch_failed" + | "blocked_store" | "no_metadata" | "no_images" | "draft_failed", + public readonly details?: Record, ) { super(message); } } +function debugProductLinkInfo(message: string, data: Record) { + if (DEBUG_PRODUCT_LINK_LOGS) { + logger.info(message, data); + } +} + function cleanText(value: unknown, maxLength = 240): string | null { if (typeof value !== "string" && typeof value !== "number") return null; const normalized = String(value) @@ -116,6 +169,212 @@ function cleanList(values: unknown, maxItems = 6): string[] { .slice(0, maxItems); } +const RETAILER_BRAND_BY_HOST: Array<[RegExp, string]> = [ + [/(^|\.)hm\.com$/i, "H&M"], + [/(^|\.)zara\.com$/i, "Zara"], + [/(^|\.)uniqlo\.com$/i, "Uniqlo"], + [/(^|\.)nike\.com$/i, "Nike"], + [/(^|\.)adidas\.com$/i, "Adidas"], +]; + +const LICENSED_GRAPHIC_TERMS = [ + "kodak", + "barbie", + "disney", + "ferrari", + "proshots", + "camera club", + "nasa", + "warner bros", + "marvel", + "dc comics", + "star wars", + "pokemon", + "hello kitty", + "snoopy", + "peanuts", + "coca-cola", + "coca cola", +]; + +const MATERIAL_ALIASES: Array<[RegExp, string]> = [ + [/\bcotton\b/i, "cotton"], + [/\bpolyester\b/i, "polyester"], + [/\belastane\b|\bspandex\b|\blycra\b/i, "elastane"], + [/\bviscose\b|\brayon\b/i, "viscose"], + [/\blinen\b/i, "linen"], + [/\bleather\b|\bsuede\b/i, "leather"], + [/\bwool\b|\bmerino\b|\bcashmere\b/i, "wool"], + [/\bnylon\b|\bpolyamide\b/i, "nylon"], + [/\bacrylic\b/i, "acrylic"], + [/\bmodal\b/i, "modal"], + [/\blyocell\b|\btencel\b/i, "lyocell"], + [/\bsilk\b/i, "silk"], + [/\bdenim\b/i, "denim"], +]; + +function normalizedHost(host: string) { + return host.toLowerCase().replace(/^www\d*\./, ""); +} + +function normalizedDomain(host: string) { + return normalizedHost(host); +} + +function merchantBrandFromUrl(url: URL): string | null { + const host = url.hostname.toLowerCase(); + for (const [pattern, brand] of RETAILER_BRAND_BY_HOST) { + if (pattern.test(host)) return brand; + } + return null; +} + +function merchantLabelFromUrl(url: URL) { + const mapped = merchantBrandFromUrl(url); + if (mapped) return mapped; + const domain = normalizedDomain(url.hostname); + const first = domain.split(".")[0] ?? ""; + return first ? first.charAt(0).toUpperCase() + first.slice(1) : domain; +} + +function sameBrand(a?: string | null, b?: string | null) { + const normalize = (value?: string | null) => String(value ?? "").replace(/[^a-z0-9]/gi, "").toLowerCase(); + const left = normalize(a); + const right = normalize(b); + return !!left && !!right && left === right; +} + +function isLicensedGraphicText(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (!text) return false; + return LICENSED_GRAPHIC_TERMS.some((term) => new RegExp(`\\b${term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i").test(text)); +} + +function licensedGraphicFromText(...values: Array) { + const text = values.filter(Boolean).join(" ").toLowerCase(); + for (const term of LICENSED_GRAPHIC_TERMS) { + if (new RegExp(`\\b${term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i").test(text)) { + return term + .split(" ") + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" "); + } + } + return null; +} + +function reliableJsonLdBrand(url: URL, brand?: string | null) { + const cleaned = cleanText(brand, 120); + if (!cleaned) return null; + if (isHmProductUrl(url)) { + return sameBrand(cleaned, "H&M") ? "H&M" : null; + } + if (isLicensedGraphicText(cleaned)) return null; + return cleaned; +} + +type ExtractedProductPrice = { + amount: number; + currency: string | null; + display: string; + source: "json_ld" | "meta" | "visible_text"; +}; + +const CURRENCY_SYMBOLS: Record = { + "$": "USD", + "US$": "USD", + "CA$": "CAD", + "C$": "CAD", + "AU$": "AUD", + "A$": "AUD", + "₹": "INR", + "€": "EUR", + "£": "GBP", + "د.إ": "AED", +}; + +const ISO_CURRENCY_ALIASES: Record = { + USD: "USD", + INR: "INR", + EUR: "EUR", + GBP: "GBP", + CAD: "CAD", + AUD: "AUD", + AED: "AED", +}; + +function normalizeCurrencyCode(value: unknown): string | null { + const raw = cleanText(value, 24); + if (!raw) return null; + const symbol = CURRENCY_SYMBOLS[raw] ?? CURRENCY_SYMBOLS[raw.toUpperCase()]; + if (symbol) return symbol; + const normalized = raw.replace(/[^a-z]/gi, "").toUpperCase(); + if (ISO_CURRENCY_ALIASES[normalized]) return ISO_CURRENCY_ALIASES[normalized]; + return /^[A-Z]{3}$/.test(normalized) ? normalized : null; +} + +function currencyFromPriceText(text: string): string | null { + const compact = text.replace(/\s+/g, " ").trim(); + const upper = compact.toUpperCase(); + for (const [symbol, currency] of Object.entries(CURRENCY_SYMBOLS).sort((a, b) => b[0].length - a[0].length)) { + if (compact.includes(symbol)) return currency; + } + const isoMatch = upper.match(/\b(USD|INR|EUR|GBP|CAD|AUD|AED)\b/); + if (isoMatch?.[1]) return isoMatch[1]; + if (/\bRS\.?\s*\d/i.test(compact)) return "INR"; + return null; +} + +function parsePriceAmount(value: unknown): number | null { + if (typeof value === "number") { + return Number.isFinite(value) && value > 0 ? Math.round(value * 100) / 100 : null; + } + const text = cleanText(value, 120); + if (!text) return null; + const match = text.match(/\d[\d,.]*/); + if (!match) return null; + let numeric = match[0]; + const lastComma = numeric.lastIndexOf(","); + const lastDot = numeric.lastIndexOf("."); + if (lastComma >= 0 && lastDot >= 0) { + numeric = + lastComma > lastDot + ? numeric.replace(/\./g, "").replace(",", ".") + : numeric.replace(/,/g, ""); + } else if (lastComma >= 0) { + const decimalDigits = numeric.length - lastComma - 1; + numeric = decimalDigits === 2 ? numeric.replace(",", ".") : numeric.replace(/,/g, ""); + } + numeric = numeric.replace(/[^0-9.]/g, ""); + const amount = Number(numeric); + if (!Number.isFinite(amount) || amount <= 0 || amount > 1_000_000) return null; + return Math.round(amount * 100) / 100; +} + +function normalizePriceCandidate(params: { + amount: unknown; + currency?: unknown; + source: ExtractedProductPrice["source"]; + display?: string | null; +}): ExtractedProductPrice | null { + const amount = parsePriceAmount(params.amount); + if (amount == null) return null; + const amountText = cleanText(params.amount, 120) ?? String(amount); + const currency = + normalizeCurrencyCode(params.currency) ?? + currencyFromPriceText(amountText) ?? + null; + const display = + cleanText(params.display, 120) ?? + (currencyFromPriceText(amountText) ? amountText : currency ? `${currency} ${amountText}` : amountText); + return { + amount, + currency, + display, + source: params.source, + }; +} + function decodeHtmlEntities(value: string): string { return value .replace(/&/g, "&") @@ -203,6 +462,51 @@ function getOffer(node: JsonObject): JsonObject | null { return offers && typeof offers === "object" ? (offers as JsonObject) : null; } +function getOfferCandidates(node: JsonObject): JsonObject[] { + const offers = node.offers; + const values = Array.isArray(offers) ? offers : [offers]; + return values + .map((offer) => (offer && typeof offer === "object" ? (offer as JsonObject) : null)) + .filter((offer): offer is JsonObject => !!offer); +} + +function extractPriceFromJsonLdProduct(product: JsonObject): ExtractedProductPrice | null { + const offers = getOfferCandidates(product); + const offerCandidates = offers.length ? offers : [product]; + for (const offer of offerCandidates) { + const currency = offer.priceCurrency ?? product.priceCurrency; + const direct = normalizePriceCandidate({ + amount: offer.price ?? product.price, + currency, + source: "json_ld", + }); + if (direct) return direct; + + const lowPrice = normalizePriceCandidate({ + amount: offer.lowPrice, + currency, + source: "json_ld", + display: + offer.lowPrice != null && offer.highPrice != null + ? `${cleanText(offer.lowPrice, 40) ?? ""}-${cleanText(offer.highPrice, 40) ?? ""}` + : null, + }); + if (lowPrice) return lowPrice; + + const highPrice = normalizePriceCandidate({ + amount: offer.highPrice, + currency, + source: "json_ld", + }); + if (highPrice) return highPrice; + } + return normalizePriceCandidate({ + amount: product.price, + currency: product.priceCurrency, + source: "json_ld", + }); +} + function getBrand(node: JsonObject): string | null { const brand = node.brand; if (typeof brand === "object" && brand) { @@ -216,13 +520,34 @@ function extractJsonLdProduct(html: string): Partial { const product = nodes.find(isProductNode); if (!product) return {}; const offer = getOffer(product); + const productPrice = extractPriceFromJsonLdProduct(product); + const additional = additionalPropertiesFromJsonLd(product); + const materialValues = normalizeMaterials([ + cleanText(product.material, 240), + propertyValueFromAdditionalProperties(additional, ["material", "composition", "fabric"]), + ]); + const sizeOptions = extractSizesFromValues([ + product.size, + propertyValueFromAdditionalProperties(additional, ["size", "available size", "sizes"]), + ]); + const careInstructions = cleanList([ + product.careInstructions, + propertyValueFromAdditionalProperties(additional, ["care", "care instructions", "washing instructions"]), + ], 6); return { brand: getBrand(product), title: cleanText(product.name, 180), description: cleanText(product.description, 700), - price: cleanText(offer?.price ?? product.price, 60), - currency: cleanText(offer?.priceCurrency ?? product.priceCurrency, 12), + productDescription: cleanText(product.description, 700), + price: productPrice?.display ?? cleanText(offer?.price ?? product.price, 60), + currency: productPrice?.currency ?? cleanText(offer?.priceCurrency ?? product.priceCurrency, 12), + priceAmount: productPrice?.amount ?? null, + priceCurrency: productPrice?.currency ?? null, + priceDisplay: productPrice?.display ?? null, + priceExtractionSource: productPrice?.source ?? null, color: cleanText(product.color, 80), + displayColor: cleanText(product.color, 80), + displayColors: cleanList(Array.isArray(product.color) ? product.color : [product.color], 6), categoryHints: cleanList( [ product.category, @@ -231,12 +556,497 @@ function extractJsonLdProduct(html: string): Partial { product.itemCondition, ].filter(Boolean), ), - material: cleanText(product.material, 160), - sizeHints: cleanList(product.size), + material: materialValues[0] ?? cleanText(product.material, 160), + materials: materialValues, + fit: normalizeFit(propertyValueFromAdditionalProperties(additional, ["fit"])), + sleeveLength: normalizeSleeveLength(propertyValueFromAdditionalProperties(additional, ["sleeve", "sleeve length"])), + collar: normalizeCollar(propertyValueFromAdditionalProperties(additional, ["collar", "neckline"])), + length: normalizeLength(propertyValueFromAdditionalProperties(additional, ["length"])), + pattern: normalizePattern(propertyValueFromAdditionalProperties(additional, ["pattern", "print"])), + sizeHints: sizeOptions, + sizeOptions, + availableSizes: sizeOptions, + careInstructions, sku: cleanText(product.sku ?? product.mpn ?? product.productID, 120), }; } +function parseJsonPayload(text: string): unknown | null { + const trimmed = text.trim(); + if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return null; + try { + return JSON.parse(trimmed); + } catch { + return null; + } +} + +function flattenObjects(value: unknown): JsonObject[] { + if (!value || typeof value !== "object") return []; + if (Array.isArray(value)) return value.flatMap(flattenObjects); + const object = value as JsonObject; + return [ + object, + ...Object.values(object).flatMap((entry) => flattenObjects(entry)), + ]; +} + +function additionalPropertiesFromJsonLd(product: JsonObject): JsonObject[] { + const values = [ + product.additionalProperty, + product.additionalProperties, + product.properties, + ]; + return values.flatMap((value) => asObjectArrayLoose(value)); +} + +function asObjectArrayLoose(value: unknown): JsonObject[] { + if (Array.isArray(value)) { + return value + .map((entry) => (entry && typeof entry === "object" ? (entry as JsonObject) : null)) + .filter((entry): entry is JsonObject => !!entry); + } + return value && typeof value === "object" ? [value as JsonObject] : []; +} + +function propertyValueFromAdditionalProperties(properties: JsonObject[], names: string[]) { + const normalizedNames = names.map((name) => name.toLowerCase()); + for (const property of properties) { + const name = cleanText(property.name ?? property.propertyID ?? property.label, 120)?.toLowerCase(); + if (!name) continue; + if (!normalizedNames.some((candidate) => name.includes(candidate))) continue; + const value = cleanText(property.value ?? property.valueReference ?? property.description, 240); + if (value) return value; + } + return null; +} + +function firstStringFromKeys(object: JsonObject, keys: string[], maxLength = 220) { + for (const key of keys) { + const value = object[key]; + const text = cleanText(value, maxLength); + if (text) return text; + } + return null; +} + +function objectContainsText(object: JsonObject, needle: string) { + if (!needle) return false; + return Object.values(object).some((value) => String(value ?? "").includes(needle)); +} + +function extractHmJsonMetadata(url: URL, html: string): Partial { + if (!isHmProductUrl(url)) return {}; + const parsed = parseJsonPayload(html); + if (!parsed) return {}; + const articleId = hmArticleIdFromUrl(url); + const objects = flattenObjects(parsed); + const candidates = [ + ...objects.filter((object) => !!articleId && objectContainsText(object, articleId)), + ...objects, + ]; + const selected = candidates.find((object) => + firstStringFromKeys(object, ["productName", "name", "title", "formattedName"]) || + firstStringFromKeys(object, ["articleCode", "sku", "code", "id"]), + ); + if (!selected) return {}; + const flattenedText = JSON.stringify(selected); + const materialValues = normalizeMaterials([ + firstStringFromKeys(selected, ["material", "composition", "materials", "compositionText"], 500), + flattenedText, + ]); + const sizes = extractSizesFromValues([ + selected.sizes, + selected.availableSizes, + selected.variants, + flattenedText, + ]); + const rawTitle = firstStringFromKeys(selected, ["productName", "name", "title", "formattedName"], 180); + const rawDescription = firstStringFromKeys(selected, ["description", "productDescription", "shortDescription"], 700); + const rawColor = firstStringFromKeys(selected, ["colorName", "colourName", "color", "colour"], 80); + const hints = extractAttributeHintsFromText(`${rawTitle ?? ""} ${rawDescription ?? ""} ${flattenedText}`); + return { + title: rawTitle, + brand: firstStringFromKeys(selected, ["brandName", "brand"], 120) ?? "H&M", + color: rawColor, + displayColor: rawColor, + displayColors: rawColor ? [rawColor] : [], + description: rawDescription, + productDescription: rawDescription, + material: materialValues[0] ?? hints.material ?? null, + materials: materialValues.length ? materialValues : hints.materials, + fit: hints.fit, + sleeveLength: hints.sleeveLength, + collar: hints.collar, + length: hints.length, + pattern: hints.pattern, + sizeHints: sizes.length ? sizes : hints.sizeHints, + sizeOptions: sizes.length ? sizes : hints.sizeOptions, + availableSizes: sizes.length ? sizes : hints.availableSizes, + careInstructions: hints.careInstructions, + sku: firstStringFromKeys(selected, ["articleCode", "sku", "code", "id"], 120) ?? articleId, + }; +} + +function extractJsonLdPrice(html: string): ExtractedProductPrice | null { + const nodes = parseJsonLdBlocks(html).flatMap(flattenJsonLd); + for (const product of nodes.filter(isProductNode)) { + const price = extractPriceFromJsonLdProduct(product); + if (price) return price; + } + return null; +} + +function extractMetaPrice(html: string): ExtractedProductPrice | null { + const amount = + extractMeta(html, "product:price:amount") ?? + extractMeta(html, "og:price:amount"); + if (!amount) return null; + return normalizePriceCandidate({ + amount, + currency: + extractMeta(html, "product:price:currency") ?? + extractMeta(html, "og:price:currency"), + source: "meta", + }); +} + +function extractMetaPriceByKeys(html: string, amountKeys: string[], currencyKeys: string[]): ExtractedProductPrice | null { + const amount = amountKeys.map((key) => extractMeta(html, key)).find(Boolean); + if (!amount) return null; + return normalizePriceCandidate({ + amount, + currency: currencyKeys.map((key) => extractMeta(html, key)).find(Boolean), + source: "meta", + }); +} + +function stripVisibleText(html: string): string { + return decodeHtmlEntities( + html + .replace(//gi, " ") + .replace(//gi, " ") + .replace(//gi, " ") + .replace(//gi, " ") + .replace(/<(?:header|footer|nav|aside)[\s\S]*?<\/(?:header|footer|nav|aside)>/gi, " ") + .replace(/<[^>]+>/g, " "), + ) + .replace(/\s+/g, " ") + .trim(); +} + +function extractOriginalPriceFromVisibleText(html: string, currentAmount?: number | null): ExtractedProductPrice | null { + const text = stripVisibleText(html).slice(0, 80_000); + const match = text.match(/\b(?:regular|original|was|list)\s+price\s*[:-]?\s*((?:USD|INR|EUR|GBP|CAD|AUD|AED)\s+|(?:US\$|CA\$|C\$|AU\$|A\$|\$|₹|€|£|د\.إ)\s*)\d[\d,.]*/i); + const display = cleanText(match?.[1] ? match[0].replace(/^[^$€£₹A-Z]*(?=(?:USD|INR|EUR|GBP|CAD|AUD|AED|US\$|CA\$|C\$|AU\$|A\$|\$|₹|€|£|د\.إ))/i, "") : null, 80); + if (!display) return null; + const candidate = normalizePriceCandidate({ + amount: display, + currency: currencyFromPriceText(display), + source: "visible_text", + display, + }); + if (!candidate) return null; + if (typeof currentAmount === "number" && candidate.amount <= currentAmount) return null; + return candidate; +} + +function normalizeMaterials(values: Array): string[] { + const text = values + .flatMap((value) => (Array.isArray(value) ? value : [value])) + .map((value) => cleanText(value, 700)) + .filter((value): value is string => !!value) + .join(" "); + const found: string[] = []; + for (const [pattern, material] of MATERIAL_ALIASES) { + if (pattern.test(text) && !found.includes(material)) found.push(material); + } + return found.slice(0, 8); +} + +function normalizeFit(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (/\bloose\s+fit\b|\bloose\b/.test(text)) return "loose"; + if (/\brelaxed\s+fit\b|\brelaxed\b/.test(text)) return "relaxed"; + if (/\boversized\b/.test(text)) return "oversized"; + if (/\bslim\s+fit\b|\bslim\b/.test(text)) return "slim"; + if (/\bregular\s+fit\b|\bregular\b/.test(text)) return "regular"; + if (/\bstraight\s+fit\b/.test(text)) return "straight"; + return null; +} + +function normalizeSleeveLength(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (/\blong[-\s]?sleeved?\b|\blong sleeves?\b/.test(text)) return "long sleeve"; + if (/\bshort[-\s]?sleeved?\b|\bshort sleeves?\b/.test(text)) return "short sleeve"; + if (/\bsleeveless\b/.test(text)) return "sleeveless"; + if (/\b3\/4\b|\bthree-quarter\b/.test(text)) return "three-quarter sleeve"; + return null; +} + +function normalizeCollar(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (/\bpolo collar\b|\bturn-down collar\b|\bcollar\b/.test(text)) return "collared"; + if (/\bcrew neck\b|\bcrewneck\b/.test(text)) return "crew neck"; + if (/\bv-neck\b|\bv neck\b/.test(text)) return "v-neck"; + if (/\bmock neck\b/.test(text)) return "mock neck"; + return null; +} + +function normalizeLength(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (/\bcropped\b/.test(text)) return "cropped"; + if (/\blongline\b|\blong length\b/.test(text)) return "long"; + if (/\bregular length\b|\bregular\b/.test(text)) return "regular"; + if (/\bshort length\b|\bshort\b/.test(text)) return "short"; + return null; +} + +function normalizePattern(value?: string | null) { + const text = String(value ?? "").toLowerCase(); + if (/\bstriped?\b|\bstripe\b/.test(text)) return "striped"; + if (/\bplaid\b|\bchecked?\b|\bcheck\b/.test(text)) return "checked"; + if (/\bgraphic\b|\bmotif\b|\bprinted graphic\b/.test(text)) return "graphic"; + if (/\bprint(?:ed)?\b/.test(text)) return "printed"; + if (/\bfloral\b/.test(text)) return "floral"; + if (/\bsolid\b|\bplain\b/.test(text)) return "solid"; + return null; +} + +function extractSizesFromValues(values: unknown[]) { + const text = values + .flatMap((value) => (Array.isArray(value) ? value : [value])) + .map((value) => cleanText(value, 500)) + .filter((value): value is string => !!value) + .join(" "); + const ordered = ["XXS", "XS", "S", "M", "L", "XL", "XXL", "2XL", "3XL"]; + const found = ordered.filter((size) => new RegExp(`\\b${size}\\b`, "i").test(text)); + const numeric = Array.from(text.matchAll(/\b(?:US\s*)?(\d{1,2}(?:\.\d)?)\b/g)) + .map((match) => match[1]) + .filter((value): value is string => !!value) + .slice(0, 12); + return Array.from(new Set([...found, ...numeric])).slice(0, 16); +} + +function extractColorFromText(value?: string | null) { + const text = String(value ?? "").trim(); + const slashColor = text.match(/^([A-Za-z]+(?:\s+[A-Za-z]+){0,2})\s*\//)?.[1]; + if (slashColor) return cleanText(slashColor.toLowerCase(), 80); + const known = text.match(/\b(light blue|dark blue|navy blue|sky blue|cream|ecru|beige|black|white|gray|grey|red|green|blue|yellow|pink|purple|orange|brown|khaki|olive|stone|ivory|silver|gold)\b/i)?.[1]; + return known ? known.toLowerCase() : null; +} + +function extractAttributeHintsFromText(text: string): Partial { + const source = cleanText(text, 5000) ?? ""; + const materials = normalizeMaterials([source]); + const sizes = extractSizesFromValues([source]); + const care = Array.from(source.matchAll(/\b(?:machine wash|wash with|do not bleach|tumble dry|line dry|dry clean|iron on)[^.]{0,100}/gi)) + .map((match) => cleanText(match[0], 140)) + .filter((value): value is string => !!value) + .slice(0, 6); + return { + material: materials[0] ?? null, + materials, + fit: normalizeFit(source), + sleeveLength: normalizeSleeveLength(source), + collar: normalizeCollar(source), + length: normalizeLength(source), + pattern: normalizePattern(source), + sizeOptions: sizes, + availableSizes: sizes, + sizeHints: sizes, + careInstructions: care, + }; +} + +function inferCategoryHintsFromTitle(title?: string | null): string[] { + const text = String(title ?? "").toLowerCase(); + if (/\bfootball shirt\b/.test(text)) return ["top", "football shirt"]; + if (/\bpolo\b/.test(text)) return ["top", "polo"]; + if (/\bt-?shirt\b|\btee\b/.test(text)) return ["top", "tshirt"]; + if (/\bshirt\b/.test(text)) return ["top", "shirt"]; + if (/\bhoodie\b/.test(text)) return ["top", "hoodie"]; + if (/\bsweater|jumper|knit\b/.test(text)) return ["top", "sweater"]; + if (/\bracer jacket\b/.test(text)) return ["outerwear", "racer jacket"]; + if (/\bjacket\b/.test(text)) return ["outerwear", "jacket"]; + if (/\bcoat\b/.test(text)) return ["outerwear", "coat"]; + if (/\bblazer\b/.test(text)) return ["outerwear", "blazer"]; + if (/\bjeans?\b/.test(text)) return ["bottom", "jeans"]; + if (/\btrousers?\b|\bpants?\b/.test(text)) return ["bottom", "trousers"]; + if (/\bshorts?\b/.test(text)) return ["bottom", "shorts"]; + if (/\bskirt\b/.test(text)) return ["bottom", "skirt"]; + if (/\bsneakers?\b|\btrainers?\b/.test(text)) return ["footwear", "sneakers"]; + if (/\bboots?\b/.test(text)) return ["footwear", "boots"]; + if (/\bloafers?\b/.test(text)) return ["footwear", "loafers"]; + if (/\bdress\b/.test(text)) return ["one_piece", "dress"]; + return []; +} + +function productNounFromHints(hints: string[], fallbackTitle?: string | null) { + const sub = hints[1]; + if (sub && !/^(tshirt|shirt|top|bottom|outerwear|footwear)$/i.test(sub)) return sub; + const title = String(fallbackTitle ?? "").toLowerCase(); + return ( + title.match(/\bfootball shirt\b/)?.[0] ?? + title.match(/\bracer jacket\b/)?.[0] ?? + title.match(/\b(?:polo|t-?shirt|shirt|hoodie|sweater|jacket|coat|blazer|jeans|trousers|pants|shorts|skirt|sneakers|trainers|boots|loafers|dress)\b/)?.[0] ?? + sub ?? + "item" + ); +} + +function removeBrandWords(title: string, brand?: string | null) { + let next = title; + const brands = [brand, "H&M", "Zara", "Uniqlo", "Nike", "Adidas"] + .map((value) => cleanText(value, 80)) + .filter((value): value is string => !!value); + for (const candidate of brands) { + const escaped = candidate.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + next = next + .replace(new RegExp(`^${escaped}\\s+`, "i"), "") + .replace(new RegExp(`\\s+[|–-]\\s*${escaped}\\s*$`, "i"), "") + .replace(new RegExp(`\\b${escaped}\\b`, "i"), ""); + } + return next.replace(/\s+/g, " ").trim(); +} + +function titleDerivedBrand(title?: string | null) { + const text = cleanText(title, 220); + if (!text) return null; + const firstSegment = text.split(/\s+[|–-]\s+|:/)[0]?.trim(); + if (!firstSegment) return null; + if (isLicensedGraphicText(firstSegment)) return null; + const words = firstSegment.split(/\s+/).filter(Boolean); + if (!words.length || words.length > 3) return null; + if (/\b(light|dark|blue|black|white|cream|loose|regular|slim|fit|shirt|jacket|dress|pants|trousers|sneakers?)\b/i.test(firstSegment)) { + return null; + } + return cleanText(firstSegment, 120); +} + +function cleanRetailProductTitle(params: { + rawTitle?: string | null; + brand?: string | null; + color?: string | null; + fit?: string | null; + pattern?: string | null; + categoryHints?: string[]; + graphicText?: string | null; +}) { + const raw = cleanText(params.rawTitle, 260); + if (!raw) return null; + let title = raw + .replace(/\s*\|\s*H\s*&\s*M(?:\s+[A-Z]{2})?\s*$/i, "") + .replace(/\s*\|\s*Zara\s*$/i, "") + .replace(/\s*\|\s*Nike\s*$/i, "") + .replace(/^Men[’']s\s+/i, "") + .replace(/^Women[’']s\s+/i, "") + .replace(/^Ladies[’']?\s+/i, "") + .trim(); + + title = title.replace(/^([^/]{2,36})\/([A-Za-z0-9&'.-]+)\s+/i, (_match, colorPart: string, slashPart: string) => { + if (isLicensedGraphicText(slashPart)) return `${colorPart} `; + return `${colorPart} ${slashPart} `; + }); + + const graphicText = params.graphicText ?? licensedGraphicFromText(title); + if (graphicText) { + title = title.replace(new RegExp(`\\b${graphicText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i"), ""); + } + title = removeBrandWords(title, params.brand) + .replace(/\s*\/\s*/g, " ") + .replace(/\s{2,}/g, " ") + .trim(); + + const color = cleanText(params.color ?? extractColorFromText(raw), 80)?.toLowerCase() ?? null; + const fit = params.fit ?? normalizeFit(title); + const pattern = params.pattern ?? normalizePattern(title); + const noun = productNounFromHints(params.categoryHints ?? inferCategoryHintsFromTitle(title), title); + const lowerTitle = title.toLowerCase(); + const shouldRebuild = + isLicensedGraphicText(raw) || + /\/[A-Za-z0-9&'.-]+/.test(raw) || + (color && fit && !lowerTitle.includes(`${color} ${fit}`)); + if (!shouldRebuild) { + return title.charAt(0).toUpperCase() + title.slice(1); + } + + const parts = [color, fit, pattern && pattern !== "solid" ? pattern : null, noun] + .filter((value): value is string => !!value) + .filter((value, index, array) => array.findIndex((entry) => sameBrand(entry, value)) === index); + const rebuilt = parts.join(" ").replace(/\s+/g, " ").trim(); + return rebuilt ? rebuilt.charAt(0).toUpperCase() + rebuilt.slice(1) : title || raw; +} + +function hasUnsafePriceContext(context: string): boolean { + return /\b(?:shipping|delivery|returns?|tax|subtotal|cart|bag|checkout|installments?|instalments?|payments?|per\s+month|monthly|\/mo|klarna|afterpay|affirm|sezzle|zip|reward|rewards|points?|cash\s*back|coupon|promo|newsletter|gift\s*card|save|discount|off|minimum|free|was|original|regular|compare\s+at|list\s+price|msrp)\b/i.test(context); +} + +function extractVisibleTextPrice(html: string): ExtractedProductPrice | null { + const text = stripVisibleText(html).slice(0, 80_000); + if (!text) return null; + const priceRe = + /(?:\b(?:USD|INR|EUR|GBP|CAD|AUD|AED)\s+|(?:US\$|CA\$|C\$|AU\$|A\$|\$|₹|€|£|د\.إ)\s*)\d[\d,.]*(?:\.\d{1,2})?/gi; + const matches: ExtractedProductPrice[] = []; + let match: RegExpExecArray | null; + while ((match = priceRe.exec(text))) { + const display = cleanText(match[0], 80); + if (!display) continue; + const context = text.slice(Math.max(0, match.index - 70), match.index + display.length + 70); + if (hasUnsafePriceContext(context)) continue; + const candidate = normalizePriceCandidate({ + amount: display, + currency: currencyFromPriceText(display), + source: "visible_text", + display, + }); + if (!candidate) continue; + if (candidate.amount < 3) continue; + matches.push(candidate); + if (matches.length > 8) break; + } + const unique = new Map(); + for (const candidate of matches) { + unique.set(`${candidate.currency ?? "UNK"}:${candidate.amount.toFixed(2)}`, candidate); + } + if (unique.size !== 1) return null; + return Array.from(unique.values())[0] ?? null; +} + +export function extractProductPriceFromHtml(_url: string, html: string): ExtractedProductPrice | null { + return extractJsonLdPrice(html) ?? extractMetaPrice(html) ?? extractVisibleTextPrice(html); +} + +function extractProductPriceSetFromHtml(url: string, html: string) { + const current = extractProductPriceFromHtml(url, html); + const sale = + extractMetaPriceByKeys( + html, + ["product:sale_price:amount", "og:sale_price:amount", "sale_price", "salePrice"], + ["product:sale_price:currency", "og:sale_price:currency", "product:price:currency", "og:price:currency"], + ) ?? null; + const original = + extractMetaPriceByKeys( + html, + [ + "product:original_price:amount", + "product:price:original_amount", + "og:price:standard_amount", + "original_price", + "regular_price", + ], + ["product:original_price:currency", "product:price:currency", "og:price:currency"], + ) ?? extractOriginalPriceFromVisibleText(html, current?.amount ?? sale?.amount ?? null); + const salePrice = + sale?.amount ?? + (original?.amount && current?.amount && current.amount < original.amount ? current.amount : null); + return { + current, + salePrice, + originalPrice: original?.amount ?? null, + }; +} + function normalizeUrl(baseUrl: URL, value: string): string | null { const cleaned = decodeHtmlEntities(value).trim(); if (!cleaned || cleaned.startsWith("data:")) return null; @@ -252,6 +1062,42 @@ function normalizeUrl(baseUrl: URL, value: string): string | null { } } +function imageDedupKey(url: string) { + return url.replace(/([?&])(imwidth|width|height|w|h|sw|sh|q|quality)=\d+/gi, "$1").toLowerCase(); +} + +function productIdHintsFromUrl(url: URL) { + const values = [ + ...url.pathname.matchAll(/[A-Z0-9]{5,}-\d{2,}|\b\d{5,}\b/gi), + ...url.search.matchAll(/[A-Z0-9]{5,}-\d{2,}|\b\d{5,}\b/gi), + ] + .map((match) => match[0]?.toLowerCase()) + .filter((value): value is string => !!value && value.length >= 5); + return Array.from(new Set(values)).slice(0, 6); +} + +function imageSourceWeight(source: ProductImageExtractionSource) { + switch (source) { + case "json_ld": + return 42; + case "og_image": + return 30; + case "twitter": + return 22; + case "html_image": + return 8; + case "fallback": + default: + return 0; + } +} + +function contextualImageScore(url: string, source: ProductImageExtractionSource, sourceUrl: URL) { + const lower = url.toLowerCase(); + const productIdBoost = productIdHintsFromUrl(sourceUrl).some((id) => lower.includes(id)) ? 20 : 0; + return scoreImageUrl(url) + imageSourceWeight(source) + productIdBoost; +} + function imageDimensionHints(url: string) { const lower = url.toLowerCase(); const values: number[] = []; @@ -326,7 +1172,7 @@ function dedupeStableImageUrls(urls: string[]): string[] { const byKey = new Map(); urls.forEach((url, index) => { if (/\s/.test(url)) return; - const key = url.replace(/([?&])(imwidth|width|height|w|h|sw|sh|q|quality)=\d+/gi, "$1").toLowerCase(); + const key = imageDedupKey(url); const score = scoreImageUrl(url); if (score < -2) return; const existing = byKey.get(key); @@ -368,6 +1214,14 @@ function hmArticleIdFromUrl(url: URL) { return url.pathname.match(/\/productpage\.(\d+)\.html$/i)?.[1] ?? null; } +function hmContentFallbackUrls(url: URL) { + if (!isHmProductUrl(url)) return []; + return [ + new URL(`${url.pathname}/_jcr_content.product.json`, url).toString(), + new URL(`${url.pathname}/_jcr_content/product.json`, url).toString(), + ]; +} + function imageValuesFromJsonLd(value: unknown, baseUrl: URL) { const values = Array.isArray(value) ? value : [value]; return values @@ -470,7 +1324,7 @@ function extractMarkupImages(html: string, baseUrl: URL): string[] { } const quotedUrlRe = - /["'](https?:\/\/[^\s"']+\.(?:jpg|jpeg|png|webp)(?:\?[^\s"']*)?)["']/gi; + /["']((?:https?:)?\/\/[^\s"']+\.(?:jpg|jpeg|png|webp)(?:\?[^\s"']*)?)["']/gi; while ((match = quotedUrlRe.exec(html))) { const normalized = normalizeUrl(baseUrl, match[1] ?? ""); if (normalized) out.push(normalized); @@ -478,6 +1332,116 @@ function extractMarkupImages(html: string, baseUrl: URL): string[] { return out; } +function rankImageCandidatesBySource( + candidates: { url: string; source: ProductImageExtractionSource; index: number }[], + sourceUrl: URL, +) { + const byKey = new Map(); + for (const candidate of candidates) { + if (/\s/.test(candidate.url)) continue; + const score = contextualImageScore(candidate.url, candidate.source, sourceUrl); + if (score < 8) continue; + const key = imageDedupKey(candidate.url); + const existing = byKey.get(key); + if (!existing || score > existing.score || (score === existing.score && candidate.index < existing.index)) { + byKey.set(key, { ...candidate, index: existing?.index ?? candidate.index, score }); + } + } + return Array.from(byKey.values()) + .sort((a, b) => b.score - a.score || a.index - b.index || a.url.localeCompare(b.url)); +} + +function extractProductImagesWithSource(url: string, html: string): ProductImageExtraction { + const baseUrl = new URL(url); + if (isAmazonProductUrl(baseUrl)) { + return { urls: [], source: null, candidateCount: 0 }; + } + const scopedHmImages = extractHmScopedProductImages(html, baseUrl); + if (scopedHmImages) { + return { + urls: scopedHmImages, + source: "json_ld", + candidateCount: scopedHmImages.length, + }; + } + const nikeVariantImages = extractNikeSelectedVariantData(baseUrl.toString(), html)?.imageUrls; + if (nikeVariantImages?.length) { + return { + urls: nikeVariantImages, + source: "fallback", + candidateCount: nikeVariantImages.length, + }; + } + + let sourceIndex = 0; + const withSource = ( + source: ProductImageExtractionSource, + urls: Array, + ) => + urls + .filter((entry): entry is string => !!entry) + .map((entry) => ({ + url: entry, + source, + index: sourceIndex++, + })); + const candidates = [ + ...withSource("json_ld", extractJsonLdImages(html, baseUrl)), + ...withSource( + "og_image", + [extractMeta(html, "og:image"), extractMeta(html, "og:image:secure_url")] + .map((value) => (value ? normalizeUrl(baseUrl, value) : null)), + ), + ...withSource( + "twitter", + [extractMeta(html, "twitter:image"), extractMeta(html, "twitter:image:src")] + .map((value) => (value ? normalizeUrl(baseUrl, value) : null)), + ), + ...withSource("html_image", extractMarkupImages(html, baseUrl)), + ]; + const ranked = rankImageCandidatesBySource(candidates, baseUrl); + const urls = ranked.slice(0, 12).map((entry) => entry.url); + const source = ranked[0]?.source ?? null; + debugProductLinkInfo("[AURA_LINK_DEBUG] image extraction source", { + host: baseUrl.hostname, + path: baseUrl.pathname, + extractionSource: source, + candidateCount: ranked.length, + selectedImageHost: urls[0] ? safeHost(urls[0]) : null, + }); + logger.info("[LINK_IMAGE_CANDIDATES] extracted product image candidates", { + sourceUrl: redactUrlForLogs(url), + extractionSource: source, + candidateCount: ranked.length, + urls: urls.slice(0, 20).map((entry) => redactUrlForLogs(entry)), + }); + ranked.slice(0, 12).forEach((entry, rank) => { + logger.info("[LINK_IMAGE_SCORE] URL heuristic score", { + sourceUrl: redactUrlForLogs(url), + source: entry.source, + sourceIndex: entry.index, + rank, + url: redactUrlForLogs(entry.url), + score: entry.score, + reasons: imageScoreReasons(entry.url), + }); + }); + logger.info("[LINK_IMAGE_PRIMARY] generic primary image selected", { + sourceUrl: redactUrlForLogs(url), + extractionSource: source, + primaryImageUrl: redactUrlForLogs(urls[0]), + }); + logger.info("[LINK_IMAGE_SECONDARY] generic secondary images selected", { + sourceUrl: redactUrlForLogs(url), + secondaryImageUrls: urls.slice(1).map((entry) => redactUrlForLogs(entry)), + }); + return { + urls, + source, + candidateCount: ranked.length, + }; +} + function parseNextDataPageProps(html: string): JsonObject | null { const match = html.match( /