Skip to content

Commit

Permalink
feat: unlimited intro dialog (#1226)
Browse files Browse the repository at this point in the history
Co-authored-by: Tyler <[email protected]>
  • Loading branch information
moo-onthelawn and tyleroooo authored Nov 14, 2024
1 parent 20286a7 commit b0b57dd
Show file tree
Hide file tree
Showing 34 changed files with 430 additions and 7 deletions.
Binary file added public/unlimited/affiliates-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/affiliates-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/affiliates-original.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/unlimited/announcement.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/launch-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/launch-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/launch-original.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/rewards-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/rewards-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/rewards-original.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/vault-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/vault-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/unlimited/vault-original.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 19 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import { config, privyConfig } from '@/lib/wagmi';

import { RestrictionWarning } from './components/RestrictionWarning';
import { ComplianceStates } from './constants/compliance';
import { DialogTypes } from './constants/dialogs';
import { funkitConfig, funkitTheme } from './constants/funkit';
import { LocalStorageKey } from './constants/localStorage';
import { useAnalytics } from './hooks/useAnalytics';
Expand All @@ -62,10 +63,13 @@ import { testFlags } from './lib/testFlags';
import LaunchMarket from './pages/LaunchMarket';
import { AffiliatesPage } from './pages/affiliates/AffiliatesPage';
import { persistor } from './state/_store';
import { getIsAccountConnected } from './state/accountSelectors';
import { appQueryClient } from './state/appQueryClient';
import { useAppDispatch, useAppSelector } from './state/appTypes';
import { AppTheme, setAppThemeSetting } from './state/appUiConfigs';
import { getAppThemeSetting } from './state/appUiConfigsSelectors';
import { openDialog } from './state/dialogs';
import { getHasSeenUnlimitedAnnouncement } from './state/dismissableSelectors';
import breakpoints from './styles/breakpoints';
import { CommunityChartContainer } from './views/Affiliates/community-chart/ProgramChartContainer';

Expand All @@ -87,6 +91,8 @@ const Content = () => {
useCommandMenu();
usePrefetchedQueries();
useReferralCode();
useUnlimitedLaunchDialog();
useUiRefreshMigrations();

const { isTablet, isNotTablet } = useBreakpoints();
const { chainTokenLabel } = useTokenConfigs();
Expand All @@ -106,7 +112,6 @@ const Content = () => {
}, [location.hash]);

const { dialogAreaRef } = useDialogArea() ?? {};
useUiRefreshMigrations();

return (
<>
Expand Down Expand Up @@ -209,6 +214,19 @@ const wrapProvider = (Component: React.ComponentType<any>, props?: any) => {
);
};

function useUnlimitedLaunchDialog() {
const showUnlimitedAnnouncement = testFlags.pml && testFlags.enableVaults;
const hasSeenUnlimitedAnnouncement = useAppSelector(getHasSeenUnlimitedAnnouncement);
const isAccountConnected = useAppSelector(getIsAccountConnected);

const dispatch = useAppDispatch();
useEffect(() => {
if (isAccountConnected && showUnlimitedAnnouncement && !hasSeenUnlimitedAnnouncement) {
dispatch(openDialog(DialogTypes.UnlimitedAnnouncement({})));
}
}, [dispatch, showUnlimitedAnnouncement, hasSeenUnlimitedAnnouncement, isAccountConnected]);
}

const providers = [
wrapProvider(PrivyProvider, {
appId: import.meta.env.VITE_PRIVY_APP_ID ?? 'dummyappiddummyappiddummy',
Expand Down
2 changes: 1 addition & 1 deletion src/components/Button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ const buttonActionVariants = {
[ButtonStyle.Default]: css`
--button-textColor: var(--color-text-button);
--button-backgroundColor: var(--color-accent);
--button-border: solid var(--border-width) var(--color-border-white);
--button-border: solid var(--border-width) var(--color-accent);
--button-hover-filter: brightness(var(--hover-filter-variant));
`,
[ButtonStyle.WithoutBackground]: css`
Expand Down
11 changes: 11 additions & 0 deletions src/components/Dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ type ElementProps = {
preventClose?: boolean;
slotTrigger?: React.ReactNode;
slotHeaderAbove?: React.ReactNode;
slotHeader?: React.ReactNode;
slotHeaderInner?: React.ReactNode;
slotFooter?: React.ReactNode;
withClose?: boolean;
Expand Down Expand Up @@ -83,6 +84,7 @@ export const Dialog = ({
preventClose,
slotTrigger,
slotHeaderAbove,
slotHeader,
slotHeaderInner,
slotFooter,
stacked,
Expand Down Expand Up @@ -137,6 +139,15 @@ export const Dialog = ({

{slotHeaderInner}
</$StackedHeaderTopRow>
) : slotHeader ? (
<div>
{!preventClose && withClose && (
<$Close ref={closeButtonRef} $absolute>
<Icon iconName={IconName.Close} />
</$Close>
)}
{slotHeader}
</div>
) : (
<$Header $withBorder={hasHeaderBorder} $withBlur={hasHeaderBlur}>
<div tw="row gap-[--dialog-title-gap]">
Expand Down
2 changes: 2 additions & 0 deletions src/constants/dialogs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export type TriggersDialogProps = {
navigateToMarketOrders: (market: string) => void;
};
export type TransferDialogProps = { selectedAsset?: DydxChainAsset };
export type UnlimitedAnnouncementDialogProps = {};
export type UnstakeDialogProps = {};
export type VaultDepositWithdrawDialogProps = { initialType?: 'DEPOSIT' | 'WITHDRAW' };
export type WithdrawDialogProps = {};
Expand Down Expand Up @@ -147,6 +148,7 @@ export const DialogTypes = unionize(
Trade: ofType<TradeDialogProps>(),
Transfer: ofType<TransferDialogProps>(),
Triggers: ofType<TriggersDialogProps>(),
UnlimitedAnnouncement: ofType<UnlimitedAnnouncementDialogProps>(),
Unstake: ofType<UnstakeDialogProps>(),
VaultDepositWithdraw: ofType<VaultDepositWithdrawDialogProps>(),
Withdraw: ofType<WithdrawDialogProps>(),
Expand Down
15 changes: 15 additions & 0 deletions src/constants/unlimitedAnnouncement.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export enum UnlimitedAnnouncementDialogSteps {
Announcement = 'Announcement',
MarketListings = 'MarketListings',
MegaVault = 'MegaVault',
AffiliatesProgram = 'Affiliates',
Incentives = 'Incentives',
}

export const unlimitedAnnouncementStepOrder = [
UnlimitedAnnouncementDialogSteps.Announcement,
UnlimitedAnnouncementDialogSteps.MarketListings,
UnlimitedAnnouncementDialogSteps.MegaVault,
UnlimitedAnnouncementDialogSteps.AffiliatesProgram,
UnlimitedAnnouncementDialogSteps.Incentives,
] as const;
11 changes: 7 additions & 4 deletions src/hooks/useAppThemeAndColorMode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@ export const AppThemeAndColorModeProvider = ({ ...props }) => {
return <ThemeProvider theme={useAppThemeAndColorModeContext()} {...props} />;
};

export const useAppThemeAndColorModeContext = () => {
export const useCurrentAppThemeSetting = () => {
const themeSetting: AppThemeSetting = useAppSelector(getAppThemeSetting);
const colorMode: AppColorMode = useAppSelector(getAppColorMode);

const darkModePref = globalThis.matchMedia('(prefers-color-scheme: dark)');

const [systemPreference, setSystemPreference] = useState(
Expand Down Expand Up @@ -54,6 +52,11 @@ export const useAppThemeAndColorModeContext = () => {
return systemPreference;
}
};
return getThemeFromSetting();
};

return Themes[getThemeFromSetting()][colorMode];
export const useAppThemeAndColorModeContext = () => {
const colorMode: AppColorMode = useAppSelector(getAppColorMode);
const theme = useCurrentAppThemeSetting();
return Themes[theme][colorMode];
};
2 changes: 2 additions & 0 deletions src/layout/DialogManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import { StakingRewardDialog } from '@/views/dialogs/StakingRewardDialog';
import { TradeDialog } from '@/views/dialogs/TradeDialog';
import { TransferDialog } from '@/views/dialogs/TransferDialog';
import { TriggersDialog } from '@/views/dialogs/TriggersDialog';
import { UnlimitedAnnouncementDialog } from '@/views/dialogs/UnlimitedAnnouncementDialog/UnlimitedAnnouncementDialog';
import { UnstakeDialog } from '@/views/dialogs/UnstakeDialog';
import { VaultDepositWithdrawDialog } from '@/views/dialogs/VaultDepositWithdrawDialog';
import { WithdrawDialog } from '@/views/dialogs/WithdrawDialog';
Expand Down Expand Up @@ -112,6 +113,7 @@ export const DialogManager = () => {
Trade: (args) => <TradeDialog {...args} {...modalProps} />,
Triggers: (args) => <TriggersDialog {...args} {...modalProps} />,
Transfer: (args) => <TransferDialog {...args} {...modalProps} />,
UnlimitedAnnouncement: (args) => <UnlimitedAnnouncementDialog {...args} {...modalProps} />,
Unstake: (args) => <UnstakeDialog {...args} {...modalProps} />,
VaultDepositWithdraw: (args) => <VaultDepositWithdrawDialog {...args} {...modalProps} />,
Withdraw: (args) => <WithdrawDialog {...args} {...modalProps} />,
Expand Down
2 changes: 1 addition & 1 deletion src/layout/Header/HeaderDesktop.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ export const HeaderDesktop = () => {
shape={ButtonShape.Pill}
size={ButtonSize.XSmall}
action={
MustBigNumber(availableBalance?.current).gt(0)
!availableBalance || MustBigNumber(availableBalance.current).gt(0)
? ButtonAction.Secondary
: ButtonAction.Primary
}
Expand Down
1 change: 1 addition & 0 deletions src/state/affiliates.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { PayloadAction } from '@reduxjs/toolkit';
import { createSlice } from '@reduxjs/toolkit';

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface AffiliatesState {
latestReferrer: string | undefined;
}
Expand Down
1 change: 1 addition & 0 deletions src/state/appUiConfigs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export enum OtherPreference {
ReverseLayout = 'ReverseLayout',
}

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface AppUIConfigsState {
appThemeSetting: AppThemeSetting;
appColorMode: AppColorMode;
Expand Down
7 changes: 7 additions & 0 deletions src/state/dismissable.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import type { PayloadAction } from '@reduxjs/toolkit';
import { createSlice } from '@reduxjs/toolkit';

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface DismissableState {
hasSeenPredictionMarketIntroDialog: boolean;
dismissedAffiliateBanner: boolean;
hasSeenUnlimitedAnnouncement: boolean;
hasDismissedPmlBanner: boolean;
}

const initialState: DismissableState = {
hasSeenPredictionMarketIntroDialog: false,
dismissedAffiliateBanner: false,
hasSeenUnlimitedAnnouncement: false,
hasDismissedPmlBanner: false,
};

Expand All @@ -23,6 +26,9 @@ export const dismissableSlice = createSlice({
setDismissedAffiliateBanner: (state, action: PayloadAction<boolean>) => {
state.dismissedAffiliateBanner = action.payload;
},
markUnlimitedAnnouncementSeen: (state) => {
state.hasSeenUnlimitedAnnouncement = true;
},
setHasDismissedPmlBanner: (state, action: PayloadAction<boolean>) => {
state.hasDismissedPmlBanner = action.payload;
},
Expand All @@ -32,5 +38,6 @@ export const dismissableSlice = createSlice({
export const {
setHasSeenPredictionMarketIntroDialog,
setDismissedAffiliateBanner,
markUnlimitedAnnouncementSeen,
setHasDismissedPmlBanner,
} = dismissableSlice.actions;
3 changes: 3 additions & 0 deletions src/state/dismissableSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,8 @@ export const getHasSeenPredictionMarketIntroDialog = (state: RootState) =>
export const getDismissedAffiliateBanner = (state: RootState) =>
state.dismissable.dismissedAffiliateBanner;

export const getHasSeenUnlimitedAnnouncement = (state: RootState) =>
state.dismissable.hasSeenUnlimitedAnnouncement;

export const getHasDismissedPmlBanner = (state: RootState) =>
state.dismissable.hasDismissedPmlBanner;
1 change: 1 addition & 0 deletions src/state/funkitDeposits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createSlice } from '@reduxjs/toolkit';

import { FunkitDeposit } from '@/constants/funkit';

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface FunkitDepositsState {
deposits: Record<string, FunkitDeposit>;
}
Expand Down
1 change: 1 addition & 0 deletions src/state/tradingView.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { PayloadAction } from '@reduxjs/toolkit';
import { createSlice } from '@reduxjs/toolkit';

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface TradingViewState {
chartConfig?: object;
launchableMarketsChartConfig?: object;
Expand Down
1 change: 1 addition & 0 deletions src/state/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createSlice } from '@reduxjs/toolkit';

import { WalletInfo, WalletNetworkType } from '@/constants/wallets';

// NOTE: This app slice is persisted via redux-persist. Changes to this type may require migrations.
export interface WalletState {
sourceAccount: {
address?: string;
Expand Down
1 change: 1 addition & 0 deletions src/styles/text.css
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
--font-medium-regular: var(--fontWeight-regular) var(--fontSize-medium) var(--fontFamily-base);
--font-medium-book: var(--fontWeight-book) var(--fontSize-medium) var(--fontFamily-base);
--font-medium-medium: var(--fontWeight-medium) var(--fontSize-medium) var(--fontFamily-base);
--font-medium-bold: var(--fontWeight-bold) var(--fontSize-medium) var(--fontFamily-base);

--font-large-regular: var(--fontWeight-regular) var(--fontSize-large) var(--fontFamily-base);
--font-large-book: var(--fontWeight-book) var(--fontSize-large) var(--fontFamily-base);
Expand Down
28 changes: 28 additions & 0 deletions src/views/dialogs/UnlimitedAnnouncementDialog/CurrentStepDots.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import styled, { css } from 'styled-components';

import {
UnlimitedAnnouncementDialogSteps,
unlimitedAnnouncementStepOrder,
} from '@/constants/unlimitedAnnouncement';

export const CurrentStepDots = ({
currentStep,
}: {
currentStep: UnlimitedAnnouncementDialogSteps;
}) => (
<div tw="flex justify-center gap-0.5">
{unlimitedAnnouncementStepOrder.map((step) =>
step !== UnlimitedAnnouncementDialogSteps.Announcement ? (
<$Dot key={step} $highlight={step === currentStep} />
) : undefined
)}
</div>
);

const $Dot = styled.div<{ $highlight: boolean }>`
border-radius: 50%;
height: 0.4rem;
width: 0.4rem;
background-color: ${({ $highlight }) =>
$highlight ? css`var(--color-text-2);` : css`var(--color-text-0);`};
`;
Loading

0 comments on commit b0b57dd

Please sign in to comment.