├── .env.yarn.example
├── .github
└── workflows
│ ├── deploy-content.yaml
│ ├── deploy-events.yaml
│ ├── deploy-farcaster.yaml
│ ├── deploy-scheduler.yaml
│ └── deploy-services.yaml
├── .gitignore
├── .yarn
└── releases
│ └── yarn-4.1.1.cjs
├── .yarnrc.yml
├── LICENSE.md
├── README.md
├── apps
├── expo
│ ├── .gitignore
│ ├── app.json
│ ├── app
│ │ ├── (drawer)
│ │ │ ├── (tabs)
│ │ │ │ ├── (a)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── search
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── settings
│ │ │ │ │ │ ├── actions.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── mute
│ │ │ │ │ │ │ ├── channels.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── users.tsx
│ │ │ │ │ │ │ └── words.tsx
│ │ │ │ │ │ ├── notifications.tsx
│ │ │ │ │ │ ├── profile.tsx
│ │ │ │ │ │ └── theme.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (explore)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ ├── actions.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── search
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (frames)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── frames.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (media)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── media.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (notifications)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── notifications.tsx
│ │ │ │ │ ├── settings
│ │ │ │ │ │ └── notifications.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (profile)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── profile.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ ├── (transactions)
│ │ │ │ │ ├── _layout.tsx
│ │ │ │ │ ├── casts
│ │ │ │ │ │ └── [hash]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── likes.tsx
│ │ │ │ │ │ │ ├── quotes.tsx
│ │ │ │ │ │ │ └── recasts.tsx
│ │ │ │ │ ├── channels
│ │ │ │ │ │ └── [channelId]
│ │ │ │ │ │ │ ├── hosts.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collectibles
│ │ │ │ │ │ └── [nftId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── collections
│ │ │ │ │ │ └── [collectionId]
│ │ │ │ │ │ │ ├── collectors-farcaster.tsx
│ │ │ │ │ │ │ ├── collectors-following.tsx
│ │ │ │ │ │ │ ├── collectors.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── explore
│ │ │ │ │ │ └── actions.tsx
│ │ │ │ │ ├── lists
│ │ │ │ │ │ ├── [listId]
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── items.tsx
│ │ │ │ │ │ │ └── settings
│ │ │ │ │ │ │ │ ├── display.tsx
│ │ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ │ └── items.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── manage.tsx
│ │ │ │ │ ├── tokens
│ │ │ │ │ │ └── [tokenId]
│ │ │ │ │ │ │ ├── holders-farcaster.tsx
│ │ │ │ │ │ │ ├── holders-following.tsx
│ │ │ │ │ │ │ ├── holders.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── transactions.tsx
│ │ │ │ │ └── users
│ │ │ │ │ │ └── [username]
│ │ │ │ │ │ ├── feed.tsx
│ │ │ │ │ │ ├── followers.tsx
│ │ │ │ │ │ ├── following.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── mutuals.tsx
│ │ │ │ └── _layout.tsx
│ │ │ └── _layout.tsx
│ │ ├── (login)
│ │ │ ├── _layout.tsx
│ │ │ └── login
│ │ │ │ ├── dev.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── loading.tsx
│ │ ├── (modals)
│ │ │ ├── create
│ │ │ │ ├── cast.tsx
│ │ │ │ └── list.tsx
│ │ │ ├── enable-signer.tsx
│ │ │ └── image
│ │ │ │ └── [url].tsx
│ │ ├── +not-found.tsx
│ │ └── _layout.tsx
│ ├── assets
│ │ ├── adaptive-icon.png
│ │ ├── chains
│ │ │ ├── arbitrum.svg
│ │ │ ├── avalanche.svg
│ │ │ ├── base.svg
│ │ │ ├── binance.svg
│ │ │ ├── blast.png
│ │ │ ├── celo.svg
│ │ │ ├── degen.svg
│ │ │ ├── ethereum.svg
│ │ │ ├── fantom.svg
│ │ │ ├── frame.jpeg
│ │ │ ├── fraxtal.png
│ │ │ ├── gnosis.svg
│ │ │ ├── gold.png
│ │ │ ├── linea.svg
│ │ │ ├── mode.png
│ │ │ ├── optimism.svg
│ │ │ ├── orderly.png
│ │ │ ├── pgn.png
│ │ │ ├── pgn.svg
│ │ │ ├── polygon.png
│ │ │ ├── scroll.svg
│ │ │ ├── solana.svg
│ │ │ ├── stack.png
│ │ │ ├── zksync.svg
│ │ │ └── zora.svg
│ │ ├── farcaster.webp
│ │ ├── icon.png
│ │ ├── splash.png
│ │ └── warpcast.svg
│ ├── babel.config.js
│ ├── components
│ │ ├── ActionButton.tsx
│ │ ├── Analytics.tsx
│ │ ├── CollapsibleGradientLayout.tsx
│ │ ├── CollapsibleHeaderLayout.tsx
│ │ ├── CollapsibleLayout.tsx
│ │ ├── DisappearingLayout.tsx
│ │ ├── DrawerToggleButton.tsx
│ │ ├── IconButton.tsx
│ │ ├── Notifications.tsx
│ │ ├── PagerLayout.tsx
│ │ ├── SafeAreaView.tsx
│ │ ├── SearchBar.tsx
│ │ ├── SidebarLayout.tsx
│ │ ├── Toasts.tsx
│ │ └── screens
│ │ │ ├── CastLikesScreen.tsx
│ │ │ ├── CastQuotesScreen.tsx
│ │ │ ├── CastRecastsScreen.tsx
│ │ │ ├── CastScreen.tsx
│ │ │ ├── ChannelHostsScreen.tsx
│ │ │ ├── ChannelScreen.tsx
│ │ │ ├── ExploreActionsScreen.tsx
│ │ │ ├── ListItemsScreen.tsx
│ │ │ ├── ListItemsSearchScreen.tsx
│ │ │ ├── ListScreen.tsx
│ │ │ ├── ListSettingsDisplayScreen.tsx
│ │ │ ├── ListSettingsScreen.tsx
│ │ │ ├── ListsManageScreen.tsx
│ │ │ ├── ListsScreen.tsx
│ │ │ ├── NftCollectionCollectorsScreen.tsx
│ │ │ ├── NftCollectionScreen.tsx
│ │ │ ├── NftCollectorsScreen.tsx
│ │ │ ├── NftScreen.tsx
│ │ │ ├── SearchResultsScreen.tsx
│ │ │ ├── SearchScreen.tsx
│ │ │ ├── TokenHoldersScreen.tsx
│ │ │ ├── TokenScreen.tsx
│ │ │ ├── UserFeedScreen.tsx
│ │ │ ├── UserFollowersScreen.tsx
│ │ │ ├── UserFollowingScreen.tsx
│ │ │ ├── UserMutualsScreen.tsx
│ │ │ └── UserScreen.tsx
│ ├── eas.json
│ ├── hooks
│ │ └── useImageColors.ts
│ ├── index.ts
│ ├── metro.config.js
│ ├── package.json
│ └── tsconfig.json
└── next
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── app
│ ├── (default)
│ │ ├── (home)
│ │ │ ├── for-you
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── collectibles
│ │ │ └── [nftId]
│ │ │ │ ├── (engagement)
│ │ │ │ ├── collectors-farcaster
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── collectors-following
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── collectors
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── loading.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ ├── collections
│ │ │ └── [collectionId]
│ │ │ │ ├── (engagement)
│ │ │ │ ├── collectors-farcaster
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── collectors-following
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── collectors
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── loading.tsx
│ │ │ │ ├── (main)
│ │ │ │ ├── items
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── page.tsx
│ │ │ │ └── layout.tsx
│ │ ├── frames
│ │ │ ├── latest
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ ├── lists
│ │ │ ├── (main)
│ │ │ │ ├── channels
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ └── [listId]
│ │ │ │ ├── (main)
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── page.tsx
│ │ │ │ └── transactions
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── items
│ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ └── settings
│ │ │ │ ├── display
│ │ │ │ └── page.tsx
│ │ │ │ ├── items
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── manage
│ │ │ │ │ └── page.tsx
│ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ ├── loading.tsx
│ │ ├── media
│ │ │ ├── latest
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── notifications
│ │ │ ├── all
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ ├── mentions
│ │ │ │ └── page.tsx
│ │ │ └── page.tsx
│ │ ├── tokens
│ │ │ └── [tokenId]
│ │ │ │ ├── (engagement)
│ │ │ │ ├── holders-farcaster
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── holders-following
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── holders
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── loading.tsx
│ │ │ │ ├── (main)
│ │ │ │ ├── about
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── activity
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── loading.tsx
│ │ └── transactions
│ │ │ ├── all
│ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ ├── api
│ │ └── og
│ │ │ └── collectibles
│ │ │ └── [nftId]
│ │ │ └── route.tsx
│ ├── casts
│ │ └── [hash]
│ │ │ ├── (engagement)
│ │ │ ├── layout.tsx
│ │ │ ├── likes
│ │ │ │ └── page.tsx
│ │ │ ├── loading.tsx
│ │ │ ├── quotes
│ │ │ │ └── page.tsx
│ │ │ └── recasts
│ │ │ │ └── page.tsx
│ │ │ ├── (main)
│ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ └── loading.tsx
│ ├── channels
│ │ └── [channelId]
│ │ │ ├── all
│ │ │ └── page.tsx
│ │ │ ├── from-hosts
│ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ ├── media
│ │ │ └── page.tsx
│ │ │ └── page.tsx
│ ├── explore
│ │ ├── actions
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ ├── loading.tsx
│ │ └── page.tsx
│ ├── layout.tsx
│ ├── not-found.tsx
│ ├── providers.tsx
│ ├── search
│ │ ├── layout.tsx
│ │ ├── loading.tsx
│ │ └── page.tsx
│ ├── settings
│ │ ├── (main)
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ └── muted
│ │ │ ├── channels
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ │ ├── users
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ │ └── words
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ ├── signup
│ │ └── page.tsx
│ ├── users
│ │ └── [username]
│ │ │ ├── (engagement)
│ │ │ ├── followers
│ │ │ │ └── page.tsx
│ │ │ ├── following
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ └── mutuals
│ │ │ │ └── page.tsx
│ │ │ ├── (main)
│ │ │ ├── collectibles
│ │ │ │ └── page.tsx
│ │ │ ├── frames
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ ├── loading.tsx
│ │ │ ├── media
│ │ │ │ └── page.tsx
│ │ │ ├── page.tsx
│ │ │ ├── replies
│ │ │ │ └── page.tsx
│ │ │ ├── tokens
│ │ │ │ └── page.tsx
│ │ │ └── transactions
│ │ │ │ └── page.tsx
│ │ │ ├── feed
│ │ │ └── page.tsx
│ │ │ └── layout.tsx
│ └── ~
│ │ ├── add-cast-action
│ │ └── page.tsx
│ │ └── compose
│ │ └── page.tsx
│ ├── components
│ ├── MobileNavigation.tsx
│ ├── NavigationHeader.tsx
│ ├── PageNavigation.tsx
│ └── RootNavigation.tsx
│ ├── next-env.d.ts
│ ├── next.config.js
│ ├── package.json
│ ├── public
│ ├── .well-known
│ │ └── apple-app-site-association
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── banner.png
│ ├── browserconfig.xml
│ ├── chains
│ │ ├── arbitrum.svg
│ │ ├── avalanche.svg
│ │ ├── base.svg
│ │ ├── binance.svg
│ │ ├── blast.png
│ │ ├── celo.svg
│ │ ├── degen.svg
│ │ ├── ethereum.svg
│ │ ├── fantom.svg
│ │ ├── frame.jpeg
│ │ ├── fraxtal.png
│ │ ├── gnosis.svg
│ │ ├── gold.png
│ │ ├── linea.svg
│ │ ├── mode.png
│ │ ├── optimism.svg
│ │ ├── orderly.png
│ │ ├── pgn.png
│ │ ├── pgn.svg
│ │ ├── polygon.png
│ │ ├── scroll.svg
│ │ ├── solana.svg
│ │ ├── stack.png
│ │ ├── zksync.svg
│ │ └── zora.svg
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── fonts
│ │ ├── Inter-Bold.ttf
│ │ ├── Inter-Regular.ttf
│ │ └── Inter-SemiBold.ttf
│ ├── icon512_maskable.png
│ ├── icon512_rounded.png
│ ├── manifest.json
│ ├── mstile-150x150.png
│ ├── site.webmanifest
│ ├── tamagui.css
│ └── warpcast.svg
│ ├── tsconfig.json
│ ├── types.d.ts
│ └── utils
│ └── index.ts
├── biome.json
├── nixpacks.toml
├── package.json
├── packages
├── api
│ ├── nodemon.json
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── v0
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ ├── content
│ │ │ │ │ └── index.ts
│ │ │ │ ├── farcaster
│ │ │ │ │ ├── feed.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── signer.ts
│ │ │ │ ├── flags
│ │ │ │ │ └── index.ts
│ │ │ │ ├── frames
│ │ │ │ │ └── index.ts
│ │ │ │ ├── notifications
│ │ │ │ │ └── index.ts
│ │ │ │ └── pending
│ │ │ │ │ └── index.ts
│ │ │ └── services
│ │ │ │ └── pendingCast.ts
│ │ └── v1
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ ├── list.ts
│ │ │ ├── nft.ts
│ │ │ ├── settings.ts
│ │ │ ├── token.ts
│ │ │ ├── transaction.ts
│ │ │ └── user.ts
│ │ │ └── services
│ │ │ ├── auth.ts
│ │ │ ├── list.ts
│ │ │ ├── nft.ts
│ │ │ ├── settings.ts
│ │ │ ├── token.ts
│ │ │ └── transaction.ts
│ └── tsconfig.json
├── app-ui
│ ├── .gitignore
│ ├── package.json
│ ├── src
│ │ ├── Button.tsx
│ │ ├── Text.tsx
│ │ ├── index.tsx
│ │ ├── tamagui.config.ts
│ │ ├── themes.ts
│ │ └── types.d.ts
│ └── tsconfig.json
├── app
│ ├── .gitignore
│ ├── api
│ │ ├── auth
│ │ │ └── index.ts
│ │ ├── content
│ │ │ └── index.ts
│ │ ├── discover
│ │ │ ├── index.ts
│ │ │ └── search.ts
│ │ ├── farcaster
│ │ │ ├── actions.ts
│ │ │ ├── casts.ts
│ │ │ ├── channels.ts
│ │ │ ├── feed.ts
│ │ │ ├── index.ts
│ │ │ └── users.ts
│ │ ├── list
│ │ │ └── index.ts
│ │ ├── media
│ │ │ └── index.ts
│ │ ├── neynar
│ │ │ ├── casts.ts
│ │ │ ├── channels.ts
│ │ │ └── index.ts
│ │ ├── nft
│ │ │ └── index.ts
│ │ ├── notifications
│ │ │ ├── feed.ts
│ │ │ ├── index.ts
│ │ │ └── user.ts
│ │ ├── settings
│ │ │ ├── index.ts
│ │ │ └── notifications.ts
│ │ ├── token
│ │ │ └── index.ts
│ │ ├── transactions
│ │ │ └── index.ts
│ │ ├── utils.ts
│ │ └── warpcast
│ │ │ └── index.ts
│ ├── components
│ │ ├── blockchain
│ │ │ ├── chain-badge.tsx
│ │ │ ├── chain-icon.native.tsx
│ │ │ └── chain-icon.tsx
│ │ ├── cdn-avatar.native.tsx
│ │ ├── cdn-avatar.tsx
│ │ ├── dropdown.tsx
│ │ ├── embeds
│ │ │ ├── Embed.tsx
│ │ │ ├── EmbedCast.native.tsx
│ │ │ ├── EmbedCast.tsx
│ │ │ ├── EmbedImage.native.tsx
│ │ │ ├── EmbedImage.tsx
│ │ │ ├── EmbedMedia.tsx
│ │ │ ├── EmbedNook.tsx
│ │ │ ├── EmbedTwitter.tsx
│ │ │ ├── EmbedUrl.native.tsx
│ │ │ ├── EmbedUrl.tsx
│ │ │ ├── EmbedVideo.native.tsx
│ │ │ ├── EmbedVideo.tsx
│ │ │ └── frames
│ │ │ │ ├── EmbedFrame.native.tsx
│ │ │ │ ├── EmbedFrame.tsx
│ │ │ │ ├── TransactionFrameSheet.native.tsx
│ │ │ │ ├── TransactionFrameSheet.tsx
│ │ │ │ ├── context.native.tsx
│ │ │ │ └── context.tsx
│ │ ├── error-message.tsx
│ │ ├── farcaster
│ │ │ ├── bio-text.tsx
│ │ │ ├── casts
│ │ │ │ ├── cast-actions.tsx
│ │ │ │ ├── cast-custom-action.tsx
│ │ │ │ ├── cast-display-grid.native.tsx
│ │ │ │ ├── cast-display-grid.tsx
│ │ │ │ ├── cast-display.tsx
│ │ │ │ ├── cast-engagement.tsx
│ │ │ │ ├── cast-link.native.tsx
│ │ │ │ ├── cast-link.tsx
│ │ │ │ ├── cast-menu.tsx
│ │ │ │ ├── cast-preview.tsx
│ │ │ │ └── cast-text.tsx
│ │ │ ├── channels
│ │ │ │ ├── channel-display.tsx
│ │ │ │ ├── channel-follow-badge.tsx
│ │ │ │ ├── channel-menu.tsx
│ │ │ │ ├── channel-overview.tsx
│ │ │ │ ├── channel-select.tsx
│ │ │ │ └── channel-tooltip.tsx
│ │ │ └── users
│ │ │ │ ├── power-badge.tsx
│ │ │ │ ├── user-display.tsx
│ │ │ │ ├── user-follow-badge.tsx
│ │ │ │ ├── user-follow-button.tsx
│ │ │ │ └── user-menu.tsx
│ │ ├── gradient-icon.native.tsx
│ │ ├── gradient-icon.tsx
│ │ ├── infinite-feed.native.tsx
│ │ ├── infinite-feed.tsx
│ │ ├── infinite-scroll-list.tsx
│ │ ├── link.native.tsx
│ │ ├── link.tsx
│ │ ├── loading.native.tsx
│ │ ├── loading.tsx
│ │ ├── menu
│ │ │ ├── context.tsx
│ │ │ ├── menu-actions.native.tsx
│ │ │ ├── menu-actions.tsx
│ │ │ ├── menu-item.tsx
│ │ │ ├── menu.native.tsx
│ │ │ ├── menu.tsx
│ │ │ └── menu.web.tsx
│ │ ├── refresh-control.tsx
│ │ ├── tabs
│ │ │ └── tabs.tsx
│ │ ├── toasts.tsx
│ │ ├── upload
│ │ │ ├── image-picker.native.tsx
│ │ │ └── image-picker.tsx
│ │ ├── zoomable-image.native.tsx
│ │ └── zoomable-image.tsx
│ ├── context
│ │ ├── auth.native.tsx
│ │ ├── auth.tsx
│ │ ├── scroll.tsx
│ │ ├── theme.native.tsx
│ │ └── theme.tsx
│ ├── features
│ │ ├── actions
│ │ │ ├── install-action.tsx
│ │ │ └── install-dialog.tsx
│ │ ├── auth
│ │ │ └── account-switcher.tsx
│ │ ├── explore
│ │ │ ├── actions-feed.native.tsx
│ │ │ ├── actions-feed.tsx
│ │ │ ├── actions-item.tsx
│ │ │ ├── explore-actions.tsx
│ │ │ ├── explore-screen.tsx
│ │ │ └── explore-sidebar.tsx
│ │ ├── farcaster
│ │ │ ├── cast-feed
│ │ │ │ ├── filtered-feed-server.tsx
│ │ │ │ ├── filtered-feed.tsx
│ │ │ │ ├── infinite-feed.native.tsx
│ │ │ │ └── infinite-feed.tsx
│ │ │ ├── cast-screen
│ │ │ │ ├── cast-engagement-tabs.tsx
│ │ │ │ ├── cast-expanded.tsx
│ │ │ │ ├── cast-likes.tsx
│ │ │ │ ├── cast-quotes.tsx
│ │ │ │ ├── cast-recasts.tsx
│ │ │ │ └── cast-sidebar.tsx
│ │ │ ├── channel-feed
│ │ │ │ ├── channel-feed-item.tsx
│ │ │ │ ├── channel-feed.native.tsx
│ │ │ │ ├── channel-feed.tsx
│ │ │ │ └── channel-search-feed.tsx
│ │ │ ├── channel-profile
│ │ │ │ ├── channel-header.tsx
│ │ │ │ ├── channel-hosts.tsx
│ │ │ │ └── channel-sidebar.tsx
│ │ │ ├── create-cast
│ │ │ │ ├── action-bar.native.tsx
│ │ │ │ ├── action-bar.tsx
│ │ │ │ ├── action-buttons.tsx
│ │ │ │ ├── add-cast-button.tsx
│ │ │ │ ├── compose-screen.tsx
│ │ │ │ ├── context.tsx
│ │ │ │ ├── dialog.tsx
│ │ │ │ ├── form.tsx
│ │ │ │ ├── header-bar.native.tsx
│ │ │ │ ├── header-bar.tsx
│ │ │ │ ├── mentions.tsx
│ │ │ │ ├── trigger.native.tsx
│ │ │ │ └── trigger.tsx
│ │ │ ├── enable-signer
│ │ │ │ ├── content.native.tsx
│ │ │ │ ├── content.tsx
│ │ │ │ ├── dialog.native.tsx
│ │ │ │ └── dialog.tsx
│ │ │ ├── user-feed
│ │ │ │ ├── user-feed.native.tsx
│ │ │ │ ├── user-feed.tsx
│ │ │ │ ├── user-item.tsx
│ │ │ │ └── user-search-feed.tsx
│ │ │ └── user-profile
│ │ │ │ ├── user-followers.tsx
│ │ │ │ ├── user-following.tsx
│ │ │ │ ├── user-header.tsx
│ │ │ │ ├── user-mutuals.tsx
│ │ │ │ └── user-sidebar.tsx
│ │ ├── home
│ │ │ ├── default-sidebar.tsx
│ │ │ └── recommended-channels.tsx
│ │ ├── list
│ │ │ ├── channel-search.native.tsx
│ │ │ ├── channel-search.tsx
│ │ │ ├── create-list-trigger.native.tsx
│ │ │ ├── create-list-trigger.tsx
│ │ │ ├── infinite-feed.native.tsx
│ │ │ ├── infinite-feed.tsx
│ │ │ ├── item-channel.tsx
│ │ │ ├── item-feed.native.tsx
│ │ │ ├── item-feed.tsx
│ │ │ ├── item-user.tsx
│ │ │ ├── list-display-picker.tsx
│ │ │ ├── list-empty-state.tsx
│ │ │ ├── list-feed-item.tsx
│ │ │ ├── list-feed.tsx
│ │ │ ├── list-form.tsx
│ │ │ ├── list-header.tsx
│ │ │ ├── list-item-empty-state.tsx
│ │ │ ├── list-menu.tsx
│ │ │ ├── manage-list-dialog.tsx
│ │ │ ├── manage-list-item.tsx
│ │ │ ├── manage-list.native.tsx
│ │ │ ├── manage-list.tsx
│ │ │ ├── user-search.native.tsx
│ │ │ └── user-search.tsx
│ │ ├── nft
│ │ │ ├── nft-collection-collectors.tsx
│ │ │ ├── nft-collection-display.tsx
│ │ │ ├── nft-collection-header.tsx
│ │ │ ├── nft-collection-menu.tsx
│ │ │ ├── nft-collector-item.tsx
│ │ │ ├── nft-collectors.tsx
│ │ │ ├── nft-description.native.tsx
│ │ │ ├── nft-description.tsx
│ │ │ ├── nft-display.native.tsx
│ │ │ ├── nft-display.tsx
│ │ │ ├── nft-event-item.tsx
│ │ │ ├── nft-event-menu.tsx
│ │ │ ├── nft-events.tsx
│ │ │ ├── nft-feed-header.native.tsx
│ │ │ ├── nft-feed-header.tsx
│ │ │ ├── nft-feed.tsx
│ │ │ ├── nft-menu.tsx
│ │ │ ├── nft-mint-action.tsx
│ │ │ ├── nft-overview-screen.tsx
│ │ │ └── nft-overview.tsx
│ │ ├── notifications
│ │ │ ├── notification-link.native.tsx
│ │ │ ├── notification-link.tsx
│ │ │ ├── notifications-count.tsx
│ │ │ ├── notifications-feed-server.tsx
│ │ │ ├── notifications-feed.native.tsx
│ │ │ ├── notifications-feed.tsx
│ │ │ ├── notifications-item.tsx
│ │ │ └── notifications-tabs.tsx
│ │ ├── search
│ │ │ ├── search-bar.tsx
│ │ │ ├── search-header.tsx
│ │ │ ├── search-input.tsx
│ │ │ └── search-sidebar.tsx
│ │ ├── settings
│ │ │ ├── action-settings.tsx
│ │ │ ├── muted-channels.tsx
│ │ │ ├── muted-settings.tsx
│ │ │ ├── muted-users.tsx
│ │ │ ├── muted-words.tsx
│ │ │ ├── notification-settings.tsx
│ │ │ ├── profile-settings.tsx
│ │ │ ├── settings-screen.tsx
│ │ │ ├── theme-settings.tsx
│ │ │ └── username-settings.tsx
│ │ ├── signup
│ │ │ ├── context.tsx
│ │ │ └── signup-screen.tsx
│ │ ├── tabs
│ │ │ └── index.tsx
│ │ ├── token
│ │ │ ├── token-chart.native.tsx
│ │ │ ├── token-chart.tsx
│ │ │ ├── token-holder-item.tsx
│ │ │ ├── token-holders.tsx
│ │ │ ├── token-holdings.tsx
│ │ │ ├── token-menu.tsx
│ │ │ ├── token-overview.tsx
│ │ │ └── token-transactions.tsx
│ │ └── transactions
│ │ │ ├── infinite-feed.native.tsx
│ │ │ ├── infinite-feed.tsx
│ │ │ ├── tranasction-menu.tsx
│ │ │ ├── transaction-display-nft.native.tsx
│ │ │ ├── transaction-display-nft.tsx
│ │ │ ├── transaction-display.tsx
│ │ │ ├── transaction-feed-server.tsx
│ │ │ ├── transaction-feed.tsx
│ │ │ ├── transaction-group-selector.tsx
│ │ │ ├── transaction-link.native.tsx
│ │ │ └── transaction-link.tsx
│ ├── hooks
│ │ ├── api
│ │ │ ├── casts.ts
│ │ │ ├── channels.ts
│ │ │ ├── feed.ts
│ │ │ ├── lists.ts
│ │ │ ├── nfts.ts
│ │ │ ├── notifications.ts
│ │ │ ├── search.ts
│ │ │ ├── settings.ts
│ │ │ ├── tokens.ts
│ │ │ ├── transactions.ts
│ │ │ ├── users.ts
│ │ │ └── warpcast.ts
│ │ ├── useAddChannelToList.ts
│ │ ├── useAddUserToList.ts
│ │ ├── useAddress.ts
│ │ ├── useCast.ts
│ │ ├── useChannel.ts
│ │ ├── useDeleteCast.ts
│ │ ├── useFollowUser.ts
│ │ ├── useLikeCast.ts
│ │ ├── useList.ts
│ │ ├── useMuteChannel.ts
│ │ ├── useMuteUser.ts
│ │ ├── useNft.ts
│ │ ├── useNftCollection.ts
│ │ ├── useRecastCast.ts
│ │ ├── useStableCallback.ts
│ │ ├── useToken.ts
│ │ ├── useTokenHoldings.ts
│ │ └── useUser.ts
│ ├── index.ts
│ ├── package.json
│ ├── server
│ │ ├── auth.ts
│ │ └── session.ts
│ ├── store
│ │ ├── useCastStore.ts
│ │ ├── useChannelStore.ts
│ │ ├── useListStore.ts
│ │ ├── useMuteStore.ts
│ │ ├── useNftStore.ts
│ │ ├── useTokenStore.ts
│ │ └── useUserStore.ts
│ ├── tsconfig.json
│ └── utils
│ │ ├── chains.native.ts
│ │ ├── chains.ts
│ │ ├── haptics.native.ts
│ │ ├── haptics.ts
│ │ ├── index.ts
│ │ ├── local-storage.native.ts
│ │ ├── local-storage.ts
│ │ └── wagmi.ts
├── common
│ ├── clients
│ │ ├── api
│ │ │ ├── base.ts
│ │ │ ├── content.ts
│ │ │ ├── index.ts
│ │ │ ├── list.ts
│ │ │ ├── notifications.ts
│ │ │ ├── signer.ts
│ │ │ └── v1
│ │ │ │ ├── farcaster.ts
│ │ │ │ └── index.ts
│ │ ├── cache
│ │ │ ├── base.ts
│ │ │ ├── content.ts
│ │ │ ├── farcaster.ts
│ │ │ ├── index.ts
│ │ │ ├── nft.ts
│ │ │ ├── nook.ts
│ │ │ └── token.ts
│ │ └── index.ts
│ ├── farcaster
│ │ ├── events.ts
│ │ ├── index.ts
│ │ ├── message.ts
│ │ └── notifications.ts
│ ├── index.ts
│ ├── package.json
│ ├── prisma
│ │ ├── content.ts
│ │ ├── farcaster.ts
│ │ ├── index.ts
│ │ ├── lists.ts
│ │ ├── nook.ts
│ │ ├── notifications.ts
│ │ ├── schemas
│ │ │ ├── content.prisma
│ │ │ ├── farcaster.prisma
│ │ │ ├── list.prisma
│ │ │ ├── nook.prisma
│ │ │ ├── notifications.prisma
│ │ │ ├── signer.prisma
│ │ │ └── user.prisma
│ │ ├── signer.ts
│ │ └── user.ts
│ ├── queues
│ │ ├── enqueue.ts
│ │ └── index.ts
│ ├── tsconfig.json
│ ├── types
│ │ ├── api.ts
│ │ ├── content.ts
│ │ ├── events.ts
│ │ ├── farcaster.ts
│ │ ├── feed.ts
│ │ ├── frames.ts
│ │ ├── index.ts
│ │ ├── lists.ts
│ │ ├── nft.ts
│ │ ├── nook.ts
│ │ ├── notifications.ts
│ │ ├── providers
│ │ │ ├── onceupon
│ │ │ │ └── index.ts
│ │ │ ├── simplehash
│ │ │ │ ├── contract.ts
│ │ │ │ └── nft.ts
│ │ │ └── zerion
│ │ │ │ ├── index.ts
│ │ │ │ ├── token-chart.ts
│ │ │ │ ├── token.ts
│ │ │ │ └── transaction.ts
│ │ ├── simplehash.ts
│ │ ├── swap.ts
│ │ ├── token.ts
│ │ ├── transactions.ts
│ │ └── user.ts
│ └── utils
│ │ ├── chains.ts
│ │ ├── contracts.ts
│ │ └── index.ts
├── content-api
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── manual.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── refresh-embeds.ts
│ │ ├── routes
│ │ │ ├── content.ts
│ │ │ └── feed.ts
│ │ ├── service
│ │ │ ├── content.ts
│ │ │ └── feed.ts
│ │ ├── utils
│ │ │ ├── chain.ts
│ │ │ ├── index.ts
│ │ │ └── url.ts
│ │ └── worker.ts
│ └── tsconfig.json
├── dashboard
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
├── events
│ ├── handlers
│ │ ├── farcaster.ts
│ │ └── index.ts
│ ├── manual.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── worker.ts
├── farcaster-api
│ ├── nodemon.json
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── routes
│ │ │ ├── cast.ts
│ │ │ ├── channel.ts
│ │ │ └── user.ts
│ │ └── service
│ │ │ └── farcaster.ts
│ └── tsconfig.json
├── farcaster
│ ├── backfill
│ │ ├── channels.ts
│ │ ├── enqueue.ts
│ │ ├── index.ts
│ │ ├── processor.ts
│ │ └── stats.ts
│ ├── package.json
│ ├── src
│ │ ├── consumer.ts
│ │ ├── manual.ts
│ │ ├── processor
│ │ │ └── index.ts
│ │ └── publisher.ts
│ └── tsconfig.json
├── list-api
│ ├── nodemon.json
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── routes
│ │ │ └── index.ts
│ │ └── service
│ │ │ └── lists.ts
│ └── tsconfig.json
├── notifications-api
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── routes
│ │ │ └── notifications.ts
│ │ └── service
│ │ │ └── notifications.ts
│ └── tsconfig.json
├── notifications
│ ├── handlers
│ │ ├── index.ts
│ │ └── push.ts
│ ├── manual.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── worker.ts
├── scheduler
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── jobs
│ │ │ └── publish-scheduled.ts
│ │ ├── processors
│ │ │ └── ScheduledCastProcessor.ts
│ │ └── workers
│ │ │ └── publish-scheduled.ts
│ └── tsconfig.json
├── scripts
│ ├── package.json
│ ├── src
│ │ ├── refresh-ownerships.ts
│ │ └── seed-power-badge.ts
│ └── tsconfig.json
├── signer-api
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── plugins
│ │ │ └── index.ts
│ │ ├── routes
│ │ │ └── signer.ts
│ │ ├── service
│ │ │ └── signer.ts
│ │ └── utils
│ │ │ ├── ed25519.ts
│ │ │ └── index.ts
│ └── tsconfig.json
└── swap-api
│ ├── nodemon.json
│ ├── package.json
│ ├── src
│ ├── api
│ │ ├── 0x.ts
│ │ ├── client.ts
│ │ └── types.ts
│ ├── cache
│ │ └── index.ts
│ ├── index.ts
│ ├── manual.ts
│ ├── plugins
│ │ └── index.ts
│ ├── routes
│ │ └── index.ts
│ └── service
│ │ ├── index.ts
│ │ └── types.ts
│ └── tsconfig.json
├── railway.json
├── tsconfig.json
├── turbo.json
└── yarn.lock
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
3 | yarnPath: .yarn/releases/yarn-4.1.1.cjs
4 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/search/index.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import SearchScreen from "../../../../../components/screens/SearchScreen";
3 | import SearchResultsScreen from "../../../../../components/screens/SearchResultsScreen";
4 |
5 | export default function Screen() {
6 | const { q } = useLocalSearchParams();
7 |
8 | if (q) {
9 | return ;
10 | }
11 |
12 | return ;
13 | }
14 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/actions.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { ActionSettings } from "@nook/app/features/settings/action-settings";
3 |
4 | export default function ActionSettingsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/mute/channels.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { useAuth } from "@nook/app/context/auth";
3 | import { MutedChannels } from "@nook/app/features/settings/muted-channels";
4 |
5 | export default function MuteChannelsScreen() {
6 | const { settings } = useAuth();
7 | if (!settings) return null;
8 | return (
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/mute/users.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { useAuth } from "@nook/app/context/auth";
3 | import { MutedUsers } from "@nook/app/features/settings/muted-users";
4 |
5 | export default function MuteUsersScreen() {
6 | const { settings } = useAuth();
7 | if (!settings) return null;
8 | return (
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/mute/words.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { useAuth } from "@nook/app/context/auth";
3 | import { MutedWords } from "@nook/app/features/settings/muted-words";
4 |
5 | export default function MuteWordsScreen() {
6 | const { settings } = useAuth();
7 | if (!settings) return null;
8 | return (
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/notifications.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { NotificationSettings } from "@nook/app/features/settings/notification-settings";
3 |
4 | export default function NotificationsSettingsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/profile.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { ProfileSettings } from "@nook/app/features/settings/profile-settings";
3 |
4 | export default function ProfileSettingsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/settings/theme.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { ThemeSettings } from "@nook/app/features/settings/theme-settings";
3 |
4 | export default function ThemeSettingsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(a)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/explore/index.tsx:
--------------------------------------------------------------------------------
1 | import SearchScreen from "../../../../../components/screens/SearchScreen";
2 |
3 | export default function ExploreScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/search/index.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import SearchScreen from "../../../../../components/screens/SearchScreen";
3 | import SearchResultsScreen from "../../../../../components/screens/SearchResultsScreen";
4 |
5 | export default function Screen() {
6 | const { q } = useLocalSearchParams();
7 |
8 | if (q) {
9 | return ;
10 | }
11 |
12 | return ;
13 | }
14 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(explore)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(frames)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(media)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/settings/notifications.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollView } from "@nook/app-ui";
2 | import { NotificationSettings } from "@nook/app/features/settings/notification-settings";
3 |
4 | export default function NotificationsSettingsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(notifications)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(profile)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/casts/[hash]/index.tsx:
--------------------------------------------------------------------------------
1 | import CastScreen from "../../../../../../components/screens/CastScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/casts/[hash]/likes.tsx:
--------------------------------------------------------------------------------
1 | import CastLikesScreen from "../../../../../../components/screens/CastLikesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/casts/[hash]/quotes.tsx:
--------------------------------------------------------------------------------
1 | import CastQuotesScreen from "../../../../../../components/screens/CastQuotesScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/casts/[hash]/recasts.tsx:
--------------------------------------------------------------------------------
1 | import CastRecastsScreen from "../../../../../../components/screens/CastRecastsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/channels/[channelId]/hosts.tsx:
--------------------------------------------------------------------------------
1 | import ChannelHostsScreen from "../../../../../../components/screens/ChannelHostsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/channels/[channelId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ChannelScreen from "../../../../../../components/screens/ChannelScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collectibles/[nftId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collectibles/[nftId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collectibles/[nftId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collectibles/[nftId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftScreen from "../../../../../../components/screens/NftScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collections/[collectionId]/collectors-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collections/[collectionId]/collectors-following.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collections/[collectionId]/collectors.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionCollectorsScreen from "../../../../../../components/screens/NftCollectionCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/collections/[collectionId]/index.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectionScreen from "../../../../../../components/screens/NftCollectionScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/explore/actions.tsx:
--------------------------------------------------------------------------------
1 | import ExploreActionsScreen from "../../../../../components/screens/ExploreActionsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/[listId]/index.tsx:
--------------------------------------------------------------------------------
1 | import ListScreen from "../../../../../../components/screens/ListScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/[listId]/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsScreen from "../../../../../../components/screens/ListItemsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/[listId]/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsDisplayScreen from "../../../../../../../components/screens/ListSettingsDisplayScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/[listId]/settings/index.tsx:
--------------------------------------------------------------------------------
1 | import ListSettingsScreen from "../../../../../../../components/screens/ListSettingsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/[listId]/settings/items.tsx:
--------------------------------------------------------------------------------
1 | import ListItemsSearchScreen from "../../../../../../../components/screens/ListItemsSearchScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/index.tsx:
--------------------------------------------------------------------------------
1 | import ListsScreen from "../../../../../components/screens/ListsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/lists/manage.tsx:
--------------------------------------------------------------------------------
1 | import ListsManageScreen from "../../../../../components/screens/ListsManageScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/tokens/[tokenId]/holders-farcaster.tsx:
--------------------------------------------------------------------------------
1 | import NftCollectorsScreen from "../../../../../../components/screens/NftCollectorsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/tokens/[tokenId]/holders-following.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/tokens/[tokenId]/holders.tsx:
--------------------------------------------------------------------------------
1 | import TokenHoldersScreen from "../../../../../../components/screens/TokenHoldersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/tokens/[tokenId]/index.tsx:
--------------------------------------------------------------------------------
1 | import TokenScreen from "../../../../../../components/screens/TokenScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/users/[username]/feed.tsx:
--------------------------------------------------------------------------------
1 | import UserFeedScreen from "../../../../../../components/screens/UserFeedScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/users/[username]/followers.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowersScreen from "../../../../../../components/screens/UserFollowersScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/users/[username]/following.tsx:
--------------------------------------------------------------------------------
1 | import UserFollowingScreen from "../../../../../../components/screens/UserFollowingScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/users/[username]/index.tsx:
--------------------------------------------------------------------------------
1 | import UserScreen from "../../../../../../components/screens/UserScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/(tabs)/(transactions)/users/[username]/mutuals.tsx:
--------------------------------------------------------------------------------
1 | import UserMutualsScreen from "../../../../../../components/screens/UserMutualsScreen";
2 |
3 | export default function Screen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/app/(drawer)/_layout.tsx:
--------------------------------------------------------------------------------
1 | import { Drawer } from "expo-router/drawer";
2 | import { SidebarLayout } from "../../components/SidebarLayout";
3 |
4 | export default function Layout() {
5 | return (
6 | }
8 | screenOptions={({ navigation }) => {
9 | const state = navigation.getState();
10 | const drawerRoute = state.routes[state.index];
11 | const tabRoute = drawerRoute.state?.routes[drawerRoute.state.index];
12 | const isRoot = tabRoute?.state?.index === 0;
13 | return {
14 | headerShown: false,
15 | swipeEnabled: isRoot,
16 | };
17 | }}
18 | />
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/apps/expo/app/(login)/login/loading.tsx:
--------------------------------------------------------------------------------
1 | export default function LoadingScreen() {
2 | return ;
3 | }
4 |
--------------------------------------------------------------------------------
/apps/expo/app/+not-found.tsx:
--------------------------------------------------------------------------------
1 | import { Redirect } from "expo-router";
2 |
3 | export default function NotFoundScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/expo/assets/adaptive-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/adaptive-icon.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/blast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/blast.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/ethereum.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/expo/assets/chains/frame.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/frame.jpeg
--------------------------------------------------------------------------------
/apps/expo/assets/chains/fraxtal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/fraxtal.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/gold.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/gold.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/linea.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/apps/expo/assets/chains/mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/mode.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/orderly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/orderly.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/pgn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/pgn.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/pgn.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/apps/expo/assets/chains/polygon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/polygon.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/chains/stack.png
--------------------------------------------------------------------------------
/apps/expo/assets/chains/zksync.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/apps/expo/assets/farcaster.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/farcaster.webp
--------------------------------------------------------------------------------
/apps/expo/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/icon.png
--------------------------------------------------------------------------------
/apps/expo/assets/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/expo/assets/splash.png
--------------------------------------------------------------------------------
/apps/expo/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = (api) => {
2 | api.cache(true);
3 | return {
4 | presets: ["babel-preset-expo"],
5 | plugins: [
6 | [
7 | "@tamagui/babel-plugin",
8 | {
9 | components: ["tamagui"],
10 | config: "../../packages/app-ui/src/tamagui.config.ts",
11 | logTimings: true,
12 | disableExtraction: process.env.NODE_ENV === "development",
13 | },
14 | ],
15 | ],
16 | };
17 | };
18 |
--------------------------------------------------------------------------------
/apps/expo/components/Analytics.tsx:
--------------------------------------------------------------------------------
1 | import { useGlobalSearchParams, usePathname } from "expo-router";
2 | import { useEffect } from "react";
3 | import * as amplitude from "@amplitude/analytics-react-native";
4 |
5 | export const Analytics = () => {
6 | const pathname = usePathname();
7 | const params = useGlobalSearchParams();
8 |
9 | useEffect(() => {
10 | amplitude.track("pageview", { pathname, params });
11 | }, [pathname, params]);
12 |
13 | return null;
14 | };
15 |
--------------------------------------------------------------------------------
/apps/expo/components/SafeAreaView.tsx:
--------------------------------------------------------------------------------
1 | import { View, ViewProps } from "@nook/app-ui";
2 | import { useSafeAreaInsets } from "react-native-safe-area-context";
3 |
4 | export const SafeAreaView = (props: ViewProps) => {
5 | const insets = useSafeAreaInsets();
6 | return (
7 |
14 | );
15 | };
16 |
--------------------------------------------------------------------------------
/apps/expo/components/screens/CastLikesScreen.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import { FarcasterCastLikes } from "@nook/app/features/farcaster/cast-screen/cast-likes";
3 | import { View } from "@nook/app-ui";
4 |
5 | export default function CastLikesScreen() {
6 | const { hash } = useLocalSearchParams();
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/expo/components/screens/CastQuotesScreen.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import { FarcasterCastQuotes } from "@nook/app/features/farcaster/cast-screen/cast-quotes";
3 | import { View } from "@nook/app-ui";
4 |
5 | export default function CastQuotesScreen() {
6 | const { hash } = useLocalSearchParams();
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/expo/components/screens/CastRecastsScreen.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import { FarcasterCastRecasts } from "@nook/app/features/farcaster/cast-screen/cast-recasts";
3 | import { View } from "@nook/app-ui";
4 |
5 | export default function CastRecastsScreen() {
6 | const { hash } = useLocalSearchParams();
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/expo/components/screens/ChannelHostsScreen.tsx:
--------------------------------------------------------------------------------
1 | import { useLocalSearchParams } from "expo-router";
2 | import { View } from "@nook/app-ui";
3 | import { FarcasterChannelHosts } from "@nook/app/features/farcaster/channel-profile/channel-hosts";
4 |
5 | export default function ChannelHostsScreen() {
6 | const { channelId } = useLocalSearchParams();
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/expo/components/screens/ExploreActionsScreen.tsx:
--------------------------------------------------------------------------------
1 | import { View } from "@nook/app-ui";
2 | import { ExploreActions } from "@nook/app/features/explore/explore-actions";
3 |
4 | export default function ExploreActionsScreen() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/expo/eas.json:
--------------------------------------------------------------------------------
1 | {
2 | "cli": {
3 | "version": ">= 7.2.0"
4 | },
5 | "build": {
6 | "development": {
7 | "developmentClient": true,
8 | "distribution": "internal",
9 | "channel": "development"
10 | },
11 | "simulator": {
12 | "distribution": "internal",
13 | "ios": {
14 | "simulator": true
15 | },
16 | "channel": "simulator"
17 | },
18 | "preview": {
19 | "distribution": "internal",
20 | "channel": "preview"
21 | },
22 | "production": {
23 | "channel": "production",
24 | "autoIncrement": true
25 | }
26 | },
27 | "submit": {
28 | "production": {}
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/apps/expo/index.ts:
--------------------------------------------------------------------------------
1 | import "@walletconnect/react-native-compat";
2 | import "text-encoding-polyfill";
3 | import "fast-text-encoding";
4 | import "react-native-get-random-values";
5 | import "@ethersproject/shims";
6 | import "expo-router/entry";
7 |
--------------------------------------------------------------------------------
/apps/expo/metro.config.js:
--------------------------------------------------------------------------------
1 | // Learn more https://docs.expo.io/guides/customizing-metro
2 | const { getDefaultConfig } = require("expo/metro-config");
3 |
4 | /** @type {import('expo/metro-config').MetroConfig} */
5 | const config = getDefaultConfig(__dirname);
6 |
7 | module.exports = config;
8 |
--------------------------------------------------------------------------------
/apps/expo/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "include": [
4 | "app/**/*.ts",
5 | "app/**/*.tsx",
6 | "components/**/*.ts",
7 | "components/**/*.tsx",
8 | "hooks/**/*.ts",
9 | "utils/**/*.ts"
10 | ],
11 | "compilerOptions": {
12 | "composite": true,
13 | "jsx": "react-jsx"
14 | },
15 | "references": []
16 | }
17 |
--------------------------------------------------------------------------------
/apps/next/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: 'next',
3 | root: true,
4 | }
5 |
--------------------------------------------------------------------------------
/apps/next/.gitignore:
--------------------------------------------------------------------------------
1 | .vercel
2 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/(home)/for-you/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
2 | import { getServerSession } from "@nook/app/server/session";
3 |
4 | export default async function Home() {
5 | const session = await getServerSession();
6 | if (!session) return null;
7 | return (
8 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/(home)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/(engagement)/collectors-farcaster/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftFarcasterCollectors } from "@nook/app/features/nft/nft-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { nftId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/(engagement)/collectors-following/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftFollowingCollectors } from "@nook/app/features/nft/nft-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { nftId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/(engagement)/collectors/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftCollectors } from "@nook/app/features/nft/nft-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { nftId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/(engagement)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/layout.tsx:
--------------------------------------------------------------------------------
1 | import { fetchNft } from "@nook/app/api/nft";
2 | import { NavigationHeader } from "../../../../components/NavigationHeader";
3 |
4 | export default async function Home({
5 | children,
6 | params,
7 | }: { children: React.ReactNode; params: { nftId: string } }) {
8 | const nft = await fetchNft(params.nftId);
9 | return (
10 | <>
11 |
12 | {children}
13 | >
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collectibles/[nftId]/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchNft } from "@nook/app/api/nft";
2 | import { NftOverviewScreen } from "@nook/app/features/nft/nft-overview-screen";
3 |
4 | export default async function Home({ params }: { params: { nftId: string } }) {
5 | const nft = await fetchNft(params.nftId);
6 |
7 | return ;
8 | }
9 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(engagement)/collectors-farcaster/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftCollectionFarcasterCollectors } from "@nook/app/features/nft/nft-collection-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { collectionId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(engagement)/collectors-following/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftCollectionFollowingCollectors } from "@nook/app/features/nft/nft-collection-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { collectionId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(engagement)/collectors/page.tsx:
--------------------------------------------------------------------------------
1 | import { NftCollectionCollectors } from "@nook/app/features/nft/nft-collection-collectors";
2 |
3 | export default async function Collectors({
4 | params,
5 | }: { params: { collectionId: string } }) {
6 | return (
7 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(engagement)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(main)/items/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchNftCollection } from "@nook/app/api/nft";
2 | import { CollectionNftsFeed } from "@nook/app/features/nft/nft-feed";
3 | import { notFound } from "next/navigation";
4 |
5 | export default async function NftCollection({
6 | params,
7 | }: { params: { collectionId: string } }) {
8 | const collection = await fetchNftCollection(params.collectionId);
9 | if (!collection) return notFound();
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchNftCollection } from "@nook/app/api/nft";
2 | import { notFound } from "next/navigation";
3 | import { NftCollectionEvents } from "@nook/app/features/nft/nft-events";
4 |
5 | export default async function NftCollection({
6 | params,
7 | }: { params: { collectionId: string } }) {
8 | const collection = await fetchNftCollection(params.collectionId);
9 | if (!collection) return notFound();
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/collections/[collectionId]/layout.tsx:
--------------------------------------------------------------------------------
1 | import { fetchNftCollection } from "@nook/app/api/nft";
2 | import { NavigationHeader } from "../../../../components/NavigationHeader";
3 | import { ReactNode } from "react";
4 |
5 | export default async function Home({
6 | children,
7 | params,
8 | }: { children: ReactNode; params: { collectionId: string } }) {
9 | const nftCollection = await fetchNftCollection(params.collectionId);
10 | return (
11 | <>
12 |
13 | {children}
14 | >
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/frames/latest/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
2 | import { Display, UserFilterType } from "@nook/common/types";
3 |
4 | export default async function Home() {
5 | return (
6 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/frames/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/layout.tsx:
--------------------------------------------------------------------------------
1 | import { PageNavigation } from "../../components/PageNavigation";
2 | import { DefaultSidebar } from "@nook/app/features/home/default-sidebar";
3 |
4 | export default async function Default({
5 | children,
6 | }: { children: React.ReactNode }) {
7 | return (
8 | }>{children}
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/(main)/channels/page.tsx:
--------------------------------------------------------------------------------
1 | import { getServerSession } from "@nook/app/server/session";
2 | import { ListFeed } from "@nook/app/features/list/list-feed";
3 | import { ListType } from "@nook/common/types";
4 |
5 | export default async function Home() {
6 | const session = await getServerSession();
7 | if (!session) return null;
8 |
9 | return (
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/(main)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | import { getServerSession } from "@nook/app/server/session";
2 | import { ListFeed } from "@nook/app/features/list/list-feed";
3 | import { ListType } from "@nook/common/types";
4 |
5 | export default async function Home() {
6 | const session = await getServerSession();
7 | if (!session) return null;
8 |
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/(main)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/(main)/transactions/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { TransactionFeedServer } from "@nook/app/features/transactions/transaction-feed-server";
3 | import { UserFilterType } from "@nook/common/types";
4 |
5 | export default async function Home({ params }: { params: { listId: string } }) {
6 | const list = await fetchList(params.listId);
7 |
8 | return (
9 | fid) ?? [],
15 | },
16 | },
17 | }}
18 | />
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/items/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { ItemFeed } from "@nook/app/features/list/item-feed";
3 |
4 | export default async function Home({ params }: { params: { listId: string } }) {
5 | const list = await fetchList(params.listId);
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/display/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { ListDisplayPicker } from "@nook/app/features/list/list-display-picker";
3 |
4 | export default async function Home({ params }: { params: { listId: string } }) {
5 | const list = await fetchList(params.listId);
6 |
7 | return ;
8 | }
9 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/items/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/items/manage/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { ItemFeed } from "@nook/app/features/list/item-feed";
3 |
4 | export default async function Home({ params }: { params: { listId: string } }) {
5 | const list = await fetchList(params.listId);
6 |
7 | return ;
8 | }
9 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/items/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { ListType } from "@nook/common/types";
3 | import { ListUserSearch } from "@nook/app/features/list/user-search";
4 | import { ListChannelSearch } from "@nook/app/features/list/channel-search";
5 |
6 | export default async function Home({ params }: { params: { listId: string } }) {
7 | const list = await fetchList(params.listId);
8 |
9 | if (list.type === ListType.USERS) {
10 | return ;
11 | }
12 |
13 | return ;
14 | }
15 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/layout.tsx:
--------------------------------------------------------------------------------
1 | import { getServerSession } from "@nook/app/server/session";
2 | import { notFound } from "next/navigation";
3 | import { fetchList } from "@nook/app/api/list";
4 |
5 | export default async function Home({
6 | children,
7 | params,
8 | }: { children: React.ReactNode; params: { listId: string } }) {
9 | const session = await getServerSession();
10 | if (!session) return notFound();
11 |
12 | const list = await fetchList(params.listId);
13 | if (list.creatorId !== session.id) return notFound();
14 |
15 | return <>{children}>;
16 | }
17 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/lists/[listId]/settings/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchList } from "@nook/app/api/list";
2 | import { ListForm } from "@nook/app/features/list/list-form";
3 |
4 | export default async function Home({ params }: { params: { listId: string } }) {
5 | const list = await fetchList(params.listId);
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/media/latest/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
2 | import { Display, UserFilterType } from "@nook/common/types";
3 |
4 | export default async function Home() {
5 | return (
6 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/media/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/notifications/all/page.tsx:
--------------------------------------------------------------------------------
1 | import { NotificationsAllFeedServer } from "@nook/app/features/notifications/notifications-feed-server";
2 | import { getServerSession } from "@nook/app/server/session";
3 |
4 | export default async function Home() {
5 | const session = await getServerSession();
6 | if (!session) return null;
7 |
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/notifications/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/notifications/mentions/page.tsx:
--------------------------------------------------------------------------------
1 | import { NotificationsMentionsFeedServer } from "@nook/app/features/notifications/notifications-feed-server";
2 | import { getServerSession } from "@nook/app/server/session";
3 |
4 | export default async function Home() {
5 | const session = await getServerSession();
6 | if (!session) return null;
7 |
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/notifications/page.tsx:
--------------------------------------------------------------------------------
1 | import { NotificationsPriorityFeedServer } from "@nook/app/features/notifications/notifications-feed-server";
2 | import { getServerSession } from "@nook/app/server/session";
3 |
4 | export default async function Home() {
5 | const session = await getServerSession();
6 | if (!session) return null;
7 |
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(engagement)/holders-farcaster/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchToken } from "@nook/app/api/token";
2 | import { FarcasterTokenHolders } from "@nook/app/features/token/token-holders";
3 |
4 | export default async function Holders({
5 | params,
6 | }: { params: { tokenId: string } }) {
7 | const token = await fetchToken(params.tokenId);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(engagement)/holders-following/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchToken } from "@nook/app/api/token";
2 | import { FollowingTokenHolders } from "@nook/app/features/token/token-holders";
3 |
4 | export default async function Holders({
5 | params,
6 | }: { params: { tokenId: string } }) {
7 | const token = await fetchToken(params.tokenId);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(engagement)/holders/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchToken } from "@nook/app/api/token";
2 | import { TokenHolders } from "@nook/app/features/token/token-holders";
3 |
4 | export default async function Holders({
5 | params,
6 | }: { params: { tokenId: string } }) {
7 | const token = await fetchToken(params.tokenId);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(engagement)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(main)/about/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchToken } from "@nook/app/api/token";
2 | import { TokenDescription } from "@nook/app/features/token/token-overview";
3 |
4 | export default async function Home({
5 | params,
6 | }: { params: { tokenId: string } }) {
7 | const token = await fetchToken(params.tokenId);
8 |
9 | if (token.description) {
10 | return ;
11 | }
12 |
13 | return null;
14 | }
15 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(main)/activity/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchToken } from "@nook/app/api/token";
2 | import { TokenTransactionsFeedViewer } from "@nook/app/features/token/token-transactions";
3 |
4 | export default async function Home({
5 | params,
6 | }: { params: { tokenId: string } }) {
7 | const token = await fetchToken(params.tokenId);
8 |
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/(main)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/layout.tsx:
--------------------------------------------------------------------------------
1 | import { NavigationHeader } from "../../../../components/NavigationHeader";
2 | import { fetchToken } from "@nook/app/api/token";
3 |
4 | export default async function Home({
5 | children,
6 | params,
7 | }: { children: React.ReactNode; params: { tokenId: string } }) {
8 | const token = await fetchToken(params.tokenId);
9 |
10 | return (
11 | <>
12 |
13 | {children}
14 | >
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/tokens/[tokenId]/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/(default)/transactions/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/(engagement)/likes/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterCastLikes } from "@nook/app/features/farcaster/cast-screen/cast-likes";
2 | import { fetchCastLikes } from "@nook/app/api/farcaster/casts";
3 |
4 | export default async function CastLikes({
5 | params,
6 | }: { params: { hash: string } }) {
7 | const initialData = await fetchCastLikes(params.hash);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/(engagement)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/(engagement)/quotes/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterCastQuotes } from "@nook/app/features/farcaster/cast-screen/cast-quotes";
2 | import { fetchCastQuotes } from "@nook/app/api/farcaster/casts";
3 |
4 | export default async function CastQuotes({
5 | params,
6 | }: { params: { hash: string } }) {
7 | const initialData = await fetchCastQuotes(params.hash);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/(engagement)/recasts/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterCastRecasts } from "@nook/app/features/farcaster/cast-screen/cast-recasts";
2 | import { fetchCastRecasts } from "@nook/app/api/farcaster/casts";
3 |
4 | export default async function CastRecasts({
5 | params,
6 | }: { params: { hash: string } }) {
7 | const initialData = await fetchCastRecasts(params.hash);
8 | return ;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchCast } from "@nook/app/api/farcaster";
2 | import { FarcasterExpandedCast } from "@nook/app/features/farcaster/cast-screen/cast-expanded";
3 | import { fetchCastReplies } from "@nook/app/api/farcaster/feed";
4 | import { notFound } from "next/navigation";
5 |
6 | export default async function Cast({ params }: { params: { hash: string } }) {
7 | const [cast, initialData] = await Promise.all([
8 | fetchCast(params.hash),
9 | fetchCastReplies(params.hash, "best"),
10 | ]);
11 | if (!cast) return notFound();
12 | return ;
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/casts/[hash]/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/channels/[channelId]/all/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchChannel } from "@nook/app/api/farcaster";
2 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
3 | import { ChannelFilterType } from "@nook/common/types";
4 |
5 | export default async function Channel({
6 | params,
7 | }: { params: { channelId: string } }) {
8 | const channel = await fetchChannel(params.channelId);
9 | return (
10 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/apps/next/app/channels/[channelId]/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/explore/actions/page.tsx:
--------------------------------------------------------------------------------
1 | // TODO: Move this to backend with our own explore routes
2 |
3 | import { ExploreActions } from "@nook/app/features/explore/explore-actions";
4 | import { NavigationHeader } from "../../../components/NavigationHeader";
5 | import { getFarcasterActions } from "@nook/app/api/warpcast";
6 |
7 | export default async function Explore() {
8 | const actions = await getFarcasterActions();
9 | return (
10 | <>
11 |
12 |
13 | >
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/apps/next/app/explore/layout.tsx:
--------------------------------------------------------------------------------
1 | // TODO: Move this to backend with our own explore routes
2 |
3 | import { getRecommendedChannels } from "@nook/app/api/neynar";
4 | import { ExploreSidebar } from "@nook/app/features/explore/explore-sidebar";
5 | import { ReactNode } from "react";
6 | import { PageNavigation } from "../../components/PageNavigation";
7 |
8 | export default async function Explore({ children }: { children: ReactNode }) {
9 | const recommendedChannels = await getRecommendedChannels();
10 |
11 | return (
12 | }>
13 | {children}
14 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/apps/next/app/explore/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/explore/page.tsx:
--------------------------------------------------------------------------------
1 | // TODO: Move this to backend with our own explore routes
2 |
3 | import { ExploreScreen } from "@nook/app/features/explore/explore-screen";
4 | import { getRecommendedChannels } from "@nook/app/api/neynar";
5 |
6 | export default async function Explore() {
7 | const channels = await getRecommendedChannels();
8 |
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/not-found.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { ErrorMessage } from "@nook/app/components/error-message";
4 |
5 | export default function NotFound() {
6 | return Page not found;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/next/app/search/layout.tsx:
--------------------------------------------------------------------------------
1 | import { PageNavigation } from "../../components/PageNavigation";
2 | import { getRecommendedChannels } from "@nook/app/api/neynar";
3 | import { SearchSidebar } from "@nook/app/features/search/search-sidebar";
4 | import { ReactNode } from "react";
5 |
6 | export default async function Search({ children }: { children: ReactNode }) {
7 | const channels = await getRecommendedChannels();
8 |
9 | return (
10 | }>
11 | {children}
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/apps/next/app/search/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/settings/(main)/layout.tsx:
--------------------------------------------------------------------------------
1 | import { NavigationHeader } from "../../../components/NavigationHeader";
2 |
3 | export default async function Home({
4 | children,
5 | }: { children: React.ReactNode }) {
6 | return (
7 | <>
8 |
9 | {children}
10 | >
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/next/app/settings/(main)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/settings/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | import { SettingsScreen } from "@nook/app/features/settings/settings-screen";
2 | import { fetchSettings } from "@nook/app/api/settings";
3 |
4 | export default async function Settings() {
5 | const settings = await fetchSettings();
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/next/app/settings/layout.tsx:
--------------------------------------------------------------------------------
1 | import { getServerSession } from "@nook/app/server/session";
2 | import { PageNavigation } from "../../components/PageNavigation";
3 | import { notFound } from "next/navigation";
4 |
5 | export default async function Home({
6 | children,
7 | }: { children: React.ReactNode }) {
8 | const session = await getServerSession();
9 | if (!session) return notFound();
10 | return {children};
11 | }
12 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/channels/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/channels/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchSettings } from "@nook/app/api/settings";
2 | import { NavigationHeader } from "../../../../components/NavigationHeader";
3 | import { MutedChannels } from "@nook/app/features/settings/muted-channels";
4 |
5 | export default async function Settings() {
6 | const settings = await fetchSettings();
7 | return (
8 | <>
9 |
10 |
11 | >
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/users/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/users/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchSettings } from "@nook/app/api/settings";
2 | import { NavigationHeader } from "../../../../components/NavigationHeader";
3 | import { MutedUsers } from "@nook/app/features/settings/muted-users";
4 |
5 | export default async function Settings() {
6 | const settings = await fetchSettings();
7 | return (
8 | <>
9 |
10 |
11 | >
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/words/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/settings/muted/words/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchSettings } from "@nook/app/api/settings";
2 | import { NavigationHeader } from "../../../../components/NavigationHeader";
3 | import { MutedWords } from "@nook/app/features/settings/muted-words";
4 |
5 | export default async function Settings() {
6 | const settings = await fetchSettings();
7 | return (
8 | <>
9 |
10 |
11 | >
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/next/app/signup/page.tsx:
--------------------------------------------------------------------------------
1 | import { SignupScreen } from "@nook/app/features/signup/signup-screen";
2 | import { PageNavigation } from "../../components/PageNavigation";
3 | import { NavigationHeader } from "../../components/NavigationHeader";
4 |
5 | export default function Signup() {
6 | return (
7 |
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(engagement)/followers/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterUserFollowers } from "@nook/app/features/farcaster/user-profile/user-followers";
2 | import { fetchUser, fetchUserFollowers } from "@nook/app/api/farcaster/users";
3 |
4 | export default async function User({
5 | params,
6 | }: { params: { username: string } }) {
7 | const user = await fetchUser(params.username);
8 | const initialData = await fetchUserFollowers(user.fid);
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(engagement)/following/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterUserFollowing } from "@nook/app/features/farcaster/user-profile/user-following";
2 | import { fetchUser, fetchUserFollowing } from "@nook/app/api/farcaster/users";
3 |
4 | export default async function User({
5 | params,
6 | }: { params: { username: string } }) {
7 | const user = await fetchUser(params.username);
8 | const initialData = await fetchUserFollowing(user.fid);
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(engagement)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(engagement)/mutuals/page.tsx:
--------------------------------------------------------------------------------
1 | import { FarcasterUserMutuals } from "@nook/app/features/farcaster/user-profile/user-mutuals";
2 | import { getServerSession } from "@nook/app/server/session";
3 | import { fetchUser, fetchUserMutuals } from "@nook/app/api/farcaster/users";
4 | import { notFound } from "next/navigation";
5 |
6 | export default async function User({
7 | params,
8 | }: { params: { username: string } }) {
9 | const session = await getServerSession();
10 | if (!session) return notFound();
11 | const user = await fetchUser(params.username);
12 | const initialData = await fetchUserMutuals(user.fid);
13 | return ;
14 | }
15 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(main)/collectibles/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchUser } from "@nook/app/api/farcaster";
2 | import { UserFilterType } from "@nook/common/types";
3 | import { notFound } from "next/navigation";
4 | import { NftFeed } from "@nook/app/features/nft/nft-feed";
5 |
6 | export default async function User({
7 | params,
8 | }: { params: { username: string } }) {
9 | const user = await fetchUser(params.username);
10 | if (!user) {
11 | return notFound();
12 | }
13 | return (
14 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(main)/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loading } from "@nook/app/components/loading";
2 |
3 | export default function LoadingScreen() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchUser } from "@nook/app/api/farcaster";
2 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
3 | import { UserFilterType } from "@nook/common/types";
4 | import { notFound } from "next/navigation";
5 |
6 | export default async function User({
7 | params,
8 | }: { params: { username: string } }) {
9 | const user = await fetchUser(params.username);
10 | if (!user) return notFound();
11 | return (
12 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(main)/replies/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchUser } from "@nook/app/api/farcaster";
2 | import { FarcasterFilteredFeedServer } from "@nook/app/features/farcaster/cast-feed/filtered-feed-server";
3 | import { UserFilterType } from "@nook/common/types";
4 | import { notFound } from "next/navigation";
5 |
6 | export default async function User({
7 | params,
8 | }: { params: { username: string } }) {
9 | const user = await fetchUser(params.username);
10 | if (!user) return notFound();
11 | return (
12 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/apps/next/app/users/[username]/(main)/tokens/page.tsx:
--------------------------------------------------------------------------------
1 | import { fetchUser } from "@nook/app/api/farcaster";
2 | import { notFound } from "next/navigation";
3 | import { TokenHoldings } from "@nook/app/features/token/token-holdings";
4 |
5 | export default async function User({
6 | params,
7 | }: { params: { username: string } }) {
8 | const user = await fetchUser(params.username);
9 | if (!user) {
10 | return notFound();
11 | }
12 | return (
13 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/apps/next/components/PageNavigation.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { View, XStack } from "@nook/app-ui";
4 | import { ReactNode } from "react";
5 |
6 | export const PageNavigation = ({
7 | children,
8 | sidebar,
9 | }: {
10 | children: ReactNode;
11 | sidebar?: ReactNode;
12 | }) => {
13 | return (
14 |
15 |
23 | {children}
24 |
25 |
26 | {sidebar}
27 |
28 |
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/apps/next/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
4 | // NOTE: This file should not be edited
5 | // see https://nextjs.org/docs/basic-features/typescript for more information.
6 |
--------------------------------------------------------------------------------
/apps/next/public/.well-known/apple-app-site-association:
--------------------------------------------------------------------------------
1 | {
2 | "applinks": {
3 | "apps": [],
4 | "details": [
5 | {
6 | "appIDs": ["5AU9RPFP24.social.nook"],
7 | "components": [
8 | {
9 | "/": "/*",
10 | "comment": "Matches any URL whose path starts with /"
11 | }
12 | ]
13 | }
14 | ]
15 | }
16 | }
--------------------------------------------------------------------------------
/apps/next/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/apps/next/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/apps/next/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/apps/next/public/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/banner.png
--------------------------------------------------------------------------------
/apps/next/public/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #da532c
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/next/public/chains/blast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/blast.png
--------------------------------------------------------------------------------
/apps/next/public/chains/ethereum.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/next/public/chains/frame.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/frame.jpeg
--------------------------------------------------------------------------------
/apps/next/public/chains/fraxtal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/fraxtal.png
--------------------------------------------------------------------------------
/apps/next/public/chains/gold.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/gold.png
--------------------------------------------------------------------------------
/apps/next/public/chains/linea.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/apps/next/public/chains/mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/mode.png
--------------------------------------------------------------------------------
/apps/next/public/chains/orderly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/orderly.png
--------------------------------------------------------------------------------
/apps/next/public/chains/pgn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/pgn.png
--------------------------------------------------------------------------------
/apps/next/public/chains/pgn.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/apps/next/public/chains/polygon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/polygon.png
--------------------------------------------------------------------------------
/apps/next/public/chains/stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/chains/stack.png
--------------------------------------------------------------------------------
/apps/next/public/chains/zksync.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/apps/next/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/favicon-16x16.png
--------------------------------------------------------------------------------
/apps/next/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/favicon-32x32.png
--------------------------------------------------------------------------------
/apps/next/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/favicon.ico
--------------------------------------------------------------------------------
/apps/next/public/fonts/Inter-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/fonts/Inter-Bold.ttf
--------------------------------------------------------------------------------
/apps/next/public/fonts/Inter-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/fonts/Inter-Regular.ttf
--------------------------------------------------------------------------------
/apps/next/public/fonts/Inter-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/fonts/Inter-SemiBold.ttf
--------------------------------------------------------------------------------
/apps/next/public/icon512_maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/icon512_maskable.png
--------------------------------------------------------------------------------
/apps/next/public/icon512_rounded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/icon512_rounded.png
--------------------------------------------------------------------------------
/apps/next/public/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/apps/next/public/mstile-150x150.png
--------------------------------------------------------------------------------
/apps/next/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "short_name": "",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/apps/next/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "module": "esnext",
12 | "moduleResolution": "node",
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "jsx": "preserve",
16 | "incremental": true,
17 | "plugins": [
18 | {
19 | "name": "next"
20 | }
21 | ]
22 | },
23 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
24 | "exclude": ["node_modules"]
25 | }
26 |
--------------------------------------------------------------------------------
/apps/next/types.d.ts:
--------------------------------------------------------------------------------
1 | import { config } from "@nook/app-ui";
2 |
3 | export type Conf = typeof config;
4 |
5 | declare module "@nook/app-ui" {
6 | interface TamaguiCustomConfig extends Conf {}
7 | }
8 |
--------------------------------------------------------------------------------
/apps/next/utils/index.ts:
--------------------------------------------------------------------------------
1 | export const getURL = () => {
2 | const url =
3 | process?.env?.URL && process.env.URL !== ""
4 | ? process.env.URL
5 | : process?.env?.NEXT_PUBLIC_VERCEL_URL &&
6 | process.env.NEXT_PUBLIC_VERCEL_URL !== ""
7 | ? process.env.NEXT_PUBLIC_VERCEL_URL
8 | : "http://localhost:3100";
9 | return url.includes("http") ? url : `https://${url}`;
10 | };
11 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json",
3 | "organizeImports": {
4 | "enabled": true
5 | },
6 | "linter": {
7 | "enabled": true,
8 | "rules": {
9 | "recommended": true
10 | }
11 | },
12 | "formatter": {
13 | "enabled": true,
14 | "indentStyle": "space",
15 | "indentWidth": 2
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/nixpacks.toml:
--------------------------------------------------------------------------------
1 | providers = ["...", "python"]
2 |
3 | [phases.install]
4 | cmds = [
5 | "npm install -g corepack@0.24.1 && corepack enable",
6 | "yarn install --check-cache",
7 | ]
8 | dependsOn = ["setup"]
9 |
10 | [phases.build]
11 | cache_directories = [
12 | '**/dist/**',
13 | '**/prisma/generated/**',
14 | '**/.next/**',
15 | '!**./.next/cache/**',
16 | '**/.tamagui/**',
17 | ]
18 |
--------------------------------------------------------------------------------
/packages/api/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "watch": ["src/**/*.ts"],
3 | "ext": "ts"
4 | }
5 |
--------------------------------------------------------------------------------
/packages/api/src/v0/routes/flags/index.ts:
--------------------------------------------------------------------------------
1 | import { FastifyInstance } from "fastify";
2 |
3 | export const flagRoutes = async (fastify: FastifyInstance) => {
4 | fastify.register(async (fastify: FastifyInstance) => {
5 | const redis = fastify.redis.client;
6 |
7 | fastify.get("/flags", async (request, reply) => {
8 | try {
9 | return reply.send({
10 | reviewMode: (await redis.get("flags:reviewMode")) === "true",
11 | });
12 | } catch (e) {
13 | console.error(e);
14 | return reply.code(500).send({ message: (e as Error).message });
15 | }
16 | });
17 | });
18 | };
19 |
--------------------------------------------------------------------------------
/packages/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/app-ui/.gitignore:
--------------------------------------------------------------------------------
1 | dist/
2 | .DS_Store
3 | THUMBS_DB
4 | node_modules/
5 | types/
6 |
--------------------------------------------------------------------------------
/packages/app-ui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/app-ui",
3 | "version": "0.0.1",
4 | "sideEffects": [
5 | "*.css"
6 | ],
7 | "private": true,
8 | "types": "./src",
9 | "main": "src/index.tsx",
10 | "module:jsx": "src",
11 | "files": [
12 | "types",
13 | "dist"
14 | ],
15 | "scripts": {
16 | "build": "tamagui-build --skip-types",
17 | "watch": "tamagui-build --skip-types --watch"
18 | },
19 | "dependencies": {
20 | "@tamagui/radio-headless": "^1.97.0",
21 | "@tamagui/toast": "^1.97.0",
22 | "tamagui": "^1.97.0"
23 | },
24 | "devDependencies": {
25 | "@tamagui/build": "^1.97.0"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/packages/app-ui/src/Text.tsx:
--------------------------------------------------------------------------------
1 | import { Text, styled } from "tamagui";
2 |
3 | export const NookText = styled(Text, {
4 | color: "$mauve12",
5 | fontSize: 15,
6 | variants: {
7 | muted: {
8 | true: {
9 | color: "$mauve11",
10 | },
11 | },
12 | variant: {
13 | label: {
14 | color: "$mauve12",
15 | fontWeight: "700",
16 | fontSize: "$7",
17 | },
18 | },
19 | } as const,
20 | });
21 |
--------------------------------------------------------------------------------
/packages/app-ui/src/index.tsx:
--------------------------------------------------------------------------------
1 | export * from "tamagui";
2 | export * from "@tamagui/toast";
3 | export * from "./tamagui.config";
4 | export * from "./Text";
5 | export * from "./Button";
6 |
--------------------------------------------------------------------------------
/packages/app-ui/src/types.d.ts:
--------------------------------------------------------------------------------
1 | import { config } from "./tamagui.config";
2 |
3 | export type Conf = typeof config;
4 |
5 | declare module "tamagui" {
6 | interface TamaguiCustomConfig extends Conf {}
7 | }
8 |
--------------------------------------------------------------------------------
/packages/app-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "include": ["**/*.ts", "**/*.tsx", "./src/tamagui.config.ts"],
4 | "compilerOptions": {
5 | "composite": true,
6 | "jsx": "react-jsx"
7 | },
8 | "references": []
9 | }
10 |
--------------------------------------------------------------------------------
/packages/app/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .DS_Store
3 | THUMBS_DB
4 |
--------------------------------------------------------------------------------
/packages/app/api/content/index.ts:
--------------------------------------------------------------------------------
1 | import { UrlContentResponse } from "@nook/common/types";
2 | import { makeRequest } from "../utils";
3 |
4 | export const fetchContent = async (
5 | uri: string,
6 | ): Promise => {
7 | return await makeRequest("/content", {
8 | method: "POST",
9 | headers: {
10 | "Content-Type": "application/json",
11 | },
12 | body: JSON.stringify({ uri }),
13 | });
14 | };
15 |
--------------------------------------------------------------------------------
/packages/app/api/discover/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./search";
2 |
--------------------------------------------------------------------------------
/packages/app/api/discover/search.ts:
--------------------------------------------------------------------------------
1 | import { Channel, FarcasterUserV1 } from "@nook/common/types";
2 | import { makeRequest } from "../utils";
3 |
4 | export const searchPreview = async (
5 | query: string,
6 | ): Promise<{ users: FarcasterUserV1[]; channels: Channel[] }> => {
7 | return await makeRequest(`/search/preview?query=${query}`);
8 | };
9 |
--------------------------------------------------------------------------------
/packages/app/api/farcaster/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./casts";
2 | export * from "./feed";
3 | export * from "./users";
4 | export * from "./channels";
5 |
--------------------------------------------------------------------------------
/packages/app/api/media/index.ts:
--------------------------------------------------------------------------------
1 | import { makeUrlRequest } from "../utils";
2 |
3 | export type ImgurUploadResponse = {
4 | data: {
5 | link: string;
6 | };
7 | };
8 |
9 | export const uploadImage = async (
10 | image: string,
11 | ): Promise => {
12 | return await makeUrlRequest("https://imgur-apiv3.p.rapidapi.com/3/image", {
13 | method: "POST",
14 | headers: {
15 | "Content-Type": "application/json",
16 | Authorization: "Client-ID c2593243d3ea679",
17 | "X-RapidApi-Key": "H6XlGK0RRnmshCkkElumAWvWjiBLp1ItTOBjsncst1BaYKMS8H",
18 | },
19 | body: JSON.stringify({ image }),
20 | });
21 | };
22 |
--------------------------------------------------------------------------------
/packages/app/api/neynar/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./channels";
2 | export * from "./casts";
3 |
--------------------------------------------------------------------------------
/packages/app/api/notifications/feed.ts:
--------------------------------------------------------------------------------
1 | import {
2 | FetchNotificationsResponse,
3 | GetNotificationsRequest,
4 | } from "@nook/common/types";
5 | import { makeRequest } from "../utils";
6 |
7 | export const fetchNotifications = async (
8 | req: GetNotificationsRequest,
9 | cursor?: string,
10 | ): Promise => {
11 | return makeRequest(`/notifications${cursor ? `?cursor=${cursor}` : ""}`, {
12 | method: "POST",
13 | headers: {
14 | "Content-Type": "application/json",
15 | },
16 | body: JSON.stringify(req),
17 | });
18 | };
19 |
--------------------------------------------------------------------------------
/packages/app/api/notifications/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./feed";
2 | export * from "./user";
3 |
--------------------------------------------------------------------------------
/packages/app/api/notifications/user.ts:
--------------------------------------------------------------------------------
1 | import { makeRequest } from "../utils";
2 |
3 | export const fetchNotificationsCount = async (): Promise<{ count: number }> => {
4 | return await makeRequest("/notifications/count");
5 | };
6 |
7 | export const markNotificationsRead = async () => {
8 | return await makeRequest("/notifications/mark-read", {
9 | method: "POST",
10 | });
11 | };
12 |
--------------------------------------------------------------------------------
/packages/app/api/transactions/index.ts:
--------------------------------------------------------------------------------
1 | import {
2 | FetchTransactionsResponseV1,
3 | TransactionFeedFilter,
4 | } from "@nook/common/types";
5 | import { makeRequest } from "../utils";
6 |
7 | export const fetchTransactionFeed = async (
8 | filter: TransactionFeedFilter,
9 | cursor?: string,
10 | ): Promise => {
11 | return await makeRequest("/v1/transactions", {
12 | method: "POST",
13 | headers: {
14 | "Content-Type": "application/json",
15 | },
16 | body: JSON.stringify({ filter, cursor }),
17 | });
18 | };
19 |
--------------------------------------------------------------------------------
/packages/app/components/blockchain/chain-icon.native.tsx:
--------------------------------------------------------------------------------
1 | import { View } from "@nook/app-ui";
2 | import { CHAINS } from "../../utils/chains";
3 | import { Image } from "expo-image";
4 |
5 | export const ChainIcon = ({ chainId }: { chainId: string }) => {
6 | const chain = CHAINS[chainId];
7 |
8 | return (
9 |
16 | {chain && (
17 |
18 | )}
19 |
20 | );
21 | };
22 |
--------------------------------------------------------------------------------
/packages/app/components/blockchain/chain-icon.tsx:
--------------------------------------------------------------------------------
1 | import { View } from "@nook/app-ui";
2 | import { CHAINS } from "../../utils/chains";
3 |
4 | export const ChainIcon = ({ chainId }: { chainId: string }) => {
5 | const chain = CHAINS[chainId];
6 |
7 | return (
8 |
16 | {chain && (
17 |
22 | )}
23 |
24 | );
25 | };
26 |
--------------------------------------------------------------------------------
/packages/app/components/embeds/EmbedNook.tsx:
--------------------------------------------------------------------------------
1 | import { useCast } from "../../hooks/api/casts";
2 | import { UrlContentResponse } from "@nook/common/types";
3 | import { EmbedCast } from "./EmbedCast";
4 |
5 | export const EmbedNook = ({ content }: { content: UrlContentResponse }) => {
6 | const pathname = new URL(content.uri).pathname;
7 |
8 | if (pathname.startsWith("/casts/")) {
9 | const hash = pathname.split("/")[2];
10 | return ;
11 | }
12 |
13 | return <>>;
14 | };
15 |
16 | const EmbedNookCast = ({ hash }: { hash: string }) => {
17 | const { data } = useCast(hash);
18 |
19 | if (!data) {
20 | return <>>;
21 | }
22 |
23 | return ;
24 | };
25 |
--------------------------------------------------------------------------------
/packages/app/components/embeds/EmbedVideo.tsx:
--------------------------------------------------------------------------------
1 | import { View } from "tamagui";
2 | import ReactPlayer from "react-player/lazy";
3 |
4 | export const EmbedVideo = ({
5 | uri,
6 | noBorderRadius,
7 | }: { uri: string; noBorderRadius?: boolean }) => {
8 | if (!uri) return null;
9 | return (
10 | {
14 | e.stopPropagation();
15 | }}
16 | aspectRatio={
17 | uri.includes("youtube.com") || uri.includes("youtu.be")
18 | ? 16 / 9
19 | : "auto"
20 | }
21 | >
22 |
23 |
24 | );
25 | };
26 |
--------------------------------------------------------------------------------
/packages/app/components/error-message.tsx:
--------------------------------------------------------------------------------
1 | import { Text, View } from "@nook/app-ui";
2 | import { ReactNode } from "react";
3 |
4 | export const ErrorMessage = ({ children }: { children: ReactNode }) => (
5 |
6 | {children}
7 |
8 | );
9 |
--------------------------------------------------------------------------------
/packages/app/components/farcaster/users/power-badge.tsx:
--------------------------------------------------------------------------------
1 | import { Zap } from "@tamagui/lucide-icons";
2 | import { View } from "tamagui";
3 |
4 | export const FarcasterPowerBadge = ({ badge }: { badge: boolean }) => {
5 | if (!badge) return null;
6 |
7 | return (
8 |
19 |
20 |
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/packages/app/components/loading.native.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Spinner, View } from "@nook/app-ui";
3 | import { Tabs } from "react-native-collapsible-tab-view";
4 |
5 | export const Loading = ({ asTabs }: { asTabs?: boolean }) => {
6 | const Component = (
7 |
14 |
15 |
16 |
17 |
18 | );
19 | return asTabs ? {Component} : Component;
20 | };
21 |
--------------------------------------------------------------------------------
/packages/app/components/loading.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Spinner, View } from "@nook/app-ui";
3 |
4 | export const Loading = ({ asTabs }: { asTabs?: boolean }) => (
5 |
12 |
13 |
14 |
15 |
16 | );
17 |
--------------------------------------------------------------------------------
/packages/app/components/menu/menu.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 | import { Menu as NativeMenu } from "./menu.native";
3 |
4 | export const Menu = ({
5 | trigger,
6 | children,
7 | }: { trigger?: ReactNode; children: ReactNode }) => {
8 | return {children};
9 | };
10 |
--------------------------------------------------------------------------------
/packages/app/components/menu/menu.web.tsx:
--------------------------------------------------------------------------------
1 | import { View } from "@nook/app-ui";
2 | import { ReactNode } from "react";
3 | import { Menu as NativeMenu } from "./menu.native";
4 |
5 | export const Menu = ({
6 | trigger,
7 | children,
8 | }: { trigger?: ReactNode; children: ReactNode }) => {
9 | return (
10 | {
12 | e.preventDefault();
13 | e.stopPropagation();
14 | }}
15 | >
16 | {children}
17 |
18 | );
19 | };
20 |
--------------------------------------------------------------------------------
/packages/app/components/refresh-control.tsx:
--------------------------------------------------------------------------------
1 | import { useTheme } from "@nook/app-ui";
2 | import { RefreshControl as RNRefreshControl } from "react-native";
3 |
4 | export function RefreshControl({
5 | refreshing,
6 | onRefresh,
7 | paddingTop,
8 | }: {
9 | refreshing: boolean;
10 | onRefresh: () => Promise;
11 | paddingTop?: number;
12 | }) {
13 | const theme = useTheme();
14 | return (
15 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/packages/app/components/zoomable-image.native.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 | import { Link } from "./link";
3 |
4 | export const ZoomableImage = ({
5 | uri,
6 | children,
7 | }: {
8 | uri?: string;
9 | children: ReactNode;
10 | }) => {
11 | if (!uri) return children;
12 |
13 | return (
14 |
22 | {children}
23 |
24 | );
25 | };
26 |
--------------------------------------------------------------------------------
/packages/app/features/explore/explore-sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { YStack } from "@nook/app-ui";
4 | import { SearchBar } from "../search/search-bar";
5 | import { Channel } from "@nook/common/types";
6 | import { RecommendedChannels } from "../home/recommended-channels";
7 |
8 | export const ExploreSidebar = ({ channels }: { channels: Channel[] }) => {
9 | return (
10 |
18 |
19 |
20 |
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/packages/app/features/farcaster/cast-screen/cast-sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { YStack } from "@nook/app-ui";
4 | import { SearchBar } from "../../search/search-bar";
5 | import { ChannelOverview } from "../../../components/farcaster/channels/channel-overview";
6 | import { FarcasterCastV1 } from "@nook/common/types";
7 |
8 | export const CastSidebar = ({ cast }: { cast: FarcasterCastV1 }) => {
9 | return (
10 |
18 |
19 | {cast?.channel && }
20 |
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/packages/app/features/farcaster/enable-signer/dialog.native.tsx:
--------------------------------------------------------------------------------
1 | import { useAuth } from "../../../context/auth";
2 | import { Link } from "../../../components/link";
3 | import { memo, useMemo } from "react";
4 |
5 | export const EnableSignerDialog = memo(
6 | ({ children }: { children: React.ReactNode }) => {
7 | const { session, signer } = useAuth();
8 |
9 | const memoChildren = useMemo(() => children, [children]);
10 |
11 | if (!session || signer?.state === "completed") {
12 | return memoChildren;
13 | }
14 |
15 | return (
16 |
17 | {memoChildren}
18 |
19 | );
20 | },
21 | );
22 |
--------------------------------------------------------------------------------
/packages/app/features/farcaster/user-profile/user-sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { YStack } from "@nook/app-ui";
4 | import { SearchBar } from "../../search/search-bar";
5 | import { FarcasterUserV1 } from "@nook/common/types";
6 |
7 | export const UserSidebar = ({ user }: { user: FarcasterUserV1 }) => {
8 | return (
9 |
17 |
18 |
19 | );
20 | };
21 |
--------------------------------------------------------------------------------
/packages/app/features/home/default-sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { YStack } from "@nook/app-ui";
4 | import { SearchBar } from "../search/search-bar";
5 |
6 | export const DefaultSidebar = () => {
7 | return (
8 |
16 |
17 |
18 | );
19 | };
20 |
--------------------------------------------------------------------------------
/packages/app/features/list/list-empty-state.tsx:
--------------------------------------------------------------------------------
1 | import { NookText, YStack } from "@nook/app-ui";
2 | import { ListType } from "@nook/common/types";
3 | import { CreateListTrigger } from "./create-list-trigger";
4 |
5 | export const ListEmptyState = ({ type }: { type?: ListType }) => {
6 | return (
7 |
8 |
9 | No lists found. Create a list to group together users or channels.
10 |
11 |
12 |
13 | );
14 | };
15 |
--------------------------------------------------------------------------------
/packages/app/features/nft/nft-description.native.tsx:
--------------------------------------------------------------------------------
1 | import { useTheme } from "@nook/app-ui";
2 | import { SimpleHashNFT } from "@nook/common/types";
3 | import Markdown from "react-native-markdown-display";
4 |
5 | export const NftDescription = ({ nft }: { nft: SimpleHashNFT }) => {
6 | const theme = useTheme();
7 | return (
8 |
18 | {nft.description}
19 |
20 | );
21 | };
22 |
--------------------------------------------------------------------------------
/packages/app/features/nft/nft-description.tsx:
--------------------------------------------------------------------------------
1 | import { Text } from "@nook/app-ui";
2 | import { SimpleHashNFT } from "@nook/common/types";
3 |
4 | export const NftDescription = ({ nft }: { nft: SimpleHashNFT }) => {
5 | return {nft.description};
6 | };
7 |
--------------------------------------------------------------------------------
/packages/app/features/nft/nft-event-menu.tsx:
--------------------------------------------------------------------------------
1 | import { NftEvent } from "@nook/common/types";
2 | import { Menu } from "../../components/menu/menu";
3 | import { OpenLink } from "../../components/menu/menu-actions";
4 | import { CdnAvatar } from "../../components/cdn-avatar";
5 |
6 | export const NftEventMenu = ({ event }: { event: NftEvent }) => {
7 | return (
8 |
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/packages/app/features/search/search-sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { YStack } from "@nook/app-ui";
4 | import { SearchBar } from "./search-bar";
5 | import { Channel } from "@nook/common/types";
6 | import { RecommendedChannels } from "../home/recommended-channels";
7 |
8 | export const SearchSidebar = ({ channels }: { channels: Channel[] }) => {
9 | return (
10 |
18 |
19 |
20 |
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/packages/app/features/token/token-chart.tsx:
--------------------------------------------------------------------------------
1 | import { Token } from "@nook/common/types";
2 |
3 | export const TokenChart = ({
4 | token,
5 | color,
6 | onIndexChange,
7 | onTimeframeChange,
8 | }: {
9 | token: Token;
10 | color: string;
11 | onIndexChange: (data?: { timestamp: number; value: number }) => void;
12 | onTimeframeChange: (value: number) => void;
13 | }) => {
14 | return <>>;
15 | };
16 |
--------------------------------------------------------------------------------
/packages/app/features/transactions/transaction-display-nft.tsx:
--------------------------------------------------------------------------------
1 | import { SimpleHashNFT } from "@nook/common/types";
2 | import { EmbedImage } from "../../components/embeds/EmbedImage";
3 |
4 | export const TransactionDisplayNFT = ({ nft }: { nft: SimpleHashNFT }) => {
5 | const uri = nft.previews.image_medium_url || nft.collection.image_url;
6 | if (!uri) return null;
7 |
8 | return ;
9 | };
10 |
--------------------------------------------------------------------------------
/packages/app/features/transactions/transaction-feed-server.tsx:
--------------------------------------------------------------------------------
1 | import { fetchTransactionFeed } from "../../api/transactions";
2 | import { TransactionFeedFilter } from "@nook/common/types";
3 | import { TransactionFeed } from "./transaction-feed";
4 |
5 | export const TransactionFeedServer = async ({
6 | filter,
7 | }: {
8 | filter: TransactionFeedFilter;
9 | }) => {
10 | const initialData = await fetchTransactionFeed(filter);
11 |
12 | if (!initialData) {
13 | return <>>;
14 | }
15 |
16 | return ;
17 | };
18 |
--------------------------------------------------------------------------------
/packages/app/hooks/api/settings.ts:
--------------------------------------------------------------------------------
1 | import { Session } from "@nook/common/types";
2 | import { useQuery } from "@tanstack/react-query";
3 | import { useMuteStore } from "../../store/useMuteStore";
4 | import { fetchSettings } from "../../api/settings";
5 |
6 | export const useSettings = (session: Session | undefined) => {
7 | const updateFromSettings = useMuteStore((state) => state.updateFromSettings);
8 | return useQuery({
9 | queryKey: ["settings", session?.fid],
10 | queryFn: async () => {
11 | const response = await fetchSettings();
12 | if (response) updateFromSettings(response);
13 | return response || null;
14 | },
15 | enabled: !!session,
16 | });
17 | };
18 |
--------------------------------------------------------------------------------
/packages/app/hooks/useList.ts:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import { fetchList } from "../api/list";
3 | import { useListStore } from "../store/useListStore";
4 |
5 | export const useList = (listId: string) => {
6 | const storedList = useListStore((state) => state.lists[listId]);
7 | const addLists = useListStore((state) => state.addLists);
8 |
9 | const { data, isLoading, isError, error } = useQuery({
10 | queryKey: ["list", listId],
11 | queryFn: async () => {
12 | const list = await fetchList(listId);
13 | addLists([list]);
14 | return list;
15 | },
16 | enabled: !storedList,
17 | });
18 |
19 | return { list: storedList || data, isLoading, isError, error };
20 | };
21 |
--------------------------------------------------------------------------------
/packages/app/hooks/useNft.ts:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import { useNftStore } from "../store/useNftStore";
3 | import { fetchNft } from "../api/nft";
4 |
5 | export const useNft = (nftId: string) => {
6 | const storedNft = useNftStore((state) => state.nfts[nftId]);
7 | const addNfts = useNftStore((state) => state.addNfts);
8 |
9 | const { data, isLoading, isError, error } = useQuery({
10 | queryKey: ["nft", nftId],
11 | queryFn: async () => {
12 | const nft = await fetchNft(nftId);
13 | if (nft) {
14 | addNfts([nft]);
15 | }
16 | return nft;
17 | },
18 | enabled: !storedNft,
19 | });
20 | return { nft: storedNft || data, isLoading, isError, error };
21 | };
22 |
--------------------------------------------------------------------------------
/packages/app/hooks/useStableCallback.ts:
--------------------------------------------------------------------------------
1 | import { useRef, useCallback, useEffect } from "react";
2 |
3 | export function useStableCallback any>(
4 | callback: Callback,
5 | ) {
6 | const callbackRef = useRef();
7 | const memoCallback = useCallback(
8 | (...args: Parameters) =>
9 | callbackRef.current && callbackRef.current(...args),
10 | [],
11 | );
12 | useEffect(() => {
13 | callbackRef.current = callback;
14 | return () => (callbackRef.current = undefined);
15 | });
16 | return memoCallback;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/app/index.ts:
--------------------------------------------------------------------------------
1 | // leave this blank
2 | // don't re-export files from this workspace. it'll break next.js tree shaking
3 | // https://github.com/vercel/next.js/issues/12557
4 | export {}
5 |
--------------------------------------------------------------------------------
/packages/app/server/session.ts:
--------------------------------------------------------------------------------
1 | "use server";
2 |
3 | import { Session } from "@nook/common/types";
4 | import { cookies } from "next/headers";
5 |
6 | export async function updateServerSession(session: Session) {
7 | cookies().set("session", JSON.stringify(session), { secure: true });
8 | }
9 |
10 | export async function deleteServerSession() {
11 | cookies().delete("session");
12 | }
13 |
14 | export async function getServerSession(): Promise {
15 | const session = cookies().get("session");
16 | return session?.value ? JSON.parse(session.value) : undefined;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/app/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "include": [
4 | "**/*.ts",
5 | "**/*.tsx", "../common/utils/contracts.ts",
6 | ],
7 | "compilerOptions": {
8 | "composite": true,
9 | "jsx": "react-jsx"
10 | },
11 | "references": []
12 | }
13 |
--------------------------------------------------------------------------------
/packages/app/utils/haptics.native.ts:
--------------------------------------------------------------------------------
1 | import * as Haptics from "expo-haptics";
2 |
3 | export const haptics = {
4 | selection: () => Haptics.selectionAsync(),
5 | notificationSuccess: () =>
6 | Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success),
7 | notificationWarning: () =>
8 | Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning),
9 | notificationError: () =>
10 | Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error),
11 | impactLight: () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light),
12 | impactMedium: () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium),
13 | impactHeavy: () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy),
14 | };
15 |
--------------------------------------------------------------------------------
/packages/app/utils/haptics.ts:
--------------------------------------------------------------------------------
1 | export const haptics = {
2 | selection: () => {},
3 | notificationSuccess: () => {},
4 | notificationWarning: () => {},
5 | notificationError: () => {},
6 | impactLight: () => {},
7 | impactMedium: () => {},
8 | impactHeavy: () => {},
9 | };
10 |
--------------------------------------------------------------------------------
/packages/app/utils/wagmi.ts:
--------------------------------------------------------------------------------
1 | import { createConfig } from "wagmi";
2 | import { mainnet, optimism, zora, base, arbitrum } from "wagmi/chains";
3 | import { http } from "viem";
4 |
5 | export const wagmiConfig = createConfig({
6 | // @ts-ignore
7 | chains: [mainnet, optimism, zora, base, arbitrum],
8 | transports: {
9 | [mainnet.id]: http(),
10 | [optimism.id]: http(),
11 | [zora.id]: http(),
12 | [base.id]: http(),
13 | [arbitrum.id]: http(),
14 | },
15 | });
16 |
--------------------------------------------------------------------------------
/packages/common/clients/api/base.ts:
--------------------------------------------------------------------------------
1 | export class BaseAPIClient {
2 | API_ENDPOINT?: string | undefined = undefined;
3 |
4 | async makeRequest(
5 | path: string,
6 | options: RequestInit & { viewerFid?: string } = {},
7 | ) {
8 | const headers = {
9 | ...options.headers,
10 | ...(options.body ? { "Content-Type": "application/json" } : {}),
11 | ...(options.viewerFid ? { "X-Viewer-Fid": options.viewerFid } : {}),
12 | };
13 |
14 | const response = await fetch(`${this.API_ENDPOINT}${path}`, {
15 | ...options,
16 | headers,
17 | });
18 |
19 | return response;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/common/clients/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./content";
2 | export * from "./signer";
3 | export * from "./notifications";
4 | export * from "./list";
5 | export * from "./v1";
6 |
--------------------------------------------------------------------------------
/packages/common/clients/api/v1/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./farcaster";
2 |
--------------------------------------------------------------------------------
/packages/common/clients/cache/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./content";
2 | export * from "./farcaster";
3 | export * from "./nook";
4 | export * from "./base";
5 | export * from "./nft";
6 | export * from "./token";
7 |
--------------------------------------------------------------------------------
/packages/common/clients/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./api";
2 | export * from "./cache";
3 |
--------------------------------------------------------------------------------
/packages/common/index.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nook-app/nook-client/4eb15ffc4edcb8543a3ef6facca8ff92b061d41e/packages/common/index.ts
--------------------------------------------------------------------------------
/packages/common/prisma/content.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/content";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/farcaster.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/farcaster";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/index.ts:
--------------------------------------------------------------------------------
1 | import * as farcaster from "./farcaster";
2 | import * as nook from "./nook";
3 | import * as content from "./content";
4 | import * as signer from "./signer";
5 | import * as notifications from "./notifications";
6 | import * as user from "./user";
7 |
8 | export { farcaster, nook, content, signer, notifications, user };
9 |
--------------------------------------------------------------------------------
/packages/common/prisma/lists.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/lists";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/nook.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/nook";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/notifications.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/notifications";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/signer.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/signer";
2 |
--------------------------------------------------------------------------------
/packages/common/prisma/user.ts:
--------------------------------------------------------------------------------
1 | export * from "./generated/user";
2 |
--------------------------------------------------------------------------------
/packages/common/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["prisma/generated", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/common/types/providers/zerion/token-chart.ts:
--------------------------------------------------------------------------------
1 | export interface ZerionTokenChart {
2 | links: Links;
3 | data: Data;
4 | }
5 |
6 | export interface Data {
7 | type: string;
8 | id: string;
9 | attributes: Attributes;
10 | }
11 |
12 | export interface Attributes {
13 | begin_at: Date;
14 | end_at: Date;
15 | stats: Stats;
16 | points: Array;
17 | }
18 |
19 | export interface Stats {
20 | first: number;
21 | min: number;
22 | avg: number;
23 | max: number;
24 | last: number;
25 | }
26 |
27 | export interface Links {
28 | self: string;
29 | }
30 |
--------------------------------------------------------------------------------
/packages/content-api/src/routes/feed.ts:
--------------------------------------------------------------------------------
1 | import { FastifyInstance } from "fastify";
2 | import { FeedService } from "../service/feed";
3 | import { FarcasterFeedRequest } from "@nook/common/types/feed";
4 |
5 | export const feedRoutes = async (fastify: FastifyInstance) => {
6 | fastify.register(async (fastify: FastifyInstance) => {
7 | const service = new FeedService(fastify);
8 |
9 | fastify.post<{
10 | Body: FarcasterFeedRequest;
11 | Querystring: { cursor?: string };
12 | }>("/feed/content", async (request, reply) => {
13 | const response = await service.getContentFeed(request.body);
14 | reply.send(response);
15 | });
16 | });
17 | };
18 |
--------------------------------------------------------------------------------
/packages/content-api/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./url";
2 | export * from "./chain";
3 |
--------------------------------------------------------------------------------
/packages/content-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/dashboard/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/dashboard",
3 | "version": "0.0.1",
4 | "private": true,
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "tsc",
8 | "start": "node dist/index.js"
9 | },
10 | "dependencies": {
11 | "@bull-board/api": "^5.10.2",
12 | "@bull-board/fastify": "^5.10.2",
13 | "@bull-board/ui": "^5.10.2",
14 | "@nook/common": "*",
15 | "bullmq": "^5.1.0",
16 | "fastify": "^4.25.2"
17 | },
18 | "devDependencies": {
19 | "@types/node": "^20.10.5",
20 | "typescript": "^5.3.3"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/packages/dashboard/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/events/manual.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getQueue } from "@nook/common/queues";
2 | import { getEventsHandler } from "./handlers";
3 |
4 | const run = async () => {
5 | const queue = getQueue(QueueName.EventsPriority);
6 | console.log(`Running for event ${process.argv[2]}`);
7 | const job = await queue.getJob(process.argv[2]);
8 | if (job) {
9 | const handler = await getEventsHandler();
10 | await handler(job);
11 | }
12 | };
13 |
14 | run()
15 | .catch((e) => {
16 | console.error(e);
17 | process.exit(1);
18 | })
19 | .finally(() => {
20 | process.exit(0);
21 | });
22 |
--------------------------------------------------------------------------------
/packages/events/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/events",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/worker.js",
8 | "start:priority": "node dist/worker.js --priority",
9 | "start:manual": "tsc && node --enable-source-maps dist/manual.js",
10 | "dev:manual": "ts-node dist/manual.ts --inspect=9229"
11 | },
12 | "exports": {
13 | "./processors": "./dist/processors/index.js"
14 | },
15 | "dependencies": {
16 | "@farcaster/hub-nodejs": "^0.11.4",
17 | "@nook/common": "*",
18 | "bullmq": "^5.1.0"
19 | },
20 | "devDependencies": {
21 | "@types/node": "^20.10.5",
22 | "typescript": "^5.3.3"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/packages/events/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/events/worker.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getWorker } from "@nook/common/queues";
2 | import { getEventsHandler } from "./handlers";
3 |
4 | const run = async () => {
5 | const isPriority = process.argv.includes("--priority");
6 | const worker = getWorker(
7 | isPriority ? QueueName.EventsPriority : QueueName.Events,
8 | await getEventsHandler(),
9 | );
10 |
11 | worker.on("failed", (job, err) => {
12 | if (job) {
13 | console.log(`[${job.id}] failed with ${err.message}`);
14 | }
15 | });
16 | };
17 |
18 | run().catch((e) => {
19 | console.error(e);
20 | process.exit(1);
21 | });
22 |
--------------------------------------------------------------------------------
/packages/farcaster-api/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "watch": ["src/**/*.ts"],
3 | "ext": "ts"
4 | }
5 |
--------------------------------------------------------------------------------
/packages/farcaster-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/farcaster-api",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/src/index.js",
8 | "dev": "ts-node src/index.ts --inspect=9229"
9 | },
10 | "dependencies": {
11 | "@ethersproject/abstract-signer": "^5.7.0",
12 | "@farcaster/fishery": "^2.2.3",
13 | "@farcaster/hub-nodejs": "^0.11.3",
14 | "@fastify/jwt": "^8.0.0",
15 | "@nook/common": "*",
16 | "bullmq": "^5.1.0",
17 | "ethers": "^6.9.1",
18 | "fastify": "^4.25.2"
19 | },
20 | "devDependencies": {
21 | "@types/node": "^20.10.5",
22 | "typescript": "^5.3.3"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/packages/farcaster-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/farcaster/backfill/index.ts:
--------------------------------------------------------------------------------
1 | import { FarcasterBackfillProcessor } from "./processor";
2 |
3 | const run = async () => {
4 | const processor = new FarcasterBackfillProcessor();
5 | await processor.backfillFid(Number(process.argv[2]));
6 | };
7 |
8 | run()
9 | .catch((e) => {
10 | console.error(e);
11 | process.exit(1);
12 | })
13 | .finally(() => {
14 | process.exit(0);
15 | });
16 |
--------------------------------------------------------------------------------
/packages/farcaster/src/consumer.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getWorker } from "@nook/common/queues";
2 | import { FarcasterEventProcessor } from "./processor";
3 |
4 | const run = async () => {
5 | const processor = new FarcasterEventProcessor();
6 | const worker = getWorker(QueueName.Farcaster, async (job) => {
7 | await processor.process(job.data);
8 | });
9 |
10 | worker.on("failed", (job, err) => {
11 | if (job) {
12 | console.log(`[${job.id}] failed with ${err.message}`);
13 | }
14 | });
15 | };
16 |
17 | run().catch((e) => {
18 | console.error(e);
19 | process.exit(1);
20 | });
21 |
--------------------------------------------------------------------------------
/packages/farcaster/src/manual.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getQueue } from "@nook/common/queues";
2 | import { FarcasterEventProcessor } from "./processor";
3 |
4 | const run = async () => {
5 | const processor = new FarcasterEventProcessor();
6 |
7 | const queue = getQueue(QueueName.Farcaster);
8 | console.log(`Running for event ${process.argv[2]}`);
9 | const job = await queue.getJob(process.argv[2]);
10 | if (job) {
11 | await processor.process(job.data);
12 | }
13 | };
14 |
15 | run()
16 | .catch((e) => {
17 | console.error(e);
18 | process.exit(1);
19 | })
20 | .finally(() => {
21 | process.exit(0);
22 | });
23 |
--------------------------------------------------------------------------------
/packages/farcaster/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/list-api/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "watch": ["src/**/*.ts"],
3 | "ext": "ts"
4 | }
5 |
--------------------------------------------------------------------------------
/packages/list-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/list-api",
3 | "private": true,
4 | "packageManager": "yarn@4.1.0",
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/src/index.js",
8 | "dev": "ts-node src/index.ts --inspect=9229"
9 | },
10 | "dependencies": {
11 | "@fastify/jwt": "^8.0.0",
12 | "@nook/common": "*",
13 | "fastify": "^4.26.2"
14 | },
15 | "devDependencies": {
16 | "@types/node": "^20.11.30",
17 | "typescript": "^5.4.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/packages/list-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/notifications-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/notifications-api",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/src/index.js"
8 | },
9 | "dependencies": {
10 | "@fastify/jwt": "^8.0.0",
11 | "@nook/common": "*",
12 | "expo-server-sdk": "^3.9.0",
13 | "fastify": "^4.25.2"
14 | },
15 | "devDependencies": {
16 | "@types/node": "^20.10.5",
17 | "typescript": "^5.3.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/packages/notifications-api/src/plugins/index.ts:
--------------------------------------------------------------------------------
1 | import fp from "fastify-plugin";
2 | import { PrismaClient } from "@nook/common/prisma/notifications";
3 |
4 | declare module "fastify" {
5 | interface FastifyInstance {
6 | notifications: {
7 | client: PrismaClient;
8 | };
9 | }
10 | }
11 |
12 | export const notificationsPlugin = fp(async (fastify, opts) => {
13 | const client = new PrismaClient();
14 | await client.$connect();
15 | fastify.decorate("notifications", { client });
16 | fastify.addHook("onClose", async (fastify) => {
17 | await fastify.notifications.client.$disconnect();
18 | });
19 | });
20 |
--------------------------------------------------------------------------------
/packages/notifications-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/notifications/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/notifications",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/worker.js",
8 | "start:manual": "tsc && node --enable-source-maps dist/manual.js",
9 | "dev:manual": "ts-node dist/manual.ts --inspect=9229"
10 | },
11 | "exports": {
12 | "./processors": "./dist/processors/index.js"
13 | },
14 | "dependencies": {
15 | "@farcaster/hub-nodejs": "^0.11.4",
16 | "@nook/common": "*",
17 | "bullmq": "^5.1.0"
18 | },
19 | "devDependencies": {
20 | "@types/node": "^20.10.5",
21 | "typescript": "^5.3.3"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/packages/notifications/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/notifications/worker.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getWorker } from "@nook/common/queues";
2 | import { getNotificationsHandler } from "./handlers";
3 |
4 | const run = async () => {
5 | const worker = getWorker(
6 | QueueName.Notifications,
7 | await getNotificationsHandler(),
8 | );
9 |
10 | worker.on("failed", (job, err) => {
11 | if (job) {
12 | console.log(`[${job.id}] failed with ${err.message}`);
13 | }
14 | });
15 | };
16 |
17 | run().catch((e) => {
18 | console.error(e);
19 | process.exit(1);
20 | });
21 |
--------------------------------------------------------------------------------
/packages/scheduler/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/scheduler",
3 | "private": true,
4 | "packageManager": "yarn@4.1.0",
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/src/index.js",
8 | "dev": "ts-node src/index.ts --inspect=9229",
9 | "manual": "ts-node src/manual.ts",
10 | "start:scheduled-worker": "node dist/src/workers/publish-scheduled.js"
11 | },
12 | "dependencies": {
13 | "@nook/common": "*",
14 | "cron": "^3.1.7"
15 | },
16 | "devDependencies": {
17 | "@types/node": "^20.11.30",
18 | "ts-node": "^10.9.2",
19 | "typescript": "^5.3.3"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/scheduler/src/index.ts:
--------------------------------------------------------------------------------
1 | import { CronJob, CronJobParams } from "cron";
2 | import { queueScheduledCasts } from "./jobs/publish-scheduled";
3 |
4 | const jobs: CronJobParams[] = [
5 | {
6 | cronTime: "* * * * *",
7 | onTick: queueScheduledCasts,
8 | start: true,
9 | },
10 | ];
11 |
12 | for (const job of jobs) {
13 | CronJob.from(job);
14 | }
15 |
--------------------------------------------------------------------------------
/packages/scheduler/src/workers/publish-scheduled.ts:
--------------------------------------------------------------------------------
1 | import { QueueName, getWorker } from "@nook/common/queues";
2 | import { ScheduledCastEventProcessor } from "../processors/ScheduledCastProcessor";
3 | const processor = new ScheduledCastEventProcessor();
4 |
5 | const run = async () => {
6 | const worker = getWorker(QueueName.ScheduledCast, async (job) => {
7 | await processor.process(job.data);
8 | });
9 |
10 | worker.on("failed", (job, err) => {
11 | if (job) {
12 | console.log(`[${job.id}] failed with ${err.message}`);
13 | }
14 | });
15 | };
16 |
17 | run().catch((e) => {
18 | console.error(e);
19 | process.exit(1);
20 | });
21 |
--------------------------------------------------------------------------------
/packages/scheduler/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/scripts/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/signer-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nook/signer-api",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "node dist/src/index.js"
8 | },
9 | "dependencies": {
10 | "@farcaster/fishery": "^2.2.3",
11 | "@farcaster/hub-nodejs": "^0.11.8",
12 | "@fastify/jwt": "^8.0.0",
13 | "@nook/common": "*",
14 | "fastify": "^4.25.2",
15 | "viem": "^2.7.10"
16 | },
17 | "devDependencies": {
18 | "@types/node": "^20.10.5",
19 | "typescript": "^5.3.3"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/signer-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/swap-api/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "watch": ["src/**/*.ts"],
3 | "ext": "ts"
4 | }
5 |
--------------------------------------------------------------------------------
/packages/swap-api/src/plugins/index.ts:
--------------------------------------------------------------------------------
1 | import fp from "fastify-plugin";
2 | import { RedisClient } from "@nook/common/clients";
3 |
4 | declare module "fastify" {
5 | interface FastifyInstance {
6 | redis: {
7 | client: RedisClient;
8 | };
9 | }
10 | }
11 |
12 | export const redisPlugin = fp(async (fastify, opts) => {
13 | const client = new RedisClient();
14 | await client.connect();
15 | fastify.decorate("redis", { client });
16 | fastify.addHook("onClose", async (fastify) => {
17 | await fastify.redis.client.close();
18 | });
19 | });
20 |
--------------------------------------------------------------------------------
/packages/swap-api/src/service/types.ts:
--------------------------------------------------------------------------------
1 | import { ZeroXSupportedChain } from "@nook/common/types";
2 |
3 | export type SwapToken = {
4 | chain: ZeroXSupportedChain;
5 | address: `0x${string}`;
6 | amount?: bigint;
7 | };
8 |
9 | export type GetSwapParams = {
10 | buyToken: SwapToken;
11 | sellToken: SwapToken;
12 | maxSlippageBps: number;
13 | maxPriceImpactBps: number;
14 | taker: `0x${string}`;
15 | requestId: string;
16 | affiliate?: `0x${string}`;
17 | };
18 |
--------------------------------------------------------------------------------
/packages/swap-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "composite": true,
5 | "outDir": "./dist"
6 | },
7 | "exclude": ["dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/railway.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://railway.app/railway.schema.json",
3 | "build": {
4 | "nixpacksVersion": "1.21.2",
5 | "builder": "NIXPACKS"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "ts-node": {
3 | "require": ["tsconfig-paths/register"]
4 | },
5 | "compilerOptions": {
6 | "target": "ES2020",
7 | "lib": ["dom", "dom.iterable", "esnext", "es2017"],
8 | "allowJs": true,
9 | "skipLibCheck": true,
10 | "strict": true,
11 | "esModuleInterop": true,
12 | "module": "CommonJS",
13 | "moduleResolution": "node",
14 | "resolveJsonModule": true,
15 | "isolatedModules": true,
16 | "jsx": "preserve",
17 | "incremental": true,
18 | "sourceMap": true,
19 | "noImplicitAny": true
20 | },
21 | "exclude": [
22 | "dist",
23 | "**/dist/",
24 | "node_modules",
25 | "**/*.spec.ts",
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/turbo.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://turbo.build/schema.json",
3 | "pipeline": {
4 | "build": {
5 | "dependsOn": ["^build"],
6 | "outputs": [
7 | "./dist/**",
8 | "./prisma/generated/**",
9 | ".next/**",
10 | "!.next/cache/**",
11 | "./.tamagui/**"
12 | ]
13 | },
14 | "lint": {},
15 | "dev": {
16 | "cache": false,
17 | "persistent": true
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------