An open API service indexing awesome lists of open source software.

https://github.com/andylindebros/swiftreduxrouter


https://github.com/andylindebros/swiftreduxrouter

redux routing swift swift-redux swiftui

Last synced: 3 months ago
JSON representation

Awesome Lists containing this project

README

          

# SwiftRouter

SwiftRouter maps navigation to routes that provides SwiftUI views controlled by a NavigationState.

![Demo](https://github.com/andylindebros/SwiftReduxRouter/blob/master/SwiftReduxRouterExample/SwiftReduxRouter.gif)

It is written for SwiftUI apps based on a Redux pattern. This Router provides a NavigationState and a RouterView backed with UIKit. The NavigationState controls the navigation and you can easily go back and forth in the action history and the RouterView will navigate to a route.
The routerView uses the UINavigationController in the background since the current SwiftUI NavigationView does not provide necessary methods to make it work.

This package also provides a nessecary actions to use to changed the navigation state.

## Works with:

- SwiftUIRedux: https://github.com/andylindebros/SwiftUIRedux

## Install with Swift Package Manager

```Bash

dependencies: [
.package(url: "https://github.com/lindebrothers/SwiftReduxRouter.git", .upToNextMajor(from: ""))
]
```

## Implementation
See examples how to implement in the Example project within this package.

#### Deeplinks
Setup your scheme and deep links will be opened by the router.

Following rules apply to the example implementation above:

- `swiftrouter://example.com/tab1/page/2` will be pushed to the first tab
- `swiftrouter://example.com/tab1/page/1` will be selected in the first tab
- `swiftrouter:///tab2/page/2` will be selected in and will select the second tab.
- `swiftrouter:///tab2/page/1` will be pushed to the second tab
- `swiftrouter:///standalone/page/1` will be presented in the standalone navigationController on top of the tab bar
- `swiftrouter:///standalone/page/2` will be pushed to the presented standalone navigationController
- `swiftreduxrouter:///page/1` will be presented in a new navigationController on top of the tab bar
- `swiftrouter:///tab1` will select the first tab

You can dispatch the Deeplink anywhere in your app to navigate to any desired route.
```Swift
Button(action: {
store.disptach(Deeplink(url: URL(string: "/tab2/page/2")).action(for: store.navigation))
}) {
Text("Take me to page two in the second tab")
}
```

Test deeplinks from the terminal:
```Bash
xcrun simctl openurl booted ''
```

## URL Routing.

The router uses URL routing just like a web page. URL routing makes it easy to
organize your project and to work with deep links and Universal links. Choose a
path to your route. Make sure the path is unique, the router maps the first
matching route to a path.

```
/mypath/to/a/route
```

You can make parts of the URL dynamic and attach multiple rules

```
/user/
```

Supported dynamic parameters are:

- string - `user/`
- integer - `user/`
- float - `whatever/`
- uuid - `tokens/`
- path - `somepath/` will match everything after `somepath/`

## TabBar or a single UINavigationController
If you set the tab property of the SwiftRouter.Model in the init state, the SwiftRouter.RouterView will render a UITabBar.

## Presenting views.
A view gets presented by setting the navigationTarget to SwiftRouter.Target.new().
```Swift
dispatch(SwiftRouter.Action.add(path: NavPath("some path to a route"), to: .new()))
```
To dismiss it, you simply use the Dismiss action:
``` Swift
dispatch(SwiftRouter.Action.Dismiss(navigationModel: The navigationModel to dismiss))
```

### Alerts
You can trigger alerts by dispatching `SwiftRouter.Action.alert`
```Swift
dispatch(
SwiftRouter.alert(AlertModel(
type: .alert // .alert || .actionSheet, default is .alert
label: "The label of the alert", // Optional
message: "Optional message", // Optional
buttons: [
AlertModelButton(
label: "the button label",
action: SomeAction // needs to conform to NavigationActionProvider
type: UIAlertAction.Style = .default
)
]
))
)

extension SomeAction: NavigationActionsProvider {}
```

### Example app.
Try the example app `RouterExample` to find out more