برای ایجاد یه تجربه کاربری بهتر زمان استفاده از اپلیکیشن ثبت تراکنش های مالی کوئرا، قراره ساختاری رو پیاده سازی کنیم تا کاربر در هر دو حالت آنلاین و آفلاین امکان استفاده از اپلیکیشن رو داشته باشه و حتی در صورت آفلاین بودن، اختلالی در روند کار به وجود نیاد.
ظاهر کلی برنامه به شکل زیر است:
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
فایل دانلود شده را از حالت فشرده خارج و دستور npm install
را در root
پروژه اجرا کنید.
همچنین برای هاست پروژه به صورت لوکال، میتوانید از دستور npm start
استفاده کنید.
برای راه اندازی سرویس json server، میتوانید از دستور npm run db
استفاده کنید.
نحوه عملکرد این برنامه به این شکل خواهد بود که در ابتدا دادهها (تراکنش های مالی) از سمت یک سرویس دریافت خواهد شد (تابع getServerTransactions
). علاوه بر نمایش دادههای دریافت شده، این اطلاعات باید در حافظه کش مرورگر (با استفاده از service workers) ذخیره شود.
بعد از ثبت هر تراکنش در حالت آنلاین (ارسال به json server
با تابع sendTransactionToServer
)، باید دادههای داخل حافظه cache
هم به بروز شوند و آخرین تراکنش ثبت شده به لیست اطلاعات قبلی داخل cache
اضافه شود.
همچنین در حالت آفلاین باید همچنان دادهها قابل نمایش باشند و در این حالت تراکنش جدید باید به store
تعریف شده با نام (transactions
) در indexedDB
اضافه شود و همچنین نیازی به بروز شدن حافظه cache
نخواهد بود. دقت شود که در حالت آفلاین باید اطلاعات ذخیره شده در cache
همراه با دادههای indexedDB
همزمان نمایش داده شوند.
در نهایت بعد از اتصال مجدد شبکه و دسترسی به اینترنت باید داده های indexedDB
بررسی شود و در صورتی که تراکنشی تکراری وجود نداشت عملیات sync
آغاز شود و اطلاعات ذخیره شده در مروگر به سمت سرور (json server
) ارسال و ذخیره شود و همچنین اطلاعات داخل indexedDB
به طور کامل حذف شوند.
input
ها دریافت و ذخیره شود و در نهایت در صورت کلیک روی دکمه Add
توسط تابع مشخص شده به کامپوننت TransactionsList
ارسال شود. cache
شده مجدد با تراکنش جدید بروز خواهد شد. و در صورت آفلاین بودن اپلیکیشن مقدار تراکنش جدید باید به صورت یک ردیف جدید توسط تابع saveDBTransaction
در یک store
با نام transactions
در indexedDB
ذخیره شود.تابع loadTransactions وظیفه دریافت اطلاعات جهت نمایش را خواهد داشت که در صورت آنلاین بودن داده از تابع getServerTransactions
دریافت خواهند شد و همچنین در زمان آفلاین بود با استفاده از تابع getDBTransactions
اطلاعات جهت نمایش دریافت میشود (در صورت نیاز امکان دریافت همزمان از هر دو تابع خواهد بود).
تابع syncTransactions وظیفه sync
کردن اطلاعات ذخیره شده در indexedDB
با اطلاعات سمت سرور (json server
) را خواهد داشت، به شکلی که باید جلوی ثبت اطلاعات تکراری گرفته شود. همچنین بعد از sync
شدن، اطلاعات باید اطلاعات داخل indexedDB
حذف شوند.
تابع getServerTransactions وظیفه دریافت اطلاعات از سمت سرور (json server
) را خواهد داشت، در صورتی که نتیجه موفقیتآمیز بود مقدار داده های دریافتی برگشت داده خواهد شد و در صورت بروز خطا، باید خطایی با عنوان "Failed to fetch" برگشت داده شود.
تابع sendTransactionToServer وظیفه ذخیره یک تراکنش جدید در سرور را خواهد داشت، در صورتی که نتیجه موفقیتآمیز بود، مقدار داده ذخیره شده برگشت داده خواهد شد و در صورت بروز خطا، باید خطایی با عنوان "Failed to save"
برگشت داده شود.
تابع saveDBTransaction از نوع Promise
وظیفه ذخیره اطلاعات تراکنش را در indexedDB
خواهد داشت که در صورت بروز خطا در ثبت باید مقدار "Failed to save"
و در صورت موفقیت آمیز بودن مقدار true
برگشت داده شود.
تابع getDBTransactions از نوع Promise
وظیفه دریافت اطلاعات از indexedDB
را خواهد داشت که در صورت بروز خطا در دریافت اطلاعات باید مقدار "Failed to fetch"
و در صورت موفقیت آمیز بودن داده های دریافتی برگشت داده شود.
تابع deleteDBTransaction از نوع Promise
وظیفه حذف اطلاعات تراکنش از indexedDB
را دارد که در صورت بروز خطا در حذف تراکنش باید مقدار "Failed to delete"
و در صورت موفقیت آمیز بودن مقدار true
برگشت داده شود.
register
و addItemToCache
تکمیل شوند که به ترتیب وظایف ثبت کردن یک service worker و اضافه کردن تراکنش جدید به حافظه cache
مروگر را خواهند داشت.service-worker.js
برای درک بهتر نحوه کار نرمافزار توصیه میشود.amount, description, id
باشد.npm
نیستید.TransactionForm.jsx
، TransactionsList.jsx
، api.js
، indexedDB.js
و serviceWorkerRegistration.js
هستید.