feat: launch readiness — PWA, API hardening, memory leak fixes, sticker removal

- Add PWA infrastructure: vite-plugin-pwa, manifest, service worker,
  SW update prompt component, placeholder icons, Apple meta tags
- Harden API client: 401 auto-logout, AbortController timeouts
  (30s standard, 120s uploads), onUnauthorized callback
- Fix memory leaks: clear voice user status on leave, clean up all
  Maps (channelToSpaceMap, permissions, etc.) on removeSpace
- Upgrade error boundary to Aether Drift design with Try Again button,
  collapsible stack trace, and componentDidCatch logging
- Configure desktop icon paths in electron-builder.yml
- Remove sticker feature (server routes, schema, types, UI components)
- Fix Docker build: use **/node_modules in .dockerignore to prevent
  COPY from clobbering pnpm-installed workspace dependencies
- Add vite-env.d.ts declarations for noise suppressor wasm imports
- Exclude test files from tsc build via tsconfig
This commit is contained in:
Jannis Braun
2026-03-15 15:41:22 +01:00
parent b08f40feb7
commit 4d230711fc
36 changed files with 2740 additions and 1283 deletions
-39
View File
@@ -192,8 +192,6 @@ export interface MessageWithUser extends Message {
attachments: Attachment[];
reactions: Reaction[];
replyTo?: MessageWithUser | null;
stickerId?: string | null;
sticker?: Sticker | null;
}
// ─── Reaction Types ────────────────────────────────────────────────────────
@@ -257,8 +255,6 @@ export interface DmMessageWithUser extends DmMessage {
attachments: Attachment[];
reactions: Reaction[];
replyTo?: DmMessageWithUser | null;
stickerId?: string | null;
sticker?: Sticker | null;
}
// ─── WebSocket Event Types ──────────────────────────────────────────────────
@@ -342,11 +338,6 @@ export type ServerEvent =
| { type: 'category_deleted'; categoryId: string; spaceId: string }
| { type: 'channel_layout_updated'; spaceId: string; channels: Channel[]; categories: ChannelCategory[] }
| { type: 'space_layout_updated'; layout: SpaceLayoutItem[]; folders: SpaceFolder[]; updatedAt?: number }
| { type: 'sticker_pack_created'; spaceId: string; pack: StickerPack }
| { type: 'sticker_pack_updated'; spaceId: string; pack: StickerPack }
| { type: 'sticker_pack_deleted'; spaceId: string; packId: string }
| { type: 'sticker_created'; spaceId: string; sticker: Sticker }
| { type: 'sticker_deleted'; spaceId: string; stickerId: string }
| { type: 'pong' }
| { type: 'error'; message: string };
@@ -426,7 +417,6 @@ export interface CreateMessageRequest {
content: string;
attachments?: string[];
replyToId?: string;
stickerId?: string;
}
export interface UpdateMessageRequest {
@@ -458,7 +448,6 @@ export interface CreateDmMessageRequest {
content?: string;
attachments?: string[];
replyToId?: string;
stickerId?: string;
}
export interface PaginatedQuery {
@@ -539,34 +528,6 @@ export interface GifResult {
height: number;
}
// ─── Sticker Types ──────────────────────────────────────────────────────────
export interface Sticker {
id: string;
packId: string;
spaceId: string;
name: string;
tags: string;
filename: string;
mimetype: string;
size: number;
width: number | null;
height: number | null;
uploadedBy: string;
createdAt: number;
}
export interface StickerPack {
id: string;
spaceId: string;
name: string;
description: string | null;
createdBy: string;
createdAt: number;
stickers: Sticker[];
spaceName?: string;
}
// ─── Instance Settings Types ────────────────────────────────────────────────
export interface InstanceAdminSettings {