برنامه نویسی

قدرت تفکر …"من می توانم"

اول از همه ، باید اعتراف کنم که علی رغم سالها تجربه کار در بسیاری از پروژه ها ، یک موانع وجود دارد که من هرگز کاملاً به پایان نرسیدم – ایجاد UI چت خودم. من در گذشته چندین بار این کار را انجام داده ام (بیشتر در زمینه خصوصی من). من گاهی فکر می کردم ، “من فکر می کنم این این است ، این آخر هفته ، من قصد دارم این را ترک کنم و به درستی به نظر برسم.” اما مهم نیست که چه چیزی ، این یکی از آن ویژگی های UI است که هرگز نتوانستم درست شوم.

بعد از سالها تلاش برای این کار ، سرانجام با خودم فکر کردم که شاید هرگز نتوانم این چیز را شکست دهم. بنابراین ، من شروع به ترک آن تلاش کردم … تا امروز.

اضافه کردن یک ویژگی بحث گروهی به صفحه جزئیات تکلیف Aceit

اولین چیزی که من واقعاً می خواهم فتح کنم این بود که آن حباب های چت را به درستی انجام دهم. بنابراین من با حباب چت از سایر فرستنده ها در بحث گروه شروع کردم:

{/* Outermost layout will have a left align by default */}
<div className="flex-grow flex-col p-4 overflow-y-auto">
  {/* Chat bubble from other senders */}
  <div className="flex mb-4">
    <div className="flex items-start mr-4"> 
      {/* The contents of the chat bubble */} 
    </div>
  </div>
</div>

بهترین راه برای دیدن این طرح این است که بیرونی ترین ظرف یک ردیف کامل است که در منطقه گپ گروهی کشیده شده است.

مانند اکثر UI های چت اتاق ، پیام های ورودی همیشه از سمت چپ UI شروع می شوند. و وقتی صحبت از محتویات حباب های چت ما می شود ، می خواهیم اطمینان حاصل کنیم که همه چیز به بالا تراز شده است ، بنابراین ما استفاده می کنیم items-start اینجا

اضافه کردن مطالب به حباب چت ما

{/* Outermost layout will have a left align by default */}
<div className="flex-grow flex-col p-4 overflow-y-auto">
  {/* Chat bubble from other senders */}
  <div className="flex mb-4">
    <div className="flex items-start mr-4"> 
      {/* Next, we add our profile image. */}
      <div className="w-8 h-8 rounded-full overflow-hidden mr-2">
        <Image 
          src="/female-student-chinese.jpg" 
          alt="Profile Picture" 
          width={50} 
          height={50} 
          className="object-cover" 
        />
      </div> 
    </div>
  </div>
</div>

نکته بعدی که ما می خواهیم این است که تصویر نمایه کاربر را درج کنیم. این یکی در اینجا کاملاً ساده است. ما یک تصویر کاملاً گرد می خواهیم و در شروع/سمت چپ حباب چت قرار می گیرد.

بعد ، محتوای پیام خود را اضافه خواهیم کرد.

{/* Outermost layout will have a left align by default */}
<div className="flex-grow flex-col p-4 overflow-y-auto">
  {/* Chat bubble from other senders */}
  <div className="flex mb-4">
    <div className="flex items-start mr-4"> 
      {/* Profile Image here. */}

      <div className="bg-gray-200 rounded-lg p-3 max-w-xs">
        <p className="text-xs font-medium text-gray-800">Agnes Yeo</p> 
        <p className="text-sm">Hey everyone, just wanted to check in and see how the project's coming along!</p>
        <span className="text-xs text-gray-500">Tue 10:15 am</span>
      </div>
    </div>
  </div>
</div>

در مورد حباب پیام کاربر چیست؟

این بسیار ساده است ؛ ما فقط باید چند تغییر ایجاد کنیم. مانند اکثر برنامه های چت خانوادگی ، به عنوان فرستنده/کاربر ، نیازی به نمایش تصویر پروفایل نداریم. بنابراین فقط خود محتوای پیام خواهد بود.

<div className="flex justify-end mb-4">
  <div className="bg-blue-500 text-white rounded-lg p-3 max-w-xs ml-4"> 
    <p className="text-sm">Hey Agnes! I'm making good progress on the research. How's the mood board coming along?</p>
    <span className="text-xs text-gray-100">Tue 10:45 am</span> 
  </div>
</div>

Textarea ما برای تایپ ، ارسال و پیوست کردن چیزها

اساسی ترین ویژگی هر UI چت ، داشتن توانایی تایپ پیام ، ارسال ضربه ، درست است؟ بنابراین ما نمی توانیم بدون آن عملکرد در اینجا انجام دهیم.

{/* Message Input Area */}
<div className="border-t border-gray-300 p-4 bg-white"> 
  {/* Use flex-col for vertical layout */}
  <div className="flex flex-col justify-start">
    {/* Container for textarea and send button */}
    <div className="flex"> 
      <textarea 
        className="flex-grow resize-none border border-gray-400 rounded-md p-2 mr-2 focus:outline-none focus:ring focus:ring-blue-300 bg-gray-100" 
        placeholder="Type your message..."
      ></textarea>
      <button className="flex bg-blue-500 text-white px-4 py-2 rounded-md self-start items-center justify-center ml-2"> 
        Send <SendHorizonal width={20} height={20} className="ml-1" />
      </button>
    </div>
    {/* Attachment button below */}
    <button className="bg-gray-300 rounded-md py-2 px-4 mt-2 flex items-center justify-center w-max"> 
      <Paperclip width={16} height={16} className="mr-1"/> Add Attachments
    </button>
  </div>
</div>

آنچه در اینجا مهم است این است که من انتخاب کرده ام که پیوست را در یک ردیف فلکس جداگانه قرار دهم (از نظر طرح). ایده اولیه قرار دادن آن در داخل متن خیلی خوب کار نکرد. بعلاوه من می خواستم چیزها را ساده نگه دارم و چیزهای بیش از حد را بیان نکنم. بنابراین ، این به نظر می رسد ساده ترین راه حل است.

پس از رسیدن به مراحل اجرای منطق ، یک منوی زمینه را برای دکمه اضافه می کنم. بنابراین دانش آموز را با چند گزینه مانند ضمیمه تصاویر ، فیلم ها ، پرونده ها و پیوندها به دانش آموز ارائه می دهد.

در این مرحله ، من در حال حاضر احساس اعتماد به نفس و صادقانه از خودم دارم. اما احساس کردم چیزی هنوز از دست رفته است.

پیوست های تصویر و روکش های معین … بنابراین ، بیایید مقداری اضافه کنیم !!

<div className="flex justify-end mb-4">
  <div className="bg-blue-500 text-white rounded-lg p-3 max-w-xs ml-4"> 
    {/* Our message content remains here. */}

    {/* Container for attachment previews */}
    <div className="flex flex-row gap-x-2 mt-2"> 
      <div className="w-1/2 relative"> 
        {/* Add "relative" for image overlay */}
        <div className="relative aspect-square overflow-hidden rounded-md">
          <Image 
            src="/sample-wireframes-01.jpg"
            fill={true}
            quality={90}
            alt="Mobile friendly wireframes" 
            className="object-cover w-1/2 aspect-square" 
          />
        </div>
        <div className="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-50 bg-gray-900 rounded-md transition duration-300">
          {/* Expand icon */}
          <Expand className="text-white" size={32} /> 
        </div>
      </div>
      <div className="w-1/2 relative">
        <div className="relative aspect-square overflow-hidden rounded-md"> 
          {/* Image 2 */}
          <Image 
            src="/sample-wireframes-02.jpg"
            alt="Mobile friendly wireframes"
            quality={90}
            fill={true}
            className="object-cover w-1/2 aspect-square" 
          />
        </div>
        <div className="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-50 bg-gray-900 rounded-md transition duration-300">
          {/* Expand icon */}
          <Expand className="text-white" size={32} /> 
        </div>
      </div>
    </div>
    <span className="text-xs text-gray-100">Thu 2:15 pm</span> 
  </div>
</div>

من حذف کردم onClick در حال حاضر کنترل کننده رویداد از قطعه کد. مهمترین جنبه این است که چگونه تصاویر پیوست شده را به پایین پیام گذاشته ام. من اطمینان داده ام که هر کدام نیمی از عرض را در حالی که یک شکل مربع را پر می کنند ، به اشتراک می گذارند. به آن فکر کنید مانند ریز عکسها.

من همچنین شامل <Expand /> نمادهای لوکید. آنها کاملاً با طرح کار کردند. هنگامی که کاربر ماوس تصاویر را روی یک مرورگر دسک تاپ قرار می دهد ، این پوشش به خوبی نشان می دهد.

تنظیم روکش معین ما

در ابتدا ، من سعی کردم این طرح روکش را در پایین بخش قرار دهم ، اما این به نوعی کاملاً درست کار نکرد. بنابراین من تصمیم گرفتم که آن را تمام راه را به بالای صفحه سمت راست منتقل کنم. و اکنون ، کاملاً کار می کند.

