Commit Graph

1587 Commits

Author SHA1 Message Date
github-actions[bot]
06a83a01ae chore(main): release 1.45.0 2026-04-13 16:37:55 +00:00
c0mrade
dc20d3e087 Merge pull request #390 from BEDOLAGA-DEV/dev
Bugfixes: polyfill, UI fixes, campaign tracking, menu editor
2026-04-13 19:37:21 +03:00
c0mrade
30d8d28475 fix: show API error details in menu editor save + allow tg:// URLs
Save mutation was showing generic error instead of backend validation
detail, making it impossible to diagnose 422 errors. Also added tg://
to frontend URL validation for Telegram deep link support.
2026-04-13 17:07:29 +03:00
c0mrade
a46c89e45e feat: send campaign_slug during standalone email registration
Frontend now reads campaign slug from localStorage and includes it
in the registration API call, ensuring campaign attribution works
even if email verification happens in a different browser.
2026-04-13 14:43:39 +03:00
c0mrade
3d0fc76ecd fix: subscription status badge overflow + inline password validation
- Status badge (e.g. 'ПРИОСТАНОВЛЕНА (НЕДОСТАТОЧНО СРЕДСТВ)') now
  constrained with max-w-[55%] to prevent overlapping tariff name
- Password too short error shown inline under password field during
  registration instead of at the top of the page (invisible on mobile)
2026-04-13 14:43:29 +03:00
c0mrade
f787cc2de8 fix: add back button to AdminBanSystem page 2026-04-13 14:43:18 +03:00
c0mrade
7b0e6d8bc8 fix: add Object.hasOwn polyfill for old iOS/Android WebViews
@telegram-apps/sdk v3 depends on valibot which uses Object.hasOwn.
On Safari < 15.4 and old Android WebViews this method is missing,
causing LaunchParamsRetrieveError and broken initData auth.

Ref: https://github.com/Telegram-Mini-Apps/tma.js/issues/683
2026-04-13 14:42:26 +03:00
c0mrade
362a69812f feat: add broadcast category selector (system/news/promo) in admin UI 2026-04-10 17:04:22 +03:00
c0mrade
9d15002429 Merge pull request #387 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.44.2
2026-04-08 18:47:15 +03:00
github-actions[bot]
72608fbb81 chore(main): release 1.44.2 2026-04-08 15:43:29 +00:00
c0mrade
608a75220f Merge pull request #386 from BEDOLAGA-DEV/dev
fix: batch frontend fixes matching backend changes
2026-04-08 18:41:43 +03:00
c0mrade
e6f6713b0e fix: batch bug fixes matching backend changes
- Promo code errors: add inactive/not_yet_valid translations (4 locales) + Balance.tsx parser
- Daily 100% discount: render price block when originalDailyPrice > 0
- Webvisor: enable in Yandex Metrika init config
- Referral attribution: consume campaign/referral slugs only after successful auth (all login methods)
- registerWithEmail: consume referral code after success
- AdminSettings: move TARIFF_MODE_SETTINGS to module scope (fix eslint warning)
2026-04-08 18:33:47 +03:00
c0mrade
f75d781431 Merge pull request #381 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.44.1
2026-04-03 19:14:02 +03:00
github-actions[bot]
692c7417bb chore(main): release 1.44.1 2026-04-03 16:12:12 +00:00
c0mrade
300cb07c58 Merge pull request #380 from BEDOLAGA-DEV/dev
fix: 100% discount display + Telegram widget fix + sparkles icon
2026-04-03 19:11:43 +03:00
c0mrade
1cf9526713 fix: complete sparkles icon in trial offer card (was showing only 1 of 3 sparkle paths) 2026-04-03 18:36:11 +03:00
c0mrade
207af81c95 fix: support 100% discount display + fix Telegram link widget race condition
- formatPrice shows "Бесплатно/Free" when price is 0 (SubscriptionPurchase, Subscription, RenewSubscription)
- Add subscription.free locale key (ru/en/zh/fa)
- Fix TelegramLinkWidget NS_BINDING_ABORTED: move legacy widget callback to ref pattern, remove unstable deps (showToast, t, navigate) from useEffect — prevents iframe destruction on re-render
- Clean up OIDC effect deps
2026-04-03 17:23:38 +03:00
Egor
f06543988d Merge pull request #375 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.44.0
2026-04-02 07:25:02 +03:00
github-actions[bot]
e5f84eaefa chore(main): release 1.44.0 2026-04-02 04:24:32 +00:00
Egor
fdb4f8237a Merge pull request #374 from BEDOLAGA-DEV/dev
Dev
2026-04-02 07:23:59 +03:00
Fringg
7892630e3b fix: add key prop to AnimatePresence, accessibility labels, remove hardcoded fallback
- Added key="email-link-form" on motion.div inside AnimatePresence
  for proper exit animations
