'use client' import type { ChangeEvent } from 'react' import { useEffect, useEffectEvent, useRef } from 'react' import cl from 'clsx' import { useAuth } from '@/domains/auth' import { useCart } from '@/domains/cart' import { useDemoControl } from '@/domains/demo-control' import { Button } from '@/ui/button' import type { DemoToolbarWidgetProps } from './types/demo-toolbar-widget-props.type' import styles from './styles/demo-toolbar.module.css' /** * Управляет детерминированными сбоями и seed fixture-бэкенда. * * Используется для: * - проверки loading, empty, error и auth outcomes * - сброса данных между архитектурными демонстрациями */ export const DemoToolbarWidget = (props: DemoToolbarWidgetProps) => { const { className, ...rootAttrs } = props const demo = useDemoControl() const auth = useAuth() const cart = useCart() const selectedOption = demo.scenarios.find((option) => option.value === demo.scenario) const healthLabel = demo.health === 'online' ? `API ${demo.apiVersion ?? ''}`.trim() : demo.health const canChangeRole = auth.user !== null const nextRole = auth.user?.role === 'admin' ? 'customer' : 'admin' const roleActionLabel = `Become ${nextRole}` const previousFixtureChangeRef = useRef(demo.fixtureChange) const synchronizeFixtureOwners = useEffectEvent((change: string) => { if (change.startsWith('data:')) { void cart.clearCart() } if (auth.sessionKey !== null) { void auth.refreshCurrentUser() } }) useEffect(() => { if (previousFixtureChangeRef.current !== demo.fixtureChange) { previousFixtureChangeRef.current = demo.fixtureChange synchronizeFixtureOwners(demo.fixtureChange) } }, [demo.fixtureChange]) /** * Применяет выбранный request-local сценарий. */ const handleScenarioChange = (event: ChangeEvent): void => { const selectedScenario = demo.scenarios.find((option) => option.value === event.target.value) if (selectedScenario !== undefined) { void demo.selectScenario(selectedScenario.value) } } /** * Восстанавливает исходный малый seed. */ const handleReset = async (): Promise => { await demo.resetData() } /** * Загружает большой deterministic dataset. */ const handleLargeSeed = async (): Promise => { await demo.seedData('large') } /** * Переключает роль текущего fixture-пользователя и обновляет профиль. */ const handleRoleChange = async (): Promise => { if (auth.user === null) { return } await demo.changeRole(auth.user.id, nextRole) } return ( ) }