Skip to content

Commit

Permalink
Trim down AddToPlaylistView. Add Only. Existing Playlists include ext…
Browse files Browse the repository at this point in the history
…ra information but no other details. Use a better button on tvOS.
  • Loading branch information
JPKribs committed Mar 4, 2025
1 parent d3fc1e4 commit b51703a
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 223 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,11 @@ struct AddToPlaylistView: View {

@State
private var playlistName: String = ""
@State
private var playlistType: PlaylistViewModel.PlaylistType = .unknown

// TODO: Enable for 10.10
// @State
// private var playlistPublic: Bool = false

// MARK: - Remove Item Variables

@State
private var isPresentingRemovalConfirmation: Bool = false
@State
private var selectedItem: BaseItemDto? = nil

// MARK: - Error State

@State
Expand Down Expand Up @@ -98,37 +89,8 @@ struct AddToPlaylistView: View {
if viewModel.backgroundStates.contains(.updatingPlaylist) {
ProgressView()
}
Button(L10n.add) {
if let itemID = item.id {
if viewModel.selectedPlaylist == nil {
let newPlaylist = CreatePlaylistDto(
ids: [itemID],
mediaType: playlistType.rawValue,
name: playlistName,
userID: userSession?.user.id
)

viewModel.send(.createPlaylist(newPlaylist))
} else {
viewModel.send(.addItems([itemID]))
}
}
}
.disabled(!isValid)
}
.navigationBarTitle(L10n.addToPlaylist.localizedCapitalized)
.confirmationDialog(
L10n.removeItem(selectedItem?.name ?? selectedItem?.type?.displayTitle ?? L10n.items),
isPresented: $isPresentingRemovalConfirmation
) {
Button(L10n.remove, role: .destructive) {
if let item = selectedItem {
viewModel.send(.removeItems([item.id!]))
}
}
} message: {
Text(L10n.removeItemConfirmationMessage)
}
.onFirstAppear {
viewModel.send(.getPlaylists)
}
Expand All @@ -137,8 +99,7 @@ struct AddToPlaylistView: View {
case .created, .added, .updated:
router.dismissCoordinator()
case .removed:
selectedItem = nil
isPresentingRemovalConfirmation = false
break
case let .error(eventError):
error = eventError
}
Expand All @@ -158,7 +119,7 @@ struct AddToPlaylistView: View {

playlistDetailsView

playlistItemsView
commitButtonView
}
}

Expand Down Expand Up @@ -230,43 +191,54 @@ struct AddToPlaylistView: View {
Text(overview)
}
}
Section(L10n.details) {
if let mediaType = selectedPlaylist.mediaType {
TextPairView(leading: L10n.type, trailing: mediaType.displayTitle)
}
if let runTimeTicks = selectedPlaylist.runTimeTicks {
TextPairView(leading: L10n.duration, trailing: runTimeTicks.seconds.formatted(.hourMinute))
}
if let childCount = selectedPlaylist.childCount {
TextPairView(leading: L10n.items, trailing: childCount.description)
}
}
} else {
Section(L10n.createPlaylist) {
TextField(L10n.name, text: $playlistName)
.listRowInsets(.zero)

// TODO: Enable for 10.10
// Toggle(L10n.public, isOn: $playlistPublic)

InlineEnumToggle(title: L10n.type, selection: $playlistType)
}
}
}

// MARK: - Playlist Items View

