From 16b228e54e3ff6e2ec582242f7699da0ded10f59 Mon Sep 17 00:00:00 2001 From: Maksim Eltyshev Date: Wed, 11 Feb 2026 11:59:57 +0100 Subject: [PATCH] fix: Prevent collisions when generating local ids --- client/src/utils/local-id.js | 12 +++++++++++- client/src/utils/local-id.test.js | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/client/src/utils/local-id.js b/client/src/utils/local-id.js index ce9291ba..2af8782e 100755 --- a/client/src/utils/local-id.js +++ b/client/src/utils/local-id.js @@ -3,6 +3,16 @@ * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md */ -export const createLocalId = () => `local:${Date.now()}`; +let lastTimestamp = 0; +let sequence = 0; + +export const createLocalId = () => { + const timestamp = Date.now(); + + sequence = timestamp <= lastTimestamp ? sequence + 1 : 0; + lastTimestamp = timestamp; + + return `local:${timestamp}-${String(sequence).padStart(4, '0')}`; +}; export const isLocalId = (id) => id.startsWith('local:'); diff --git a/client/src/utils/local-id.test.js b/client/src/utils/local-id.test.js index 75f5f394..06a79c26 100644 --- a/client/src/utils/local-id.test.js +++ b/client/src/utils/local-id.test.js @@ -2,10 +2,10 @@ import { isLocalId } from './local-id'; describe('isLocalId', () => { test('is valid', () => { - expect(isLocalId('local:1234567890')).toBeTruthy(); + expect(isLocalId('local:1234567890-0000')).toBeTruthy(); }); test('is invalid', () => { - expect(isLocalId('1234567890')).toBeFalsy(); + expect(isLocalId('1234567890-0000')).toBeFalsy(); }); });