2
0

🛂 Disable direct support for Free users

Closes #1318
This commit is contained in:
Baptiste Arnaud
2024-03-04 17:57:32 +01:00
parent daaca9f817
commit 6d8a007f09
11 changed files with 98 additions and 5 deletions

View File

@ -4,6 +4,7 @@ import { useWorkspace } from '@/features/workspace/WorkspaceProvider'
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { Bubble, BubbleProps } from '@typebot.io/nextjs' import { Bubble, BubbleProps } from '@typebot.io/nextjs'
import { planToReadable } from '@/features/billing/helpers/planToReadable' import { planToReadable } from '@/features/billing/helpers/planToReadable'
import { Plan } from '@typebot.io/prisma'
export const SupportBubble = (props: Omit<BubbleProps, 'typebot'>) => { export const SupportBubble = (props: Omit<BubbleProps, 'typebot'>) => {
const { typebot } = useTypebot() const { typebot } = useTypebot()
@ -18,6 +19,8 @@ export const SupportBubble = (props: Omit<BubbleProps, 'typebot'>) => {
setLastViewedTypebotId(typebot?.id) setLastViewedTypebotId(typebot?.id)
}, [lastViewedTypebotId, typebot?.id]) }, [lastViewedTypebotId, typebot?.id])
if (workspace?.plan && workspace.plan !== Plan.FREE) return null
return ( return (
<Bubble <Bubble
typebot="typebot-support" typebot="typebot-support"

View File

@ -88,6 +88,7 @@ export const StarterPlanPricingCard = ({
t('billing.pricingCard.starter.brandingRemoved'), t('billing.pricingCard.starter.brandingRemoved'),
t('billing.pricingCard.starter.fileUploadBlock'), t('billing.pricingCard.starter.fileUploadBlock'),
t('billing.pricingCard.starter.createFolders'), t('billing.pricingCard.starter.createFolders'),
'Direct priority support',
]} ]}
/> />
</Stack> </Stack>

View File

