Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@ianmaccallum
Copy link
Contributor

@ianmaccallum ianmaccallum commented Oct 5, 2025

  • Adds partner fast switcher
  • Adds additional filter to partner links (fixes crash on partner table and partner detail when partner is assigned to root domain)
Screen.Recording.2025-10-05.at.10.58.59.AM.mov
Screen.Recording.2025-10-05.at.11.03.03.AM.mov

Summary by CodeRabbit

  • New Features

    • New Partner selector in program headers with seamless partner switching that preserves current filters.
    • Replaced legacy group header selector with a unified group selector using ID-based navigation.
  • Bug Fixes

    • Partner link lists now exclude entries without valid URLs.
  • UI

    • Polished selectors with header-specific variant, improved placeholders/icons, and smaller message header avatars.
    • Refined combobox scrolling and increased bottom fade.
  • Performance

    • Partner list refreshes retain previous data during revalidation.

@vercel
Copy link
Contributor

vercel bot commented Oct 5, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Updated (UTC)
dub Ready Ready Preview Oct 5, 2025 10:48pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 5, 2025

Walkthrough

Replaced inline partner/group header selectors with reusable PartnerSelector and GroupSelector components; updated navigation to switch by ID while preserving query strings; filtered partner links to exclude falsy URLs; enabled SWR keepPreviousData; swapped combobox Scroll for ScrollContainer and increased bottom fade height; minor UI spacing tweaks.

Changes

