diff --git a/ui/ts/components/ActionLauncherCard.tsx b/ui/ts/components/ActionLauncherCard.tsx index 2e25cda3..cccf261b 100644 --- a/ui/ts/components/ActionLauncherCard.tsx +++ b/ui/ts/components/ActionLauncherCard.tsx @@ -1,7 +1,7 @@ import type { ComponentChildren } from 'preact' import { ActionLauncherButton } from './ActionLauncherButton.js' import type { ReadinessAction } from '../types/components.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_OPENING } from '../lib/uiStrings.js' type ActionLauncherCardProps = { action: ReadinessAction @@ -11,7 +11,7 @@ type ActionLauncherCardProps = { tone?: 'primary' | 'secondary' } -export function ActionLauncherCard({ action, children, pending = false, pendingLabel = TSX_STRINGS.componentsActionLauncherCard.copy001, tone = 'secondary' }: ActionLauncherCardProps) { +export function ActionLauncherCard({ action, children, pending = false, pendingLabel = UI_STRING_OPENING, tone = 'secondary' }: ActionLauncherCardProps) { if (action.onAction === undefined && action.blocker === undefined && action.readiness !== 'blocked') return undefined const disabled = action.readiness === 'blocked' || action.onAction === undefined || action.blocker !== undefined return ( diff --git a/ui/ts/components/AddressInfo.tsx b/ui/ts/components/AddressInfo.tsx index a3eadc90..7961c715 100644 --- a/ui/ts/components/AddressInfo.tsx +++ b/ui/ts/components/AddressInfo.tsx @@ -2,7 +2,7 @@ import type { Address } from '@zoltar/shared/ethereum' import { AddressValue } from './AddressValue.js' import { MetricField } from './MetricField.js' import { getMetricPlaceholderPresentation } from '../lib/userCopy.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_UNKNOWN } from '../lib/uiStrings.js' type AddressInfoProps = { address: Address | undefined @@ -10,7 +10,7 @@ type AddressInfoProps = { unavailableLabel?: string } -export function AddressInfo({ address, label, unavailableLabel = TSX_STRINGS.componentsAddressInfo.copy001 }: AddressInfoProps) { - const fallbackLabel = unavailableLabel === 'Unknown' ? getMetricPlaceholderPresentation(address)?.placeholder : unavailableLabel +export function AddressInfo({ address, label, unavailableLabel = UI_STRING_UNKNOWN }: AddressInfoProps) { + const fallbackLabel = unavailableLabel === UI_STRING_UNKNOWN ? getMetricPlaceholderPresentation(address)?.placeholder : unavailableLabel return {address === undefined ? fallbackLabel : } } diff --git a/ui/ts/components/AddressValue.tsx b/ui/ts/components/AddressValue.tsx index 26b774d3..786200d8 100644 --- a/ui/ts/components/AddressValue.tsx +++ b/ui/ts/components/AddressValue.tsx @@ -3,7 +3,7 @@ import { useLayoutEffect, useRef, useState } from 'preact/hooks' import { useCopyToClipboard } from '../hooks/useCopyToClipboard.js' import { formatAddress } from '../lib/addresses.js' import { getMetricPlaceholderPresentation } from '../lib/userCopy.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_COPIED, UI_TEMPLATE_COPY_ADDRESS_VALUE } from '../lib/uiStrings.js' type AddressValueProps = { address: string | undefined @@ -63,8 +63,8 @@ export function AddressValue({ address, className = '' }: AddressValueProps) { const displayValue = shouldShorten ? formatAddress(address) : address return ( - )} {simulationController === undefined ? undefined : } diff --git a/ui/ts/components/ApprovedAmountValue.tsx b/ui/ts/components/ApprovedAmountValue.tsx index 507f13e0..fd341582 100644 --- a/ui/ts/components/ApprovedAmountValue.tsx +++ b/ui/ts/components/ApprovedAmountValue.tsx @@ -1,8 +1,7 @@ import { CurrencyValue } from './CurrencyValue.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_MAX, UI_STRING_UNLIMITED_APPROVAL } from '../lib/uiStrings.js' export const APPROVAL_MAX_DISPLAY_THRESHOLD = (1n << 200n) - 1n -export const APPROVAL_MAX_LABEL = 'Max' type ApprovedAmountValueProps = { className?: string @@ -29,8 +28,8 @@ export function ApprovedAmountValue({ className = '', copyable = true, decimals if (isApprovalAmountMaxDisplay(value)) return ( - - {APPROVAL_MAX_LABEL} + + {UI_STRING_MAX} ) diff --git a/ui/ts/components/ChildUniverseDetails.tsx b/ui/ts/components/ChildUniverseDetails.tsx index ec716710..668e34af 100644 --- a/ui/ts/components/ChildUniverseDetails.tsx +++ b/ui/ts/components/ChildUniverseDetails.tsx @@ -3,7 +3,7 @@ import { DataGrid } from './DataGrid.js' import { TimestampValue } from './TimestampValue.js' import { MetricField } from './MetricField.js' import type { ZoltarChildUniverseSummary } from '../types/contracts.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_FORK_TIME, UI_STRING_OUTCOME, UI_STRING_OUTCOME_INDEX, UI_STRING_REPUTATION_TOKEN } from '../lib/uiStrings.js' type ChildUniverseDetailsProps = { child: ZoltarChildUniverseSummary @@ -13,15 +13,15 @@ type ChildUniverseDetailsProps = { export function ChildUniverseDetails({ child, showOutcomeIndex = false }: ChildUniverseDetailsProps) { return ( - {child.outcomeLabel} - {showOutcomeIndex ? {child.outcomeIndex.toString()} : undefined} + {child.outcomeLabel} + {showOutcomeIndex ? {child.outcomeIndex.toString()} : undefined} {child.exists ? ( - + ) : undefined} {child.forkTime !== 0n ? ( - + ) : undefined} diff --git a/ui/ts/components/CollateralizationCircle.tsx b/ui/ts/components/CollateralizationCircle.tsx index da169db3..6c4f2c8f 100644 --- a/ui/ts/components/CollateralizationCircle.tsx +++ b/ui/ts/components/CollateralizationCircle.tsx @@ -1,11 +1,11 @@ import type { CollateralizationCircleProps } from '../types/components.js' import { formatCollateralizationCompactPercentLabel, getCollateralizationVisualPercent, getToneRatioThreshold, getVisualRatio } from '../lib/visualMetrics.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_COLLATERALIZATION_LABEL, UI_TEMPLATE_LABEL_VALUE, UI_TEMPLATE_VALUE_UNAVAILABLE } from '../lib/uiStrings.js' const MAX_RING_COLLATERALIZATION_PERCENT = 999n * 10n ** 18n const MAX_RING_COLLATERALIZATION_LABEL = '999%+' -export function CollateralizationCircle({ collateralizationPercent, className = '', label = TSX_STRINGS.componentsCollateralizationCircle.copy001, size = 'medium', successThreshold = 1, targetCollateralizationPercent, tone, warningThreshold = 0.65 }: CollateralizationCircleProps) { +export function CollateralizationCircle({ collateralizationPercent, className = '', label = UI_STRING_COLLATERALIZATION_LABEL, size = 'medium', successThreshold = 1, targetCollateralizationPercent, tone, warningThreshold = 0.65 }: CollateralizationCircleProps) { const toneRatio = getVisualRatio({ value: collateralizationPercent, maxValue: targetCollateralizationPercent }) const resolvedTone = tone ?? @@ -25,7 +25,7 @@ export function CollateralizationCircle({ collateralizationPercent, className = const strokeDashoffset = circumference - circumference * (clampedCollateralizationVisualPercent / 100) const displayValueFitsInRing = collateralizationPercent === undefined || collateralizationPercent <= MAX_RING_COLLATERALIZATION_PERCENT const ringDisplayValue = displayValueFitsInRing ? displayValue : MAX_RING_COLLATERALIZATION_LABEL - const exactValueTitle = collateralizationPercent === undefined ? TSX_STRINGS.componentsCollateralizationCircle.copy002(label) : TSX_STRINGS.componentsCollateralizationCircle.copy003(label, displayValue) + const exactValueTitle = collateralizationPercent === undefined ? UI_TEMPLATE_VALUE_UNAVAILABLE(label) : UI_TEMPLATE_LABEL_VALUE(label, displayValue) return (
diff --git a/ui/ts/components/CollateralizationMetricField.tsx b/ui/ts/components/CollateralizationMetricField.tsx index 88b65cf6..adde24f7 100644 --- a/ui/ts/components/CollateralizationMetricField.tsx +++ b/ui/ts/components/CollateralizationMetricField.tsx @@ -3,7 +3,7 @@ import { CurrencyValue } from './CurrencyValue.js' import { MetricField } from './MetricField.js' import { getRepPriceSourceCopy, renderRepPriceSourceLabel, type RepPriceSource } from '../lib/repPriceSource.js' import { getCollateralizationDisplayState, getCollateralizationTone } from '../lib/trading.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_AWAITING_REP_ETH_PRICE, UI_STRING_COLLATERALIZATION_LABEL, UI_STRING_NO_ACTIVE_ALLOWANCE, UI_STRING_PERCENT } from '../lib/uiStrings.js' type CollateralizationMetricFieldProps = { className?: string | undefined collateralizationPercent: bigint | undefined @@ -18,12 +18,12 @@ function getDefaultLabel(repPerEthSource: RepPriceSource | undefined, repPerEthS const repPriceSourceCopy = getRepPriceSourceCopy(repPerEthSource) return ( - {TSX_STRINGS.componentsCollateralizationMetricField.copy001} + {`${UI_STRING_COLLATERALIZATION_LABEL} `} {renderRepPriceSourceLabel(repPerEthSource, repPerEthSourceUrl)} ) } -export function CollateralizationMetricField({ className, collateralizationPercent, label, repPerEthSource, repPerEthSourceUrl, securityBondAllowance, securityMultiplier, unavailableCopy = TSX_STRINGS.componentsCollateralizationMetricField.copy002 }: CollateralizationMetricFieldProps) { +export function CollateralizationMetricField({ className, collateralizationPercent, label, repPerEthSource, repPerEthSourceUrl, securityBondAllowance, securityMultiplier, unavailableCopy = UI_STRING_AWAITING_REP_ETH_PRICE }: CollateralizationMetricFieldProps) { const displayState = getCollateralizationDisplayState(securityBondAllowance, collateralizationPercent) const tone = displayState === 'noActiveAllowance' ? undefined : getCollateralizationTone(collateralizationPercent, securityMultiplier) const valueClassName = (() => { @@ -35,10 +35,10 @@ export function CollateralizationMetricField({ className, collateralizationPerce return ( {(() => { - if (displayState === 'noActiveAllowance') return TSX_STRINGS.componentsCollateralizationMetricField.copy003 + if (displayState === 'noActiveAllowance') return UI_STRING_NO_ACTIVE_ALLOWANCE if (displayState === 'unavailable') return unavailableCopy - return + return })()} ) diff --git a/ui/ts/components/CurrencyValue.tsx b/ui/ts/components/CurrencyValue.tsx index 496d3371..b0234108 100644 --- a/ui/ts/components/CurrencyValue.tsx +++ b/ui/ts/components/CurrencyValue.tsx @@ -3,7 +3,7 @@ import { LoadingText } from './LoadingText.js' import { useCopyToClipboard } from '../hooks/useCopyToClipboard.js' import { formatCompactCurrencyBalance, formatCurrencyBalance, formatRoundedCurrencyBalance } from '../lib/formatters.js' import { getMetricPlaceholderPresentation } from '../lib/userCopy.js' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_COPIED, UI_STRING_LOADING_WITH_ELLIPSIS, UI_TEMPLATE_COPY_EXACT_CURRENCY_VALUE } from '../lib/uiStrings.js' type CurrencyValueProps = { className?: string @@ -68,7 +68,7 @@ export function CurrencyValue({ className = '', compactWhenOverflow = false, cop } }, [compactWhenOverflow, copiedValue, displayValue, value]) - if (loading) return {TSX_STRINGS.componentsCurrencyValue.copy001} + if (loading) return {UI_STRING_LOADING_WITH_ELLIPSIS} if (value === undefined || exactValue === undefined || displayValue === undefined || compactDisplayValue === undefined) return {getMetricPlaceholderPresentation(value)?.placeholder} @@ -89,8 +89,8 @@ export function CurrencyValue({ className = '', compactWhenOverflow = false, cop return ( - diff --git a/ui/ts/components/EnumDropdown.tsx b/ui/ts/components/EnumDropdown.tsx index 2ec251a5..5f7f561b 100644 --- a/ui/ts/components/EnumDropdown.tsx +++ b/ui/ts/components/EnumDropdown.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from 'preact/hooks' -import { TSX_STRINGS } from '../lib/uiStrings.js' +import { UI_STRING_DROPDOWN_OPTIONS, UI_TEMPLATE_LABEL_VALUE } from '../lib/uiStrings.js' export type EnumDropdownOption = { label: string @@ -20,7 +20,7 @@ export function EnumDropdown({ ariaLabel, disabled = false, on const rootRef = useRef(null) const selectedOption = value === undefined ? undefined : options.find(option => option.value === value) const triggerLabel = selectedOption?.label ?? value ?? placeholder ?? '' - const accessibleTriggerLabel = ariaLabel === undefined || triggerLabel === '' ? ariaLabel : TSX_STRINGS.componentsEnumDropdown.copy001(ariaLabel, triggerLabel) + const accessibleTriggerLabel = ariaLabel === undefined || triggerLabel === '' ? ariaLabel : UI_TEMPLATE_LABEL_VALUE(ariaLabel, triggerLabel) const focusMenuOptionAt = (currentTarget: HTMLButtonElement | null, direction: -1 | 1) => { if (rootRef.current === null || currentTarget === null) return @@ -81,7 +81,7 @@ export function EnumDropdown({ ariaLabel, disabled = false, on
diff --git a/ui/ts/components/ForkAuctionSection.tsx b/ui/ts/components/ForkAuctionSection.tsx index d621f243..ff8b0133 100644 --- a/ui/ts/components/ForkAuctionSection.tsx +++ b/ui/ts/components/ForkAuctionSection.tsx @@ -24,6 +24,7 @@ import { TruthAuctionSummaryCard } from './TruthAuctionSummaryCard.js' import { WarningSurface } from './WarningSurface.js' import { createActionAvailability } from '../lib/actionAvailability.js' import { sameAddress } from '../lib/address.js' +import { assertNever } from '../lib/assert.js' import { AUCTIONED_BOND_ALLOWANCE_LABEL, AUCTION_TIME_SECONDS, getForkAuctionStageLabel, getForkAuctionStageView, getTimeRemaining } from '../lib/forkAuction.js' import { buildTruthAuctionDepthPoints, estimateRepPurchased, getTruthAuctionBidGuardMessage, getTruthAuctionBidPreview, getTruthAuctionBidPriceValidationMessage, getTruthAuctionOverviewProgress, getTruthAuctionWinningThresholdPrice } from '../lib/truthAuctionBook.js' import { buildTruthAuctionBidRows, buildViewerTruthAuctionBidRows, updateTruthAuctionSettlementBidSelection } from '../lib/truthAuctionBidViewModels.js' @@ -37,7 +38,199 @@ import { buildRouteHref, SECURITY_POOLS_ROUTE } from '../lib/routing.js' import { getEscalationDepositClaimAmount, isPoolQuestionFinalized } from '../lib/reportingDomain.js' import { deriveSecurityPoolForkStage, deriveSecurityPoolLifecycleState, evaluateSecurityPoolState } from '../lib/securityPoolState.js' import { getCurrentSelectedPoolForkAuctionDetails, getForkWorkflowStageSelection, type ForkWorkflowSelectionStage } from '../lib/securityPoolWorkflow.js' -import { CURATED_TSX_STRINGS, UI_STRINGS, TSX_STRINGS } from '../lib/uiStrings.js' +import { + UI_STRING_ADVANCED_DIAGNOSTICS, + UI_STRING_ALREADY_MIGRATED_STATUS, + UI_STRING_TRUTH_AUCTION_FINALIZATION_REQUIRED_DETAIL, + UI_STRING_BID_AMOUNT_ETH, + UI_STRING_BID_ESTIMATED_REP_DETAIL_INTRO, + UI_STRING_BID_ESTIMATED_REP_DETAIL_OUTRO, + UI_STRING_BID_PRICE_ETH_REP, + UI_STRING_BYPASSING_AUCTION_TRUNCATED, + UI_STRING_BYPASS_TRUTH_AUCTION, + UI_STRING_CHECKING_WHETHER_POOL_REP_IS_ALREADY_READY_FOR_SELECTED_CHILD_UNIVERSE, + UI_STRING_CHILD_POOL, + UI_STRING_CHILD_SECURITY_POOLS, + UI_STRING_CHOOSE_DEPOSITS_TO_MIGRATE, + UI_STRING_UNDERFUNDED_WINNING_BID_CLAIM_PREVIEW_UNAVAILABLE_DETAIL, + UI_STRING_CLEARING, + UI_STRING_CLEARING_PRICE, + UI_STRING_CLOSED, + UI_STRING_COLLATERAL, + UI_STRING_CONNECT_A_WALLET_BEFORE_USING_FORK_AND_AUCTION_ACTIONS, + UI_STRING_CONNECT_WALLET_TO_INSPECT_YOUR_PARENT_POOL_BALANCES, + UI_STRING_CURRENT_PATH_ELIGIBLE_FOR_CHILD_POOL_MIGRATION, + UI_STRING_CURRENT_PATH_MUST_MIGRATE_INTO_THE_SELECTED_CHILD_UNIVERSE, + UI_STRING_ENDED_AT, + UI_STRING_ENDS, + UI_STRING_ENTRY_DEPTH_PREFIX, + UI_STRING_ESCALATION_DEPOSITS_ARE_CURRENTLY_AVAILABLE_TO_MIGRATE_FOR_THIS_WALLET, + UI_STRING_ESCALATION_DEPOSIT_DETAILS_ARE_UNAVAILABLE_FOR_THIS_POOL, + UI_STRING_ESCROWED_REP, + UI_STRING_ESCROW_SOURCE_REP_AT_FORK, + UI_STRING_ESTIMATED_ETH_REFUNDED, + UI_STRING_TRUTH_AUCTION_REFUND_ESTIMATE_DETAIL, + UI_STRING_ESTIMATED_REP_CLAIMED, + UI_STRING_ETH, + UI_STRING_ETH_RAISED_PER_CAP, + UI_STRING_ETH_REP, + UI_STRING_FINALIZE_TRUTH_AUCTION, + UI_STRING_FINALIZING_TRUTH_AUCTION_TRUNCATED, + UI_STRING_FORK_LIFECYCLE_STAGES, + UI_STRING_FORK_TRIGGERED, + UI_STRING_FORK_TRUTH_AUCTION, + UI_STRING_FORK_TYPE, + UI_STRING_HEX_VALUE_PLACEHOLDER, + UI_STRING_INACTIVE, + UI_STRING_INITIALLY_DEPOSITED_PREFIX, + UI_STRING_LOADING_CURRENT_CHAIN_TIME, + UI_STRING_LOADING_ELIGIBLE_ESCALATION_DEPOSITS, + UI_STRING_LOADING_ESCALATION_DEPOSITS_FOR_THE_SELECTED_WALLET, + UI_STRING_LOADING_UNRESOLVED_ESCALATION_DEPOSITS, + UI_STRING_LOADING_UNRESOLVED_ESCALATION_DEPOSITS_FOR_THE_CONNECTED_WALLET, + UI_STRING_LOAD_A_POOL_TO_INSPECT_FORK_PROGRESS_MIGRATION_AND_THE_TRUTH_AUCTION, + UI_STRING_LOAD_THE_TRUTH_AUCTION_BEFORE_FINALIZING, + UI_STRING_MAX_REP_BEING_SOLD, + UI_STRING_MIGRATED_BALANCES_FOR_THIS_OUTCOME, + UI_STRING_MIGRATED_REP, + UI_STRING_MIGRATE_POOL_TO_UNIVERSE, + UI_STRING_MIGRATE_RESOLVED_ESCALATION_DEPOSITS, + UI_STRING_MIGRATE_UNRESOLVED_ESCALATION_LOCKS, + UI_STRING_MIGRATE_VAULT, + UI_STRING_MIGRATING_ESCALATION_DEPOSITS_TRUNCATED, + UI_STRING_MIGRATING_POOL_TO_UNIVERSE_TRUNCATED, + UI_STRING_MIGRATING_UNRESOLVED_ESCALATION_TRUNCATED, + UI_STRING_MIGRATING_VAULT, + UI_STRING_MIGRATION_ENDS, + UI_STRING_MIGRATION_IS_STILL_ACTIVE_TRUTH_AUCTION_CAN_START_ONCE_MIGRATION_ENDS, + UI_STRING_MIGRATION, + UI_STRING_MIGRATION_STARTED, + UI_STRING_MIGRATION_STATUS, + UI_STRING_MIGRATION_TIMING_IS_UNAVAILABLE, + UI_STRING_MIGRATION_WINDOW_HAS_CLOSED_FOR_THIS_PARENT_POOL, + UI_STRING_MIN_BID_SIZE, + UI_STRING_NO, + UI_STRING_NOT_STARTED, + UI_STRING_NOT_STARTED_BADGE_LABEL, + UI_STRING_ESCALATION_MIGRATION_EMPTY_ESCROW_DETAIL, + UI_STRING_METRIC_UNAVAILABLE_PLACEHOLDER, + UI_STRING_NOT_CHOSEN, + UI_STRING_NO_ESCROWED_REP_REMAINS_TO_MIGRATE_FOR_THE_CONNECTED_WALLET, + UI_STRING_NO_PARENT_COLLATERAL_REMAINS_TO_AUCTION_SO_THIS_STEP_IMMEDIATELY_BYPASSES_BIDDING, + UI_STRING_NO_PREFIX, + UI_STRING_NO_REP_COLLATERAL_OR_SECURITY_BOND_ALLOWANCE_REMAINS, + UI_STRING_NO_REP_WAS_PRESENT_AT_FORK_SO_NO_TRUTH_AUCTION_IS_NEEDED, + UI_STRING_NO_UNRESOLVED_PARENT_ESCALATION_DEPOSITS_REMAIN_FOR_CONNECTED_WALLET, + UI_STRING_OPEN, + UI_STRING_OPEN_SECURITY_POOL, + UI_STRING_OPERATIONAL, + UI_STRING_OUTCOME, + UI_STRING_OWN_ESCALATION_FORK, + UI_STRING_PARENT_POOL_VAULT_BALANCES_UNAVAILABLE_MIGRATION_DETAIL, + UI_STRING_PARENT_ZOLTAR_FORK, + UI_STRING_PENDING, + UI_STRING_PENDING_CONFIRMATION, + UI_STRING_PENDING_OUTCOME, + UI_STRING_POOL_REP_AT_FORK, + UI_STRING_POOL_REP_STAGED_FOR_VAULT_MIGRATION_DETAIL, + UI_STRING_POOL_REP_HAS_ALREADY_BEEN_MIGRATED_TO_THE_SELECTED_CHILD_UNIVERSE, + UI_STRING_REFUND_ONLY_SETTLEMENT_RETURNS_LOCKED_ETH, + UI_STRING_REP, + UI_STRING_REP_AT_FORK, + UI_STRING_REP_COLLATERAL, + UI_STRING_REP_PURCHASED, + UI_STRING_SECURITY_BOND_ALLOWANCE, + UI_STRING_SECURITY_POOL_ADDRESS, + UI_STRING_SELECTED_BIDS, + UI_STRING_SELECTED_BID_SETTLEMENT_PREVIEW, + UI_STRING_SELECTED_DEPOSITS_LEAVE_THE_PARENT_POOL_AND_REAPPEAR_ON_THE_CHOSEN_CHILD, + UI_STRING_SELECTED_LADDER_PRICE, + UI_STRING_SELECTED_OUTCOME_REP_COLLATERAL, + UI_STRING_SELECTED_OUTCOME_SECURITY_BOND_ALLOWANCE, + UI_STRING_SELECTED_REFUND_ROWS, + UI_STRING_SELECTED_WINNING_BIDS, + UI_STRING_SELECT_AT_LEAST_ONE_DEPOSIT_TO_MIGRATE, + UI_STRING_SETTLED, + UI_STRING_SETTLEMENT_AVAILABLE, + UI_STRING_SETTLEMENT, + UI_STRING_SETTLEMENT_STATUS, + UI_STRING_SETTLE_SELECTED_BIDS, + UI_STRING_SETTLING_FORK_CARRIED_DEPOSITS_TRUNCATED, + UI_STRING_SHORTFALL, + UI_STRING_STARTED, + UI_STRING_STARTING_TRUNCATED, + UI_STRING_STARTING_TRUTH_AUCTION, + UI_STRING_START_TRUTH_AUCTION, + UI_STRING_STATUS, + UI_STRING_SUBMITTING_A_BID_LOCKS_ETH_UNTIL_SETTLEMENT_LOSING, + UI_STRING_SUBMITTING_BID_TRUNCATED, + UI_STRING_SUBMITTING_SETTLEMENT_TRANSACTION_TRUNCATED, + UI_STRING_SUBMIT_BID, + UI_STRING_SYSTEM_IS_FORKING, + UI_STRING_SETTLEMENT_ROUNDING_NOTICE, + UI_STRING_UNRESOLVED_ESCALATION_MIGRATION_WINDOW_CLOSED_DETAIL, + UI_STRING_UNRESOLVED_ESCALATION_MIGRATION_WINDOW_CLOSED_REASON, + UI_STRING_FORK_INACTIVE_DETAIL, + UI_STRING_CHILD_UNIVERSE_FULLY_MIGRATED_DETAIL, + UI_STRING_VAULT_MIGRATION_DETAIL, + UI_STRING_POOL_REP_MIGRATION_DETAIL, + UI_STRING_TRIGGERED_AT, + UI_STRING_TRUTH_AUCTION_ADDRESS, + UI_STRING_TRUTH_AUCTION, + UI_STRING_TRUTH_AUCTION_ALREADY_STARTED, + UI_STRING_TRUTH_AUCTION_END_TIME_IS_UNAVAILABLE, + UI_STRING_TRUTH_AUCTION_HAS_ENDED, + UI_STRING_TRUTH_AUCTION_IS_ALREADY_FINALIZED, + UI_STRING_TRUTH_AUCTION_IS_STILL_ONGOING, + UI_STRING_TRUTH_AUCTION_STATUS, + UI_STRING_UNALLOCATED_ESCROW_CHILD_REP, + UI_STRING_UNFILLED, + UI_STRING_UNRESOLVED_DEPOSITS_REMAIN_FOR_THIS_WALLET, + UI_STRING_UNRESOLVED_ESCALATION_DEPOSIT_DETAILS_ARE_UNAVAILABLE_FOR_THIS_POOL_RIGHT_NOW, + UI_STRING_UNRESOLVED_ESCALATION_MIGRATION_IS_UNAVAILABLE_FOR_THIS_POOL, + UI_STRING_USE_UNRESOLVED_ESCALATION_MIGRATION_FOR_THIS_PARENT_POOL, + UI_STRING_USE_UNRESOLVED_ESCALATION_MIGRATION_TO_MOVE_LOCKED_POSITIONS_AND_VAULT_BALANCES_TOGETHER, + UI_STRING_UNRESOLVED_ESCALATION_MIGRATION_WITH_VAULT_DETAIL, + UI_STRING_UNRESOLVED_ESCALATION_SINGLE_CHILD_DETAIL, + UI_STRING_FORK_UNAVAILABLE_PLACEHOLDER, + UI_STRING_VAULT_MIGRATION_IS_ALREADY_COMPLETE_FOR_THIS_WALLET, + UI_STRING_VIEWING, + UI_STRING_WALLET_LEVEL_BALANCES_IN_THE_PARENT_POOL_THAT_MAY_STILL_NEED_MIGRATION, + UI_TEMPLATE_FINALIZED_REFUND_ONLY_SETTLEMENT_NOTICE, + UI_TEMPLATE_LOADING_CHILD_AUCTION_DETAILS, + UI_TEMPLATE_START_TRUTH_AUCTION_DETAIL, + UI_TEMPLATE_WINNING_CLAIM_ALLOWANCE_HEADLINE, + UI_TEMPLATE_WINNING_BID_ALLOWANCE_NOTICE, + UI_TEMPLATE_WINNING_CLAIM_SETTLEMENT_NOTICE, + UI_STRING_WINNING_BIDS_BUY_MORE_THAN_REP, + UI_STRING_WORTH_NOW_PENDING_MIGRATION_FINALIZATION, + UI_STRING_WORTH_NOW_PREFIX, + UI_STRING_YES, + UI_STRING_YOUR_MIGRATION_BALANCES, + UI_TEMPLATE_CHILD_UNIVERSE_NOT_CREATED_FOR_OUTCOME_DETAIL, + UI_TEMPLATE_FINALIZED_TRUTH_AUCTION_SETTLEMENT_STATUS_DETAIL, + UI_TEMPLATE_CHECKING_POOL_REP_MIGRATED_TO_CHILD_UNIVERSE, + UI_TEMPLATE_ESTIMATED_VALUE, + UI_TEMPLATE_ETH_PER_REP_VALUE, + UI_TEMPLATE_MIGRATE_POOL_TO_THE_VALUE_UNIVERSE_BEFORE_MOVING_VAULT_BALANCES, + UI_TEMPLATE_MIGRATE_POOL_TO_VALUE_UNIVERSE, + UI_TEMPLATE_MIGRATE_SELECTED_VALUE_DEPOSITS, + UI_TEMPLATE_MIGRATE_UNRESOLVED_ESCALATION_TO_VALUE, + UI_TEMPLATE_MIGRATE_VAULT_TO_VALUE, + UI_TEMPLATE_NO_VALUE_ESCALATION_DEPOSITS_ARE_CURRENTLY_AVAILABLE_TO_MIGRATE_FOR_THIS_WALLET, + UI_TEMPLATE_POOL_REP_HAS_ALREADY_BEEN_MIGRATED_TO_THE_VALUE_UNIVERSE, + UI_TEMPLATE_REFUND_ONLY_SETTLEMENT_RETURNS_LOCKED_ETH_AND_DOES_NOT_ASSIGN_VALUE, + UI_TEMPLATE_SECURITY_POOL_FOR_VALUE_UNIVERSE_DOES_NOT_EXIST, + UI_TEMPLATE_FINALIZED_REFUND_BATCH_SETTLEMENT_DETAIL, + UI_TEMPLATE_MIXED_BID_BATCH_SETTLEMENT_DETAIL, + UI_TEMPLATE_REFUNDABLE_BID_BATCH_SETTLEMENT_DETAIL, + UI_TEMPLATE_WINNING_BID_BATCH_SETTLEMENT_DETAIL, + UI_TEMPLATE_SETTLE_SELECTED_VALUE_FORK_CARRIED_DEPOSITS, + UI_TEMPLATE_STARTS_IN_VALUE, + UI_TEMPLATE_TRUTH_AUCTION_CAN_BE_STARTED_IN_VALUE_ONCE_MIGRATION_ENDS, + UI_TEMPLATE_WINNING_ROWS_RECEIVE_ESTIMATED_CHILD_POOL_REP_PLUS_ESTIMATED_VALUE, + UI_TEMPLATE_WINNING_ROWS_RECEIVE_ESTIMATED_CHILD_POOL_REP_PLUS_ESTIMATED_VALUE_WHILE_REFUND, +} from '../lib/uiStrings.js' import { writeSecurityPoolQueryParam, writeUniverseQueryParam } from '../lib/urlParams.js' import { getVisualRatio } from '../lib/visualMetrics.js' import { useForkAuctionInteractionState } from '../hooks/useForkAuctionInteractionState.js' @@ -46,8 +239,6 @@ import { useTruthAuctionBookData } from '../hooks/useTruthAuctionBookData.js' import { useTruthAuctionSettlementActionState } from '../hooks/useTruthAuctionSettlementActionState.js' import type { ListedSecurityPool, ReadClient, ReportingOutcomeKey, TruthAuctionMetrics } from '../types/contracts.js' import type { ForkAuctionSectionProps } from '../types/components.js' -const UNKNOWN_VALUE = UI_STRINGS.common.metricUnavailablePlaceholder -const UNAVAILABLE_UNTIL_FORK = CURATED_TSX_STRINGS.forkAuctionSection.forkUnavailablePlaceholder function sameBigIntArray(left: bigint[], right: bigint[]) { return left.length === right.length && left.every((value, index) => value === right[index]) @@ -73,10 +264,19 @@ type MigrationStateBadge = { const FORK_MIGRATION_DURATION = 4_838_400n const FORK_WORKFLOW_NAV_STAGES: readonly ForkWorkflowSelectionStage[] = ['fork-triggered', 'migration', 'auction', 'settlement'] -const FORK_WORKFLOW_STAGE_LABELS: Record = CURATED_TSX_STRINGS.forkAuctionSection.forkWorkflowStageLabels - function getForkWorkflowStageLabel(stage: ForkWorkflowSelectionStage) { - return FORK_WORKFLOW_STAGE_LABELS[stage] + switch (stage) { + case 'fork-triggered': + return UI_STRING_FORK_TRIGGERED + case 'migration': + return UI_STRING_MIGRATION + case 'auction': + return UI_STRING_TRUTH_AUCTION + case 'settlement': + return UI_STRING_SETTLEMENT + default: + return assertNever(stage) + } } function getForkWorkflowStageOrder(stage: ForkWorkflowSelectionStage) { @@ -94,7 +294,7 @@ function getForkWorkflowStageIcon(stage: ForkWorkflowSelectionStage) { case 'settlement': return