برای ایجاد یه تجربه کاربری بهتر زمان استفاده از اپلیکیشن ثبت تراکنش های مالی کوئرا، قراره ساختاری رو پیاده سازی کنیم تا کاربر در هر دو حالت آنلاین و آفلاین امکان استفاده از اپلیکیشن رو داشته باشه و حتی در صورت آفلاین بودن، اختلالی در روند کار به وجود نیاد.
ظاهر کلی برنامه به شکل زیر است:
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
Finance
├── public
│ ├── index.html
│ └── service-worker.js
├── src
│ ├── assets
│ │ └── logo.svg
│ ├── components
│ │ ├── TransactionForm.js
│ │ └── TransactionsList.js
│ ├── App.js
│ ├── api.js
│ ├── index.js
│ ├── indexedDB.js
│ ├── serviceWorkerRegistration.js
├── db.json
راهاندازی پروژه
فایل دانلود شده را از حالت فشرده خارج و دستور 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
به طور کامل حذف شوند.
کامپوننت TransactionForm
- این کامپوننت باید به شکلی تکمیل شود که اطلاعات وارد شده از
input
ها دریافت و ذخیره شود و در نهایت در صورت کلیک روی دکمهAdd
توسط تابع مشخص شده به کامپوننتTransactionsList
ارسال شود.
کامپوننت TransactionsList
-
تابع handleAddTransaction برای ثبت یک تراکنش جدید استفاده خواهد شد، به شکلی که در صورت آنلاین بودن یک درخواست سمت سرور ارسال میشود و همچنین بعد از موفق بودن درخواست مقدار داده های
cache
شده مجدد با تراکنش جدید بروز خواهد شد. و در صورت آفلاین بودن اپلیکیشن مقدار تراکنش جدید باید به صورت یک ردیف جدید توسط تابعsaveDBTransaction
در یکstore
با نامtransactions
درindexedDB
ذخیره شود. -
تابع loadTransactions وظیفه دریافت اطلاعات جهت نمایش را خواهد داشت که در صورت آنلاین بودن داده از تابع
getServerTransactions
دریافت خواهند شد و همچنین در زمان آفلاین بود با استفاده از تابعgetDBTransactions
اطلاعات جهت نمایش دریافت میشود (در صورت نیاز امکان دریافت همزمان از هر دو تابع خواهد بود). -
تابع syncTransactions وظیفه
sync
کردن اطلاعات ذخیره شده درindexedDB
با اطلاعات سمت سرور (json server
) را خواهد داشت، به شکلی که باید جلوی ثبت اطلاعات تکراری گرفته شود. همچنین بعد ازsync
شدن، اطلاعات باید اطلاعات داخلindexedDB
حذف شوند.
فایل api
-
تابع getServerTransactions وظیفه دریافت اطلاعات از سمت سرور (
json server
) را خواهد داشت، در صورتی که نتیجه موفقیتآمیز بود مقدار داده های دریافتی برگشت داده خواهد شد و در صورت بروز خطا، باید خطایی با عنوان "Failed to fetch" برگشت داده شود. -
تابع sendTransactionToServer وظیفه ذخیره یک تراکنش جدید در سرور را خواهد داشت، در صورتی که نتیجه موفقیتآمیز بود، مقدار داده ذخیره شده برگشت داده خواهد شد و در صورت بروز خطا، باید خطایی با عنوان
"Failed to save"
برگشت داده شود.
فایل indexedDB
-
تابع saveDBTransaction از نوع
Promise
وظیفه ذخیره اطلاعات تراکنش را درindexedDB
خواهد داشت که در صورت بروز خطا در ثبت باید مقدار"Failed to save"
و در صورت موفقیت آمیز بودن مقدارtrue
برگشت داده شود. -
تابع getDBTransactions از نوع
Promise
وظیفه دریافت اطلاعات ازindexedDB
را خواهد داشت که در صورت بروز خطا در دریافت اطلاعات باید مقدار"Failed to fetch"
و در صورت موفقیت آمیز بودن داده های دریافتی برگشت داده شود. -
تابع deleteDBTransaction از نوع
Promise
وظیفه حذف اطلاعات تراکنش ازindexedDB
را دارد که در صورت بروز خطا در حذف تراکنش باید مقدار"Failed to delete"
و در صورت موفقیت آمیز بودن مقدارtrue
برگشت داده شود.
فایل serviceWorkerRegistration
- قبل از شروع فرآیند تکمیل پروژه بهتر است دو تابع
register
وaddItemToCache
تکمیل شوند که به ترتیب وظایف ثبت کردن یک service worker و اضافه کردن تراکنش جدید به حافظهcache
مروگر را خواهند داشت.
جزئیات
- قبل از شروع فرآیند حل سوال بررسی فایل
service-worker.js
برای درک بهتر نحوه کار نرمافزار توصیه میشود. - دقت شود که زمان ثبت یک تراکنش جدید، باید از ثبت داده های تکراری (تراکنش تکراری از نظر قیمت و توضیحات) جلوگیری شود.
- مقدار تراکنش ذخیره شده باید شامل سه کلید
amount, description, id
باشد.
نکات
- شما مجاز به نصب کتابخانههای خارجی از جمله
npm
نیستید. - شما مجاز به اعمال تغییرات در
TransactionForm.jsx
،TransactionsList.jsx
،api.js
،indexedDB.js
وserviceWorkerRegistration.js
هستید. - میتوانید فایل های خواسته شده را بعد از اعمال تغییرات به صورت ZIP برای ما ارسال کنید.
ارسال پاسخ برای این سؤال