@ViewBuilder
private var playlistItemsView: some View {
if !viewModel.selectedPlaylistItems.isEmpty {
ForEach(BaseItemKind.allCases, id: \.self) { sectionType in
let sectionItems = viewModel.selectedPlaylistItems.filter { $0.type == sectionType }

if !sectionItems.isEmpty {
Section(sectionType.displayTitle) {
PosterHStack(
type: .portrait,
items: sectionItems
private var commitButtonView: some View {
let createNewPlaylist: Bool = viewModel.selectedPlaylist == nil

Section {
ListRowButton(createNewPlaylist ? L10n.createPlaylist.localizedCapitalized : L10n.add) {
if let itemID = item.id {
if createNewPlaylist {
let newPlaylist = CreatePlaylistDto(
ids: [itemID],
name: playlistName,
userID: userSession?.user.id
)
.onSelect {
selectedItem = $0
isPresentingRemovalConfirmation = true
}
.focusSection()
.frame(height: 240)
.listRowInsets(.zero)
viewModel.send(.createPlaylist(newPlaylist))
} else {
viewModel.send(.addItems([itemID]))
}
}
}
.disabled(!isValid)
.foregroundStyle(
Color.jellyfinPurple.overlayColor,
isValid ? Color.jellyfinPurple : Color.white.opacity(0.5)
)
.opacity(isValid ? 1 : 0.5)
.listRowInsets(.zero)
}
}
}
4 changes: 0 additions & 4 deletions Swiftfin.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,6 @@
4EC3B7F92D62C23F00E29FF1 /* AddToPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC3B7F82D62C23800E29FF1 /* AddToPlaylistView.swift */; };
4EC50D612C934B3A00FC3D0E /* ServerTasksViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC50D602C934B3A00FC3D0E /* ServerTasksViewModel.swift */; };
4EC6C16B2C92999800FC904B /* TranscodeSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC6C16A2C92999800FC904B /* TranscodeSection.swift */; };
4EC8787F2D76562E00C23853 /* EditPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC8787E2D76562900C23853 /* EditPlaylistView.swift */; };
4ECDAA9E2C920A8E0030F2F5 /* TranscodeReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECDAA9D2C920A8E0030F2F5 /* TranscodeReason.swift */; };
4ECDAA9F2C920A8E0030F2F5 /* TranscodeReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECDAA9D2C920A8E0030F2F5 /* TranscodeReason.swift */; };
4ECF5D882D0A3D0200F066B1 /* AddAccessScheduleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECF5D812D0A3D0200F066B1 /* AddAccessScheduleView.swift */; };
Expand Down Expand Up @@ -1451,7 +1450,6 @@
4EC50D602C934B3A00FC3D0E /* ServerTasksViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerTasksViewModel.swift; sourceTree = "<group>"; };
4EC6C16A2C92999800FC904B /* TranscodeSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranscodeSection.swift; sourceTree = "<group>"; };
4EC71FBB2D161FE300D0B3A8 /* AlphabetizeStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlphabetizeStrings.swift; sourceTree = "<group>"; };
4EC8787E2D76562900C23853 /* EditPlaylistView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditPlaylistView.swift; sourceTree = "<group>"; };
4ECDAA9D2C920A8E0030F2F5 /* TranscodeReason.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranscodeReason.swift; sourceTree = "<group>"; };
4ECF5D812D0A3D0200F066B1 /* AddAccessScheduleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccessScheduleView.swift; sourceTree = "<group>"; };
4ECF5D892D0A57EF00F066B1 /* DynamicDayOfWeek.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicDayOfWeek.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2958,7 +2956,6 @@
4EC3B7F72D62C23100E29FF1 /* PlaylistView */ = {
isa = PBXGroup;
children = (
4EC8787E2D76562900C23853 /* EditPlaylistView.swift */,
4EC3B7F82D62C23800E29FF1 /* AddToPlaylistView.swift */,
);
path = PlaylistView;
Expand Down Expand Up @@ -6798,7 +6795,6 @@
E11C15352BF7C505006BC9B6 /* UserProfileImageCoordinator.swift in Sources */,
4EA78B232D2B5CFC0093BFCE /* ItemPhotoCropView.swift in Sources */,
E1D8428F2933F2D900D1041A /* MediaSourceInfo.swift in Sources */,
4EC8787F2D76562E00C23853 /* EditPlaylistView.swift in Sources */,
E1BDF2EC2952290200CC0294 /* AspectFillActionButton.swift in Sources */,
BD0BA22B2AD6503B00306A8D /* OnlineVideoPlayerManager.swift in Sources */,
E1BDF2F529524E6400CC0294 /* PlayNextItemActionButton.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,11 @@ struct AddToPlaylistView: View {

@State
private var playlistName: String = ""
@State
private var playlistType: PlaylistViewModel.PlaylistType = .unknown

// TODO: Enable for 10.10
// @State
// private var playlistPublic: Bool = false

// MARK: - Edit Playlist View State

@State
private var isPresentingContents: Bool = false

// MARK: - Error State

@State
Expand Down Expand Up @@ -109,7 +102,6 @@ struct AddToPlaylistView: View {
if viewModel.selectedPlaylist == nil {
let newPlaylist = CreatePlaylistDto(
ids: [itemID],
mediaType: playlistType.rawValue,
name: playlistName,
userID: userSession?.user.id
)
Expand All @@ -128,16 +120,6 @@ struct AddToPlaylistView: View {
.navigationBarCloseButton {
router.dismissCoordinator()
}
.sheet(isPresented: $isPresentingContents) {
isPresentingContents = false
} content: {
EditPlaylistView(
viewModel: viewModel,
onClose: {
isPresentingContents = false
}
)
}
.onFirstAppear {
viewModel.send(.getPlaylists)
}
Expand Down Expand Up @@ -201,26 +183,23 @@ struct AddToPlaylistView: View {
Text(overview)
}
}

Section(L10n.options) {
ChevronButton(L10n.existingItems)
.onSelect {
isPresentingContents = true
}
Section(L10n.details) {
if let mediaType = selectedPlaylist.mediaType {
TextPairView(leading: L10n.type, trailing: mediaType.displayTitle)
}
if let runTimeTicks = selectedPlaylist.runTimeTicks {
TextPairView(leading: L10n.duration, trailing: runTimeTicks.seconds.formatted(.hourMinute))
}
if let childCount = selectedPlaylist.childCount {
TextPairView(leading: L10n.items, trailing: childCount.description)
}
}
} else {
Section(L10n.createPlaylist) {
TextField(L10n.name, text: $playlistName)

// TODO: Enable for 10.10
// Toggle(L10n.public, isOn: $playlistPublic)

Picker(L10n.type, selection: $playlistType) {
ForEach(PlaylistViewModel.PlaylistType.allCases) { type in
Text(type.displayTitle)
.tag(type)
}
}
}
}
}
Expand Down
126 changes: 0 additions & 126 deletions Swiftfin/Views/ItemView/Components/PlaylistView/EditPlaylistView.swift

This file was deleted.

0 comments on commit b51703a

Please sign in to comment.