mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-11-16 01:21:16 +01:00
# Description of Changes <img width="1569" height="980" alt="image" src="https://github.com/user-attachments/assets/dca1c227-ed84-4393-97a1-e3ce6eb1620b" /> <img width="1596" height="935" alt="image" src="https://github.com/user-attachments/assets/2003e1be-034a-4cbb-869e-6d5d912ab61d" /> <img width="1543" height="997" alt="image" src="https://github.com/user-attachments/assets/fe0c4f4b-eeee-4db4-a041-e554f350255a" /> --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details.
103 lines
3.5 KiB
TypeScript
103 lines
3.5 KiB
TypeScript
import { useTranslation } from 'react-i18next';
|
|
import { BASE_PATH } from '@app/constants/app';
|
|
|
|
// Debug flag to show all providers for UI testing
|
|
// Set to true to see all SSO options regardless of backend configuration
|
|
export const DEBUG_SHOW_ALL_PROVIDERS = false;
|
|
|
|
// OAuth provider configuration - maps provider ID to display info
|
|
export const oauthProviderConfig = {
|
|
google: { label: 'Google', file: 'google.svg' },
|
|
github: { label: 'GitHub', file: 'github.svg' },
|
|
apple: { label: 'Apple', file: 'apple.svg' },
|
|
azure: { label: 'Microsoft', file: 'microsoft.svg' },
|
|
// microsoft and azure are the same, keycloak and oidc need their own icons
|
|
// These are commented out from debug view since they need proper icons or backend doesn't use them
|
|
// keycloak: { label: 'Keycloak', file: 'keycloak.svg' },
|
|
// oidc: { label: 'OIDC', file: 'oidc.svg' }
|
|
};
|
|
|
|
interface OAuthButtonsProps {
|
|
onProviderClick: (provider: 'github' | 'google' | 'apple' | 'azure' | 'keycloak' | 'oidc') => void
|
|
isSubmitting: boolean
|
|
layout?: 'vertical' | 'grid' | 'icons'
|
|
enabledProviders?: string[] // List of enabled provider IDs from backend
|
|
}
|
|
|
|
export default function OAuthButtons({ onProviderClick, isSubmitting, layout = 'vertical', enabledProviders = [] }: OAuthButtonsProps) {
|
|
const { t } = useTranslation();
|
|
|
|
// Debug mode: show all providers for UI testing
|
|
const providersToShow = DEBUG_SHOW_ALL_PROVIDERS
|
|
? Object.keys(oauthProviderConfig)
|
|
: enabledProviders;
|
|
|
|
// Filter to only show enabled providers from backend
|
|
const providers = providersToShow
|
|
.filter(id => id in oauthProviderConfig)
|
|
.map(id => ({
|
|
id,
|
|
...oauthProviderConfig[id as keyof typeof oauthProviderConfig]
|
|
}));
|
|
|
|
// If no providers are enabled, don't render anything
|
|
if (providers.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
if (layout === 'icons') {
|
|
return (
|
|
<div className="oauth-container-icons">
|
|
{providers.map((p) => (
|
|
<div key={p.id} title={`${t('login.signInWith', 'Sign in with')} ${p.label}`}>
|
|
<button
|
|
onClick={() => onProviderClick(p.id as any)}
|
|
disabled={isSubmitting}
|
|
className="oauth-button-icon"
|
|
aria-label={`${t('login.signInWith', 'Sign in with')} ${p.label}`}
|
|
>
|
|
<img src={`${BASE_PATH}/Login/${p.file}`} alt={p.label} className="oauth-icon-small"/>
|
|
</button>
|
|
</div>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (layout === 'grid') {
|
|
return (
|
|
<div className="oauth-container-grid">
|
|
{providers.map((p) => (
|
|
<div key={p.id} title={`${t('login.signInWith', 'Sign in with')} ${p.label}`}>
|
|
<button
|
|
onClick={() => onProviderClick(p.id as any)}
|
|
disabled={isSubmitting}
|
|
className="oauth-button-grid"
|
|
aria-label={`${t('login.signInWith', 'Sign in with')} ${p.label}`}
|
|
>
|
|
<img src={`${BASE_PATH}/Login/${p.file}`} alt={p.label} className="oauth-icon-medium"/>
|
|
</button>
|
|
</div>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className="oauth-container-vertical">
|
|
{providers.map((p) => (
|
|
<button
|
|
key={p.id}
|
|
onClick={() => onProviderClick(p.id as any)}
|
|
disabled={isSubmitting}
|
|
className="oauth-button-vertical"
|
|
title={p.label}
|
|
>
|
|
<img src={`${BASE_PATH}/Login/${p.file}`} alt={p.label} className="oauth-icon-tiny" />
|
|
{p.label}
|
|
</button>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|