feat(gif): favourites and category shortcuts
OpenSSF Scorecard / Scorecard analysis (push) Waiting to run
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s

Favourites are stored server-side per user, so one made on the phone is there
on the desktop — the point of favouriting. The whole result is stored rather
than an id: the provider offers no lookup by id, so an id-only favourite could
not be rendered without re-finding it through search.

Category chips translate their label but not their query, which goes to a
provider that indexes in English.

The star sits beside the tile button rather than inside it: a button within a
button is invalid and swallows the click. Toggling is optimistic and reverts
on failure, and favourites skip both the loading skeleton and the infinite
scroll, which belong to provider-backed browsing only.

Server caps favourites per user and rejects non-http(s) URLs, which become
<img src> in everyone's picker.
This commit is contained in:
2026-08-31 13:12:50 -03:00
parent 0fc6abeb6e
commit fb662bfe12
9 changed files with 4290 additions and 24 deletions
+16
View File
@@ -33,6 +33,22 @@ export const en = {
'settings.voice.micTest.idle': 'Test your mic without joining a call.',
'settings.voice.micTest.failed': 'Could not open the microphone. Check the device and its permission.',
// GIF picker
'gif.search': 'Search GIFs',
'gif.tab.favorites': 'Favorites',
'gif.tab.trending': 'Trending',
'gif.empty.search': 'No GIFs found',
'gif.empty.trending': 'No trending GIFs',
'gif.empty.favorites': 'No favorites yet — tap the star on any GIF.',
'gif.favorite.add': 'Add to favorites',
'gif.favorite.remove': 'Remove from favorites',
'gif.category.hello': 'hello',
'gif.category.lol': 'lol',
'gif.category.love': 'love',
'gif.category.birthday': 'happy birthday',
'gif.category.dance': 'dance',
'gif.category.facepalm': 'facepalm',
// Settings — privacy
'privacy.title': 'Privacy',
'privacy.discoverable.label': 'Allow others to find my profile',