Update system name and references from TeaBoy to Tx
Replaces all user-facing instances of "TeaBoy" with "Tx" across the application, including titles, locale files, database settings, seed data, and API documentation. Also updates internal storage keys and session secrets to remove the old branding. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 07b19cb0-11b5-4be9-8932-ae4820eb73b8 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/HxTkDPZ Replit-Helium-Checkpoint-Created: true
This commit is contained in:
@@ -64,7 +64,7 @@ export const sessionMiddleware = session({
|
||||
if (process.env.NODE_ENV === "production") {
|
||||
throw new Error("SESSION_SECRET must be set in production");
|
||||
}
|
||||
return "teaboy-dev-secret-change-before-deploy";
|
||||
return "tx-dev-secret-change-before-deploy";
|
||||
})(),
|
||||
resave: false,
|
||||
saveUninitialized: false,
|
||||
|
||||
@@ -114,7 +114,7 @@ test("GET /api/groups requires admin (regular user gets 403)", async () => {
|
||||
assert.equal(res.status, 403);
|
||||
});
|
||||
|
||||
test("admin lists default seed groups including Admins, TeaBoy, Everyone", async () => {
|
||||
test("admin lists default seed groups including Admins, Tx, Everyone", async () => {
|
||||
const res = await fetch(`${API_BASE}/api/groups`, {
|
||||
headers: { Cookie: adminCookie },
|
||||
});
|
||||
@@ -122,7 +122,7 @@ test("admin lists default seed groups including Admins, TeaBoy, Everyone", async
|
||||
const list = await res.json();
|
||||
const names = new Set(list.map((g) => g.name));
|
||||
assert.ok(names.has("Admins"));
|
||||
assert.ok(names.has("TeaBoy"));
|
||||
assert.ok(names.has("Tx"));
|
||||
assert.ok(names.has("Everyone"));
|
||||
});
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
|
||||
<title>TeaBoy OS</title>
|
||||
<title>Tx OS</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
@@ -339,8 +339,8 @@ export function AnalogClockWidget({
|
||||
);
|
||||
}
|
||||
|
||||
const HOME_CLOCK_STORAGE_KEY = "teaboy:home-clock-visible";
|
||||
const HOME_CLOCK_EVENT = "teaboy:home-clock-changed";
|
||||
const HOME_CLOCK_STORAGE_KEY = "tx:home-clock-visible";
|
||||
const HOME_CLOCK_EVENT = "tx:home-clock-changed";
|
||||
|
||||
function readHomeClockVisible(): boolean {
|
||||
if (typeof window === "undefined") return true;
|
||||
@@ -384,8 +384,8 @@ export function useHomeClockVisibility(): [boolean, (next: boolean) => void] {
|
||||
return [visible, setVisible];
|
||||
}
|
||||
|
||||
const TOPBAR_CLOCK_STORAGE_KEY = "teaboy:topbar-clock-visible";
|
||||
const TOPBAR_CLOCK_EVENT = "teaboy:topbar-clock-changed";
|
||||
const TOPBAR_CLOCK_STORAGE_KEY = "tx:topbar-clock-visible";
|
||||
const TOPBAR_CLOCK_EVENT = "tx:topbar-clock-changed";
|
||||
|
||||
function readTopbarClockVisible(): boolean {
|
||||
if (typeof window === "undefined") return true;
|
||||
@@ -428,13 +428,13 @@ export function useTopbarClockVisibility(): [boolean, (next: boolean) => void] {
|
||||
return [visible, setVisible];
|
||||
}
|
||||
|
||||
const HOME_CLOCK_SIZE_EVENT = "teaboy:home-clock-size-changed";
|
||||
const HOME_CLOCK_SIZE_EVENT = "tx:home-clock-size-changed";
|
||||
export type HomeClockSize = "compact" | "large";
|
||||
|
||||
function homeClockSizeKey(userId: number | string | null | undefined): string {
|
||||
return userId == null
|
||||
? "teaboy:home-clock-size"
|
||||
: `teaboy:home-clock-size:${userId}`;
|
||||
? "tx:home-clock-size"
|
||||
: `tx:home-clock-size:${userId}`;
|
||||
}
|
||||
|
||||
function readHomeClockSize(userId: number | string | null | undefined): HomeClockSize {
|
||||
@@ -473,12 +473,12 @@ export function useHomeClockSize(
|
||||
return [size, setSize];
|
||||
}
|
||||
|
||||
const HOME_CLOCK_POS_EVENT = "teaboy:home-clock-pos-changed";
|
||||
const HOME_CLOCK_POS_EVENT = "tx:home-clock-pos-changed";
|
||||
|
||||
function homeClockPosKey(userId: number | string | null | undefined): string {
|
||||
return userId == null
|
||||
? "teaboy:home-clock-position"
|
||||
: `teaboy:home-clock-position:${userId}`;
|
||||
? "tx:home-clock-position"
|
||||
: `tx:home-clock-position:${userId}`;
|
||||
}
|
||||
|
||||
function readHomeClockPosition(userId: number | string | null | undefined): number {
|
||||
|
||||
@@ -11,7 +11,7 @@ export function useAppName() {
|
||||
const { i18n } = useTranslation();
|
||||
const { data } = useAppSettings();
|
||||
const isAr = i18n.language === "ar";
|
||||
const fallback = isAr ? "نظام TeaBoy" : "TeaBoy OS";
|
||||
const fallback = isAr ? "نظام Tx" : "Tx OS";
|
||||
const name = data ? (isAr ? data.siteNameAr : data.siteNameEn) : fallback;
|
||||
useEffect(() => {
|
||||
if (typeof document !== "undefined" && data) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import ar from './locales/ar.json';
|
||||
import en from './locales/en.json';
|
||||
|
||||
// Initialize i18next
|
||||
const savedLanguage = localStorage.getItem('teaboy-lang') || 'ar';
|
||||
const savedLanguage = localStorage.getItem('tx-lang') || 'ar';
|
||||
|
||||
i18n
|
||||
.use(initReactI18next)
|
||||
@@ -26,7 +26,7 @@ document.documentElement.lang = savedLanguage;
|
||||
i18n.on('languageChanged', (lng) => {
|
||||
document.documentElement.dir = lng === 'ar' ? 'rtl' : 'ltr';
|
||||
document.documentElement.lang = lng;
|
||||
localStorage.setItem('teaboy-lang', lng);
|
||||
localStorage.setItem('tx-lang', lng);
|
||||
});
|
||||
|
||||
export default i18n;
|
||||
|
||||
@@ -488,7 +488,7 @@
|
||||
"error": "حدث خطأ",
|
||||
"success": "تمت العملية بنجاح",
|
||||
"language": "English",
|
||||
"appName": "نظام TeaBoy"
|
||||
"appName": "نظام Tx"
|
||||
},
|
||||
"notes": {
|
||||
"title": "الملاحظات",
|
||||
|
||||
@@ -485,7 +485,7 @@
|
||||
"error": "An error occurred",
|
||||
"success": "Success",
|
||||
"language": "العربية",
|
||||
"appName": "TeaBoy OS"
|
||||
"appName": "Tx OS"
|
||||
},
|
||||
"notes": {
|
||||
"title": "Notes",
|
||||
|
||||
@@ -253,7 +253,7 @@ export default function ChatPage() {
|
||||
// arrive in the conversation before the user next opens chat.
|
||||
useEffect(() => {
|
||||
if (!user || !conversations) return;
|
||||
const ackKey = `teaboy:admin-known:${user.id}`;
|
||||
const ackKey = `tx:admin-known:${user.id}`;
|
||||
let ack: number[] = [];
|
||||
try {
|
||||
ack = JSON.parse(localStorage.getItem(ackKey) ?? "[]");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// UI test verifying that the home-page clock widget keeps its grid position
|
||||
// and compact/large size after a full page reload, and that the changes are
|
||||
// persisted to localStorage under the documented keys
|
||||
// `teaboy:home-clock-position` / `teaboy:home-clock-size` (or their per-user
|
||||
// `tx:home-clock-position` / `tx:home-clock-size` (or their per-user
|
||||
// variants once a user is logged in).
|
||||
//
|
||||
// This is the recurring automated counterpart to the manual e2e check
|
||||
@@ -95,9 +95,9 @@ async function readClockStorage(page, userId) {
|
||||
return page.evaluate((uid) => {
|
||||
return {
|
||||
position: window.localStorage.getItem(
|
||||
`teaboy:home-clock-position:${uid}`,
|
||||
`tx:home-clock-position:${uid}`,
|
||||
),
|
||||
size: window.localStorage.getItem(`teaboy:home-clock-size:${uid}`),
|
||||
size: window.localStorage.getItem(`tx:home-clock-size:${uid}`),
|
||||
};
|
||||
}, userId);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user