@lspriv/wc-plugin-ics
Version:
小程序日历组件订阅插件
107 lines (106 loc) • 4.38 kB
TypeScript
import { type Plugin, type TrackDateResult, type TrackYearResult, type CalendarDay, type CalendarMark, type WcYear, type WcMark, type WcScheduleMark, type WcAnnualMark, type PluginService, type WcScheduleInfo, type Nullable } from '@lspriv/wx-calendar/lib';
type PropsReturn<R, P extends any[] = []> = (properties: JCalPropDict, ...args: P) => R | undefined;
type ICSComponentType = 'event' | 'alarm' | 'todo' | 'journal';
type ICSCompTypeOpt<K extends string | void, T> = {
[P in ICSComponentType as K extends string ? `${P}${K}` : P]?: T;
};
type ICSCompTypeOpts = ICSCompTypeOpt<void, PropsReturn<ICSMark, [key: string]>> & ICSCompTypeOpt<'MarkAs', CalendarMark['type'] | Array<CalendarMark['type']>> & ICSCompTypeOpt<'FestivalName', PropsReturn<string>> & ICSCompTypeOpt<'FestivalColor', string | PropsReturn<string>> & ICSCompTypeOpt<'CornerText', PropsReturn<string>> & ICSCompTypeOpt<'CornerColor', string | PropsReturn<string>> & ICSCompTypeOpt<'ScheduleText', PropsReturn<string>> & ICSCompTypeOpt<'ScheduleColor', string | PropsReturn<string>> & ICSCompTypeOpt<'ScheduleBgColor', string | PropsReturn<string>>;
export type ICSOpts = ICSCompTypeOpts & {
subcribes?: Array<ICSSubcribe>;
parseDate?: PropsReturn<CalendarDay>;
collectAnuualMark?: PropsReturn<WcAnnualMark, [sets: ICSAnnualMarkMap]>;
afterMarked?: (options: ICSSubcribeOpts, instance: ICSPlugin) => void;
};
type ICSCommonOpts = Omit<ICSOpts, 'subcribes'>;
export interface ICSOptsGeneration {
(instance: ICSPlugin): ICSOpts;
}
type ICSSubcribeOpts = ICSCommonOpts & {
calname?: string;
icskey?: string;
};
export interface ICSSubcribeGeneration {
(instance: ICSPlugin): ICSSubcribe;
}
export interface ICSSubcribeOptsGeneration {
(instance: ICSPlugin): ICSSubcribeOpts;
}
export type ICSSubcribe = ICSSubcribeOpts & {
kind?: 'link' | 'file' | 'content';
source: string;
};
interface JCalPropDict {
[x: string | symbol]: any;
compname: string;
icskey?: string;
date?: CalendarDay;
}
export interface CurrentSeries {
date?: number;
name?: string;
}
type ICSScheduleMark = WcScheduleMark & {
dtstart: string;
dtend: string;
summary?: string;
description?: string;
};
export type ICSMark = {
[P in keyof TrackDateResult]?: P extends 'schedule' ? ICSScheduleMark : WcMark;
};
type ICSMarkSets = {
[P in keyof ICSMark]-?: Array<Required<ICSMark>[P]>;
};
type ICSAnnualMark = WcAnnualMark & {
key: string;
};
type ICSAnnualMarkMap = Map<string, Array<ICSAnnualMark>>;
type PossibleFuncParams<T> = T extends (...args: any[]) => any ? Parameters<T> : never;
type PossibleFuncReturn<T> = T extends (...args: any[]) => any ? ReturnType<T> : T;
export declare const execPossibleFunc: <T>(possibleFunc: T, ...args: PossibleFuncParams<T>) => PossibleFuncReturn<T>;
export declare class ICSPlugin implements Plugin {
static KEY: "wc-plugin-ics";
private options;
private subcribes?;
marks: Map<string, ICSMarkSets>;
annualMarks: ICSAnnualMarkMap;
service?: PluginService;
constructor(options?: ICSOpts | ICSOptsGeneration);
PLUGIN_INITIALIZE(service: PluginService): Promise<void>;
private formOptions;
/**
* 加载订阅
* @param subcribes 订阅集合
*/
private loadSubcribes;
/**
* 加载 ICS
* @param source 来源
* @param type 类型 link来自连接 file本地文件 content订阅内容
*/
private loadICS;
load(subscribe: ICSSubcribe | ICSSubcribeGeneration): Promise<string>;
load(source: string, type?: ICSSubcribe['kind'], options?: ICSSubcribeOpts | ICSSubcribeOptsGeneration): Promise<string>;
/**
* 读取本地文件内容
* @param path 要读取的文件的路径 (本地路径)
*/
private parseFile;
private parseJCal;
private generateMarks;
private assignComponentHandle;
private createIcsMark;
private collectMark;
private collectAnnualMark;
/**
* 移除订阅
* @param icskey key
*/
remove(icskey: string): Promise<void>;
PLUGIN_TRACK_DATE(date: CalendarDay): Nullable<TrackDateResult>;
PLUGIN_TRACK_YEAR(year: WcYear): Nullable<TrackYearResult>;
PLUGIN_TRACK_SCHEDULE(date: CalendarDay, id?: string): Nullable<WcScheduleInfo>;
PLUGIN_ON_DETACHED(): void;
}
export declare const ICS_PLUGIN_KEY: "wc-plugin-ics";
export {};