@anker-in/ui 0.1.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/README.md +83 -0
- package/dist/DemoRoom-CZyrsxWe.d.mts +30 -0
- package/dist/DemoRoom-CZyrsxWe.d.ts +30 -0
- package/dist/demo-room.css +33 -0
- package/dist/demo-room.css.map +1 -0
- package/dist/demo-room.d.mts +198 -0
- package/dist/demo-room.d.ts +198 -0
- package/dist/demo-room.js +1727 -0
- package/dist/demo-room.js.map +1 -0
- package/dist/demo-room.mjs +1713 -0
- package/dist/demo-room.mjs.map +1 -0
- package/dist/index.css +33 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +283 -0
- package/dist/index.d.ts +283 -0
- package/dist/index.js +3077 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3052 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/theme.d.mts +126 -0
- package/dist/theme.d.ts +126 -0
- package/dist/theme.js +147 -0
- package/dist/theme.js.map +1 -0
- package/dist/theme.mjs +144 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn.ts","../src/components/DemoRoom/components/HelpNav.tsx","../src/components/DemoRoom/components/EventCard.tsx","../src/components/DemoRoom/components/Title.tsx","../src/components/DemoRoom/components/UpcomingEvents.tsx","../src/components/DemoRoom/components/Banner.tsx","../src/components/DemoRoom/components/BreadCrumbs.tsx","../src/components/DemoRoom/components/EasySteps.tsx","../src/components/DemoRoom/components/StudioCard.tsx","../src/components/DemoRoom/components/StudioMap.tsx","../src/api/types.ts","../src/api/hooks.ts","../src/components/DemoRoom/components/AntdMobileIsolated.tsx","../src/components/DemoRoom/utils/addressParser.ts","../src/components/DemoRoom/components/RoomsList.module.css","../src/components/DemoRoom/components/LocationFilter.tsx","../src/components/DemoRoom/components/RoomsList.tsx","../src/api/client.ts","../src/components/DemoRoom/DemoRoom.tsx"],"names":["twMerge","clsx","useState","jsx","jsxs","Text","Link","React","useEffect","useRef","items","useMemo","IndexBar","List"],"mappings":"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","file":"demo-room.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import React, { useState } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface HelpNavTab {\n id: string\n label: string\n showNewTag?: boolean\n}\n\nexport interface HelpNavProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * 标签页数组\n */\n tabs?: HelpNavTab[]\n /**\n * 当前激活的标签页 ID\n */\n activeTabId?: string\n /**\n * 标签页切换回调\n */\n onTabChange?: (tabId: string) => void\n /**\n * \"New\" 标签的背景色\n * @default \"#3ADB67\"\n */\n newTagColor?: string\n /**\n * 激活标签的底部边框色\n * @default \"#3ADB67\"\n */\n activeBorderColor?: string\n}\n\nconst defaultTabs: HelpNavTab[] = [\n { id: 'upcoming-events', label: 'Upcoming Events' },\n { id: 'find-demoroom', label: 'Find Demoroom' },\n { id: '4-easy-steps', label: '4 Easy Steps' },\n { id: 'faq', label: 'FAQ' },\n]\n\nexport const HelpNav: React.FC<HelpNavProps> = ({\n tabs = defaultTabs,\n activeTabId: controlledActiveTabId,\n onTabChange,\n activeBorderColor = '#3ADB67',\n className,\n ...props\n}) => {\n const [internalActiveTabId, setInternalActiveTabId] = useState(\n tabs[1]?.id || tabs[0]?.id\n )\n\n const activeTabId = controlledActiveTabId ?? internalActiveTabId\n\n const handleTabClick = (tabId: string) => {\n if (!controlledActiveTabId) {\n setInternalActiveTabId(tabId)\n }\n onTabChange?.(tabId)\n }\n\n return (\n <div\n className={cn(\n 'w-full pt-5 flex items-center justify-center gap-8 pb-8',\n className\n )}\n {...props}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === activeTabId\n\n return (\n <button\n key={tab.id}\n onClick={() => handleTabClick(tab.id)}\n className={cn(\n 'relative text-[#080A0F]',\n 'pb-4',\n 'flex items-center gap-2',\n 'transition-all duration-200',\n 'outline-none focus:outline-none'\n )}\n style={{\n fontSize: '18px',\n fontWeight: 600,\n letterSpacing: '-0.36px',\n lineHeight: '25.2px',\n }}\n >\n {tab.label}\n\n {/* 激活状态的底部边框 */}\n {isActive && (\n <span\n className=\"absolute bottom-0 left-0 right-0 h-1 rounded-t\"\n style={{\n backgroundColor: activeBorderColor,\n height: '4px',\n }}\n />\n )}\n </button>\n )\n })}\n </div>\n )\n}\n\nHelpNav.displayName = 'HelpNav'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface EventCardButton {\n label: string\n variant?: 'primary' | 'secondary'\n onClick?: () => void\n}\n\nexport interface EventCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Event title\n */\n title: string\n /**\n * Event description\n */\n description?: string\n /**\n * Background image URL\n */\n backgroundImage?: string\n aspectRatio?: string\n /**\n * Card variant - determines styling\n */\n variant?: 'large' | 'medium' | 'product'\n /**\n * Buttons/actions for the card\n */\n buttons?: EventCardButton[]\n /**\n * Additional subtitle (for product variant)\n */\n subtitle?: string\n}\n\nexport const EventCard: React.FC<EventCardProps> = ({\n title,\n description,\n backgroundImage,\n aspectRatio,\n variant = 'medium',\n buttons = [],\n subtitle,\n className,\n ...props\n}) => {\n const isLarge = variant === 'large'\n const isMedium = variant === 'medium'\n const isProduct = variant === 'product'\n\n return (\n <div\n className={cn('rounded-3xl overflow-hidden relative', className)}\n style={{\n backgroundImage: backgroundImage\n ? `url(${backgroundImage})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n aspectRatio,\n }}\n {...props}\n >\n {/* Content */}\n <div\n className={cn(\n 'relative h-full flex flex-col',\n isLarge && 'justify-center pl-8',\n !isLarge && 'justify-end pl-8 pb-8'\n )}\n >\n <div>\n <h3\n className={cn(\n 'font-semibold mb-3',\n isLarge && 'text-3xl text-gray-900',\n isMedium && 'text-2xl text-white',\n isProduct && 'text-2xl text-gray-900'\n )}\n >\n {title}\n </h3>\n\n {subtitle && isProduct && (\n <p className=\"text-sm text-gray-600 mb-4\">{subtitle}</p>\n )}\n\n {description && (\n <p\n className={cn(\n 'text-sm leading-relaxed',\n isMedium && 'text-white/90',\n (isLarge || isProduct) && 'text-gray-600'\n )}\n >\n {description}\n </p>\n )}\n </div>\n\n {/* Action buttons */}\n {buttons.length > 0 && (\n <div className=\"flex gap-3 mt-6\">\n {buttons.map((button, index) => (\n <button\n key={index}\n onClick={button.onClick}\n className={cn(\n 'px-6 py-3 rounded-full font-medium text-sm transition-all duration-200',\n button.variant === 'primary' &&\n 'bg-gray-900 text-white hover:bg-gray-800',\n button.variant === 'secondary' &&\n 'bg-white text-gray-900 border border-gray-300 hover:bg-gray-50'\n )}\n >\n {button.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nEventCard.displayName = 'EventCard'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string\n subTitle?: string\n}\n\nexport const Title: React.FC<TitleProps> = ({\n title = '',\n ...props\n}) => {\n return (\n <div className={cn('w-full')} {...props}>\n {/* Section Title */}\n <h2 className=\"text-[48px] font-semibold mb-12 text-[#080A0F]\">\n {title}\n </h2>\n </div>\n )\n}\n\nTitle.displayName = 'Title'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\nimport { EventCard, EventCardProps } from './EventCard'\nimport { Title } from './Title'\n\nexport interface UpcomingEventsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Section title\n * @default \"Upcoming Events\"\n */\n title?: string\n /**\n * Array of event cards to display\n */\n events?: EventCardProps[]\n /**\n * Show \"View More\" button\n * @default true\n */\n showViewMore?: boolean\n /**\n * Callback when \"View More\" is clicked\n */\n onViewMore?: () => void\n}\n\nconst defaultEvents: EventCardProps[] = [\n {\n variant: 'large',\n title: 'IFA 2025 Event Name Event Name',\n description: 'Corem ipsum dolor sit amet, consectetur adipiscing elit.',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n buttons: [\n {\n label: 'Schedule Now',\n variant: 'primary',\n },\n ],\n aspectRatio: '1664 / 640',\n },\n {\n variant: 'medium',\n title: 'Local Event Name Local Event Name Local Event Name',\n description:\n 'Norem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis.',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n buttons: [\n {\n label: 'Schedule Now',\n variant: 'primary',\n },\n ],\n aspectRatio: '824 / 640',\n },\n {\n variant: 'product',\n title: 'Anker Prime',\n subtitle: 'Anker Prime 240W GaN Desktop Charger (4 Ports) Feb. 5th - 16th',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n buttons: [\n {\n label: 'Learn More',\n variant: 'secondary',\n },\n {\n label: 'Shop Now',\n variant: 'primary',\n },\n ],\n aspectRatio: '824 / 640',\n },\n {\n variant: 'medium',\n title: 'Local Event Name Local Event Name Local Event Name',\n description:\n 'Norem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis.',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n buttons: [\n {\n label: 'Schedule Now',\n variant: 'primary',\n },\n ],\n aspectRatio: '824 / 640',\n },\n {\n variant: 'product',\n title: 'Anker Prime',\n subtitle: 'Anker Prime 240W GaN Desktop Charger (4 Ports) Feb. 5th - 16th',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n buttons: [\n {\n label: 'Learn More',\n variant: 'secondary',\n },\n {\n label: 'Shop Now',\n variant: 'primary',\n },\n ],\n aspectRatio: '824 / 640',\n },\n]\n\nexport const UpcomingEvents: React.FC<UpcomingEventsProps> = ({\n title = 'Upcoming Events',\n events = defaultEvents,\n showViewMore = true,\n onViewMore,\n className,\n ...props\n}) => {\n return (\n <div className={cn('w-full', className)} {...props}>\n {/* Section Title */}\n <Title title={title}></Title>\n {/* Events Grid */}\n <div className=\"grid grid-cols-2 gap-6 mb-[64px]\">\n {events.map((event, index) => (\n <div key={index} className={cn(index === 0 ? 'col-span-2' : '')}>\n <EventCard {...event} />\n </div>\n ))}\n </div>\n {/* View More Button */}\n {showViewMore && (\n <div className=\"flex justify-center\">\n <button\n onClick={onViewMore}\n className=\"inline-flex items-center gap-2 text-gray-700 hover:text-gray-900 transition-colors duration-200\"\n >\n <span className=\"text-base font-bold\">View More</span>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"transition-transform duration-200 group-hover:translate-y-0.5\"\n >\n <path\n d=\"M8 3L8 13M8 13L12 9M8 13L4 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n )\n}\n\nUpcomingEvents.displayName = 'UpcomingEvents'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\nimport { Text } from '@anker-in/headless-ui'\n\nexport interface BannerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * 组件数据\n */\n data?: BannerData\n}\n\ninterface BannerData {\n title?: string\n subTitle?: string\n backgroundImage?: string\n backgroundImageMobile?: string\n}\n\nconst defaultBannerData = {\n title: 'See it. Touch it. Make it Locally.',\n subTitle: 'Visit your local studio right around the corner.',\n backgroundImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n backgroundImageMobile:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n}\n\nexport const Banner: React.FC<BannerProps> = ({\n data = defaultBannerData,\n className,\n style,\n ...props\n}) => {\n return (\n <div\n className={cn('relative')}\n style={{ aspectRatio: '1920/480', ...style }}\n {...props}\n >\n {data?.backgroundImage && (\n <img\n src={data.backgroundImage}\n alt=\"\"\n className=\"inset-0 h-full w-full object-cover\"\n />\n )}\n\n {/* 内容在上层 */}\n <div\n className={cn(\n 'absolute flex flex-col gap-4 justify-center m-auto top-0 bottom-0 left-0 right-0 z-10',\n className\n )}\n >\n <Text\n className=\"text-[48px] font-bold text-white leading-[1]\"\n html={data?.title}\n ></Text>\n <Text\n className=\"text-[18px] font-bold text-white leading-[1.4]\"\n html={data?.subTitle}\n ></Text>\n </div>\n </div>\n )\n}\n\nBanner.displayName = 'Banner'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\nimport { Link } from '@anker-in/headless-ui'\n\nexport interface BreadCrumbsItem {\n label: string\n link?: string\n}\n\nexport interface Props extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * 数组\n */\n items?: BreadCrumbsItem[]\n}\n\nexport const BreadCrumbs: React.FC<Props> = ({\n items,\n className,\n ...props\n}) => {\n return (\n <div className={cn('flex items-center py-6 gap-1 text-[18px]', className)} {...props}>\n {items?.map((item, i) => {\n const isLast = i === items?.length - 1\n return (\n <Link\n className={cn(\n 'flex items-center gap-1 text-[#6D6D6F] no-underline',\n isLast && 'text-[#080A0F]',\n item?.link ? 'cursor-pointer' : \"cursor-default hover:text-[#080A0F]\"\n )}\n key={i}\n href={item?.link}\n >\n {item?.label}\n {!isLast && <span>/</span>}\n </Link>\n )\n })}\n </div>\n )\n}\n\nBreadCrumbs.displayName = 'BreadCrumbs'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\nimport { Title } from './Title'\n\nexport interface EasyStep {\n /**\n * Step number (1-4)\n */\n stepNumber: number\n /**\n * Step title\n */\n title: string\n /**\n * Step description\n */\n description: string\n /**\n * Map image URL for this step\n */\n mapImage: string\n}\n\nexport interface EasyStepsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Section title\n * @default \"Schedule in 4 Easy Steps\"\n */\n title?: string\n /**\n * Array of steps to display\n */\n steps?: EasyStep[]\n}\n\nconst defaultSteps: EasyStep[] = [\n {\n stepNumber: 1,\n title: 'Find a demo room you would like to visit, and click \"Schedule Now\"',\n description:\n 'Find a demo room you would like to visit, and click \"Schedule Now\"',\n mapImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n },\n {\n stepNumber: 2,\n title: 'Fill out the form and confirm your time of visit',\n description: 'Fill out the form and confirm your time of visit',\n mapImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n },\n {\n stepNumber: 3,\n title: 'Once you arrive at the demo room, scan the QR code to check in',\n description:\n 'Once you arrive at the demo room, scan the QR code to check in',\n mapImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n },\n {\n stepNumber: 4,\n title: 'Have fun!',\n description: 'Have fun!',\n mapImage:\n 'https://cdn.shopify.com/s/files/1/0569/5147/2268/files/Component_3_1.png?v=1765274638',\n },\n]\n\nexport const EasySteps: React.FC<EasyStepsProps> = ({\n title = 'Schedule in 4 Easy Steps',\n steps = defaultSteps,\n className,\n ...props\n}) => {\n return (\n <div className={cn('w-full', className)} {...props}>\n {/* Section Title */}\n <Title title={title}></Title>\n\n {/* Steps Grid */}\n <div className=\"grid grid-cols-2 md:grid-cols-2 gap-6\">\n {steps.map((step) => (\n <div\n key={step.stepNumber}\n className={cn(\n 'bg-white rounded-2xl overflow-hidden',\n 'border border-gray-200',\n 'hover:shadow-lg transition-shadow duration-200'\n )}\n >\n {/* Step Header */}\n <div className=\"p-6 pb-4\">\n <div className=\"flex items-start gap-3 mb-3\">\n <span className=\"text-sm font-semibold text-gray-900\">\n Step {step.stepNumber}:\n </span>\n <p className=\"text-sm text-gray-900 font-medium flex-1\">\n {step.title}\n </p>\n </div>\n </div>\n\n {/* Map Image */}\n <div className=\"relative w-full aspect-[356/220] bg-gray-100\">\n <img\n src={step.mapImage}\n alt={`Step ${step.stepNumber} - ${step.title}`}\n className=\"w-full h-full object-cover\"\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nEasySteps.displayName = 'EasySteps'\n","import React from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface StudioCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Demo room code (unique identifier)\n */\n code: string\n /**\n * Studio name\n */\n name: string\n /**\n * Available time\n */\n availableTime: string\n /**\n * Full address\n */\n address: string\n city: string\n state: string\n zipCode: string\n country?: string\n /**\n * Available euifyMake models\n */\n euifyMakeModel: string\n /**\n * Callback when \"Schedule Now\" is clicked, receives demo room code\n */\n onSchedule?: (code: string) => void\n}\n\nexport const StudioCard: React.FC<StudioCardProps> = ({\n code,\n name,\n availableTime,\n address,\n city,\n state,\n zipCode,\n country = 'United States',\n euifyMakeModel,\n onSchedule,\n className,\n ...props\n}) => {\n const fullAddress = `${address}, ${city}, ${state} ${country} ${zipCode}`\n\n const handleScheduleClick = () => {\n onSchedule?.(code)\n }\n\n return (\n <div\n className={cn(\n 'p-6',\n 'hover:shadow-lg transition-shadow duration-200',\n className\n )}\n {...props}\n >\n {/* Studio Name */}\n <h3 className=\"text-xl font-semibold text-gray-900 mb-4\">{name}</h3>\n\n {/* Available Time */}\n <div className=\"flex items-start gap-3 mb-3\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0 mt-0.5\"\n >\n <rect\n x=\"3\"\n y=\"4\"\n width=\"14\"\n height=\"13\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M3 8H17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 2V4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M14 2V4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">Available {availableTime}</p>\n </div>\n </div>\n\n {/* Address */}\n <div className=\"flex items-start gap-3 mb-3\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0 mt-0.5\"\n >\n <path\n d=\"M10 10C11.1046 10 12 9.10457 12 8C12 6.89543 11.1046 6 10 6C8.89543 6 8 6.89543 8 8C8 9.10457 8.89543 10 10 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M10 18C10 18 16 13 16 8C16 4.68629 13.3137 2 10 2C6.68629 2 4 4.68629 4 8C4 13 10 18 10 18Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">{fullAddress}</p>\n </div>\n </div>\n\n {/* euifyMake Models */}\n <div className=\"flex items-start gap-3 mb-6\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0 mt-0.5\"\n >\n <rect\n x=\"3\"\n y=\"5\"\n width=\"14\"\n height=\"10\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M7 15V17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M13 15V17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">{euifyMakeModel}</p>\n </div>\n </div>\n\n {/* Schedule Button */}\n <button\n onClick={handleScheduleClick}\n className={cn(\n 'w-full px-6 py-3 rounded-full',\n 'bg-white text-gray-900 border border-gray-900',\n 'font-medium text-sm',\n 'hover:bg-gray-900 hover:text-white',\n 'transition-all duration-200'\n )}\n >\n Schedule Now\n </button>\n </div>\n )\n}\n\nStudioCard.displayName = 'StudioCard'\n","import React, { useState } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface StudioLocation {\n id: string\n name: string\n address: string\n city: string\n state: string\n zipCode: string\n country: string\n lat: number\n lng: number\n availableTime?: string\n euifyMakeModel?: string\n}\n\nexport interface StudioMapProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * 谷歌地图 API Key\n */\n googleMapsApiKey: string\n /**\n * 工作室位置数据\n */\n locations?: StudioLocation[]\n /**\n * 默认中心点\n */\n defaultCenter?: { lat: number; lng: number }\n /**\n * 默认缩放级别\n */\n defaultZoom?: number\n /**\n * 地图高度\n */\n mapHeight?: string\n /**\n * 点击 Schedule Now 的回调\n */\n onSchedule?: (location: StudioLocation) => void\n}\n\nconst defaultLocations: StudioLocation[] = [\n {\n id: '1',\n name: 'Design District Demo Room',\n address: '111 8th St',\n city: 'San Francisco',\n state: 'CA',\n zipCode: '94108',\n country: 'United States',\n lat: 37.7749,\n lng: -122.4194,\n availableTime: 'Oct 28, 2:00 PM',\n euifyMakeModel: 'euifyMake E1, euifyMake M5',\n },\n]\n\nexport const StudioMap: React.FC<StudioMapProps> = ({\n googleMapsApiKey,\n locations = defaultLocations,\n defaultCenter = { lat: 39.8283, lng: -98.5795 }, // US center\n defaultZoom = 4,\n mapHeight = '600px',\n onSchedule,\n className,\n ...props\n}) => {\n const [_selectedLocation, setSelectedLocation] =\n useState<StudioLocation | null>(null)\n const [isLoaded, setIsLoaded] = useState(false)\n const mapRef = React.useRef<HTMLDivElement>(null)\n const googleMapRef = React.useRef<google.maps.Map | null>(null)\n const markersRef = React.useRef<google.maps.Marker[]>([])\n const infoWindowRef = React.useRef<google.maps.InfoWindow | null>(null)\n\n // 加载谷歌地图脚本\n React.useEffect(() => {\n if (!googleMapsApiKey) {\n console.error('Google Maps API Key is required')\n return\n }\n\n // 检查脚本是否已加载\n if (window.google && window.google.maps) {\n setIsLoaded(true)\n return\n }\n\n const script = document.createElement('script')\n script.src = `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&libraries=places`\n script.async = true\n script.defer = true\n script.onload = () => setIsLoaded(true)\n script.onerror = () => console.error('Failed to load Google Maps script')\n document.head.appendChild(script)\n\n return () => {\n // 清理脚本(可选)\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n }\n }, [googleMapsApiKey])\n\n // 初始化地图\n React.useEffect(() => {\n if (!isLoaded || !mapRef.current || googleMapRef.current) return\n\n // 创建地图\n const map = new google.maps.Map(mapRef.current, {\n center: defaultCenter,\n zoom: defaultZoom,\n styles: [\n {\n featureType: 'all',\n elementType: 'geometry',\n stylers: [{ color: '#E0F2F1' }],\n },\n {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{ color: '#B2EBF2' }],\n },\n {\n featureType: 'road',\n elementType: 'geometry',\n stylers: [{ color: '#ffffff' }],\n },\n ],\n mapTypeControl: false,\n streetViewControl: false,\n fullscreenControl: true,\n })\n\n googleMapRef.current = map\n\n // 创建信息窗口\n infoWindowRef.current = new google.maps.InfoWindow()\n }, [isLoaded, defaultCenter, defaultZoom])\n\n // 添加标记点\n React.useEffect(() => {\n if (!googleMapRef.current || !isLoaded) return\n\n // 清除旧标记\n markersRef.current.forEach((marker) => marker.setMap(null))\n markersRef.current = []\n\n // 过滤并验证有效的位置数据\n const validLocations = locations.filter((location) => {\n const lat = Number(location.lat)\n const lng = Number(location.lng)\n const isValid =\n !isNaN(lat) &&\n !isNaN(lng) &&\n isFinite(lat) &&\n isFinite(lng) &&\n lat >= -90 &&\n lat <= 90 &&\n lng >= -180 &&\n lng <= 180\n if (!isValid) {\n console.warn('Invalid location coordinates:', location)\n }\n return isValid\n })\n\n // 添加新标记\n validLocations.forEach((location) => {\n const lat = Number(location.lat)\n const lng = Number(location.lng)\n\n const marker = new google.maps.Marker({\n position: { lat, lng },\n map: googleMapRef.current,\n title: location.name,\n icon: {\n path: google.maps.SymbolPath.CIRCLE,\n scale: 10,\n fillColor: '#000000',\n fillOpacity: 1,\n strokeColor: '#ffffff',\n strokeWeight: 2,\n },\n })\n\n marker.addListener('click', () => {\n setSelectedLocation(location)\n\n // 创建信息窗口内容\n const content = `\n <div style=\"padding: 16px; max-width: 300px; font-family: system-ui, sans-serif;\">\n <h3 style=\"margin: 0 0 12px 0; font-size: 18px; font-weight: 600;\">${location.name}</h3>\n ${\n location.availableTime\n ? `<div style=\"margin-bottom: 8px; color: #666;\">\n <svg style=\"display: inline-block; width: 16px; height: 16px; margin-right: 4px; vertical-align: middle;\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z\"/>\n </svg>\n <span style=\"vertical-align: middle;\">Available ${location.availableTime}</span>\n </div>`\n : ''\n }\n <div style=\"margin-bottom: 8px; color: #666;\">\n <svg style=\"display: inline-block; width: 16px; height: 16px; margin-right: 4px; vertical-align: middle;\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z\" clip-rule=\"evenodd\"/>\n </svg>\n <span style=\"vertical-align: middle;\">${location.address}, ${location.city}, ${location.state} ${location.country} ${location.zipCode}</span>\n </div>\n ${\n location.euifyMakeModel\n ? `<div style=\"margin-bottom: 12px; color: #666;\">\n <svg style=\"display: inline-block; width: 16px; height: 16px; margin-right: 4px; vertical-align: middle;\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z\"/>\n </svg>\n <span style=\"vertical-align: middle;\">${location.euifyMakeModel}</span>\n </div>`\n : ''\n }\n <button\n id=\"schedule-btn-${location.id}\"\n style=\"\n width: 100%;\n padding: 10px 16px;\n background: #000;\n color: #fff;\n border: none;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n font-size: 14px;\n \"\n onmouseover=\"this.style.background='#333'\"\n onmouseout=\"this.style.background='#000'\"\n >\n Schedule Now\n </button>\n </div>\n `\n\n if (infoWindowRef.current) {\n infoWindowRef.current.setContent(content)\n infoWindowRef.current.open(googleMapRef.current, marker)\n\n // 添加按钮点击事件监听\n google.maps.event.addListenerOnce(\n infoWindowRef.current,\n 'domready',\n () => {\n const btn = document.getElementById(`schedule-btn-${location.id}`)\n if (btn) {\n btn.addEventListener('click', () => {\n if (onSchedule) {\n onSchedule(location)\n }\n })\n }\n }\n )\n }\n\n // 移动地图中心到标记位置\n googleMapRef.current?.panTo({ lat: location.lat, lng: location.lng })\n })\n\n markersRef.current.push(marker)\n })\n\n // 自动调整地图视图以显示所有标记\n if (validLocations.length > 0 && googleMapRef.current) {\n const bounds = new google.maps.LatLngBounds()\n validLocations.forEach((location) => {\n const lat = Number(location.lat)\n const lng = Number(location.lng)\n bounds.extend({ lat, lng })\n })\n googleMapRef.current.fitBounds(bounds)\n }\n }, [isLoaded, locations, onSchedule])\n\n // const handleCloseInfo = useCallback(() => {\n // setSelectedLocation(null)\n // if (infoWindowRef.current) {\n // infoWindowRef.current.close()\n // }\n // }, [])\n\n if (!googleMapsApiKey) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center bg-gray-100 rounded-lg',\n className\n )}\n style={{ height: mapHeight }}\n {...props}\n >\n <p className=\"text-gray-600\">Google Maps API Key is required</p>\n </div>\n )\n }\n\n return (\n <div\n className={cn('relative w-full rounded-lg overflow-hidden', className)}\n {...props}\n >\n <div ref={mapRef} style={{ height: mapHeight }} />\n {!isLoaded && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-gray-100\">\n <div className=\"text-center\">\n <div className=\"inline-block animate-spin rounded-full h-8 w-8 border-4 border-gray-300 border-t-gray-900 mb-2\"></div>\n <p className=\"text-gray-600\">Loading map...</p>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nStudioMap.displayName = 'StudioMap'\n","// API 基础类型\nexport interface ApiResponse<T = any> {\n code: number\n message: string\n data: T\n request_id: string\n}\n\n// 时段状态\nexport type TimeslotStatus = 'available' | 'full' | 'disabled'\n\n// 门店类型\nexport type DemoRoomType = 'flagship' | 'standard' | 'popup'\n\n// 门店状态\nexport type DemoRoomStatus = 'enabled' | 'disabled'\n\n// 预约状态\nexport type BookingStatus = 'pending' | 'checked_in' | 'completed' | 'cancelled'\n\n// 问题类型\nexport type QuestionType = 'text' | 'email' | 'tel' | 'radio' | 'checkbox' | 'textarea' | 'select'\n\n// 时段\nexport interface Timeslot {\n id: number\n start_time: string\n end_time: string\n capacity: number\n booked_count: number\n status: TimeslotStatus\n}\n\n// 门店\nexport interface DemoRoom {\n code: string\n name: string\n description: string\n address: string\n type: DemoRoomType\n capacity: number\n status: DemoRoomStatus\n timezone: string\n images: string[]\n latitude: number\n longitude: number\n questionnaire_id?: number\n timeslots: Timeslot[]\n}\n\n// 问卷选项\nexport interface QuestionOption {\n label: string\n value?: string\n}\n\n// 问卷问题\nexport interface Question {\n id?: string // 固定字段使用 id(如客户信息字段)\n key?: string // 自定义字段使用 key\n type: QuestionType\n label: string\n description?: string\n placeholder?: string\n hint?: string\n options?: QuestionOption[]\n required: boolean\n}\n\n// 问卷\nexport interface Questionnaire {\n id: number\n name: string\n description: string\n questions: Question[]\n}\n\n// 获取门店列表响应\nexport interface GetDemoRoomsResponse {\n demorooms: DemoRoom[]\n}\n\n// 查询时段响应\nexport interface GetTimeslotsResponse {\n timeslots: Timeslot[]\n timezone: string\n}\n\n// 提交预约请求\nexport interface CreateBookingRequest {\n demoroom_code: string\n timeslot_id: number\n questionnaire_id?: number\n questionnaire_response?: Record<string, any>\n customer_name: string\n customer_email: string\n customer_phone_code: string\n customer_phone_number: string\n}\n\n// 提交预约响应\nexport interface CreateBookingResponse {\n booking_id: string\n demoroom_code: string\n booking_date: string\n booking_time: string\n customer_name: string\n customer_email: string\n status: string\n cancel_token?: string\n created_at?: string\n}\n\n// 预约信息\nexport interface Booking {\n booking_id: number\n demoroom_code: string\n booking_date: string\n booking_time: string\n customer_name: string\n customer_email: string\n status: BookingStatus\n cancel_token: string\n created_at: string\n}\n\n// API 错误码\nexport enum ApiErrorCode {\n SUCCESS = 0,\n PARAM_ERROR = 1001,\n UNAUTHORIZED = 1002,\n FORBIDDEN = 1003,\n NOT_FOUND = 1004,\n CONFLICT = 1005,\n INTERNAL_ERROR = 1006,\n}\n\n// API 错误\nexport class ApiError extends Error {\n code: number\n request_id?: string\n\n constructor(code: number, message: string, request_id?: string) {\n super(message)\n this.code = code\n this.request_id = request_id\n this.name = 'ApiError'\n }\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport type { DemoRoomApiClient } from './client'\nimport type {\n DemoRoom,\n GetTimeslotsResponse,\n Questionnaire,\n CreateBookingRequest,\n Booking,\n} from './types'\nimport { ApiError } from './types'\n\ninterface UseApiState<T> {\n data: T | null\n loading: boolean\n error: ApiError | null\n}\n\n/**\n * 获取门店列表 Hook\n */\nexport function useDemoRooms(\n client: DemoRoomApiClient,\n params: {\n team_code?: string\n brand_website?: string\n locale?: string\n },\n options?: { enabled?: boolean }\n) {\n const [state, setState] = useState<UseApiState<DemoRoom[]>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const enabled = options?.enabled !== false\n\n useEffect(() => {\n if (!enabled) return\n\n let cancelled = false\n\n const fetchData = async () => {\n setState((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const data = await client.getDemoRooms(params)\n if (!cancelled) {\n setState({ data, loading: false, error: null })\n }\n } catch (error) {\n if (!cancelled) {\n setState({\n data: null,\n loading: false,\n error: error instanceof ApiError ? error : new ApiError(1006, 'Unknown error'),\n })\n }\n }\n }\n\n fetchData()\n\n return () => {\n cancelled = true\n }\n }, [client, params.team_code, params.brand_website, params.locale, enabled])\n\n return state\n}\n\n/**\n * 获取门店详情 Hook\n */\nexport function useDemoRoom(\n client: DemoRoomApiClient,\n code: string,\n locale?: string,\n options?: { enabled?: boolean }\n) {\n const [state, setState] = useState<UseApiState<DemoRoom>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const enabled = options?.enabled !== false\n\n useEffect(() => {\n if (!enabled || !code) return\n\n let cancelled = false\n\n const fetchData = async () => {\n setState((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const data = await client.getDemoRoom(code, locale)\n if (!cancelled) {\n setState({ data, loading: false, error: null })\n }\n } catch (error) {\n if (!cancelled) {\n setState({\n data: null,\n loading: false,\n error: error instanceof ApiError ? error : new ApiError(1006, 'Unknown error'),\n })\n }\n }\n }\n\n fetchData()\n\n return () => {\n cancelled = true\n }\n }, [client, code, locale, enabled])\n\n return state\n}\n\n/**\n * 查询门店时段 Hook\n */\nexport function useTimeslots(\n client: DemoRoomApiClient,\n code: string,\n params: {\n start_date: string\n end_date: string\n timezone?: string\n },\n options?: { enabled?: boolean }\n) {\n const [state, setState] = useState<UseApiState<GetTimeslotsResponse>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const enabled = options?.enabled !== false\n\n useEffect(() => {\n if (!enabled || !code || !params.start_date || !params.end_date) return\n\n let cancelled = false\n\n const fetchData = async () => {\n setState((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const data = await client.getTimeslots(code, params)\n if (!cancelled) {\n setState({ data, loading: false, error: null })\n }\n } catch (error) {\n if (!cancelled) {\n setState({\n data: null,\n loading: false,\n error: error instanceof ApiError ? error : new ApiError(1006, 'Unknown error'),\n })\n }\n }\n }\n\n fetchData()\n\n return () => {\n cancelled = true\n }\n }, [client, code, params.start_date, params.end_date, params.timezone, enabled])\n\n return state\n}\n\n/**\n * 查询门店问卷 Hook\n */\nexport function useQuestionnaire(\n client: DemoRoomApiClient,\n code: string,\n questionnaire_id: number | undefined,\n locale?: string,\n options?: { enabled?: boolean }\n) {\n const [state, setState] = useState<UseApiState<Questionnaire>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const enabled = options?.enabled !== false\n\n useEffect(() => {\n if (!enabled || !code || !questionnaire_id) return\n\n let cancelled = false\n\n const fetchData = async () => {\n setState((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const data = await client.getQuestionnaire(code, questionnaire_id, locale)\n if (!cancelled) {\n setState({ data, loading: false, error: null })\n }\n } catch (error) {\n if (!cancelled) {\n setState({\n data: null,\n loading: false,\n error: error instanceof ApiError ? error : new ApiError(1006, 'Unknown error'),\n })\n }\n }\n }\n\n fetchData()\n\n return () => {\n cancelled = true\n }\n }, [client, code, questionnaire_id, locale, enabled])\n\n return state\n}\n\n/**\n * 提交预约 Hook\n */\nexport function useCreateBooking(client: DemoRoomApiClient) {\n const [state, setState] = useState<UseApiState<Booking>>({\n data: null,\n loading: false,\n error: null,\n })\n\n const createBooking = useCallback(\n async (data: CreateBookingRequest) => {\n setState({ data: null, loading: true, error: null })\n\n try {\n const result = await client.createBooking(data)\n setState({ data: result, loading: false, error: null })\n return result\n } catch (error) {\n const apiError = error instanceof ApiError ? error : new ApiError(1006, 'Unknown error')\n setState({ data: null, loading: false, error: apiError })\n throw apiError\n }\n },\n [client]\n )\n\n return {\n ...state,\n createBooking,\n }\n}\n","import React, { useEffect, useRef } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface AntdMobileIsolatedProps {\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\n/**\n * 隔离 antd-mobile 全局样式的包装组件\n * 通过创建一个独立的样式上下文来防止 antd-mobile 的全局样式影响应用其他部分\n */\nexport const AntdMobileIsolated: React.FC<AntdMobileIsolatedProps> = ({\n children,\n className,\n style,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!containerRef.current) return\n\n // 重置容器内可能受影响的全局样式\n const container = containerRef.current\n const originalStyles = {\n fontSize: container.style.fontSize,\n fontFamily: container.style.fontFamily,\n lineHeight: container.style.lineHeight,\n color: container.style.color,\n }\n\n // 应用隔离样式\n container.style.fontSize = '14px'\n container.style.fontFamily =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'\n container.style.lineHeight = '1.5'\n container.style.color = '#333'\n\n // 清理函数:恢复原始样式\n return () => {\n container.style.fontSize = originalStyles.fontSize\n container.style.fontFamily = originalStyles.fontFamily\n container.style.lineHeight = originalStyles.lineHeight\n container.style.color = originalStyles.color\n }\n }, [])\n\n return (\n <div\n ref={containerRef}\n className={cn('antd-mobile-isolated', className)}\n style={{\n // 使用 all: revert-layer 来隔离样式\n isolation: 'isolate',\n contain: 'layout style',\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n\nAntdMobileIsolated.displayName = 'AntdMobileIsolated'\n","/**\n * 地址解析工具\n * 将 room.address 解析为层级结构:Country > State > City\n */\n\nexport interface LocationHierarchy {\n country: string\n state: string\n city: string\n}\n\n/**\n * 从地址字符串中提取国家、州、城市信息\n * 支持多种地址格式\n */\nexport function parseAddress(address: string): LocationHierarchy {\n // 按逗号分割地址\n const parts = address.split(',').map((part) => part.trim())\n\n // 默认值\n let country = 'United States'\n let state = ''\n let city = ''\n\n if (parts.length >= 3) {\n // 格式: \"Street, City, State ZIP, Country\"\n city = parts[1] || ''\n state = parts[2]?.split(' ')[0] || '' // 提取州代码,去掉邮编\n country = parts[3] || country\n } else if (parts.length === 2) {\n // 格式: \"City, State\"\n city = parts[0] || ''\n state = parts[1]?.split(' ')[0] || ''\n } else if (parts.length === 1) {\n // 只有城市或地址\n city = parts[0] || ''\n }\n\n return {\n country: country.trim(),\n state: state.trim(),\n city: city.trim(),\n }\n}\n\n/**\n * 地理位置节点(用于树形结构)\n */\nexport interface LocationNode {\n id: string\n name: string\n type: 'country' | 'state' | 'city'\n count: number // 该位置的门店数量\n children?: LocationNode[]\n}\n\n/**\n * 从门店列表构建地理位置树\n */\nexport function buildLocationTree(\n locations: Array<{ address: string; id: string }>\n): LocationNode[] {\n const tree: Map<string, LocationNode> = new Map()\n\n locations.forEach((location) => {\n const { country, state, city } = parseAddress(location.address)\n\n // 构建国家节点\n const countryId = country\n if (!tree.has(countryId)) {\n tree.set(countryId, {\n id: countryId,\n name: country,\n type: 'country',\n count: 0,\n children: [],\n })\n }\n\n const countryNode = tree.get(countryId)!\n countryNode.count++\n\n // 构建州节点\n if (state) {\n const stateId = `${country}/${state}`\n let stateNode = countryNode.children?.find((n) => n.id === stateId)\n\n if (!stateNode) {\n stateNode = {\n id: stateId,\n name: state,\n type: 'state',\n count: 0,\n children: [],\n }\n countryNode.children?.push(stateNode)\n }\n\n stateNode.count++\n\n // 构建城市节点\n if (city) {\n const cityId = `${country}/${state}/${city}`\n let cityNode = stateNode.children?.find((n) => n.id === cityId)\n\n if (!cityNode) {\n cityNode = {\n id: cityId,\n name: city,\n type: 'city',\n count: 0,\n }\n stateNode.children?.push(cityNode)\n }\n\n cityNode.count++\n }\n }\n })\n\n return Array.from(tree.values())\n}\n\n/**\n * 按字母分组位置列表\n */\nexport function groupByAlphabet<T extends { name: string }>(\n items: T[]\n): Array<{ title: string; items: T[] }> {\n const groups: Map<string, T[]> = new Map()\n\n items.forEach((item) => {\n const firstChar = item.name.charAt(0).toUpperCase()\n const key = /[A-Z]/.test(firstChar) ? firstChar : '#'\n\n if (!groups.has(key)) {\n groups.set(key, [])\n }\n groups.get(key)!.push(item)\n })\n\n return Array.from(groups.entries())\n .sort(([a], [b]) => {\n if (a === '#') return 1\n if (b === '#') return -1\n return a.localeCompare(b)\n })\n .map(([title, items]) => ({\n title,\n items: items.sort((a, b) => a.name.localeCompare(b.name)),\n }))\n}\n","/* antd-mobile 样式隔离 - 使用更强的隔离策略 */\n.antdMobileScope {\n /* 重置所有继承样式,但保持布局相关属性 */\n all: unset;\n\n /* 恢复必要的属性 */\n display: block;\n position: absolute;\n box-sizing: border-box;\n\n /* 阻止继承字体样式 */\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #333;\n\n /* 重置 CSS 变量影响 */\n --adm-color-primary: #1677ff;\n --adm-color-text: #333333;\n --adm-font-size-main: 14px;\n}\n\n/* 确保 antd-mobile 组件内部样式正常工作 */\n.antdMobileScope *,\n.antdMobileScope *::before,\n.antdMobileScope *::after {\n box-sizing: border-box;\n}\n\n/* 阻止全局样式继承 */\n.antd-mobile-isolated-container .antdMobileScope :not([class*=\"adm-\"]) {\n all: unset;\n}\n\n/* 保持 antd-mobile 组件样式 */\n.antd-mobile-isolated-container .antdMobileScope [class*=\"adm-\"] {\n all: revert;\n}\n","import React, { useState, useMemo } from 'react'\nimport { cn } from '@/utils/cn'\nimport IndexBar from 'antd-mobile/es/components/index-bar'\nimport List from 'antd-mobile/es/components/list'\nimport 'antd-mobile/es/components/index-bar/index-bar.css'\nimport 'antd-mobile/es/components/list/list.css'\nimport { AntdMobileIsolated } from './AntdMobileIsolated'\nimport { groupByAlphabet, parseAddress } from '../utils/addressParser'\nimport styles from './RoomsList.module.css'\n\nexport type LocationLevel = 'country' | 'state' | 'city'\n\nexport interface LocationFilterProps {\n locations: Array<{ address: string; id: string }>\n onSelect?: (selection: LocationSelection) => void\n visible?: boolean\n onClose?: () => void\n}\n\nexport interface LocationSelection {\n level: LocationLevel\n country?: string\n state?: string\n city?: string\n}\n\ninterface LocationItem {\n name: string\n code: string\n count: number\n parentCode?: string\n}\n\nexport const LocationFilter: React.FC<LocationFilterProps> = ({\n locations,\n onSelect,\n visible = false,\n onClose,\n}) => {\n const [currentLevel, setCurrentLevel] = useState<LocationLevel>('country')\n const [selectedCountry, setSelectedCountry] = useState<string>()\n const [selectedState, setSelectedState] = useState<string>()\n const [searchQuery, setSearchQuery] = useState('')\n\n // 构建位置数据\n const locationData = useMemo(() => {\n const countries = new Map<string, LocationItem>()\n const states = new Map<string, LocationItem>()\n const cities = new Map<string, LocationItem>()\n\n locations.forEach((location) => {\n const { country, state, city } = parseAddress(location.address)\n\n // 统计国家\n if (country) {\n const existing = countries.get(country)\n countries.set(country, {\n name: country,\n code: country,\n count: (existing?.count || 0) + 1,\n })\n }\n\n // 统计州\n if (state) {\n const stateKey = `${country}/${state}`\n const existing = states.get(stateKey)\n states.set(stateKey, {\n name: state,\n code: stateKey,\n count: (existing?.count || 0) + 1,\n parentCode: country,\n })\n }\n\n // 统计城市\n if (city) {\n const cityKey = `${country}/${state}/${city}`\n const existing = cities.get(cityKey)\n cities.set(cityKey, {\n name: city,\n code: cityKey,\n count: (existing?.count || 0) + 1,\n parentCode: `${country}/${state}`,\n })\n }\n })\n\n return {\n countries: Array.from(countries.values()),\n states: Array.from(states.values()),\n cities: Array.from(cities.values()),\n }\n }, [locations])\n\n // 根据当前层级和选择过滤数据\n const filteredItems = useMemo(() => {\n let items: LocationItem[] = []\n\n switch (currentLevel) {\n case 'country':\n items = locationData.countries\n break\n case 'state':\n items = selectedCountry\n ? locationData.states.filter(\n (s) => s.parentCode === selectedCountry\n )\n : []\n break\n case 'city':\n items = selectedState\n ? locationData.cities.filter((c) => c.parentCode === selectedState)\n : []\n break\n }\n\n // 应用搜索过滤\n if (searchQuery) {\n items = items.filter((item) =>\n item.name.toLowerCase().includes(searchQuery.toLowerCase())\n )\n }\n\n return items\n }, [currentLevel, selectedCountry, selectedState, locationData, searchQuery])\n\n // 按字母分组\n const groupedItems = useMemo(\n () => groupByAlphabet(filteredItems),\n [filteredItems]\n )\n\n const handleItemClick = (item: LocationItem) => {\n if (currentLevel === 'country') {\n setSelectedCountry(item.code)\n setCurrentLevel('state')\n } else if (currentLevel === 'state') {\n setSelectedState(item.code)\n setCurrentLevel('city')\n } else if (currentLevel === 'city') {\n // 选择城市,触发回调\n const parts = item.code.split('/')\n onSelect?.({\n level: 'city',\n country: parts[0],\n state: parts[1],\n city: parts[2],\n })\n onClose?.()\n }\n }\n\n const handleTabClick = (level: LocationLevel) => {\n setCurrentLevel(level)\n if (level === 'country') {\n setSelectedCountry(undefined)\n setSelectedState(undefined)\n } else if (level === 'state') {\n setSelectedState(undefined)\n }\n }\n\n if (!visible) return null\n\n return (\n <div\n style={{ height: '794px' }}\n className={cn(\n 'w-full rounded-[12px] absolute z-10 top-0 left-0 bg-white border border-[#E4E5E6]',\n styles.antdMobileScope\n )}\n >\n {/* Header with tabs */}\n <div\n style={{ background: '#F8F8F8' }}\n className=\"rounded-[12px] rounded-b-none h-[72px] font-bold text-[14px] flex flex-col\"\n >\n {/* Close and Search Row */}\n <div className=\"flex items-center justify-between px-[20px] pt-[12px] pb-[8px]\">\n <input\n type=\"text\"\n placeholder=\"Please enter the search city\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"flex-1 h-[32px] px-[12px] rounded-[6px] border border-[#E4E5E6] text-[14px] outline-none focus:border-[#2E8B57]\"\n />\n <button\n onClick={onClose}\n className=\"ml-[12px] w-[24px] h-[24px] flex items-center justify-center\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M6.4 19L5 17.6L10.6 12L5 6.4L6.4 5L12 10.6L17.6 5L19 6.4L13.4 12L19 17.6L17.6 19L12 13.4L6.4 19Z\"\n fill=\"#1D1D1F\"\n />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center px-[20px] gap-[16px] pb-[8px]\">\n <button\n onClick={() => handleTabClick('country')}\n className={cn(\n 'pb-[4px] transition-colors',\n currentLevel === 'country'\n ? 'text-[#1D1D1F] border-b-2 border-[#2E8B57]'\n : 'text-[#767880]'\n )}\n >\n Country\n </button>\n <button\n onClick={() => handleTabClick('state')}\n disabled={!selectedCountry}\n className={cn(\n 'pb-[4px] transition-colors',\n currentLevel === 'state'\n ? 'text-[#1D1D1F] border-b-2 border-[#2E8B57]'\n : 'text-[#767880]',\n !selectedCountry && 'opacity-50 cursor-not-allowed'\n )}\n >\n State\n </button>\n <button\n onClick={() => handleTabClick('city')}\n disabled={!selectedState}\n className={cn(\n 'pb-[4px] transition-colors',\n currentLevel === 'city'\n ? 'text-[#1D1D1F] border-b-2 border-[#2E8B57]'\n : 'text-[#767880]',\n !selectedState && 'opacity-50 cursor-not-allowed'\n )}\n >\n City\n </button>\n </div>\n </div>\n\n {/* Content */}\n <AntdMobileIsolated style={{ height: 'calc(100% - 72px)' }}>\n <IndexBar style={{ height: '100%' }}>\n {groupedItems.map((group) => {\n const { title, items } = group\n return (\n <IndexBar.Panel index={title} title={title} key={title}>\n <List>\n {items.map((item) => (\n <List.Item\n clickable\n onClick={() => handleItemClick(item)}\n key={item.code}\n extra={\n <div className=\"flex items-center gap-[8px]\">\n <span className=\"text-[#767880] text-[14px]\">\n {item.count}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M6.4 12L5.6 11.2L9.06667 7.73333L5.6 4.26667L6.4 3.46667L10.6667 7.73333L6.4 12Z\"\n fill=\"#767880\"\n />\n </svg>\n </div>\n }\n >\n {item.name}\n </List.Item>\n ))}\n </List>\n </IndexBar.Panel>\n )\n })}\n </IndexBar>\n </AntdMobileIsolated>\n </div>\n )\n}\n\nLocationFilter.displayName = 'LocationFilter'\n","import React, { useMemo, useState } from 'react'\nimport { cn } from '@/utils/cn'\nimport { Title } from './Title'\nimport { StudioCard } from './StudioCard'\nimport { StudioLocation, StudioMap } from './StudioMap'\nimport { useDemoRooms } from '@/api/hooks'\nimport type { DemoRoomApiClient } from '@/api/client'\nimport {\n LocationFilter,\n type LocationSelection,\n} from './LocationFilter'\nimport { parseAddress } from '../utils/addressParser'\n\nexport interface RoomsListProps extends React.HTMLAttributes<HTMLDivElement> {\n googleMapsApiKey?: string\n layoutClassName?: string\n apiClient: DemoRoomApiClient\n teamCode?: string\n brandWebsite?: string\n /**\n * Callback when user clicks \"Schedule Now\" button\n * @param demoRoomCode - The demo room code\n */\n onSchedule?: (demoRoomCode: string) => void\n}\n\n// 默认测试数据 - 美国主要城市的工作室位置\nconst defaultStudioLocations: StudioLocation[] = [\n {\n id: '1',\n name: 'Design District Demo Room',\n address: '111 8th St',\n city: 'San Francisco',\n state: 'CA',\n zipCode: '94108',\n country: 'United States',\n lat: 37.7749,\n lng: -122.4194,\n availableTime: 'Oct 28, 2:00 PM',\n euifyMakeModel: 'euifyMake E1, euifyMake M5',\n },\n {\n id: '2',\n name: 'Brooklyn Creative Studio',\n address: '456 Broadway',\n city: 'Brooklyn',\n state: 'NY',\n zipCode: '11211',\n country: 'United States',\n lat: 40.7128,\n lng: -74.006,\n availableTime: 'Oct 29, 3:00 PM',\n euifyMakeModel: 'euifyMake E1, euifyMake M5',\n },\n {\n id: '3',\n name: 'Austin Innovation Hub',\n address: '789 Tech Blvd',\n city: 'Austin',\n state: 'TX',\n zipCode: '78701',\n country: 'United States',\n lat: 30.2672,\n lng: -97.7431,\n availableTime: 'Oct 30, 1:00 PM',\n euifyMakeModel: 'euifyMake M5',\n },\n {\n id: '4',\n name: 'Seattle Maker Space',\n address: '321 Pine St',\n city: 'Seattle',\n state: 'WA',\n zipCode: '98101',\n country: 'United States',\n lat: 47.6062,\n lng: -122.3321,\n availableTime: 'Oct 31, 11:00 AM',\n euifyMakeModel: 'euifyMake E1',\n },\n {\n id: '5',\n name: 'Chicago Design Center',\n address: '654 Michigan Ave',\n city: 'Chicago',\n state: 'IL',\n zipCode: '60611',\n country: 'United States',\n lat: 41.8781,\n lng: -87.6298,\n availableTime: 'Nov 1, 2:30 PM',\n euifyMakeModel: 'euifyMake E1, euifyMake M5',\n },\n {\n id: '6',\n name: 'Miami Beach Studio',\n address: '987 Ocean Drive',\n city: 'Miami Beach',\n state: 'FL',\n zipCode: '33139',\n country: 'United States',\n lat: 25.7617,\n lng: -80.1918,\n availableTime: 'Nov 2, 10:00 AM',\n euifyMakeModel: 'euifyMake M5',\n },\n {\n id: '7',\n name: 'Denver Mountain Studio',\n address: '147 16th St',\n city: 'Denver',\n state: 'CO',\n zipCode: '80202',\n country: 'United States',\n lat: 39.7392,\n lng: -104.9903,\n availableTime: 'Nov 3, 4:00 PM',\n euifyMakeModel: 'euifyMake E1',\n },\n {\n id: '8',\n name: 'Los Angeles Creative Lab',\n address: '258 Main St',\n city: 'Los Angeles',\n state: 'CA',\n zipCode: '90012',\n country: 'United States',\n lat: 34.0522,\n lng: -118.2437,\n availableTime: 'Nov 4, 1:00 PM',\n euifyMakeModel: 'euifyMake E1, euifyMake M5',\n },\n]\n\n\nexport const RoomsList: React.FC<RoomsListProps> = ({\n googleMapsApiKey,\n className,\n apiClient,\n teamCode,\n brandWebsite,\n onSchedule,\n ...props\n}) => {\n // 状态管理\n const [showLocationFilter, setShowLocationFilter] = useState(false)\n const [selectedLocation, setSelectedLocation] = useState<LocationSelection>()\n\n // 使用 API 获取门店列表\n const {\n data: demoRooms,\n loading,\n error,\n } = useDemoRooms(apiClient, {\n team_code: teamCode,\n brand_website: brandWebsite,\n })\n console.log(demoRooms)\n\n // 将 API 返回的 DemoRoom 类型转换为 StudioLocation 类型\n const studioLocations = useMemo<StudioLocation[]>(() => {\n if (!demoRooms) return defaultStudioLocations\n\n return demoRooms.map((room) => {\n // 获取下一个可用时段\n const timeslots = [\n {\n id: 130,\n start_time: '2026-01-13T09:00:00-05:00',\n end_time: '2026-01-13T10:00:00-05:00',\n capacity: 5,\n booked_count: 2,\n status: 'available',\n },\n {\n id: 131,\n start_time: '2026-01-13T14:00:00-05:00',\n end_time: '2026-01-13T15:00:00-05:00',\n capacity: 5,\n booked_count: 5,\n status: 'full',\n },\n ]\n const nextAvailableTimeslot = (\n room.timeslots?.length ? room.timeslots : timeslots\n )?.find((slot) => slot.status === 'available')\n\n // 使用地址解析工具解析地址\n const { country, state, city } = parseAddress(room.address)\n\n return {\n id: room.code,\n name: room.name,\n address: room.address,\n city,\n state,\n zipCode: '',\n country,\n lat: Number(room.latitude) || 34.0522,\n lng: Number(room.longitude) || -118.2437,\n availableTime: nextAvailableTimeslot\n ? `${nextAvailableTimeslot.start_time}`\n : 'No available time',\n euifyMakeModel: room?.description,\n }\n })\n }, [demoRooms])\n\n // 根据选择的位置过滤门店\n const filteredStudioLocations = useMemo(() => {\n if (!selectedLocation) return studioLocations\n\n return studioLocations.filter((location) => {\n const { country, state, city } = parseAddress(location.address)\n\n if (selectedLocation.city) {\n return (\n country === selectedLocation.country &&\n state === selectedLocation.state &&\n city === selectedLocation.city\n )\n }\n\n if (selectedLocation.state) {\n return (\n country === selectedLocation.country &&\n state === selectedLocation.state\n )\n }\n\n if (selectedLocation.country) {\n return country === selectedLocation.country\n }\n\n return true\n })\n }, [studioLocations, selectedLocation])\n\n // 获取当前选择的位置名称\n const getSelectedLocationName = () => {\n if (!selectedLocation) return 'All Locations'\n if (selectedLocation.city) return selectedLocation.city\n if (selectedLocation.state) return selectedLocation.state\n if (selectedLocation.country) return selectedLocation.country\n return 'All Locations'\n }\n\n // 处理位置选择\n const handleLocationSelect = (selection: LocationSelection) => {\n setSelectedLocation(selection)\n setShowLocationFilter(false)\n }\n\n // 清除位置过滤\n const handleClearFilter = () => {\n setSelectedLocation(undefined)\n }\n\n console.log(filteredStudioLocations)\n\n return (\n <div className={className} {...props}>\n {/* Section Title */}\n <Title title={'Find a Studio Near You'}></Title>\n\n {/* Loading State */}\n {loading && (\n <div className=\"flex items-center justify-center h-[794px]\">\n <div className=\"text-center\">\n <div className=\"text-lg font-medium\">Loading demo rooms...</div>\n </div>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className=\"flex items-center justify-center h-[794px]\">\n <div className=\"text-center text-red-600\">\n <div className=\"text-lg font-medium\">Failed to load demo rooms</div>\n <div className=\"text-sm mt-2\">{error.message}</div>\n </div>\n </div>\n )}\n\n {/* Content */}\n {!loading && !error && (\n <div className=\"flex h-[794px] overflow-auto gap-4\">\n <div\n className=\"flex-none relative w-[420px]\"\n style={{ height: '794px' }}\n >\n {/* Filter Header */}\n <div className=\"rounded-[12px] items-center h-[72px] mb-4 font-bold text-[16px] gap-10 flex bg-white border border-[#E4E5E6] px-[20px] py-[16px]\">\n <button\n className=\"flex cursor-pointer items-center hover:text-[#2E8B57] transition-colors\"\n onClick={() => setShowLocationFilter(true)}\n >\n <span className=\"mr-1\">{getSelectedLocationName()}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M16.7661 9.23364C17.078 9.5455 17.0779 10.0516 16.7661 10.3635L12.5991 14.5305C12.2874 14.842 11.782 14.8418 11.4702 14.5305L7.30322 10.3635C6.99135 10.0516 6.99135 9.54552 7.30322 9.23364C7.615 8.9221 8.1203 8.92219 8.43213 9.23364L12.0347 12.8362L15.6362 9.23364C15.9481 8.92183 16.4543 8.92181 16.7661 9.23364Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n {selectedLocation && (\n <button\n onClick={handleClearFilter}\n className=\"ml-auto text-[14px] text-[#2E8B57] hover:underline\"\n >\n Clear\n </button>\n )}\n <div className=\"flex text-[#767880] cursor-not-allowed\">\n eufymake E1\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M16.7661 9.23364C17.078 9.5455 17.0779 10.0516 16.7661 10.3635L12.5991 14.5305C12.2874 14.842 11.782 14.8418 11.4702 14.5305L7.30322 10.3635C6.99135 10.0516 6.99135 9.54552 7.30322 9.23364C7.615 8.9221 8.1203 8.92219 8.43213 9.23364L12.0347 12.8362L15.6362 9.23364C15.9481 8.92183 16.4543 8.92181 16.7661 9.23364Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n </div>\n\n {/* Room List */}\n <div\n style={{ maxHeight: '706px', overflow: 'auto' }}\n className=\"rounded-[12px] bg-white border border-[#E4E5E6]\"\n >\n {filteredStudioLocations.length === 0 ? (\n <div className=\"flex items-center justify-center h-[200px] text-[#767880]\">\n No studios found in this location\n </div>\n ) : (\n filteredStudioLocations.map((item) => {\n return (\n <StudioCard\n key={item.id}\n code={item.id}\n name={item?.name}\n availableTime={item?.availableTime || ''}\n address={item?.address}\n city={item?.city}\n state={item?.state}\n zipCode={item?.zipCode}\n euifyMakeModel={item?.euifyMakeModel || ''}\n onSchedule={onSchedule}\n />\n )\n })\n )}\n </div>\n\n {/* Location Filter Overlay */}\n <LocationFilter\n locations={studioLocations.map((loc) => ({\n address: loc.address,\n id: loc.id,\n }))}\n visible={showLocationFilter}\n onSelect={handleLocationSelect}\n onClose={() => setShowLocationFilter(false)}\n />\n </div>\n {googleMapsApiKey && (\n <div className={cn('flex-1')}>\n <StudioMap\n googleMapsApiKey={googleMapsApiKey}\n locations={filteredStudioLocations}\n onSchedule={() => {\n console.log(111)\n }}\n mapHeight=\"794px\"\n />\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nRoomsList.displayName = 'RoomsList'\n","import type {\n ApiResponse,\n DemoRoom,\n GetDemoRoomsResponse,\n GetTimeslotsResponse,\n Questionnaire,\n CreateBookingRequest,\n Booking,\n} from './types'\nimport { ApiError, ApiErrorCode } from './types'\n\nexport interface DemoRoomApiConfig {\n baseUrl: string\n apiKey: string\n locale?: string\n timeout?: number\n}\n\nexport class DemoRoomApiClient {\n private config: DemoRoomApiConfig\n\n constructor(config: DemoRoomApiConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n }\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`\n\n const headers: Record<string, string> = {\n 'X-API-Key': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n }\n\n // 添加语言偏好\n if (this.config.locale) {\n headers['Accept-Language'] = this.config.locale\n }\n\n try {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n const data: ApiResponse<T> = await response.json()\n\n if (data.code !== ApiErrorCode.SUCCESS) {\n throw new ApiError(data.code, data.message, data.request_id)\n }\n\n return data.data\n } catch (error) {\n if (error instanceof ApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new ApiError(ApiErrorCode.INTERNAL_ERROR, 'Request timeout')\n }\n throw new ApiError(ApiErrorCode.INTERNAL_ERROR, error.message)\n }\n\n throw new ApiError(ApiErrorCode.INTERNAL_ERROR, 'Unknown error')\n }\n }\n\n /**\n * 获取门店列表\n * @param params.team_code 团队编码\n * @param params.brand_website 品牌站点\n * @param params.locale 语言偏好(可选)\n */\n async getDemoRooms(params: {\n team_code?: string\n brand_website?: string\n locale?: string\n }): Promise<DemoRoom[]> {\n const searchParams = new URLSearchParams()\n\n if (params.team_code) {\n searchParams.append('team_code', params.team_code)\n }\n\n if (params.brand_website) {\n searchParams.append('brand_website', params.brand_website)\n }\n\n if (params.locale) {\n searchParams.append('locale', params.locale)\n }\n\n const response = await this.request<GetDemoRoomsResponse>(\n `/api/v1/store/demorooms?${searchParams.toString()}`\n )\n\n return response.demorooms\n }\n\n /**\n * 获取门店详情\n * @param code 门店编码\n * @param locale 语言偏好(可选)\n */\n async getDemoRoom(code: string, locale?: string): Promise<DemoRoom> {\n const searchParams = new URLSearchParams()\n if (locale) {\n searchParams.append('locale', locale)\n }\n\n const query = searchParams.toString()\n return this.request<DemoRoom>(\n `/api/v1/store/demorooms/${code}${query ? `?${query}` : ''}`\n )\n }\n\n /**\n * 查询门店时段\n * @param code 门店编码\n * @param params.start_date 开始日期 (YYYY-MM-DD)\n * @param params.end_date 结束日期 (YYYY-MM-DD)\n * @param params.timezone 时区(可选)\n */\n async getTimeslots(\n code: string,\n params: {\n start_date: string\n end_date: string\n timezone?: string\n }\n ): Promise<GetTimeslotsResponse> {\n const searchParams = new URLSearchParams({\n start_date: params.start_date,\n end_date: params.end_date,\n })\n\n if (params.timezone) {\n searchParams.append('timezone', params.timezone)\n }\n\n return this.request<GetTimeslotsResponse>(\n `/api/v1/store/demorooms/${code}/timeslots?${searchParams.toString()}`\n )\n }\n\n /**\n * 查询门店问卷\n * @param code 门店编码\n * @param questionnaire_id 问卷ID\n * @param locale 语言偏好(可选)\n */\n async getQuestionnaire(\n code: string,\n questionnaire_id: number,\n locale?: string\n ): Promise<Questionnaire> {\n const searchParams = new URLSearchParams()\n if (locale) {\n searchParams.append('locale', locale)\n }\n\n const query = searchParams.toString()\n return this.request<Questionnaire>(\n `/api/v1/store/demorooms/${code}/questionnaires/${questionnaire_id}${query ? `?${query}` : ''}`\n )\n }\n\n /**\n * 提交预约\n * @param data 预约数据\n */\n async createBooking(data: CreateBookingRequest): Promise<Booking> {\n return this.request<Booking>('/api/v1/store/bookings', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * 根据 token 获取预约信息\n * @param token 预约 token\n */\n async getBooking(token: string): Promise<Booking> {\n return this.request<Booking>(`/api/v1/store/bookings/${token}`)\n }\n}\n\n// 创建默认客户端实例的辅助函数\nexport function createDemoRoomApi(config: DemoRoomApiConfig): DemoRoomApiClient {\n return new DemoRoomApiClient(config)\n}\n","import React, { useMemo } from 'react'\nimport { cn } from '@/utils/cn'\nimport { HelpNav } from './components/HelpNav'\nimport { UpcomingEvents } from './components/UpcomingEvents'\nimport { Banner } from './components/Banner'\nimport { BreadCrumbs } from './components/BreadCrumbs'\nimport { EasySteps } from './components/EasySteps'\nimport { RoomsList } from './components/RoomsList'\nimport { createDemoRoomApi } from '@/api'\nimport type { DemoRoomApiClient } from '@/api'\n\nexport interface DemoRoomProps extends React.HTMLAttributes<HTMLDivElement> {\n layoutClassName?: string\n /**\n * 谷歌地图 API Key\n */\n googleMapsApiKey?: string\n /**\n * API 配置\n */\n apiConfig: {\n baseUrl: string\n apiKey: string\n locale?: string\n }\n /**\n * 团队编码或品牌站点(二选一)\n */\n teamCode?: string\n brandWebsite?: string\n /**\n * Callback when user clicks \"Schedule Now\" button\n * @param demoRoomCode - The demo room code\n */\n onSchedule?: (demoRoomCode: string) => void\n}\n\nexport const DemoRoom: React.FC<DemoRoomProps> = ({\n className,\n layoutClassName = 'w-safe11',\n googleMapsApiKey,\n apiConfig,\n teamCode,\n brandWebsite,\n onSchedule,\n ...props\n}) => {\n // 创建 API 客户端实例\n const apiClient = useMemo<DemoRoomApiClient>(\n () => createDemoRoomApi(apiConfig),\n [apiConfig]\n )\n\n return (\n <div className={cn(className)} {...props}>\n <Banner className={layoutClassName}></Banner>\n <BreadCrumbs\n className={layoutClassName}\n items={[{ label: 'Home', link: '/' }, { label: 'Demo Room' }]}\n ></BreadCrumbs>\n <HelpNav></HelpNav>\n <UpcomingEvents className={layoutClassName}></UpcomingEvents>\n <RoomsList\n className={layoutClassName}\n googleMapsApiKey={googleMapsApiKey}\n apiClient={apiClient}\n teamCode={teamCode}\n brandWebsite={brandWebsite}\n onSchedule={onSchedule}\n ></RoomsList>\n <EasySteps className={layoutClassName}></EasySteps>\n </div>\n )\n}\n\nDemoRoom.displayName = 'DemoRoom'\n"]}
|