diff --git a/.mise.toml b/.mise.toml index 7d4afb460..f1755ec6d 100644 --- a/.mise.toml +++ b/.mise.toml @@ -38,11 +38,19 @@ run = "yarn clean-all" [tasks.ops] description = "Start ops frontend development server" -run = "cd apps/private/ops && yarn start" +run = "yarn start ops" [tasks.ops-minikube] description = "Start ops frontend connected to minikube" -run = "cd apps/private/ops && yarn start:minikube" +run = "VITE_PROXY_TARGET=http://app.minikube.local yarn start ops" + +[tasks.site] +description = "Start CN2 frontend connected to minikube" +run = "yarn start site" + +[tasks.site-minikube] +description = "Start CN2 frontend connected to minikube" +run = "VITE_PROXY_TARGET=http://app.minikube.local yarn start site" [tasks.gql-codegen] description = "Generate GraphQL code" diff --git a/package.json b/package.json index 8408d55cb..a854f268b 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "lint:fix": "turbo run lint:fix", "package:checks": "turbo run package:checks", "release": "turbo build && changeset publish", + "start:minikube": "VITE_PROXY_TARGET=http://app.minikube.local yarn start", "start:prod": "VITE_PROXY_TARGET=https://app.lightspark.com yarn start", "preview": "turbo run preview", "start": "./start.sh", diff --git a/packages/core/src/utils/currency.ts b/packages/core/src/utils/currency.ts index 12e3c88f5..b7f668493 100644 --- a/packages/core/src/utils/currency.ts +++ b/packages/core/src/utils/currency.ts @@ -33,6 +33,12 @@ export const CurrencyUnit = { SGD: "SGD", THB: "THB", VND: "VND", + NGN: "NGN", + ZAR: "ZAR", + KES: "KES", + TZS: "TZS", + UGX: "UGX", + BWP: "BWP", USDT: "USDT", Bitcoin: "BITCOIN", @@ -88,6 +94,12 @@ const standardUnitConversionObj = { [CurrencyUnit.SGD]: (v: number) => v, [CurrencyUnit.THB]: (v: number) => v, [CurrencyUnit.VND]: (v: number) => v, + [CurrencyUnit.NGN]: (v: number) => v, + [CurrencyUnit.ZAR]: (v: number) => v, + [CurrencyUnit.KES]: (v: number) => v, + [CurrencyUnit.TZS]: (v: number) => v, + [CurrencyUnit.UGX]: (v: number) => v, + [CurrencyUnit.BWP]: (v: number) => v, [CurrencyUnit.USDT]: (v: number) => v, }; @@ -128,6 +140,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toBitcoinConversion, [CurrencyUnit.THB]: toBitcoinConversion, [CurrencyUnit.VND]: toBitcoinConversion, + [CurrencyUnit.NGN]: toBitcoinConversion, + [CurrencyUnit.ZAR]: toBitcoinConversion, + [CurrencyUnit.KES]: toBitcoinConversion, + [CurrencyUnit.TZS]: toBitcoinConversion, + [CurrencyUnit.UGX]: toBitcoinConversion, + [CurrencyUnit.BWP]: toBitcoinConversion, [CurrencyUnit.USDT]: toBitcoinConversion, }, [CurrencyUnit.MICROBITCOIN]: { @@ -152,6 +170,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toMicrobitcoinConversion, [CurrencyUnit.THB]: toMicrobitcoinConversion, [CurrencyUnit.VND]: toMicrobitcoinConversion, + [CurrencyUnit.NGN]: toMicrobitcoinConversion, + [CurrencyUnit.ZAR]: toMicrobitcoinConversion, + [CurrencyUnit.KES]: toMicrobitcoinConversion, + [CurrencyUnit.TZS]: toMicrobitcoinConversion, + [CurrencyUnit.UGX]: toMicrobitcoinConversion, + [CurrencyUnit.BWP]: toMicrobitcoinConversion, [CurrencyUnit.USDT]: toMicrobitcoinConversion, }, [CurrencyUnit.MILLIBITCOIN]: { @@ -176,6 +200,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toMillibitcoinConversion, [CurrencyUnit.THB]: toMillibitcoinConversion, [CurrencyUnit.VND]: toMillibitcoinConversion, + [CurrencyUnit.NGN]: toMillibitcoinConversion, + [CurrencyUnit.ZAR]: toMillibitcoinConversion, + [CurrencyUnit.KES]: toMillibitcoinConversion, + [CurrencyUnit.TZS]: toMillibitcoinConversion, + [CurrencyUnit.UGX]: toMillibitcoinConversion, + [CurrencyUnit.BWP]: toMillibitcoinConversion, [CurrencyUnit.USDT]: toMillibitcoinConversion, }, [CurrencyUnit.MILLISATOSHI]: { @@ -200,6 +230,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toMillisatoshiConversion, [CurrencyUnit.THB]: toMillisatoshiConversion, [CurrencyUnit.VND]: toMillisatoshiConversion, + [CurrencyUnit.NGN]: toMillisatoshiConversion, + [CurrencyUnit.ZAR]: toMillisatoshiConversion, + [CurrencyUnit.KES]: toMillisatoshiConversion, + [CurrencyUnit.TZS]: toMillisatoshiConversion, + [CurrencyUnit.UGX]: toMillisatoshiConversion, + [CurrencyUnit.BWP]: toMillisatoshiConversion, [CurrencyUnit.USDT]: toMillisatoshiConversion, }, [CurrencyUnit.NANOBITCOIN]: { @@ -224,6 +260,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toNanobitcoinConversion, [CurrencyUnit.THB]: toNanobitcoinConversion, [CurrencyUnit.VND]: toNanobitcoinConversion, + [CurrencyUnit.NGN]: toNanobitcoinConversion, + [CurrencyUnit.ZAR]: toNanobitcoinConversion, + [CurrencyUnit.KES]: toNanobitcoinConversion, + [CurrencyUnit.TZS]: toNanobitcoinConversion, + [CurrencyUnit.UGX]: toNanobitcoinConversion, + [CurrencyUnit.BWP]: toNanobitcoinConversion, [CurrencyUnit.USDT]: toNanobitcoinConversion, }, [CurrencyUnit.SATOSHI]: { @@ -248,6 +290,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: toSatoshiConversion, [CurrencyUnit.THB]: toSatoshiConversion, [CurrencyUnit.VND]: toSatoshiConversion, + [CurrencyUnit.NGN]: toSatoshiConversion, + [CurrencyUnit.ZAR]: toSatoshiConversion, + [CurrencyUnit.KES]: toSatoshiConversion, + [CurrencyUnit.TZS]: toSatoshiConversion, + [CurrencyUnit.UGX]: toSatoshiConversion, + [CurrencyUnit.BWP]: toSatoshiConversion, [CurrencyUnit.USDT]: toSatoshiConversion, }, [CurrencyUnit.USD]: standardUnitConversionObj, @@ -265,6 +313,12 @@ const CONVERSION_MAP = { [CurrencyUnit.SGD]: standardUnitConversionObj, [CurrencyUnit.THB]: standardUnitConversionObj, [CurrencyUnit.VND]: standardUnitConversionObj, + [CurrencyUnit.NGN]: standardUnitConversionObj, + [CurrencyUnit.ZAR]: standardUnitConversionObj, + [CurrencyUnit.KES]: standardUnitConversionObj, + [CurrencyUnit.TZS]: standardUnitConversionObj, + [CurrencyUnit.UGX]: standardUnitConversionObj, + [CurrencyUnit.BWP]: standardUnitConversionObj, [CurrencyUnit.USDT]: standardUnitConversionObj, }; @@ -342,6 +396,12 @@ export type CurrencyMap = { [CurrencyUnit.SGD]: number; [CurrencyUnit.THB]: number; [CurrencyUnit.VND]: number; + [CurrencyUnit.NGN]: number; + [CurrencyUnit.ZAR]: number; + [CurrencyUnit.KES]: number; + [CurrencyUnit.TZS]: number; + [CurrencyUnit.UGX]: number; + [CurrencyUnit.BWP]: number; [CurrencyUnit.USDT]: number; [CurrencyUnit.FUTURE_VALUE]: number; formatted: { @@ -369,6 +429,12 @@ export type CurrencyMap = { [CurrencyUnit.SGD]: string; [CurrencyUnit.THB]: string; [CurrencyUnit.VND]: string; + [CurrencyUnit.NGN]: string; + [CurrencyUnit.ZAR]: string; + [CurrencyUnit.KES]: string; + [CurrencyUnit.TZS]: string; + [CurrencyUnit.UGX]: string; + [CurrencyUnit.BWP]: string; [CurrencyUnit.USDT]: string; [CurrencyUnit.FUTURE_VALUE]: string; }; @@ -577,6 +643,12 @@ function convertCurrencyAmountValues( sgd: CurrencyUnit.SGD, thb: CurrencyUnit.THB, vnd: CurrencyUnit.VND, + ngn: CurrencyUnit.NGN, + zar: CurrencyUnit.ZAR, + kes: CurrencyUnit.KES, + tzs: CurrencyUnit.TZS, + ugx: CurrencyUnit.UGX, + bwp: CurrencyUnit.BWP, mibtc: CurrencyUnit.MICROBITCOIN, mlbtc: CurrencyUnit.MILLIBITCOIN, nbtc: CurrencyUnit.NANOBITCOIN, @@ -649,6 +721,12 @@ export function mapCurrencyAmount( sgd, thb, vnd, + ngn, + zar, + kes, + tzs, + ugx, + bwp, usdt, } = convertCurrencyAmountValues(unit, value, unitsPerBtc, conversionOverride); @@ -671,6 +749,12 @@ export function mapCurrencyAmount( [CurrencyUnit.SGD]: sgd, [CurrencyUnit.THB]: thb, [CurrencyUnit.VND]: vnd, + [CurrencyUnit.NGN]: ngn, + [CurrencyUnit.ZAR]: zar, + [CurrencyUnit.KES]: kes, + [CurrencyUnit.TZS]: tzs, + [CurrencyUnit.UGX]: ugx, + [CurrencyUnit.BWP]: bwp, [CurrencyUnit.MICROBITCOIN]: mibtc, [CurrencyUnit.MILLIBITCOIN]: mlbtc, [CurrencyUnit.NANOBITCOIN]: nbtc, @@ -761,6 +845,30 @@ export function mapCurrencyAmount( value: vnd, unit: CurrencyUnit.VND, }), + [CurrencyUnit.NGN]: formatCurrencyStr({ + value: ngn, + unit: CurrencyUnit.NGN, + }), + [CurrencyUnit.ZAR]: formatCurrencyStr({ + value: zar, + unit: CurrencyUnit.ZAR, + }), + [CurrencyUnit.KES]: formatCurrencyStr({ + value: kes, + unit: CurrencyUnit.KES, + }), + [CurrencyUnit.TZS]: formatCurrencyStr({ + value: tzs, + unit: CurrencyUnit.TZS, + }), + [CurrencyUnit.UGX]: formatCurrencyStr({ + value: ugx, + unit: CurrencyUnit.UGX, + }), + [CurrencyUnit.BWP]: formatCurrencyStr({ + value: bwp, + unit: CurrencyUnit.BWP, + }), [CurrencyUnit.USDT]: formatCurrencyStr({ value: usdt, unit: CurrencyUnit.USDT, @@ -865,6 +973,18 @@ export const abbrCurrencyUnit = (unit: CurrencyUnitType) => { return "THB"; case CurrencyUnit.VND: return "VND"; + case CurrencyUnit.NGN: + return "NGN"; + case CurrencyUnit.ZAR: + return "ZAR"; + case CurrencyUnit.KES: + return "KES"; + case CurrencyUnit.TZS: + return "TZS"; + case CurrencyUnit.UGX: + return "UGX"; + case CurrencyUnit.BWP: + return "BWP"; } return "Unsupported CurrencyUnit"; }; @@ -921,6 +1041,13 @@ export function formatCurrencyStr( CurrencyUnit.EUR, CurrencyUnit.GBP, CurrencyUnit.INR, + CurrencyUnit.BRL, + CurrencyUnit.NGN, + CurrencyUnit.ZAR, + CurrencyUnit.KES, + CurrencyUnit.TZS, + CurrencyUnit.UGX, + CurrencyUnit.BWP, ] as string[]; /* centCurrencies are always provided in the smallest unit, e.g. cents for USD. These should be * divided by 100 for proper display format: */ diff --git a/packages/ui/src/components/Table/Table.tsx b/packages/ui/src/components/Table/Table.tsx index 441b8c60a..436218a7d 100644 --- a/packages/ui/src/components/Table/Table.tsx +++ b/packages/ui/src/components/Table/Table.tsx @@ -117,7 +117,7 @@ export type TableProps> = { loading?: boolean; onClickRow?: ( row: Row, - ) => { link?: string; to?: NewRoutesType; params: RouteParams } | void; + ) => { link?: string; to?: NewRoutesType; params?: RouteParams } | void; emptyState?: ReactNode; clipboardCallbacks?: Parameters[0] | undefined; rowHoverEffect?: "border" | "background" | "none" | undefined; diff --git a/packages/ui/src/components/TextInput.tsx b/packages/ui/src/components/TextInput.tsx index 2faa10d8e..9e5eadbb9 100644 --- a/packages/ui/src/components/TextInput.tsx +++ b/packages/ui/src/components/TextInput.tsx @@ -161,6 +161,7 @@ export type TextInputProps = { width?: "full" | "short" | undefined; paddingX?: number; paddingY?: number; + subTextPaddingX?: number | undefined; marginTop?: number | undefined; // Outline that appears outside/offset when the input is focused activeOutline?: boolean; @@ -425,6 +426,7 @@ export function TextInput(textInputProps: TextInputProps) { tooltipId={hintTooltipId} hideNonErrorsIfBlurred={props.hideNonErrorsIfBlurred} focused={focused} + subTextPaddingX={props.subTextPaddingX} /> {props.hintTooltip ? ( diff --git a/packages/ui/src/hooks/useFields.tsx b/packages/ui/src/hooks/useFields.tsx index b8d4ce6ac..db9b67552 100644 --- a/packages/ui/src/hooks/useFields.tsx +++ b/packages/ui/src/hooks/useFields.tsx @@ -3,7 +3,7 @@ import { diff } from "deep-object-diff"; import { isObject } from "lodash-es"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -type ValidatorFn = ( +export type ValidatorFn = ( value: string, fields?: Fields, // eslint-disable-line @typescript-eslint/no-explicit-any ) => string | false; diff --git a/packages/ui/src/icons/central/CookieCute.tsx b/packages/ui/src/icons/central/CookieCute.tsx new file mode 100644 index 000000000..c8ef4446b --- /dev/null +++ b/packages/ui/src/icons/central/CookieCute.tsx @@ -0,0 +1,213 @@ +import { type PathProps } from "../types.js"; + +export function CookieCute({ + strokeWidth = "0.512942", + strokeLinecap = "round", + strokeLinejoin = "round", +}: PathProps) { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/ui/src/icons/central/index.tsx b/packages/ui/src/icons/central/index.tsx index 8a169994d..830e5b014 100644 --- a/packages/ui/src/icons/central/index.tsx +++ b/packages/ui/src/icons/central/index.tsx @@ -52,6 +52,7 @@ export { CircleX as CentralCircleX } from "./CircleX.js"; export { Clipboard2 as CentralClipboard2 } from "./Clipboard2.js"; export { Clock as CentralClock } from "./Clock.js"; export { Contacts as CentralContacts } from "./Contacts.js"; +export { CookieCute as CentralCookieCute } from "./CookieCute.js"; export { CrossLarge as CentralCrossLarge } from "./CrossLarge.js"; export { CrossSmall as CentralCrossSmall } from "./CrossSmall.js"; export { CryptoWallet as CentralCryptoWallet } from "./CryptoWallet.js"; diff --git a/packages/ui/src/styles/fields.tsx b/packages/ui/src/styles/fields.tsx index e438c76ee..8d2e282d0 100644 --- a/packages/ui/src/styles/fields.tsx +++ b/packages/ui/src/styles/fields.tsx @@ -273,6 +273,7 @@ export function InputSubtext({ tooltipId, hideNonErrorsIfBlurred = false, focused = false, + subTextPaddingX, }: { text?: string | ToReactNodesArgs | undefined; content?: ReactNode | undefined; @@ -281,6 +282,7 @@ export function InputSubtext({ tooltipId?: string | undefined; hideNonErrorsIfBlurred?: boolean | undefined; focused?: boolean | undefined; + subTextPaddingX?: number | undefined; }) { const timeoutRef = useRef | null>(null); const [subtext, setSubtext] = useState(text); @@ -308,6 +310,7 @@ export function InputSubtext({ hasSuccess={hasSuccess} cursorPointer={Boolean(tooltipId)} usingContent={content !== undefined} + subTextPaddingX={subTextPaddingX} > {tooltipId ? ( @@ -344,6 +347,7 @@ export const StyledInputSubtext = styled.div<{ visible: boolean; cursorPointer: boolean; usingContent?: boolean; + subTextPaddingX?: number | undefined; }>` margin-top: ${({ visible }) => (visible ? "8px" : "0px")}; margin-left: ${({ visible, usingContent }) => @@ -359,6 +363,13 @@ export const StyledInputSubtext = styled.div<{ color: ${({ hasError, hasSuccess, theme }) => hasError ? theme.danger : hasSuccess ? theme.success : theme.text}; cursor: ${({ cursorPointer }) => (cursorPointer ? "pointer" : "auto")}; + ${({ subTextPaddingX }) => + subTextPaddingX + ? ` + padding-left: ${subTextPaddingX}px; + padding-right: ${subTextPaddingX}px; + ` + : ""}; `; export const labelStyle = ({ diff --git a/packages/ui/src/styles/themes.tsx b/packages/ui/src/styles/themes.tsx index d2516c323..8b34de430 100644 --- a/packages/ui/src/styles/themes.tsx +++ b/packages/ui/src/styles/themes.tsx @@ -736,7 +736,7 @@ const bridgeDarkTheme = extend(darkTheme, { const nageBaseSettings = { secondary: colors["gray-500"], - tertiary: colors["gray-400"], + tertiary: colors.gray6, mcNeutral: colors.grayBlue43, success: colors.green37, typography: getTypography(TypographyGroup.Nage, {