2
0
Files
bot/apps/builder/components/shared/buttons/PublishButton.tsx

105 lines
2.8 KiB
TypeScript
Raw Normal View History

import {
Button,
HStack,
IconButton,
Stack,
Tooltip,
Text,
Menu,
MenuButton,
MenuList,
MenuItem,
2022-06-12 19:16:35 +02:00
useDisclosure,
} from '@chakra-ui/react'
import { ChevronLeftIcon } from 'assets/icons'
2022-01-06 09:40:56 +01:00
import { useTypebot } from 'contexts/TypebotContext/TypebotContext'
2022-06-12 19:16:35 +02:00
import { useWorkspace } from 'contexts/WorkspaceContext'
import { Plan } from 'db'
import { InputBlockType } from 'models'
2022-03-23 09:56:39 +01:00
import { useRouter } from 'next/router'
import { timeSince } from 'services/utils'
2022-06-12 19:16:35 +02:00
import { isFreePlan } from 'services/workspace'
import { isNotDefined } from 'utils'
2022-06-12 19:16:35 +02:00
import { UpgradeModal } from '../modals/UpgradeModal'
import { LimitReached } from '../modals/UpgradeModal/UpgradeModal'
export const PublishButton = () => {
2022-06-12 19:16:35 +02:00
const { workspace } = useWorkspace()
2022-03-23 09:56:39 +01:00
const { push, query } = useRouter()
2022-06-12 19:16:35 +02:00
const { isOpen, onOpen, onClose } = useDisclosure()
const {
isPublishing,
isPublished,
publishTypebot,
publishedTypebot,
restorePublishedTypebot,
2022-06-12 19:16:35 +02:00
typebot,
isSavingLoading,
} = useTypebot()
2021-12-23 16:31:56 +01:00
2022-06-12 19:16:35 +02:00
const hasInputFile = typebot?.groups
.flatMap((g) => g.blocks)
.some((b) => b.type === InputBlockType.FILE)
2022-03-23 09:56:39 +01:00
const handlePublishClick = () => {
2022-06-12 19:16:35 +02:00
if (isFreePlan(workspace) && hasInputFile) return onOpen()
2022-03-23 09:56:39 +01:00
publishTypebot()
if (!publishedTypebot) push(`/typebots/${query.typebotId}/share`)
}
return (
<HStack spacing="1px">
2022-06-12 19:16:35 +02:00
<UpgradeModal
plan={Plan.PRO}
isOpen={isOpen}
onClose={onClose}
type={LimitReached.FILE_INPUT}
/>
<Tooltip
borderRadius="md"
hasArrow
placement="bottom-end"
label={
<Stack>
<Text>There are non published changes.</Text>
<Text fontStyle="italic">
Published version from{' '}
{publishedTypebot &&
timeSince(publishedTypebot.updatedAt.toString())}{' '}
ago
</Text>
</Stack>
}
isDisabled={isNotDefined(publishedTypebot)}
>
<Button
colorScheme="blue"
isLoading={isPublishing || isSavingLoading}
isDisabled={isPublished}
2022-03-23 09:56:39 +01:00
onClick={handlePublishClick}
borderRightRadius={publishedTypebot && !isPublished ? 0 : undefined}
>
{isPublished ? 'Published' : 'Publish'}
</Button>
</Tooltip>
{publishedTypebot && !isPublished && (
<Menu>
<MenuButton
as={IconButton}
colorScheme="blue"
borderLeftRadius={0}
icon={<ChevronLeftIcon transform="rotate(-90deg)" />}
aria-label="Show published version"
/>
<MenuList>
<MenuItem onClick={restorePublishedTypebot}>
Restore published version
</MenuItem>
</MenuList>
</Menu>
)}
</HStack>
)
}