diff --git a/src/features/online-board/components/DetailsBackButton/DetailsBackButton.scss b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.scss new file mode 100644 index 00000000..808214e2 --- /dev/null +++ b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.scss @@ -0,0 +1,22 @@ +.details-back-button { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + background: #e3f0ff; + color: #1a3a5c; + border-radius: 6px; + text-decoration: none; + font-size: 14px; + font-family: inherit; + cursor: pointer; + + &:hover { + background: #c7dff5; + } + + &__arrow { + display: inline-block; + font-size: 16px; + } +} diff --git a/src/features/online-board/components/DetailsBackButton/DetailsBackButton.test.tsx b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.test.tsx new file mode 100644 index 00000000..c7bdc107 --- /dev/null +++ b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.test.tsx @@ -0,0 +1,50 @@ +// @vitest-environment jsdom +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { DetailsBackButton } from "./DetailsBackButton.js"; + +vi.mock("@modern-js/runtime/router", () => ({ + Link: ({ + children, + to, + ...props + }: { + children: React.ReactNode; + to: string; + [key: string]: unknown; + }) => ( + + {children} + + ), +})); + +vi.mock("@/i18n/provider.js", () => ({ + useTranslation: () => ({ t: (k: string) => k }), +})); + +describe("DetailsBackButton", () => { + it("has data-testid details-back-button", () => { + render(); + expect(screen.getByTestId("details-back-button")).toBeTruthy(); + }); + + it("links to /ru/onlineboard for locale='ru'", () => { + render(); + expect(screen.getByTestId("details-back-button").getAttribute("href")).toBe( + "/ru/onlineboard", + ); + }); + + it("uses the provided locale", () => { + render(); + expect(screen.getByTestId("details-back-button").getAttribute("href")).toBe( + "/en/onlineboard", + ); + }); + + it("renders SHARED.BACK-BOARD label", () => { + render(); + expect(screen.getByText("SHARED.BACK-BOARD")).toBeTruthy(); + }); +}); diff --git a/src/features/online-board/components/DetailsBackButton/DetailsBackButton.tsx b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.tsx new file mode 100644 index 00000000..e7f8cfd5 --- /dev/null +++ b/src/features/online-board/components/DetailsBackButton/DetailsBackButton.tsx @@ -0,0 +1,24 @@ +import type { FC } from "react"; +import { Link } from "@modern-js/runtime/router"; +import { useTranslation } from "@/i18n/provider.js"; +import "./DetailsBackButton.scss"; + +export interface DetailsBackButtonProps { + locale: string; +} + +export const DetailsBackButton: FC = ({ locale }) => { + const { t } = useTranslation(); + return ( + + + {t("SHARED.BACK-BOARD")} + + ); +}; diff --git a/src/features/online-board/components/DetailsBackButton/index.ts b/src/features/online-board/components/DetailsBackButton/index.ts new file mode 100644 index 00000000..fb0a2bbb --- /dev/null +++ b/src/features/online-board/components/DetailsBackButton/index.ts @@ -0,0 +1,2 @@ +export { DetailsBackButton } from "./DetailsBackButton.js"; +export type { DetailsBackButtonProps } from "./DetailsBackButton.js";