feat(android): a name is not a link on a phone, the menu carries it
Every track, album and artist name in the app navigates through `utils/explore-link.ts`, and every sentence of how it does that is a desktop compromise: the navigation is held for one double-click interval so double-clicking the row can still play it, and the target is a few characters of text inside a row. On touch that is a delay on an ambiguous target, and since #63 the row's own tap claims the click anyway -- so the link was unreachable as well as fiddly. So below the phone breakpoint a name renders as plain text and the row's context menu carries the destination instead: `go-to-menu.ts` draws "Go to Artist" / "Go to Album" under exactly the condition the link is not, using `explore-link`'s own exported routing so an untagged entity reaches the library page by the same lookup. Three things this leans on. Suppressing a link with no menu behind it is not a smaller affordance but a destination the phone cannot reach, so `keepOnPhone` is the exception for the three surfaces with no row menu. The items are drawn for a single selection only, which is the Play item's rule one step on. And there is no "Go to Genre", because no row renders a genre link to lose -- that would be new navigation rather than a replacement. Closes #67
This commit is contained in:
@@ -55,6 +55,8 @@ import {
|
||||
import type { ContextMenuHost, MenuTarget } from '@utils/context-menu-controller.js';
|
||||
import { FavoritesController } from '@store/controllers/favorites-controller';
|
||||
import { creditLink, exploreLinkStyles } from '../../utils/explore-link';
|
||||
import { goToMenuItems } from '../../utils/go-to-menu';
|
||||
import type { GoToTarget } from '../../utils/go-to-menu';
|
||||
import { creditStore } from '@store/credit-store';
|
||||
import {
|
||||
createAlbumArtDragImage,
|
||||
@@ -2084,6 +2086,30 @@ export class CoverGrid
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The artist an album card's menu can navigate to — the card's own
|
||||
* credit line, which stops being a link below the phone breakpoint
|
||||
* (#67).
|
||||
*
|
||||
* A *track* target gets nothing: the dropdown's rows carry no
|
||||
* links of their own, and the album they sit under is the card
|
||||
* that opened them.
|
||||
*/
|
||||
private get goToTarget(): GoToTarget | undefined {
|
||||
if (this.contextMenuTarget.kind !== 'album') return undefined;
|
||||
|
||||
const album = this.albums.find(
|
||||
(a) => a.ID === this.contextMenuAlbumId,
|
||||
);
|
||||
|
||||
if (!album) return undefined;
|
||||
|
||||
return {
|
||||
artistName: album.ArtistName,
|
||||
artistMBID: album.ArtistMBID,
|
||||
};
|
||||
}
|
||||
|
||||
private renderContextMenu() {
|
||||
const { ctxMenu } = this;
|
||||
|
||||
@@ -2199,6 +2225,11 @@ export class CoverGrid
|
||||
</wa-dropdown-item>
|
||||
`
|
||||
: nothing}
|
||||
${goToMenuItems(this.goToTarget, {
|
||||
onSelect: () => ctxMenu.close(),
|
||||
onHover: () =>
|
||||
ctxMenu.closePlaylistSubmenu(),
|
||||
})}
|
||||
</div>
|
||||
`
|
||||
: nothing}
|
||||
|
||||
Reference in New Issue
Block a user