Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
  •  
  •  
  •  
11 changes: 1 addition & 10 deletions Modules/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 40 additions & 15 deletions Modules/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,6 @@ let package = Package(
.package(url: "https://github.com/wordpress-mobile/NSObject-SafeExpectations", from: "0.0.6"),
.package(url: "https://github.com/wordpress-mobile/wpxmlrpc", from: "0.9.0"),
.package(url: "https://github.com/wordpress-mobile/NSURL-IDN", revision: "b34794c9a3f32312e1593d4a3d120572afa0d010"),
.package(
url: "https://github.com/wordpress-mobile/WordPressKit-iOS",
branch: "rework-spm"
),
.package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"),
// We can't use wordpress-rs branches nor commits here. Only tags work.
.package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20250901"),
Expand Down Expand Up @@ -88,9 +84,9 @@ let package = Package(
dependencies: [
"WordPressShared",
"WordPressUI",
.product(name: "Gridicons", package: "Gridicons-iOS"),
// TODO: Remove — It's here just for a NSMutableParagraphStyle init helper
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
"WordPressKit",
.product(name: "Gridicons", package: "Gridicons-iOS"),
],
// Set to v5 to avoid @Sendable warnings and errors
swiftSettings: [.swiftLanguageMode(.v5)]
Expand All @@ -99,7 +95,7 @@ let package = Package(
name: "JetpackStats",
dependencies: [
"WordPressUI",
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
"WordPressKit",
],
resources: [.process("Resources")]
),
Expand All @@ -110,6 +106,7 @@ let package = Package(
"BuildSettingsKit",
"SFHFKeychainUtils",
"WordPressShared",
"WordPressKit",
// Even though the extension is all in Swift, we need to include the Objective-C
// version of CocoaLumberjack to avoid linking issues with other dependencies that
// use it.
Expand All @@ -121,7 +118,6 @@ let package = Package(
// in SharedCoreDataStack.o
.product(name: "CocoaLumberjack", package: "CocoaLumberjack"),
.product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
],
resources: [.process("Resources/Extensions.xcdatamodeld")]
),
Expand Down Expand Up @@ -176,6 +172,35 @@ let package = Package(
resources: [.process("Resources")],
swiftSettings: [.swiftLanguageMode(.v5)]
),
.target(name: "WordPressKitObjCUtils"),
.target(
name: "WordPressKitModels",
dependencies: [
"NSObject-SafeExpectations",
"WordPressKitObjCUtils",
]
),
.target(
name: "WordPressKitObjC",
dependencies: [
"NSObject-SafeExpectations",
"wpxmlrpc",
"WordPressKitModels",
"WordPressKitObjCUtils",
],
publicHeadersPath: "include"
),
.target(
name: "WordPressKit",
dependencies: [
"WordPressKitObjC",
"WordPressKitModels",
"WordPressKitObjCUtils",
"NSObject-SafeExpectations",
"wpxmlrpc",
],
swiftSettings: [.swiftLanguageMode(.v5)]
),
.target(
name: "WordPressReader",
dependencies: ["AsyncImageKit", "WordPressUI", "WordPressShared"],
Expand Down Expand Up @@ -240,10 +265,10 @@ enum XcodeSupport {
"BuildSettingsKit",
"WordPressShared",
"WordPressUI",
"WordPressKit",
.product(name: "Gridicons", package: "Gridicons-iOS"),
.product(name: "NSURL-IDN", package: "NSURL-IDN"),
.product(name: "SVProgressHUD", package: "SVProgressHUD"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
.product(name: "Gravatar", package: "Gravatar-SDK-iOS"),
.product(name: "GravatarUI", package: "Gravatar-SDK-iOS"),
]
Expand All @@ -257,6 +282,7 @@ enum XcodeSupport {
"WordPressUI",
"TextBundle",
"TracksMini",
"WordPressKit",
// Even though the extensions are all in Swift, we need to include the Objective-C
// version of CocoaLumberjack to avoid linking issues with other dependencies that
// use it.
Expand All @@ -275,7 +301,6 @@ enum XcodeSupport {
.product(name: "ZIPFoundation", package: "ZIPFoundation"),
.product(name: "Aztec", package: "AztecEditor-iOS"),
.product(name: "WordPressEditor", package: "AztecEditor-iOS"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
]

let testDependencies: [Target.Dependency] = [
Expand All @@ -300,6 +325,7 @@ enum XcodeSupport {
"WordPressReader",
"WordPressUI",
"WordPressCore",
"WordPressKit",
.product(name: "Alamofire", package: "Alamofire"),
.product(name: "AutomatticAbout", package: "AutomatticAbout-swift"),
.product(name: "AutomatticTracks", package: "Automattic-Tracks-iOS"),
Expand All @@ -322,7 +348,6 @@ enum XcodeSupport {
.product(name: "SVProgressHUD", package: "SVProgressHUD"),
.product(name: "SwiftSoup", package: "SwiftSoup"),
.product(name: "UIDeviceIdentifier", package: "UIDeviceIdentifier"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
.product(name: "ZendeskSupportSDK", package: "support_sdk_ios"),
.product(name: "ZIPFoundation", package: "ZIPFoundation"),
.product(name: "WordPressAPI", package: "wordpress-rs"),
Expand All @@ -345,16 +370,16 @@ enum XcodeSupport {
"BuildSettingsKit",
"FormattableContentKit",
"SFHFKeychainUtils",
"WordPressKit",
.product(name: "CocoaLumberjack", package: "CocoaLumberjack"),
.product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"),
.product(name: "NSObject-SafeExpectations", package: "NSObject-SafeExpectations"),
.product(name: "NSURL-IDN", package: "NSURL-IDN"),
.product(name: "WordPressAPI", package: "wordpress-rs"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
]),
.xcodeTarget("XcodeTarget_WordPressKitTests", dependencies: testDependencies + [
"wpxmlrpc",
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
"WordPressKit",
]),
.xcodeTarget("XcodeTarget_WordPressAuthentificator", dependencies: wordPresAuthentificatorDependencies),
.xcodeTarget("XcodeTarget_WordPressAuthentificatorTests", dependencies: wordPresAuthentificatorDependencies + testDependencies),
Expand Down Expand Up @@ -387,6 +412,7 @@ enum XcodeSupport {
"TracksMini",
"WordPressShared",
"WordPressUI",
"WordPressKit",
// Even though the extensions are all in Swift, we need to include the Objective-C
// version of CocoaLumberjack to avoid linking issues with other dependencies that
// use it.
Expand All @@ -399,7 +425,6 @@ enum XcodeSupport {
.product(name: "CocoaLumberjack", package: "CocoaLumberjack"),
.product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"),
.product(name: "WordPressAPI", package: "wordpress-rs"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
]),
.xcodeTarget("XcodeTarget_Intents", dependencies: [
"BuildSettingsKit",
Expand Down Expand Up @@ -427,13 +452,13 @@ enum XcodeSupport {
"FormattableContentKit",
"SFHFKeychainUtils",
"WordPressShared",
"WordPressKit",
.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: "WordPressAPI", package: "wordpress-rs"),
.product(name: "WordPressKit", package: "WordPressKit-iOS"),
]
),
]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import Foundation

@frozen public enum SocialServiceName: String {
case google
case apple
}

extension AccountServiceRemoteREST {

/// Connect to the specified social service via its OpenID Connect (JWT) token.
///
/// - Parameters:
/// - service The name of the social service.
/// - token The OpenID Connect (JWT) ID token identifying the user on the social service.
/// - connectParameters Dictionary containing additional endpoint parameters. Currently only used for the Apple service.
/// - oAuthClientID The WPCOM REST API client ID.
/// - oAuthClientSecret The WPCOM REST API client secret.
/// - success The block that will be executed on success.
/// - failure The block that will be executed on failure.
public func connectToSocialService(_ service: SocialServiceName,
serviceIDToken token: String,
connectParameters: [String: AnyObject]? = nil,
oAuthClientID: String,
oAuthClientSecret: String,
success: @escaping (() -> Void),
failure: @escaping ((Error) -> Void)) {
let path = self.path(forEndpoint: "me/social-login/connect", withVersion: ._1_1)

var params = [
"client_id": oAuthClientID,
"client_secret": oAuthClientSecret,
"service": service.rawValue,
"id_token": token
] as [String: AnyObject]

if let connectParameters {
params.merge(connectParameters, uniquingKeysWith: { (current, _) in current })
}

wordPressComRESTAPI.post(path, parameters: params, success: { (_, _) in
success()
}, failure: { (error, _) in
failure(error)
})
}

/// Get Apple connect parameters from provided account information.
///
/// - Parameters:
/// - email Email from Apple account.
/// - fullName User's full name from Apple account.
/// - Returns: Dictionary with endpoint parameters, to be used when connecting to social service.
static public func appleSignInParameters(email: String, fullName: String) -> [String: AnyObject] {
return [
"user_email": email as AnyObject,
"user_name": fullName as AnyObject
]
}

/// Disconnect fromm the specified social service.
///
/// - Parameters:
/// - service The name of the social service.
/// - oAuthClientID The WPCOM REST API client ID.
/// - oAuthClientSecret The WPCOM REST API client secret.
/// - success The block that will be executed on success.
/// - failure The block that will be executed on failure.
public func disconnectFromSocialService(_ service: SocialServiceName, oAuthClientID: String, oAuthClientSecret: String, success: @escaping(() -> Void), failure: @escaping((Error) -> Void)) {
let path = self.path(forEndpoint: "me/social-login/disconnect", withVersion: ._1_1)
let params = [
"client_id": oAuthClientID,
"client_secret": oAuthClientSecret,
"service": service.rawValue
] as [String: AnyObject]

wordPressComRESTAPI.post(path, parameters: params, success: { (_, _) in
success()
}, failure: { (error, _) in
failure(error)
})
}
}
95 changes: 95 additions & 0 deletions Modules/Sources/WordPressKit/AccountSettings.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import Foundation

public struct AccountSettings {
// MARK: - My Profile
public let firstName: String // first_name
public let lastName: String // last_name
public let displayName: String // display_name
public let aboutMe: String // description

// MARK: - Account Settings
public let username: String // user_login
public let usernameCanBeChanged: Bool // user_login_can_be_changed
public let email: String // user_email
public let emailPendingAddress: String? // new_user_email
public let emailPendingChange: Bool // user_email_change_pending
public let primarySiteID: Int // primary_site_ID
public let webAddress: String // user_URL
public let language: String // language
public let tracksOptOut: Bool
public let blockEmailNotifications: Bool
public let twoStepEnabled: Bool // two_step_enabled

public init(firstName: String,
lastName: String,
displayName: String,
aboutMe: String,
username: String,
usernameCanBeChanged: Bool,
email: String,
emailPendingAddress: String?,
emailPendingChange: Bool,
primarySiteID: Int,
webAddress: String,
language: String,
tracksOptOut: Bool,
blockEmailNotifications: Bool,
twoStepEnabled: Bool) {
self.firstName = firstName
self.lastName = lastName
self.displayName = displayName
self.aboutMe = aboutMe
self.username = username
self.usernameCanBeChanged = usernameCanBeChanged
self.email = email
self.emailPendingAddress = emailPendingAddress
self.emailPendingChange = emailPendingChange
self.primarySiteID = primarySiteID
self.webAddress = webAddress
self.language = language
self.tracksOptOut = tracksOptOut
self.blockEmailNotifications = blockEmailNotifications
self.twoStepEnabled = twoStepEnabled
}
}

@frozen public enum AccountSettingsChange {
case firstName(String)
case lastName(String)
case displayName(String)
case aboutMe(String)
case email(String)
case emailRevertPendingChange
case primarySite(Int)
case webAddress(String)
case language(String)
case tracksOptOut(Bool)

var stringValue: String {
switch self {
case .firstName(let value):
return value
case .lastName(let value):
return value
case .displayName(let value):
return value
case .aboutMe(let value):
return value
case .email(let value):
return value
case .emailRevertPendingChange:
return String(false)
case .primarySite(let value):
return String(value)
case .webAddress(let value):
return value
case .language(let value):
return value
case .tracksOptOut(let value):
return String(value)
}
}
}

public typealias AccountSettingsChangeWithString = (String) -> AccountSettingsChange
public typealias AccountSettingsChangeWithInt = (Int) -> AccountSettingsChange
Loading