aboutsummaryrefslogtreecommitdiff
path: root/extension/src/entries/popup
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/entries/popup')
-rw-r--r--extension/src/entries/popup/App.vue2
-rw-r--r--extension/src/entries/popup/Components/IdentitySelection.vue20
-rw-r--r--extension/src/entries/popup/Components/Login.vue16
-rw-r--r--extension/src/entries/popup/Components/PageContent.vue113
-rw-r--r--extension/src/entries/popup/local.scss18
-rw-r--r--extension/src/entries/popup/main.js15
6 files changed, 116 insertions, 68 deletions
diff --git a/extension/src/entries/popup/App.vue b/extension/src/entries/popup/App.vue
index 0181bbb..8c49fa6 100644
--- a/extension/src/entries/popup/App.vue
+++ b/extension/src/entries/popup/App.vue
@@ -17,6 +17,6 @@ main {
text-align: center;
color: #2c3e50;
- @apply dark:bg-dark-800 bg-white dark:text-gray-200;
+ @apply dark:bg-dark-900 bg-white dark:text-gray-200;
}
</style>
diff --git a/extension/src/entries/popup/Components/IdentitySelection.vue b/extension/src/entries/popup/Components/IdentitySelection.vue
index d1a7333..99d8e34 100644
--- a/extension/src/entries/popup/Components/IdentitySelection.vue
+++ b/extension/src/entries/popup/Components/IdentitySelection.vue
@@ -1,5 +1,5 @@
<template>
- <div class="px-3 text-left">
+ <div class="text-left">
<div class="w-full">
<div class="">
<select class="w-full input"
@@ -19,28 +19,22 @@
<script setup lang="ts">
import { find } from 'lodash'
import { computed } from "vue";
-import { useStatus, useManagment, NostrPubKey } from "~/bg-api/popup.ts";
+import { useStore } from "../../store";
import { useWait } from '@vnuge/vnlib.browser'
-import { computedAsync } from '@vueuse/core';
+import { storeToRefs } from 'pinia';
-const { selectedKey } = useStatus();
const { waiting } = useWait();
-const { getAllKeys, selectKey } = useManagment();
-
-const allKeys = computedAsync<NostrPubKey[]>(async () => await getAllKeys(), []);
+const store = useStore();
+const { selectedKey, allKeys } = storeToRefs(store);
const onSelected = async ({target}) =>{
//Select the key of the given id
const selected = find(allKeys.value, {Id: target.value})
if(selected){
- await selectKey(selected)
+ await store.selectKey(selected)
}
}
-const selected = computed(() => selectedKey?.value || { Id:"0" })
+const selected = computed(() => selectedKey?.value || { Id:"" })
</script>
-
-<style lang="scss">
-
-</style> \ No newline at end of file
diff --git a/extension/src/entries/popup/Components/Login.vue b/extension/src/entries/popup/Components/Login.vue
index c863430..44df714 100644
--- a/extension/src/entries/popup/Components/Login.vue
+++ b/extension/src/entries/popup/Components/Login.vue
@@ -19,18 +19,24 @@
</template>
<script setup lang="ts">
-import { useWait } from "@vnuge/vnlib.browser";
+import { apiCall, useWait } from "@vnuge/vnlib.browser";
import { ref } from "vue";
-import { useManagment } from "~/bg-api/popup.ts";
+import { useStore } from "../../store";
-const { login } = useManagment()
+const { login } = useStore()
const { waiting } = useWait()
const token = ref('')
const onSubmit = async () => {
- //console.log(token.value)
- await login(token.value)
+ await apiCall(async ({ toaster }) => {
+ await login(token.value)
+ toaster.general.success({
+ 'title': 'Login successful',
+ 'text': 'Successfully logged into your profile'
+ })
+ })
+
}
</script>
diff --git a/extension/src/entries/popup/Components/PageContent.vue b/extension/src/entries/popup/Components/PageContent.vue
index eda9bab..1a3995e 100644
--- a/extension/src/entries/popup/Components/PageContent.vue
+++ b/extension/src/entries/popup/Components/PageContent.vue
@@ -4,35 +4,49 @@
class="flex flex-col text-left w-[20rem] min-h-[25rem]"
>
- <div class="flex flex-row w-full px-1 pl-4">
- <div class="flex-auto my-auto">
- <h3>NVault</h3>
+ <div class="flex flex-row w-full gap-2 p-1.5 bg-black text-white dark:bg-dark-600 shadow">
+ <div class="flex flex-row flex-auto my-auto">
+ <div class="my-auto mr-2">
+ <img class="h-6" src="/icons/32.png" />
+ </div>
+ <h3 class="block my-auto">NVault</h3>
+ <div class="px-3 py-.5 m-auto text-sm rounded-full h-fit active-badge" :class="[isTabAllowed ? 'active' : 'inactive']">
+ {{ isTabAllowed ? 'Active' : 'Inactive' }}
+ </div>
</div>
<div class="my-auto" v-if="loggedIn">
- <button class="rounded btn sm red" @click.prevent="logout">
+ <button class="rounded btn xs" @click.prevent="logout">
<fa-icon icon="arrow-right-from-bracket" />
</button>
</div>
- <div class="p-2 my-auto">
- <button class="rounded btn sm" @click="openOptions">
+ <div class="my-auto">
+ <button class="rounded btn xs" @click="openOptions">
<fa-icon :icon="['fas', 'gear']"/>
</button>
</div>
</div>
+
<div v-if="!loggedIn">
<Login></Login>
</div>
- <div v-else class="flex justify-center pb-4">
- <div class="w-full m-auto">
- <div class="mt-2 text-center">
- {{ userName }}
- <div class="mt-4">
+
+ <div v-else class="flex justify-center">
+ <div class="w-full px-3 m-auto">
+
+ <div class="text-sm text-center">
+ {{ userName }}
+ </div>
+
+ <div class="">
+ <label class="mb-0.5 text-sm dark:text-dark-100">
+ Identity
+ </label>
<IdentitySelection></IdentitySelection>
</div>
- <div class="mt-2.5 min-h-[6rem]">
- <div class="flex flex-col justify-center">
-
- <div class="flex flex-row gap-2 p-2 mx-3 my-3 bg-gray-100 border border-gray-200 rounded dark:bg-dark-700 dark:border-dark-400">
+
+ <div class="w-full mt-1">
+ <div class="flex flex-col">
+ <div class="flex flex-row gap-2 p-1.5 bg-gray-100 border border-gray-200 dark:bg-dark-800 dark:border-dark-400">
<div class="text-sm break-all">
{{ pubKey ?? 'No key selected' }}
</div>
@@ -40,13 +54,30 @@
<fa-icon class="mr-1" icon="copy" @click="copy(pubKey)"/>
</div>
</div>
-
</div>
</div>
- <div class="mt-3 text-sm">
- Always on NIP-07: <span class="font-semibold" :class="{'text-blue-500':autoInject}">{{ autoInject }}</span>
+
+ <div class="mt-4">
+ <label class="block mb-1 text-xs text-left dark:text-dark-100" >
+ Current origin
+ </label>
+
+ <div v-if="isOriginProtectionOn" class="flex flex-row w-full gap-2">
+ <input :value="currentOrigin" class="flex-1 p-1 mx-0 text-sm input" readonly/>
+
+ <button v-if="isTabAllowed" class="btn xs" @click="store.dissallowOrigin()">
+ <fa-icon icon="minus" />
+ </button>
+ <button v-else class="btn xs" @click="store.allowOrigin()">
+ <fa-icon icon="plus" />
+ </button>
+ </div>
+
+ <div v-else class="text-xs text-center">
+ <span class="">Tracking protection disabled</span>
+ </div>
</div>
- </div>
+
</div>
</div>
@@ -57,9 +88,10 @@
<script setup lang="ts">
import { computed, watchEffect } from "vue";
-import { useStatus, useManagment } from "~/bg-api/popup.ts";
-import { configureNotifier } from "@vnuge/vnlib.browser";
-import { asyncComputed, useClipboard, watchDebounced } from '@vueuse/core'
+import { storeToRefs } from "pinia";
+import { useStore } from "../../store";
+import { apiCall, configureNotifier } from "@vnuge/vnlib.browser";
+import { useClipboard } from '@vueuse/core'
import { notify } from "@kyvg/vue3-notification";
import { runtime } from "webextension-polyfill";
import Login from "./Login.vue";
@@ -67,38 +99,25 @@ import IdentitySelection from "./IdentitySelection.vue";
configureNotifier({notify, close:notify.close})
-const { loggedIn, userName, selectedKey, darkMode } = useStatus()
-const { logout, getProfile, getSiteConfig } = useManagment()
-
+const store = useStore()
+const { loggedIn, selectedKey, userName, darkMode, isTabAllowed, currentOrigin, isOriginProtectionOn } = storeToRefs(store)
const { copy, copied } = useClipboard()
-const pubKey = computed(() => selectedKey.value?.PublicKey)
-const qrCode = computed(() => pubKey.value ? `nostr:npub1${pubKey.value}` : null)
-
-watchDebounced(loggedIn, async () => {
- //Manually update the user's profile if they are logged in and the profile is not yet loaded
- if(loggedIn.value && !userName.value){
- getProfile()
- }
-},{ debounce:100, immediate: true })
+const pubKey = computed(() => selectedKey!.value?.PublicKey)
const openOptions = () => runtime.openOptionsPage();
//Watch for dark mode changes and update the body class
watchEffect(() => darkMode.value ? document.body.classList.add('dark') : document.body.classList.remove('dark'));
-const autoInject = asyncComputed(() => getSiteConfig().then<Boolean>(p => p.autoInject), false)
-
-</script>
-
-<style lang="scss">
-
-.toaster{
- position: fixed;
- top: 15px;
- right: 0;
- z-index: 9999;
- max-width: 230px;
+const logout = () =>{
+ apiCall(async ({ toaster }) =>{
+ await store.logout()
+ toaster.general.success({
+ 'title':'Success',
+ 'text': 'You have been logged out'
+ })
+ })
}
-</style>
+</script>
diff --git a/extension/src/entries/popup/local.scss b/extension/src/entries/popup/local.scss
new file mode 100644
index 0000000..9c64b98
--- /dev/null
+++ b/extension/src/entries/popup/local.scss
@@ -0,0 +1,18 @@
+
+.toaster {
+ position: fixed;
+ top: 15px;
+ right: 0;
+ z-index: 9999;
+ max-width: 230px;
+}
+
+.active-badge{
+ @apply text-white;
+ &.active{
+ @apply bg-primary-500 dark:bg-primary-600;
+ }
+ &.inactive{
+
+ }
+} \ No newline at end of file
diff --git a/extension/src/entries/popup/main.js b/extension/src/entries/popup/main.js
index 4a32bb7..a259e63 100644
--- a/extension/src/entries/popup/main.js
+++ b/extension/src/entries/popup/main.js
@@ -14,19 +14,30 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import { createApp } from "vue";
+import { createPinia } from "pinia";
+import { identityPlugin, originPlugin, useBackgroundPiniaPlugin } from '../store'
import App from "./App.vue";
import Notifications from "@kyvg/vue3-notification";
import '@fontsource/noto-sans-masaram-gondi'
import "~/assets/all.scss";
+import "./local.scss"
/* FONT AWESOME CONFIG */
import { library } from '@fortawesome/fontawesome-svg-core'
-import { faArrowRightFromBracket, faCopy, faEdit, faGear, faSpinner } from '@fortawesome/free-solid-svg-icons'
+import { faArrowRightFromBracket, faCopy, faEdit, faGear, faMinus, faPlus, faSpinner } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
-library.add(faSpinner, faEdit, faGear, faCopy, faArrowRightFromBracket)
+library.add(faSpinner, faEdit, faGear, faCopy, faArrowRightFromBracket, faPlus, faMinus)
+
+const bgPlugin = useBackgroundPiniaPlugin('popup')
+
+const pinia = createPinia()
+ .use(bgPlugin) //Add the background pinia plugin
+ .use(identityPlugin)
+ .use(originPlugin)
createApp(App)
.use(Notifications)
+ .use(pinia)
.component('fa-icon', FontAwesomeIcon)
.mount("#app");