- Added htmlFor/id pairs on all three label+input groups for
  screen reader accessibility
- Replaced hardcoded "your@email.com" placeholder with neutral format
- Removed hardcoded English fallback from t('profile.invalidEmail')
2026-04-02 07:16:00 +03:00
Fringg
6fd0668a24 feat: move email linking form into Connected Accounts page
Users couldn't find the email linking form buried in the Profile page.
Now the Email row in Connected Accounts shows a "Привязать" button
(consistent with Google/Yandex/Discord) that expands an inline form
with email, password, and confirm password fields.

- Added email to isLinkableProvider check
- Inline AnimatePresence form expands under Email card (no popups)
- Removed duplicate registration form from Profile page
- Profile page now shows a redirect button to Connected Accounts
  for users without email (email change/verify stays in Profile)
2026-04-02 07:06:38 +03:00
Fringg
e2f81ad28d fix: subscription tab not highlighted on detail pages
isActive used exact pathname match (===), so navigating to
/subscriptions/:id or /subscriptions/:id/renew would not highlight
the Subscription tab. Changed to startsWith for non-root paths
in both MobileBottomNav and DesktopSidebar.
2026-04-02 05:44:06 +03:00
c0mrade
5d3f2bb60b Merge pull request #371 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.43.1
2026-03-31 20:23:41 +03:00
github-actions[bot]
5ff856df95 chore(main): release 1.43.1 2026-03-31 17:22:53 +00:00
c0mrade
c1b95e2635 Merge pull request #370 from BEDOLAGA-DEV/dev
Release: dev → main
2026-03-31 20:22:24 +03:00
c0mrade
fe609a505b fix: admin users search not working on pages beyond first
Separated input state (searchInput/emailSearchInput) from committed
search state (search/emailSearch) to prevent every keystroke from
triggering API calls with stale pagination offset.
2026-03-31 18:19:39 +03:00
c0mrade
3472ff994c Merge remote-tracking branch 'origin/main' into dev 2026-03-31 15:13:44 +03:00
c0mrade
826a82aa1c fix: unblock page rendering when Telegram CDN is unavailable
- Google Fonts: non-render-blocking via media="print" onload trick
- telegram-web-app.js: load only inside Telegram environment
- Telegram SDK init: skip entirely outside Telegram
- Script load timeout: 8000ms → 2000ms for faster deep link fallback
- Email login form: expanded by default (80% of registrations)
2026-03-31 14:10:22 +03:00
Egor
61a08feb75 Merge pull request #368 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.43.0
2026-03-29 07:59:17 +03:00
github-actions[bot]
5cc37730b8 chore(main): release 1.43.0 2026-03-29 04:58:43 +00:00
Egor
f5b6e9a855 Merge pull request #367 from BEDOLAGA-DEV/dev
Dev
2026-03-29 07:57:47 +03:00
Fringg
60f11e97a2 feat: show MULTI_TARIFF_ENABLED setting only in tariffs sales mode
Hide MULTI_TARIFF_ENABLED and MAX_ACTIVE_SUBSCRIPTIONS from admin
settings when SALES_MODE is not 'tariffs'. Add Russian translations.
2026-03-29 07:04:34 +03:00
Fringg
859bd24d8e fix: gift code activation URL encoding and prefix handling
- Encode underscores as %5F in share URLs (bot link + cabinet link)
  to prevent Telegram auto-link detection from stripping trailing _
- Strip GIFT-/GIFT_ prefix from URL code param before pre-filling input
- Use ?? instead of || for prefix stripping to preserve empty strings
2026-03-29 06:47:50 +03:00
Fringg
2b03e7e514 feat: send language in payment requests for localized descriptions
- Add language field to balance topup and landing purchase requests
- Cap news article featured image height with max-h-96

Cherry-picked from PR #362 (without favicon change — files don't exist)
2026-03-29 05:18:40 +03:00
Fringg
07500ed215 feat: dynamic language list from API instead of hardcoded array
Hide language switcher when only 1 language is available.

Cherry-picked from PR #365
2026-03-29 05:15:31 +03:00
Fringg
0d4ddb26d9 fix: handle merge flow from email register endpoint
- Update registerEmail return type to include merge_required/merge_token
- Redirect to /merge/{token} when email register returns merge_required
2026-03-29 04:50:09 +03:00
Fringg
48fe9235ff fix: filter existing referrals from search and clear stale results
- Add-referral search: exclude users already in referrals list
- Both search debounces: clear stale results immediately when query
  changes to prevent previous results flashing during debounce
