wulf-pulse/components/auth/microsoft-button.tsx
root 9f912aed24 feat: add authentication, user management, and admin features
Added comprehensive authentication and authorization system:

Authentication System:
- Better Auth integration with session management
- Login/logout pages and API routes
- Middleware for route protection
- Auth utilities and client libraries

User Management:
- User list, detail, and invite pages
- User API endpoints (CRUD operations)
- Session management for users
- Profile settings page

Role-Based Access Control:
- Role management pages (list, create, edit)
- Permission system with granular controls
- Role assignment to users
- Role API endpoints

Admin Features:
- Audit log page for tracking system events
- Admin settings page
- Audit service for logging user actions

Additional Features:
- Quotes management pages and components
- SalesBldr API integration
- Email service for notifications

Configuration & Documentation:
- Updated docker-compose.yml
- MCP server configuration (mcp.json)
- CVE-2025-55182 security review documentation
- Standards guide and PRD documents
- Re-enabling authentication documentation

Database Migrations:
- 012: Auth tables (users, sessions, accounts, verifications)
- 013: Role tables (roles, permissions, role_permissions, user_roles)
- 014: Admin settings table

UI Updates:
- Updated dashboard layout
- Enhanced app layout with auth integration
2026-01-31 12:43:14 -05:00

74 lines
1.9 KiB
TypeScript

"use client";
import { useState } from "react";
import { Loader2 } from "lucide-react";
import { toast } from "sonner";
import { authClient } from "@/lib/auth-client";
import { Button } from "@/components/ui/button";
// Microsoft logo SVG component
function MicrosoftLogo({ className }: { className?: string }) {
return (
<svg
className={className}
viewBox="0 0 21 21"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect x="1" y="1" width="9" height="9" fill="#F25022" />
<rect x="11" y="1" width="9" height="9" fill="#7FBA00" />
<rect x="1" y="11" width="9" height="9" fill="#00A4EF" />
<rect x="11" y="11" width="9" height="9" fill="#FFB900" />
</svg>
);
}
interface MicrosoftButtonProps {
callbackURL?: string;
}
export function MicrosoftButton({ callbackURL = "/" }: MicrosoftButtonProps) {
const [isLoading, setIsLoading] = useState(false);
async function handleMicrosoftSignIn() {
setIsLoading(true);
try {
const result = await authClient.signIn.social({
provider: "microsoft",
callbackURL,
});
if (result.error) {
toast.error(result.error.message || "Failed to sign in with Microsoft");
setIsLoading(false);
}
// If successful, the user will be redirected to Microsoft's OAuth page
} catch (error) {
toast.error("An unexpected error occurred");
console.error("Microsoft sign-in error:", error);
setIsLoading(false);
}
}
return (
<Button
type="button"
variant="outline"
className="w-full"
onClick={handleMicrosoftSignIn}
disabled={isLoading}
>
{isLoading ? (
<>
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
Connecting...
</>
) : (
<>
<MicrosoftLogo className="mr-2 h-4 w-4" />
Continue with Microsoft 365
</>
)}
</Button>
);
}