Skip to content

Commit

Permalink
Merge pull request #10 from divadretlaw/develop
Browse files Browse the repository at this point in the history
Update Custom Alert
  • Loading branch information
divadretlaw authored Oct 18, 2023
2 parents d34b68d + 6c450db commit c98cc9b
Show file tree
Hide file tree
Showing 28 changed files with 1,106 additions and 436 deletions.
232 changes: 232 additions & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
# By default, SwiftLint uses a set of sensible default rules you can adjust:
disabled_rules: # rule identifiers turned on by default to exclude from running
# - blanket_disable_command
# - block_based_kvo
# - class_delegate_protocol
# - closing_brace
# - closure_parameter_position
# - colon
# - comma
# - comment_spacing
# - compiler_protocol_init
# - computed_accessors_order
# - control_statement
# - custom_rules
# - cyclomatic_complexity
# - deployment_target
# - discouraged_direct_init
# - duplicate_conditions
# - duplicate_enum_cases
# - duplicate_imports
# - duplicated_key_in_dictionary_literal
# - dynamic_inline
# - empty_enum_arguments
# - empty_parameters
# - empty_parentheses_with_trailing_closure
# - file_length
# - for_where
# - force_cast
# - force_try
# - function_body_length
# - function_parameter_count
# - generic_type_name
# - identifier_name
# - implicit_getter
# - inclusive_language
# - invalid_swiftlint_command
# - is_disjoint
# - large_tuple
# - leading_whitespace
# - legacy_cggeometry_functions
# - legacy_constant
# - legacy_constructor
# - legacy_hashing
# - legacy_nsgeometry_functions
# - legacy_random
# - line_length
# - mark
# - multiple_closures_with_trailing_closure
# - nesting
# - no_fallthrough_only
# - no_space_in_method_call
# - notification_center_detachment
# - ns_number_init_as_function_reference
# - nsobject_prefer_isequal
# - opening_brace
# - operator_whitespace
# - orphaned_doc_comment
# - private_over_fileprivate
# - private_unit_test
# - protocol_property_accessors_order
# - reduce_boolean
# - redundant_discardable_let
# - redundant_objc_attribute
# - redundant_optional_initialization
# - redundant_set_access_control
# - redundant_string_enum_value
# - redundant_void_return
# - return_arrow_whitespace
# - self_in_property_initialization
# - shorthand_operator
# - statement_position
# - superfluous_disable_command
# - switch_case_alignment
# - syntactic_sugar
# - todo
# - trailing_comma
# - trailing_newline
# - trailing_semicolon
- trailing_whitespace
# - type_body_length
# - type_name
# - unavailable_condition
# - unneeded_break_in_switch
# - unused_closure_parameter
# - unused_control_flow_label
# - unused_enumerated
# - unused_optional_binding
# - unused_setter_value
# - valid_ibinspectable
# - vertical_parameter_alignment
# - vertical_whitespace
# - void_function_in_ternary
# - void_return
# - xctfail_message
opt_in_rules: # some rules are turned off by default, so you need to opt-in
- accessibility_label_for_image
- accessibility_trait_for_button
# - anonymous_argument_in_multiline_closure
- array_init
# - attributes
- balanced_xctest_lifecycle
# - capture_variable
# - closure_body_length
- closure_end_indentation
- closure_spacing
- collection_alignment
- comma_inheritance
# - conditional_returns_on_newline
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- contains_over_range_nil_comparison
- convenience_type
- direct_return
- discarded_notification_center_observer
- discouraged_assert
- discouraged_none_name
- discouraged_object_literal
- discouraged_optional_boolean
# - discouraged_optional_collection
- empty_collection_literal
- empty_count
- empty_string
- empty_xctest_method
- enum_case_associated_values_count
- expiring_todo
# - explicit_acl
# - explicit_enum_raw_value
- explicit_init
# - explicit_self
# - explicit_top_level_acl
# - explicit_type_interface
# - extension_access_modifier
- fallthrough
- fatal_error_message
- file_header
# - file_name
- file_name_no_space
# - file_types_order
- first_where
- flatmap_over_map_reduce
- force_unwrapping
# - function_default_parameter_at_end
- ibinspectable_in_extension
- identical_operands
- implicit_return
- implicitly_unwrapped_optional
# - indentation_width
- joined_default_parameter
- last_where
- legacy_multiple
- legacy_objc_type
- let_var_whitespace
- literal_expression_end_indentation
- local_doc_comment
- lower_acl_than_parent
# - missing_docs
- modifier_order
- multiline_arguments
# - multiline_arguments_brackets
- multiline_function_chains
# - multiline_literal_brackets
- multiline_parameters
- multiline_parameters_brackets
- nimble_operator
# - no_extension_access_modifier
- no_grouping_extension
# - no_magic_numbers
- nslocalizedstring_key
# - nslocalizedstring_require_bundle
- number_separator
- object_literal
- operator_usage_whitespace
- optional_enum_case_matching
- overridden_super_call
- override_in_extension
- pattern_matching_keywords
- period_spacing
- prefer_nimble
# - prefer_self_in_static_references
# - prefer_self_type_over_type_of_self
- prefer_zero_over_explicit_init
- prefixed_toplevel_constant
- private_action
- private_outlet
# - private_subject
- prohibited_interface_builder
- prohibited_super_call
- quick_discouraged_call
- quick_discouraged_focused_test
- quick_discouraged_pending_test
- raw_value_for_camel_cased_codable_enum
- reduce_into
- redundant_nil_coalescing
- redundant_self_in_closure
# - redundant_type_annotation
# - required_deinit
- required_enum_case
- return_value_from_void_function
- self_binding
# - shorthand_optional_binding
- single_test_class
# - sorted_enum_cases
- sorted_first_last
# - sorted_imports
- static_operator
- strict_fileprivate
- strong_iboutlet
# - superfluous_else
- switch_case_on_newline
- test_case_accessibility
- toggle_bool
# - trailing_closure
# - type_contents_order
# - typesafe_array_init
- unavailable_function
- unhandled_throwing_task
- unneeded_parentheses_in_closure_argument
- unowned_variable_capture
- untyped_error_in_catch
# - unused_declaration
# - unused_import
- vertical_parameter_alignment_on_call
# - vertical_whitespace_between_cases
- vertical_whitespace_closing_braces
- vertical_whitespace_opening_braces
- weak_delegate
- xct_specific_matcher
- yoda_condition

