diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx index 6ffb90a..478a947 100644 --- a/src/components/Badge.tsx +++ b/src/components/Badge.tsx @@ -2,31 +2,39 @@ import { type JSX, useState } from 'react' import { twMerge } from 'tailwind-merge' import type { VariantProps } from 'tailwind-variants' import { badgeCVA, typeColors, typeIcons } from '@/components/design' +import type { CommentTableRow } from '@/entrypoints/background' -import { CodePreview } from './BadgePreviews/CodePreview' -import { ImagePreview } from './BadgePreviews/ImagePreview' -import { LinkPreview } from './BadgePreviews/LinkPreview' -import { TextPreview } from './BadgePreviews/TextPreview' -import { TimePreview } from './BadgePreviews/TimePreview' +import { CodePreview } from './BadgePopups/CodePreview' +import { ImagePreview } from './BadgePopups/ImagePreview' +import { LinkPreview } from './BadgePopups/LinkPreview' +import { OpenTabPopup } from './BadgePopups/OpenTabPopup' +import { TextPreview } from './BadgePopups/TextPreview' +import { TimePreview } from './BadgePopups/TimePreview' -const typeTooltips = { +const typePopups = { code: CodePreview, image: ImagePreview, link: LinkPreview, + open: OpenTabPopup, text: TextPreview, time: TimePreview, -} satisfies Partial JSX.Element>> +} satisfies Partial JSX.Element>> + +export interface BadgePopupProps { + row: CommentTableRow +} export type BadgeProps = VariantProps & { type: keyof typeof typeIcons text?: number | string + data?: CommentTableRow } -const Badge = ({ text, type }: BadgeProps) => { +const Badge = ({ text, type, data }: BadgeProps) => { const Icon = typeIcons[type] const [showTooltip, setShowTooltip] = useState(false) - const TooltipComponent = - showTooltip && type in typeTooltips && typeTooltips[type as keyof typeof typeTooltips] + const PopupComponent = + showTooltip && type in typePopups && typePopups[type as keyof typeof typePopups] return ( diff --git a/src/components/BadgePreviews/CodePreview.tsx b/src/components/BadgePopups/CodePreview.tsx similarity index 62% rename from src/components/BadgePreviews/CodePreview.tsx rename to src/components/BadgePopups/CodePreview.tsx index 5a929a4..6ed9b36 100644 --- a/src/components/BadgePreviews/CodePreview.tsx +++ b/src/components/BadgePopups/CodePreview.tsx @@ -1,4 +1,6 @@ -export function CodePreview() { +import type { BadgePopupProps } from '@/components/Badge' + +export function CodePreview({ row: _row }: BadgePopupProps) { return ( <> TODO{' '} diff --git a/src/components/BadgePreviews/ImagePreview.tsx b/src/components/BadgePopups/ImagePreview.tsx similarity index 61% rename from src/components/BadgePreviews/ImagePreview.tsx rename to src/components/BadgePopups/ImagePreview.tsx index b4d7ccd..1f95e67 100644 --- a/src/components/BadgePreviews/ImagePreview.tsx +++ b/src/components/BadgePopups/ImagePreview.tsx @@ -1,4 +1,6 @@ -export function ImagePreview() { +import type { BadgePopupProps } from '@/components/Badge' + +export function ImagePreview({ row: _row }: BadgePopupProps) { return ( <> TODO{' '} diff --git a/src/components/BadgePreviews/LinkPreview.tsx b/src/components/BadgePopups/LinkPreview.tsx similarity index 65% rename from src/components/BadgePreviews/LinkPreview.tsx rename to src/components/BadgePopups/LinkPreview.tsx index 768e97b..cce1184 100644 --- a/src/components/BadgePreviews/LinkPreview.tsx +++ b/src/components/BadgePopups/LinkPreview.tsx @@ -1,4 +1,6 @@ -export function LinkPreview() { +import type { BadgePopupProps } from '@/components/Badge' + +export function LinkPreview({ row: _row }: BadgePopupProps) { return ( <> TODO{' '} diff --git a/src/components/BadgePopups/OpenTabPopup.tsx b/src/components/BadgePopups/OpenTabPopup.tsx new file mode 100644 index 0000000..2d3d240 --- /dev/null +++ b/src/components/BadgePopups/OpenTabPopup.tsx @@ -0,0 +1,19 @@ +import type { BadgePopupProps } from '@/components/Badge' +import { openOrFocusComment } from '@/entrypoints/popup/popup' + +export function OpenTabPopup({ row }: BadgePopupProps) { + const handleClick = () => { + openOrFocusComment(row.spot.unique_key) + } + + return ( + + ) +} diff --git a/src/components/BadgePreviews/TextPreview.tsx b/src/components/BadgePopups/TextPreview.tsx similarity index 64% rename from src/components/BadgePreviews/TextPreview.tsx rename to src/components/BadgePopups/TextPreview.tsx index 266c4ef..e6878c4 100644 --- a/src/components/BadgePreviews/TextPreview.tsx +++ b/src/components/BadgePopups/TextPreview.tsx @@ -1,4 +1,6 @@ -export function TextPreview() { +import type { BadgePopupProps } from '@/components/Badge' + +export function TextPreview({ row: _row }: BadgePopupProps) { return ( <> TODO{' '} diff --git a/src/components/BadgePreviews/TimePreview.tsx b/src/components/BadgePopups/TimePreview.tsx similarity index 62% rename from src/components/BadgePreviews/TimePreview.tsx rename to src/components/BadgePopups/TimePreview.tsx index 1d13c70..b9813a1 100644 --- a/src/components/BadgePreviews/TimePreview.tsx +++ b/src/components/BadgePopups/TimePreview.tsx @@ -1,4 +1,6 @@ -export function TimePreview() { +import type { BadgePopupProps } from '@/components/Badge' + +export function TimePreview({ row: _row }: BadgePopupProps) { return ( <> TODO{' '} diff --git a/src/components/CommentRow.tsx b/src/components/CommentRow.tsx index d35fb1f..5ffd695 100644 --- a/src/components/CommentRow.tsx +++ b/src/components/CommentRow.tsx @@ -1,6 +1,7 @@ import Badge from '@/components/Badge' import { timeAgo } from '@/components/misc' import type { CommentTableRow } from '@/entrypoints/background' +import { openOrFocusComment } from '@/entrypoints/popup/popup' import { EnhancerRegistry } from '@/lib/registries' const enhancers = new EnhancerRegistry() @@ -15,6 +16,10 @@ type CommentRowProps = { export function CommentRow({ row, selectedIds, toggleSelection }: CommentRowProps) { const enhancer = enhancers.enhancerFor(row.spot) + + const handleTitleClick = () => { + openOrFocusComment(row.spot.unique_key) + } return ( @@ -34,25 +39,29 @@ export function CommentRow({ row, selectedIds, toggleSelection }: CommentRowProp
{row.latestDraft.stats.links.length > 0 && ( - + )} {row.latestDraft.stats.images.length > 0 && ( - + )} {row.latestDraft.stats.codeBlocks.length > 0 && ( - + )} - - - {row.isOpenTab && } + + + {row.isOpenTab && }
{/* Title */}
- + {row.isTrashed && }
diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts index e9e4812..54d451c 100644 --- a/src/entrypoints/background.ts +++ b/src/entrypoints/background.ts @@ -6,7 +6,7 @@ import { CLOSE_MESSAGE_PORT, isContentToBackgroundMessage, isGetOpenSpotsMessage, - isSwitchToTabMessage, + isOpenOrFocusMessage, KEEP_PORT_OPEN, } from '@/lib/messages' @@ -106,16 +106,21 @@ export function handlePopupMessage( const response: GetTableRowsResponse = { rows } sendResponse(response) return KEEP_PORT_OPEN - } else if (isSwitchToTabMessage(message)) { + } else if (isOpenOrFocusMessage(message)) { logger.debug('received switch tab message', message) - browser.windows - .update(message.windowId, { focused: true }) - .then(() => { - return browser.tabs.update(message.tabId, { active: true }) - }) - .catch((error) => { - console.error('Error switching to tab:', error) - }) + const storage = openSpots.get(message.uniqueKey) + if (storage) { + browser.windows + .update(storage.tab.windowId, { focused: true }) + .then(() => { + return browser.tabs.update(storage.tab.tabId, { active: true }) + }) + .catch((error) => { + console.error('Error switching to tab:', error) + }) + } else { + console.error('TODO: implement opening a previous comment', message.uniqueKey) + } return CLOSE_MESSAGE_PORT } else { logger.error('received unknown message', message) diff --git a/src/entrypoints/popup/popup.tsx b/src/entrypoints/popup/popup.tsx index 7788059..96d6e23 100644 --- a/src/entrypoints/popup/popup.tsx +++ b/src/entrypoints/popup/popup.tsx @@ -3,7 +3,7 @@ import { createRoot } from 'react-dom/client' import { PopupRoot } from '@/components/PopupRoot' import type { CommentTableRow } from '@/entrypoints/background' import { logger } from '@/lib/logger' -import type { GetOpenSpotsMessage, GetTableRowsResponse } from '@/lib/messages' +import type { GetOpenSpotsMessage, GetTableRowsResponse, OpenOrFocusMessage } from '@/lib/messages' export interface FilterState { sentFilter: 'both' | 'sent' | 'unsent' @@ -24,20 +24,14 @@ async function getOpenSpots(): Promise { } } -// function switchToTab(tabId: number, windowId: number): void { -// const message: SwitchToTabMessage = { -// tabId, -// type: 'SWITCH_TO_TAB', -// windowId, -// } -// browser.runtime.sendMessage(message) -// window.close() -// } - -// const handleSpotClick = (spot: CommentTableRow) => { -// console.log('TODO: switchToTab') -// //switchToTab(spot.tab.tabId, spot.tab.windowId) -// } +export function openOrFocusComment(uniqueKey: string): void { + const message: OpenOrFocusMessage = { + type: 'OPEN_OR_FOCUS_COMMENT', + uniqueKey, + } + browser.runtime.sendMessage(message) + window.close() +} const app = document.getElementById('app') if (app) { diff --git a/src/lib/messages.ts b/src/lib/messages.ts index da7fa54..f61a833 100644 --- a/src/lib/messages.ts +++ b/src/lib/messages.ts @@ -13,13 +13,12 @@ export interface GetOpenSpotsMessage { type: 'GET_OPEN_SPOTS' } -export interface SwitchToTabMessage { - type: 'SWITCH_TO_TAB' - tabId: number - windowId: number +export interface OpenOrFocusMessage { + type: 'OPEN_OR_FOCUS_COMMENT' + uniqueKey: string } -export type PopupToBackgroundMessage = GetOpenSpotsMessage | SwitchToTabMessage +export type PopupToBackgroundMessage = GetOpenSpotsMessage | OpenOrFocusMessage // All messages sent to background export type ToBackgroundMessage = ContentToBackgroundMessage | PopupToBackgroundMessage @@ -63,12 +62,9 @@ export function isGetOpenSpotsMessage(message: any): message is GetOpenSpotsMess return message && message.type === 'GET_OPEN_SPOTS' } -export function isSwitchToTabMessage(message: any): message is SwitchToTabMessage { +export function isOpenOrFocusMessage(message: any): message is OpenOrFocusMessage { return ( - message && - message.type === 'SWITCH_TO_TAB' && - typeof message.tabId === 'number' && - typeof message.windowId === 'number' + message && message.type === 'OPEN_OR_FOCUS_COMMENT' && typeof message.uniqueKey === 'string' ) }