Jose Olarte III ae49c0e907 feat(ios): implement native share target for images
Implement iOS Share Extension to enable native image sharing from Photos
and other apps directly into TimeSafari. Users can now share images from
the iOS share sheet, which will open in SharedPhotoView for use as gifts
or profile pictures.

iOS Native Implementation:
- Add TimeSafariShareExtension target with ShareViewController
- Configure App Groups for data sharing between extension and main app
- Implement ShareViewController to process shared images and convert to base64
- Store shared image data in App Group UserDefaults
- Add ShareImageBridge utility to read shared data from App Group
- Update AppDelegate to handle shared-photo deep link and bridge data to JS

JavaScript Integration:
- Add checkAndStoreNativeSharedImage() in main.capacitor.ts to read shared
  images from native layer via temporary file bridge
- Convert base64 data to data URL format for compatibility with base64ToBlob
- Integrate with existing SharedPhotoView component
- Add "shared-photo" to deep link validation schema

Build System:
- Integrate Xcode 26 / CocoaPods compatibility workaround into build-ios.sh
- Add run_pod_install_with_workaround() for explicit pod install
- Add run_cap_sync_with_workaround() for Capacitor sync (which runs pod
  install internally)
- Automatically detect project format version 70 and apply workaround
- Remove standalone pod-install-workaround.sh script

Code Cleanup:
- Remove verbose debug logs from ShareViewController, AppDelegate, and
  main.capacitor.ts
- Retain essential logger calls for production debugging

Documentation:
- Add ios-share-extension-setup.md with manual Xcode setup instructions
- Add ios-share-extension-git-commit-guide.md for version control best practices
- Add ios-share-implementation-status.md tracking implementation progress
- Add native-share-target-implementation.md with overall architecture
- Add xcode-26-cocoapods-workaround.md documenting the compatibility issue

The implementation uses a temporary file bridge (AppDelegate writes to Documents
directory, JS reads via Capacitor Filesystem plugin) as a workaround for
Capacitor plugin auto-discovery issues. This can be improved in the future by
properly registering ShareImagePlugin in Capacitor's plugin registry.
2025-11-24 20:46:58 +08:00
2025-09-12 08:19:42 +00:00
2022-11-16 14:48:22 +08:00
2025-08-24 05:47:24 +00:00
2024-12-08 21:22:03 -07:00
2022-11-27 14:16:57 +08:00

TimeSafari.app - Crowd-Funder for Time - PWA

Time Safari allows people to ease into collaboration: start with expressions of gratitude and expand to crowd-fund with time & money, then record and see the impact of contributions.

Roadmap

See ClickUp for current priorities.

Setup & Building

Quick start:

  • For setup, we recommend pkgx, which installs what you need (either automatically or with the dev command). Core dependencies are typescript & npm; when building for other platforms, you'll need other things such as those in the pkgx.yaml & BUILDING.md files.
npm install
npm run build:web:serve -- --test

To be able to take action on the platform: go to the test page and click "Become User 0".

See BUILDING.md for comprehensive build instructions for all platforms (Web, Electron, iOS, Android, Docker).

🛡️ Build Architecture Guard

This project uses Husky Git hooks to protect the build system architecture. When you modify build-critical files, the system automatically blocks commits until you update BUILDING.md.

Quick Setup

npm run guard:setup  # Install and activate the guard

How It Works

  • Pre-commit: Blocks commits if build files changed without BUILDING.md updates
  • Pre-push: Blocks pushes if commits contain undocumented build changes
  • Protected paths: scripts/, vite.config.*, electron/, android/, ios/, etc.

Usage

# Test the guard manually
npm run guard:test

# Emergency bypass (use sparingly)
git commit --no-verify
git push --no-verify

📚 Full documentation: See doc/README-BUILD-GUARD.md

Development Database Clearing

TimeSafari provides a simple script-based approach to clear the local database (not the claim server) for development purposes.

