From ce30eca2bb30adc68e7f554cdfd64f5b772d3688 Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Mon, 8 Jun 2026 18:54:59 +0800 Subject: [PATCH] refactor(intake): extract non-integrated style detail state --- .../NonIntegratedDetailClient.tsx | 60 ++--------------- .../intake/non-integrated/styleDetailState.ts | 64 +++++++++++++++++++ 2 files changed, 69 insertions(+), 55 deletions(-) create mode 100644 furniture-3d-system/src/app/intake/non-integrated/styleDetailState.ts diff --git a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx index e8c05a4e..e2c75918 100644 --- a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx +++ b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx @@ -465,6 +465,11 @@ import { resolveQualityInspectionImageFieldKey, syncQualityInspectionRowsWithSkuItems, } from "./qualityInspectionHelpers"; +import { + buildInstallationRevisionSignature, + buildPackagingRevisionSignature, + type StyleDetailForm, +} from "./styleDetailState"; import { MATERIAL_TYPE_OPTIONS, PLANNING_LAYOUT_AUDIENCE_OPTIONS, @@ -870,27 +875,6 @@ type FieldDefinition = { auto?: boolean; }; -type StyleDetailForm = { - installMethod: string; - installSteps: string; - packageDetail: string; - craftDetail: string; - model3dFileName: string; - model3dDataUrl: string; - model3dNodeOffsets: PreviewNodeOffsetMap; - model3dNodeRotations: PreviewNodeRotationMap; - model3dNodeMaterialIds: PreviewNodeMaterialIdMap; - model3dUvConfig: AssetVariantUvConfig | null; - outerPackagingType: string; - innerPackagingItems: NonIntegratedPackagingInnerItem[]; - packagingModel3dFileName: string; - packagingModel3dDataUrl: string; - packagingModel3dNodeOffsets: PreviewNodeOffsetMap; - packagingModel3dNodeRotations: PreviewNodeRotationMap; - packagingModel3dNodeMaterialIds: PreviewNodeMaterialIdMap; - packagingModel3dUvConfig: AssetVariantUvConfig | null; -}; - type ReviewSheetFieldKey = Exclude; type ReviewIssueFieldKey = Exclude< keyof NonIntegratedReviewIssue, @@ -1429,40 +1413,6 @@ const EMPTY_STYLE_DETAIL: StyleDetailForm = { packagingModel3dUvConfig: null, }; -function buildInstallationRevisionSignature( - styleDetails: Record, -) { - return Object.fromEntries( - Object.entries(styleDetails).map(([styleKey, detail]) => [ - styleKey, - { - installMethod: detail.installMethod, - installSteps: detail.installSteps, - }, - ]), - ); -} - -function buildPackagingRevisionSignature( - styleDetails: Record, -) { - return Object.fromEntries( - Object.entries(styleDetails).map(([styleKey, detail]) => [ - styleKey, - { - packageDetail: detail.packageDetail, - craftDetail: detail.craftDetail, - outerPackagingType: detail.outerPackagingType, - innerPackagingItems: detail.innerPackagingItems, - packagingModel3dFileName: detail.packagingModel3dFileName, - packagingModel3dDataUrl: detail.packagingModel3dDataUrl, - packagingModel3dNodeOffsets: detail.packagingModel3dNodeOffsets, - packagingModel3dNodeRotations: detail.packagingModel3dNodeRotations, - }, - ]), - ); -} - function createEmptySkuItem(): NonIntegratedSkuItem { return { id: buildNonIntegratedSkuId(), diff --git a/furniture-3d-system/src/app/intake/non-integrated/styleDetailState.ts b/furniture-3d-system/src/app/intake/non-integrated/styleDetailState.ts new file mode 100644 index 00000000..dabace69 --- /dev/null +++ b/furniture-3d-system/src/app/intake/non-integrated/styleDetailState.ts @@ -0,0 +1,64 @@ +import type { AssetVariantUvConfig } from "@/lib/asset-variant-render-config"; +import type { + NonIntegratedPackagingInnerItem, +} from "./nonIntegratedStorage"; +import type { + PreviewNodeMaterialIdMap, + PreviewNodeOffsetMap, + PreviewNodeRotationMap, +} from "./previewState"; + +export type StyleDetailForm = { + installMethod: string; + installSteps: string; + packageDetail: string; + craftDetail: string; + model3dFileName: string; + model3dDataUrl: string; + model3dNodeOffsets: PreviewNodeOffsetMap; + model3dNodeRotations: PreviewNodeRotationMap; + model3dNodeMaterialIds: PreviewNodeMaterialIdMap; + model3dUvConfig: AssetVariantUvConfig | null; + outerPackagingType: string; + innerPackagingItems: NonIntegratedPackagingInnerItem[]; + packagingModel3dFileName: string; + packagingModel3dDataUrl: string; + packagingModel3dNodeOffsets: PreviewNodeOffsetMap; + packagingModel3dNodeRotations: PreviewNodeRotationMap; + packagingModel3dNodeMaterialIds: PreviewNodeMaterialIdMap; + packagingModel3dUvConfig: AssetVariantUvConfig | null; +}; + +export function buildInstallationRevisionSignature( + styleDetails: Record, +) { + return Object.fromEntries( + Object.entries(styleDetails).map(([styleKey, detail]) => [ + styleKey, + { + installMethod: detail.installMethod, + installSteps: detail.installSteps, + }, + ]), + ); +} + +export function buildPackagingRevisionSignature( + styleDetails: Record, +) { + return Object.fromEntries( + Object.entries(styleDetails).map(([styleKey, detail]) => [ + styleKey, + { + packageDetail: detail.packageDetail, + craftDetail: detail.craftDetail, + outerPackagingType: detail.outerPackagingType, + innerPackagingItems: detail.innerPackagingItems, + packagingModel3dFileName: detail.packagingModel3dFileName, + packagingModel3dDataUrl: detail.packagingModel3dDataUrl, + packagingModel3dNodeOffsets: detail.packagingModel3dNodeOffsets, + packagingModel3dNodeRotations: detail.packagingModel3dNodeRotations, + }, + ]), + ); +}