File size: 5,302 Bytes
97dab2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<!-- Desktop Header -->
<header class="w-full items-center bg-white py-2 px-6 hidden sm:flex">
    <div class="w-1/2">
        <!-- Countdown Timer -->
        <!-- <% if (userName) { %> -->
        <div class="countdown-timer">
          Token expires in: <span id="countdown">--:--:--</span>
        </div>
        <!-- <% } %> -->
    </div>

    <!-- Notification Marquee -->
    <div class="w-full bg-yellow-100 py-2 px-4 text-center">
        <marquee behavior="scroll" direction="left" class="text-yellow-800 font-semibold">
            <div id="notification">
            πŸš€ Welcome to the OAuth App! Stay tuned for updates and new features. πŸš€
            </div>
        </marquee>
    </div>

    <div x-data="{ isOpen: false }" class="relative w-1/2 flex justify-end">
        <% if (userName) { %>
        <button @click="isOpen = !isOpen" class="realtive z-10 w-12 h-12 rounded-full overflow-hidden border-4 border-gray-400 hover:border-gray-300 focus:border-gray-300 focus:outline-none">
          <img src="/photos/<%= userId %>.jpg" alt="User Photo">
        </button>
        <% } else { %>
        <button @click="isOpen = !isOpen" class="realtive z-10 w-12 h-12 rounded-full overflow-hidden border-4 border-gray-400 hover:border-gray-300 focus:border-gray-300 focus:outline-none">
            <img src="/images/profile.png" alt="User Photo">
        </button>
        <% } %>
        <button x-show="isOpen" @click="isOpen = false" class="h-full w-full fixed inset-0 cursor-default"></button>
        <div x-show="isOpen" class="absolute w-32 bg-white rounded-lg shadow-lg py-2 mt-16">
            <% if (userName) { %>
                <a href="/auth/profile" class="block px-4 py-2 account-link hover:text-white"><%= userName %></a>
                <a href="/auth/logout" class="block px-4 py-2 account-link hover:text-white">Sign Out</a>
            <% } else { %>
                <a href="/auth/login" class="block px-4 py-2 account-link hover:text-white">Sign In</a>
            <% } %>
        </div>
  </div>
</header>

<!-- Mobile Header & Nav -->
<header x-data="{ isOpen: false }" class="w-full bg-sidebar py-5 px-6 sm:hidden">
  <div class="flex items-center justify-between">
      <a href="index.html" class="text-white text-3xl font-semibold uppercase hover:text-gray-300">Oauth</a>
      <button @click="isOpen = !isOpen" class="text-white text-3xl focus:outline-none">
          <i x-show="!isOpen" class="fas fa-bars"></i>
          <i x-show="isOpen" class="fas fa-times"></i>
      </button>
  </div>

  <%- include('./mobilenav') %>

  
  <!-- <button class="w-full bg-white cta-btn font-semibold py-2 mt-5 rounded-br-lg rounded-bl-lg rounded-tr-lg shadow-lg hover:shadow-xl hover:bg-gray-300 flex items-center justify-center">
      <i class="fas fa-plus mr-3"></i> New Report
  </button> -->
</header>

<script>
// Function to decode a JWT token
function decodeJWT(token) {
    const payload = token.split('.')[1];
    return JSON.parse(atob(payload));
}

// Function to start the countdown
function startCountdown(expiryTime) {
    const countdownElement = document.getElementById('countdown');

    function updateCountdown() {
        const now = new Date().getTime();
        const distance = expiryTime * 1000 - now; // Convert expiryTime from seconds to milliseconds

        if (distance < 0) {
            countdownElement.innerHTML = "EXPIRED";
            clearInterval(intervalId);
            return;
        }

        const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        const seconds = Math.floor((distance % (1000 * 60)) / 1000);

        countdownElement.innerHTML = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
    }

    // Update the countdown every second
    //**const intervalId = setInterval(updateCountdown, 1000);
    //**updateCountdown(); // Initial call to display immediately
}

// Function to refresh the expiry time
function refreshExpiryTime() {
    const accessToken = getCookie('accessToken');

    if (accessToken) {
        const decodedToken = decodeJWT(accessToken);
        const expiryTime = decodedToken.exp;
        startCountdown(expiryTime);
    } else {
        console.error("Access token not found in cookies");
        document.getElementById('countdown').innerHTML = "N/A";
    }
}

// Refresh the expiry time every 5 seconds
//**setInterval(refreshExpiryTime, 5000);
//**refreshExpiryTime(); // Initial call to set up countdown immediately


</script>

<script src="http://localhost:3002/socket.io/socket.io.js"></script>
<script>
    document.addEventListener("DOMContentLoaded", () => {
      const socket = io('http://localhost:3002'); // connect to NestJS server

      socket.on('broadcastMessage', (data) => {
        const container = document.getElementById('notification');
        if(data.message && data.message.length > 0) {
            container.innerText = data.message;
        } else {
            container.innerText = "πŸš€ Welcome to the OAuth App! Stay tuned for updates and new features. πŸš€";
        }
        //console.log("Message received from server:", data);
      });
    });
  </script>