diff --git a/mechanic-pwa/frontend/src/App.tsx b/mechanic-pwa/frontend/src/App.tsx
index 1c75fc9..50eb33b 100644
--- a/mechanic-pwa/frontend/src/App.tsx
+++ b/mechanic-pwa/frontend/src/App.tsx
@@ -44,6 +44,22 @@ function RequireAdmin({ children }: { children: React.ReactNode }) {
return <>{children}>;
}
+/**
+ * Выдача резины — по складскому праву (warehouse:tyres в /me), не только
+ * админам. Приёмка и инвентаризация остаются под RequireAdmin.
+ */
+function RequireTyres({ children }: { children: React.ReactNode }) {
+ const token = useAuth((s) => s.token);
+ const meQuery = useQuery({ queryKey: ["me"], queryFn: getMe, staleTime: 60_000, enabled: !!token });
+ if (!token) return ;
+ if (meQuery.isLoading) return null;
+ const me = meQuery.data;
+ if (!me?.is_admin && !me?.permissions?.includes("warehouse:tyres")) {
+ return ;
+ }
+ return <>{children}>;
+}
+
export default function App() {
// У35: фоновая сверка прав механика раз в 5 минут — выкидывает на /login
// с сообщением «Доступ отозван», если админ снял can_login_pwa или вывел
@@ -72,10 +88,10 @@ export default function App() {
} />
} />
} />
- {/* Сезонная выдача резины — тот же круг, что приёмка и инвентаризация. */}
- } />
- } />
- } />
+ {/* Сезонная выдача резины — по складскому праву (не только админам). */}
+ } />
+ } />
+ } />
} />
);
diff --git a/mechanic-pwa/frontend/src/pages/ActionMenu.tsx b/mechanic-pwa/frontend/src/pages/ActionMenu.tsx
index efe6519..788b63f 100644
--- a/mechanic-pwa/frontend/src/pages/ActionMenu.tsx
+++ b/mechanic-pwa/frontend/src/pages/ActionMenu.tsx
@@ -34,7 +34,7 @@ export default function ActionMenu() {
emoji: "🔧",
onClick: () => navigate("/repairs"),
},
- // Складские разделы правят остатки и деньги — пока только админам
+ // Приёмка и инвентаризация правят остатки и деньги — пока только админам
// (тот же гейт стоит на сервере, здесь просто не показываем лишнего).
...(meQuery.data?.is_admin
? [
@@ -52,6 +52,12 @@ export default function ActionMenu() {
emoji: "📋",
onClick: () => navigate("/wh/stocktake"),
},
+ ]
+ : []),
+ // Выдача резины — по складскому праву (не только админам): признак
+ // warehouse:tyres приходит в /me, если у механика есть право склада.
+ ...(meQuery.data?.is_admin || meQuery.data?.permissions?.includes("warehouse:tyres")
+ ? [
{
key: "tyres",
title: "Выдача резины",