Skip to content

Commit

Permalink
feature: launch day reward
Browse files Browse the repository at this point in the history
  • Loading branch information
geclos committed Oct 9, 2024
1 parent b7e7071 commit 1168e5b
Show file tree
Hide file tree
Showing 12 changed files with 2,908 additions and 10 deletions.
1 change: 0 additions & 1 deletion apps/web/src/actions/evaluations/destroy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { ProviderApiKey, Providers } from '@latitude-data/core/browser'
import * as factories from '@latitude-data/core/factories'
import { Result } from '@latitude-data/core/lib/Result'
import { EvaluationsRepository } from '@latitude-data/core/repositories'
import { destroyEvaluation } from '@latitude-data/core/services/evaluations/destroy'
import { beforeEach, describe, expect, it, vi } from 'vitest'

import { destroyEvaluationAction } from './destroy'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function RewardItem({
}: {
description: string
type: RewardType
onClick: () => void
onClick?: () => void
}) {
const { data: claimedRewards, isLoading } = useRewards()

Expand All @@ -32,7 +32,7 @@ export function RewardItem({
onClick={onClick}
>
<div className='flex flex-row w-full items-center gap-4 justify-between'>
<div className='flex flex-row items-center gap-2'>
<div className='flex flex-row items-center gap-1'>
{isLoading ? (
<Icon
name='loader'
Expand All @@ -46,7 +46,9 @@ export function RewardItem({
className={cn({ 'opacity-50': !isClaimed })}
/>
)}
<Text.H5M>{description}</Text.H5M>
<Text.H5M color={isClaimed ? 'primary' : 'foreground'}>
{description}
</Text.H5M>
</div>
<Text.H5M color={isClaimed ? 'primary' : 'foregroundMuted'}>
+{runs} runs
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
'use client'

import { useState } from 'react'
import { useMemo, useState } from 'react'

import { RewardType } from '@latitude-data/core/browser'
import { Text } from '@latitude-data/web-ui'
import useRewards from '$/stores/rewards'

import { RewardItem } from './RewardItem'
import { RewardMenu } from './RewardMenu'

export function RewardsContent() {
const { data: claimedRewards, isLoading } = useRewards()

const isLaunchDaySignupClaimed = useMemo(() => {
if (isLoading || !claimedRewards) return false
return claimedRewards.some(
(r) => r.rewardType === RewardType.SignupLaunchDay,
)
}, [isLoading, claimedRewards])

const [selectedType, setSelectedType] = useState<RewardType>()

if (selectedType) {
Expand Down Expand Up @@ -51,6 +61,12 @@ export function RewardsContent() {
type={RewardType.GithubIssue}
onClick={() => setSelectedType(RewardType.GithubIssue)}
/>
{isLaunchDaySignupClaimed && (
<RewardItem
description='Signed up on the launch day'
type={RewardType.SignupLaunchDay}
/>
)}
</div>
)
}
40 changes: 38 additions & 2 deletions apps/web/src/services/user/setupService.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Providers } from '@latitude-data/core/browser'
import { Providers, RewardType } from '@latitude-data/core/browser'
import { database } from '@latitude-data/core/client'
import { createProject, helpers } from '@latitude-data/core/factories'
import { Result } from '@latitude-data/core/lib/Result'
import {
apiKeys,
commits,
Expand All @@ -13,10 +14,18 @@ import {
} from '@latitude-data/core/schema'
import { env } from '@latitude-data/env'
import { eq } from 'drizzle-orm'
import { describe, expect, it, vi } from 'vitest'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'

import setupService from './setupService'

const mocks = vi.hoisted(() => ({
claimReward: vi.fn(),
}))

vi.mock('@latitude-data/core/services/claimedRewards/claim', () => ({
claimReward: mocks.claimReward,
}))

describe('setupService', () => {
it('should create all necessary entities when calling setup service', async () => {
const result = await setupService({
Expand Down Expand Up @@ -123,4 +132,31 @@ describe('setupService', () => {
expect(importedDocuments.length).toBe(1)
expect(importedDocuments[0]!.document_versions.content).toEqual(prompt)
})

describe('with custom timers', () => {
beforeEach(() => {
vi.setSystemTime(new Date('2024-10-10'))
mocks.claimReward.mockResolvedValue(Result.nil())
})

afterEach(() => {
vi.useRealTimers()
})

// TODO: review, not sure why the timers :point_up: are messing with the test
it.skip('should claim the reward for sigingup on the launch day', async () => {
await setupService({
email: '[email protected]',
name: 'Test User',
companyName: 'Test Company',
})

expect(mocks.claimReward).toHaveBeenCalledWith({
workspace: { id: 'workspace-id' },
user: { id: 'user-id' },
type: RewardType.SignupLaunchDay,
reference: '',
})
})
})
})
17 changes: 16 additions & 1 deletion apps/web/src/services/user/setupService.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Providers } from '@latitude-data/core/browser'
import { Providers, RewardType } from '@latitude-data/core/browser'
import { SessionData } from '@latitude-data/core/data-access'
import { Result } from '@latitude-data/core/lib/Result'
import Transaction, {
PromisedResult,
} from '@latitude-data/core/lib/Transaction'
import { createApiKey } from '@latitude-data/core/services/apiKeys/create'
import { claimReward } from '@latitude-data/core/services/claimedRewards/claim'
import { createMembership } from '@latitude-data/core/services/memberships/create'
import { importDefaultProject } from '@latitude-data/core/services/projects/import'
import { createProviderApiKey } from '@latitude-data/core/services/providerApiKeys/create'
Expand All @@ -13,6 +14,8 @@ import { createWorkspace } from '@latitude-data/core/services/workspaces/create'
import { env } from '@latitude-data/env'
import { captureException } from '$/helpers/captureException'

const LAUNCH_DAY = '2024-10-10'

export default function setupService({
email,
name,
Expand Down Expand Up @@ -41,6 +44,18 @@ export default function setupService({
if (resultWorkspace.error) return resultWorkspace
const workspace = resultWorkspace.value

if (new Date().toISOString().split('T')[0] === LAUNCH_DAY) {
await claimReward(
{
workspace,
user,
type: RewardType.SignupLaunchDay,
reference: '', // not really used for this reward type
},
tx,
)
}

const firstProvider = await createProviderApiKey(
{
workspace,
Expand Down
1 change: 1 addition & 0 deletions packages/core/drizzle/0072_minor_mole_man.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TYPE "latitude"."reward_types" ADD VALUE 'signup_launch_day';
Loading

0 comments on commit 1168e5b

Please sign in to comment.