Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MuffinStoreJailed/App/LogView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ struct LogView: View {
Button {
UIPasteboard.general.string = log
} label: {
Label("Copy Output", systemImage: "doc.on.doc")
Label(Localization.string("action.copyOutput"), systemImage: "doc.on.doc")
}
}
}
Expand Down
19 changes: 11 additions & 8 deletions MuffinStoreJailed/App/NavigationButtons.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ struct NavigationButtons: View {
Haptic.shared.play(.soft)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
if appData.appleId.isEmpty || appData.password.isEmpty {
Alertinator.shared.alert(title: "No Apple ID details were input!", body: "Please type both your Apple ID email address & password, then try again.")
Alertinator.shared.alert(
title: Localization.string("alert.login.missingCredentials.title"),
body: Localization.string("alert.login.missingCredentials.message")
)
} else {
if appData.code.isEmpty {
appData.ipaTool = IPATool(appleId: appData.appleId, password: appData.password)
Expand All @@ -33,17 +36,17 @@ struct NavigationButtons: View {
appData.isAuthenticated = ret ?? false

if appData.isAuthenticated {
appData.applicationStatus = "Ready to Downgrade!"
appData.setStatus(.readyToDowngrade)
appData.applicationIcon = "checkmark.circle.fill"
appData.applicationIconColor = .secondary
}
}
}
}) {
if appData.hasSent2FACode {
ButtonLabel(text: "Log In", icon: "arrow.right")
ButtonLabel(text: Localization.string("action.logIn"), icon: "arrow.right")
} else {
ButtonLabel(text: "Send 2FA Code", icon: "key")
ButtonLabel(text: Localization.string("action.sendTwoFactor"), icon: "key")
}
}
.buttonStyle(FancyButtonStyle())
Expand All @@ -57,7 +60,7 @@ struct NavigationButtons: View {
LSApplicationWorkspace.default().openApplication(withBundleID: "com.jbdotparty.PancakeStore2")
}
}) {
ButtonLabel(text: "Open App", icon: "arrow.up.forward.app")
ButtonLabel(text: Localization.string("action.openApp"), icon: "arrow.up.forward.app")
}
.buttonStyle(FancyButtonStyle(color: .blue))
.disabled(!appData.hasAppBeenServed)
Expand All @@ -68,7 +71,7 @@ struct NavigationButtons: View {
exitinator()
}
}) {
ButtonLabel(text: "Go to Home Screen", icon: "house")
ButtonLabel(text: Localization.string("action.goHome"), icon: "house")
}
.buttonStyle(FancyButtonStyle())
.disabled(!appData.hasAppBeenServed)
Expand All @@ -90,11 +93,11 @@ struct NavigationButtons: View {
print("App ID: \(appLinkParsed)")
appData.isDowngrading = true
downgradeApp(appId: appLinkParsed, ipaTool: appData.ipaTool!)
appData.applicationStatus = "Downgrading Application..."
appData.setStatus(.downgrading)
appData.applicationIcon = "showMeProgressPlease"
}
}) {
ButtonLabel(text: "Downgrade App", icon: "arrow.down")
ButtonLabel(text: Localization.string("action.downgradeApp"), icon: "arrow.down")
}
.buttonStyle(FancyButtonStyle())
.disabled(appData.appLink.isEmpty)
Expand Down
60 changes: 45 additions & 15 deletions MuffinStoreJailed/App/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,69 +14,90 @@ struct SettingsView: View {
@Environment(\.openURL) private var openURL

@AppStorage("autoCleanApp") var autoCleanApp: Bool = true
@AppStorage(AppLanguage.storageKey) private var languageCode: String = AppLanguage.english.rawValue

var body: some View {
NavigationStack {
List {
Section(header: HeaderLabel(text: "About", icon: "info.circle")) {
Section(header: HeaderLabel(text: Localization.string("section.about.title"), icon: "info.circle")) {
VStack(alignment: .leading, spacing: 10) {
AppInfoCell()
HStack {
Button(action: {
openURL(URL(string: "https://jailbreak.party/discord")!)
}) {
ButtonLabel(text: "Discord", icon: "discord", useImage: true)
ButtonLabel(text: Localization.string("action.discord"), icon: "discord", useImage: true)
}
.buttonStyle(TranslucentButtonStyle(color: .discord))
Button(action: {
openURL(URL(string: "https://jailbreak.party/discord")!)
}) {
ButtonLabel(text: "GitHub", icon: "github", useImage: true)
ButtonLabel(text: Localization.string("action.github"), icon: "github", useImage: true)
}
.buttonStyle(TranslucentButtonStyle(color: .github))
}
Button(action: {
openURL(URL(string: "https://jailbreak.party/discord")!)
}) {
ButtonLabel(text: "Website", icon: "globe")
ButtonLabel(text: Localization.string("action.website"), icon: "globe")
}
.buttonStyle(TranslucentButtonStyle())
}
}

Section(header: HeaderLabel(text: "Settings", icon: "gearshape")) {
Section(header: HeaderLabel(text: Localization.string("section.settings.title"), icon: "gearshape")) {
Toggle(isOn: $autoCleanApp) {
Text("Auto-Clean App")
Text("This is toggled on by default to make sure that PancakeStore doesn't keep any saved data from the app you had downgraded.")
Text("settings.autoClean.title")
Text("settings.autoClean.subtitle")
}
}

Section(header: HeaderLabel(text: Localization.string("section.language.title"), icon: "globe")) {
VStack(spacing: 12) {
ForEach(AppLanguage.allCases) { (language: AppLanguage) in
Button(action: {
select(language)
}) {
HStack {
Text(language.displayNameKey)
Spacer()
if language.rawValue == languageCode {
Image(systemName: "checkmark.circle.fill")
.foregroundStyle(.tint)
}
}
}
.buttonStyle(TranslucentButtonStyle())
}
}
}

Section(header: HeaderLabel(text: "Data", icon: "loupe"), footer: Text("If PancakeStore is taking up a lot of storage, click this button.")) {
Section(header: HeaderLabel(text: Localization.string("section.data.title"), icon: "loupe"), footer: Text("section.data.footer")) {
VStack {
Button(action: {
let tempDir = FileManager.default.temporaryDirectory
let tempIPAURL = tempDir.appendingPathComponent("app.ipa")
presentShareSheet(with: tempIPAURL)
}) {
ButtonLabel(text: "Export IPA", icon: "arrow.up.doc")
ButtonLabel(text: Localization.string("action.exportIpa"), icon: "arrow.up.doc")
}
.buttonStyle(TranslucentButtonStyle())
.disabled(!appData.hasAppBeenServed)
Button(action: {
cleanUp()
}) {
ButtonLabel(text: "Clean Documents", icon: "trash")
ButtonLabel(text: Localization.string("action.cleanDocuments"), icon: "trash")
}
.buttonStyle(TranslucentButtonStyle())
}
}
Section(header: HeaderLabel(text: "Credits", icon: "star")) {
LinkCreditCell(image: Image("mineek"), name: "mineek", description: "Original Project, MuffinStore Jailed.", url: "https://github.com/mineek")
LinkCreditCell(image: Image("lunginspector"), name: "lunginspector", description: "UI changes and QoL improvements.", url: "https://github.com/lunginspector")
LinkCreditCell(image: Image("skadz"), name: "Skadz", description: "Backend fixes.", url: "https://github.com/skadz108")
Section(header: HeaderLabel(text: Localization.string("section.credits.title"), icon: "star")) {
LinkCreditCell(image: Image("mineek"), name: "mineek", description: Localization.string("credits.mineek"), url: "https://github.com/mineek")
LinkCreditCell(image: Image("lunginspector"), name: "lunginspector", description: Localization.string("credits.lunginspector"), url: "https://github.com/lunginspector")
LinkCreditCell(image: Image("skadz"), name: "Skadz", description: Localization.string("credits.skadz"), url: "https://github.com/skadz108")
}
}
.navigationTitle("Settings")
.navigationTitle("settings.title")
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Button(action: {
Expand All @@ -89,6 +110,15 @@ struct SettingsView: View {
}
}
}

private extension SettingsView {
func select(_ language: AppLanguage) {
Haptic.shared.play(.soft)
languageCode = language.rawValue
Localization.setLanguage(language)
appData.refreshLocalization()
}
}
/*
struct SettingsView: View {
@Environment(\.dismiss) private var dismiss
Expand Down
21 changes: 20 additions & 1 deletion MuffinStoreJailed/AppData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,22 @@

import SwiftUI

enum ApplicationStatusKey: String {
case notLoggedIn = "status.notLoggedIn"
case readyToDowngrade = "status.readyToDowngrade"
case downgrading = "status.downgrading"
case downgradeSuccessful = "status.downgradeSuccessful"

var localizationKey: String { rawValue }
}

final class AppData: ObservableObject {
static let shared = AppData()

@Published var applicationIcon: String = "xmark.circle.fill"
@Published var applicationIconColor: Color = .secondary
@Published var applicationStatus: String = "Not logged in!"
@Published private(set) var applicationStatus: String = Localization.string(ApplicationStatusKey.notLoggedIn.localizationKey)
private var applicationStatusKey: ApplicationStatusKey = .notLoggedIn

@Published var appBundleID: String = ""
@Published var appVersion: String = ""
Expand All @@ -33,5 +43,14 @@ final class AppData: ObservableObject {
@Published var hasSent2FACode: Bool = false

@Published var showPassword: Bool = false

func setStatus(_ status: ApplicationStatusKey) {
applicationStatusKey = status
applicationStatus = Localization.string(status.localizationKey)
}

func refreshLocalization() {
applicationStatus = Localization.string(applicationStatusKey.localizationKey)
}
}

Loading