{/* Image Modal Overlay */}
{isShowImageModal && (
  <div className="absolute left-0 top-0 w-full h-full z-40 items-center justify-center"
    style={{
      backgroundColor: "#000000AA"
    }}
  >
    {/* Container for image and controls */}
    <div className="relative">  
      {/* Close button */}
      <button className="absolute top-4 right-4 z-50 text-white"> 
        <X size={32} onClick={() => setIsShowImageModal(false)} /> 
      </button>
    </div>

    <div className="w-[90%] h-[90%] opacity-100">
      {/* Left Chevron button */}
      {currModalImage.includes("02") && (
        <button 
          className="absolute top-[50%] left-5 z-50 text-white"
          onClick={() => {
            if (currModalImage.includes("02")) {
              setCurrModalImage("/sample-wireframes-01.jpg");
            }
          }}
        > 
          <ChevronLeft 
            size={48} 
          /> 
        </button>
      )}

      <Image src={currModalImage} alt="attachment image" fill style={{ objectFit: "contain" }} className="aspect-auto" />

      {/* Right Chevron button */}      
      {currModalImage.includes("01") && (
        <button 
          className="absolute top-[50%] right-5 z-50 text-white"
          onClick={() => {
            if (currModalImage.includes("01")) {
              setCurrModalImage("/sample-wireframes-02.jpg");
            }
          }}
        > 
          <ChevronRight size={48} />
        </button>
      )}
    </div>
  </div>
)}

با روکش انجام شده ، مورد بعدی که من باید انجام دهم اضافه کردن تصویر به روکش بود:

<Image 
  src={currModalImage} 
  alt="attachment image" 
  fill 
  style={{ objectFit: "contain" }} 
  className="aspect-auto" 
/>

غرفه ها fillبا style={{ objectFit: "contain" }} وت className="aspect-auto" کمک می کند تا اطمینان حاصل شود که بدون توجه به اینکه عکس/تصویر در حالت پرتره یا منظره قرار دارد ، هنوز هم در منطقه Overlay قرار دارد.

در مرحله بعد ، ما باید chevrons (چپ/راست) خود را اضافه کنیم تا کاربر بتواند به راحتی بین تصاویر موجود حرکت کند. برای نمونه اولیه UI ، ما مستقیماً جلو می رویم و مقادیر را سخت می کنیم. اما از این رو ، وقتی نوبت به کار در منطق رسیده است ، ما به روشی پویاتر برای رسیدگی به این کار نیاز خواهیم داشت.

{/* Left Chevron button */}
{currModalImage.includes("02") && (
  <button 
    className="absolute top-[50%] left-5 z-50 text-white"
    onClick={() => {
      if (currModalImage.includes("02")) {
        setCurrModalImage("/sample-wireframes-01.jpg");
      }
    }}
  > 
    <ChevronLeft 
      size={48} 
    /> 
  </button>
)}

<Image src={currModalImage} alt="attachment image" fill style={{ objectFit: "contain" }} className="aspect-auto" />

{/* Right Chevron button */}
{currModalImage.includes("01") && (
  <button 
    className="absolute top-[50%] right-5 z-50 text-white"
    onClick={() => {
      if (currModalImage.includes("01")) {
        setCurrModalImage("/sample-wireframes-02.jpg");
      }
    }}
  > 
    <ChevronRight size={48} />
  </button>
)}

موقعیت شورونها ارزش برجسته کردن/یادداشت را دارد. اکنون ، این همان چیزی است که من می توانم از استفاده از tailwindcss فکر کنم. شاید یک روش مؤثرتر برای انجام آن وجود داشته باشد. نوع جمینی در این زمان شکسته شد (در واقع قبل از اجرای آنها). من در واقع این بخش را خودم بدون هیچ کمکی از جمینی انجام دادم ، بنابراین احساس خوبی نسبت به خودم دارم.

از آنجا که من قبل از ارائه دکمه های شورون ، چک های مشروط را اضافه کرده ام ، می توانم منطق داخلی را با بررسی خود منطق UI خود ساده کنم. بنابراین دکمه نهایی شورون UI باید چیزی شبیه به این باشد:

{/* Right Chevron button */}
{currModalImage.includes("01") && (
  <button 
    className="absolute top-[50%] right-5 z-50 text-white"
    onClick={() => setCurrModalImage("/sample-wireframes-02.jpg")}
  > 
    <ChevronRight size={48} />
  </button>
)}

افکار و ایده های نهایی

بنابراین ، بچه ها ، این برای بخش بحث گروه من در بخش نمونه اولیه است. صادقانه بگویم ، من از اینکه چگونه همه چیز معلوم شد بسیار خوشحالم. من مطمئن هستم که ما می توانیم ترفندهای بیشتری برای تقویت بیشتر UI ایجاد کنیم. با این وجود ، قبل از اینکه همه چیز را بیش از حد بیان کنم ، هدف اصلی در این مرحله از پروژه ارزیابی و شناسایی هرگونه مسائل مربوط به موقعیت UI قبل از ایجاد UI کمی پویاتر است.

چند ایده/گام های بعدی در ذهن من:

👨‍💻 من در نهایت می توانم حباب های پیام را دوباره اصلاح کنم و آنها را به اجزای قابل استفاده مجدد تبدیل کنم.

👨‍💻 پس از رسیدن به منطق برنامه ، انتخاب پیوست ها را اضافه می کنم.

👨‍💻 خودکار را به آخرین پیام منتقل کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا