Commit Graph

76 Commits

Author SHA1 Message Date
payacom
e7ce4d6808 chore: bump version to 4.1.5
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:31:58 +03:30
payacom
0602bde788 feat(reels): user info/caption also hide on collapse; auto-scroll + speed; save-block deterrent
- Username/caption block, and the long-video progress bar, only checked
  chromeHidden (the long-press hide-everything state) — not
  actionsExpanded (the 3-dot-adjacent collapse toggle), so collapsing icons
  never hid them. Now both also respect actionsExpanded.
- Wired playbackSpeed (via a playbackRate effect on the <video> ref, since
  it isn't a JSX prop) and autoScrollEnabled (loop={!autoScrollEnabled} +
  onEnded calling the new onRequestNext prop, which both reels feeds
  (ExploreReelsView, PostFeedView) implement by scrollTo-ing to the next
  item).
- Added onContextMenu prevention (+ draggable=false on the poster image)
  when author_allow_save is false — this is a best-effort deterrent against
  casual right-click/drag saving only. No browser exposes an API to block
  actual OS-level screenshots; that isn't something any website can do.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:13:26 +03:30
payacom
1d1d3cd461 feat(reels): collapsing icons hides the 3-dot menu too; add auto-scroll + playback speed
- 3-dot menu button previously rendered unconditionally alongside the
  collapse-toggle ("مثل اندروید" per the old comment, mirroring RN's
  pre-fix behavior) — now hidden when collapsed, matching RN's fix.
- Extended ExploreReelsUiContext with autoScrollEnabled (default off) and
  playbackSpeed (0.5x/1x/1.5x/2x), exposed via new rows in the options menu.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:03:16 +03:30
