From 4d8463cb96c78ad013497f7d265aeee78dde78dd Mon Sep 17 00:00:00 2001 From: Vishnu Ravi Date: Mon, 5 Aug 2024 20:04:04 -0400 Subject: [PATCH] Update account view (#36) --- LifeSpace.xcodeproj/project.pbxproj | 15 +- .../xcshareddata/swiftpm/Package.resolved | 348 ------------------ LifeSpace/Account/AccountSheet.swift | 101 ++--- LifeSpace/Account/WithdrawView.swift | 61 +++ LifeSpace/Resources/Localizable.xcstrings | 58 ++- 5 files changed, 187 insertions(+), 396 deletions(-) delete mode 100644 LifeSpace.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 LifeSpace/Account/WithdrawView.swift diff --git a/LifeSpace.xcodeproj/project.pbxproj b/LifeSpace.xcodeproj/project.pbxproj index 278c90c..367b914 100644 --- a/LifeSpace.xcodeproj/project.pbxproj +++ b/LifeSpace.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 2FE5DCB129EE6107004B9AB4 /* AccountOnboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE5DCAC29EE6107004B9AB4 /* AccountOnboarding.swift */; }; 2FF53D8B2A8725DE00042B76 /* SpeziMockWebService in Frameworks */ = {isa = PBXBuildFile; productRef = 2FF53D8A2A8725DE00042B76 /* SpeziMockWebService */; }; 2FF53D8D2A8729D600042B76 /* LifeSpaceStandard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF53D8C2A8729D600042B76 /* LifeSpaceStandard.swift */; }; + 630D3B572C616E9D006066E5 /* WithdrawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 630D3B562C616E9D006066E5 /* WithdrawView.swift */; }; 6326011A2C41EF6A0002CDF4 /* SurveyModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632601192C41EF6A0002CDF4 /* SurveyModule.swift */; }; 6347EB642BBBA895008E0C4A /* LifeSpaceMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6347EB632BBBA895008E0C4A /* LifeSpaceMapView.swift */; }; 6347EB6A2BBBF3AC008E0C4A /* MapboxMaps in Frameworks */ = {isa = PBXBuildFile; productRef = 6347EB692BBBF3AC008E0C4A /* MapboxMaps */; }; @@ -137,6 +138,7 @@ 2FE5DC5529EDD811004B9AB4 /* SocialSupportQuestionnaire.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = SocialSupportQuestionnaire.json; sourceTree = ""; }; 2FE5DCAC29EE6107004B9AB4 /* AccountOnboarding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountOnboarding.swift; sourceTree = ""; }; 2FF53D8C2A8729D600042B76 /* LifeSpaceStandard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LifeSpaceStandard.swift; sourceTree = ""; }; + 630D3B562C616E9D006066E5 /* WithdrawView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawView.swift; sourceTree = ""; }; 632601192C41EF6A0002CDF4 /* SurveyModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyModule.swift; sourceTree = ""; }; 6347EB632BBBA895008E0C4A /* LifeSpaceMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LifeSpaceMapView.swift; sourceTree = ""; }; 6347EB732BBBF442008E0C4A /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; @@ -416,6 +418,7 @@ A9DFE8A82ABE551400428242 /* AccountButton.swift */, 639B69DA2C2BCD6A00C0FF4A /* ConsentPDFVIewer.swift */, 63D86AD52C3B7F310096B9DB /* DocumentWebView.swift */, + 630D3B562C616E9D006066E5 /* WithdrawView.swift */, ); path = Account; sourceTree = ""; @@ -653,6 +656,7 @@ 634FFF672C169F40005E8217 /* LifeSpaceConsent.swift in Sources */, 2FE5DC3829EDD7CA004B9AB4 /* InterestingModules.swift in Sources */, 2FE5DC3529EDD7CA004B9AB4 /* Consent.swift in Sources */, + 630D3B572C616E9D006066E5 /* WithdrawView.swift in Sources */, 63EA5F8C2BC78F8400A48590 /* DailySurveyResponse.swift in Sources */, 639B69DB2C2BCD6A00C0FF4A /* ConsentPDFVIewer.swift in Sources */, 2FE5DC4529EDD7F2004B9AB4 /* Binding+Negate.swift in Sources */, @@ -830,7 +834,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 2.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.odden.lifespace-dev"; + PRODUCT_BUNDLE_IDENTIFIER = edu.stanford.lifespace; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1034,7 +1038,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 2.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.odden.lifespace-dev"; + PRODUCT_BUNDLE_IDENTIFIER = edu.stanford.lifespace; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1054,10 +1058,12 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "LifeSpace/Supporting Files/LifeSpace.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 12; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "LifeSpace/Supporting Files/Info.plist"; @@ -1081,9 +1087,10 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 2.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.odden.lifespace-dev"; + PRODUCT_BUNDLE_IDENTIFIER = edu.stanford.lifespace; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/LifeSpace.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LifeSpace.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 51e9a02..0000000 --- a/LifeSpace.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,348 +0,0 @@ -{ - "originHash" : "4a522dbc9df3d9839be48457662fbee3556ee51d9d3c6fc52f9079b0beec3ab4", - "pins" : [ - { - "identity" : "abseil-cpp-binary", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/abseil-cpp-binary.git", - "state" : { - "revision" : "748c7837511d0e6a507737353af268484e1745e2", - "version" : "1.2024011601.1" - } - }, - { - "identity" : "antlr4", - "kind" : "remoteSourceControl", - "location" : "https://github.com/antlr/antlr4", - "state" : { - "revision" : "7ed420ff2c78d62883875c442d75f32e73bc86c8", - "version" : "4.13.1" - } - }, - { - "identity" : "app-check", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/app-check.git", - "state" : { - "revision" : "3b62f154d00019ae29a71e9738800bb6f18b236d", - "version" : "10.19.2" - } - }, - { - "identity" : "fhirmodels", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/FHIRModels", - "state" : { - "revision" : "861afd5816a98d38f86220eab2f812d76cad84a0", - "version" : "0.5.0" - } - }, - { - "identity" : "firebase-ios-sdk", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/firebase-ios-sdk.git", - "state" : { - "revision" : "e57841b296d04370ea23580f908881b0ccab17b9", - "version" : "10.28.1" - } - }, - { - "identity" : "googleappmeasurement", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleAppMeasurement.git", - "state" : { - "revision" : "fe727587518729046fc1465625b9afd80b5ab361", - "version" : "10.28.0" - } - }, - { - "identity" : "googledatatransport", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleDataTransport.git", - "state" : { - "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565", - "version" : "9.4.0" - } - }, - { - "identity" : "googleutilities", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleUtilities.git", - "state" : { - "revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6", - "version" : "7.13.3" - } - }, - { - "identity" : "grpc-binary", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/grpc-binary.git", - "state" : { - "revision" : "e9fad491d0673bdda7063a0341fb6b47a30c5359", - "version" : "1.62.2" - } - }, - { - "identity" : "gtm-session-fetcher", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/gtm-session-fetcher.git", - "state" : { - "revision" : "0382ca27f22fb3494cf657d8dc356dc282cd1193", - "version" : "3.4.1" - } - }, - { - "identity" : "healthkitonfhir", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/HealthKitOnFHIR.git", - "state" : { - "revision" : "b0cfe35a2263a517b22196b559d2dd1d1e2afcd9", - "version" : "0.2.9" - } - }, - { - "identity" : "interop-ios-for-google-sdks", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/interop-ios-for-google-sdks.git", - "state" : { - "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", - "version" : "100.0.0" - } - }, - { - "identity" : "leveldb", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/leveldb.git", - "state" : { - "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", - "version" : "1.22.5" - } - }, - { - "identity" : "mapbox-common-ios", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/mapbox-common-ios.git", - "state" : { - "revision" : "8e3259433704add95894a3e7823f5658a17bd43b", - "version" : "24.5.0-rc.1" - } - }, - { - "identity" : "mapbox-core-maps-ios", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/mapbox-core-maps-ios.git", - "state" : { - "revision" : "20d05d13d66371c46d486ce6d79d0e463df20fb9", - "version" : "11.5.0-rc.1" - } - }, - { - "identity" : "mapbox-maps-ios", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/mapbox-maps-ios.git", - "state" : { - "branch" : "main", - "revision" : "a4fb127d3a48ce84fbff0aa922218766d27000e0" - } - }, - { - "identity" : "nanopb", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/nanopb.git", - "state" : { - "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", - "version" : "2.30910.0" - } - }, - { - "identity" : "promises", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/promises.git", - "state" : { - "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", - "version" : "2.4.0" - } - }, - { - "identity" : "researchkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/ResearchKit", - "state" : { - "revision" : "08ab0290140e5a5e0e81d46cade1f09c7282facf", - "version" : "3.0.3" - } - }, - { - "identity" : "researchkitonfhir", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/ResearchKitOnFHIR", - "state" : { - "revision" : "dcd5f95522ed02a873b03c9638dbf397b99c74e0", - "version" : "1.4.0" - } - }, - { - "identity" : "spezi", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/Spezi", - "state" : { - "revision" : "734f90c19422a4196762b0e1dd055471066e89ee", - "version" : "1.3.0" - } - }, - { - "identity" : "speziaccount", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziAccount.git", - "state" : { - "revision" : "2de07209430fe7b13c44790eab948b30482fcb9d", - "version" : "1.2.4" - } - }, - { - "identity" : "spezicontact", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziContact.git", - "state" : { - "revision" : "494b776f8c98d771e4a609a1fb706097dba4c030", - "version" : "1.0.0" - } - }, - { - "identity" : "spezifirebase", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziFirebase.git", - "state" : { - "revision" : "67981d0f0b4f0bb70f120f9b5304e7c0b08e5717", - "version" : "1.1.3" - } - }, - { - "identity" : "spezifoundation", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziFoundation", - "state" : { - "revision" : "656f7659895dd4f182306963c2def75c16608472", - "version" : "1.1.1" - } - }, - { - "identity" : "spezihealthkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziHealthKit.git", - "state" : { - "revision" : "1e9cb5a6036ac7f4ff37ea1c3ed4898103339ad1", - "version" : "0.5.3" - } - }, - { - "identity" : "spezimockwebservice", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziMockWebService.git", - "state" : { - "revision" : "b18067d3499e630bbd995ef05a296ef8fdd42528", - "version" : "1.0.0" - } - }, - { - "identity" : "spezionboarding", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziOnboarding", - "state" : { - "revision" : "8d6dda3501720a1952573439b21a503cbecd9e0f", - "version" : "1.2.0" - } - }, - { - "identity" : "speziquestionnaire", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziQuestionnaire.git", - "state" : { - "revision" : "76732ebcb0b521fa94d41c38a5fe35e6e1a87173", - "version" : "1.2.1" - } - }, - { - "identity" : "spezischeduler", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziScheduler.git", - "state" : { - "revision" : "eed3980f20b01a788720c869010e3fe2fbfcd1fd", - "version" : "0.8.2" - } - }, - { - "identity" : "spezistorage", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziStorage.git", - "state" : { - "revision" : "b958df9b31f24800388a7bfc28f457ce7b82556c", - "version" : "1.0.2" - } - }, - { - "identity" : "speziviews", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordSpezi/SpeziViews.git", - "state" : { - "revision" : "0899c34c4b05e85b19e2dd2395783686aef81652", - "version" : "1.4.0" - } - }, - { - "identity" : "swift-collections", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-collections.git", - "state" : { - "revision" : "ee97538f5b81ae89698fd95938896dec5217b148", - "version" : "1.1.1" - } - }, - { - "identity" : "swift-protobuf", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-protobuf.git", - "state" : { - "revision" : "9f0c76544701845ad98716f3f6a774a892152bcb", - "version" : "1.26.0" - } - }, - { - "identity" : "turf-swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mapbox/turf-swift.git", - "state" : { - "revision" : "213050191cfcb3d5aa76e1fa90c6ff1e182a42ca", - "version" : "2.8.0" - } - }, - { - "identity" : "xctestextensions", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/XCTestExtensions.git", - "state" : { - "revision" : "1fe9b8e76aeb7a132af37bfa0892160c9b662dcc", - "version" : "0.4.10" - } - }, - { - "identity" : "xcthealthkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/XCTHealthKit.git", - "state" : { - "revision" : "6e9344a2d632b801d94fe3bbd1d891817e032103", - "version" : "0.3.5" - } - }, - { - "identity" : "xctruntimeassertions", - "kind" : "remoteSourceControl", - "location" : "https://github.com/StanfordBDHG/XCTRuntimeAssertions", - "state" : { - "revision" : "51da3403f128b120705571ce61e0fe190f8889e6", - "version" : "1.0.1" - } - } - ], - "version" : 3 -} diff --git a/LifeSpace/Account/AccountSheet.swift b/LifeSpace/Account/AccountSheet.swift index a5bcecb..7d8d181 100644 --- a/LifeSpace/Account/AccountSheet.swift +++ b/LifeSpace/Account/AccountSheet.swift @@ -11,6 +11,32 @@ import SpeziAccount import SwiftUI +private struct AccountHeader: View { + @Environment(Account.self) var account + + var body: some View { + VStack { + profileImage + if let email = account.details?.email { + Text(email) + .font(.title2) + .fontWeight(.semibold) + } + } + .frame(maxWidth: .infinity, alignment: .center) + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } + + private var profileImage: some View { + Image(systemName: "person.crop.circle.fill") + .resizable() + .frame(width: 60, height: 60) + .foregroundColor(Color(.systemGray3)) + .accessibilityHidden(true) + } +} + struct AccountSheet: View { @Environment(\.dismiss) var dismiss @@ -28,17 +54,14 @@ struct AccountSheet: View { NavigationStack { ZStack { if account.signedIn && !isInSetup { - AccountOverview(isEditing: $overviewIsEditing) { + Form { + AccountHeader() optionsList } - .onDisappear { - overviewIsEditing = false - } - .toolbar { - if !overviewIsEditing { - closeButton - } - } + .padding(.top, -20) + .toolbar { + closeButton + } } else { VStack { AccountSetupHeader() @@ -46,19 +69,27 @@ struct AccountSheet: View { dismiss() // we just signed in, dismiss the account setup sheet } } - .onAppear { - isInSetup = true - } - .toolbar { - if !accountRequired { - closeButton - } + .onAppear { + isInSetup = true + } + .toolbar { + if !accountRequired { + closeButton } + } } } } } + private var profileImage: some View { + Image(systemName: "person.crop.circle.fill") + .resizable() + .frame(width: 60, height: 60) + .foregroundColor(Color(.systemGray3)) + .accessibilityHidden(true) + } + private var optionsList: some View { List { Section(header: Text("STUDYID_SECTION")) { @@ -70,7 +101,8 @@ struct AccountSheet: View { privacyPolicyButton } Section(header: Text("SETTINGS_SECTION")) { - locationTrackingToggle + locationTrackingToggle + withdrawButton } } } @@ -121,7 +153,15 @@ struct AccountSheet: View { } } } - + + private var withdrawButton: some View { + NavigationLink(destination: { + WithdrawView() + }) { + Text("WITHDRAW") + } + } + private var closeButton: some ToolbarContent { ToolbarItem(placement: .cancellationAction) { Button("CLOSE") { @@ -129,7 +169,7 @@ struct AccountSheet: View { } } } - + private func getDocumentURL(for fileName: String) -> URL? { guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { @@ -140,26 +180,3 @@ struct AccountSheet: View { return documentsURL.appendingPathComponent(filenameWithStudyID) } } - - -#if DEBUG -#Preview("AccountSheet") { - let details = AccountDetails.Builder() - .set(\.userId, value: "lelandstanford@stanford.edu") - .set(\.name, value: PersonNameComponents(givenName: "Leland", familyName: "Stanford")) - - return AccountSheet() - .previewWith { - AccountConfiguration(building: details, active: MockUserIdPasswordAccountService()) - } -} - -#Preview("AccountSheet SignIn") { - AccountSheet() - .previewWith { - AccountConfiguration { - MockUserIdPasswordAccountService() - } - } -} -#endif diff --git a/LifeSpace/Account/WithdrawView.swift b/LifeSpace/Account/WithdrawView.swift new file mode 100644 index 0000000..5a242c8 --- /dev/null +++ b/LifeSpace/Account/WithdrawView.swift @@ -0,0 +1,61 @@ +// +// WithdrawView.swift +// LifeSpace +// +// Created by Vishnu Ravi on 8/5/24. +// + +import FirebaseAuth +import SpeziAccount +import SwiftUI + + +struct WithdrawView: View { + @AppStorage(StorageKeys.onboardingFlowComplete) var completedOnboardingFlow = false + @Environment(Account.self) var account + @State private var showingAlert = false + @State private var errorMessage = "" + + var body: some View { + Form { + Section { + Text("WITHDRAW_VIEW_TEXT") + } + + Section { + Button(action: { + Task { + await removeAccount() + } + }, label: { + Text("WITHDRAW") + .frame(maxWidth: .infinity) + .padding(.vertical, 10) + }) + .buttonStyle(.borderedProminent) + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } + } + .navigationTitle("WITHDRAW_VIEW_TITLE") + .alert("LOG_OUT_ERROR", isPresented: $showingAlert) { + Button("OK") { } + } + } + + private func removeAccount() async { + do { + try Auth.auth().signOut() + } catch { + errorMessage = error.localizedDescription + self.showingAlert = true + } + + await account.removeUserDetails() + completedOnboardingFlow = false + } +} + +#Preview { + WithdrawView() +} diff --git a/LifeSpace/Resources/Localizable.xcstrings b/LifeSpace/Resources/Localizable.xcstrings index 52a15bb..97ac1d3 100644 --- a/LifeSpace/Resources/Localizable.xcstrings +++ b/LifeSpace/Resources/Localizable.xcstrings @@ -398,6 +398,16 @@ } } }, + "LOG_OUT_ERROR" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error logging out" + } + } + } + }, "NEXT_BUTTON" : { "localizations" : { "en" : { @@ -409,7 +419,14 @@ } }, "NO" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + } + } }, "NOTIFICATION_PERMISSIONS_BUTTON" : { "localizations" : { @@ -845,8 +862,45 @@ } } }, + "WITHDRAW" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Withdraw From Study" + } + } + } + }, + "WITHDRAW_VIEW_TEXT" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If you first agree to participate and then you change your mind, you are free to withdraw your consent and discontinue your participation at any time.
\nIf you decide to withdraw your consent to participate in this study, you should notify the LifeSpace study team (lifespace@stanford.edu) or Michelle Odden (650-721-0230, modden@stanford.edu).

Tapping the button below will reset your app to the state it was originally in prior to joining the study.\n\nIf you decide to withdraw from the study, you can delete the LifeSpace App from your phone. " + } + } + } + }, + "WITHDRAW_VIEW_TITLE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Withdraw from Study" + } + } + } + }, "YES" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes" + } + } + } } }, "version" : "1.0"