در زبان برنامهنویسی ++C از گزاره goto برای ایجاد تغییر در ترتیب نرمال اجرای برنامه و انتقال کنترل از یک بخش به بخش دیگر برنامه استفاده میشود. در این نوشته به توضیح این ساختار میپردازیم. همچنین در بخش قبلی این سری مقالات آموزش برنامهنویسی ++C با گزاره سوئیچ آشنا شدیم. برای مطالعه بخش قبلی به لینک زیر مراجعه کنید:
ساختار کلی این گزاره به صورت زیر است:
goto label; ... .. ... ... .. ... ... .. ... label: statement; ... .. ...
در ساختار فوق، abel یک شناسه است. وقتی که برنامه با ;goto label مواجه میشود، کنترل برنامه به :label پرش یافته و ادامه کد از آنجا اجرا میشود.

Maximum number of inputs: 10 Enter n1: 2.3 Enter n2: 5.6 Enter n3: -5.6 Average = 3.95
شما میتوانید هر برنامه ++C را بدون استفاده از گزاره goto بنویسید و عدم استفاده از این گزاره نیز عموماً ایده خوبی تلقی میشود.
گزاره goto قدرت پرش از هر نقطه برنامه به نقاط دیگر را در اختیار ما قرار میدهد، اما منطق چنین برنامهای پیچیده و تودرتو خواهد بود. در برنامهنویسی مدرن، گزاره goto یک سازه آسیبرسان نگریسته میشود و رویه برنامهنویسی بدی است. به جای گزاره goto میتوان ازگزارههای break و continue در ++C استفاده کرد. برای مطالعه بخش بعدی این سری مقالات به لینک زیر مراجعه کنید:
انواع گوناگونی از مسائل رنگآمیزی گراف وجود دارد که مساله رنگ کردن راسهای گراف، یکی از محبوبترین و متداولترین آنها به شمار میآید. در این مساله، یک گراف غیر مستقیم و عدد m داده شده است. هدف رنگ کردن راسهای گراف به صورتی است که هیچ دو راس مجاوری، دارای رنگ مشابه نباشند. m تعداد رنگهای داده شده است. باید توجه داشت که در اینجا منظور از رنگآمیزی، تخصیص رنگ به راسهای گراف است. برای حل مساله رنگ آمیزی گراف، الگوریتمهای گوناگونی ارائه شده که «الگوریتم پس گرد» (Backtracking) و «حریصانه» (Greedy) از این جمله هستند. در این مطلب، هدف حل مساله رنگ آمیزی گراف با الگوریتم پس گرد است.
تعداد m رنگ و یک گراف داده شده است. هدف رنگ کردن راسهای این گراف به صورتی است که هیچ دو راس مجاوری دارای یک رنگ مشابه نباشند. ورودی و خروجی مساله، به طور دقیق به شرح زیر هستند.
ورودی:
خروجی:
آرایه [color[V که باید حاوی اعدادی از ۱ تا m باشد. [color[i باید رنگ تخصیص یافته به iاُمین راس را نشان دهد. همچنین، در صورتی که نمیتوان گراف را با m رنگ طبق شرط موجود رنگآمیزی کرد، کد باید مقدار False را بازگرداند. در ادامه، تصویری از یک گراف داده شده که با m=3 رنگ (سفید، سبز، قرمز) رنگآمیزی شده است.

الگوریتم ساده ارائه شده در زیر، همه پیکربندیهای ممکن برای رنگآمیزی گراف را که شروط داده شده در آنها رعایت میشود، در خروجی چاپ میکند.
while there are untried conflagrations
{
generate the next configuration
if no adjacent vertices are colored with same color
{
print this configuration;
}
}به تعداد Vm پیکربندی مختلف از رنگها وجود دارد.
ایده اساسی آن است که رنگها یکی یکی به راسهای مختلف اختصاص پیدا کنند. این کار با شروع از راس صفر (۰) آغاز میشود. پیش از تخصیص رنگ، امکانپذیری تخصیص رنگ بر اساس شرط داده شده بررسی میشود. این کار، با در نظر گرفتن رنگهایی که در حال حاضر به راسهای همسایه تخصیص پیدا کردهاند، صورت میپذیرد. اگر الگوریتم تشخیص دهد که تخصیص یک رنگ مشخص در شرط داده شده صدق میکند، تخصیص رنگ به عنوان بخشی از راهکار انجام میشود. اگر رنگی برای یک راس مشخص پیدا نشود که در شرط مذکور صدق کند، پسگرد انجام و پیغام خطای False صادر میشود.
Solution Exists: Following are the assigned colors 1 2 3 2
منبع: فردارس
در این مقاله نگاهی به شیوه ساخت انیمیشنهای اسکرول سفارشی از صفر تا صد با استفاده از SDK فلاتر خواهیم داشت. فلاتر یک ابزار پرقدرت برای ایجاد اپلیکیشنهای نیتیو موبایل است که به صورتی عالی اجرا میشوند و انعطافپذیری خارقالعادهای در زمینه خلق تجربیات کاربری غنی فراهم میسازد.

اگر به محیط فلاتر دسترسی ندارید به صفحه نصب (+) آن بروید.
در دمویی که در این مقاله میخواهیم بسازیم یک پروژه پیشفرض با استفاده از دستور flutter create ایجاد میکنیم و تنها از کلاسهایی استفاده میکنیم که مستقیماً درون فلاتر وجود دارند و لذا نیاز به افزودن هیچ وابستگی به پروژه نداریم. در اغلب موارد، یک وظیفه (مانند انیمیشن سفارشی) میتواند مستقیماً و بدون نیاز به کتابخانههای اضافی اجرا شود.
ایده اصلی این اپلیکیشن نمونه، ایجاد یک نمای لیستی ساده با چند آیتم است و زمانی که این نما به سمت پایین اسکرول میشود، در پسزمینه یک چرخدنده در جهتهای ساعتگرد یا پادساعتگرد میچرخد. این کار با کمک گرفتن از کنترلر اسکرول روی نمای لیستی و ارسال یک پسزمینه انیمیشنی به آن صورت میگیرد که یک ویجت سفارشی میسازد که همگام با موقعیت اسکرول به چرخش درمیآید.
کار خود را با فایل اصلی اپلیکیشن یعنی lib/main.dart آغاز میکنیم:
در فایل main.dart، برخی دستورهای ایمپورت برای کامپوننتهای زیر وجود دارند:
کلاس اپلیکیشن اصلی (AnimationDemo) یک اپلیکیشن ابتدایی میسازد که ویجت صفحه اصلی پیشفرض (MyHomePage) را پوشش میدهد. در کلاس MyHomePage یک مشخصه به نام controller_ وجود دارد که به یک وهله جدید از کلاس ScrollController مقداردهی میشود تا در ادامه به هر دو کامپوننت AnimatedBackground و ListView ارسال شود. کامپوننت AnimatedBackground به چرخاندن چرخ رنده در پسزمینه میپردازد و ListView نیز لیست اسکرول شونده از آیتمهای دمو را رندر میکند. یک مشخصه به نام cards_ نیز وجود دارد که با لیستی از اشیای Item آغاز میشود که از items.dart ایمپورت شدهاند و لیستی از ویجتهای DemoCard برای رندر شدن در ListView بازگشت میدهد.
نخستین فایل ایمپورت شده که به بررسی آن میپردازیم فایل lib/items.dart است:
کلاس Item ساختمان دادهای را ارائه میکند که همراه با وهلهای از DemoCard ارسال میشود تا در ListView رندر شود. در این مورد چیز خاصی زیادی برای تنظیم به جز یک نام، توضیح (که در حال حاضر در دمو بیاستفاده است)، رنگ و آیکون برای رندر شدن هر آیتم وجود ندارد. لیستی از اشیای آیتمها به عنوان لیستی از محتوای ساده ارائه میشود که درون ListView رندر میشوند.
فایل بعدی که بررسی میکنیم lib/demo-card.dart نام دارد:
کلاس DemoCard در سازنده خود یک آیتم دریافت میکند و یک ویجت کارت بازگشت میدهد که عناصر Text و Icon را رندر میکند که به نمایش نام و آیکون تعریفشده برای هر آیتم میپردازند. برخی استایلبندیهای ساده نیز با استفاده از Shadow ،TextStyle و RoundedRectangleBorder همراه با ارتفاع کارت (که روی 3 تنظیمشده) اعمال میشوند. ویجتهای Column و Row برای گسترش عناصر فرزند روی کارت استفاده میشوند.
ما بهترین بخش کار را برای انتها نگه داشتهایم. بنابراین در این بخش به بررسی فایل lib/animated-bg.dart میپردازیم:
در همان ابتدای فایل، کتابخانه dart:math ایمپورت شده تا به ثابت π دسترسی پیدا کنیم که برای اجرای محاسبات تبدیل چرخشی برای گردش چرخدنده مورد نیاز است. سازنده کلاس AnimatedBackground یک مقدار ScrollController میگیرد که اقدام به اجرای چرخش میکند. مشخصه offset_ در صورتی که کنترلر کلاینتهایی داشته باشد یعنی کنترلر به درستی مقداردهی شده باشد و به یک عنصر اسکرول شنونده واقعی مانند ListView قلاب شده باشد یک آفست بازگشت میدهد و در غیر این صورت مقدار صفر بازمیگرداند. متد build یک AnimatedBuilder بازگشت میدهد که کنترلر را میگیرد و یک OverflowBox میسازد که همراستا با چرخدنده و خارج از صفحه جای میگیرد.
مقادیر 4 و 3 موجب میشوند که چرخدنده در گوشه پایین-چپ دستگاه تست که یک شبیهساز آیفون XR است، قرار گیرند. در عمل مقادیر Alignment باید از مختصات عرض و ارتفاع صفحه دستگاه محاسبه شوند تا مقادیر دقیقی برای قرار گرفتن چرخدنده در موقعیت مطلوب در هر دستگاه به دست آید. با این حال ما در این مثال تلاش کردهایم همه چیز تا حد امکان ساده باشد.
آخرین بخش جایی است که خود انیمیشن در آن اتفاق میافتد و این همان متد استاتیک rotate در کلاس است. این کلاس یک مقدار angle و یک child میگیرد و فرزند به وسیله زاویه مورد نظر به چرخش درمیآید. در این دمو ما میخواهیم که چرخدنده به آرامی حرکت کند و بیشتر به فیزیک واقعی شبیه باشد تا چرخش سریع دیوانهوار که در زمان تعیین مقدار چرخش 1:1 به دست میآید. همچنین میخواهیم چرخدنده در جهت پادساعتگرد بچرخد، گرچه از نظر فیزیکی لیست را به حرکت درمیآورد بنابراین offset را در math.pi ضرب کرده و سپس حاصلضرب را بر 1024- تقسیم میکنیم.
این مقاله و پروژه نمونه صرفاً برخی از قابلیتهایی که فلاتر برای ایجاد تجربیات کاربری متحرک سفارشی ارائه میکنند را نشان دادند. ما با استفاده از تنها چند کلاس ابتدایی و مسیر ساده، یک انیمیشن کامل داریم که یک عنصر کاملاً ملالآور مانند صفحه تنظیمات را به چیزی کاملاً جذاب تبدیل میکند.
این مفاهیم میتوانند برای ایجاد «صفحههای آغازین» (splash screens)، انیمیشنهای بارگذاری، گذار صفحه، جلوههای نوتیفیکیشن یا هر چیز دیگری مورد استفاده قرار گیرند. تقریباً هر چیزی که یک مقدار Double به عنوان آرگومان میگیرد میتواند انیمیت شود و در نتیجه پیادهسازی سرراستی از جلوههای مختلف مانند چرخش در این مثال به دست میآید. همچنین میزان شفافیت، موقعیت و بسیاری مشخصههای دیگر نیز قابل تنظیم هستند.
منبع: فرادرس
فتگوی زنده یک روش پشتیبانی از مشتری است که سابقهای طولانی دارد. این روش سریع و کارآمد است چون در آن هر کارمند میتواند همزمان به مشتریان زیادی کمک بکند. بهترین نکته این است که میتوان در طی فرایند خرید به سریعترین روش ممکن به سؤالهای مشتری پاسخ داد و بدین ترتیب احتمال خرید مشتری بالاتر میرود.
در این مقاله به روش یکپارچهسازی یک گفتگوی زنده در اپلیکیشنهای React میپردازیم. قصد ما این است که شیوه یکپارچه قابلیت گفتگوی زنده در اپلیکیشن ریاکت را بدون نگرانی از نگهداری سرور گفتگو و معماری آن پیادهسازی کنیم. در ادامه تصویری از آن چه قصد داریم بسازیم را مشاهده میکنید.
ما برای راهاندازی بخش گفتگوی اپلیکیشن خود از خدمات CometChat Pro استفاده میکنیم. CometChat Pro یک API ارتباطی قدرتمند است که امکان افزودن قابلیتهای گفتگو را به اپلیکیشن فراهم میسازد. این API با قابلیت یکپارچهسازی آسان و مستندات منظم به شما کمک میکند تا ویژگی گفتگوی زنده را با نوشتن چند خط کد به اپلیکیشن خود اضافه کنید. به این منظور ابتدا باید یک حساب رایگان در این وبسایت (+) بسازید.
ما در این راهنما علاوه بر CometChat از فناوریهای زیر نیز استفاده خواهیم کرد:
پیشنهاد ما این است که تا انتهای این راهنما همراه باشید تا گامبهگام اپلیکیشن مورد نظر خود را بسازیم، اما اگر بیش از این شتاب دارید، میتوانید کد کامل این مقاله را در این صفحه گیتهاب (+) ملاحظه کنید.
چنان که پیشتر گفتیم برای گنجاندن قابلیت گفتگوی زنده در اپلیکیشن از CometChat استفاده میکنیم. با این وجود، پیش از یکپارچهسازی باید ابتدا اپلیکیشن CometChat را بسازیم.
برای ایجاد یک اپلیکیشن CometChat باید به داشبورد CometChat بروید و روی آیکون + کلیک کنید. ما اپلیکیشن خود را react-chat-widget مینامیم، اما شما میتوانید اپلیکیشن خود را با هر نامی که دوست دارید ایجاد کنید.
ما دو نوع کاربر داریم که به گفتگوی ما اتصال مییابند. یک دسته مشتریهایی هستند که ویجت گفتگو را باز میکنند و دیگری کارمندان بخش پشتیبانی هستند که به گفتگو دسترسی مییابند و از طریق داشبورد به پرسوجوها پاسخ میدهند. به طور کلی «کاربر» مفهومی بنیادی در CometChat محسوب میشود.
از آنجا که ما احتمالاً مشتریان زیادی خواهیم داشت، برای هر مشتری که به گفتگو وصل میشود، باید به صورت دینامیک یک کاربر CometChat ایجاد کنیم. با این وجود از آنجا که تنها یک کارمند وجود خواهد داشت، میتوانیم یک Agent را از پیش در داشبورد ایجاد کنیم.
به این منظور در داشبورد به برگه Users بروید و روی Create User کلیک کنید:
برای ID کاربر مقدار ecommerce-agent را وارد کنید و برای نام کارمند نیز مقدار Demo Agent را وارد کنید. اگر قصد دارید از مراحل این راهنما پیروی کنید، از همین نامها استفاده کنید، چون در غیر این صورت در ادامه با مشکل مواجه خواهید شد. ID کاربر را یادداشت کنید، زیرا در ادامه به آن ارجاع خواهیم داد.
پیش از آن که از داشبورد خارج شوید و به کدنویسی بپردازید، باید یک کلید دسترسی کامل CometChat نیز بسازید. در همین صفحه روی برگه API Keys و سپس روی Create API Key کلیک کنید:
ما کلید خود را react-chat-api نامیدهایم، اما نام آن اهمیت چندانی ندارد. کلید API و ID اپلیکیشن خود را نیز مانند ID کاربر در جایی یادداشت کنید، چون در ادامه لازم خواهد شد.
در گام قبلی یک کلید دسترسی کامل ساختیم که میتوانیم از آن برای ایجاد دینامیک CometChat استفاده کنیم. با این که میتوانیم این کار را در سمت کلاینت نیز اجرا کنیم، اما معنی آن این خواهد بود که کلید دسترسی کامل خصوصی خود را در معرض دسترس عموم قرار میدهیم که کار نادرستی است. برای جلوگیری از این مشکل یک سرور اکسپرس میسازیم که شرایط زیر را داشته باشد:
اینک نوبت آغاز کار است. ابتدا یک دایرکتوری خالی جدید برای اپلیکیشن اکسپرس خود ایجاد میکنیم و دستور npm init -y را اجرا میکنیم:
mkdir react-express-chat-widgetcd react-express-chat-widgetnpm init –y
سپس اکسپرس و axios را نصب میکنیم:
npm install express axios
سپس در فایلی به نام server.js کد زیر را وارد میکنیم:
در فایل فوق موارد زیر وجود دارند:
در همین فایل اکنون یک مسیر تعریف میکنیم تا ایجاد کاربران جدید CometChat را مدیریت کنیم. برای ایجاد یک کاربر جدید باید یک درخواست POST را با UID و نام کاربر ارسال کنیم.
در این راهنما، نام یکسانی را برای همه مشتریان به صورت hard-code مینویسیم، یعنی همه مشتریها را «customer» مینامیم، اما UID آنها باید یکتا باشد. برای UID میتوانیم از تابع POST برای ایجاد ID-های یکتا استفاده کنیم.
کد زیر را به فایل server.js اضافه کنید:
زمانی که این مسیر فراخوانی شود، اکسپرس کارهای زیر را انجام میدهد:
ما همچنین یک تابع به نام requestAuthToken میسازیم تا به واکشی کردن توکن احراز هویت کمک کند. سپس در همان فایل یک مسیر احراز هویت میسازیم که آن را برای ایجاد توکن جهت کاربران بازگشتی فراخوانی خواهیم کرد:
در نهایت یک تابع برای بازگشت لیستی از کاربران ایجاد کرده و agent یا همان کارمند پشتیبانی را از آن حذف میکنیم. ما این endpoint را متعاقباً از داشبورد فراخوانی میکنیم تا لیستی از کاربران را که agent میتواند با آنها صحبت کند نمایش دهیم. البته کارمند ما نمیتواند با خودش صحبت کند و از این رو خودش را از لیست فیلتر میکنیم:
در انتهای فایل server.js، سرور را اجرا میکنیم:
اگر از ابتدای این مقاله با ما همگام بوده باشید، اینک فایل Server.js باید به صورت زیر در آمده باشد:
در یک پنجره ترمینال دستور node server.js را اجرا کنید و منتظر باشید تا پیامی به صورت زیر نمایش یابد:
Listening on port 5000
اکنون باید زمان مناسبی برای تست endpoint-ها به همراه curl یا Postman باشد تا مطمئن شویم که کار میکنند و سپس به بخش کدنویسی کلاینت بپردازیم.
درون دایرکتوری خود دستور npx create-react-app را اجرا کنید تا ساختار اولیه یک اپلیکیشن ریاکت ایجاد شود:
npx create-react-app client
ساختار پوشه شما اینک باید مانند زیر باشد:
|-- express-react-chat-widget |-- package-lock.json |-- package.json |-- server.js |-- client |--.gitignore |-- package-lock.json |-- package.json |-- public |-- src
زمانی که اپلیکیشن ریاکت آماده شد، به دایرکتوری client بروید و ماژولهای زیر را نصب کنید:
cd clientnpm install @cometchat-pro/chat react-chat-widget react-router-dom bootstrap react-md-spinner
اپلیکیشن Create React برای bootstrap کردن یک اپلیکیشن ریاکت کاملاً مفید است، اما فایلهای زیادی تولید میکند که مورد نیاز ما نیستند و اینها شامل فایلهای تست و از این دست هستند. پیش از اقدام به کدنویسی، همه چیز را از دایرکتوری client/src حذف کنید تا از صفر کار خود را شروع کنیم. برای شروع یک فایل config.js با ID اپلیکیشن و UID کارمند در مسیر client/src/config.js با محتوای زیر بسازید:
این کد مبنایی است که میتوان برای ارجاع به اطلاعات احراز هویت CometChat از هر کجا مورد استفاده قرار داد. با این که ما آن را کد مبنا مینامیم، اما این فرصت را نیز داریم که یک فایل index.css بسازیم:
ما این فایل را در ادامه از داشبورد مورد ارجاع قرار میدهیم. اکنون در فایل با نام index.js کد زیر را درج کنید:
در این کد ما Bootstrap ،CometChat و فایل پیکربندی را که پیش از مقداردهی اولیه CometChat و رندر کردن App ساختهایم ایمپورت میکنیم. اگر در این راهنما با ما همگام بوده باشید، متوجه شدهاید که ما هنوز App را تعریف نکردهایم. بنابراین در این مرحله این کار را انجام میدهیم. در فایل به نام App.js کد زیر را درج کنید:
در این کد ما دو مسیر را تعریف کردیم:
در ادامه ابتدا کامپوننت در دید مشتری را بررسی میکنیم. ما آن را کامپوننت کلاینت مینامیم.
کامپوننت کلاینت ما دو مسئولیت عمده خواهد داشت:
یک فایل به نام Client.js بسازید و کد زیر را در آن درج کنید:
اگر فکر میکنید این کد حجم بالایی دارد جای نگرانی نیست چون در ادامه آن را جزء به جزء توضیح میدهیم.
تابع render به قدر کافی ساده است، در واقع وظیفه اصلی آن رندر کردن react-chat-widget است. بخش زیادی از کد اختصاص به مدیریت پیام جدید ارسالی از سوی مشتری در تابعی به نام handleNewUserMessage دارد.
به طور خلاصه، ابتدا باید بررسی کنیم که آیا UID مشتری در localStorage وجود دارد یا نه. اگر چنین باشد، از این UID برای لاگین کردن کاربر و ارسال پیام استفاده میکنیم. در غیر این صورت تابع ()createUser را فراخوانی میکنیم و از مقدار بازگشتی برای لاگین کردن کاربر استفاده میکنیم. این تابع createUser یک endpoint را فراخوانی میکند که قبلاً در همین راهنما تعریف کردیم.
در نهایت در یک تابع چرخه عمر ریاکت componentWillUnmount را فرا میخوانیم و به خاطر میسپاریم که شنونده پیام را حذف کنیم. پیش از ادامه باید به یک نکته کوچک اشاره کنیم. در کد فوق، به جای وارد کردن URL سرور و پورت آن (localhost:5000/users) یا چیزی مانند آن در فرانتاند، میتوانیم یک گزینه proxy به فایل package.json اضافه کنیم. بدین ترتیب میتوانیم به جای localhost:5000/users// صرفاً از /users استفاده کنیم:
"browserslist": [">0.2%"، "not dead"، "not ie <= 11"، "not op_mini all"]،"proxy": http://localhost:5000
در این مرحله اپلیکیشن مانند زیر خواهد بود:
چنان که مشاهده میکنید، میتوان پیامها را ارسال یا دریافت کرد، اما اگر صفحه را رفرش کنیم، پیامهای گفتگو ناپدید میشوند و این خوب نیست.
برای حل این مشکل یک متد componentDidMount تنظیم میکنیم که به دنبال UID مشتری در localStorage میگردد، به طوری که وقتی مشتریان صفحه را رفرش بکنند، میتوانند گفتگو را از همان جایی که مانده بود ادامه دهند.
زمانی که UID را پیدا کردیم، میتوانیم از آن برای مقداردهی اولیه یک زنجیره از متدها جهت login ،fetch کردن پیامهای قبلی و ایجاد listener برای پیامهای ورودی استفاده کنیم.
اکنون اگر صفحه را رفرش کنیم، اپلیکیشن تلاش خواهد کرد در CometChat لاگین کند و پیامهای قبلی را به صورت خودکار با گشتن به دنبال UID مشتری در localStorage بارگذاری کند و این وضعیت مناسبی محسوب میشود.
اما همچنان مشکل کوچکی وجود دارد. چنان که مشخص شد، هنوز راهی برای کارمند پشتیبانی وجود ندارد که به پیام مشتری پاسخ دهد. ما این مشکل را از طریق ساختن داشبورد کارمند حل میکنیم. در این حالت کارمند میتواند به پیامهای گفتگو که از سوی مشتریان میرسند پاسخ دهد. بدن ترتیب کار ما در فایل Client.js به پایان میرسد و در ادامه به ساخت فایل Agent.js میپردازیم.
کارکرد اصلی داشبورد agent دریافت همه مشتریان از CometChat Pro و نمایش تمام پیامهای ورودی از مشتریان جدید در لیست گفتگوی مشتریان کارمند است تا بتواند روی آنها کلیک کرده و پاسخ دهد. در واقع کارکرد اصلی بسیار شبیه به کلاینت است.
هنگام استفاده از CometChat بهراحتی میتوان چندین کارمند ایجاد کرد، اما برای این که همه چیز ساده بماند و درگیر مدیریت کاربر نشویم، در این راهنما از یک کارمند (agent) استفاده میکنیم که قبلاً آن را ایجاد کردهایم. یک کامپوننت به نام Agent.js ایجاد کنید و حالت اولیه آن را به صورت زیر تعیین کنید:
در همان فایل، یک متد به نام componentDidMount ایجاد کنید:
در کد فوق کارهای زیادی انجام مییابند. در ادامه آنها را به اختصار مرور میکنیم.
احتمالاً به خاطر دارید که API اکسپرس را قبلاً برای دریافت لیستی از کاربران ثبت نام کرده ساختیم. از این API برای تشکیل لیستی از کاربران در سمت چپ داشبورد استفاده میکنیم. این لیست را با استفاده از ترکیب کلاسهای بوتاسترپ و فایل index.css که قبلاً تعریف کردیم، در سمت چپ داشبورد قرار میدهیم.
سپس یک تابع رندر میسازیم. این تابع اینترفیس گفتگو را رندر میکند و آن را با استفاده از بوتاسترپ استایلدهی میکند. برای این که خواندن کد آسانتر شود، CustomerList و ChatBox را در کامپوننتهای خاص خود قرار میدهیم که میتوانند در فایل یکسانی تعریف شوند:
بدین ترتیب مبنایی برای UI ایجاد میشود، اما هنوز امکان ارسال پیام وجود ندارد. برای ارسال پیامها باید یک دستگیره برای مواردی که کارمند یک پیام جدید را تحویل میدهد داشته باشیم. شیوه ارسال پیامها اینک باید برای شما روشن باشد، زیرا از همان فراخوانی sendMessage که در سمت کلاینت استفاده کردیم بهره بخواهیم گرفت.
همچنین میخواهیم کارمند را قادر سازیم تا سوابق پیامها را مانند حالتی که برای مشتری ایجاد کردیم، ببیند:
به خاطر داشته باشید که شنونده پیام را در زمان حذف کامپوننت پاک کنید:
محصول نهایی به صورت زیر خواهد بود:
اگر کنجکاو هستید که کاربران Superhero از کجا میآیند باید اشاره کنیم که این کاربران به صورت خودکار از سوی CometChat Pro در زمان ایجاد اپلیکیشن جدید ایجاد میشوند. پیش از استفاده عملیاتی از اپلیکیشن حتماً آنها را حذف کنید.
اکنون کارمند پشتیبانی و مشتریان آماده گفتگو با همدیگر هستند. شما میتوانید Client Home و Agent Dashboard را در پنجرههای جداگانهای باز کرده و این موضوع را بررسی کنید.
بدین ترتیب ما موفق شدیم ویجت گفتگوی زنده کاملاً اختصاصی خود را برای اپلیکیشن React در زمانی بسیار کوتاه بسازیم. در واقع، CometChat Pro به ما امکان میدهد که پیامها را با نوشتن تنها چند خط کد ارسال و دریافت کنیم. بدین ترتیب دیگر نیاز به راهاندازی سرور گفتگوی شخصی و معماری آن وجود ندارد. البته این سرویس قابلیتهای بسیار بیشتری از ساخت یک ویجت گفتگو دارد که بررسی همه آنها از حیطه این مقاله خارج است.