From 3f6bd5267f3dc803d241edeeb7ea192a6b19986d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sat, 29 Aug 2026 12:01:48 -0600 Subject: [PATCH] WIP Add activity timeline route/sidebar showing incoming zaps --- app/components/activity-timeline.gjs | 85 ++++++ app/components/activity-zap-item.gjs | 96 ++++++ app/components/app-menu/home.gjs | 8 +- app/components/app-menu/index.gjs | 6 + app/controllers/activity.js | 59 ++++ app/router.js | 1 + app/routes/activity.js | 23 ++ app/services/activity.js | 183 ++++++++++++ app/services/nostr-data.js | 53 ++++ app/styles/app.css | 139 +++++++++ app/templates/activity.gjs | 16 + app/templates/application.gjs | 3 + app/utils/activity.js | 129 +++++++++ app/utils/contributions.js | 2 +- app/utils/icons.js | 2 + tests/acceptance/activity-test.js | 141 +++++++++ .../components/activity-timeline-test.gjs | 176 +++++++++++ .../components/activity-zap-item-test.gjs | 148 ++++++++++ tests/unit/services/activity-test.js | 273 ++++++++++++++++++ tests/unit/utils/activity-test.js | 211 ++++++++++++++ 20 files changed, 1752 insertions(+), 2 deletions(-) create mode 100644 app/components/activity-timeline.gjs create mode 100644 app/components/activity-zap-item.gjs create mode 100644 app/controllers/activity.js create mode 100644 app/routes/activity.js create mode 100644 app/services/activity.js create mode 100644 app/templates/activity.gjs create mode 100644 app/utils/activity.js create mode 100644 tests/acceptance/activity-test.js create mode 100644 tests/integration/components/activity-timeline-test.gjs create mode 100644 tests/integration/components/activity-zap-item-test.gjs create mode 100644 tests/unit/services/activity-test.js create mode 100644 tests/unit/utils/activity-test.js diff --git a/app/components/activity-timeline.gjs b/app/components/activity-timeline.gjs new file mode 100644 index 0000000..2cc6985 --- /dev/null +++ b/app/components/activity-timeline.gjs @@ -0,0 +1,85 @@ +import Component from '@glimmer/component'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; +import { on } from '@ember/modifier'; +import Icon from './icon'; +import ActivityZapItem from './activity-zap-item'; +import Modal from './modal'; +import NostrConnect from './nostr-connect'; +import not from 'ember-truth-helpers/helpers/not'; +import eq from 'ember-truth-helpers/helpers/eq'; +import restoreScroll from '../modifiers/restore-scroll'; + +export default class ActivityTimelineComponent extends Component { + @tracked isNostrConnectModalOpen = false; + + @action + openNostrConnectModal(event) { + event.preventDefault(); + this.isNostrConnectModalOpen = true; + } + + @action + closeNostrConnectModal() { + this.isNostrConnectModalOpen = false; + } + + @action + onNostrConnected() { + this.closeNostrConnectModal(); + this.args.onNostrConnected?.(); + } + + +} diff --git a/app/components/activity-zap-item.gjs b/app/components/activity-zap-item.gjs new file mode 100644 index 0000000..fc66987 --- /dev/null +++ b/app/components/activity-zap-item.gjs @@ -0,0 +1,96 @@ +import Component from '@glimmer/component'; +import { on } from '@ember/modifier'; +import { fn } from '@ember/helper'; +import formatRelativeDate from '../helpers/format-relative-date'; +import { npubEncode } from 'applesauce-core/helpers/pointers'; +import Icon from './icon'; + +export default class ActivityZapItem extends Component { + get item() { + return this.args.item; + } + + get senderName() { + return this.item?.senderName; + } + + get senderDisplayName() { + const name = this.senderName; + if (name) return name; + const pubkey = this.item?.senderPubkey; + if (!pubkey) return 'Someone'; + try { + return `${npubEncode(pubkey).slice(0, 12)}…`; + } catch { + return `${pubkey.slice(0, 12)}…`; + } + } + + get senderAvatar() { + return this.item?.senderAvatar; + } + + get hasPhoto() { + return !!this.item?.photo; + } + + get photoThumbUrl() { + return this.item?.photo?.thumbUrl || this.item?.photo?.url; + } + + get placeIdentifier() { + return this.item?.placeIdentifier; + } + + +} diff --git a/app/components/app-menu/home.gjs b/app/components/app-menu/home.gjs index 510d505..c0e6528 100644 --- a/app/components/app-menu/home.gjs +++ b/app/components/app-menu/home.gjs @@ -26,8 +26,14 @@ import iconRounded from '../../icons/icon-rounded.svg?raw';
  • - +
  • +
  • +
  • diff --git a/app/components/app-menu/index.gjs b/app/components/app-menu/index.gjs index bba5133..6e4d1de 100644 --- a/app/components/app-menu/index.gjs +++ b/app/components/app-menu/index.gjs @@ -28,6 +28,11 @@ export default class AppMenu extends Component { this.router.transitionTo('contributions'); } + @action + goToActivity() { + this.router.transitionTo('activity'); + } +