From 7dfe8f593efa90dc357a7697a6ef165d5885495c Mon Sep 17 00:00:00 2001 From: John Pinkyfloyd Date: Wed, 4 Feb 2026 22:07:03 -0800 Subject: [PATCH] Add IS_DEV flag, dev ribbon, new app icon, and UI improvements - Add global IS_DEV flag controlling API endpoint (dev vs biz.payfrit.com), dev ribbon banner, and magic OTP hints - Add diagonal orange DEV ribbon overlay (Widgets/DevRibbon.swift) - Replace app icon with properly centered dark-outline SVG on white background - Fix display name with InfoPlist.strings localization - Redesign business selection cards with initial letter, status pill, task count - Make businesses only tappable when pending tasks > 0 (dimmed otherwise) - Simplify LoginScreen and RootView to use IS_DEV directly - Fix hardcoded dev URLs to respect IS_DEV flag Co-Authored-By: Claude Opus 4.5 --- PayfritWorks.xcodeproj/project.pbxproj | 39 +++++- .../AppIcon.appiconset/appicon.png | Bin 51726 -> 41543 bytes PayfritWorks/Info.plist | 7 +- PayfritWorks/PayfritWorksApp.swift | 1 + PayfritWorks/Services/APIService.swift | 29 ++-- .../Views/BusinessSelectionScreen.swift | 125 ++++++++++-------- PayfritWorks/Views/LoginScreen.swift | 4 +- PayfritWorks/Views/RootView.swift | 14 -- PayfritWorks/Widgets/DevRibbon.swift | 36 +++++ PayfritWorks/en.lproj/InfoPlist.strings | 2 + 10 files changed, 162 insertions(+), 95 deletions(-) create mode 100644 PayfritWorks/Widgets/DevRibbon.swift create mode 100644 PayfritWorks/en.lproj/InfoPlist.strings diff --git a/PayfritWorks.xcodeproj/project.pbxproj b/PayfritWorks.xcodeproj/project.pbxproj index 8d72368..4424436 100644 --- a/PayfritWorks.xcodeproj/project.pbxproj +++ b/PayfritWorks.xcodeproj/project.pbxproj @@ -28,6 +28,9 @@ B01000000032 /* BeaconScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02000000032; }; B01000000033 /* ChatService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02000000033; }; + /* Widgets */ + B01000000050 /* DevRibbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02000000050; }; + /* Views */ B01000000040 /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02000000040; }; B01000000041 /* LoginScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02000000041; }; @@ -40,6 +43,7 @@ /* Resources */ B01000000060 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B02000000060; }; + B01000000070 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B05000000008; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -68,6 +72,9 @@ B02000000032 /* BeaconScanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeaconScanner.swift; sourceTree = ""; }; B02000000033 /* ChatService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatService.swift; sourceTree = ""; }; + /* Widgets */ + B02000000050 /* DevRibbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DevRibbon.swift; sourceTree = ""; }; + /* Views */ B02000000040 /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = ""; }; B02000000041 /* LoginScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScreen.swift; sourceTree = ""; }; @@ -80,6 +87,7 @@ /* Resources */ B02000000060 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B02000000070 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,9 +114,11 @@ children = ( B02000000001 /* PayfritWorksApp.swift */, B02000000002 /* Info.plist */, + B05000000008 /* InfoPlist.strings */, B05000000003 /* Models */, B05000000004 /* ViewModels */, B05000000005 /* Services */, + B05000000011 /* Widgets */, B05000000006 /* Views */, B05000000007 /* Resources */, ); @@ -148,6 +158,14 @@ path = Services; sourceTree = ""; }; + B05000000011 /* Widgets */ = { + isa = PBXGroup; + children = ( + B02000000050 /* DevRibbon.swift */, + ); + path = Widgets; + sourceTree = ""; + }; B05000000006 /* Views */ = { isa = PBXGroup; children = ( @@ -181,6 +199,17 @@ }; /* End PBXGroup section */ +/* Begin PBXVariantGroup section */ + B05000000008 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + B02000000070 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin PBXNativeTarget section */ B06000000001 /* PayfritWorks */ = { isa = PBXNativeTarget; @@ -238,6 +267,7 @@ buildActionMask = 2147483647; files = ( B01000000060 /* Assets.xcassets in Resources */, + B01000000070 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -261,6 +291,7 @@ B01000000031 /* AuthStorage.swift in Sources */, B01000000032 /* BeaconScanner.swift in Sources */, B01000000033 /* ChatService.swift in Sources */, + B01000000050 /* DevRibbon.swift in Sources */, B01000000040 /* RootView.swift in Sources */, B01000000041 /* LoginScreen.swift in Sources */, B01000000042 /* BusinessSelectionScreen.swift in Sources */, @@ -398,7 +429,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = U83YL8VRF3; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = PayfritWorks/Info.plist; @@ -415,7 +446,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.payfrit.works; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "Payfrit Works"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; @@ -430,7 +461,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = U83YL8VRF3; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = PayfritWorks/Info.plist; @@ -447,7 +478,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.payfrit.works; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "Payfrit Works"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/PayfritWorks/Assets.xcassets/AppIcon.appiconset/appicon.png b/PayfritWorks/Assets.xcassets/AppIcon.appiconset/appicon.png index e1aa3816861ce239fa2fff9b2b164bebd7123e00..603b0245e4db04b9542488517a05d447d20daa90 100644 GIT binary patch literal 41543 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 Payfrit Works CFBundleName - $(PRODUCT_NAME) + Payfrit Works CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString @@ -28,6 +28,11 @@ Payfrit Works uses Bluetooth to scan for nearby beacons. NSFaceIDUsageDescription Payfrit Works uses Face ID for quick sign-in. + UILaunchScreen + + UIColorName + + UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/PayfritWorks/PayfritWorksApp.swift b/PayfritWorks/PayfritWorksApp.swift index 98c3e87..28da002 100644 --- a/PayfritWorks/PayfritWorksApp.swift +++ b/PayfritWorks/PayfritWorksApp.swift @@ -8,6 +8,7 @@ struct PayfritWorksApp: App { WindowGroup { RootView() .environmentObject(appState) + .devRibbon() } } } diff --git a/PayfritWorks/Services/APIService.swift b/PayfritWorks/Services/APIService.swift index 36ae6af..57be562 100644 --- a/PayfritWorks/Services/APIService.swift +++ b/PayfritWorks/Services/APIService.swift @@ -1,5 +1,11 @@ import Foundation +// MARK: - Dev Flag + +/// Master flag: flip to `false` for production builds. +/// Controls API endpoint, dev banner, and magic OTPs. +let IS_DEV = true + // MARK: - API Errors enum APIError: LocalizedError { @@ -43,24 +49,14 @@ struct ChatMessagesResult { actor APIService { static let shared = APIService() - private enum Environment { - case development, production + private static let devBaseURL = "https://dev.payfrit.com/api" + private static let prodBaseURL = "https://biz.payfrit.com/api" - var baseURL: String { - switch self { - case .development: return "https://dev.payfrit.com/api" - case .production: return "https://biz.payfrit.com/api" - } - } - } - - private let environment: Environment = .development - var isDev: Bool { environment == .development } private var userToken: String? private var userId: Int? private var businessId: Int = 0 - var baseURL: String { environment.baseURL } + var baseURL: String { IS_DEV ? Self.devBaseURL : Self.prodBaseURL } // MARK: - Configuration @@ -80,7 +76,7 @@ actor APIService { // MARK: - Core Request private func postJSON(_ path: String, payload: [String: Any]) async throws -> [String: Any] { - let urlString = environment.baseURL + (path.hasPrefix("/") ? path : "/\(path)") + let urlString = baseURL + (path.hasPrefix("/") ? path : "/\(path)") guard let url = URL(string: urlString) else { throw APIError.invalidURL } var request = URLRequest(url: url) @@ -482,7 +478,7 @@ actor APIService { /// Returns raw JSON string for a given endpoint (for debugging key issues) func debugRawJSON(_ path: String, payload: [String: Any]) async -> String { - let urlString = environment.baseURL + (path.hasPrefix("/") ? path : "/\(path)") + let urlString = baseURL + (path.hasPrefix("/") ? path : "/\(path)") guard let url = URL(string: urlString) else { return "Invalid URL" } var request = URLRequest(url: url) request.httpMethod = "POST" @@ -509,8 +505,7 @@ actor APIService { let trimmed = rawUrl.trimmingCharacters(in: .whitespacesAndNewlines) if trimmed.isEmpty { return "" } if trimmed.hasPrefix("http://") || trimmed.hasPrefix("https://") { return trimmed } - // Relative URL — prepend base domain - let baseDomain = "https://dev.payfrit.com" + let baseDomain = IS_DEV ? "https://dev.payfrit.com" : "https://biz.payfrit.com" if trimmed.hasPrefix("/") { return baseDomain + trimmed } return baseDomain + "/" + trimmed } diff --git a/PayfritWorks/Views/BusinessSelectionScreen.swift b/PayfritWorks/Views/BusinessSelectionScreen.swift index 8307b7c..f9737bf 100644 --- a/PayfritWorks/Views/BusinessSelectionScreen.swift +++ b/PayfritWorks/Views/BusinessSelectionScreen.swift @@ -108,8 +108,15 @@ struct BusinessSelectionScreen: View { ScrollView { LazyVStack(spacing: 12) { ForEach(businesses) { emp in - businessCard(emp) - .onTapGesture { selectBusiness(emp) } + if emp.pendingTaskCount > 0 { + Button { selectBusiness(emp) } label: { + businessCard(emp) + } + .buttonStyle(.plain) + } else { + businessCard(emp) + .opacity(0.5) + } } } .padding(.horizontal, 16) @@ -120,67 +127,72 @@ struct BusinessSelectionScreen: View { } private func businessCard(_ emp: Employment) -> some View { - VStack(spacing: 0) { - // Header image with brand color background - BusinessHeaderImage(businessId: emp.businessId) + HStack(spacing: 14) { + // Initial letter + Text(String(emp.businessName.prefix(1)).uppercased()) + .font(.system(size: 32, weight: .bold)) + .foregroundColor(.primary.opacity(0.7)) + .frame(width: 50) - // Info bar - HStack(spacing: 12) { - VStack(alignment: .leading, spacing: 2) { - Text(emp.businessName) - .font(.subheadline.weight(.semibold)) - .foregroundColor(.primary) - .lineLimit(1) + // Name + status + VStack(alignment: .leading, spacing: 4) { + Text(emp.businessName) + .font(.body.weight(.semibold)) + .foregroundColor(.primary) + .lineLimit(1) - Text(emp.statusName) - .font(.caption2) - .fontWeight(.medium) - .foregroundColor(statusColor(emp.employeeStatusId)) - } - - Spacer() - - // Task count badge - if emp.pendingTaskCount > 0 { - Text("\(emp.pendingTaskCount)") - .font(.caption.bold()) - .foregroundColor(.white) - .padding(.horizontal, 8) - .padding(.vertical, 3) - .background(Color.payfritGreen) - .clipShape(Capsule()) - } else { - Image(systemName: "checkmark.circle.fill") - .foregroundColor(.green) - .font(.body) - } - - Image(systemName: "chevron.right") - .font(.caption) - .foregroundColor(.secondary) + Text(emp.statusName) + .font(.caption.weight(.medium)) + .foregroundColor(.white) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(statusColor(emp.employeeStatusId)) + .clipShape(Capsule()) } - .padding(.horizontal, 12) - .padding(.vertical, 8) + + Spacer() + + // Task count or clear checkmark + if emp.pendingTaskCount > 0 { + Text("\(emp.pendingTaskCount)") + .font(.title3.bold()) + .foregroundColor(.payfritGreen) + } else { + VStack(spacing: 2) { + Image(systemName: "checkmark.circle.fill") + .font(.title2) + .foregroundColor(.payfritGreen) + Text("clear") + .font(.caption2) + .foregroundColor(.secondary) + } + } + + Image(systemName: "chevron.right") + .font(.caption.weight(.semibold)) + .foregroundColor(.secondary) } - .background(Color(.systemBackground)) + .padding(.horizontal, 16) + .padding(.vertical, 14) + .background(Color.payfritGreen.opacity(0.08)) .clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 12, style: .continuous) - .stroke(Color(.systemGray4), lineWidth: 0.5) - ) - .shadow(color: .black.opacity(0.06), radius: 4, x: 0, y: 2) .contentShape(Rectangle()) } private var myTasksFAB: some View { Button { showingMyTasks = true } label: { - Image(systemName: "checkmark.circle.fill") - .font(.title3) - .padding(12) - .background(Color.payfritGreen) - .foregroundColor(.white) - .clipShape(Circle()) - .shadow(radius: 4) + HStack(spacing: 8) { + Image(systemName: "checkmark.square.fill") + .font(.title3) + Text("My Tasks") + .font(.body.weight(.semibold)) + } + .padding(.horizontal, 20) + .padding(.vertical, 14) + .background(Color.payfritGreen) + .foregroundColor(.white) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .shadow(color: .black.opacity(0.15), radius: 6, x: 0, y: 3) } .padding(.trailing, 16) .padding(.bottom, 16) @@ -294,9 +306,10 @@ struct BusinessHeaderImage: View { @State private var isLoading = true private var imageURLs: [URL] { - [ - "https://dev.payfrit.com/uploads/headers/\(businessId).png", - "https://dev.payfrit.com/uploads/headers/\(businessId).jpg", + let domain = IS_DEV ? "https://dev.payfrit.com" : "https://biz.payfrit.com" + return [ + "\(domain)/uploads/headers/\(businessId).png", + "\(domain)/uploads/headers/\(businessId).jpg", ].compactMap { URL(string: $0) } } diff --git a/PayfritWorks/Views/LoginScreen.swift b/PayfritWorks/Views/LoginScreen.swift index dfdb7c7..e069a9c 100644 --- a/PayfritWorks/Views/LoginScreen.swift +++ b/PayfritWorks/Views/LoginScreen.swift @@ -7,7 +7,6 @@ struct LoginScreen: View { @State private var showPassword = false @State private var isLoading = false @State private var error: String? - @State private var isDev = false var body: some View { GeometryReader { geo in @@ -25,7 +24,7 @@ struct LoginScreen: View { Text("Sign in to view and claim tasks") .foregroundColor(.secondary) - if isDev { + if IS_DEV { Text("DEV MODE — password: 123456") .font(.caption) .foregroundColor(.red) @@ -99,7 +98,6 @@ struct LoginScreen: View { } } .background(Color(.systemGroupedBackground)) - .task { isDev = await APIService.shared.isDev } } private func login() { diff --git a/PayfritWorks/Views/RootView.swift b/PayfritWorks/Views/RootView.swift index cfc7223..423234f 100644 --- a/PayfritWorks/Views/RootView.swift +++ b/PayfritWorks/Views/RootView.swift @@ -4,7 +4,6 @@ import LocalAuthentication struct RootView: View { @EnvironmentObject var appState: AppState @State private var isCheckingAuth = true - @State private var isDev = false var body: some View { Group { @@ -17,20 +16,7 @@ struct RootView: View { } } .animation(.easeInOut(duration: 0.3), value: appState.isAuthenticated) - .overlay(alignment: .bottomLeading) { - if isDev { - Text("DEV") - .font(.caption.bold()) - .foregroundColor(.white) - .frame(width: 80, height: 20) - .background(Color.orange) - .rotationEffect(.degrees(45)) - .offset(x: -20, y: -6) - .allowsHitTesting(false) - } - } .task { - isDev = await APIService.shared.isDev await checkAuthWithBiometrics() isCheckingAuth = false } diff --git a/PayfritWorks/Widgets/DevRibbon.swift b/PayfritWorks/Widgets/DevRibbon.swift new file mode 100644 index 0000000..da3f337 --- /dev/null +++ b/PayfritWorks/Widgets/DevRibbon.swift @@ -0,0 +1,36 @@ +import SwiftUI + +// MARK: - DEV Ribbon Overlay + +/// Diagonal orange "DEV" ribbon in the lower-left corner. +/// Only visible when IS_DEV is true. +/// Taps pass through to content below. +struct DevRibbonModifier: ViewModifier { + func body(content: Content) -> some View { + content + .overlay(alignment: .bottomLeading) { + if IS_DEV { + ribbon + .allowsHitTesting(false) + } + } + } + + private var ribbon: some View { + Text("DEV") + .font(.system(size: 11, weight: .bold)) + .tracking(2) + .foregroundColor(.white) + .frame(width: 130, height: 24) + .background(Color(red: 1.0, green: 0.596, blue: 0.0)) // #FF9800 + .rotationEffect(.degrees(45)) + .offset(x: -28, y: -28) + .shadow(color: .black.opacity(0.25), radius: 2, x: 0, y: 1) + } +} + +extension View { + func devRibbon() -> some View { + modifier(DevRibbonModifier()) + } +} diff --git a/PayfritWorks/en.lproj/InfoPlist.strings b/PayfritWorks/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..fc1d95f --- /dev/null +++ b/PayfritWorks/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +CFBundleDisplayName = "Payfrit Works"; +CFBundleName = "Payfrit Works";