Commit Graph

637 Commits

Author SHA1 Message Date
c0mrade
65a671470d feat: use app-level svgIconKey for app logos and improve tile contrast
- Add svgIconKey field to RemnawaveAppClient and RemnawaveApp types
- Render app logos from svgLibrary via app.svgIconKey on connection page
  chips with fallback to getAppIcon() by name
- Use app.svgIconKey for app icons on admin apps settings page
- Show featured indicator as amber dot matching original RemnaWave UI
- Increase inner tile background opacity from 30% to 50% on subscription
  page for better text readability
2026-02-05 11:27:03 +03:00
c0mrade
a50dea9a3d feat: connect RemnaWave baseTranslations and fix SVG icons
- Wire baseTranslations from RemnaWave config to connection page UI
  (copyLink, openApp, installApp, addSubscription, connectAndUse,
  tutorial, close) with locale fallback: current lang → en → ru → first
- Add tutorial button when baseSettings.isShowTutorialButton is enabled
- Fix SVG icon rendering on admin apps settings page with proper scaling
- Add colored circle backgrounds for block and app icons in admin panel
- Add tutorial translation key to all locale files
2026-02-05 09:44:42 +03:00
c0mrade
79afe3a733 feat: render original RemnaWave blocks on connection page
- Add RemnaWave types (RemnawaveAppClient, RemnawaveBlockClient, etc.)
- Dual rendering: RemnaWave blocks with SVG icons or legacy steps
- Platform dropdown, DOMPurify for SVG sanitization
- Button types: subscriptionLink, copyButton, external
2026-02-05 08:29:54 +03:00
c0mrade
445dd0601a feat: convert ConnectionModal to /connection page with crypto deep links
- Add @kastov/cryptohapp + jsencrypt for encrypted Happ deep links
- Add templateEngine utility to resolve {{SUBSCRIPTION_LINK}},
  {{HAPP_CRYPT3_LINK}}, {{HAPP_CRYPT4_LINK}}, {{USERNAME}} templates
- Convert ConnectionModal component into a standalone Connection page
- Add /connection route with ProtectedRoute and lazy loading
- Replace modal invocation in Dashboard and Subscription with
  navigate('/connection')
- Add type and svgIconKey optional fields to RemnawaveButton
- Show button type badge and SVG icon in AdminApps BlockCard
- Refactor ThemeTab to use local draft state with Save/Cancel flow
2026-02-05 07:33:45 +03:00
Fringg
998f9dbaf0 feat(subscription): auto-skip server selection step when only one available
- Add getAvailableServers helper to filter available servers
- Skip servers step in purchase wizard when only 1 server available
- Auto-select the single server on options load and period change
- Works for both new purchases and renewals in classic mode
2026-02-05 07:32:28 +03:00
Fringg
46b93ef098 fix(subscription): display promo group discounts in device/traffic purchase and tariff switch
- Add discount fields to TrafficPackage and TariffSwitchPreview types
- Show strikethrough original price and discount badge for device purchase
- Show discount badge and original price for traffic packages
- Show discount info and free label for tariff switch with 100% discount
2026-02-05 06:26:27 +03:00
c0mrade
8068f84724 fix: inline Stars confirmation and unified payment type display
- Replace confirm dialog with inline UI panel to avoid browser popup
  blockers — pay button click is a direct user gesture
- Pre-open browser window synchronously on pay click for fallback
- Unify payment type display: show same styled panel whether one or
  both methods are enabled (single method = full-width button)
- Remove getCostSubtitle text, add payStars translation key (ru, en,
  zh, fa)
2026-02-04 16:53:58 +03:00
c0mrade
e6f8ae6ab0 feat: add Stars payment confirmation and admin validation
- Show confirmation dialog before redirecting to Telegram for Stars
  payment (native popup in Mini App, confirm in browser)
- Warn admin when saving wheel config with Stars enabled but
  Telegram Stars payment method is disabled globally
- Add translation keys: confirmStarsTitle, confirmStarsPayment,
  starsNotEnabledGlobally (ru, en, zh, fa)
2026-02-04 16:41:25 +03:00
c0mrade
02640d1c38 fix: unify wheel Stars payment across desktop and mobile
- Use Telegram Stars invoice on all platforms instead of balance
  payment on desktop
- Show star cost in toggle and subtitle everywhere
- Show popup/toast when Stars are not enabled and user tries to spin
- Remove platform-specific payment type auto-select logic
- Add starsNotAvailable translation key (ru, en, zh, fa)
2026-02-04 16:26:07 +03:00
c0mrade
4499c9ad57 fix: prevent payment type reset after wheel spin
The auto-select useEffect for payment type (days/stars) was running
on every config refetch, resetting the user's manual selection back
to stars. Now it only runs once on initial load using a ref flag.
2026-02-04 16:09:10 +03:00
c0mrade
3a042473f0 refactor: unify ColorPicker — remove native input, fix scroll closing
- Remove native <input type="color">, eyedropper button, colorInputRef,
  isTelegram check and isInTelegramWebApp import from ColorPicker
