bunch of ui adjustments
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
8904DEC8277055E90071E6CA /* OnboardingTrioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8904DEC7277055E90071E6CA /* OnboardingTrioView.swift */; };
|
8904DEC8277055E90071E6CA /* OnboardingOneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8904DEC7277055E90071E6CA /* OnboardingOneView.swift */; };
|
||||||
891060E4277359B900F14509 /* CloudStorageService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891060E3277359B900F14509 /* CloudStorageService.swift */; };
|
891060E4277359B900F14509 /* CloudStorageService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891060E3277359B900F14509 /* CloudStorageService.swift */; };
|
||||||
891060E82774460500F14509 /* FirebaseInAppMessaging-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E72774460500F14509 /* FirebaseInAppMessaging-Beta */; };
|
891060E82774460500F14509 /* FirebaseInAppMessaging-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E72774460500F14509 /* FirebaseInAppMessaging-Beta */; };
|
||||||
891060EA2774460500F14509 /* FirebaseInAppMessagingSwift-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E92774460500F14509 /* FirebaseInAppMessagingSwift-Beta */; };
|
891060EA2774460500F14509 /* FirebaseInAppMessagingSwift-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E92774460500F14509 /* FirebaseInAppMessagingSwift-Beta */; };
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
8904DEC7277055E90071E6CA /* OnboardingTrioView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingTrioView.swift; sourceTree = "<group>"; };
|
8904DEC7277055E90071E6CA /* OnboardingOneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingOneView.swift; sourceTree = "<group>"; };
|
||||||
891060E3277359B900F14509 /* CloudStorageService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudStorageService.swift; sourceTree = "<group>"; };
|
891060E3277359B900F14509 /* CloudStorageService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudStorageService.swift; sourceTree = "<group>"; };
|
||||||
891060E527743FEB00F14509 /* nirvana-ios.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "nirvana-ios.entitlements"; sourceTree = "<group>"; };
|
891060E527743FEB00F14509 /* nirvana-ios.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "nirvana-ios.entitlements"; sourceTree = "<group>"; };
|
||||||
89110713277166D6005797FA /* UserFriends.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFriends.swift; sourceTree = "<group>"; };
|
89110713277166D6005797FA /* UserFriends.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFriends.swift; sourceTree = "<group>"; };
|
||||||
@@ -439,7 +439,7 @@
|
|||||||
89F18AF2276ECD5D00115B1E /* OnBoarding */ = {
|
89F18AF2276ECD5D00115B1E /* OnBoarding */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
8904DEC7277055E90071E6CA /* OnboardingTrioView.swift */,
|
8904DEC7277055E90071E6CA /* OnboardingOneView.swift */,
|
||||||
);
|
);
|
||||||
path = OnBoarding;
|
path = OnBoarding;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -584,7 +584,7 @@
|
|||||||
891A15E127653A7000B26659 /* nirvana_iosApp.swift in Sources */,
|
891A15E127653A7000B26659 /* nirvana_iosApp.swift in Sources */,
|
||||||
89BCABED276D2B05009E9B10 /* WavesGlassBackgroundView.swift in Sources */,
|
89BCABED276D2B05009E9B10 /* WavesGlassBackgroundView.swift in Sources */,
|
||||||
89F05BA6276ACD830002E9C7 /* ContactsPickerView.swift in Sources */,
|
89F05BA6276ACD830002E9C7 /* ContactsPickerView.swift in Sources */,
|
||||||
8904DEC8277055E90071E6CA /* OnboardingTrioView.swift in Sources */,
|
8904DEC8277055E90071E6CA /* OnboardingOneView.swift in Sources */,
|
||||||
896CE7022770892F00DB474E /* CircleGridView.swift in Sources */,
|
896CE7022770892F00DB474E /* CircleGridView.swift in Sources */,
|
||||||
89BDCDEA27697F9C00577829 /* UserMenu.swift in Sources */,
|
89BDCDEA27697F9C00577829 /* UserMenu.swift in Sources */,
|
||||||
89BCABE7276B3D64009E9B10 /* InnerCircleViewModel.swift in Sources */,
|
89BCABE7276B3D64009E9B10 /* InnerCircleViewModel.swift in Sources */,
|
||||||
|
|||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "undraw_explore_re_8l4v.svg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 40 KiB |
@@ -9,6 +9,8 @@ import SwiftUI
|
|||||||
import NavigationStack
|
import NavigationStack
|
||||||
|
|
||||||
struct AddBasicInfoView: View {
|
struct AddBasicInfoView: View {
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
|
|
||||||
@EnvironmentObject var navigationStack : NavigationStack
|
@EnvironmentObject var navigationStack : NavigationStack
|
||||||
@EnvironmentObject var authSessionStore: AuthSessionStore
|
@EnvironmentObject var authSessionStore: AuthSessionStore
|
||||||
@ObservedObject var addInfoViewModel: AddBasicInfoViewModel = AddBasicInfoViewModel()
|
@ObservedObject var addInfoViewModel: AddBasicInfoViewModel = AddBasicInfoViewModel()
|
||||||
@@ -22,120 +24,113 @@ struct AddBasicInfoView: View {
|
|||||||
count: 5)
|
count: 5)
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
NavigationView {
|
||||||
// bg
|
ZStack {
|
||||||
WavesGlassBackgroundView()
|
// bg
|
||||||
|
WavesGlassBackgroundView()
|
||||||
// programmatic back button
|
|
||||||
ZStack(alignment: .topLeading) {
|
|
||||||
Color.clear
|
|
||||||
|
|
||||||
Button {
|
// main content
|
||||||
self.navigationStack.pop()
|
|
||||||
} label: {
|
|
||||||
Label("back", systemImage:"chevron.left")
|
|
||||||
.labelStyle(.iconOnly)
|
|
||||||
.font(.title2)
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
}
|
|
||||||
|
|
||||||
// main content
|
|
||||||
VStack {
|
|
||||||
// header logo area
|
|
||||||
LogoHeaderView()
|
|
||||||
|
|
||||||
// action text
|
|
||||||
VStack(alignment: .leading) {
|
|
||||||
Text("Let's Build A Profile")
|
|
||||||
.font(.title)
|
|
||||||
.fontWeight(.medium)
|
|
||||||
.foregroundColor(NirvanaColor.teal)
|
|
||||||
.multilineTextAlignment(.center)
|
|
||||||
|
|
||||||
Text("Select an avatar you like, then make a username! You can always change this later.")
|
|
||||||
.font(.subheadline)
|
|
||||||
.foregroundColor(Color.black.opacity(0.7))
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
|
|
||||||
// Horizontal scroll view to allow user to select the avatar he or she wants
|
|
||||||
ScrollView([.horizontal, .vertical], showsIndicators: false) {
|
|
||||||
LazyVGrid(columns: columns) {
|
|
||||||
ForEach(0..<Avatars.avatarSystemNames.count) { index in
|
|
||||||
Image(Avatars.avatarSystemNames[index])
|
|
||||||
.resizable()
|
|
||||||
.scaledToFit()
|
|
||||||
.frame(width: 50, height: 50, alignment: .center)
|
|
||||||
.blur(radius: self.selectedAvatarIndex == index ? 0 : 1)
|
|
||||||
.scaleEffect(self.selectedAvatarIndex == index ? 1.3 : 1)
|
|
||||||
.padding()
|
|
||||||
.background(self.selectedAvatarIndex == index ? Color.white.opacity(0.3) : Color.clear)
|
|
||||||
.clipShape(Circle())
|
|
||||||
.onTapGesture {
|
|
||||||
print("selected another avatar: \(index)")
|
|
||||||
|
|
||||||
self.selectedAvatarIndex = index
|
|
||||||
}
|
|
||||||
.animation(.spring())
|
|
||||||
}
|
|
||||||
}.padding(.top, 20)
|
|
||||||
}
|
|
||||||
|
|
||||||
// input nickname
|
|
||||||
VStack {
|
VStack {
|
||||||
TextField("Nickname", text: self.$nickname)
|
// header logo area
|
||||||
.padding()
|
LogoHeaderView()
|
||||||
.background(.ultraThinMaterial)
|
|
||||||
.clipShape(Capsule())
|
// action text
|
||||||
.shadow(color: Color.black.opacity(0.3), radius: 20, x: 0, y: 20)
|
VStack(alignment: .leading) {
|
||||||
.font(.subheadline)
|
Text("Let's Build A Profile")
|
||||||
.multilineTextAlignment(.center)
|
.font(.title)
|
||||||
|
.fontWeight(.medium)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
.multilineTextAlignment(.center)
|
||||||
|
|
||||||
Text("What do your friends call you?")
|
Text("Select an avatar you like, then make a username! You can always change this later.")
|
||||||
.font(.footnote)
|
.font(.subheadline)
|
||||||
.foregroundColor(Color.black.opacity(0.7))
|
.foregroundColor(Color.black.opacity(0.7))
|
||||||
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
|
|
||||||
// button to save information
|
|
||||||
Button {
|
|
||||||
var updatedUser = self.authSessionStore.user
|
|
||||||
updatedUser?.avatar = Avatars.avatarSystemNames[self.selectedAvatarIndex]
|
|
||||||
updatedUser?.nickname = self.nickname
|
|
||||||
|
|
||||||
print("attempting to save information \(updatedUser)")
|
|
||||||
|
|
||||||
if updatedUser != nil {
|
|
||||||
self.addInfoViewModel.updateUser(currUser: updatedUser!) {
|
|
||||||
self.navigationStack.push(InnerCircleView())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} label: {
|
|
||||||
Text("Save")
|
// Horizontal scroll view to allow user to select the avatar he or she wants
|
||||||
.fontWeight(.heavy)
|
ScrollView([.horizontal, .vertical], showsIndicators: false) {
|
||||||
.foregroundColor(Color.white)
|
LazyVGrid(columns: columns) {
|
||||||
.frame(maxWidth: .infinity)
|
ForEach(0..<Avatars.avatarSystemNames.count) { index in
|
||||||
.padding(.vertical, 20)
|
Image(Avatars.avatarSystemNames[index])
|
||||||
.background(self.nickname.count == 0 ? Color.white.opacity(0.3) : NirvanaColor.teal)
|
.resizable()
|
||||||
.clipShape(Capsule())
|
.scaledToFit()
|
||||||
.shadow(radius:10)
|
.frame(width: 50, height: 50, alignment: .center)
|
||||||
|
.blur(radius: self.selectedAvatarIndex == index ? 0 : 0.2)
|
||||||
|
.scaleEffect(self.selectedAvatarIndex == index ? 1.5 : 1)
|
||||||
|
.padding()
|
||||||
|
.background(self.selectedAvatarIndex == index ? NirvanaColor.teal.opacity(0.5) : Color.clear)
|
||||||
|
.clipShape(Circle())
|
||||||
|
.onTapGesture {
|
||||||
|
print("selected another avatar: \(index)")
|
||||||
|
|
||||||
|
self.selectedAvatarIndex = index
|
||||||
|
}
|
||||||
|
.animation(.spring())
|
||||||
|
}
|
||||||
|
}.padding(.top, 20)
|
||||||
|
}
|
||||||
|
|
||||||
|
// input nickname
|
||||||
|
VStack {
|
||||||
|
TextField("nickname", text: self.$nickname)
|
||||||
|
.padding()
|
||||||
|
.background(.ultraThinMaterial)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
.font(.subheadline)
|
||||||
|
.multilineTextAlignment(.center)
|
||||||
|
|
||||||
|
Text("What do your friends call you?")
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
// button to save information
|
||||||
|
Button {
|
||||||
|
var updatedUser = self.authSessionStore.user
|
||||||
|
updatedUser?.avatar = Avatars.avatarSystemNames[self.selectedAvatarIndex]
|
||||||
|
updatedUser?.nickname = self.nickname
|
||||||
|
|
||||||
|
print("attempting to save information \(updatedUser)")
|
||||||
|
|
||||||
|
if updatedUser != nil {
|
||||||
|
self.addInfoViewModel.updateUser(currUser: updatedUser!) {
|
||||||
|
self.navigationStack.push(InnerCircleView())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Text("Save")
|
||||||
|
.fontWeight(.heavy)
|
||||||
|
.foregroundColor(self.nickname.count == 0 ? Color.white.opacity(0.2) : Color.white)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(.vertical, 20)
|
||||||
|
.background(self.nickname.count == 0 ? Color.white.opacity(0.3) : NirvanaColor.teal)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
.animation(.default)
|
||||||
|
.padding()
|
||||||
}
|
}
|
||||||
.animation(.default)
|
.frame(maxWidth: UIScreen.main.bounds.width - 20, maxHeight: .infinity)
|
||||||
.padding()
|
|
||||||
}
|
}
|
||||||
.frame(maxHeight: .infinity)
|
.onAppear {
|
||||||
}
|
// get current user nickname and avatar if they have one
|
||||||
.onAppear {
|
self.nickname = self.authSessionStore.user?.nickname ?? ""
|
||||||
// get current user nickname and avatar if they have one
|
if self.authSessionStore.user?.avatar != nil { // if user has previously selected an avatar
|
||||||
self.nickname = self.authSessionStore.user?.nickname ?? ""
|
self.selectedAvatarIndex = Avatars.avatarSystemNames.firstIndex(of: (self.authSessionStore.user?.avatar)!) ?? 0 // 0 in case the system names doesn't have it anymore
|
||||||
if self.authSessionStore.user?.avatar != nil { // if user has previously selected an avatar
|
}
|
||||||
self.selectedAvatarIndex = Avatars.avatarSystemNames.firstIndex(of: (self.authSessionStore.user?.avatar)!) ?? 0 // 0 in case the system names doesn't have it anymore
|
|
||||||
}
|
}
|
||||||
|
.navigationBarItems(trailing: Button(action: {
|
||||||
|
dismiss()
|
||||||
|
}, label: {
|
||||||
|
Text("Cancel")
|
||||||
|
}))
|
||||||
|
.navigationBarHidden(true)
|
||||||
}
|
}
|
||||||
//TODO: hook up the alert with the view model
|
//TODO: hook up the alert with the view model
|
||||||
// .alert(isPresented: Binding<Bool>(
|
// .alert(isPresented: Binding<Bool>(
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ struct CircleNavigationView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
self.navigationStack.push(OnboardingTrioView())
|
self.navigationStack.push(OnboardingOneView())
|
||||||
} label: {
|
} label: {
|
||||||
Label("why?", systemImage: "leaf")
|
Label("why?", systemImage: "leaf")
|
||||||
.foregroundColor(NirvanaColor.teal)
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ enum SheetView : Identifiable {
|
|||||||
var id: Self { self }
|
var id: Self { self }
|
||||||
case contacts
|
case contacts
|
||||||
case inbox
|
case inbox
|
||||||
|
case profile
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InnerCircleView: View {
|
struct InnerCircleView: View {
|
||||||
@@ -48,8 +49,10 @@ struct InnerCircleView: View {
|
|||||||
switch page {
|
switch page {
|
||||||
case SheetView.contacts:
|
case SheetView.contacts:
|
||||||
FindFriendsView()
|
FindFriendsView()
|
||||||
case SheetView.inbox:
|
// case SheetView.inbox: // removing feature for now
|
||||||
InboxView()// test one for now
|
// InboxView()
|
||||||
|
case SheetView.profile:
|
||||||
|
AddBasicInfoView()
|
||||||
default:
|
default:
|
||||||
Text("asdf")
|
Text("asdf")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,186 @@
|
|||||||
|
//
|
||||||
|
// OnboardingTrio.swift
|
||||||
|
// nirvana-ios
|
||||||
|
//
|
||||||
|
// Created by Arjun Patel on 12/14/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import NavigationStack
|
||||||
|
|
||||||
|
struct OnboardingOneView: View {
|
||||||
|
@EnvironmentObject var navigationStack: NavigationStack
|
||||||
|
let screenWidth = UIScreen.main.bounds.width
|
||||||
|
let screenHeight = UIScreen.main.bounds.height
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
OnboardingTemplateView(imgName: "undraw_explore_re_8l4v-1", mainLeadingActText: "Be", mainHighlightedActText: "yourself", mainTrailingActText: "again.", subActText: "No more endless feeds, profiles, media, fomo, anxiety...focus on you and be more present.", bottomActArea: AnyView(
|
||||||
|
VStack {
|
||||||
|
// little bar to show progress out of three steps
|
||||||
|
HStack {
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 20, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Circle()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
|
HStack {
|
||||||
|
Button {
|
||||||
|
self.navigationStack.push(OnboardingTwo())
|
||||||
|
} label: {
|
||||||
|
Text("Next")
|
||||||
|
.fontWeight(.heavy)
|
||||||
|
.foregroundColor(NirvanaColor.white)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(.vertical, 20)
|
||||||
|
.background(NirvanaColor.teal)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip to hub
|
||||||
|
Button {
|
||||||
|
self.navigationStack.push(InnerCircleView())
|
||||||
|
} label: {
|
||||||
|
Text("Skip")
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OnboardingTrioView_Previews: PreviewProvider {
|
||||||
|
static var previews: some View {
|
||||||
|
OnboardingOneView().environmentObject(AuthSessionStore())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OnboardingTwo: View {
|
||||||
|
@EnvironmentObject var navigationStack: NavigationStack
|
||||||
|
var body: some View {
|
||||||
|
OnboardingTemplateView(imgName: "undraw_connection_b-38-q", mainLeadingActText: "Be picky about your", mainHighlightedActText: "inner circle.", mainTrailingActText: "", subActText: "You are who you hang out with. We kept things minimal because less is more...and we care.", bottomActArea: AnyView(
|
||||||
|
VStack {
|
||||||
|
// little bar to show progress out of three steps
|
||||||
|
HStack {
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 20, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Circle()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
|
HStack {
|
||||||
|
Button {
|
||||||
|
self.navigationStack.pop()
|
||||||
|
} label: {
|
||||||
|
Label("back", systemImage:"chevron.left")
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
.font(.title2)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
.padding()
|
||||||
|
.background(.ultraThinMaterial)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
self.navigationStack.push(OnboardingTwo())
|
||||||
|
} label: {
|
||||||
|
Text("Next")
|
||||||
|
.fontWeight(.heavy)
|
||||||
|
.foregroundColor(NirvanaColor.white)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(.vertical, 20)
|
||||||
|
.background(NirvanaColor.teal)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip to hub
|
||||||
|
Button {
|
||||||
|
self.navigationStack.push(InnerCircleView())
|
||||||
|
} label: {
|
||||||
|
Text("Skip")
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct OnboardingThree: View {
|
||||||
|
@EnvironmentObject var navigationStack: NavigationStack
|
||||||
|
var body: some View {
|
||||||
|
OnboardingTemplateView(imgName: "undraw_voice_assistant_nrv7", mainLeadingActText: "Buttery smooth convos with your", mainHighlightedActText: "authentic voice.", mainTrailingActText: "", subActText: "Less screen time, no more meaningless texts. Start mindfully conversing without all of the noise.", bottomActArea: AnyView(
|
||||||
|
VStack {
|
||||||
|
// little bar to show progress out of three steps
|
||||||
|
HStack {
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Capsule()
|
||||||
|
.frame(width: 5, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
Circle()
|
||||||
|
.frame(width: 20, height: 5)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
|
HStack {
|
||||||
|
Button {
|
||||||
|
self.navigationStack.pop()
|
||||||
|
} label: {
|
||||||
|
Label("back", systemImage:"chevron.left")
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
.font(.title2)
|
||||||
|
.foregroundColor(NirvanaColor.teal)
|
||||||
|
.padding()
|
||||||
|
.background(.ultraThinMaterial)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
self.navigationStack.push(OnboardingTwo())
|
||||||
|
} label: {
|
||||||
|
Text("Get Started")
|
||||||
|
.fontWeight(.heavy)
|
||||||
|
.foregroundColor(NirvanaColor.white)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(.vertical, 20)
|
||||||
|
.background(NirvanaColor.teal)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.shadow(radius:10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
//
|
|
||||||
// OnboardingTrio.swift
|
|
||||||
// nirvana-ios
|
|
||||||
//
|
|
||||||
// Created by Arjun Patel on 12/14/21.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import NavigationStack
|
|
||||||
|
|
||||||
struct OnboardingTrioView: View {
|
|
||||||
@EnvironmentObject var navigationStack: NavigationStack
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
ZStack(alignment: .topLeading) {
|
|
||||||
TabView {
|
|
||||||
OnboardingTemplateView(imgName: "undraw_through_the_park_lxnl", mainLeadingActText: "Be", mainHighlightedActText: "yourself", mainTrailingActText: "again.", subActText: "No more endless feeds, profiles, media, fomo, anxiety...focus on you and be more present.")
|
|
||||||
|
|
||||||
OnboardingTemplateView(imgName: "undraw_connection_b-38-q", mainLeadingActText: "Be picky about your", mainHighlightedActText: "inner circle.", mainTrailingActText: "", subActText: "You are who you hang out with. We kept things minimal because less is more...and we care.")
|
|
||||||
|
|
||||||
OnboardingTemplateView(imgName: "undraw_voice_assistant_nrv7", mainLeadingActText: "Buttery smooth convos with your", mainHighlightedActText: "authentic voice.", mainTrailingActText: "", subActText: "Less screen time, no more meaningless texts. Start mindfully conversing without all of the noise.", bottomActArea: AnyView(
|
|
||||||
VStack {
|
|
||||||
Button {
|
|
||||||
self.navigationStack.push(AddBasicInfoView())
|
|
||||||
} label: {
|
|
||||||
Text("Get Started")
|
|
||||||
.bold()
|
|
||||||
.foregroundColor(NirvanaColor.white)
|
|
||||||
.frame(maxWidth: .infinity)
|
|
||||||
.padding()
|
|
||||||
.background(NirvanaColor.teal)
|
|
||||||
.clipShape(Capsule())
|
|
||||||
.shadow(radius:10)
|
|
||||||
}
|
|
||||||
}.padding(.bottom, 30)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.navigationBarHidden(true)
|
|
||||||
.tabViewStyle(.page(indexDisplayMode: .automatic))
|
|
||||||
.ignoresSafeArea(.all)
|
|
||||||
|
|
||||||
|
|
||||||
HStack(alignment: .center) {
|
|
||||||
Button {
|
|
||||||
self.navigationStack.pop()
|
|
||||||
} label: {
|
|
||||||
Label("back", systemImage:"chevron.left")
|
|
||||||
.labelStyle(.iconOnly)
|
|
||||||
.font(.title2)
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
|
|
||||||
Button {
|
|
||||||
self.navigationStack.push(AddBasicInfoView())
|
|
||||||
} label: {
|
|
||||||
Text("Skip")
|
|
||||||
.foregroundColor(NirvanaColor.dimTeal)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct OnboardingTrioView_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
OnboardingTrioView().environmentObject(AuthSessionStore())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -55,85 +55,10 @@ struct PhoneCodeVerificationView: View {
|
|||||||
|
|
||||||
if self.verificationCode.count == 6 {
|
if self.verificationCode.count == 6 {
|
||||||
Button {
|
Button {
|
||||||
print("started verification process of code")
|
self.verify()
|
||||||
|
|
||||||
//disable focused textfield
|
|
||||||
self.focusedInputField = false
|
|
||||||
|
|
||||||
// show loading screen
|
|
||||||
self.isLoading.toggle()
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: do all of this in view model authstore
|
|
||||||
// get it from the previous screen but from storage
|
|
||||||
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
|
|
||||||
|
|
||||||
if verificationID == nil {
|
|
||||||
self.toastText = "There was an error validating your code."
|
|
||||||
self.showToast.toggle()
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we got a value, then continue with verifying their code
|
|
||||||
let credential = PhoneAuthProvider.provider().credential(
|
|
||||||
withVerificationID: verificationID!,
|
|
||||||
verificationCode: self.verificationCode
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO: bug one: not navigating after creating user...two: creating user with a random Id
|
|
||||||
// firebase will now verify the credential
|
|
||||||
Auth.auth().signIn(with: credential) { (res, err) in
|
|
||||||
if err != nil {
|
|
||||||
self.isLoading.toggle()
|
|
||||||
self.toastText = "⚠️ Error with Verification"
|
|
||||||
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
|
||||||
self.showToast.toggle()
|
|
||||||
|
|
||||||
print((err?.localizedDescription)!)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//setting in key storage
|
|
||||||
UserDefaults.standard.set(true, forKey: "authVerificationID")
|
|
||||||
|
|
||||||
// firebase either created a new user or is giving back an existing user's id
|
|
||||||
let userId = res?.user.uid
|
|
||||||
let userPhoneNumber = res?.user.phoneNumber
|
|
||||||
print("firebase auth: user id that was authenticated is: \(userId)")
|
|
||||||
print("firebase auth: phone number that was authenticated is: \(userPhoneNumber)")
|
|
||||||
|
|
||||||
// if for some reason firebase couldn't get auth details
|
|
||||||
if userId == nil || userPhoneNumber == nil {
|
|
||||||
self.isLoading.toggle()
|
|
||||||
self.toastText = "⚠️ Error with Verification"
|
|
||||||
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
|
||||||
self.showToast.toggle()
|
|
||||||
|
|
||||||
print((err?.localizedDescription)!)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
self.phoneverificationViewModel.createOrUpdateUser(userId: userId!, phoneNumber: userPhoneNumber!) {res in
|
|
||||||
switch res {
|
|
||||||
case .success(let msg):
|
|
||||||
// then sending to next page
|
|
||||||
self.navigationStack.push(OnboardingTrioView())
|
|
||||||
return
|
|
||||||
case .error(let error):
|
|
||||||
self.isLoading.toggle()
|
|
||||||
self.toastText = "⚠️ Error with Verification"
|
|
||||||
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
|
||||||
self.showToast.toggle()
|
|
||||||
|
|
||||||
print((err?.localizedDescription)!)
|
|
||||||
return
|
|
||||||
default: break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} label: {
|
} label: {
|
||||||
Text("Verify")
|
Text("Verify")
|
||||||
.bold()
|
.fontWeight(.heavy)
|
||||||
.foregroundColor(NirvanaColor.white)
|
.foregroundColor(NirvanaColor.white)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
.padding(.vertical, 20)
|
.padding(.vertical, 20)
|
||||||
@@ -179,6 +104,85 @@ struct PhoneCodeVerificationView: View {
|
|||||||
Text(self.toastSubMessage)
|
Text(self.toastSubMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func verify() {
|
||||||
|
print("started verification process of code")
|
||||||
|
|
||||||
|
//disable focused textfield
|
||||||
|
self.focusedInputField = false
|
||||||
|
|
||||||
|
// show loading screen
|
||||||
|
self.isLoading.toggle()
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: do all of this in view model authstore
|
||||||
|
// get it from the previous screen but from storage
|
||||||
|
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
|
||||||
|
|
||||||
|
if verificationID == nil {
|
||||||
|
self.toastText = "There was an error validating your code."
|
||||||
|
self.showToast.toggle()
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we got a value, then continue with verifying their code
|
||||||
|
let credential = PhoneAuthProvider.provider().credential(
|
||||||
|
withVerificationID: verificationID!,
|
||||||
|
verificationCode: self.verificationCode
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: bug one: not navigating after creating user...two: creating user with a random Id
|
||||||
|
// firebase will now verify the credential
|
||||||
|
Auth.auth().signIn(with: credential) { (res, err) in
|
||||||
|
if err != nil {
|
||||||
|
self.isLoading.toggle()
|
||||||
|
self.toastText = "⚠️ Error with Verification"
|
||||||
|
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
||||||
|
self.showToast.toggle()
|
||||||
|
|
||||||
|
print((err?.localizedDescription)!)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//setting in key storage
|
||||||
|
UserDefaults.standard.set(true, forKey: "authVerificationID")
|
||||||
|
|
||||||
|
// firebase either created a new user or is giving back an existing user's id
|
||||||
|
let userId = res?.user.uid
|
||||||
|
let userPhoneNumber = res?.user.phoneNumber
|
||||||
|
print("firebase auth: user id that was authenticated is: \(userId)")
|
||||||
|
print("firebase auth: phone number that was authenticated is: \(userPhoneNumber)")
|
||||||
|
|
||||||
|
// if for some reason firebase couldn't get auth details
|
||||||
|
if userId == nil || userPhoneNumber == nil {
|
||||||
|
self.isLoading.toggle()
|
||||||
|
self.toastText = "⚠️ Error with Verification"
|
||||||
|
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
||||||
|
self.showToast.toggle()
|
||||||
|
|
||||||
|
print((err?.localizedDescription)!)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
self.phoneverificationViewModel.createOrUpdateUser(userId: userId!, phoneNumber: userPhoneNumber!) {res in
|
||||||
|
switch res {
|
||||||
|
case .success(let msg):
|
||||||
|
// then sending to next page
|
||||||
|
self.navigationStack.push(OnboardingOneView())
|
||||||
|
|
||||||
|
return
|
||||||
|
case .error(let error):
|
||||||
|
self.isLoading.toggle()
|
||||||
|
self.toastText = "⚠️ Error with Verification"
|
||||||
|
self.toastSubMessage = "Code is invalid. Please try again or re-enter your phone number in the previous page."
|
||||||
|
self.showToast.toggle()
|
||||||
|
|
||||||
|
print((err?.localizedDescription)!)
|
||||||
|
return
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PhoneCodeVerificationView_Previews: PreviewProvider {
|
struct PhoneCodeVerificationView_Previews: PreviewProvider {
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ struct OnboardingTemplateView_Previews: PreviewProvider {
|
|||||||
VStack(alignment: .center) {
|
VStack(alignment: .center) {
|
||||||
NavigationLink(destination: HomeView()) {
|
NavigationLink(destination: HomeView()) {
|
||||||
Text("Start Your Detox")
|
Text("Start Your Detox")
|
||||||
.bold()
|
.fontWeight(.heavy)
|
||||||
.foregroundColor(NirvanaColor.white)
|
.foregroundColor(NirvanaColor.white)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
.padding(.vertical, 20)
|
.padding(.vertical, 20)
|
||||||
|
|||||||
Reference in New Issue
Block a user