Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,15 +1,34 @@
import React, { memo, useMemo } from 'react';
import React, { memo, useCallback, useMemo } from 'react';
import { StyleSheet } from 'react-native';
import { RnbwHoldToActivateButton } from '@/features/rnbw-membership/components/RnbwHoldToActivateButton';
import { RNBW_STAKING_DEPOSIT_CONFIG } from '@/features/rnbw-staking/depositConfig';
import { buildSyntheticRnbwSourceAsset } from '@/features/rnbw-staking/utils/syntheticRnbwSourceAsset';
import { DepositScreen } from '@/systems/funding/components/DepositScreen';
import { type DepositSubmitButtonRenderParams } from '@/systems/funding/types';

export const RnbwStakingScreen = memo(function RnbwStakingScreen() {
const syntheticSourceAsset = useMemo(() => buildSyntheticRnbwSourceAsset({ includeRewardsBalance: true }), []);
const renderSubmitButton = useCallback(
({ disabled, isSubmitting, label, onSubmit }: DepositSubmitButtonRenderParams) => (
<RnbwHoldToActivateButton
disabled={disabled}
isProcessing={isSubmitting}
label={label}
onActivate={onSubmit}
processingLabel={RNBW_STAKING_DEPOSIT_CONFIG.labels.confirmButtonLoading}
showBiometryIcon={!disabled}
style={styles.submitButton}
testID="rnbw-staking-submit-button"
/>
),
[]
);

return (
<DepositScreen
config={RNBW_STAKING_DEPOSIT_CONFIG}
initialAsset={syntheticSourceAsset}
renderSubmitButton={renderSubmitButton}
theme={{
accent: '#E3A700',
backgroundDark: '#090909',
Expand All @@ -18,3 +37,9 @@ export const RnbwStakingScreen = memo(function RnbwStakingScreen() {
/>
);
});

const styles = StyleSheet.create({
submitButton: {
width: '100%',
},
});
26 changes: 21 additions & 5 deletions src/systems/funding/components/DepositScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,13 @@ import { createDepositConfig } from '../config';
import { FOOTER_HEIGHT, NavigationSteps, SLIDER_WIDTH, SLIDER_WITH_LABELS_HEIGHT } from '../constants';
import { DepositProvider, useDepositContext } from '../contexts/DepositContext';
import { computeMaxSwappableAmount } from '../stores/createDepositStore';
import { type DepositConfigInput, DepositQuoteStatus, type FundingScreenTheme, getAccentColor } from '../types';
import {
type DepositConfigInput,
DepositQuoteStatus,
type DepositSubmitButtonRenderer,
type FundingScreenTheme,
getAccentColor,
} from '../types';
import { resolveInitialDepositAsset } from '../utils/sourceAsset';
import { amountFromSliderProgress } from '../utils/sliderWorklets';
import { DepositAmountInput } from './deposit/DepositAmountInput';
Expand All @@ -46,18 +52,19 @@ import { DepositTokenList } from './deposit/DepositTokenList';
type DepositScreenProps = {
config: DepositConfigInput;
initialAsset?: ExtendedAnimatedAssetWithColors | null;
renderSubmitButton?: DepositSubmitButtonRenderer;
theme: FundingScreenTheme;
};

// ============ Main Screen ==================================================== //

export const DepositScreen = memo(function DepositScreen({ config, initialAsset, theme }: DepositScreenProps) {
export const DepositScreen = memo(function DepositScreen({ config, initialAsset, renderSubmitButton, theme }: DepositScreenProps) {
const resolvedConfig = useMemo(() => createDepositConfig(config), [config]);
const resolvedInitialAsset = useStableValue(() => initialAsset ?? resolveInitialDepositAsset(resolvedConfig));

return (
<DepositProvider config={resolvedConfig} initialAsset={resolvedInitialAsset} initialGasSpeed={GasSpeed.FAST} theme={theme}>
<DepositScreenContent />
<DepositScreenContent renderSubmitButton={renderSubmitButton} />
</DepositProvider>
);
});
Expand All @@ -78,7 +85,11 @@ function getInputAmountError(

// ============ Screen Content ================================================= //

const DepositScreenContent = memo(function DepositScreenContent() {
const DepositScreenContent = memo(function DepositScreenContent({
renderSubmitButton,
}: {
renderSubmitButton?: DepositSubmitButtonRenderer;
}) {
const {
config,
displayedAmount,
Expand Down Expand Up @@ -179,7 +190,12 @@ const DepositScreenContent = memo(function DepositScreenContent() {
paddingTop="16px"
width="full"
>
<DepositFooter inputAmountError={inputAmountErrorShared} isSubmitting={isSubmitting} onSubmit={handleDeposit} />
<DepositFooter
inputAmountError={inputAmountErrorShared}
isSubmitting={isSubmitting}
onSubmit={handleDeposit}
renderSubmitButton={renderSubmitButton}
/>
</Box>
</Box>
</Box>
Expand Down
38 changes: 34 additions & 4 deletions src/systems/funding/components/deposit/DepositFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import { memo } from 'react';
import { type SharedValue, useDerivedValue } from 'react-native-reanimated';
import { Box, Separator, useColorMode } from '@/design-system';
import { PerpsSwapButton } from '@/features/perps/components/PerpsSwapButton';
import { useSharedValueState } from '@/hooks/reanimated/useSharedValueState';
import { useStableValue } from '@/hooks/useStableValue';
import { createDerivedStore } from '@/state/internal/createDerivedStore';
import { useStoreSharedValue } from '@/state/internal/hooks/useStoreSharedValue';
import { type InferStoreState } from '@/state/internal/types';
import { DepositQuoteStatus, type DepositQuoteStoreType, getAccentColor } from '@/systems/funding/types';
import { DepositQuoteStatus, type DepositQuoteStoreType, type DepositSubmitButtonRenderer, getAccentColor } from '@/systems/funding/types';
import { time } from '@/utils/time';
import { useDepositContext } from '../../contexts/DepositContext';
import { GasButton } from './gas/GasButton';
Expand All @@ -32,16 +33,27 @@ type DepositFooterProps = {
inputAmountError: SharedValue<InputAmountError>;
isSubmitting: SharedValue<boolean>;
onSubmit: () => Promise<void>;
renderSubmitButton?: DepositSubmitButtonRenderer;
};

export const DepositFooter = memo(function DepositFooter({ inputAmountError, isSubmitting, onSubmit }: DepositFooterProps) {
export const DepositFooter = memo(function DepositFooter({
inputAmountError,
isSubmitting,
onSubmit,
renderSubmitButton,
}: DepositFooterProps) {
return (
<>
<GasButtonWrapper />
<Box height={32}>
<Separator color="separatorTertiary" direction="vertical" thickness={1} />
</Box>
<SubmitButton inputAmountError={inputAmountError} isSubmitting={isSubmitting} onSubmit={onSubmit} />
<SubmitButton
inputAmountError={inputAmountError}
isSubmitting={isSubmitting}
onSubmit={onSubmit}
renderSubmitButton={renderSubmitButton}
/>
</>
);
});
Expand Down Expand Up @@ -79,9 +91,10 @@ type SubmitButtonProps = {
inputAmountError: SharedValue<InputAmountError>;
isSubmitting: SharedValue<boolean>;
onSubmit: () => Promise<void>;
renderSubmitButton?: DepositSubmitButtonRenderer;
};

const SubmitButton = memo(function SubmitButton({ inputAmountError, isSubmitting, onSubmit }: SubmitButtonProps) {
const SubmitButton = memo(function SubmitButton({ inputAmountError, isSubmitting, onSubmit, renderSubmitButton }: SubmitButtonProps) {
const { isDarkMode } = useColorMode();
const { config, theme, useQuoteStore } = useDepositContext();
const useCustomExecute = Boolean(config.execute);
Expand Down Expand Up @@ -114,6 +127,23 @@ const SubmitButton = memo(function SubmitButton({ inputAmountError, isSubmitting
return status === null || status === DepositQuoteStatus.Error || status === DepositQuoteStatus.InsufficientGas;
});

const submitButtonLabel = useSharedValueState(label, { pauseSync: !renderSubmitButton });
const isSubmitButtonDisabled = useSharedValueState(disabled, { pauseSync: !renderSubmitButton });
const isSubmitButtonProcessing = useSharedValueState(isSubmitting, { pauseSync: !renderSubmitButton });

if (renderSubmitButton) {
return (
<Box flexGrow={1}>
{renderSubmitButton({
disabled: isSubmitButtonDisabled,
isSubmitting: isSubmitButtonProcessing,
label: submitButtonLabel,
onSubmit,
})}
</Box>
);
}

return (
<Box flexGrow={1}>
<PerpsSwapButton accentColor={accentColor} disabled={disabled} label={label} onLongPress={onSubmit} />
Expand Down
10 changes: 10 additions & 0 deletions src/systems/funding/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { type Signer } from '@ethersproject/abstract-signer';
import { type ReactNode } from 'react';
import { type Address } from 'viem';
import { type DerivedValue, type SharedValue } from 'react-native-reanimated';
import { type CrosschainQuote, type Quote, type Source } from '@rainbow-me/swaps';
Expand Down Expand Up @@ -201,6 +202,15 @@ export type DepositLabels = {
title: string;
};

export type DepositSubmitButtonRenderParams = {
disabled: boolean;
isSubmitting: boolean;
label: string;
onSubmit: () => Promise<void>;
};

export type DepositSubmitButtonRenderer = (params: DepositSubmitButtonRenderParams) => ReactNode;

/**
* ### `DepositConfig`
*
Expand Down
Loading