diff --git a/frontend/src/components/StoreItems.tsx b/frontend/src/components/StoreItems.tsx index 702ac63..97695af 100644 --- a/frontend/src/components/StoreItems.tsx +++ b/frontend/src/components/StoreItems.tsx @@ -19,9 +19,24 @@ const Card = styled.div` border: 1px solid rgba(108, 92, 231, 0.25); `; +type Feedback = { kind: 'success' | 'error'; text: string } | null; + export function StoreItems({ items, token }: { items: StoreItem[]; token?: string }) { const [loadingId, setLoadingId] = useState(null); - const [message, setMessage] = useState(null); + const [message, setMessage] = useState(null); + + const resolveErrorMessage = (error: unknown) => { + if (error instanceof Error) { + if (/Недостаточно маны/i.test(error.message)) { + return 'Недостаточно маны: выполните миссии с наградой ⚡ или загляните в журнал за бонусами.'; + } + if (/Товар закончился/i.test(error.message)) { + return 'Товар закончился — выберите другой приз или загляните позже, когда пополним склад.'; + } + return 'Не удалось оформить заказ. Проверьте подключение и повторите попытку.'; + } + return 'Произошла неизвестная ошибка. Повторите попытку позже.'; + }; async function handlePurchase(id: number) { try { @@ -32,11 +47,9 @@ export function StoreItems({ items, token }: { items: StoreItem[]; token?: strin body: JSON.stringify({ item_id: id }), authToken: token }); - setMessage('Заказ оформлен — проверьте журнал событий.'); + setMessage({ kind: 'success', text: 'Заказ оформлен — подтверждение появится в журнале и в панели HR.' }); } catch (error) { - if (error instanceof Error) { - setMessage(error.message); - } + setMessage({ kind: 'error', text: resolveErrorMessage(error) }); } finally { setLoadingId(null); } @@ -44,7 +57,14 @@ export function StoreItems({ items, token }: { items: StoreItem[]; token?: strin return (
- {message &&

{message}

} + {message && ( +

+ {message.text} +

+ )}
{items.map((item) => (