| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import { ChevronDown, RefreshCw, Unlink } from 'lucide-react'
- import Image from 'next/image'
- import { useState } from 'react'
- import { toast } from 'sonner'
- import {
- Badge,
- Button,
- Card,
- CardContent,
- cn,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
- } from 'ui'
- import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
- import {
- PageSection,
- PageSectionContent,
- PageSectionDescription,
- PageSectionMeta,
- PageSectionSummary,
- PageSectionTitle,
- } from 'ui-patterns/PageSection'
- import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
- import { useGitHubAuthorizationDeleteMutation } from '@/data/integrations/github-authorization-delete-mutation'
- import { useGitHubAuthorizationQuery } from '@/data/integrations/github-authorization-query'
- import { BASE_PATH } from '@/lib/constants'
- import { openInstallGitHubIntegrationWindow } from '@/lib/github'
- export const AccountConnections = () => {
- const {
- data: gitHubAuthorization,
- isPending: isLoading,
- isSuccess,
- isError,
- error,
- } = useGitHubAuthorizationQuery()
- const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false)
- const isConnected = gitHubAuthorization !== null
- const { mutate: removeAuthorization, isPending: isRemoving } =
- useGitHubAuthorizationDeleteMutation({
- onSuccess: () => {
- toast.success('GitHub authorization removed successfully')
- setIsRemoveModalOpen(false)
- },
- })
- const handleConnect = () => {
- openInstallGitHubIntegrationWindow('authorize')
- }
- const handleReauthenticate = () => {
- openInstallGitHubIntegrationWindow('authorize')
- }
- const handleRemove = () => {
- removeAuthorization()
- }
- return (
- <PageSection>
- <PageSectionMeta>
- <PageSectionSummary>
- <PageSectionTitle>Connections</PageSectionTitle>
- <PageSectionDescription>
- Connect your Briven account with other services.
- </PageSectionDescription>
- </PageSectionSummary>
- </PageSectionMeta>
- <PageSectionContent>
- <Card>
- {isLoading && (
- <CardContent>
- <ShimmeringLoader />
- </CardContent>
- )}
- {isError && (
- <CardContent>
- <p className="text-sm text-destructive">
- Failed to load GitHub connection status: {error?.message}
- </p>
- </CardContent>
- )}
- {isSuccess && (
- <CardContent className="flex justify-between items-center">
- <div className="flex gap-x-4 items-center">
- <Image
- className={cn('dark:invert')}
- src={`${BASE_PATH}/img/icons/github-icon.svg`}
- width={30}
- height={30}
- alt={`GitHub icon`}
- />
- <div>
- <p className="text-sm">GitHub</p>
- <p className="text-sm text-foreground-lighter">
- Sync repos to Briven projects for automatic branch creation and merging
- </p>
- </div>
- </div>
- <div className="flex items-center gap-x-2 ml-2">
- {isConnected ? (
- <>
- <Badge variant="success">Connected</Badge>
- <DropdownMenu>
- <DropdownMenuTrigger asChild>
- <Button iconRight={<ChevronDown size={14} />} type="default">
- <span>Manage</span>
- </Button>
- </DropdownMenuTrigger>
- <DropdownMenuContent side="bottom" align="end" className="w-44">
- <DropdownMenuItem
- className="space-x-2"
- onSelect={(event) => {
- event.preventDefault()
- handleReauthenticate()
- }}
- >
- <RefreshCw size={14} />
- <p>Re-authenticate</p>
- </DropdownMenuItem>
- <DropdownMenuSeparator />
- <DropdownMenuItem
- className="space-x-2"
- onSelect={() => setIsRemoveModalOpen(true)}
- >
- <Unlink size={14} />
- <p>Remove connection</p>
- </DropdownMenuItem>
- </DropdownMenuContent>
- </DropdownMenu>
- </>
- ) : (
- <Button type="primary" onClick={handleConnect}>
- Connect
- </Button>
- )}
- </div>
- </CardContent>
- )}
- </Card>
- <ConfirmationModal
- variant="destructive"
- size="small"
- visible={isRemoveModalOpen}
- title="Confirm to remove GitHub authorization"
- confirmLabel="Remove connection"
- onCancel={() => setIsRemoveModalOpen(false)}
- onConfirm={handleRemove}
- loading={isRemoving}
- >
- <p className="text-sm text-foreground-light">
- Removing this authorization will disconnect your GitHub account from Briven. You can
- reconnect at any time.
- </p>
- </ConfirmationModal>
- </PageSectionContent>
- </PageSection>
- )
- }
|