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.
 
 
 
 
 
 

5.5 KiB

Domain Configuration System

Author: Matthew Raymer
Date: 2025-01-27
Status: UPDATED - Simplified to use APP_SERVER for all functionality

Overview

TimeSafari uses a centralized domain configuration system to ensure consistent URL generation across all environments. This system provides a single point of control for domain changes and uses environment-specific configuration for all functionality including sharing.

Problem Solved

Issue: Inconsistent Domain Usage

Previously, the system used separate constants for different types of URLs:

  • Internal Operations: Used APP_SERVER (environment-specific)
  • Sharing: Used separate constants (removed)

This created complexity and confusion about when to use which constant.

Solution: Unified Domain Configuration

All functionality now uses the APP_SERVER constant, which provides environment-specific URLs that can be configured per environment.

Implementation

Core Configuration

The domain configuration is centralized in src/constants/app.ts:

export enum AppString {
  // ... other constants ...
  PROD_PUSH_SERVER = "https://timesafari.app",
  // ... other constants ...
}

// Environment-specific server URL for all functionality
export const APP_SERVER =
  import.meta.env.VITE_APP_SERVER || "https://timesafari.app";

Usage Pattern

All components that generate URLs follow this pattern:

import { APP_SERVER } from "@/constants/app";

// In component class
APP_SERVER = APP_SERVER;

// In methods
const deepLink = `${APP_SERVER}/deep-link/claim/${claimId}`;

Components Updated

The following components and services use APP_SERVER:

Views

  • ClaimView.vue - Claim and certificate links
  • ProjectViewView.vue - Project copy links
  • ConfirmGiftView.vue - Confirm gift deep links
  • UserProfileView.vue - Profile copy links
  • InviteOneView.vue - Invite link generation
  • ContactsView.vue - Contact import links
  • OnboardMeetingSetupView.vue - Meeting members links

Components

  • HiddenDidDialog.vue - Hidden DID dialog links

Services

  • endorserServer.ts - Contact import confirm links

Configuration Management

Environment-Specific Configuration

The system uses environment variables to configure domains:

# Development
VITE_APP_SERVER=http://localhost:8080

# Test
VITE_APP_SERVER=https://test.timesafari.app

# Production
VITE_APP_SERVER=https://timesafari.app

Changing the Domain

To change the domain for all functionality:

  1. Update environment variables for the target environment:

    VITE_APP_SERVER=https://your-new-domain.com
    
  2. Rebuild the application for all platforms:

    npm run build:web
    npm run build:capacitor  
    npm run build:electron
    

Benefits

Simplified Configuration

  • Single constant for all URL generation
  • No confusion about which constant to use
  • Consistent behavior across all functionality

Environment Flexibility

  • Easy to configure different domains per environment
  • Support for development, test, and production environments
  • Environment-specific sharing URLs when needed

Maintainability

  • Single source of truth for domain configuration
  • Easy to change domain across entire application
  • Clear pattern for implementing new URL functionality

Developer Experience

  • Simple, consistent pattern for URL generation
  • Clear documentation and examples
  • Type-safe configuration with TypeScript

Testing

Manual Testing

  1. Development Environment:

    npm run dev
    # Navigate to any page with copy link buttons
    # Verify links use configured domain
    
  2. Production Build:

    npm run build:web
    # Deploy and test sharing functionality
    # Verify all links work correctly
    

Automated Testing

The implementation includes comprehensive linting to ensure:

  • All components properly import APP_SERVER
  • No hardcoded URLs in functionality
  • Consistent usage patterns across the codebase

Implementation Pattern

Current Approach

// ✅ Single constant for all functionality
import { APP_SERVER } from "@/constants/app";
const shareLink = `${APP_SERVER}/deep-link/claim/123`;
const apiUrl = `${APP_SERVER}/api/claim/123`;

Future Enhancements

Potential Improvements

  1. Environment-Specific Sharing Domains:

    export const getShareDomain = () => {
      if (import.meta.env.PROD) {
        return AppString.PROD_PUSH_SERVER;
      }
      return AppString.TEST1_PUSH_SERVER; // Use test domain for dev sharing
    };
    
  2. Dynamic Domain Detection:

    export const SHARE_DOMAIN = 
      import.meta.env.VITE_SHARE_DOMAIN || AppString.PROD_PUSH_SERVER;
    
  3. Platform-Specific Domains:

    export const getPlatformShareDomain = () => {
      const platform = process.env.VITE_PLATFORM;
      switch (platform) {
        case 'web': return AppString.PROD_PUSH_SERVER;
        case 'capacitor': return AppString.PROD_PUSH_SERVER;
        case 'electron': return AppString.PROD_PUSH_SERVER;
        default: return AppString.PROD_PUSH_SERVER;
      }
    };
    

Last Updated: 2025-01-27
Version: 2.0
Maintainer: Matthew Raymer