GenericOAuth Component ====================== Overview -------- The `GenericOAuth` component is a reusable button component designed to handle OAuth authentication for various services. It provides a consistent interface for initiating OAuth login flows. Component Structure ------------------- - **Props**: The component accepts several props to customize its behavior: - `handleLogin`: A function to be called when the button is clicked, initiating the OAuth flow. - `buttonText`: The text to display on the button. - `disabled`: A boolean indicating whether the button should be disabled. - `service`: The name of the OAuth service (e.g., Google, GitHub). - `iconSrc`: The source URL for the service's icon. - **Styling**: The button is styled using Tailwind CSS classes to ensure a consistent look and feel across different services. Usage ----- The `GenericOAuth` component is used within the `OAuthButtons` component to render a list of OAuth buttons for different services. Each button is configured with a specific `handleLogin` function and icon. Example: .. code-block:: jsx Interaction with `config.ts` ---------------------------- The `config.ts` file contains the configuration for each OAuth service, including the `handleLogin` functions. These functions are responsible for constructing the OAuth authorization URL and redirecting the user to the service's login page. Key Functions in `config.ts`: - **generateCodeChallenge**: Generates a code challenge for PKCE (Proof Key for Code Exchange) to enhance security during the OAuth flow. - **handleGoogleLogin**: Constructs the Google OAuth URL and redirects the user. - **handleGithubLogin**: Constructs the GitHub OAuth URL and redirects the user. Each service's configuration includes: - `handler`: The function to initiate the OAuth flow. - `disabled`: A boolean indicating whether the service is available (based on the presence of required credentials). - `icon`: The path to the service's icon. Example Configuration: .. code-block:: typescript const config: Record = { "google": { "handler": handleGoogleLogin, "disabled": !uri.google.auth.clientId, "icon": "/google-icon.png" }, "github": { "handler": handleGithubLogin, "disabled": !uri.github.auth.clientId, "icon": "/github-icon.png" }, };