Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .github/workflows/ios-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Build iOS App

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
workflow_dispatch:

jobs:
build-ios:
runs-on: macos-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'

- name: Install Meteor
run: |
curl https://install.meteor.com/ | sh

- name: Install dependencies
run: |
meteor npm install

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Install iOS Simulator
run: |
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcrun simctl list devicetypes

- name: Add iOS platform
run: |
meteor add-platform ios

- name: Build iOS app
run: |
meteor build ../build --server=https://timeharbor-app.meteorapp.com

- name: Archive iOS app
run: |
cd ../build/ios/project
xcodebuild archive \
-workspace TimeHarbor.xcworkspace \
-scheme TimeHarbor \
-configuration Release \
-archivePath ../TimeHarbor.xcarchive \
CODE_SIGNING_ALLOWED=NO

- name: Export IPA
run: |
cd ../build/ios
xcodebuild -exportArchive \
-archivePath TimeHarbor.xcarchive \
-exportPath . \
-exportOptionsPlist exportOptions.plist

- name: Create export options
run: |
cd ../build/ios
cat > exportOptions.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>development</string>
<key>teamID</key>
<string>\${APPLE_TEAM_ID}</string>
<key>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
</dict>
</plist>
EOF

- name: Upload iOS build artifacts
uses: actions/upload-artifact@v4
with:
name: ios-build
path: |
../build/ios/*.ipa
../build/ios/project/
retention-days: 30

- name: Upload build logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: ios-build-logs
path: |
../build/ios/project/*.log
~/.meteor/logs/
retention-days: 7
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@
node_modules/
.meteor/local/
.meteor/meteorite/

# Build artifacts
*.ipa
*.app
*.xcarchive
build/

# iOS specific
ios/
cordova-platforms/
cordova-plugins/

# Development files
.DS_Store
*.log

# Certificates and keys (never commit these!)
*.p12
*.pem
*.mobileprovision
*.certSigningRequest
10 changes: 8 additions & 2 deletions .meteor/packages
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,15 @@ ecmascript@0.16.10 # Enable ECMAScript2015+ syntax in app code
typescript@5.6.3 # Enable TypeScript syntax in .ts and .tsx modules
shell-server@0.6.1 # Server-side component of the `meteor shell` command



hot-module-replacement@0.5.4 # Update code in development without reloading the page
blaze-hot # Update files using Blaze's API with HMR
accounts-base
accounts-password

# Push notifications for mobile
push
raix:push

# Mobile/Cordova support
mobile-status-bar
launch-screen
1 change: 1 addition & 0 deletions .meteor/platforms
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
server
browser
ios
120 changes: 119 additions & 1 deletion client/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,122 @@
@import "tailwindcss";
@plugin "daisyui";

/* You can add custom styles below if needed */
/* Mobile-specific enhancements */
@media (max-width: 768px) {
.navbar {
padding: 0.5rem 1rem;
}

.navbar .flex-1 h2 {
font-size: 1.5rem;
}

.navbar nav {
gap: 0.5rem;
}

.navbar nav .btn {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
}

.container {
padding-left: 1rem;
padding-right: 1rem;
}

.card {
margin-bottom: 1rem;
}

/* Improve touch targets for mobile */
.btn {
min-height: 44px;
min-width: 44px;
}

.input {
min-height: 44px;
}

.checkbox {
min-height: 20px;
min-width: 20px;
}

/* Better spacing for mobile forms */
.form-control {
margin-bottom: 1rem;
}

/* Improve readability */
.text-xl {
font-size: 1.25rem;
}

.text-2xl {
font-size: 1.5rem;
}
}

/* iOS safe area support */
@supports (padding-top: env(safe-area-inset-top)) {
.navbar {
padding-top: calc(0.5rem + env(safe-area-inset-top));
}

body {
padding-bottom: env(safe-area-inset-bottom);
}

/* Bottom navigation safe area */
nav[class*="bottom"] {
padding-bottom: calc(0.5rem + env(safe-area-inset-bottom));
}
}

/* Mobile bottom navigation styling */
@media (max-width: 768px) {
.fixed.bottom-0 nav {
border-top: 1px solid rgba(255, 255, 255, 0.1);
}

.fixed.bottom-0 nav .btn {
border-radius: 0;
font-size: 0.75rem;
}
}

/* Mobile menu overlay */
#mobileMenuOverlay {
z-index: 9999;
}

#mobileMenuOverlay > div {
transform: translateX(100%);
transition: transform 0.3s ease-in-out;
}

#mobileMenuOverlay:not(.hidden) > div {
transform: translateX(0);
}

/* Custom styles for notification preferences */
.notification-settings {
max-width: 100%;
overflow-x: hidden;
}

.notification-settings .checkbox {
margin-right: 0.75rem;
}

.notification-settings .label {
align-items: flex-start;
padding: 0.5rem 0;
}

/* Ensure proper touch scrolling on iOS */
.overflow-auto {
-webkit-overflow-scrolling: touch;
}
Loading