2026-03-29 04:07:31 +03:00
Fringg
222a1239ef feat: add "Add Referral" button to referrals tab
- New search UI in referrals list section to find and bind users
  as this user's referrals (calls assign-referrer on target user)
- Debounced search with cancelled flag and loading state
- Click-outside to close dropdown
- i18n: addReferral, referralAdded keys in all 4 locales
2026-03-29 04:02:40 +03:00
Fringg
63f7fa0a31 fix: four bugs in referrals tab from review
- Commission display: use conditional instead of nullish coalescing
  to avoid rendering "default%" (now shows "default" without %)
- loadReferrals: add || [] guard on data.users to prevent crash
- Search debounce: add cancelled flag to prevent stale responses
  overwriting fresher results
- Search dropdown: add loading state to prevent "No users found"
  flash during debounce wait
2026-03-29 03:49:49 +03:00
Fringg
e32663f291 feat: add Referrals tab to admin user detail page
- New Рефералы tab with three sections:
  - Referred By: shows who referred this user, assign/remove referrer
  - Stats grid: total referrals, earnings, commission, referral code
  - Referrals list: all referred users with navigate and remove buttons
- User search with debounce for assigning referrer
- Shows warning when selected user already has a referrer
- API methods: assignReferrer, removeReferrer, removeReferral
- i18n translations for all 4 locales (en, ru, zh, fa)
2026-03-29 03:43:47 +03:00
Fringg
3e6c0212a6 fix: desktop vertical alignment regression and touch target sizing
- SettingsTableRow: use max-lg:self-end instead of self-end to prevent
  bottom-aligning controls on desktop (self-end overrides items-center)
- QuickToggles: add min-h-[44px] matching Toggle component pattern
2026-03-29 03:22:45 +03:00
Fringg
e004d8103b fix: mobile layout and touch target improvements for admin settings
- SettingsTableRow: stack name above controls on mobile, show action
  buttons without hover (max-lg:opacity-100)
- SettingsMobileTabs: increase touch targets to 44px, add scroll spacers
- QuickToggles: increase chip touch targets
- SettingInput: increase display button touch target
- AdminSettings: add bottom padding buffer to mobile layout
2026-03-29 03:18:21 +03:00
Fringg
67055d58f7 fix: whitespace search guard and unknown section fallback
- SettingsTab: use searchQuery.trim() instead of searchQuery to prevent
  whitespace-only input from triggering empty search results view
- AdminSettings: fallback to branding when activeSection is unknown
  instead of rendering blank content area
2026-03-29 03:08:02 +03:00
Fringg
28ef6c97f5 fix: three bugs found in second review round
- SettingsSearchMobile: change sm:hidden to lg:hidden to match mobile
  layout breakpoint (search was invisible on 640-1023px tablets)
- SettingsTableRow: sync isLongValue suffixes with SettingInput
  (_list, _json, _periods, _discounts were missing)
- SettingsTableRow: read-only bools now show enabled/disabled labels
  instead of raw "true"/"false" strings
2026-03-29 03:03:26 +03:00
Fringg
ea1c7359ce fix: stabilize useMemo deps and add category search to sidebar
- Use activeSection instead of activeTreeInfo as useMemo dependency
  (activeTreeInfo is derived from activeSection, new object each render)
- Add category label matching to sidebar autocomplete search filter
  to match global search behavior
2026-03-29 02:56:54 +03:00
Fringg
21813ef82e feat: redesign admin settings with tree navigation and compact layout
- Replace flat sidebar with collapsible tree groups (7 groups, 52 sub-items)
- Map all 61 backend category keys to sidebar navigation
- Add QuickToggles panel for boolean settings
- Replace card-style SettingRow with compact SettingsTableRow
- Add breadcrumb navigation for tree sub-items
- Add source badges (modified/DB/ENV) on settings
- Implement two-level mobile navigation with group chips
- Add i18n translations for all new keys (en, ru, zh, fa)
2026-03-29 02:38:52 +03:00
Fringg
88c93e2b5f feat: show country emoji and provider name in traffic tab 2026-03-28 23:55:50 +03:00
Fringg
06f6cbeb8e fix: handle undefined inbounds/outbounds in traffic tab
API may return nodes without inbounds/outbounds arrays. Made fields
optional in NodeRealtimeStats and added null safety guards in TrafficTab.
2026-03-28 23:33:06 +03:00
Fringg
5d7b94fc48 fix: add i18n keys for Traffic tab, prevent sort mutation
- Add traffic tab/section locale keys to ru, en, zh, fa
- Use spread copy before .sort() to avoid mutating React Query cache
2026-03-28 22:52:30 +03:00