- Remove scroll event listener so picker only closes on click/tap outside
- Replace native color input in AdminWheel InlinePrizeForm with ColorPicker
2026-02-04 15:40:30 +03:00
c0mrade
576893f5c6 feat: replace payment modals with page-based navigation
- Add /balance/top-up route for payment method selection
- Add /balance/top-up/:methodId route for amount entry and payment
- Remove TopUpModal component (619 lines)
- Simplify InsufficientBalancePrompt to use navigate instead of modals
- Support ?amount and ?returnTo query params for cross-page data flow
- Fix nav isActive to highlight Balance on sub-routes
- Remove unused MainButton platform abstraction
- Increase toast accent opacity for better visibility
2026-02-04 14:36:16 +03:00
c0mrade
023c3ef6b3 refactor: migrate to @telegram-apps/sdk-react v3, remove all window.Telegram.WebApp usage
Полный переход с нативного window.Telegram.WebApp API на @telegram-apps/sdk-react v3.
Bridge SDK оборачивал receiveEvent, из-за чего popup_closed не доходил до нативного
обработчика — это было основной причиной бага с двойным открытием попапа.

Изменения:

- Удалён @telegram-apps/react-router-integration (привязан к SDK v1)
- Инициализация SDK v3 в main.tsx: init(), restoreInitData(), mount всех компонентов
- AppWithNavigator: убран TelegramRouter (initNavigator + useIntegration), все платформы
  на BrowserRouter, добавлен TelegramBackButton через SDK v3
- useTelegramSDK: детекция через retrieveLaunchParams(), реактивные значения через
  useSignal() (fullscreen, viewport, safe area insets), initData через retrieveRawInitData()
- TelegramAdapter: полная перезапись — попапы через showPopup() (Promise-based, без
  ручного onEvent/offEvent/timeout), кнопки через setMainButtonParams/showBackButton,
  haptic через hapticFeedbackImpactOccurred, тема через themeParamsState с конвертацией
  camelCase→snake_case, cloud storage через getCloudStorageItem/setCloudStorageItem
- api/client.ts: initData через retrieveRawInitData() вместо window.Telegram.WebApp.initData
- AppHeader: фото пользователя через initDataUser() сигнал
- ConnectionModal: openLink через SDK вместо window.Telegram.WebApp.openLink
- ColorPicker: детекция Telegram через isInTelegramWebApp()
- Удалён интерфейс TelegramWebApp (368 строк) и Window augmentation из vite-env.d.ts
- Убрано поле telegram из PlatformContext в types.ts
- Обновлён manualChunks в vite.config.ts
2026-02-04 11:06:59 +03:00
c0mrade
482bdd0b0d Remove replace flag from back button navigation to fix double-click issue
Fixed issue where users had to click the Telegram Mini App back button twice
in many admin pages. The replace flag was causing conflicts between Telegram's
BackButton internal history and React Router's history management.

Updated all 32 admin pages to use simple navigate() calls without replace flag.
2026-02-04 06:11:29 +03:00
c0mrade
55e2068606 Fix back button cycling in Telegram Mini App
Add replace: true to all navigate() calls in useBackButton hooks
Prevents history cycles when navigating back and forth
All 32 admin pages now use navigate(path, { replace: true })
Back button now goes directly to parent without cycling
2026-02-04 05:59:15 +03:00
c0mrade
e948cdc8d2 Complete back button logic for all admin pages in Telegram Mini App
Main sections navigate to /admin (15 pages)
Detail/edit pages navigate to parent lists (16 pages)
All pages use useBackButton hook with proper navigation paths
Native Telegram back button in Mini App, UI button on web
Email template pages keep UI-only back buttons as required
2026-02-04 05:03:06 +03:00
c0mrade
98d90a99c6 Use native Telegram back button in AdminPaymentMethods
Replace desktop-style back button with native Telegram BackButton API:
- Use useBackButton hook for Telegram Mini App
- Show UI back button only on web (when !capabilities.hasBackButton)
- Improves native feel in Telegram environment
2026-02-04 04:26:15 +03:00
c0mrade
b2a6b959c1 Restore drag-and-drop and add promo deactivation with Telegram popup
Payment methods drag-and-drop fixes:
- Restore original working drag-and-drop from commit 84c6d26
- Use position: relative instead of opacity for dragged items
- Remove closestCenter collision detection
- Use PointerSensor with distance: 5 without TouchSensor
- Restore touch-none and responsive padding on drag handles
- Restore original shadow and background colors

