forked from trent_larson/crowd-funder-for-time-pwa
WIP: certificate view and dependency updates
- Update certificate view canvas rendering and QR code generation - Upgrade dependencies (expo-file-system, expo-font, expo-keep-awake) - Fix type imports for nostr-tools and dexie-export-import - Update vite config for better dependency resolution - Clean up main entry points (capacitor, electron, pywebview) - Improve error handling in API and plan services - Add type safety to API error handling - Update build configuration for platform-specific builds This is a work in progress commit focusing on certificate view improvements and dependency maintenance. Some type definitions and build configurations may need further refinement.
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
export const handleApiError = (error: any, endpoint: string) => {
|
||||
if (process.env.VITE_PLATFORM === 'capacitor') {
|
||||
import { AxiosError } from "axios";
|
||||
|
||||
export const handleApiError = (error: AxiosError, endpoint: string) => {
|
||||
if (process.env.VITE_PLATFORM === "capacitor") {
|
||||
console.error(`[Capacitor API Error] ${endpoint}:`, {
|
||||
message: error.message,
|
||||
status: error.response?.status,
|
||||
@@ -7,16 +9,16 @@ export const handleApiError = (error: any, endpoint: string) => {
|
||||
config: {
|
||||
url: error.config?.url,
|
||||
method: error.config?.method,
|
||||
headers: error.config?.headers
|
||||
}
|
||||
headers: error.config?.headers,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Specific handling for rate limits
|
||||
if (error.response?.status === 400) {
|
||||
console.warn(`[Rate Limit] ${endpoint}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
throw error;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,71 +1,80 @@
|
||||
import axios from 'axios';
|
||||
import axios from "axios";
|
||||
|
||||
interface PlanResponse {
|
||||
data?: any;
|
||||
data?: unknown;
|
||||
status?: number;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
export const loadPlanWithRetry = async (handle: string, retries = 3): Promise<PlanResponse> => {
|
||||
export const loadPlanWithRetry = async (
|
||||
handle: string,
|
||||
retries = 3,
|
||||
): Promise<PlanResponse> => {
|
||||
try {
|
||||
console.log(`[Plan Service] Loading plan ${handle}, attempt 1/${retries}`);
|
||||
console.log(`[Plan Service] Context: Deep link handle=${handle}, isClaimFlow=${handle.includes('claim')}`);
|
||||
|
||||
console.log(
|
||||
`[Plan Service] Context: Deep link handle=${handle}, isClaimFlow=${handle.includes("claim")}`,
|
||||
);
|
||||
|
||||
// Different endpoint if this is a claim flow
|
||||
const response = await loadPlan(handle);
|
||||
console.log(`[Plan Service] Plan ${handle} loaded successfully:`, {
|
||||
status: response?.status,
|
||||
headers: response?.headers,
|
||||
data: response?.data
|
||||
data: response?.data,
|
||||
});
|
||||
|
||||
|
||||
return response;
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
console.error(`[Plan Service] Error loading plan ${handle}:`, {
|
||||
message: error.message,
|
||||
status: error.response?.status,
|
||||
statusText: error.response?.statusText,
|
||||
data: error.response?.data,
|
||||
headers: error.response?.headers,
|
||||
message: (error as Error).message,
|
||||
status: (error as { response?: { status?: number } })?.response?.status,
|
||||
statusText: (error as { response?: { statusText?: string } })?.response
|
||||
?.statusText,
|
||||
data: (error as { response?: { data?: unknown } })?.response?.data,
|
||||
headers: (error as { response?: { headers?: unknown } })?.response
|
||||
?.headers,
|
||||
config: {
|
||||
url: error.config?.url,
|
||||
method: error.config?.method,
|
||||
baseURL: error.config?.baseURL,
|
||||
headers: error.config?.headers
|
||||
}
|
||||
url: (error as { config?: { url?: string } })?.config?.url,
|
||||
method: (error as { config?: { method?: string } })?.config?.method,
|
||||
baseURL: (error as { config?: { baseURL?: string } })?.config?.baseURL,
|
||||
headers: (error as { config?: { headers?: unknown } })?.config?.headers,
|
||||
},
|
||||
});
|
||||
|
||||
if (retries > 1) {
|
||||
console.log(`[Plan Service] Retrying plan ${handle}, ${retries-1} attempts remaining`);
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
console.log(
|
||||
`[Plan Service] Retrying plan ${handle}, ${retries - 1} attempts remaining`,
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
return loadPlanWithRetry(handle, retries - 1);
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
error: `Failed to load plan ${handle} after ${4-retries} attempts: ${error.message}`,
|
||||
status: error.response?.status
|
||||
error: `Failed to load plan ${handle} after ${4 - retries} attempts: ${(error as Error).message}`,
|
||||
status: (error as { response?: { status?: number } })?.response?.status,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const loadPlan = async (handle: string): Promise<PlanResponse> => {
|
||||
console.log(`[Plan Service] Making API request for plan ${handle}`);
|
||||
|
||||
const endpoint = handle.includes('claim')
|
||||
|
||||
const endpoint = handle.includes("claim")
|
||||
? `/api/claims/${handle}`
|
||||
: `/api/plans/${handle}`;
|
||||
|
||||
|
||||
console.log(`[Plan Service] Using endpoint: ${endpoint}`);
|
||||
|
||||
|
||||
try {
|
||||
const response = await axios.get(endpoint);
|
||||
return response;
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
console.error(`[Plan Service] API request failed for ${handle}:`, {
|
||||
endpoint,
|
||||
error: error.message,
|
||||
response: error.response?.data
|
||||
error: (error as Error).message,
|
||||
response: (error as { response?: { data?: unknown } })?.response?.data,
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user