diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..983c4b6
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,6 @@
+# Admin DID credentials
+ADMIN_DID=did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F
+ADMIN_PRIVATE_KEY=2b6472c026ec2aa2c4235c994a63868fc9212d18b58f6cbfe861b52e71330f5b
+
+# API Configuration
+ENDORSER_API_URL=https://test-api.endorser.ch/api/v2/claim
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
index 553ac75..0a908a2 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -5,30 +5,27 @@ module.exports = {
es2022: true,
},
extends: [
- "plugin:vue/vue3-essential",
+ "plugin:vue/vue3-recommended",
"eslint:recommended",
"@vue/typescript/recommended",
- "plugin:prettier/recommended",
+ "plugin:prettier/recommended"
],
// parserOptions: {
// ecmaVersion: 2020,
// },
rules: {
- "max-len": [
- "warn",
- {
- code: 120,
- ignoreComments: true, // why does this not make it allow comment of any length?
- ignorePattern: '^\\s*class="[^"]*"$',
- ignoreStrings: true,
- ignoreTemplateLiterals: true,
- ignoreTrailingComments: true,
- ignoreUrls: true,
- },
- ],
- "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
- "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
- // "prettier/prettier": ["warn", { printWidth: 120 }], // removes errors but adds thousands of warnings
- "@typescript-eslint/no-unnecessary-type-constraint": "off",
+ "max-len": ["warn", {
+ code: 100,
+ ignoreComments: true,
+ ignorePattern: '^\\s*class="[^"]*"$',
+ ignoreStrings: true,
+ ignoreTemplateLiterals: true,
+ ignoreUrls: true,
+ }],
+ "no-console": process.env.NODE_ENV === "production" ? "error" : "warn",
+ "no-debugger": process.env.NODE_ENV === "production" ? "error" : "warn",
+ "@typescript-eslint/no-explicit-any": "warn",
+ "@typescript-eslint/explicit-function-return-type": "off",
+ "@typescript-eslint/no-unnecessary-type-constraint": "off"
},
};
diff --git a/.gitignore b/.gitignore
index b2b3d50..bce3f91 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,4 +36,32 @@ pnpm-debug.log*
/playwright/.cache/
/dist-electron-build/
/dist-capacitor/
-/test-playwright-results/
\ No newline at end of file
+/test-playwright-results/
+playwright-tests
+test-playwright
+dist-electron-packages
+ios
+.ruby-version
++.env
+
+# Generated test files
+.generated/
+
+# Fastlane
+ios/fastlane/report.xml
+ios/fastlane/Preview.html
+ios/fastlane/screenshots
+ios/fastlane/test_output
+android/fastlane/report.xml
+android/fastlane/Preview.html
+android/fastlane/screenshots
+android/fastlane/test_output
+.env.default
+vendor/
+
+# Build logs
+build_logs/
+
+# Android generated assets
+android/app/src/main/assets/public/assets/
+
diff --git a/BUILDING.md b/BUILDING.md
index 1639bcd..a774c24 100644
--- a/BUILDING.md
+++ b/BUILDING.md
@@ -14,12 +14,14 @@ This guide explains how to build TimeSafari for different platforms.
## Initial Setup
1. Clone the repository:
+
```bash
git clone [repository-url]
cd TimeSafari
```
2. Install dependencies:
+
```bash
npm install
```
@@ -29,6 +31,7 @@ This guide explains how to build TimeSafari for different platforms.
To build for web deployment:
1. Run the production build:
+
```bash
npm run build
```
@@ -36,6 +39,7 @@ To build for web deployment:
2. The built files will be in the `dist` directory.
3. To test the production build locally:
+
```bash
npm run serve
```
@@ -45,11 +49,13 @@ To build for web deployment:
### Building for Linux
1. Build the electron app in production mode:
+
```bash
npm run build:electron-prod
```
2. Package the Electron app for Linux:
+
```bash
# For AppImage (recommended)
npm run electron:build-linux
@@ -65,12 +71,14 @@ To build for web deployment:
### Running the Packaged App
- AppImage: Make executable and run
+
```bash
chmod +x dist-electron-packages/TimeSafari-*.AppImage
./dist-electron-packages/TimeSafari-*.AppImage
```
- DEB: Install and run
+
```bash
sudo dpkg -i dist-electron-packages/timesafari_*_amd64.deb
timesafari
@@ -95,77 +103,164 @@ npm run build:electron-prod && npm run electron:start
Prerequisites: macOS with Xcode installed
1. Build the web assets:
- ```bash
- npm run build -- --mode capacitor
- ```
-2. Add iOS platform if not already added:
```bash
- npx cap add ios
+ npm run build:capacitor
```
-3. Update iOS project with latest build:
+2. Update iOS project with latest build:
+
```bash
npx cap sync ios
```
-4. Open the project in Xcode:
+3. Open the project in Xcode:
+
```bash
npx cap open ios
```
-5. Use Xcode to build and run on simulator or device.
+4. Use Xcode to build and run on simulator or device.
+
+If you have forked this to make your own app, you'll want to customize the ios files:
+
+ ```bash
+ rm -rf ios
+ npx cap add ios
+ ```
+
+... and then repeat the steps above.
+
### Android Build
Prerequisites: Android Studio with SDK installed
1. Build the web assets:
- ```bash
- npm run build -- --mode capacitor
- ```
-2. Add Android platform if not already added:
```bash
- npx cap add android
+ rm -rf dist
+ npm run build:web
+ npm run build:capacitor
```
-3. Update Android project with latest build:
+2. Update Android project with latest build:
+
```bash
npx cap sync android
```
-4. Open the project in Android Studio:
+3. Open the project in Android Studio:
+
```bash
npx cap open android
```
-5. Use Android Studio to build and run on emulator or device.
+3. Use Android Studio to build and run on emulator or device.
+
+If you have forked this to make your own app, you'll want to customize the android files:
+
+ ```bash
+ rm -rf android
+ npx cap add android
+ ```
-## Development
+... and then: repeat the steps above, and look below for the deep link configuration.
-To run the application in development mode:
+## Building Android from the console
-1. Start the development server:
```bash
- npm run dev
+ cd android
+ ./gradlew clean
+ ./gradlew build -Dlint.baselines.continue=true
+ cd ..
+ npx cap run android
+ ```
+
+## Configuring Android for deep links
+
+You must add the following intent filter to the `android/app/src/main/AndroidManifest.xml` file:
+
+ ```xml
+
+
+
+
+
+
+ ```
+
+You must also add the following to the `android/app/build.gradle` file:
+
+ ```gradle
+ android {
+ // ... existing config ...
+
+ lintOptions {
+ disable 'UnsanitizedFilenameFromContentProvider'
+ abortOnError false
+ baseline file("lint-baseline.xml")
+
+ // Ignore Capacitor module issues
+ ignore 'DefaultLocale'
+ ignore 'UnsanitizedFilenameFromContentProvider'
+ ignore 'LintBaseline'
+ ignore 'LintBaselineFixed'
+ }
+ }
```
+
+Modify `/android/build.gradle` to use a stable version of AGP and make sure Kotlin version is compatible.
+
+ ```gradle
+ buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ // Use a stable version of AGP
+ classpath 'com.android.tools.build:gradle:8.1.0'
+
+ // Make sure Kotlin version is compatible
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
+ }
+ }
+
+ allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ }
+
+ // Add this to handle version conflicts
+ configurations.all {
+ resolutionStrategy {
+ force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
+ force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0'
+ }
+ }
+ ```
+
## PyWebView Desktop Build
-### Prerequisites
+### Prerequisites for PyWebView
+
- Python 3.8 or higher
- pip (Python package manager)
- virtualenv (recommended)
- System dependencies:
+
```bash
# For Ubuntu/Debian
sudo apt-get install python3-webview
# or
sudo apt-get install python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit2-4.0
-
+
# For Arch Linux
sudo pacman -S webkit2gtk python-gobject python-cairo
-
+
# For Fedora
sudo dnf install python3-webview
# or
@@ -173,7 +268,9 @@ To run the application in development mode:
```
### Setup
+
1. Create and activate a virtual environment (recommended):
+
```bash
python -m venv .venv
source .venv/bin/activate # On Linux/macOS
@@ -182,6 +279,7 @@ To run the application in development mode:
```
2. Install Python dependencies:
+
```bash
pip install -r requirements.txt
```
@@ -189,13 +287,16 @@ To run the application in development mode:
### Troubleshooting
If encountering PyInstaller version errors:
+
```bash
# Try installing the latest stable version
pip install --upgrade pyinstaller
```
-### Development
+### Development of PyWebView
+
1. Start the PyWebView development build:
+
```bash
npm run pywebview:dev
```
@@ -203,26 +304,33 @@ pip install --upgrade pyinstaller
### Building for Distribution
#### Linux
+
```bash
npm run pywebview:package-linux
```
+
The packaged application will be in `dist/TimeSafari`
#### Windows
+
```bash
npm run pywebview:package-win
```
+
The packaged application will be in `dist/TimeSafari`
-#### macOS
+#### macOS
+
```bash
npm run pywebview:package-mac
```
+
The packaged application will be in `dist/TimeSafari`
## Testing
Run local tests:
+
```bash
npm run test-local
```
@@ -232,11 +340,13 @@ See [TESTING.md](test-playwright/TESTING.md) for more details.
## Linting
Check code style:
+
```bash
npm run lint
```
Fix code style issues:
+
```bash
npm run lint-fix
```
@@ -257,16 +367,20 @@ See `.env.*` files for configuration.
## Deployment
### Version Management
+
1. Update CHANGELOG.md with new changes
2. Update version in package.json
3. Commit changes and tag release:
+
```bash
git tag
git push origin
```
+
4. After deployment, update package.json with next version + "-beta"
### Test Server
+
```bash
# Build using staging environment
npm run build -- --mode staging
@@ -276,6 +390,7 @@ rsync -azvu -e "ssh -i ~/.ssh/" dist ubuntutest@test.timesafari.app:ti
```
### Production Server
+
```bash
# On the production server:
pkgx +npm sh
@@ -290,7 +405,7 @@ cd -
mv time-safari/dist time-safari-dist-prev.0 && mv crowd-funder-for-time-pwa/dist time-safari/
```
-## Troubleshooting
+## Troubleshooting Builds
### Common Build Issues
@@ -307,4 +422,3 @@ mv time-safari/dist time-safari-dist-prev.0 && mv crowd-funder-for-time-pwa/dist
- For iOS: Xcode command line tools must be installed
- For Android: Correct SDK version must be installed
- Check Capacitor configuration in capacitor.config.ts
-
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dfacfb8..c4c03a0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,269 +15,347 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [0.4.4] - 2025.02.17
-### Fixed
-- On production (due to data?) the search results would disappear after scrolling down. Now we don't show any results when going to the people map with a shortcut.
+### Fixed in 0.4.4
+
+- On production (due to data?) the search results would disappear after scrolling down. Now we don't show any results when going to the people map with a shortcut.
## [0.4.3] - 2025.02.17
-### Added
-- Discover query parameter searchPeople to go directly to the people map
+### Added in 0.4.3
+
+- Discover query parameter searchPeople to go directly to the people map
## [0.4.2] - 2025.02.17
+
### Added
-- Capacitor build to Android
+
+- Capacitor on iOS and Android
+
### Fixed
-- Path issues
+- Path issues
## [0.4.1] - 2025.02.16
-### Fixed
+
+### Fixed in 0.4.1
+
- nostr build issue
- Linting
-
## [0.4.0] - 2025.02.14
+
### Changed
+
- Images in the home feed now take up the full width of the card.
- Clicking the image previously, would open the image in a new tab. Now, clicking the image opens the image in a lightbox view.
-### Added
+
+### Added in 0.4.0
+
- Clicking an image also now displays an in-app lightbox view of the image.
- The lightbox view includes a download button for the image in mobile view.
-
## [0.3.57] - 2025.02.11
-### Added
-- Automatic user creation in onboarding meetings
+### Added in 0.3.57
+
+- Automatic user creation in onboarding meetings
## [0.3.55] - 2025.02.07
-### Added
-- End time for projects
+### Added in 0.3.55
+
+- End time for projects
## [0.3.54] - 2025.02.06
-### Added
-- Group onboarding meetings
+### Added in 0.3.54
+
+- Group onboarding meetings
## [0.3.53] - 2025.01.30
-### Added
-- Hints for contacting the creator of a project
+### Added in 0.3.53
+
+- Hints for contacting the creator of a project
## [0.3.52] - 2025.01.22
-### Fixed
-- User profile endpoint server for map was broken.
+### Fixed in 0.3.52
+
+- User profile endpoint server for map was broken.
## [0.3.51] - 2025.01.22
-### Fixed
-- User profile map jumped on first zoom.
+### Fixed in 0.3.51
+
+- User profile map jumped on first zoom.
## [0.3.50] - 2025.01.20 - b9fedcd3fd3e34c3fb0fc79150d1a81a76eaeb40
-### Added
-- User public profiles
+### Added in 0.3.50
+
+- User public profiles
## [0.3.49] - 2025.01.09 - 36301ed238ff84df25bb11a8d44a295ee7eaf0f8
-### Changed
+
+### Changed in 0.3.49
+
- Make all external contact links direct to the contact-import page.
- Handle all new-single-contact JWTs in the contacts page, and multiple-contact JWTs in the contacts-import page.
-
## [0.3.48] - 2025.01.08 - 398f3e64a376789f7eb1c400cd886f5a2cacd588 (but app shows 07c4e58)
-### Added
-- More sanity-checks on contact-import JWT
+### Added in 0.3.48
+
+- More sanity-checks on contact-import JWT
## [0.3.47] - 2025.01.06 - 5bf6dd1ee32ca7cc46d39bd7afca58365b422f93
-### Added
+
+### Added in 0.3.47
+
- Notes on contacts page with new contact-edit page
- Contact methods (only on contact-edit page and under DID details)
- DID view with no DID shows user's info.
-### Changed
+
+### Changed in 0.3.47
+
- URL for user's contact info is now URL to this app (not endorser.ch).
- Extended details (eg. full claim) is beneath details link on claim page.
-
## [0.3.46] - 2025.01.03 - 9e7056616b5e5acc51e5a8cf7354d408029fefb3
-### Added
+
+### Added in 0.3.46
+
- More action-oriented questions for the gift prompts
-### Fixed
-- Contact-list import set visibility for all, even if not chosen.
+### Fixed in 0.3.46
+
+- Contact-list import set visibility for all, even if not chosen.
## [0.3.45] - 2025.01.01 - 65402dc68ce69ccc6cb9aa8d2e7a9249bf4298e0
-### Fixed
-- Previous project links stayed when following a link.
+### Fixed in 0.3.45
+
+- Previous project links stayed when following a link.
## [0.3.44] - 2024.12.31 - 694b22987b05482e4527c2478bbe15e6b6f3b532
-### Added
-- Project counts on a map
+### Added in 0.3.44
+
+- Project counts on a map
## [0.3.42] - 2024.12.27 - 9751934bc24a1040415a8cfeacbae59ed91f92a5
-### Added
+
+### Added in 0.3.42
+
- Link from certificate page to the claim
-### Changed
+
+### Changed in 0.3.42
+
- Contact data sharing is now a verified JWT.
- Feed pictures are larger.
-
## [0.3.41] - 2024.12.21 - ff6d14138f26daea6216b051562f0a04681f69fc
-### Added
-- Link from certificate page to the claim
+### Added in 0.3.41
+
+- Link from certificate page to the claim
## [0.3.40] - 2024.12.20 - 77290d9fed3c364243793dc3e9bfe2e994a016b8
-### Added
-- Only show issuer on certificate if it's not the agent.
+### Added in 0.3.40
+
+- Only show issuer on certificate if it's not the agent.
## [0.3.39] - 2024.12.20 - d8819155e2acd2b57fdab523168fa5d1d09e80cc
-### Added
-- Page for a framed claim certificate
+### Added in 0.3.39
+
+- Page for a framed claim certificate
## [0.3.38] - 2024.12.14 - f8cae5ad4fee1f114320dcce052299eab12108b2
-### Fixed
-- Error on BVC confirmation screen (from IndexedDB refactor)
+### Fixed in 0.3.38
+
+- Error on BVC confirmation screen (from IndexedDB refactor)
## [0.3.37] - 2024.12.13 - 4d805b43cd25eed73cdd6651f36ad1ec8c109555
-### Added
+
+### Added in 0.3.37
+
- Record a give from a project on the project page.
- New button on home page opens the gifted dialog.
- On confirmation buttons on the project page gives, mark when unavailable and explain why.
-### Changed
+
+### Changed in 0.3.37
+
- Moved the secret into IndexedDB (and out of localStorage) for more reliability.
- New "invite" destination page helps troubleshoot when JWT link doesn't come through.
-### Fixed
+
+### Fixed in 0.3.37
+
- Problem showing claim issuer name
- Problem going "back" from a project page
-
## [0.3.36] - 2024.11.24 - c8d23647d165016f8a8f575e13d32583242e53ac
-### Changed
+
+### Changed in 0.3.36
+
- More friendly default reminder message
- Blue borders around people to indicate clickability
-
## [0.3.35] - 2024.11.24 - bff7d0a6320b70349185e26bfac72e3bb17f76df
-### Added
+
+### Added in 0.3.35
+
- Daily reliable, hard-coded notification message
- Setting to change the partner API server
-
## [0.3.33] - 2024.11.07 - adb7b16ecf1343c39cba71a7d6bb0e7a973e1102
-### Fixed
+
+### Fixed in 0.3.33
+
- Affirm Delivery button on offer claim page didn't work.
- Plans were not showing by default on project page.
-
## [0.3.32] - 2024.11.06 - 9a3fa38a3fd28f977e06f0265fc39e635c9c5ccd
-### Added
-- Highlight in green new offers to user & to user's projects on the front page.
+### Added in 0.3.32
+
+- Highlight in green new offers to user & to user's projects on the front page.
## [0.3.31] - 2024.10.25 - 07c02ab98a09d293dd90d9289a7872e7d681d296
-### Changed
-- Onboarding messages about offers
+### Changed in 0.3.31
+
+- Onboarding messages about offers
## [0.3.30]
-### Added
-- Onboarding messages
+### Added in 0.3.30
+
+- Onboarding messages
## [0.3.29] - 2024.10.09 - babd3832bdfe0c40eaa3869de1b41399a51713c1
-### Added
+
+### Added in 0.3.29
+
- Invite for a contact to join immediately
-### Changed
+
+### Changed in 0.3.29
+
- Send signed data to nostr endpoints to verify public key ownership.
- Enhanced help & help onboarding.
+
### Changed in DB or environment
-- Uses Endorser.ch version 4.1.1
+- Uses Endorser.ch version 4.1.1
## [0.3.28] - 2024.09.30 - 84720b94049d29cc0ddd99c50cef2e7176130133
-### Added
+
+### Added in 0.3.28
+
- Posting to nostr apps Trustroots & TripHopping
- Display of providers on claim view page
-### Changed
+
+### Changed in 0.3.28
+
- Switched BVC-meeting-ending gift to be a gift from the group.
-### Changed in DB or environment
-- Requires Endorser.ch version 4.1.0
+### Changed in DB or environment in 0.3.28
+
+- Requires Endorser.ch version 4.1.0
## [0.3.27] - 2024.09.22 - ee23e6f005e47f5bd6f04d804599f6395371b0e4
-### Fixed
+
+### Fixed in 0.3.27
+
- Error loading BVC claims to confirm
- Really allow visibility of bulk-imported contacts
-
## [0.3.26] - 2024.09.16 - 8263ed2b29947b3ccc6f3133bbc9454c222bce28
-### Added
+
+### Added in 0.3.26
+
- Separate 'isRegistered' flag for each account
-### Fixed
+
+### Fixed in 0.3.26
+
- Failure to assign offers to their project
- Alert when looking at one's own activity if not in contacts.
-
## [0.3.25] - 2024.08.30 - dcbe02d877aecb4cdef2643d90e6595d246a9f82
-### Added
+
+### Added in 0.3.25
+
- "Ideas" now jumps directly to giving prompt or contact list.
-### Fixed
+
+### Fixed in 0.3.25
+
- Empty giver name on gifted-details view
- Previously visited project would show up on the giving-details page.
-### Removed
-- All unnecessary localStorage for project IDs
+### Removed in 0.3.25
+
+- All unnecessary localStorage for project IDs
## [0.3.23] - 2024.08.30
-### Added
+
+### Added in 0.3.23
+
- Sections in Help for different kinds of users
- Discovery page parameters so that links with search text work
- Message when no projects are found
-
## [0.3.21] - 2024.08.24 - a7b89f4bb6da928d56daeffaae7741fa74cc80bf
-### Added
+
+### Added in 0.3.21
+
- Send list of contacts to someone, and move individual contact actions to detail page.
- Prompt for name in pop-up, and send to different contact-sharing screens.
-### Changed
-- Moved contact actions from list onto detail page
+### Changed in 0.3.21
+
+- Moved contact actions from list onto detail page
## [0.3.20] - 2024.08.18 - 4064eb75a9743ca268bf00016fa0a5fc5dec4e30
-### Fixed
+
+### Fixed in 0.3.20
+
- Bad "give" verbiage on offer page
- Failing offer test
-
## [0.3.19] - 2024.08.18 - ee9c14942ceba993bf21a11249601f205158ec71
-### Added
+
+### Added in 0.3.19
+
- Update of an offer
- Recipient description in offer list
-### Fixed
+
+### Fixed in 0.3.19
+
- List of offers wasn't showing.
- Destination page after sharing photo was wrong.
-
## [0.3.17] - 2024.07.11 - cefa384ff1a2d922848c370640c096c529920fab
-### Added
+
+### Added in 0.3.17
+
- Photos on more screens
-### Fixed
+
+### Fixed in 0.3.17
+
- Share of a photo, including sharing a photo from webkit/Safari which never worked
-### Changed in DB or environment
-- Nothing (though there's a new temp field in IndexedDB)
+### Changed in DB or environment in 0.3.17
+
+- Nothing (though there's a new temp field in IndexedDB)
## [0.3.15] - 2024.08.04 - c8f0f2c2b16b9f0b4b47d40f7bf29058c7baa68e
-### Added
+
+### Added in 0.3.15
+
- Edit gives
- Page to edit claim JSON before submitting
- Update of imported contacts
@@ -288,263 +366,364 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Cache signatures for reports for passkey-signed requests
- Refactor: consolidate alternative signing, eg. for passkeys & did:peer
- Playwright tests
-### Changed
+
+### Changed in 0.3.15
+
- Linked projects display below description (instead of at bottom)
-### Fixed
+
+### Fixed in 0.3.15
+
- Visibility toggle appearance
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.15
+
+- Nothing
## [0.3.14] - 2024.06.22 - 1611d22892f683f43856d2503eee7f391b6bbce8
-### Added
+
+### Added in 0.3.14
+
- Clearer give-confirmation screen
-- BX currency https://thebx.medium.com/
+- BX currency
- Deselection of project on gifted details page
-### Fixed
+
+### Fixed in 0.3.14
+
- Don't show registration pop-up for a new contact that is registered
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.14
+
+- Nothing
## [0.3.13] - 2024.05.24 - 08b67984e443c58d9178ad3776013b0bce7afddc
-### Added
+
+### Added in 0.3.13
+
- Photos on projects
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.13
+
+- Nothing
## [0.3.12] - 2024.05.19 - 141fb39ad19c44d82fe1a33bf85115beacf50870
-### Fixed
+
+### Fixed in 0.3.12
+
- Photo share (share_target) failed because requests were sent to server
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.12
+
+- Nothing
## [0.3.11] - 2024.05.19 - 567bcad88dfb7e9ac8fea72530d1163985e4a7cc
-### Added
+
+### Added in 0.3.11
+
- Choose a file for gifts, and a URL for gifts & profiles
-### Fixed
+
+### Fixed in 0.3.11
+
- Multiple button pushes were required to switch camera
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.11
+
+- Nothing
## [0.3.10] - 2024.05.11 - 03ac31d98110f7828cf9acb366db8d01b185f64c
-### Added
+
+### Added in 0.3.10
+
- Share an image
- Choose a file on the device for a profile image
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.10
+
+- Nothing
## [0.3.9] - 2024.04.28 - 874e717e698b93a1ace9f588e675b8a3dccd7617
-### Added
+
+### Added in 0.3.9
+
- Offers on contacts page
- Checks on front page until they show as registered
-### Changed
+
+### Changed in 0.3.9
+
- Scanned contacts now add immediately and prompt for registration.
- Better UI for gives on contact page
- Better UI for all confirmation messages
-### Fixed
+
+### Fixed in 0.3.9
+
- Repeated elements at top of main feed
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.9
+
+- Nothing
## [0.3.8] - 2024.04.20 - 15c026c80ce03a26cae3ff80b0888934c101c7e2
-### Added
+
+### Added in 0.3.8
+
- Profile image for user
-### Fixed
+
+### Fixed in 0.3.8
+
- Slow loading of home page feed
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.8
+
+- Nothing
## [0.3.7] - 2024.04.10 - cf18f1543a700d62a5f9e764905a4aafe1fb229b
-### Added
+
+### Added in 0.3.7
+
- Filter on home page feed
- Ability to set time of daily notification
- Jump to app on click of notification
-### Changed
+
+### Changed in 0.3.7
+
- Built with vite
- Descriptions on home page to include projects
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.7
+
+- Nothing
## [0.3.6] - 2024.03.24 - 3a07e31d6313ab95711265562d9023c42916e141
-### Added
+
+### Added in 0.3.6
+
- Button to mirror photo during video
- More detailed onboarding help screen
- Public-data blurb
-### Changed in DB or environment
-- Nothing
+### Changed in DB or environment in 0.3.6
+
+- Nothing
## [0.3.5] - 2024.03.23 - 28754bdfb1e11aa221dd49a5dce4219b69cf6a9d
-### Added
+
+### Added in 0.3.5
+
- Photo on gift records
-### Fixed
+
+### Fixed in 0.3.5
+
- Environment variable for BVC meetings project
- Environment variables and build enhancements for test vs prod
-### Changed in DB or environment
+
+### Changed in DB or environment in 0.3.5
+
- New environment variable for image API server
- Test that a new browser session will get the right default APIs.
- Test that a new browser session will send the right BVC meetings project.
-
## [0.2.17] - 2024.03.01 - 3612ea42240c5e1b7d7eff29a39ff18f1b869b36
-### Added
+
+### Added in 0.2.17
+
- Shortcut page for Bountiful Voluntaryist Community
-### Changed
+
+### Changed in 0.2.17
+
- More readable, targeted summaries in home-page feed items
+
### Changed in DB
-- Nothing
+- Nothing
## [0.2.14] - 2024.02.14 - 5f9edea1167dbfb64e16648764eed8c09b24eaeb
-### Changed
+
+### Changed in 0.2.14
+
- Combine all service worker scripts into a single file.
-### Changed in DB
-- Nothing
+### Changed in DB in 0.2.14
+
+- Nothing
## [0.2.13] - 2024.02.07
-### Added
+
+### Added in 0.2.13
+
- Display of user's offers
- Check for valid DIDs
-### Fixed
+
+### Fixed in 0.2.13
+
- Name display on give prompt
- Non-numbers on number input & autocapitalize on URL input
-### Changed in DB
-- Nothing
+### Changed in DB in 0.2.13
+
+- Nothing
## [0.2.12] - 2024.02.01
-### Added
-- Prompts for gratitude
+### Added in 0.2.12
+
+- Prompts for gratitude
## [0.2.11] - 2024.01.28
-### Added
+
+### Added in 0.2.11
+
- Actions to share claim data with contacts
- Bulk CSV import from Endorser Mobile export
- Dates on give summaries
-
## [0.2.10] - 2024.01.18 - 667e1e8890b42de59cd939caca1a01c7a7a702be
-### Added
+
+### Added in 0.2.10
+
- Person identicons for contacts
- Confirmation & delivery directly from project page
- Offer dialog now allows units
- Links from claim detail page to the fulfilled project or offer
- Link to project from home feed
- Copy to clipboard in more places
-### Fixed
-- "More Contacts" for give on project page now links correctly.
+### Fixed in 0.2.10
+
+- "More Contacts" for give on project page now links correctly.
## [0.2.9] - 2024.01.15 - e5e702f8a5a53a6efbed48d35f0bc3cee63024a0
-### Fixed
-- Set visibility for new contact.
+### Fixed in 0.2.9
+
+- Set visibility for new contact.
## [0.2.8] - 2024.01.14
-### Added
+
+### Added in 0.2.8
+
- Automatic ID creation from home page
- Agent who can also edit a project
-### Fixed
-- Cannot declare anonymous gift
+### Fixed in 0.2.8
+
+- Cannot declare anonymous gift
## [0.2.7] - 2024.01.12
-### Added
+
+### Added in 0.2.7
+
- Give to fulfill a particular offer
- Give as part of a trade as opposed to a donation
- Error notifications on import
-### Changed
+
+### Changed in 0.2.7
+
- Library security updates
- Visibility of actions & confirmations on claim page
-### Fixed
-- Name of offerer
+### Fixed in 0.2.7
+
+- Name of offerer
## [0.2.2] - 2024.01.05
-### Added
+
+### Added in 0.2.2
+
- Check for notification capability on front screen
- Contact next-public-key-hash in manual textual input
- Confirmation for contact visibility change
- YAML rendering of full claim details
- Hints for onboarding on the contact screen
-
## [0.2.0] - 2024.01.04
-### Added
+
+### Added in 0.2.0
+
- Contact next-public-key-hash
- Icon for Android
- More thorough messaging and testing for notifications
-
## [0.1.9] - 2024.01.01
-### Added
+
+### Added in 0.1.9
+
- Import for contacts and settings
- Second download button for DuckDuckGo
-### Changed
-- Removed some keys from Dexie's IndexedDB declarations
+### Changed in 0.1.9
+
+- Removed some keys from Dexie's IndexedDB declarations
## [0.1.8] - 2023.12.27- d26d1d360152a7d0e559b68486e85b72b88bd9ff
-### Added
+
+### Added in 0.1.8
+
- DB logging for service-worker events
- Help page for notifications
- Test notification & web-push triggers inside app
- Check that the app is installed
-### Fixed
-- Project issuer display name
+### Fixed in 0.1.8
+
+- Project issuer display name
## [0.1.7] - 2023.12.19 - 91c6c7c11c71f96006cc876fc946f1f98a274ba2
-### Changed
+
+### Changed in 0.1.7
+
- Icons
-### Fixed
+
+### Fixed in 0.1.7
+
- Notification switch now shows message
- Prod/test server warning message at top of page
-
## [0.1.6] - 2023.12.17 - b445b1234fbfcf6b37d695373f259aab0eda1118
-### Added
+
+### Added in 0.1.6
+
- Infinite scroll on home page
-### Changed
+
+### Changed in 0.1.6
+
- UI improvements
- Show web-push subscription info
- Icon
-
## [0.1.5] - 2023.12.09 - 9c36bb509a9bae9bb3306d3bd9eeb144b67aa8ad
-### Added
+
+### Added in 0.1.5
+
- Web push notifications (though not finalized)
- Credentials details page
- See more data without an ID
- Change units of a give
-
## [0.1.4] - 2023.11.20 - 7311d36726f3667ec4c68f241f91d404273ad4db
-### Added
+
+### Added in 0.1.4
+
- Offer on a project
-### Changed
-- Automatically set as visible when importing a contact
+### Changed in 0.1.4
+
+- Automatically set as visible when importing a contact
## [0.1.3] - 2023.11.08 - 910f57ec7d2e50803ae3d04f4b927e0f5219fbde
-### Added
+
+### Added in 0.1.3
+
- Contact name editing
-### Changed
+
+### Changed in 0.1.3
+
- Don't show actions on front page if not registered.
-### Removed
-- Home page Notiwind test buttons
+### Removed in 0.1.3
+
+- Home page Notiwind test buttons
## [0.1.2] - 2023.11.01 - 7f6c93802911a030a89fe3706e18b5c17151e5bb
-### Added
+
+### Added in 0.1.2
+
- Basics: create ID, record a give, declare a project, search, and get notifications.
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..6653b13
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gem "fastlane"
+gem "cocoapods"
+
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..a4c969a
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,321 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ activesupport (7.2.2.1)
+ base64
+ benchmark (>= 0.3)
+ bigdecimal
+ concurrent-ruby (~> 1.0, >= 1.3.1)
+ connection_pool (>= 2.2.5)
+ drb
+ i18n (>= 1.6, < 2)
+ logger (>= 1.4.2)
+ minitest (>= 5.1)
+ securerandom (>= 0.3)
+ tzinfo (~> 2.0, >= 2.0.5)
+ addressable (2.8.7)
+ public_suffix (>= 2.0.2, < 7.0)
+ algoliasearch (1.27.5)
+ httpclient (~> 2.8, >= 2.8.3)
+ json (>= 1.5.1)
+ artifactory (3.0.17)
+ atomos (0.1.3)
+ aws-eventstream (1.3.2)
+ aws-partitions (1.1066.0)
+ aws-sdk-core (3.220.1)
+ aws-eventstream (~> 1, >= 1.3.0)
+ aws-partitions (~> 1, >= 1.992.0)
+ aws-sigv4 (~> 1.9)
+ base64
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.99.0)
+ aws-sdk-core (~> 3, >= 3.216.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.182.0)
+ aws-sdk-core (~> 3, >= 3.216.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.11.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ base64 (0.2.0)
+ benchmark (0.4.0)
+ bigdecimal (3.1.9)
+ claide (1.1.0)
+ cocoapods (1.16.2)
+ addressable (~> 2.8)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.16.2)
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
+ cocoapods-downloader (>= 2.1, < 3.0)
+ cocoapods-plugins (>= 1.0.0, < 2.0)
+ cocoapods-search (>= 1.0.0, < 2.0)
+ cocoapods-trunk (>= 1.6.0, < 2.0)
+ cocoapods-try (>= 1.1.0, < 2.0)
+ colored2 (~> 3.1)
+ escape (~> 0.0.4)
+ fourflusher (>= 2.3.0, < 3.0)
+ gh_inspector (~> 1.0)
+ molinillo (~> 0.8.0)
+ nap (~> 1.0)
+ ruby-macho (>= 2.3.0, < 3.0)
+ xcodeproj (>= 1.27.0, < 2.0)
+ cocoapods-core (1.16.2)
+ activesupport (>= 5.0, < 8)
+ addressable (~> 2.8)
+ algoliasearch (~> 1.0)
+ concurrent-ruby (~> 1.1)
+ fuzzy_match (~> 2.0.4)
+ nap (~> 1.0)
+ netrc (~> 0.11)
+ public_suffix (~> 4.0)
+ typhoeus (~> 1.0)
+ cocoapods-deintegrate (1.0.5)
+ cocoapods-downloader (2.1)
+ cocoapods-plugins (1.0.0)
+ nap
+ cocoapods-search (1.0.1)
+ cocoapods-trunk (1.6.0)
+ nap (>= 0.8, < 2.0)
+ netrc (~> 0.11)
+ cocoapods-try (1.2.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ concurrent-ruby (1.3.5)
+ connection_pool (2.5.0)
+ declarative (0.0.20)
+ digest-crc (0.7.0)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.6.20240107)
+ dotenv (2.8.1)
+ drb (2.2.1)
+ emoji_regex (3.2.3)
+ escape (0.0.4)
+ ethon (0.16.0)
+ ffi (>= 1.15.0)
+ excon (0.112.0)
+ faraday (1.10.4)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.1.0)
+ multipart-post (~> 2.0)
+ faraday-net_http (1.0.2)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.1)
+ faraday (~> 1.0)
+ fastimage (2.4.0)
+ fastlane (2.227.0)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored (~> 1.2)
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ fastlane-sirp (>= 1.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-env (>= 1.6.0, < 2.0.0)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (>= 0.1.1, < 1.0.0)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.5)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.4.0)
+ xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+ fastlane-sirp (1.0.0)
+ sysrandom (~> 1.0)
+ ffi (1.17.1)
+ ffi (1.17.1-aarch64-linux-gnu)
+ ffi (1.17.1-aarch64-linux-musl)
+ ffi (1.17.1-arm-linux-gnu)
+ ffi (1.17.1-arm-linux-musl)
+ ffi (1.17.1-arm64-darwin)
+ ffi (1.17.1-x86-linux-gnu)
+ ffi (1.17.1-x86-linux-musl)
+ ffi (1.17.1-x86_64-darwin)
+ ffi (1.17.1-x86_64-linux-gnu)
+ ffi (1.17.1-x86_64-linux-musl)
+ fourflusher (2.3.1)
+ fuzzy_match (2.0.4)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.54.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.3)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.31.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-cloud-core (1.8.0)
+ google-cloud-env (>= 1.0, < 3.a)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.5.0)
+ google-cloud-storage (1.47.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.31.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.8)
+ domain_name (~> 0.5)
+ httpclient (2.9.0)
+ mutex_m
+ i18n (1.14.7)
+ concurrent-ruby (~> 1.0)
+ jmespath (1.6.2)
+ json (2.10.2)
+ jwt (2.10.1)
+ base64
+ logger (1.6.6)
+ mini_magick (4.13.2)
+ mini_mime (1.1.5)
+ minitest (5.25.5)
+ molinillo (0.8.0)
+ multi_json (1.15.0)
+ multipart-post (2.4.1)
+ mutex_m (0.3.0)
+ nanaimo (0.4.0)
+ nap (1.1.0)
+ naturally (2.2.1)
+ netrc (0.11.0)
+ nkf (0.2.0)
+ optparse (0.6.0)
+ os (1.1.4)
+ plist (3.7.2)
+ public_suffix (4.0.7)
+ rake (13.2.1)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.4.1)
+ rouge (3.28.0)
+ ruby-macho (2.5.1)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.4.1)
+ securerandom (0.4.1)
+ security (0.1.5)
+ signet (0.19.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ sysrandom (1.0.5)
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.2)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ typhoeus (1.4.1)
+ ethon (>= 0.9.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ uber (0.1.0)
+ unicode-display_width (2.6.0)
+ word_wrap (1.0.0)
+ xcodeproj (1.27.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.4.0)
+ rexml (>= 3.3.6, < 4.0)
+ xcpretty (0.4.0)
+ rouge (~> 3.28.0)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ aarch64-linux-gnu
+ aarch64-linux-musl
+ arm-linux-gnu
+ arm-linux-musl
+ arm64-darwin
+ ruby
+ x86-linux-gnu
+ x86-linux-musl
+ x86_64-darwin
+ x86_64-linux-gnu
+ x86_64-linux-musl
+
+DEPENDENCIES
+ cocoapods
+ fastlane
+
+BUNDLED WITH
+ 2.6.5
diff --git a/README.md b/README.md
index 99df379..1f299ad 100644
--- a/README.md
+++ b/README.md
@@ -8,8 +8,6 @@ and expand to crowd-fund with time & money, then record and see the impact of co
See [project.task.yaml](project.task.yaml) for current priorities.
(Numbers at the beginning of lines are estimated hours. See [taskyaml.org](https://taskyaml.org/) for details.)
-
-
## Setup & Building
Quick start:
@@ -29,7 +27,6 @@ See the test locations for "IMAGE_API_SERVER" or "PARTNER_API_SERVER" below, or
Look at [BUILDING.md](BUILDING.md) for the "test-all" instructions and [TESTING.md](test-playwright/TESTING.md) for more details.
-
### Compile and minify for test & production
* If there are DB changes: before updating the test server, open browser(s) with current version to test DB migrations.
@@ -46,15 +43,19 @@ Look at [BUILDING.md](BUILDING.md) for the "test-all" instructions and [TESTING.
* For test, build the app (because test server is not yet set up to build):
-```
+```bash
TIME_SAFARI_APP_TITLE="TimeSafari_Test" VITE_APP_SERVER=https://test.timesafari.app VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HWE8FWHQ1YGP7GFZYYPS272F VITE_DEFAULT_ENDORSER_API_SERVER=https://test-api.endorser.ch VITE_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app VITE_DEFAULT_PARTNER_API_SERVER=https://test-partner-api.endorser.ch VITE_PASSKEYS_ENABLED=true npm run build
```
- ... and transfer to the test server: `rsync -azvu -e "ssh -i ~/.ssh/..." dist ubuntutest@test.timesafari.app:time-safari`
+ ... and transfer to the test server:
+
+ ```bash
+ rsync -azvu -e "ssh -i ~/.ssh/..." dist ubuntutest@test.timesafari.app:time-safari
+ ```
- (Let's replace that with a .env.development or .env.staging file.)
+(Let's replace that with a .env.development or .env.staging file.)
- (Note: The test BVC_MEETUPS_PROJECT_CLAIM_ID does not resolve as a URL because it's only in the test DB and the prod redirect won't redirect there.)
+(Note: The test BVC_MEETUPS_PROJECT_CLAIM_ID does not resolve as a URL because it's only in the test DB and the prod redirect won't redirect there.)
* For prod, get on the server and run the correct build:
@@ -74,12 +75,17 @@ TIME_SAFARI_APP_TITLE="TimeSafari_Test" VITE_APP_SERVER=https://test.timesafari.
-## Icons
+## Tests
+
+See [TESTING.md](test-playwright/TESTING.md) for detailed test instructions.
-To add an icon, add to main.ts and reference with `fa` element and `icon` attribute with the hyphenated name.
+## Icons
+
+To add an icon, add to main.ts and reference with `fa` element and `icon` attribute with the hyphenated name.
+
## Other
### Reference Material
@@ -91,7 +97,6 @@ To add an icon, add to main.ts and reference with `fa` element and `icon` attrib
* If you are deploying in a subdirectory, add it to `publicPath` in vue.config.js, eg: `publicPath: "/app/time-tracker/",`
-
### Kudos
Gifts make the world go 'round!
diff --git a/android/.gradle/8.11.1/checksums/checksums.lock b/android/.gradle/8.11.1/checksums/checksums.lock
new file mode 100644
index 0000000..fd1f78f
Binary files /dev/null and b/android/.gradle/8.11.1/checksums/checksums.lock differ
diff --git a/android/.gradle/8.11.1/checksums/md5-checksums.bin b/android/.gradle/8.11.1/checksums/md5-checksums.bin
new file mode 100644
index 0000000..013dc6e
Binary files /dev/null and b/android/.gradle/8.11.1/checksums/md5-checksums.bin differ
diff --git a/android/.gradle/8.11.1/checksums/sha1-checksums.bin b/android/.gradle/8.11.1/checksums/sha1-checksums.bin
new file mode 100644
index 0000000..ac09540
Binary files /dev/null and b/android/.gradle/8.11.1/checksums/sha1-checksums.bin differ
diff --git a/android/.gradle/8.11.1/executionHistory/executionHistory.bin b/android/.gradle/8.11.1/executionHistory/executionHistory.bin
new file mode 100644
index 0000000..56c9a8b
Binary files /dev/null and b/android/.gradle/8.11.1/executionHistory/executionHistory.bin differ
diff --git a/android/.gradle/8.11.1/executionHistory/executionHistory.lock b/android/.gradle/8.11.1/executionHistory/executionHistory.lock
new file mode 100644
index 0000000..37677bc
Binary files /dev/null and b/android/.gradle/8.11.1/executionHistory/executionHistory.lock differ
diff --git a/android/.gradle/8.11.1/fileChanges/last-build.bin b/android/.gradle/8.11.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/android/.gradle/8.11.1/fileChanges/last-build.bin differ
diff --git a/android/.gradle/8.11.1/fileHashes/fileHashes.bin b/android/.gradle/8.11.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..cb5d22d
Binary files /dev/null and b/android/.gradle/8.11.1/fileHashes/fileHashes.bin differ
diff --git a/android/.gradle/8.11.1/fileHashes/fileHashes.lock b/android/.gradle/8.11.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..00640cb
Binary files /dev/null and b/android/.gradle/8.11.1/fileHashes/fileHashes.lock differ
diff --git a/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin
new file mode 100644
index 0000000..dd7c186
Binary files /dev/null and b/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin differ
diff --git a/android/.gradle/8.11.1/gc.properties b/android/.gradle/8.11.1/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock
new file mode 100644
index 0000000..79551c9
Binary files /dev/null and b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/android/.gradle/buildOutputCleanup/cache.properties b/android/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..3865c95
--- /dev/null
+++ b/android/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Tue Mar 11 10:01:05 UTC 2025
+gradle.version=8.10.2
diff --git a/android/.gradle/file-system.probe b/android/.gradle/file-system.probe
new file mode 100644
index 0000000..c49b9e9
Binary files /dev/null and b/android/.gradle/file-system.probe differ
diff --git a/android/.gradle/vcs-1/gc.properties b/android/.gradle/vcs-1/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/android/Gemfile b/android/Gemfile
new file mode 100644
index 0000000..7a118b4
--- /dev/null
+++ b/android/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/android/app/.gitignore b/android/app/.gitignore
index 043df80..dac1f80 100644
--- a/android/app/.gitignore
+++ b/android/app/.gitignore
@@ -1,2 +1,3 @@
/build/*
!/build/.npmkeep
+src/main/assets/public/assets/
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 6561800..acc7346 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,10 +1,10 @@
apply plugin: 'com.android.application'
android {
- namespace "app.timesafari.app"
+ namespace "app.timesafari"
compileSdk rootProject.ext.compileSdkVersion
defaultConfig {
- applicationId "app.timesafari.app"
+ applicationId "app.timesafari"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
@@ -22,6 +22,17 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ lintOptions {
+ disable 'UnsanitizedFilenameFromContentProvider'
+ abortOnError false
+ baseline file("lint-baseline.xml")
+
+ // Ignore Capacitor module issues
+ ignore 'DefaultLocale'
+ ignore 'UnsanitizedFilenameFromContentProvider'
+ ignore 'LintBaseline'
+ ignore 'LintBaselineFixed'
+ }
}
repositories {
diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle
index fdb4970..151fee4 100644
--- a/android/app/capacitor.build.gradle
+++ b/android/app/capacitor.build.gradle
@@ -9,7 +9,7 @@ android {
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies {
-
+ implementation project(':capacitor-app')
}
diff --git a/android/app/lint-baseline.xml b/android/app/lint-baseline.xml
new file mode 100644
index 0000000..8ed44b3
--- /dev/null
+++ b/android/app/lint-baseline.xml
@@ -0,0 +1,398 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java
similarity index 59%
rename from android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
rename to android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java
index f2c2217..28cfc7c 100644
--- a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
+++ b/android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java
@@ -1,26 +1,20 @@
-package com.getcapacitor.myapp;
-
-import static org.junit.Assert.*;
+package app.timesafari.app;
import android.content.Context;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
+import static org.junit.Assert.*;
+
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
-
@Test
- public void useAppContext() throws Exception {
+ public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
-
- assertEquals("com.getcapacitor.app", appContext.getPackageName());
+ assertEquals("app.timesafari", appContext.getPackageName());
}
-}
+}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 4d7ca38..06a98ee 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -22,6 +22,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/assets/public/img/icons/safari-pinned-tab.svg b/android/app/src/main/assets/public/img/icons/safari-pinned-tab.svg
new file mode 100644
index 0000000..15d9574
--- /dev/null
+++ b/android/app/src/main/assets/public/img/icons/safari-pinned-tab.svg
@@ -0,0 +1,226 @@
+
+
diff --git a/android/app/src/main/assets/public/img/textures/leafy-autumn-forest-floor.jpg b/android/app/src/main/assets/public/img/textures/leafy-autumn-forest-floor.jpg
new file mode 100644
index 0000000..cadd5a6
Binary files /dev/null and b/android/app/src/main/assets/public/img/textures/leafy-autumn-forest-floor.jpg differ
diff --git a/android/app/src/main/assets/public/index.html b/android/app/src/main/assets/public/index.html
new file mode 100644
index 0000000..cfbe94a
--- /dev/null
+++ b/android/app/src/main/assets/public/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ TimeSafari
+
+
+
+
+
+
+
diff --git a/android/app/src/main/assets/public/models/lupine_plant/license.txt b/android/app/src/main/assets/public/models/lupine_plant/license.txt
new file mode 100644
index 0000000..9a6980c
--- /dev/null
+++ b/android/app/src/main/assets/public/models/lupine_plant/license.txt
@@ -0,0 +1,11 @@
+Model Information:
+* title: Lupine Plant
+* source: https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439
+* author: rufusrockwell (https://sketchfab.com/rufusrockwell)
+
+Model License:
+* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
+* requirements: Author must be credited. Commercial use is allowed.
+
+If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
+This work is based on "Lupine Plant" (https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439) by rufusrockwell (https://sketchfab.com/rufusrockwell) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
\ No newline at end of file
diff --git a/android/app/src/main/assets/public/models/lupine_plant/scene.bin b/android/app/src/main/assets/public/models/lupine_plant/scene.bin
new file mode 100644
index 0000000..e523e7d
Binary files /dev/null and b/android/app/src/main/assets/public/models/lupine_plant/scene.bin differ
diff --git a/android/app/src/main/assets/public/models/lupine_plant/scene.gltf b/android/app/src/main/assets/public/models/lupine_plant/scene.gltf
new file mode 100644
index 0000000..0ec1997
--- /dev/null
+++ b/android/app/src/main/assets/public/models/lupine_plant/scene.gltf
@@ -0,0 +1,229 @@
+{
+ "accessors": [
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 2759,
+ "max": [
+ 41.3074951171875,
+ 40.37548828125,
+ 87.85917663574219
+ ],
+ "min": [
+ -35.245540618896484,
+ -36.895416259765625,
+ -0.9094290137290955
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 2,
+ "byteOffset": 33108,
+ "componentType": 5126,
+ "count": 2759,
+ "max": [
+ 0.9999382495880127,
+ 0.9986748695373535,
+ 0.9985831379890442
+ ],
+ "min": [
+ -0.9998949766159058,
+ -0.9975876212120056,
+ -0.411094069480896
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 3,
+ "componentType": 5126,
+ "count": 2759,
+ "max": [
+ 0.9987699389457703,
+ 0.9998998045921326,
+ 0.9577858448028564,
+ 1.0
+ ],
+ "min": [
+ -0.9987726807594299,
+ -0.9990445971488953,
+ -0.999801516532898,
+ 1.0
+ ],
+ "type": "VEC4"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 2759,
+ "max": [
+ 1.0061479806900024,
+ 0.9993550181388855
+ ],
+ "min": [
+ 0.00279300007969141,
+ 0.0011620000004768372
+ ],
+ "type": "VEC2"
+ },
+ {
+ "bufferView": 0,
+ "componentType": 5125,
+ "count": 6378,
+ "type": "SCALAR"
+ }
+ ],
+ "asset": {
+ "extras": {
+ "author": "rufusrockwell (https://sketchfab.com/rufusrockwell)",
+ "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
+ "source": "https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439",
+ "title": "Lupine Plant"
+ },
+ "generator": "Sketchfab-12.68.0",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 25512,
+ "name": "floatBufferViews",
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteLength": 22072,
+ "byteOffset": 25512,
+ "byteStride": 8,
+ "name": "floatBufferViews",
+ "target": 34962
+ },
+ {
+ "buffer": 0,
+ "byteLength": 66216,
+ "byteOffset": 47584,
+ "byteStride": 12,
+ "name": "floatBufferViews",
+ "target": 34962
+ },
+ {
+ "buffer": 0,
+ "byteLength": 44144,
+ "byteOffset": 113800,
+ "byteStride": 16,
+ "name": "floatBufferViews",
+ "target": 34962
+ }
+ ],
+ "buffers": [
+ {
+ "byteLength": 157944,
+ "uri": "scene.bin"
+ }
+ ],
+ "images": [
+ {
+ "uri": "textures/lambert2SG_baseColor.png"
+ },
+ {
+ "uri": "textures/lambert2SG_normal.png"
+ }
+ ],
+ "materials": [
+ {
+ "alphaCutoff": 0.2,
+ "alphaMode": "MASK",
+ "doubleSided": true,
+ "name": "lambert2SG",
+ "normalTexture": {
+ "index": 1
+ },
+ "pbrMetallicRoughness": {
+ "baseColorTexture": {
+ "index": 0
+ },
+ "metallicFactor": 0.0
+ }
+ }
+ ],
+ "meshes": [
+ {
+ "name": "Object_0",
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 0,
+ "TANGENT": 2,
+ "TEXCOORD_0": 3
+ },
+ "indices": 4,
+ "material": 0,
+ "mode": 4
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "matrix": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 2.220446049250313e-16,
+ -1.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 2.220446049250313e-16,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "name": "Sketchfab_model"
+ },
+ {
+ "children": [
+ 2
+ ],
+ "name": "LupineSF.obj.cleaner.materialmerger.gles"
+ },
+ {
+ "mesh": 0,
+ "name": "Object_2"
+ }
+ ],
+ "samplers": [
+ {
+ "magFilter": 9729,
+ "minFilter": 9987,
+ "wrapS": 10497,
+ "wrapT": 10497
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "name": "Sketchfab_Scene",
+ "nodes": [
+ 0
+ ]
+ }
+ ],
+ "textures": [
+ {
+ "sampler": 0,
+ "source": 0
+ },
+ {
+ "sampler": 0,
+ "source": 1
+ }
+ ]
+}
diff --git a/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_baseColor.png b/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_baseColor.png
new file mode 100644
index 0000000..211290e
Binary files /dev/null and b/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_baseColor.png differ
diff --git a/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_normal.png b/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_normal.png
new file mode 100644
index 0000000..a4e6ffe
Binary files /dev/null and b/android/app/src/main/assets/public/models/lupine_plant/textures/lambert2SG_normal.png differ
diff --git a/android/app/src/main/assets/public/robots.txt b/android/app/src/main/assets/public/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/android/app/src/main/assets/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/android/app/src/main/res/xml/config.xml b/android/app/src/main/res/xml/config.xml
new file mode 100644
index 0000000..1b1b0e0
--- /dev/null
+++ b/android/app/src/main/res/xml/config.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 499aca3..26c51d8 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -7,8 +7,9 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.8.1'
+ classpath 'com.android.tools.build:gradle:8.1.0'
classpath 'com.google.gms:google-services:4.4.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -27,3 +28,10 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
}
+
+configurations.all {
+ resolutionStrategy {
+ force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
+ force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0'
+ }
+}
diff --git a/android/capacitor-android/build.gradle b/android/capacitor-android/build.gradle
new file mode 100644
index 0000000..c7b2bf8
--- /dev/null
+++ b/android/capacitor-android/build.gradle
@@ -0,0 +1,7 @@
+android {
+ lintOptions {
+ disable 'UnsanitizedFilenameFromContentProvider'
+ abortOnError false
+ baseline file("lint-baseline.xml")
+ }
+}
\ No newline at end of file
diff --git a/android/capacitor-cordova-android-plugins/build.gradle b/android/capacitor-cordova-android-plugins/build.gradle
new file mode 100644
index 0000000..2d9d0f2
--- /dev/null
+++ b/android/capacitor-cordova-android-plugins/build.gradle
@@ -0,0 +1,59 @@
+ext {
+ androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1'
+ cordovaAndroidVersion = project.hasProperty('cordovaAndroidVersion') ? rootProject.ext.cordovaAndroidVersion : '10.1.1'
+}
+
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.2.1'
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ namespace "capacitor.cordova.android.plugins"
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
+ defaultConfig {
+ minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34
+ versionCode 1
+ versionName "1.0"
+ }
+ lintOptions {
+ abortOnError false
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+}
+
+repositories {
+ google()
+ mavenCentral()
+ flatDir{
+ dirs 'src/main/libs', 'libs'
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'src/main/libs', include: ['*.jar'])
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+ implementation "org.apache.cordova:framework:$cordovaAndroidVersion"
+ // SUB-PROJECT DEPENDENCIES START
+
+ // SUB-PROJECT DEPENDENCIES END
+}
+
+// PLUGIN GRADLE EXTENSIONS START
+apply from: "cordova.variables.gradle"
+// PLUGIN GRADLE EXTENSIONS END
+
+for (def func : cdvPluginPostBuildExtras) {
+ func()
+}
\ No newline at end of file
diff --git a/android/capacitor-cordova-android-plugins/cordova.variables.gradle b/android/capacitor-cordova-android-plugins/cordova.variables.gradle
new file mode 100644
index 0000000..5b55884
--- /dev/null
+++ b/android/capacitor-cordova-android-plugins/cordova.variables.gradle
@@ -0,0 +1,7 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+ext {
+ cdvMinSdkVersion = project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
+ // Plugin gradle extensions can append to this to have code run at the end.
+ cdvPluginPostBuildExtras = []
+ cordovaConfig = [:]
+}
\ No newline at end of file
diff --git a/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml b/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..91d30c6
--- /dev/null
+++ b/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep b/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep b/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle
index 9a5fa87..2085c86 100644
--- a/android/capacitor.settings.gradle
+++ b/android/capacitor.settings.gradle
@@ -1,3 +1,6 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
+
+include ':capacitor-app'
+project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
diff --git a/android/fastlane/Appfile b/android/fastlane/Appfile
new file mode 100644
index 0000000..0a16db6
--- /dev/null
+++ b/android/fastlane/Appfile
@@ -0,0 +1,2 @@
+json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
+package_name("app.timesafari.app") # e.g. com.krausefx.app
diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile
new file mode 100644
index 0000000..02d8e16
--- /dev/null
+++ b/android/fastlane/Fastfile
@@ -0,0 +1,38 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+default_platform(:android)
+
+platform :android do
+ desc "Build and deploy Android app"
+ lane :beta do
+ gradle(
+ task: "clean assembleRelease"
+ )
+ upload_to_play_store(
+ track: 'beta',
+ aab: '../app/build/outputs/bundle/release/app-release.aab'
+ )
+ end
+
+ lane :release do
+ gradle(
+ task: "clean assembleRelease"
+ )
+ upload_to_play_store(
+ aab: '../app/build/outputs/bundle/release/app-release.aab'
+ )
+ end
+end
diff --git a/android/fastlane/README.md b/android/fastlane/README.md
new file mode 100644
index 0000000..22a72f6
--- /dev/null
+++ b/android/fastlane/README.md
@@ -0,0 +1,40 @@
+fastlane documentation
+----
+
+# Installation
+
+Make sure you have the latest version of the Xcode command line tools installed:
+
+```sh
+xcode-select --install
+```
+
+For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
+
+# Available Actions
+
+## Android
+
+### android beta
+
+```sh
+[bundle exec] fastlane android beta
+```
+
+Build and deploy Android app
+
+### android release
+
+```sh
+[bundle exec] fastlane android release
+```
+
+
+
+----
+
+This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
+
+More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
+
+The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/android/gradle.properties b/android/gradle.properties
index 2e87c52..4e675cf 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -20,3 +20,6 @@ org.gradle.jvmargs=-Xmx1536m
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
+android.suppressUnsupportedCompileSdk=34
+android.suppressUnsupportedCompileSdk=34
+android.suppressUnsupportedCompileSdk=34
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 0000000..289f5b6
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,8 @@
+## This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+#Sun Mar 09 06:14:41 UTC 2025
+sdk.dir=/opt/android-sdk
diff --git a/capacitor.config.ts b/capacitor.config.ts
index 3f836db..f549c11 100644
--- a/capacitor.config.ts
+++ b/capacitor.config.ts
@@ -8,6 +8,18 @@ const config: CapacitorConfig = {
server: {
cleartext: true,
},
+ plugins: {
+ App: {
+ appUrlOpen: {
+ handlers: [
+ {
+ url: "timesafari://*",
+ autoVerify: true
+ }
+ ]
+ }
+ }
+ }
};
export default config;
diff --git a/docs/DEEP_LINKS.md b/docs/DEEP_LINKS.md
new file mode 100644
index 0000000..ba6f728
--- /dev/null
+++ b/docs/DEEP_LINKS.md
@@ -0,0 +1,91 @@
+# TimeSafari Deep Linking Documentation
+
+## Type System Overview
+
+The deep linking system uses a multi-layered type safety approach:
+
+1. **Runtime Validation (Zod Schemas)**
+ - Validates URL structure
+ - Enforces parameter requirements
+ - Sanitizes input data
+ - Provides detailed validation errors
+
+2. **TypeScript Types**
+ - Generated from Zod schemas
+ - Ensures compile-time type safety
+ - Provides IDE autocompletion
+ - Catches type errors during development
+
+3. **Router Integration**
+ - Type-safe parameter passing
+ - Route-specific parameter validation
+ - Query parameter type checking
+
+## Implementation Files
+
+- `src/types/deepLinks.ts`: Type definitions and validation schemas
+- `src/services/deepLinks.ts`: Deep link processing service
+- `src/main.capacitor.ts`: Capacitor integration
+
+## Type Safety Examples
+
+```typescript
+// Parameter type safety
+type ClaimParams = DeepLinkParams["claim"];
+// TypeScript knows this has:
+// - id: string
+// - view?: "details" | "certificate" | "raw"
+// Runtime validation
+const result = deepLinkSchemas.claim.safeParse({
+id: "123",
+view: "details"
+});
+// Validates at runtime with detailed error messages
+```
+
+## Supported URL Schemes
+
+All deep links follow the format: `timesafari:///?`
+
+### Claim Routes
+
+- `timesafari://claim/:id`
+ - Query params:
+ - `view`: "details" | "certificate" | "raw"
+
+- `timesafari://claim-cert/:id`
+- `timesafari://claim-add-raw/:id`
+ - Query params:
+ - `claim`: JSON string of claim data
+ - `claimJwtId`: JWT ID for claim
+
+### Contact Routes
+
+- `timesafari://contact-edit/:did`
+- `timesafari://contact-import/:jwt`
+ - Query params:
+ - `contacts`: JSON array of contacts
+
+### Project Routes
+
+- `timesafari://project/:id`
+ - Query params:
+ - `view`: "details" | "edit"
+
+### Invite Routes
+
+- `timesafari://invite-one-accept/:jwt`
+ - Query params:
+ - `type`: "one" | "many"
+
+### Gift Routes
+
+- `timesafari://confirm-gift/:id`
+ - Query params:
+ - `action`: "confirm" | "details"
+
+### Offer Routes
+
+- `timesafari://offer-details/:id`
+ - Query params:
+ - `view`: "details"
diff --git a/index.html b/index.html
index 0f094d1..f5e74b1 100644
--- a/index.html
+++ b/index.html
@@ -12,6 +12,21 @@
We're sorry but TimeSafari doesn't work properly without JavaScript enabled. Please enable it to continue.
-
+