mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
50 lines
1.9 KiB
TypeScript
50 lines
1.9 KiB
TypeScript
import cl from 'clsx'
|
||
|
||
import { CatalogPanel } from 'domains/catalog'
|
||
import { CartPanel, OrderHistory, useAddProductToOrder } from 'domains/orders'
|
||
import { useSessionState } from 'domains/session'
|
||
import { AppShellLayout } from 'compositions/layouts/app-shell'
|
||
import type { StorefrontScreenProps } from './types/storefront-screen-props.type'
|
||
import styles from './styles/storefront.module.css'
|
||
|
||
/**
|
||
* Авторизованный storefront, координирующий независимые доменные UI.
|
||
*
|
||
* Используется для:
|
||
* - передачи product snapshot из catalog в draft order
|
||
* - совместного отображения каталога, корзины и истории
|
||
*/
|
||
export const StorefrontScreen = (props: StorefrontScreenProps) => {
|
||
const { className, ...rootAttrs } = props
|
||
const { user } = useSessionState()
|
||
const addProduct = useAddProductToOrder()
|
||
const isAdmin = user?.role === 'admin'
|
||
|
||
return (
|
||
<AppShellLayout>
|
||
<main {...rootAttrs} className={cl(styles.root, className)}>
|
||
<section className={styles.hero}>
|
||
<div>
|
||
<span className={styles.kicker}>One contract · three owners</span>
|
||
<h1>Simple Store,<br />без простой архитектуры.</h1>
|
||
</div>
|
||
<div className={styles.heroAside}>
|
||
<span className={styles.pulse}><i /> API online</span>
|
||
<p>
|
||
JWT refresh, RBAC, pagination, stock validation и optimistic locking
|
||
проходят через отдельные SLM boundaries.
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<div id="catalog" className={styles.workspace}>
|
||
<CatalogPanel isAdmin={isAdmin} onAddProduct={addProduct} />
|
||
<CartPanel />
|
||
</div>
|
||
|
||
<OrderHistory id="orders" />
|
||
</main>
|
||
</AppShellLayout>
|
||
)
|
||
}
|