import { AlertTriangleIcon, CoinsIcon, TimerIcon } from "lucide-react"; import React from "react"; import BudgetAmountSelect from "src/components/BudgetAmountSelect"; import BudgetRenewalSelect from "src/components/BudgetRenewalSelect"; import ExpirySelect from "src/components/ExpirySelect"; import Scopes from "src/components/Scopes"; import { Badge } from "src/components/ui/badge"; import { Switch } from "src/components/ui/switch"; import { DEFAULT_APP_BUDGET_RENEWAL, DEFAULT_APP_BUDGET_SATS, } from "src/constants"; import { cn } from "src/lib/utils"; import { AppPermissions, BudgetRenewalType, Scope, WalletCapabilities, scopeDescriptions, scopeIconMap, } from "src/types"; interface PermissionsProps { capabilities: WalletCapabilities; permissions: AppPermissions; setPermissions?: React.Dispatch>; readOnly?: boolean; } const Permissions: React.FC = ({ capabilities, permissions, setPermissions, readOnly, }) => { const [showBudgetOptions, setShowBudgetOptions] = React.useState( permissions.scopes.includes("pay_invoice") && permissions.maxAmountSat > 0 ); const [showExpiryOptions, setShowExpiryOptions] = React.useState( !!permissions.expiresAt ); const handlePermissionsChange = React.useCallback( (changedPermissions: Partial) => { setPermissions?.((currentPermissions) => ({ ...currentPermissions, ...changedPermissions, })); }, [setPermissions] ); const onScopesChanged = React.useCallback( (scopes: Scope[], isolated: boolean) => { handlePermissionsChange({ scopes, isolated }); }, [handlePermissionsChange] ); const handleBudgetMaxAmountSatChange = React.useCallback( (amountSat: number) => { handlePermissionsChange({ maxAmountSat: amountSat }); }, [handlePermissionsChange] ); const handleBudgetRenewalChange = React.useCallback( (budgetRenewal: BudgetRenewalType) => { handlePermissionsChange({ budgetRenewal }); }, [handlePermissionsChange] ); const handleExpiryChange = React.useCallback( (expiryDate?: Date) => { handlePermissionsChange({ expiresAt: expiryDate }); }, [handlePermissionsChange] ); return (
{!readOnly ? ( ) : ( <>

This app is authorized to:

{[...permissions.scopes].map((scope) => { const PermissionIcon = scopeIconMap[scope]; return (

{scopeDescriptions[scope]}

); })}
)} {/* We skip read only component here as budget is shown in AppUsage */} {permissions.scopes.includes("pay_invoice") && !readOnly && (
{ if (checked) { handleBudgetRenewalChange(DEFAULT_APP_BUDGET_RENEWAL); handleBudgetMaxAmountSatChange(DEFAULT_APP_BUDGET_SATS); } else { handleBudgetRenewalChange("never"); handleBudgetMaxAmountSatChange(0); } setShowBudgetOptions(checked); }} />
{showBudgetOptions && (
)}
)} {!readOnly ? (
{ if (checked) { const defaultExpiry = new Date(); defaultExpiry.setFullYear(defaultExpiry.getFullYear() + 1); defaultExpiry.setHours(23, 59, 59); handleExpiryChange(defaultExpiry); } else { handleExpiryChange(undefined); } setShowExpiryOptions(checked); }} />
{showExpiryOptions && (
)}
) : (

Connection expiry

{permissions.expiresAt ? new Date(permissions.expiresAt).toString() : "This app will never expire"}

)} {permissions.scopes.includes("superuser") && ( <>

This app can create other app connections

Make sure to set budgets on connections created by this app.

)}
); }; export default Permissions;