Skip to content

Mobile submissions copy link missing#2347

Merged
simo6529 merged 11 commits intomainfrom
mobile-submissions-copy-link-missing
May 5, 2026
Merged

Mobile submissions copy link missing#2347
simo6529 merged 11 commits intomainfrom
mobile-submissions-copy-link-missing

Conversation

@simo6529
Copy link
Copy Markdown
Collaborator

@simo6529 simo6529 commented May 4, 2026

Summary by CodeRabbit

  • New Features

    • Mobile touch menus gain a “Copy link” action for drops (leaderboards, winners, memes); successful copy shows a transient “Copied!” state and closes the menu. Temporary drops disable the copy action; canonical drop links are used where applicable.
    • Small-leaderboard items now respect approve-wave mode: approval badges shown and top-three display adjusts.
  • Tests

    • Added comprehensive tests covering clipboard success/failure, feature detection, canonical link formats, UI states, and touch long-press scenarios.

Signed-off-by: Simo <simo@6529.io>
Signed-off-by: Simo <simo@6529.io>
Signed-off-by: Simo <simo@6529.io>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 4, 2026

📝 Walkthrough

Walkthrough

Extracts mobile copy-link UI/clipboard logic into a new WaveDropMobileMenuCopyLink component, integrates it into multiple mobile touch menus (leaderboard, grid, winners, memes), removes inline clipboard handling from WaveDropMobileMenu, updates mobile/desktop action gating, and adds tests for clipboard success/failure, temporary-drop disabling, event bubbling, and mobile menu presence.

Changes

Mobile copy-link extraction & integration

