🐛 Fix back button refreshing the page when typebot in folder
Closes #1297
This commit is contained in:
@ -82,7 +82,10 @@ export const TypebotHeader = () => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const LeftElements = (props: StackProps & { onHelpClick: () => void }) => {
|
const LeftElements = ({
|
||||||
|
onHelpClick,
|
||||||
|
...props
|
||||||
|
}: StackProps & { onHelpClick: () => void }) => {
|
||||||
const { t } = useTranslate()
|
const { t } = useTranslate()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const {
|
const {
|
||||||
@ -144,10 +147,10 @@ const LeftElements = (props: StackProps & { onHelpClick: () => void }) => {
|
|||||||
pathname: router.query.parentId
|
pathname: router.query.parentId
|
||||||
? '/typebots/[typebotId]/edit'
|
? '/typebots/[typebotId]/edit'
|
||||||
: typebot?.folderId
|
: typebot?.folderId
|
||||||
? '/typebots/folders/[folderId]'
|
? '/typebots/folders/[id]'
|
||||||
: '/typebots',
|
: '/typebots',
|
||||||
query: {
|
query: {
|
||||||
folderId: typebot?.folderId ?? [],
|
id: typebot?.folderId ?? [],
|
||||||
parentId: Array.isArray(router.query.parentId)
|
parentId: Array.isArray(router.query.parentId)
|
||||||
? router.query.parentId.slice(0, -1)
|
? router.query.parentId.slice(0, -1)
|
||||||
: [],
|
: [],
|
||||||
@ -222,7 +225,7 @@ const LeftElements = (props: StackProps & { onHelpClick: () => void }) => {
|
|||||||
)}
|
)}
|
||||||
<Button
|
<Button
|
||||||
leftIcon={<BuoyIcon />}
|
leftIcon={<BuoyIcon />}
|
||||||
onClick={props.onHelpClick}
|
onClick={onHelpClick}
|
||||||
size="sm"
|
size="sm"
|
||||||
iconSpacing={{ base: 0, xl: 2 }}
|
iconSpacing={{ base: 0, xl: 2 }}
|
||||||
>
|
>
|
||||||
@ -243,7 +246,10 @@ const LeftElements = (props: StackProps & { onHelpClick: () => void }) => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const RightElements = (props: StackProps & { isResultsDisplayed: boolean }) => {
|
const RightElements = ({
|
||||||
|
isResultsDisplayed,
|
||||||
|
...props
|
||||||
|
}: StackProps & { isResultsDisplayed: boolean }) => {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const { t } = useTranslate()
|
const { t } = useTranslate()
|
||||||
const { typebot, currentUserMode, save } = useTypebot()
|
const { typebot, currentUserMode, save } = useTypebot()
|
||||||
@ -266,7 +272,7 @@ const RightElements = (props: StackProps & { isResultsDisplayed: boolean }) => {
|
|||||||
<TypebotNav
|
<TypebotNav
|
||||||
display={{ base: 'none', md: 'flex', xl: 'none' }}
|
display={{ base: 'none', md: 'flex', xl: 'none' }}
|
||||||
typebotId={typebot?.id}
|
typebotId={typebot?.id}
|
||||||
isResultsDisplayed={props.isResultsDisplayed}
|
isResultsDisplayed={isResultsDisplayed}
|
||||||
/>
|
/>
|
||||||
<Flex pos="relative">
|
<Flex pos="relative">
|
||||||
<ShareTypebotButton isLoading={isNotDefined(typebot)} />
|
<ShareTypebotButton isLoading={isNotDefined(typebot)} />
|
||||||
|
@ -20,7 +20,7 @@ export const createFolder = authenticatedProcedure
|
|||||||
.input(
|
.input(
|
||||||
z.object({
|
z.object({
|
||||||
workspaceId: z.string(),
|
workspaceId: z.string(),
|
||||||
folderName: z.string().default('New folder'),
|
folderName: z.string().default(''),
|
||||||
parentFolderId: z.string().optional(),
|
parentFolderId: z.string().optional(),
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -28,10 +28,12 @@ import { trpc } from '@/lib/trpc'
|
|||||||
|
|
||||||
export const FolderButton = ({
|
export const FolderButton = ({
|
||||||
folder,
|
folder,
|
||||||
|
index,
|
||||||
onFolderDeleted,
|
onFolderDeleted,
|
||||||
onFolderRenamed,
|
onFolderRenamed,
|
||||||
}: {
|
}: {
|
||||||
folder: DashboardFolder
|
folder: DashboardFolder
|
||||||
|
index: number
|
||||||
onFolderDeleted: () => void
|
onFolderDeleted: () => void
|
||||||
onFolderRenamed: () => void
|
onFolderRenamed: () => void
|
||||||
}) => {
|
}) => {
|
||||||
@ -124,10 +126,11 @@ export const FolderButton = ({
|
|||||||
color={useColorModeValue('blue.500', 'blue.400')}
|
color={useColorModeValue('blue.500', 'blue.400')}
|
||||||
/>
|
/>
|
||||||
<Editable
|
<Editable
|
||||||
defaultValue={folder.name}
|
defaultValue={folder.name === '' ? 'New folder' : folder.name}
|
||||||
fontSize="18"
|
fontSize="18"
|
||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
onSubmit={onRenameSubmit}
|
onSubmit={onRenameSubmit}
|
||||||
|
startWithEditView={index === 0 && folder.name === ''}
|
||||||
>
|
>
|
||||||
<EditablePreview
|
<EditablePreview
|
||||||
_hover={{
|
_hover={{
|
||||||
|
@ -181,9 +181,10 @@ export const FolderContent = ({ folder }: Props) => {
|
|||||||
)}
|
)}
|
||||||
{isFolderLoading && <ButtonSkeleton />}
|
{isFolderLoading && <ButtonSkeleton />}
|
||||||
{folders &&
|
{folders &&
|
||||||
folders.map((folder) => (
|
folders.map((folder, index) => (
|
||||||
<FolderButton
|
<FolderButton
|
||||||
key={folder.id.toString()}
|
key={folder.id.toString()}
|
||||||
|
index={index}
|
||||||
folder={folder}
|
folder={folder}
|
||||||
onFolderDeleted={refetchFolders}
|
onFolderDeleted={refetchFolders}
|
||||||
onFolderRenamed={() => refetchFolders()}
|
onFolderRenamed={() => refetchFolders()}
|
||||||
|
@ -11,7 +11,11 @@ import {
|
|||||||
} from '@typebot.io/schemas'
|
} from '@typebot.io/schemas'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
import { getUserRoleInWorkspace } from '@/features/workspace/helpers/getUserRoleInWorkspace'
|
import { getUserRoleInWorkspace } from '@/features/workspace/helpers/getUserRoleInWorkspace'
|
||||||
import { sanitizeGroups, sanitizeSettings } from '../helpers/sanitizers'
|
import {
|
||||||
|
sanitizeFolderId,
|
||||||
|
sanitizeGroups,
|
||||||
|
sanitizeSettings,
|
||||||
|
} from '../helpers/sanitizers'
|
||||||
import { preprocessTypebot } from '@typebot.io/schemas/features/typebot/helpers/preprocessTypebot'
|
import { preprocessTypebot } from '@typebot.io/schemas/features/typebot/helpers/preprocessTypebot'
|
||||||
import { migrateTypebot } from '@typebot.io/lib/migrations/migrateTypebot'
|
import { migrateTypebot } from '@typebot.io/lib/migrations/migrateTypebot'
|
||||||
import { trackEvents } from '@typebot.io/lib/telemetry/trackEvents'
|
import { trackEvents } from '@typebot.io/lib/telemetry/trackEvents'
|
||||||
@ -29,7 +33,6 @@ const omittedProps = {
|
|||||||
resultsTablePreferencesSchema: true,
|
resultsTablePreferencesSchema: true,
|
||||||
selectedThemeTemplateId: true,
|
selectedThemeTemplateId: true,
|
||||||
publicId: true,
|
publicId: true,
|
||||||
folderId: true,
|
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
const importingTypebotSchema = z.preprocess(
|
const importingTypebotSchema = z.preprocess(
|
||||||
@ -74,7 +77,6 @@ const migrateImportingTypebot = (
|
|||||||
isArchived: false,
|
isArchived: false,
|
||||||
whatsAppCredentialsId: null,
|
whatsAppCredentialsId: null,
|
||||||
publicId: null,
|
publicId: null,
|
||||||
folderId: null,
|
|
||||||
riskLevel: null,
|
riskLevel: null,
|
||||||
} satisfies Typebot
|
} satisfies Typebot
|
||||||
return migrateTypebot(fullTypebot)
|
return migrateTypebot(fullTypebot)
|
||||||
@ -141,7 +143,10 @@ export const importTypebot = authenticatedProcedure
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
: {},
|
: {},
|
||||||
folderId: migratedTypebot.folderId,
|
folderId: await sanitizeFolderId({
|
||||||
|
folderId: migratedTypebot.folderId,
|
||||||
|
workspaceId: workspace.id,
|
||||||
|
}),
|
||||||
variables: migratedTypebot.variables ?? [],
|
variables: migratedTypebot.variables ?? [],
|
||||||
edges: migratedTypebot.edges ?? [],
|
edges: migratedTypebot.edges ?? [],
|
||||||
resultsTablePreferences:
|
resultsTablePreferences:
|
||||||
|
@ -146,3 +146,20 @@ export const isCustomDomainNotAvailable = async ({
|
|||||||
|
|
||||||
return typebotWithSameDomainCount > 0
|
return typebotWithSameDomainCount > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const sanitizeFolderId = async ({
|
||||||
|
folderId,
|
||||||
|
workspaceId,
|
||||||
|
}: {
|
||||||
|
folderId: string | null
|
||||||
|
workspaceId: string
|
||||||
|
}) => {
|
||||||
|
if (!folderId) return
|
||||||
|
const folderCount = await prisma.dashboardFolder.count({
|
||||||
|
where: {
|
||||||
|
id: folderId,
|
||||||
|
workspaceId,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return folderCount !== 0 ? folderId : undefined
|
||||||
|
}
|
||||||
|
@ -2,7 +2,7 @@ import React from 'react'
|
|||||||
|
|
||||||
export const OpenRouterLogo = (props: React.SVGProps<SVGSVGElement>) => (
|
export const OpenRouterLogo = (props: React.SVGProps<SVGSVGElement>) => (
|
||||||
<svg viewBox="0 0 512 512" fill="#71717A" stroke="#71717A" {...props}>
|
<svg viewBox="0 0 512 512" fill="#71717A" stroke="#71717A" {...props}>
|
||||||
<g clip-path="url(#clip0_205_3)">
|
<g clipPath="url(#clip0_205_3)">
|
||||||
<path
|
<path
|
||||||
d="M3 248.945C18 248.945 76 236 106 219C136 202 136 202 198 158C276.497 102.293 332 120.945 423 120.945"
|
d="M3 248.945C18 248.945 76 236 106 219C136 202 136 202 198 158C276.497 102.293 332 120.945 423 120.945"
|
||||||
strokeWidth="90"
|
strokeWidth="90"
|
||||||
|
Reference in New Issue
Block a user