11<script setup lang="ts">
2- import type { Question , UserQuestion } from ' ~/types'
2+ import type { UserQuestion } from ' ~/types'
33
44const userNickname = ref (' ' )
55const nicknameInput = ref (' ' )
6+ const emojiInput = ref (' ' )
67const { activeQuestion, selectedAnswer } = useQuizSocket ()
78
89// Load nickname from localStorage
@@ -103,6 +104,59 @@ async function submitAnswer() {
103104 }
104105 }
105106}
107+
108+ // Submit emoji
109+ const isEmojiCooldown = ref (false )
110+ const cooldownTimerInSec = ref (0 )
111+ let cooldownEndTime = 0
112+
113+ const { pause, resume } = useIntervalFn (() => {
114+ const remaining = cooldownEndTime - Date .now ()
115+ if (remaining <= 0 ) {
116+ isEmojiCooldown .value = false
117+ cooldownTimerInSec .value = 0
118+ pause ()
119+ }
120+ else {
121+ cooldownTimerInSec .value = remaining / 1000
122+ }
123+ }, 10 , { immediate: false })
124+
125+ async function submitEmoji() {
126+ if (isEmojiCooldown .value || ! isValidEmoji (emojiInput .value )) {
127+ if (! isValidEmoji (emojiInput .value )) {
128+ alert (' Please enter a single emoji.' )
129+ }
130+ return
131+ }
132+
133+ try {
134+ await $fetch (' /api/emojis/submit' , {
135+ method: ' POST' ,
136+ body: {
137+ emoji: emojiInput .value
138+ }
139+ })
140+
141+ // Start cooldown
142+ isEmojiCooldown .value = true
143+ cooldownEndTime = Date .now () + 1500
144+ cooldownTimerInSec .value = 1.5
145+ resume ()
146+ }
147+ catch (error ) {
148+ logger_error (' Failed to submit emoji:' , error )
149+ alert (' Failed to send emoji. Please try again.' )
150+ }
151+ }
152+
153+ const quickEmojis = [' 👍' , ' ❤️' , ' 😂' , ' 🤔' , ' 👏' , ' ❓' ]
154+
155+ async function sendQuickEmoji(emoji : string ) {
156+ if (isEmojiCooldown .value ) return
157+ emojiInput .value = emoji
158+ await submitEmoji ()
159+ }
106160 </script >
107161
108162<template >
@@ -124,13 +178,40 @@ async function submitAnswer() {
124178 </form >
125179 </div >
126180
127- <!-- Quiz Section -->
181+ <!-- With Nickname -->
128182 <div v-else class =" flex flex-col gap-8" >
129- <div class =" flex justify-between items-center p-4 bg-white border-[3px] border-black" >
183+ <!-- Display Nickname with change function -->
184+ <div class =" flex justify-between items-center p-4 bg-white border-[4px] border-black" >
130185 <span >Playing as: <strong class =" text-lg" >{{ userNickname }}</strong ></span >
131186 <UiButton @click =" changeNickname" >Change</UiButton >
132187 </div >
133188
189+ <!-- Emoji Submission -->
190+ <div class =" bg-white border-[4px] border-black p-6" >
191+ <div class =" flex flex-wrap items-center justify-center gap-3" >
192+ <button
193+ v-for =" emoji in quickEmojis"
194+ :key =" emoji"
195+ class =" p-2 text-3xl border-2 border-black bg-white transition-transform duration-150 hover:scale-110 disabled:opacity-50 disabled:cursor-not-allowed"
196+ :disabled =" isEmojiCooldown"
197+ @click =" sendQuickEmoji(emoji)"
198+ >
199+ {{ emoji }}
200+ </button >
201+ <form @submit.prevent =" submitEmoji" class =" flex items-center" >
202+ <UiInput
203+ v-model =" emojiInput"
204+ placeholder =" ?"
205+ class =" text-2xl text-center w-16 h-16 flex-shrink-0 border-r-0"
206+ />
207+ <UiButton type =" submit" :disabled =" isEmojiCooldown" class =" h-16" >
208+ <span v-if =" isEmojiCooldown" >{{ cooldownTimerInSec.toFixed(2) }}s</span >
209+ <span v-else >Send</span >
210+ </UiButton >
211+ </form >
212+ </div >
213+ </div >
214+
134215 <!-- Active Question -->
135216 <div v-if =" activeQuestion" class =" bg-white border-[4px] border-black p-8" >
136217 <div class =" flex justify-between items-center mb-4" >
0 commit comments