d5575b58e3
Features: - Mission Control dashboard - HP Submissions tracking - AI Agents integration - Lead management CRM - Marketing email templates - Chrome extension support Tech: Next.js, TypeScript, Tailwind CSS, MySQL
160 lines
4.8 KiB
JavaScript
160 lines
4.8 KiB
JavaScript
// Service Worker - Hookd Extension
|
|
|
|
const STORAGE_KEY = 'hookd_items';
|
|
const SETTINGS_KEY = 'hookd_settings';
|
|
const LISTS_KEY = 'hookd_lists';
|
|
|
|
const defaultSettings = {
|
|
categories: ['AI', 'News', 'Ideas', 'Memes', 'Other'],
|
|
userHandle: 'HaithamEKhalifa',
|
|
relayEnabled: true
|
|
};
|
|
|
|
const defaultLists = [
|
|
{ id: 'dev', name: 'Dev Friends', emoji: '👨💻', contacts: [] },
|
|
{ id: 'memes', name: 'Meme Buddies', emoji: '😂', contacts: [] },
|
|
{ id: 'business', name: 'Business', emoji: '💼', contacts: [] },
|
|
{ id: 'family', name: 'Family', emoji: '👨👩👧', contacts: [] }
|
|
];
|
|
|
|
// Initialize
|
|
chrome.runtime.onInstalled.addListener(() => {
|
|
console.log('Hookd installed');
|
|
chrome.storage.local.set({
|
|
[STORAGE_KEY]: [],
|
|
[SETTINGS_KEY]: defaultSettings,
|
|
[LISTS_KEY]: defaultLists
|
|
});
|
|
});
|
|
|
|
// Handle messages
|
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
// Get items
|
|
if (message.type === 'GET_ITEMS') {
|
|
chrome.storage.local.get([STORAGE_KEY], (r) => sendResponse(r[STORAGE_KEY] || []));
|
|
return true;
|
|
}
|
|
|
|
// Get lists
|
|
if (message.type === 'GET_LISTS') {
|
|
chrome.storage.local.get([LISTS_KEY], (r) => sendResponse(r[LISTS_KEY] || defaultLists));
|
|
return true;
|
|
}
|
|
|
|
// Add contact to list
|
|
if (message.type === 'ADD_CONTACT') {
|
|
chrome.storage.local.get([LISTS_KEY], (r) => {
|
|
const lists = r[LISTS_KEY] || defaultLists;
|
|
const list = lists.find(l => l.id === message.listId);
|
|
if (list && !list.contacts.find(c => c.username === message.contact.username)) {
|
|
list.contacts.push(message.contact);
|
|
chrome.storage.local.set({ [LISTS_KEY]: lists });
|
|
}
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Remove contact from list
|
|
if (message.type === 'REMOVE_CONTACT') {
|
|
chrome.storage.local.get([LISTS_KEY], (r) => {
|
|
const lists = r[LISTS_KEY] || defaultLists;
|
|
const list = lists.find(l => l.id === message.listId);
|
|
if (list) {
|
|
list.contacts = list.contacts.filter(c => c.username !== message.username);
|
|
chrome.storage.local.set({ [LISTS_KEY]: lists });
|
|
}
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Create new list
|
|
if (message.type === 'CREATE_LIST') {
|
|
chrome.storage.local.get([LISTS_KEY], (r) => {
|
|
const lists = r[LISTS_KEY] || defaultLists;
|
|
lists.push({
|
|
id: Date.now().toString(),
|
|
name: message.name,
|
|
emoji: message.emoji || '📌',
|
|
contacts: []
|
|
});
|
|
chrome.storage.local.set({ [LISTS_KEY]: lists });
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Delete list
|
|
if (message.type === 'DELETE_LIST') {
|
|
chrome.storage.local.get([LISTS_KEY], (r) => {
|
|
let lists = r[LISTS_KEY] || defaultLists;
|
|
lists = lists.filter(l => l.id !== message.listId);
|
|
chrome.storage.local.set({ [LISTS_KEY]: lists });
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Share item to list
|
|
if (message.type === 'SHARE_TO_LIST') {
|
|
chrome.storage.local.get([STORAGE_KEY], (r) => {
|
|
const items = r[STORAGE_KEY] || [];
|
|
// Mark item as shared
|
|
const item = items.find(i => i.id === message.itemId);
|
|
if (item) {
|
|
item.sharedTo = item.sharedTo || [];
|
|
item.sharedTo.push(message.listId);
|
|
chrome.storage.local.set({ [STORAGE_KEY]: items });
|
|
}
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Save item
|
|
if (message.type === 'SAVE_ITEM') {
|
|
chrome.storage.local.get([STORAGE_KEY], (r) => {
|
|
const items = r[STORAGE_KEY] || [];
|
|
const newItem = {
|
|
id: Date.now(),
|
|
...message.data,
|
|
type: message.data.source || 'dm',
|
|
saved: false,
|
|
aiProcessed: false,
|
|
sharedTo: [],
|
|
time: new Date().toISOString()
|
|
};
|
|
items.unshift(newItem);
|
|
chrome.storage.local.set({ [STORAGE_KEY]: items });
|
|
sendResponse({ success: true, item: newItem });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Delete items
|
|
if (message.type === 'DELETE_ITEMS') {
|
|
chrome.storage.local.get([STORAGE_KEY], (r) => {
|
|
const items = r[STORAGE_KEY] || [];
|
|
const remaining = items.filter(i => !message.ids.includes(i.id));
|
|
chrome.storage.local.set({ [STORAGE_KEY]: remaining });
|
|
sendResponse({ success: true, deleted: message.ids.length });
|
|
});
|
|
return true;
|
|
}
|
|
|
|
// Update item
|
|
if (message.type === 'UPDATE_ITEM') {
|
|
chrome.storage.local.get([STORAGE_KEY], (r) => {
|
|
const items = r[STORAGE_KEY] || [];
|
|
const idx = items.findIndex(i => i.id === message.data.id);
|
|
if (idx !== -1) {
|
|
items[idx] = { ...items[idx], ...message.data };
|
|
chrome.storage.local.set({ [STORAGE_KEY]: items });
|
|
}
|
|
sendResponse({ success: true });
|
|
});
|
|
return true;
|
|
}
|
|
});
|