Promo deactivation feature:
- Add deactivation button to active discount banner in PromoOffersSection
- Use Telegram native popup (showPopup) in Mini App environment
- Fallback to modal for web browsers
- Add confirmation modal with warning about permanent action
- Integrate with useTelegramSDK for proper platform detection
2026-02-04 04:08:35 +03:00
c0mrade
9042603e67 Move payment method editing to separate page and fix auth error handling
- Replace modal with dedicated AdminPaymentMethodEdit page
- Add route /admin/payment-methods/:methodId/edit
- Fix 401 error handling for auth endpoints to show error messages instead of reloading page
- Update client.ts to use window.Telegram.WebApp.initData directly
- Maintain useTelegramDnd for drag and drop functionality
2026-02-04 03:39:38 +03:00
c0mrade
c8c9920ade Merge remote-tracking branch 'origin/main' into feat/linear-ui-redesign
# Conflicts:
#	src/components/PromoDiscountBadge.tsx
2026-02-04 03:25:35 +03:00
Egor
6c8d2ad69e Update Subscription.tsx 2026-02-04 01:17:05 +03:00
Egor
026cb47694 Update Subscription.tsx 2026-02-04 01:08:05 +03:00
Egor
9804e3a874 Update Subscription.tsx 2026-02-04 01:00:49 +03:00
Egor
158a47e1e1 Update Subscription.tsx 2026-02-04 00:50:50 +03:00
c0mrade
84c6d265cf Fix drag-and-drop multiple reorders and wheel lights pattern
- Allow multiple prize reorders before saving by using current displayed order
- Simplify lights pattern calculation using distance-based logic
- Fixes: drag only worked once, lights appeared to go through wheel
2026-02-04 00:22:46 +03:00
c0mrade
f6feb592d2 Add deferred save for prize reordering in admin
- Remove auto-save on drag-and-drop (prevents UI jumps)
- Store prize order changes locally
- Show warning banner with unsaved changes
- Add Save and Cancel buttons
- Only trigger API call when user clicks Save
- Add translations for unsaved order messages
2026-02-03 23:42:59 +03:00
c0mrade
4fa9d7f47c Improve wheel: fix lights animation and add prize legend
- Fix lights animation to run continuously (even when idle)
- Lights now move sequentially around the circle
- Remove text labels from wheel, keep only emoji
- Add WheelLegend component with color indicators
- Display legend on right (desktop) and bottom (mobile)
- Add 'prizes' translation key for all languages
2026-02-03 23:42:52 +03:00
c0mrade
d826277247 Improve mobile layout for admin users list
- Stack name and username vertically on mobile
- Move Telegram ID to separate line
- Make status badges wrap when needed
- Reduce font sizes and spacing on small screens
- Hide purchase count on mobile
- Hide chevron icon on mobile, keep only action menu
2026-02-03 23:15:24 +03:00
c0mrade
ef6863081e Redesign wheel UI with linear design system
- Improve wheel rotation animation with accumulated rotation tracking
- Enhance LED lights with running animation effect
- Replace sidebar history with collapsible section
- Unify spin button for all payment methods
- Update admin prize card styles with new borders and backgrounds
- Add improved drag-and-drop collision detection
- Prefer Telegram Stars payment in Mini App by default
2026-02-03 22:27:57 +03:00
c0mrade
f147c10a25 Merge remote-tracking branch 'origin/main' into feat/linear-ui-redesign
# Conflicts:
#	src/pages/AdminUsers.tsx
2026-02-03 21:48:38 +03:00
Egor
bab722385d Update AdminUsers.tsx 2026-02-03 04:41:34 +03:00
Egor
42bb563ab6 Update AdminUsers.tsx 2026-02-03 04:39:42 +03:00
Egor
192ac71a02 Update Subscription.tsx 2026-02-03 03:49:06 +03:00
c0mrade
494285bcbf feat: redesign fortune wheel with improved UX
Wheel.tsx (user page):
- Always show history sidebar on desktop
- Show placeholder when no history
- Remove history toggle button

AdminWheel.tsx:
- Replace auto-save with form + Save button
- Fix toggle switch styling
- Replace HTML5 drag-drop with @dnd-kit for mobile/Telegram
- Improve mobile responsiveness (tabs, cards, buttons)
- Add live wheel preview on desktop
- Group settings into sections

FortuneWheel.tsx:
- Slow down LED animation (250ms -> 600ms)