Logging Configuration

TimeSafari supports configurable logging levels via the VITE_LOG_LEVEL environment variable. This allows developers to control console output verbosity without modifying code.

Quick Usage

# Show only errors
VITE_LOG_LEVEL=error npm run build:web:dev

# Show warnings and errors
VITE_LOG_LEVEL=warn npm run build:web:dev

# Show info, warnings, and errors (default)
VITE_LOG_LEVEL=info npm run build:web:dev

# Show all log levels including debug
VITE_LOG_LEVEL=debug npm run build:web:dev

Available Levels

  • error: Critical errors only
  • warn: Warnings and errors (default for production web)
  • info: Info, warnings, and errors (default for development/capacitor)
  • debug: All log levels including verbose debugging

See Logging Configuration Guide for complete details.

Quick Usage

# Run the database clearing script
./scripts/clear-database.sh

# Then restart your development server
npm run build:electron:dev  # For Electron
npm run build:web:dev       # For Web

What It Does

Electron (Desktop App)

  • Automatically finds and clears the SQLite database files
  • Works on Linux, macOS, and Windows
  • Clears all data and forces fresh migrations on next startup

Web Browser

  • Provides instructions for using custom browser data directories
  • Shows manual clearing via browser DevTools
  • Ensures reliable database clearing without browser complications

Safety Features

  • Interactive Script: Guides you through the process
  • Platform Detection: Automatically detects your OS
  • Clear Instructions: Step-by-step guidance for each platform
  • Safe Paths: Only clears TimeSafari-specific data

Manual Commands (if needed)

Electron Database Location

