├── .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 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 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 | 2 | 3 | 4 | 5 | 6 | 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 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 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 | 2 | 3 | 4 | 5 | 6 | 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 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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 | {chain.name} 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 | 9 | 16 | } 17 | title={"View on OnceUpon"} 18 | link={`https://www.onceupon.xyz/${event.transaction}`} 19 | /> 20 | 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 | --------------------------------------------------------------------------------