diff --git a/src/components/JamLanding.tsx b/src/components/JamLanding.tsx index 936ca33c..86df869f 100644 --- a/src/components/JamLanding.tsx +++ b/src/components/JamLanding.tsx @@ -1,10 +1,10 @@ import { InfoIcon, Loader2Icon, RefreshCwIcon } from 'lucide-react' import { useTranslation } from 'react-i18next' -import { Jar } from '@/components/layout/Jar' import { useJamDisplayContext } from '@/components/layout/display-mode-context' import { Alert, AlertDescription } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' +import { Jar } from '@/components/ui/jam/Jar' import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import type { WalletFileName } from '@/lib/utils' import { walletDisplayName } from '@/lib/utils' diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index a9c9b1e4..db77398c 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -9,7 +9,7 @@ import { routes } from '@/constants/routes' import { cn } from '@/lib/utils' import { authStore } from '@/store/authStore' import { jmSessionStore } from '@/store/jmSessionStore' -import { DevBadge } from './ui/DevBadge' +import { DevBadge } from './dev/DevBadge' import { Skeleton } from './ui/skeleton' interface NavbarProps { diff --git a/src/components/Orderbook.tsx b/src/components/Orderbook.tsx index 70af0f41..45905221 100644 --- a/src/components/Orderbook.tsx +++ b/src/components/Orderbook.tsx @@ -14,10 +14,10 @@ import { import { ChevronDownIcon, ChevronUpIcon, RefreshCwIcon, ArrowUpDownIcon, PlusIcon, AlertCircleIcon } from 'lucide-react' import { useTranslation } from 'react-i18next' import { useStore } from 'zustand' -import { Balance } from '@/components/ui/Balance' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' +import { Balance } from '@/components/ui/jam/Balance' import { Pagination } from '@/components/ui/pagination' import { Switch } from '@/components/ui/switch' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' @@ -36,7 +36,7 @@ import { } from '@/lib/utils' import { jamSettingsStore } from '@/store/jamSettingsStore' import { jmSessionStore } from '@/store/jmSessionStore' -import { DevBadge } from './ui/DevBadge' +import { DevBadge } from './dev/DevBadge' import { Alert, AlertDescription } from './ui/alert' const ITEMS_PER_PAGE = 25 diff --git a/src/components/ui/DevBadge.tsx b/src/components/dev/DevBadge.tsx similarity index 84% rename from src/components/ui/DevBadge.tsx rename to src/components/dev/DevBadge.tsx index 411db0c8..ac425213 100644 --- a/src/components/ui/DevBadge.tsx +++ b/src/components/dev/DevBadge.tsx @@ -1,5 +1,5 @@ import { cn } from '@/lib/utils' -import { Badge } from './badge' +import { Badge } from '../ui/badge' export const DevBadge = ({ className }: { className?: string }) => { return ( diff --git a/src/components/dev/FeeConfigTestComponent.tsx b/src/components/dev/FeeConfigTestComponent.tsx index 162df57e..d7a0b4db 100644 --- a/src/components/dev/FeeConfigTestComponent.tsx +++ b/src/components/dev/FeeConfigTestComponent.tsx @@ -1,8 +1,8 @@ import { useState } from 'react' import { FeeLimitDialog } from '@/components/settings/FeeLimitDialog' -import { FeeConfigErrorAlert } from '@/components/ui/FeeConfigErrorAlert' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { FeeConfigErrorAlert } from '@/components/ui/jam/FeeConfigErrorAlert' import type { WalletFileName } from '@/lib/utils' interface FeeConfigTestComponentProps { diff --git a/src/components/earn/EarnPage.tsx b/src/components/earn/EarnPage.tsx index e33483c7..7857bdbb 100644 --- a/src/components/earn/EarnPage.tsx +++ b/src/components/earn/EarnPage.tsx @@ -8,8 +8,8 @@ import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { useStore } from 'zustand' import { FeeLimitDialog } from '@/components/settings/FeeLimitDialog' -import { FeeConfigErrorAlert } from '@/components/ui/FeeConfigErrorAlert' import { Button } from '@/components/ui/button' +import { FeeConfigErrorAlert } from '@/components/ui/jam/FeeConfigErrorAlert' import { useApiClient } from '@/hooks/useApiClient' import { useFeeConfigValidation } from '@/hooks/useFeeConfigValidation' import { useRefreshSession } from '@/hooks/useRefreshSession' diff --git a/src/components/layout/display-mode-context.ts b/src/components/layout/display-mode-context.ts index 3932f7c7..b0889ea9 100644 --- a/src/components/layout/display-mode-context.ts +++ b/src/components/layout/display-mode-context.ts @@ -5,10 +5,14 @@ import type { AmountSats, Currency } from '@/types/global' export type JarColor = '#e2b86a' | '#3b5ba9' | '#c94f7c' | '#a67c52' | '#7c3fa6' -export const jarTemplates: Array<{ +export type Jar = { name: string color: JarColor -}> = [ + balance: AmountSats + account: string +} + +export const jarTemplates: Array> = [ { name: 'Apricot', color: '#e2b86a' }, { name: 'Blueberry', color: '#3b5ba9' }, { name: 'Cherry', color: '#c94f7c' }, @@ -16,11 +20,6 @@ export const jarTemplates: Array<{ { name: 'Elderberry', color: '#7c3fa6' }, ] -export type Jar = Pick<(typeof jarTemplates)[number], 'name' | 'color'> & { - balance: AmountSats - account: string -} - export interface DisplayModeContextType { currency: Currency isPrivate: boolean diff --git a/src/components/receive/Receive.tsx b/src/components/receive/Receive.tsx index befc6dd3..f910b66c 100644 --- a/src/components/receive/Receive.tsx +++ b/src/components/receive/Receive.tsx @@ -8,9 +8,9 @@ import { useApiClient } from '@/hooks/useApiClient' import { btcToSats, cn, satsToBtc, type WalletFileName } from '@/lib/utils' import type { AmountSats, BitcoinAddress } from '@/types/global' import { useJamDisplayContext } from '../layout/display-mode-context' -import { SelectableJar } from '../ui/SelectableJar' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../ui/accordion' import { Button } from '../ui/button' +import { SelectableJar } from '../ui/jam/SelectableJar' import { Skeleton } from '../ui/skeleton' import { BitcoinAmountInput } from './BitcoinAmountInput' import { BitcoinQR } from './BitcoinQR' diff --git a/src/components/send/SendPage.tsx b/src/components/send/SendPage.tsx index f4056977..538e4c21 100644 --- a/src/components/send/SendPage.tsx +++ b/src/components/send/SendPage.tsx @@ -2,8 +2,8 @@ import { useState } from 'react' import { AlertTriangleIcon, Loader2Icon } from 'lucide-react' import { useTranslation } from 'react-i18next' import { FeeLimitDialog } from '@/components/settings/FeeLimitDialog' -import { FeeConfigErrorAlert } from '@/components/ui/FeeConfigErrorAlert' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { FeeConfigErrorAlert } from '@/components/ui/jam/FeeConfigErrorAlert' import { useFeeConfigValidation } from '@/hooks/useFeeConfigValidation' import type { WalletFileName } from '@/lib/utils' import { Alert, AlertDescription, AlertTitle } from '../ui/alert' diff --git a/src/components/settings/FeeLimitDialog.tsx b/src/components/settings/FeeLimitDialog.tsx index 5b9e36d4..debd8332 100644 --- a/src/components/settings/FeeLimitDialog.tsx +++ b/src/components/settings/FeeLimitDialog.tsx @@ -22,7 +22,7 @@ import { useFeeConfigValidation } from '@/hooks/useFeeConfigValidation' import { factorToPercentage } from '@/lib/utils' import type { WalletFileName } from '@/lib/utils' import { jamSettingsStore } from '@/store/jamSettingsStore' -import { DevBadge } from '../ui/DevBadge' +import { DevBadge } from '../dev/DevBadge' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../ui/accordion' import { CollaboratorFeesForm, type CollaboratorFeesFormRef } from './CollaboratorFeesForm' import { MiningFeesForm, type MiningFeesFormRef } from './MiningFeesForm' diff --git a/src/components/ui/Balance.tsx b/src/components/ui/jam/Balance.tsx similarity index 100% rename from src/components/ui/Balance.tsx rename to src/components/ui/jam/Balance.tsx diff --git a/src/components/ui/FeeConfigErrorAlert.tsx b/src/components/ui/jam/FeeConfigErrorAlert.tsx similarity index 100% rename from src/components/ui/FeeConfigErrorAlert.tsx rename to src/components/ui/jam/FeeConfigErrorAlert.tsx diff --git a/src/components/layout/Jar.tsx b/src/components/ui/jam/Jar.tsx similarity index 77% rename from src/components/layout/Jar.tsx rename to src/components/ui/jam/Jar.tsx index 44940540..f5b7fd8f 100644 --- a/src/components/layout/Jar.tsx +++ b/src/components/ui/jam/Jar.tsx @@ -1,12 +1,14 @@ -import { JarIcon } from '../ui/JarIcon' +import type { AmountSats } from '@/types/global' +import type { JarColor } from '../../layout/display-mode-context' +import { JarIcon } from './JarIcon' interface JarProps { name: string - amount: number - color: '#e2b86a' | '#3b5ba9' | '#c94f7c' | '#a67c52' | '#7c3fa6' + amount: AmountSats + color: JarColor formatAmount: (amount: number) => string currencySymbol: (size: 'sm' | 'lg') => React.ReactNode - totalBalance?: number + totalBalance?: AmountSats } export function Jar({ name, amount, color, currencySymbol, formatAmount, totalBalance = 0 }: JarProps) { diff --git a/src/components/ui/JarIcon.tsx b/src/components/ui/jam/JarIcon.tsx similarity index 81% rename from src/components/ui/JarIcon.tsx rename to src/components/ui/jam/JarIcon.tsx index 2b8bdf74..367a83cf 100644 --- a/src/components/ui/JarIcon.tsx +++ b/src/components/ui/jam/JarIcon.tsx @@ -1,6 +1,6 @@ -import type { ReactNode } from 'react' import { useState } from 'react' import { cn } from '@/lib/utils' +import type { AmountSats } from '@/types/global' const calculateJarFillLevel = (jarBalance: number, totalBalance: number): JarFillLevel => { if (totalBalance === 0) return 0 @@ -27,13 +27,12 @@ const fillLevelToPercent = (fillLevel: JarFillLevel): number => { interface JarIconProps { color?: string - amount?: number + amount?: AmountSats totalBalance?: number width?: number height?: number isSelected?: boolean className?: string - children?: ReactNode } export function JarIcon({ @@ -59,8 +58,8 @@ export function JarIcon({ onMouseLeave={() => setIsHovered(false)} > {/* Jar body */} -
-
+
+
{/* Fill */}
{/* Jar neck */} -
+
{/* Jar lid */}
= { diff --git a/src/stories/SelectableJar.stories.tsx b/src/stories/SelectableJar.stories.tsx index f74fd044..228456ab 100644 --- a/src/stories/SelectableJar.stories.tsx +++ b/src/stories/SelectableJar.stories.tsx @@ -1,6 +1,6 @@ import React from 'react' import type { Meta, StoryObj } from '@storybook/react-vite' -import { SelectableJar } from '../components/ui/SelectableJar' +import { SelectableJar } from '../components/ui/jam/SelectableJar' const meta = { title: 'Components/SelectableJar',