Skip to content

Commit

Permalink
add button change currency and sheet change currency
Browse files Browse the repository at this point in the history
  • Loading branch information
Uwi0 committed Jan 17, 2025
1 parent d08cb8d commit e6d2f9e
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -184,23 +184,7 @@ private fun SettingsScreen(uiState: SettingsState, onEvent: (SettingsEvent) -> U
.padding(vertical = 24.dp, horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
CustomOutlinedButton(
modifier = Modifier.fillMaxWidth(),
contentPadding = PaddingValues(16.dp),
onClick = { onEvent.invoke(SettingsEvent.OnSheet(shown = true)) }
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(Icons.Outlined.Payments, contentDescription = null)
Text("Set Currency")
Spacer(modifier = Modifier.weight(1f))
Text(uiState.currency.name)
Icon(Icons.AutoMirrored.Sharp.ArrowForwardIos, contentDescription = null)
}
}
ChangeCurrencyButtonView(onEvent, uiState)
ThemeButtonView(
theme = uiState.themeMode,
onClick = { onEvent.invoke(SettingsEvent.OnDialog(shown = true)) }
Expand All @@ -221,6 +205,30 @@ private fun SettingsScreen(uiState: SettingsState, onEvent: (SettingsEvent) -> U
)
}

@Composable
private fun ChangeCurrencyButtonView(
onEvent: (SettingsEvent) -> Unit,
uiState: SettingsState
) {
CustomOutlinedButton(
modifier = Modifier.fillMaxWidth(),
contentPadding = PaddingValues(16.dp),
onClick = { onEvent.invoke(SettingsEvent.OnSheet(shown = true)) }
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(Icons.Outlined.Payments, contentDescription = null)
Text("Set Currency")
Spacer(modifier = Modifier.weight(1f))
Text(uiState.currency.name)
Icon(Icons.AutoMirrored.Sharp.ArrowForwardIos, contentDescription = null)
}
}
}

