Skip to content

Commit

Permalink
Merge pull request #719 from wakmusic/704-implement-upload-playlist-i…
Browse files Browse the repository at this point in the history
…mage

🔀 :: (#704) 커스텀 플레이 리스트를 갤러리에서 가져와 적용합니다 (Pending)
  • Loading branch information
yongbeomkwak authored Jul 2, 2024
2 parents 2dbb1bc + 7a3da93 commit 3357084
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Utility

public protocol PlaylistImageEditSheetViewType: AnyObject {
var playlistImageEditSheetView: PlaylistImageEditSheetView! { get set }
var bottomSheetView: BottomSheetView! { get set }
var playlistImageBottomSheetView: BottomSheetView! { get set }
}

public enum PlaylistImageEditType {
Expand All @@ -22,21 +22,21 @@ public extension PlaylistImageEditSheetViewType where Self: UIViewController {
in view: UIView,
contentHeight: CGFloat = 56
) {
if self.playlistImageEditSheetView == nil || self.bottomSheetView == nil {
if self.playlistImageEditSheetView == nil || self.playlistImageBottomSheetView == nil {
self.playlistImageEditSheetView = PlaylistImageEditSheetView()
self.bottomSheetView = BottomSheetView(
self.playlistImageBottomSheetView = BottomSheetView(
contentView: self.playlistImageEditSheetView,
contentHeights: [contentHeight]
)
}

guard
let bottomSheetView = self.bottomSheetView
let bottomSheetView = self.playlistImageBottomSheetView
else { return }

// bottomSheetView가 해당 뷰에 붙지 않았을때만 present 합니다.
guard
!view.subviews.contains(self.bottomSheetView)
!view.subviews.contains(self.playlistImageBottomSheetView)
else { return }

bottomSheetView.present(in: view)
Expand All @@ -48,13 +48,13 @@ public extension PlaylistImageEditSheetViewType where Self: UIViewController {
/// 편집하기 팝업을 제거합니다.
func hideplaylistImageEditSheet() {
guard
let bottomSheetView = self.bottomSheetView
let bottomSheetView = self.playlistImageBottomSheetView
else { return }
bottomSheetView.dismiss()
playlistImageBottomSheetView.dismiss()

// nil 할당으로 메모리에서 제거
self.playlistImageEditSheetView = nil
self.bottomSheetView = nil
self.playlistImageBottomSheetView = nil

// 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 다시 보여줍니다.
NotificationCenter.default.post(name: .hideSongCart, object: nil)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,59 +1,24 @@
//
// RequestPermissionable.swift
// BaseFeature
//
// Created by KTH on 2023/04/09.
// Copyright © 2023 yongbeomkwak. All rights reserved.
//

import AVFoundation
import Foundation
import Photos
import UIKit
import Utility

public enum RequestPermissionType {
case camera
case photoLibrary
}

public protocol RequestPermissionable: AnyObject {
func requestCameraPermission()
func requestPhotoLibraryPermission()
func showErrorMessage(type: RequestPermissionType)
func showCamera()
func showPhotoLibrary()
}

public extension RequestPermissionable {
func showCamera() {}
func showPhotoLibrary() {}
}

public extension RequestPermissionable where Self: UIViewController {
func requestCameraPermission() {
let cameraMediaType = AVMediaType.video
let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)

switch cameraAuthorizationStatus {
case .denied, .restricted:
self.showErrorMessage(type: .camera)
case .authorized:
self.showCamera()
case .notDetermined:
AVCaptureDevice.requestAccess(for: cameraMediaType) { granted in
if granted {
DispatchQueue.main.async {
self.showCamera()
}
} else {
self.showErrorMessage(type: .camera)
}
}
default: return
}
}

func requestPhotoLibraryPermission() {
let status = PHPhotoLibrary.authorizationStatus()
switch status {
Expand All @@ -80,8 +45,6 @@ public extension RequestPermissionable where Self: UIViewController {
func showErrorMessage(type: RequestPermissionType) {
var message: String = ""
switch type {
case .camera:
message = "[선택권한] 카메라 촬영을 하려면 권한 승인이 필요합니다."
case .photoLibrary:
message = "[선택권한] 앨범 사진을 첨부하거나, 저장 하려면 권한 승인이 필요합니다."
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ final class MyPlaylistDetailReactor: Reactor {
case restore
case itemDidMoved(Int, Int)
case forceSave
case forceEndEditing
case changeTitle(String)
case selectAll
case deselectAll
case removeSongs
case changeThumnail(Data?)
}

enum Mutation {
Expand All @@ -32,6 +34,7 @@ final class MyPlaylistDetailReactor: Reactor {
case updateLoadingState(Bool)
case updateSelectedCount(Int)
case updateSelectingStateByIndex([SongEntity])
case updateThumbnail(Data?)
case showtoastMessage(String)
}

Expand All @@ -42,6 +45,7 @@ final class MyPlaylistDetailReactor: Reactor {
var backUpDataSource: [SongEntity]
var isLoading: Bool
var selectedCount: Int
var replaceThumnbnailData: Data?
@Pulse var toastMessage: String?
}

Expand Down Expand Up @@ -84,7 +88,8 @@ final class MyPlaylistDetailReactor: Reactor {
dataSource: [],
backUpDataSource: [],
isLoading: false,
selectedCount: 0
selectedCount: 0,
replaceThumnbnailData: nil
)
}

Expand All @@ -99,6 +104,9 @@ final class MyPlaylistDetailReactor: Reactor {
return updatePrivate()

case .forceSave, .completeButtonDidTap:
return endEditingWithSave()

case .forceEndEditing:
return endEditing()

case let .itemDidTap(index):
Expand All @@ -119,6 +127,8 @@ final class MyPlaylistDetailReactor: Reactor {

case .removeSongs:
return removeSongs()
case let .changeThumnail(data):
return updateThumbnail(data)
}
}

Expand Down Expand Up @@ -148,6 +158,9 @@ final class MyPlaylistDetailReactor: Reactor {

case let .showtoastMessage(message):
newState.toastMessage = message

case let .updateThumbnail(data):
newState.replaceThumnbnailData = data
}

return newState
Expand Down Expand Up @@ -185,8 +198,7 @@ private extension MyPlaylistDetailReactor {
])
}

func endEditing() -> Observable<Mutation> {
#warning("저장 유즈 케이스")
func endEditingWithSave() -> Observable<Mutation> {
let state = currentState
var currentDataSoruce = state.dataSource

Expand All @@ -205,6 +217,23 @@ private extension MyPlaylistDetailReactor {
])
}

func endEditing() -> Observable<Mutation> {
let state = currentState
var currentDataSoruce = state.dataSource

for i in 0 ..< currentDataSoruce.count {
currentDataSoruce[i].isSelected = false
}

return .concat([
.just(.updateEditingState(false)),
.just(.updateDataSource(currentDataSoruce)),
.just(.updateBackUpDataSource(currentDataSoruce)),
.just(.updateSelectedCount(0)),

])
}

func updatePrivate() -> Observable<Mutation> {
let state = currentState

Expand Down Expand Up @@ -338,4 +367,8 @@ private extension MyPlaylistDetailReactor {

])
}

func updateThumbnail(_ data: Data?) -> Observable<Mutation> {
return .just(.updateThumbnail(data))
}
}
Loading

0 comments on commit 3357084

Please sign in to comment.