@neurodyn/react-room-viewer 0.0.10 → 0.0.12
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/dist/index.d.ts +2 -0
- package/dist/index.js +452 -155
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -106,6 +106,7 @@ declare const resources: {
|
|
|
106
106
|
readonly share: "Share";
|
|
107
107
|
readonly download: "Download";
|
|
108
108
|
readonly hideCatalog: "Hide catalog";
|
|
109
|
+
readonly description: "Description";
|
|
109
110
|
readonly interiorCardTitle: "Interior";
|
|
110
111
|
readonly tryAtHome: "Try at home";
|
|
111
112
|
readonly tryAtHomeBody: "Through your phone camera";
|
|
@@ -219,6 +220,7 @@ declare const resources: {
|
|
|
219
220
|
readonly share: "Поделиться";
|
|
220
221
|
readonly download: "Скачать";
|
|
221
222
|
readonly hideCatalog: "Скрыть каталог";
|
|
223
|
+
readonly description: "Описание";
|
|
222
224
|
readonly interiorCardTitle: "Интерьер";
|
|
223
225
|
readonly tryAtHome: "Примерить дома";
|
|
224
226
|
readonly tryAtHomeBody: "Через камеру телефона";
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { I18nextProvider, initReactI18next, useTranslation } from "react-i18next
|
|
|
5
5
|
import react_shadow from "react-shadow";
|
|
6
6
|
import i18next from "i18next";
|
|
7
7
|
import i18next_browser_languagedetector from "i18next-browser-languagedetector";
|
|
8
|
-
import { QueryClient, QueryClientProvider, useInfiniteQuery, useQueries, useQuery as react_query_useQuery } from "@tanstack/react-query";
|
|
8
|
+
import { QueryClient, QueryClientProvider, keepPreviousData, useInfiniteQuery, useQueries, useQuery as react_query_useQuery } from "@tanstack/react-query";
|
|
9
9
|
import axios, { AxiosHeaders, isAxiosError } from "axios";
|
|
10
10
|
import { Slot as react_slot_Slot, createSlot } from "@radix-ui/react-slot";
|
|
11
11
|
import { clsx } from "clsx";
|
|
@@ -710,6 +710,10 @@ var __webpack_modules__ = {
|
|
|
710
710
|
pointer-events: none;
|
|
711
711
|
}
|
|
712
712
|
|
|
713
|
+
.collapse {
|
|
714
|
+
visibility: collapse;
|
|
715
|
+
}
|
|
716
|
+
|
|
713
717
|
.invisible {
|
|
714
718
|
visibility: hidden;
|
|
715
719
|
}
|
|
@@ -1399,10 +1403,18 @@ var __webpack_modules__ = {
|
|
|
1399
1403
|
min-height: calc(var(--spacing) * 15);
|
|
1400
1404
|
}
|
|
1401
1405
|
|
|
1406
|
+
.min-h-16 {
|
|
1407
|
+
min-height: calc(var(--spacing) * 16);
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1402
1410
|
.min-h-22 {
|
|
1403
1411
|
min-height: calc(var(--spacing) * 22);
|
|
1404
1412
|
}
|
|
1405
1413
|
|
|
1414
|
+
.min-h-24 {
|
|
1415
|
+
min-height: calc(var(--spacing) * 24);
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1406
1418
|
.min-h-100 {
|
|
1407
1419
|
min-height: calc(var(--spacing) * 100);
|
|
1408
1420
|
}
|
|
@@ -1415,6 +1427,10 @@ var __webpack_modules__ = {
|
|
|
1415
1427
|
min-height: 97px;
|
|
1416
1428
|
}
|
|
1417
1429
|
|
|
1430
|
+
.min-h-\\[116px\\] {
|
|
1431
|
+
min-height: 116px;
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1418
1434
|
.min-h-max {
|
|
1419
1435
|
min-height: max-content;
|
|
1420
1436
|
}
|
|
@@ -1555,14 +1571,14 @@ var __webpack_modules__ = {
|
|
|
1555
1571
|
max-width: calc(var(--spacing) * 61);
|
|
1556
1572
|
}
|
|
1557
1573
|
|
|
1558
|
-
.max-w-80 {
|
|
1559
|
-
max-width: calc(var(--spacing) * 80);
|
|
1560
|
-
}
|
|
1561
|
-
|
|
1562
1574
|
.max-w-85 {
|
|
1563
1575
|
max-width: calc(var(--spacing) * 85);
|
|
1564
1576
|
}
|
|
1565
1577
|
|
|
1578
|
+
.max-w-100 {
|
|
1579
|
+
max-width: calc(var(--spacing) * 100);
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1566
1582
|
.max-w-151 {
|
|
1567
1583
|
max-width: calc(var(--spacing) * 151);
|
|
1568
1584
|
}
|
|
@@ -1823,6 +1839,10 @@ var __webpack_modules__ = {
|
|
|
1823
1839
|
flex-direction: row;
|
|
1824
1840
|
}
|
|
1825
1841
|
|
|
1842
|
+
.flex-nowrap {
|
|
1843
|
+
flex-wrap: nowrap;
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1826
1846
|
.flex-wrap {
|
|
1827
1847
|
flex-wrap: wrap;
|
|
1828
1848
|
}
|
|
@@ -1957,6 +1977,10 @@ var __webpack_modules__ = {
|
|
|
1957
1977
|
overscroll-behavior: contain;
|
|
1958
1978
|
}
|
|
1959
1979
|
|
|
1980
|
+
.rounded {
|
|
1981
|
+
border-radius: 4px;
|
|
1982
|
+
}
|
|
1983
|
+
|
|
1960
1984
|
.rounded-2xl {
|
|
1961
1985
|
border-radius: var(--radius-2xl);
|
|
1962
1986
|
}
|
|
@@ -6636,6 +6660,7 @@ const ns1 = {
|
|
|
6636
6660
|
share: 'Share',
|
|
6637
6661
|
download: 'Download',
|
|
6638
6662
|
hideCatalog: 'Hide catalog',
|
|
6663
|
+
description: "Description",
|
|
6639
6664
|
interiorCardTitle: 'Interior',
|
|
6640
6665
|
tryAtHome: 'Try at home',
|
|
6641
6666
|
tryAtHomeBody: 'Through your phone camera'
|
|
@@ -6748,6 +6773,7 @@ const ns1_ns1 = {
|
|
|
6748
6773
|
share: 'Поделиться',
|
|
6749
6774
|
download: 'Скачать',
|
|
6750
6775
|
hideCatalog: 'Скрыть каталог',
|
|
6776
|
+
description: 'Описание',
|
|
6751
6777
|
interiorCardTitle: 'Интерьер',
|
|
6752
6778
|
tryAtHome: 'Примерить дома',
|
|
6753
6779
|
tryAtHomeBody: 'Через камеру телефона'
|
|
@@ -6822,14 +6848,14 @@ function createShadowRootCssText(cssText) {
|
|
|
6822
6848
|
}
|
|
6823
6849
|
var styleinline = __webpack_require__("./src/style.css?inline");
|
|
6824
6850
|
const shadowRootCssText = createShadowRootCssText(styleinline.A);
|
|
6825
|
-
function
|
|
6851
|
+
function getRoomViewerBackendApiBaseUrl(baseUrl) {
|
|
6826
6852
|
const normalized = baseUrl?.trim().replace(/\/+$/, '') ?? '';
|
|
6827
|
-
if (!normalized || normalized.includes('/v1/http') || normalized.endsWith('/v1')) return normalized;
|
|
6853
|
+
if (!normalized || normalized.includes('/v1/http') || normalized.endsWith('/v1')) return normalized || void 0;
|
|
6828
6854
|
const httpSegmentIndex = normalized.indexOf('/http');
|
|
6829
6855
|
if (httpSegmentIndex >= 0) return `${normalized.slice(0, httpSegmentIndex)}/v1${normalized.slice(httpSegmentIndex)}`;
|
|
6830
6856
|
return `${normalized}/v1`;
|
|
6831
6857
|
}
|
|
6832
|
-
const shopifyProxyApiBaseUrl =
|
|
6858
|
+
const shopifyProxyApiBaseUrl = getRoomViewerBackendApiBaseUrl("/apps/vizbl-wall-art/http") ?? '';
|
|
6833
6859
|
function normalizeRoomViewerApiKey(apiKey) {
|
|
6834
6860
|
const trimmed = apiKey?.trim();
|
|
6835
6861
|
return trimmed || void 0;
|
|
@@ -6838,8 +6864,15 @@ function shouldUseRoomViewerPublicApi(options) {
|
|
|
6838
6864
|
return 'shopify' === options.source || void 0 !== options.apiKey;
|
|
6839
6865
|
}
|
|
6840
6866
|
function getRoomViewerPublicApiProductType(options) {
|
|
6867
|
+
if ('rugs' === options.resourceType) return 'rugs';
|
|
6868
|
+
if ('flooring' === options.resourceType) return 'flooring';
|
|
6841
6869
|
return 'shopify' === options.source ? 'wallart-shopify' : 'wallart';
|
|
6842
6870
|
}
|
|
6871
|
+
function getRoomViewerBackendProductType(options) {
|
|
6872
|
+
if ('rugs' === options.resourceType) return 'rugs';
|
|
6873
|
+
if ('flooring' === options.resourceType) return 'flooring';
|
|
6874
|
+
return 'wallart';
|
|
6875
|
+
}
|
|
6843
6876
|
function getRoomViewerAccessError(error) {
|
|
6844
6877
|
if (!isAxiosError(error)) return null;
|
|
6845
6878
|
const status = error.response?.status;
|
|
@@ -7353,6 +7386,17 @@ async function objFetch(data, config = {}) {
|
|
|
7353
7386
|
});
|
|
7354
7387
|
return res.data;
|
|
7355
7388
|
}
|
|
7389
|
+
async function objGetKitItems(data, config = {}) {
|
|
7390
|
+
const { client: request = client_client, ...requestConfig } = config;
|
|
7391
|
+
const requestData = data;
|
|
7392
|
+
const res = await request({
|
|
7393
|
+
method: "POST",
|
|
7394
|
+
url: "/obj/GetKitItems",
|
|
7395
|
+
data: requestData,
|
|
7396
|
+
...requestConfig
|
|
7397
|
+
});
|
|
7398
|
+
return res.data;
|
|
7399
|
+
}
|
|
7356
7400
|
async function objGetPublic(data, config = {}) {
|
|
7357
7401
|
const { client: request = client_client, ...requestConfig } = config;
|
|
7358
7402
|
const requestData = data;
|
|
@@ -7478,6 +7522,20 @@ function roomViewerOwnerObjectsQueryKey(ownerUuid, options) {
|
|
|
7478
7522
|
{
|
|
7479
7523
|
apiKey: options.apiKey ?? null,
|
|
7480
7524
|
ownerUuid: ownerUuid ?? null,
|
|
7525
|
+
resourceType: options.resourceType ?? null,
|
|
7526
|
+
source: options.source
|
|
7527
|
+
}
|
|
7528
|
+
];
|
|
7529
|
+
}
|
|
7530
|
+
function roomViewerKitObjectsQueryKey(kitUuid, ownerUuid, options) {
|
|
7531
|
+
return [
|
|
7532
|
+
'room-viewer',
|
|
7533
|
+
'kit-objects',
|
|
7534
|
+
{
|
|
7535
|
+
apiKey: options.apiKey ?? null,
|
|
7536
|
+
kitUuid: kitUuid ?? null,
|
|
7537
|
+
ownerUuid: ownerUuid ?? null,
|
|
7538
|
+
resourceType: options.resourceType ?? null,
|
|
7481
7539
|
source: options.source
|
|
7482
7540
|
}
|
|
7483
7541
|
];
|
|
@@ -7505,7 +7563,10 @@ async function fetchRoomViewerOwnerObjects(ownerUuid, page, options) {
|
|
|
7505
7563
|
ownerUuid
|
|
7506
7564
|
]
|
|
7507
7565
|
};
|
|
7508
|
-
if (!shouldUseRoomViewerPublicApi(options)) return objGetPublic(
|
|
7566
|
+
if (!shouldUseRoomViewerPublicApi(options)) return objGetPublic({
|
|
7567
|
+
...data,
|
|
7568
|
+
productType: getRoomViewerBackendProductType(options)
|
|
7569
|
+
}, {
|
|
7509
7570
|
signal: options.signal
|
|
7510
7571
|
});
|
|
7511
7572
|
const response = await publicApiControllerGetPublicObjects(data, {
|
|
@@ -7521,6 +7582,23 @@ async function fetchRoomViewerOwnerObjects(ownerUuid, page, options) {
|
|
|
7521
7582
|
pages_count: response.pages_count
|
|
7522
7583
|
};
|
|
7523
7584
|
}
|
|
7585
|
+
async function fetchRoomViewerKitObjects(kitUuid, _ownerUuid, page, options) {
|
|
7586
|
+
const response = await objGetKitItems({
|
|
7587
|
+
folder: {
|
|
7588
|
+
uuid: kitUuid,
|
|
7589
|
+
type: 'kit'
|
|
7590
|
+
},
|
|
7591
|
+
page
|
|
7592
|
+
}, {
|
|
7593
|
+
baseURL: getRoomViewerBackendApiBaseUrl(options.baseURL),
|
|
7594
|
+
signal: options.signal
|
|
7595
|
+
});
|
|
7596
|
+
return {
|
|
7597
|
+
folder: response.folder,
|
|
7598
|
+
objs: response.objs,
|
|
7599
|
+
pages_count: response.pagesCount
|
|
7600
|
+
};
|
|
7601
|
+
}
|
|
7524
7602
|
function roomViewerRoomsQueryKey(options) {
|
|
7525
7603
|
return [
|
|
7526
7604
|
'room-viewer',
|
|
@@ -8430,6 +8508,262 @@ function FloorErrorDialog({ variant, open, portalContainer, showDialogCloseButto
|
|
|
8430
8508
|
})
|
|
8431
8509
|
});
|
|
8432
8510
|
}
|
|
8511
|
+
function select_Select({ ...props }) {
|
|
8512
|
+
return /*#__PURE__*/ jsx_runtime_jsx(Select.Root, {
|
|
8513
|
+
"data-slot": "select",
|
|
8514
|
+
...props
|
|
8515
|
+
});
|
|
8516
|
+
}
|
|
8517
|
+
function SelectValue({ ...props }) {
|
|
8518
|
+
return /*#__PURE__*/ jsx_runtime_jsx(Select.Value, {
|
|
8519
|
+
"data-slot": "select-value",
|
|
8520
|
+
...props
|
|
8521
|
+
});
|
|
8522
|
+
}
|
|
8523
|
+
function SelectTrigger({ className, size = 'default', children, ...props }) {
|
|
8524
|
+
return /*#__PURE__*/ jsxs(Select.Trigger, {
|
|
8525
|
+
"data-slot": "select-trigger",
|
|
8526
|
+
"data-size": size,
|
|
8527
|
+
className: utils_cn('flex w-fit items-center justify-between gap-2 whitespace-nowrap rounded-md border bg-background-white shadow-sm outline-none transition-colors cursor-pointer', 'border-border-medium', 'text-text-dark', 'hover:border-border-dark', 'focus-visible:border-border-dark', 'aria-invalid:border-border-red', 'disabled:cursor-not-allowed disabled:border-border-medium disabled:bg-background-base disabled:opacity-40', 'data-[size=default]:h-11 data-[size=default]:px-2 data-[size=default]:py-2.5 data-[size=default]:typo-base-16', 'data-[size=md]:h-9 data-[size=md]:px-2 data-[size=md]:py-2 data-[size=md]:typo-base-14', 'data-[size=sm]:h-[1.875rem] data-[size=sm]:px-2 data-[size=sm]:typo-base-12', '*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2', '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-6 [&_svg:not([class*=text-])]:text-text-dark', className),
|
|
8528
|
+
...props,
|
|
8529
|
+
children: [
|
|
8530
|
+
children,
|
|
8531
|
+
/*#__PURE__*/ jsx_runtime_jsx(Select.Icon, {
|
|
8532
|
+
asChild: true,
|
|
8533
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(DropDownArrow, {
|
|
8534
|
+
className: "size-6"
|
|
8535
|
+
})
|
|
8536
|
+
})
|
|
8537
|
+
]
|
|
8538
|
+
});
|
|
8539
|
+
}
|
|
8540
|
+
function SelectContent({ className, children, position = 'item-aligned', align = 'center', portalContainer, ...props }) {
|
|
8541
|
+
return /*#__PURE__*/ jsx_runtime_jsx(Select.Portal, {
|
|
8542
|
+
container: portalContainer,
|
|
8543
|
+
children: /*#__PURE__*/ jsxs(Select.Content, {
|
|
8544
|
+
"data-slot": "select-content",
|
|
8545
|
+
className: utils_cn('relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xl border bg-background-white text-text-dark shadow-md', 'border-border-medium', 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', 'popper' === position && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className),
|
|
8546
|
+
position: position,
|
|
8547
|
+
align: align,
|
|
8548
|
+
...props,
|
|
8549
|
+
children: [
|
|
8550
|
+
/*#__PURE__*/ jsx_runtime_jsx(SelectScrollUpButton, {}),
|
|
8551
|
+
/*#__PURE__*/ jsx_runtime_jsx(Select.Viewport, {
|
|
8552
|
+
className: utils_cn('p-1', 'popper' === position && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1'),
|
|
8553
|
+
children: children
|
|
8554
|
+
}),
|
|
8555
|
+
/*#__PURE__*/ jsx_runtime_jsx(SelectScrollDownButton, {})
|
|
8556
|
+
]
|
|
8557
|
+
})
|
|
8558
|
+
});
|
|
8559
|
+
}
|
|
8560
|
+
function SelectItem({ className, children, ...props }) {
|
|
8561
|
+
return /*#__PURE__*/ jsxs(Select.Item, {
|
|
8562
|
+
"data-slot": "select-item",
|
|
8563
|
+
className: utils_cn('relative flex w-full cursor-pointer select-none items-center gap-2 rounded-md py-2.5 pr-8 pl-3 outline-hidden', 'typo-base-16 text-text-sub', 'focus:bg-background-base focus:text-text-dark', 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50', '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-6 [&_svg:not([class*=text-])]:text-text-dark', '*:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2', className),
|
|
8564
|
+
...props,
|
|
8565
|
+
children: [
|
|
8566
|
+
/*#__PURE__*/ jsx_runtime_jsx("span", {
|
|
8567
|
+
"data-slot": "select-item-indicator",
|
|
8568
|
+
className: "absolute right-2 flex size-6 items-center justify-center",
|
|
8569
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(Select.ItemIndicator, {
|
|
8570
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(CheckDone, {
|
|
8571
|
+
className: "size-5"
|
|
8572
|
+
})
|
|
8573
|
+
})
|
|
8574
|
+
}),
|
|
8575
|
+
/*#__PURE__*/ jsx_runtime_jsx(Select.ItemText, {
|
|
8576
|
+
children: children
|
|
8577
|
+
})
|
|
8578
|
+
]
|
|
8579
|
+
});
|
|
8580
|
+
}
|
|
8581
|
+
function SelectScrollUpButton({ className, ...props }) {
|
|
8582
|
+
return /*#__PURE__*/ jsx_runtime_jsx(Select.ScrollUpButton, {
|
|
8583
|
+
"data-slot": "select-scroll-up-button",
|
|
8584
|
+
className: utils_cn('flex cursor-default items-center justify-center py-1', className),
|
|
8585
|
+
...props,
|
|
8586
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(ChevronUpIcon, {
|
|
8587
|
+
className: "size-4"
|
|
8588
|
+
})
|
|
8589
|
+
});
|
|
8590
|
+
}
|
|
8591
|
+
function SelectScrollDownButton({ className, ...props }) {
|
|
8592
|
+
return /*#__PURE__*/ jsx_runtime_jsx(Select.ScrollDownButton, {
|
|
8593
|
+
"data-slot": "select-scroll-down-button",
|
|
8594
|
+
className: utils_cn('flex cursor-default items-center justify-center py-1', className),
|
|
8595
|
+
...props,
|
|
8596
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(ChevronDownIcon, {
|
|
8597
|
+
className: "size-4"
|
|
8598
|
+
})
|
|
8599
|
+
});
|
|
8600
|
+
}
|
|
8601
|
+
const EXPLICIT_SCHEME_PATTERN = /^[a-z][a-z\d+.-]*:/i;
|
|
8602
|
+
function normalizeDestinationUrl(value) {
|
|
8603
|
+
const trimmedValue = value?.trim();
|
|
8604
|
+
if (!trimmedValue) return;
|
|
8605
|
+
if (EXPLICIT_SCHEME_PATTERN.test(trimmedValue) && !/^https?:/i.test(trimmedValue) || /^[./?#]/.test(trimmedValue) && !trimmedValue.startsWith('//')) return;
|
|
8606
|
+
const candidate = trimmedValue.startsWith('//') ? `https:${trimmedValue}` : /^https?:/i.test(trimmedValue) ? trimmedValue : `https://${trimmedValue}`;
|
|
8607
|
+
try {
|
|
8608
|
+
const url = new URL(candidate);
|
|
8609
|
+
if ('http:' !== url.protocol && 'https:' !== url.protocol || !url.hostname) return;
|
|
8610
|
+
return url.href;
|
|
8611
|
+
} catch {
|
|
8612
|
+
return;
|
|
8613
|
+
}
|
|
8614
|
+
}
|
|
8615
|
+
const DEFAULT_ROOM_VIEWER_DIMENSION_UNIT = 'm';
|
|
8616
|
+
function convertRoomViewerDimensionToMeters(value, unit = DEFAULT_ROOM_VIEWER_DIMENSION_UNIT) {
|
|
8617
|
+
switch(unit){
|
|
8618
|
+
case 'cm':
|
|
8619
|
+
return value / 100;
|
|
8620
|
+
case 'in':
|
|
8621
|
+
return 0.0254 * value;
|
|
8622
|
+
case 'm':
|
|
8623
|
+
return value;
|
|
8624
|
+
}
|
|
8625
|
+
}
|
|
8626
|
+
function normalizeRoomViewerDimensions(width, height, unit = DEFAULT_ROOM_VIEWER_DIMENSION_UNIT) {
|
|
8627
|
+
return {
|
|
8628
|
+
width: convertRoomViewerDimensionToMeters(width ?? 0, unit),
|
|
8629
|
+
height: convertRoomViewerDimensionToMeters(height ?? 0, unit)
|
|
8630
|
+
};
|
|
8631
|
+
}
|
|
8632
|
+
function convertRoomViewerDimensionFromMeters(value, unit) {
|
|
8633
|
+
switch(unit){
|
|
8634
|
+
case 'cm':
|
|
8635
|
+
return 100 * value;
|
|
8636
|
+
case 'in':
|
|
8637
|
+
return value / 0.0254;
|
|
8638
|
+
}
|
|
8639
|
+
}
|
|
8640
|
+
function formatRoomViewerDisplayDimension(value, unit) {
|
|
8641
|
+
const convertedValue = convertRoomViewerDimensionFromMeters(value, unit);
|
|
8642
|
+
return Number(convertedValue.toFixed(2)).toString();
|
|
8643
|
+
}
|
|
8644
|
+
const CM_PER_METER = 100;
|
|
8645
|
+
function formatRugSizeLabel(sizeCm, displayUnit, unitLabel) {
|
|
8646
|
+
const formattedSides = sizeCm.split('×').map((side)=>{
|
|
8647
|
+
if ('cm' === displayUnit) return side;
|
|
8648
|
+
const meters = Number(side) / CM_PER_METER;
|
|
8649
|
+
const converted = convertRoomViewerDimensionFromMeters(meters, displayUnit);
|
|
8650
|
+
return Math.round(converted).toString();
|
|
8651
|
+
}).join('×');
|
|
8652
|
+
return `${formattedSides} ${unitLabel}`;
|
|
8653
|
+
}
|
|
8654
|
+
const META_PREFIX = 'vizbl-rug:';
|
|
8655
|
+
function decodeRugSizeMeta(description) {
|
|
8656
|
+
if (!description?.startsWith(META_PREFIX)) return null;
|
|
8657
|
+
try {
|
|
8658
|
+
const parsed = JSON.parse(description.slice(META_PREFIX.length));
|
|
8659
|
+
if ('string' != typeof parsed.size) return null;
|
|
8660
|
+
return {
|
|
8661
|
+
size: parsed.size,
|
|
8662
|
+
shape: 'round' === parsed.shape ? 'round' : 'rect'
|
|
8663
|
+
};
|
|
8664
|
+
} catch {
|
|
8665
|
+
return null;
|
|
8666
|
+
}
|
|
8667
|
+
}
|
|
8668
|
+
function toSizeItem(object) {
|
|
8669
|
+
if (!object.tinuuid || !object.materials?.[0]) return null;
|
|
8670
|
+
const meta = decodeRugSizeMeta(object.description);
|
|
8671
|
+
if (!meta) return null;
|
|
8672
|
+
return {
|
|
8673
|
+
tinuuid: object.tinuuid,
|
|
8674
|
+
size: meta.size,
|
|
8675
|
+
shape: meta.shape
|
|
8676
|
+
};
|
|
8677
|
+
}
|
|
8678
|
+
function getNextSizesPage(lastPage, lastPageParam) {
|
|
8679
|
+
if (void 0 !== lastPage.pages_count) return lastPageParam + 1 < lastPage.pages_count ? lastPageParam + 1 : void 0;
|
|
8680
|
+
return lastPage.objs?.length ? lastPageParam + 1 : void 0;
|
|
8681
|
+
}
|
|
8682
|
+
function useRoomViewerSizeCatalog() {
|
|
8683
|
+
const { tinuuid, setMaterial, setTinuuid, apiKey, baseURL, source, widgetSession } = useRoomViewerResource();
|
|
8684
|
+
const { type } = useRoomViewerMetadata();
|
|
8685
|
+
const { data: activeObject } = react_query_useQuery({
|
|
8686
|
+
queryKey: roomViewerObjectQueryKey(tinuuid ?? void 0, {
|
|
8687
|
+
apiKey,
|
|
8688
|
+
baseURL,
|
|
8689
|
+
source,
|
|
8690
|
+
resourceType: type
|
|
8691
|
+
}),
|
|
8692
|
+
enabled: 'rugs' === type && Boolean(tinuuid),
|
|
8693
|
+
placeholderData: keepPreviousData,
|
|
8694
|
+
queryFn: ({ signal })=>{
|
|
8695
|
+
if (!tinuuid) throw new Error('Tinuuid is required.');
|
|
8696
|
+
return fetchRoomViewerObject(tinuuid, {
|
|
8697
|
+
apiKey,
|
|
8698
|
+
baseURL,
|
|
8699
|
+
signal,
|
|
8700
|
+
source,
|
|
8701
|
+
widgetSession,
|
|
8702
|
+
resourceType: type
|
|
8703
|
+
});
|
|
8704
|
+
}
|
|
8705
|
+
});
|
|
8706
|
+
const kitUuid = activeObject?.kit?.uuid;
|
|
8707
|
+
const ownerUuid = activeObject?.owner?.uuid;
|
|
8708
|
+
useEffect(()=>{
|
|
8709
|
+
const nextMaterial = activeObject?.materials?.[0];
|
|
8710
|
+
if (activeObject?.tinuuid === tinuuid && nextMaterial) setMaterial(nextMaterial);
|
|
8711
|
+
}, [
|
|
8712
|
+
activeObject,
|
|
8713
|
+
setMaterial,
|
|
8714
|
+
tinuuid
|
|
8715
|
+
]);
|
|
8716
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isFetchNextPageError } = useInfiniteQuery({
|
|
8717
|
+
queryKey: roomViewerKitObjectsQueryKey(kitUuid, ownerUuid, {
|
|
8718
|
+
apiKey,
|
|
8719
|
+
baseURL,
|
|
8720
|
+
source,
|
|
8721
|
+
resourceType: type
|
|
8722
|
+
}),
|
|
8723
|
+
enabled: 'rugs' === type && Boolean(kitUuid) && Boolean(ownerUuid),
|
|
8724
|
+
queryFn: ({ pageParam, signal })=>{
|
|
8725
|
+
if (!kitUuid || !ownerUuid) throw new Error('Kit uuid and owner uuid are required.');
|
|
8726
|
+
return fetchRoomViewerKitObjects(kitUuid, ownerUuid, pageParam, {
|
|
8727
|
+
apiKey,
|
|
8728
|
+
baseURL,
|
|
8729
|
+
signal,
|
|
8730
|
+
source,
|
|
8731
|
+
widgetSession,
|
|
8732
|
+
resourceType: type
|
|
8733
|
+
});
|
|
8734
|
+
},
|
|
8735
|
+
initialPageParam: 0,
|
|
8736
|
+
getNextPageParam: (lastPage, _, lastPageParam)=>getNextSizesPage(lastPage, lastPageParam)
|
|
8737
|
+
});
|
|
8738
|
+
useEffect(()=>{
|
|
8739
|
+
if (hasNextPage && !isFetchingNextPage && !isFetchNextPageError) fetchNextPage({
|
|
8740
|
+
cancelRefetch: false
|
|
8741
|
+
});
|
|
8742
|
+
}, [
|
|
8743
|
+
fetchNextPage,
|
|
8744
|
+
hasNextPage,
|
|
8745
|
+
isFetchingNextPage,
|
|
8746
|
+
isFetchNextPageError
|
|
8747
|
+
]);
|
|
8748
|
+
const objects = external_react_useMemo(()=>data?.pages.flatMap((page)=>page.objs ?? []) ?? [], [
|
|
8749
|
+
data
|
|
8750
|
+
]);
|
|
8751
|
+
const sizeItems = external_react_useMemo(()=>objects.map(toSizeItem).filter((item)=>null !== item), [
|
|
8752
|
+
objects
|
|
8753
|
+
]);
|
|
8754
|
+
const selectSize = (targetTinuuid)=>{
|
|
8755
|
+
const isKnownSizeItem = sizeItems.some((item)=>item.tinuuid === targetTinuuid);
|
|
8756
|
+
if (!isKnownSizeItem) return false;
|
|
8757
|
+
setTinuuid(targetTinuuid);
|
|
8758
|
+
return true;
|
|
8759
|
+
};
|
|
8760
|
+
return {
|
|
8761
|
+
selectedDestinationUrl: activeObject?.tinuuid === tinuuid ? activeObject.destinationUrl : void 0,
|
|
8762
|
+
sizeItems,
|
|
8763
|
+
selectedTinuuid: tinuuid,
|
|
8764
|
+
selectSize
|
|
8765
|
+
};
|
|
8766
|
+
}
|
|
8433
8767
|
function label_Label({ className, ...props }) {
|
|
8434
8768
|
return /*#__PURE__*/ jsx_runtime_jsx(Label.Root, {
|
|
8435
8769
|
"data-slot": "label",
|
|
@@ -8588,96 +8922,6 @@ function useMediaQuery(query, { defaultValue = false, initializeWithValue = true
|
|
|
8588
8922
|
]);
|
|
8589
8923
|
return matches;
|
|
8590
8924
|
}
|
|
8591
|
-
function select_Select({ ...props }) {
|
|
8592
|
-
return /*#__PURE__*/ jsx_runtime_jsx(Select.Root, {
|
|
8593
|
-
"data-slot": "select",
|
|
8594
|
-
...props
|
|
8595
|
-
});
|
|
8596
|
-
}
|
|
8597
|
-
function SelectValue({ ...props }) {
|
|
8598
|
-
return /*#__PURE__*/ jsx_runtime_jsx(Select.Value, {
|
|
8599
|
-
"data-slot": "select-value",
|
|
8600
|
-
...props
|
|
8601
|
-
});
|
|
8602
|
-
}
|
|
8603
|
-
function SelectTrigger({ className, size = 'default', children, ...props }) {
|
|
8604
|
-
return /*#__PURE__*/ jsxs(Select.Trigger, {
|
|
8605
|
-
"data-slot": "select-trigger",
|
|
8606
|
-
"data-size": size,
|
|
8607
|
-
className: utils_cn('flex w-fit items-center justify-between gap-2 whitespace-nowrap rounded-md border bg-background-white shadow-sm outline-none transition-colors cursor-pointer', 'border-border-medium', 'text-text-dark', 'hover:border-border-dark', 'focus-visible:border-border-dark', 'aria-invalid:border-border-red', 'disabled:cursor-not-allowed disabled:border-border-medium disabled:bg-background-base disabled:opacity-40', 'data-[size=default]:h-11 data-[size=default]:px-2 data-[size=default]:py-2.5 data-[size=default]:typo-base-16', 'data-[size=md]:h-9 data-[size=md]:px-2 data-[size=md]:py-2 data-[size=md]:typo-base-14', 'data-[size=sm]:h-[1.875rem] data-[size=sm]:px-2 data-[size=sm]:typo-base-12', '*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2', '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-6 [&_svg:not([class*=text-])]:text-text-dark', className),
|
|
8608
|
-
...props,
|
|
8609
|
-
children: [
|
|
8610
|
-
children,
|
|
8611
|
-
/*#__PURE__*/ jsx_runtime_jsx(Select.Icon, {
|
|
8612
|
-
asChild: true,
|
|
8613
|
-
children: /*#__PURE__*/ jsx_runtime_jsx(DropDownArrow, {
|
|
8614
|
-
className: "size-6"
|
|
8615
|
-
})
|
|
8616
|
-
})
|
|
8617
|
-
]
|
|
8618
|
-
});
|
|
8619
|
-
}
|
|
8620
|
-
function SelectContent({ className, children, position = 'item-aligned', align = 'center', portalContainer, ...props }) {
|
|
8621
|
-
return /*#__PURE__*/ jsx_runtime_jsx(Select.Portal, {
|
|
8622
|
-
container: portalContainer,
|
|
8623
|
-
children: /*#__PURE__*/ jsxs(Select.Content, {
|
|
8624
|
-
"data-slot": "select-content",
|
|
8625
|
-
className: utils_cn('relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xl border bg-background-white text-text-dark shadow-md', 'border-border-medium', 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', 'popper' === position && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className),
|
|
8626
|
-
position: position,
|
|
8627
|
-
align: align,
|
|
8628
|
-
...props,
|
|
8629
|
-
children: [
|
|
8630
|
-
/*#__PURE__*/ jsx_runtime_jsx(SelectScrollUpButton, {}),
|
|
8631
|
-
/*#__PURE__*/ jsx_runtime_jsx(Select.Viewport, {
|
|
8632
|
-
className: utils_cn('p-1', 'popper' === position && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1'),
|
|
8633
|
-
children: children
|
|
8634
|
-
}),
|
|
8635
|
-
/*#__PURE__*/ jsx_runtime_jsx(SelectScrollDownButton, {})
|
|
8636
|
-
]
|
|
8637
|
-
})
|
|
8638
|
-
});
|
|
8639
|
-
}
|
|
8640
|
-
function SelectItem({ className, children, ...props }) {
|
|
8641
|
-
return /*#__PURE__*/ jsxs(Select.Item, {
|
|
8642
|
-
"data-slot": "select-item",
|
|
8643
|
-
className: utils_cn('relative flex w-full cursor-pointer select-none items-center gap-2 rounded-md py-2.5 pr-8 pl-3 outline-hidden', 'typo-base-16 text-text-sub', 'focus:bg-background-base focus:text-text-dark', 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50', '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-6 [&_svg:not([class*=text-])]:text-text-dark', '*:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2', className),
|
|
8644
|
-
...props,
|
|
8645
|
-
children: [
|
|
8646
|
-
/*#__PURE__*/ jsx_runtime_jsx("span", {
|
|
8647
|
-
"data-slot": "select-item-indicator",
|
|
8648
|
-
className: "absolute right-2 flex size-6 items-center justify-center",
|
|
8649
|
-
children: /*#__PURE__*/ jsx_runtime_jsx(Select.ItemIndicator, {
|
|
8650
|
-
children: /*#__PURE__*/ jsx_runtime_jsx(CheckDone, {
|
|
8651
|
-
className: "size-5"
|
|
8652
|
-
})
|
|
8653
|
-
})
|
|
8654
|
-
}),
|
|
8655
|
-
/*#__PURE__*/ jsx_runtime_jsx(Select.ItemText, {
|
|
8656
|
-
children: children
|
|
8657
|
-
})
|
|
8658
|
-
]
|
|
8659
|
-
});
|
|
8660
|
-
}
|
|
8661
|
-
function SelectScrollUpButton({ className, ...props }) {
|
|
8662
|
-
return /*#__PURE__*/ jsx_runtime_jsx(Select.ScrollUpButton, {
|
|
8663
|
-
"data-slot": "select-scroll-up-button",
|
|
8664
|
-
className: utils_cn('flex cursor-default items-center justify-center py-1', className),
|
|
8665
|
-
...props,
|
|
8666
|
-
children: /*#__PURE__*/ jsx_runtime_jsx(ChevronUpIcon, {
|
|
8667
|
-
className: "size-4"
|
|
8668
|
-
})
|
|
8669
|
-
});
|
|
8670
|
-
}
|
|
8671
|
-
function SelectScrollDownButton({ className, ...props }) {
|
|
8672
|
-
return /*#__PURE__*/ jsx_runtime_jsx(Select.ScrollDownButton, {
|
|
8673
|
-
"data-slot": "select-scroll-down-button",
|
|
8674
|
-
className: utils_cn('flex cursor-default items-center justify-center py-1', className),
|
|
8675
|
-
...props,
|
|
8676
|
-
children: /*#__PURE__*/ jsx_runtime_jsx(ChevronDownIcon, {
|
|
8677
|
-
className: "size-4"
|
|
8678
|
-
})
|
|
8679
|
-
});
|
|
8680
|
-
}
|
|
8681
8925
|
var floor_bathroom_scene_namespaceObject = JSON.parse('{"version":1,"image":{"width":1152,"height":768,"fileName":"bathroom.jpg"},"camera":{"fovYDeg":46.95,"fx":884.1691,"fy":589.446,"cx":255.9992,"cy":256.0003,"net":512,"frame":"+X right, +Y down, +Z forward; meters; OpenCV"},"planes":[{"id":1,"kind":"floor","polygon3D":[[-4.9139,1.1239,0.1328],[1.7293,1.1239,-1.9012],[4.8937,0.9661,8.4344],[-1.7494,0.9661,10.4683]],"polygon2D":[[-73044.5,7868],[69379.5,20259],[1730.3,485.3],[243.5,465.6]],"pixelCount":64473},{"id":2,"kind":"wall","polygon3D":[[-1.8438,5.8702,6.4128],[-0.1895,5.8702,7.1854],[-0.1834,-6.7435,7.1724],[-1.8377,-6.7435,6.3998]],"polygon2D":[[4,1193.4],[523.5,1106.3],[525.1,-447.3],[4.7,-547.7]],"pixelCount":46912},{"id":3,"kind":"wall","polygon3D":[[-0.3441,3.5388,7.4548],[1.1166,3.5388,3.9579],[1.1131,-4.5581,3.9565],[-0.3475,-4.5581,7.4534]],"polygon2D":[[484.2,803.7],[1137.2,1174.5],[1135.7,-634.6],[483.2,-156.7]],"pixelCount":18435},{"id":4,"kind":"wall","polygon3D":[[-2.9664,8.8209,12.276],[0.4037,8.8209,2.9966],[-0.5173,-6.6906,2.6621],[-3.8874,-6.6906,11.9415]],"polygon2D":[[95.3,1019.3],[844,2986.7],[189.4,-1838.2],[-71.6,-111.4]],"pixelCount":303}],"planeIds":{"width":512,"height":512,"dataPng":"data:image/png;base64,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"},"shading":{"width":128,"height":128,"neutral":128,"dataPng":"data:image/png;base64,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"}}');
|
|
8682
8926
|
var floor_bedroom_scene_namespaceObject = JSON.parse('{"version":1,"image":{"width":1248,"height":832,"fileName":"bedroom.jpg"},"camera":{"fovYDeg":46.84,"fx":886.546,"fy":591.0306,"cx":256.0001,"cy":255.9998,"net":512,"frame":"+X right, +Y down, +Z forward; meters; OpenCV"},"planes":[{"id":1,"kind":"floor","polygon3D":[[-4.0513,1.1899,-1.3067],[2.5725,1.1899,-2.0753],[3.87,0.1831,9.1068],[-2.7538,0.1831,9.8754]],"polygon2D":[[-174467.9,23273.1],[111806.3,23273.1],[1542.3,435.3],[21.4,433.8]],"pixelCount":101427},{"id":2,"kind":"wall","polygon3D":[[0.2754,3.5068,7.4975],[1.8879,3.5068,6.156],[1.4729,-6.0368,5.6572],[-0.1396,-6.0368,6.9987]],"polygon2D":[[703.4,865.2],[1286.7,963.1],[1186.6,-608.9],[580.9,-412.4]],"pixelCount":45487},{"id":3,"kind":"wall","polygon3D":[[-1.6906,3.9065,5.5869],[-0.1653,3.9065,7.3877],[0.198,-6.2752,7.08],[-1.3272,-6.2752,5.2792]],"polygon2D":[[-29.9,1087.5],[575.6,923.9],[684.4,-435.3],[80.7,-725.6]],"pixelCount":24698}],"planeIds":{"width":512,"height":512,"dataPng":"data:image/png;base64,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"},"shading":{"width":128,"height":128,"neutral":128,"dataPng":"data:image/png;base64,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"}}');
|
|
8683
8927
|
var floor_entryway_scene_namespaceObject = JSON.parse('{"version":1,"image":{"width":1248,"height":832,"fileName":"entryway.jpg"},"camera":{"fovYDeg":46.86,"fx":886.1516,"fy":590.7677,"cx":255.9999,"cy":255.9997,"net":512,"frame":"+X right, +Y down, +Z forward; meters; OpenCV"},"planes":[{"id":1,"kind":"floor","polygon3D":[[-8.6435,1.1708,2.4254],[1.2106,1.1708,-3.7261],[8.3191,0.9709,7.661],[-1.535,0.9709,13.8125]],"polygon2D":[[-7073.7,879.4],[52923.7,22895.4],[2969.5,537.7],[384,483.5]],"pixelCount":69575},{"id":2,"kind":"wall","polygon3D":[[-0.9123,3.856,3.1077],[-0.7274,3.856,6.2012],[-0.6851,-4.4714,6.1987],[-0.8699,-4.4714,3.1052]],"polygon2D":[[-10.1,1607.1],[370.6,1012.9],[385.3,-276.5],[18.9,-966.4]],"pixelCount":47763},{"id":3,"kind":"wall","polygon3D":[[-0.888,4.3857,6.582],[1.1141,4.3857,6.5081],[1.1088,-5.5794,6.3649],[-0.8933,-5.5794,6.4388]],"polygon2D":[[332.6,1055.7],[993.8,1062.9],[1000.3,-425.5],[324.3,-415.9]],"pixelCount":41609},{"id":4,"kind":"wall","polygon3D":[[1.2093,4.5168,6.7312],[1.1406,4.5168,3.9536],[1.1241,-5.6604,3.954],[1.1929,-5.6604,6.7316]],"polygon2D":[[1012.1,1060.2],[1247.1,1512.8],[1238.1,-958.3],[1006.8,-391.2]],"pixelCount":34711},{"id":5,"kind":"wall","polygon3D":[[-0.9999,3.3374,7.7388],[0.4764,3.3374,7.6913],[0.4746,-4.56,7.6329],[-1.0018,-4.56,7.6804]],"polygon2D":[[344.9,830],[757.8,832.6],[758.3,-157.5],[342.3,-154]],"pixelCount":5560}],"planeIds":{"width":512,"height":512,"dataPng":"data:image/png;base64,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"},"shading":{"width":128,"height":128,"neutral":128,"dataPng":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAgAElEQVR42t2dabdsVXWG628ZHSMOjckIQ6MkRlDEFsVegyIYEAIqKii9NEJCK52A9CJEWmlCJ9IoCILNH8lz93PrZZ659t7nXO6HDDM/1KhTp2rXrvmu2c811+aCCy648MILfYQuuuiiiy+++MeFLrnkkv+c6L8muuyyy6644oorr7zyqquuuvrqq3/yk59cc801d9xxx913333XXXf99wL9x18/nXfeeeeee+75558vry7a0sUThVeQzy/YST+a6PwtnTcRF9zkHbMAcLlLL700AMD9yy+/fATgxhtv/PlE991337333vv/D4DKshUM5D6PFwxUAcil9gHQlv8SAFn+DQC4f+2111533XW33XbbPffcAwb3TvT/CQD5tSsG4f6FW1rh/rwEzMpUAAj3oasmcvnD/euvv/6GG25AEd15551gABINg79e7p911lnnnHPOrhhE81y4kyoAYpAr7ACgSUAESgCgBgASUJc/3P/pT3/6s5/97NZbb7399tubHNx///2/+tWv/k/Y95NV4iewjK7c0hVbunyiyyaCFUsYwFBZF4URTi5hsCgBjfsNgEiArK/6J8sfMwAAt9xyC6b4gQce+OWW5P7DDz/80EMPHTxDf7pKN0zE/Vy3JdbHQQLADx8xkGAfrIu2CMfl5LoWWpSA0QDsBQB+PACw/PGF4D5Mh/UYZJ6H+w8++CB/HijH79hJfMUBAbCOwR4B4OfDmREDGArTXK8xpRcVqkIw6wJ1CRgd0FkANABRQQHggS258Efu83iQAKxjMAvACgZ7BwAmjBjAt/B65H6TgwbAuVvatE/Ocl8A4v9cPVG1wPz4m266iSUPr+G+vB65z/NHHnnkIAHAxqDoljC4fqIRAG71IAEYMYjmUBSqDp8FYN4NrTDOml8BaA6oP6ABIJdl+hL3oQMyyLMA4PJib5YkwFtqAMxicKAAwJPYAy0wBCtXABCDmIH5OGDJAa0xsPqnAhAXKACgdlz469yXDhIAhODmm29u3PdR7jdTLAAVA+X4QAGAM7wiB2Ho6I+uA9A80V0AqAagOqANAF0gAMD9l9fw96GJ4D6PgNG4L0IHCQBCwJdW7jczEAzkfjAQhgAgzWIgDAahwiBb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"}}');
|
|
@@ -8791,8 +9035,39 @@ const RAM_TINUUIDS = "RcSd3KphTyq_JQEjNCqKQA,gu0109ftQmS-UQkwcW010Q,nOfGLIZcRVeU
|
|
|
8791
9035
|
function isViewedObject(object, viewedObject) {
|
|
8792
9036
|
return Boolean(viewedObject?.uuid && object.uuid === viewedObject.uuid || viewedObject?.tinuuid && object.tinuuid === viewedObject.tinuuid);
|
|
8793
9037
|
}
|
|
9038
|
+
function getObjectKey(object) {
|
|
9039
|
+
return object.kit?.uuid ?? object.uuid ?? object.tinuuid ?? '';
|
|
9040
|
+
}
|
|
9041
|
+
function hasRugModel(object) {
|
|
9042
|
+
const glbUrl = object.materials?.[0]?.native?.glbUrl;
|
|
9043
|
+
return 'string' == typeof glbUrl && glbUrl.trim().length > 0;
|
|
9044
|
+
}
|
|
9045
|
+
function getRugKey(object) {
|
|
9046
|
+
const meta = decodeRugSizeMeta(object.description);
|
|
9047
|
+
const name = object.name?.trim();
|
|
9048
|
+
const sizeSuffix = meta ? ` — ${meta.size}` : null;
|
|
9049
|
+
if (name && sizeSuffix && name.endsWith(sizeSuffix)) {
|
|
9050
|
+
const rugName = name.slice(0, -sizeSuffix.length).trim();
|
|
9051
|
+
if (rugName) return `rug-name:${rugName}`;
|
|
9052
|
+
}
|
|
9053
|
+
return `object:${getObjectKey(object)}`;
|
|
9054
|
+
}
|
|
9055
|
+
function dedupeBy(objects, getKey) {
|
|
9056
|
+
const seenKeys = new Set();
|
|
9057
|
+
return objects.filter((object)=>{
|
|
9058
|
+
const key = getKey(object);
|
|
9059
|
+
if (seenKeys.has(key)) return false;
|
|
9060
|
+
seenKeys.add(key);
|
|
9061
|
+
return true;
|
|
9062
|
+
});
|
|
9063
|
+
}
|
|
8794
9064
|
function getRelatedMaterialObjects(objects, viewedObject) {
|
|
8795
|
-
|
|
9065
|
+
const eligible = objects.filter((object)=>Boolean(object.tinuuid && object.materials?.[0] && !isViewedObject(object, viewedObject)));
|
|
9066
|
+
return dedupeBy(eligible, getObjectKey);
|
|
9067
|
+
}
|
|
9068
|
+
function getRelatedRugObjects(objects, viewedObject) {
|
|
9069
|
+
const eligible = objects.filter((object)=>Boolean(object.tinuuid && object.materials?.[0] && hasRugModel(object) && !isViewedObject(object, viewedObject)));
|
|
9070
|
+
return dedupeBy(eligible, getRugKey);
|
|
8796
9071
|
}
|
|
8797
9072
|
function getMaterialId(material) {
|
|
8798
9073
|
return material.hid ?? '';
|
|
@@ -8876,13 +9151,15 @@ function useRoomViewerWallResourceMaterialOptions() {
|
|
|
8876
9151
|
}
|
|
8877
9152
|
function useRoomViewerMaterialCatalog({ includeViewedObject = false } = {}) {
|
|
8878
9153
|
const { material, tinuuid, viewedObject, setMaterial, setTinuuid, apiKey, baseURL, source, widgetSession, setAccessError, setLoadError } = useRoomViewerResource();
|
|
9154
|
+
const { type } = useRoomViewerMetadata();
|
|
8879
9155
|
const selectedMaterialId = material ? getMaterialId(material) : '';
|
|
8880
9156
|
const ownerUuid = viewedObject?.owner?.uuid;
|
|
8881
9157
|
const { data, error, isFetchingNextPage, fetchNextPage, hasNextPage, isLoading } = useInfiniteQuery({
|
|
8882
9158
|
queryKey: roomViewerOwnerObjectsQueryKey(ownerUuid, {
|
|
8883
9159
|
apiKey,
|
|
8884
9160
|
baseURL,
|
|
8885
|
-
source
|
|
9161
|
+
source,
|
|
9162
|
+
resourceType: type
|
|
8886
9163
|
}),
|
|
8887
9164
|
enabled: Boolean(ownerUuid),
|
|
8888
9165
|
queryFn: ({ pageParam, signal })=>{
|
|
@@ -8892,7 +9169,8 @@ function useRoomViewerMaterialCatalog({ includeViewedObject = false } = {}) {
|
|
|
8892
9169
|
baseURL,
|
|
8893
9170
|
signal,
|
|
8894
9171
|
source,
|
|
8895
|
-
widgetSession
|
|
9172
|
+
widgetSession,
|
|
9173
|
+
resourceType: type
|
|
8896
9174
|
});
|
|
8897
9175
|
},
|
|
8898
9176
|
initialPageParam: 1,
|
|
@@ -8903,20 +9181,22 @@ function useRoomViewerMaterialCatalog({ includeViewedObject = false } = {}) {
|
|
|
8903
9181
|
data
|
|
8904
9182
|
]);
|
|
8905
9183
|
const objects = external_react_useMemo(()=>{
|
|
8906
|
-
const
|
|
8907
|
-
if (
|
|
8908
|
-
return [
|
|
9184
|
+
const getRelatedObjects = 'rugs' === type ? getRelatedRugObjects : getRelatedMaterialObjects;
|
|
9185
|
+
if (includeViewedObject) return getRelatedObjects([
|
|
8909
9186
|
...getSelectableViewedObject(viewedObject),
|
|
8910
|
-
...
|
|
8911
|
-
];
|
|
9187
|
+
...fetchedObjects
|
|
9188
|
+
], null);
|
|
9189
|
+
return getRelatedObjects(fetchedObjects, viewedObject);
|
|
8912
9190
|
}, [
|
|
8913
9191
|
fetchedObjects,
|
|
8914
9192
|
includeViewedObject,
|
|
9193
|
+
type,
|
|
8915
9194
|
viewedObject
|
|
8916
9195
|
]);
|
|
8917
9196
|
const materialItems = external_react_useMemo(()=>objects.flatMap((object)=>{
|
|
8918
9197
|
if (!object.tinuuid) return [];
|
|
8919
|
-
|
|
9198
|
+
const catalogMaterials = 'rugs' === type ? object.materials?.slice(0, 1) : object.materials;
|
|
9199
|
+
return catalogMaterials?.map((material)=>{
|
|
8920
9200
|
const materialId = getMaterialId(material);
|
|
8921
9201
|
if (!materialId || !object.tinuuid) return null;
|
|
8922
9202
|
return {
|
|
@@ -8926,7 +9206,8 @@ function useRoomViewerMaterialCatalog({ includeViewedObject = false } = {}) {
|
|
|
8926
9206
|
};
|
|
8927
9207
|
}).filter((item)=>null !== item) ?? [];
|
|
8928
9208
|
}), [
|
|
8929
|
-
objects
|
|
9209
|
+
objects,
|
|
9210
|
+
type
|
|
8930
9211
|
]);
|
|
8931
9212
|
const initialObject = objects.find((obj)=>obj.tinuuid === tinuuid);
|
|
8932
9213
|
const fallbackObject = objects.find((obj)=>obj.tinuuid && obj.materials?.[0]);
|
|
@@ -9240,35 +9521,6 @@ function TabsContent({ className, ...props }) {
|
|
|
9240
9521
|
});
|
|
9241
9522
|
}
|
|
9242
9523
|
TabsContent.displayName = react_tabs_Content.displayName;
|
|
9243
|
-
const DEFAULT_ROOM_VIEWER_DIMENSION_UNIT = 'm';
|
|
9244
|
-
function convertRoomViewerDimensionToMeters(value, unit = DEFAULT_ROOM_VIEWER_DIMENSION_UNIT) {
|
|
9245
|
-
switch(unit){
|
|
9246
|
-
case 'cm':
|
|
9247
|
-
return value / 100;
|
|
9248
|
-
case 'in':
|
|
9249
|
-
return 0.0254 * value;
|
|
9250
|
-
case 'm':
|
|
9251
|
-
return value;
|
|
9252
|
-
}
|
|
9253
|
-
}
|
|
9254
|
-
function normalizeRoomViewerDimensions(width, height, unit = DEFAULT_ROOM_VIEWER_DIMENSION_UNIT) {
|
|
9255
|
-
return {
|
|
9256
|
-
width: convertRoomViewerDimensionToMeters(width ?? 0, unit),
|
|
9257
|
-
height: convertRoomViewerDimensionToMeters(height ?? 0, unit)
|
|
9258
|
-
};
|
|
9259
|
-
}
|
|
9260
|
-
function convertRoomViewerDimensionFromMeters(value, unit) {
|
|
9261
|
-
switch(unit){
|
|
9262
|
-
case 'cm':
|
|
9263
|
-
return 100 * value;
|
|
9264
|
-
case 'in':
|
|
9265
|
-
return value / 0.0254;
|
|
9266
|
-
}
|
|
9267
|
-
}
|
|
9268
|
-
function formatRoomViewerDisplayDimension(value, unit) {
|
|
9269
|
-
const convertedValue = convertRoomViewerDimensionFromMeters(value, unit);
|
|
9270
|
-
return Number(convertedValue.toFixed(2)).toString();
|
|
9271
|
-
}
|
|
9272
9524
|
function useMattingOptions(displayUnit) {
|
|
9273
9525
|
const { t } = useTranslation();
|
|
9274
9526
|
return external_react_useMemo(()=>[
|
|
@@ -9453,14 +9705,13 @@ function AR({ className, buttonClassName, buttonLeadingIcon, buttonLabel, button
|
|
|
9453
9705
|
handoffWidgetSessionToken
|
|
9454
9706
|
]);
|
|
9455
9707
|
const appClipUrl = external_react_useMemo(()=>{
|
|
9456
|
-
if (!tinuuid
|
|
9708
|
+
if (!tinuuid) return null;
|
|
9457
9709
|
const url = new URL('https://appclip.apple.com/id');
|
|
9458
9710
|
url.searchParams.set('p', config_env.APP_CLIP_BUNDLE_ID);
|
|
9459
9711
|
url.searchParams.set('tinuuid', tinuuid);
|
|
9460
9712
|
return url.toString();
|
|
9461
9713
|
}, [
|
|
9462
|
-
tinuuid
|
|
9463
|
-
tenant
|
|
9714
|
+
tinuuid
|
|
9464
9715
|
]);
|
|
9465
9716
|
async function refreshHandoffWidgetSessionToken() {
|
|
9466
9717
|
const nextToken = await widgetSession?.getTokenForRequest().catch(()=>widgetSession.token);
|
|
@@ -11430,13 +11681,22 @@ function MaterialSelectionMobileDialog({ open, portalContainer, onOpenChange })
|
|
|
11430
11681
|
const MATERIAL_SELECTION_ACTION_ATTRIBUTE = 'data-material-selection-action';
|
|
11431
11682
|
const MATERIAL_SELECTION_PANEL_ATTRIBUTE = 'data-material-selection-panel';
|
|
11432
11683
|
function MaterialSummaryCard({ actionLabel, actionClassName, actionPlacement, className, iconClassName, isOpen, materialName, previewClassName, previewUrl, testId, titleLabel, onClick, onPointerDown }) {
|
|
11684
|
+
const { t } = useTranslation();
|
|
11685
|
+
const { displayUnit, type } = useRoomViewerMetadata();
|
|
11686
|
+
const { containerRef } = useRoomViewerSceneState();
|
|
11687
|
+
const { viewedObject } = useRoomViewerResource();
|
|
11688
|
+
const { selectedDestinationUrl, sizeItems, selectedTinuuid, selectSize } = useRoomViewerSizeCatalog();
|
|
11689
|
+
const unitLabel = t(`units.${displayUnit}`);
|
|
11690
|
+
const selectedSize = sizeItems.find((item)=>item.tinuuid === selectedTinuuid);
|
|
11691
|
+
const isSizeSelectionCurrent = Boolean(selectedSize);
|
|
11692
|
+
const currentDestinationUrl = normalizeDestinationUrl('rugs' === type ? selectedDestinationUrl ?? (viewedObject?.tinuuid === selectedTinuuid ? viewedObject.destinationUrl : void 0) : viewedObject?.destinationUrl);
|
|
11433
11693
|
const action = /*#__PURE__*/ jsxs(Button, {
|
|
11434
11694
|
type: "button",
|
|
11435
11695
|
variant: "outline",
|
|
11436
11696
|
size: "sm",
|
|
11437
11697
|
[MATERIAL_SELECTION_ACTION_ATTRIBUTE]: true,
|
|
11438
11698
|
"aria-expanded": isOpen,
|
|
11439
|
-
className: utils_cn('
|
|
11699
|
+
className: utils_cn('shrink-0', 'stacked' === actionPlacement && 'w-fit', actionClassName),
|
|
11440
11700
|
onPointerDown: onPointerDown ? (event)=>{
|
|
11441
11701
|
event.preventDefault();
|
|
11442
11702
|
event.stopPropagation();
|
|
@@ -11467,22 +11727,59 @@ function MaterialSummaryCard({ actionLabel, actionClassName, actionPlacement, cl
|
|
|
11467
11727
|
})
|
|
11468
11728
|
}),
|
|
11469
11729
|
/*#__PURE__*/ jsxs("div", {
|
|
11470
|
-
className: "grid min-w-0 flex-1 content-center gap-
|
|
11730
|
+
className: "grid min-h-16 min-w-0 flex-1 content-center gap-2",
|
|
11471
11731
|
children: [
|
|
11472
11732
|
/*#__PURE__*/ jsxs("div", {
|
|
11473
|
-
className: "min-w-0",
|
|
11733
|
+
className: "flex min-w-0 items-start justify-between gap-2",
|
|
11474
11734
|
children: [
|
|
11475
|
-
/*#__PURE__*/
|
|
11476
|
-
className: "
|
|
11477
|
-
children:
|
|
11735
|
+
/*#__PURE__*/ jsxs("div", {
|
|
11736
|
+
className: "min-w-0",
|
|
11737
|
+
children: [
|
|
11738
|
+
/*#__PURE__*/ jsx_runtime_jsx("div", {
|
|
11739
|
+
className: "sr-only",
|
|
11740
|
+
children: titleLabel
|
|
11741
|
+
}),
|
|
11742
|
+
/*#__PURE__*/ jsx_runtime_jsx("div", {
|
|
11743
|
+
className: "typo-button-normal truncate text-text-dark",
|
|
11744
|
+
children: materialName
|
|
11745
|
+
})
|
|
11746
|
+
]
|
|
11478
11747
|
}),
|
|
11479
|
-
/*#__PURE__*/ jsx_runtime_jsx("
|
|
11480
|
-
|
|
11481
|
-
|
|
11748
|
+
currentDestinationUrl && /*#__PURE__*/ jsx_runtime_jsx("a", {
|
|
11749
|
+
href: currentDestinationUrl,
|
|
11750
|
+
target: "_blank",
|
|
11751
|
+
rel: "noopener noreferrer",
|
|
11752
|
+
className: "typo-base-12 shrink-0 text-button-primary underline-offset-2 hover:underline",
|
|
11753
|
+
"data-testid": testId ? `${testId}-description-link` : void 0,
|
|
11754
|
+
children: t("floor.scene.description")
|
|
11482
11755
|
})
|
|
11483
11756
|
]
|
|
11484
11757
|
}),
|
|
11485
|
-
|
|
11758
|
+
/*#__PURE__*/ jsxs("div", {
|
|
11759
|
+
className: "flex flex-nowrap items-center gap-2",
|
|
11760
|
+
children: [
|
|
11761
|
+
'stacked' === actionPlacement && action,
|
|
11762
|
+
sizeItems.length > 1 && isSizeSelectionCurrent && /*#__PURE__*/ jsxs(select_Select, {
|
|
11763
|
+
value: selectedTinuuid ?? void 0,
|
|
11764
|
+
onValueChange: selectSize,
|
|
11765
|
+
children: [
|
|
11766
|
+
/*#__PURE__*/ jsx_runtime_jsx(SelectTrigger, {
|
|
11767
|
+
size: "sm",
|
|
11768
|
+
className: "w-fit shrink-0",
|
|
11769
|
+
"data-testid": testId ? `${testId}-size-select` : void 0,
|
|
11770
|
+
children: /*#__PURE__*/ jsx_runtime_jsx(SelectValue, {})
|
|
11771
|
+
}),
|
|
11772
|
+
/*#__PURE__*/ jsx_runtime_jsx(SelectContent, {
|
|
11773
|
+
portalContainer: containerRef,
|
|
11774
|
+
children: sizeItems.map((item)=>/*#__PURE__*/ jsx_runtime_jsx(SelectItem, {
|
|
11775
|
+
value: item.tinuuid,
|
|
11776
|
+
children: formatRugSizeLabel(item.size, displayUnit, unitLabel)
|
|
11777
|
+
}, item.tinuuid))
|
|
11778
|
+
})
|
|
11779
|
+
]
|
|
11780
|
+
})
|
|
11781
|
+
]
|
|
11782
|
+
})
|
|
11486
11783
|
]
|
|
11487
11784
|
}),
|
|
11488
11785
|
'trailing' === actionPlacement && action
|
|
@@ -11660,7 +11957,7 @@ function FloorSceneChrome({ actions, canShowAr, companyName, hasActiveError, mat
|
|
|
11660
11957
|
/*#__PURE__*/ jsx_runtime_jsx(MaterialSummaryCard, {
|
|
11661
11958
|
actionLabel: materialActionLabel,
|
|
11662
11959
|
actionPlacement: "stacked",
|
|
11663
|
-
className: "flex h-24 w-fit max-w-
|
|
11960
|
+
className: "flex min-h-24 w-fit max-w-100 items-center gap-4 rounded-2xl bg-background-containers p-4 text-left text-text-dark shadow-[var(--shadow-login)]",
|
|
11664
11961
|
iconClassName: "size-6 text-icons-normal",
|
|
11665
11962
|
isOpen: isMaterialSelectionPanelOpen,
|
|
11666
11963
|
materialName: material.name,
|
|
@@ -11737,7 +12034,7 @@ function FloorSceneChrome({ actions, canShowAr, companyName, hasActiveError, mat
|
|
|
11737
12034
|
/*#__PURE__*/ jsx_runtime_jsx(MaterialSummaryCard, {
|
|
11738
12035
|
actionLabel: materialActionLabel,
|
|
11739
12036
|
actionPlacement: "stacked",
|
|
11740
|
-
className: "pointer-events-auto flex h-[116px] w-fit max-w-[421px] items-center gap-4
|
|
12037
|
+
className: "pointer-events-auto flex min-h-[116px] w-fit max-w-[421px] items-center gap-4 rounded-2xl bg-background-containers p-4 text-left text-text-dark shadow-[var(--shadow-login)]",
|
|
11741
12038
|
iconClassName: "size-6 text-icons-normal",
|
|
11742
12039
|
isOpen: isMaterialSelectionPanelOpen,
|
|
11743
12040
|
materialName: material.name,
|
|
@@ -13221,7 +13518,7 @@ function ProcessingRoomDialog({ isComplete, open, onCloseAnimationEnd, onOpenCha
|
|
|
13221
13518
|
});
|
|
13222
13519
|
}
|
|
13223
13520
|
function FloorViewerLayout({ showDialogCloseButton = false }) {
|
|
13224
|
-
const { name } = useRoomViewerMetadata();
|
|
13521
|
+
const { name, type } = useRoomViewerMetadata();
|
|
13225
13522
|
const { accessError, tinuuid, material, apiKey, baseURL, hasRooms, source, widgetSession, isViewerAccessPending, loadError, viewedObject } = useRoomViewerResource();
|
|
13226
13523
|
const { clearActiveError, handleAccessError } = useRoomViewerErrorCommands();
|
|
13227
13524
|
const { room, sourceRooms } = useRoomViewerRooms();
|
|
@@ -13234,7 +13531,7 @@ function FloorViewerLayout({ showDialogCloseButton = false }) {
|
|
|
13234
13531
|
defaultValue: room.name
|
|
13235
13532
|
});
|
|
13236
13533
|
const companyName = resolveFloorCompanyName(viewedObject, t('floor.scene.companyFallback'));
|
|
13237
|
-
const materialName = material?.name ?? viewedObject?.name ?? name;
|
|
13534
|
+
const materialName = 'rugs' === type ? viewedObject?.kit?.name ?? viewedObject?.name ?? material?.name ?? name : material?.name ?? viewedObject?.name ?? viewedObject?.kit?.name ?? name;
|
|
13238
13535
|
const materialPreviewUrl = FloorViewerLayout_getMaterialPreviewUrl(material) ?? viewedObject?.preview?.subRes?.small ?? viewedObject?.preview?.url ?? viewedObject?.mainPreview;
|
|
13239
13536
|
const canShowAr = Boolean(tinuuid) && !(isAndroid && device_isMobile);
|
|
13240
13537
|
const handleCloseMaterialSelection = useCallback(()=>{
|