-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Discount code attribution tracking #2620
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+3,065
−997
Merged
Changes from 250 commits
Commits
Show all changes
267 commits
Select commit
Hold shift + click to select a range
206300c
Merge branch 'main' into link-based-coupon-codes
steven-tey 0c8937e
Refactor discount actions to remove unused provider parameter and str…
devkiran 56daee4
Refactor promotion code creation logic
devkiran 1a31aab
Delete coupon.ts
devkiran 6e059ef
Merge branch 'main' into link-based-coupon-codes
devkiran 6b6587b
Merge branch 'main' into link-based-coupon-codes
devkiran 6e782e5
wip
devkiran 0625682
wip
devkiran 5da4148
Update types.ts
devkiran 8ae89d4
Update import-partnerstack-modal.tsx
devkiran 33dc5f2
Refactor Stripe client initialization to use VERCEL_ENV for livemode …
devkiran 6c8b511
Improve Stripe coupon creation and error handling
devkiran 262d1e6
Update create-coupon.ts
devkiran 4d66307
Update add-edit-discount-sheet.tsx
devkiran 705cc1d
Update route.ts
devkiran 6fc3ec5
Update create-promotion-code.ts
devkiran 63ae63d
Update checkout-session-completed.ts
devkiran 23c0be9
Add coupon deleted webhook handler and integrate with route
devkiran c5bc5df
add getPromotionCode
devkiran 98dc15d
add recordFakeClick
devkiran c552743
Update checkout-session-completed.ts
devkiran d7923bb
Update checkout-session-completed.ts
devkiran 485f99d
Merge branch 'main' into link-based-coupon-codes
steven-tey 096d04d
Merge branch 'main' into link-based-coupon-codes
steven-tey e96202c
Merge branch 'main' into link-based-coupon-codes
steven-tey 41de2d2
Merge branch 'main' into link-based-coupon-codes
devkiran dfb32cc
send discount has been deleted email
devkiran 714be7a
Update delete-discount.ts
devkiran 0a93a55
Update delete-discount.ts
devkiran 08456cd
Merge branch 'main' into link-based-coupon-codes
devkiran 8623821
Update record-fake-click.ts
devkiran ef3e1e5
create promotion code when adding a new link
devkiran e47b608
Refactor link creation to include discount and program details, strea…
devkiran 94a1210
Create disable-promotion-code.ts
devkiran 7e5c5cf
Merge branch 'main' into link-based-coupon-codes
devkiran befd2af
Update disable-promotion-code.ts
devkiran b5d55b6
Refactor bulk link deletion to include workspace across multiple API …
devkiran 6ab362f
rename
devkiran 1545e7f
Update route.ts
devkiran 747c734
Update route.ts
devkiran f83ad9f
update the link with new coupon code
devkiran 4d814f0
handle the coupon code management in link update
devkiran a403713
Merge branch 'main' into link-based-coupon-codes
steven-tey 073c64d
Update route.ts
devkiran d066275
rename
devkiran a14a750
Update coupon-deleted.ts
devkiran d91e9e3
Update discount.prisma
devkiran 1ce2c45
revert some changes (will do this in separate PR)
devkiran 931a23f
Refactor discount creation to include program data
devkiran 4a56797
Refactor disableStripePromotionCode to use explicit params
devkiran 3bd7196
Update create-partner-link.ts
devkiran 98f520b
fix build
devkiran 1404d5b
address coderabbit feedback
devkiran d214f2f
Update bulk-delete-links.ts
devkiran 3c9e93a
Refactor link creation to use workspace and skip coupon option
devkiran f923041
Update bulk-approve-partners.ts
devkiran 741aadd
Update import-partners.ts
devkiran 699979f
Update update-link.ts
devkiran f0c8422
Update create-link.ts
devkiran 6aff485
Update create-stripe-promotion-code.ts
devkiran 1644fa4
Update route.ts
devkiran dae24a8
Update route.ts
devkiran 54dab41
Update delete-discount.ts
devkiran db9c336
Update route.ts
devkiran a16d874
Merge branch 'main' into link-based-coupon-codes
devkiran 7680b93
Merge branch 'main' into link-based-coupon-codes
devkiran 41afcc9
Merge branch 'main' into link-based-coupon-codes
devkiran 07f10a3
Update add-edit-discount-sheet.tsx
devkiran 744276c
Update add-edit-discount-sheet.tsx
devkiran d2a63d7
Update add-edit-discount-sheet.tsx
devkiran cc3d03b
Refactor discount sheet and update related logic
devkiran 48f86ae
Merge branch 'main' into link-based-coupon-codes
devkiran e64deb8
Refactor discount actions and schema, remove promotion code cron
devkiran a5c546a
Update add-edit-discount-sheet.tsx
devkiran e736d0c
Update create-discount.ts
devkiran 088e98b
Update add-edit-discount-sheet.tsx
devkiran 1ded8e8
Update inline-badge-popover.tsx
devkiran 1a0f279
fix the "coupon.deleted" webhook
devkiran d673d0a
simplify email
devkiran edaf1ee
Merge branch 'main' into link-based-coupon-codes
devkiran 2bada47
Update route.ts
devkiran 2ae570c
Refactor coupon code tracking to discount schema
devkiran 347dc43
add /api/cron/links/create-promotion-codes and /api/cron/links/delet…
devkiran eec3829
Refactor promotion code creation to use partner group ID instead of d…
devkiran 0d809d3
Update route.ts
devkiran 0d3a7b6
Delete delete-partner.ts
devkiran 2636391
Revert "Delete delete-partner.ts"
devkiran 03637bc
Update discount.ts
devkiran bcd9639
Update route.ts
devkiran 0535e83
Update checkout-session-completed.ts
devkiran 8ad7b78
Update add-edit-discount-sheet.tsx
devkiran 460ad47
Add coupon code support to PartnerLinkCard and update schemas
devkiran 73995c5
Merge branch 'main' into link-based-coupon-codes
devkiran 78b76ae
Update import-partners.ts
devkiran 3325476
Update route.ts
devkiran 748a25e
Update disable-stripe-promotion-code.ts
devkiran cf966cd
Update create-discount.ts
devkiran 958b862
Update create-stripe-coupon.ts
devkiran ebf3178
Refactor Stripe promotion code and coupon APIs
devkiran a8e9b8f
Refactor promotion code creation logic
devkiran ad1097d
skip coupon code creation if existing code exists
devkiran feb38cf
Update ban-partner.ts
devkiran ac1c411
Update create-link.ts
devkiran 257e0a1
Update create-stripe-promotion-code.ts
devkiran f51c562
Update disable-stripe-promotion-code.ts
devkiran 2edcffa
fix coupon deletion
devkiran 13c4a5e
improve the cron job
devkiran 079e4b7
Update route.ts
devkiran 257ec79
fix cron job
devkiran 5189f3d
Merge branch 'main' into link-based-coupon-codes
devkiran f9d40dd
Merge branch 'group-links' into link-based-coupon-codes
devkiran c7f4f7c
Refactor promotion code creation jobs and API routes
devkiran d4d515a
improve the cron job
devkiran 35fe8c0
rename
devkiran 27dbcd1
Add new API routes for enqueuing promotion code creation and deletion…
devkiran bd84c12
Refactor promotion code to coupon code naming
devkiran f5139d5
Merge branch 'main' into link-based-coupon-codes
devkiran 076ea6b
Refactor enqueueCouponCodeDeleteJobs to accept links array
devkiran a58ceea
Refactor coupon job enqueuing to accept single or multiple links
devkiran 545bba5
Refactor createLink to simplify parameters and discount logic
devkiran b4c90fa
Merge branch 'group-links' into link-based-coupon-codes
devkiran 5e504f6
Update links.ts
devkiran 478136a
Update partners.ts
devkiran 7d726d3
Update route.ts
devkiran a4b7fb2
Update partner-profile.ts
devkiran 77ed8c1
Update payouts.ts
devkiran 9ed3298
Update pnpm-lock.yaml
devkiran 4ae412e
fix build
devkiran 9d93ef3
add coupon code creation during bulk create links
devkiran 97c7b3a
Update delete-discount.ts
devkiran 8985d7f
fix cron URL
devkiran bce917a
some fixes after testing
devkiran 3c9f699
Refactor bulk link deletion to remove workspace parameter and streaml…
devkiran 18b0011
Update coupon-deleted.ts
devkiran 26ec96f
remove skipCouponCreation
devkiran 8a9c540
Update bulk-ban-partners.ts
devkiran a4ebf3b
Update schemas.ts
devkiran fe61555
Update bulk-create-links.ts
devkiran 299625f
Update create-link.ts
devkiran 7c2920e
fix the TS errors
devkiran 6aa44d3
Merge branch 'main' into link-based-coupon-codes
devkiran 24192c1
Update coupon-deleted.ts
devkiran 8c9f724
Merge branch 'group-links' into link-based-coupon-codes
devkiran 23334d1
Update create-stripe-coupon.ts
devkiran bc4dd00
Update disable-stripe-promotion-code.ts
devkiran 10a785f
Update checkout-session-completed.ts
devkiran 96d5de6
Update link.prisma
devkiran 07bd9ba
Update checkout-session-completed.ts
devkiran e3ac1e6
Merge branch 'main' into link-based-coupon-codes
devkiran d4f0ebf
finalize the Stripe webhook
devkiran 8f16cf2
format
devkiran 5a1d437
Merge branch 'group-links' into link-based-coupon-codes
devkiran 6251659
Merge branch 'main' into link-based-coupon-codes
steven-tey 1a31fde
Merge branch 'main' into link-based-coupon-codes
steven-tey 4934a7c
Merge branch 'main' into link-based-coupon-codes
devkiran b705ddb
some cleanup
devkiran 108ca09
Add discount code API endpoints and schemas
devkiran 8a31e8c
Update route.ts
devkiran f47455f
remove unused
devkiran 642fc5d
wip
devkiran dbbb006
wip
devkiran 098d7db
fix discount code creation
devkiran ef1bbc3
Update coupon-deleted.ts
devkiran 370ea22
Merge branch 'main' into link-based-coupon-codes
devkiran 7dab69e
wip
devkiran 1b78fa9
Merge branch 'main' into link-based-coupon-codes
devkiran 237f139
Add delete discount code API endpoint and refactor discount deletion …
devkiran 0875cd0
some fixes
devkiran cd95bc5
add discount codes API
devkiran ce00462
Refactor discount code deletion logic and API usage
devkiran a1f1fed
Update coupon-deleted.ts
devkiran 5c1883a
Update bulk-ban-partners.ts
devkiran 02256b6
revert the changes
devkiran 94ed3ff
listen for promotion_code.updated" webhook
devkiran 885afa1
format
devkiran 8435c62
Update checkout-session-completed.ts
devkiran c57a17f
display discount codes on the partner links card
devkiran 23f2eee
record audit log
devkiran 4c6246a
add discount code modal
devkiran 10836c8
wip
devkiran da8fb3f
Merge branch 'main' into link-based-coupon-codes
devkiran ecbfd06
fix cron jobs
devkiran a4d12c5
display the dicounts on the parter profile page
devkiran 09a528d
remove couponCodeTrackingEnabledAt
devkiran c0af060
Refactor discount code creation logic and improve error handling
devkiran aec6609
Update discount.ts
devkiran 3378d3c
add table action button
devkiran 50fd75c
delete discount code
devkiran b3a2a8a
Refactor discount code deletion
devkiran 26959fc
Refactor discount code handling to use queueDiscountCodeDeletion acro…
devkiran 961196b
Add API endpoint to delete discount codes and refactor related logic
devkiran 1c24905
Update ban-partner.ts
devkiran 77f267d
Update route.ts
devkiran c0ae40e
Update bulk-ban-partners.ts
devkiran 3e90815
Update queue-discount-code-deletion.ts
devkiran db21f37
Update update-discount.ts
devkiran a52b099
Update delete-link.ts
devkiran a16a10f
Update get-program-enrollment-or-throw.ts
devkiran 0f45b51
Delete discount.ts
devkiran d1d21c7
Delete workflow.ts
devkiran 0a15fc4
Update page-client.tsx
devkiran fc7d678
Update use-api-mutation.ts
devkiran b2bdc6b
Update add-discount-code-modal.tsx
devkiran 3d705bb
fix coupon creation modal
devkiran 638cace
Update add-edit-discount-sheet.tsx
devkiran ee5a7c3
add /api/cron/discounts/remap-discount-codes
devkiran 81d5c98
Refactor discount code deletion logic
devkiran 0e9894d
format
devkiran 1030c62
Merge branch 'main' into link-based-coupon-codes
devkiran c3f85e2
update the discount table UI
devkiran 57af06d
improve the delete discount code modal
devkiran f6216a2
add empty states to the discount table
devkiran 1859ed6
add a loading state
devkiran db03a5b
add UpgradeRequiredToast
devkiran 0224f20
add custom cta to UpgradeRequiredToast
devkiran 0967b8c
fix ban partner to include program
devkiran 21b0ddc
final cleanup
devkiran 8460086
Update queue-discount-code-deletion.ts
devkiran 5b941d8
Update route.ts
devkiran 692acb0
Update page-client.tsx
devkiran 87aa841
Update queue-discount-code-deletion.ts
devkiran 68a5b6c
move the url to /groups/remap-discount-codes
devkiran 5ea7b2f
Update route.ts
devkiran 7c81f0f
Update bulk-ban-partners.ts
devkiran bad087f
Update route.ts
devkiran aff528e
Update create-discount.ts
devkiran 789e6ad
add STRIPE_ERROR_MAP
devkiran 0b4b16f
Merge branch 'main' into link-based-coupon-codes
devkiran 7c68590
Merge branch 'main' into link-based-coupon-codes
steven-tey 8fd04e8
fix params
steven-tey 0e235c7
Merge branch 'main' into link-based-coupon-codes
steven-tey 6c1a7aa
Merge branch 'main' into link-based-coupon-codes
devkiran 6a23bcb
Update route.ts
devkiran b46d7c5
Update route.ts
devkiran d60d4ab
Update route.ts
devkiran 3d78347
Update route.ts
devkiran 242e1ec
Update programs.ts
devkiran 92439b4
Merge branch 'main' into link-based-coupon-codes
steven-tey d12b65d
moved modals
steven-tey 64fe760
redirect partner when not exist
steven-tey 5a4c91b
style changes
steven-tey c268afd
Merge branch 'main' into link-based-coupon-codes
steven-tey 7c27b6e
rearrange isDiscountEquivalent
steven-tey 6c3800d
use dcode_ prefix
steven-tey 6fc58cc
rearrange some stuff
steven-tey 2975282
finalize checkout.session.completed webhook
steven-tey 52fa2b1
address coderabbit feedback
steven-tey c4395ac
update PartnerLinkCard, misc final changes
steven-tey f5083cf
use group name in discount name
steven-tey db09f48
final bug fixes
steven-tey File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
62 changes: 62 additions & 0 deletions
62
apps/web/app/(ee)/api/cron/discount-codes/[discountCodeId]/delete/route.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import { handleAndReturnErrorResponse } from "@/lib/api/errors"; | ||
import { verifyQstashSignature } from "@/lib/cron/verify-qstash"; | ||
import { disableStripeDiscountCode } from "@/lib/stripe/disable-stripe-discount-code"; | ||
import { prisma } from "@dub/prisma"; | ||
import { logAndRespond } from "../../../utils"; | ||
|
||
export const dynamic = "force-dynamic"; | ||
|
||
// POST /api/cron/discount-codes/[discountCodeId]/delete | ||
export async function POST( | ||
req: Request, | ||
{ params }: { params: Promise<{ discountCodeId: string }> }, | ||
) { | ||
try { | ||
const { discountCodeId } = await params; | ||
|
||
const rawBody = await req.text(); | ||
|
||
await verifyQstashSignature({ | ||
req, | ||
rawBody, | ||
}); | ||
|
||
const discountCode = await prisma.discountCode.findUnique({ | ||
where: { | ||
id: discountCodeId, | ||
}, | ||
}); | ||
|
||
if (!discountCode) { | ||
return logAndRespond(`Discount code ${discountCodeId} not found.`); | ||
} | ||
|
||
const workspace = await prisma.project.findUniqueOrThrow({ | ||
where: { | ||
defaultProgramId: discountCode.programId, | ||
}, | ||
select: { | ||
stripeConnectId: true, | ||
}, | ||
}); | ||
|
||
const disabledDiscountCode = await disableStripeDiscountCode({ | ||
code: discountCode.code, | ||
stripeConnectId: workspace.stripeConnectId, | ||
}); | ||
|
||
if (disabledDiscountCode) { | ||
await prisma.discountCode.delete({ | ||
where: { | ||
id: discountCodeId, | ||
}, | ||
}); | ||
} | ||
|
||
return logAndRespond( | ||
`Discount code ${discountCode.code} disabled from Stripe for ${workspace.stripeConnectId}.`, | ||
); | ||
} catch (error) { | ||
return handleAndReturnErrorResponse(error); | ||
} | ||
} |
113 changes: 113 additions & 0 deletions
113
apps/web/app/(ee)/api/cron/groups/remap-discount-codes/route.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
import { isDiscountEquivalent } from "@/lib/api/discounts/is-discount-equivalent"; | ||
import { queueDiscountCodeDeletion } from "@/lib/api/discounts/queue-discount-code-deletion"; | ||
import { handleAndReturnErrorResponse } from "@/lib/api/errors"; | ||
import { verifyQstashSignature } from "@/lib/cron/verify-qstash"; | ||
import { prisma } from "@dub/prisma"; | ||
import { z } from "zod"; | ||
import { logAndRespond } from "../../utils"; | ||
|
||
export const dynamic = "force-dynamic"; | ||
|
||
const schema = z.object({ | ||
programId: z.string(), | ||
partnerIds: z.array(z.string()), | ||
groupId: z.string(), | ||
}); | ||
|
||
// POST /api/cron/groups/remap-discount-codes | ||
export async function POST(req: Request) { | ||
try { | ||
const rawBody = await req.text(); | ||
|
||
await verifyQstashSignature({ | ||
req, | ||
rawBody, | ||
}); | ||
|
||
const { programId, partnerIds, groupId } = schema.parse( | ||
JSON.parse(rawBody), | ||
); | ||
|
||
if (partnerIds.length === 0) { | ||
return logAndRespond("No partner IDs provided."); | ||
} | ||
|
||
const programEnrollments = await prisma.programEnrollment.findMany({ | ||
where: { | ||
partnerId: { | ||
in: partnerIds, | ||
}, | ||
programId, | ||
}, | ||
include: { | ||
discountCodes: { | ||
include: { | ||
discount: true, | ||
}, | ||
}, | ||
}, | ||
}); | ||
|
||
if (programEnrollments.length === 0) { | ||
return logAndRespond("No program enrollments found."); | ||
} | ||
|
||
const group = await prisma.partnerGroup.findUnique({ | ||
where: { | ||
id: groupId, | ||
}, | ||
include: { | ||
discount: true, | ||
}, | ||
}); | ||
|
||
if (!group) { | ||
return logAndRespond("Group not found."); | ||
} | ||
devkiran marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
const discountCodes = programEnrollments.flatMap( | ||
({ discountCodes }) => discountCodes, | ||
); | ||
|
||
const discountCodesToUpdate: string[] = []; | ||
const discountCodesToRemove: string[] = []; | ||
|
||
for (const discountCode of discountCodes) { | ||
const keepDiscountCode = isDiscountEquivalent( | ||
group.discount, | ||
discountCode.discount, | ||
); | ||
|
||
if (keepDiscountCode) { | ||
discountCodesToUpdate.push(discountCode.id); | ||
} else { | ||
discountCodesToRemove.push(discountCode.id); | ||
} | ||
} | ||
|
||
// Update the discount codes to use the new discount | ||
if (discountCodesToUpdate.length > 0) { | ||
await prisma.discountCode.updateMany({ | ||
where: { | ||
id: { | ||
in: discountCodesToUpdate, | ||
}, | ||
}, | ||
data: { | ||
discountId: group.discount?.id, | ||
}, | ||
}); | ||
} | ||
|
||
// Remove the discount codes from the group | ||
if (discountCodesToRemove.length > 0) { | ||
await queueDiscountCodeDeletion(discountCodesToRemove); | ||
} | ||
|
||
return logAndRespond( | ||
`Updated ${discountCodesToUpdate.length} discount codes and removed ${discountCodesToRemove.length} discount codes.`, | ||
); | ||
} catch (error) { | ||
return handleAndReturnErrorResponse(error); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
apps/web/app/(ee)/api/discount-codes/[discountCodeId]/route.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log"; | ||
import { queueDiscountCodeDeletion } from "@/lib/api/discounts/queue-discount-code-deletion"; | ||
import { DubApiError } from "@/lib/api/errors"; | ||
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw"; | ||
import { withWorkspace } from "@/lib/auth"; | ||
import { prisma } from "@dub/prisma"; | ||
import { waitUntil } from "@vercel/functions"; | ||
import { NextResponse } from "next/server"; | ||
|
||
// DELETE /api/discount-codes/[discountCodeId] - soft delete a discount code | ||
export const DELETE = withWorkspace( | ||
async ({ workspace, params, session }) => { | ||
const { discountCodeId } = params; | ||
const programId = getDefaultProgramIdOrThrow(workspace); | ||
|
||
const discountCode = await prisma.discountCode.findUnique({ | ||
where: { | ||
id: discountCodeId, | ||
}, | ||
}); | ||
|
||
if (!discountCode || !discountCode.discountId) { | ||
throw new DubApiError({ | ||
message: `Discount code (${discountCodeId}) not found.`, | ||
code: "bad_request", | ||
}); | ||
} | ||
|
||
if (discountCode.programId !== programId) { | ||
throw new DubApiError({ | ||
message: `Discount code (${discountCodeId}) is not associated with the program.`, | ||
code: "bad_request", | ||
}); | ||
} | ||
|
||
await prisma.discountCode.update({ | ||
where: { | ||
id: discountCodeId, | ||
}, | ||
data: { | ||
discountId: null, | ||
}, | ||
}); | ||
|
||
waitUntil( | ||
Promise.allSettled([ | ||
recordAuditLog({ | ||
workspaceId: workspace.id, | ||
programId, | ||
action: "discount_code.deleted", | ||
description: `Discount code (${discountCode.code}) deleted`, | ||
actor: session.user, | ||
targets: [ | ||
{ | ||
type: "discount_code", | ||
id: discountCode.id, | ||
metadata: discountCode, | ||
}, | ||
], | ||
}), | ||
|
||
queueDiscountCodeDeletion(discountCode.id), | ||
]), | ||
); | ||
|
||
return NextResponse.json({ id: discountCode.id }); | ||
}, | ||
{ | ||
requiredPlan: [ | ||
"business", | ||
"business plus", | ||
"business extra", | ||
"business max", | ||
"advanced", | ||
"enterprise", | ||
], | ||
}, | ||
); |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.