برای ایجاد یه تجربه کاربری بهتر زمان استفاده از اپلیکیشن ثبت تراکنش های مالی کوئرا، قراره ساختاری رو پیاده سازی کنیم تا کاربر در هر دو حالت آنلاین و آفلاین امکان استفاده از اپلیکیشن رو داشته باشه و حتی در صورت آفلاین بودن، اختلالی در روند کار به وجود نیاد.
ظاهر کلی برنامه به شکل زیر است:

پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
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 برای ما ارسال کنید.
ارسال پاسخ برای این سؤال