# Linux
rm -rf ~/.config/TimeSafari/*

# macOS  
rm -rf ~/Library/Application\ Support/TimeSafari/*

# Windows
rmdir /s /q %APPDATA%\TimeSafari

Web Browser (Custom Data Directory)

# Create isolated browser profile
mkdir ~/timesafari-dev-data

Domain Configuration

TimeSafari uses a centralized domain configuration system to ensure consistent URL generation across all environments. This prevents localhost URLs from appearing in shared links during development.

Key Features

  • Production URLs for Sharing: All copy link buttons use production domain
  • Environment-Specific Internal URLs: Internal operations use appropriate environment URLs
  • Single Point of Control: Change domain in one place for entire app
  • Type-Safe Configuration: Full TypeScript support

Quick Reference

// For sharing functionality (environment-specific)
import { APP_SERVER } from "@/constants/app";
const shareLink = `${APP_SERVER}/deep-link/claim/123`;

// For internal operations (environment-specific)
import { APP_SERVER } from "@/constants/app";
const apiUrl = `${APP_SERVER}/api/claim/123`;

Documentation

Tests

See TESTING.md for detailed test instructions.

Asset Management

TimeSafari uses a standardized asset configuration system for consistent icon and splash screen generation across all platforms.

Asset Sources

  • Single source of truth: resources/ directory (Capacitor default)
  • Source files: icon.png, splash.png, splash_dark.png
  • Format: PNG or SVG files for optimal quality

Asset Generation

  • Configuration: config/assets/capacitor-assets.config.json
  • Schema validation: config/assets/schema.json
  • Build-time generation: Platform assets generated via capacitor-assets
  • No VCS commits: Generated assets are never committed to version control

Development Commands

# Generate/update asset configurations
npm run assets:config

# Validate asset configurations
npm run assets:validate

# Clean generated platform assets (local dev only)
npm run assets:clean

# Build with asset generation
npm run build:native

Environment Setup & Dependencies

Before building the application, ensure your development environment is properly configured:

# Install all dependencies (required first time and after updates)
npm install

# Validate your development environment
npm run check:dependencies

# Check prerequisites for testing
npm run test:prerequisites

Common Issues & Solutions:

  • "tsx: command not found": Run npm install to install devDependencies
  • "capacitor-assets: command not found": Ensure @capacitor/assets is installed
  • Build failures: Run npm run check:dependencies to diagnose environment issues

Required Versions:

  • Node.js: 18+ (LTS recommended)
  • npm: 8+ (comes with Node.js)
  • Platform-specific tools: Android Studio, Xcode (for mobile builds)

Platform Support

  • Android: Adaptive icons with foreground/background, monochrome support
  • iOS: LaunchScreen storyboard preferred, splash assets when needed
  • Web: PWA icons generated during build to dist/ (not committed)

Font Awesome Icons

To add a Font Awesome icon, add to fontawesome.ts and reference with font-awesome element and icon attribute with the hyphenated name.

Other

Reference Material

  • Notifications can be type of toast (self-dismiss), info, success, warning, and danger. They are done via notiwind and set up in App.vue.

  • Customize Vue configuration.

  • If you are deploying in a subdirectory, add it to publicPath in vue.config.js, eg: publicPath: "/app/time-tracker/",

Code Organization

The project uses a centralized approach to type definitions and interfaces:

  • src/interfaces/ - Contains all TypeScript interfaces and type definitions
    • deepLinks.ts - Deep linking type system and Zod validation schemas
    • give.ts - Give-related interfaces and type definitions
    • claims.ts - Claim-related interfaces and verifiable credentials
    • common.ts - Shared interfaces and utility types
    • Other domain-specific interface files

Key principles:

  • All interfaces and types are defined in the interfaces folder
  • Zod schemas are used for runtime validation and type generation
  • Domain-specific interfaces are separated into their own files
  • Common interfaces are shared through common.ts
  • Type definitions are generated from Zod schemas where possible

Database Architecture

The application uses a platform-agnostic database layer with Vue mixins for service access:

  • src/services/PlatformService.ts - Database interface definition
  • src/services/PlatformServiceFactory.ts - Platform-specific service factory
  • src/services/AbsurdSqlDatabaseService.ts - SQLite implementation
  • src/utils/PlatformServiceMixin.ts - Vue mixin for database access with caching
  • src/db/ - Legacy Dexie database (migration in progress)

Development Guidelines:

  • Always use PlatformServiceMixin for database operations in components
  • Test with PlatformServiceMixin for new features
  • Use migration tools for data transfer between systems
  • Leverage mixin's ultra-concise methods: $db(), $exec(), $one(), $contacts(), $settings()

Architecture Decision: The project uses Vue mixins over Composition API composables for platform service access. See Architecture Decisions for detailed rationale.

📁 Project Structure

timesafari/
├── 📁 src/              # Source code
├── 📁 scripts/          # Build and automation scripts
├── 📁 electron/         # Electron configuration
├── 📁 android/          # Android configuration  
├── 📁 ios/              # iOS configuration
├── 📁 .husky/           # Git hooks (Build Architecture Guard)
├── 📄 BUILDING.md       # Build system documentation
├── 📄 pull_request_template.md # PR template
└── 📄 doc/README-BUILD-GUARD.md # Guard system documentation

Known Issues

Critical Vue Reactivity Bug

A critical Vue reactivity bug was discovered during ActiveDid migration testing where component properties fail to trigger template updates correctly.

Impact: The newDirectOffersActivityNumber element in HomeView.vue requires a watcher workaround to render correctly.

Status: Workaround implemented, investigation ongoing.

Documentation: See Vue Reactivity Bug Report for details.

🤝 Contributing

  1. Follow the Build Architecture Guard - Update BUILDING.md when modifying build files
  2. Use the PR template - Complete the checklist for build-related changes
  3. Test your changes - Ensure builds work on affected platforms
  4. Document updates - Keep BUILDING.md current and accurate

Kudos

Gifts make the world go 'round!

Description
No description provided
Readme 29 MiB
Languages
Vue 49.4%
JavaScript 42.9%
TypeScript 7.4%
Shell 0.2%