You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
8.2 KiB
311 lines
8.2 KiB
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
/**
|
|
* TimeSafari Platform Service Mixin
|
|
*
|
|
* TypeScript mixin for TimeSafari Daily Notification Plugin integration.
|
|
* Provides type-safe service integration for Vue components and other frameworks.
|
|
*
|
|
* @author Matthew Raymer
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
import { DailyNotificationService, DailyNotificationServiceConfig } from '../services/DailyNotificationService';
|
|
|
|
/**
|
|
* TimeSafari Daily Notification Mixin Interface
|
|
*/
|
|
export interface TimeSafariDailyNotificationMixin {
|
|
// Service instance
|
|
dailyNotificationService: DailyNotificationService;
|
|
|
|
// Service methods
|
|
initializeDailyNotifications(config: DailyNotificationServiceConfig): Promise<void>;
|
|
scheduleDailyNotification(options: {
|
|
title: string;
|
|
body: string;
|
|
time: string;
|
|
channel?: string;
|
|
actions?: Array<{ id: string; title: string }>;
|
|
}): Promise<void>;
|
|
fetchCommunityData(): Promise<unknown>;
|
|
getServiceStatus(): unknown;
|
|
shutdownDailyNotifications(): Promise<void>;
|
|
}
|
|
|
|
/**
|
|
* TimeSafari Daily Notification Mixin Implementation
|
|
*/
|
|
export class TimeSafariDailyNotificationMixin implements TimeSafariDailyNotificationMixin {
|
|
// Service instance
|
|
public dailyNotificationService: DailyNotificationService = DailyNotificationService.getInstance();
|
|
|
|
// Reactive state
|
|
private _serviceInitialized = false;
|
|
private _serviceError: string | null = null;
|
|
private _serviceStatus: unknown = null;
|
|
|
|
/**
|
|
* Initialize daily notification service
|
|
*/
|
|
async initializeDailyNotifications(config: DailyNotificationServiceConfig): Promise<void> {
|
|
try {
|
|
await this.dailyNotificationService.initialize(config);
|
|
this._serviceInitialized = true;
|
|
this._serviceError = null;
|
|
this._serviceStatus = this.dailyNotificationService.getStatus();
|
|
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
this._serviceInitialized = false;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Schedule a daily notification
|
|
*/
|
|
async scheduleDailyNotification(options: {
|
|
title: string;
|
|
body: string;
|
|
time: string;
|
|
channel?: string;
|
|
actions?: Array<{ id: string; title: string }>;
|
|
}): Promise<void> {
|
|
if (!this._serviceInitialized) {
|
|
throw new Error('Daily notification service not initialized');
|
|
}
|
|
|
|
try {
|
|
await this.dailyNotificationService.scheduleDailyNotification(options);
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Fetch community data
|
|
*/
|
|
async fetchCommunityData(): Promise<unknown> {
|
|
if (!this._serviceInitialized) {
|
|
throw new Error('Daily notification service not initialized');
|
|
}
|
|
|
|
try {
|
|
const data = await this.dailyNotificationService.fetchCommunityData();
|
|
return data;
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get service status
|
|
*/
|
|
getServiceStatus(): unknown {
|
|
if (!this._serviceInitialized) {
|
|
return null;
|
|
}
|
|
|
|
this._serviceStatus = this.dailyNotificationService.getStatus();
|
|
return this._serviceStatus;
|
|
}
|
|
|
|
/**
|
|
* Shutdown daily notification service
|
|
*/
|
|
async shutdownDailyNotifications(): Promise<void> {
|
|
if (!this._serviceInitialized) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await this.dailyNotificationService.shutdown();
|
|
this._serviceInitialized = false;
|
|
this._serviceError = null;
|
|
this._serviceStatus = null;
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get service ready status
|
|
*/
|
|
isServiceReady(): boolean {
|
|
return this._serviceInitialized;
|
|
}
|
|
|
|
/**
|
|
* Get service status
|
|
*/
|
|
getServiceStatusData(): unknown {
|
|
return this._serviceStatus;
|
|
}
|
|
|
|
/**
|
|
* Get service error
|
|
*/
|
|
getServiceError(): string | null {
|
|
return this._serviceError;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Type-safe decorator for components
|
|
*/
|
|
export function WithTimeSafariDailyNotifications<T extends Constructor>(Base: T): T {
|
|
return class extends Base {
|
|
public dailyNotificationService: DailyNotificationService = DailyNotificationService.getInstance();
|
|
private _serviceInitialized = false;
|
|
private _serviceError: string | null = null;
|
|
private _serviceStatus: unknown = null;
|
|
|
|
async initializeDailyNotifications(config: DailyNotificationServiceConfig): Promise<void> {
|
|
try {
|
|
await this.dailyNotificationService.initialize(config);
|
|
this._serviceInitialized = true;
|
|
this._serviceError = null;
|
|
this._serviceStatus = this.dailyNotificationService.getStatus();
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
this._serviceInitialized = false;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async scheduleDailyNotification(options: {
|
|
title: string;
|
|
body: string;
|
|
time: string;
|
|
channel?: string;
|
|
actions?: Array<{ id: string; title: string }>;
|
|
}): Promise<void> {
|
|
if (!this._serviceInitialized) {
|
|
throw new Error('Daily notification service not initialized');
|
|
}
|
|
|
|
try {
|
|
await this.dailyNotificationService.scheduleDailyNotification(options);
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async fetchCommunityData(): Promise<unknown> {
|
|
if (!this._serviceInitialized) {
|
|
throw new Error('Daily notification service not initialized');
|
|
}
|
|
|
|
try {
|
|
const data = await this.dailyNotificationService.fetchCommunityData();
|
|
return data;
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
getServiceStatus(): unknown {
|
|
if (!this._serviceInitialized) {
|
|
return null;
|
|
}
|
|
|
|
this._serviceStatus = this.dailyNotificationService.getStatus();
|
|
return this._serviceStatus;
|
|
}
|
|
|
|
async shutdownDailyNotifications(): Promise<void> {
|
|
if (!this._serviceInitialized) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await this.dailyNotificationService.shutdown();
|
|
this._serviceInitialized = false;
|
|
this._serviceError = null;
|
|
this._serviceStatus = null;
|
|
} catch (error) {
|
|
this._serviceError = (error as Error).message;
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
isServiceReady(): boolean {
|
|
return this._serviceInitialized;
|
|
}
|
|
|
|
getServiceStatusData(): unknown {
|
|
return this._serviceStatus;
|
|
}
|
|
|
|
getServiceError(): string | null {
|
|
return this._serviceError;
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Constructor type for components
|
|
* Note: any[] is required for TypeScript mixin pattern compatibility
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
type Constructor<T = Record<string, unknown>> = new (...args: any[]) => T;
|
|
|
|
/**
|
|
* Example component using the mixin
|
|
*/
|
|
export class TimeSafariDailyNotificationExample extends TimeSafariDailyNotificationMixin {
|
|
private activeDid = 'did:example:timesafari-user-123';
|
|
|
|
async initialize(): Promise<void> {
|
|
try {
|
|
// Initialize the service
|
|
await this.initializeDailyNotifications({
|
|
activeDid: this.activeDid,
|
|
platform: 'android',
|
|
logging: {
|
|
level: 'info',
|
|
enableStructuredLogging: true,
|
|
enableEventIds: true,
|
|
enablePerformanceMetrics: true
|
|
}
|
|
});
|
|
|
|
// Schedule a daily notification
|
|
await this.scheduleDailyNotification({
|
|
title: 'TimeSafari Community Update',
|
|
body: 'New offers and project updates available',
|
|
time: '09:00',
|
|
channel: 'timesafari_community_updates'
|
|
});
|
|
|
|
} catch (error) {
|
|
throw new Error(`Failed to initialize daily notifications: ${error}`);
|
|
}
|
|
}
|
|
|
|
async handleFetchCommunityData(): Promise<void> {
|
|
try {
|
|
await this.fetchCommunityData();
|
|
// Community data fetched successfully
|
|
} catch (error) {
|
|
throw new Error(`Failed to fetch community data: ${error}`);
|
|
}
|
|
}
|
|
|
|
get serviceReady(): boolean {
|
|
return this.isServiceReady();
|
|
}
|
|
|
|
get serviceStatus(): unknown {
|
|
return this.getServiceStatusData();
|
|
}
|
|
|
|
get serviceError(): string | null {
|
|
return this.getServiceError();
|
|
}
|
|
}
|