shared-features 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{admin-commonFeatures-BKjytwx5.js → admin-commonFeatures-CFhvjgp9.js} +3 -3
- package/dist/{admin-commonFeatures-BKjytwx5.js.map → admin-commonFeatures-CFhvjgp9.js.map} +1 -1
- package/dist/{admin-commonFeatures-bjszYcI3.cjs → admin-commonFeatures-pnaXeix_.cjs} +3 -3
- package/dist/{admin-commonFeatures-bjszYcI3.cjs.map → admin-commonFeatures-pnaXeix_.cjs.map} +1 -1
- package/dist/{broadcasts-BeTm29_q.cjs → broadcasts-DZsQNd4R.cjs} +2 -2
- package/dist/{broadcasts-BeTm29_q.cjs.map → broadcasts-DZsQNd4R.cjs.map} +1 -1
- package/dist/{broadcasts-CbrWZpcI.js → broadcasts-Dlu51_38.js} +2 -2
- package/dist/{broadcasts-CbrWZpcI.js.map → broadcasts-Dlu51_38.js.map} +1 -1
- package/dist/{commonFeatures-DMYLR629.cjs → commonFeatures-BuY97_K4.cjs} +10 -2
- package/dist/{commonFeatures-DMYLR629.cjs.map → commonFeatures-BuY97_K4.cjs.map} +1 -1
- package/dist/{commonFeatures-78YVrQq1.js → commonFeatures-LzPnbR6z.js} +10 -2
- package/dist/{commonFeatures-78YVrQq1.js.map → commonFeatures-LzPnbR6z.js.map} +1 -1
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.js +1 -1
- package/dist/{featureFlags-DLdibcv_.js → featureFlags-CSudFX4x.js} +3 -2
- package/dist/featureFlags-CSudFX4x.js.map +1 -0
- package/dist/{featureFlags-DOwy_uOj.cjs → featureFlags-CfDmshkF.cjs} +3 -2
- package/dist/featureFlags-CfDmshkF.cjs.map +1 -0
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.js +2 -2
- package/dist/{index-CQNjI6V7.js → index-D2YWycum.js} +3 -3
- package/dist/{index-CQNjI6V7.js.map → index-D2YWycum.js.map} +1 -1
- package/dist/{index-B5uAGS9G.cjs → index-DxjbpnFC.cjs} +3 -3
- package/dist/{index-B5uAGS9G.cjs.map → index-DxjbpnFC.cjs.map} +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.js +7 -7
- package/dist/services/commonFeatures.d.ts.map +1 -1
- package/dist/services/index.cjs +4 -4
- package/dist/services/index.js +4 -4
- package/dist/types/commonFeatures.d.ts +11 -0
- package/dist/types/commonFeatures.d.ts.map +1 -1
- package/dist/types/index.cjs +1 -1
- package/dist/types/index.js +1 -1
- package/dist/{useCommonFeatures-NobppaW9.cjs → useCommonFeatures-CWqe4EhH.cjs} +2 -2
- package/dist/{useCommonFeatures-NobppaW9.cjs.map → useCommonFeatures-CWqe4EhH.cjs.map} +1 -1
- package/dist/{useCommonFeatures-BVaPDaPy.js → useCommonFeatures-CnmI83Er.js} +2 -2
- package/dist/{useCommonFeatures-BVaPDaPy.js.map → useCommonFeatures-CnmI83Er.js.map} +1 -1
- package/dist/{useFeatureFlags-8nC71ue-.cjs → useFeatureFlags-9_E7gair.cjs} +3 -3
- package/dist/{useFeatureFlags-8nC71ue-.cjs.map → useFeatureFlags-9_E7gair.cjs.map} +1 -1
- package/dist/{useFeatureFlags-DlMeLBH2.js → useFeatureFlags-DhIb0HYi.js} +3 -3
- package/dist/{useFeatureFlags-DlMeLBH2.js.map → useFeatureFlags-DhIb0HYi.js.map} +1 -1
- package/package.json +1 -1
- package/dist/featureFlags-DLdibcv_.js.map +0 -1
- package/dist/featureFlags-DOwy_uOj.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags-CSudFX4x.js","sources":["../src/types/commonFeatures.ts","../src/types/featureFlags.ts"],"sourcesContent":["/**\n * Common Features Types\n *\n * Type definitions for centralized common features:\n * - Contact Info\n * - Developer Info\n * - Social Links\n * - Address Info\n * - Payment Options\n * - Services\n * - Skills\n * - Testimonials\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport type { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// COLLECTION NAMES\n// ============================================================================\n\n/**\n * Keys for common feature collection name overrides.\n * Consumers can pass custom collection names via initSharedFeatures()\n * to reuse existing collections instead of creating new ones.\n */\nexport type CommonFeatureCollectionKey =\n | 'CONTACT_INFO'\n | 'DEVELOPER_INFO'\n | 'SOCIAL_LINKS'\n | 'ADDRESS_INFO'\n | 'PAYMENT_OPTIONS'\n | 'SERVICES'\n | 'SKILLS'\n | 'TESTIMONIALS'\n | 'PROJECTS';\n\nconst DEFAULT_COMMON_FEATURE_COLLECTIONS: Record<CommonFeatureCollectionKey, string> = {\n CONTACT_INFO: 'portfolio_contact_info',\n DEVELOPER_INFO: 'portfolio_developer_info',\n SOCIAL_LINKS: 'portfolio_social_links',\n ADDRESS_INFO: 'portfolio_address_info',\n PAYMENT_OPTIONS: 'portfolio_payment_options',\n SERVICES: 'portfolio_services',\n SKILLS: 'portfolio_skills',\n TESTIMONIALS: 'testimonials',\n PROJECTS: 'portfolio_projects',\n};\n\n/**\n * Active collection names. Defaults to portfolio_ prefixed collections\n * managed from aoneahsan-portfolio admin panel.\n * Can be overridden via initSharedFeatures({ collectionNames: {...} })\n * if a consumer needs custom collection names.\n */\nexport let COMMON_FEATURE_COLLECTIONS: Record<CommonFeatureCollectionKey, string> = {\n ...DEFAULT_COMMON_FEATURE_COLLECTIONS,\n};\n\n/**\n * Override collection names for common features.\n * Called internally by initSharedFeatures when collectionNames config is provided.\n */\nexport function setCommonFeatureCollectionNames(\n overrides: Partial<Record<CommonFeatureCollectionKey, string>>\n): void {\n COMMON_FEATURE_COLLECTIONS = {\n ...DEFAULT_COMMON_FEATURE_COLLECTIONS,\n ...overrides,\n };\n}\n\n// ============================================================================\n// CONTACT INFO\n// ============================================================================\n\nexport interface ContactInfo {\n id: string;\n email: string;\n supportEmail?: string;\n phone?: string;\n whatsapp?: string;\n telegram?: string;\n skype?: string;\n freelanceAvailable: boolean;\n workingHours?: string;\n timezone?: string;\n preferredContact?: 'email' | 'phone' | 'whatsapp' | 'telegram';\n responseTime?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_CONTACT_INFO: Omit<ContactInfo, 'id' | 'updatedAt'> = {\n email: '',\n freelanceAvailable: false,\n};\n\n// ============================================================================\n// DEVELOPER INFO\n// ============================================================================\n\nexport interface DeveloperInfo {\n id: string;\n name: string;\n title: string;\n tagline?: string;\n bio: string;\n shortBio?: string;\n avatar?: string;\n website?: string;\n github?: string;\n linkedin?: string;\n twitter?: string;\n yearsOfExperience?: number;\n location?: string;\n availableForHire: boolean;\n resumeUrl?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_DEVELOPER_INFO: Omit<DeveloperInfo, 'id' | 'updatedAt'> = {\n name: '',\n title: '',\n bio: '',\n availableForHire: false,\n};\n\n// ============================================================================\n// SOCIAL LINKS\n// ============================================================================\n\nexport type SocialPlatform =\n | 'github'\n | 'linkedin'\n | 'twitter'\n | 'facebook'\n | 'instagram'\n | 'youtube'\n | 'tiktok'\n | 'discord'\n | 'telegram'\n | 'whatsapp'\n | 'medium'\n | 'devto'\n | 'stackoverflow'\n | 'dribbble'\n | 'behance'\n | 'codepen'\n | 'npm'\n | 'website'\n | 'email'\n | 'other';\n\nexport const SOCIAL_PLATFORM_NAMES: Record<SocialPlatform, string> = {\n github: 'GitHub',\n linkedin: 'LinkedIn',\n twitter: 'Twitter/X',\n facebook: 'Facebook',\n instagram: 'Instagram',\n youtube: 'YouTube',\n tiktok: 'TikTok',\n discord: 'Discord',\n telegram: 'Telegram',\n whatsapp: 'WhatsApp',\n medium: 'Medium',\n devto: 'Dev.to',\n stackoverflow: 'Stack Overflow',\n dribbble: 'Dribbble',\n behance: 'Behance',\n codepen: 'CodePen',\n npm: 'NPM',\n website: 'Website',\n email: 'Email',\n other: 'Other',\n};\n\nexport interface SocialLink {\n id: string;\n platform: SocialPlatform;\n url: string;\n displayName?: string;\n username?: string;\n icon?: string;\n order: number;\n isActive: boolean;\n showIn: ('footer' | 'contact' | 'about' | 'header')[];\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// ADDRESS INFO\n// ============================================================================\n\nexport interface AddressCoordinates {\n lat: number;\n lng: number;\n}\n\nexport interface AddressInfo {\n id: string;\n label?: string;\n streetAddress?: string;\n apartment?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n landmark?: string;\n fullAddress?: string;\n googleMapsUrl?: string;\n googleMapsEmbedUrl?: string;\n coordinates?: AddressCoordinates;\n showMap: boolean;\n isPublic: boolean;\n workingHours?: string;\n additionalInfo?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_ADDRESS_INFO: Omit<AddressInfo, 'id' | 'updatedAt'> = {\n isPublic: false,\n showMap: false,\n};\n\n// ============================================================================\n// PAYMENT OPTIONS\n// ============================================================================\n\nexport type PaymentType =\n | 'bank'\n | 'paypal'\n | 'stripe'\n | 'wise'\n | 'crypto'\n | 'upi'\n | 'venmo'\n | 'cashapp'\n | 'platform'\n | 'wallet'\n | 'other';\n\nexport const PAYMENT_TYPE_NAMES: Record<PaymentType, string> = {\n bank: 'Bank Transfer',\n paypal: 'PayPal',\n stripe: 'Stripe',\n wise: 'Wise',\n crypto: 'Cryptocurrency',\n upi: 'UPI',\n venmo: 'Venmo',\n cashapp: 'Cash App',\n platform: 'Platform',\n wallet: 'Digital Wallet',\n other: 'Other',\n};\n\nexport interface BankDetails {\n bankName: string;\n accountName: string;\n accountNumber: string;\n routingNumber?: string;\n swiftCode?: string;\n iban?: string;\n branch?: string;\n}\n\nexport interface CryptoDetails {\n currency: string;\n walletAddress: string;\n network?: string;\n}\n\nexport interface PaymentOption {\n id: string;\n type: PaymentType;\n name: string;\n displayName?: string;\n description?: string;\n instructions?: string;\n icon?: string;\n details: BankDetails | CryptoDetails | Record<string, string>;\n isActive: boolean;\n isPrimary: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// SERVICES\n// ============================================================================\n\nexport type ServiceCategory =\n | 'web-development'\n | 'mobile-development'\n | 'backend-development'\n | 'devops'\n | 'consulting'\n | 'ui-ux-design'\n | 'api-development'\n | 'database'\n | 'cloud'\n | 'security'\n | 'other';\n\nexport const SERVICE_CATEGORY_NAMES: Record<ServiceCategory, string> = {\n 'web-development': 'Web Development',\n 'mobile-development': 'Mobile Development',\n 'backend-development': 'Backend Development',\n devops: 'DevOps',\n consulting: 'Consulting',\n 'ui-ux-design': 'UI/UX Design',\n 'api-development': 'API Development',\n database: 'Database',\n cloud: 'Cloud Services',\n security: 'Security',\n other: 'Other',\n};\n\nexport interface Service {\n id: string;\n title: string;\n description: string;\n shortDescription?: string;\n category: ServiceCategory;\n icon?: string;\n features?: string[];\n technologies?: string[];\n priceRange?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// SKILLS\n// ============================================================================\n\nexport type SkillCategory =\n | 'frontend'\n | 'backend'\n | 'mobile'\n | 'database'\n | 'devops'\n | 'cloud'\n | 'tools'\n | 'languages'\n | 'frameworks'\n | 'soft-skills'\n | 'other';\n\nexport const SKILL_CATEGORY_NAMES: Record<SkillCategory, string> = {\n frontend: 'Frontend',\n backend: 'Backend',\n mobile: 'Mobile',\n database: 'Database',\n devops: 'DevOps',\n cloud: 'Cloud',\n tools: 'Tools',\n languages: 'Languages',\n frameworks: 'Frameworks',\n 'soft-skills': 'Soft Skills',\n other: 'Other',\n};\n\nexport type SkillLevel = 'beginner' | 'intermediate' | 'advanced' | 'expert';\n\nexport const SKILL_LEVEL_NAMES: Record<SkillLevel, string> = {\n beginner: 'Beginner',\n intermediate: 'Intermediate',\n advanced: 'Advanced',\n expert: 'Expert',\n};\n\nexport interface Skill {\n id: string;\n name: string;\n category: SkillCategory;\n level: SkillLevel;\n yearsOfExperience?: number;\n icon?: string;\n color?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// TESTIMONIALS\n// ============================================================================\n\nexport interface Testimonial {\n id: string;\n authorName: string;\n authorTitle?: string;\n authorCompany?: string;\n authorAvatar?: string;\n authorLinkedin?: string;\n content: string;\n shortContent?: string;\n rating?: number;\n projectName?: string;\n projectUrl?: string;\n date?: Timestamp;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// HOOK OPTIONS & RESULTS\n// ============================================================================\n\nexport interface UseCommonFeatureOptions {\n autoFetch?: boolean;\n realtime?: boolean;\n}\n\nexport interface UseCommonFeatureResult<T> {\n data: T | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCommonFeaturesListResult<T> {\n data: T[];\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// FETCH OPTIONS\n// ============================================================================\n\nexport interface FetchSocialLinksOptions {\n showIn?: ('footer' | 'contact' | 'about' | 'header')[];\n activeOnly?: boolean;\n}\n\nexport interface FetchServicesOptions {\n category?: ServiceCategory;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n}\n\nexport interface FetchSkillsOptions {\n category?: SkillCategory;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n}\n\nexport interface FetchTestimonialsOptions {\n activeOnly?: boolean;\n featuredOnly?: boolean;\n limit?: number;\n}\n\nexport interface FetchPaymentOptionsOptions {\n activeOnly?: boolean;\n type?: PaymentType;\n}\n\n// ============================================================================\n// PROJECTS / PORTFOLIO\n// ============================================================================\n\nexport type ProjectStatus = 'completed' | 'in-progress' | 'planned' | 'archived';\n\nexport const PROJECT_STATUS_NAMES: Record<ProjectStatus, string> = {\n completed: 'Completed',\n 'in-progress': 'In Progress',\n planned: 'Planned',\n archived: 'Archived',\n};\n\nexport type ProjectCategory =\n | 'web-app'\n | 'mobile-app'\n | 'desktop-app'\n | 'api'\n | 'library'\n | 'cli-tool'\n | 'browser-extension'\n | 'extension'\n | 'full-stack'\n | 'open-source'\n | 'client-work'\n | 'personal'\n | 'other';\n\nexport const PROJECT_CATEGORY_NAMES: Record<ProjectCategory, string> = {\n 'web-app': 'Web Application',\n 'mobile-app': 'Mobile App',\n 'desktop-app': 'Desktop App',\n api: 'API / Backend',\n library: 'Library / Package',\n 'cli-tool': 'CLI Tool',\n 'browser-extension': 'Browser Extension',\n extension: 'Extension',\n 'full-stack': 'Full Stack',\n 'open-source': 'Open Source',\n 'client-work': 'Client Work',\n personal: 'Personal Project',\n other: 'Other',\n};\n\nexport interface ProjectLink {\n type: 'live' | 'github' | 'demo' | 'docs' | 'playstore' | 'appstore' | 'npm' | 'other';\n url: string;\n label?: string;\n}\n\nexport interface Project {\n id: string;\n title: string;\n slug: string;\n description: string;\n shortDescription?: string;\n category: ProjectCategory;\n status: ProjectStatus;\n thumbnailUrl?: string;\n images?: string[];\n technologies: string[];\n features?: string[];\n links?: ProjectLink[];\n clientName?: string;\n startDate?: string;\n endDate?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\nexport interface FetchProjectsOptions {\n category?: ProjectCategory;\n status?: ProjectStatus;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n limit?: number;\n}\n","/**\n * Feature Flags Types\n *\n * Type definitions for the shared-features feature flags system.\n * Feature flags allow breaking changes to be versioned, enabling consumers\n * to upgrade at their own pace without breaking existing implementations.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport type { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// FEATURE IDENTIFIERS\n// ============================================================================\n\n/**\n * All available features in shared-features\n */\nexport type FeatureId =\n | 'campaigns'\n | 'broadcasts'\n | 'contactInfo'\n | 'developerInfo'\n | 'socialLinks'\n | 'paymentOptions'\n | 'addressInfo'\n | 'services'\n | 'skills'\n | 'testimonials'\n | 'projects';\n\n/**\n * Feature names for display\n */\nexport const FEATURE_NAMES: Record<FeatureId, string> = {\n campaigns: 'Advertising Campaigns',\n broadcasts: 'Broadcasts & Notifications',\n contactInfo: 'Contact Information',\n developerInfo: 'Developer Information',\n socialLinks: 'Social Links',\n paymentOptions: 'Payment Options',\n addressInfo: 'Address Information',\n services: 'Services',\n skills: 'Skills',\n testimonials: 'Testimonials',\n projects: 'Portfolio Projects',\n};\n\n// ============================================================================\n// FEATURE CONFIGURATION\n// ============================================================================\n\n/**\n * Configuration for a single feature\n */\nexport interface FeatureConfig {\n /** Whether the feature is globally enabled */\n enabled: boolean;\n\n /** Current version of this feature's API */\n version: number;\n\n /** Minimum version required (older versions will get deprecation warnings) */\n minVersion: number;\n\n /** Maximum supported version */\n maxVersion: number;\n\n /** Optional deprecation message for older versions */\n deprecationMessage?: string;\n\n /** Whether this feature requires authentication */\n requiresAuth?: boolean;\n\n /** Platforms this feature is available on (empty = all) */\n availablePlatforms?: string[];\n\n /** Projects this feature is available for (empty = all) */\n availableProjects?: string[];\n}\n\n/**\n * All feature configurations stored in Firestore\n */\nexport type FeatureConfigs = Record<FeatureId, FeatureConfig>;\n\n// ============================================================================\n// FIRESTORE DOCUMENT\n// ============================================================================\n\n/**\n * Feature flags document stored in Firestore (zaions_feature_flags/main)\n */\nexport interface FeatureFlagsDocument {\n /** Document ID (always 'main') */\n id: string;\n\n /** Global kill switch - disables all shared-features */\n globalEnabled: boolean;\n\n /** Current global API version (e.g., 'v1', 'v2') */\n currentApiVersion: string;\n\n /** Supported API versions (for backwards compatibility) */\n supportedApiVersions: string[];\n\n /** Individual feature configurations */\n features: FeatureConfigs;\n\n /** Maintenance mode - shows maintenance message to users */\n maintenanceMode: boolean;\n\n /** Maintenance message to display */\n maintenanceMessage?: string;\n\n /** Expected maintenance end time */\n maintenanceEndTime?: Timestamp;\n\n /** Last updated timestamp */\n updatedAt: Timestamp;\n\n /** Who last updated the flags */\n updatedBy: string;\n}\n\n// ============================================================================\n// CONSUMER CONFIGURATION\n// ============================================================================\n\n/**\n * Feature version preferences for a consumer project\n * Used during initialization to specify which versions to use\n */\nexport interface ConsumerFeatureVersions {\n /** Campaigns API version (default: latest) */\n campaigns?: number;\n\n /** Broadcasts API version (default: latest) */\n broadcasts?: number;\n\n /** Contact info API version (default: latest) */\n contactInfo?: number;\n\n /** Developer info API version (default: latest) */\n developerInfo?: number;\n\n /** Social links API version (default: latest) */\n socialLinks?: number;\n\n /** Payment options API version (default: latest) */\n paymentOptions?: number;\n\n /** Address info API version (default: latest) */\n addressInfo?: number;\n\n /** Services API version (default: latest) */\n services?: number;\n\n /** Skills API version (default: latest) */\n skills?: number;\n\n /** Testimonials API version (default: latest) */\n testimonials?: number;\n\n /** Projects API version (default: latest) */\n projects?: number;\n}\n\n// ============================================================================\n// FEATURE CHECK RESULTS\n// ============================================================================\n\n/**\n * Result of checking if a feature is available\n */\nexport interface FeatureAvailability {\n /** Whether the feature is available for use */\n available: boolean;\n\n /** Whether the feature is enabled globally */\n enabled: boolean;\n\n /** Current feature version */\n version: number;\n\n /** Whether the consumer's version is deprecated */\n deprecated: boolean;\n\n /** Deprecation warning message if applicable */\n deprecationWarning?: string;\n\n /** Reason why feature is unavailable (if not available) */\n unavailableReason?: string;\n\n /** Whether an upgrade is required */\n upgradeRequired: boolean;\n\n /** Message about available upgrade */\n upgradeMessage?: string;\n}\n\n/**\n * Overall status of shared-features for a consumer\n */\nexport interface SharedFeaturesStatus {\n /** Whether shared-features is operational */\n operational: boolean;\n\n /** Whether in maintenance mode */\n maintenanceMode: boolean;\n\n /** Maintenance message if applicable */\n maintenanceMessage?: string;\n\n /** Global API version */\n apiVersion: string;\n\n /** Individual feature availabilities */\n features: Record<FeatureId, FeatureAvailability>;\n\n /** List of deprecated features being used */\n deprecatedFeatures: FeatureId[];\n\n /** List of features requiring upgrade */\n upgradeRequiredFeatures: FeatureId[];\n\n /** When status was last fetched */\n fetchedAt: Date;\n}\n\n// ============================================================================\n// ADMIN TYPES\n// ============================================================================\n\n/**\n * Input for updating a feature's configuration\n */\nexport interface UpdateFeatureConfigInput {\n featureId: FeatureId;\n enabled?: boolean;\n version?: number;\n minVersion?: number;\n maxVersion?: number;\n deprecationMessage?: string;\n requiresAuth?: boolean;\n availablePlatforms?: string[];\n availableProjects?: string[];\n}\n\n/**\n * Input for updating global flags\n */\nexport interface UpdateGlobalFlagsInput {\n globalEnabled?: boolean;\n currentApiVersion?: string;\n supportedApiVersions?: string[];\n maintenanceMode?: boolean;\n maintenanceMessage?: string;\n maintenanceEndTime?: Date | null;\n}\n\n// ============================================================================\n// HOOK OPTIONS AND RESULTS\n// ============================================================================\n\n/**\n * Options for useFeatureFlags hook\n */\nexport interface UseFeatureFlagsOptions {\n /** Whether to auto-refresh flags periodically */\n autoRefresh?: boolean;\n\n /** Refresh interval in milliseconds (default: 5 minutes) */\n refreshInterval?: number;\n\n /** Whether to fetch immediately on mount (default: true) */\n autoFetch?: boolean;\n}\n\n/**\n * Result of useFeatureFlags hook\n */\nexport interface UseFeatureFlagsResult {\n /** Overall status of shared-features */\n status: SharedFeaturesStatus | null;\n\n /** Whether flags are being fetched */\n loading: boolean;\n\n /** Error message if fetch failed */\n error: string | null;\n\n /** Refetch feature flags */\n refetch: () => Promise<void>;\n\n /** Check if a specific feature is available */\n isFeatureAvailable: (featureId: FeatureId) => boolean;\n\n /** Get availability details for a feature */\n getFeatureAvailability: (featureId: FeatureId) => FeatureAvailability | null;\n\n /** Check if any features are deprecated */\n hasDeprecatedFeatures: boolean;\n\n /** Check if any features require upgrade */\n hasUpgradeRequired: boolean;\n}\n\n// ============================================================================\n// DEFAULT VALUES\n// ============================================================================\n\n/**\n * Default feature configuration for new features\n */\nexport const DEFAULT_FEATURE_CONFIG: FeatureConfig = {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n};\n\n/**\n * Default feature flags document\n */\nexport const DEFAULT_FEATURE_FLAGS: Omit<\n FeatureFlagsDocument,\n 'updatedAt' | 'updatedBy'\n> = {\n id: 'main',\n globalEnabled: true,\n currentApiVersion: 'v1',\n supportedApiVersions: ['v1'],\n maintenanceMode: false,\n features: {\n campaigns: {\n enabled: true,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n broadcasts: {\n enabled: true,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n contactInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n developerInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n socialLinks: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n paymentOptions: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n addressInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n services: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n skills: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n testimonials: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n projects: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n },\n};\n\n// ============================================================================\n// COLLECTION NAME\n// ============================================================================\n\n/**\n * Firestore collection name for feature flags\n */\nexport const COLLECTION_FEATURE_FLAGS = 'zaions_feature_flags';\n\n/**\n * Document ID for the main feature flags document\n */\nexport const FEATURE_FLAGS_DOC_ID = 'main';\n"],"names":[],"mappings":"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"}
|
|
@@ -52,7 +52,8 @@ const SOCIAL_PLATFORM_NAMES = {
|
|
|
52
52
|
other: "Other"
|
|
53
53
|
};
|
|
54
54
|
const DEFAULT_ADDRESS_INFO = {
|
|
55
|
-
isPublic: false
|
|
55
|
+
isPublic: false,
|
|
56
|
+
showMap: false
|
|
56
57
|
};
|
|
57
58
|
const PAYMENT_TYPE_NAMES = {
|
|
58
59
|
bank: "Bank Transfer",
|
|
@@ -232,4 +233,4 @@ exports.SKILL_CATEGORY_NAMES = SKILL_CATEGORY_NAMES;
|
|
|
232
233
|
exports.SKILL_LEVEL_NAMES = SKILL_LEVEL_NAMES;
|
|
233
234
|
exports.SOCIAL_PLATFORM_NAMES = SOCIAL_PLATFORM_NAMES;
|
|
234
235
|
exports.setCommonFeatureCollectionNames = setCommonFeatureCollectionNames;
|
|
235
|
-
//# sourceMappingURL=featureFlags-
|
|
236
|
+
//# sourceMappingURL=featureFlags-CfDmshkF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags-CfDmshkF.cjs","sources":["../src/types/commonFeatures.ts","../src/types/featureFlags.ts"],"sourcesContent":["/**\n * Common Features Types\n *\n * Type definitions for centralized common features:\n * - Contact Info\n * - Developer Info\n * - Social Links\n * - Address Info\n * - Payment Options\n * - Services\n * - Skills\n * - Testimonials\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport type { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// COLLECTION NAMES\n// ============================================================================\n\n/**\n * Keys for common feature collection name overrides.\n * Consumers can pass custom collection names via initSharedFeatures()\n * to reuse existing collections instead of creating new ones.\n */\nexport type CommonFeatureCollectionKey =\n | 'CONTACT_INFO'\n | 'DEVELOPER_INFO'\n | 'SOCIAL_LINKS'\n | 'ADDRESS_INFO'\n | 'PAYMENT_OPTIONS'\n | 'SERVICES'\n | 'SKILLS'\n | 'TESTIMONIALS'\n | 'PROJECTS';\n\nconst DEFAULT_COMMON_FEATURE_COLLECTIONS: Record<CommonFeatureCollectionKey, string> = {\n CONTACT_INFO: 'portfolio_contact_info',\n DEVELOPER_INFO: 'portfolio_developer_info',\n SOCIAL_LINKS: 'portfolio_social_links',\n ADDRESS_INFO: 'portfolio_address_info',\n PAYMENT_OPTIONS: 'portfolio_payment_options',\n SERVICES: 'portfolio_services',\n SKILLS: 'portfolio_skills',\n TESTIMONIALS: 'testimonials',\n PROJECTS: 'portfolio_projects',\n};\n\n/**\n * Active collection names. Defaults to portfolio_ prefixed collections\n * managed from aoneahsan-portfolio admin panel.\n * Can be overridden via initSharedFeatures({ collectionNames: {...} })\n * if a consumer needs custom collection names.\n */\nexport let COMMON_FEATURE_COLLECTIONS: Record<CommonFeatureCollectionKey, string> = {\n ...DEFAULT_COMMON_FEATURE_COLLECTIONS,\n};\n\n/**\n * Override collection names for common features.\n * Called internally by initSharedFeatures when collectionNames config is provided.\n */\nexport function setCommonFeatureCollectionNames(\n overrides: Partial<Record<CommonFeatureCollectionKey, string>>\n): void {\n COMMON_FEATURE_COLLECTIONS = {\n ...DEFAULT_COMMON_FEATURE_COLLECTIONS,\n ...overrides,\n };\n}\n\n// ============================================================================\n// CONTACT INFO\n// ============================================================================\n\nexport interface ContactInfo {\n id: string;\n email: string;\n supportEmail?: string;\n phone?: string;\n whatsapp?: string;\n telegram?: string;\n skype?: string;\n freelanceAvailable: boolean;\n workingHours?: string;\n timezone?: string;\n preferredContact?: 'email' | 'phone' | 'whatsapp' | 'telegram';\n responseTime?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_CONTACT_INFO: Omit<ContactInfo, 'id' | 'updatedAt'> = {\n email: '',\n freelanceAvailable: false,\n};\n\n// ============================================================================\n// DEVELOPER INFO\n// ============================================================================\n\nexport interface DeveloperInfo {\n id: string;\n name: string;\n title: string;\n tagline?: string;\n bio: string;\n shortBio?: string;\n avatar?: string;\n website?: string;\n github?: string;\n linkedin?: string;\n twitter?: string;\n yearsOfExperience?: number;\n location?: string;\n availableForHire: boolean;\n resumeUrl?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_DEVELOPER_INFO: Omit<DeveloperInfo, 'id' | 'updatedAt'> = {\n name: '',\n title: '',\n bio: '',\n availableForHire: false,\n};\n\n// ============================================================================\n// SOCIAL LINKS\n// ============================================================================\n\nexport type SocialPlatform =\n | 'github'\n | 'linkedin'\n | 'twitter'\n | 'facebook'\n | 'instagram'\n | 'youtube'\n | 'tiktok'\n | 'discord'\n | 'telegram'\n | 'whatsapp'\n | 'medium'\n | 'devto'\n | 'stackoverflow'\n | 'dribbble'\n | 'behance'\n | 'codepen'\n | 'npm'\n | 'website'\n | 'email'\n | 'other';\n\nexport const SOCIAL_PLATFORM_NAMES: Record<SocialPlatform, string> = {\n github: 'GitHub',\n linkedin: 'LinkedIn',\n twitter: 'Twitter/X',\n facebook: 'Facebook',\n instagram: 'Instagram',\n youtube: 'YouTube',\n tiktok: 'TikTok',\n discord: 'Discord',\n telegram: 'Telegram',\n whatsapp: 'WhatsApp',\n medium: 'Medium',\n devto: 'Dev.to',\n stackoverflow: 'Stack Overflow',\n dribbble: 'Dribbble',\n behance: 'Behance',\n codepen: 'CodePen',\n npm: 'NPM',\n website: 'Website',\n email: 'Email',\n other: 'Other',\n};\n\nexport interface SocialLink {\n id: string;\n platform: SocialPlatform;\n url: string;\n displayName?: string;\n username?: string;\n icon?: string;\n order: number;\n isActive: boolean;\n showIn: ('footer' | 'contact' | 'about' | 'header')[];\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// ADDRESS INFO\n// ============================================================================\n\nexport interface AddressCoordinates {\n lat: number;\n lng: number;\n}\n\nexport interface AddressInfo {\n id: string;\n label?: string;\n streetAddress?: string;\n apartment?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n landmark?: string;\n fullAddress?: string;\n googleMapsUrl?: string;\n googleMapsEmbedUrl?: string;\n coordinates?: AddressCoordinates;\n showMap: boolean;\n isPublic: boolean;\n workingHours?: string;\n additionalInfo?: string;\n updatedAt: Timestamp;\n}\n\nexport const DEFAULT_ADDRESS_INFO: Omit<AddressInfo, 'id' | 'updatedAt'> = {\n isPublic: false,\n showMap: false,\n};\n\n// ============================================================================\n// PAYMENT OPTIONS\n// ============================================================================\n\nexport type PaymentType =\n | 'bank'\n | 'paypal'\n | 'stripe'\n | 'wise'\n | 'crypto'\n | 'upi'\n | 'venmo'\n | 'cashapp'\n | 'platform'\n | 'wallet'\n | 'other';\n\nexport const PAYMENT_TYPE_NAMES: Record<PaymentType, string> = {\n bank: 'Bank Transfer',\n paypal: 'PayPal',\n stripe: 'Stripe',\n wise: 'Wise',\n crypto: 'Cryptocurrency',\n upi: 'UPI',\n venmo: 'Venmo',\n cashapp: 'Cash App',\n platform: 'Platform',\n wallet: 'Digital Wallet',\n other: 'Other',\n};\n\nexport interface BankDetails {\n bankName: string;\n accountName: string;\n accountNumber: string;\n routingNumber?: string;\n swiftCode?: string;\n iban?: string;\n branch?: string;\n}\n\nexport interface CryptoDetails {\n currency: string;\n walletAddress: string;\n network?: string;\n}\n\nexport interface PaymentOption {\n id: string;\n type: PaymentType;\n name: string;\n displayName?: string;\n description?: string;\n instructions?: string;\n icon?: string;\n details: BankDetails | CryptoDetails | Record<string, string>;\n isActive: boolean;\n isPrimary: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// SERVICES\n// ============================================================================\n\nexport type ServiceCategory =\n | 'web-development'\n | 'mobile-development'\n | 'backend-development'\n | 'devops'\n | 'consulting'\n | 'ui-ux-design'\n | 'api-development'\n | 'database'\n | 'cloud'\n | 'security'\n | 'other';\n\nexport const SERVICE_CATEGORY_NAMES: Record<ServiceCategory, string> = {\n 'web-development': 'Web Development',\n 'mobile-development': 'Mobile Development',\n 'backend-development': 'Backend Development',\n devops: 'DevOps',\n consulting: 'Consulting',\n 'ui-ux-design': 'UI/UX Design',\n 'api-development': 'API Development',\n database: 'Database',\n cloud: 'Cloud Services',\n security: 'Security',\n other: 'Other',\n};\n\nexport interface Service {\n id: string;\n title: string;\n description: string;\n shortDescription?: string;\n category: ServiceCategory;\n icon?: string;\n features?: string[];\n technologies?: string[];\n priceRange?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// SKILLS\n// ============================================================================\n\nexport type SkillCategory =\n | 'frontend'\n | 'backend'\n | 'mobile'\n | 'database'\n | 'devops'\n | 'cloud'\n | 'tools'\n | 'languages'\n | 'frameworks'\n | 'soft-skills'\n | 'other';\n\nexport const SKILL_CATEGORY_NAMES: Record<SkillCategory, string> = {\n frontend: 'Frontend',\n backend: 'Backend',\n mobile: 'Mobile',\n database: 'Database',\n devops: 'DevOps',\n cloud: 'Cloud',\n tools: 'Tools',\n languages: 'Languages',\n frameworks: 'Frameworks',\n 'soft-skills': 'Soft Skills',\n other: 'Other',\n};\n\nexport type SkillLevel = 'beginner' | 'intermediate' | 'advanced' | 'expert';\n\nexport const SKILL_LEVEL_NAMES: Record<SkillLevel, string> = {\n beginner: 'Beginner',\n intermediate: 'Intermediate',\n advanced: 'Advanced',\n expert: 'Expert',\n};\n\nexport interface Skill {\n id: string;\n name: string;\n category: SkillCategory;\n level: SkillLevel;\n yearsOfExperience?: number;\n icon?: string;\n color?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// TESTIMONIALS\n// ============================================================================\n\nexport interface Testimonial {\n id: string;\n authorName: string;\n authorTitle?: string;\n authorCompany?: string;\n authorAvatar?: string;\n authorLinkedin?: string;\n content: string;\n shortContent?: string;\n rating?: number;\n projectName?: string;\n projectUrl?: string;\n date?: Timestamp;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// HOOK OPTIONS & RESULTS\n// ============================================================================\n\nexport interface UseCommonFeatureOptions {\n autoFetch?: boolean;\n realtime?: boolean;\n}\n\nexport interface UseCommonFeatureResult<T> {\n data: T | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCommonFeaturesListResult<T> {\n data: T[];\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n// ============================================================================\n// FETCH OPTIONS\n// ============================================================================\n\nexport interface FetchSocialLinksOptions {\n showIn?: ('footer' | 'contact' | 'about' | 'header')[];\n activeOnly?: boolean;\n}\n\nexport interface FetchServicesOptions {\n category?: ServiceCategory;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n}\n\nexport interface FetchSkillsOptions {\n category?: SkillCategory;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n}\n\nexport interface FetchTestimonialsOptions {\n activeOnly?: boolean;\n featuredOnly?: boolean;\n limit?: number;\n}\n\nexport interface FetchPaymentOptionsOptions {\n activeOnly?: boolean;\n type?: PaymentType;\n}\n\n// ============================================================================\n// PROJECTS / PORTFOLIO\n// ============================================================================\n\nexport type ProjectStatus = 'completed' | 'in-progress' | 'planned' | 'archived';\n\nexport const PROJECT_STATUS_NAMES: Record<ProjectStatus, string> = {\n completed: 'Completed',\n 'in-progress': 'In Progress',\n planned: 'Planned',\n archived: 'Archived',\n};\n\nexport type ProjectCategory =\n | 'web-app'\n | 'mobile-app'\n | 'desktop-app'\n | 'api'\n | 'library'\n | 'cli-tool'\n | 'browser-extension'\n | 'extension'\n | 'full-stack'\n | 'open-source'\n | 'client-work'\n | 'personal'\n | 'other';\n\nexport const PROJECT_CATEGORY_NAMES: Record<ProjectCategory, string> = {\n 'web-app': 'Web Application',\n 'mobile-app': 'Mobile App',\n 'desktop-app': 'Desktop App',\n api: 'API / Backend',\n library: 'Library / Package',\n 'cli-tool': 'CLI Tool',\n 'browser-extension': 'Browser Extension',\n extension: 'Extension',\n 'full-stack': 'Full Stack',\n 'open-source': 'Open Source',\n 'client-work': 'Client Work',\n personal: 'Personal Project',\n other: 'Other',\n};\n\nexport interface ProjectLink {\n type: 'live' | 'github' | 'demo' | 'docs' | 'playstore' | 'appstore' | 'npm' | 'other';\n url: string;\n label?: string;\n}\n\nexport interface Project {\n id: string;\n title: string;\n slug: string;\n description: string;\n shortDescription?: string;\n category: ProjectCategory;\n status: ProjectStatus;\n thumbnailUrl?: string;\n images?: string[];\n technologies: string[];\n features?: string[];\n links?: ProjectLink[];\n clientName?: string;\n startDate?: string;\n endDate?: string;\n isActive: boolean;\n isFeatured: boolean;\n order: number;\n updatedAt: Timestamp;\n}\n\nexport interface FetchProjectsOptions {\n category?: ProjectCategory;\n status?: ProjectStatus;\n activeOnly?: boolean;\n featuredOnly?: boolean;\n limit?: number;\n}\n","/**\n * Feature Flags Types\n *\n * Type definitions for the shared-features feature flags system.\n * Feature flags allow breaking changes to be versioned, enabling consumers\n * to upgrade at their own pace without breaking existing implementations.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport type { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// FEATURE IDENTIFIERS\n// ============================================================================\n\n/**\n * All available features in shared-features\n */\nexport type FeatureId =\n | 'campaigns'\n | 'broadcasts'\n | 'contactInfo'\n | 'developerInfo'\n | 'socialLinks'\n | 'paymentOptions'\n | 'addressInfo'\n | 'services'\n | 'skills'\n | 'testimonials'\n | 'projects';\n\n/**\n * Feature names for display\n */\nexport const FEATURE_NAMES: Record<FeatureId, string> = {\n campaigns: 'Advertising Campaigns',\n broadcasts: 'Broadcasts & Notifications',\n contactInfo: 'Contact Information',\n developerInfo: 'Developer Information',\n socialLinks: 'Social Links',\n paymentOptions: 'Payment Options',\n addressInfo: 'Address Information',\n services: 'Services',\n skills: 'Skills',\n testimonials: 'Testimonials',\n projects: 'Portfolio Projects',\n};\n\n// ============================================================================\n// FEATURE CONFIGURATION\n// ============================================================================\n\n/**\n * Configuration for a single feature\n */\nexport interface FeatureConfig {\n /** Whether the feature is globally enabled */\n enabled: boolean;\n\n /** Current version of this feature's API */\n version: number;\n\n /** Minimum version required (older versions will get deprecation warnings) */\n minVersion: number;\n\n /** Maximum supported version */\n maxVersion: number;\n\n /** Optional deprecation message for older versions */\n deprecationMessage?: string;\n\n /** Whether this feature requires authentication */\n requiresAuth?: boolean;\n\n /** Platforms this feature is available on (empty = all) */\n availablePlatforms?: string[];\n\n /** Projects this feature is available for (empty = all) */\n availableProjects?: string[];\n}\n\n/**\n * All feature configurations stored in Firestore\n */\nexport type FeatureConfigs = Record<FeatureId, FeatureConfig>;\n\n// ============================================================================\n// FIRESTORE DOCUMENT\n// ============================================================================\n\n/**\n * Feature flags document stored in Firestore (zaions_feature_flags/main)\n */\nexport interface FeatureFlagsDocument {\n /** Document ID (always 'main') */\n id: string;\n\n /** Global kill switch - disables all shared-features */\n globalEnabled: boolean;\n\n /** Current global API version (e.g., 'v1', 'v2') */\n currentApiVersion: string;\n\n /** Supported API versions (for backwards compatibility) */\n supportedApiVersions: string[];\n\n /** Individual feature configurations */\n features: FeatureConfigs;\n\n /** Maintenance mode - shows maintenance message to users */\n maintenanceMode: boolean;\n\n /** Maintenance message to display */\n maintenanceMessage?: string;\n\n /** Expected maintenance end time */\n maintenanceEndTime?: Timestamp;\n\n /** Last updated timestamp */\n updatedAt: Timestamp;\n\n /** Who last updated the flags */\n updatedBy: string;\n}\n\n// ============================================================================\n// CONSUMER CONFIGURATION\n// ============================================================================\n\n/**\n * Feature version preferences for a consumer project\n * Used during initialization to specify which versions to use\n */\nexport interface ConsumerFeatureVersions {\n /** Campaigns API version (default: latest) */\n campaigns?: number;\n\n /** Broadcasts API version (default: latest) */\n broadcasts?: number;\n\n /** Contact info API version (default: latest) */\n contactInfo?: number;\n\n /** Developer info API version (default: latest) */\n developerInfo?: number;\n\n /** Social links API version (default: latest) */\n socialLinks?: number;\n\n /** Payment options API version (default: latest) */\n paymentOptions?: number;\n\n /** Address info API version (default: latest) */\n addressInfo?: number;\n\n /** Services API version (default: latest) */\n services?: number;\n\n /** Skills API version (default: latest) */\n skills?: number;\n\n /** Testimonials API version (default: latest) */\n testimonials?: number;\n\n /** Projects API version (default: latest) */\n projects?: number;\n}\n\n// ============================================================================\n// FEATURE CHECK RESULTS\n// ============================================================================\n\n/**\n * Result of checking if a feature is available\n */\nexport interface FeatureAvailability {\n /** Whether the feature is available for use */\n available: boolean;\n\n /** Whether the feature is enabled globally */\n enabled: boolean;\n\n /** Current feature version */\n version: number;\n\n /** Whether the consumer's version is deprecated */\n deprecated: boolean;\n\n /** Deprecation warning message if applicable */\n deprecationWarning?: string;\n\n /** Reason why feature is unavailable (if not available) */\n unavailableReason?: string;\n\n /** Whether an upgrade is required */\n upgradeRequired: boolean;\n\n /** Message about available upgrade */\n upgradeMessage?: string;\n}\n\n/**\n * Overall status of shared-features for a consumer\n */\nexport interface SharedFeaturesStatus {\n /** Whether shared-features is operational */\n operational: boolean;\n\n /** Whether in maintenance mode */\n maintenanceMode: boolean;\n\n /** Maintenance message if applicable */\n maintenanceMessage?: string;\n\n /** Global API version */\n apiVersion: string;\n\n /** Individual feature availabilities */\n features: Record<FeatureId, FeatureAvailability>;\n\n /** List of deprecated features being used */\n deprecatedFeatures: FeatureId[];\n\n /** List of features requiring upgrade */\n upgradeRequiredFeatures: FeatureId[];\n\n /** When status was last fetched */\n fetchedAt: Date;\n}\n\n// ============================================================================\n// ADMIN TYPES\n// ============================================================================\n\n/**\n * Input for updating a feature's configuration\n */\nexport interface UpdateFeatureConfigInput {\n featureId: FeatureId;\n enabled?: boolean;\n version?: number;\n minVersion?: number;\n maxVersion?: number;\n deprecationMessage?: string;\n requiresAuth?: boolean;\n availablePlatforms?: string[];\n availableProjects?: string[];\n}\n\n/**\n * Input for updating global flags\n */\nexport interface UpdateGlobalFlagsInput {\n globalEnabled?: boolean;\n currentApiVersion?: string;\n supportedApiVersions?: string[];\n maintenanceMode?: boolean;\n maintenanceMessage?: string;\n maintenanceEndTime?: Date | null;\n}\n\n// ============================================================================\n// HOOK OPTIONS AND RESULTS\n// ============================================================================\n\n/**\n * Options for useFeatureFlags hook\n */\nexport interface UseFeatureFlagsOptions {\n /** Whether to auto-refresh flags periodically */\n autoRefresh?: boolean;\n\n /** Refresh interval in milliseconds (default: 5 minutes) */\n refreshInterval?: number;\n\n /** Whether to fetch immediately on mount (default: true) */\n autoFetch?: boolean;\n}\n\n/**\n * Result of useFeatureFlags hook\n */\nexport interface UseFeatureFlagsResult {\n /** Overall status of shared-features */\n status: SharedFeaturesStatus | null;\n\n /** Whether flags are being fetched */\n loading: boolean;\n\n /** Error message if fetch failed */\n error: string | null;\n\n /** Refetch feature flags */\n refetch: () => Promise<void>;\n\n /** Check if a specific feature is available */\n isFeatureAvailable: (featureId: FeatureId) => boolean;\n\n /** Get availability details for a feature */\n getFeatureAvailability: (featureId: FeatureId) => FeatureAvailability | null;\n\n /** Check if any features are deprecated */\n hasDeprecatedFeatures: boolean;\n\n /** Check if any features require upgrade */\n hasUpgradeRequired: boolean;\n}\n\n// ============================================================================\n// DEFAULT VALUES\n// ============================================================================\n\n/**\n * Default feature configuration for new features\n */\nexport const DEFAULT_FEATURE_CONFIG: FeatureConfig = {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n};\n\n/**\n * Default feature flags document\n */\nexport const DEFAULT_FEATURE_FLAGS: Omit<\n FeatureFlagsDocument,\n 'updatedAt' | 'updatedBy'\n> = {\n id: 'main',\n globalEnabled: true,\n currentApiVersion: 'v1',\n supportedApiVersions: ['v1'],\n maintenanceMode: false,\n features: {\n campaigns: {\n enabled: true,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n broadcasts: {\n enabled: true,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n contactInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n developerInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n socialLinks: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n paymentOptions: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n addressInfo: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n services: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n skills: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n testimonials: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n projects: {\n enabled: false,\n version: 1,\n minVersion: 1,\n maxVersion: 1,\n },\n },\n};\n\n// ============================================================================\n// COLLECTION NAME\n// ============================================================================\n\n/**\n * Firestore collection name for feature flags\n */\nexport const COLLECTION_FEATURE_FLAGS = 'zaions_feature_flags';\n\n/**\n * Document ID for the main feature flags document\n */\nexport const FEATURE_FLAGS_DOC_ID = 'main';\n"],"names":["COMMON_FEATURE_COLLECTIONS"],"mappings":"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"}
|
package/dist/hooks/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const useCommonFeatures = require("../useCommonFeatures-
|
|
4
|
-
const useFeatureFlags = require("../useFeatureFlags-
|
|
3
|
+
const useCommonFeatures = require("../useCommonFeatures-CWqe4EhH.cjs");
|
|
4
|
+
const useFeatureFlags = require("../useFeatureFlags-9_E7gair.cjs");
|
|
5
5
|
exports.useAddressInfo = useCommonFeatures.useAddressInfo;
|
|
6
6
|
exports.useCampaign = useCommonFeatures.useCampaign;
|
|
7
7
|
exports.useCampaigns = useCommonFeatures.useCampaigns;
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { u, a, b, c, d, e, f, g, h, i, j, k, l, m } from "../useCommonFeatures-
|
|
2
|
-
import { u as u2, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2, j as j2, k as k2 } from "../useFeatureFlags-
|
|
1
|
+
import { u, a, b, c, d, e, f, g, h, i, j, k, l, m } from "../useCommonFeatures-CnmI83Er.js";
|
|
2
|
+
import { u as u2, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2, j as j2, k as k2 } from "../useFeatureFlags-DhIb0HYi.js";
|
|
3
3
|
export {
|
|
4
4
|
u as useAddressInfo,
|
|
5
5
|
u2 as useAnnouncementModal,
|
|
@@ -2,9 +2,9 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import { useRef, useEffect, useCallback, useState } from "react";
|
|
3
3
|
import { Box, IconButton, Flex, Text, Button, Card, Badge, Link, Dialog, Heading, Checkbox, Grid, Separator, Avatar } from "@radix-ui/themes";
|
|
4
4
|
import { Cross2Icon } from "@radix-ui/react-icons";
|
|
5
|
-
import { a as useCampaign, e as useOneTimeAdModal, m as useUpdateAdModal, b as useCampaigns, u as useAddressInfo, c as useContactInfo, d as useDeveloperInfo, i as useServices, j as useSkills, k as useSocialLinks, l as useTestimonials } from "./useCommonFeatures-
|
|
5
|
+
import { a as useCampaign, e as useOneTimeAdModal, m as useUpdateAdModal, b as useCampaigns, u as useAddressInfo, c as useContactInfo, d as useDeveloperInfo, i as useServices, j as useSkills, k as useSocialLinks, l as useTestimonials } from "./useCommonFeatures-CnmI83Er.js";
|
|
6
6
|
import { Sparkles, X, ExternalLink, Check, Gift, Play, Quote, ChevronLeft, ChevronRight, Megaphone, CheckCircle, AlertTriangle, AlertCircle, Info, Bell, MapPin, Mail, Phone, MessageCircle, Globe, Github, Linkedin, Briefcase, Star, Code, Twitter } from "lucide-react";
|
|
7
|
-
import { R as isInitialized, E as getConfig } from "./commonFeatures-
|
|
7
|
+
import { R as isInitialized, E as getConfig } from "./commonFeatures-LzPnbR6z.js";
|
|
8
8
|
function AdPanel({
|
|
9
9
|
placement,
|
|
10
10
|
variant: _variant = "small_panel_2",
|
|
@@ -2048,4 +2048,4 @@ export {
|
|
|
2048
2048
|
getLargePanelVariant as q,
|
|
2049
2049
|
getSmallPanelVariant as r
|
|
2050
2050
|
};
|
|
2051
|
-
//# sourceMappingURL=index-
|
|
2051
|
+
//# sourceMappingURL=index-D2YWycum.js.map
|