From 39cd2dbafbf5089662b05b37247eda836250529f Mon Sep 17 00:00:00 2001 From: Morgan Dean Date: Thu, 3 Apr 2025 16:11:18 -0700 Subject: [PATCH 1/9] add wanring error if rewards could not be retrieved --- src/lib/api/endpoints/gym/quests.ts | 16 ++++++---------- src/routes/app/gym/chat/+page.svelte | 5 +++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/lib/api/endpoints/gym/quests.ts b/src/lib/api/endpoints/gym/quests.ts index 8eac6e2..93d5688 100644 --- a/src/lib/api/endpoints/gym/quests.ts +++ b/src/lib/api/endpoints/gym/quests.ts @@ -34,16 +34,12 @@ export async function generateQuest( // If poolId is provided, get reward info if (poolId) { - try { - const rewardInfo = await getReward(poolId, taskId); - quest.pool_id = poolId; - quest.reward = { time: rewardInfo.time, max_reward: rewardInfo.maxReward }; - // If taskId is provided, add it to the quest - if (taskId) { - quest.task_id = taskId; - } - } catch (error) { - console.error('Failed to get reward info:', error); + quest.pool_id = poolId; + const rewardInfo = await getReward(poolId, taskId); + quest.reward = { time: rewardInfo.time, max_reward: rewardInfo.maxReward }; + // If taskId is provided, add it to the quest + if (taskId) { + quest.task_id = taskId; } } diff --git a/src/routes/app/gym/chat/+page.svelte b/src/routes/app/gym/chat/+page.svelte index c0b92c7..faeecf0 100644 --- a/src/routes/app/gym/chat/+page.svelte +++ b/src/routes/app/gym/chat/+page.svelte @@ -252,6 +252,11 @@ max_reward: rewardInfo.maxReward }; } catch (error) { + await addMessage({ + role: 'assistant', + content: + 'Failed to get task reward info.\nWARNING: This quest will not provide rewards.' + }); console.error('Failed to get reward info:', error); } } From 32ce4a21717e4ecbd1af918f65e20a2ed858742b Mon Sep 17 00:00:00 2001 From: Morgan Dean Date: Sun, 13 Apr 2025 18:42:40 -0700 Subject: [PATCH 2/9] Adjust saving forge buttons, add email notification form. --- src/lib/api/endpoints/forge/pools.ts | 9 + src/lib/components/form/Button.svelte | 1 + src/lib/components/form/Input.svelte | 17 +- .../gym-builder/GymBuilderView.svelte | 32 +- .../components/gym-builder/OverviewTab.svelte | 157 +++++++--- .../components/gym-builder/SettingsTab.svelte | 42 +-- .../components/gym-builder/TasksTab.svelte | 225 +++++++------- .../components/gym-builder/UploadsTab.svelte | 277 ++++++++++-------- src/lib/types/forge.ts | 2 + src/routes/app/+layout.svelte | 3 + src/routes/app/forge/gym/+page.svelte | 8 +- src/routes/app/gym/+layout.svelte | 3 - 12 files changed, 437 insertions(+), 339 deletions(-) diff --git a/src/lib/api/endpoints/forge/pools.ts b/src/lib/api/endpoints/forge/pools.ts index 3bd2327..7252524 100644 --- a/src/lib/api/endpoints/forge/pools.ts +++ b/src/lib/api/endpoints/forge/pools.ts @@ -88,3 +88,12 @@ export async function createPoolWithApps( ): Promise { return apiClient.post('/forge/pools', input, { requiresAuth: true }); } + +/** + * Update a pool with an email address + * @param email The email address + * @returns Promise resolving to void + */ +export async function updatePoolEmail(poolID: string, email: string): Promise { + return apiClient.put('/forge/pools/email', { id: poolID, email }, { requiresAuth: true }); +} diff --git a/src/lib/components/form/Button.svelte b/src/lib/components/form/Button.svelte index c04ff3c..cc6cf07 100644 --- a/src/lib/components/form/Button.svelte +++ b/src/lib/components/form/Button.svelte @@ -9,6 +9,7 @@ children: Snippet; variant?: 'primary' | 'destroy' | 'warning' | 'secondary' | 'green'; behavior?: 'invert' | 'none'; + rest?: HTMLButtonAttributes; }; let { diff --git a/src/lib/components/form/Input.svelte b/src/lib/components/form/Input.svelte index e841b35..0fd65e5 100644 --- a/src/lib/components/form/Input.svelte +++ b/src/lib/components/form/Input.svelte @@ -35,15 +35,22 @@ }); -
-
- {@render icon?.()} +{#if icon} +
+
+ {@render icon?.()} +
+
+{:else} -
+{/if} diff --git a/src/lib/components/gym-builder/GymBuilderView.svelte b/src/lib/components/gym-builder/GymBuilderView.svelte index 0918df8..ab7a8e4 100644 --- a/src/lib/components/gym-builder/GymBuilderView.svelte +++ b/src/lib/components/gym-builder/GymBuilderView.svelte @@ -1,7 +1,7 @@
- -
-

{pool.name}

-
- - -
-
-
Total Demonstrations
-
{pool.demonstrations.toLocaleString()}
-
- -
-
Pool Balance
-
{formatNumber(pool.funds)} {pool.token.symbol}
+ +
+
+

{pool.name}

- -
-
Reward Per Demo
-
{pool.pricePerDemo || 1} {pool.token.symbol}
+ + +
+
+
Total Demonstrations
+
{pool.demonstrations.toLocaleString()}
+
+
+
Reward Per Demo
+
+ {pool.pricePerDemo || 1} + {pool.token.symbol} +
+
+ +
+
Pool Balance
+
+ {formatNumber(pool.funds)} + {pool.token.symbol} +
+
+
+
Gas Balance
+
+ {formatNumber(pool.solBalance)} + SOL +
+
- + -
+

Deposit Address

+
+
+

Notifications

+

Get an email when your gym runs out of $VIRAL or SOL for gas fees.

+
{ + e.preventDefault(); + if (loading) return; + saveEmail(); + }} + class="w-full flex gap-2"> + + +
+
+
- + {#if pool.status === TrainingPoolStatus.noGas || pool.status === TrainingPoolStatus.noFunds}
@@ -65,22 +147,21 @@
{#if pool.status === TrainingPoolStatus.noGas} -

- Insufficient SOL for Gas -

+

Insufficient SOL for Gas

- Your gym needs SOL to pay for on-chain transactions. Without gas, the gym cannot function on the Solana blockchain. + Your gym needs SOL to pay for on-chain transactions. Without gas, the gym cannot + function on the Solana blockchain.

{:else if pool.status === TrainingPoolStatus.noFunds} -

- Insufficient VIRAL Tokens -

+

Insufficient VIRAL Tokens

- Your gym needs VIRAL tokens to reward users who provide demonstrations. Without funds, users won't receive compensation. + Your gym needs VIRAL tokens to reward users who provide demonstrations. Without funds, + users won't receive compensation.

{/if}

- Deposit {pool.status === TrainingPoolStatus.noGas ? 'SOL' : 'VIRAL'} to the address above to activate your gym and start collecting data. + Deposit {pool.status === TrainingPoolStatus.noGas ? 'SOL' : 'VIRAL'} to the address above to + activate your gym and start collecting data.

diff --git a/src/lib/components/gym-builder/SettingsTab.svelte b/src/lib/components/gym-builder/SettingsTab.svelte index 972b12b..1b6178b 100644 --- a/src/lib/components/gym-builder/SettingsTab.svelte +++ b/src/lib/components/gym-builder/SettingsTab.svelte @@ -16,11 +16,9 @@ unsavedName?: boolean; unsavedUploadLimit?: boolean; }; - export let onSave: (pool: TrainingPool, updates: any) => Promise; export let onRefresh: (poolId: string) => Promise; export let refreshingPools: Set; export let unsavedChanges: boolean; - export let handleSaveChanges: () => Promise; // Upload limit stats let currentCount = 0; @@ -268,15 +266,16 @@ Price per Demonstration
- - {pool.token.symbol} + {pool.token.symbol}

Minimum price: 1 {pool.token.symbol} @@ -487,37 +486,4 @@

- -
- {#if unsavedChanges} - - {/if} - - -
diff --git a/src/lib/components/gym-builder/TasksTab.svelte b/src/lib/components/gym-builder/TasksTab.svelte index 4f9add3..ea4edee 100644 --- a/src/lib/components/gym-builder/TasksTab.svelte +++ b/src/lib/components/gym-builder/TasksTab.svelte @@ -1,24 +1,24 @@ {#if $walletAddress} @@ -84,6 +95,17 @@ Wallet {$walletAddress.slice(0, 4)}...{$walletAddress.slice(-4)}
+ +
+ Nickname + +
@@ -166,3 +188,5 @@ {/if} {/if} + + diff --git a/src/lib/components/gym-builder/UploadsTab.svelte b/src/lib/components/gym-builder/UploadsTab.svelte index d7da20d..3178dcd 100644 --- a/src/lib/components/gym-builder/UploadsTab.svelte +++ b/src/lib/components/gym-builder/UploadsTab.svelte @@ -1,7 +1,17 @@ + +{#if open} +
+
+

Set Nickname

+

+ Set your nickname to be displayed on the demonstrator leaderboard. +

+

Maximum length of 25 characters. Make it memorable!

+ +
+ + +
+
+
+{/if} diff --git a/src/lib/stores/wallet.ts b/src/lib/stores/wallet.ts index d15624e..5e8ae75 100644 --- a/src/lib/stores/wallet.ts +++ b/src/lib/stores/wallet.ts @@ -10,6 +10,7 @@ const storedToken = typeof localStorage !== 'undefined' ? localStorage.getItem('connectionToken') : null; export const walletAddress = writable(storedAddress); +export const nickname = writable(''); export const connectionToken = writable(storedToken); export const isConnecting = writable(false); diff --git a/src/routes/app/+layout.svelte b/src/routes/app/+layout.svelte index 3636940..5536303 100644 --- a/src/routes/app/+layout.svelte +++ b/src/routes/app/+layout.svelte @@ -128,7 +128,7 @@ retry={async () => { invoke('init_tools'); }} - open={showInitToolsError} /> + bind:open={showInitToolsError} />