WeddingThankYou 1.0.0.0
결혼식 이후 감사 인사와 사진, 계좌 안내, 연락처를 모바일 페이지로 전달하는 감사장 서비스입니다.
로딩중...
검색중...
일치하는것 없음
GuestbookViewModel.cs
이 파일의 문서화 페이지로 가기
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading;
5using System.Threading.Tasks;
8
10{
19 public sealed class GuestbookViewModel
20 {
29 private readonly IGuestbookStorage _storage;
38 private List<GuestbookEntry> _entries = new();
39
56 public GuestbookViewModel(IGuestbookStorage storage) => _storage = storage;
57
66 public string Name { get; set; } = string.Empty;
67
76 public string Contact { get; set; } = string.Empty;
77
86 public string Message { get; set; } = string.Empty;
87
96 private static readonly string[] DefaultMessages =
97 {
98 "💖 두 분의 앞날에 사랑과 행복이 가득하시길 바랍니다 ✨",
99 "🎉 결혼을 진심으로 축하드립니다! 영원히 함께하세요 💍",
100 "🌸 오늘의 약속이 평생의 기쁨으로 이어지길 바랍니다 💕",
101 "🕊️ 늘 서로를 아끼고 존중하며 행복한 가정을 꾸리시길 🙏",
102 "🌈 두 분의 미래가 언제나 밝고 빛나길 바랍니다 ✨"
103 };
104
114 {
115 if (string.IsNullOrEmpty(Message))
116 Message = DefaultMessages[Random.Shared.Next(DefaultMessages.Length)];
117 }
118
127 public string LastStatus { get; private set; } = string.Empty;
128
137 public bool IsSaving { get; private set; }
138
147 public IReadOnlyList<GuestbookEntryView> EntriesView =>
148 _entries.OrderByDescending(e => e.CreatedLocal)
149 .Select(e => new GuestbookEntryView { Name = e.Name, Message = e.Message, CreatedLocal = e.CreatedLocal })
150 .ToList();
151
184 public async Task InitializeAsync(string slug, CancellationToken ct = default)
185 {
186 try
187 {
188 var list = await _storage.LoadAsync(slug, ct).ConfigureAwait(false);
189 _entries = list.ToList();
190 LastStatus = string.Empty;
191 }
192 catch { LastStatus = "방명록 데이터를 불러오는 중 오류가 발생했어요."; }
193 }
194
227 public async Task AddEntryAsync(string slug, CancellationToken ct = default)
228 {
229 if (IsSaving) return;
230 if (string.IsNullOrWhiteSpace(Name)) { LastStatus = "이름을 입력해주세요."; return; }
231 if (string.IsNullOrWhiteSpace(Message)) { LastStatus = "메시지를 입력해주세요."; return; }
232
233 var entry = new GuestbookEntry
234 {
235 Name = Name.Trim(),
236 Contact = Contact?.Trim() ?? string.Empty,
237 Message = Message.Trim(),
238 CreatedLocal = DateTime.Now
239 };
240
241 IsSaving = true;
242 try
243 {
244 var updated = new List<GuestbookEntry> { entry };
245 updated.AddRange(_entries);
246 await _storage.SaveAsync(slug, updated, ct).ConfigureAwait(false);
247 _entries = updated;
248 Name = string.Empty;
249 Contact = string.Empty;
250 Message = string.Empty;
251 LastStatus = "저장되었습니다. 감사합니다 🙏";
252 }
253 catch { LastStatus = "저장 중 오류가 발생했어요."; }
254 finally { IsSaving = false; }
255 }
256
289 public async Task ReloadAsync(string slug, CancellationToken ct = default)
290 {
291 try
292 {
293 var list = await _storage.LoadAsync(slug, ct).ConfigureAwait(false);
294 _entries = list.ToList();
295 LastStatus = "새로고침 완료";
296 }
297 catch { LastStatus = "새로고침 중 오류가 발생했어요."; }
298 }
299 }
300
309 public sealed class GuestbookEntryView
310 {
319 public string Name { get; init; } = string.Empty;
328 public string Message { get; init; } = string.Empty;
337 public DateTime CreatedLocal { get; init; }
338 }
339}
async Task ReloadAsync(string slug, CancellationToken ct=default)
IReadOnlyList< GuestbookEntryView > EntriesView
async Task InitializeAsync(string slug, CancellationToken ct=default)
async Task AddEntryAsync(string slug, CancellationToken ct=default)