Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work bench PR for one-go Core Data extraction into target #24242

Draft
wants to merge 116 commits into
base: trunk
Choose a base branch
from
Draft
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
5984666
Convert WordPressData from Swift package to Xcode target
mokagio Mar 12, 2025
2785440
Disable automatic code signing for WordPressData framework
mokagio Mar 12, 2025
43e1705
Disable "Build libraries for distribution" flag in WordPressData
mokagio Mar 12, 2025
3c10d22
Let WordPressData read iOS deployment target from the project config
mokagio Mar 12, 2025
6d72478
Use the same `SWIFT_INSTALL_OBJC_HEADER` as WordPressAuthenticator
mokagio Mar 12, 2025
abff234
Link WordPressData to the Jetpack target
mokagio Mar 12, 2025
b522f16
Add CocoaLumberjack to the WordPressData dependencies
mokagio Mar 12, 2025
43b9f98
Add SFHFKeychainUtils as a WordPressData dependency
mokagio Mar 14, 2025
55b5625
Move `NSManagedObject+Lookup` and `TaggedManagedObjectID` to WordPres…
mokagio Mar 12, 2025
a3ceaee
Disable `wpAssertionFailure` in `CoreDataHelper`
mokagio Mar 12, 2025
28b18ed
Add WordPressKit as a dependency to WordPressData
mokagio Mar 12, 2025
962b6c4
Move `PostContentProvider.h` to WordPressData
mokagio Mar 12, 2025
39cb3a6
Move `PostVisibility` definition in `AbstractPost.swift`
mokagio Mar 12, 2025
0cf5736
Move various file in staging folder before move to WordPressData
mokagio Mar 13, 2025
32d89b0
Move some models and their deps to WordPressData – Build fails
mokagio Mar 13, 2025
e84b287
Move a few more files, the next will be `WPAccount`...
mokagio Mar 13, 2025
1a6a19d
Move WPAccount and related dependencies - Build is worse than before
mokagio Mar 13, 2025
e2a9bf9
Remove a stray trailing new line from `PromptRemindersScheduler.swift`
mokagio Mar 13, 2025
6d6809c
Move yet more files...
mokagio Mar 13, 2025
e148a4e
Remove a couple of `WordPress-Swift.h` imports from WordPressData
mokagio Mar 14, 2025
4eda235
Do not treat warnings as errors in WordPressData
mokagio Mar 14, 2025
ce9dbf9
Move more files — Can't find WordPressData-Swift.h?!
mokagio Mar 14, 2025
d208e37
Add `NSURL+IDN` as a WordPressData dependency
mokagio Mar 14, 2025
9573c98
Add CocoaLumberjack (not the Swift) as a WordPressData dependency
mokagio Mar 14, 2025
06d1117
Add a bunch of missing imports
mokagio Mar 14, 2025
2d29f3f
Move `defaultWordPressComAccountRestAPI` definition to WordPressData
mokagio Mar 17, 2025
68985ce
Remove knowledge of `AppConfiguration` from WPAccount Objective-C
mokagio Mar 17, 2025
b1f01ea
Add precompiled header to WordPressData to configure CocoaLumberjack
mokagio Mar 17, 2025
5f61d4c
Remove documentation header params without descripiton
mokagio Mar 17, 2025
1ce5c3f
Add some missing imports and convert to angle bracket imports
mokagio Mar 17, 2025
f1de7a8
Add dedicated `.m` file for setting `DDLogLevel`
mokagio Mar 17, 2025
ad3fcbf
With these hacks, WordPressData compiles as a standalone framework
mokagio Mar 17, 2025
ab9f036
Fix issue with WordPressData tests attempting to build WordPress
mokagio Mar 17, 2025
09d6684
Disable CocoaLumberjack temporarily in WordPressData
mokagio Mar 17, 2025
83af2d1
Start addressing build failures when building WordPress
mokagio Mar 17, 2025
39e155e
Address some more import and access control issues to use WordPressData
mokagio Mar 17, 2025
24b19b5
Move `Domain.swift` to WordPressData
mokagio Mar 17, 2025
3aa2e47
Move `Role` to WordPressData
mokagio Mar 17, 2025
e9e2e23
Access control update in `Page`
mokagio Mar 17, 2025
31cb81c
Move `BlogQuery` to WordPressData
mokagio Mar 17, 2025
0313c12
Access control updates
mokagio Mar 17, 2025
3f5e16b
Move `Array+Page.swift` to WordPressData
mokagio Mar 17, 2025
dff027f
Move `Blog+Quota` to WordPressData
mokagio Mar 17, 2025
7de0721
Add CI step for fast iteration tests on WordPressData
mokagio Mar 17, 2025
1428772
Remove more incomplete documentation comments
mokagio Mar 17, 2025
fc44dc3
Address some more access control build failures
mokagio Mar 17, 2025
efeef8a
Give `BlogQuery` an explicit `init`
mokagio Mar 17, 2025
9357520
Add more necessary import and access control changes
mokagio Mar 18, 2025
f754dd4
Some more imports and access control changes
mokagio Mar 18, 2025
2af4611
Move `PublicizeInfo` to WordPressData
mokagio Mar 18, 2025
eb6a137
Move `SiteSuggestion` to WordPressData
mokagio Mar 18, 2025
7fa19e7
Move `UserSuggestion` to WordPressData
mokagio Mar 18, 2025
ecefd37
More access control changes to get the code to compile
mokagio Mar 18, 2025
d53ad35
More access control changes
mokagio Mar 18, 2025
db834a4
Update more access control levels
mokagio Mar 18, 2025
91c642a
Move `PageTemplateCategory` to WordPressData
mokagio Mar 18, 2025
d125e56
Move `PageTemplateLayout` to WordPressData
mokagio Mar 18, 2025
42f9774
More imports and access control
mokagio Mar 18, 2025
f117d63
Actually add `UserSettings` to the WordPressData
mokagio Mar 18, 2025
5e10c44
More...
mokagio Mar 18, 2025
0f40d14
Remove `WPAccount.h` imports outside WordPressData
mokagio Mar 18, 2025
18cf578
Remove imports of classes that are now in WordPressData
mokagio Mar 18, 2025
c382201
More...
mokagio Mar 18, 2025
3d7ecf4
Rebase - Move Comment to WordPressData
mokagio Mar 18, 2025
d31f441
Remove unused `AccountService.h` import
mokagio Mar 18, 2025
05b4afa
Move `ReaderPost` and related dependencies
mokagio Mar 19, 2025
1d6ce8b
More...
mokagio Mar 19, 2025
83f88c5
Address a couple for `FIXME`s from the `ReaderPost` move
mokagio Mar 19, 2025
200ff3b
More...
mokagio Mar 19, 2025
e6dc51b
Update `DataMigrator` for older `SharedDataIssueSolver` changes
mokagio Mar 19, 2025
ee520fe
More...
mokagio Mar 19, 2025
fb06d74
Remove redundant `public` access-level
mokagio Mar 19, 2025
2b923a7
Remove useless `NSURL+IDN` import
mokagio Mar 19, 2025
11f65dd
Begin to address test build failures...
mokagio Mar 19, 2025
36df4db
Move WordPressData files from staging folder to target folder
mokagio Mar 19, 2025
964b8b4
Split WordPressData in Objective-C and Swift folders
mokagio Mar 19, 2025
156dabe
Use same module settings as WordPressAuthenticator
mokagio Mar 19, 2025
58471be
Use `xcconfig` for WordPressData, same as WordPressAuthenticator
mokagio Mar 19, 2025
66079ce
Make WordPress unit tests compile
mokagio Mar 19, 2025
f6b6790
Use default `PRODUCT_MODULE_NAME` definition
mokagio Mar 19, 2025
85b5691
Add WordPressData tests to the main unit tests `xctestplan`
mokagio Mar 20, 2025
9d58092
Add `BlockedAuthor` to WordPressData
mokagio Mar 20, 2025
f5e59a2
Move Gutenberg models to WordPressData
mokagio Mar 20, 2025
6175810
Add FormattableContentKit dependency to WordPressData
mokagio Mar 20, 2025
d4f00c9
Move more models, build still broken
mokagio Mar 20, 2025
5fccd59
Address SwiftLint violations
mokagio Mar 25, 2025
039f8f2
Add some missing imports
mokagio Mar 25, 2025
26ab2c7
Add more files to WordPressData target
mokagio Mar 25, 2025
dde7837
Move other files to WordPressData
mokagio Mar 25, 2025
33e94f1
Move most of the Blogging Prompts models to WordPressData
mokagio Mar 25, 2025
a01d92f
Move more models to WordPressData
mokagio Mar 25, 2025
85bcdf8
Make WordPress and Jetpack targets build
mokagio Mar 25, 2025
9618eb3
Make WordPress unit tests build
mokagio Mar 25, 2025
469e3dc
Add Gravatar as a dependency to WordPressData
mokagio Mar 25, 2025
99b9332
Remove unused WordPressUI import from `ManagedPerson`
mokagio Mar 25, 2025
5c5165c
Move `ManagedPerson` to WordPressData
mokagio Mar 25, 2025
29d7fac
Add note for incorrect `Notification` ext in FormattableContentKit
mokagio Mar 26, 2025
7531f94
Remove `ReachabilityUtils.onAvailableInternetConnectionDo`
mokagio Mar 26, 2025
bcd1ac9
Move `Notification` to WordPressData
mokagio Mar 26, 2025
88efddc
Fix `WPAccount+Keychain` location in WordPressData subfolders
mokagio Mar 26, 2025
e9144a7
Move `WordPress.xcdatamodeld` to WordPressData
mokagio Mar 26, 2025
42d07a4
Move `Blog` `BlockEditorSettings` `Capabilities` and `Plans` extensions
mokagio Mar 26, 2025
54899b2
Convert a `Blog support...` from Objective-C to Swift
mokagio Mar 26, 2025
c7b97cf
Port `Blog` `dotComID` and `willSave` to Swift
mokagio Mar 26, 2025
cf91cad
Port `siteVisibility` `Blog` property to Swift
mokagio Mar 26, 2025
884c4cd
Update after rebase - SharingAuthorizationHelper.m
mokagio Mar 27, 2025
f59c04f
Update after rebase - Blog.m
mokagio Mar 27, 2025
90c36e7
Update after rebase - WPAccount+RestApi.swift
mokagio Mar 27, 2025
e0ff7dd
Fix after rebase - PostVisibility.swift
mokagio Mar 27, 2025
78f20e9
Remove duplicated import
mokagio Mar 27, 2025
27425aa
Fix after rebase - StatsViewController.m
mokagio Mar 27, 2025
bef98f2
Remove code disable during WordPressData move in `Comment`
mokagio Mar 28, 2025
c600af8
Remove code disable during WordPressData move in `ReaderSiteTopic`
mokagio Mar 28, 2025
ea5dc54
Re-enable `wpAssert` calls in WordPressData thanks to #24346
mokagio Mar 28, 2025
80d3336
Remove code disable during WordPressData move in `ReaderCard`
mokagio Mar 28, 2025
15bbed5
Remove "module WordPress" from `xcdatamodel` entities that had it
mokagio Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
17 changes: 17 additions & 0 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
@@ -52,6 +52,23 @@ steps:
#################
# Run Unit Tests
#################
- label: "WordPressData tests"
command: |
echo "--- :rubygems: Setting up Gems"
install_gems
echo "--- :swift: Setting up Swift Packages"
install_swiftpm_dependencies
echo "--- :microscope: Test"
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120 bundle exec fastlane run scan \
scheme:WordPressData \
device:'iPhone 16'
plugins: [$CI_TOOLKIT_PLUGIN]
artifact_paths:
- "build/results/*"
notify:
- github_commit_status:
context: "WordPressData Unit Tests"

- label: "🔬 :wordpress: Unit Tests"
command: ".buildkite/commands/run-unit-tests.sh"
depends_on: "build_wordpress"
28 changes: 18 additions & 10 deletions Modules/Package.swift
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@ let package = Package(
.library(name: "NotificationServiceExtensionCore", targets: ["NotificationServiceExtensionCore"]),
.library(name: "ShareExtensionCore", targets: ["ShareExtensionCore"]),
.library(name: "SFHFKeychainUtils", targets: ["SFHFKeychainUtils"]),
.library(name: "WordPressData", targets: ["WordPressData"]),
.library(name: "WordPressFlux", targets: ["WordPressFlux"]),
.library(name: "WordPressShared", targets: ["WordPressShared"]),
.library(name: "WordPressUI", targets: ["WordPressUI"]),
@@ -121,14 +120,6 @@ let package = Package(
.product(name: "ScreenObject", package: "ScreenObject"),
.product(name: "XCUITestHelpers", package: "ScreenObject"),
], swiftSettings: [.swiftLanguageMode(.v5)]),
.target(name: "WordPressDataObjC"),
.target(
name: "WordPressData",
dependencies: [
.target(name: "WordPressDataObjC"),
.target(name: "WordPressSharedObjC")
]
),
.target(name: "WordPressFlux", swiftSettings: [.swiftLanguageMode(.v5)]),
.target(name: "WordPressCore", dependencies: [.target(name: "WordPressShared"), .product(name: "WordPressAPI", package: "wordpress-rs")]),
.target(name: "WordPressSharedObjC", resources: [.process("Resources")], swiftSettings: [.swiftLanguageMode(.v5)]),
@@ -195,6 +186,7 @@ enum XcodeSupport {
.library(name: "XcodeTarget_WordPressTests", targets: ["XcodeTarget_WordPressTests"]),
.library(name: "XcodeTarget_WordPressAuthentificator", targets: ["XcodeTarget_WordPressAuthentificator"]),
.library(name: "XcodeTarget_WordPressAuthentificatorTests", targets: ["XcodeTarget_WordPressAuthentificatorTests"]),
.library(name: "XcodeTarget_WordPressData", targets: ["XcodeTarget_WordPressData"]),
.library(name: "XcodeTarget_ShareExtension", targets: ["XcodeTarget_ShareExtension"]),
.library(name: "XcodeTarget_DraftActionExtension", targets: ["XcodeTarget_DraftActionExtension"]),
.library(name: "XcodeTarget_NotificationServiceExtension", targets: ["XcodeTarget_NotificationServiceExtension"]),
@@ -252,7 +244,6 @@ enum XcodeSupport {
"NotificationServiceExtensionCore",
"SFHFKeychainUtils",
"ShareExtensionCore",
"WordPressData",
"WordPressFlux",
"WordPressShared",
"WordPressReader",
@@ -289,6 +280,7 @@ enum XcodeSupport {
.product(name: "WordPressEditor", package: "AztecEditor-iOS"),
]),
.xcodeTarget("XcodeTarget_WordPressTests", dependencies: testDependencies + [
"FormattableContentKit",
"SFHFKeychainUtils",
"WordPressShared",
"WordPressUI",
@@ -298,6 +290,22 @@ enum XcodeSupport {
]),
.xcodeTarget("XcodeTarget_WordPressAuthentificator", dependencies: wordPresAuthentificatorDependencies),
.xcodeTarget("XcodeTarget_WordPressAuthentificatorTests", dependencies: wordPresAuthentificatorDependencies + testDependencies),
.xcodeTarget(
"XcodeTarget_WordPressData",
dependencies: [
"BuildSettingsKit",
"FormattableContentKit",
"SFHFKeychainUtils",
"WordPressShared",
// FIXME: Having issues with CocoaLumberjack as a transitive dependency when added to Objective-C files
// .product(name: "CocoaLumberjack", package: "CocoaLumberjack"),
.product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"),
.product(name: "Gravatar", package: "Gravatar-SDK-iOS"),
.product(name: "NSObject-SafeExpectations", package: "NSObject-SafeExpectations"),
.product(name: "NSURL+IDN", package: "NSURL-IDN"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
]
),
.xcodeTarget("XcodeTarget_ShareExtension", dependencies: shareAndDraftExtensionsDependencies),
.xcodeTarget("XcodeTarget_DraftActionExtension", dependencies: shareAndDraftExtensionsDependencies),
.xcodeTarget("XcodeTarget_NotificationServiceExtension", dependencies: [
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@ private enum Constants {
static let Ranges = "ranges"
}

// FIXME: This is a WordPressData notification!
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be fixable by moving some bits back to the app target. I might have been too quick in moving types...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually... I'm not sure it's a WordPressData Notification... Anyway, I got rid of Notification here altogether in #24354

extension Notification {
enum ContentType: String {
case comment
1 change: 0 additions & 1 deletion Modules/Sources/WordPressData/WordPressData.swift

This file was deleted.

6 changes: 0 additions & 6 deletions Modules/Sources/WordPressDataObjC/WordPressData.h

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Foundation

public struct __Empty {}
3 changes: 1 addition & 2 deletions WordPress/Classes/Categories/Media+Extensions.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#import "Media+Extensions.h"
#import "MediaService.h"
#import "Blog.h"
@import WordPressDataObjC;
@import WordPressData;
@import WordPressShared;
#import "WordPress-Swift.h"

Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import Foundation
import WordPressData

/// Encapsulates Notification Interface Helpers
///
extension Notification {
extension WordPressData.Notification {
/// Returns a Section Identifier that can be sorted. Note that this string is not human readable, and
/// you should use the *descriptionForSectionIdentifier* method as well!.
///
1 change: 1 addition & 0 deletions WordPress/Classes/Extensions/Post+BloggingPrompts.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

extension Post {

5 changes: 3 additions & 2 deletions WordPress/Classes/Extensions/SVProgressHUD+Extensions.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Foundation
import SVProgressHUD

extension SVProgressHUD {
@@ -37,11 +38,11 @@ extension SVProgressHUD {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.SVProgressHUDWillDisappear, object: nil)
}

@objc static func handleHUDTappedNotification(_ notification: Notification) {
@objc static func handleHUDTappedNotification(_ notification: Foundation.Notification) {
SVProgressHUD.dismiss()
}

@objc static func handleHUDDisappearedNotification(_ notification: Notification) {
@objc static func handleHUDDisappearedNotification(_ notification: Foundation.Notification) {
// Prevent unregistering if another HUD is still visible
if !SVProgressHUD.isVisible() {
unregisterFromHUDNotifications()
10 changes: 7 additions & 3 deletions WordPress/Classes/Jetpack/Utility/DataMigrator.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Foundation
import AutomatticTracks
import BuildSettingsKit
import WordPressData
import WordPressShared

protocol ContentDataMigrating {
@@ -12,7 +13,7 @@ protocol ContentDataMigrating {
/// Imports user's WordPress content data from the shared location.
///
/// - Parameter completion: Closure called after the export process completes.
func importData(completion: ((Result<Void, DataMigrationError>) -> Void)?)
func importData(isJetpack: Bool, completion: ((Result<Void, DataMigrationError>) -> Void)?)

/// Deletes any exported user content at the shared location if it exists.
func deleteExportedData()
@@ -65,7 +66,10 @@ extension DataMigrator: ContentDataMigrating {
completion?(.success(()))
}

func importData(completion: ((Result<Void, DataMigrationError>) -> Void)? = nil) {
func importData(
isJetpack: Bool = AppConfiguration.isJetpack,
completion: ((Result<Void, DataMigrationError>) -> Void)? = nil
) {
guard isDataReadyToMigrate else {
completion?(.failure(.dataNotReadyToImport))
return
@@ -92,7 +96,7 @@ extension DataMigrator: ContentDataMigrating {
sharedDefaults: sharedDefaults,
appGroupName: appGroupName
)
sharedDataIssueSolver.migrateAuthKey()
sharedDataIssueSolver.migrateAuthKey(isJetpack: isJetpack)
sharedDataIssueSolver.migrateExtensionsData()
BloggingRemindersScheduler.handleRemindersMigration(appGroupName: appGroupName)
completion?(.success(()))
2 changes: 2 additions & 0 deletions WordPress/Classes/Models/Blog/Blog+Creation.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import WordPressData

extension Blog {

/// Creates a blank `Blog` object for this account
1 change: 1 addition & 0 deletions WordPress/Classes/Models/Blog/Blog+Editor.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

enum MobileEditor: String {
case aztec
1 change: 1 addition & 0 deletions WordPress/Classes/Models/Blog/Blog+JetpackSocial.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

/// Blog extension for methods related to Jetpack Social.
extension Blog {
1 change: 1 addition & 0 deletions WordPress/Classes/Models/Blog/Blog+Lookup.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

/// An extension dedicated to looking up and returning blog objects
public extension Blog {
2 changes: 1 addition & 1 deletion WordPress/Classes/Models/Blog/Blog+Organization.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import Foundation
import WordPressData

extension Blog {
var isAutomatticP2: Bool {
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

/// In this extension, we implement several nested Enums (and helper setters / getters) aimed at simplifying
/// the BlogSettings interface for handling writing date and time format properties.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData

/// In this extension, we implement several nested Enums (and helper setters / getters) aimed at simplifying
/// the BlogSettings interface. This may be considered as an Adapter class, *Swift* style!
14 changes: 0 additions & 14 deletions WordPress/Classes/Models/GravatarProfile.swift

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import WordPressData
import WordPressKit
import Gutenberg

@@ -21,7 +22,7 @@ extension BlockEditorSettings: GutenbergEditorSettings {
}
}

extension BlockEditorSettings {
public extension BlockEditorSettings {
convenience init?(editorTheme: RemoteEditorTheme, context: NSManagedObjectContext) {
self.init(context: context)
self.isFSETheme = editorTheme.themeSupport?.blockTemplates ?? false
24 changes: 10 additions & 14 deletions WordPress/Classes/Models/Notifications/Actions/ApproveComment.swift
Original file line number Diff line number Diff line change
@@ -36,22 +36,18 @@ class ApproveComment: DefaultNotificationActionCommand {
}

private func unApprove(block: FormattableCommentContent) {
ReachabilityUtils.onAvailableInternetConnectionDo {
actionsService?.unapproveCommentWithBlock(block, completion: { [weak self] success in
if success {
self?.on.toggle()
}
})
}
actionsService?.unapproveCommentWithBlock(block, completion: { [weak self] success in
if success {
self?.on.toggle()
}
})
}

private func approve(block: FormattableCommentContent) {
ReachabilityUtils.onAvailableInternetConnectionDo {
actionsService?.approveCommentWithBlock(block, completion: { [weak self] success in
if success {
self?.on.toggle()
}
})
}
actionsService?.approveCommentWithBlock(block, completion: { [weak self] success in
if success {
self?.on.toggle()
}
})
}
}
Loading