included:
- Sources
4 changes: 4 additions & 0 deletions Demo/Demo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
6302131F2960A4850065DBDD /* InputAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6302131E2960A4850065DBDD /* InputAlerts.swift */; };
630213212960A4EE0065DBDD /* MultiButtonAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 630213202960A4EE0065DBDD /* MultiButtonAlerts.swift */; };
630213232960A55B0065DBDD /* OtherAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 630213222960A55B0065DBDD /* OtherAlerts.swift */; };
6346D7772ADF27D5008222CE /* CustomAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6346D7762ADF27D5008222CE /* CustomAlerts.swift */; };
6364916428AFEAFB00FA518B /* DemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6364916328AFEAFB00FA518B /* DemoApp.swift */; };
6364916628AFEAFB00FA518B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6364916528AFEAFB00FA518B /* ContentView.swift */; };
6364916828AFEAFC00FA518B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6364916728AFEAFC00FA518B /* Assets.xcassets */; };
Expand All @@ -23,6 +24,7 @@
6302131E2960A4850065DBDD /* InputAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputAlerts.swift; sourceTree = "<group>"; };
630213202960A4EE0065DBDD /* MultiButtonAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiButtonAlerts.swift; sourceTree = "<group>"; };
630213222960A55B0065DBDD /* OtherAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OtherAlerts.swift; sourceTree = "<group>"; };
6346D7762ADF27D5008222CE /* CustomAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAlerts.swift; sourceTree = "<group>"; };
6364916028AFEAFB00FA518B /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
6364916328AFEAFB00FA518B /* DemoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoApp.swift; sourceTree = "<group>"; };
6364916528AFEAFB00FA518B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -69,6 +71,7 @@
6302131C29609C620065DBDD /* SimpleAlerts.swift */,
6302131E2960A4850065DBDD /* InputAlerts.swift */,
630213202960A4EE0065DBDD /* MultiButtonAlerts.swift */,
6346D7762ADF27D5008222CE /* CustomAlerts.swift */,
630213222960A55B0065DBDD /* OtherAlerts.swift */,
6364916728AFEAFC00FA518B /* Assets.xcassets */,
6364916928AFEAFC00FA518B /* Preview Content */,
Expand Down Expand Up @@ -174,6 +177,7 @@
files = (
6364916628AFEAFB00FA518B /* ContentView.swift in Sources */,
6302131D29609C620065DBDD /* SimpleAlerts.swift in Sources */,
6346D7772ADF27D5008222CE /* CustomAlerts.swift in Sources */,
6364916428AFEAFB00FA518B /* DemoApp.swift in Sources */,
630213232960A55B0065DBDD /* OtherAlerts.swift in Sources */,
6302131F2960A4850065DBDD /* InputAlerts.swift in Sources */,
Expand Down
2 changes: 2 additions & 0 deletions Demo/Demo/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ struct ContentView: View {
MultiButtonAlerts()

OtherAlerts()

CustomAlerts()
}
.navigationTitle("Custom Alert")
}
Expand Down
64 changes: 64 additions & 0 deletions Demo/Demo/CustomAlerts.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//
// CustomAlerts.swift
// Demo
//
// Created by David Walter on 17.10.23.
//

