Codemaru 1.0.0.0
QR 코드, 모바일 랜딩 페이지, vCard 연락처 저장과 명함 디자인을 한 화면에서 제공하는 디지털 명함 서비스입니다.
로딩중...
검색중...
일치하는것 없음
MainWindowViewModel.cs
이 파일의 문서화 페이지로 가기
3using Dreamine.MVVM.Attributes;
4using Dreamine.MVVM.ViewModels;
5using System.Collections.ObjectModel;
6using System.Windows;
7
8namespace Codemaru.ViewModels;
9
18public sealed partial class MainWindowViewModel : ViewModelBase, IDisposable
19{
28 private readonly CardHybridSession _session;
46 private bool _disposed;
47
56 [DreamineProperty] private string _title = "Codemaru";
65 [DreamineProperty] private string _brand = string.Empty;
74 [DreamineProperty] private string _ownerName = string.Empty;
83 [DreamineProperty] private string _landingUrl = string.Empty;
92 [DreamineProperty] private string _currentUser = "Guest";
101 [DreamineProperty] private string _statusMessage = "명함 랜딩 페이지 준비 중";
110 [DreamineProperty] private int _historyCount;
119 [DreamineProperty] private ObservableCollection<string> _logs = new();
120
130
164 {
165 _session = session ?? throw new ArgumentNullException(nameof(session));
166 _certificateMonitor = certificateMonitor ?? throw new ArgumentNullException(nameof(certificateMonitor));
167 _session.StateChanged += OnSessionChanged;
168 ApplyState(_session.State);
169 Logs.Add($"[{DateTime.Now:HH:mm:ss}] CardHybrid started");
170 }
171
196 private void OnSessionChanged(object? sender, CardHybridState state)
197 {
198 _ = RunOnUiAsync(() => ApplyState(state));
199 }
200
217 private void ApplyState(CardHybridState state)
218 {
219 Brand = state.Profile.Brand;
220 OwnerName = state.Profile.Name;
221 LandingUrl = state.Profile.LandingUrl;
222 CurrentUser = "Guest";
223 HistoryCount = state.History.Count;
224 StatusMessage = $"{state.Profile.Name} / {state.Profile.Role}";
225 Logs.Add($"[{DateTime.Now:HH:mm:ss}] {state.Profile.LandingSlug} updated, history {HistoryCount}");
226 }
227
252 private static Task RunOnUiAsync(Action action)
253 {
254 if (Application.Current?.Dispatcher is not { } dispatcher)
255 {
256 action();
257 return Task.CompletedTask;
258 }
259
260 if (dispatcher.CheckAccess())
261 {
262 action();
263 return Task.CompletedTask;
264 }
265
266 return dispatcher.InvokeAsync(action).Task;
267 }
268
277 public void Dispose()
278 {
279 if (_disposed)
280 {
281 return;
282 }
283
284 _session.StateChanged -= OnSessionChanged;
285 _disposed = true;
286 GC.SuppressFinalize(this);
287 }
288}
readonly CertificateMonitorViewModel _certificateMonitor
void OnSessionChanged(object? sender, CardHybridState state)
MainWindowViewModel(CardHybridSession session, CertificateMonitorViewModel certificateMonitor)
CertificateMonitorViewModel CertificateMonitor