2023-03-28 15:10:06 +02:00
|
|
|
import { TextInput } from '@/components/inputs'
|
|
|
|
|
import { useToast } from '@/hooks/useToast'
|
|
|
|
|
import { trpc } from '@/lib/trpc'
|
|
|
|
|
import {
|
|
|
|
|
Button,
|
|
|
|
|
HStack,
|
|
|
|
|
Modal,
|
|
|
|
|
ModalBody,
|
|
|
|
|
ModalCloseButton,
|
|
|
|
|
ModalContent,
|
|
|
|
|
ModalFooter,
|
|
|
|
|
ModalHeader,
|
|
|
|
|
ModalOverlay,
|
|
|
|
|
} from '@chakra-ui/react'
|
|
|
|
|
import { createId } from '@paralleldrive/cuid2'
|
2023-12-29 08:02:14 -03:00
|
|
|
import { useTranslate } from '@tolgee/react'
|
2023-03-28 15:10:06 +02:00
|
|
|
import { ThemeTemplate } from '@typebot.io/schemas'
|
|
|
|
|
import { FormEvent, useRef, useState } from 'react'
|
|
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
|
workspaceId: string
|
|
|
|
|
isOpen: boolean
|
|
|
|
|
onClose: (template?: Pick<ThemeTemplate, 'id' | 'theme'>) => void
|
|
|
|
|
selectedTemplate: Pick<ThemeTemplate, 'id' | 'name'> | undefined
|
|
|
|
|
theme: ThemeTemplate['theme']
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const SaveThemeModal = ({
|
|
|
|
|
workspaceId,
|
|
|
|
|
isOpen,
|
|
|
|
|
onClose,
|
|
|
|
|
selectedTemplate,
|
|
|
|
|
theme,
|
|
|
|
|
}: Props) => {
|
2023-12-29 08:02:14 -03:00
|
|
|
const { t } = useTranslate()
|
2023-03-28 15:10:06 +02:00
|
|
|
const { showToast } = useToast()
|
|
|
|
|
const [isSaving, setIsSaving] = useState(false)
|
|
|
|
|
const inputRef = useRef<HTMLInputElement>(null)
|
|
|
|
|
const {
|
|
|
|
|
theme: {
|
|
|
|
|
listThemeTemplates: { refetch: refetchThemeTemplates },
|
|
|
|
|
},
|
|
|
|
|
} = trpc.useContext()
|
|
|
|
|
const { mutate } = trpc.theme.saveThemeTemplate.useMutation({
|
|
|
|
|
onMutate: () => setIsSaving(true),
|
|
|
|
|
onSettled: () => setIsSaving(false),
|
|
|
|
|
onSuccess: ({ themeTemplate }) => {
|
|
|
|
|
refetchThemeTemplates()
|
|
|
|
|
onClose(themeTemplate)
|
|
|
|
|
},
|
|
|
|
|
onError: (error) => {
|
|
|
|
|
showToast({
|
|
|
|
|
description: error.message,
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const updateExistingTemplate = (e: FormEvent) => {
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
const newName = inputRef.current?.value
|
|
|
|
|
if (!newName) return
|
|
|
|
|
mutate({
|
|
|
|
|
name: newName,
|
|
|
|
|
theme,
|
|
|
|
|
workspaceId,
|
|
|
|
|
themeTemplateId: selectedTemplate?.id ?? createId(),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const saveNewTemplate = () => {
|
|
|
|
|
const newName = inputRef.current?.value
|
|
|
|
|
if (!newName) return
|
|
|
|
|
mutate({
|
|
|
|
|
name: newName,
|
|
|
|
|
theme,
|
|
|
|
|
workspaceId,
|
|
|
|
|
themeTemplateId: createId(),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Modal isOpen={isOpen} onClose={onClose} initialFocusRef={inputRef}>
|
|
|
|
|
<ModalOverlay />
|
|
|
|
|
<ModalContent as="form" onSubmit={updateExistingTemplate}>
|
2023-12-29 08:02:14 -03:00
|
|
|
<ModalHeader>
|
|
|
|
|
{t('theme.sideMenu.template.myTemplates.saveTheme.title')}
|
|
|
|
|
</ModalHeader>
|
2023-03-28 15:10:06 +02:00
|
|
|
<ModalCloseButton />
|
|
|
|
|
<ModalBody>
|
|
|
|
|
<TextInput
|
|
|
|
|
ref={inputRef}
|
2023-12-29 08:02:14 -03:00
|
|
|
label={t('theme.sideMenu.template.myTemplates.saveTheme.name')}
|
2023-03-28 15:10:06 +02:00
|
|
|
defaultValue={selectedTemplate?.name}
|
|
|
|
|
withVariableButton={false}
|
2023-12-29 08:02:14 -03:00
|
|
|
placeholder={t(
|
|
|
|
|
'theme.sideMenu.template.myTemplates.saveTheme.myTemplate'
|
|
|
|
|
)}
|
2023-03-28 15:10:06 +02:00
|
|
|
isRequired
|
|
|
|
|
/>
|
|
|
|
|
</ModalBody>
|
|
|
|
|
|
|
|
|
|
<ModalFooter as={HStack}>
|
|
|
|
|
{selectedTemplate?.id && (
|
|
|
|
|
<Button isLoading={isSaving} onClick={saveNewTemplate}>
|
2023-12-29 08:02:14 -03:00
|
|
|
{t('theme.sideMenu.template.myTemplates.saveTheme.saveAsNew')}
|
2023-03-28 15:10:06 +02:00
|
|
|
</Button>
|
|
|
|
|
)}
|
|
|
|
|
<Button type="submit" colorScheme="blue" isLoading={isSaving}>
|
2023-12-29 08:02:14 -03:00
|
|
|
{selectedTemplate?.id ? t('update') : t('save')}
|
2023-03-28 15:10:06 +02:00
|
|
|
</Button>
|
|
|
|
|
</ModalFooter>
|
|
|
|
|
</ModalContent>
|
|
|
|
|
</Modal>
|
|
|
|
|
)
|
|
|
|
|
}
|