@kakarot2905/quizzie-module 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -0
- package/chunk-2IYKTL43.js +1 -0
- package/chunk-2O4WDLOC.js +1 -0
- package/chunk-4S3ZLLNI.js +1 -0
- package/chunk-6IVIMAVU.js +1 -0
- package/chunk-6ZHAJFTP.js +1 -0
- package/chunk-BDRARPDM.js +1 -0
- package/chunk-BXPDLLUD.js +1 -0
- package/chunk-IUANN3U7.js +1 -0
- package/chunk-KI2SGYIC.js +1 -0
- package/chunk-UNSARXTF.js +8 -0
- package/chunk-VXET42KR.js +1 -0
- package/chunk-VYECULB4.js +1 -0
- package/chunk-XTBN5JJS.js +1 -0
- package/loader.js +71 -0
- package/main.js +1 -0
- package/manifest.json +23 -0
- package/package.json +30 -0
- package/polyfills.js +2 -0
- package/styles.css +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Quizzie Module
|
|
2
|
+
|
|
3
|
+
Embeddable Quizzie module distributed as a Web Component.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @kakarot2905/quizzie-module
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage in any web app
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<div id="quiz-root"></div>
|
|
15
|
+
<script type="module">
|
|
16
|
+
import { loadQuizzieModule, elementTag } from "@kakarot2905/quizzie-module";
|
|
17
|
+
|
|
18
|
+
await loadQuizzieModule();
|
|
19
|
+
|
|
20
|
+
const host = document.getElementById("quiz-root");
|
|
21
|
+
host.innerHTML = `<${elementTag}></${elementTag}>`;
|
|
22
|
+
</script>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage in React
|
|
26
|
+
|
|
27
|
+
1. Install the package:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install @sudhakar2905/quizzie-module
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. Load and render the custom element in a React component:
|
|
34
|
+
|
|
35
|
+
```jsx
|
|
36
|
+
import { useEffect, useRef } from "react";
|
|
37
|
+
import { loadQuizzieModule, elementTag } from "@kakarot2905/quizzie-module";
|
|
38
|
+
|
|
39
|
+
export default function QuizzieEmbed() {
|
|
40
|
+
const hostRef = useRef(null);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
(async () => {
|
|
44
|
+
await loadQuizzieModule();
|
|
45
|
+
const host = hostRef.current;
|
|
46
|
+
if (!host) return;
|
|
47
|
+
|
|
48
|
+
const quizElement = document.createElement(elementTag);
|
|
49
|
+
host.replaceChildren(quizElement);
|
|
50
|
+
})();
|
|
51
|
+
}, []);
|
|
52
|
+
|
|
53
|
+
return <div ref={hostRef} />;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
3. (Optional) If your React app is TypeScript, add this to avoid JSX type errors for custom elements:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
// src/custom-elements.d.ts
|
|
61
|
+
import type React from "react";
|
|
62
|
+
|
|
63
|
+
declare namespace JSX {
|
|
64
|
+
interface IntrinsicElements {
|
|
65
|
+
"quizzie-module": React.DetailedHTMLProps<
|
|
66
|
+
React.HTMLAttributes<HTMLElement>,
|
|
67
|
+
HTMLElement
|
|
68
|
+
>;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then you can render it directly:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { useEffect } from "react";
|
|
77
|
+
import { loadQuizzieModule } from "@sudhakar2905/quizzie-module";
|
|
78
|
+
|
|
79
|
+
export default function QuizzieEmbed() {
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
loadQuizzieModule();
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
return <quizzie-module />;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Using local build in a React demo app
|
|
89
|
+
|
|
90
|
+
If you are testing locally before publishing:
|
|
91
|
+
|
|
92
|
+
From `frontend` in this repository:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm run prepare:npm-lib
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
From your React/Vite demo app:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm install "C:/Users/sudha/Desktop/Myself/programing/git/Quizzie/frontend/dist/npm-lib"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Optional: Load from CDN
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<script type="module">
|
|
108
|
+
import { loadQuizzieModule, elementTag } from "https://unpkg.com/@kakarot2905/quizzie-module/loader.js";
|
|
109
|
+
|
|
110
|
+
await loadQuizzieModule();
|
|
111
|
+
document.body.innerHTML += `<${elementTag}></${elementTag}>`;
|
|
112
|
+
</script>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Build and pack locally
|
|
116
|
+
|
|
117
|
+
From the frontend project root:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
npm run pack:npm-lib
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
This creates a `.tgz` package in the current directory.
|
|
124
|
+
|
|
125
|
+
## Publish
|
|
126
|
+
|
|
127
|
+
1. Update package name and version in `npm-lib/package.json`.
|
|
128
|
+
2. Login to npm: `npm login`.
|
|
129
|
+
3. Publish:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm run publish:npm-lib
|
|
133
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as W,b as T,c as I,d as k,e as A,f as D,h as F,i as L,j,m as q,n as z,o as B,q as G}from"./chunk-VXET42KR.js";import{a as R}from"./chunk-BDRARPDM.js";import{$ as w,A as m,Aa as O,B as g,H as o,I as _,Ja as V,Ka as N,Q as C,S as p,V as e,W as t,Y as S,Z as b,_ as v,aa as r,ba as x,ea as u,fa as c,ga as h,ia as P,v as M,xa as E}from"./chunk-UNSARXTF.js";function H(a,y){if(a&1&&(e(0,"div",20),r(1),t()),a&2){let l=v();o(),x(l.error)}}function J(a,y){a&1&&(e(0,"span"),r(1,"Create Account"),t())}function Y(a,y){a&1&&(e(0,"span"),r(1,"Creating..."),t())}var ie=(()=>{class a{constructor(l,s){this.authService=l,this.router=s,this.displayName="",this.email="",this.password="",this.role="admin",this.error="",this.loading=!1}onSubmit(){this.loading=!0,this.error="",this.authService.register({email:this.email,password:this.password,display_name:this.displayName,role:this.role}).subscribe({next:l=>{this.loading=!1,l.user.role==="admin"?this.router.navigate(["/admin/dashboard"]):this.router.navigate(["/join"])},error:l=>{this.loading=!1,this.error=l.error?.errors?.join(", ")||"Registration failed."}})}static{this.\u0275fac=function(s){return new(s||a)(_(R),_(V))}}static{this.\u0275cmp=M({type:a,selectors:[["app-register"]],standalone:!0,features:[P],decls:40,vars:8,consts:[["regForm","ngForm"],[1,"auth-page"],[1,"auth-card","animate-scale-in"],[1,"auth-header","text-center"],[1,"auth-icon"],[1,"text-secondary"],[3,"ngSubmit"],[1,"form-group"],[1,"form-label"],["type","text","name","displayName","placeholder","Your name","required","","minlength","2",1,"form-input",3,"ngModelChange","ngModel"],["type","email","name","email","placeholder","you@example.com","required","","email","",1,"form-input",3,"ngModelChange","ngModel"],["type","password","name","password","placeholder","Min 6 characters","required","","minlength","6",1,"form-input",3,"ngModelChange","ngModel"],["name","role",1,"form-input",3,"ngModelChange","ngModel"],["value","admin"],["value","participant"],["class","error-msg",4,"ngIf"],["type","submit",1,"btn","btn-secondary","btn-lg","btn-full",3,"disabled"],[4,"ngIf"],[1,"auth-footer","text-center"],["routerLink","/auth/login",1,"link"],[1,"error-msg"]],template:function(s,i){if(s&1){let d=S();e(0,"div",1)(1,"div",2)(2,"div",3)(3,"h1",4),r(4,"\u{1F680}"),t(),e(5,"h2"),r(6,"Create Account"),t(),e(7,"p",5),r(8,"Start creating and hosting quizzes"),t()(),e(9,"form",6,0),b("ngSubmit",function(){return m(d),g(i.onSubmit())}),e(11,"div",7)(12,"label",8),r(13,"Display Name"),t(),e(14,"input",9),h("ngModelChange",function(n){return m(d),c(i.displayName,n)||(i.displayName=n),g(n)}),t()(),e(15,"div",7)(16,"label",8),r(17,"Email"),t(),e(18,"input",10),h("ngModelChange",function(n){return m(d),c(i.email,n)||(i.email=n),g(n)}),t()(),e(19,"div",7)(20,"label",8),r(21,"Password"),t(),e(22,"input",11),h("ngModelChange",function(n){return m(d),c(i.password,n)||(i.password=n),g(n)}),t()(),e(23,"div",7)(24,"label",8),r(25,"Account Type"),t(),e(26,"select",12),h("ngModelChange",function(n){return m(d),c(i.role,n)||(i.role=n),g(n)}),e(27,"option",13),r(28,"Admin (Create & Host)"),t(),e(29,"option",14),r(30,"Participant (Join & Play)"),t()()(),C(31,H,2,1,"div",15),e(32,"button",16),C(33,J,2,0,"span",17)(34,Y,2,0,"span",17),t()(),e(35,"div",18)(36,"p"),r(37,"Already have an account? "),e(38,"a",19),r(39,"Sign in"),t()()()()()}if(s&2){let d=w(10);o(14),u("ngModel",i.displayName),o(4),u("ngModel",i.email),o(4),u("ngModel",i.password),o(4),u("ngModel",i.role),o(5),p("ngIf",i.error),o(),p("disabled",i.loading||!d.valid),o(),p("ngIf",!i.loading),o(),p("ngIf",i.loading)}},dependencies:[O,E,G,D,L,j,W,F,T,I,q,B,z,A,k,N],styles:[".auth-page[_ngcontent-%COMP%]{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(ellipse at 30% 20%,rgba(108,92,231,.12) 0%,transparent 50%),radial-gradient(ellipse at 70% 80%,rgba(0,206,201,.08) 0%,transparent 50%)}.auth-card[_ngcontent-%COMP%]{width:100%;max-width:440px;background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-xl);padding:40px}.auth-header[_ngcontent-%COMP%]{margin-bottom:32px}.auth-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-top:12px}.auth-header[_ngcontent-%COMP%] .text-secondary[_ngcontent-%COMP%]{color:var(--text-secondary);margin-top:8px}.auth-icon[_ngcontent-%COMP%]{font-size:3rem}.error-msg[_ngcontent-%COMP%]{background:#ff6b6b1a;border:1px solid rgba(255,107,107,.3);color:var(--danger);padding:12px 16px;border-radius:var(--radius-md);margin-bottom:16px;font-size:.9rem}.auth-footer[_ngcontent-%COMP%]{margin-top:24px}.auth-footer[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem}.auth-footer[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:var(--primary-light);text-decoration:none;font-weight:500}.auth-footer[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]:hover{text-decoration:underline}"]})}}return a})();export{ie as RegisterComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as R}from"./chunk-6ZHAJFTP.js";import"./chunk-BDRARPDM.js";import{a as F}from"./chunk-4S3ZLLNI.js";import{A as y,Aa as T,B as P,H as i,Ha as D,I as u,Ja as z,Q as p,S as l,T as x,U as _,V as n,W as a,X as h,Y as O,Z as M,_ as d,aa as o,ba as m,ca as g,da as w,ia as I,ja as S,na as f,oa as b,v as C,wa as k,xa as E,za as q}from"./chunk-UNSARXTF.js";var A=()=>["\u{1F947}","\u{1F948}","\u{1F949}"];function Q(e,s){if(e&1&&(n(0,"div",6)(1,"div",7),h(2,"div",8),n(3,"h1"),o(4,"Get Ready! \u{1F3AE}"),a(),n(5,"p"),o(6,"Waiting for the host to start..."),a(),n(7,"div",9)(8,"span",10),o(9),a(),n(10,"span",11),o(11,"players waiting"),a()()()()),e&2){let t=d();i(9),m(t.participantCount)}}function j(e,s){if(e&1&&(n(0,"span",23),o(1),a()),e&2){let t=d(2);i(),g("\u{1F3C6} ",t.currentQuestion.points," pts")}}function W(e,s){if(e&1){let t=O();n(0,"button",26),M("click",function(){let c=y(t).$implicit,v=d(3);return P(v.selectAnswer(c.id))}),n(1,"span",27),o(2),a(),n(3,"span",28),o(4),a()()}if(e&2){let t=s.$implicit,r=s.index,c=d(3);x("animation-delay",r*100+"ms")("--option-hue",c.optionHues[r]),l("disabled",c.hasAnswered),i(2),m(t.id.toUpperCase()),i(2),m(t.text)}}function $(e,s){if(e&1&&(n(0,"div",24),p(1,W,5,7,"button",25),a()),e&2){let t=d(2);_("two-col",t.currentQuestion.options.length<=4),i(),l("ngForOf",t.currentQuestion.options)}}function N(e,s){if(e&1&&(n(0,"div",29)(1,"div",30),o(2,"\u2705"),a(),n(3,"h2"),o(4,"Answer Submitted!"),a(),n(5,"p"),o(6),a()()),e&2){let t=d(2);i(6),m(t.lastScore>0?"Scored "+t.lastScore+" points! \u{1F3AF}":"Waiting for results...")}}function V(e,s){if(e&1&&(n(0,"div",12)(1,"div",13)(2,"div",14)(3,"span",15),o(4),a(),p(5,j,2,1,"span",16),a(),n(6,"div",17),h(7,"div",18),a(),n(8,"div",19),o(9),a()(),n(10,"div",20)(11,"h2"),o(12),a()(),p(13,$,2,3,"div",21)(14,N,7,1,"div",22),a()),e&2){let t=d();i(4),w("",t.questionIndex+1," / ",t.totalQuestions,""),i(),l("ngIf",t.currentQuestion.points),i(2),x("width",t.timerPercent,"%"),i(),_("danger",t.timeRemaining<=5),i(),g("",t.timeRemaining,"s"),i(3),m(t.currentQuestion.body),i(),l("ngIf",!t.hasAnswered),i(),l("ngIf",t.hasAnswered)}}function B(e,s){if(e&1&&(n(0,"div",36),o(1),a()),e&2){let t=d(2);i(),g("+",t.lastScore," points")}}function H(e,s){e&1&&(n(0,"span"),o(1,"\u2713"),a())}function L(e,s){if(e&1&&(n(0,"div",37)(1,"div",38),o(2),p(3,H,2,0,"span",39),a(),n(4,"div",40),h(5,"div",41),a(),n(6,"span",42),o(7),a()()),e&2){let t=s.$implicit,r=d(2);i(),_("correct",t.option_id===r.correctOption)("selected",t.option_id===r.selectedOption),i(),g(" ",t.option_text," "),i(),l("ngIf",t.option_id===r.correctOption),i(2),x("width",t.percentage,"%"),_("correct",t.option_id===r.correctOption),i(2),g("",t.percentage,"%")}}function Y(e,s){if(e&1&&(n(0,"div",31)(1,"div",32)(2,"h2"),o(3," {{ lastWasCorrect ? '\u{1F389} Correct!' : (hasAnswered ? '\u274C Wrong!' : '\u23F0 Time's up!') }} "),a(),p(4,B,2,1,"div",33),n(5,"div",34),p(6,L,8,11,"div",35),a()()()),e&2){let t=d();i(2),_("correct-reveal",t.lastWasCorrect)("wrong-reveal",!t.lastWasCorrect&&t.hasAnswered),i(2),l("ngIf",t.lastScore>0),i(2),l("ngForOf",t.distribution)}}function G(e,s){if(e&1&&(n(0,"div",48)(1,"span"),o(2,"Your rank: "),n(3,"strong"),o(4),a()()()),e&2){let t=d(2);i(4),g("#",t.myRank,"")}}function U(e,s){if(e&1&&(n(0,"span",54),o(1),a()),e&2){let t=d().index;i(),m(S(1,A)[t])}}function J(e,s){if(e&1&&(n(0,"div",49)(1,"span",50),o(2),a(),p(3,U,2,2,"span",51),n(4,"span",52),o(5),a(),n(6,"span",53),o(7),f(8,"number"),a()()),e&2){let t=s.$implicit,r=s.index,c=d(2);x("animation-delay",r*80+"ms"),_("is-me",t.participant_id===c.participantId)("top-1",r===0)("top-2",r===1)("top-3",r===2),i(2),m(t.rank),i(),l("ngIf",r<3),i(2),m(t.display_name),i(2),m(b(8,14,t.score))}}function K(e,s){if(e&1&&(n(0,"div",43)(1,"div",44)(2,"h2"),o(3,"\u{1F3C6} Leaderboard"),a(),p(4,G,5,1,"div",45),n(5,"div",46),p(6,J,9,16,"div",47),a()()()),e&2){let t=d();i(4),l("ngIf",t.myRank),i(2),l("ngForOf",t.leaderboard)}}function X(e,s){if(e&1&&(n(0,"div",63)(1,"span",64),o(2),a(),n(3,"span",65),o(4,"Your Final Rank"),a()()),e&2){let t=d(2);i(2),g("#",t.myRank,"")}}function Z(e,s){if(e&1&&(n(0,"div",55)(1,"div",56)(2,"div",57),o(3,"\u{1F389}"),a(),n(4,"h1"),o(5,"Quiz Over!"),a(),p(6,X,5,1,"div",58),n(7,"div",59)(8,"span",60),o(9),f(10,"number"),a(),n(11,"span",61),o(12,"Total Score"),a()(),n(13,"button",62),o(14,"Play Another Quiz"),a()()()),e&2){let t=d();i(6),l("ngIf",t.myRank),i(3),m(b(10,2,t.myScore))}}var rt=(()=>{class e{constructor(t,r,c,v){this.api=t,this.ws=r,this.route=c,this.router=v,this.state="lobby",this.participantId=0,this.sessionId=0,this.participantCount=0,this.currentQuestion=null,this.questionIndex=0,this.totalQuestions=0,this.timeRemaining=0,this.timerPercent=100,this.hasAnswered=!1,this.selectedOption="",this.lastScore=0,this.lastWasCorrect=!1,this.distribution=[],this.correctOption="",this.leaderboard=[],this.myRank=null,this.myScore=0,this.optionHues=["0","210","45","140","280","30"],this.questionStartTime=0}ngOnInit(){if(this.sessionId=Number(this.route.snapshot.paramMap.get("id")),this.participantId=Number(sessionStorage.getItem("participant_id")),!this.participantId){this.router.navigate(["/join"]);return}this.api.getSession(this.sessionId).subscribe({next:t=>{this.state=t.session.state,this.participantCount=t.session.participant_count,this.totalQuestions=t.session.total_questions,this.connectWebSocket()},error:()=>this.router.navigate(["/join"])})}connectWebSocket(){this.ws.connect(this.sessionId,this.participantId),this.wsSub=this.ws.events$.subscribe(t=>{switch(t.type){case"participant_joined":this.participantCount=t.data.participant_count;break;case"question_start":this.state="question_active",this.currentQuestion=t.data.question,this.questionIndex=t.data.question_index,this.totalQuestions=t.data.total_questions,this.hasAnswered=!1,this.selectedOption="",this.lastScore=0,this.lastWasCorrect=!1,this.questionStartTime=Date.now(),this.startTimer(t.data.question.time_limit_seconds);break;case"answer_reveal":this.state="answer_reveal",this.distribution=t.data.distribution,this.correctOption=t.data.correct_option,this.lastWasCorrect=this.selectedOption===t.data.correct_option,this.stopTimer();break;case"leaderboard_update":this.state="leaderboard_display",this.leaderboard=t.data.leaderboard,this.findMyRank();break;case"session_complete":this.state="completed",this.leaderboard=t.data.final_leaderboard,this.findMyRank();break}})}selectAnswer(t){if(this.hasAnswered||!this.currentQuestion)return;this.hasAnswered=!0,this.selectedOption=t;let r=Date.now()-this.questionStartTime;this.api.submitAnswer(this.sessionId,this.participantId,t,r).subscribe({next:c=>{this.lastScore=c.response.score_awarded,this.lastWasCorrect=c.response.is_correct},error:c=>{console.error("Submit answer error:",c)}})}startTimer(t){this.timeRemaining=t,this.timerPercent=100;let r=t;this.stopTimer(),this.timerInterval=setInterval(()=>{this.timeRemaining--,this.timerPercent=this.timeRemaining/r*100,this.timeRemaining<=0&&this.stopTimer()},1e3)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}findMyRank(){let t=this.leaderboard.find(r=>r.participant_id===this.participantId);t&&(this.myRank=t.rank,this.myScore=t.score)}ngOnDestroy(){this.ws.disconnect(),this.stopTimer(),this.wsSub&&this.wsSub.unsubscribe()}static{this.\u0275fac=function(r){return new(r||e)(u(F),u(R),u(D),u(z))}}static{this.\u0275cmp=C({type:e,selectors:[["app-play"]],standalone:!0,features:[I],decls:6,vars:5,consts:[[1,"play-page"],["class","play-state lobby-state",4,"ngIf"],["class","play-state question-state",4,"ngIf"],["class","play-state reveal-state",4,"ngIf"],["class","play-state leaderboard-state",4,"ngIf"],["class","play-state complete-state",4,"ngIf"],[1,"play-state","lobby-state"],[1,"lobby-content","animate-scale-in"],[1,"lobby-pulse"],[1,"player-count"],[1,"pc-num"],[1,"pc-label"],[1,"play-state","question-state"],[1,"q-top"],[1,"q-info"],[1,"q-counter"],["class","q-points",4,"ngIf"],[1,"timer-bar"],[1,"timer-fill"],[1,"q-time"],[1,"q-body","animate-slide-up"],["class","options-grid",3,"two-col",4,"ngIf"],["class","answered-state animate-bounce-in",4,"ngIf"],[1,"q-points"],[1,"options-grid"],["class","option-btn animate-slide-up",3,"animation-delay","--option-hue","disabled","click",4,"ngFor","ngForOf"],[1,"option-btn","animate-slide-up",3,"click","disabled"],[1,"opt-letter"],[1,"opt-text"],[1,"answered-state","animate-bounce-in"],[1,"answered-icon"],[1,"play-state","reveal-state"],[1,"reveal-content","animate-scale-in"],["class","reveal-score",4,"ngIf"],[1,"reveal-distribution"],["class","rev-bar",4,"ngFor","ngForOf"],[1,"reveal-score"],[1,"rev-bar"],[1,"rev-label"],[4,"ngIf"],[1,"rev-track"],[1,"rev-fill"],[1,"rev-pct"],[1,"play-state","leaderboard-state"],[1,"lb-content","animate-slide-up"],["class","my-rank",4,"ngIf"],[1,"lb-entries"],["class","animate-slide-up",3,"is-me","top-1","top-2","top-3","animation-delay",4,"ngFor","ngForOf"],[1,"my-rank"],[1,"animate-slide-up"],[1,"lb-rank"],["class","lb-medal",4,"ngIf"],[1,"lb-name"],[1,"lb-score"],[1,"lb-medal"],[1,"play-state","complete-state"],[1,"complete-content","animate-bounce-in"],[1,"confetti-emoji"],["class","final-rank",4,"ngIf"],[1,"final-score"],[1,"score-big"],[1,"score-label"],["routerLink","/join",1,"btn","btn-primary","btn-lg"],[1,"final-rank"],[1,"rank-big"],[1,"rank-label"]],template:function(r,c){r&1&&(n(0,"div",0),p(1,Q,12,1,"div",1)(2,V,15,11,"div",2)(3,Y,7,6,"div",3)(4,K,7,2,"div",4)(5,Z,15,4,"div",5),a()),r&2&&(i(),l("ngIf",c.state==="lobby"),i(),l("ngIf",c.state==="question_active"&&c.currentQuestion),i(),l("ngIf",c.state==="answer_reveal"),i(),l("ngIf",c.state==="leaderboard_display"),i(),l("ngIf",c.state==="completed"))},dependencies:[T,k,E,q],styles:[".play-page[_ngcontent-%COMP%]{min-height:100vh}.play-state[_ngcontent-%COMP%]{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}.lobby-content[_ngcontent-%COMP%]{text-align:center}.lobby-content[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:2.5rem;margin-bottom:8px}.lobby-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:1.1rem}.lobby-pulse[_ngcontent-%COMP%]{width:80px;height:80px;background:var(--primary);border-radius:50%;margin:0 auto 24px;animation:_ngcontent-%COMP%_pulse-ring 2s infinite}@keyframes _ngcontent-%COMP%_pulse-ring{0%{transform:scale(1);box-shadow:0 0 #6c5ce780}70%{transform:scale(1);box-shadow:0 0 0 30px #6c5ce700}to{transform:scale(1);box-shadow:0 0 #6c5ce700}}.player-count[_ngcontent-%COMP%]{margin-top:32px;display:flex;flex-direction:column;align-items:center}.pc-num[_ngcontent-%COMP%]{font-size:3rem;font-weight:800;color:var(--secondary)}.pc-label[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem}.question-state[_ngcontent-%COMP%]{flex-direction:column;padding:24px}.q-top[_ngcontent-%COMP%]{width:100%;max-width:800px;margin-bottom:32px}.q-info[_ngcontent-%COMP%]{display:flex;justify-content:space-between;margin-bottom:12px}.q-counter[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem;text-transform:uppercase;letter-spacing:.05em}.q-points[_ngcontent-%COMP%]{color:var(--accent-light);font-weight:600}.q-time[_ngcontent-%COMP%]{text-align:center;font-size:2.5rem;font-weight:800;color:var(--primary-light);margin-top:8px;transition:color var(--transition-fast)}.q-time.danger[_ngcontent-%COMP%]{color:var(--danger);animation:pulse .5s infinite}.q-body[_ngcontent-%COMP%]{text-align:center;margin-bottom:40px;max-width:800px}.q-body[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1.6rem;line-height:1.5}.options-grid[_ngcontent-%COMP%]{display:grid;gap:16px;width:100%;max-width:700px}.options-grid.two-col[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.option-btn[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;padding:20px 24px;border:2px solid var(--border-light);border-radius:var(--radius-lg);background:var(--bg-card);color:var(--text-primary);font-family:Inter,sans-serif;font-size:1.1rem;font-weight:500;cursor:pointer;transition:all var(--transition-fast);text-align:left}.option-btn[_ngcontent-%COMP%]:nth-child(1){border-color:#e74c3c66}.option-btn[_ngcontent-%COMP%]:nth-child(1):hover{background:#e74c3c26;border-color:#e74c3c}.option-btn[_ngcontent-%COMP%]:nth-child(2){border-color:#2980b966}.option-btn[_ngcontent-%COMP%]:nth-child(2):hover{background:#2980b926;border-color:#2980b9}.option-btn[_ngcontent-%COMP%]:nth-child(3){border-color:#f39c1266}.option-btn[_ngcontent-%COMP%]:nth-child(3):hover{background:#f39c1226;border-color:#f39c12}.option-btn[_ngcontent-%COMP%]:nth-child(4){border-color:#27ae6066}.option-btn[_ngcontent-%COMP%]:nth-child(4):hover{background:#27ae6026;border-color:#27ae60}.option-btn[_ngcontent-%COMP%]:active{transform:scale(.97)}.option-btn[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed}.opt-letter[_ngcontent-%COMP%]{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);background:#ffffff1a;font-weight:700;font-size:.9rem;flex-shrink:0}.answered-state[_ngcontent-%COMP%]{text-align:center;margin-top:24px}.answered-icon[_ngcontent-%COMP%]{font-size:4rem;margin-bottom:16px}.reveal-content[_ngcontent-%COMP%]{max-width:600px;width:100%;text-align:center}.reveal-content[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:2rem;margin-bottom:8px}.correct-reveal[_ngcontent-%COMP%]{color:var(--success)}.wrong-reveal[_ngcontent-%COMP%]{color:var(--danger)}.reveal-score[_ngcontent-%COMP%]{font-size:1.5rem;font-weight:700;color:var(--success);margin-bottom:32px}.reveal-distribution[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;text-align:left}.rev-bar[_ngcontent-%COMP%]{display:grid;grid-template-columns:160px 1fr 60px;gap:12px;align-items:center}.rev-label[_ngcontent-%COMP%]{font-size:.9rem;color:var(--text-secondary);text-align:right}.rev-label.correct[_ngcontent-%COMP%]{color:var(--success);font-weight:700}.rev-label.selected[_ngcontent-%COMP%]{text-decoration:underline}.rev-track[_ngcontent-%COMP%]{height:28px;background:var(--bg-surface);border-radius:var(--radius-sm);overflow:hidden}.rev-fill[_ngcontent-%COMP%]{height:100%;background:var(--primary);border-radius:var(--radius-sm);transition:width .8s ease}.rev-fill.correct[_ngcontent-%COMP%]{background:var(--success)}.rev-pct[_ngcontent-%COMP%]{font-size:.85rem;color:var(--text-muted)}.lb-content[_ngcontent-%COMP%]{max-width:550px;width:100%;text-align:center}.lb-content[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-bottom:16px}.my-rank[_ngcontent-%COMP%]{margin-bottom:24px;color:var(--primary-light);font-size:1.1rem}.lb-entries[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px}.lb-entry[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;padding:14px 20px;background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-md)}.lb-entry.is-me[_ngcontent-%COMP%]{border-color:var(--primary);background:#6c5ce71a}.lb-entry.top-1[_ngcontent-%COMP%]{background:linear-gradient(135deg,rgba(255,215,0,.1),transparent);border-color:#ffd7004d}.lb-entry.top-2[_ngcontent-%COMP%]{background:linear-gradient(135deg,rgba(192,192,192,.08),transparent);border-color:#c0c0c033}.lb-entry.top-3[_ngcontent-%COMP%]{background:linear-gradient(135deg,rgba(205,127,50,.08),transparent);border-color:#cd7f3233}.lb-rank[_ngcontent-%COMP%]{font-weight:800;width:28px;color:var(--text-muted)}.lb-medal[_ngcontent-%COMP%]{font-size:1.2rem}.lb-name[_ngcontent-%COMP%]{flex:1;font-weight:600;text-align:left}.lb-score[_ngcontent-%COMP%]{font-weight:800;color:var(--primary-light)}.complete-content[_ngcontent-%COMP%]{text-align:center}.confetti-emoji[_ngcontent-%COMP%]{font-size:4rem;margin-bottom:16px}.final-rank[_ngcontent-%COMP%], .final-score[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;margin:24px 0}.rank-big[_ngcontent-%COMP%]{font-size:4rem;font-weight:900;color:var(--accent-light)}.rank-label[_ngcontent-%COMP%], .score-label[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem;text-transform:uppercase}.score-big[_ngcontent-%COMP%]{font-size:3rem;font-weight:800;color:var(--primary-light)}@media (max-width: 768px){.options-grid.two-col[_ngcontent-%COMP%]{grid-template-columns:1fr}.q-body[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1.2rem}.rev-bar[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:4px}.rev-label[_ngcontent-%COMP%]{text-align:left}}"]})}}return e})();export{rt as PlayComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ba as h,Ma as o,p as r,s as n}from"./chunk-UNSARXTF.js";var $=(()=>{class e{constructor(t){this.http=t,this.baseUrl=o.apiUrl}getQuizzes(){return this.http.get(`${this.baseUrl}/quizzes`)}getQuiz(t){return this.http.get(`${this.baseUrl}/quizzes/${t}`)}createQuiz(t){return this.http.post(`${this.baseUrl}/quizzes`,t)}updateQuiz(t,s){return this.http.patch(`${this.baseUrl}/quizzes/${t}`,s)}deleteQuiz(t){return this.http.delete(`${this.baseUrl}/quizzes/${t}`)}getQuestions(t){return this.http.get(`${this.baseUrl}/quizzes/${t}/questions`)}createQuestion(t,s){return this.http.post(`${this.baseUrl}/quizzes/${t}/questions`,s)}updateQuestion(t,s,i){return this.http.patch(`${this.baseUrl}/quizzes/${t}/questions/${s}`,i)}deleteQuestion(t,s){return this.http.delete(`${this.baseUrl}/quizzes/${t}/questions/${s}`)}startSession(t){return this.http.post(`${this.baseUrl}/quizzes/${t}/start_session`,{})}getSession(t){return this.http.get(`${this.baseUrl}/sessions/${t}`)}joinSession(t,s){return this.http.post(`${this.baseUrl}/sessions/0/join`,{join_code:t,display_name:s})}advanceSession(t){return this.http.post(`${this.baseUrl}/sessions/${t}/advance`,{})}submitAnswer(t,s,i,a){return this.http.post(`${this.baseUrl}/sessions/${t}/submit_answer`,{participant_id:s,selected_option:i,time_taken_ms:a})}getLeaderboard(t,s=10){return this.http.get(`${this.baseUrl}/sessions/${t}/leaderboard?limit=${s}`)}getResults(t){return this.http.get(`${this.baseUrl}/sessions/${t}/results`)}static{this.\u0275fac=function(s){return new(s||e)(n(h))}}static{this.\u0275prov=r({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();export{$ as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as I,b as z,c as F,d as N,e as T,f as W,m as j,n as q,o as D,q as A}from"./chunk-VXET42KR.js";import{a as k}from"./chunk-BDRARPDM.js";import{$ as y,A as g,Aa as E,B as p,H as a,I as u,Ja as L,Ka as V,Q as c,S as s,V as e,W as t,Y as x,Z as M,_ as S,aa as n,ba as w,ea as h,fa as f,ga as _,ia as P,v as C,xa as O}from"./chunk-UNSARXTF.js";function B(i,v){if(i&1&&(e(0,"div",18),n(1),t()),i&2){let o=S();a(),w(o.error)}}function R(i,v){i&1&&(e(0,"span"),n(1,"Sign In"),t())}function G(i,v){i&1&&(e(0,"span"),n(1,"Signing in..."),t())}var $=(()=>{class i{constructor(o,d){this.authService=o,this.router=d,this.email="",this.password="",this.error="",this.loading=!1}onSubmit(){this.loading=!0,this.error="",this.authService.login({email:this.email,password:this.password}).subscribe({next:o=>{this.loading=!1,o.user.role==="admin"?this.router.navigate(["/admin/dashboard"]):this.router.navigate(["/join"])},error:o=>{this.loading=!1,this.error=o.error?.error||"Login failed. Please try again."}})}static{this.\u0275fac=function(d){return new(d||i)(u(k),u(L))}}static{this.\u0275cmp=C({type:i,selectors:[["app-login"]],standalone:!0,features:[P],decls:33,vars:6,consts:[["loginForm","ngForm"],[1,"auth-page"],[1,"auth-card","animate-scale-in"],[1,"auth-header","text-center"],[1,"auth-icon"],[1,"text-secondary"],[3,"ngSubmit"],[1,"form-group"],[1,"form-label"],["type","email","name","email","placeholder","admin@commudle.com","required","","email","","autocomplete","email",1,"form-input",3,"ngModelChange","ngModel"],["type","password","name","password","placeholder","\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022","required","","minlength","6","autocomplete","current-password",1,"form-input",3,"ngModelChange","ngModel"],["class","error-msg",4,"ngIf"],["type","submit",1,"btn","btn-primary","btn-lg","btn-full",3,"disabled"],[4,"ngIf"],[1,"auth-footer","text-center"],["routerLink","/auth/register",1,"link"],[1,"divider"],["routerLink","/join",1,"btn","btn-outline","btn-full"],[1,"error-msg"]],template:function(d,r){if(d&1){let m=x();e(0,"div",1)(1,"div",2)(2,"div",3)(3,"h1",4),n(4,"\u26A1"),t(),e(5,"h2"),n(6,"Welcome Back"),t(),e(7,"p",5),n(8,"Sign in to manage your quizzes"),t()(),e(9,"form",6,0),M("ngSubmit",function(){return g(m),p(r.onSubmit())}),e(11,"div",7)(12,"label",8),n(13,"Email"),t(),e(14,"input",9),_("ngModelChange",function(l){return g(m),f(r.email,l)||(r.email=l),p(l)}),t()(),e(15,"div",7)(16,"label",8),n(17,"Password"),t(),e(18,"input",10),_("ngModelChange",function(l){return g(m),f(r.password,l)||(r.password=l),p(l)}),t()(),c(19,B,2,1,"div",11),e(20,"button",12),c(21,R,2,0,"span",13)(22,G,2,0,"span",13),t()(),e(23,"div",14)(24,"p"),n(25,"Don't have an account? "),e(26,"a",15),n(27,"Create one"),t()(),e(28,"div",16)(29,"span"),n(30,"or"),t()(),e(31,"a",17),n(32,"Join a Quiz as Guest"),t()()()()}if(d&2){let m=y(10);a(14),h("ngModel",r.email),a(4),h("ngModel",r.password),a(),s("ngIf",r.error),a(),s("disabled",r.loading||!m.valid),a(),s("ngIf",!r.loading),a(),s("ngIf",r.loading)}},dependencies:[E,O,A,W,I,z,F,j,D,q,T,N,V],styles:['.auth-page[_ngcontent-%COMP%]{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(ellipse at 30% 20%,rgba(108,92,231,.12) 0%,transparent 50%),radial-gradient(ellipse at 70% 80%,rgba(0,206,201,.08) 0%,transparent 50%)}.auth-card[_ngcontent-%COMP%]{width:100%;max-width:440px;background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-xl);padding:40px}.auth-header[_ngcontent-%COMP%]{margin-bottom:32px}.auth-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-top:12px}.auth-header[_ngcontent-%COMP%] .text-secondary[_ngcontent-%COMP%]{color:var(--text-secondary);margin-top:8px}.auth-icon[_ngcontent-%COMP%]{font-size:3rem}.error-msg[_ngcontent-%COMP%]{background:#ff6b6b1a;border:1px solid rgba(255,107,107,.3);color:var(--danger);padding:12px 16px;border-radius:var(--radius-md);margin-bottom:16px;font-size:.9rem}.auth-footer[_ngcontent-%COMP%]{margin-top:24px}.auth-footer[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem}.auth-footer[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:var(--primary-light);text-decoration:none;font-weight:500}.auth-footer[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]:hover{text-decoration:underline}.divider[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;margin:20px 0;color:var(--text-muted);font-size:.85rem}.divider[_ngcontent-%COMP%]:before, .divider[_ngcontent-%COMP%]:after{content:"";flex:1;height:1px;background:var(--border-light)}']})}}return i})();export{$ as LoginComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"./chunk-BDRARPDM.js";import{Ma as h,e as c,p as o,s as r}from"./chunk-UNSARXTF.js";var S=(()=>{class s{constructor(t){this.authService=t,this.ws=null,this.eventsSubject=new c,this.reconnectAttempts=0,this.maxReconnectAttempts=10,this.currentSessionId=null,this.participantId=null,this.events$=this.eventsSubject.asObservable()}connect(t,n){this.currentSessionId=t,this.participantId=n||null,this.reconnectAttempts=0,this.doConnect()}disconnect(){this.currentSessionId=null,this.participantId=null,this.reconnectAttempts=this.maxReconnectAttempts,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.ws&&(this.ws.close(),this.ws=null)}doConnect(){this.ws&&this.ws.close();let t=this.authService.token||"",n=this.participantId?`&participant_id=${this.participantId}`:"",p=`${h.wsUrl}?token=${t}${n}`;this.ws=new WebSocket(p),this.ws.onopen=()=>{console.log("[WS] Connected"),this.reconnectAttempts=0;let i={command:"subscribe",identifier:JSON.stringify({channel:"QuizSessionChannel",session_id:this.currentSessionId})};this.ws.send(JSON.stringify(i))},this.ws.onmessage=i=>{try{let e=JSON.parse(i.data);if(e.type==="ping"||e.type==="welcome"||e.type==="confirm_subscription")return;e.message&&this.eventsSubject.next(e.message)}catch(e){console.error("[WS] Parse error",e)}},this.ws.onclose=()=>{console.log("[WS] Disconnected"),this.tryReconnect()},this.ws.onerror=i=>{console.error("[WS] Error",i)}}tryReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts||!this.currentSessionId)return;this.reconnectAttempts++;let t=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);console.log(`[WS] Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),this.reconnectTimer=setTimeout(()=>this.doConnect(),t)}ngOnDestroy(){this.disconnect()}static{this.\u0275fac=function(n){return new(n||s)(r(a))}}static{this.\u0275prov=o({token:s,factory:s.\u0275fac,providedIn:"root"})}}return s})();export{S as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ba as c,Ma as o,f as i,m as s,p as n,s as u}from"./chunk-UNSARXTF.js";var g=(()=>{class r{constructor(t){this.http=t,this.currentUserSubject=new i(null),this.tokenSubject=new i(null),this.currentUser$=this.currentUserSubject.asObservable(),this.token$=this.tokenSubject.asObservable(),this.loadFromStorage()}get currentUser(){return this.currentUserSubject.value}get token(){return this.tokenSubject.value}get isLoggedIn(){return!!this.token}get isAdmin(){return this.currentUser?.role==="admin"}login(t){return this.http.post(`${o.apiUrl}/auth/login`,t).pipe(s(e=>this.setSession(e)))}register(t){return this.http.post(`${o.apiUrl}/auth/register`,t).pipe(s(e=>this.setSession(e)))}fetchMe(){return this.http.get(`${o.apiUrl}/auth/me`).pipe(s(t=>{this.currentUserSubject.next(t.user),localStorage.setItem("quiz_user",JSON.stringify(t.user))}))}logout(){localStorage.removeItem("quiz_token"),localStorage.removeItem("quiz_user"),this.currentUserSubject.next(null),this.tokenSubject.next(null)}setSession(t){localStorage.setItem("quiz_token",t.token),localStorage.setItem("quiz_user",JSON.stringify(t.user)),this.tokenSubject.next(t.token),this.currentUserSubject.next(t.user)}loadFromStorage(){let t=localStorage.getItem("quiz_token"),e=localStorage.getItem("quiz_user");if(t&&e)try{this.tokenSubject.next(t),this.currentUserSubject.next(JSON.parse(e))}catch{this.logout()}}static{this.\u0275fac=function(e){return new(e||r)(u(c))}}static{this.\u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})}}return r})();export{g as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as D,b as W,e as A,g as N,h as L,i as j,j as R,k as U,l as J,q as G}from"./chunk-VXET42KR.js";import{a as H}from"./chunk-4S3ZLLNI.js";import{A as u,Aa as B,B as c,H as s,Ha as T,I as Q,Ja as F,Ka as I,Q as x,S as _,T as M,U as y,V as n,W as i,Y as C,Z as p,_ as d,aa as r,ba as f,ca as g,ea as h,fa as v,ga as b,ia as q,la as z,na as O,oa as P,v as w,va as S,wa as V,xa as E,ya as k}from"./chunk-UNSARXTF.js";var K=(a,m)=>({"badge-success":a,"badge-warning":m});function X(a,m){if(a&1&&(n(0,"div",36)(1,"span",37),r(2),i(),r(3),i()),a&2){let e=m.$implicit,o=d().$implicit;y("correct",e.id===o.correct_option),s(2),f(e.id===o.correct_option?"\u2713":"\u25CB"),s(),g(" ",e.text," ")}}function Y(a,m){if(a&1){let e=C();n(0,"div",25)(1,"div",26)(2,"div",27),r(3),i(),n(4,"div",28)(5,"span",29),r(6),i(),n(7,"div",30)(8,"span",31),r(9),O(10,"titlecase"),i(),n(11,"span"),r(12),i(),n(13,"span"),r(14),i()()(),n(15,"div",32)(16,"button",33),p("click",function(){let t=u(e).$implicit,l=d(2);return c(l.editQuestion(t))}),r(17,"\u270F\uFE0F"),i(),n(18,"button",33),p("click",function(){let t=u(e).$implicit,l=d(2);return c(l.removeQuestion(t))}),r(19,"\u{1F5D1}\uFE0F"),i()()(),n(20,"div",34),x(21,X,4,4,"div",35),i()()}if(a&2){let e=m.$implicit,o=m.index;M("animation-delay",o*60+"ms"),y("animate-fade-in",!0),s(3),g("Q",o+1,""),s(3),f(e.body),s(3),f(P(10,10,e.question_type)),s(3),g("\u23F1 ",e.time_limit_seconds,"s"),s(2),g("\u{1F3C6} ",e.points," pts"),s(7),_("ngForOf",e.options)}}function Z(a,m){a&1&&(n(0,"div",38)(1,"h3"),r(2,"\u{1F4CB}"),i(),n(3,"p"),r(4,"No questions yet. Add your first question to get started."),i()())}function $(a,m){if(a&1){let e=C();n(0,"button",33),p("click",function(){u(e);let t=d().index,l=d(3);return c(l.removeOption(t))}),r(1,"\u2715"),i()}}function ee(a,m){if(a&1){let e=C();n(0,"div",55)(1,"button",56),p("click",function(){let t=u(e).$implicit,l=d(3);return c(l.formQuestion.correct_option=t.id)}),r(2),i(),n(3,"input",57),b("ngModelChange",function(t){let l=u(e).$implicit;return v(l.text,t)||(l.text=t),c(t)}),i(),x(4,$,2,0,"button",51),i()}if(a&2){let e=m.$implicit,o=d(3);s(),y("active",o.formQuestion.correct_option===e.id),_("disabled",o.formQuestion.question_type==="poll")("title",o.formQuestion.question_type==="poll"?"Polls have no correct answer":"Set as correct"),s(),g(" ",o.formQuestion.correct_option===e.id?"\u2713":"\u25CB"," "),s(),h("ngModel",e.text),_("placeholder","Option "+e.id.toUpperCase()),s(),_("ngIf",o.formQuestion.options.length>2)}}function te(a,m){if(a&1){let e=C();n(0,"button",33),p("click",function(){u(e);let t=d(3);return c(t.addOption())}),r(1,"\uFF0B Add Option"),i()}}function ie(a,m){if(a&1){let e=C();n(0,"div",39),p("click",function(){u(e);let t=d(2);return c(t.closeModal())}),n(1,"div",40),p("click",function(t){return u(e),c(t.stopPropagation())}),n(2,"h2"),r(3),i(),n(4,"div",11)(5,"label",12),r(6,"Question Text"),i(),n(7,"textarea",41),b("ngModelChange",function(t){u(e);let l=d(2);return v(l.formQuestion.body,t)||(l.formQuestion.body=t),c(t)}),i()(),n(8,"div",42)(9,"div",11)(10,"label",12),r(11,"Type"),i(),n(12,"select",43),b("ngModelChange",function(t){u(e);let l=d(2);return v(l.formQuestion.question_type,t)||(l.formQuestion.question_type=t),c(t)}),p("change",function(){u(e);let t=d(2);return c(t.onTypeChange())}),n(13,"option",44),r(14,"Multiple Choice"),i(),n(15,"option",45),r(16,"True / False"),i(),n(17,"option",46),r(18,"Poll (No Correct Answer)"),i()()(),n(19,"div",11)(20,"label",12),r(21,"Time Limit (seconds)"),i(),n(22,"input",47),b("ngModelChange",function(t){u(e);let l=d(2);return v(l.formQuestion.time_limit_seconds,t)||(l.formQuestion.time_limit_seconds=t),c(t)}),i()(),n(23,"div",11)(24,"label",12),r(25,"Points"),i(),n(26,"input",48),b("ngModelChange",function(t){u(e);let l=d(2);return v(l.formQuestion.points,t)||(l.formQuestion.points=t),c(t)}),i()()(),n(27,"div",11)(28,"label",12),r(29,"Options"),i(),n(30,"div",49),x(31,ee,5,8,"div",50)(32,te,2,0,"button",51),i()(),n(33,"div",52)(34,"button",53),p("click",function(){u(e);let t=d(2);return c(t.closeModal())}),r(35,"Cancel"),i(),n(36,"button",54),p("click",function(){u(e);let t=d(2);return c(t.saveQuestion())}),r(37),i()()()()}if(a&2){let e=d(2);s(3),f(e.editingQuestion?"Edit Question":"Add Question"),s(4),h("ngModel",e.formQuestion.body),s(5),h("ngModel",e.formQuestion.question_type),s(10),h("ngModel",e.formQuestion.time_limit_seconds),s(4),h("ngModel",e.formQuestion.points),s(5),_("ngForOf",e.formQuestion.options),s(),_("ngIf",e.formQuestion.options.length<6),s(4),_("disabled",!e.formQuestion.body||!e.formQuestion.options.length),s(),g(" ",e.editingQuestion?"Update":"Add"," Question ")}}function ne(a,m){if(a&1){let e=C();n(0,"div",1)(1,"div",2)(2,"div",3)(3,"div",4)(4,"a",5),r(5,"\u2190 Back"),i(),n(6,"div")(7,"h2"),r(8),i(),n(9,"span",6),r(10),i()()(),n(11,"div",7)(12,"button",8),p("click",function(){u(e);let t=d();return c(t.togglePublish())}),r(13),i()()(),n(14,"div",9)(15,"h4"),r(16,"Quiz Details"),i(),n(17,"div",10)(18,"div",11)(19,"label",12),r(20,"Title"),i(),n(21,"input",13),b("ngModelChange",function(t){u(e);let l=d();return v(l.quiz.title,t)||(l.quiz.title=t),c(t)}),p("blur",function(){u(e);let t=d();return c(t.saveQuizDetails())}),i()(),n(22,"div",11)(23,"label",12),r(24,"Description"),i(),n(25,"textarea",14),b("ngModelChange",function(t){u(e);let l=d();return v(l.quiz.description,t)||(l.quiz.description=t),c(t)}),p("blur",function(){u(e);let t=d();return c(t.saveQuizDetails())}),i()()(),n(26,"div",15)(27,"span",16),r(28,"Join Code:"),i(),n(29,"span",17),r(30),i()()(),n(31,"div",18)(32,"div",19)(33,"h3"),r(34),i(),n(35,"button",20),p("click",function(){u(e);let t=d();return c(t.showAddQuestion=!0)}),r(36,"\uFF0B Add Question"),i()(),n(37,"div",21),x(38,Y,22,12,"div",22),i(),x(39,Z,5,0,"div",23),i()(),x(40,ie,38,9,"div",24),i()}if(a&2){let e=d();s(8),f(e.quiz.title),s(),_("ngClass",z(13,K,e.quiz.status==="published",e.quiz.status==="draft")),s(),f(e.quiz.status),s(2),y("btn-secondary",e.quiz.status==="draft"),s(),g(" ",e.quiz.status==="draft"?"\u{1F4E2} Publish":"\u{1F4DD} Unpublish"," "),s(8),h("ngModel",e.quiz.title),s(4),h("ngModel",e.quiz.description),s(5),f(e.quiz.join_code),s(4),g("Questions (",e.questions.length,")"),s(4),_("ngForOf",e.questions),s(),_("ngIf",e.questions.length===0),s(),_("ngIf",e.showAddQuestion||e.editingQuestion)}}var pe=(()=>{class a{constructor(e,o,t){this.api=e,this.route=o,this.router=t,this.quiz=null,this.questions=[],this.showAddQuestion=!1,this.editingQuestion=null,this.formQuestion=this.defaultFormQuestion()}ngOnInit(){let e=Number(this.route.snapshot.paramMap.get("id"));this.loadQuiz(e)}loadQuiz(e){this.api.getQuiz(e).subscribe({next:o=>{this.quiz=o.quiz,this.questions=o.quiz.questions||[]},error:()=>this.router.navigate(["/admin/dashboard"])})}saveQuizDetails(){this.quiz&&this.api.updateQuiz(this.quiz.id,{title:this.quiz.title,description:this.quiz.description}).subscribe()}togglePublish(){if(!this.quiz)return;let e=this.quiz.status==="draft"?"published":"draft";this.api.updateQuiz(this.quiz.id,{status:e}).subscribe({next:o=>{this.quiz=o.quiz}})}onTypeChange(){this.formQuestion.question_type==="true_false"?(this.formQuestion.options=[{id:"true",text:"True"},{id:"false",text:"False"}],this.formQuestion.correct_option="true"):this.formQuestion.question_type==="poll"?(this.formQuestion.correct_option="",this.formQuestion.points=0):this.formQuestion.options.length<2&&(this.formQuestion.options=this.defaultOptions())}addOption(){let e=String.fromCharCode(97+this.formQuestion.options.length);this.formQuestion.options.push({id:e,text:""})}removeOption(e){this.formQuestion.options.splice(e,1)}editQuestion(e){this.editingQuestion=e,this.formQuestion={body:e.body,question_type:e.question_type,time_limit_seconds:e.time_limit_seconds,points:e.points,options:[...e.options],correct_option:e.correct_option||""}}saveQuestion(){if(!this.quiz)return;let e={body:this.formQuestion.body,question_type:this.formQuestion.question_type,time_limit_seconds:this.formQuestion.time_limit_seconds,points:this.formQuestion.points,options:this.formQuestion.options,correct_option:this.formQuestion.question_type==="poll"?null:this.formQuestion.correct_option};this.editingQuestion?this.api.updateQuestion(this.quiz.id,this.editingQuestion.id,e).subscribe({next:()=>{this.loadQuiz(this.quiz.id),this.closeModal()}}):this.api.createQuestion(this.quiz.id,e).subscribe({next:()=>{this.loadQuiz(this.quiz.id),this.closeModal()}})}removeQuestion(e){this.quiz&&confirm("Delete this question?")&&this.api.deleteQuestion(this.quiz.id,e.id).subscribe({next:()=>{this.questions=this.questions.filter(o=>o.id!==e.id)}})}closeModal(){this.showAddQuestion=!1,this.editingQuestion=null,this.formQuestion=this.defaultFormQuestion()}defaultFormQuestion(){return{body:"",question_type:"multiple_choice",time_limit_seconds:20,points:1e3,options:this.defaultOptions(),correct_option:"a"}}defaultOptions(){return[{id:"a",text:""},{id:"b",text:""},{id:"c",text:""},{id:"d",text:""}]}static{this.\u0275fac=function(o){return new(o||a)(Q(H),Q(T),Q(F))}}static{this.\u0275cmp=w({type:a,selectors:[["app-quiz-builder"]],standalone:!0,features:[q],decls:1,vars:1,consts:[["class","builder",4,"ngIf"],[1,"builder"],[1,"container"],[1,"builder-header","animate-fade-in"],[1,"header-left"],["routerLink","/admin/dashboard",1,"btn","btn-ghost","btn-sm"],[1,"badge",3,"ngClass"],[1,"header-actions"],[1,"btn","btn-outline","btn-sm",3,"click"],[1,"quiz-details","card","animate-slide-up"],[1,"details-grid"],[1,"form-group"],[1,"form-label"],["type","text",1,"form-input",3,"ngModelChange","blur","ngModel"],["rows","2",1,"form-input",3,"ngModelChange","blur","ngModel"],[1,"quiz-code"],[1,"code-label"],[1,"code-value"],[1,"questions-section","animate-slide-up",2,"animation-delay","100ms"],[1,"section-header"],[1,"btn","btn-primary",3,"click"],[1,"question-list"],["class","question-card card",3,"animation-delay","animate-fade-in",4,"ngFor","ngForOf"],["class","empty-questions card",4,"ngIf"],["class","modal-overlay",3,"click",4,"ngIf"],[1,"question-card","card"],[1,"q-header"],[1,"q-number"],[1,"q-info"],[1,"q-body"],[1,"q-meta"],[1,"badge","badge-primary"],[1,"q-actions"],[1,"btn","btn-ghost","btn-sm",3,"click"],[1,"q-options"],["class","q-option",3,"correct",4,"ngFor","ngForOf"],[1,"q-option"],[1,"opt-marker"],[1,"empty-questions","card"],[1,"modal-overlay",3,"click"],[1,"modal","modal-lg","animate-scale-in",3,"click"],["placeholder","Type your question here...","rows","3",1,"form-input",3,"ngModelChange","ngModel"],[1,"form-row"],[1,"form-input",3,"ngModelChange","change","ngModel"],["value","multiple_choice"],["value","true_false"],["value","poll"],["type","number","min","5","max","120",1,"form-input",3,"ngModelChange","ngModel"],["type","number","min","0","max","2000",1,"form-input",3,"ngModelChange","ngModel"],[1,"options-editor"],["class","option-row",4,"ngFor","ngForOf"],["class","btn btn-ghost btn-sm",3,"click",4,"ngIf"],[1,"modal-actions"],[1,"btn","btn-ghost",3,"click"],[1,"btn","btn-primary",3,"click","disabled"],[1,"option-row"],[1,"opt-correct-btn",3,"click","disabled","title"],["type","text",1,"form-input",3,"ngModelChange","ngModel","placeholder"]],template:function(o,t){o&1&&x(0,ne,41,16,"div",0),o&2&&_("ngIf",t.quiz)},dependencies:[B,S,V,E,k,G,j,R,D,N,L,W,J,U,A,I],styles:[".builder[_ngcontent-%COMP%]{padding:32px 0}.builder-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px}.header-left[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-right:8px}.quiz-details[_ngcontent-%COMP%]{margin-bottom:32px}.quiz-details[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin-bottom:16px;color:var(--text-secondary);font-weight:500}.details-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 2fr;gap:16px}.quiz-code[_ngcontent-%COMP%]{margin-top:16px;padding-top:16px;border-top:1px solid var(--border-light);display:flex;align-items:center;gap:12px}.code-label[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.85rem}.code-value[_ngcontent-%COMP%]{font-family:Courier New,monospace;font-size:1.5rem;font-weight:800;color:var(--primary-light);letter-spacing:.2em}.section-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px}.question-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px}.q-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:16px}.q-number[_ngcontent-%COMP%]{width:40px;height:40px;background:linear-gradient(135deg,var(--primary),var(--primary-dark));border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;flex-shrink:0}.q-info[_ngcontent-%COMP%]{flex:1}.q-body[_ngcontent-%COMP%]{font-weight:500;display:block;margin-bottom:8px}.q-meta[_ngcontent-%COMP%]{display:flex;gap:12px;font-size:.8rem;color:var(--text-muted);align-items:center}.q-actions[_ngcontent-%COMP%]{display:flex;gap:4px}.q-options[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border-light)}.q-option[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--bg-surface);border-radius:var(--radius-sm);font-size:.9rem;color:var(--text-secondary)}.q-option.correct[_ngcontent-%COMP%]{background:#00b8941a;color:var(--success);border:1px solid rgba(0,184,148,.3)}.opt-marker[_ngcontent-%COMP%]{font-weight:700;font-size:.85rem}.empty-questions[_ngcontent-%COMP%]{text-align:center;padding:40px;color:var(--text-muted)}.empty-questions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:2rem;margin-bottom:8px}.modal-overlay[_ngcontent-%COMP%]{position:fixed;inset:0;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:2000;padding:24px}.modal[_ngcontent-%COMP%]{background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-xl);padding:32px;width:100%;max-width:600px;max-height:90vh;overflow-y:auto}.modal[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-bottom:24px}.form-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.options-editor[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px}.option-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.option-row[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]{flex:1}.opt-correct-btn[_ngcontent-%COMP%]{width:36px;height:36px;border-radius:50%;border:2px solid var(--border-light);background:transparent;color:var(--text-muted);font-size:1rem;cursor:pointer;transition:all var(--transition-fast);flex-shrink:0}.opt-correct-btn.active[_ngcontent-%COMP%]{background:var(--success);border-color:var(--success);color:#fff}.opt-correct-btn[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:not-allowed}.modal-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:12px;margin-top:24px}@media (max-width: 768px){.details-grid[_ngcontent-%COMP%], .form-row[_ngcontent-%COMP%], .q-options[_ngcontent-%COMP%]{grid-template-columns:1fr}}"]})}}return a})();export{pe as QuizBuilderComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as z}from"./chunk-6ZHAJFTP.js";import"./chunk-BDRARPDM.js";import{a as T}from"./chunk-4S3ZLLNI.js";import{A as _,Aa as k,B as g,H as a,Ha as D,I as u,Ja as q,Q as m,S as s,T as C,U as x,V as e,W as n,X as y,Y as v,Z as b,_ as l,aa as r,ba as d,ca as f,da as h,ia as M,na as O,oa as P,v as w,wa as S,xa as I,za as E}from"./chunk-UNSARXTF.js";function H(i,c){if(i&1){let t=v();e(0,"div",17)(1,"div",18)(2,"div",19),r(3,"\u{1F3AF}"),n(),e(4,"h1"),r(5,"Waiting for Players"),n(),e(6,"div",20)(7,"div",21),r(8,"Join at "),e(9,"strong"),r(10,"localhost:4200/join"),n()(),e(11,"div",22),r(12),n()(),e(13,"div",23)(14,"span",24),r(15),n(),e(16,"span"),r(17,"players joined"),n()(),e(18,"button",25),b("click",function(){_(t);let p=l(2);return g(p.advance())}),r(19," \u25B6 Start Quiz "),n()()()}if(i&2){let t=l(2);a(12),d(t.session.join_code),a(3),d(t.session.participant_count),a(3),s("disabled",t.session.participant_count===0||t.advancing)}}function F(i,c){if(i&1&&(e(0,"h2",35),r(1),n()),i&2){let t=l(3);a(),d(t.currentQuestion.body)}}function R(i,c){if(i&1){let t=v();e(0,"div",26)(1,"div",27)(2,"div",28),r(3),n(),e(4,"div",29),y(5,"div",30),n(),e(6,"div",31),r(7),n(),m(8,F,2,1,"h2",32),e(9,"div",33)(10,"span"),r(11),n()()(),e(12,"button",34),b("click",function(){_(t);let p=l(2);return g(p.advance())}),r(13," Skip \u2192 Reveal Answer "),n()()}if(i&2){let t=l(2);a(3),h(" Question ",t.session.current_question_index+1," / ",t.session.total_questions," "),a(2),C("width",t.timerPercent,"%"),a(2),f("",t.timeRemaining,"s"),a(),s("ngIf",t.currentQuestion),a(3),h("",t.answerCount," / ",t.session.participant_count," answered"),a(),s("disabled",t.advancing)}}function V(i,c){if(i&1&&(e(0,"div",43)(1,"div",44),r(2),n(),e(3,"div",45),y(4,"div",46),n(),e(5,"span",47),r(6),n()()),i&2){let t=c.$implicit,o=l(4);a(),x("correct",t.option_id===o.correctOption),a(),h(" ",t.option_id===o.correctOption?"\u2713":""," ",t.option_text," "),a(2),C("width",t.percentage,"%"),x("correct",t.option_id===o.correctOption),a(2),h("",t.count," (",t.percentage,"%)")}}function Q(i,c){if(i&1&&(e(0,"div",41),m(1,V,7,10,"div",42),n()),i&2){let t=l(3);a(),s("ngForOf",t.answerDistribution)}}function A(i,c){if(i&1){let t=v();e(0,"div",36)(1,"div",37)(2,"h2"),r(3,"Answer Results"),n(),m(4,Q,2,1,"div",38),e(5,"div",39)(6,"span"),r(7),n(),e(8,"span"),r(9),n()()(),e(10,"button",40),b("click",function(){_(t);let p=l(2);return g(p.advance())}),r(11," Next \u2192 Leaderboard "),n()()}if(i&2){let t=l(2);a(4),s("ngIf",t.answerDistribution.length),a(3),f("\u2705 ",t.correctCount," correct"),a(2),f("\u{1F4CA} ",t.totalResponses," total responses"),a(),s("disabled",t.advancing)}}function N(i,c){if(i&1&&(e(0,"span",57),r(1),n()),i&2){let t=l().index;a(),d(t===0?"\u{1F947}":t===1?"\u{1F948}":"\u{1F949}")}}function B(i,c){if(i&1&&(e(0,"div",52)(1,"span",53),r(2),n(),m(3,N,2,1,"span",54),e(4,"span",55),r(5),n(),e(6,"span",56),r(7),O(8,"number"),n()()),i&2){let t=c.$implicit,o=c.index;C("animation-delay",o*100+"ms"),x("animate-slide-up",!0)("top-1",o===0)("top-2",o===1)("top-3",o===2),a(2),d(t.rank),a(),s("ngIf",o<3),a(2),d(t.display_name),a(2),d(P(8,14,t.score))}}function L(i,c){if(i&1){let t=v();e(0,"div",48)(1,"div",49)(2,"h2"),r(3,"\u{1F3C6} Leaderboard"),n(),e(4,"div",50),m(5,B,9,16,"div",51),n()(),e(6,"button",40),b("click",function(){_(t);let p=l(2);return g(p.advance())}),r(7),n()()}if(i&2){let t=l(2);a(5),s("ngForOf",t.leaderboard),a(),s("disabled",t.advancing),a(),f(" ",t.hasMoreQuestions?"Next Question \u2192":"\u{1F3C1} End Quiz"," ")}}function W(i,c){if(i&1&&(e(0,"span",57),r(1),n()),i&2){let t=l().index;a(),d(t===0?"\u{1F947}":t===1?"\u{1F948}":"\u{1F949}")}}function $(i,c){if(i&1&&(e(0,"div",52)(1,"span",53),r(2),n(),m(3,W,2,1,"span",54),e(4,"span",55),r(5),n(),e(6,"span",56),r(7),O(8,"number"),n()()),i&2){let t=c.$implicit,o=c.index;x("top-1",o===0)("top-2",o===1)("top-3",o===2),a(2),d(t.rank),a(),s("ngIf",o<3),a(2),d(t.display_name),a(2),d(P(8,10,t.score))}}function J(i,c){if(i&1&&(e(0,"div",58)(1,"div",59)(2,"div",60),r(3,"\u{1F389}"),n(),e(4,"h1"),r(5,"Quiz Complete!"),n(),e(6,"div",61)(7,"h3"),r(8,"Final Results"),n(),e(9,"div",50),m(10,$,9,12,"div",62),n()(),e(11,"button",63),r(12,"Back to Dashboard"),n()()()),i&2){let t=l(2);a(10),s("ngForOf",t.leaderboard)}}function G(i,c){if(i&1&&(e(0,"div",1)(1,"div",2)(2,"div",3)(3,"span",4),r(4,"LIVE"),n(),e(5,"h3"),r(6),n()(),e(7,"div",5)(8,"div",6)(9,"span",7),r(10,"Join Code"),n(),e(11,"span",8),r(12),n()(),e(13,"div",9)(14,"span",10),r(15,"\u{1F465}"),n(),e(16,"span",11),r(17),n()()()(),m(18,H,20,3,"div",12)(19,R,14,9,"div",13)(20,A,12,4,"div",14)(21,L,8,3,"div",15)(22,J,13,1,"div",16),n()),i&2){let t=l();a(6),d(t.session.quiz_title),a(6),d(t.session.join_code),a(5),d(t.session.participant_count),a(),s("ngIf",t.session.state==="lobby"),a(),s("ngIf",t.session.state==="question_active"),a(),s("ngIf",t.session.state==="answer_reveal"),a(),s("ngIf",t.session.state==="leaderboard_display"),a(),s("ngIf",t.session.state==="completed")}}var et=(()=>{class i{constructor(t,o,p,j){this.api=t,this.ws=o,this.route=p,this.router=j,this.session=null,this.leaderboard=[],this.answerDistribution=[],this.correctOption="",this.correctCount=0,this.totalResponses=0,this.answerCount=0,this.hasMoreQuestions=!0,this.advancing=!1,this.timeRemaining=0,this.timerPercent=100,this.currentQuestion=null}ngOnInit(){let t=Number(this.route.snapshot.paramMap.get("id"));this.loadSession(t)}loadSession(t){this.api.getSession(t).subscribe({next:o=>{this.session=o.session,this.connectWebSocket(t)},error:()=>this.router.navigate(["/admin/dashboard"])})}connectWebSocket(t){this.ws.connect(t),this.wsSub=this.ws.events$.subscribe(o=>{switch(o.type){case"participant_joined":this.session&&(this.session.participant_count=o.data.participant_count);break;case"question_start":this.session&&(this.session.state="question_active",this.session.current_question_index=o.data.question_index,this.currentQuestion=o.data.question,this.answerCount=0,this.startTimer(o.data.question.time_limit_seconds));break;case"answer_submitted":this.answerCount=o.data.answer_count;break;case"answer_reveal":this.session&&(this.session.state="answer_reveal",this.answerDistribution=o.data.distribution,this.correctOption=o.data.correct_option,this.correctCount=o.data.correct_count,this.totalResponses=o.data.total_responses,this.stopTimer());break;case"leaderboard_update":this.session&&(this.session.state="leaderboard_display",this.leaderboard=o.data.leaderboard,this.hasMoreQuestions=o.data.has_more_questions);break;case"session_complete":this.session&&(this.session.state="completed",this.leaderboard=o.data.final_leaderboard);break}})}advance(){this.session&&(this.advancing=!0,this.api.advanceSession(this.session.id).subscribe({next:t=>{this.session=t.session,this.advancing=!1},error:t=>{this.advancing=!1,console.error("Advance failed:",t)}}))}startTimer(t){this.timeRemaining=t,this.timerPercent=100;let o=t;this.timerInterval&&clearInterval(this.timerInterval),this.timerInterval=setInterval(()=>{this.timeRemaining--,this.timerPercent=this.timeRemaining/o*100,this.timeRemaining<=0&&this.stopTimer()},1e3)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}ngOnDestroy(){this.ws.disconnect(),this.stopTimer(),this.wsSub&&this.wsSub.unsubscribe()}static{this.\u0275fac=function(o){return new(o||i)(u(T),u(z),u(D),u(q))}}static{this.\u0275cmp=w({type:i,selectors:[["app-host-console"]],standalone:!0,features:[M],decls:1,vars:1,consts:[["class","host-console",4,"ngIf"],[1,"host-console"],[1,"top-bar"],[1,"top-left"],[1,"session-badge"],[1,"top-right"],[1,"join-code-display"],[1,"join-label"],[1,"join-code"],[1,"participant-count"],[1,"count-icon"],[1,"count-num"],["class","state-lobby",4,"ngIf"],["class","state-question",4,"ngIf"],["class","state-reveal",4,"ngIf"],["class","state-leaderboard",4,"ngIf"],["class","state-complete",4,"ngIf"],[1,"state-lobby"],[1,"lobby-content","animate-scale-in"],[1,"lobby-icon"],[1,"lobby-code-big"],[1,"code-instruction"],[1,"code-display"],[1,"lobby-count"],[1,"count-big","animate-bounce-in"],[1,"btn","btn-primary","btn-lg",3,"click","disabled"],[1,"state-question"],[1,"question-display","animate-slide-up"],[1,"q-progress"],[1,"q-timer-bar","timer-bar"],[1,"timer-fill"],[1,"q-time"],["class","q-text",4,"ngIf"],[1,"answer-progress"],[1,"btn","btn-accent","btn-lg","host-advance-btn",3,"click","disabled"],[1,"q-text"],[1,"state-reveal"],[1,"reveal-content","animate-scale-in"],["class","distribution-chart",4,"ngIf"],[1,"reveal-stats"],[1,"btn","btn-primary","btn-lg","host-advance-btn",3,"click","disabled"],[1,"distribution-chart"],["class","dist-bar-row",4,"ngFor","ngForOf"],[1,"dist-bar-row"],[1,"dist-label"],[1,"dist-bar-track"],[1,"dist-bar-fill"],[1,"dist-count"],[1,"state-leaderboard"],[1,"leaderboard-content","animate-slide-up"],[1,"lb-list"],["class","lb-entry",3,"animation-delay","animate-slide-up","top-1","top-2","top-3",4,"ngFor","ngForOf"],[1,"lb-entry"],[1,"lb-rank"],["class","lb-medal",4,"ngIf"],[1,"lb-name"],[1,"lb-score"],[1,"lb-medal"],[1,"state-complete"],[1,"complete-content","animate-bounce-in"],[1,"complete-icon"],[1,"final-leaderboard"],["class","lb-entry",3,"top-1","top-2","top-3",4,"ngFor","ngForOf"],["routerLink","/admin/dashboard",1,"btn","btn-outline","btn-lg"]],template:function(o,p){o&1&&m(0,G,23,8,"div",0),o&2&&s("ngIf",p.session)},dependencies:[k,S,I,E],styles:[".host-console[_ngcontent-%COMP%]{min-height:100vh;display:flex;flex-direction:column}.top-bar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 32px;background:#0a0a1ae6;border-bottom:1px solid var(--border-light)}.top-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px}.session-badge[_ngcontent-%COMP%]{background:var(--danger);color:#fff;padding:4px 12px;border-radius:var(--radius-full);font-size:.75rem;font-weight:700;letter-spacing:.1em;animation:pulse 2s infinite}.top-right[_ngcontent-%COMP%]{display:flex;align-items:center;gap:24px}.join-code-display[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:flex-end}.join-label[_ngcontent-%COMP%]{font-size:.7rem;color:var(--text-muted);text-transform:uppercase}.join-code[_ngcontent-%COMP%]{font-family:Courier New,monospace;font-size:1.5rem;font-weight:800;color:var(--primary-light);letter-spacing:.15em}.participant-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:1.2rem;font-weight:700}.state-lobby[_ngcontent-%COMP%]{flex:1;display:flex;align-items:center;justify-content:center;text-align:center}.lobby-icon[_ngcontent-%COMP%]{font-size:4rem;margin-bottom:16px}.lobby-code-big[_ngcontent-%COMP%]{margin:32px 0}.code-instruction[_ngcontent-%COMP%]{color:var(--text-secondary);margin-bottom:12px;font-size:1.1rem}.code-display[_ngcontent-%COMP%]{font-family:Courier New,monospace;font-size:4rem;font-weight:900;letter-spacing:.3em;background:linear-gradient(135deg,var(--primary-light),var(--secondary));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.lobby-count[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:4px;margin-bottom:32px;color:var(--text-secondary)}.count-big[_ngcontent-%COMP%]{font-size:3rem;font-weight:800;color:var(--secondary)}.state-question[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px}.question-display[_ngcontent-%COMP%]{text-align:center;max-width:800px;width:100%}.q-progress[_ngcontent-%COMP%]{color:var(--text-muted);font-size:.9rem;margin-bottom:16px;text-transform:uppercase;letter-spacing:.1em}.q-timer-bar[_ngcontent-%COMP%]{margin-bottom:8px;height:8px}.q-time[_ngcontent-%COMP%]{font-size:2rem;font-weight:800;color:var(--primary-light);margin-bottom:24px}.q-text[_ngcontent-%COMP%]{font-size:1.8rem;line-height:1.4;margin-bottom:32px}.answer-progress[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:1.1rem}.host-advance-btn[_ngcontent-%COMP%]{margin-top:32px}.state-reveal[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px}.reveal-content[_ngcontent-%COMP%]{max-width:700px;width:100%}.reveal-content[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{text-align:center;margin-bottom:32px}.distribution-chart[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px}.dist-bar-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:200px 1fr 100px;gap:16px;align-items:center}.dist-label[_ngcontent-%COMP%]{font-weight:500;text-align:right;color:var(--text-secondary)}.dist-label.correct[_ngcontent-%COMP%]{color:var(--success);font-weight:700}.dist-bar-track[_ngcontent-%COMP%]{height:32px;background:var(--bg-surface);border-radius:var(--radius-md);overflow:hidden}.dist-bar-fill[_ngcontent-%COMP%]{height:100%;background:var(--primary);border-radius:var(--radius-md);transition:width .8s ease;min-width:4px}.dist-bar-fill.correct[_ngcontent-%COMP%]{background:linear-gradient(90deg,var(--success),#2ECC71)}.dist-count[_ngcontent-%COMP%]{font-size:.9rem;color:var(--text-muted)}.reveal-stats[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:32px;margin-top:24px;color:var(--text-secondary)}.state-leaderboard[_ngcontent-%COMP%], .state-complete[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px}.leaderboard-content[_ngcontent-%COMP%], .complete-content[_ngcontent-%COMP%]{max-width:600px;width:100%;text-align:center}.leaderboard-content[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .complete-content[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin-bottom:32px}.complete-icon[_ngcontent-%COMP%]{font-size:4rem;margin-bottom:16px}.final-leaderboard[_ngcontent-%COMP%]{margin:32px 0}.final-leaderboard[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin-bottom:20px;color:var(--text-secondary)}.lb-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px}.lb-entry[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;padding:14px 20px;background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-md);transition:all var(--transition-fast)}.lb-entry.top-1[_ngcontent-%COMP%]{background:linear-gradient(135deg,#ffd7001a,#ffd70008);border-color:#ffd7004d}.lb-entry.top-2[_ngcontent-%COMP%]{background:linear-gradient(135deg,rgba(192,192,192,.08),transparent);border-color:#c0c0c033}.lb-entry.top-3[_ngcontent-%COMP%]{background:linear-gradient(135deg,rgba(205,127,50,.08),transparent);border-color:#cd7f3233}.lb-rank[_ngcontent-%COMP%]{font-weight:800;font-size:1.1rem;width:30px;color:var(--text-muted)}.lb-medal[_ngcontent-%COMP%]{font-size:1.2rem}.lb-name[_ngcontent-%COMP%]{flex:1;font-weight:600;text-align:left}.lb-score[_ngcontent-%COMP%]{font-weight:800;font-size:1.1rem;color:var(--primary-light)}@media (max-width: 768px){.code-display[_ngcontent-%COMP%]{font-size:2.5rem}.q-text[_ngcontent-%COMP%]{font-size:1.3rem}.dist-bar-row[_ngcontent-%COMP%]{grid-template-columns:1fr}}"]})}}return i})();export{et as HostConsoleComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as M}from"./chunk-4S3ZLLNI.js";import{Aa as y,H as a,Ha as O,I as x,Ka as E,Q as m,S as p,V as t,W as e,X as g,_ as b,aa as i,ba as o,ca as l,ia as f,na as c,oa as u,v,wa as _,xa as h,za as C}from"./chunk-UNSARXTF.js";function S(r,s){if(r&1&&(t(0,"div",15)(1,"div",16)(2,"div",17),i(3,"\u{1F948}"),e(),t(4,"div",18),i(5),e(),t(6,"div",19),i(7),c(8,"number"),e(),g(9,"div",20),e(),t(10,"div",21)(11,"div",17),i(12,"\u{1F947}"),e(),t(13,"div",18),i(14),e(),t(15,"div",19),i(16),c(17,"number"),e(),g(18,"div",22),e(),t(19,"div",23)(20,"div",17),i(21,"\u{1F949}"),e(),t(22,"div",18),i(23),e(),t(24,"div",19),i(25),c(26,"number"),e(),g(27,"div",24),e()()),r&2){let n=b(2);a(5),o(n.results.leaderboard[1].display_name),a(2),o(u(8,6,n.results.leaderboard[1].score)),a(7),o(n.results.leaderboard[0].display_name),a(2),o(u(17,8,n.results.leaderboard[0].score)),a(7),o(n.results.leaderboard[2].display_name),a(2),o(u(26,10,n.results.leaderboard[2].score))}}function q(r,s){if(r&1&&(t(0,"div",25)(1,"span",26),i(2),e(),t(3,"span",27),i(4),e(),t(5,"span",28),i(6),c(7,"number"),e()()),r&2){let n=s.$implicit;a(2),l("#",n.rank,""),a(2),o(n.display_name),a(2),l("",u(7,3,n.score)," pts")}}function I(r,s){if(r&1&&(t(0,"div",29)(1,"div",30)(2,"span",31),i(3),e(),t(4,"span",32),i(5),e()(),t(6,"div",33)(7,"div",34)(8,"span",35),i(9),e(),t(10,"span",36),i(11,"Correct"),e()(),t(12,"div",34)(13,"span",37),i(14),e(),t(15,"span",36),i(16,"Responses"),e()(),t(17,"div",34)(18,"span",37),i(19),e(),t(20,"span",36),i(21,"Avg Time"),e()(),t(22,"div",34)(23,"span",38),i(24),e(),t(25,"span",36),i(26,"Accuracy"),e()()()()),r&2){let n=s.$implicit,d=s.index;a(3),l("Q",d+1,""),a(2),o(n.body),a(4),o(n.correct_count),a(5),o(n.total_responses),a(5),o(n.average_time_ms?(n.average_time_ms/1e3).toFixed(1)+"s":"-"),a(5),l(" ",n.total_responses>0?(n.correct_count/n.total_responses*100).toFixed(0)+"%":"-"," ")}}function w(r,s){if(r&1&&(t(0,"div",1)(1,"div",2)(2,"div",3)(3,"h1"),i(4,"\u{1F4CA} Session Results"),e(),t(5,"div",4)(6,"span"),i(7),e(),t(8,"span"),i(9),e()()(),m(10,S,28,12,"div",5),t(11,"div",6)(12,"h3"),i(13,"Full Leaderboard"),e(),t(14,"div",7),m(15,q,8,5,"div",8),e()(),t(16,"div",9)(17,"h3"),i(18,"Question Breakdown"),e(),t(19,"div",10),m(20,I,27,6,"div",11),e()(),t(21,"div",12)(22,"a",13),i(23,"Play Another Quiz"),e(),t(24,"a",14),i(25,"Dashboard"),e()()()()),r&2){let n=b();a(7),l("",n.results.session.total_participants," participants"),a(2),l("",n.results.session.total_questions," questions"),a(),p("ngIf",n.results.leaderboard.length>=3),a(5),p("ngForOf",n.results.leaderboard),a(5),p("ngForOf",n.results.questions)}}var A=(()=>{class r{constructor(n,d){this.api=n,this.route=d,this.results=null}ngOnInit(){let n=Number(this.route.snapshot.paramMap.get("id"));this.api.getResults(n).subscribe({next:d=>{this.results=d}})}static{this.\u0275fac=function(d){return new(d||r)(x(M),x(O))}}static{this.\u0275cmp=v({type:r,selectors:[["app-results"]],standalone:!0,features:[f],decls:1,vars:1,consts:[["class","results-page",4,"ngIf"],[1,"results-page"],[1,"container"],[1,"results-header","animate-fade-in","text-center"],[1,"results-meta"],["class","podium animate-slide-up",4,"ngIf"],[1,"section","animate-slide-up",2,"animation-delay","200ms"],[1,"lb-list"],["class","lb-entry",4,"ngFor","ngForOf"],[1,"section","animate-slide-up",2,"animation-delay","300ms"],[1,"question-breakdown"],["class","qb-card card",4,"ngFor","ngForOf"],[1,"results-footer","text-center"],["routerLink","/join",1,"btn","btn-primary","btn-lg"],["routerLink","/admin/dashboard",1,"btn","btn-outline","btn-lg"],[1,"podium","animate-slide-up"],[1,"podium-slot","second"],[1,"podium-avatar"],[1,"podium-name"],[1,"podium-score"],[1,"podium-bar","bar-2"],[1,"podium-slot","first"],[1,"podium-bar","bar-1"],[1,"podium-slot","third"],[1,"podium-bar","bar-3"],[1,"lb-entry"],[1,"lb-rank"],[1,"lb-name"],[1,"lb-score"],[1,"qb-card","card"],[1,"qb-header"],[1,"qb-num"],[1,"qb-body"],[1,"qb-stats"],[1,"qb-stat"],[1,"qb-stat-val",2,"color","var(--success)"],[1,"qb-stat-label"],[1,"qb-stat-val"],[1,"qb-stat-val",2,"color","var(--primary-light)"]],template:function(d,P){d&1&&m(0,w,26,5,"div",0),d&2&&p("ngIf",P.results)},dependencies:[y,_,h,C,E],styles:[".results-page[_ngcontent-%COMP%]{padding:40px 0}.results-header[_ngcontent-%COMP%]{margin-bottom:40px}.results-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin-bottom:12px}.results-meta[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:24px;color:var(--text-muted)}.podium[_ngcontent-%COMP%]{display:flex;align-items:flex-end;justify-content:center;gap:12px;margin-bottom:48px;height:280px}.podium-slot[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;width:160px}.podium-avatar[_ngcontent-%COMP%]{font-size:2.5rem;margin-bottom:8px}.podium-name[_ngcontent-%COMP%]{font-weight:700;font-size:1rem;margin-bottom:4px}.podium-score[_ngcontent-%COMP%]{color:var(--primary-light);font-weight:600;font-size:.9rem;margin-bottom:8px}.podium-bar[_ngcontent-%COMP%]{width:100%;border-radius:var(--radius-lg) var(--radius-lg) 0 0;background:var(--bg-card);border:1px solid var(--border-light);border-bottom:none}.bar-1[_ngcontent-%COMP%]{height:160px;background:linear-gradient(180deg,rgba(255,215,0,.2),var(--bg-card));border-color:#ffd7004d}.bar-2[_ngcontent-%COMP%]{height:120px;background:linear-gradient(180deg,rgba(192,192,192,.15),var(--bg-card))}.bar-3[_ngcontent-%COMP%]{height:80px;background:linear-gradient(180deg,rgba(205,127,50,.15),var(--bg-card))}.section[_ngcontent-%COMP%]{margin-bottom:40px}.section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin-bottom:20px}.lb-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}.lb-entry[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;padding:12px 20px;background:var(--bg-card);border-radius:var(--radius-md);border:1px solid var(--border-light)}.lb-rank[_ngcontent-%COMP%]{font-weight:800;color:var(--text-muted);width:40px}.lb-name[_ngcontent-%COMP%]{flex:1;font-weight:500}.lb-score[_ngcontent-%COMP%]{font-weight:700;color:var(--primary-light)}.question-breakdown[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px}.qb-header[_ngcontent-%COMP%]{display:flex;gap:12px;margin-bottom:16px}.qb-num[_ngcontent-%COMP%]{width:36px;height:36px;background:var(--primary);color:#fff;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;flex-shrink:0}.qb-body[_ngcontent-%COMP%]{font-weight:500}.qb-stats[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.qb-stat[_ngcontent-%COMP%]{text-align:center}.qb-stat-val[_ngcontent-%COMP%]{display:block;font-size:1.3rem;font-weight:700}.qb-stat-label[_ngcontent-%COMP%]{font-size:.75rem;color:var(--text-muted);text-transform:uppercase}.results-footer[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:16px;padding:40px 0}@media (max-width: 768px){.podium-slot[_ngcontent-%COMP%]{width:100px}.qb-stats[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}}"]})}}return r})();export{A as ResultsComponent};
|