From 53236e613b7c3a5383b4517cbae49fe6913e3ce6 Mon Sep 17 00:00:00 2001 From: Ryan Westfall Date: Mon, 27 Jul 2026 07:49:40 -0700 Subject: [PATCH] Terms of Service page (public + acknowledge) (#39) (#43) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Closes #39. - Shared `TermsOfServiceDocument` used by public + acknowledge flows - `/terms_of_service/` reachable without auth; `/legal/terms-of-service` alias - Expanded clauses including **Analytics and Cookies** (always-on page views vs consent-gated events) - Acknowledge still posts `/user/acknowledge_tos/` when signed in - Links from Sign In, Sign Up, and Footer ## Test plan - [ ] Visit `/terms_of_service/` logged out — document renders, no Acknowledge - [ ] Visit `/legal/terms-of-service` — same public content - [ ] Sign in as user needing ToS — Acknowledge posts and navigates home - [ ] Confirm Sign In / Sign Up / Footer / consent banner link to ToS - [ ] `npm run test:ci -- --testPathPattern='TermsOfService|Footer'`Reviewed-on: https://git.aimloperations.com/ai_ml_operations/chat_web_app/pulls/43 --- llm-fe/src/App.tsx | 7 +- .../llm-fe/components/Footer/Footer.test.tsx | 15 +- .../src/llm-fe/components/Footer/Footer.tsx | 16 +- .../legal/TermsOfServiceDocument.tsx | 138 ++++++++++++++ llm-fe/src/llm-fe/pages/SignIn/SignIn.tsx | 3 + llm-fe/src/llm-fe/pages/SignUp/SignUp.tsx | 3 + .../PublicTermsOfServicePage.tsx | 7 + .../TermsOfService/TermsOfService.test.tsx | 48 +++++ .../pages/TermsOfService/TermsOfService.tsx | 177 ++++++++++-------- 9 files changed, 325 insertions(+), 89 deletions(-) create mode 100644 llm-fe/src/llm-fe/components/legal/TermsOfServiceDocument.tsx create mode 100644 llm-fe/src/llm-fe/pages/TermsOfService/PublicTermsOfServicePage.tsx create mode 100644 llm-fe/src/llm-fe/pages/TermsOfService/TermsOfService.test.tsx diff --git a/llm-fe/src/App.tsx b/llm-fe/src/App.tsx index b2fdf91..afe35a4 100644 --- a/llm-fe/src/App.tsx +++ b/llm-fe/src/App.tsx @@ -10,6 +10,7 @@ import PasswordReset from './llm-fe/pages/PasswordReset/PasswordReset'; import NotFound from './llm-fe/pages/NotFound/NotFound'; import { AuthContext } from './llm-fe/contexts/AuthContext'; import TermsOfService from './llm-fe/pages/TermsOfService/TermsOfService'; +import PublicTermsOfServicePage from './llm-fe/pages/TermsOfService/PublicTermsOfServicePage'; import SetPassword from './llm-fe/components/SetPassword/SetPassword'; import AsyncDashboard2 from './llm-fe/pages/AsyncDashboard2/AsyncDashboard2'; import FeedbackPage2 from './llm-fe/pages/FeedbackPage2/FeedbackPage2'; @@ -61,14 +62,14 @@ class App extends Component { - - + {/* Public legal pages (also used for post-login ToS acknowledge) */} + + }> - diff --git a/llm-fe/src/llm-fe/components/Footer/Footer.test.tsx b/llm-fe/src/llm-fe/components/Footer/Footer.test.tsx index 7849551..59b8d6f 100644 --- a/llm-fe/src/llm-fe/components/Footer/Footer.test.tsx +++ b/llm-fe/src/llm-fe/components/Footer/Footer.test.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; import { render, screen } from '@testing-library/react'; import Footer from './Footer'; @@ -8,13 +9,21 @@ jest.mock('../../ui-kit/components/MDTypography', () => ({ })); describe('Footer', () => { - it('renders copyright and developer credit', () => { - render(