Browse Source
			
			
			
			
				
		Reviewed-on: https://gitea.anomalistdesign.com/trent_larson/kick-starter-for-time-pwa/pulls/42projects-view-improvements
				 3 changed files with 184 additions and 1 deletions
			
			
		| @ -0,0 +1,169 @@ | |||
| <template> | |||
|   <QuickNav selected="Profile"></QuickNav> | |||
|   <section id="Content" class="p-6 pb-24"> | |||
|     <!-- Breadcrumb --> | |||
|     <div id="ViewBreadcrumb" class="mb-8"> | |||
|       <h1 class="text-lg text-center font-light relative px-7"> | |||
|         <!-- Cancel --> | |||
|         <router-link | |||
|           :to="{ name: 'account' }" | |||
|           class="text-lg text-center px-2 py-1 absolute -left-2 -top-1" | |||
|           ><fa icon="chevron-left" class="fa-fw"></fa> | |||
|         </router-link> | |||
| 
 | |||
|         Switch Identity | |||
|       </h1> | |||
|     </div> | |||
| 
 | |||
|     <!-- Identity List --> | |||
| 
 | |||
|     <!-- Current Identity - Display First! --> | |||
|     <div class="block bg-slate-100 rounded-md flex items-center px-4 py-3 mb-4"> | |||
|       <fa icon="circle-check" class="fa-fw text-blue-600 text-xl mr-3"></fa> | |||
|       <span class="overflow-hidden"> | |||
|         <h2 class="text-xl font-semibold mb-0"> | |||
|           {{ firstName }} {{ lastName }} | |||
|         </h2> | |||
|         <div class="text-sm text-slate-500 truncate"> | |||
|           <b>ID:</b> <code>{{ activeDid }}</code> | |||
|         </div> | |||
|       </span> | |||
|     </div> | |||
| 
 | |||
|     <!-- Other Identity/ies --> | |||
|     <ul class="mb-4"> | |||
|       <li | |||
|         class="block bg-slate-100 rounded-md flex items-center px-4 py-3 mb-2" | |||
|         v-for="ident in otherIdentities" | |||
|         :key="ident.did" | |||
|         @click="switchAccount(ident.did)" | |||
|       > | |||
|         <fa icon="circle" class="fa-fw text-slate-400 text-xl mr-3"></fa> | |||
|         <span class="overflow-hidden"> | |||
|           <h2 class="text-xl font-semibold mb-0"></h2> | |||
|           <div class="text-sm text-slate-500 truncate"> | |||
|             <b>ID:</b> <code>{{ ident.did }}</code> | |||
|           </div> | |||
|         </span> | |||
|       </li> | |||
|     </ul> | |||
| 
 | |||
|     <!-- Actions --> | |||
|     <router-link | |||
|       :to="{ name: 'start' }" | |||
|       class="block text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2" | |||
|     > | |||
|       Add Another Identity… | |||
|     </router-link> | |||
|     <a | |||
|       href="#" | |||
|       class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-8" | |||
|       @click="switchAccount('0')" | |||
|     > | |||
|       No Identity | |||
|     </a> | |||
| 
 | |||
|     <AlertMessage | |||
|       :alertTitle="alertTitle" | |||
|       :alertMessage="alertMessage" | |||
|     ></AlertMessage> | |||
|   </section> | |||
| </template> | |||
| <script lang="ts"> | |||
| import { Component, Vue } from "vue-facing-decorator"; | |||
| import { AppString } from "@/constants/app"; | |||
| import { db, accountsDB } from "@/db"; | |||
| import { AccountsSchema } from "@/db/tables/accounts"; | |||
| import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; | |||
| import AlertMessage from "@/components/AlertMessage"; | |||
| import QuickNav from "@/components/QuickNav"; | |||
| 
 | |||
| @Component({ components: { AlertMessage, QuickNav } }) | |||
| export default class IdentitySwitcherView extends Vue { | |||
|   Constants = AppString; | |||
|   public accounts: AccountsSchema; | |||
|   public activeDid; | |||
|   public firstName; | |||
|   public lastName; | |||
|   public alertTitle; | |||
|   public alertMessage; | |||
|   public otherIdentities = []; | |||
| 
 | |||
|   public async getIdentity(activeDid) { | |||
|     await accountsDB.open(); | |||
|     const account = await accountsDB.accounts | |||
|       .where("did") | |||
|       .equals(activeDid) | |||
|       .first(); | |||
|     const identity = JSON.parse(account?.identity || "null"); | |||
|     return identity; | |||
|   } | |||
| 
 | |||
|   async created() { | |||
|     try { | |||
|       await db.open(); | |||
|       const settings = await db.settings.get(MASTER_SETTINGS_KEY); | |||
|       this.activeDid = settings?.activeDid || ""; | |||
|       this.apiServer = settings?.apiServer || ""; | |||
|       this.apiServerInput = settings?.apiServer || ""; | |||
|       this.firstName = settings?.firstName || "No"; | |||
|       this.lastName = settings?.lastName || "Name"; | |||
|       this.showContactGives = !!settings?.showContactGivesInline; | |||
| 
 | |||
|       const identity = await this.getIdentity(this.activeDid); | |||
| 
 | |||
|       if (identity) { | |||
|         db.settings.update(MASTER_SETTINGS_KEY, { | |||
|           activeDid: identity.did, | |||
|         }); | |||
|       } | |||
|       await accountsDB.open(); | |||
|       const accounts = await accountsDB.accounts.toArray(); | |||
|       for (let n = 0; n < accounts.length; n++) { | |||
|         const did = JSON.parse(accounts[n].identity)["did"]; | |||
|         if (did && this.activeDid !== did) { | |||
|           this.otherIdentities.push({ did: did }); | |||
|         } | |||
|       } | |||
|     } catch (err) { | |||
|       if ( | |||
|         err.message === | |||
|         "Attempted to load account records with no identity available." | |||
|       ) { | |||
|         this.limitsMessage = "No identity."; | |||
|         this.loadingLimits = false; | |||
|       } else { | |||
|         this.alertMessage = | |||
|           "Clear your cache and start over (after data backup)."; | |||
|         console.error( | |||
|           "Telling user to clear cache at page create because:", | |||
|           err, | |||
|         ); | |||
|         this.alertTitle = "Error Creating Account"; | |||
|       } | |||
|     } | |||
|   } | |||
| 
 | |||
|   async switchAccount(did: string) { | |||
|     // 0 means none | |||
|     if (did === "0") { | |||
|       did = undefined; | |||
|     } | |||
|     await db.open(); | |||
|     db.settings.update(MASTER_SETTINGS_KEY, { | |||
|       activeDid: did, | |||
|     }); | |||
|     this.activeDid = did; | |||
|     this.otherIdentities = []; | |||
|     await accountsDB.open(); | |||
|     const accounts = await accountsDB.accounts.toArray(); | |||
|     for (let n = 0; n < accounts.length; n++) { | |||
|       const did = JSON.parse(accounts[n].identity)["did"]; | |||
|       if (did && this.activeDid !== did) { | |||
|         this.otherIdentities.push({ did: did }); | |||
|       } | |||
|     } | |||
|     this.$router.push({ name: "account" }); | |||
|   } | |||
| } | |||
| </script> | |||
					Loading…
					
					
				
		Reference in new issue