Add password reset localization and chat configuration

- Implemented German and English localization for password reset functionality.
- Added WebSocket URL resolution logic in chat services to support various environments and configurations.
- Created centralized chat configuration for event keys and payload mappings.
- Developed RoomsView component for admin chat room management, including create, edit, and delete functionalities.
This commit is contained in:
Torsten Schulz (local)
2025-08-18 07:44:56 +02:00
parent 23f698d8fd
commit 19ee6ba0a1
50 changed files with 3117 additions and 359 deletions

View File

@@ -0,0 +1,87 @@
// Centralized config for YourChat protocol mapping and WS endpoint
// Override via .env (VITE_* variables)
const env = import.meta.env || {};
export const CHAT_WS_URL = env.VITE_CHAT_WS_URL
|| (env.VITE_CHAT_WS_HOST || env.VITE_CHAT_WS_PORT
? `ws://${env.VITE_CHAT_WS_HOST || 'localhost'}:${env.VITE_CHAT_WS_PORT || '1235'}`
: `ws://localhost:1235`);
// Event/type keys
export const CHAT_EVENT_KEY = env.VITE_CHAT_EVENT_KEY || 'type';
export const CHAT_EVT_TOKEN = env.VITE_CHAT_EVT_TOKEN || 'token';
export const CHAT_EVT_AUTH = env.VITE_CHAT_EVT_AUTH || 'auth'; // optional, YourChat nutzt Token
export const CHAT_EVT_JOIN = env.VITE_CHAT_EVT_JOIN || 'join';
export const CHAT_EVT_MESSAGE = env.VITE_CHAT_EVT_MESSAGE || 'message';
export const CHAT_EVT_SYSTEM = env.VITE_CHAT_EVT_SYSTEM || 'system';
// Field names for payloads
export const CHAT_JOIN_ROOM_KEY = env.VITE_CHAT_JOIN_ROOM_KEY || 'newroom';
export const CHAT_JOIN_LEAVE_ROOM_KEY = env.VITE_CHAT_JOIN_LEAVE_ROOM_KEY || 'password'; // YourChat erwartet password Feld; leave optional nicht vorgesehen
export const CHAT_MESSAGE_ROOM_KEY = env.VITE_CHAT_MESSAGE_ROOM_KEY || null; // YourChat braucht kein roomId im message payload
export const CHAT_MSG_TEXT_KEY = env.VITE_CHAT_MSG_TEXT_KEY || 'message';
export const CHAT_MSG_FROM_KEY = env.VITE_CHAT_MSG_FROM_KEY || 'userName';
export const CHAT_MSG_ID_KEY = env.VITE_CHAT_MSG_ID_KEY || 'id';
export const CHAT_TOKEN_KEY = env.VITE_CHAT_TOKEN_KEY || 'token';
// Auth payload mapping
export const CHAT_AUTH_PAYLOAD_KEY = env.VITE_CHAT_AUTH_PAYLOAD_KEY || 'data';
export const CHAT_AUTH_USER_ID_KEY = env.VITE_CHAT_AUTH_USER_ID_KEY || 'userId';
export const CHAT_AUTH_AUTHCODE_KEY = env.VITE_CHAT_AUTH_AUTHCODE_KEY || 'authCode';
export function buildAuthPayload(user) {
const payload = {};
payload[CHAT_EVENT_KEY] = CHAT_EVT_AUTH;
const dataObj = {};
if (user?.id != null) dataObj[CHAT_AUTH_USER_ID_KEY] = user.id;
if (user?.authCode != null) dataObj[CHAT_AUTH_AUTHCODE_KEY] = user.authCode;
payload[CHAT_AUTH_PAYLOAD_KEY] = dataObj;
return payload;
}
export function buildJoinPayload(roomName, password = '') {
const payload = {};
payload[CHAT_EVENT_KEY] = CHAT_EVT_JOIN;
if (roomName != null) payload[CHAT_JOIN_ROOM_KEY] = roomName;
if (CHAT_JOIN_LEAVE_ROOM_KEY) payload[CHAT_JOIN_LEAVE_ROOM_KEY] = password;
return payload;
}
export function buildMessagePayload(text) {
const payload = {};
payload[CHAT_EVENT_KEY] = CHAT_EVT_MESSAGE;
if (CHAT_MESSAGE_ROOM_KEY && typeof CHAT_MESSAGE_ROOM_KEY === 'string') payload[CHAT_MESSAGE_ROOM_KEY] = null;
payload[CHAT_MSG_TEXT_KEY] = text;
return payload;
}
export function parseIncomingMessage(data) {
// Try JSON, else return as system text
let obj = data;
if (typeof data === 'string') {
try { obj = JSON.parse(data); } catch (_) { return { type: 'system', text: String(data) }; }
}
const type = obj[CHAT_EVENT_KEY] || obj.type;
if (type === CHAT_EVT_TOKEN) {
return { type: 'token', token: obj.message };
}
if (type === CHAT_EVT_MESSAGE || type === 'message') {
return {
type: 'message',
id: obj[CHAT_MSG_ID_KEY] || Date.now(),
from: obj[CHAT_MSG_FROM_KEY] || 'User',
text: obj[CHAT_MSG_TEXT_KEY] || ''
};
}
if (type === CHAT_EVT_SYSTEM || type === 'system') {
return {
type: 'system',
id: obj[CHAT_MSG_ID_KEY] || Date.now(),
text: obj[CHAT_MSG_TEXT_KEY] || ''
};
}
// Fallback: unknown event -> show raw
return { type: 'system', id: Date.now(), text: JSON.stringify(obj) };
}