Layer / File(s) Summary
Data / Types
components/waves/drops/WaveDropMobileMenuCopyLink.tsx
Defines WaveDropMobileMenuCopyLinkProps (drop: ApiDrop, onCopy: ()=>void).
Core Component
components/waves/drops/WaveDropMobileMenuCopyLink.tsx
New client component implementing clipboard write (feature-detect), computes drop link (direct-message/memes-aware), local copied state with 2s reset, unmount-safe timeout, disables for temp- drops, stops event propagation, and invokes onCopy() on completion/failure.
Core Removal / Refactor
components/waves/drops/WaveDropMobileMenu.tsx
Removes inline clipboard helpers, WaveDropMobileCopyButton, copied state, and useSeizeSettings usage; delegates copy rendering to WaveDropMobileMenuCopyLink and updates authenticated/guest call sites to pass drop and onCopy={closeMenu}.
Menu Wiring / Integration
components/*/drops/*.tsx, components/waves/leaderboard/grid/WaveLeaderboardGridItem.tsx
Adds WaveDropMobileMenuCopyLink into mobile slide-up menus in MemesLeaderboardDrop, DefaultWaveLeaderboardDrop, DefaultWaveWinnerDrop, MemesWaveWinnerDrop, and WaveLeaderboardGridItem; grid item splits content-only gating into desktop vs mobile and enables mobile-only copy for non-temp- drops.
Tests / Verification
__tests__/components/.../WaveDropMobileMenuCopyLink.test.tsx, __tests__/components/.../MemesLeaderboardDrop.test.tsx, __tests__/components/.../DefaultWaveLeaderboardDrop.interaction.test.tsx, __tests__/components/.../WaveLeaderboardGridItem.test.tsx
Adds unit and interaction tests: clipboard write success (in-flight resolve showing “Copied!”), clipboard rejection behavior, canonical ?drop=<id> URL for memes wave, parent click non-bubbling, disabled behavior for temp- drops, and asserts mobile action presence via mocked mobile-copy/mobile-copy-action test ids.

Approve-wave / small-leaderboard behavior and approval-status flow

Layer / File(s) Summary
API / Hook Usage
components/brain/my-stream/MyStreamWaveLeaderboard.tsx, components/brain/my-stream/votes/MyStreamWaveMyVotes.tsx
Removes use of useWaveDecisions and related FULL_APPROVAL_WAVE_DECISIONS_PAGE_SIZE decision-points loading/retry wiring; components now rely solely on useApprovalWaveStatus.
Prop surface / Render gating
components/waves/leaderboard/leaderboardRendererRegistry.tsx, components/waves/small-leaderboard/*.tsx
Adds optional isApproveWave?: boolean prop across small-leaderboard renderers and components; components pass and default this prop and gate top-three rendering / badge selection accordingly.
Badge logic
components/waves/small-leaderboard/WaveSmallLeaderboardDefaultDrop.tsx
Replaces previous rank-badge logic with approval-aware statusBadge: renders ApprovalStatusBadge when officially approved, otherwise renders WinnerDropBadge only when !isApproveWave and drop.rank is numeric.
Tests / Verification
__tests__/hooks/waves/useApprovalWaveStatus.test.ts, __tests__/components/waves/small-leaderboard/*, __tests__/components/brain/my-stream/*
Adds/updates tests verifying useWaveDecisions is not enabled for certain approve-wave scenarios, default/top-three rendering when isApproveWave is true, ApprovalStatusBadge appearances, and updated expectations for useApprovalWaveStatus usage in MyStream tests.

Miscellaneous small fixes

Layer / File(s) Summary
Create request minor change
components/waves/create-wave/services/createWaveDropRequest.ts
getCreateWaveDropRequest now assigns requestPart.attachments only when a local attachments variable is defined and non-empty (explicit conditional).
Tests / Mocks updates
__tests__/.../*
Multiple tests updated/added mocks to reflect new copy-link component usage and approval-badge behavior; several interaction tests stub WaveDropMobileMenuCopyLink to expose data-testid nodes.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant MobileMenu as MobileMenu (portal)
    participant CopyButton as WaveDropMobileMenuCopyLink
    participant Clipboard as navigator.clipboard
    participant MenuState as Mobile menu state

    User->>MobileMenu: long-press -> open touch action sheet
    MobileMenu->>CopyButton: render copy action item
    User->>CopyButton: tap "Copy link"
    CopyButton->>Clipboard: writeText(dropLink) (if supported)
    Clipboard-->>CopyButton: resolves/rejects
    CopyButton-->>MenuState: call onCopy() -> setIsActive(false)
    CopyButton-->>User: show "Copied!" feedback (2s)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

"I nibble keys and hop with glee,
A tiny button set free,
I copy links with nimble paws,
Close the menu — applause, applause,
Temp drops sleep — I skip that tree!" 🐇✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Mobile submissions copy link missing' is vague and uses non-descriptive terminology that doesn't clearly convey what was actually implemented or changed. Revise the title to be more specific and descriptive, such as 'Add copy-link action to mobile menus for drops' or 'Implement copy-link feature in mobile drop menus'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch mobile-submissions-copy-link-missing

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx (1)

32-107: ⚡ Quick win

Add a test case covering clipboard write failure.

navigator.clipboard.writeText can be denied by browser permissions in production. The current suite only mocks a resolved write. An error path test would ensure the component handles rejection gracefully (e.g., no uncaught promise, onCopy not invoked, error state shown).

➕ Suggested additional test case
+  it("handles clipboard write failure gracefully", async () => {
+    writeText.mockRejectedValueOnce(new DOMException("NotAllowedError"));
+    const onCopy = jest.fn();
+    const drop: any = {
+      id: "d1",
+      wave: { id: "w1" },
+      serial_no: 5,
+      drop_type: ApiDropType.Chat,
+    };
+
+    render(<WaveDropMobileMenuCopyLink drop={drop} onCopy={onCopy} />);
+
+    await userEvent.click(screen.getByRole("button", { name: "Copy link" }));
+
+    // onCopy should NOT be called on write failure
+    expect(onCopy).not.toHaveBeenCalled();
+    // No uncaught error thrown from the component
+  });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx` around
lines 32 - 107, Add a test that simulates navigator.clipboard.writeText
rejecting and verify the component handles it: in
__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx add a case
where writeText.mockRejectedValueOnce(new Error(...)) before rendering
WaveDropMobileMenuCopyLink, click the "Copy link" button, then assert that
onCopy was NOT called, no uncaught promise is thrown (test completes), and any
UI error indicator produced by WaveDropMobileMenuCopyLink (e.g., an error
message or aria-live region) is rendered; reference the
WaveDropMobileMenuCopyLink component, navigator.clipboard.writeText mock, and
the onCopy mock to locate and update the tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/waves/drops/WaveDropMobileMenuCopyLink.tsx`:
- Around line 81-99: The onCopy() call is executed synchronously before the
clipboard.writeText Promise resolves, causing the component to unmount before
setCopied(true) runs; move the onCopy() invocation into the
clipboard.writeText().then() callback after setCopied(true) (and keep it in the
.catch() path for failures) so the "Copied!" state is set and visible before the
menu is dismissed; update references in the block around clipboard.writeText,
setCopied, copiedResetTimeoutRef, isMountedRef, and onCopy accordingly.

---

Nitpick comments:
In `@__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx`:
- Around line 32-107: Add a test that simulates navigator.clipboard.writeText
rejecting and verify the component handles it: in
__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx add a case
where writeText.mockRejectedValueOnce(new Error(...)) before rendering
WaveDropMobileMenuCopyLink, click the "Copy link" button, then assert that
onCopy was NOT called, no uncaught promise is thrown (test completes), and any
UI error indicator produced by WaveDropMobileMenuCopyLink (e.g., an error
message or aria-live region) is rendered; reference the
WaveDropMobileMenuCopyLink component, navigator.clipboard.writeText mock, and
the onCopy mock to locate and update the tests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 942fb577-1617-42ca-ac16-1c750182c9df

📥 Commits

Reviewing files that changed from the base of the PR and between 0c70235 and 4fdec81.

📒 Files selected for processing (11)
  • __tests__/components/memes/drops/MemesLeaderboardDrop.test.tsx
  • __tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx
  • __tests__/components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.interaction.test.tsx
  • __tests__/components/waves/leaderboard/grid/WaveLeaderboardGridItem.test.tsx
  • components/memes/drops/MemesLeaderboardDrop.tsx
  • components/waves/drops/WaveDropMobileMenu.tsx
  • components/waves/drops/WaveDropMobileMenuCopyLink.tsx
  • components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.tsx
  • components/waves/leaderboard/grid/WaveLeaderboardGridItem.tsx
  • components/waves/winners/drops/DefaultWaveWinnerDrop.tsx
  • components/waves/winners/drops/MemesWaveWinnerDrop.tsx

Comment thread components/waves/drops/WaveDropMobileMenuCopyLink.tsx Outdated
Signed-off-by: Simo <simo@6529.io>
@simo6529
Copy link
Copy Markdown
Collaborator Author

simo6529 commented May 4, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 4, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx (1)

45-71: ⚡ Quick win

Test doesn't exercise the real unmount scenario — "Copied!" visibility is unverifiable with a plain mock.

onCopy is jest.fn() and doesn't unmount the component, so after clipboardWrite.resolve() the child remains mounted and findByText("Copied!") succeeds. In production, onCopy calls setIsActive(false) in the parent; with React 18/19 automatic batching, setCopied(true) and the parent's setIsActive(false) are processed in the same batch, unmounting the child before "Copied!" ever renders.

The test passes today only because it silently ignores this teardown, and the title "closing the menu" is therefore misleading — the menu is never actually closed in the test.

Consider adding a variant that wraps the component in a stateful parent and passes () => setMounted(false) as onCopy, then asserts:

  1. "Copied!" is visible before the component is torn down (requires moving onCopy() into the setTimeout).
  2. The component is subsequently removed from the DOM after 2 s.

This also acts as a regression guard for the component-level fix above.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx` around
lines 45 - 71, Add a new test variant that actually unmounts the menu to mirror
production teardown: render WaveDropMobileMenuCopyLink inside a small stateful
parent (e.g., mounted state + conditional render), pass an onCopy handler that
setsMounted(false) (callable synchronously or via setTimeout to emulate the
component change if you also move the component's onCopy call into a
setTimeout), trigger the copy (using createDeferredClipboardWrite as in the
existing test), resolve the deferred clipboard promise, assert that "Copied!"
appears before the parent unmounts, then assert the component is removed from
the DOM after the expected delay (~2s) to guard regressing the component-level
timing bug involving setCopied and parent setIsActive.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/waves/drops/WaveDropMobileMenuCopyLink.tsx`:
- Around line 81-101: The current clipboard.writeText().then() calls
setCopied(true) and onCopy() together causing React to batch and unmount the
component before the "Copied!" state can render; update the logic inside the
.then() so that you still setCopied(true), clear any existing
copiedResetTimeoutRef, and then set copiedResetTimeoutRef to a
globalThis.setTimeout that after 2000ms first setsCopied(false) (guarded by
isMountedRef.current) and only then calls onCopy() to dismiss the menu; keep the
.catch() behavior unchanged and preserve the isMountedRef checks and
clearTimeout call to avoid leaks.

---

Nitpick comments:
In `@__tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx`:
- Around line 45-71: Add a new test variant that actually unmounts the menu to
mirror production teardown: render WaveDropMobileMenuCopyLink inside a small
stateful parent (e.g., mounted state + conditional render), pass an onCopy
handler that setsMounted(false) (callable synchronously or via setTimeout to
emulate the component change if you also move the component's onCopy call into a
setTimeout), trigger the copy (using createDeferredClipboardWrite as in the
existing test), resolve the deferred clipboard promise, assert that "Copied!"
appears before the parent unmounts, then assert the component is removed from
the DOM after the expected delay (~2s) to guard regressing the component-level
timing bug involving setCopied and parent setIsActive.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 87d9b582-9583-4e87-8503-5523d4a54b3a

📥 Commits

Reviewing files that changed from the base of the PR and between 4fdec81 and e88be3c.

📒 Files selected for processing (2)
  • __tests__/components/waves/drops/WaveDropMobileMenuCopyLink.test.tsx
  • components/waves/drops/WaveDropMobileMenuCopyLink.tsx

Comment thread components/waves/drops/WaveDropMobileMenuCopyLink.tsx
simo6529 added 5 commits May 5, 2026 09:25
Signed-off-by: Simo <simo@6529.io>
Signed-off-by: Simo <simo@6529.io>
Signed-off-by: Simo <simo@6529.io>
Signed-off-by: Simo <simo@6529.io>
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 5, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
components/waves/winners/drops/DefaultWaveWinnerDrop.tsx (1)

216-219: ⚡ Quick win

Use the shared close handler for onCopy to avoid close-path drift.

At Line 218, use handleMobileMenuClose instead of direct setIsActive(false) so all menu close paths stay centralized.

Suggested diff
               <WaveDropMobileMenuCopyLink
                 drop={extendedDrop}
-                onCopy={() => setIsActive(false)}
+                onCopy={handleMobileMenuClose}
               />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/waves/winners/drops/DefaultWaveWinnerDrop.tsx` around lines 216 -
219, Replace the direct state call in the WaveDropMobileMenuCopyLink onCopy
handler with the shared close handler to centralize menu shutdown logic: change
the onCopy prop from using setIsActive(false) to calling the existing
handleMobileMenuClose function so WaveDropMobileMenuCopyLink uses
handleMobileMenuClose (not setIsActive) to close the mobile menu.
components/waves/small-leaderboard/DefaultWaveSmallLeaderboardDrop.tsx (1)

28-28: ⚡ Quick win

Harden the top-three rank predicate to positive bounds.

Line 28 currently accepts 0/negative ranks as “top three”. Consider constraining to 1..3 to avoid invalid ranking UI states (and apply the same predicate in MemesWaveSmallLeaderboardDrop.tsx, Line 25).

♻️ Proposed fix
-      {!isApproveWave && typeof drop.rank === "number" && drop.rank <= 3 ? (
+      {!isApproveWave &&
+      typeof drop.rank === "number" &&
+      drop.rank >= 1 &&
+      drop.rank <= 3 ? (
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/waves/small-leaderboard/DefaultWaveSmallLeaderboardDrop.tsx` at
line 28, The top-three check currently treats zero/negative ranks as valid;
update the predicate in DefaultWaveSmallLeaderboardDrop (where the JSX uses
{!isApproveWave && typeof drop.rank === "number" && drop.rank <= 3}) to require
drop.rank >= 1 && drop.rank <= 3 instead, and make the identical change in
MemesWaveSmallLeaderboardDrop (the analogous conditional at Line 25) so only
ranks 1 through 3 render the top-three UI; keep the typeof drop.rank ===
"number" and isApproveWave guard intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@components/waves/small-leaderboard/DefaultWaveSmallLeaderboardDrop.tsx`:
- Line 28: The top-three check currently treats zero/negative ranks as valid;
update the predicate in DefaultWaveSmallLeaderboardDrop (where the JSX uses
{!isApproveWave && typeof drop.rank === "number" && drop.rank <= 3}) to require
drop.rank >= 1 && drop.rank <= 3 instead, and make the identical change in
MemesWaveSmallLeaderboardDrop (the analogous conditional at Line 25) so only
ranks 1 through 3 render the top-three UI; keep the typeof drop.rank ===
"number" and isApproveWave guard intact.

In `@components/waves/winners/drops/DefaultWaveWinnerDrop.tsx`:
- Around line 216-219: Replace the direct state call in the
WaveDropMobileMenuCopyLink onCopy handler with the shared close handler to
centralize menu shutdown logic: change the onCopy prop from using
setIsActive(false) to calling the existing handleMobileMenuClose function so
WaveDropMobileMenuCopyLink uses handleMobileMenuClose (not setIsActive) to close
the mobile menu.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d528e938-ed1f-4365-ac7c-96bbb2454185

📥 Commits

Reviewing files that changed from the base of the PR and between 32a8c5e and 6aa7baa.

📒 Files selected for processing (22)
  • __tests__/components/brain/my-stream/MyStreamWaveLeaderboard.test.tsx
  • __tests__/components/brain/my-stream/votes/MyStreamWaveMyVotes.test.tsx
  • __tests__/components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.interaction.test.tsx
  • __tests__/components/waves/leaderboard/grid/WaveLeaderboardGridItem.test.tsx
  • __tests__/components/waves/small-leaderboard/DefaultWaveSmallLeaderboardDrop.test.tsx
  • __tests__/components/waves/small-leaderboard/MemesWaveSmallLeaderboardDrop.test.tsx
  • __tests__/components/waves/small-leaderboard/WaveSmallLeaderboardDefaultDrop.test.tsx
  • __tests__/hooks/waves/useApprovalWaveStatus.test.ts
  • components/brain/my-stream/MyStreamWaveLeaderboard.tsx
  • components/brain/my-stream/votes/MyStreamWaveMyVotes.tsx
  • components/waves/create-wave/services/createWaveDropRequest.ts
  • components/waves/drops/WaveDropMobileMenu.tsx
  • components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.tsx
  • components/waves/leaderboard/grid/WaveLeaderboardGridItem.tsx
  • components/waves/leaderboard/leaderboardRendererRegistry.tsx
  • components/waves/small-leaderboard/DefaultWaveSmallLeaderboardDrop.tsx
  • components/waves/small-leaderboard/MemesWaveSmallLeaderboardDrop.tsx
  • components/waves/small-leaderboard/QuorumWaveSmallLeaderboardDrop.tsx
  • components/waves/small-leaderboard/WaveSmallLeaderboardDefaultDrop.tsx
  • components/waves/small-leaderboard/WaveSmallLeaderboardDrop.tsx
  • components/waves/winners/drops/DefaultWaveWinnerDrop.tsx
  • components/waves/winners/drops/MemesWaveWinnerDrop.tsx
💤 Files with no reviewable changes (1)
  • components/brain/my-stream/MyStreamWaveLeaderboard.tsx
✅ Files skipped from review due to trivial changes (1)
  • components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.tsx
🚧 Files skipped from review as they are similar to previous changes (5)
  • tests/components/waves/leaderboard/drops/DefaultWaveLeaderboardDrop.interaction.test.tsx
  • components/waves/winners/drops/MemesWaveWinnerDrop.tsx
  • tests/components/waves/leaderboard/grid/WaveLeaderboardGridItem.test.tsx
  • components/waves/drops/WaveDropMobileMenu.tsx
  • components/waves/leaderboard/grid/WaveLeaderboardGridItem.tsx

@simo6529 simo6529 merged commit 9c2b1f2 into main May 5, 2026
8 checks passed
@simo6529 simo6529 deleted the mobile-submissions-copy-link-missing branch May 5, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants