2
0

🐛 Fix back button refreshing the page when typebot in folder

Closes #1297
This commit is contained in:
Baptiste Arnaud
2024-03-07 14:10:03 +01:00
parent 5dafb64963
commit 59cf993146
7 changed files with 46 additions and 14 deletions

View File

@ -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)} />

View File

@ -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(),
}) })
) )

View File

@ -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={{

View File

@ -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()}

View File

@ -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:

View File

@ -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
}

View File

@ -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"