payacom
83c2102afe fix(nav): settings tab now correctly returns to /settings from any sub-page
SettingsShell always passed the literal string "/settings" as currentPage
to TabNavigation, regardless of the actual sub-route. TabNavigation's
isExactRoot check (currentPage === tab.href) was therefore always true for
the settings tab, so tapping it while on any settings sub-page (e.g.
/settings/wallet) always hit the "already here" branch and called
preventDefault() instead of navigating — the user had to tap a different
tab first (which uses a different pathname) before tapping Settings again
would actually work. Now passes the real pathname; tab highlighting is
unaffected since TabNavigation already does its own startsWith() check for
that.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:22:56 +03:30
payacom
0c080d22cd feat(shop): show pinterest badge top-right on tagged product cards
Aligned with the discount badge (same top offset, opposite corner), shown
only when listing.is_pinterest is true. Verified live: initially used
BoldIcon's nonexistent color prop (silently ignored, icon rendered black
via the default dark-mode invert filter) — switched to tinted + a
text-[#E60023] class, confirmed the mask picks up the color correctly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:19:45 +03:30
payacom
9342494a36 feat(ui): add online-booking shortcut and fix icon alignment in billboards list
- Each icon (add/search/filter) had no consistent-height box, so vertical
  alignment depended on each tag's (Link vs button) own default box model.
  Now all 4 icons share an identical h-9 w-9 flex box.
- Added a 4th icon linking to /settings/booking, next to the filter icon,
  mirroring the RN fix for this same screen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:19:29 +03:30
payacom
c22df8231e fix(ui): academy card rate/score align with category/level, course title visible
Rate/score row lacked justify-between (title and stats just clustered
together with a small gap), so it wasn't flush with category/level's shared
edge like the RN card already is. Also added text-foreground to the course
title h2 — it had no color class and was invisible against the dark theme.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:19:11 +03:30
payacom
9e0760d9c5 fix(ui): workroom status buttons use RoundedButton's standard primary style
Each status button had its own hardcoded pastel inline style on selection.
Replaced with variant="primary"/"default" on RoundedButton, matching every
other selection button in the app (mirrors the RN fix for this same screen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:18:58 +03:30
payacom
c1189164b8 fix(ui): show course level ("normal"/"pro") next to price in academy card
The type field was destructured but never rendered (only used for the
pro-tier shadow styling) — RN's equivalent card already needed this shown
next to price, aligned with category via the existing justify-between row.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 18:18:35 +03:30
payacom
efad306617 fix(ui): PageTitle stays screen-centered regardless of action button width
Right column was minmax(2.5rem,auto), growing with wider action content
(e.g. a text button) and dragging the title's visual center off true
screen center. Both side columns are now a fixed 2.5rem, matching
EditPageHeader.tsx's already-correct pattern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 18:18:23 +03:30
payacom
1efb435dad fix(ui): edit/verify sizes & colors selection buttons use rounded-2xl
These raw <button> selection chips used rounded-full (always a full pill)
instead of the app's standard rounded-2xl radius used by every other
button/chip (btnPrimary/btnDefault/filterChipClass). Gender and
cooperation-type pages already used AuthNextButton (already rounded-2xl),
so only sizes/colors needed the radius change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 18:01:01 +03:30
payacom
43896b4caf fix(ui): .btn-modern--selected uses tint style, not solid fill
Root-level fix: this un-layered CSS class backs toggleBtnClass,
filterChipClass, selectionCardClass, and ~13 direct call sites (send-post/
shop/product modals, edit & verify sizes/colors/gender/cooperation-type).
Changing it here propagates the apply-filter button's tint+border+colored-
text look everywhere at once, including overriding the redundant
"text-white" utility class some call sites still pass (verified live: since
this class isn't inside a Tailwind @layer, its color always wins the cascade).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 18:00:50 +03:30
payacom
f18e19aff7 fix(ui): shop buyer/seller toggle and tabs use btnPrimary/btnDefault directly
Replaces toggleBtnClass/filterChipClass (solid btn-modern--selected fill +
white text) with the exact same classes as the apply-filter button
(tint background, colored border/text) so the selected state matches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:24:58 +03:30
payacom
3e3351a9c3 fix(ui): shop buyer/seller toggle and tabs use h-10 to match apply-filter ratio
rounded-2xl at h-9 is still close to the pill ceiling; the apply/clear
filter buttons use h-10, so bumping this screen's toggle+tabs to h-10 gives
the same roundness ratio without touching the other 12 call sites of
toggleBtnClass/filterChipClass that weren't flagged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:16:24 +03:30
payacom
e484b85bf5 fix(ui): shared filter-chip/toggle radius matches CTA button (rounded-2xl)
btnFilterChip/btnFilterChipActive/toggleBtnClass rendered rounded-3xl (full
pill) at h-9, while primary/default buttons (apply/clear filter, etc.) use
rounded-2xl. Aligning the shared radius fixes this across every screen that
uses filterChipClass/toggleBtnClass (shop settings buyer/seller toggle and
order sub-tabs, expertise filters, project role modal, etc.) in one place.

Reverted the earlier per-button className override in FilterModal.tsx since
the shared class now already outputs rounded-2xl.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:07:49 +03:30
payacom
1b8eadbf19 fix(ui): expertise filter chips match apply/clear button roundness
filterChipClass renders rounded-3xl (full pill) while the apply/clear
RoundedButtons below it render rounded-2xl, a visible mismatch in the same
modal. Scoped override via className (twMerge) instead of touching the
shared filterChipClass/btnFilterChip used by 24+ other call sites.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 16:56:58 +03:30
payacom
e31a08df41 Fix financial page mobile layout, restore shop-discover category chips, unify chip height
- financial/page.tsx: the title+date and amount+status rows used a hard
  flex-col/flex-row breakpoint switch (sm:), so below 640px every row
  stacked into 4 separate lines instead of wrapping gracefully — now
  always flex-row with flex-wrap, min-w-0/shrink-0/truncate so long
  content wraps instead of the date/badge visually colliding
- shops/discover/page.tsx: restored the real category chips (fetched from
  /shop-categories) alongside All/Pinterest — my earlier pass replaced
  the whole filter row with just those two, dropping the categories the
  page never actually had a chance to keep
- buttonStyles.ts: btnFilterChip/btnFilterChipActive now have an explicit
  h-9 (matching toggleBtnClass, used right above them on the shop
  dashboard) instead of deriving height from padding alone, which made
  them visibly shorter than the buyer/seller toggle

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 16:31:08 +03:30
payacom
71da2b53fe Add coin-flies-to-wallet animation to the gift reveal modal
Web mirror of the RN change — same timing constants, same idea: the amount
flies from its pop-in position toward a wallet badge that pulses on
arrival, and the "credited" hint fades in at that moment instead of
showing immediately. Wallet crediting itself was already correctly
deferred server-side until POST /gifts/:id/open.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:22:51 +03:30
payacom
e652c255c9 Fix Projects nav double-click, shop verify badge, add send-to-users everywhere
- new-project/layout.tsx was hardcoding currentPage="/projects" while the
  real route is /new-project, so TabNavigation's isExactRoot guard thought
  it was already on the Projects tab and preventDefault'd the first click
  with no navigation — now passes the real path (isActive's highlight logic
  already had a dedicated case for /new-project, so nothing else changes)
- resolveShopVerificationTier: shop verify checkmarks always render green
  regardless of the underlying tier, applied at all 3 shop render sites
- Add a "send to users" icon/button next to share on the product detail
  page, the owner product-manage page, and the shop profile pages (public +
  owner), reusing/mirroring the existing SendProductModal pattern
- New SendShopModal + sharedShop chat-bubble kind (ChatMessageCard via
  SharedShopBubble) so a whole shop can be sent into a chat, not just one
  product — backed by the new POST /shops/:id/send endpoint

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:06:57 +03:30
payacom
60d1aac55b Fix missing "All" filter translation key on shop discover page
t("common.all") didn't resolve to anything on web (unlike the RN app,
which does have that key) — verified in the browser, where the chip
rendered as the literal string "common.all". Added a proper
shops.allFilter key instead of guessing at an existing one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 10:32:45 +03:30
payacom
d7051c6b16 Add Pinterest product tag: discover filter, Reels badge, and images-step checkbox
- Pinterest filter toggle on the Shop discover page, alongside "All",
  backed by the backend's new ?pinterest=true param on
  /shop-products/discover
- Pinterest badge shown above the favorite button in ShopReelsView's
  action rail for products tagged is_pinterest
- "Pinterest product" checkbox at the bottom of the product images step
  (create wizard and edit flow share the same route)
- New pinterest bold-icon SVG under public/images/icons/vuesax/bold

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 10:24:12 +03:30
payacom
d2f3a96ddf Enable Next.js image optimization across ~60 remaining unoptimized <Image> spots
- Remove `unoptimized` from every Image that was pointing at a real remote/
  static file (Reels image carousel, story avatars/viewer, shop product
  grids/details, chat shared-post/product/story bubbles, notification/
  visitor rows, tag/mention pickers, etc.) so Next's own resize+avif/webp
  pipeline (already configured in next.config.ts) actually applies —
  previously only a handful of components used it, everything else shipped
  full-resolution originals regardless of the tiny thumbnail size shown
- Add a `sizes` prop wherever `fill` was used without one, so the optimizer
  picks an appropriately small srcset entry instead of defaulting to 100vw
- Fix ProfileAvatar to request the actual displayed size instead of always
  requesting 280x280 regardless of the `size` prop
- Left `unoptimized` on the handful of genuinely local/ephemeral sources
  (blob:/data: URIs from in-progress uploads, third-party QR API images,
  static SVG icons) where Next's optimizer can't or shouldn't apply
- Add next-story prefetch to StoryViewer (previously only Reels prefetched
  upcoming media; swiping to the next story always cold-started before)
- Fix .claude/launch.json's dev server port (3000 -> 3004) to match
  package.json's actual `next dev --port 3004`

Verified via `tsc --noEmit` (no new errors) and by diffing this app's
console/network behavior against a git-stashed baseline in the browser
preview — the one pre-existing hydration warning and 401s (unauthenticated
session) are present on both, and /_next/image requests now succeed for
avatars/thumbnails that previously bypassed optimization entirely.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:40:45 +03:30
payacom
9310062616 Fix shop UI RTL/layout consistency and tab reselect behavior
- Align shop header layout (logo, name, verification badge, share button)
  and RTL/LTR positioning across shop, listing, billboard, wallet, gift,
  and academy pages with the Android app's equivalent screens
- Fix TabNavigation's tab-reselect scroll-to-top to only fire on the
  exact tab route, not any active sub-route
- Add verification badge to shop owner name; add brand icon assets

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 17:29:24 +03:30
payacom
9d48c0534e 4.1.3 2026-09-13 21:32:32 +03:30
payacom
901ce94443 secret chat 2026-09-10 16:51:26 +03:30
payacom
2d5505065b git 2026-09-09 10:19:27 +03:30
payacom
bf41ad4e0f check 2026-09-03 16:04:52 +03:30
payacom
76ef4e32a9 order 2026-09-01 13:51:50 +03:30
payacom
1ba6646bf9 project 2026-08-18 20:22:07 +03:30
payacom
0c6e1a7125 lang full 2026-08-16 11:42:39 +03:30
payacom
c879976c56 reels 2026-08-14 21:31:11 +03:30
payacom
a92a3ca5e6 lang 2026-08-13 21:20:23 +03:30
payacom
ef2e86861a instagram 2026-08-13 13:09:25 +03:30
payacom
54623fb720 verify 2026-08-11 19:39:10 +03:30
payacom
491040f752 rezerv 2026-08-05 15:12:39 +03:30
payacom
89320d57b9 shop full 2026-08-04 21:12:03 +03:30
payacom
dc4467d43d shop 2026-08-02 21:20:08 +03:30
payacom
5ecbcd1f26 shop 2026-07-31 21:20:13 +03:30
payacom
67f59eefdf post 2026-07-28 10:06:42 +03:30
payacom
a1d7db5e7e lang 2026-07-23 15:58:15 +03:30
payacom
af5b27b610 full update 2026-07-18 14:29:05 +03:30
payacom
17f334d0f1 chat 2026-07-16 21:31:59 +03:30
payacom
58314d0ab5 login 2026-07-16 20:08:49 +03:30
payacom
39b12a0986 chat 2026-07-12 19:01:04 +03:30
payacom
20c780f104 icone 2026-07-12 12:48:02 +03:30
payacom
94b8ddc589 seo 2026-07-12 11:52:53 +03:30
payacom
d83e91dd2d updata 2026-07-11 21:38:41 +03:30
payacom
402f199e58 icons 2026-07-11 20:59:27 +03:30
payacom
0864ae4723 explor 2026-07-11 20:48:36 +03:30
payacom
8e75913441 pic 2026-07-11 18:05:22 +03:30