| <!DOCTYPE html> |
| <html lang="ar" dir="rtl"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>إنستا | الشبكة الاجتماعية</title> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| :root { |
| --primary-color: #0095f6; |
| --primary-light: #b3dffd; |
| --text-dark: #262626; |
| --text-gray: #8e8e8e; |
| --border-color: #dbdbdb; |
| --bg-white: #ffffff; |
| --bg-light: #fafafa; |
| --error-color: #ed4956; |
| --success-color: #4BB543; |
| --notification-badge: #ff3040; |
| } |
| |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; |
| -webkit-tap-highlight-color: transparent; |
| } |
| |
| body { |
| background-color: var(--bg-light); |
| color: var(--text-dark); |
| padding-bottom: 60px; |
| } |
| |
| |
| .header { |
| position: fixed; |
| top: 0; |
| left: 0; |
| right: 0; |
| height: 54px; |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| padding: 0 16px; |
| background-color: var(--bg-white); |
| border-bottom: 1px solid var(--border-color); |
| z-index: 100; |
| } |
| |
| .header-logo { |
| font-family: 'Billabong', cursive; |
| font-size: 24px; |
| font-weight: 600; |
| margin-top: 5px; |
| } |
| |
| .header-icons { |
| display: flex; |
| gap: 20px; |
| position: relative; |
| } |
| |
| .header-icons i { |
| font-size: 24px; |
| cursor: pointer; |
| color: var(--text-dark); |
| position: relative; |
| } |
| |
| .notification-badge { |
| position: absolute; |
| top: -5px; |
| right: -5px; |
| background-color: var(--notification-badge); |
| color: white; |
| border-radius: 50%; |
| width: 18px; |
| height: 18px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| font-size: 10px; |
| font-weight: bold; |
| } |
| |
| |
| .main-content { |
| margin-top: 54px; |
| } |
| |
| |
| .tabs-navigation { |
| display: flex; |
| background-color: var(--bg-white); |
| border-bottom: 1px solid var(--border-color); |
| } |
| |
| .tab-btn { |
| flex: 1; |
| text-align: center; |
| padding: 15px 0; |
| font-weight: 600; |
| cursor: pointer; |
| position: relative; |
| color: var(--text-gray); |
| } |
| |
| .tab-btn.active { |
| color: var(--text-dark); |
| } |
| |
| .tab-btn.active::after { |
| content: ''; |
| position: absolute; |
| bottom: 0; |
| left: 0; |
| right: 0; |
| height: 2px; |
| background-color: var(--text-dark); |
| } |
| |
| |
| .tab-content { |
| display: none; |
| padding: 15px; |
| } |
| |
| .tab-content.active { |
| display: block; |
| } |
| |
| |
| .section-title { |
| font-size: 16px; |
| font-weight: 600; |
| margin-bottom: 15px; |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| } |
| |
| .section-title a { |
| color: var(--text-gray); |
| font-size: 14px; |
| font-weight: normal; |
| text-decoration: none; |
| } |
| |
| .friend-request-item, .suggested-friend-item, .notification-item { |
| display: flex; |
| align-items: center; |
| padding: 10px 0; |
| border-bottom: 1px solid var(--border-color); |
| } |
| |
| .friend-avatar, .notification-avatar { |
| width: 50px; |
| height: 50px; |
| border-radius: 50%; |
| object-fit: cover; |
| margin-left: 15px; |
| } |
| |
| .friend-info, .notification-info { |
| flex: 1; |
| } |
| |
| .friend-name, .notification-text { |
| font-weight: 600; |
| font-size: 14px; |
| margin-bottom: 3px; |
| } |
| |
| .friend-meta, .notification-time { |
| color: var(--text-gray); |
| font-size: 12px; |
| } |
| |
| .friend-actions, .notification-actions { |
| display: flex; |
| gap: 8px; |
| } |
| |
| .btn { |
| padding: 7px 12px; |
| border-radius: 8px; |
| font-size: 12px; |
| font-weight: 600; |
| cursor: pointer; |
| border: none; |
| } |
| |
| .btn-primary { |
| background-color: var(--primary-color); |
| color: white; |
| } |
| |
| .btn-outline { |
| background-color: transparent; |
| border: 1px solid var(--border-color); |
| color: var(--text-dark); |
| } |
| |
| .btn-danger { |
| background-color: var(--error-color); |
| color: white; |
| } |
| |
| |
| .message-item { |
| display: flex; |
| align-items: center; |
| padding: 12px 0; |
| border-bottom: 1px solid var(--border-color); |
| cursor: pointer; |
| } |
| |
| .message-avatar { |
| width: 60px; |
| height: 60px; |
| border-radius: 50%; |
| object-fit: cover; |
| margin-left: 10px; |
| } |
| |
| .message-content { |
| flex: 1; |
| } |
| |
| .message-header { |
| display: flex; |
| justify-content: space-between; |
| margin-bottom: 5px; |
| } |
| |
| .message-sender { |
| font-weight: 600; |
| font-size: 14px; |
| } |
| |
| .message-time { |
| color: var(--text-gray); |
| font-size: 12px; |
| } |
| |
| .message-preview { |
| display: flex; |
| align-items: center; |
| } |
| |
| .message-text { |
| font-size: 13px; |
| color: var(--text-gray); |
| max-width: 80%; |
| white-space: nowrap; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| } |
| |
| .message-unread { |
| background-color: var(--primary-color); |
| width: 8px; |
| height: 8px; |
| border-radius: 50%; |
| margin-right: 5px; |
| } |
| |
| |
| .chat-modal { |
| position: fixed; |
| top: 0; |
| left: 0; |
| right: 0; |
| bottom: 0; |
| background-color: rgba(0, 0, 0, 0.8); |
| z-index: 200; |
| display: none; |
| flex-direction: column; |
| } |
| |
| .chat-header { |
| background-color: var(--bg-white); |
| padding: 15px; |
| display: flex; |
| align-items: center; |
| border-bottom: 1px solid var(--border-color); |
| } |
| |
| .chat-back-btn { |
| margin-left: 10px; |
| font-size: 20px; |
| cursor: pointer; |
| } |
| |
| .chat-title { |
| flex: 1; |
| font-weight: 600; |
| text-align: center; |
| } |
| |
| .chat-body { |
| flex: 1; |
| background-color: var(--bg-white); |
| padding: 15px; |
| overflow-y: auto; |
| } |
| |
| .message-bubble { |
| max-width: 70%; |
| padding: 10px 15px; |
| border-radius: 18px; |
| margin-bottom: 10px; |
| font-size: 14px; |
| position: relative; |
| } |
| |
| .message-in { |
| background-color: var(--bg-light); |
| margin-right: auto; |
| border-bottom-right-radius: 0; |
| } |
| |
| .message-out { |
| background-color: var(--primary-light); |
| margin-left: auto; |
| border-bottom-left-radius: 0; |
| } |
| |
| .message-time { |
| font-size: 10px; |
| color: var(--text-gray); |
| margin-top: 5px; |
| text-align: right; |
| } |
| |
| .chat-footer { |
| background-color: var(--bg-white); |
| padding: 15px; |
| border-top: 1px solid var(--border-color); |
| display: flex; |
| align-items: center; |
| } |
| |
| .message-input { |
| flex: 1; |
| padding: 12px 15px; |
| border-radius: 22px; |
| border: 1px solid var(--border-color); |
| font-size: 14px; |
| background-color: var(--bg-light); |
| } |
| |
| .send-btn { |
| margin-right: 10px; |
| font-size: 20px; |
| color: var(--primary-color); |
| cursor: pointer; |
| } |
| |
| |
| .bottom-nav { |
| position: fixed; |
| bottom: 0; |
| left: 0; |
| right: 0; |
| background-color: var(--bg-white); |
| display: flex; |
| justify-content: space-around; |
| padding: 12px 0; |
| border-top: 1px solid var(--border-color); |
| } |
| |
| .bottom-nav i { |
| font-size: 24px; |
| cursor: pointer; |
| color: var(--text-dark); |
| } |
| |
| .bottom-nav i.active { |
| color: var(--primary-color); |
| } |
| |
| |
| .notifications-modal { |
| position: fixed; |
| top: 54px; |
| right: 10px; |
| width: 350px; |
| max-height: 500px; |
| overflow-y: auto; |
| background-color: var(--bg-white); |
| border-radius: 10px; |
| box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); |
| z-index: 150; |
| display: none; |
| } |
| |
| .notifications-header { |
| padding: 15px; |
| border-bottom: 1px solid var(--border-color); |
| font-weight: 600; |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| } |
| |
| .notifications-close { |
| cursor: pointer; |
| } |
| |
| .notifications-list { |
| padding: 0; |
| } |
| |
| .notification-item { |
| padding: 12px 15px; |
| cursor: pointer; |
| } |
| |
| .notification-item.unread { |
| background-color: rgba(0, 149, 246, 0.05); |
| } |
| |
| .notification-item:hover { |
| background-color: var(--bg-light); |
| } |
| |
| |
| .search-container { |
| padding: 15px; |
| } |
| |
| .search-input { |
| width: 100%; |
| padding: 12px 15px; |
| border-radius: 8px; |
| border: 1px solid var(--border-color); |
| font-size: 14px; |
| margin-bottom: 15px; |
| background-color: var(--bg-light); |
| } |
| |
| .search-tabs { |
| display: flex; |
| border-bottom: 1px solid var(--border-color); |
| margin-bottom: 15px; |
| } |
| |
| .search-tab { |
| padding: 10px 15px; |
| cursor: pointer; |
| font-weight: 600; |
| color: var(--text-gray); |
| } |
| |
| .search-tab.active { |
| color: var(--text-dark); |
| border-bottom: 2px solid var(--text-dark); |
| } |
| |
| .posts-grid { |
| display: grid; |
| grid-template-columns: repeat(3, 1fr); |
| gap: 2px; |
| } |
| |
| .post-thumbnail { |
| width: 100%; |
| aspect-ratio: 1/1; |
| object-fit: cover; |
| cursor: pointer; |
| } |
| |
| |
| @font-face { |
| font-family: 'Billabong'; |
| src: url('https://fonts.cdnfonts.com/s/13949/Billabong.woff') format('woff'); |
| } |
| |
| |
| .push-notification { |
| position: fixed; |
| top: 20px; |
| left: 50%; |
| transform: translateX(-50%); |
| background-color: var(--bg-white); |
| padding: 12px 20px; |
| border-radius: 8px; |
| box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); |
| z-index: 300; |
| display: flex; |
| align-items: center; |
| opacity: 0; |
| transition: opacity 0.3s, top 0.3s; |
| } |
| |
| .push-notification.show { |
| opacity: 1; |
| top: 30px; |
| } |
| |
| .push-notification-avatar { |
| width: 40px; |
| height: 40px; |
| border-radius: 50%; |
| object-fit: cover; |
| margin-left: 10px; |
| } |
| |
| .push-notification-text { |
| flex: 1; |
| font-size: 14px; |
| } |
| |
| .push-notification-close { |
| color: var(--text-gray); |
| cursor: pointer; |
| } |
| |
| |
| @media (max-width: 450px) { |
| .friend-avatar, .message-avatar, .notification-avatar { |
| width: 45px; |
| height: 45px; |
| } |
| |
| .btn { |
| padding: 5px 8px; |
| font-size: 11px; |
| } |
| |
| .notifications-modal { |
| width: 300px; |
| right: 5px; |
| } |
| } |
| </style> |
| </head> |
| <body> |
| |
| <div class="header"> |
| <div class="header-logo">إنستا</div> |
| <div class="header-icons"> |
| <i class="far fa-heart" id="notificationsBtn"> |
| <span class="notification-badge" id="notificationBadge" style="display: none;">0</span> |
| </i> |
| <i class="far fa-paper-plane" id="messagesBtn"></i> |
| </div> |
| </div> |
| |
| |
| <div class="main-content"> |
| |
| <div class="tabs-navigation"> |
| <div class="tab-btn active" data-tab="friends">طلبات الصداقة</div> |
| <div class="tab-btn" data-tab="suggestions">اقتراحات</div> |
| <div class="tab-btn" data-tab="messages">المراسلة</div> |
| <div class="tab-btn" data-tab="search">بحث</div> |
| </div> |
| |
| |
| <div class="tab-content active" id="friends-tab"> |
| <div class="section-title"> |
| <span>طلبات الصداقة</span> |
| <a href="#" id="seeAllRequests">عرض الكل</a> |
| </div> |
| |
| <div id="friendRequestsList"> |
| |
| </div> |
| </div> |
| |
| |
| <div class="tab-content" id="suggestions-tab"> |
| <div class="section-title"> |
| <span>أشخاص قد تعرفهم</span> |
| <a href="#" id="refreshSuggestions">تحديث</a> |
| </div> |
| |
| <div id="suggestionsList"> |
| |
| </div> |
| </div> |
| |
| |
| <div class="tab-content" id="messages-tab"> |
| <div class="section-title"> |
| <span>المراسلة</span> |
| <a href="#" id="newMessageBtn">رسالة جديدة</a> |
| </div> |
| |
| <div id="messagesList"> |
| |
| </div> |
| </div> |
| |
| |
| <div class="tab-content" id="search-tab"> |
| <div class="search-container"> |
| <input type="text" class="search-input" placeholder="ابحث عن أشخاص أو منشورات..." id="searchInput"> |
| |
| <div class="search-tabs"> |
| <div class="search-tab active" data-search-tab="posts">منشورات</div> |
| <div class="search-tab" data-search-tab="people">أشخاص</div> |
| </div> |
| |
| <div id="searchResults"> |
| <div class="posts-grid" id="postsGrid"> |
| |
| </div> |
| |
| <div id="peopleResults" style="display: none;"> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="bottom-nav"> |
| <i class="fas fa-home active"></i> |
| <i class="fas fa-search" id="searchBtn"></i> |
| <i class="far fa-plus-square"></i> |
| <i class="far fa-heart" id="notificationsBtnMobile"></i> |
| <i class="fas fa-user"></i> |
| </div> |
| |
| |
| <div class="chat-modal" id="chatModal"> |
| <div class="chat-header"> |
| <div class="chat-back-btn" id="chatBackBtn"> |
| <i class="fas fa-arrow-left"></i> |
| </div> |
| <div class="chat-title" id="chatTitle">محادثة</div> |
| </div> |
| <div class="chat-body" id="chatBody"> |
| |
| </div> |
| <div class="chat-footer"> |
| <input type="text" class="message-input" id="messageInput" placeholder="اكتب رسالة..."> |
| <div class="send-btn" id="sendMessageBtn"> |
| <i class="far fa-paper-plane"></i> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="notifications-modal" id="notificationsModal"> |
| <div class="notifications-header"> |
| <span>الإشعارات</span> |
| <i class="fas fa-times notifications-close" id="notificationsClose"></i> |
| </div> |
| <div class="notifications-list" id="notificationsList"> |
| |
| </div> |
| </div> |
| |
| |
| <div class="push-notification" id="pushNotification"> |
| <img src="" class="push-notification-avatar" id="pushNotificationAvatar"> |
| <div class="push-notification-text" id="pushNotificationText"></div> |
| <i class="fas fa-times push-notification-close" id="pushNotificationClose"></i> |
| </div> |
| |
| <script> |
| |
| const appData = { |
| currentUser: { |
| id: 1, |
| name: "سارة أحمد", |
| username: "@sara_ahmed", |
| avatar: "https://randomuser.me/api/portraits/women/44.jpg" |
| }, |
| friendRequests: [ |
| { |
| id: 2, |
| name: "أحمد محمد", |
| username: "@ahmed_mohamed", |
| avatar: "https://randomuser.me/api/portraits/men/32.jpg", |
| mutualFriends: 4, |
| date: "منذ ساعتين" |
| }, |
| { |
| id: 3, |
| name: "ليلى خالد", |
| username: "@laila_khalid", |
| avatar: "https://randomuser.me/api/portraits/women/63.jpg", |
| mutualFriends: 2, |
| date: "منذ يوم" |
| }, |
| { |
| id: 4, |
| name: "محمد علي", |
| username: "@mohamed_ali", |
| avatar: "https://randomuser.me/api/portraits/men/45.jpg", |
| mutualFriends: 7, |
| date: "منذ 3 أيام" |
| } |
| ], |
| suggestedFriends: [ |
| { |
| id: 5, |
| name: "نورا سعيد", |
| username: "@nora_saeed", |
| avatar: "https://randomuser.me/api/portraits/women/22.jpg", |
| mutualFriends: 3 |
| }, |
| { |
| id: 6, |
| name: "خالد عمر", |
| username: "@khaled_omar", |
| avatar: "https://randomuser.me/api/portraits/men/12.jpg", |
| mutualFriends: 5 |
| }, |
| { |
| id: 7, |
| name: "هناء وليد", |
| username: "@hanna_waleed", |
| avatar: "https://randomuser.me/api/portraits/women/33.jpg", |
| mutualFriends: 1 |
| }, |
| { |
| id: 8, |
| name: "ياسر ناصر", |
| username: "@yasser_nasser", |
| avatar: "https://randomuser.me/api/portraits/men/67.jpg", |
| mutualFriends: 2 |
| } |
| ], |
| messages: [ |
| { |
| id: 2, |
| user: { |
| id: 2, |
| name: "أحمد محمد", |
| username: "@ahmed_mohamed", |
| avatar: "https://randomuser.me/api/portraits/men/32.jpg" |
| }, |
| lastMessage: "مرحبًا، كيف حالك؟", |
| time: "10:30 ص", |
| unread: true, |
| chat: [ |
| { |
| id: 1, |
| sender: 2, |
| text: "مرحبًا سارة!", |
| time: "10:20 ص" |
| }, |
| { |
| id: 2, |
| sender: 2, |
| text: "كيف حالك؟", |
| time: "10:21 ص" |
| }, |
| { |
| id: 3, |
| sender: 1, |
| text: "أهلاً أحمد، أنا بخير الحمد لله", |
| time: "10:25 ص" |
| }, |
| { |
| id: 4, |
| sender: 2, |
| text: "هل أنتِ متاحة للقاء غدًا؟", |
| time: "10:30 ص" |
| } |
| ] |
| }, |
| { |
| id: 3, |
| user: { |
| id: 3, |
| name: "ليلى خالد", |
| username: "@laila_khalid", |
| avatar: "https://randomuser.me/api/portraits/women/63.jpg" |
| }, |
| lastMessage: "شكرًا لكِ!", |
| time: "أمس", |
| unread: false, |
| chat: [ |
| { |
| id: 1, |
| sender: 3, |
| text: "مرحبًا سارة، شكرًا على المساعدة", |
| time: "9:00 م" |
| }, |
| { |
| id: 2, |
| sender: 1, |
| text: "لا شكر على واجب ليلى", |
| time: "9:05 م" |
| }, |
| { |
| id: 3, |
| sender: 3, |
| text: "حقًا ساعدتيني كثيرًا", |
| time: "9:10 م" |
| }, |
| { |
| id: 4, |
| sender: 3, |
| text: "شكرًا لكِ!", |
| time: "9:12 م" |
| } |
| ] |
| } |
| ], |
| friends: [], |
| notifications: [ |
| { |
| id: 1, |
| type: "like", |
| user: { |
| id: 2, |
| name: "أحمد محمد", |
| avatar: "https://randomuser.me/api/portraits/men/32.jpg" |
| }, |
| post: { |
| id: 101, |
| thumbnail: "https://picsum.photos/id/101/300/300" |
| }, |
| time: "منذ دقائق", |
| read: false |
| }, |
| { |
| id: 2, |
| type: "comment", |
| user: { |
| id: 3, |
| name: "ليلى خالد", |
| avatar: "https://randomuser.me/api/portraits/women/63.jpg" |
| }, |
| post: { |
| id: 102, |
| thumbnail: "https://picsum.photos/id/102/300/300" |
| }, |
| text: "هذه الصورة رائعة!", |
| time: "منذ ساعة", |
| read: false |
| }, |
| { |
| id: 3, |
| type: "friend_request", |
| user: { |
| id: 4, |
| name: "محمد علي", |
| avatar: "https://randomuser.me/api/portraits/men/45.jpg" |
| }, |
| time: "منذ يوم", |
| read: true |
| }, |
| { |
| id: 4, |
| type: "follow", |
| user: { |
| id: 5, |
| name: "نورا سعيد", |
| avatar: "https://randomuser.me/api/portraits/women/22.jpg" |
| }, |
| time: "منذ يومين", |
| read: true |
| } |
| ], |
| posts: [ |
| { |
| id: 101, |
| image: "https://picsum.photos/id/101/800/800", |
| thumbnail: "https://picsum.photos/id/101/300/300", |
| likes: 124, |
| comments: 23, |
| caption: "يوم جميل في الطبيعة 🌿", |
| time: "منذ 3 ساعات" |
| }, |
| { |
| id: 102, |
| image: "https://picsum.photos/id/102/800/800", |
| thumbnail: "https://picsum.photos/id/102/300/300", |
| likes: 89, |
| comments: 12, |
| caption: "وجبة غداء لذيذة 🍽️", |
| time: "منذ يوم" |
| }, |
| { |
| id: 103, |
| image: "https://picsum.photos/id/103/800/800", |
| thumbnail: "https://picsum.photos/id/103/300/300", |
| likes: 215, |
| comments: 45, |
| caption: "رحلتي إلى الجبل ⛰️", |
| time: "منذ 3 أيام" |
| }, |
| { |
| id: 104, |
| image: "https://picsum.photos/id/104/800/800", |
| thumbnail: "https://picsum.photos/id/104/300/300", |
| likes: 56, |
| comments: 8, |
| caption: "قراءة كتاب جديد 📖", |
| time: "منذ أسبوع" |
| }, |
| { |
| id: 105, |
| image: "https://picsum.photos/id/105/800/800", |
| thumbnail: "https://picsum.photos/id/105/300/300", |
| likes: 312, |
| comments: 67, |
| caption: "حفل موسيقي رائع 🎵", |
| time: "منذ أسبوعين" |
| }, |
| { |
| id: 106, |
| image: "https://picsum.photos/id/106/800/800", |
| thumbnail: "https://picsum.photos/id/106/300/300", |
| likes: 78, |
| comments: 15, |
| caption: "وقت ممتع مع الأصدقاء 👫", |
| time: "منذ شهر" |
| } |
| ] |
| }; |
| |
| |
| const tabBtns = document.querySelectorAll('.tab-btn'); |
| const tabContents = document.querySelectorAll('.tab-content'); |
| const friendRequestsList = document.getElementById('friendRequestsList'); |
| const suggestionsList = document.getElementById('suggestionsList'); |
| const messagesList = document.getElementById('messagesList'); |
| const chatModal = document.getElementById('chatModal'); |
| const chatBody = document.getElementById('chatBody'); |
| const messageInput = document.getElementById('messageInput'); |
| const sendMessageBtn = document.getElementById('sendMessageBtn'); |
| const chatBackBtn = document.getElementById('chatBackBtn'); |
| const chatTitle = document.getElementById('chatTitle'); |
| const messagesBtn = document.getElementById('messagesBtn'); |
| const notificationsBtn = document.getElementById('notificationsBtn'); |
| const notificationsBtnMobile = document.getElementById('notificationsBtnMobile'); |
| const seeAllRequests = document.getElementById('seeAllRequests'); |
| const refreshSuggestions = document.getElementById('refreshSuggestions'); |
| const newMessageBtn = document.getElementById('newMessageBtn'); |
| const searchBtn = document.getElementById('searchBtn'); |
| const searchInput = document.getElementById('searchInput'); |
| const searchTabs = document.querySelectorAll('.search-tab'); |
| const postsGrid = document.getElementById('postsGrid'); |
| const peopleResults = document.getElementById('peopleResults'); |
| const notificationsModal = document.getElementById('notificationsModal'); |
| const notificationsList = document.getElementById('notificationsList'); |
| const notificationsClose = document.getElementById('notificationsClose'); |
| const notificationBadge = document.getElementById('notificationBadge'); |
| const pushNotification = document.getElementById('pushNotification'); |
| const pushNotificationAvatar = document.getElementById('pushNotificationAvatar'); |
| const pushNotificationText = document.getElementById('pushNotificationText'); |
| const pushNotificationClose = document.getElementById('pushNotificationClose'); |
| |
| |
| function initPage() { |
| renderFriendRequests(); |
| renderSuggestedFriends(); |
| renderMessages(); |
| renderPosts(); |
| renderNotifications(); |
| setupEventListeners(); |
| updateNotificationBadge(); |
| |
| |
| window.addEventListener('blur', () => { |
| setTimeout(() => { |
| if (document.hidden) { |
| showRandomPushNotification(); |
| } |
| }, 3000); |
| }); |
| } |
| |
| |
| function setupEventListeners() { |
| |
| tabBtns.forEach(btn => { |
| btn.addEventListener('click', () => { |
| tabBtns.forEach(b => b.classList.remove('active')); |
| btn.classList.add('active'); |
| |
| tabContents.forEach(content => content.classList.remove('active')); |
| document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active'); |
| }); |
| }); |
| |
| |
| messagesBtn.addEventListener('click', () => { |
| tabBtns.forEach(b => b.classList.remove('active')); |
| document.querySelector('.tab-btn[data-tab="messages"]').classList.add('active'); |
| |
| tabContents.forEach(content => content.classList.remove('active')); |
| document.getElementById('messages-tab').classList.add('active'); |
| }); |
| |
| notificationsBtn.addEventListener('click', toggleNotificationsModal); |
| notificationsBtnMobile.addEventListener('click', toggleNotificationsModal); |
| |
| notificationsClose.addEventListener('click', toggleNotificationsModal); |
| |
| chatBackBtn.addEventListener('click', closeChat); |
| |
| |
| sendMessageBtn.addEventListener('click', sendMessage); |
| messageInput.addEventListener('keypress', (e) => { |
| if (e.key === 'Enter') { |
| sendMessage(); |
| } |
| }); |
| |
| |
| seeAllRequests.addEventListener('click', (e) => { |
| e.preventDefault(); |
| alert('عرض جميع طلبات الصداقة'); |
| }); |
| |
| |
| refreshSuggestions.addEventListener('click', (e) => { |
| e.preventDefault(); |
| refreshFriendSuggestions(); |
| }); |
| |
| |
| newMessageBtn.addEventListener('click', (e) => { |
| e.preventDefault(); |
| startNewMessage(); |
| }); |
| |
| |
| searchBtn.addEventListener('click', () => { |
| tabBtns.forEach(b => b.classList.remove('active')); |
| document.querySelector('.tab-btn[data-tab="search"]').classList.add('active'); |
| |
| tabContents.forEach(content => content.classList.remove('active')); |
| document.getElementById('search-tab').classList.add('active'); |
| }); |
| |
| |
| searchTabs.forEach(tab => { |
| tab.addEventListener('click', () => { |
| searchTabs.forEach(t => t.classList.remove('active')); |
| tab.classList.add('active'); |
| |
| if (tab.dataset.searchTab === 'posts') { |
| postsGrid.style.display = 'grid'; |
| peopleResults.style.display = 'none'; |
| } else { |
| postsGrid.style.display = 'none'; |
| peopleResults.style.display = 'block'; |
| renderPeopleSearchResults(); |
| } |
| }); |
| }); |
| |
| |
| searchInput.addEventListener('input', (e) => { |
| const query = e.target.value.trim(); |
| if (query.length > 0) { |
| |
| console.log('بحث عن:', query); |
| } |
| }); |
| |
| |
| pushNotificationClose.addEventListener('click', () => { |
| pushNotification.classList.remove('show'); |
| }); |
| } |
| |
| |
| function renderFriendRequests() { |
| friendRequestsList.innerHTML = ''; |
| |
| if (appData.friendRequests.length === 0) { |
| friendRequestsList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد طلبات صداقة جديدة</p>'; |
| return; |
| } |
| |
| appData.friendRequests.forEach(request => { |
| const requestElement = document.createElement('div'); |
| requestElement.className = 'friend-request-item'; |
| requestElement.innerHTML = ` |
| <img src="${request.avatar}" class="friend-avatar" alt="${request.name}"> |
| <div class="friend-info"> |
| <div class="friend-name">${request.name}</div> |
| <div class="friend-meta">${request.mutualFriends} أصدقاء مشتركين • ${request.date}</div> |
| </div> |
| <div class="friend-actions"> |
| <button class="btn btn-primary" onclick="acceptFriendRequest(${request.id})">قبول</button> |
| <button class="btn btn-outline" onclick="declineFriendRequest(${request.id})">حذف</button> |
| </div> |
| `; |
| |
| friendRequestsList.appendChild(requestElement); |
| }); |
| } |
| |
| |
| function renderSuggestedFriends() { |
| suggestionsList.innerHTML = ''; |
| |
| appData.suggestedFriends.forEach(friend => { |
| const friendElement = document.createElement('div'); |
| friendElement.className = 'suggested-friend-item'; |
| friendElement.innerHTML = ` |
| <img src="${friend.avatar}" class="friend-avatar" alt="${friend.name}"> |
| <div class="friend-info"> |
| <div class="friend-name">${friend.name}</div> |
| <div class="friend-meta">${friend.mutualFriends} أصدقاء مشتركين</div> |
| </div> |
| <div class="friend-actions"> |
| <button class="btn btn-primary" onclick="sendFriendRequest(${friend.id})">إرسال طلب</button> |
| <button class="btn btn-outline" onclick="removeSuggestion(${friend.id})">إزالة</button> |
| </div> |
| `; |
| |
| suggestionsList.appendChild(friendElement); |
| }); |
| } |
| |
| |
| function renderMessages() { |
| messagesList.innerHTML = ''; |
| |
| if (appData.messages.length === 0) { |
| messagesList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد رسائل</p>'; |
| return; |
| } |
| |
| appData.messages.forEach(message => { |
| const messageElement = document.createElement('div'); |
| messageElement.className = 'message-item'; |
| messageElement.innerHTML = ` |
| <img src="${message.user.avatar}" class="message-avatar" alt="${message.user.name}"> |
| <div class="message-content"> |
| <div class="message-header"> |
| <div class="message-sender">${message.user.name}</div> |
| <div class="message-time">${message.time}</div> |
| </div> |
| <div class="message-preview"> |
| ${message.unread ? '<div class="message-unread"></div>' : ''} |
| <div class="message-text">${message.lastMessage}</div> |
| </div> |
| </div> |
| `; |
| |
| messageElement.addEventListener('click', () => openChat(message.user.id)); |
| messagesList.appendChild(messageElement); |
| }); |
| } |
| |
| |
| function renderPosts() { |
| postsGrid.innerHTML = ''; |
| |
| appData.posts.forEach(post => { |
| const postElement = document.createElement('div'); |
| postElement.innerHTML = ` |
| <img src="${post.thumbnail}" class="post-thumbnail" alt="منشور ${post.id}"> |
| `; |
| |
| postElement.addEventListener('click', () => viewPost(post.id)); |
| postsGrid.appendChild(postElement); |
| }); |
| } |
| |
| |
| function renderPeopleSearchResults() { |
| peopleResults.innerHTML = ''; |
| |
| |
| appData.suggestedFriends.forEach(friend => { |
| const friendElement = document.createElement('div'); |
| friendElement.className = 'suggested-friend-item'; |
| friendElement.innerHTML = ` |
| <img src="${friend.avatar}" class="friend-avatar" alt="${friend.name}"> |
| <div class="friend-info"> |
| <div class="friend-name">${friend.name}</div> |
| <div class="friend-meta">${friend.mutualFriends} أصدقاء مشتركين</div> |
| </div> |
| <div class="friend-actions"> |
| <button class="btn btn-primary" onclick="sendFriendRequest(${friend.id})">إرسال طلب</button> |
| </div> |
| `; |
| |
| peopleResults.appendChild(friendElement); |
| }); |
| } |
| |
| |
| function renderNotifications() { |
| notificationsList.innerHTML = ''; |
| |
| if (appData.notifications.length === 0) { |
| notificationsList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد إشعارات جديدة</p>'; |
| return; |
| } |
| |
| appData.notifications.forEach(notification => { |
| const notificationElement = document.createElement('div'); |
| notificationElement.className = `notification-item ${notification.read ? '' : 'unread'}`; |
| |
| let notificationContent = ''; |
| |
| if (notification.type === "like") { |
| notificationContent = ` |
| <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| <div class="notification-info"> |
| <div class="notification-text"> |
| <span>${notification.user.name}</span> أعجب بمنشورك |
| </div> |
| <div class="notification-time">${notification.time}</div> |
| </div> |
| <img src="${notification.post.thumbnail}" class="notification-avatar" alt="منشور"> |
| `; |
| } else if (notification.type === "comment") { |
| notificationContent = ` |
| <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| <div class="notification-info"> |
| <div class="notification-text"> |
| <span>${notification.user.name}</span> علق على منشورك: ${notification.text} |
| </div> |
| <div class="notification-time">${notification.time}</div> |
| </div> |
| <img src="${notification.post.thumbnail}" class="notification-avatar" alt="منشور"> |
| `; |
| } else if (notification.type === "friend_request") { |
| notificationContent = ` |
| <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| <div class="notification-info"> |
| <div class="notification-text"> |
| <span>${notification.user.name}</span> أرسل لك طلب صداقة |
| </div> |
| <div class="notification-time">${notification.time}</div> |
| </div> |
| <div class="notification-actions"> |
| <button class="btn btn-primary" onclick="acceptFriendRequest(${notification.user.id})">قبول</button> |
| <button class="btn btn-outline" onclick="declineFriendRequest(${notification.user.id})">حذف</button> |
| </div> |
| `; |
| } else if (notification.type === "follow") { |
| notificationContent = ` |
| <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| <div class="notification-info"> |
| <div class="notification-text"> |
| <span>${notification.user.name}</span> بدأ متابعتك |
| </div> |
| <div class="notification-time">${notification.time}</div> |
| </div> |
| <div class="notification-actions"> |
| <button class="btn btn-outline">متابعة</button> |
| </div> |
| `; |
| } |
| |
| notificationElement.innerHTML = notificationContent; |
| notificationElement.addEventListener('click', () => markNotificationAsRead(notification.id)); |
| notificationsList.appendChild(notificationElement); |
| }); |
| } |
| |
| |
| function updateNotificationBadge() { |
| const unreadCount = appData.notifications.filter(n => !n.read).length; |
| if (unreadCount > 0) { |
| notificationBadge.style.display = 'flex'; |
| notificationBadge.textContent = unreadCount; |
| } else { |
| notificationBadge.style.display = 'none'; |
| } |
| } |
| |
| |
| function acceptFriendRequest(userId) { |
| const requestIndex = appData.friendRequests.findIndex(req => req.id === userId); |
| if (requestIndex !== -1) { |
| const acceptedUser = appData.friendRequests[requestIndex]; |
| |
| |
| appData.friends.push({ |
| id: acceptedUser.id, |
| name: acceptedUser.name, |
| username: acceptedUser.username, |
| avatar: acceptedUser.avatar |
| }); |
| |
| |
| appData.friendRequests.splice(requestIndex, 1); |
| |
| |
| addNotification({ |
| type: "friend_accepted", |
| user: acceptedUser, |
| time: "الآن" |
| }); |
| |
| |
| showAlert('تم قبول طلب الصداقة بنجاح', 'success'); |
| |
| |
| renderFriendRequests(); |
| renderNotifications(); |
| updateNotificationBadge(); |
| } |
| } |
| |
| |
| function declineFriendRequest(userId) { |
| const requestIndex = appData.friendRequests.findIndex(req => req.id === userId); |
| if (requestIndex !== -1) { |
| appData.friendRequests.splice(requestIndex, 1); |
| showAlert('تم حذف طلب الصداقة', 'info'); |
| renderFriendRequests(); |
| } |
| } |
| |
| |
| function sendFriendRequest(userId) { |
| const friendIndex = appData.suggestedFriends.findIndex(f => f.id === userId); |
| if (friendIndex !== -1) { |
| const friend = appData.suggestedFriends[friendIndex]; |
| showAlert(`تم إرسال طلب صداقة إلى ${friend.name}`, 'success'); |
| |
| |
| addNotification({ |
| type: "friend_request", |
| user: appData.currentUser, |
| time: "الآن" |
| }); |
| |
| |
| setTimeout(() => { |
| removeSuggestion(userId); |
| }, 1000); |
| } |
| } |
| |
| |
| function removeSuggestion(userId) { |
| const friendIndex = appData.suggestedFriends.findIndex(f => f.id === userId); |
| if (friendIndex !== -1) { |
| appData.suggestedFriends.splice(friendIndex, 1); |
| renderSuggestedFriends(); |
| |
| |
| if (peopleResults.style.display !== 'none') { |
| renderPeopleSearchResults(); |
| } |
| } |
| } |
| |
| |
| function refreshFriendSuggestions() { |
| |
| showAlert('تم تحديث اقتراحات الأصدقاء', 'info'); |
| } |
| |
| |
| function openChat(userId) { |
| const message = appData.messages.find(m => m.user.id === userId); |
| if (message) { |
| |
| message.unread = false; |
| |
| |
| chatTitle.textContent = message.user.name; |
| chatBody.innerHTML = ''; |
| |
| message.chat.forEach(msg => { |
| const messageClass = msg.sender === appData.currentUser.id ? 'message-out' : 'message-in'; |
| const messageElement = document.createElement('div'); |
| messageElement.className = `message-bubble ${messageClass}`; |
| messageElement.innerHTML = ` |
| <div>${msg.text}</div> |
| <div class="message-time">${msg.time}</div> |
| `; |
| chatBody.appendChild(messageElement); |
| }); |
| |
| |
| chatBody.scrollTop = chatBody.scrollHeight; |
| |
| |
| chatModal.style.display = 'flex'; |
| document.body.style.overflow = 'hidden'; |
| |
| |
| sendMessageBtn.dataset.userId = userId; |
| } |
| } |
| |
| |
| function closeChat() { |
| chatModal.style.display = 'none'; |
| document.body.style.overflow = 'auto'; |
| |
| |
| renderMessages(); |
| } |
| |
| |
| function sendMessage() { |
| const text = messageInput.value.trim(); |
| if (text && sendMessageBtn.dataset.userId) { |
| const userId = parseInt(sendMessageBtn.dataset.userId); |
| const message = appData.messages.find(m => m.user.id === userId); |
| |
| if (message) { |
| |
| const newMessage = { |
| id: message.chat.length + 1, |
| sender: appData.currentUser.id, |
| text: text, |
| time: getCurrentTime() |
| }; |
| |
| |
| message.chat.push(newMessage); |
| |
| |
| message.lastMessage = text; |
| message.time = 'الآن'; |
| message.unread = false; |
| |
| |
| const messageElement = document.createElement('div'); |
| messageElement.className = 'message-bubble message-out'; |
| messageElement.innerHTML = ` |
| <div>${text}</div> |
| <div class="message-time">${newMessage.time}</div> |
| `; |
| chatBody.appendChild(messageElement); |
| |
| |
| messageInput.value = ''; |
| |
| |
| chatBody.scrollTop = chatBody.scrollHeight; |
| |
| |
| |
| setTimeout(() => { |
| const replyMessage = { |
| id: message.chat.length + 1, |
| sender: userId, |
| text: getRandomReply(), |
| time: getCurrentTime() |
| }; |
| |
| message.chat.push(replyMessage); |
| message.lastMessage = replyMessage.text; |
| |
| if (!chatModal.style.display || chatModal.style.display === 'none') { |
| message.unread = true; |
| |
| |
| addNotification({ |
| type: "message", |
| user: message.user, |
| time: "الآن" |
| }); |
| } else { |
| const replyElement = document.createElement('div'); |
| replyElement.className = 'message-bubble message-in'; |
| replyElement.innerHTML = ` |
| <div>${replyMessage.text}</div> |
| <div class="message-time">${replyMessage.time}</div> |
| `; |
| chatBody.appendChild(replyElement); |
| chatBody.scrollTop = chatBody.scrollHeight; |
| } |
| |
| renderMessages(); |
| updateNotificationBadge(); |
| }, 2000); |
| } |
| } |
| } |
| |
| |
| function startNewMessage() { |
| |
| const randomFriend = appData.suggestedFriends[Math.floor(Math.random() * appData.suggestedFriends.length)]; |
| |
| if (randomFriend) { |
| |
| const newChat = { |
| id: randomFriend.id, |
| user: { |
| id: randomFriend.id, |
| name: randomFriend.name, |
| username: randomFriend.username, |
| avatar: randomFriend.avatar |
| }, |
| lastMessage: "بدأت محادثة جديدة", |
| time: "الآن", |
| unread: false, |
| chat: [] |
| }; |
| |
| appData.messages.unshift(newChat); |
| renderMessages(); |
| openChat(randomFriend.id); |
| } else { |
| showAlert('لا يوجد أصدقاء متاحين لبدء محادثة جديدة', 'error'); |
| } |
| } |
| |
| |
| function viewPost(postId) { |
| const post = appData.posts.find(p => p.id === postId); |
| if (post) { |
| alert(`عرض المنشور ${postId}: ${post.caption}\nالإعجابات: ${post.likes} | التعليقات: ${post.comments}`); |
| } |
| } |
| |
| |
| function toggleNotificationsModal() { |
| if (notificationsModal.style.display === 'block') { |
| notificationsModal.style.display = 'none'; |
| } else { |
| notificationsModal.style.display = 'block'; |
| |
| |
| appData.notifications.forEach(notification => { |
| notification.read = true; |
| }); |
| |
| updateNotificationBadge(); |
| renderNotifications(); |
| } |
| } |
| |
| |
| function markNotificationAsRead(notificationId) { |
| const notification = appData.notifications.find(n => n.id === notificationId); |
| if (notification && !notification.read) { |
| notification.read = true; |
| updateNotificationBadge(); |
| renderNotifications(); |
| } |
| } |
| |
| |
| function addNotification(notificationData) { |
| const newNotification = { |
| id: appData.notifications.length + 1, |
| read: false, |
| ...notificationData |
| }; |
| |
| appData.notifications.unshift(newNotification); |
| |
| |
| if (notificationsModal.style.display !== 'block') { |
| showPushNotification(newNotification); |
| } |
| |
| updateNotificationBadge(); |
| } |
| |
| |
| function showPushNotification(notification) { |
| pushNotificationAvatar.src = notification.user.avatar; |
| |
| let notificationText = ''; |
| if (notification.type === "like") { |
| notificationText = `${notification.user.name} أعجب بمنشورك`; |
| } else if (notification.type === "comment") { |
| notificationText = `${notification.user.name} علق على منشورك`; |
| } else if (notification.type === "friend_request") { |
| notificationText = `${notification.user.name} أرسل لك طلب صداقة`; |
| } else if (notification.type === "friend_accepted") { |
| notificationText = `${notification.user.name} قبل طلب صداقتك`; |
| } else if (notification.type === "message") { |
| notificationText = `${notification.user.name} أرسل لك رسالة`; |
| } else if (notification.type === "follow") { |
| notificationText = `${notification.user.name} بدأ متابعتك`; |
| } |
| |
| pushNotificationText.textContent = notificationText; |
| pushNotification.classList.add('show'); |
| |
| |
| setTimeout(() => { |
| pushNotification.classList.remove('show'); |
| }, 5000); |
| } |
| |
| |
| function showRandomPushNotification() { |
| const types = ["like", "comment", "friend_request", "message", "follow"]; |
| const randomType = types[Math.floor(Math.random() * types.length)]; |
| const randomUser = appData.suggestedFriends[Math.floor(Math.random() * appData.suggestedFriends.length)]; |
| |
| if (randomUser) { |
| const notification = { |
| id: appData.notifications.length + 1, |
| type: randomType, |
| user: randomUser, |
| time: "الآن", |
| read: false |
| }; |
| |
| if (randomType === "like" || randomType === "comment") { |
| notification.post = { |
| id: Math.floor(Math.random() * 1000), |
| thumbnail: `https://picsum.photos/id/${Math.floor(Math.random() * 1000)}/300/300` |
| }; |
| } |
| |
| addNotification(notification); |
| } |
| } |
| |
| |
| </html> |