From 07a70557a6067e318dcf58272d7b337c2a73a4f2 Mon Sep 17 00:00:00 2001 From: ciaranightingale <52419674+ciaranightingale@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:38:00 +0100 Subject: [PATCH] api key modifications (#847) * modify API Key flow * move api keys lower in sidebar * icon --- docs/go/index.md | 2 +- docs/onboarding/0 1 Platform Overview.mdx | 17 ----------------- docs/onboarding/11 Storage/0 Overview.mdx | 4 ---- docs/python/getting-started.mdx | 2 +- docs/react-native/getting-started.md | 8 ++++---- docs/react-native/storage.md | 5 ++--- docs/react/ThirdwebProvider.mdx | 4 ++-- docs/react/getting-started.mdx | 2 +- docs/react/storage/usestorage.mdx | 5 ++--- docs/react/storage/usestorageupload.mdx | 5 ++--- docs/typescript/getting-started.mdx | 2 +- docs/unity/getting-started.mdx | 2 +- src/theme/DocSidebarItem/Link/index.js | 6 ++---- src/theme/DocSidebarItems/index.js | 4 ++-- static/assets/resources/key.png | Bin 0 -> 12918 bytes 15 files changed, 21 insertions(+), 47 deletions(-) create mode 100644 static/assets/resources/key.png diff --git a/docs/go/index.md b/docs/go/index.md index 80cb5c34c..d2d31c5d6 100644 --- a/docs/go/index.md +++ b/docs/go/index.md @@ -32,7 +32,7 @@ go get github.com/thirdweb-dev/go-sdk/v2/thirdweb ## Getting Started -To start using this SDK, you just need to pass in a provider configuration. It's also strongly recommended that you use your thirdweb API keys with the SDK in order to get the best infrastructure performance (across RPCs, IPFS, etc.) - you can learn more about creating and using API keys [here](https://portal.thirdweb.com/api-keys). +To start using this SDK, you just need to pass in a provider configuration. It's also recommended that you use your thirdweb API keys with the SDK in order to get the best infrastructure performance (across RPCs, IPFS, etc.) - you can learn more about creating and using API keys [here](https://portal.thirdweb.com/api-keys). ### Instantiating the SDK diff --git a/docs/onboarding/0 1 Platform Overview.mdx b/docs/onboarding/0 1 Platform Overview.mdx index 2aea81a7a..99ba7cfae 100644 --- a/docs/onboarding/0 1 Platform Overview.mdx +++ b/docs/onboarding/0 1 Platform Overview.mdx @@ -10,23 +10,6 @@ import ThemedImage from "@theme/ThemedImage"; thirdweb is a comprehensive development framework that empowers you to seamlessly build, launch, and manage web3 applications and games across any EVM-compatible blockchain. -:::info API Keys - The following thirdweb products and services now require an API key: - - [**Smart Wallet**](/glossary/smart-wallet) - - [**Storage**](/storage) - - The following [**CLI**](/cli) commands (these commands require you to login using the [login](/cli/commands/login) command): - - [**Generate**](/cli/commands/generate) - - [**Deploy**](/cli/commands/deploy) - - [**Publish**](/cli/commands/publish) - - [**Upload**](/cli/commands/upload) - - **RPCs** - -Visit the thirdweb [**Dashboard**](https://thirdweb.com/create-api-key) to create an API key. - -To learn more about API keys, please visit the [**API Keys**](/api-keys) **page**. -::: - - ## Architecture Whether you're developing decentralized applications from scratch or enhancing existing ones, diff --git a/docs/onboarding/11 Storage/0 Overview.mdx b/docs/onboarding/11 Storage/0 Overview.mdx index 8ea20154f..c32a38f79 100644 --- a/docs/onboarding/11 Storage/0 Overview.mdx +++ b/docs/onboarding/11 Storage/0 Overview.mdx @@ -17,10 +17,6 @@ ideal for storing files in a permanent, decentralized, censorship-resistant mann Storage powers functionality in a number of our other products, such as uploading smart contract ABIs in [deploy](/deploy), our [IPFS Renderer](/react/react.mediarenderer) UI component & [NFT metadata fetching](/react/react.usenft) capabilities in the SDK, and uploading of NFT metadata in the dashboard. -:::caution -You will require an API key to use thirdweb’s storage services. If you haven’t created a key yet you can do so for free from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). -::: - { Please note that you will also need to get your app's `bundleId` and pass it in the `Allowed Bundle IDs` section when creating your API key. Check [how you can get your app's `bundleId`](https://portal.thirdweb.com/api-keys#react-native). -::: - ## useStorage hook Configurable in the [`storageInterface`](/react/react.thirdwebprovider#storageinterface-optional) prop of the [`ThirdwebProvider`](/react/react.thirdwebprovider). diff --git a/docs/react/ThirdwebProvider.mdx b/docs/react/ThirdwebProvider.mdx index 871a0570f..4beb28c5f 100644 --- a/docs/react/ThirdwebProvider.mdx +++ b/docs/react/ThirdwebProvider.mdx @@ -16,8 +16,8 @@ Wrap your app in the `ThirdwebProvider` to access the SDK’s functionality ## Usage -:::caution API Keys -To use the React SDK, you need to first obtain an API key from the [Dashboard](https://thirdweb.com/dashboard) and then copy the `clientId` to pass as a prop to the `ThirdwebPovider`. +:::info API Keys +You will require an API key to use thirdweb's infrastructure services with the SDK, you need to first obtain an API key from the [dashboard](https://thirdweb.com/dashboard) and then copy the `clientId` to pass as a prop to the `ThirdwebPovider`. ::: If you are using one of our default chains, provide the name of the chain as a `string` to the `activeChain` prop. diff --git a/docs/react/getting-started.mdx b/docs/react/getting-started.mdx index 2af461515..8c8fed340 100644 --- a/docs/react/getting-started.mdx +++ b/docs/react/getting-started.mdx @@ -172,7 +172,7 @@ export default function Home() {
-:::caution API KEYS +:::info API Key You will require an API key to use thirdweb's infrastructure services with the SDK. If you haven't created a key yet you can do so for **free** from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). ::: diff --git a/docs/react/storage/usestorage.mdx b/docs/react/storage/usestorage.mdx index 3f14bb23e..3a8287e8d 100644 --- a/docs/react/storage/usestorage.mdx +++ b/docs/react/storage/usestorage.mdx @@ -8,7 +8,8 @@ Get the instance of the `ThirdwebStorage` class being used by the [`ThirdwebProv Allows you to use the TypeScript SDK functionality of [Storage](/storage) in your React app. -:::caution API Key +## API Key + You will require an API key to use thirdweb’s storage services with the SDK. If you haven’t created a key yet you can do so for free from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). You can then obtain a `clientId` from the API key which you will need to pass to the [`ThirdwebProvider`](/react/react.thirdwebprovider) component: @@ -25,8 +26,6 @@ const App = () => { }; ``` -::: - Configurable in the [`storageInterface`](/react/react.thirdwebprovider#storageinterface-optional) prop of the [`ThirdwebProvider`](/react/react.thirdwebprovider). The hook returns a [`ThirdwebStorage`](/typescript/storage) instance. View the [TypeScript Storage](/typescript/storage) documentation for more information. diff --git a/docs/react/storage/usestorageupload.mdx b/docs/react/storage/usestorageupload.mdx index 6ee1aa9c8..aee478be8 100644 --- a/docs/react/storage/usestorageupload.mdx +++ b/docs/react/storage/usestorageupload.mdx @@ -10,7 +10,8 @@ Hook for uploading files to IPFS and retrieving the IPFS URI. import { useStorage } from "@thirdweb-dev/react"; ``` -:::caution API Key +## API key + You will require an API key to use thirdweb’s storage services with the SDK. If you haven’t created a key yet you can do so for free from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). You can then obtain a `clientId` from the API key which you will need to pass to the [`ThirdwebProvider`](/react/react.thirdwebprovider) component: @@ -27,8 +28,6 @@ const App = () => { }; ``` -::: - ## Usage ```jsx diff --git a/docs/typescript/getting-started.mdx b/docs/typescript/getting-started.mdx index be77b023c..2ade1c605 100644 --- a/docs/typescript/getting-started.mdx +++ b/docs/typescript/getting-started.mdx @@ -31,7 +31,7 @@ npx thirdweb create app
-:::info +:::info API Key You will require an API key to use thirdweb’s infrastructure services with the SDK. If you haven’t created a key yet you can do so for free from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). ::: diff --git a/docs/unity/getting-started.mdx b/docs/unity/getting-started.mdx index 4ca7a52e9..99816d9c5 100644 --- a/docs/unity/getting-started.mdx +++ b/docs/unity/getting-started.mdx @@ -10,7 +10,7 @@ import GettingStartedLiveEditor from "@components/live-code/snippets/GettingStar Before getting started, you'll need to [download and install the Unity Hub and Unity Editor](https://learn.unity.com/tutorial/install-the-unity-hub-and-editor). -:::info +:::info API Key You will require an API key to use thirdweb’s infrastructure services with the SDK. If you haven’t created a key yet you can do so for free from the [**thirdweb dashboard**](https://thirdweb.com/create-api-key). ::: diff --git a/src/theme/DocSidebarItem/Link/index.js b/src/theme/DocSidebarItem/Link/index.js index 98fd229de..db560fa33 100644 --- a/src/theme/DocSidebarItem/Link/index.js +++ b/src/theme/DocSidebarItem/Link/index.js @@ -40,7 +40,7 @@ export const iconMapping = { "UI Components": "/assets/product/ui.png", Home: "/assets/icons/home.png", "Overview ": "/assets/icons/wrench.png", - "API Keys": "/assets/icons/rocket.png", + "API Keys": "/assets/resources/key.png", Templates: "/assets/resources/sdk-reference.svg", Guides: "/assets/resources/guides.svg", CLI: "/assets/product/CLI.png", @@ -110,9 +110,7 @@ export default function DocSidebarItemLink({ } ${ - (label === "Home" || - label === "Overview " || - label === "API Keys") && + (label === "Home" || label === "Overview ") && styles.invertLightIcon } diff --git a/src/theme/DocSidebarItems/index.js b/src/theme/DocSidebarItems/index.js index ccdc832da..e8470bc89 100644 --- a/src/theme/DocSidebarItems/index.js +++ b/src/theme/DocSidebarItems/index.js @@ -27,7 +27,7 @@ function DocSidebarItems({ items, ...props }) { const sidebarItems = [ { title: null, // No title for the first section - items: ["Home", "Overview ", "API Keys"], + items: ["Home", "Overview "], }, { title: "Wallets", @@ -77,7 +77,7 @@ function DocSidebarItems({ items, ...props }) { }, { title: "Resources", - items: ["Templates", "Guides", "Glossary"], + items: ["API Keys", "Templates", "Guides", "Glossary"], }, ]; diff --git a/static/assets/resources/key.png b/static/assets/resources/key.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d2deeca4324c018739c77a5a1d1e19e1ebbbba GIT binary patch literal 12918 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 literal 0 HcmV?d00001