## Summary Closes #35. - **Flip deploy workflows** (mirror `dta_webapp`): push/merge to `master` → auto-deploy **beta**; **Deploy Prod** is `workflow_dispatch` only - **Tianji**: `REACT_APP_TIANJI_WEBSITE_ID` + `REACT_APP_DEPLOY_ENV` in `.env.production` / `.env.beta`; Tracker loads page views always on prod/beta - **Consent policy**: page views always live; custom events / identify gated via `analyticsConsent` + `AnalyticsConsentBanner` + `trackEvent`/`identifyUser` helpers (call sites remain #36) - Remove invalid Tianji `<script>` from `index.tsx` (Tracker component owns injection) - README documents beta auto / prod button + Tianji policy ## Ops note — beta Tianji website ID Prod ID unchanged: `cm7x7m52m03kbddswbswrt17y`. `.env.beta` has `REACT_APP_TIANJI_WEBSITE_ID=` empty until a **Hesychia Beta** website is created in Tianji (workspace `cm7w8087y020lddswyhamadj2`). Paste the new id into `.env.beta` before beta page views show under a distinct site. ## Test plan - [x] `npm run test:ci` (106 tests) - [ ] Create Hesychia Beta Tianji website; set `REACT_APP_TIANJI_WEBSITE_ID` in `.env.beta` - [ ] Merge to master → Deploy Beta runs; prod does **not** auto-deploy - [ ] Manual Run workflow on Deploy Prod still works - [ ] Beta build hits `beta.chatbackend` REST/WS; static root `/var/www/beta.chat.aimloperations/html` (8083) - [ ] Prod/beta: tracker.js loads without accepting consent; banner shows until Accept/Decline; `trackEvent` only fires after AcceptReviewed-on: #42
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import './index.css';
|
|
import './llm-fe/platform/nativeSafeArea.css';
|
|
import App from './App';
|
|
import AppRouter from './llm-fe/platform/AppRouter';
|
|
import { initNativeShell } from './llm-fe/platform/initNativeShell';
|
|
import { AuthProvider } from './llm-fe/contexts/AuthContext';
|
|
import { AccountProvider } from './llm-fe/contexts/AccountContext';
|
|
import { WebSocketProvider } from './llm-fe/contexts/WebSocketContext';
|
|
import { MaterialUIControllerProvider } from './llm-fe/ui-kit/context';
|
|
import { ConversationProvider } from './llm-fe/contexts/ConversationContext';
|
|
import { MessageProvider } from './llm-fe/contexts/MessageContext';
|
|
import { PreferenceProvider } from './llm-fe/contexts/PreferencesContext';
|
|
|
|
void initNativeShell();
|
|
|
|
const root = ReactDOM.createRoot(
|
|
document.getElementById('root') as HTMLElement
|
|
);
|
|
root.render(
|
|
<React.StrictMode>
|
|
<AppRouter>
|
|
<AuthProvider>
|
|
<AccountProvider>
|
|
<WebSocketProvider>
|
|
<PreferenceProvider>
|
|
<ConversationProvider>
|
|
<MessageProvider>
|
|
<MaterialUIControllerProvider>
|
|
<App />
|
|
</MaterialUIControllerProvider>
|
|
</MessageProvider>
|
|
</ConversationProvider>
|
|
</PreferenceProvider>
|
|
</WebSocketProvider>
|
|
</AccountProvider>
|
|
</AuthProvider>
|
|
</AppRouter>
|
|
</React.StrictMode>
|
|
);
|