Skip to content

Commit

Permalink
ci(release): publish latest release
Browse files Browse the repository at this point in the history
  • Loading branch information
hello-happy-puppy committed Oct 4, 2024
1 parent 29c499f commit aad7fb3
Show file tree
Hide file tree
Showing 867 changed files with 31,622 additions and 10,623 deletions.
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @uniswap/web-admins
76 changes: 69 additions & 7 deletions RELEASE
Original file line number Diff line number Diff line change
@@ -1,10 +1,72 @@
We are back with some new updates! Here’s the latest:
IPFS hash of the deployment:
- CIDv0: `QmNhWv1wsYtTeENpAN7Niquy4TMJ6JzEh8ZZqPGCoeYcGH`
- CIDv1: `bafybeiaflbrdbl3olcods3uy3feg64eaepg736m7aoiwuw3ctsyla36iri`

Report Spam NFTs - You can now report spam NFTs and hide them from your feed and activity.
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org).

You can also access the Uniswap Interface from an IPFS gateway.
**BEWARE**: The Uniswap interface uses [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) to remember your settings, such as which tokens you have imported.
**You should always use an IPFS gateway that enforces origin separation**, or our hosted deployment of the latest release at [app.uniswap.org](https://app.uniswap.org).
Your Uniswap settings are never remembered across different URLs.

IPFS gateways:
- https://bafybeiaflbrdbl3olcods3uy3feg64eaepg736m7aoiwuw3ctsyla36iri.ipfs.dweb.link/
- https://bafybeiaflbrdbl3olcods3uy3feg64eaepg736m7aoiwuw3ctsyla36iri.ipfs.cf-ipfs.com/
- [ipfs://QmNhWv1wsYtTeENpAN7Niquy4TMJ6JzEh8ZZqPGCoeYcGH/](ipfs://QmNhWv1wsYtTeENpAN7Niquy4TMJ6JzEh8ZZqPGCoeYcGH/)

## 5.50.0 (2024-10-04)


### Features

* **web:** add the review screen modal to the add liquidity flow (#12210) a43a6cd
* **web:** avoid duplicate swap steps upon closing/reopening review modal (#12232) 7613047
* **web:** call Trading API for increase/decrease/create LP actions (#12280) b563835
* **web:** generate steps for increasing position (#12339) 08fddec
* **web:** handle swap saga cancellation / interruption (#12115) e78fe1f
* **web:** move routing diagram to uniswap (#12244) 7cc63c4
* **web:** move web swap settings to popover (#12118) 0be1d91
* **web:** setting up backend for create position range (#12193) 0ddb961
* **web:** single swap step UI state (#12410) 6132c6c
* **web:** step-specific swap review button text (#12117) 1327c62
* **web:** swap detail line items (#12169) 1eb5c93
* **web:** universal swap bridge link banners + across bridging promo banner (#12378) d3d2641
* **web:** v2 position details data (#12216) 67f8087
* **web:** v3 position detail page API integration (#12217) 4328bdf
* **web:** v4 PosDP improvements (#12255) 83e7a77


### Bug Fixes

* **web:** add requestId and quoteId to post /order request (#12614) 562361b
* **web:** deadline input field focus (#12405) 9ace591
* **web:** disabled button states (#12509) 0dc3f11
* **web:** disallow non numerical input on deadline (#12265) 36d1d33
* **web:** dont respect url flag overrides on prod - staging (#12549) 69f3780
* **web:** fix token warnings on URL query prefill (#12329) e951732
* **web:** Fix/top tokens cache staging (#12570) 70ac444
* **web:** only clear amount input on swap success in shared flow (#12231) 1f28931
* **web:** priority orders only enabled on base (#12437) 4902650
* **web:** remove hardcoded web saga var (#12520) 8d87977
* **web:** reset inputs after trade, no rogue data (#12335) b2a2710
* **web:** rm prod arb+eth quicknode urls [staging] (#12647) 9d2d765
* **web:** segmented control flashing and off by 1px (#12319) 2d88b56
* **web:** suggested tokens height (#12454) 64ffee3
* **web:** swap review screen ux/ui fixes (#12267) b76218d
* **web:** swap tabs from pathname (#12126) 1c25507
* **web:** swap UI nits (#12448) 3777948
* **web:** swap warning tooltip width (#12125) 89130ab
* **web:** switch chain in wrap saga (#12263) 7f81f76
* **web:** testlio polish - limit form button color + hidden header should not prevent clicks (#12413) 4bb70f9
* **web:** ui fixes part 1 (#12279) 8b3abdc
* **web:** uniswapx toasts/polling [staging] (#12659) 7a14094
* **web:** universal swap flow on tdp and pdp (#12257) c296cd1
* **web:** update simulation param for async swap step (#12490) 06dc81d
* **web:** use proper arb+eth urls [staging] (#12674) dd4b6b5


### Continuous Integration

* **web:** update sitemaps 1f57186

Other changes:

- Added explainers for hidden tokens, popular tokens, and hidden NFTs
- Removed activity feed items related to any hidden NFTs
- More optimized keyboard functionality across the app
- Various bug fixes and performance improvements
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
mobile/1.36
web/5.50.0
3 changes: 3 additions & 0 deletions apps/extension/jest-setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { AppearanceSettingType } from 'wallet/src/features/appearance/slice'
import { TextEncoder, TextDecoder } from 'util'
import { mockSharedPersistQueryClientProvider } from 'uniswap/src/test/mocks/mockSharedPersistQueryClientProvider'
import { mockUIAssets } from 'ui/src/test/mocks/mockUIAssets'
import { mockLocalizationContext } from 'uniswap/src/test/mocks/locale'

process.env.IS_UNISWAP_EXTENSION = true

Expand Down Expand Up @@ -72,6 +73,8 @@ jest.mock('wallet/src/features/appearance/hooks', () => {
}
})

jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext({}))

jest.mock('uniswap/src/data/apiClients/SharedPersistQueryClientProvider', () => mockSharedPersistQueryClientProvider)

mockUIAssets()
8 changes: 4 additions & 4 deletions apps/extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
"@svgr/webpack": "8.0.1",
"@tamagui/core": "1.108.4",
"@types/uuid": "9.0.1",
"@uniswap/analytics-events": "2.36.0",
"@uniswap/uniswapx-sdk": "^2.1.0-beta.8",
"@uniswap/analytics-events": "2.37.0",
"@uniswap/uniswapx-sdk": "^2.1.0-beta.14",
"@uniswap/universal-router-sdk": "2.2.0",
"@uniswap/v3-sdk": "3.14.0",
"dotenv-webpack": "8.0.1",
Expand All @@ -26,7 +26,7 @@
"react-dom": "18.2.0",
"react-i18next": "14.1.0",
"react-native": "0.73.6",
"react-native-gesture-handler": "2.15.0",
"react-native-gesture-handler": "2.19.0",
"react-native-reanimated": "3.15.0",
"react-native-svg": "15.1.0",
"react-native-web": "0.19.10",
Expand Down Expand Up @@ -84,7 +84,7 @@
"private": true,
"scripts": {
"build:production": "webpack --node-env=production --env BUILD_ENV=prod BUILD_NUM=${BUILD_NUM:-0}",
"check:circular": "concurrently \"../../scripts/check-circular-imports.sh ./src/sidebar/sidebar.tsx 1\" \"../../scripts/check-circular-imports.sh ./src/onboarding/onboarding.tsx 1\"",
"check:circular": "concurrently \"../../scripts/check-circular-imports.sh ./src/entry/sidebar.tsx 1\" \"../../scripts/check-circular-imports.sh ./src/entry/onboarding.tsx 1\" \"../../scripts/check-circular-imports.sh ./src/entry/unitagClaim.tsx 1\"",
"check:deps:usage": "depcheck",
"env:local:download": "bash ../../scripts/downloadEnvLocal.sh web-local-envs ../../.env",
"env:local:upload": "bash ../../scripts/uploadEnvLocal.sh web-local-envs ../../.env",
Expand Down
22 changes: 16 additions & 6 deletions apps/extension/src/app/OnboardingApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { PersistGate } from 'redux-persist/integration/react'
import { ExtensionStatsigProvider } from 'src/app/StatsigProvider'
import { GraphqlProvider } from 'src/app/apollo'
import { ErrorElement } from 'src/app/components/ErrorElement'
import { ClaimUnitagScreen } from 'src/app/features/onboarding/ClaimUnitagScreen'
import { Complete } from 'src/app/features/onboarding/Complete'
import {
CreateOnboardingSteps,
Expand Down Expand Up @@ -55,6 +56,14 @@ const unsupportedRoute: RouteObject = {
element: <UnsupportedBrowserScreen />,
}

const createSteps = {
[CreateOnboardingSteps.Password]: <PasswordCreate />,
[CreateOnboardingSteps.ViewMnemonic]: <ViewMnemonic />,
[CreateOnboardingSteps.TestMnemonic]: <TestMnemonic />,
[CreateOnboardingSteps.Naming]: <NameWallet />,
[CreateOnboardingSteps.Complete]: <Complete flow={ExtensionOnboardingFlow.New} />,
}

const allRoutes = [
{
path: '',
Expand All @@ -66,15 +75,16 @@ const allRoutes = [
},
{
path: OnboardingRoutes.Create,
element: <OnboardingStepsProvider key={OnboardingRoutes.Create} steps={createSteps} />,
},
{
path: OnboardingRoutes.Claim,
element: (
<OnboardingStepsProvider
key={OnboardingRoutes.Create}
key={OnboardingRoutes.Claim}
steps={{
[CreateOnboardingSteps.Password]: <PasswordCreate />,
[CreateOnboardingSteps.ViewMnemonic]: <ViewMnemonic />,
[CreateOnboardingSteps.TestMnemonic]: <TestMnemonic />,
[CreateOnboardingSteps.Naming]: <NameWallet />,
[CreateOnboardingSteps.Complete]: <Complete flow={ExtensionOnboardingFlow.New} />,
[CreateOnboardingSteps.ClaimUnitag]: <ClaimUnitagScreen />,
...createSteps,
}}
/>
),
Expand Down
106 changes: 106 additions & 0 deletions apps/extension/src/app/UnitagClaimApp.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import '@tamagui/core/reset.css'
import 'src/app/Global.css'

import { useEffect } from 'react'
import { I18nextProvider } from 'react-i18next'
import { Outlet, RouterProvider } from 'react-router-dom'
import { PersistGate } from 'redux-persist/integration/react'
import { ExtensionStatsigProvider } from 'src/app/StatsigProvider'
import { GraphqlProvider } from 'src/app/apollo'
import { ErrorElement } from 'src/app/components/ErrorElement'
import { TraceUserProperties } from 'src/app/components/Trace/TraceUserProperties'
import { ClaimUnitagSteps, OnboardingStepsProvider } from 'src/app/features/onboarding/OnboardingSteps'
import { UnitagChooseProfilePicScreen } from 'src/app/features/unitags/UnitagChooseProfilePicScreen'
import { UnitagClaimContextProvider } from 'src/app/features/unitags/UnitagClaimContext'
import { UnitagCreateUsernameScreen } from 'src/app/features/unitags/UnitagCreateUsernameScreen'
import { UnitagIntroScreen } from 'src/app/features/unitags/UnitagIntroScreen'
import { setRouter, setRouterState } from 'src/app/navigation/state'
import { SentryAppNameTag, initializeSentry, sentryCreateHashRouter } from 'src/app/sentry'
import { initExtensionAnalytics } from 'src/app/utils/analytics'
import { getLocalUserId } from 'src/app/utils/storage'
import { getReduxPersistor, getReduxStore } from 'src/store/store'
import { Flex } from 'ui/src'
import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext'
import Trace from 'uniswap/src/features/telemetry/Trace'
import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context'
import i18n from 'uniswap/src/i18n/i18n'
import { logger } from 'utilities/src/logger/logger'
import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary'
import { SharedWalletProvider } from 'wallet/src/providers/SharedWalletProvider'

getLocalUserId()
.then((userId) => {
initializeSentry(SentryAppNameTag.UnitagClaim, userId)
})
.catch((error) => {
logger.error(error, {
tags: { file: 'UnitagClaimApp.tsx', function: 'getLocalUserId' },
})
})

const router = sentryCreateHashRouter([
{
path: '',
element: <UnitagClaimAppInner />,
errorElement: <ErrorElement />,
},
])

/**
* Note: we are using a pattern here to avoid circular dependencies, because
* this is the root of the app and it imports all sub-pages, we need to push the
* router/router state to a different file so it can be imported by those pages
*/
router.subscribe((state) => {
setRouterState(state)
})

setRouter(router)

function UnitagClaimAppInner(): JSX.Element {
return (
<Flex alignItems="center" justifyContent="center" minHeight="100vh" width="100%">
<OnboardingStepsProvider
disableRedirect
steps={{
[ClaimUnitagSteps.Intro]: <UnitagIntroScreen />,
[ClaimUnitagSteps.CreateUsername]: <UnitagCreateUsernameScreen />,
[ClaimUnitagSteps.ChooseProfilePic]: <UnitagChooseProfilePicScreen />,
}}
ContainerComponent={UnitagClaimContextProvider}
/>
<Outlet />
</Flex>
)
}

// TODO WALL-4876 combine this with `PopupApp`
export default function UnitagClaimApp(): JSX.Element {
// initialize analytics on load
useEffect(() => {
initExtensionAnalytics().catch(() => undefined)
}, [])

return (
<Trace>
<PersistGate persistor={getReduxPersistor()}>
<ExtensionStatsigProvider>
<I18nextProvider i18n={i18n}>
<SharedWalletProvider reduxStore={getReduxStore()}>
<ErrorBoundary>
<GraphqlProvider>
<LocalizationContextProvider>
<UnitagUpdaterContextProvider>
<TraceUserProperties />
<RouterProvider router={router} />
</UnitagUpdaterContextProvider>
</LocalizationContextProvider>
</GraphqlProvider>
</ErrorBoundary>
</SharedWalletProvider>
</I18nextProvider>
</ExtensionStatsigProvider>
</PersistGate>
</Trace>
)
}
71 changes: 7 additions & 64 deletions apps/extension/src/app/components/tabs/NftsTab.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
import { SharedEventName } from '@uniswap/analytics-events'
import { memo, useCallback } from 'react'
import { useSelector } from 'react-redux'
import { ContextMenu, Flex } from 'ui/src'
import { fromGraphQLChain } from 'uniswap/src/features/chains/utils'
import { selectNftsVisibility } from 'uniswap/src/features/favorites/selectors'
import { Flex } from 'ui/src'
import { ElementName, SectionName } from 'uniswap/src/features/telemetry/constants'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { UniverseChainId } from 'uniswap/src/types/chains'
import { NftViewWithContextMenu } from 'wallet/src/components/nfts/NftViewWithContextMenu'
import { NftsList } from 'wallet/src/components/nfts/NftsList'
import { NFTViewer } from 'wallet/src/features/images/NFTViewer'
import { ESTIMATED_NFT_LIST_ITEM_SIZE } from 'wallet/src/features/nfts/constants'
import { NFTItem } from 'wallet/src/features/nfts/types'
import { useNFTContextMenu } from 'wallet/src/features/nfts/useNftContextMenu'
import { getIsNftHidden } from 'wallet/src/features/nfts/utils'

export const NftsTab = memo(function _NftsTab({ owner }: { owner: Address }): JSX.Element {
const renderNFTItem = useCallback(
Expand All @@ -24,7 +17,11 @@ export const NftsTab = memo(function _NftsTab({ owner }: { owner: Address }): JS
})
}

return <NftView item={item} owner={owner} onPress={onPress} />
return (
<Flex fill m="$spacing4">
<NftViewWithContextMenu item={item} owner={owner} onPress={onPress} />
</Flex>
)
},
[owner],
)
Expand All @@ -39,60 +36,6 @@ export const NftsTab = memo(function _NftsTab({ owner }: { owner: Address }): JS
)
})

function NftView({ owner, item, onPress }: { owner: Address; item: NFTItem; onPress: () => void }): JSX.Element {
const { menuActions } = useNFTContextMenu({
contractAddress: item.contractAddress,
tokenId: item.tokenId,
owner,
isSpam: item.isSpam,
chainId: fromGraphQLChain(item.chain) ?? UniverseChainId.Mainnet,
})

const menuOptions = menuActions.map((action) => ({
label: action.title,
onPress: action.onPress,
Icon: action.Icon,
destructive: action.destructive,
}))

const nftVisibility = useSelector(selectNftsVisibility)
const hidden = getIsNftHidden({
contractAddress: item.contractAddress,
tokenId: item.tokenId,
isSpam: item.isSpam,
nftVisibility,
})

const itemId = `${item.chain}-${item.contractAddress}-${item.tokenId}-${hidden}`

return (
<Flex grow shrink p="$spacing4">
<ContextMenu itemId={itemId} menuOptions={menuOptions}>
<Flex
alignItems="center"
aspectRatio={1}
backgroundColor="$surface3"
borderRadius="$rounded12"
overflow="hidden"
width="100%"
onPress={onPress}
>
<NFTViewer
showSvgPreview
contractAddress={item.contractAddress}
imageDimensions={item.imageDimensions}
limitGIFSize={ESTIMATED_NFT_LIST_ITEM_SIZE}
placeholderContent={item.name || item.collectionName}
squareGridView={true}
tokenId={item.tokenId}
uri={item.imageUrl ?? ''}
/>
</Flex>
</ContextMenu>
</Flex>
)
}

const defaultEmptyStyle = {
minHeight: 100,
paddingVertical: '$spacing12',
Expand Down
Loading

0 comments on commit aad7fb3

Please sign in to comment.