Amba-Agent-App/lib/hooks/useAuth.ts
2026-01-16 00:22:35 +03:00

128 lines
3.2 KiB
TypeScript

import { AuthService } from "../services/authServices";
import { useAuthStore } from "../stores/authStore";
interface UsePhoneAuthReturn {
sendOTP: (phoneNumber: string) => Promise<void>;
verifyOTP: (code: string) => Promise<void>;
loading: boolean;
error: string | null;
confirmationResult: any | null;
}
export const usePhoneAuth = (): UsePhoneAuthReturn => {
const {
phoneConfirmationResult: confirmationResult,
phoneLoading: loading,
phoneError: error,
setPhoneConfirmationResult: setConfirmationResult,
setPhoneLoading: setLoading,
setPhoneError: setError,
setUser,
} = useAuthStore();
const sendOTP = async (phoneNumber: string) => {
setLoading(true);
setError(null);
try {
console.log(
"usePhoneAuth: Calling AuthService.sendOTP with:",
phoneNumber
);
const result = await AuthService.sendOTP(phoneNumber);
console.log("usePhoneAuth: Result from AuthService.sendOTP:", result);
if (result.error) {
console.log("usePhoneAuth: Setting error:", result.error);
setError(result.error);
} else if (result.confirmationResult) {
console.log("usePhoneAuth: Setting confirmationResult");
setConfirmationResult(result.confirmationResult);
} else {
console.log("usePhoneAuth: No confirmationResult found in result");
}
} catch (err) {
console.log("usePhoneAuth: Caught error:", err);
setError(err instanceof Error ? err.message : "Failed to send OTP");
} finally {
setLoading(false);
}
};
const verifyOTP = async (code: string) => {
const isDevBypass = __DEV__;
if (!confirmationResult && !isDevBypass) {
setError("No verification session found. Please request OTP first.");
return;
}
setLoading(true);
setError(null);
try {
let userCredential: any;
if (isDevBypass) {
console.log("usePhoneAuth: Using DEV OTP bypass (no Firebase call)");
const devUser = {
uid: "dev-emulator-user",
phoneNumber: "DEV",
};
userCredential = { user: devUser };
} else {
console.log("usePhoneAuth: Verifying OTP with native Firebase");
userCredential = await confirmationResult.confirm(code);
}
if (userCredential?.user) {
setUser(userCredential.user);
}
console.log(
"usePhoneAuth: OTP verified successfully, user:",
userCredential?.user?.uid
);
} catch (err: any) {
console.error("usePhoneAuth: OTP verification failed:", err);
setError(err?.message || "Invalid verification code");
} finally {
setLoading(false);
}
};
return {
sendOTP,
verifyOTP,
loading,
error,
confirmationResult,
};
};
// Re-export the auth store hook for convenience
export const useAuthState = () => {
const {
user,
loading,
profile,
wallet,
profileLoading,
walletLoading,
profileError,
walletError,
formattedBalance,
} = useAuthStore();
return {
user,
loading,
profile,
wallet,
profileLoading,
walletLoading,
profileError,
walletError,
formattedBalance,
};
};