diff --git a/README.md b/README.md
index 37a5496..add46b1 100644
--- a/README.md
+++ b/README.md
@@ -8,15 +8,50 @@
-# How to install
-1. Clone this repository to any directory such as `~/nullplatform-chrome/`
-2. Open Google Chrome and type `chrome://extensions` in the URL
-3. Make sure you have enabled the **Developer Mode** and click **Load unpacked extension**
-4. Select the directory where you've downloaded the extension and click `Install`
-(Optional) Once you have installed the extension, you can click on the **Pin** button to have it readily available
-
-# Usage: personal access tokens
-To retrieve your personall access token you have to:
-1. Log into nullplatform
-2. Click the extension and it will open a popup with your personal access token
-3. Click on "Copy to clipboard" button and that's it! now you can Copy the token to any cURL or script that you're crafting.
+
+This Chrome extension helps you quickly retrieve your **personal access token** and use it to make authenticated calls
+to the nullplatform API.
+
+# How to install or update
+
+1. Clone this repository to any directory, for example:
+
+ ```bash
+ git clone https://github.com/nullplatform/nullplatform-chrome.git ~/nullplatform-chrome
+ ```
+
+2. Open Google Chrome and navigate to `chrome://extensions`.
+3. Enable Developer mode (toggle in the top-right corner).
+4. Click **Load unpacked** and select the directory where you cloned the repository.
+5. The extension will now be installed or updated.
+
+💡 **Tip**: Pin the extension to your Chrome toolbar (📌 icon) for quicker access.
+
+# Usage: Retrieve your personal access token
+
+To retrieve your personal access token, just:
+
+1. Log in to nullplatform in a Chrome tab.
+2. Click the nullplatform extension icon.
+3. A popup will appear showing **your personal access token**.
+4. Click **Copy to clipboard** to easily paste it into any cURL command or script.
+
+# Troubleshooting
+
+If you see the following message when using the extension:
+
+> *"No token found. Make sure you’re logged in to nullplatform in this tab."*
+
+This usually means one of the following:
+
+1. You're not on a logged-in nullplatform tab
+
+ Make sure you have the platform open in a tab where you are already logged in. Then click the extension again.
+
+2. You need to update the extension
+
+ If you’re still seeing this message while on a logged-in tab, update the extension:
+
+ - Remove it and reinstall following the steps in [How to install or update](#how-to-install-or-update)
+
+ We release periodic updates, so make sure you’re using the latest version.
\ No newline at end of file
diff --git a/nullplatform-chrome.js b/nullplatform-chrome.js
index 2aa343f..867e57c 100644
--- a/nullplatform-chrome.js
+++ b/nullplatform-chrome.js
@@ -1,88 +1,89 @@
-const copyButton = document.getElementById('copyButton');
+const copyButton = document.getElementById("copyButton");
function updateUI(token) {
- const title = document.getElementById('title');
- const label = document.getElementById('token');
+ const title = document.getElementById("title");
+ const label = document.getElementById("token");
- if (token) {
- title.style.visibility = "visible";
- title.innerHTML = "Here is your personal access token:";
- label.textContent = token;
- label.style.display = "block";
- if (copyButton) {
- copyButton.style.visibility = "visible";
- copyButton.style.display = "block";
- }
- } else {
- title.innerHTML = "No token found. Is this a Nullplatform tab where you're already logged in?";
- title.style.visibility = "visible";
- label.style.display = "none";
- if (copyButton) {
- copyButton.style.display = "none";
- }
+ if (token) {
+ title.style.visibility = "visible";
+ title.innerHTML = "Here is your personal access token:";
+ label.textContent = token;
+ label.style.display = "block";
+ if (copyButton) {
+ copyButton.style.visibility = "visible";
+ copyButton.style.display = "block";
}
+ } else {
+ title.innerHTML = "No token found. Make sure you’re logged in to nullplatform in this tab.";
+ title.style.visibility = "visible";
+ label.style.display = "none";
+ if (copyButton) {
+ copyButton.style.display = "none";
+ }
+ }
}
function getAccessToken() {
- const accessTokenLocalStorageKey = 'accessToken';
- const accessTokenFetchURL = 'https://bff-dashboard.nullplatform.io/v1/auth/access_token';
- async function _getAccessToken() {
- try {
- const accessTokenFromLocalStorage = localStorage.getItem(accessTokenLocalStorageKey);
- if (accessTokenFromLocalStorage) {
- return accessTokenFromLocalStorage;
- }
- const organizationSlug = window.location.hostname?.split?.('.')?.[0];
- const response = await fetch(accessTokenFetchURL, {
- method: 'GET',
- credentials: 'include',
- headers: {
- 'Accept': 'application/json',
- 'np-organization-slug': organizationSlug
- }
- });
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- const text = await response.text();
-
- const data = JSON.parse(text);
- const token = data.access_token;
- return token;
- } catch (error) {;
- return null;
- }
+ const accessTokenLocalStorageKey = "accessToken";
+ const accessTokenFetchURL = "https://bff-dashboard.nullplatform.io/v1/auth/access_token";
+ async function _getAccessToken() {
+ try {
+ const accessTokenFromLocalStorage = localStorage.getItem(accessTokenLocalStorageKey);
+ if (accessTokenFromLocalStorage) {
+ return accessTokenFromLocalStorage;
+ }
+ const organizationSlug = window.location.hostname?.split?.(".")?.[0];
+ const response = await fetch(accessTokenFetchURL, {
+ method: "GET",
+ credentials: "include",
+ headers: {
+ Accept: "application/json",
+ "np-organization-slug": organizationSlug,
+ },
+ });
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ const text = await response.text();
+
+ const data = JSON.parse(text);
+ const token = data.access_token;
+ return token;
+ } catch (error) {
+ return null;
}
- return _getAccessToken();
+ }
+ return _getAccessToken();
}
-document.addEventListener('DOMContentLoaded', async function() {
- const tabs = await chrome.tabs.query({active: true, currentWindow: true});
- const results = await chrome.scripting.executeScript({
- target: {tabId: tabs[0].id},
- function: getAccessToken
- });
- if (results && results[0] && results[0].result) {
- const token = await results[0].result;
- updateUI(token);
- } else {
- updateUI(null);
- }
+document.addEventListener("DOMContentLoaded", async function () {
+ const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
+ const results = await chrome.scripting.executeScript({
+ target: { tabId: tabs[0].id },
+ function: getAccessToken,
+ });
+ if (results && results[0] && results[0].result) {
+ const token = await results[0].result;
+ updateUI(token);
+ } else {
+ updateUI(null);
+ }
});
-copyButton.addEventListener('click', function() {
- var copyText = document.getElementById('token');
-
- navigator.clipboard.writeText(copyText.textContent)
- .then(() => {
- copyButton.innerHTML = "Copy to clipboard ✓";
- })
- .catch(err => {
- console.error('Failed to copy text: ', err);
- })
- .finally(() => {
- setTimeout(() => {
- copyButton.innerHTML = "Copy to clipboard";
- }, 2000);
- });
+copyButton.addEventListener("click", function () {
+ var copyText = document.getElementById("token");
+
+ navigator.clipboard
+ .writeText(copyText.textContent)
+ .then(() => {
+ copyButton.innerHTML = "Copy to clipboard ✓";
+ })
+ .catch((err) => {
+ console.error("Failed to copy text: ", err);
+ })
+ .finally(() => {
+ setTimeout(() => {
+ copyButton.innerHTML = "Copy to clipboard";
+ }, 2000);
+ });
});