Commit Graph

101 Commits

Author SHA1 Message Date
Davide 8ec6f90077
Connect on provider server selection (#941)
Unless profile is current and active, in which case AppContext does it
under the hood.
2024-11-26 10:30:30 +01:00
Davide 1c1d2502c3
Show quick profile menu rather than just edit (#940)
"Edit" is a less frequent action than "Select provider server". Offer a
common place for quick actions.

One step towards #933
2024-11-26 09:42:47 +01:00
Davide 19da40d3f8
Simplify VPNProviderServerView components (#939)
Merge former ContainerView into main view and define platform-specific
subviews:

- ContainerView (composition of content + filters)
- ContentView
- FiltersView
2024-11-26 09:20:00 +01:00
Davide b357d985ed
Add "Refresh infrastructure" in server lists (#938)
Refactoring:

- Split Providers and VPN views
- Rename VPNProviderServerView subviews
- Reuse RefreshInfrastructureButton

Closes #929
2024-11-26 01:04:58 +01:00
Davide 8b043d8a4f
Refactor provider server views
- Rename ServersView to ContainerView
- Rename ServersSubview to ContentView
- Split parent extensions and content
- Move container handlers to methods suggesting logic
- Drop dup previews
2024-11-26 00:18:08 +01:00
Davide ca54d8f41a
Perform onboarding steps on upgrade (#936)
Store the current step in a linear list of onboarding steps that can
increase with each app upgrade.

Fixes #930 
Fixes #931 
Fixes #932
2024-11-25 21:55:31 +01:00
Davide 7f7e591616
Add view in "About" about purchased products (#935)
Closes #897
2024-11-25 19:17:18 +01:00
Davide 7e49493d75
Improve provider servers responsiveness on iOS (#927)
Pre-compute servers by country code.

Fixes #898
2024-11-25 10:18:10 +01:00
Davide 2aa91eedb0
Simplify paywall entities (#923)
- PaywallView is the paywall content
- PaywallModifier attaches paywall with optional confirmation
- PurchaseRequiredButton presents paywall explicitly
- PaywallReason is the compound input

Refactoring:

- PurchaseRequiredButton takes a custom view
- PurchaseAlertModifier was merged into PaywallModifier
- PurchaseButtonModifier was merged into PurchaseRequiredButton
- Modal options were packed into a single struct

Confirmation alert presented on:

- Connect to ineligible profile (AppCoordinator)
- Save ineligible profile (ProfileCoordinator)
2024-11-24 20:01:30 +01:00
Davide cb530d8a65
Handle TV requirements on connection (#922)
Fixes #913
2024-11-24 01:01:04 +01:00
Davide bad9e8b58e
Add TV settings tab (#921)
Includes:

- Credits
- Donations
- Diagnostics
- Version

Had to:

- Wrap tab view into a NavigationStack for full-screen navigation
- Take out navigation titles of about subviews
- Customize donations view layout with modifier
- Fix credits and debug log to support scrolling

Closes #914
2024-11-23 23:01:11 +01:00
Davide f13a292b4b
Refactor String identifiers (#920)
- Group all views under "views.*"
- Split global strings into actions and nouns
- Use underscores
- Clean up unused

Fixes #835
2024-11-23 20:31:22 +01:00
Davide 2a46173169
Move more views to UILibrary (#919)
- Move about subviews to UILibrary
- Refactor about to single coordinator + platform views
- Refactor debug log to single view + content views
- Take out debug log routes from about routes
- Rename Settings* to Preferences*
- Reuse empty modifier in debug log
- Fix a visual bug in .themeTrailingValue() (extra Spacer)

Preparation for #914
2024-11-23 19:26:33 +01:00
Davide 3d092d6802
Revert marker width from #917 2024-11-23 13:30:29 +01:00
Davide 13118a5e2e
Improve profiles layout on small devices (#917)
- Smaller iCloud/TV icons
- Smaller marker width
- Less spacing before info button
2024-11-22 17:05:46 +01:00
Davide bd237c4a6f
Fix layout of multiline modules (#916)
- Align to .leading in multi-line
- Wrap profile rows into top/bottom spacers to adjust to tallest cell in
grid

See #915
2024-11-22 13:44:06 +01:00
Davide fb0d1abc8a
Add header to Mac menu profiles list 2024-11-22 13:09:22 +01:00
Davide 4b4fca8344
Replace active modules count with a description (#915)
To get access to modules, try to avoid full Profile objects. Instead,
replace the coupled ProfileHeader occurrences with a new intermediary
ProfilePreview everywhere.

This way, a ProfileProcessor can inject the localized modules
descriptions from above with the preview() method.
2024-11-22 12:52:51 +01:00
Davide 9b366dcaa0
Minor UI fixes (#910)
Update library with some more meaningful names for Profile accessors.

Refactor a few things about TV here and there.
2024-11-22 10:05:46 +01:00
Davide 366dc62231
Drop "Name" field from modules (#909)
Will rather add a "Notes" field to profiles. Module names feel
overwhelming.
2024-11-22 10:05:08 +01:00
Davide 0bff571d14
Polish TV profile view (#908)
- Layout with some profile details
- Add colors with adjusted brightness
- Add iOS/macOS instructions
- Add pending/sleeping markers
- Add previews
2024-11-22 02:20:41 +01:00
Davide 14398f5f20
Fix shared profile not updated on provider server selection (#906)
First, rename `force` parameter of ProfileManager.save() to `isLocal`,
because it's meant to be used when saving local profiles. In such
scenario, a profile that is also remotely shared _must_ be re-saved to
the remote repository.

This was not being done when selecting a provider server, and it could
be noticed because the other devices would only receive the iCloud
update after editing the profile and re-doing a manual "Save". Only at
that point would the new profile be re-shared on iCloud.
2024-11-22 00:46:58 +01:00
Davide b45f9c23fe
Rearrange targets for unit testing (#900)
- Move and rename entities
- Split protocols and default extensions
- Move in-app entities to CommonIAP target
2024-11-20 18:05:47 +01:00
Davide 35c10309a7
Reload receipt on purchase (#892)
StoreKit ProductView performs the purchases internally without calling
IAPManager.purchase(), which causes the IAPManager state to be
momentarily outdated.

Leverage PaywallView.onComplete() to reload the receipt and eventually
trigger IAPManager.objectWillChange, so that the app is immediately
unlocked on a successful purchase.
2024-11-19 11:36:36 +01:00
Davide d78456bb90
Show upgrade icon in profiles list (#891)
Visually clarify that a profile requires a purchase to be enabled.

- Implement AppFeatureRequiring in Profile
- Refactor IAPManager.verify() accordingly
- Pre-compute required features in ProfileManager via ProfileProcessor
2024-11-19 08:55:41 +01:00
Davide 1536551922
Prepare WireGuard for provider selector (#890)
- Omit configuration on creation to show provider selector
- Take out ConfigurationView like OpenVPN
2024-11-18 17:49:47 +01:00
Davide 89d7af4df7
Rethink eligibility checks (#889)
- Allow unrestricted save, but show PurchaseRequiredButton
- Warn however about paid features (FIXME)
- Redesign features in paywall
- Strip already eligible features from paywall
- List required features in restricted alert
- Localize feature descriptions
- Review propagation of paywall modifiers/reasons

Extra:

- Move more domain entities from UILibrary to CommonLibrary
- Default on-demand policy to .any (free feature)
- Fix modals not reappearing after closing with gesture
- Extend UILibrary start-up assertions
2024-11-18 17:43:01 +01:00
Davide a3dad4e445
Observe tunnel in grid/list
Can notice in Simulator not updating installed profile.

Regression from #843
2024-11-18 09:10:15 +01:00
Davide db592944ec
Rename module builders as functions 2024-11-17 22:30:22 +01:00
Davide 8e7f3e80ce
Update library with provider in modules (#887)
Move provider metadata from profile to module.
2024-11-17 22:27:02 +01:00
Davide 20813ac77e
Parametrize app name in strings 2024-11-17 18:48:40 +01:00
Davide 00ba67f135
Refactor buttons/menus
- Add divider in add profile menu
- Reuse trailing dots
2024-11-17 18:45:04 +01:00
Davide e58726d0af
Do not discard migrated profiles in TestFlight (#886)
Users would lose those profiles on downgrade to v2.
2024-11-17 18:21:37 +01:00
Davide a2f17cc905
Use long dash for excluded migration profiles 2024-11-17 16:26:22 +01:00
Davide 01e0559060
Fix some minor bugs
- Observe profiles on Simulator
- Dismiss on error when fetching migratable profiles
- Improve migration logs ambiguity
2024-11-17 15:47:19 +01:00
Davide c93a43702c
Improve migrate design (#885)
- Mention iCloud in informational message
- Redesign to always show message despite no migratable profiles
- Refine the looks
2024-11-17 14:02:40 +01:00
Davide 22e8e659e4
Discard old profiles once migrated (#884)
Otherwise, they would reappear if the migrated profiles are deleted from
the new store.
2024-11-17 11:40:49 +01:00
Davide 9e5beff23a
Perform migrate + import in one step (#882)
- Drop the .importing / .imported steps
- Animate rows re-sorting during process
- Rephrase some strings better
- Test fake migration with launch argument
2024-11-16 21:16:25 +01:00
Davide afa22719bf
Improve migrate header on iOS (#881)
Refactor into more subviews.
2024-11-16 15:07:47 +01:00
Davide 3737560851
Add the option to migrate old profiles (#879)
Finalize migration flow:

- Add entry to "Add" menu
- Suggest to migrate old profiles when there are no profiles
- Add informational message
- Keep included profiles on top
- Allow deletion of migratable profiles
- Fix duplicated Form in preview
- Rename views and models

Improve some Theme modifiers:

- Empty message with full screen option
- Progress modifier with custom view
- Confirmation dialog with custom message
2024-11-16 12:29:03 +01:00
Davide 9ca103e949
Refactor modal size to be a modifer parameter (#877)
Way more flexible.
2024-11-15 23:32:54 +01:00
Davide b08243949c
Nested ZStack modifiers in progress/empty modifiers (#876)
Merge into a single modifier because they are used together.
2024-11-15 16:33:26 +01:00
Davide 09e894dd60
Add explicit environment objects to TableColumn (#873)
For some reason, Table doesn't seem to inherit the environment in some
cases. Reapply environment to each TableColumn (only Theme is required).

Work around what clearly seems to be a SwiftUI bug.

Fixes #872
2024-11-15 01:47:52 +01:00
Davide 962ffdf678
Sort servers by .serverId in repository 2024-11-15 00:24:36 +01:00
Davide 6472ac0502
Revert "Sort provider servers on iOS"
This reverts commit 2b3961aef0.
2024-11-15 00:22:06 +01:00
Davide 2b3961aef0
Sort provider servers on iOS 2024-11-15 00:00:57 +01:00
Davide 596f5702c9
Disable migrations UI 2024-11-14 19:15:10 +01:00
Davide 615f7d47bd
Import migrated profiles (#867)
Finalize basic flow started in #866.
2024-11-14 15:11:25 +01:00
Davide 114e1abe12
Add initial migration UI (#866)
Repurpose LegacyManager as MigrationManager. Present initial migration
UI from "+" menu in app home.

Different styles:

- iOS → Section / ForEach
- macOS → Table
2024-11-14 11:02:26 +01:00
Davide 7ef780b8a4
Decouple Mac settings from AppMenu (#865)
- Rename AppMenu.Model to MacSettingsModel for global reuse in macOS app
- Fix compile errors on iOS
2024-11-13 22:35:50 +01:00