From 1c880c3e2696395e440ab8189e7b52d4d6c4a04a Mon Sep 17 00:00:00 2001 From: wenlei Date: Fri, 26 Jan 2024 16:12:24 +0800 Subject: [PATCH] Update the refresh animation --- .../IndieMusic.xcodeproj/project.pbxproj | 24 ++++ .../Common/NavigationController.swift | 1 + .../Common/RefreshLoadingView.swift | 4 +- IndieMusic/IndieMusic/Models/Journal.swift | 2 +- .../JournalDetailController.swift | 88 ++++++++------ .../JournalDetail/JournalDetailView.swift | 3 +- .../JournalDetailViewModel.swift | 56 ++++----- .../Message/MessageViewController.swift | 8 -- .../Player/AudioTrackListViewModel.swift | 2 +- .../AppIcon.appiconset/Contents.json | 107 ++++++++++++++++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 13576 bytes .../AppIcon.appiconset/icon-20@2x.png | Bin 0 -> 578 bytes .../AppIcon.appiconset/icon-20@3x.png | Bin 0 -> 844 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 818 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 1215 bytes .../AppIcon.appiconset/icon-38@2x.png | Bin 0 -> 1051 bytes .../AppIcon.appiconset/icon-38@3x.png | Bin 0 -> 1635 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 1107 bytes .../AppIcon.appiconset/icon-40@3x.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/icon-60@3x.png | Bin 0 -> 2679 bytes .../AppIcon.appiconset/icon-64@2x.png | Bin 0 -> 1789 bytes .../AppIcon.appiconset/icon-64@3x.png | Bin 0 -> 2825 bytes .../AppIcon.appiconset/icon-68@2x.png | Bin 0 -> 1948 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 2200 bytes .../AppIcon.appiconset/icon-83.5@2x.png | Bin 0 -> 2405 bytes .../Resources/Json/images/img_0.png | Bin 0 -> 8729 bytes .../IndieMusic/Resources/Json/refresh.json | 1 + 28 files changed, 224 insertions(+), 72 deletions(-) create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png create mode 100644 IndieMusic/IndieMusic/Resources/Json/images/img_0.png create mode 100644 IndieMusic/IndieMusic/Resources/Json/refresh.json diff --git a/IndieMusic/IndieMusic.xcodeproj/project.pbxproj b/IndieMusic/IndieMusic.xcodeproj/project.pbxproj index ced9af9..e264f38 100644 --- a/IndieMusic/IndieMusic.xcodeproj/project.pbxproj +++ b/IndieMusic/IndieMusic.xcodeproj/project.pbxproj @@ -40,6 +40,8 @@ 7751009A2B62050C00F46109 /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 775100992B62050C00F46109 /* UIImageView+Rx.swift */; }; 7751009C2B62065800F46109 /* Date+IndieMusic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009B2B62065800F46109 /* Date+IndieMusic.swift */; }; 7751009E2B62330900F46109 /* PopoverMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009D2B62330900F46109 /* PopoverMenu.swift */; }; + 775100A02B63442500F46109 /* refresh.json in Resources */ = {isa = PBXBuildFile; fileRef = 7751009F2B63442500F46109 /* refresh.json */; }; + 775100A42B6344C700F46109 /* img_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 775100A32B6344C700F46109 /* img_0.png */; }; 7751D3502B42ABBF00F1F2BD /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */; }; 7751D3522B42AC2B00F1F2BD /* SettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3512B42AC2B00F1F2BD /* SettingView.swift */; }; 7751D3542B42AE0E00F1F2BD /* SettingViewMdel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */; }; @@ -258,6 +260,8 @@ 775100992B62050C00F46109 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Rx.swift"; sourceTree = ""; }; 7751009B2B62065800F46109 /* Date+IndieMusic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+IndieMusic.swift"; sourceTree = ""; }; 7751009D2B62330900F46109 /* PopoverMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoverMenu.swift; sourceTree = ""; }; + 7751009F2B63442500F46109 /* refresh.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = refresh.json; sourceTree = ""; }; + 775100A32B6344C700F46109 /* img_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = img_0.png; sourceTree = ""; }; 7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = ""; }; 7751D3512B42AC2B00F1F2BD /* SettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingView.swift; sourceTree = ""; }; 7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewMdel.swift; sourceTree = ""; }; @@ -518,6 +522,23 @@ path = JournalDetail; sourceTree = ""; }; + 775100A12B63442900F46109 /* Json */ = { + isa = PBXGroup; + children = ( + 775100A22B6344C700F46109 /* images */, + 7751009F2B63442500F46109 /* refresh.json */, + ); + path = Json; + sourceTree = ""; + }; + 775100A22B6344C700F46109 /* images */ = { + isa = PBXGroup; + children = ( + 775100A32B6344C700F46109 /* img_0.png */, + ); + path = images; + sourceTree = ""; + }; 775D07562B5E47C4009270D3 /* ETPopupView */ = { isa = PBXGroup; children = ( @@ -586,6 +607,7 @@ 778B8A512AF8EA2A0034AFD4 /* Resources */ = { isa = PBXGroup; children = ( + 775100A12B63442900F46109 /* Json */, 778B8A292AF8E36E0034AFD4 /* Assets.xcassets */, 778B8A2E2AF8E36E0034AFD4 /* Info.plist */, ); @@ -1052,9 +1074,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 775100A42B6344C700F46109 /* img_0.png in Resources */, 778B8A2D2AF8E36E0034AFD4 /* LaunchScreen.storyboard in Resources */, 778B8A2A2AF8E36E0034AFD4 /* Assets.xcassets in Resources */, 778B8A282AF8E36D0034AFD4 /* Main.storyboard in Resources */, + 775100A02B63442500F46109 /* refresh.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/IndieMusic/IndieMusic/Common/NavigationController.swift b/IndieMusic/IndieMusic/Common/NavigationController.swift index b7344ce..754d23f 100644 --- a/IndieMusic/IndieMusic/Common/NavigationController.swift +++ b/IndieMusic/IndieMusic/Common/NavigationController.swift @@ -36,6 +36,7 @@ class NavigationController: UINavigationController { super.viewDidLoad() setup() + view.backgroundColor = .white let appearance = UINavigationBarAppearance() appearance.backgroundColor = .white diff --git a/IndieMusic/IndieMusic/Common/RefreshLoadingView.swift b/IndieMusic/IndieMusic/Common/RefreshLoadingView.swift index 277d842..9bcd326 100644 --- a/IndieMusic/IndieMusic/Common/RefreshLoadingView.swift +++ b/IndieMusic/IndieMusic/Common/RefreshLoadingView.swift @@ -29,8 +29,8 @@ class RefreshLoadingView: UIView { animationView.backgroundColor = .clear animationView.frame = CGRect(x: 0.0, y: 0.0, width: animationSize, height: animationSize) animationView.loopMode = .loop - animationView.animation = LottieAnimation.named("loading_header") - animationView.backgroundColor = .red + animationView.animation = LottieAnimation.named("refresh") + return animationView } diff --git a/IndieMusic/IndieMusic/Models/Journal.swift b/IndieMusic/IndieMusic/Models/Journal.swift index 03e90ff..5379e4f 100644 --- a/IndieMusic/IndieMusic/Models/Journal.swift +++ b/IndieMusic/IndieMusic/Models/Journal.swift @@ -18,7 +18,7 @@ struct JournalDetail: Codable { let tags: [String]? let date: Int? let content: String? -// let isExpand: Bool? + var isExpand: Bool? } struct Journal: Codable { diff --git a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailController.swift b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailController.swift index e7ffc69..211a37d 100644 --- a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailController.swift +++ b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailController.swift @@ -11,6 +11,7 @@ import RxCocoa import RxDataSources import ETNavBarTransparent import SVProgressHUD +import RxOptional class JournalDetailController: ViewController, UIScrollViewDelegate { @@ -70,6 +71,9 @@ class JournalDetailController: ViewController, UIScrollViewDelegate { return collectionView }() + weak var audioHeaderView: JournalAudioHeaderView? + + var commentToolView: CommentToolView = { let commentToolView = CommentToolView.init() @@ -151,13 +155,18 @@ class JournalDetailController: ViewController, UIScrollViewDelegate { } }, - configureSupplementaryView: { dataSource, collectionView, kind, indexPath in - guard kind == UICollectionView.elementKindSectionHeader else { + configureSupplementaryView: { [weak self] dataSource, collectionView, kind, indexPath in + guard kind == UICollectionView.elementKindSectionHeader, let self = self else { return UICollectionReusableView() } if indexPath.section == 0 { let resuableView: JournalAudioHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: "UICollectionElementKindSectionHeader", withReuseIdentifier: "JournalAudioHeaderView", for: indexPath) as! JournalAudioHeaderView + self.audioHeaderView = resuableView + let section = dataSource.sectionModels.first.value + resuableView.journalDetail = section?.header + + resuableView.saveButton.rx.tap.subscribe { _ in resuableView.titleImageView.image?.saveImageToPhotoLibrary() @@ -171,15 +180,17 @@ class JournalDetailController: ViewController, UIScrollViewDelegate { }.disposed(by: self.rx.disposeBag) - resuableView.journalDetail = section?.header resuableView.dropButtonTapObservable.subscribe { _ in - viewModel.isExpand.accept(!viewModel.isExpand.value) - resuableView.isExpand = viewModel.isExpand.value + viewModel.isExpand.accept(!resuableView.isExpand) + viewModel.updateHeaderHeight(newHeight: viewModel.isExpand.value ? 506 + BaseDimensions.topHeight : 400 + BaseDimensions.topHeight) + +// resuableView.isExpand = viewModel.isExpand.value }.disposed(by: self.rx.disposeBag) + resuableView.playButtonTapObservable.subscribe { _ in - + AudioManager.sharedInstance.playlist }.disposed(by: self.rx.disposeBag) resuableView.downLoadButtonTapObservable.subscribe { _ in @@ -206,40 +217,53 @@ class JournalDetailController: ViewController, UIScrollViewDelegate { output.items.bind(to: collectionView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag) - - output.itemSelected.subscribe { [weak self] sectionItem in -// guard let items = output.items.value.first?.items, -// let track = sectionItem.element else { return } -// -// -// -// let playerViewModel = PlayerViewModel.init(track: track, provider: viewModel.provider) -// self?.navigator.show(segue: .player(viewModel: playerViewModel), sender: self, transition: .modal) -// -// AudioManager.sharedInstance.setPlaylist(list: items) -// AudioManager.sharedInstance.playTrack(track: track) + input.selection.drive { indexPath in + }.disposed(by: rx.disposeBag) - - -// _ = self.headerView.dropButton.rx.isSelected <-> viewModel.isExpand -// viewModel.isExpand -// .bind(to: self.headerView.dropButton.rx.isSelected) -// .disposed(by: rx.disposeBag) - output.isExpand.subscribe { [weak self] isExpand in + output.itemSelected.subscribe { [weak self] sectionItem in -// print("dropButtonTrigger \(isExpand)") -// self?.headerView.isExpand = isExpand + switch sectionItem { + case .audioItem(let track): + let audioModels: [AudioTrack] = output.items.value.flatMap { section -> [JournalItem] in + switch section { + case .audio(_, let items): + return items + default: + return [] + } + }.compactMap { item -> AudioTrack? in + if case let .audioItem(model) = item { + return model + } else { + return nil + } + } - viewModel.updateHeaderHeight(newHeight: isExpand ? 506 + BaseDimensions.topHeight : 400 + BaseDimensions.topHeight) - - self?.collectionView.collectionViewLayout.invalidateLayout() + + let playerViewModel = PlayerViewModel.init(track: track, provider: viewModel.provider) + self?.navigator.show(segue: .player(viewModel: playerViewModel), sender: self, transition: .modal) + + + AudioManager.sharedInstance.setPlaylist(list: audioModels) + AudioManager.sharedInstance.playTrack(track: track) + + + + + + case .journaItem(let _): - } .disposed(by: rx.disposeBag) - + break + } + + + + }.disposed(by: rx.disposeBag) + } diff --git a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailView.swift b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailView.swift index b584744..682f9fe 100644 --- a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailView.swift +++ b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailView.swift @@ -156,7 +156,7 @@ class JournalAudioHeaderView: UICollectionReusableView { var isExpand = false { didSet { - + print("JournalAudioHeaderView isExpand: \(isExpand) ") switch isExpand { case true: dropButton.isSelected = true @@ -211,6 +211,7 @@ class JournalAudioHeaderView: UICollectionReusableView { contentLabel.text = journalDetail.content + self.isExpand = journalDetail.isExpand ?? false } } diff --git a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailViewModel.swift b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailViewModel.swift index cecf612..ee5c129 100644 --- a/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailViewModel.swift +++ b/IndieMusic/IndieMusic/Modules/JournalDetail/JournalDetailViewModel.swift @@ -25,7 +25,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType { struct Output { let items: BehaviorRelay<[JournalSection]> let selection: Driver - let itemSelected: PublishSubject + let itemSelected: PublishSubject let journalDetail: PublishSubject @@ -35,7 +35,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType { let isExpand: BehaviorRelay } - let itemSelected = PublishSubject() + let itemSelected = PublishSubject() // let items = BehaviorRelay<[JournalSection]>.init(value: []) let isExpand = BehaviorRelay.init(value: false) @@ -57,42 +57,18 @@ class JournalDetailViewModel: ViewModel, ViewModelType { }.disposed(by: rx.disposeBag) - -// input.dropButtonTrigger.drive { _ in -// -// self.isExpand.accept(!self.isExpand.value) -// -// }.disposed(by: rx.disposeBag) - - -// -// let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "", isExpand: false) -// let item = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "") -// -// let journalSection = JournalSection.init(items: [item, item, item, item], journalDetail: journalDetail) -// -// items.accept([journalSection]) - - - input.selection.drive { indexPath in -// guard let sectionItem = elements.value.first?.items[indexPath.row] else { return } -// self.itemSelected.onNext(sectionItem) - }.disposed(by: rx.disposeBag) - let journal = PublishSubject.init() let currentPlaying: PublishSubject = .init() let dowloadState: Driver = .just(0) let isLike = BehaviorRelay.init(value: false) - - let isLick = BehaviorRelay.init(value: false) self.requestMusic(journalNo: journalNo).subscribe { audioTrackArray in - let journalDetail = JournalDetail.init(audio: "", cover: "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4wB6X?ver=c628", title: "132", artist: "132132132132132", number: "321", tags: [], date: 1706062128, content: "总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即") + let journalDetail = JournalDetail.init(audio: "", cover: "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4wB6X?ver=c628", title: "132", artist: "132132132132132", number: "321", tags: [], date: 1706062128, content: "总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即", isExpand: false) let audioArray = audioTrackArray.map { audioTrack in @@ -112,6 +88,31 @@ class JournalDetailViewModel: ViewModel, ViewModelType { } onError: { error in }.disposed(by: rx.disposeBag) + + + input.selection.drive { indexPath in + let sectionItem = elements.value[indexPath.section].items[indexPath.row] + self.itemSelected.onNext(sectionItem) + }.disposed(by: rx.disposeBag) + + + + isExpand.subscribe { isExpand in + var new = elements.value + if var header = new.first?.header { + header.isExpand = isExpand + + if let items = new.first?.items { + new[0] = .audio(header: header, items: items) + elements.accept(new) + } + } + + }.disposed(by: rx.disposeBag) + + + + // input.dropButtonTrigger.drive { _ in @@ -142,6 +143,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType { + func requestMusic(journalNo: String) -> Observable<[AudioTrack]> { return self.provider.journalMusic(journalNo: journalNo) diff --git a/IndieMusic/IndieMusic/Modules/Message/MessageViewController.swift b/IndieMusic/IndieMusic/Modules/Message/MessageViewController.swift index 60f03e3..1f07f51 100644 --- a/IndieMusic/IndieMusic/Modules/Message/MessageViewController.swift +++ b/IndieMusic/IndieMusic/Modules/Message/MessageViewController.swift @@ -90,11 +90,6 @@ class MessageViewController: ViewController, UIScrollViewDelegate { view.addSubview(messageTopView) view.addSubview(tableView) view.addSubview(noDataView) - - - - - } override func bindViewModel() { @@ -131,13 +126,10 @@ class MessageViewController: ViewController, UIScrollViewDelegate { return cell - - case .activitiesItem(let message): let cell: MessageActivitiesViewCell = tableView.dequeueReusableCell(withIdentifier: "MessageActivitiesViewCell", for: indexPath) as! MessageActivitiesViewCell return cell - } } ) diff --git a/IndieMusic/IndieMusic/Modules/Player/AudioTrackListViewModel.swift b/IndieMusic/IndieMusic/Modules/Player/AudioTrackListViewModel.swift index d8e3e26..aa301e6 100644 --- a/IndieMusic/IndieMusic/Modules/Player/AudioTrackListViewModel.swift +++ b/IndieMusic/IndieMusic/Modules/Player/AudioTrackListViewModel.swift @@ -35,7 +35,7 @@ class AudioTrackListViewModel: ViewModel, ViewModelType { func transform(input: Input) -> Output { - let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "") + let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "", isExpand: false) // let item = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "") // // let item1 = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "", isPlaying: true) diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..0b8f485 100644 --- a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,8 +1,115 @@ { "images" : [ { + "filename" : "icon-20@2x.png", "idiom" : "universal", "platform" : "ios", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "icon-20@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "icon-29@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "icon-29@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "icon-38@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "38x38" + }, + { + "filename" : "icon-38@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "38x38" + }, + { + "filename" : "icon-40@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "icon-40@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "icon-60@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "icon-60@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "icon-64@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "64x64" + }, + { + "filename" : "icon-64@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "64x64" + }, + { + "filename" : "icon-68@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "68x68" + }, + { + "filename" : "icon-76@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "icon-83.5@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "icon-1024.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "1x", "size" : "1024x1024" } ], diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..732ea0fd8e6946d08bef73b922ecc54077cf1702 GIT binary patch literal 13576 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 Mo{4Vp2~yPm0Sjqh=l}o! literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..14999bbc81a38b8e534ce7f1a670550f880da1b7 GIT binary patch literal 578 zcmV-I0=@l-P)uk00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt0l!H^K~y-)?UX%896=a{-`TzO?sjK_8VNCSf>stmggaA+286W6 zh=>?SVQ(ct?F5Tc(}hEl6e$807J|{3#uOGJB0>-g!77a+BxfPWoj;d-E$(m6-I1$9 zzV3VHnPGUpA3;*+r5sU_?_I@ElDCrc{pEyiamOgwc=+1Q|18EmA2NM&B0M5(zw!wRrXd00q|mO(q9>|lq+5mhG_@@qGs9G;pyaYeSO9^ zD5t(!H@r)H{^Q#kZp_~lp^1y`jC*HHu7}G%^S<(G)i%A{)uZFUHpADUOs?#Ln|-jS zox%^M5tT|QCG8OUFLg6RGCNh9f1u{gVa0*)@5f(1Pu#~HZFf}hf05o7w=p3F6R%9& Qs{jB107*qoM6N<$g1-&;YybcN literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..656de201f82d5b357860ade1d8e8418d7e9c3941 GIT binary patch literal 844 zcmV-S1GD^zP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt0?A24K~zY`?UqYS6Hyd~|EacO=mD*@QWN6B7fPgwp{OJ#1W^`- zM2NC55?T1#C~+%9jhYxShUiA3#zbO>5?p{W!HsV4fnXJU#21iAjFDGqi$GgC$Hhzw z)6S#Ojf~oVy=?nQ;`9+0;jMqqmrdh{$mv zs4^<3y%;RWqU}%+FpCiYg)JFLRetJ~#Y-F6>OM!pua9LAl}8dLs=)qyQ4*oe)ia?FE_CdTNg!L^8ujG zc#}Lpz$Ym$9CP*#z-tIkcz_R*v|@D5-yk5}5PmBH&m_4K&u3zOx&=9ga6f=Y(nFVE zqABK!vv#*3JPP2=djP=RG@Kub`adE^%!Y6n0ImW6mK}s|e?a#Ag*6GiRjji($$XiJ zDAU8t%p=)EC0^DHMdi>fAPWG*<3RwhUjn*zeuZYtztUv(2zN>E;7O60Sv*Wc&by*U zWd%H&SuIZ6CHe|8Gfx#05mgK%0rOhA$rTbz=OWC^W7~*`?6qUYa2YLWzc0hI?-w)k zcqtJPtvvnHpkdg8NcEIcPCDF;L11ZH6#xVpT=lc@{Zf90dWr!!hGY4Ps`6aZpi9n* znyq>;=O?U-J#Q%H?P^ip=z_C~OPM?3;iH8R3;zMP WKyl-Cg5vN10000004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt06 zW<^EN7eo=#OFbp|2B`U-90_r-PODI z&b=YM<$1a1oSEOunVBO@?Ka)|oT4c0L8&=WQ8!!x9Hs$>3h9}m)lx;w>(8VD(^+2(VO-HX$d7rg zRq%$)&h;_yG1?^0yGtOMro>C&m7?XsHGgtzur|>I!764F=q28EZLWS9^!D%4a z0RX76;PPD5KPsItMHzrS3;^l%7`PY>dE|JJ;o&~h|@6pzo&d3ct6J%!g6cQ0_Y?IAUH__f{TZG;5iJ943Mnpu#j-W9rXA|wd z6nz=eo2HrBSFcz_eer1G)rE)bc4K5P7_nq$>+tf`)|C4IfT{M>67?>rADG_#@w=Fu zKRg@l+P2RC4VS-zSTg#p;zUenG$1kFVU)u=4;rygRaVl%a7V`ihx@*YQI80f@7{F5 zP!dE|(xKibWrnCtJdjk{dBbXeR;et_kHcO2MMUPlv53P5P|%enTIqEQ3{m7f%F!jI z=1Q2Lu=Q-yA+4>aVTvOC;k6Z-9dg!b!q6`-$66dS^Oj}Lxl+yJFG7L2?jG0RPheSI w@%HLe-NhRfwd@Ndld#&5mg?ap^q--B0Aj98c)|hNG5`Po07*qoM6N<$g1o|ea{vGU literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b79808388410a2537ae5aedf130dfba98b45841 GIT binary patch literal 1215 zcmV;w1VH004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt1UyMZK~z}7?U-+DQ&kwopKfJ;Xy1{o1tu^A66fOB1~N3LBxV~V zI6e&HGB=1Bk__SuG4aDNq92G~WGHAfQKr-R2M8*`SrTI~RYD>d#t6)X5X=_lI_796 z?Yecf>-9tLy}j+uxjknICYrvV?(>}Y{Caxsx#!&bS`^%q$hbGyG&jvnbJN`a4c97} z?>*Ny8gUeFTxm&>sK~_SrhJOUlc%DlnHGujVru_KhU|?W6q)2oaJ}`H67<5a*UphU z7F`?{leIknik@EQ2>#~k0f79o56o$PqxBO8wU>yT?}uY8?g}EJM?>7cX57#2H{6?F z@`x6l*X8&oBBJ)WaK~4yF{nBs>N03=DG@E7;B_{6F5dNK$HkBvSi8f}TJRQt@orvc zJ~wa_GjVk`3hYcs-dqXb2YK!ZKLT;p3!o}-B|Wd&a$MyY;Em|=4$wa}kLWT4QIU=Iv zR}4A9Fn`lxjMw7@#3^XKu0%ixZ^2O!I-s`hK@h2_n~0Pfa( zDs*x&xPNyH0?>|_@J_#a<@_)MKzQ$-z}&dj={5zZ(BzF>+M1}^4*)p+*v|ss*;D>I z(U*$iB0X9nYRk;-n31=8R7nvGZeRfw_A7p89Nes(kKqQ@S^D;*G*>AmD!Z*T#JRL- zL~ROf*Q^JRhRnFE=VCQ5xb4n!2Is=#uGlKb?rKpj&&y>;0#fs<93&!IKTtu&XuKI~ zjD8ZIpjBNnGUKfVfa^6I5=_@4d#)+~EX{4YH}+!VUCwY>?@`h6TkPaD+iFTPaNv-^ zD(iL#bMeMO?zH8t&UHtP#s(MjX=ZYVE5ZufMlcp`|Cr#sZ6`=jxczd;mzWfOblQ1 z3&0FvXLzjn^>-feNnq(#=4_KSzj-h9?vnVvUC+RB?pyxh(}lv^I+n@(e!Jat2|}^( zs!e#j0192zV%*nRShMfVsfM2fuv?BZhi3L28*EGsE6_hm+sS8AVJp97W6kR& zIUgS|uY2q`_Tk?mxU0T|yyEQSSf%002ovPDHLkV1kYgOKSiC literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46e98332b7d479a517628cff885975d349ffaf92 GIT binary patch literal 1051 zcmV+$1mydPP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt1DHufK~z}7?U!3fR8bU${~5KWsbyMb(gm$FwVRa}EDEi#NP8)Z zAOb1S!mx*+8x=&oSOf(j5kWG9QCcRI(FM!WZf2!;OS+h$hGpU{M@MH)59gejqvy5< zeCT1;%k1^9y+78PbM`)a890oc8OM<2fq7sa*nbN1W}V1YJ!|YT1+Q3R(wf9%j^dTX zTX1&2>MR4(d1l>z)8)+13s;$@4jXXQV@)jwFnxikwayN}|Nde(%lwk>s&NkyB|Nut z9M^s-fQTahD6dh2*^?eS$B&38!zMT%=Mhn+d$4O%=}c@j(OR1`QaOdl@2fkofe5M* z$JInsA&H$JqSK12R9@PGRt$;br$BhDB(~oKlqjxJhH+PcF43t6;-$fW4L}3O4*OmS zw2DqA5Hup11oRKE!=3>6BsxC8$fe5wc(KD?0eCMuvw+$W(b>SXaqO@f0PlJQXE{*T zA&r`hhz2vv(G0-$Sn$?)!FEv^9&{ju9oA(7fIPtqOagN1CE*rK-O3K@2LO~b3hq9@ zme%76*W$!PMVR6aXyK2pUE+R9A)@5J&hU>MJLBGL=QysLhxxu1v>JaRO77BrjpUby+QHg!143mHAHoX9_wfeI} zT7Dqe8^GV_Hc{DeeuBbZCWl=<2mnUM2yw>d4RK~`bc<7nFPy{z>xdjwd{SPay=@XV z<+?%t)j+^@<;QMsl(JBKgC#S3kFkNl=6sMH-3mugNG1ylO>Y^>1dfC;(aM=%=G+PT zD4Q_y-<09cDvJl!7>_WT%WZ{?ZwgS zoq7t3Ub;?RpSa}Bv(zUuG-B4O+NNK9+{D1Siv5jQ0Pw)gG7!=7Eiw{R7b0 VA>AEL@E`yH002ovPDHLkV1nIg=6(PG literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fa8fb63c00b12c1fbdaac3b574c6e53a4cc396 GIT binary patch literal 1635 zcmV-p2AuhcP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 dOWBM=u=Bw+Pltwf%n=O&R%R&ES01X1 literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc11dc20e7449af0c12a2fffc83a1c4579e78587 GIT binary patch literal 1789 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt26{OaK$W1TXEv0$k5(_hx(Q`U>cq5A;{j}e0baVbZ@J<_o7OG8Tv}!5y1A}kwGLrf;;lLmCP|Vc zNpbVf+8qvuJ$qiPR4F4W#A+1>*fq#Ybv;^=BuQ%cnYBuFKecfs!D52}ZZv<}OZSE( zNs<(GLZ-|~Z~}zq3e_w8mz`DE*i&_UBS7fZjxue_-O&J8=Lpp+3Xt_3^*wb909X|7 zp^jKr4}dM_jRctKz~Z60v=^Y)OJ2UQ9|7Q4Wgx)*qu#EY9RSl6ypviu9V(0iNCj*j zx_tmKT@<_nrvgy$hhYHc_5-DIUByX&K8pTB!U4!K3?L1lSgy;z3(#KCKlnueMBYLn z0Q-7?YjR})0L_#m`lArxKftj*;vQ zqX2CT0?4Vn?vuX+T>-NGQjQ4*=z_M00OVF)^M04969M=_ImQZfe9Rz#suyjeOx?!< z@WWZfm||eKK;1$BMXsB4S^gb51i(H~@t>FnVTJ+RcHIkolLM255@Qj7 z>csmi*=yLL2LPY$@(wAw;%aSKYQf z5a@1sbteE}8Erjd9+XK4iCPc1<`TE6&a9Dn%nt#eWRTa)Uq`TgRe)bB$KFP6y4gkU z9#PYr*OGy|@Ke+PZY^|PA9vFgC(EAMq{@V(ba<+ti%c~D>&{;Qh;~~_#lfQE4UO*`s}_cY>g_>OtV*z@)4ACTakYz>&Fl zC;w;qxi=$iimfhe=rHfDPXKBoVMT-$_+}{OF&=9InxwaLD-{fIUjc+q9UWp!57deU z7=M`Hp`NDv-f3>7h#%e8Cq>iSEfYz|wE;)~crffJqr6PkcSinOU23$wuMF?~_>^MA zL>0if-B&vFKtfk<Ow}6 z$A(?=r6Ngb;2afW*t!w`?Aya1TvxCcr0;#?DcAfQmv=^PEm<4VIRGtD1>l-%bUkrP zc@37oWp!a#gtM80o^!He|Mfna1nLP%_R|8LNMz4$?c;(^zMwE0jrm-QKqDh^ONP`X zs6nBkK4rW{phiwOPOyD!%Iz~#Ynw)+2g(xiMG*GkJr zMWa)e=>w=eUoSvri7o*84b}-@Q%_Q~S4IoNbrPIXwQ2)2UZy>ss>%hO03^=P2T-JH zt?}#DozrJ8TrRwArH<67b{RTEJ-8+S`@xJIcl7;om#D9jYkCBM1D0P{DKejHi~38f z@(x&r?aAzI06>ht06?b=JL1tR?NzOs8x;1hKNd^wYLcMb`u_I-5cuw4eVve~+P=s* z5SKYZ55QP;v&bfuW$7IM+wYjDZWsJ`oii&T}hyM1^1-0q% ze0N_53q41OaK$W1TXWZ;5A00000NkvXXu0mjfyYoX9 literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..be96c25c2a02e41bce0983c734e7855293c94f50 GIT binary patch literal 2825 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 literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png b/IndieMusic/IndieMusic/Resources/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f64eebf8a2f80bd9e9299164aa1a117691c3ada5 GIT binary patch literal 1948 zcmV;N2V?k&P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 diff --git a/IndieMusic/IndieMusic/Resources/Json/images/img_0.png b/IndieMusic/IndieMusic/Resources/Json/images/img_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e6516f328a5856af0e9aff365020321ad4ea9f0b GIT binary patch literal 8729 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