@ -16,6 +16,7 @@ import { GraphDndProvider } from '@/features/graph/providers/GraphDndProvider'
import { GraphProvider } from '@/features/graph/providers/GraphProvider' import { GraphProvider } from '@/features/graph/providers/GraphProvider'
import { EventsCoordinatesProvider } from '@/features/graph/providers/EventsCoordinateProvider' import { EventsCoordinatesProvider } from '@/features/graph/providers/EventsCoordinateProvider'
import { TypebotNotFoundPage } from './TypebotNotFoundPage' import { TypebotNotFoundPage } from './TypebotNotFoundPage'
import { SuspectedTypebotBanner } from './SuspectedTypebotBanner'
export const EditorPage = () => { export const EditorPage = () => {
const { typebot, currentUserMode, is404 } = useTypebot() const { typebot, currentUserMode, is404 } = useTypebot()
@ -31,6 +32,9 @@ export const EditorPage = () => {
<Seo title={typebot?.name ? `${typebot.name} | Editor` : 'Editor'} /> <Seo title={typebot?.name ? `${typebot.name} | Editor` : 'Editor'} />
<Flex overflow="clip" h="100vh" flexDir="column" id="editor-container"> <Flex overflow="clip" h="100vh" flexDir="column" id="editor-container">
<GettingStartedModal /> <GettingStartedModal />
{typebot?.riskLevel === 100 && (
<SuspectedTypebotBanner typebotId={typebot.id} />
)}
<TypebotHeader /> <TypebotHeader />
<Flex <Flex
flex="1" flex="1"

View File

@ -0,0 +1,40 @@
import { TextLink } from '@/components/TextLink'
import { useUser } from '@/features/account/hooks/useUser'
import { HStack, Text } from '@chakra-ui/react'
type Props = {
typebotId: string
}
export const SuspectedTypebotBanner = ({ typebotId }: Props) => {
const { user } = useUser()
if (!user?.email) return null
return (
<HStack
bgColor="red.500"
w="full"
zIndex={1000}
color="white"
justifyContent="center"
fontSize="sm"
textAlign="center"
py="2"
>
<Text fontWeight="bold">
Our anti-scam system flagged your typebot. It is currently being
reviewed manually.
<br />
If you think that&apos;s a mistake,{' '}
<TextLink
href={`https://typebot.co/claim-non-scam?Email=${encodeURIComponent(
user.email
)}&typebotId=${typebotId}`}
>
contact us
</TextLink>
.
</Text>
</HStack>
)
}

View File

@ -33,6 +33,8 @@ import { isCloudProdInstance } from '@/helpers/isCloudProdInstance'
import { useTranslate } from '@tolgee/react' import { useTranslate } from '@tolgee/react'
import { GuestTypebotHeader } from './UnauthenticatedTypebotHeader' import { GuestTypebotHeader } from './UnauthenticatedTypebotHeader'
import { useKeyboardShortcuts } from '@/hooks/useKeyboardShortcuts' import { useKeyboardShortcuts } from '@/hooks/useKeyboardShortcuts'
import { useWorkspace } from '@/features/workspace/WorkspaceProvider'
import { Plan } from '@typebot.io/prisma'
export const TypebotHeader = () => { export const TypebotHeader = () => {
const { t } = useTranslate() const { t } = useTranslate()
@ -49,6 +51,7 @@ export const TypebotHeader = () => {
isSavingLoading, isSavingLoading,
currentUserMode, currentUserMode,
} = useTypebot() } = useTypebot()
const { workspace } = useWorkspace()
const { const {
setRightPanel, setRightPanel,
rightPanel, rightPanel,
@ -99,9 +102,9 @@ export const TypebotHeader = () => {
}) })
const handleHelpClick = () => { const handleHelpClick = () => {
isCloudProdInstance() isCloudProdInstance() && workspace?.plan && workspace.plan !== Plan.FREE
? onOpen() ? onOpen()
: window.open('https://docs.typebot.io', '_blank') : window.open('https://docs.typebot.io/guides/how-to-get-help', '_blank')
} }
if (currentUserMode === 'guest') return <GuestTypebotHeader /> if (currentUserMode === 'guest') return <GuestTypebotHeader />

View File

@ -31,7 +31,6 @@ import { parseDefaultPublicId } from '../helpers/parseDefaultPublicId'
import { InputBlockType } from '@typebot.io/schemas/features/blocks/inputs/constants' import { InputBlockType } from '@typebot.io/schemas/features/blocks/inputs/constants'
import { ConfirmModal } from '@/components/ConfirmModal' import { ConfirmModal } from '@/components/ConfirmModal'
import { TextLink } from '@/components/TextLink' import { TextLink } from '@/components/TextLink'
import { useUser } from '@/features/account/hooks/useUser'
import { useTimeSince } from '@/hooks/useTimeSince' import { useTimeSince } from '@/hooks/useTimeSince'
type Props = ButtonProps & { type Props = ButtonProps & {
@ -45,7 +44,6 @@ export const PublishButton = ({
const { workspace } = useWorkspace() const { workspace } = useWorkspace()
const { push, query, pathname } = useRouter() const { push, query, pathname } = useRouter()
const { isOpen, onOpen, onClose } = useDisclosure() const { isOpen, onOpen, onClose } = useDisclosure()
const { logOut } = useUser()
const { const {
isOpen: isNewEngineWarningOpen, isOpen: isNewEngineWarningOpen,
onOpen: onNewEngineWarningOpen, onOpen: onNewEngineWarningOpen,
@ -79,7 +77,6 @@ export const PublishButton = ({
title: t('publish.error.label'), title: t('publish.error.label'),
description: error.message, description: error.message,
}) })
if (error.data?.httpStatus === 403) logOut()
}, },
onSuccess: () => { onSuccess: () => {
refetchPublishedTypebot({ refetchPublishedTypebot({

View File

@ -0,0 +1,20 @@
---
title: How to get help?
---
Here is what you should do if you have an issue or even a question (this list is ordered by chronological time-to-resolution):
1. Read this documentation. I do my best to keep it up to date and to cover all the possible issues and questions. Use the search bar to find what you are looking for.
2. You can ask for help or report your bug in the [Discord community](https://typebot.io/discord). Specifically in the `#help-and-questions` channel. I try to answer all the questions there daily. There is also a good chance that someone else has already asked the same question and you can find the answer there using the search bar.
3. Users subscribed to the `Starter` or `Pro` plan can directly reach out to me through the chat widget in the bottom right corner of the app.
<Note>
I'm working on a AI-powered typebot that will be able to answer most of the
questions. It's not ready yet but it's coming soon.
</Note>
## If this is urgent
An urgent request is something that is causing a major issue for you or your business in relation to Typebot in production.
If that is the case, report it [here](https://typebot.co/urgent-support).

View File

@ -193,6 +193,7 @@
{ {
"group": "Guides", "group": "Guides",
"pages": [ "pages": [
"guides/how-to-get-help",
"guides/mailer-lite", "guides/mailer-lite",
"guides/multi-avatars", "guides/multi-avatars",
"guides/rtl", "guides/rtl",

View File

@ -32,6 +32,7 @@ export const FreePlanCard = () => (
'Native integrations', 'Native integrations',
'Webhooks', 'Webhooks',
'Custom Javascript & CSS', 'Custom Javascript & CSS',
'Community support & Docs',
], ],
}} }}
button={ button={

View File

@ -312,6 +312,28 @@ export const PlanComparisonTables = ({ onChatsTiersClick }: Props) => (
</Tr> </Tr>
</Thead> </Thead>
<Tbody> <Tbody>
<Tr>
<Td>Community support</Td>
<Td>
<CheckIcon />
</Td>
<Td>
<CheckIcon />
</Td>
<Td>
<CheckIcon />
</Td>
</Tr>
<Tr>
<Td>Direct support channel</Td>
<Td />
<Td>
<CheckIcon />
</Td>
<Td>
<CheckIcon />
</Td>
</Tr>
<Tr> <Tr>
<Td>Priority support</Td> <Td>Priority support</Td>
<Td /> <Td />

View File

@ -41,6 +41,7 @@ export const StarterPlanCard = () => {
'Branding removed', 'Branding removed',
'Collect files from users', 'Collect files from users',
'Create folders', 'Create folders',
'Direct priority support',
], ],
}} }}
borderWidth="1px" borderWidth="1px"