Navigation:
- Add wheel to mobile bottom nav (replaces Support when enabled)
2026-02-02 18:21:50 +03:00
c0mrade
7e2802c5b5 feat: redesign fortune wheel UI and add to mobile nav
- Add wheel button to mobile bottom nav (replaces Support when enabled)
- Slow down LED lights animation (250ms -> 600ms)
- Replace result modal with inline card in Wheel.tsx
- Add haptic feedback on spin result
- AdminWheel.tsx: inline prize editing instead of modal
- AdminWheel.tsx: drag-and-drop for prize reordering
- AdminWheel.tsx: live wheel preview on desktop
- AdminWheel.tsx: group settings into sections
- Replace confirm() with native dialog
- Add translations for all languages
2026-02-02 17:51:46 +03:00
c0mrade
e9af285dad fix: improve mobile layout for bandwidth and add pluralization support 2026-02-02 11:14:29 +03:00
c0mrade
ed86dfa8bd fix: add full i18n support for RemnaWave section and improve sync UI 2026-02-02 11:04:25 +03:00
c0mrade
6c795539f2 refactor: simplify RemnaWave sync tab - keep only panel sync 2026-02-02 10:51:42 +03:00
c0mrade
4034b4db39 fix: use RemnaWave icon in admin panel menu 2026-02-02 10:45:29 +03:00
c0mrade
1f7bd4f5f3 refactor: move squad viewing to separate page and add RemnaWave icon
- Create AdminRemnawaveSquadDetail page for viewing squad details
- Remove squad detail modal from AdminRemnawave
- Add RemnawaveIcon from official RemnaWave branding
- Add GlobeIcon, PlayIcon, StopIcon, ArrowPathIcon to centralized icons
- Update RefreshIcon to support spinning prop
- Add route /admin/remnawave/squads/:uuid
2026-02-02 10:38:48 +03:00
c0mrade
1873d6d9dc refactor: move campaign editing from modal to separate page
- Create AdminCampaignEdit page for editing campaigns
- Remove CampaignModal from AdminCampaigns
- Use centralized icons (CampaignIcon, ChartIcon added)
- Add route /admin/campaigns/:id/edit
- Add localization keys for loadError and updateError
2026-02-02 10:18:57 +03:00
c0mrade
803609c1fb refactor: consolidate icons and move server edit to separate page
- Create centralized icons file at src/components/icons/index.tsx
- Update admin and AppShell icons to re-export from centralized location
- Replace trial "T" button with GiftIcon in AdminServers
- Move server editing from modal to dedicated page /admin/servers/:id/edit
- Add localization keys for server edit page (mainSettings, pricingAndLimits, updateError)
2026-02-02 10:03:47 +03:00
c0mrade
e5096d571f feat: add autocomplete to settings search
- Show dropdown with top 8 matching settings while typing
- Search by key, name, translated name, description and category
- Display setting name and category in suggestions
- Keyboard navigation (arrows, Enter, Escape)
- On select: switch to correct section and filter by setting key
- Works on both desktop and mobile
2026-02-02 09:17:51 +03:00
c0mrade
ead4606bb5 feat: move ticket settings to dedicated page 2026-02-02 08:47:35 +03:00
c0mrade
1027deb134 feat: move campaign statistics to dedicated page 2026-02-02 08:34:35 +03:00
c0mrade
643d4fd3af fix: improve header layout for mobile - stack button below title
- AdminPromocodes, AdminCampaigns, AdminPromoGroups, AdminTariffs, AdminServers
- Use flex-col on mobile, flex-row on desktop (sm:)
- Button now appears below header on small screens
- Prevents text wrapping in buttons
2026-02-02 08:17:03 +03:00
c0mrade
68c9cee52f style: make buttons more compact across admin pages
- Reduce base .btn padding from px-5 py-2.5 to px-4 py-2
- Change rounded-xl to rounded-lg for buttons
- Remove hover:scale effect for cleaner look
- Fix large buttons in AdminBanSystem, AdminBroadcastDetail
- Compact toggle buttons in AdminPromoOfferSend
2026-02-02 07:56:53 +03:00
c0mrade
0c9d09280c feat: add locales for user search in promo offer sending
- Add searchUserPlaceholder, noUsersFound, hasSubscription keys
- Support all 4 languages: en, ru, zh, fa
- Remove fallback strings from component
2026-02-02 07:40:05 +03:00
c0mrade
fc922671d2 feat: add user search autocomplete for promo offer sending
- Replace plain input with search autocomplete
- Search by name, username, or Telegram ID
- Show user info with subscription status
- Filter to show only users with Telegram ID
2026-02-02 07:30:25 +03:00
c0mrade
c815ac29ea fix: scroll to start of tariffs section and wait for data to load 2026-02-02 07:02:50 +03:00