@Composable
private fun ThemeButtonView(theme: Theme, onClick: () -> Unit) {
Surface(onClick = onClick) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ struct OutlinedContentButtonView<Content: View>: View {

var body: some View {
Button(action: onClick) {
HStack(alignment: .center) {
HStack(alignment: .center, spacing: 16) {
content.font(Typography.titleMedium)
.foregroundStyle(ColorTheme.primary)
}
Expand Down
6 changes: 5 additions & 1 deletion iosApp/iosApp/screen/onBoarding/OnBoardingScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ struct OnBoardingScreen: View {
switch content {
case .account: AccountContentView(onEvent: viewModel.handle(event:))
case .importBackup: ImportBackupContentView(onEvent: viewModel.handle(event:))
case .selectCurrency: SelectCurrencyContentView(onEvent: viewModel.handle(event:))
case .selectCurrency: SelectCurrencyContentView(
onConfirm: { selectedCurrency in
viewModel.handle(event: .OnConfirmCurrency(currency: selectedCurrency))
}
)
case .createWallet: CreateWalletContentView(onEvent: viewModel.handle(event:))
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@ import Shared

struct SelectCurrencyContentView: View {

let onEvent: (OnBoardingEvent) -> Void
let onConfirm: (Currency) -> Void

@State private var query: String = ""
@State private var selectedCurrency: Currency = .idr
@State private var selectedCurrency: Currency
private var currencies: [Currency] {
Currency.allCases.filter { currency in
query.isEmpty || currency.countryName.lowercased().contains(query.lowercased())
}
}

init(onConfirm: @escaping (Currency) -> Void, currency: Currency = .idr) {
self.onConfirm = onConfirm
_selectedCurrency = State(initialValue: currency)
}

var body: some View {
VStack {
TopAppBar()
Expand All @@ -24,7 +29,7 @@ struct SelectCurrencyContentView: View {
.scrollIndicators(.hidden)
FilledButtonView(
text: "Confirm Currency",
onClick: { onEvent(.OnConfirmCurrency(currency: selectedCurrency))}
onClick: { onConfirm(selectedCurrency)}
)
.frame(height: 48)
.padding(.horizontal, 16)
Expand Down Expand Up @@ -74,5 +79,5 @@ struct SelectCurrencyContentView: View {
}

#Preview {
SelectCurrencyContentView(onEvent: { _ in })
SelectCurrencyContentView(onConfirm: { _ in })
}
39 changes: 35 additions & 4 deletions iosApp/iosApp/screen/settings/SettingsScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ struct SettingsScreen: View {
@StateObject private var viewModel: SettingsViewModel = SettingsViewModel()
@AppStorage(UserDefaultsKeys.isDarkMode) private var darkAppearance: Bool = false
@State private var viewController: UIViewController?
@State private var isPresented: Bool = false
@State private var isFileImportedPresented: Bool = false
@State private var isSheetPresented: Bool = false

var body: some View {
VStack {

NavigationBar()
VStack {
ButtonCurrencyView()
Toggle("Dark Appearance", isOn: $darkAppearance)
Divider()
ButtonSettingsView(
Expand All @@ -23,7 +26,7 @@ struct SettingsScreen: View {
ButtonSettingsView(
title: "Import Data",
iconName: "square.and.arrow.down",
onClick: { isPresented = true }
onClick: { isFileImportedPresented = true }
)
Spacer()
}
Expand All @@ -35,7 +38,7 @@ struct SettingsScreen: View {
.background(ViewControllerAccessor { vc in viewController = vc} )
.onChange(of: viewModel.uiEffect) { observe(effect: viewModel.uiEffect) }
.fileImporter(
isPresented: $isPresented,
isPresented: $isFileImportedPresented,
allowedContentTypes: [.json],
onCompletion: { result in
switch result {
Expand All @@ -44,15 +47,39 @@ struct SettingsScreen: View {
}
}
)
.sheet(isPresented: $isSheetPresented) {
SelectCurrencyContentView(
onConfirm: { selectedCurrency in
viewModel.handle(event: .ChangeCurrency(currency: selectedCurrency))
},
currency: viewModel.uiState.currentCurrency
)
}

}

@ViewBuilder private func NavigationBar() -> some View {
@ViewBuilder
private func NavigationBar() -> some View {
VStack {
NavigationTopAppbar(title: "Settings", navigateBack: { navigation.navigateBack() })
Divider()
}
}

@ViewBuilder
private func ButtonCurrencyView() -> some View {
OutlinedContentButtonView(
onClick: { isSheetPresented = true },
content: {
Image(systemName: "dollarsign.circle").resizable().frame(width: 24, height: 24)
Text("Set Currency")
Spacer()
Text("\(viewModel.uiState.currentCurrency.name)")
Image(systemName: "chevron.right")
}
)
}

private func observe(effect: SettingsEffect?) {
if let safeEffect = effect {
switch onEnum(of: safeEffect) {
Expand Down Expand Up @@ -92,3 +119,7 @@ struct SettingsScreen: View {
}
}
}

#Preview {
SettingsScreen()
}
12 changes: 12 additions & 0 deletions iosApp/iosApp/viewModel/settings/SettingsState.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Foundation
import Shared

struct SettingsState {
var currentCurrency: Currency = .idr

init(){}

init(state: SettingsStateKt){
self.currentCurrency = state.currency
}
}
18 changes: 18 additions & 0 deletions iosApp/iosApp/viewModel/settings/SettingsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,37 @@ import KMPNativeCoroutinesCombine

final class SettingsViewModel: ObservableObject {

@Published var uiState: SettingsState = SettingsState()
@Published var uiEffect: SettingsEffect?

private let viewModel: SettingsViewModelKt = Koin.shared.get()
private var stateCancellable: AnyCancellable?
private var effectCancellable: AnyCancellable?

init() {
observeState()
observeEffect()
}

func handle(event: SettingsEvent) {
viewModel.handleEvent(event: event)
}

private func observeState() {
let publisher = createPublisher(for: viewModel.uiStateFlow)
stateCancellable = publisher.sink { completion in
print("Completion: \(completion)")
} receiveValue: { [weak self] state in
self?.update(state: state)
}
}

private func update(state: SettingsStateKt) {
DispatchQueue.main.async {
self.uiState = SettingsState(state: state)
}
}

private func observeEffect() {
let publisher = createPublisher(for: viewModel.uiEffect)
effectCancellable = publisher.sink { completion in
Expand Down

0 comments on commit e6d2f9e

Please sign in to comment.