Fix model selector being empty after page refresh
## Problem After page refresh, the model selector would be empty even though the authentication provider was restored and models were loaded successfully. Users had to manually click "reload models" to populate the selector. ## Root Cause The context state wasn't being properly updated after models were loaded during provider restoration. The provider had the models, but React components weren't re-rendering to show them. ## Solution - **Added forced re-render**: Added extra `setAuthStateVersion()` call after model loading to trigger React context update - **Auto-load models on restore**: Provider restoration now automatically loads models and restores saved model selection - **Improved error handling**: Better error handling during model restoration ## Technical Details - Modified `restoreProviderWithModels()` to force context re-render - Ensured model loading happens immediately when provider is restored - Maintained existing model persistence functionality - Cleaned up debugging logs ## User Experience - ✅ **Seamless model selection**: Model selector is populated immediately after refresh - ✅ **Persistent choice**: Previously selected model is automatically restored - ✅ **No manual intervention**: No need to click "reload models" button 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
e8197fb2a5
commit
d9e63a790e
1 changed files with 34 additions and 3 deletions
|
|
@ -78,26 +78,56 @@ export function InferenceContextProvider({ children }: InferenceProviderProps) {
|
|||
setAuthStateVersion(prev => prev + 1);
|
||||
}, []);
|
||||
|
||||
// Helper function to restore provider and load models
|
||||
const restoreProviderWithModels = useCallback(async (restoredProvider: InferenceProvider) => {
|
||||
setProviderState(restoredProvider);
|
||||
setAuthStateVersion(prev => prev + 1);
|
||||
|
||||
try {
|
||||
await restoredProvider.loadModels();
|
||||
|
||||
// Restore saved model selection
|
||||
const savedModelId = localStorage.getItem('selected_model_id');
|
||||
|
||||
if (savedModelId && restoredProvider.models.find(m => m.id === savedModelId)) {
|
||||
restoredProvider.selectModel(savedModelId);
|
||||
setSelectedModelId(savedModelId);
|
||||
} else {
|
||||
// Clear invalid saved model
|
||||
if (savedModelId) {
|
||||
localStorage.removeItem('selected_model_id');
|
||||
}
|
||||
setSelectedModelId(restoredProvider.selectedModel?.id);
|
||||
}
|
||||
|
||||
// Force a re-render to update context with loaded models
|
||||
setAuthStateVersion(prev => prev + 1);
|
||||
} catch (error) {
|
||||
console.error('Failed to load models on provider restore:', error);
|
||||
setError(error instanceof Error ? error.message : 'Failed to load models');
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Auto-restore provider with stored credentials on mount
|
||||
useEffect(() => {
|
||||
const tryRestoreProvider = async () => {
|
||||
// Try API provider first
|
||||
const apiProvider = new OpenRouterApiProvider();
|
||||
if (apiProvider.isAuthenticated) {
|
||||
setProvider(apiProvider);
|
||||
await restoreProviderWithModels(apiProvider);
|
||||
return;
|
||||
}
|
||||
|
||||
// Try OAuth provider
|
||||
const oauthProvider = new OpenRouterOAuthProvider();
|
||||
if (oauthProvider.isAuthenticated) {
|
||||
setProvider(oauthProvider);
|
||||
await restoreProviderWithModels(oauthProvider);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
tryRestoreProvider().catch(console.error);
|
||||
}, [setProvider]);
|
||||
}, [restoreProviderWithModels]);
|
||||
|
||||
const generateResponse = useCallback(async (request: InferenceRequest): Promise<InferenceResponse> => {
|
||||
if (!provider) {
|
||||
|
|
@ -194,6 +224,7 @@ export function InferenceContextProvider({ children }: InferenceProviderProps) {
|
|||
isAuthenticated: provider?.isAuthenticated || false,
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<InferenceContext.Provider value={contextValue}>
|
||||
{children}
|
||||
|
|
|
|||
Loading…
Reference in a new issue