next-data-fetcher
Version:
A flexible data fetching system for Next.js applications with real-time updates and pagination
186 lines (172 loc) • 6.85 kB
TypeScript
import * as react_jsx_runtime from 'react/jsx-runtime';
import React from 'react';
type DataSourceType = "json" | "csv" | "txt" | "api";
interface PaginationOptions {
page: number;
limit: number;
enabled: boolean;
}
interface FetcherOptions {
dataSource?: DataSourceType;
componentId: string;
endpoint?: string;
pagination?: PaginationOptions;
}
declare abstract class BaseFetcher<T> {
protected options: FetcherOptions;
protected baseServerUrl: string;
private static serverCache;
private clientCache;
private cacheExpirationTime;
private unsubscribe;
constructor(options: FetcherOptions);
private setupRealtimeSubscription;
private handleDataChange;
invalidateCache(): void;
abstract parseData(data: any): T[];
private getUrl;
fetchJsonData(isServer: boolean): Promise<{
data: T[];
totalItems?: number;
totalPages?: number;
}>;
fetchCsvData(isServer: boolean): Promise<{
data: T[];
}>;
fetchTxtData(isServer: boolean): Promise<{
data: T[];
}>;
fetchApiData(isServer: boolean): Promise<{
data: T[];
}>;
getMockData(): T[];
setPagination(page: number, limit: number, enabled?: boolean): void;
publishDataChange(action: "create" | "update" | "delete" | "refresh", data?: any, id?: string | number): void;
fetchData(isServer?: boolean): Promise<{
data: T[];
totalItems?: number;
totalPages?: number;
}>;
}
declare class FetcherRegistry {
private static instance;
private fetchers;
private apiBasePath;
private baseUrl;
private constructor();
static getInstance(): FetcherRegistry;
register(componentId: string, fetcher: BaseFetcher<any>): void;
getFetcher(componentId: string): BaseFetcher<any> | undefined;
setApiBasePath(path: string): void;
getApiBasePath(): string;
setBaseUrl(url: string): void;
getBaseUrl(): string;
getDataUrl(componentId: string, dataSource?: DataSourceType, isServer?: boolean): string;
}
type DataChangeEvent = {
componentId: string;
action: "create" | "update" | "delete" | "refresh";
data?: any;
id?: string | number;
};
declare class RealtimeManager {
private static instance;
private emitter;
private sseClients;
private isServerSide;
private constructor();
static getInstance(): RealtimeManager;
subscribe(componentId: string, callback: (event: DataChangeEvent) => void): () => void;
publish(event: DataChangeEvent): void;
registerSSEClient(id: string, send: (data: string) => void): void;
unregisterSSEClient(id: string): void;
private broadcastToSSEClients;
}
declare const realtimeManager: RealtimeManager;
declare function useRealtimeUpdates(componentId: string, onUpdate: () => void): void;
interface WithClientFetchingOptions {
dataSource?: DataSourceType;
enableRealtime?: boolean;
defaultItemsPerPage?: number;
loadingComponent?: React.ReactNode;
errorComponent?: React.ReactNode;
}
declare function withClientFetching<T, P extends {
data?: T[];
}>(WrappedComponent: React.ComponentType<P>, componentId: string, options?: WithClientFetchingOptions): {
(props: Omit<P, "data">): react_jsx_runtime.JSX.Element;
displayName: string;
};
interface WithServerFetchingOptions {
defaultItemsPerPage?: number;
loadingComponent?: React.ReactNode;
errorComponent?: React.ReactNode;
}
declare function withServerFetching<T, P extends {
data?: T[];
}>(WrappedComponent: React.ComponentType<P>, componentId: string, options?: WithServerFetchingOptions): {
(props: Omit<P, "data">): Promise<react_jsx_runtime.JSX.Element>;
displayName: string;
};
interface ListRendererProps<T> {
data: T[];
renderItem: (item: T, index: number) => React.ReactNode;
title: string;
className?: string;
listClassName?: string;
itemClassName?: string;
}
declare function ListRenderer<T>({ data, renderItem, title, className, listClassName, itemClassName, }: ListRendererProps<T>): react_jsx_runtime.JSX.Element;
interface DynamicListRendererProps<T> {
data: T[];
title: string;
priorityFields?: string[];
excludeFields?: string[];
itemsPerPage?: number;
virtualized?: boolean;
className?: string;
listClassName?: string;
itemClassName?: string;
}
declare function DynamicListRenderer<T extends Record<string, any>>({ data, title, priorityFields, excludeFields, itemsPerPage: defaultItemsPerPage, virtualized, className, listClassName, itemClassName, }: DynamicListRendererProps<T>): react_jsx_runtime.JSX.Element;
interface DynamicDataDisplayProps {
data: Record<string, any>;
excludeFields?: string[];
priorityFields?: string[];
className?: string;
}
declare function DynamicDataDisplay({ data, excludeFields, priorityFields, className, }: DynamicDataDisplayProps): react_jsx_runtime.JSX.Element;
interface PaginationProps {
currentPage: number;
totalPages: number;
onPageChange: (page: number) => void;
itemsPerPage: number;
onItemsPerPageChange?: (itemsPerPage: number) => void;
totalItems?: number;
showItemsPerPage?: boolean;
className?: string;
}
declare function Pagination({ currentPage, totalPages, onPageChange, itemsPerPage, onItemsPerPageChange, totalItems, showItemsPerPage, className, }: PaginationProps): react_jsx_runtime.JSX.Element;
interface ToggleProps {
onToggleMode: (isServer: boolean) => void;
onChangeDataSource: (dataSource: DataSourceType) => void;
onRefresh?: () => void;
isServer: boolean;
dataSource: DataSourceType;
isRealtime?: boolean;
onToggleRealtime?: () => void;
className?: string;
}
declare function Toggle({ onToggleMode, onChangeDataSource, onRefresh, isServer, dataSource, isRealtime, onToggleRealtime, className, }: ToggleProps): react_jsx_runtime.JSX.Element;
/**
* Creates a simple API route handler for Next.js that reads data from files
* @param dataDir Directory where data files are stored
* @returns A handler function for Next.js API routes
*/
declare function createDataApiHandler(dataDir?: string): (req: Request) => Promise<Response>;
/**
* Creates a simple SSE handler for Next.js
* @returns A handler function for Next.js API routes
*/
declare function createSseHandler(): (req: Request) => Promise<Response>;
export { BaseFetcher, DataChangeEvent, DataSourceType, DynamicDataDisplay, DynamicDataDisplayProps, DynamicListRenderer, DynamicListRendererProps, FetcherOptions, FetcherRegistry, ListRenderer, ListRendererProps, Pagination, PaginationOptions, PaginationProps, Toggle, ToggleProps, WithClientFetchingOptions, WithServerFetchingOptions, createDataApiHandler, createSseHandler, realtimeManager, useRealtimeUpdates, withClientFetching, withServerFetching };