forked from mirrors/linphone-iphone
Display toast when user copy adress or delete call logs in History views
This commit is contained in:
parent
81a9dd9124
commit
0142a9146b
13 changed files with 73 additions and 44 deletions
|
|
@ -46,6 +46,7 @@
|
|||
D777DBB32AE12C5900565A99 /* ContactsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D777DBB22AE12C5900565A99 /* ContactsManager.swift */; };
|
||||
D78290B82ADD3910004AA85C /* ContactsFragment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78290B72ADD3910004AA85C /* ContactsFragment.swift */; };
|
||||
D78290BB2ADD40B2004AA85C /* ContactViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78290BA2ADD40B2004AA85C /* ContactViewModel.swift */; };
|
||||
D796F2002B0BB61A0041115F /* ToastViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D796F1FF2B0BB61A0041115F /* ToastViewModel.swift */; };
|
||||
D7A03FBD2ACC2DB60081A588 /* ContactsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A03FBC2ACC2DB60081A588 /* ContactsView.swift */; };
|
||||
D7A03FC02ACC2E390081A588 /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A03FBF2ACC2E390081A588 /* HistoryView.swift */; };
|
||||
D7A03FC62ACC458A0081A588 /* SplashScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A03FC52ACC458A0081A588 /* SplashScreen.swift */; };
|
||||
|
|
@ -117,6 +118,7 @@
|
|||
D777DBB22AE12C5900565A99 /* ContactsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsManager.swift; sourceTree = "<group>"; };
|
||||
D78290B72ADD3910004AA85C /* ContactsFragment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsFragment.swift; sourceTree = "<group>"; };
|
||||
D78290BA2ADD40B2004AA85C /* ContactViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactViewModel.swift; sourceTree = "<group>"; };
|
||||
D796F1FF2B0BB61A0041115F /* ToastViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastViewModel.swift; sourceTree = "<group>"; };
|
||||
D7A03FBC2ACC2DB60081A588 /* ContactsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsView.swift; sourceTree = "<group>"; };
|
||||
D7A03FBF2ACC2E390081A588 /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = "<group>"; };
|
||||
D7A03FC52ACC458A0081A588 /* SplashScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SplashScreen.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -386,6 +388,7 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
D7A2EDD52AC18115005D90FC /* SharedMainViewModel.swift */,
|
||||
D796F1FF2B0BB61A0041115F /* ToastViewModel.swift */,
|
||||
);
|
||||
path = Viewmodel;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -529,6 +532,7 @@
|
|||
D719ABC92ABC6FD700B41C10 /* CoreContext.swift in Sources */,
|
||||
D7EAACCF2AD6ED8000AA6A8A /* PermissionsFragment.swift in Sources */,
|
||||
D777DBB32AE12C5900565A99 /* ContactsManager.swift in Sources */,
|
||||
D796F2002B0BB61A0041115F /* ToastViewModel.swift in Sources */,
|
||||
D7C3650A2AF001C300FE6142 /* EditContactFragment.swift in Sources */,
|
||||
D7A03FBD2ACC2DB60081A588 /* ContactsView.swift in Sources */,
|
||||
D719ABCF2ABC779A00B41C10 /* AccountLoginViewModel.swift in Sources */,
|
||||
|
|
|
|||
|
|
@ -71,9 +71,11 @@ final class CoreContext: ObservableObject {
|
|||
self.mCore.publisher?.onConfiguringStatus?.postOnMainQueue { (cbVal: (core: Core, status: Config.ConfiguringState, message: String)) in
|
||||
NSLog("New configuration state is \(cbVal.status) = \(cbVal.message)\n")
|
||||
if cbVal.status == Config.ConfiguringState.Successful {
|
||||
self.sharedMainViewModel.toastMessage = "Successful"
|
||||
ToastViewModel.shared.toastMessage = "Successful"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
} else {
|
||||
self.sharedMainViewModel.toastMessage = "Failed"
|
||||
ToastViewModel.shared.toastMessage = "Failed"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -90,7 +92,8 @@ final class CoreContext: ObservableObject {
|
|||
} else if cbVal.state == .Progress {
|
||||
self.loggingInProgress = true
|
||||
} else {
|
||||
self.sharedMainViewModel.toastMessage = "Registration failed"
|
||||
ToastViewModel.shared.toastMessage = "Registration failed"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
self.loggingInProgress = false
|
||||
self.loggedIn = false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ struct LinphoneApp: App {
|
|||
WelcomeView()
|
||||
} else if coreContext.defaultAccount == nil || sharedMainViewModel.displayProfileMode {
|
||||
AssistantView()
|
||||
.toast(isShowing: $sharedMainViewModel.toastMessage)
|
||||
} else if coreContext.defaultAccount != nil {
|
||||
ContentView(
|
||||
contactViewModel: ContactViewModel(),
|
||||
|
|
@ -42,7 +41,6 @@ struct LinphoneApp: App {
|
|||
historyViewModel: HistoryViewModel(),
|
||||
historyListViewModel: HistoryListViewModel()
|
||||
)
|
||||
.toast(isShowing: $sharedMainViewModel.toastMessage)
|
||||
}
|
||||
} else {
|
||||
SplashScreen(isActive: $isActive)
|
||||
|
|
|
|||
|
|
@ -55,13 +55,15 @@ struct QrCodeScannerFragment: View {
|
|||
.edgesIgnoringSafeArea(.all)
|
||||
.navigationBarHidden(true)
|
||||
|
||||
if sharedMainViewModel.toastMessage == "Successful" {
|
||||
/*
|
||||
if $isShowToast {
|
||||
ZStack {
|
||||
|
||||
}.onAppear {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,10 +77,12 @@ class Coordinator: NSObject, AVCaptureMetadataOutputObjectsDelegate {
|
|||
try? core.start()
|
||||
}
|
||||
} else {
|
||||
sharedMainViewModel.toastMessage = "Invalide URI"
|
||||
ToastViewModel.shared.toastMessage = "Invalide URI"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
}
|
||||
} else {
|
||||
sharedMainViewModel.toastMessage = "Invalide URI"
|
||||
ToastViewModel.shared.toastMessage = "Invalide URI"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,7 +70,8 @@ struct ContactListBottomSheet: View {
|
|||
dismiss()
|
||||
}
|
||||
|
||||
sharedMainViewModel.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
|
||||
} label: {
|
||||
HStack {
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ struct ContentView: View {
|
|||
@Environment(\.scenePhase) var scenePhase
|
||||
|
||||
@ObservedObject private var coreContext = CoreContext.shared
|
||||
@ObservedObject private var sharedMainViewModel = SharedMainViewModel.shared
|
||||
|
||||
var contactManager = ContactsManager.shared
|
||||
var magicSearch = MagicSearchSingleton.shared
|
||||
|
|
@ -543,6 +544,9 @@ struct ContentView: View {
|
|||
historyListViewModel.removeCallLogs()
|
||||
self.isShowDeleteAllHistoryPopup.toggle()
|
||||
historyViewModel.displayedCall = nil
|
||||
|
||||
ToastViewModel.shared.toastMessage = "Success_remove_call_logs"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
})
|
||||
.background(.black.opacity(0.65))
|
||||
.zIndex(3)
|
||||
|
|
@ -580,6 +584,11 @@ struct ContentView: View {
|
|||
self.isShowDismissPopup.toggle()
|
||||
}
|
||||
}
|
||||
|
||||
//if sharedMainViewModel.displayToast {
|
||||
ToastView()
|
||||
.zIndex(3)
|
||||
//}
|
||||
}
|
||||
}
|
||||
.overlay {
|
||||
|
|
|
|||
|
|
@ -19,31 +19,21 @@
|
|||
|
||||
import SwiftUI
|
||||
|
||||
struct ToastView: ViewModifier {
|
||||
struct ToastView: View {
|
||||
|
||||
@ObservedObject private var sharedMainViewModel = SharedMainViewModel.shared
|
||||
@ObservedObject private var toastViewModel = ToastViewModel.shared
|
||||
|
||||
@Binding var isShowing: String
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
ZStack {
|
||||
content
|
||||
toastView
|
||||
.padding(.top, 60)
|
||||
}
|
||||
}
|
||||
|
||||
private var toastView: some View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
if !isShowing.isEmpty {
|
||||
if toastViewModel.displayToast {
|
||||
HStack {
|
||||
Image(isShowing.contains("Success") ? "check" : "warning-circle")
|
||||
Image(toastViewModel.toastMessage.contains("Success") ? "check" : "warning-circle")
|
||||
.resizable()
|
||||
.renderingMode(.template)
|
||||
.frame(width: 25, height: 25, alignment: .leading)
|
||||
.foregroundStyle(isShowing.contains("Success") ? Color.greenSuccess500 : Color.redDanger500)
|
||||
.foregroundStyle(toastViewModel.toastMessage.contains("Success") ? Color.greenSuccess500 : Color.redDanger500)
|
||||
|
||||
switch isShowing {
|
||||
switch toastViewModel.toastMessage {
|
||||
case "Successful":
|
||||
Text("QR code validated!")
|
||||
.multilineTextAlignment(.center)
|
||||
|
|
@ -100,29 +90,30 @@ struct ToastView: ViewModifier {
|
|||
.overlay(
|
||||
RoundedRectangle(cornerRadius: 50)
|
||||
.inset(by: 0.5)
|
||||
.stroke(isShowing.contains("Success") ? Color.greenSuccess500 : Color.redDanger500, lineWidth: 1)
|
||||
.stroke(toastViewModel.toastMessage.contains("Success") ? Color.greenSuccess500 : Color.redDanger500, lineWidth: 1)
|
||||
)
|
||||
.onTapGesture {
|
||||
isShowing = ""
|
||||
withAnimation {
|
||||
toastViewModel.toastMessage = ""
|
||||
toastViewModel.displayToast = false
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
|
||||
isShowing = ""
|
||||
withAnimation {
|
||||
toastViewModel.toastMessage = ""
|
||||
toastViewModel.displayToast = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Spacer()
|
||||
}
|
||||
Spacer()
|
||||
}
|
||||
.frame(maxWidth: sharedMainViewModel.maxWidth)
|
||||
.frame(maxWidth: SharedMainViewModel.shared.maxWidth)
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.bottom, 18)
|
||||
.animation(.linear(duration: 0.3), value: isShowing)
|
||||
.transition(.opacity)
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
func toast(isShowing: Binding<String>) -> some View {
|
||||
self.modifier(ToastView(isShowing: isShowing))
|
||||
.transition(.move(edge: .top))
|
||||
.padding(.top, 60)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,7 +132,9 @@ struct HistoryContactFragment: View {
|
|||
)
|
||||
}
|
||||
|
||||
sharedMainViewModel.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
|
||||
} label: {
|
||||
HStack {
|
||||
Text("Copy SIP address")
|
||||
|
|
|
|||
|
|
@ -164,7 +164,8 @@ struct HistoryListBottomSheet: View {
|
|||
dismiss()
|
||||
}
|
||||
|
||||
sharedMainViewModel.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.toastMessage = "Success_copied_into_clipboard"
|
||||
ToastViewModel.shared.displayToast.toggle()
|
||||
|
||||
} label: {
|
||||
HStack {
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ struct HistoryView: View {
|
|||
)
|
||||
|
||||
Button {
|
||||
SharedMainViewModel.shared.toastMessage = "Success_remove_call_logs"
|
||||
} label: {
|
||||
Image("phone-plus")
|
||||
.padding()
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ class SharedMainViewModel: ObservableObject {
|
|||
|
||||
static let shared = SharedMainViewModel()
|
||||
|
||||
@Published var toastMessage: String = ""
|
||||
|
||||
@Published var welcomeViewDisplayed = false
|
||||
@Published var generalTermsAccepted = false
|
||||
@Published var displayProfileMode = false
|
||||
|
|
|
|||
19
Linphone/UI/Main/Viewmodel/ToastViewModel.swift
Normal file
19
Linphone/UI/Main/Viewmodel/ToastViewModel.swift
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// ToastViewModel.swift
|
||||
// Linphone
|
||||
//
|
||||
// Created by Benoît Martins on 20/11/2023.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class ToastViewModel: ObservableObject {
|
||||
|
||||
static let shared = ToastViewModel()
|
||||
|
||||
var toastMessage: String = ""
|
||||
@Published var displayToast = false
|
||||
|
||||
private init() {
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue