Skip to content
63 changes: 32 additions & 31 deletions extensions/cli/src/ui/FreeTrialStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import React, { useEffect, useState } from "react";
export function isModelUsingFreeTrial(model: ModelConfig): boolean {
return (
model.provider === "continue-proxy" &&
(model as any).apiKeyLocation.startsWith("free_trial:")
"apiKeyLocation" in model &&
!!model.apiKeyLocation?.startsWith("free_trial:")
);
}

Expand All @@ -28,39 +29,44 @@ const FreeTrialStatus: React.FC<FreeTrialStatusProps> = ({
null,
);
const [loading, setLoading] = useState(true);
const shouldFetchStatus = !!apiClient && isModelUsingFreeTrial(model);

const fetchStatus = async () => {
try {
if (!apiClient) {
setStatus(null);
setLoading(false);
return;
}

const response = await apiClient.getFreeTrialStatus();
setStatus(response);
setLoading(false);
} catch {
// Silently handle errors - component returns null if no status
useEffect(() => {
if (!shouldFetchStatus) {
setStatus(null);
setLoading(false);
return;
}
};

useEffect(() => {
// Initial fetch
fetchStatus();
let isMounted = true;

// Don't poll in test environment
if (process.env.NODE_ENV === "test") {
return;
}
const fetchStatus = async () => {
try {
const response = await apiClient.getFreeTrialStatus();
if (!isMounted) {
return;
}
setStatus(response);
setLoading(false);
} catch {
if (!isMounted) {
return;
}
setStatus(null);
setLoading(false);
}
};

setLoading(true);
void fetchStatus();

// Poll every 5 seconds
const interval = setInterval(fetchStatus, 5000);

return () => clearInterval(interval);
}, []);
return () => {
isMounted = false;
clearInterval(interval);
};
}, [apiClient, shouldFetchStatus]);

// Check if user has maxed out their free trial and notify parent
useEffect(() => {
Expand All @@ -85,12 +91,7 @@ const FreeTrialStatus: React.FC<FreeTrialStatusProps> = ({
}, [status, loading, onTransitionStateChange, model]);

// Don't render anything while loading or if no status
if (
loading ||
!status ||
!status.optedInToFreeTrial ||
!isModelUsingFreeTrial(model)
) {
if (loading || !status || !status.optedInToFreeTrial || !shouldFetchStatus) {
return null;
}

Expand Down
Loading