@corva/ui 3.77.0-9 → 3.78.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_README.md +9 -6
- package/README.md +6 -0
- package/cjs-bundle/components/AssetEditorV2/components/MultipleAssetsToggle.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelect.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelect.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelectV2.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelectV2.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SecondaryAssetSelect.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SecondaryAssetSelect.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SelectItem.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SelectItem.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/constants.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/assetResponse.js +2 -0
- package/cjs-bundle/components/AssetEditorV2/effects/assetResponse.js.map +1 -0
- package/cjs-bundle/components/AssetEditorV2/effects/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/index.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/index.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/utils/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/utils/index.js.map +1 -1
- package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js +1 -1
- package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js.map +1 -1
- package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js +1 -1
- package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js.map +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js.map +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.module.css.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/constants.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/constants.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/stores/filter-store/types.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js.map +1 -1
- package/cjs-bundle/components/Search/Search.js.map +1 -1
- package/cjs-bundle/config/mapbox/index.js +1 -1
- package/cjs-bundle/config/mapbox/index.js.map +1 -1
- package/cjs-bundle/hocs/withAssetEditorLockHOC.js +1 -1
- package/cjs-bundle/hocs/withAssetEditorLockHOC.js.map +1 -1
- package/components/AssetEditorV2/__tests__/AssetEditorV2.test.d.ts +2 -0
- package/components/AssetEditorV2/__tests__/AssetEditorV2.test.d.ts.map +1 -0
- package/components/AssetEditorV2/__tests__/consumerTypes.test.d.ts +2 -0
- package/components/AssetEditorV2/__tests__/consumerTypes.test.d.ts.map +1 -0
- package/components/AssetEditorV2/components/MultipleAssetsToggle.d.ts +17 -6
- package/components/AssetEditorV2/components/MultipleAssetsToggle.d.ts.map +1 -1
- package/components/AssetEditorV2/components/MultipleAssetsToggle.js.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.d.ts +30 -39
- package/components/AssetEditorV2/components/PrimaryAssetSelect.d.ts.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.js +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.js.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.d.ts +4 -41
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.d.ts.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.js +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.js.map +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.d.ts +22 -18
- package/components/AssetEditorV2/components/SecondaryAssetSelect.d.ts.map +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.js +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.js.map +1 -1
- package/components/AssetEditorV2/components/SelectItem.d.ts +10 -1
- package/components/AssetEditorV2/components/SelectItem.d.ts.map +1 -1
- package/components/AssetEditorV2/components/SelectItem.js +1 -1
- package/components/AssetEditorV2/components/SelectItem.js.map +1 -1
- package/components/AssetEditorV2/components/__tests__/AssetSelectors.test.d.ts +2 -0
- package/components/AssetEditorV2/components/__tests__/AssetSelectors.test.d.ts.map +1 -0
- package/components/AssetEditorV2/components/__tests__/MultipleAssetsToggle.test.d.ts.map +1 -1
- package/components/AssetEditorV2/components/__tests__/SelectItem.test.d.ts.map +1 -1
- package/components/AssetEditorV2/components/index.d.ts.map +1 -1
- package/components/AssetEditorV2/constants.d.ts +2 -9
- package/components/AssetEditorV2/constants.d.ts.map +1 -1
- package/components/AssetEditorV2/constants.js.map +1 -1
- package/components/AssetEditorV2/effects/__tests__/assetResponse.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/assetResponse.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/__tests__/useLegacyPrimaryAssetSelectData.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/useLegacyPrimaryAssetSelectData.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/__tests__/usePrimaryAssetSelectData.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/usePrimaryAssetSelectData.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/assetResponse.d.ts +4 -0
- package/components/AssetEditorV2/effects/assetResponse.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/assetResponse.js +2 -0
- package/components/AssetEditorV2/effects/assetResponse.js.map +1 -0
- package/components/AssetEditorV2/effects/index.d.ts +34 -28
- package/components/AssetEditorV2/effects/index.d.ts.map +1 -1
- package/components/AssetEditorV2/effects/index.js +1 -1
- package/components/AssetEditorV2/effects/index.js.map +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.d.ts +21 -17
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.d.ts.map +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js.map +1 -1
- package/components/AssetEditorV2/index.d.ts +36 -67
- package/components/AssetEditorV2/index.d.ts.map +1 -1
- package/components/AssetEditorV2/index.js +1 -1
- package/components/AssetEditorV2/index.js.map +1 -1
- package/components/AssetEditorV2/types.d.ts +82 -0
- package/components/AssetEditorV2/types.d.ts.map +1 -0
- package/components/AssetEditorV2/utils/__tests__/utils.test.d.ts.map +1 -1
- package/components/AssetEditorV2/utils/index.d.ts +23 -19
- package/components/AssetEditorV2/utils/index.d.ts.map +1 -1
- package/components/AssetEditorV2/utils/index.js +1 -1
- package/components/AssetEditorV2/utils/index.js.map +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.d.ts.map +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.js +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.js.map +1 -1
- package/components/CommentComposer/__tests__/useAttachmentUpload.local.test.d.ts +2 -0
- package/components/CommentComposer/__tests__/useAttachmentUpload.local.test.d.ts.map +1 -0
- package/components/CommentComposer/useAttachmentUpload.d.ts.map +1 -1
- package/components/CommentComposer/useAttachmentUpload.js +1 -1
- package/components/CommentComposer/useAttachmentUpload.js.map +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.d.ts.map +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js.map +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.d.ts.map +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js.map +1 -1
- package/components/Drillstring/BHAComponentDetail/constants.d.ts +2 -2
- package/components/OffsetWellPickerV4/effects/__tests__/useCompanyMetricKey.test.d.ts +2 -0
- package/components/OffsetWellPickerV4/effects/__tests__/useCompanyMetricKey.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV4/effects/useCompanyMetricKey.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/__tests__/constants.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/__tests__/constants.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.d.ts +2 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.d.ts +3 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.module.css.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/__tests__/MetricCell.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/__tests__/MetricCell.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.d.ts +0 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js.map +1 -1
- package/components/OffsetWellPickerV5/constants.d.ts +26 -3
- package/components/OffsetWellPickerV5/constants.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/constants.js +1 -1
- package/components/OffsetWellPickerV5/constants.js.map +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useAdvancedWells.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useAdvancedWells.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useCompanyMetricKey.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useCompanyMetricKey.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js.map +1 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.d.ts +2 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.js.map +1 -1
- package/components/OffsetWellPickerV5/utils/__tests__/getTimestampByPeriod.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/utils/__tests__/getTimestampByPeriod.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.d.ts +4 -0
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js +1 -1
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js.map +1 -1
- package/components/Search/Search.d.ts +6 -3
- package/components/Search/Search.d.ts.map +1 -1
- package/components/Search/Search.js.map +1 -1
- package/components/index.d.ts +1 -0
- package/components/index.d.ts.map +1 -1
- package/config/mapbox/index.d.ts.map +1 -1
- package/config/mapbox/index.js +1 -1
- package/config/mapbox/index.js.map +1 -1
- package/hocs/__tests__/withAssetEditorLockHOC.test.d.ts +2 -0
- package/hocs/__tests__/withAssetEditorLockHOC.test.d.ts.map +1 -0
- package/hocs/withAssetEditorLockHOC.d.ts +11 -1
- package/hocs/withAssetEditorLockHOC.d.ts.map +1 -1
- package/hocs/withAssetEditorLockHOC.js +1 -1
- package/hocs/withAssetEditorLockHOC.js.map +1 -1
- package/mcp-server/server.mjs +312 -73
- package/mcp-server/setup.mjs +129 -44
- package/package.json +3 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,23 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { AssetId, AssetOption } from '../types';
|
|
2
|
+
type FormatAssetParams = {
|
|
3
|
+
asset: unknown;
|
|
4
|
+
group?: string | null;
|
|
5
|
+
activeWellId?: AssetId | null;
|
|
6
|
+
isRequiredAssetId?: boolean;
|
|
7
|
+
isPrimaryAsset?: boolean;
|
|
8
|
+
isDrillingPlatformApp?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type GetPrimaryAssetFieldsParams = {
|
|
11
|
+
primaryAssetType?: string | null;
|
|
12
|
+
assetFields: string[];
|
|
13
|
+
isDrillingPlatformApp?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const mapAssetIdPath: (assetType: string) => string[];
|
|
16
|
+
export declare const getRequestOptions: (assetType: string, assetFields?: string[]) => {
|
|
4
17
|
sort: string;
|
|
5
18
|
order: string;
|
|
6
|
-
fields:
|
|
19
|
+
fields: string[];
|
|
7
20
|
};
|
|
8
|
-
export declare const formatAsset: ({ asset, group, activeWellId, isRequiredAssetId, isPrimaryAsset, isDrillingPlatformApp, }:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
isRequiredAssetId: any;
|
|
15
|
-
}) => {
|
|
16
|
-
id: number;
|
|
17
|
-
type: any;
|
|
18
|
-
name: any;
|
|
19
|
-
} | null;
|
|
20
|
-
export declare const sortAsset: (curr: any) => -1 | 1;
|
|
21
|
-
export declare const getPrimaryAssetFields: (primaryAssetType: any, assetFields: any, isDrillingPlatformApp: any) => any[];
|
|
22
|
-
export declare const getSearchPlaceholder: (assetType: any, isSecondaryAssetPresent?: boolean) => string;
|
|
21
|
+
export declare const formatAsset: ({ asset, group, activeWellId, isRequiredAssetId, isPrimaryAsset, isDrillingPlatformApp, }: FormatAssetParams) => AssetOption | null;
|
|
22
|
+
export declare const isAssetOption: (asset: AssetOption | null) => asset is AssetOption;
|
|
23
|
+
export declare const sortAsset: (asset: AssetOption) => number;
|
|
24
|
+
export declare const getPrimaryAssetFields: ({ primaryAssetType, assetFields, isDrillingPlatformApp, }: GetPrimaryAssetFieldsParams) => string[];
|
|
25
|
+
export declare const getSearchPlaceholder: (assetType?: string | null, isSecondaryAssetPresent?: boolean) => string;
|
|
26
|
+
export {};
|
|
23
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/AssetEditorV2/utils/index.
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/AssetEditorV2/utils/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIhD,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAoBF,eAAO,MAAM,cAAc,cAAe,MAAM,KAAG,MAAM,EAUxD,CAAC;AAEF,eAAO,MAAM,iBAAiB,cAAe,MAAM,gBAAe,MAAM,EAAE;IACxE,IAAI;IACJ,KAAK;IACL,MAAM;CACN,CAAC;AAEH,eAAO,MAAM,WAAW,8FAOrB,iBAAiB,KAAG,WAAW,GAAG,IA8CpC,CAAC;AAEF,eAAO,MAAM,aAAa,UAAW,WAAW,GAAG,IAAI,KAAG,KAAK,IAAI,WAA6B,CAAC;AAEjG,eAAO,MAAM,SAAS,UAAW,WAAW,KAAG,MAAmD,CAAC;AAEnG,eAAO,MAAM,qBAAqB,8DAI/B,2BAA2B,KAAG,MAAM,EAatC,CAAC;AAEF,eAAO,MAAM,oBAAoB,eACnB,MAAM,GAAG,IAAI,wCAExB,MAMF,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"@babel/runtime/helpers/toConsumableArray";import"
|
|
1
|
+
import t from"@babel/runtime/helpers/toConsumableArray";import n from"@babel/runtime/helpers/typeof";import{ASSET_TYPE_SEARCH_PLACEHOLDERS as r,ASSET_TYPE_SEARCH_PLACEHOLDERS_NO_SECONDARY as e,DEFAULT_ASSET_TYPE as s,ACTIVE_STATUS as i}from"../constants.js";import"../../../constants/goals.js";import"../../../constants/segment.js";import"../../../constants/alerts.js";import"../../../constants/apps.js";import"../../../constants/drillstring.js";import"../../../constants/completion.js";import"../../../constants/appPackages.js";import"../../../constants/notifications.js";import"../../../constants/feed.js";import"../../../constants/bha.js";import{ASSET_TYPES as a}from"../../../constants/assetTypes.js";import"../../../constants/corvaCompanyId.js";import"lodash";import"../../GradientManager/configuration/constants.js";var o=function(t){return"object"===n(t)&&null!==t&&!Array.isArray(t)},l=function(t){return"string"==typeof t?t:void 0},u=function(t,n){var r=t.activeWell;return o(r)?r[n]:void 0},c=function(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return{sort:"name",order:"asc",fields:["".concat(n,".name"),"".concat(n,".status")].concat(t(r))}},p=function(t){var n=t.asset,r=t.group,e=void 0===r?null:r,c=t.activeWellId,p=void 0===c?null:c,m=t.isRequiredAssetId,d=t.isPrimaryAsset,f=t.isDrillingPlatformApp;if(!o(n))return null;var v=l(n.type),y={id:Number(n.assetId)||Number(n.id),type:v,name:l(n.name)};return m&&(y.id=Number(n.id),y.assetId=Number(n.assetId)),e&&(y.group=e),v===a.rig.type&&(y.activeWellId=Number(u(n,"id"))||null,f&&(y.activeWellId=Number(u(n,"assetId"))||null)),"interventionUnit"===v&&(y.activeWellId=Number(u(n,"id"))||null),v!==a.well.type&&v!==s||(y.status=Number(n.id)===p?i:null),v===a.pad.type&&(y.parentFracFleetId=function(t){if("number"==typeof t||"string"==typeof t||null===t)return t}(n.parentFracFleetId),y.status=n.active&&n.current?i:null,d&&!n.parentFracFleetId&&(y.status=null)),y},m=function(t){return Boolean(t)},d=function(t){return t.status===i?-1:1},f=function(n){var r=n.primaryAssetType,e=n.assetFields,s=n.isDrillingPlatformApp,i=t(e);return r!==a.rig.type&&r!==a.intervention_unit.type||i.push("".concat(r,".active_well")),s?[].concat(t(i),["rig.active_child"]):i},v=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],s=n?r:e;return t&&s[t]||"Search..."};export{p as formatAsset,f as getPrimaryAssetFields,c as getRequestOptions,v as getSearchPlaceholder,m as isAssetOption,d as sortAsset};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/AssetEditorV2/utils/index.
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/AssetEditorV2/utils/index.ts"],"sourcesContent":["import {\n ACTIVE_STATUS,\n ASSET_TYPE_SEARCH_PLACEHOLDERS,\n ASSET_TYPE_SEARCH_PLACEHOLDERS_NO_SECONDARY,\n DEFAULT_ASSET_TYPE,\n} from '../constants';\nimport { AssetId, AssetOption } from '../types';\n\nimport { ASSET_TYPES } from '~/constants';\n\ntype FormatAssetParams = {\n asset: unknown;\n group?: string | null;\n activeWellId?: AssetId | null;\n isRequiredAssetId?: boolean;\n isPrimaryAsset?: boolean;\n isDrillingPlatformApp?: boolean;\n};\n\ntype GetPrimaryAssetFieldsParams = {\n primaryAssetType?: string | null;\n assetFields: string[];\n isDrillingPlatformApp?: boolean;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst getString = (value: unknown): string | undefined =>\n typeof value === 'string' ? value : undefined;\n\nconst getAssetId = (value: unknown): AssetId | null | undefined => {\n if (typeof value === 'number' || typeof value === 'string' || value === null) return value;\n\n return undefined;\n};\n\nconst getActiveWellValue = (asset: Record<string, unknown>, key: string): unknown => {\n const activeWell = asset.activeWell;\n\n return isRecord(activeWell) ? activeWell[key] : undefined;\n};\n\nexport const mapAssetIdPath = (assetType: string): string[] => {\n switch (assetType) {\n case 'rig':\n case 'well':\n return ['attributes', 'asset_id'];\n case 'frac_fleet':\n case 'pad':\n default:\n return ['id'];\n }\n};\n\nexport const getRequestOptions = (assetType: string, assetFields: string[] = []) => ({\n sort: 'name',\n order: 'asc',\n fields: [`${assetType}.name`, `${assetType}.status`, ...assetFields],\n});\n\nexport const formatAsset = ({\n asset,\n group = null,\n activeWellId = null,\n isRequiredAssetId,\n isPrimaryAsset,\n isDrillingPlatformApp,\n}: FormatAssetParams): AssetOption | null => {\n if (!isRecord(asset)) return null;\n\n const type = getString(asset.type);\n const formattedAsset: AssetOption = {\n id: Number(asset.assetId) || Number(asset.id),\n type,\n name: getString(asset.name),\n };\n\n if (isRequiredAssetId) {\n formattedAsset.id = Number(asset.id);\n formattedAsset.assetId = Number(asset.assetId);\n }\n\n if (group) {\n formattedAsset.group = group;\n }\n\n if (type === ASSET_TYPES.rig.type) {\n formattedAsset.activeWellId = Number(getActiveWellValue(asset, 'id')) || null;\n\n if (isDrillingPlatformApp) {\n formattedAsset.activeWellId = Number(getActiveWellValue(asset, 'assetId')) || null;\n }\n }\n\n // The deserializer transforms keys and values to camelCase.\n if (type === 'interventionUnit') {\n formattedAsset.activeWellId = Number(getActiveWellValue(asset, 'id')) || null;\n }\n\n if (type === ASSET_TYPES.well.type || type === DEFAULT_ASSET_TYPE) {\n formattedAsset.status = Number(asset.id) === activeWellId ? ACTIVE_STATUS : null;\n }\n\n if (type === ASSET_TYPES.pad.type) {\n formattedAsset.parentFracFleetId = getAssetId(asset.parentFracFleetId);\n formattedAsset.status = asset.active && asset.current ? ACTIVE_STATUS : null;\n\n if (isPrimaryAsset && !asset.parentFracFleetId) {\n formattedAsset.status = null;\n }\n }\n\n return formattedAsset;\n};\n\nexport const isAssetOption = (asset: AssetOption | null): asset is AssetOption => Boolean(asset);\n\nexport const sortAsset = (asset: AssetOption): number => (asset.status === ACTIVE_STATUS ? -1 : 1);\n\nexport const getPrimaryAssetFields = ({\n primaryAssetType,\n assetFields,\n isDrillingPlatformApp,\n}: GetPrimaryAssetFieldsParams): string[] => {\n const customAssetFields = [...assetFields];\n\n if (\n primaryAssetType === ASSET_TYPES.rig.type ||\n primaryAssetType === ASSET_TYPES.intervention_unit.type\n ) {\n customAssetFields.push(`${primaryAssetType}.active_well`);\n }\n\n if (isDrillingPlatformApp) return [...customAssetFields, 'rig.active_child'];\n\n return customAssetFields;\n};\n\nexport const getSearchPlaceholder = (\n assetType?: string | null,\n isSecondaryAssetPresent = true\n): string => {\n const assetPlaceholders = isSecondaryAssetPresent\n ? ASSET_TYPE_SEARCH_PLACEHOLDERS\n : ASSET_TYPE_SEARCH_PLACEHOLDERS_NO_SECONDARY;\n\n return (assetType && assetPlaceholders[assetType]) || 'Search...';\n};\n"],"names":["isRecord","value","_typeof","Array","isArray","getString","undefined","getActiveWellValue","asset","key","activeWell","getRequestOptions","assetType","assetFields","sort","order","fields","formatAsset","_ref","_ref$group","group","_ref$activeWellId","activeWellId","isRequiredAssetId","isPrimaryAsset","isDrillingPlatformApp","type","formattedAsset","id","Number","assetId","name","ASSET_TYPES","rig","well","DEFAULT_ASSET_TYPE","status","ACTIVE_STATUS","pad","parentFracFleetId","getAssetId","active","current","isAssetOption","Boolean","sortAsset","getPrimaryAssetFields","_ref2","primaryAssetType","customAssetFields","intervention_unit","push","getSearchPlaceholder","isSecondaryAssetPresent","assetPlaceholders","ASSET_TYPE_SEARCH_PLACEHOLDERS","ASSET_TYPE_SEARCH_PLACEHOLDERS_NO_SECONDARY"],"mappings":"szBAyBA,IAAMA,EAAW,SAACC,GAAc,MACb,WAAjBC,EAAOD,IAAgC,OAAVA,IAAmBE,MAAMC,QAAQH,EAAM,EAEhEI,EAAY,SAACJ,GAAc,MACd,iBAAVA,EAAqBA,OAAQK,CAAS,EAQzCC,EAAqB,SAACC,EAAgCC,GAC1D,IAAMC,EAAaF,EAAME,WAEzB,OAAOV,EAASU,GAAcA,EAAWD,QAAOH,CAClD,EAcaK,EAAoB,SAACC,GAAiB,IAAEC,yDAAwB,GAAE,MAAM,CACnFC,KAAM,OACNC,MAAO,MACPC,OAAYJ,CAAAA,GAAAA,OAAAA,EAAqBA,SAAAA,GAAAA,OAAAA,uBAAuBC,IACzD,EAEYI,EAAc,SAOkBC,GAAA,IAN3CV,IAAAA,MAAKW,EAAAD,EACLE,MAAAA,aAAQ,KAAID,EAAAE,EAAAH,EACZI,aAAAA,aAAe,KAAID,EACnBE,IAAAA,kBACAC,IAAAA,eACAC,IAAAA,sBAEA,IAAKzB,EAASQ,GAAQ,OAAO,KAE7B,IAAMkB,EAAOrB,EAAUG,EAAMkB,MACvBC,EAA8B,CAClCC,GAAIC,OAAOrB,EAAMsB,UAAYD,OAAOrB,EAAMoB,IAC1CF,KAAAA,EACAK,KAAM1B,EAAUG,EAAMuB,OAsCxB,OAnCIR,IACFI,EAAeC,GAAKC,OAAOrB,EAAMoB,IACjCD,EAAeG,QAAUD,OAAOrB,EAAMsB,UAGpCV,IACFO,EAAeP,MAAQA,GAGrBM,IAASM,EAAYC,IAAIP,OAC3BC,EAAeL,aAAeO,OAAOtB,EAAmBC,EAAO,QAAU,KAErEiB,IACFE,EAAeL,aAAeO,OAAOtB,EAAmBC,EAAO,aAAe,OAKrE,qBAATkB,IACFC,EAAeL,aAAeO,OAAOtB,EAAmBC,EAAO,QAAU,MAGvEkB,IAASM,EAAYE,KAAKR,MAAQA,IAASS,IAC7CR,EAAeS,OAASP,OAAOrB,EAAMoB,MAAQN,EAAee,EAAgB,MAG1EX,IAASM,EAAYM,IAAIZ,OAC3BC,EAAeY,kBA1EA,SAACtC,GAClB,GAAqB,iBAAVA,GAAuC,iBAAVA,GAAgC,OAAVA,EAAgB,OAAOA,CAGvF,CAsEuCuC,CAAWhC,EAAM+B,mBACpDZ,EAAeS,OAAS5B,EAAMiC,QAAUjC,EAAMkC,QAAUL,EAAgB,KAEpEb,IAAmBhB,EAAM+B,oBAC3BZ,EAAeS,OAAS,OAIrBT,CACT,EAEagB,EAAgB,SAACnC,GAAyB,OAA2BoC,QAAQpC,EAAM,EAEnFqC,EAAY,SAACrC,GAAkB,OAAcA,EAAM4B,SAAWC,GAAiB,EAAI,CAAC,EAEpFS,EAAwB,SAIQC,GAAA,IAH3CC,IAAAA,iBACAnC,IAAAA,YACAY,IAAAA,sBAEMwB,EAAwBpC,EAAAA,GAS9B,OANEmC,IAAqBhB,EAAYC,IAAIP,MACrCsB,IAAqBhB,EAAYkB,kBAAkBxB,MAEnDuB,EAAkBE,KAAQH,GAAAA,OAAAA,EAA+B,iBAGvDvB,EAAkCwB,GAAAA,OAAAA,EAAAA,IAAmB,qBAElDA,CACT,EAEaG,EAAuB,SAClCxC,GAEW,IADXyC,6DAEMC,EAAoBD,EACtBE,EACAC,EAEJ,OAAQ5C,GAAa0C,EAAkB1C,IAAe,WACxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentDocument.d.ts","sourceRoot":"","sources":["../../../src/components/AttachmentLightbox/AttachmentDocument.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"AttachmentDocument.d.ts","sourceRoot":"","sources":["../../../src/components/AttachmentLightbox/AttachmentDocument.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAwH1F,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,aAAc,uBAAuB,4CA2EnE,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"@babel/runtime/helpers/slicedToArray";import t from"@babel/runtime/helpers/asyncToGenerator";import r from"@babel/runtime/helpers/toArray";import n from"@babel/runtime/regenerator";import{useState as a,useEffect as o}from"react";import{FileIcon as i}from"../../componentsV2/FileIcon/FileIcon.js";import{Button as c}from"../../componentsV2/Button/Button.js";import{LoaderCircular as s}from"../../componentsV2/LoaderCircular/LoaderCircular.js";import{TextViewer as l}from"../NewDocumentViewer/components/TextViewer.js";import{CsvViewer as
|
|
1
|
+
import e from"@babel/runtime/helpers/slicedToArray";import t from"@babel/runtime/helpers/asyncToGenerator";import r from"@babel/runtime/helpers/toArray";import n from"@babel/runtime/regenerator";import{useState as a,useEffect as o}from"react";import{FileIcon as i}from"../../componentsV2/FileIcon/FileIcon.js";import{Button as c}from"../../componentsV2/Button/Button.js";import{LoaderCircular as s}from"../../componentsV2/LoaderCircular/LoaderCircular.js";import{TextViewer as l}from"../NewDocumentViewer/components/TextViewer.js";import{CsvViewer as d}from"../NewDocumentViewer/components/CsvViewer.js";import{PdfViewer as m}from"../NewDocumentViewer/components/PdfViewer.js";import{getTextData as u,getXlsxData as f,getCsvData as p}from"../NewDocumentViewer/utils.js";import{openAttachmentInNewTab as b,downloadAttachment as h}from"./downloadAttachment.js";import v from"./AttachmentLightbox.scss.js";import{fetchAttachment as w}from"../../utils/fetchAttachment.js";import{getFileExtension as x}from"../../utils/fileExtension.js";import k from"../../utils/main.js";import{jsx as j,jsxs as N}from"react/jsx-runtime";var L={pdf:"pdf",csv:"table",xlsx:"table",txt:"text",json:"text"},g=function(e){var t=r(e),n=t[0],a=void 0===n?[]:n,o=t.slice(1),i=function(e){var t=new Map;return e.map((function(e,r){var n,a=e||"Column ".concat(r+1),o=null!==(n=t.get(a))&&void 0!==n?n:0;return t.set(a,o+1),o?"".concat(a," (").concat(o+1,")"):a}))}(a);return o.map((function(e){return Object.fromEntries(i.map((function(t,r){var n;return[t,null!==(n=e[r])&&void 0!==n?n:""]})))}))},F=function(){var e=t(n.mark((function e(t,r){var a,o,i;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("pdf"!==r){e.next=10;break}return e.next=3,w(t);case 3:if((o=e.sent).ok){e.next=6;break}throw new Error("Could not read the file (".concat(o.status,")"));case 6:return e.next=8,o.blob();case 8:return i=e.sent,e.abrupt("return",URL.createObjectURL("application/pdf"===i.type?i:new Blob([i],{type:"application/pdf"})));case 10:if("csv"!==r){e.next=12;break}return e.abrupt("return",p(t));case 12:if("xlsx"!==r){e.next=27;break}return e.t0=g,e.next=16,f(t);case 16:if(e.t2=a=e.sent,e.t1=null!==e.t2,!e.t1){e.next=20;break}e.t1=void 0!==a;case 20:if(!e.t1){e.next=24;break}e.t3=a,e.next=25;break;case 24:e.t3=[];case 25:return e.t4=e.t3,e.abrupt("return",(0,e.t0)(e.t4));case 27:return e.abrupt("return",u(t));case 28:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),U=["pdf","text","table"],y=function(r){var u=r.item,f=k.getFileNameWithExtensionFromPath(u.name),p=x(f),w=u.src||u.downloadUrl||"",g=L[p],y=function(t,r,n){var i=a((function(){return{data:"",isLoading:!!t&&U.includes(n),hasFailed:!1}})),c=e(i,2),s=c[0],l=c[1];return o((function(){if(t&&U.includes(n)){var e=!0;l({data:"",isLoading:!0,hasFailed:!1});var a="";return F(t,r).then((function(t){"pdf"===n&&(a=t),e?l({data:t,isLoading:!1,hasFailed:!1}):a&&URL.revokeObjectURL(a)})).catch((function(r){console.error('Failed to read attachment "'.concat(t,'"'),r),e&&l({data:"",isLoading:!1,hasFailed:!0})})),function(){e=!1,a&&URL.revokeObjectURL(a)}}l({data:"",isLoading:!1,hasFailed:!1})}),[t,r,n]),s}(w,p,g),D=y.data,V=y.isLoading,C=y.hasFailed;if(V)return j("div",{className:v.documentState,"data-testid":"attachment-preview-loading",children:j(s,{size:"medium"})});var R=!!w&&!C;if(R&&"pdf"===g)return j("div",{className:v.documentFrame,children:j(m,{fileUrl:D,fileName:f})});if(R&&"table"===g)return j("div",{className:v.documentTable,children:j(d,{fileData:D})});if(R&&"text"===g)return j("div",{className:v.documentText,children:j(l,{fileData:D})});var T=C||!w&&!!g;return N("div",{className:v.documentState,"data-testid":"attachment-preview-fallback",children:[j(i,{name:f,size:48}),j("div",{className:v.fallbackName,children:f}),j("div",{className:v.fallbackHint,children:T?"This file could not be opened.":"No preview available for this file type."}),!(!u.downloadUrl&&!u.src)&&!u.hideDownload&&j("a",{href:u.downloadUrl||u.src,download:f,target:"_blank",rel:"noopener noreferrer",className:v.fallbackDownload,"data-testid":"attachment-preview-fallback-download",onClick:function(){var e=t(n.mark((function e(t){var r;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=u.downloadUrl||u.src||"",t.preventDefault(),e.next=4,h(r,f);case 4:if(e.sent){e.next=6;break}b(r);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),children:j(c,{type:"secondary",size:"medium",children:"Download"})})]})};export{y as AttachmentDocument};
|
|
2
2
|
//# sourceMappingURL=AttachmentDocument.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentDocument.js","sources":["../../../src/components/AttachmentLightbox/AttachmentDocument.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { FileIcon } from '../../componentsV2/FileIcon';\nimport { Button } from '../../componentsV2/Button';\nimport { LoaderCircular } from '../../componentsV2/LoaderCircular';\nimport { CsvViewer, PdfViewer, TextViewer } from '../NewDocumentViewer/components';\nimport { getCsvData, getTextData, getXlsxData } from '../NewDocumentViewer/utils';\nimport type { AttachmentPreviewItem } from '../AttachmentPreview/AttachmentPreview.types';\n\nimport { downloadAttachment, openAttachmentInNewTab } from './downloadAttachment';\n\nimport styles from './AttachmentLightbox.scss';\n\nimport { fetchAttachment } from '~/utils/fetchAttachment';\nimport { getFileExtension } from '~/utils/fileExtension';\nimport utils from '~/utils/main';\n\nconst RENDERERS = {\n pdf: 'pdf',\n csv: 'table',\n xlsx: 'table',\n txt: 'text',\n json: 'text',\n} as const;\n\ntype Renderer = typeof RENDERERS[keyof typeof RENDERERS];\n\ntype TableRow = Record<string, unknown>;\n\n/** The table viewer keys cells off the first row, so every column needs its own name. */\nconst toColumnNames = (header: string[]): string[] => {\n const seen = new Map<string, number>();\n\n return header.map((column, index) => {\n const name = column || `Column ${index + 1}`;\n const taken = seen.get(name) ?? 0;\n\n seen.set(name, taken + 1);\n\n return taken ? `${name} (${taken + 1})` : name;\n });\n};\n\nconst toTableRows = (rows: string[][]): TableRow[] => {\n const [header = [], ...body] = rows;\n const columns = toColumnNames(header);\n\n return body.map(row =>\n Object.fromEntries(columns.map((column, index) => [column, row[index] ?? '']))\n );\n};\n\nconst fetchData = async (src: string, extension: string) => {\n if (extension === 'pdf') {\n // The host serves this as a download, which navigates a frame to `about:blank` and shows\n // nothing. Holding the bytes ourselves lets the viewer render them whatever it was sent as.\n const blob = await (await fetchAttachment(src)).blob();\n\n return URL.createObjectURL(blob.type ? blob : new Blob([blob], { type: 'application/pdf' }));\n }\n if (extension === 'csv') return getCsvData(src);\n if (extension === 'xlsx') return toTableRows((await getXlsxData(src)) ?? []);\n\n return getTextData(src);\n};\n\nconst NEEDS_DATA: Renderer[] = ['pdf', 'text', 'table'];\nconst useDocumentData = (src: string, extension: string, renderer?: Renderer) => {\n const [state, setState] = useState<{\n data: string | TableRow[];\n isLoading: boolean;\n hasFailed: boolean;\n }>(() => ({\n data: '',\n isLoading: !!src && NEEDS_DATA.includes(renderer as Renderer),\n hasFailed: false,\n }));\n\n useEffect(() => {\n if (!src || !NEEDS_DATA.includes(renderer as Renderer)) {\n setState({ data: '', isLoading: false, hasFailed: false });\n\n return undefined;\n }\n\n let isActive = true;\n setState({ data: '', isLoading: true, hasFailed: false });\n\n let objectUrl = '';\n\n fetchData(src, extension)\n .then(data => {\n if (renderer === 'pdf') objectUrl = data as string;\n\n if (isActive) {\n setState({ data: data as string | TableRow[], isLoading: false, hasFailed: false });\n } else if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n })\n .catch(error => {\n console.error(`Failed to read attachment \"${src}\"`, error);\n if (isActive) setState({ data: '', isLoading: false, hasFailed: true });\n });\n\n return () => {\n isActive = false;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [src, extension, renderer]);\n\n return state;\n};\n\nexport type AttachmentDocumentProps = {\n item: AttachmentPreviewItem;\n};\n\nexport const AttachmentDocument = ({ item }: AttachmentDocumentProps) => {\n const fileName = utils.getFileNameWithExtensionFromPath(item.name);\n const extension = getFileExtension(fileName);\n const src = item.src || item.downloadUrl || '';\n const renderer: Renderer | undefined = RENDERERS[extension as keyof typeof RENDERERS];\n\n const { data, isLoading, hasFailed } = useDocumentData(src, extension, renderer);\n\n if (isLoading) {\n return (\n <div className={styles.documentState} data-testid=\"attachment-preview-loading\">\n <LoaderCircular size=\"medium\" />\n </div>\n );\n }\n\n const isRenderable = !!src && !hasFailed;\n\n if (isRenderable && renderer === 'pdf') {\n return (\n <div className={styles.documentFrame}>\n <PdfViewer fileUrl={data as string} fileName={fileName} />\n </div>\n );\n }\n\n if (isRenderable && renderer === 'table') {\n return (\n <div className={styles.documentTable}>\n <CsvViewer fileData={data as TableRow[]} />\n </div>\n );\n }\n\n if (isRenderable && renderer === 'text') {\n return (\n <div className={styles.documentText}>\n <TextViewer fileData={data as string} />\n </div>\n );\n }\n\n const isUnopenable = hasFailed || (!src && !!renderer);\n\n return (\n <div className={styles.documentState} data-testid=\"attachment-preview-fallback\">\n <FileIcon name={fileName} size={48} />\n <div className={styles.fallbackName}>{fileName}</div>\n <div className={styles.fallbackHint}>\n {isUnopenable\n ? 'This file could not be opened.'\n : 'No preview available for this file type.'}\n </div>\n {!!(item.downloadUrl || item.src) && !item.hideDownload && (\n <a\n href={item.downloadUrl || item.src}\n download={fileName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fallbackDownload}\n data-testid=\"attachment-preview-fallback-download\"\n onClick={async event => {\n const url = item.downloadUrl || item.src || '';\n event.preventDefault();\n\n if (!(await downloadAttachment(url, fileName))) openAttachmentInNewTab(url);\n }}\n >\n <Button type=\"secondary\" size=\"medium\">\n Download\n </Button>\n </a>\n )}\n </div>\n );\n};\n"],"names":["RENDERERS","pdf","csv","xlsx","txt","json","toTableRows","rows","_rows","_toArray","_rows$","header","body","slice","columns","seen","Map","map","column","index","_seen$get","name","taken","get","set","concat","toColumnNames","row","Object","fromEntries","_row$index","fetchData","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","src","extension","_yield$getXlsxData","blob","wrap","_context","prev","next","fetchAttachment","sent","abrupt","URL","createObjectURL","type","Blob","getCsvData","t0","getXlsxData","t2","t1","t3","t4","getTextData","stop","_x","_x2","apply","this","arguments","NEEDS_DATA","AttachmentDocument","_ref2","item","fileName","utils","getFileNameWithExtensionFromPath","getFileExtension","downloadUrl","renderer","_useDocumentData","_useState","useState","data","isLoading","includes","hasFailed","_useState2","_slicedToArray","state","setState","useEffect","isActive","objectUrl","then","revokeObjectURL","catch","error","console","useDocumentData","_jsx","className","styles","documentState","children","LoaderCircular","size","isRenderable","documentFrame","PdfViewer","fileUrl","documentTable","CsvViewer","fileData","documentText","TextViewer","isUnopenable","_jsxs","FileIcon","fallbackName","fallbackHint","hideDownload","href","download","target","rel","fallbackDownload","onClick","_ref3","event","url","_context2","preventDefault","downloadAttachment","openAttachmentInNewTab","_callee2","_x3","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AttachmentDocument.js","sources":["../../../src/components/AttachmentLightbox/AttachmentDocument.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { FileIcon } from '../../componentsV2/FileIcon';\nimport { Button } from '../../componentsV2/Button';\nimport { LoaderCircular } from '../../componentsV2/LoaderCircular';\nimport { CsvViewer, PdfViewer, TextViewer } from '../NewDocumentViewer/components';\nimport { getCsvData, getTextData, getXlsxData } from '../NewDocumentViewer/utils';\nimport type { AttachmentPreviewItem } from '../AttachmentPreview/AttachmentPreview.types';\n\nimport { downloadAttachment, openAttachmentInNewTab } from './downloadAttachment';\n\nimport styles from './AttachmentLightbox.scss';\n\nimport { fetchAttachment } from '~/utils/fetchAttachment';\nimport { getFileExtension } from '~/utils/fileExtension';\nimport utils from '~/utils/main';\n\nconst RENDERERS = {\n pdf: 'pdf',\n csv: 'table',\n xlsx: 'table',\n txt: 'text',\n json: 'text',\n} as const;\n\ntype Renderer = typeof RENDERERS[keyof typeof RENDERERS];\n\ntype TableRow = Record<string, unknown>;\n\n/** The table viewer keys cells off the first row, so every column needs its own name. */\nconst toColumnNames = (header: string[]): string[] => {\n const seen = new Map<string, number>();\n\n return header.map((column, index) => {\n const name = column || `Column ${index + 1}`;\n const taken = seen.get(name) ?? 0;\n\n seen.set(name, taken + 1);\n\n return taken ? `${name} (${taken + 1})` : name;\n });\n};\n\nconst toTableRows = (rows: string[][]): TableRow[] => {\n const [header = [], ...body] = rows;\n const columns = toColumnNames(header);\n\n return body.map(row =>\n Object.fromEntries(columns.map((column, index) => [column, row[index] ?? '']))\n );\n};\n\nconst PDF_MIME_TYPE = 'application/pdf';\n\nconst fetchData = async (src: string, extension: string) => {\n if (extension === 'pdf') {\n // The host serves this as a download, which navigates a frame to `about:blank` and shows\n // nothing. Holding the bytes ourselves lets the viewer render them whatever it was sent as.\n const response = await fetchAttachment(src);\n\n // A refused read answers with an XML error page; retyped below it would reach the viewer as\n // a \"pdf\" instead of the failure fallback.\n if (!response.ok) throw new Error(`Could not read the file (${response.status})`);\n\n const blob = await response.blob();\n\n // The frame renders a blob by its type alone: pipeline uploads (stage reports, PJRs) sit in\n // S3 as `application/octet-stream`, which the frame downloads instead of showing — so the\n // extension decides, not the header.\n return URL.createObjectURL(\n blob.type === PDF_MIME_TYPE ? blob : new Blob([blob], { type: PDF_MIME_TYPE })\n );\n }\n if (extension === 'csv') return getCsvData(src);\n if (extension === 'xlsx') return toTableRows((await getXlsxData(src)) ?? []);\n\n return getTextData(src);\n};\n\nconst NEEDS_DATA: Renderer[] = ['pdf', 'text', 'table'];\nconst useDocumentData = (src: string, extension: string, renderer?: Renderer) => {\n const [state, setState] = useState<{\n data: string | TableRow[];\n isLoading: boolean;\n hasFailed: boolean;\n }>(() => ({\n data: '',\n isLoading: !!src && NEEDS_DATA.includes(renderer as Renderer),\n hasFailed: false,\n }));\n\n useEffect(() => {\n if (!src || !NEEDS_DATA.includes(renderer as Renderer)) {\n setState({ data: '', isLoading: false, hasFailed: false });\n\n return undefined;\n }\n\n let isActive = true;\n setState({ data: '', isLoading: true, hasFailed: false });\n\n let objectUrl = '';\n\n fetchData(src, extension)\n .then(data => {\n if (renderer === 'pdf') objectUrl = data as string;\n\n if (isActive) {\n setState({ data: data as string | TableRow[], isLoading: false, hasFailed: false });\n } else if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n })\n .catch(error => {\n console.error(`Failed to read attachment \"${src}\"`, error);\n if (isActive) setState({ data: '', isLoading: false, hasFailed: true });\n });\n\n return () => {\n isActive = false;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [src, extension, renderer]);\n\n return state;\n};\n\nexport type AttachmentDocumentProps = {\n item: AttachmentPreviewItem;\n};\n\nexport const AttachmentDocument = ({ item }: AttachmentDocumentProps) => {\n const fileName = utils.getFileNameWithExtensionFromPath(item.name);\n const extension = getFileExtension(fileName);\n const src = item.src || item.downloadUrl || '';\n const renderer: Renderer | undefined = RENDERERS[extension as keyof typeof RENDERERS];\n\n const { data, isLoading, hasFailed } = useDocumentData(src, extension, renderer);\n\n if (isLoading) {\n return (\n <div className={styles.documentState} data-testid=\"attachment-preview-loading\">\n <LoaderCircular size=\"medium\" />\n </div>\n );\n }\n\n const isRenderable = !!src && !hasFailed;\n\n if (isRenderable && renderer === 'pdf') {\n return (\n <div className={styles.documentFrame}>\n <PdfViewer fileUrl={data as string} fileName={fileName} />\n </div>\n );\n }\n\n if (isRenderable && renderer === 'table') {\n return (\n <div className={styles.documentTable}>\n <CsvViewer fileData={data as TableRow[]} />\n </div>\n );\n }\n\n if (isRenderable && renderer === 'text') {\n return (\n <div className={styles.documentText}>\n <TextViewer fileData={data as string} />\n </div>\n );\n }\n\n const isUnopenable = hasFailed || (!src && !!renderer);\n\n return (\n <div className={styles.documentState} data-testid=\"attachment-preview-fallback\">\n <FileIcon name={fileName} size={48} />\n <div className={styles.fallbackName}>{fileName}</div>\n <div className={styles.fallbackHint}>\n {isUnopenable\n ? 'This file could not be opened.'\n : 'No preview available for this file type.'}\n </div>\n {!!(item.downloadUrl || item.src) && !item.hideDownload && (\n <a\n href={item.downloadUrl || item.src}\n download={fileName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fallbackDownload}\n data-testid=\"attachment-preview-fallback-download\"\n onClick={async event => {\n const url = item.downloadUrl || item.src || '';\n event.preventDefault();\n\n if (!(await downloadAttachment(url, fileName))) openAttachmentInNewTab(url);\n }}\n >\n <Button type=\"secondary\" size=\"medium\">\n Download\n </Button>\n </a>\n )}\n </div>\n );\n};\n"],"names":["RENDERERS","pdf","csv","xlsx","txt","json","toTableRows","rows","_rows","_toArray","_rows$","header","body","slice","columns","seen","Map","map","column","index","_seen$get","name","taken","get","set","concat","toColumnNames","row","Object","fromEntries","_row$index","fetchData","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","src","extension","_yield$getXlsxData","response","blob","wrap","_context","prev","next","fetchAttachment","sent","ok","Error","status","abrupt","URL","createObjectURL","type","Blob","getCsvData","t0","getXlsxData","t2","t1","t3","t4","getTextData","stop","_x","_x2","apply","this","arguments","NEEDS_DATA","AttachmentDocument","_ref2","item","fileName","utils","getFileNameWithExtensionFromPath","getFileExtension","downloadUrl","renderer","_useDocumentData","_useState","useState","data","isLoading","includes","hasFailed","_useState2","_slicedToArray","state","setState","useEffect","isActive","objectUrl","then","revokeObjectURL","catch","error","console","useDocumentData","_jsx","className","styles","documentState","children","LoaderCircular","size","isRenderable","documentFrame","PdfViewer","fileUrl","documentTable","CsvViewer","fileData","documentText","TextViewer","isUnopenable","_jsxs","FileIcon","fallbackName","fallbackHint","hideDownload","href","download","target","rel","fallbackDownload","onClick","_ref3","event","url","_context2","preventDefault","downloadAttachment","openAttachmentInNewTab","_callee2","_x3","Button"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAttachmentUpload.local.test.d.ts","sourceRoot":"","sources":["../../../../src/components/CommentComposer/__tests__/useAttachmentUpload.local.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttachmentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA4C,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,8CAA8C,CAAC;AAQtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAkD1C,eAAO,MAAM,mBAAmB,kEAO7B,0BAA0B;;;;
|
|
1
|
+
{"version":3,"file":"useAttachmentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA4C,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,8CAA8C,CAAC;AAQtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAkD1C,eAAO,MAAM,mBAAmB,kEAO7B,0BAA0B;;;;8BAgQjB,WAAW,CAAC,gBAAgB,CAAC;sBAtD7B,IAAI,EAAE;0BAnFR,MAAM;4BA8BE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;2BAuH9C,qBAAqB,CAAC,IAAI,CAAC;sBAW3B,qBAAqB,CAAC,IAAI,CAAC;qCAcnB,qBAAqB,CAAC,IAAI,CAAC,EAAE;;;;;;;CA2H7C,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as u,useRef as o,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d}from"../../clients/jsonApi/index.js";import{getUrlFileName as p}from"../../utils/links.js";import{getSignedLink as v,peekSignedLink as m}from"../../utils/signedLinkCache.js";function h(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function g(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?h(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):h(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var b=10,w=function(r){return r.type.startsWith("image/")?"image":r.type.startsWith("video/")?"video":"file"},U=function(r){return(r/1048576).toFixed(1)},y=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},j=0,O=function(){return"attachment-".concat(j+=1)},x=function(n){var h,b,j=n.value,x=n.onChange,k=n.onError,F=n.maxSizeBytes,L=n.maxFiles,P=void 0===L?10:L,z=n.accept,S=void 0===z?s:z,A=u([]),E=t(A,2),R=E[0],B=E[1],C=o(null),D=o(new Map),M=o(new Map),W=o([]),N=o(x),Y=o(k);N.current=x,Y.current=k;var I=o([]),T=l((function(r){var e=r(W.current);W.current=e,B(e),I.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),N.current(I.current)}),[]),_=l((function(r,e){return T((function(n){return n.map((function(n){return n.id===r?g(g({},n),e):n}))}))}),[T]),G=l((function(r){var e,n;null===(e=D.current.get(r))||void 0===e||e.abortUpload(),D.current.delete(r),M.current.set(r,(null!==(n=M.current.get(r))&&void 0!==n?n:0)+1)}),[]),K=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),q=l((function(){var r,e,n;null===(r=Y.current)||void 0===r||r.call(Y,null!==(e=null===(n=W.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){D.current.forEach((function(r){return r.abortUpload()})),D.current.clear(),W.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var H=l((function(r,n){var t,u=(null!==(t=M.current.get(r))&&void 0!==t?t:0)+1;M.current.set(r,u);var o,l,c=function(){return M.current.get(r)===u},f=function(e){var n;c()&&(_(r,{isUploading:!1,error:e}),null===(n=Y.current)||void 0===n||n.call(Y,e))},s="",p=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(g(g({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(o=e(i.mark((function e(){var t;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,v(s);case 3:if(t=e.sent,c()){e.next=6;break}return e.abrupt("return");case 6:D.current.delete(r),_(r,{isUploading:!1,error:null,uploaded:{url:t,name:s,size:n.size}}),q(),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 14:case"end":return e.stop()}}),e,null,[[0,11]])}))),function(){return o.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});D.current.set(r,p)}),[_,q]),J=l((function(e){var n,t=p(e);t&&(W.current.length>=P?null===(n=Y.current)||void 0===n||n.call(Y,"You can attach up to ".concat(P," files.")):W.current.some((function(r){var n;return(null===(n=r.uploaded)||void 0===n?void 0:n.url)===e}))||T((function(n){return[].concat(r(n),[{id:O(),name:t,file:null,previewUrl:e,isUploading:!1,error:null,uploaded:{url:e,name:t}}])})))}),[T,P]),Q=l(function(){var n=e(i.mark((function e(n){var t,u,o,l,c,a,f,s,d,p,m;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((o=n.filter((function(r,e,n){return!W.current.some((function(e){var n;return(null===(n=e.uploaded)||void 0===n?void 0:n.name)===r.fileName}))&&n.findIndex((function(e){return e.fileName===r.fileName}))===e}))).length){e.next=3;break}return e.abrupt("return");case 3:if(!((l=P-W.current.length)<=0)){e.next=7;break}return null===(c=Y.current)||void 0===c||c.call(Y,"You can attach up to ".concat(P," files.")),e.abrupt("return");case 7:return a=o.slice(0,l),e.next=10,Promise.all(a.map((function(r){return v(r.fileName).then((function(e){return{url:e,name:r.fileName,size:r.size}})).catch((function(){return null}))})));case 10:f=e.sent,s=f.filter(Boolean),d=0,s.length&&T((function(e){var n=s.slice(0,Math.max(P-e.length,0));return d=n.length,[].concat(r(e),r(n.map((function(r){return g(g({},y(r)),{},{id:O()})}))))})),p=f.length-s.length,m=o.length>a.length||d<s.length,null===(t=Y.current)||void 0===t||t.call(Y,p&&"Could not attach ".concat(1===p?"a file":"".concat(p," files")," from Wellhub.")||m&&"You can attach up to ".concat(P," files.")||(null===(u=W.current.find((function(r){return r.error})))||void 0===u?void 0:u.error)||null);case 17:case"end":return e.stop()}}),e)})));return function(r){return n.apply(this,arguments)}}(),[T,P]),V=l((function(e){var n,t,i,u,o=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,S)})),l=o.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(P," files."),a=P-W.current.length;if(!o.length||a<=0){var s;null===(s=Y.current)||void 0===s||s.call(Y,o.length?c:l)}else{var d=o.slice(0,a),p=d.map((function(r){var e=w(r),n=!!F&&r.size>F;return{id:O(),name:r.name,file:r,previewUrl:"file"===e?"":URL.createObjectURL(r),isUploading:!n,error:n?"File is too large (".concat(U(r.size)," MB). Maximum size is ").concat(U(F)," MB."):null,uploaded:null}}));T((function(e){return[].concat(r(e),r(p))}));var v=o.length>d.length?c:null;null===(n=Y.current)||void 0===n||n.call(Y,null!==(t=null!==(i=null===(u=W.current.find((function(r){return r.error})))||void 0===u?void 0:u.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return H(r.id,r.file)}))}}),[T,P,F,H,S]),X=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);C.current&&(C.current.value=""),n.length&&V(n)}),[V]),Z=l((function(){var r;return null===(r=C.current)||void 0===r?void 0:r.click()}),[]),$=l((function(r){var e=String(r);G(e),K(W.current.find((function(r){return r.id===e}))),T((function(r){return r.filter((function(r){return r.id!==e}))})),q()}),[G,K,T,q]),rr=l((function(r){var e=String(r),n=W.current.find((function(r){return r.id===e}));null!=n&&n.file&&(G(e),_(e,{isUploading:!0,error:null}),q(),H(e,n.file))}),[G,_,H,q]),er=l((function(e){return T((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),u=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(u))}))}),[T]),nr=l((function(){var r;W.current.forEach((function(r){G(r.id),K(r)})),T((function(){return[]})),null===(r=Y.current)||void 0===r||r.call(Y,null)}),[G,T,K]);c((function(){var r,e,n;(e=I.current,n=j,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(W.current.forEach((function(r){G(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),W.current=j.map(y),I.current=j,B(W.current),null===(r=Y.current)||void 0===r||r.call(Y,null))}),[j,G]);var tr=u((function(){return j.reduce((function(r,e){var n=m(e.name,"inline");return n&&(r[e.name]=n),r}),{})})),ir=t(tr,2),ur=ir[0],or=ir[1],lr=o(ur);lr.current=ur;var cr=R.filter((function(r){return!r.file&&!r.previewUrl&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=cr.split("|").filter((function(r){return r&&!(r in lr.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return v(r,"inline").then((function(e){return[r,e]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&or((function(e){return g(g({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[cr]),{items:R.reduce((function(r,e){var n;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:w(e.file),size:e.file.size,isUploading:e.isUploading,hideDownload:!0,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var t=e.uploaded,i=f(t),u=e.previewUrl||ur[t.name];return"file"===i||u?(r.push({id:e.id,name:t.name,src:u,kind:i,size:t.size,hideDownload:!0}),r):r}),[]),fileInputRef:C,openFileDialog:Z,handleFileSelect:X,addFiles:V,addLinkedImage:J,addStoredFiles:Q,removeAttachment:$,handleRetry:rr,reorderAttachments:er,clearAttachments:nr,isUploading:R.some((function(r){return r.isUploading})),error:null!==(h=null===(b=R.find((function(r){return r.error})))||void 0===b?void 0:b.error)&&void 0!==h?h:null,count:R.length,isFull:R.length>=P,maxFiles:P}};export{b as DEFAULT_MAX_ATTACHMENTS,x as useAttachmentUpload};
|
|
1
|
+
import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as u,useRef as o,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d}from"../../clients/jsonApi/index.js";import{getUrlFileName as p}from"../../utils/links.js";import{getSignedLink as v,peekSignedLink as m}from"../../utils/signedLinkCache.js";function h(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function g(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?h(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):h(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var b=10,w=function(r){return(r/1048576).toFixed(1)},U=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},y=0,j=function(){return"attachment-".concat(y+=1)},O=function(n){var h,b,y=n.value,O=n.onChange,x=n.onError,k=n.maxSizeBytes,F=n.maxFiles,L=void 0===F?10:F,P=n.accept,z=void 0===P?s:P,S=u([]),A=t(S,2),E=A[0],R=A[1],B=o(null),C=o(new Map),D=o(new Map),M=o([]),W=o(O),N=o(x);W.current=O,N.current=x;var Y=o([]),I=l((function(r){var e=r(M.current);M.current=e,R(e),Y.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),W.current(Y.current)}),[]),T=l((function(r,e){return I((function(n){return n.map((function(n){return n.id===r?g(g({},n),e):n}))}))}),[I]),_=l((function(r){var e,n;null===(e=C.current.get(r))||void 0===e||e.abortUpload(),C.current.delete(r),D.current.set(r,(null!==(n=D.current.get(r))&&void 0!==n?n:0)+1)}),[]),G=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),K=l((function(){var r,e,n;null===(r=N.current)||void 0===r||r.call(N,null!==(e=null===(n=M.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){C.current.forEach((function(r){return r.abortUpload()})),C.current.clear(),M.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var q=l((function(r,n){var t,u=(null!==(t=D.current.get(r))&&void 0!==t?t:0)+1;D.current.set(r,u);var o,l,c=function(){return D.current.get(r)===u},f=function(e){var n;c()&&(T(r,{isUploading:!1,error:e}),null===(n=N.current)||void 0===n||n.call(N,e))},s="",p=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(g(g({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(o=e(i.mark((function e(){var t;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,v(s);case 3:if(t=e.sent,c()){e.next=6;break}return e.abrupt("return");case 6:C.current.delete(r),T(r,{isUploading:!1,error:null,uploaded:{url:t,name:s,size:n.size}}),K(),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 14:case"end":return e.stop()}}),e,null,[[0,11]])}))),function(){return o.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});C.current.set(r,p)}),[T,K]),H=l((function(e){var n,t=p(e);t&&(M.current.length>=L?null===(n=N.current)||void 0===n||n.call(N,"You can attach up to ".concat(L," files.")):M.current.some((function(r){var n;return(null===(n=r.uploaded)||void 0===n?void 0:n.url)===e}))||I((function(n){return[].concat(r(n),[{id:j(),name:t,file:null,previewUrl:e,isUploading:!1,error:null,uploaded:{url:e,name:t}}])})))}),[I,L]),J=l(function(){var n=e(i.mark((function e(n){var t,u,o,l,c,a,f,s,d,p,m;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((o=n.filter((function(r,e,n){return!M.current.some((function(e){var n;return(null===(n=e.uploaded)||void 0===n?void 0:n.name)===r.fileName}))&&n.findIndex((function(e){return e.fileName===r.fileName}))===e}))).length){e.next=3;break}return e.abrupt("return");case 3:if(!((l=L-M.current.length)<=0)){e.next=7;break}return null===(c=N.current)||void 0===c||c.call(N,"You can attach up to ".concat(L," files.")),e.abrupt("return");case 7:return a=o.slice(0,l),e.next=10,Promise.all(a.map((function(r){return v(r.fileName).then((function(e){return{url:e,name:r.fileName,size:r.size}})).catch((function(){return null}))})));case 10:f=e.sent,s=f.filter(Boolean),d=0,s.length&&I((function(e){var n=s.slice(0,Math.max(L-e.length,0));return d=n.length,[].concat(r(e),r(n.map((function(r){return g(g({},U(r)),{},{id:j()})}))))})),p=f.length-s.length,m=o.length>a.length||d<s.length,null===(t=N.current)||void 0===t||t.call(N,p&&"Could not attach ".concat(1===p?"a file":"".concat(p," files")," from Wellhub.")||m&&"You can attach up to ".concat(L," files.")||(null===(u=M.current.find((function(r){return r.error})))||void 0===u?void 0:u.error)||null);case 17:case"end":return e.stop()}}),e)})));return function(r){return n.apply(this,arguments)}}(),[I,L]),Q=l((function(e){var n,t,i,u,o=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,z)})),l=o.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(L," files."),a=L-M.current.length;if(!o.length||a<=0){var s;null===(s=N.current)||void 0===s||s.call(N,o.length?c:l)}else{var d=o.slice(0,a),p=d.map((function(r){var e=!!k&&r.size>k;return{id:j(),name:r.name,file:r,previewUrl:URL.createObjectURL(r),isUploading:!e,error:e?"File is too large (".concat(w(r.size)," MB). Maximum size is ").concat(w(k)," MB."):null,uploaded:null}}));I((function(e){return[].concat(r(e),r(p))}));var v=o.length>d.length?c:null;null===(n=N.current)||void 0===n||n.call(N,null!==(t=null!==(i=null===(u=M.current.find((function(r){return r.error})))||void 0===u?void 0:u.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return q(r.id,r.file)}))}}),[I,L,k,q,z]),V=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);B.current&&(B.current.value=""),n.length&&Q(n)}),[Q]),X=l((function(){var r;return null===(r=B.current)||void 0===r?void 0:r.click()}),[]),Z=l((function(r){var e=String(r);_(e),G(M.current.find((function(r){return r.id===e}))),I((function(r){return r.filter((function(r){return r.id!==e}))})),K()}),[_,G,I,K]),$=l((function(r){var e=String(r),n=M.current.find((function(r){return r.id===e}));null!=n&&n.file&&(_(e),T(e,{isUploading:!0,error:null}),K(),q(e,n.file))}),[_,T,q,K]),rr=l((function(e){return I((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),u=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(u))}))}),[I]),er=l((function(){var r;M.current.forEach((function(r){_(r.id),G(r)})),I((function(){return[]})),null===(r=N.current)||void 0===r||r.call(N,null)}),[_,I,G]);c((function(){var r,e,n;(e=Y.current,n=y,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(M.current.forEach((function(r){_(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),M.current=y.map(U),Y.current=y,R(M.current),null===(r=N.current)||void 0===r||r.call(N,null))}),[y,_]);var nr=u((function(){return y.reduce((function(r,e){var n=m(e.name,"inline");return n&&(r[e.name]=n),r}),{})})),tr=t(nr,2),ir=tr[0],ur=tr[1],or=o(ir);or.current=ir;var lr=E.filter((function(r){return!r.file&&!r.previewUrl&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=lr.split("|").filter((function(r){return r&&!(r in or.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return v(r,"inline").then((function(e){return[r,e]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&ur((function(e){return g(g({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[lr]),{items:E.reduce((function(r,e){var n,t;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:(t=e.file,t.type.startsWith("image/")?"image":t.type.startsWith("video/")?"video":"file"),size:e.file.size,isUploading:e.isUploading,hideDownload:!0,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var i=e.uploaded,u=f(i),o=e.previewUrl||ir[i.name];return"file"===u||o?(r.push({id:e.id,name:i.name,src:o,kind:u,size:i.size,hideDownload:!0}),r):r}),[]),fileInputRef:B,openFileDialog:X,handleFileSelect:V,addFiles:Q,addLinkedImage:H,addStoredFiles:J,removeAttachment:Z,handleRetry:$,reorderAttachments:rr,clearAttachments:er,isUploading:E.some((function(r){return r.isUploading})),error:null!==(h=null===(b=E.find((function(r){return r.error})))||void 0===b?void 0:b.error)&&void 0!==h?h:null,count:E.length,isFull:E.length>=L,maxFiles:L}};export{b as DEFAULT_MAX_ATTACHMENTS,O as useAttachmentUpload};
|
|
2
2
|
//# sourceMappingURL=useAttachmentUpload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const url = await getSignedLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n /** Attaches files already in S3 (e.g. Wellhub picks): nothing to upload, the key is signed. */\n const addStoredFiles = useCallback(\n async (files: { fileName: string; size?: number }[]) => {\n const fresh = files.filter(\n (file, index, list) =>\n !entriesRef.current.some(entry => entry.uploaded?.name === file.fileName) &&\n list.findIndex(other => other.fileName === file.fileName) === index\n );\n if (!fresh.length) return;\n\n const room = maxFiles - entriesRef.current.length;\n if (room <= 0) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n const accepted = fresh.slice(0, room);\n const signed = await Promise.all(\n accepted.map(file =>\n getSignedLink(file.fileName)\n .then(url => ({ url, name: file.fileName, size: file.size }))\n .catch(() => null)\n )\n );\n const attachments = signed.filter(Boolean) as UploadedAttachment[];\n\n // Files may have been dropped in while the keys were signing, so re-check the room.\n let added = 0;\n if (attachments.length) {\n commit(prev => {\n const fitting = attachments.slice(0, Math.max(maxFiles - prev.length, 0));\n added = fitting.length;\n\n return [\n ...prev,\n ...fitting.map(attachment => ({ ...toStoredEntry(attachment), id: nextEntryId() })),\n ];\n });\n }\n\n const failed = signed.length - attachments.length;\n const overflow = fresh.length > accepted.length || added < attachments.length;\n onErrorRef.current?.(\n (failed &&\n `Could not attach ${failed === 1 ? 'a file' : `${failed} files`} from Wellhub.`) ||\n (overflow && `You can attach up to ${maxFiles} files.`) ||\n entriesRef.current.find(entry => entry.error)?.error ||\n null\n );\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>(() =>\n value.reduce<Record<string, string>>((acc, attachment) => {\n const src = peekSignedLink(attachment.name, 'inline');\n if (src) acc[attachment.name] = src;\n\n return acc;\n }, {})\n );\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getSignedLink(name, 'inline')\n .then(url => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n addStoredFiles,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_context2","getSignedLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addStoredFiles","_ref2","_onErrorRef$current5","_entriesRef$current$f3","fresh","room","_onErrorRef$current4","accepted","signed","attachments","added","failed","overflow","_context3","index","list","_entry$uploaded2","fileName","findIndex","other","slice","Promise","all","then","catch","fitting","Math","max","_callee3","_x3","addFiles","_onErrorRef$current7","_ref3","_entriesRef$current$f4","_entriesRef$current$f5","supported","split","rule","trim","toLowerCase","endsWith","getAttachmentKind","isAcceptedType","unsupported","tooMany","_onErrorRef$current6","kind","isTooLarge","createObjectURL","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current8","_onErrorRef$current9","a","b","every","_useState3","reduce","acc","src","peekSignedLink","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","console","resolved","_objectSpread","Object","fromEntries","items","_entry$error","push","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const url = await getSignedLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n /** Attaches files already in S3 (e.g. Wellhub picks): nothing to upload, the key is signed. */\n const addStoredFiles = useCallback(\n async (files: { fileName: string; size?: number }[]) => {\n const fresh = files.filter(\n (file, index, list) =>\n !entriesRef.current.some(entry => entry.uploaded?.name === file.fileName) &&\n list.findIndex(other => other.fileName === file.fileName) === index\n );\n if (!fresh.length) return;\n\n const room = maxFiles - entriesRef.current.length;\n if (room <= 0) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n const accepted = fresh.slice(0, room);\n const signed = await Promise.all(\n accepted.map(file =>\n getSignedLink(file.fileName)\n .then(url => ({ url, name: file.fileName, size: file.size }))\n .catch(() => null)\n )\n );\n const attachments = signed.filter(Boolean) as UploadedAttachment[];\n\n // Files may have been dropped in while the keys were signing, so re-check the room.\n let added = 0;\n if (attachments.length) {\n commit(prev => {\n const fitting = attachments.slice(0, Math.max(maxFiles - prev.length, 0));\n added = fitting.length;\n\n return [\n ...prev,\n ...fitting.map(attachment => ({ ...toStoredEntry(attachment), id: nextEntryId() })),\n ];\n });\n }\n\n const failed = signed.length - attachments.length;\n const overflow = fresh.length > accepted.length || added < attachments.length;\n onErrorRef.current?.(\n (failed &&\n `Could not attach ${failed === 1 ? 'a file' : `${failed} files`} from Wellhub.`) ||\n (overflow && `You can attach up to ${maxFiles} files.`) ||\n entriesRef.current.find(entry => entry.error)?.error ||\n null\n );\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n // Every kind gets an object url: media paints its thumbnail from it, and the\n // lightbox's document viewers read a draft pdf/csv/text through it — without one\n // the preview reports the file as unopenable until the comment is sent.\n previewUrl: URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>(() =>\n value.reduce<Record<string, string>>((acc, attachment) => {\n const src = peekSignedLink(attachment.name, 'inline');\n if (src) acc[attachment.name] = src;\n\n return acc;\n }, {})\n );\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getSignedLink(name, 'inline')\n .then(url => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n addStoredFiles,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","file","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","type","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_context2","getSignedLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addStoredFiles","_ref2","_onErrorRef$current5","_entriesRef$current$f3","fresh","room","_onErrorRef$current4","accepted","signed","attachments","added","failed","overflow","_context3","index","list","_entry$uploaded2","fileName","findIndex","other","slice","Promise","all","then","catch","fitting","Math","max","_callee3","_x3","addFiles","_onErrorRef$current7","_ref3","_entriesRef$current$f4","_entriesRef$current$f5","supported","split","rule","trim","toLowerCase","startsWith","endsWith","getAttachmentKind","isAcceptedType","unsupported","tooMany","_onErrorRef$current6","isTooLarge","createObjectURL","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current8","_onErrorRef$current9","a","b","every","_useState3","reduce","acc","src","peekSignedLink","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","console","resolved","_objectSpread","Object","fromEntries","items","_entry$error","push","kind","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSettingsDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AAO1D,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyBrB,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,oBAAoB,CAAC;IAClC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,oBAAoB,CAAC,EAAE,aAAa,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC;IACvE,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,oBAAoB,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC,CAAC;
|
|
1
|
+
{"version":3,"file":"AppSettingsDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AAO1D,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyBrB,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,oBAAoB,CAAC;IAClC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,oBAAoB,CAAC,EAAE,aAAa,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC;IACvE,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,oBAAoB,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC,CAAC;AAkBF,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAuSjD,CAAC;eAEa,iBAAiB"}
|