Files
Wand-Enhancer-luanslimadev-1/web-panel/src/app/ui/StatusPill.tsx
T
kitbyte a0b3968d33 refactor(web-panel): update architecture + cheat i18n
Reorganize the panel around product capabilities and integrate the
remote i18n feature from origin/master into the new structure.

- Restructure src into capability features (app, trainer, library,
  remote-session, appearance, shared); move the bridge to bridge/src.
- Add lingui-based UI localization and wrap remaining user-facing
  strings (Trans / msg macros); fix the 'END В·' mojibake.
- Port WeMod cheat-metadata i18n: capture the access token from the
  snapshot's renderer in the bridge and fetch localized trainer_meta
  in remote-session.i18n; guarantee snapshot sync on token failure.
- Wire vitest to the app's lingui/preact pipeline (mergeConfig).
2026-06-15 00:10:49 +03:00

39 lines
1.8 KiB
TypeScript

import { msg } from '@lingui/core/macro';
import type { MessageDescriptor } from '@lingui/core';
import { useLingui } from '@lingui/react';
import { Icon } from '@/shared/ui/Icon';
import { cn } from '@/shared/lib/ui';
import { EConnectionStatus } from '@/remote-session/remote-session.reducer';
const STATUS_LABELS: Record<EConnectionStatus, MessageDescriptor> = {
[EConnectionStatus.Connected]: msg`LIVE`,
[EConnectionStatus.Connecting]: msg`LINKING`,
[EConnectionStatus.Reconnecting]: msg`LINKING`,
[EConnectionStatus.Error]: msg`OFFLINE`,
[EConnectionStatus.Idle]: msg`OFFLINE`,
};
const STATUS_CLASSES: Record<EConnectionStatus, string> = {
[EConnectionStatus.Connected]: 'border-[color-mix(in_oklab,var(--deck-accent)_30%,transparent)] text-(--deck-accent)',
[EConnectionStatus.Connecting]: 'border-amber-300/30 text-amber-300',
[EConnectionStatus.Reconnecting]: 'border-amber-300/30 text-amber-300',
[EConnectionStatus.Error]: 'border-white/10 text-(--deck-fg-4)',
[EConnectionStatus.Idle]: 'border-white/10 text-(--deck-fg-4)',
};
export const StatusPill = ({ status }: { status: EConnectionStatus }) => {
const { _ } = useLingui();
const live = status === EConnectionStatus.Connected
|| status === EConnectionStatus.Connecting
|| status === EConnectionStatus.Reconnecting;
return (
<div className={cn('inline-flex items-center gap-1.5 rounded-full border bg-white/[0.04] px-2.5 py-1 font-mono text-[9.5px] font-bold tracking-[0.12em] backdrop-blur-md', STATUS_CLASSES[status])}>
{live ? <span className="size-1.5 rounded-full bg-current shadow-[0_0_6px_currentColor] motion-safe:animate-[breathe_1.6s_ease-in-out_infinite]" /> : null}
{_(STATUS_LABELS[status])}
{status === EConnectionStatus.Error ? <Icon className="size-3" name="alert" /> : null}
</div>
);
};