Skip to content

Commit

Permalink
Subscription List (#1052)
Browse files Browse the repository at this point in the history
Co-authored-by: Eric Andrews <[email protected]>
  • Loading branch information
Sjmarf and EricBAndrews authored May 11, 2024
1 parent 7d694ab commit 06ed65e
Show file tree
Hide file tree
Showing 8 changed files with 127 additions and 7 deletions.
14 changes: 10 additions & 4 deletions Mlem.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
030FF67D2BC8524500F6BFAC /* CustomTabItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030FF67C2BC8524500F6BFAC /* CustomTabItem.swift */; };
030FF67F2BC8544700F6BFAC /* CustomTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030FF67E2BC8544600F6BFAC /* CustomTabBarController.swift */; };
030FF6812BC859FD00F6BFAC /* CustomTabViewHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030FF6802BC859FD00F6BFAC /* CustomTabViewHostingController.swift */; };
031E2D512BEF961D0003BC45 /* SubscriptionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031E2D502BEF961D0003BC45 /* SubscriptionListView.swift */; };
035BE0872BDD8DA000F77D73 /* NavigationRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035BE0862BDD8DA000F77D73 /* NavigationRootView.swift */; };
035BE0892BDD901B00F77D73 /* NavigationPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035BE0882BDD901B00F77D73 /* NavigationPage.swift */; };
035BE08B2BDD903100F77D73 /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035BE08A2BDD903100F77D73 /* NavigationModel.swift */; };
Expand All @@ -22,6 +23,7 @@
037386412BDAF3F7007492B5 /* Markdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037386402BDAF3F7007492B5 /* Markdown.swift */; };
037386442BDAF574007492B5 /* LemmyMarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 037386432BDAF574007492B5 /* LemmyMarkdownUI */; };
037386472BDAFE81007492B5 /* LemmyMarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 037386462BDAFE81007492B5 /* LemmyMarkdownUI */; };
037658DF2BE7D9EF00F4DD4D /* Community1Providing+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037658DE2BE7D9EF00F4DD4D /* Community1Providing+Extensions.swift */; };
03D3A1D42BB88EF1009DE55E /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D3A1D32BB88EF1009DE55E /* Action.swift */; };
03D3A1E32BB8A40A009DE55E /* EmptyButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D3A1E22BB8A40A009DE55E /* EmptyButtonStyle.swift */; };
03D3A1E52BB8B7A3009DE55E /* ActionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D3A1E42BB8B7A3009DE55E /* ActionType.swift */; };
Expand Down Expand Up @@ -118,15 +120,16 @@
030FF67C2BC8524500F6BFAC /* CustomTabItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTabItem.swift; sourceTree = "<group>"; };
030FF67E2BC8544600F6BFAC /* CustomTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTabBarController.swift; sourceTree = "<group>"; };
030FF6802BC859FD00F6BFAC /* CustomTabViewHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTabViewHostingController.swift; sourceTree = "<group>"; };
031E2D502BEF961D0003BC45 /* SubscriptionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionListView.swift; sourceTree = "<group>"; };
035BE0862BDD8DA000F77D73 /* NavigationRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRootView.swift; sourceTree = "<group>"; };
035BE0882BDD901B00F77D73 /* NavigationPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationPage.swift; sourceTree = "<group>"; };
035BE08A2BDD903100F77D73 /* NavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationModel.swift; sourceTree = "<group>"; };
035BE08C2BDE88EC00F77D73 /* NavigationLayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationLayerView.swift; sourceTree = "<group>"; };
035BE08E2BDE911900F77D73 /* NavigationLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationLayer.swift; sourceTree = "<group>"; };
035BE0902BDEA01E00F77D73 /* NavigationPage+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NavigationPage+View.swift"; sourceTree = "<group>"; };
036CC3AE2B8145C30098B6A1 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
0373863F2BDAE6DB007492B5 /* LemmyMarkdownUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = LemmyMarkdownUI; path = ../../LemmyMarkdownUI; sourceTree = "<group>"; };
037386402BDAF3F7007492B5 /* Markdown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Markdown.swift; sourceTree = "<group>"; };
037658DE2BE7D9EF00F4DD4D /* Community1Providing+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Community1Providing+Extensions.swift"; sourceTree = "<group>"; };
03D3A1D32BB88EF1009DE55E /* Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Action.swift; sourceTree = "<group>"; };
03D3A1E22BB8A40A009DE55E /* EmptyButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyButtonStyle.swift; sourceTree = "<group>"; };
03D3A1E42BB8B7A3009DE55E /* ActionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionType.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -298,7 +301,6 @@
6363D5C327EE196700E34822 /* Mlem */ = {
isa = PBXGroup;
children = (
0373863F2BDAE6DB007492B5 /* LemmyMarkdownUI */,
CD4D583B2B867BB300B82964 /* App */,
6363D5C827EE196A00E34822 /* Assets.xcassets */,
630D753C27F65E44006E60C9 /* Info.plist */,
Expand Down Expand Up @@ -375,6 +377,7 @@
isa = PBXGroup;
children = (
CD4BAD342B4B2C0B00A1E726 /* FeedsView.swift */,
031E2D502BEF961D0003BC45 /* SubscriptionListView.swift */,
);
path = Feeds;
sourceTree = "<group>";
Expand Down Expand Up @@ -605,6 +608,7 @@
isa = PBXGroup;
children = (
CDC199E92BE449790077B4F1 /* Interactable1Providing+Extensions.swift */,
037658DE2BE7D9EF00F4DD4D /* Community1Providing+Extensions.swift */,
CDC199EB2BE449EA0077B4F1 /* Post1Providing+Extensions.swift */,
);
path = "Content Models";
Expand Down Expand Up @@ -811,6 +815,7 @@
037386412BDAF3F7007492B5 /* Markdown.swift in Sources */,
CD4D58CF2B86DDEC00B82964 /* AccountSortMode.swift in Sources */,
CD4D59062B87B1A400B82964 /* Notifiable.swift in Sources */,
037658DF2BE7D9EF00F4DD4D /* Community1Providing+Extensions.swift in Sources */,
CD4D58C02B86DBD100B82964 /* DefaultAvatarView.swift in Sources */,
CD1446212A5B328E00610EF1 /* Privacy Policy.swift in Sources */,
CD1446272A5B36DA00610EF1 /* EULA.swift in Sources */,
Expand All @@ -834,6 +839,7 @@
CD4D59142B87B36B00B82964 /* InternetConnectionManager.swift in Sources */,
03D3A1EF2BB9CA1D009DE55E /* MenuButton.swift in Sources */,
CDC199EC2BE449EA0077B4F1 /* Post1Providing+Extensions.swift in Sources */,
031E2D512BEF961D0003BC45 /* SubscriptionListView.swift in Sources */,
030FF67B2BC8521600F6BFAC /* CustomTabView.swift in Sources */,
CD4D59162B87B38C00B82964 /* UIApplication+Extensions.swift in Sources */,
CDA1E8542B952C3D007953EF /* StateManager.swift in Sources */,
Expand Down Expand Up @@ -1290,8 +1296,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/mlemgroup/MlemMiddleware.git";
requirement = {
branch = master;
kind = branch;
kind = upToNextMinorVersion;
minimumVersion = 0.1.0;
};
};
/* End XCRemoteSwiftPackageReference section */
Expand Down
12 changes: 12 additions & 0 deletions Mlem/App/Globals/Definitions/AppState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import Dependencies
import Foundation
import MlemMiddleware
import SwiftUI

@Observable
class AppState {
Expand Down Expand Up @@ -65,12 +66,21 @@ class ActiveAccount: Hashable {
private(set) var userStub: UserStub?
private(set) var user: User?
private(set) var instance: Instance3?
private(set) var subscriptions: SubscriptionList?

// TODO: Store this in a file; make sure to translate 1.0 favorites to 2.0 favorites
private var favorites: Set<Int> = []

var actorId: URL? { userStub?.actorId }

init(userStub: UserStub) {
self.api = userStub.api
api.permissions = .all
self.subscriptions = api.setupSubscriptionList(
getFavorites: { self.favorites },
setFavorites: { self.favorites = $0 }
)

Task {
try await self.api.fetchSiteVersion(task: Task {
let (user, instance) = try await self.api.getMyUser(userStub: userStub)
Expand All @@ -80,6 +90,8 @@ class ActiveAccount: Hashable {
self.instance = instance
return instance.version
})

try await self.api.getSubscriptionList()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//
// Community1Providing+Extensions.swift
// Mlem
//
// Created by Sjmarf on 05/05/2024.
//

import Foundation
import MlemMiddleware

extension Community1Providing {
private var self2: (any Community2Providing)? { self as? any Community2Providing }

var subscribeAction: BasicAction {
let isOn: Bool = self2?.subscribed ?? false
return .init(
isOn: isOn,
label: isOn ? "Unsubscribe" : "Subscribe",
color: isOn ? .green : .red,
icon: isOn ? Icons.unsubscribe : Icons.subscribe,
barIcon: Icons.subscribe,
swipeIcon1: isOn ? Icons.unsubscribePerson : Icons.subscribePerson,
swipeIcon2: isOn ? Icons.unsubscribePersonFill : Icons.subscribePersonFill,
callback: api.willSendToken ? self2?.toggleSubscribe : nil
)
}

var favoriteAction: BasicAction {
let isOn: Bool = self2?.favorited ?? false
return .init(
isOn: isOn,
label: isOn ? "Unfavorite" : "Favorite",
color: .blue,
icon: isOn ? Icons.unfavorite : Icons.favorite,
barIcon: Icons.favorite,
menuIcon: isOn ? Icons.favoriteFill : Icons.favorite,
swipeIcon1: isOn ? Icons.unfavorite : Icons.favorite,
swipeIcon2: isOn ? Icons.unfavoriteFill : Icons.favoriteFill,
callback: api.willSendToken ? self2?.toggleFavorite : nil
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ extension Interactable1Providing {
}

var saveAction: BasicAction {
let isOn: Bool = self2?.isSaved ?? false
let isOn: Bool = self2?.saved ?? false
return .init(
isOn: isOn,
label: isOn ? "Unsave" : "Save",
Expand Down
2 changes: 1 addition & 1 deletion Mlem/App/Views/Root/Tabs/Feeds/FeedsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ struct MinimalPostFeedView: View {
Text(post.title)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal)
.foregroundStyle(post.isRead ? .secondary : .primary)
.foregroundStyle(post.read ? .secondary : .primary)
}
.padding(10)
.background(Color(uiColor: .systemBackground))
Expand Down
59 changes: 59 additions & 0 deletions Mlem/App/Views/Root/Tabs/Feeds/SubscriptionListView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
//
// SubscriptionListView.swift
// Mlem
//
// Created by Sjmarf on 11/05/2024.
//

import MlemMiddleware
import SwiftUI

private struct SubscriptionListSection: Identifiable {
let label: String
let communities: [Community2]

var id: String { label }
}

private extension SubscriptionList {
var visibleSections: [SubscriptionListSection] {
var sections: [SubscriptionListSection] = .init()
if !favorites.isEmpty {
sections.append(.init(label: "Favorites", communities: favorites))
}
for section in alphabeticSections.sorted(by: { $0.key ?? "~" < $1.key ?? "~" }) {
sections.append(.init(label: section.key ?? "#", communities: section.value))
}
return sections
}
}

struct SubscriptionListView: View {
@Environment(AppState.self) var appState

var body: some View {
List {
ForEach(appState.firstAccount.subscriptions?.visibleSections ?? .init()) { section in
Section(section.label) {
ForEach(section.communities) { community in
HStack {
Text(community.name)
Spacer()
let action = community.favoriteAction
Button(action: action.callback ?? {}) {
Image(systemName: action.menuIcon)
.foregroundStyle(action.isOn ? action.color : .primary)
}
.buttonStyle(EmptyButtonStyle())
.disabled(action.callback == nil)
.opacity(action.callback == nil ? 0.5 : 1)
}
}
}
}
}
.listStyle(.plain)
.navigationTitle("Subscription List")
.navigationBarTitleDisplayMode(.inline)
}
}
1 change: 1 addition & 0 deletions Mlem/App/Views/Root/Tabs/Profile/Profile View.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Dependencies
import MlemMiddleware
import SwiftUI

struct ProfileView: View {
Expand Down
2 changes: 1 addition & 1 deletion Mlem/App/Views/Shared/Navigation/NavigationPage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ extension NavigationPage {
case .inbox:
Text("Inbox")
case .search:
Text("Search")
SubscriptionListView()
case .settings:
Text("Settings")
case .quickSwitcher:
Expand Down

0 comments on commit 06ed65e

Please sign in to comment.