|
|
@@ -2,6 +2,7 @@ import { action, json, query, useAction, useSubmission } from "@solidjs/router"
|
|
|
import { createEffect, createMemo, createSignal, For, onCleanup, Show } from "solid-js"
|
|
|
import { getRequestEvent } from "solid-js/web"
|
|
|
import { Referral } from "@opencode-ai/console-core/referral.js"
|
|
|
+import { Actor } from "@opencode-ai/console-core/actor.js"
|
|
|
import { withActor } from "~/context/auth.withActor"
|
|
|
import { Modal } from "~/component/modal"
|
|
|
import { IconCheck, IconCopy } from "~/component/icon"
|
|
|
@@ -9,6 +10,7 @@ import { useI18n } from "~/context/i18n"
|
|
|
import { useLanguage } from "~/context/language"
|
|
|
import { formatResetTime, liteResetTimeKeys } from "~/lib/format-reset-time"
|
|
|
import { queryLiteSubscription } from "~/routes/workspace/[id]/go/lite-section"
|
|
|
+import { clearReferralCookie, referralCodeFromCookieHeader } from "~/lib/referral-invite"
|
|
|
import "./go-referral.css"
|
|
|
|
|
|
type GoReferralSummary = Awaited<ReturnType<typeof Referral.summary>>
|
|
|
@@ -25,7 +27,21 @@ const emptyUsagePreview = {
|
|
|
|
|
|
export const queryGoReferral = query(async (workspaceID: string) => {
|
|
|
"use server"
|
|
|
- return withActor(() => Referral.summary(), workspaceID)
|
|
|
+ return withActor(async () => {
|
|
|
+ const event = getRequestEvent()
|
|
|
+ const referralCode = referralCodeFromCookieHeader(event?.request.headers.get("cookie") ?? null)
|
|
|
+ if (referralCode) {
|
|
|
+ await Referral.createFromAccount({
|
|
|
+ accountID: Actor.account(),
|
|
|
+ referralCode,
|
|
|
+ }).catch((error) => {
|
|
|
+ console.error("Referral create failed", error)
|
|
|
+ })
|
|
|
+ event?.response.headers.append("set-cookie", clearReferralCookie())
|
|
|
+ }
|
|
|
+
|
|
|
+ return Referral.summary()
|
|
|
+ }, workspaceID)
|
|
|
}, "go.referral.get")
|
|
|
|
|
|
export const queryGoReferralUsagePreview = query(async (workspaceID: string, referralID?: string) => {
|
|
|
@@ -65,6 +81,7 @@ function rewardDescriptionKey(source: GoReferralReward["source"]) {
|
|
|
|
|
|
function rewardActionKey(reward: GoReferralReward, hasActiveGo: boolean) {
|
|
|
if (reward.status === "applied") return "workspace.referral.reward.action.applied" as const
|
|
|
+ if (reward.status === "pending" && reward.source === "inviter") return "workspace.referral.reward.source.pendingInviter" as const
|
|
|
if (reward.status === "pending" || !hasActiveGo) return "workspace.referral.reward.action.subscribeUnlock" as const
|
|
|
return "workspace.referral.reward.action.view" as const
|
|
|
}
|