Cohort / File(s) Summary
Partner header & layout
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx
Use PartnerSelector, import usePathname, useRouter, useSearchParams; derive params, call usePartner(params.partnerId), implement switchToPartner(newPartnerId) to replace path segment while preserving query; keep 404 redirect when not found.
Partner data filtering
apps/web/lib/api/partners/get-partner-for-program.ts, apps/web/lib/api/partners/get-partners.ts
Filter partner links arrays to remove null entries and entries with falsy url; no other shape changes.
Partners SWR
apps/web/lib/swr/use-partners.ts
Augment passed SWR options with keepPreviousData: true (merged with caller options).
Partner selector UI
apps/web/ui/partners/partner-selector.tsx
New Partner type alias; add optional `variant?: "default"
Group selector refactor
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header.tsx, apps/web/ui/partners/groups/group-selector.tsx
group-header now uses useGroups, switchToGroup(groupId) resolves slug then navigates; replaced old selector with GroupSelector (variant="header"). GroupSelector adds exported Group type, variant prop, loading/placeholder and styling adjustments.
Removed legacy group selector
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header-selector.tsx
Deleted legacy GroupHeaderSelector component, its types, and related logic.
Combobox scrolling / scroll container
packages/ui/src/combobox/index.tsx, packages/ui/src/scroll-container.tsx
Replace internal Scroll wrapper with ScrollContainer in combobox; remove scroll-progress/fade logic from combobox. Increase ScrollContainer bottom fade height from h-8 to h-16.
Messages UI minor sizing
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/messages/[partnerId]/page-client.tsx
Reduce button gap and avatar/skeleton sizes (size-8 β†’ size-6); no logic changes.

Sequence Diagram(s)

sequenceDiagram
  participant U as User
  participant Header as PartnerHeader (PartnerSelector)
  participant Router as Next Router
  participant Path as Pathname/SearchParams
  participant API as usePartner/usePartners

  U->>Header: Select partner (newPartnerId)
  Header->>Path: read pathname + searchParams
  Header->>Router: push(pathname with partnerId replaced, preserve query)
  Router-->>API: fetch data for new partnerId
  API-->>Header: return partner (links filtered to truthy URLs)
  Note right of Header: variant prop affects styling only
Loading
sequenceDiagram
  participant U as User
  participant GHeader as GroupHeader (GroupSelector)
  participant Groups as useGroups
  participant Router as Next Router

  U->>GHeader: Select group (groupId)
  GHeader->>Groups: resolve groupId -> slug
  alt slug == current
    GHeader-->>U: no navigation
  else
    GHeader->>Router: push(path with new group slug)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • TWilson023

Poem

I hop through code with nimble feet,
New selectors make the headers neat. πŸ‡
Links scrubbed clean, the queries stay,
Scrolls now fade a gentler way.
A thump, a twitch β€” deploy away! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
βœ… Passed checks (2 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check βœ… Passed The title accurately and concisely reflects the introduction of the partner fast switcher feature, which is the primary change in this pull request, making it clear and specific for reviewers and history readers.
✨ Finishing touches
  • πŸ“ Generate docstrings
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch partner-fast-switcher

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

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

Copy link
Contributor

@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: 0

🧹 Nitpick comments (1)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (1)

69-71: Avoid appending a bare β€œ?” to the URL when no query exists.

When searchParams.toString() returns an empty string, url becomes /…?, which produces a trailing question mark in the address bar. It works but looks odd. Guard the append so ?${…} is only added when there are actual params.

πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between a66958e and c2b2cd7.

πŸ“’ Files selected for processing (4)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (3 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (1 hunks)
  • apps/web/lib/api/partners/get-partner-for-program.ts (1 hunks)
  • apps/web/lib/api/partners/get-partners.ts (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (2)
apps/web/lib/swr/use-partner.ts (1)
  • usePartner (6-29)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (2)
  • Partner (8-8)
  • PartnerHeaderSelector (16-139)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (3)
apps/web/lib/types.ts (1)
  • PartnerProps (437-437)
apps/web/lib/zod/schemas/partners.ts (1)
  • PARTNERS_MAX_PAGE_SIZE (31-31)
packages/ui/src/combobox/index.tsx (1)
  • Combobox (85-367)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build

Copy link
Contributor

@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)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (1)

69-72: Handle empty query strings when pushing the new URL

With no search params, searchParams.toString() is empty, so the generated URL ends with ?. That leaves users on a slightly malformed route (/partners/:id?). Build the query string conditionally before pushing.

Apply this diff:

-    const url = `${pathname.replace(
-      `/partners/${params.partnerId}`,
-      `/partners/${newPartner.id}`,
-    )}?${searchParams.toString()}`;
-
-    router.push(url);
+    const nextPath = pathname.replace(
+      `/partners/${params.partnerId}`,
+      `/partners/${newPartner.id}`,
+    );
+    const queryString = searchParams.toString();
+
+    router.push(queryString ? `${nextPath}?${queryString}` : nextPath);
πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between a66958e and 875ddd3.

πŸ“’ Files selected for processing (4)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (3 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (1 hunks)
  • apps/web/lib/api/partners/get-partner-for-program.ts (1 hunks)
  • apps/web/lib/api/partners/get-partners.ts (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (4)
apps/web/lib/types.ts (1)
  • PartnerProps (437-437)
apps/web/lib/zod/schemas/partners.ts (1)
  • PARTNERS_MAX_PAGE_SIZE (31-31)
packages/ui/src/combobox/index.tsx (1)
  • Combobox (85-367)
apps/web/ui/partners/partner-selector.tsx (1)
  • PartnerSelector (14-110)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (2)
apps/web/lib/swr/use-partner.ts (1)
  • usePartner (6-29)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/partner-header-selector.tsx (2)
  • Partner (8-8)
  • PartnerHeaderSelector (16-139)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build

Copy link
Contributor

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header.tsx (1)

46-74: Switching to a searched group now fails when it isn’t in the prefetched list

switchToGroup only looks up the slug inside the local groups array. When the user searches in GroupSelector and picks a group that wasn’t part of that initial page, targetGroup stays undefined and the navigation silently aborts. In production workspaces with many groups this regresses the fast-switcher: choosing any β€œoff-page” result won’t navigate at all.

Please resolve the slug from the selection itself (e.g. via option.meta.slug) and only fall back to the cached list, and don’t append an empty ? when there are no search params. One way to do it is:

-  const switchToGroup = (groupId: string) => {
-    if (group.id === groupId) return;
-
-    // Find the group by ID to get the slug
-    const targetGroup = groups?.find((g) => g.id === groupId);
-    if (!targetGroup) return;
-
-    const url = `${pathname.replace(`/groups/${params.groupSlug}`, `/groups/${targetGroup.slug}`)}?${searchParams.toString()}`;
-
-    router.push(url);
-  };
+  const switchToGroup = (groupId: string, groupSlug?: string) => {
+    if (group.id === groupId) return;
+
+    const slug =
+      groupSlug ?? groups?.find((g) => g.id === groupId)?.slug;
+
+    if (!slug) return;
+
+    const query = searchParams.toString();
+    router.push(
+      `${pathname.replace(`/groups/${params.groupSlug}`, `/groups/${slug}`)}${
+        query ? `?${query}` : ""
+      }`,
+    );
+  };

…and pass the slug along from <GroupSelector> (e.g. by setting option.meta = { slug: group.slug } in the selector and supplying an onSelect callback here). Once meta.slug is wired through, off-page selections will route correctly.

πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 875ddd3 and f192723.

πŸ“’ Files selected for processing (9)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header-selector.tsx (0 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header.tsx (4 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/messages/[partnerId]/page-client.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (4 hunks)
  • apps/web/lib/swr/use-partners.ts (1 hunks)
  • apps/web/ui/partners/groups/group-selector.tsx (4 hunks)
  • apps/web/ui/partners/partner-selector.tsx (2 hunks)
  • packages/ui/src/combobox/index.tsx (4 hunks)
  • packages/ui/src/scroll-container.tsx (1 hunks)
πŸ’€ Files with no reviewable changes (1)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header-selector.tsx
🧰 Additional context used
🧬 Code graph analysis (6)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/messages/[partnerId]/page-client.tsx (1)
packages/utils/src/constants/misc.ts (1)
  • OG_AVATAR_URL (29-29)
apps/web/ui/partners/partner-selector.tsx (2)
apps/web/lib/types.ts (1)
  • PartnerProps (437-437)
packages/ui/src/combobox/index.tsx (1)
  • ComboboxProps (39-76)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (2)
apps/web/lib/swr/use-partner.ts (1)
  • usePartner (6-29)
apps/web/ui/partners/partner-selector.tsx (1)
  • PartnerSelector (18-140)
packages/ui/src/combobox/index.tsx (1)
packages/ui/src/scroll-container.tsx (1)
  • ScrollContainer (5-32)
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header.tsx (2)
apps/web/lib/swr/use-groups.ts (1)
  • useGroups (10-38)
apps/web/ui/partners/groups/group-selector.tsx (1)
  • GroupSelector (19-128)
apps/web/ui/partners/groups/group-selector.tsx (3)
apps/web/lib/types.ts (1)
  • GroupProps (568-568)
packages/ui/src/combobox/index.tsx (1)
  • ComboboxProps (39-76)
apps/web/lib/zod/schemas/groups.ts (1)
  • GROUPS_MAX_PAGE_SIZE (24-24)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build

@steven-tey
Copy link
Collaborator

@coderabbitai full review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 5, 2025

βœ… Actions performed

Full review triggered.

Copy link
Contributor

@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: 2

♻️ Duplicate comments (1)
apps/web/ui/partners/groups/group-selector.tsx (1)

12-18: Still dropping null selection events β€” clearing is impossible.

setSelectedGroupId still only accepts string, and the handler exits when the combobox emits null, so the previous selection sticks and the user can’t clear the field (same issue called out earlier). Please allow null to flow through and handle it upstream.

 type GroupSelectorProps = {
   selectedGroupId: string | null;
-  setSelectedGroupId: (groupId: string) => void;
+  setSelectedGroupId: (groupId: string | null) => void;
   disabled?: boolean;
   variant?: "default" | "header";
 } & Partial<ComboboxProps<false, any>>;
…
-      setSelected={(option) => {
-        if (!option) return;
-        setSelectedGroupId(option.value);
-      }}
+      setSelected={(option) => {
+        setSelectedGroupId(option?.value ?? null);
+      }}

Also applies to: 72-75

🧹 Nitpick comments (3)
apps/web/ui/partners/partner-selector.tsx (3)

89-95: Consider simplifying the icon placeholder condition.

Since selectedOption.icon is always defined when selectedOption exists, the condition could be simplified to !selectedOption for clarity.

Apply this diff:

-      icon={
-        !selectedOption?.icon ? (
-          <div className="size-5 flex-none animate-pulse rounded-full bg-neutral-200" />
-        ) : (
-          selectedOption?.icon
-        )
-      }
+      icon={
+        !selectedOption ? (
+          <div className="size-5 flex-none animate-pulse rounded-full bg-neutral-200" />
+        ) : (
+          selectedOption.icon
+        )
+      }

133-137: Consider a more flexible placeholder width.

The fixed w-[120px] width may cause layout shifts if partner names vary significantly in length. Consider using min-w-[120px] or w-32 for more consistent sizing.

Apply this diff:

-      {!selectedOption?.label ? (
-        <div className="h-6 w-[120px] animate-pulse rounded bg-neutral-100" />
+      {!selectedOption?.label ? (
+        <div className="h-6 min-w-[120px] animate-pulse rounded bg-neutral-100" />
       ) : (
         selectedOption.label
       )}

9-10: Remove unused Partner type export from partner-selector.tsx
The Partner type (Pick<PartnerProps, "id" | "name">) isn’t referenced anywhere and can be deleted.

πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 351b27c and f192723.

πŸ“’ Files selected for processing (11)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header-selector.tsx (0 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header.tsx (4 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/messages/[partnerId]/page-client.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/[partnerId]/layout.tsx (4 hunks)
  • apps/web/lib/api/partners/get-partner-for-program.ts (1 hunks)
  • apps/web/lib/api/partners/get-partners.ts (1 hunks)
  • apps/web/lib/swr/use-partners.ts (1 hunks)
  • apps/web/ui/partners/groups/group-selector.tsx (4 hunks)
  • apps/web/ui/partners/partner-selector.tsx (2 hunks)
  • packages/ui/src/combobox/index.tsx (4 hunks)
  • packages/ui/src/scroll-container.tsx (1 hunks)
πŸ’€ Files with no reviewable changes (1)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/group-header-selector.tsx
πŸ”‡ Additional comments (4)
apps/web/ui/partners/partner-selector.tsx (3)

15-15: LGTM!

The variant prop is well-typed with a sensible default value.

Also applies to: 22-22


98-98: LGTM!

Grammar improvement from singular to plural is correct.


104-130: LGTM!

The variant-based styling is well-structured and correctly handles the disabled prop in both branches. The header variant appropriately styles the component for header usage.

Note: Ensure bg-bg-subtle and bg-bg-emphasis are defined in your Tailwind theme configuration.

packages/ui/src/scroll-container.tsx (1)

27-27: LGTM! Increased fade height improves visual feedback.

The bottom fade height increase from h-8 (32px) to h-16 (64px) provides a more prominent scroll indicator while maintaining the same opacity calculation.

import { AnimatedSizeContainer } from "../animated-size-container";
import { Button, ButtonProps } from "../button";
import { useMediaQuery, useScrollProgress } from "../hooks";
import { useMediaQuery } from "../hooks";
Copy link
Contributor

Choose a reason for hiding this comment

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

πŸ› οΈ Refactor suggestion | 🟠 Major

🧩 Analysis chain

Verify height behavior with ScrollContainer.

The refactoring to use ScrollContainer is good for code reuse. However, there's a potential class conflict to verify:

  • ScrollContainer has a hardcoded h-[190px] in its internal div (scroll-container.tsx:17)
  • The Combobox passes className="h-full max-h-[min(50vh,250px)]" to override this

While Tailwind's class merging should allow h-full to override h-[190px], please verify in the browser that:

  1. The combobox options list respects the max-h-[min(50vh,250px)] constraint
  2. The scrollable area adapts properly when viewport height changes
  3. No unexpected fixed height of 190px appears

Run the following script to check if the old Scroll component was fully removed:

Also applies to: 26-26, 253-253, 318-318


🏁 Script executed:

#!/bin/bash
# Description: Verify that the old Scroll component in combobox is fully removed

# Search for any remaining references to the old Scroll component in combobox-related files
rg -n -C3 --type=tsx --type=ts -g '!node_modules' -g '!dist' -g '!build' 'function Scroll\(' packages/ui/src/combobox/

# Search for useScrollProgress usage that might be leftover
rg -n -C3 --type=tsx --type=ts -g '!node_modules' -g '!dist' -g '!build' 'useScrollProgress' packages/ui/src/combobox/

Length of output: 55


🏁 Script executed:

#!/bin/bash
# Find ScrollContainer implementation
echo "Locating scroll-container.tsx..."
fd scroll-container.tsx

# Inspect the first 50 lines for hardcoded height
fd scroll-container.tsx | xargs -I{} sed -n '1,50p' {} | grep -n 'h-\\[190px\\]'

# Verify old Scroll component references in combobox
rg -n -C3 'function Scroll\(' -g '*.tsx' -g '*.ts' packages/ui/src/combobox/
rg -n -C3 '<Scroll\b' -g '*.tsx' packages/ui/src/combobox/
rg -n -C3 'useScrollProgress' -g '*.tsx' -g '*.ts' packages/ui/src/combobox/

Length of output: 69


🏁 Script executed:

#!/bin/bash
# Confirm any hardcoded height classes in ScrollContainer
grep -R "h-\[" -n packages/ui/src/scroll-container.tsx

# Inspect className props usage
grep -R "className" -n packages/ui/src/scroll-container.tsx

Length of output: 363


Allow parent to control ScrollContainer height. In packages/ui/src/scroll-container.tsx (line 17), remove the hardcoded h-[190px] (e.g. change to h-full) or expose a height/defaultHeight prop so that the h-full max-h-[min(50vh,250px)] passed by the Combobox can take effect.

πŸ€– Prompt for AI Agents
In packages/ui/src/scroll-container.tsx around line 17 (and referenced by
packages/ui/src/combobox/index.tsx line 16), the ScrollContainer currently
forces a fixed class h-[190px] which prevents parent components like Combobox
from controlling height; remove the hardcoded h-[190px] (or replace it with
h-full) and instead accept an optional height/defaultHeight prop (string) that
gets applied to the container class when provided, defaulting to h-full if
absent, and ensure existing max-h and other parent classes from Combobox are
preserved by not overwriting them.

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.

3 participants