+
+
+
Реферальная ссылка
+
+ {referralLink}
+
+
+
+
+
@@ -226,6 +272,12 @@ export function AccountPage() {
link={isQrOpen ? subscription?.subscription_link ?? null : null}
onClose={() => setIsQrOpen(false)}
/>
+ setIsReferralQrOpen(false)}
+ />
);
}
diff --git a/src/pages/LoginPage.test.tsx b/src/pages/LoginPage.test.tsx
index a53f4a5..4cf51e1 100644
--- a/src/pages/LoginPage.test.tsx
+++ b/src/pages/LoginPage.test.tsx
@@ -79,12 +79,37 @@ describe('LoginPage', () => {
expect(pass.type).toBe('text');
});
- it('switches to signup and shows referral field', async () => {
+ it('switches to signup without a referral field', async () => {
const user = userEvent.setup();
renderLogin();
await user.click(screen.getByRole('tab', { name: /Регистрация/i }));
expect(screen.getByRole('heading', { name: /создать аккаунт/i })).toBeInTheDocument();
- expect(screen.getByLabelText(/реферальный код/i)).toBeInTheDocument();
+ expect(screen.queryByLabelText(/реферальный код/i)).not.toBeInTheDocument();
+ });
+
+ it('submits the referral code saved from a referral link', async () => {
+ const user = userEvent.setup();
+ localStorage.setItem('malenia.referral_code', 'friend-code');
+ vi.mocked(api.signup).mockResolvedValue({
+ access_token: 'a',
+ refresh_token: 'r',
+ expires_at: 9999999999,
+ user: { username: 'alice', telegram_id: null, referal_code: 'new-code' },
+ });
+ renderLogin();
+ await user.click(screen.getByRole('tab', { name: /Регистрация/i }));
+ await user.type(screen.getByLabelText('Имя пользователя'), 'alice');
+ await user.type(screen.getByLabelText('Пароль'), 'secret');
+ await user.click(screen.getByRole('button', { name: /создать аккаунт/i }));
+
+ await waitFor(() =>
+ expect(api.signup).toHaveBeenCalledWith({
+ provider: 'credentials',
+ username: 'alice',
+ password: 'secret',
+ referal_code: 'friend-code',
+ }),
+ );
});
it('shows backend error on login failure', async () => {
diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx
index 2577b50..e0c9c6d 100644
--- a/src/pages/LoginPage.tsx
+++ b/src/pages/LoginPage.tsx
@@ -6,6 +6,7 @@ import { useToastStore } from '../store/useToast';
import { Emblem } from '../components/Emblem';
import { Logo } from '../components/Logo';
import { Reveal } from '../components/Reveal';
+import { getReferralCode } from '../lib/referral';
type Mode = 'signin' | 'signup';
@@ -43,7 +44,6 @@ export function LoginPage() {
const [mode, setMode] = useState('signin');
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
- const [referral, setReferral] = useState('');
const [remember, setRemember] = useState(true);
const [showPass, setShowPass] = useState(false);
const [status, setStatus] = useState('');
@@ -96,7 +96,7 @@ export function LoginPage() {
provider: 'credentials',
username: username.trim(),
password,
- referal_code: referral.trim() || null,
+ referal_code: getReferralCode(),
});
setSession(res, remember);
showToast('Аккаунт создан');
@@ -204,25 +204,7 @@ export function LoginPage() {