diff --git a/Projects/Domain/RecruitmentsDomain/Interface/DataSource/RemoteRecruitmentsDataSource.swift b/Projects/Domain/RecruitmentsDomain/Interface/DataSource/RemoteRecruitmentsDataSource.swift index 7091ebaa..8029ee2f 100644 --- a/Projects/Domain/RecruitmentsDomain/Interface/DataSource/RemoteRecruitmentsDataSource.swift +++ b/Projects/Domain/RecruitmentsDomain/Interface/DataSource/RemoteRecruitmentsDataSource.swift @@ -4,6 +4,6 @@ import Foundation public protocol RemoteRecruitmentsDataSource { func fetchRecruitmentDetail(id: String) -> AnyPublisher func fetchRecruitmentList( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher } diff --git a/Projects/Domain/RecruitmentsDomain/Interface/Repository/RecruitmentsRepository.swift b/Projects/Domain/RecruitmentsDomain/Interface/Repository/RecruitmentsRepository.swift index 8bca7650..b6634f7e 100644 --- a/Projects/Domain/RecruitmentsDomain/Interface/Repository/RecruitmentsRepository.swift +++ b/Projects/Domain/RecruitmentsDomain/Interface/Repository/RecruitmentsRepository.swift @@ -4,6 +4,6 @@ import Foundation public protocol RecruitmentsRepository { func fetchRecruitmentDetail(id: String) -> AnyPublisher func fetchRecruitmentList( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher } diff --git a/Projects/Domain/RecruitmentsDomain/Interface/UseCase/FetchRecruitmentListUseCase.swift b/Projects/Domain/RecruitmentsDomain/Interface/UseCase/FetchRecruitmentListUseCase.swift index 96ae05e1..30ba365a 100644 --- a/Projects/Domain/RecruitmentsDomain/Interface/UseCase/FetchRecruitmentListUseCase.swift +++ b/Projects/Domain/RecruitmentsDomain/Interface/UseCase/FetchRecruitmentListUseCase.swift @@ -2,6 +2,6 @@ import Combine public protocol FetchRecruitmentListUseCase { func execute( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher } diff --git a/Projects/Domain/RecruitmentsDomain/Sources/API/RecruitmentsAPI.swift b/Projects/Domain/RecruitmentsDomain/Sources/API/RecruitmentsAPI.swift index 2bd419e6..b13e5a56 100644 --- a/Projects/Domain/RecruitmentsDomain/Sources/API/RecruitmentsAPI.swift +++ b/Projects/Domain/RecruitmentsDomain/Sources/API/RecruitmentsAPI.swift @@ -5,7 +5,13 @@ import BaseDomain public enum RecruitmentsAPI { case fetchRecruitmentDetail(id: String) - case fetchRecruitmentList(page: Int, jobCode: String?, techCode: [String]?, name: String?) + case fetchRecruitmentList( + page: Int, + jobCode: String?, + techCode: [String]?, + name: String?, + winterIntern: Bool + ) } extension RecruitmentsAPI: JobisAPI { @@ -34,13 +40,20 @@ extension RecruitmentsAPI: JobisAPI { public var task: Moya.Task { switch self { - case let .fetchRecruitmentList(page, jobCode, techCode, name): - return .requestParameters(parameters: [ - "page": page, - "job_code": jobCode ?? "", - "tech_code": techCode?.joined(separator: ",") ?? "", - "name": name ?? "" - ], encoding: URLEncoding.queryString) + case let .fetchRecruitmentList(page, jobCode, techCode, name, winterIntern): + var dic: [String: Any] = ["page": page] + if let jobCode, !jobCode.isEmpty { + dic.updateValue(jobCode, forKey: "job_code") + } + if let techCode, !techCode.isEmpty { + dic.updateValue(techCode.joined(separator: ","), forKey: "tech_code") + } + if let name, !name.isEmpty { + dic.updateValue(name, forKey: "name") + } + dic.updateValue(winterIntern, forKey: "winter_intern") + + return .requestParameters(parameters: dic, encoding: URLEncoding.queryString) default: return .requestPlain diff --git a/Projects/Domain/RecruitmentsDomain/Sources/DataSource/RemoteRecruitmentsDataSourceImpl.swift b/Projects/Domain/RecruitmentsDomain/Sources/DataSource/RemoteRecruitmentsDataSourceImpl.swift index a24673d9..2965587a 100644 --- a/Projects/Domain/RecruitmentsDomain/Sources/DataSource/RemoteRecruitmentsDataSourceImpl.swift +++ b/Projects/Domain/RecruitmentsDomain/Sources/DataSource/RemoteRecruitmentsDataSourceImpl.swift @@ -11,10 +11,16 @@ public final class RemoteRecruitmentsDataSourceImpl: } public func fetchRecruitmentList( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher { request( - .fetchRecruitmentList(page: page, jobCode: jobCode, techCode: techCode, name: name), + .fetchRecruitmentList( + page: page, + jobCode: jobCode, + techCode: techCode, + name: name, + winterIntern: winterIntern + ), dto: RecruitmentListResponseDTO.self ) .map { $0.toDomain() } diff --git a/Projects/Domain/RecruitmentsDomain/Sources/Repository/RecruitmentsRepositoryImpl.swift b/Projects/Domain/RecruitmentsDomain/Sources/Repository/RecruitmentsRepositoryImpl.swift index 358e3bf8..f75f3237 100644 --- a/Projects/Domain/RecruitmentsDomain/Sources/Repository/RecruitmentsRepositoryImpl.swift +++ b/Projects/Domain/RecruitmentsDomain/Sources/Repository/RecruitmentsRepositoryImpl.swift @@ -13,8 +13,14 @@ public struct RecruitmentsRepositoryImpl: RecruitmentsRepository { } public func fetchRecruitmentList( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher { - remoteRecruitmentsDataSource.fetchRecruitmentList(page: page, jobCode: jobCode, techCode: techCode, name: name) + remoteRecruitmentsDataSource.fetchRecruitmentList( + page: page, + jobCode: jobCode, + techCode: techCode, + name: name, + winterIntern: winterIntern + ) } } diff --git a/Projects/Domain/RecruitmentsDomain/Sources/UseCase/FetchRecruitmentListUseCaseImpl.swift b/Projects/Domain/RecruitmentsDomain/Sources/UseCase/FetchRecruitmentListUseCaseImpl.swift index 5019b272..5c272a26 100644 --- a/Projects/Domain/RecruitmentsDomain/Sources/UseCase/FetchRecruitmentListUseCaseImpl.swift +++ b/Projects/Domain/RecruitmentsDomain/Sources/UseCase/FetchRecruitmentListUseCaseImpl.swift @@ -9,8 +9,14 @@ public struct FetchRecruitmentListUseCaseImpl: FetchRecruitmentListUseCase { } public func execute( - page: Int, jobCode: String?, techCode: [String]?, name: String? + page: Int, jobCode: String?, techCode: [String]?, name: String?, winterIntern: Bool ) -> AnyPublisher { - recruitmentsRepository.fetchRecruitmentList(page: page, jobCode: jobCode, techCode: techCode, name: name) + recruitmentsRepository.fetchRecruitmentList( + page: page, + jobCode: jobCode, + techCode: techCode, + name: name, + winterIntern: winterIntern + ) } } diff --git a/Projects/Feature/BookmarkListFeature/Sources/BookmarkListView.swift b/Projects/Feature/BookmarkListFeature/Sources/BookmarkListView.swift index 80731d0a..f77b9f9f 100644 --- a/Projects/Feature/BookmarkListFeature/Sources/BookmarkListView.swift +++ b/Projects/Feature/BookmarkListFeature/Sources/BookmarkListView.swift @@ -42,15 +42,27 @@ struct BookmarkListView: View { } else { Spacer() - Text("아직 북마크한 모집의뢰서가 없어요.") - .JOBISFont(.body(.body4), color: .Sub.gray90) + VStack(spacing: 16) { + Text("아직 북마크한 모집의뢰서가 없어요.") + .JOBISFont(.body(.body4), color: .Sub.gray90) - Button { - viewModel.isNavigateRecruitmentView.toggle() - } label: { - Text("모집의뢰서 보러가기 >") - .JOBISFont(.etc(.caption), color: .Sub.gray60) - .underlineText(color: .Sub.gray60) + VStack(spacing: 8) { + Button { + viewModel.isNavigateRecruitmentView.toggle() + } label: { + Text("모집의뢰서 보러가기 >") + .JOBISFont(.etc(.caption), color: .Sub.gray60) + .underlineText(color: .Sub.gray60) + } + + Button { + viewModel.isNavigateWinterIntern.toggle() + } label: { + Text("겨울인턴 보러가기 >") + .JOBISFont(.etc(.caption), color: .Sub.gray60) + .underlineText(color: .Sub.gray60) + } + } } } } else { @@ -69,7 +81,7 @@ struct BookmarkListView: View { tabbarHidden.wrappedValue = newValue } } - .onChange(of: viewModel.isNavigateRecruitmentView) { newValue in + .onChange(of: viewModel.isNavigateRecruitmentView || viewModel.isNavigateWinterIntern) { newValue in withAnimation { tabbarHidden.wrappedValue = newValue } @@ -81,9 +93,13 @@ struct BookmarkListView: View { when: $viewModel.isNavigateRecruitmentDetail ) .navigate( - to: recruitmentFactory.makeView().eraseToAnyView(), + to: recruitmentFactory.makeView(winterIntern: false).eraseToAnyView(), when: $viewModel.isNavigateRecruitmentView ) + .navigate( + to: recruitmentFactory.makeView(winterIntern: true).eraseToAnyView(), + when: $viewModel.isNavigateWinterIntern + ) .navigationTitle("북마크한 모집의뢰서") } diff --git a/Projects/Feature/BookmarkListFeature/Sources/BookmarkListViewModel.swift b/Projects/Feature/BookmarkListFeature/Sources/BookmarkListViewModel.swift index 210cc7a1..37cec7d7 100644 --- a/Projects/Feature/BookmarkListFeature/Sources/BookmarkListViewModel.swift +++ b/Projects/Feature/BookmarkListFeature/Sources/BookmarkListViewModel.swift @@ -7,6 +7,7 @@ final class BookmarkListViewModel: BaseViewModel { @Published var bookmarkList: [BookmarkEntity] = [] @Published var recruitmentID: Int = 0 @Published var isNavigateRecruitmentView: Bool = false + @Published var isNavigateWinterIntern: Bool = false @Published var isNavigateRecruitmentDetail: Bool = false @Published var isFetchingBookmarkList: Bool = true diff --git a/Projects/Feature/HomeFeature/Project.swift b/Projects/Feature/HomeFeature/Project.swift index 8b9db472..25728326 100644 --- a/Projects/Feature/HomeFeature/Project.swift +++ b/Projects/Feature/HomeFeature/Project.swift @@ -10,6 +10,7 @@ let project = Project.makeModule( .Feature.BaseFeature, .Feature.FindCompanyFeatureInterface, .Feature.RecruitmentFeatureInterface, + .Feature.WinterInternFeatureInterface, .Domain.ApplicationsDomainInterface, .Domain.StudentsDomainInterface, .Domain.RecruitmentsDomainInterface, diff --git a/Projects/Feature/HomeFeature/Sources/Home/HomeView.swift b/Projects/Feature/HomeFeature/Sources/Home/HomeView.swift index 02a4d441..9d13e5b2 100644 --- a/Projects/Feature/HomeFeature/Sources/Home/HomeView.swift +++ b/Projects/Feature/HomeFeature/Sources/Home/HomeView.swift @@ -39,23 +39,32 @@ struct HomeView: View { Divider() .foregroundColor(.Sub.gray40) - HStack(spacing: 12) { - navigateButton( - text: "모집의뢰서\n조회하기", - image: .recruitmentImage - ) { - viewModel.isNavigateRecruitment.toggle() - } - .frame(width: proxy.size.width / 2) + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 12) { + navigateButton( + text: "모집의뢰서\n조회하기", + image: .recruitmentImage + ) { + viewModel.isNavigateRecruitment.toggle() + } + .frame(width: proxy.size.width / 2) + + navigateButton( + text: "기업찾기\n ", + image: .findCompanyImage + ) { + viewModel.isNavigateFindCompany.toggle() + } - navigateButton( - text: "기업찾기\n ", - image: .findCompanyImage - ) { - viewModel.isNavigateFindCompany.toggle() + navigateButton( + text: "겨울인턴\n ", + image: .winterInternImage + ) { + viewModel.isNavigateWinterIntern.toggle() + } } + .padding(22) } - .padding(22) .padding(.bottom, 100) .background(Color.Sub.gray20) } @@ -65,16 +74,23 @@ struct HomeView: View { .onAppear { viewModel.onAppear() } - .onChange(of: viewModel.isNavigateRecruitment || viewModel.isNavigateFindCompany) { newValue in + .onChange( + of: viewModel.isNavigateRecruitment || viewModel.isNavigateFindCompany || viewModel.isNavigateWinterIntern + ) { newValue in withAnimation { tabbarHidden.wrappedValue = newValue } } .navigate( - to: recruitmentFactory.makeView() + to: recruitmentFactory.makeView(winterIntern: false) .eraseToAnyView(), when: $viewModel.isNavigateRecruitment ) + .navigate( + to: recruitmentFactory.makeView(winterIntern: true) + .eraseToAnyView(), + when: $viewModel.isNavigateWinterIntern + ) .navigate( to: findCompanyFactory.makeView() .eraseToAnyView(), @@ -109,12 +125,20 @@ struct HomeView: View { HStack { Spacer() - JOBISImage(image) - .frame(width: 96, height: 96) + if image == .winterInternImage { + JOBISImage(image) + .frame(width: 63, height: 68) + .padding(.vertical, (96 - 68)/2) + .padding(.trailing, (96 - 68)/2) + } else { + JOBISImage(image) + .frame(width: 96, height: 96) + } } .padding(.bottom, 8) .padding(.trailing, 7) } + .frame(minWidth: 122) .background(Color.Sub.gray10) .cornerRadius(10) .shadow(opacity: 0.1, y: 1, blur: 10) diff --git a/Projects/Feature/HomeFeature/Sources/Home/HomeViewModel.swift b/Projects/Feature/HomeFeature/Sources/Home/HomeViewModel.swift index 1b17ebcc..7e5b50f7 100644 --- a/Projects/Feature/HomeFeature/Sources/Home/HomeViewModel.swift +++ b/Projects/Feature/HomeFeature/Sources/Home/HomeViewModel.swift @@ -8,6 +8,7 @@ final class HomeViewModel: BaseViewModel { @Published var totalPassStudent: TotalPassStudentEntity? @Published var studentInfo: StudentInfoEntity? @Published var isNavigateRecruitment: Bool = false + @Published var isNavigateWinterIntern: Bool = false @Published var isNavigateFindCompany: Bool = false private let fetchApplicationUseCase: FetchApplicationUseCase diff --git a/Projects/Feature/MenuFeature/Sources/MenuView.swift b/Projects/Feature/MenuFeature/Sources/MenuView.swift index e4721f47..ec9f983f 100644 --- a/Projects/Feature/MenuFeature/Sources/MenuView.swift +++ b/Projects/Feature/MenuFeature/Sources/MenuView.swift @@ -47,6 +47,8 @@ struct MenuView: View { menuListCell(image: .fetchRecruitment, title: "모집의뢰서 조회하기") + menuListCell(image: .winterInternImage, title: "겨울인턴 조회하기") + menuListCell(image: .findCompany, title: "기업 찾기") menuListCell(image: .bookmarkList, title: "북마크한 기업 보기") @@ -59,9 +61,13 @@ struct MenuView: View { when: $viewModel.isNavigateMyPage ) .navigate( - to: recruitmentFactory.makeView().eraseToAnyView(), + to: recruitmentFactory.makeView(winterIntern: false).eraseToAnyView(), when: $viewModel.isNavigateRecruitmentView ) + .navigate( + to: recruitmentFactory.makeView(winterIntern: true).eraseToAnyView(), + when: $viewModel.isNavigateWinterInternView + ) .navigate( to: findCompanyFactory.makeView().eraseToAnyView(), when: $viewModel.isNavigateCompanyView @@ -101,6 +107,9 @@ struct MenuView: View { case .profile: viewModel.isNavigateMyPage.toggle() + case .winterInternImage: + viewModel.isNavigateWinterInternView.toggle() + default: break } } label: { diff --git a/Projects/Feature/MenuFeature/Sources/MenuViewModel.swift b/Projects/Feature/MenuFeature/Sources/MenuViewModel.swift index 53c35508..5e5402a5 100644 --- a/Projects/Feature/MenuFeature/Sources/MenuViewModel.swift +++ b/Projects/Feature/MenuFeature/Sources/MenuViewModel.swift @@ -4,9 +4,10 @@ import Combine final class MenuViewModel: BaseViewModel { @Published var isNavigateMyPage = false @Published var isNavigateRecruitmentView = false + @Published var isNavigateWinterInternView = false @Published var isNavigateCompanyView = false @Published var isNavigateBookmarkListView = false var isTabbarHidden: Bool { - isNavigateMyPage || isNavigateRecruitmentView || isNavigateCompanyView || isNavigateBookmarkListView + isNavigateMyPage || isNavigateRecruitmentView || isNavigateCompanyView || isNavigateBookmarkListView || isNavigateWinterInternView } } diff --git a/Projects/Feature/RecruitmentFeature/Interface/RecruitmentFactory.swift b/Projects/Feature/RecruitmentFeature/Interface/RecruitmentFactory.swift index 3f658ca0..91e0cf4f 100644 --- a/Projects/Feature/RecruitmentFeature/Interface/RecruitmentFactory.swift +++ b/Projects/Feature/RecruitmentFeature/Interface/RecruitmentFactory.swift @@ -2,5 +2,5 @@ import SwiftUI public protocol RecruitmentFactory { associatedtype SomeView: View - func makeView() -> SomeView + func makeView(winterIntern: Bool) -> SomeView } diff --git a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentComponent.swift b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentComponent.swift index 32afc3e0..9418462f 100644 --- a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentComponent.swift +++ b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentComponent.swift @@ -13,12 +13,13 @@ public protocol RecruitmentDependency: Dependency { } public final class RecruitmentComponent: Component, RecruitmentFactory { - public func makeView() -> some View { + public func makeView(winterIntern: Bool) -> some View { RecruitmentView( viewModel: .init( fetchCodeUseCase: dependency.fetchCodesUseCase, fetchRecruitmentListUseCase: dependency.fetchRecruitmentListUseCase, - bookmarkUseCase: dependency.bookmarkUseCase + bookmarkUseCase: dependency.bookmarkUseCase, + winterIntern: winterIntern ), recruitmentDetailFactory: dependency.recruitmentDetailFactory ) diff --git a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentView.swift b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentView.swift index 0fb6b59b..73b27fd0 100644 --- a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentView.swift +++ b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentView.swift @@ -63,7 +63,7 @@ struct RecruitmentView: View { viewModel.onAppear() } .hideKeyboardWhenTap() - .navigationTitle("모집의뢰서 조회하기") + .navigationTitle((viewModel.winterIntern ? "겨울인턴": "모집의뢰서") + " 조회하기") .sheet(isPresented: $viewModel.isShowFilterSheet) { viewModel.fetchRecruitment() } content: { diff --git a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentViewModel.swift b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentViewModel.swift index b33d5c24..d750d144 100644 --- a/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentViewModel.swift +++ b/Projects/Feature/RecruitmentFeature/Sources/Recruitment/RecruitmentViewModel.swift @@ -38,15 +38,18 @@ final class RecruitmentViewModel: BaseViewModel { private let fetchCodesUseCase: FetchCodesUseCase private let fetchRecruitmentListUseCase: FetchRecruitmentListUseCase private let bookmarkUseCase: BookmarkUseCase + let winterIntern: Bool public init( fetchCodeUseCase: any FetchCodesUseCase, fetchRecruitmentListUseCase: any FetchRecruitmentListUseCase, - bookmarkUseCase: any BookmarkUseCase + bookmarkUseCase: any BookmarkUseCase, + winterIntern: Bool ) { self.fetchCodesUseCase = fetchCodeUseCase self.fetchRecruitmentListUseCase = fetchRecruitmentListUseCase self.bookmarkUseCase = bookmarkUseCase + self.winterIntern = winterIntern } func onAppear() { @@ -66,7 +69,8 @@ final class RecruitmentViewModel: BaseViewModel { page: listPage, jobCode: jobCode, techCode: selectedTechCode.map { String($0.code) }, - name: companyText.isEmpty ? nil : companyText + name: companyText, + winterIntern: winterIntern ) ) { [weak self] recruitmentList in self?.filteringName = self?.companyText ?? "" @@ -87,7 +91,8 @@ final class RecruitmentViewModel: BaseViewModel { page: listPage, jobCode: jobCode, techCode: selectedTechCode.map { String($0.code) }, - name: companyText.isEmpty ? nil : companyText + name: companyText, + winterIntern: winterIntern ) ) { [weak self] recruitmentList in self?.recruitmentList.recruitments.append(contentsOf: recruitmentList.recruitments) diff --git a/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Contents.json new file mode 100644 index 00000000..a18e5e16 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Winter Intern.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Winter Intern.png b/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Winter Intern.png new file mode 100644 index 00000000..a39aa104 Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image.xcassets/WinterInternImage.imageset/Winter Intern.png differ diff --git a/Projects/Shared/DesignSystem/Sources/Image/JOBISImage.swift b/Projects/Shared/DesignSystem/Sources/Image/JOBISImage.swift index 88393026..bcb8c4de 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/JOBISImage.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/JOBISImage.swift @@ -4,6 +4,7 @@ public struct JOBISImage: View { public enum Image { case recruitmentImage case findCompanyImage + case winterInternImage case bookmarkList case fetchRecruitment case findCompany @@ -37,6 +38,9 @@ public struct JOBISImage: View { case .recruitmentImage: return DesignSystemAsset.Image.recruitmentImage.swiftUIImage + case .winterInternImage: + return DesignSystemAsset.Image.winterInternImage.swiftUIImage + case .bookmarkList: return DesignSystemAsset.Icons.bookmarkListIcon.swiftUIImage