import SwiftUI
import CustomAlert

struct CustomAlerts: View {
@State private var showAlert = false
var body: some View {
Section {
Button {
showAlert = true
} label: {
Text("Custom Button")
}
.customAlert("Preview", isPresented: $showAlert) {
Text("Content")
} actions: {
MultiButton {
Button {
} label: {
Text("Cancel")
}
Button {
} label: {
Text("OK")
}
}
}
.environment(\.customAlertConfiguration, .create { configuration in
configuration.background = .blurEffect(.dark)
configuration.padding = EdgeInsets()
configuration.alert = .create { alert in
alert.background = .color(.white)
alert.cornerRadius = 4
alert.padding = EdgeInsets(top: 20, leading: 20, bottom: 15, trailing: 20)
alert.minWidth = 300
alert.titleFont = .headline
alert.contentFont = .subheadline
alert.alignment = .leading
alert.spacing = 10
}
configuration.button = .create { button in
button.tintColor = .purple
button.padding = EdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10)
button.font = .callout.weight(.semibold)
button.hideDivider = true
}
})
}
}
}

struct CustomAlerts_Previews: PreviewProvider {
static var previews: some View {
List {
CustomAlerts()
}
}
}
6 changes: 3 additions & 3 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import PackageDescription
let package = Package(
name: "CustomAlert",
platforms: [
.iOS(.v13)
.iOS(.v14)
],
products: [
.library(
Expand All @@ -15,9 +15,9 @@ let package = Package(
)
],
dependencies: [
.package(url: "https://github.com/divadretlaw/WindowSceneReader", from: "2.1.0")
.package(url: "https://github.com/divadretlaw/WindowKit", branch: "main")
],
targets: [
.target(name: "CustomAlert", dependencies: ["WindowSceneReader"])
.target(name: "CustomAlert", dependencies: ["WindowKit"])
]
)
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,19 @@ You can create Side by Side Buttons using `MultiButton`
}
```

The alert is customizable via the `Environment`

<img src="Sources/CustomAlert/Documentation.docc/Resources/CustomConfiguration.png" width="300">

```swift
.environment(\.customAlertConfiguration, .create { configuration in
// Adapt the configuration
})
```

You can also display an Alert inline, within a `List` for example

![Inline Alert](Sources/CustomAlert/Documentation.docc/Resources/InlineAlert.png)
<img src="Sources/CustomAlert/Documentation.docc/Resources/InlineAlert.png" width="300">

```swift
InlineAlert {
Expand Down
Loading

0 comments on commit c98cc9b

Please sign in to comment.