From c47415d2eed2ae948c678f21925d8066e623b750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Wed, 2 Oct 2024 18:00:30 +0200 Subject: [PATCH] pl-fe: Fix uuid generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-fe/src/jest/factory.ts | 18 +++++------ packages/pl-fe/src/reducers/compose.ts | 42 ++++++++++++-------------- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/packages/pl-fe/src/jest/factory.ts b/packages/pl-fe/src/jest/factory.ts index 3cc570b25..b4000333a 100644 --- a/packages/pl-fe/src/jest/factory.ts +++ b/packages/pl-fe/src/jest/factory.ts @@ -20,15 +20,13 @@ import { import type { PartialDeep } from 'type-fest'; -const uuid = crypto.randomUUID; - // TODO: there's probably a better way to create these factory functions. // This looks promising but didn't work on my first attempt: https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock const buildAccount = (props: PartialDeep = {}): Account => accountSchema.parse(Object.assign({ - id: uuid(), - url: `https://soapbox.test/users/${uuid()}`, + id: crypto.randomUUID(), + url: `https://soapbox.test/users/${crypto.randomUUID()}`, }, props)); const buildCard = (props: PartialDeep = {}): PreviewCard => @@ -38,22 +36,22 @@ const buildCard = (props: PartialDeep = {}): PreviewCard => const buildGroup = (props: PartialDeep = {}): Group => groupSchema.parse(Object.assign({ - id: uuid(), + id: crypto.randomUUID(), owner: { - id: uuid(), + id: crypto.randomUUID(), }, }, props)); const buildGroupRelationship = (props: PartialDeep = {}): GroupRelationship => groupRelationshipSchema.parse(Object.assign({ - id: uuid(), + id: crypto.randomUUID(), }, props)); const buildGroupMember = ( props: PartialDeep = {}, accountProps: PartialDeep = {}, ): GroupMember => groupMemberSchema.parse(Object.assign({ - id: uuid(), + id: crypto.randomUUID(), account: buildAccount(accountProps), role: GroupRoles.USER, }, props)); @@ -62,12 +60,12 @@ const buildInstance = (props: PartialDeep = {}) => instanceSchema.pars const buildRelationship = (props: PartialDeep = {}): Relationship => relationshipSchema.parse(Object.assign({ - id: uuid(), + id: crypto.randomUUID(), }, props)); const buildStatus = (props: PartialDeep = {}) => statusSchema.parse(Object.assign({ - id: uuid(), + id: crypto.randomUUID(), account: buildAccount(), }, props)); diff --git a/packages/pl-fe/src/reducers/compose.ts b/packages/pl-fe/src/reducers/compose.ts index c527829af..8a262974e 100644 --- a/packages/pl-fe/src/reducers/compose.ts +++ b/packages/pl-fe/src/reducers/compose.ts @@ -71,8 +71,6 @@ import type { Language } from 'pl-fe/features/preferences'; import type { Account, Status } from 'pl-fe/normalizers'; import type { APIEntity } from 'pl-fe/types/entities'; -const uuid = crypto.randomUUID; - const getResetFileKey = () => Math.floor((Math.random() * 0x10000)); const PollRecord = ImmutableRecord({ @@ -163,7 +161,7 @@ const appendMedia = (compose: Compose, media: MediaAttachment, defaultSensitive? map.update('media_attachments', list => list.push(media)); map.set('is_uploading', false); map.set('resetFileKey', Math.floor((Math.random() * 0x10000))); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); if (prevSize === 0 && (defaultSensitive || compose.sensitive)) { map.set('sensitive', true); @@ -176,7 +174,7 @@ const removeMedia = (compose: Compose, mediaId: string) => { return compose.withMutations(map => { map.update('media_attachments', list => list.filterNot(item => item.id === mediaId)); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); if (prevSize === 1) { map.set('sensitive', false); @@ -193,7 +191,7 @@ const insertSuggestion = (compose: Compose, position: number, token: string | nu map.set('focusDate', new Date()); map.set('caretPosition', position + completion.length + 1); } - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); }); const updateSuggestionTags = (compose: Compose, token: string, tags: Tag[]) => { @@ -217,7 +215,7 @@ const insertEmoji = (compose: Compose, position: number, emojiData: Emoji, needs text: `${oldText.slice(0, position)}${emoji} ${oldText.slice(position)}`, focusDate: new Date(), caretPosition: position + emoji.length + 1, - idempotencyKey: uuid(), + idempotencyKey: crypto.randomUUID(), }); }; @@ -281,7 +279,7 @@ const updateCompose = (state: State, key: string, updater: (compose: Compose) => state.update(key, state.get('default')!, updater); const initialState: State = ImmutableMap({ - default: ReducerCompose({ idempotencyKey: uuid(), resetFileKey: getResetFileKey() }), + default: ReducerCompose({ idempotencyKey: crypto.randomUUID(), resetFileKey: getResetFileKey() }), }); const compose = (state = initialState, action: ComposeAction | EventsAction | MeAction | SettingsAction | TimelineAction) => { @@ -289,38 +287,38 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me case COMPOSE_TYPE_CHANGE: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { map.set('content_type', action.value); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_SPOILERNESS_CHANGE: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { map.set('sensitive', !compose.sensitive); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_SPOILER_TEXT_CHANGE: return updateCompose(state, action.composeId, compose => { return compose .setIn(compose.modified_language === compose.language ? ['spoiler_text'] : ['spoilerTextMap', compose.modified_language], action.text) - .set('idempotencyKey', uuid()); + .set('idempotencyKey', crypto.randomUUID()); }); case COMPOSE_VISIBILITY_CHANGE: return updateCompose(state, action.composeId, compose => compose .set('privacy', action.value) - .set('idempotencyKey', uuid())); + .set('idempotencyKey', crypto.randomUUID())); case COMPOSE_LANGUAGE_CHANGE: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { map.set('language', action.value); map.set('modified_language', action.value); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_MODIFIED_LANGUAGE_CHANGE: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { map.set('modified_language', action.value); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_CHANGE: return updateCompose(state, action.composeId, compose => compose .set('text', action.text) - .set('idempotencyKey', uuid())); + .set('idempotencyKey', crypto.randomUUID())); case COMPOSE_REPLY: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { const defaultCompose = state.get('default')!; @@ -337,7 +335,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.set('privacy', privacyPreference(action.status.visibility, defaultCompose.privacy)); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); map.set('content_type', defaultCompose.content_type); if (action.preserveSpoilers && action.status.spoiler_text) { map.set('sensitive', true); @@ -348,7 +346,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me return updateCompose(state, action.composeId, compose => compose.withMutations(map => { map.set('in_reply_to', action.status.id); map.set('to', statusToMentionsArray(action.status, action.account)); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_QUOTE: return updateCompose(state, 'compose-modal', compose => compose.withMutations(map => { @@ -362,7 +360,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.set('privacy', privacyPreference(action.status.visibility, defaultCompose.privacy)); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); map.set('content_type', defaultCompose.content_type); map.set('spoiler_text', ''); @@ -379,7 +377,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me case COMPOSE_RESET: case COMPOSE_SUBMIT_SUCCESS: return updateCompose(state, action.composeId, () => state.get('default')!.withMutations(map => { - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); map.set('in_reply_to', action.composeId.startsWith('reply:') ? action.composeId.slice(6) : null); if (action.composeId.startsWith('group:')) { map.set('privacy', 'group'); @@ -405,7 +403,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.update('text', text => [text.trim(), `@${action.account.acct} `].filter((str) => str.length !== 0).join(' ')); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_DIRECT: return updateCompose(state, 'compose-modal', compose => compose.withMutations(map => { @@ -413,7 +411,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.set('privacy', 'direct'); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_GROUP_POST: return updateCompose(state, action.composeId, compose => compose.withMutations(map => { @@ -421,7 +419,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.set('group_id', action.groupId); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); })); case COMPOSE_SUGGESTIONS_CLEAR: return updateCompose(state, action.composeId, compose => compose.update('suggestions', list => list?.clear()).set('suggestion_token', null)); @@ -468,7 +466,7 @@ const compose = (state = initialState, action: ComposeAction | EventsAction | Me map.set('privacy', action.status.visibility); map.set('focusDate', new Date()); map.set('caretPosition', null); - map.set('idempotencyKey', uuid()); + map.set('idempotencyKey', crypto.randomUUID()); map.set('content_type', action.contentType || 'text/plain'); map.set('quote', action.status.quote_id); map.set('group_id', action.status.group_id);