POWR/types/feed.ts

83 lines
2.0 KiB
TypeScript
Raw Normal View History

// types/feed.ts
import { NDKEvent } from '@nostr-dev-kit/ndk-mobile';
import {
ParsedWorkoutRecord,
ParsedExerciseTemplate,
ParsedWorkoutTemplate,
ParsedSocialPost,
ParsedLongformContent
} from '@/types/nostr-workout';
// Base feed entry interface
export interface FeedEntry {
id: string;
eventId: string;
event?: NDKEvent;
timestamp: number;
seen?: boolean;
updated?: number;
}
// Workout-specific feed entry
export interface WorkoutFeedEntry extends FeedEntry {
type: 'workout';
content?: ParsedWorkoutRecord;
}
// Exercise template feed entry
export interface ExerciseFeedEntry extends FeedEntry {
type: 'exercise';
content?: ParsedExerciseTemplate;
}
// Workout template feed entry
export interface TemplateFeedEntry extends FeedEntry {
type: 'template';
content?: ParsedWorkoutTemplate;
}
// Social post feed entry
export interface SocialFeedEntry extends FeedEntry {
type: 'social';
content?: ParsedSocialPost;
}
// Article feed entry
export interface ArticleFeedEntry extends FeedEntry {
type: 'article';
content?: ParsedLongformContent;
}
// Union type for all feed entries
export type AnyFeedEntry =
| WorkoutFeedEntry
| ExerciseFeedEntry
| TemplateFeedEntry
| SocialFeedEntry
| ArticleFeedEntry;
// Function signature for updating entries
export type UpdateEntryFn = (id: string, updater: (entry: AnyFeedEntry) => AnyFeedEntry) => void;
// Feed filter options
export interface FeedFilterOptions {
feedType: 'following' | 'powr' | 'global' | 'user-activity' | 'workout-history';
since?: number;
until?: number;
limit?: number;
authors?: string[];
kinds?: number[];
}
// Feed entry filter function
export type FeedEntryFilterFn = (entry: AnyFeedEntry) => boolean;
// Feed options
export interface FeedOptions {
subId?: string;
enabled?: boolean;
filterFn?: FeedEntryFilterFn;
sortFn?: (a: AnyFeedEntry, b: AnyFeedEntry) => number;
feedType?: 'following' | 'powr' | 'global' | 'user-activity' | 'workout-history';
}