110 lines
3.2 KiB
TypeScript
110 lines
3.2 KiB
TypeScript
// Application configuration
|
|
export interface AppConfig {
|
|
adminDid: string;
|
|
collections: {
|
|
comment: string;
|
|
user: string;
|
|
chat: string;
|
|
};
|
|
host: string;
|
|
rkey?: string; // Current post rkey if on post page
|
|
aiEnabled: boolean;
|
|
aiAskAi: boolean;
|
|
aiProvider: string;
|
|
aiModel: string;
|
|
aiHost: string;
|
|
bskyPublicApi: string;
|
|
}
|
|
|
|
// Generate collection names from host
|
|
// Format: ${reg}.${name}.${sub}
|
|
// Example: log.syui.ai -> ai.syui.log
|
|
function generateCollectionNames(host: string): { comment: string; user: string; chat: string } {
|
|
try {
|
|
// Remove protocol if present
|
|
const cleanHost = host.replace(/^https?:\/\//, '');
|
|
|
|
// Split host into parts
|
|
const parts = cleanHost.split('.');
|
|
|
|
if (parts.length < 2) {
|
|
throw new Error('Invalid host format');
|
|
}
|
|
|
|
// Reverse the parts for collection naming
|
|
// log.syui.ai -> ai.syui.log
|
|
const reversedParts = parts.reverse();
|
|
const collectionBase = reversedParts.join('.');
|
|
|
|
return {
|
|
comment: collectionBase,
|
|
user: `${collectionBase}.user`,
|
|
chat: `${collectionBase}.chat`
|
|
};
|
|
} catch (error) {
|
|
console.warn('Failed to generate collection names from host:', host, error);
|
|
// Fallback to default collections
|
|
return {
|
|
comment: 'ai.syui.log',
|
|
user: 'ai.syui.log.user',
|
|
chat: 'ai.syui.log.chat'
|
|
};
|
|
}
|
|
}
|
|
|
|
// Extract rkey from current URL
|
|
// /posts/xxx.html -> xxx
|
|
function extractRkeyFromUrl(): string | undefined {
|
|
const pathname = window.location.pathname;
|
|
const match = pathname.match(/\/posts\/([^/]+)\.html$/);
|
|
return match ? match[1] : undefined;
|
|
}
|
|
|
|
// Get application configuration from environment variables
|
|
export function getAppConfig(): AppConfig {
|
|
const host = import.meta.env.VITE_APP_HOST || 'https://log.syui.ai';
|
|
const adminDid = import.meta.env.VITE_ADMIN_DID || 'did:plc:uqzpqmrjnptsxezjx4xuh2mn';
|
|
|
|
// Priority: Environment variables > Auto-generated from host
|
|
const autoGeneratedCollections = generateCollectionNames(host);
|
|
const collections = {
|
|
comment: import.meta.env.VITE_COLLECTION_COMMENT || autoGeneratedCollections.comment,
|
|
user: import.meta.env.VITE_COLLECTION_USER || autoGeneratedCollections.user,
|
|
chat: import.meta.env.VITE_COLLECTION_CHAT || autoGeneratedCollections.chat,
|
|
};
|
|
|
|
const rkey = extractRkeyFromUrl();
|
|
|
|
// AI configuration
|
|
const aiEnabled = import.meta.env.VITE_AI_ENABLED === 'true';
|
|
const aiAskAi = import.meta.env.VITE_AI_ASK_AI === 'true';
|
|
const aiProvider = import.meta.env.VITE_AI_PROVIDER || 'ollama';
|
|
const aiModel = import.meta.env.VITE_AI_MODEL || 'gemma2:2b';
|
|
const aiHost = import.meta.env.VITE_AI_HOST || 'https://ollama.syui.ai';
|
|
const bskyPublicApi = import.meta.env.VITE_BSKY_PUBLIC_API || 'https://public.api.bsky.app';
|
|
|
|
console.log('App configuration:', {
|
|
host,
|
|
adminDid,
|
|
collections,
|
|
rkey: rkey || 'none (not on post page)',
|
|
ai: { enabled: aiEnabled, askAi: aiAskAi, provider: aiProvider, model: aiModel, host: aiHost },
|
|
bskyPublicApi
|
|
});
|
|
|
|
return {
|
|
adminDid,
|
|
collections,
|
|
host,
|
|
rkey,
|
|
aiEnabled,
|
|
aiAskAi,
|
|
aiProvider,
|
|
aiModel,
|
|
aiHost,
|
|
bskyPublicApi
|
|
};
|
|
}
|
|
|
|
// Export singleton instance
|
|
export const appConfig = getAppConfig(); |