@ -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"
|
||||||
|
@ -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>
|
||||||
|
@ -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"
|
||||||
|
@ -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's a mistake,{' '}
|
||||||
|
<TextLink
|
||||||
|
href={`https://typebot.co/claim-non-scam?Email=${encodeURIComponent(
|
||||||
|
user.email
|
||||||
|
)}&typebotId=${typebotId}`}
|
||||||
|
>
|
||||||
|
contact us
|
||||||
|
</TextLink>
|
||||||
|
.
|
||||||
|
</Text>
|
||||||
|
</HStack>
|
||||||
|
)
|
||||||
|
}
|
@ -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 />
|
||||||
|
@ -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({
|
||||||
|
20
apps/docs/guides/how-to-get-help.mdx
Normal file
20
apps/docs/guides/how-to-get-help.mdx
Normal 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).
|
@ -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",
|
||||||
|
@ -32,6 +32,7 @@ export const FreePlanCard = () => (
|
|||||||
'Native integrations',
|
'Native integrations',
|
||||||
'Webhooks',
|
'Webhooks',
|
||||||
'Custom Javascript & CSS',
|
'Custom Javascript & CSS',
|
||||||
|
'Community support & Docs',
|
||||||
],
|
],
|
||||||
}}
|
}}
|
||||||
button={
|
button={
|
||||||
|
@ -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 />
|
||||||
|
@ -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"
|
||||||
|
Reference in New Issue
Block a user