Skip to content

Commit 34c3728

Browse files
committed
Complete Swift implementation for unified terms endpoint
Update Swift wrapper and example app to use the new unified terms endpoint with TermEndpointType parameter, following the same pattern as the posts unification in PR #915. This enables custom taxonomy support while maintaining backward compatibility for existing categories and tags functionality. Changes: - Update WordPressAPI.swift to use unified terms endpoint - Update Pagination.swift with TypedPaginationAwareExecutor for terms - Add categories and tags examples to Swift demo app - Add AnyTermWithEditContext support in ListViewData - Fix CancellationTests to use new posts API signature
1 parent a88cf01 commit 34c3728

File tree

4 files changed

+62
-38
lines changed

4 files changed

+62
-38
lines changed

native/swift/Example/Example/ExampleApp.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Combine
55
private let userListParams = UserListParams(perPage: 5)
66
private let postListParams = PostListParams(perPage: 5)
77
private let mediaListParams = MediaListParams(perPage: 5)
8+
private let termListParams = TermListParams(perPage: 5)
89

910
@main
1011
struct ExampleApp: App {
@@ -52,6 +53,20 @@ struct ExampleApp: App {
5253
let sequence = try await WordPressAPI.globalInstance.media.sequenceWithEditContext(params: mediaListParams)
5354
return ListViewSequence(underlyingSequence: sequence)
5455
}),
56+
RootListData(name: "Categories", sequence: {
57+
let sequence = try await WordPressAPI.globalInstance.terms.sequenceWithEditContext(
58+
type: .categories,
59+
params: termListParams
60+
)
61+
return ListViewSequence(underlyingSequence: sequence)
62+
}),
63+
RootListData(name: "Tags", sequence: {
64+
let sequence = try await WordPressAPI.globalInstance.terms.sequenceWithEditContext(
65+
type: .tags,
66+
params: termListParams
67+
)
68+
return ListViewSequence(underlyingSequence: sequence)
69+
}),
5570
RootListData(name: "Site Health Tests", callback: {
5671
let items: [any ListViewDataConvertable] = [
5772
try await WordPressAPI.globalInstance.siteHealthTests.authorizationHeader().data,

native/swift/Example/Example/ListViewData.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,15 @@ extension AnyPostWithEditContext: ListViewDataConvertable {
137137
}
138138
}
139139

140+
extension AnyTermWithEditContext: ListViewDataConvertable {
141+
var asListViewData: ListViewData {
142+
ListViewData(id: self.slug, title: self.name, subtitle: self.slug, fields: [
143+
"Count": "\(self.count)",
144+
"Description": self.description
145+
])
146+
}
147+
}
148+
140149
extension MediaWithEditContext: ListViewDataConvertable {
141150
var asListViewData: ListViewData {
142151
let details = self.mediaDetails.parseAsMimeType(mimeType: self.mimeType)
@@ -155,6 +164,12 @@ extension [AnyPostWithEditContext] {
155164
}
156165
}
157166

167+
extension [AnyTermWithEditContext] {
168+
func asListViewData() -> [ListViewData] {
169+
self.map { $0.asListViewData }
170+
}
171+
}
172+
158173
extension [MediaWithEditContext] {
159174
func asListViewData() -> [ListViewData] {
160175
self.map { $0.asListViewData }

native/swift/Sources/wordpress-api/Pagination.swift

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -452,48 +452,46 @@ extension CommentsRequestExecutor: PaginationAwareExecutor {
452452
public typealias EmbedContextResponseType = CommentsRequestListWithEmbedContextResponse
453453
}
454454

455-
// MARK: - Categories
456-
457-
extension CategoriesRequestListWithEditContextResponse: PaginatableResponse {
455+
// MARK: - Terms
456+
extension TermsRequestListWithEditContextResponse: PaginatableResponse {
458457
public typealias ParamsType = TermListParams
459-
public typealias DataType = CategoryWithEditContext
458+
public typealias DataType = AnyTermWithEditContext
460459
}
461460

462-
extension CategoriesRequestListWithViewContextResponse: PaginatableResponse {
461+
extension TermsRequestListWithViewContextResponse: PaginatableResponse {
463462
public typealias ParamsType = TermListParams
464-
public typealias DataType = CategoryWithViewContext
463+
public typealias DataType = AnyTermWithViewContext
465464
}
466465

467-
extension CategoriesRequestListWithEmbedContextResponse: PaginatableResponse {
466+
extension TermsRequestListWithEmbedContextResponse: PaginatableResponse {
468467
public typealias ParamsType = TermListParams
469-
public typealias DataType = CategoryWithEmbedContext
470-
}
471-
472-
extension CategoriesRequestExecutor: PaginationAwareExecutor {
473-
public typealias EditContextResponseType = CategoriesRequestListWithEditContextResponse
474-
public typealias ViewContextResponseType = CategoriesRequestListWithViewContextResponse
475-
public typealias EmbedContextResponseType = CategoriesRequestListWithEmbedContextResponse
468+
public typealias DataType = AnyTermWithEmbedContext
476469
}
477470

478-
// MARK: - Tags
471+
extension TermsRequestExecutor: TypedPaginationAwareExecutor {
472+
public typealias EditContextResponseType = TermsRequestListWithEditContextResponse
473+
public typealias ViewContextResponseType = TermsRequestListWithViewContextResponse
474+
public typealias EmbedContextResponseType = TermsRequestListWithEmbedContextResponse
475+
public typealias TypeParam = TermEndpointType
479476

480-
extension TagsRequestListWithEditContextResponse: PaginatableResponse {
481-
public typealias ParamsType = TermListParams
482-
public typealias DataType = TagWithEditContext
483-
}
484-
485-
extension TagsRequestListWithViewContextResponse: PaginatableResponse {
486-
public typealias ParamsType = TermListParams
487-
public typealias DataType = TagWithViewContext
488-
}
477+
public func listWithEditContext(
478+
type: TypeParam,
479+
params: EditContextResponseType.ParamsType
480+
) async throws -> EditContextResponseType {
481+
try await self.listWithEditContext(termEndpointType: type, params: params)
482+
}
489483

490-
extension TagsRequestListWithEmbedContextResponse: PaginatableResponse {
491-
public typealias ParamsType = TermListParams
492-
public typealias DataType = TagWithEmbedContext
493-
}
484+
public func listWithViewContext(
485+
type: TypeParam,
486+
params: ViewContextResponseType.ParamsType
487+
) async throws -> ViewContextResponseType {
488+
try await self.listWithViewContext(termEndpointType: type, params: params)
489+
}
494490

495-
extension TagsRequestExecutor: PaginationAwareExecutor {
496-
public typealias EditContextResponseType = TagsRequestListWithEditContextResponse
497-
public typealias ViewContextResponseType = TagsRequestListWithViewContextResponse
498-
public typealias EmbedContextResponseType = TagsRequestListWithEmbedContextResponse
491+
public func listWithEmbedContext(
492+
type: TypeParam,
493+
params: EmbedContextResponseType.ParamsType
494+
) async throws -> EmbedContextResponseType {
495+
try await self.listWithEmbedContext(termEndpointType: type, params: params)
496+
}
499497
}

native/swift/Sources/wordpress-api/WordPressAPI.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,8 @@ public actor WordPressAPI {
137137
self.requestBuilder.taxonomies()
138138
}
139139

140-
public var tags: TagsRequestExecutor {
141-
self.requestBuilder.tags()
142-
}
143-
144-
public var categories: CategoriesRequestExecutor {
145-
self.requestBuilder.categories()
140+
public var terms: TermsRequestExecutor {
141+
self.requestBuilder.terms()
146142
}
147143

148144
public var blockEditor: WpBlockEditorRequestExecutor {

0 commit comments

Comments
 (0)