feat: qr codes

This commit is contained in:
2026-08-10 12:06:17 +07:00
parent 265b1202ad
commit 4323cde98f
7 changed files with 368 additions and 11 deletions

View File

@@ -10,6 +10,7 @@ import { Skeleton } from '../components/Skeleton';
import { StatStrip } from '../components/StatStrip';
import { DeviceCard } from '../components/DeviceCard';
import { Modal } from '../components/Modal';
import { SubscriptionQrModal } from '../components/SubscriptionQrModal';
import type { Device, SubscriptionData, UserInfo } from '../types';
export function AccountPage() {
@@ -22,6 +23,7 @@ export function AccountPage() {
const [subscription, setSubscription] = useState<SubscriptionData | null>(null);
const [loadingMeta, setLoadingMeta] = useState(true);
const [pending, setPending] = useState<Device | null>(null);
const [isQrOpen, setIsQrOpen] = useState(false);
useEffect(() => {
if (!isAuthenticated) {
@@ -137,9 +139,19 @@ export function AccountPage() {
{subscription.subscription_link}
</span>
</div>
<button type="button" className="copy-link" onClick={() => void copySubscriptionLink()}>
Копировать
</button>
<div className="subscription-actions">
<button
type="button"
className="subscription-qr-button"
aria-label="Показать QR-код ссылки подписки"
onClick={() => setIsQrOpen(true)}
>
QR
</button>
<button type="button" className="copy-link" onClick={() => void copySubscriptionLink()}>
Копировать
</button>
</div>
</section>
</Reveal>
) : null}
@@ -210,6 +222,10 @@ export function AccountPage() {
confirmLabel="Удалить"
onConfirm={confirmDelete}
/>
<SubscriptionQrModal
link={isQrOpen ? subscription?.subscription_link ?? null : null}
onClose={() => setIsQrOpen(false)}
/>
</Shell>
);
}