2
0

🐛 Fix inconsistent updatedAt when timezone is different fro…

This commit is contained in:
Baptiste Arnaud
2024-05-04 15:18:40 +02:00
parent 86441a5337
commit ad4d1a1000
4 changed files with 40 additions and 11 deletions

View File

@@ -253,7 +253,7 @@ const RightElements = ({
}: StackProps & { isResultsDisplayed: boolean }) => { }: StackProps & { isResultsDisplayed: boolean }) => {
const router = useRouter() const router = useRouter()
const { t } = useTranslate() const { t } = useTranslate()
const { typebot, currentUserMode, save } = useTypebot() const { typebot, currentUserMode, save, isSavingLoading } = useTypebot()
const { const {
setRightPanel, setRightPanel,
rightPanel, rightPanel,
@@ -264,7 +264,7 @@ const RightElements = ({
const handlePreviewClick = async () => { const handlePreviewClick = async () => {
setStartPreviewAtGroup(undefined) setStartPreviewAtGroup(undefined)
setStartPreviewAtEvent(undefined) setStartPreviewAtEvent(undefined)
save().then() await save()
setRightPanel(RightPanel.PREVIEW) setRightPanel(RightPanel.PREVIEW)
} }
@@ -282,7 +282,7 @@ const RightElements = ({
<Button <Button
colorScheme="gray" colorScheme="gray"
onClick={handlePreviewClick} onClick={handlePreviewClick}
isLoading={isNotDefined(typebot)} isLoading={isNotDefined(typebot) || isSavingLoading}
leftIcon={<PlayIcon />} leftIcon={<PlayIcon />}
size="sm" size="sm"
iconSpacing={{ base: 0, xl: 2 }} iconSpacing={{ base: 0, xl: 2 }}

View File

@@ -4,6 +4,7 @@ import { isDefined } from '@typebot.io/lib'
export interface Actions<T extends { updatedAt: Date }> { export interface Actions<T extends { updatedAt: Date }> {
set: (newPresent: T | ((current: T) => T) | undefined) => void set: (newPresent: T | ((current: T) => T) | undefined) => void
setUpdateDate: (updateDate: Date) => void
undo: () => void undo: () => void
redo: () => void redo: () => void
flush: () => void flush: () => void
@@ -107,6 +108,16 @@ export const useUndo = <T extends { updatedAt: Date }>(
[history, params?.isReadOnly] [history, params?.isReadOnly]
) )
const setUpdateDate = useCallback(
(updatedAt: Date) => {
set((current) => ({
...current,
updatedAt,
}))
},
[set]
)
const flush = useCallback(() => { const flush = useCallback(() => {
if (params?.isReadOnly) return if (params?.isReadOnly) return
setHistory({ setHistory({
@@ -116,5 +127,8 @@ export const useUndo = <T extends { updatedAt: Date }>(
}) })
}, [params?.isReadOnly]) }, [params?.isReadOnly])
return [history.present, { set, undo, redo, flush, canUndo, canRedo }] return [
history.present,
{ set, undo, redo, flush, setUpdateDate, canUndo, canRedo },
]
} }

View File

@@ -174,7 +174,15 @@ export const TypebotProvider = ({
const [ const [
localTypebot, localTypebot,
{ redo, undo, flush, canRedo, canUndo, set: setLocalTypebot }, {
redo,
undo,
flush,
canRedo,
canUndo,
set: setLocalTypebot,
setUpdateDate,
},
] = useUndo<TypebotV6>(undefined, { ] = useUndo<TypebotV6>(undefined, {
isReadOnly, isReadOnly,
onUndo: (t) => { onUndo: (t) => {
@@ -216,24 +224,33 @@ export const TypebotProvider = ({
const typebotToSave = { const typebotToSave = {
...localTypebot, ...localTypebot,
...updates, ...updates,
updatedAt: new Date(),
} }
if (dequal(omit(typebot, 'updatedAt'), omit(typebotToSave, 'updatedAt'))) if (dequal(omit(typebot, 'updatedAt'), omit(typebotToSave, 'updatedAt')))
return return
const newParsedTypebot = typebotV6Schema.parse({ ...typebotToSave }) const newParsedTypebot = typebotV6Schema.parse({ ...typebotToSave })
setLocalTypebot(newParsedTypebot) setLocalTypebot(newParsedTypebot)
try { try {
await updateTypebot({ const {
typebot: { updatedAt },
} = await updateTypebot({
typebotId: newParsedTypebot.id, typebotId: newParsedTypebot.id,
typebot: newParsedTypebot, typebot: newParsedTypebot,
}) })
setUpdateDate(updatedAt)
} catch { } catch {
setLocalTypebot({ setLocalTypebot({
...localTypebot, ...localTypebot,
}) })
} }
}, },
[isReadOnly, localTypebot, setLocalTypebot, typebot, updateTypebot] [
isReadOnly,
localTypebot,
setLocalTypebot,
setUpdateDate,
typebot,
updateTypebot,
]
) )
useAutoSave( useAutoSave(

View File

@@ -120,8 +120,7 @@ export const updateTypebot = authenticatedProcedure
if ( if (
typebot.updatedAt && typebot.updatedAt &&
new Date(existingTypebot?.updatedAt).getTime() > existingTypebot.updatedAt.getTime() > typebot.updatedAt.getTime()
typebot.updatedAt.getTime()
) )
throw new TRPCError({ throw new TRPCError({
code: 'CONFLICT', code: 'CONFLICT',
@@ -197,7 +196,6 @@ export const updateTypebot = authenticatedProcedure
}), }),
isClosed: typebot.isClosed, isClosed: typebot.isClosed,
whatsAppCredentialsId: typebot.whatsAppCredentialsId ?? undefined, whatsAppCredentialsId: typebot.whatsAppCredentialsId ?? undefined,
updatedAt: typebot.updatedAt,
}, },
}) })