mirror of
https://github.com/cranci1/Sora.git
synced 2026-04-21 08:32:00 +00:00
Build x2 (#115)
* fixed plist * made Anilist push updaes correctly * test episode order * fixed display order * Revert "fixed display order" This reverts commitfd3591c666. * Revert "test episode order" This reverts commit1637383a19. * there is now 😏 (#105) * the great logic of not sending the user back when unbookmark * fixed subtitle view being behind the skip 85s button * bug fix progress bar no longer flashes back to the previous position it was in before scrubbing * moved dim button * skip intro/outro bug fix using invisble overlay no longer lets the skip buttons be visible * bug fix segment marker being outside of the progress bar * beautiful ahh skip buttons https://discord.com/channels/1293430817841741899/1318240587886891029/1364701327120269476 * community library??? * now it will 😼 * Update CommunityLib.swift * no comments + restored older code * cuts off at the tab bar * its perfect now just need to add some drops * eh * donezo * test --------- Co-authored-by: Seiike <122684677+Seeike@users.noreply.github.com>
This commit is contained in:
parent
ec3b251d83
commit
b5a7b43b52
6 changed files with 228 additions and 37 deletions
|
|
@ -12,7 +12,7 @@ struct SoraApp: App {
|
||||||
@StateObject private var settings = Settings()
|
@StateObject private var settings = Settings()
|
||||||
@StateObject private var moduleManager = ModuleManager()
|
@StateObject private var moduleManager = ModuleManager()
|
||||||
@StateObject private var librarykManager = LibraryManager()
|
@StateObject private var librarykManager = LibraryManager()
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
TraktToken.checkAuthenticationStatus { isAuthenticated in
|
TraktToken.checkAuthenticationStatus { isAuthenticated in
|
||||||
if isAuthenticated {
|
if isAuthenticated {
|
||||||
|
|
@ -22,7 +22,7 @@ struct SoraApp: App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
ContentView()
|
ContentView()
|
||||||
|
|
@ -47,33 +47,71 @@ struct SoraApp: App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleURL(_ url: URL) {
|
private func handleURL(_ url: URL) {
|
||||||
guard url.scheme == "sora",
|
guard url.scheme == "sora", let host = url.host else { return }
|
||||||
url.host == "module",
|
switch host {
|
||||||
let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
|
case "default_page":
|
||||||
let moduleURL = components.queryItems?.first(where: { $0.name == "url" })?.value else {
|
if let comps = URLComponents(url: url, resolvingAgainstBaseURL: true),
|
||||||
return
|
let libraryURL = comps.queryItems?.first(where: { $0.name == "url" })?.value {
|
||||||
}
|
|
||||||
|
UserDefaults.standard.set(libraryURL, forKey: "lastCommunityURL")
|
||||||
let addModuleView = ModuleAdditionSettingsView(moduleUrl: moduleURL).environmentObject(moduleManager)
|
UserDefaults.standard.set(true, forKey: "didReceiveDefaultPageLink")
|
||||||
let hostingController = UIHostingController(rootView: addModuleView)
|
|
||||||
|
let communityView = CommunityLibraryView()
|
||||||
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
|
.environmentObject(moduleManager)
|
||||||
let window = windowScene.windows.first {
|
let hostingController = UIHostingController(rootView: communityView)
|
||||||
window.rootViewController?.present(hostingController, animated: true)
|
DispatchQueue.main.async {
|
||||||
} else {
|
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
|
||||||
Logger.shared.log("Failed to present module addition view: No window scene found", type: "Error")
|
let window = scene.windows.first,
|
||||||
|
let root = window.rootViewController {
|
||||||
|
root.present(hostingController, animated: true) {
|
||||||
|
DropManager.shared.showDrop(
|
||||||
|
title: "Module Library Added",
|
||||||
|
subtitle: "You can browse the community library in settings.",
|
||||||
|
duration: 2,
|
||||||
|
icon: UIImage(systemName: "books.vertical.circle.fill")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case "module":
|
||||||
|
guard url.scheme == "sora",
|
||||||
|
url.host == "module",
|
||||||
|
let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
|
||||||
|
let moduleURL = components.queryItems?.first(where: { $0.name == "url" })?.value
|
||||||
|
else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let addModuleView = ModuleAdditionSettingsView(moduleUrl: moduleURL)
|
||||||
|
.environmentObject(moduleManager)
|
||||||
|
let hostingController = UIHostingController(rootView: addModuleView)
|
||||||
|
|
||||||
|
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
|
||||||
|
let window = windowScene.windows.first {
|
||||||
|
window.rootViewController?.present(hostingController, animated: true)
|
||||||
|
} else {
|
||||||
|
Logger.shared.log(
|
||||||
|
"Failed to present module addition view: No window scene found",
|
||||||
|
type: "Error"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func handleRedirect(url: URL) {
|
static func handleRedirect(url: URL) {
|
||||||
guard let params = url.queryParameters,
|
guard let params = url.queryParameters,
|
||||||
let code = params["code"] else {
|
let code = params["code"] else {
|
||||||
Logger.shared.log("Failed to extract authorization code")
|
Logger.shared.log("Failed to extract authorization code")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch url.host {
|
switch url.host {
|
||||||
case "anilist":
|
case "anilist":
|
||||||
AniListToken.exchangeAuthorizationCodeForToken(code: code) { success in
|
AniListToken.exchangeAuthorizationCodeForToken(code: code) { success in
|
||||||
|
|
@ -83,6 +121,7 @@ struct SoraApp: App {
|
||||||
Logger.shared.log("AniList token exchange failed", type: "Error")
|
Logger.shared.log("AniList token exchange failed", type: "Error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case "trakt":
|
case "trakt":
|
||||||
TraktToken.exchangeAuthorizationCodeForToken(code: code) { success in
|
TraktToken.exchangeAuthorizationCodeForToken(code: code) { success in
|
||||||
if success {
|
if success {
|
||||||
|
|
@ -91,6 +130,7 @@ struct SoraApp: App {
|
||||||
Logger.shared.log("Trakt token exchange failed", type: "Error")
|
Logger.shared.log("Trakt token exchange failed", type: "Error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Logger.shared.log("Unknown authentication service", type: "Error")
|
Logger.shared.log("Unknown authentication service", type: "Error")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
104
Sora/Utils/Modules/CommunityLib.swift
Normal file
104
Sora/Utils/Modules/CommunityLib.swift
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
//
|
||||||
|
// CommunityLib.swift
|
||||||
|
// Sulfur
|
||||||
|
//
|
||||||
|
// Created by seiike on 23/04/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
@preconcurrency import WebKit
|
||||||
|
|
||||||
|
private struct ModuleLink: Identifiable {
|
||||||
|
let id = UUID()
|
||||||
|
let url: String
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CommunityLibraryView: View {
|
||||||
|
@EnvironmentObject var moduleManager: ModuleManager
|
||||||
|
|
||||||
|
@AppStorage("lastCommunityURL") private var inputURL: String = ""
|
||||||
|
@State private var webURL: URL?
|
||||||
|
@State private var errorMessage: String?
|
||||||
|
@State private var moduleLinkToAdd: ModuleLink?
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
if let err = errorMessage {
|
||||||
|
Text(err)
|
||||||
|
.foregroundColor(.red)
|
||||||
|
.padding(.horizontal)
|
||||||
|
}
|
||||||
|
|
||||||
|
WebView(url: webURL) { linkURL in
|
||||||
|
|
||||||
|
if let comps = URLComponents(url: linkURL, resolvingAgainstBaseURL: false),
|
||||||
|
let m = comps.queryItems?.first(where: { $0.name == "url" })?.value {
|
||||||
|
moduleLinkToAdd = ModuleLink(url: m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ignoresSafeArea(edges: .top)
|
||||||
|
}
|
||||||
|
.onAppear(perform: loadURL)
|
||||||
|
.sheet(item: $moduleLinkToAdd) { link in
|
||||||
|
ModuleAdditionSettingsView(moduleUrl: link.url)
|
||||||
|
.environmentObject(moduleManager)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func loadURL() {
|
||||||
|
var s = inputURL.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
if !s.hasPrefix("http://") && !s.hasPrefix("https://") {
|
||||||
|
s = "https://" + s
|
||||||
|
}
|
||||||
|
inputURL = s
|
||||||
|
if let u = URL(string: s) {
|
||||||
|
webURL = u
|
||||||
|
errorMessage = nil
|
||||||
|
} else {
|
||||||
|
webURL = nil
|
||||||
|
errorMessage = "Invalid URL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WebView: UIViewRepresentable {
|
||||||
|
let url: URL?
|
||||||
|
let onCustomScheme: (URL) -> Void
|
||||||
|
|
||||||
|
func makeCoordinator() -> Coordinator {
|
||||||
|
Coordinator(onCustom: onCustomScheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeUIView(context: Context) -> WKWebView {
|
||||||
|
let cfg = WKWebViewConfiguration()
|
||||||
|
cfg.preferences.javaScriptEnabled = true
|
||||||
|
let wv = WKWebView(frame: .zero, configuration: cfg)
|
||||||
|
wv.navigationDelegate = context.coordinator
|
||||||
|
return wv
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIView(_ uiView: WKWebView, context: Context) {
|
||||||
|
if let u = url {
|
||||||
|
uiView.load(URLRequest(url: u))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Coordinator: NSObject, WKNavigationDelegate {
|
||||||
|
let onCustom: (URL) -> Void
|
||||||
|
init(onCustom: @escaping (URL) -> Void) { self.onCustom = onCustom }
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView,
|
||||||
|
decidePolicyFor action: WKNavigationAction,
|
||||||
|
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
|
||||||
|
{
|
||||||
|
if let url = action.request.url,
|
||||||
|
url.scheme == "sora", url.host == "module"
|
||||||
|
{
|
||||||
|
onCustom(url)
|
||||||
|
decisionHandler(.cancel)
|
||||||
|
} else {
|
||||||
|
decisionHandler(.allow)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -150,6 +150,7 @@ struct ModuleAdditionSettingsView: View {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
self.errorMessage = "Invalid URL"
|
self.errorMessage = "Invalid URL"
|
||||||
self.isLoading = false
|
self.isLoading = false
|
||||||
|
Logger.shared.log("Failed to open add module ui with url: \(moduleUrl)", type: "Error")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,8 @@ struct MediaInfoView: View {
|
||||||
@State private var activeFetchID: UUID? = nil
|
@State private var activeFetchID: UUID? = nil
|
||||||
@Environment(\.dismiss) private var dismiss
|
@Environment(\.dismiss) private var dismiss
|
||||||
|
|
||||||
|
@State private var orientationChanged: Bool = false
|
||||||
|
|
||||||
private var isGroupedBySeasons: Bool {
|
private var isGroupedBySeasons: Bool {
|
||||||
return groupedEpisodes().count > 1
|
return groupedEpisodes().count > 1
|
||||||
}
|
}
|
||||||
|
|
@ -451,6 +453,9 @@ struct MediaInfoView: View {
|
||||||
}
|
}
|
||||||
selectedRange = 0..<episodeChunkSize
|
selectedRange = 0..<episodeChunkSize
|
||||||
}
|
}
|
||||||
|
.onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
|
||||||
|
orientationChanged.toggle()
|
||||||
|
}
|
||||||
|
|
||||||
if showStreamLoadingView {
|
if showStreamLoadingView {
|
||||||
VStack(spacing: 16) {
|
VStack(spacing: 16) {
|
||||||
|
|
@ -469,7 +474,6 @@ struct MediaInfoView: View {
|
||||||
.padding(.vertical, 8)
|
.padding(.vertical, 8)
|
||||||
.padding(.horizontal, 24)
|
.padding(.horizontal, 24)
|
||||||
.background(
|
.background(
|
||||||
// Hex #FF705E
|
|
||||||
Color(red: 1.0, green: 112/255.0, blue: 94/255.0)
|
Color(red: 1.0, green: 112/255.0, blue: 94/255.0)
|
||||||
)
|
)
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,14 @@ import Kingfisher
|
||||||
struct SettingsViewModule: View {
|
struct SettingsViewModule: View {
|
||||||
@AppStorage("selectedModuleId") private var selectedModuleId: String?
|
@AppStorage("selectedModuleId") private var selectedModuleId: String?
|
||||||
@EnvironmentObject var moduleManager: ModuleManager
|
@EnvironmentObject var moduleManager: ModuleManager
|
||||||
|
@AppStorage("didReceiveDefaultPageLink") private var didReceiveDefaultPageLink: Bool = false
|
||||||
|
|
||||||
@State private var errorMessage: String?
|
@State private var errorMessage: String?
|
||||||
@State private var isLoading = false
|
@State private var isLoading = false
|
||||||
@State private var isRefreshing = false
|
@State private var isRefreshing = false
|
||||||
@State private var moduleUrl: String = ""
|
@State private var moduleUrl: String = ""
|
||||||
@State private var refreshTask: Task<Void, Never>?
|
@State private var refreshTask: Task<Void, Never>?
|
||||||
|
@State private var showLibrary = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
|
|
@ -28,15 +30,26 @@ struct SettingsViewModule: View {
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
Text("No Modules")
|
Text("No Modules")
|
||||||
.font(.headline)
|
.font(.headline)
|
||||||
Text("Click the plus button to add a module!")
|
|
||||||
.font(.caption)
|
if didReceiveDefaultPageLink {
|
||||||
.foregroundColor(.secondary)
|
NavigationLink(destination: CommunityLibraryView()
|
||||||
.frame(maxWidth: .infinity)
|
.environmentObject(moduleManager)) {
|
||||||
|
Text("Check out some community modules here!")
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(.accentColor)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
}
|
||||||
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
} else {
|
||||||
|
Text("Click the plus button to add a module!")
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ForEach(moduleManager.modules) { module in
|
ForEach(moduleManager.modules) { module in
|
||||||
HStack {
|
HStack {
|
||||||
KFImage(URL(string: module.metadata.iconUrl))
|
KFImage(URL(string: module.metadata.iconUrl))
|
||||||
|
|
@ -105,13 +118,38 @@ struct SettingsViewModule: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navigationTitle("Modules")
|
.navigationTitle("Modules")
|
||||||
.navigationBarItems(trailing: Button(action: {
|
.navigationBarItems(trailing:
|
||||||
showAddModuleAlert()
|
HStack(spacing: 16) {
|
||||||
}) {
|
if didReceiveDefaultPageLink && !moduleManager.modules.isEmpty {
|
||||||
Image(systemName: "plus")
|
Button(action: {
|
||||||
.resizable()
|
showLibrary = true
|
||||||
.padding(5)
|
}) {
|
||||||
})
|
Image(systemName: "books.vertical.fill")
|
||||||
|
.resizable()
|
||||||
|
.frame(width: 20, height: 20)
|
||||||
|
.padding(5)
|
||||||
|
}
|
||||||
|
.accessibilityLabel("Open Community Library")
|
||||||
|
}
|
||||||
|
|
||||||
|
Button(action: {
|
||||||
|
showAddModuleAlert()
|
||||||
|
}) {
|
||||||
|
Image(systemName: "plus")
|
||||||
|
.resizable()
|
||||||
|
.frame(width: 20, height: 20)
|
||||||
|
.padding(5)
|
||||||
|
}
|
||||||
|
.accessibilityLabel("Add Module")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.background(
|
||||||
|
NavigationLink(
|
||||||
|
destination: CommunityLibraryView()
|
||||||
|
.environmentObject(moduleManager),
|
||||||
|
isActive: $showLibrary
|
||||||
|
) { EmptyView() }
|
||||||
|
)
|
||||||
.refreshable {
|
.refreshable {
|
||||||
isRefreshing = true
|
isRefreshing = true
|
||||||
refreshTask?.cancel()
|
refreshTask?.cancel()
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@
|
||||||
1E26E9E72DA9577900B9DC02 /* VolumeSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E26E9E62DA9577900B9DC02 /* VolumeSlider.swift */; };
|
1E26E9E72DA9577900B9DC02 /* VolumeSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E26E9E62DA9577900B9DC02 /* VolumeSlider.swift */; };
|
||||||
1E9FF1D32D403E49008AC100 /* SettingsViewLoggerFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9FF1D22D403E42008AC100 /* SettingsViewLoggerFilter.swift */; };
|
1E9FF1D32D403E49008AC100 /* SettingsViewLoggerFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9FF1D22D403E42008AC100 /* SettingsViewLoggerFilter.swift */; };
|
||||||
1EAC7A322D888BC50083984D /* MusicProgressSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EAC7A312D888BC50083984D /* MusicProgressSlider.swift */; };
|
1EAC7A322D888BC50083984D /* MusicProgressSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EAC7A312D888BC50083984D /* MusicProgressSlider.swift */; };
|
||||||
|
1EF5C3A92DB988E40032BF07 /* CommunityLib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EF5C3A82DB988D70032BF07 /* CommunityLib.swift */; };
|
||||||
73D164D52D8B5B470011A360 /* JavaScriptCore+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D164D42D8B5B340011A360 /* JavaScriptCore+Extensions.swift */; };
|
73D164D52D8B5B470011A360 /* JavaScriptCore+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D164D42D8B5B340011A360 /* JavaScriptCore+Extensions.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
|
@ -125,6 +126,7 @@
|
||||||
1E26E9E62DA9577900B9DC02 /* VolumeSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VolumeSlider.swift; sourceTree = "<group>"; };
|
1E26E9E62DA9577900B9DC02 /* VolumeSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VolumeSlider.swift; sourceTree = "<group>"; };
|
||||||
1E9FF1D22D403E42008AC100 /* SettingsViewLoggerFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewLoggerFilter.swift; sourceTree = "<group>"; };
|
1E9FF1D22D403E42008AC100 /* SettingsViewLoggerFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewLoggerFilter.swift; sourceTree = "<group>"; };
|
||||||
1EAC7A312D888BC50083984D /* MusicProgressSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicProgressSlider.swift; sourceTree = "<group>"; };
|
1EAC7A312D888BC50083984D /* MusicProgressSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicProgressSlider.swift; sourceTree = "<group>"; };
|
||||||
|
1EF5C3A82DB988D70032BF07 /* CommunityLib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityLib.swift; sourceTree = "<group>"; };
|
||||||
73D164D42D8B5B340011A360 /* JavaScriptCore+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JavaScriptCore+Extensions.swift"; sourceTree = "<group>"; };
|
73D164D42D8B5B340011A360 /* JavaScriptCore+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JavaScriptCore+Extensions.swift"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
|
@ -286,6 +288,7 @@
|
||||||
133D7C882D2BE2640075467E /* Modules */ = {
|
133D7C882D2BE2640075467E /* Modules */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
1EF5C3A82DB988D70032BF07 /* CommunityLib.swift */,
|
||||||
13D99CF62D4E73C300250A86 /* ModuleAdditionSettingsView.swift */,
|
13D99CF62D4E73C300250A86 /* ModuleAdditionSettingsView.swift */,
|
||||||
139935652D468C450065CEFF /* ModuleManager.swift */,
|
139935652D468C450065CEFF /* ModuleManager.swift */,
|
||||||
133D7C892D2BE2640075467E /* Modules.swift */,
|
133D7C892D2BE2640075467E /* Modules.swift */,
|
||||||
|
|
@ -526,6 +529,7 @@
|
||||||
139935662D468C450065CEFF /* ModuleManager.swift in Sources */,
|
139935662D468C450065CEFF /* ModuleManager.swift in Sources */,
|
||||||
133D7C902D2BE2640075467E /* SettingsView.swift in Sources */,
|
133D7C902D2BE2640075467E /* SettingsView.swift in Sources */,
|
||||||
132AF1252D9995F900A0140B /* JSController-Search.swift in Sources */,
|
132AF1252D9995F900A0140B /* JSController-Search.swift in Sources */,
|
||||||
|
1EF5C3A92DB988E40032BF07 /* CommunityLib.swift in Sources */,
|
||||||
13CBEFDA2D5F7D1200D011EE /* String.swift in Sources */,
|
13CBEFDA2D5F7D1200D011EE /* String.swift in Sources */,
|
||||||
1E26E9E72DA9577900B9DC02 /* VolumeSlider.swift in Sources */,
|
1E26E9E72DA9577900B9DC02 /* VolumeSlider.swift in Sources */,
|
||||||
136BBE802DB1038000906B5E /* Notification+Name.swift in Sources */,
|
136BBE802DB1038000906B5E /* Notification+Name.swift in Sources */,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue