- Comprehensive logging system with chrome.storage.session persistence - NIP-07 action logging in background scripts with standalone functions - Vault operation logging (unlock, lock, create, reset, import, export) - Profile and bookmark operation logging - Logs page with refresh functionality and category icons - Lock button (🔒) in navigation bar to quickly lock vault - Reduced nav bar size (40px height, 16px font) with emoji icons - Reordered navigation: You, Permissions, Bookmarks, Logs, About, Lock - Bookmarks functionality for saving frequently used Nostr apps - Fixed lock/unlock flow by properly clearing in-memory session data 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import { Component, inject, OnInit } from '@angular/core';
|
|
import { Bookmark, LoggerService, SignerMetaData } from '@common';
|
|
import { FirefoxMetaHandler } from '../../../common/data/firefox-meta-handler';
|
|
import browser from 'webextension-polyfill';
|
|
|
|
@Component({
|
|
selector: 'app-bookmarks',
|
|
templateUrl: './bookmarks.component.html',
|
|
styleUrl: './bookmarks.component.scss',
|
|
imports: [],
|
|
})
|
|
export class BookmarksComponent implements OnInit {
|
|
readonly #logger = inject(LoggerService);
|
|
readonly #metaHandler = new FirefoxMetaHandler();
|
|
|
|
bookmarks: Bookmark[] = [];
|
|
isLoading = true;
|
|
|
|
async ngOnInit() {
|
|
await this.loadBookmarks();
|
|
}
|
|
|
|
async loadBookmarks() {
|
|
this.isLoading = true;
|
|
try {
|
|
const metaData = await this.#metaHandler.loadFullData() as SignerMetaData;
|
|
this.#metaHandler.setFullData(metaData);
|
|
this.bookmarks = this.#metaHandler.getBookmarks();
|
|
} catch (error) {
|
|
console.error('Failed to load bookmarks:', error);
|
|
} finally {
|
|
this.isLoading = false;
|
|
}
|
|
}
|
|
|
|
async onBookmarkThisPage() {
|
|
try {
|
|
// Get the current tab URL and title
|
|
const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
|
|
if (!tab?.url || !tab?.title) {
|
|
console.error('Could not get current tab info');
|
|
return;
|
|
}
|
|
|
|
// Check if already bookmarked
|
|
if (this.bookmarks.some(b => b.url === tab.url)) {
|
|
console.log('Page already bookmarked');
|
|
return;
|
|
}
|
|
|
|
const newBookmark: Bookmark = {
|
|
id: crypto.randomUUID(),
|
|
url: tab.url,
|
|
title: tab.title,
|
|
createdAt: Date.now(),
|
|
};
|
|
|
|
this.bookmarks = [newBookmark, ...this.bookmarks];
|
|
await this.saveBookmarks();
|
|
this.#logger.logBookmarkAdded(newBookmark.url, newBookmark.title);
|
|
} catch (error) {
|
|
console.error('Failed to bookmark page:', error);
|
|
}
|
|
}
|
|
|
|
async onRemoveBookmark(bookmark: Bookmark) {
|
|
this.bookmarks = this.bookmarks.filter(b => b.id !== bookmark.id);
|
|
await this.saveBookmarks();
|
|
this.#logger.logBookmarkRemoved(bookmark.url, bookmark.title);
|
|
}
|
|
|
|
async saveBookmarks() {
|
|
try {
|
|
await this.#metaHandler.setBookmarks(this.bookmarks);
|
|
} catch (error) {
|
|
console.error('Failed to save bookmarks:', error);
|
|
}
|
|
}
|
|
|
|
openBookmark(bookmark: Bookmark) {
|
|
browser.tabs.create({ url: bookmark.url });
|
|
}
|
|
|
|
getDomain(url: string): string {
|
|
try {
|
|
return new URL(url).hostname;
|
|
} catch {
|
|
return url;
|
|
}
|
|
}
|
|
}
|