diff --git a/draft/constants.py b/draft/constants.py index c956212..9b654b4 100644 --- a/draft/constants.py +++ b/draft/constants.py @@ -30,6 +30,7 @@ class DraftMessage(StrEnum): # Bidding (examples, adjust to your flow) BID_START_INFORM = "bid.start.inform" # server -> client (movie, ends_at) + BID_START_REQUEST = "bid.start.request" # server -> client (movie, ends_at) BID_PLACE_REQUEST = "bid.place.request" # client -> server (amount) BID_UPDATE_INFORM = "bid.update.inform" # server -> client (high bid) BID_END_INFORM = "bid.end.inform" # server -> client (winner) diff --git a/draft/consumers.py b/draft/consumers.py index dc2f884..851ed4b 100644 --- a/draft/consumers.py +++ b/draft/consumers.py @@ -182,6 +182,34 @@ class DraftAdminConsumer(DraftConsumerBase): }, ) + if event_type == DraftMessage.NOMINATION_SUBMIT_REQUEST: + movie_id = content.get('payload',{}).get('movie_id') + user = content.get('payload',{}).get('user') + self.draft_state.start_nomination(movie_id) + await self.channel_layer.group_send( + self.group_names.session, + { + "type": "broadcast.session", + "subtype": DraftMessage.NOMINATION_CONFIRM, + "payload": { + "current_movie": self.draft_state.get_summary()['current_movie'], + "nominating_participant": user + } + } + ) + if event_type == DraftMessage.BID_START_REQUEST: + self.draft_state + await self.channel_layer.group_send( + self.group_names.session, + { + "type": "broadcast.session", + "subtype": DraftMessage.BID_START_INFORM, + "payload": { + "current_movie": self.draft_state.get_summary()['current_movie'] + } + } + ) + def should_accept_user(self): return super().should_accept_user() and self.user.is_staff @@ -276,6 +304,20 @@ class DraftParticipantConsumer(DraftConsumerBase): async def receive_json(self, content): await super().receive_json(content) + event_type = content.get('type') + if event_type == DraftMessage.NOMINATION_SUBMIT_REQUEST: + await self.channel_layer.group_send( + self.group_names.admin, + { + "type": "broadcast.admin", + "subtype": event_type, + "payload": { + "movie_id": content.get('payload',{}).get('id'), + "user": content.get('payload',{}).get('user') + } + } + ) + # === Broadcast handlers === diff --git a/draft/state.py b/draft/state.py index 66ddb5d..301f436 100644 --- a/draft/state.py +++ b/draft/state.py @@ -37,6 +37,10 @@ class DraftCacheKeys: def draft_index(self): return f"{self.prefix}:draft_index" + @property + def current_movie(self): + return f"{self.prefix}:current_movie" + # @property # def state(self): # return f"{self.prefix}:state" @@ -45,9 +49,9 @@ class DraftCacheKeys: # def current_movie(self): # return f"{self.prefix}:current_movie" - # @property - # def bids(self): - # return f"{self.prefix}:bids" + @property + def bids(self): + return f"{self.prefix}:bids" # @property # def participants(self): @@ -146,7 +150,7 @@ class DraftStateManager: "draft_order": self.draft_order, "draft_index": self.draft_index, "connected_participants": self.connected_participants, - # "current_movie": self.cache.get(self.keys.current_movie), + "current_movie": self.cache.get(self.keys.current_movie), # "bids": self.get_bids(), # "timer_end": self.get_timer_end(), } \ No newline at end of file diff --git a/frontend/src/apps/draft/admin/DraftAdmin.jsx b/frontend/src/apps/draft/admin/DraftAdmin.jsx index 899174f..2153da8 100644 --- a/frontend/src/apps/draft/admin/DraftAdmin.jsx +++ b/frontend/src/apps/draft/admin/DraftAdmin.jsx @@ -6,6 +6,7 @@ import { ParticipantList } from "../common/ParticipantList.jsx"; import { DraftMessage, DraftPhase, DraftPhaseLabel, DraftPhasesOrdered } from '../constants.js'; import { fetchDraftDetails, isEmptyObject, handleDraftStatusMessages, handleUserIdentifyMessages } from "../common/utils.js" import { DraftMoviePool } from "../common/DraftMoviePool.jsx" +import { jsxs } from "react/jsx-runtime"; @@ -65,12 +66,28 @@ export const DraftAdmin = ({ draftSessionId }) => { const draftStatusMessageHandler = (event) => handleDraftStatusMessages(event, setDraftState) const userIdentifyMessageHandler = (event) => handleUserIdentifyMessages(event, setCurrentUser) + const handleNominationRequest = (event)=> { + const message = JSON.parse(event.data) + const { type, payload } = message; + console.log('passing through nomination request', message) + if (type == DraftMessage.NOMINATION_SUBMIT_REQUEST) { + socket.send(JSON.stringify( + { + type: DraftMessage.NOMINATION_SUBMIT_REQUEST, + payload + } + )) + } + } socket.addEventListener('message', draftStatusMessageHandler ); socket.addEventListener('message', userIdentifyMessageHandler ); + socket.addEventListener('message', handleNominationRequest ); + return () => { socket.removeEventListener('message', draftStatusMessageHandler) socket.removeEventListener('message', userIdentifyMessageHandler ); + socket.remove('message', handleNominationRequest ); }; }, [socket]); @@ -114,6 +131,14 @@ export const DraftAdmin = ({ draftSessionId }) => { ) } + const handleStartBidding = () => { + socket.send( + JSON.stringify( + {type: DraftMessage.BID_START_REQUEST} + ) + ) + } + return (
@@ -127,12 +152,16 @@ export const DraftAdmin = ({ draftSessionId }) => {
- - +
+ + +
+ { handlePhaseChange('next') }} prevPhaseHandler={() => { handlePhaseChange('previous') }}>
diff --git a/frontend/src/apps/draft/common/DraftMoviePool.jsx b/frontend/src/apps/draft/common/DraftMoviePool.jsx index 6185807..924908f 100644 --- a/frontend/src/apps/draft/common/DraftMoviePool.jsx +++ b/frontend/src/apps/draft/common/DraftMoviePool.jsx @@ -1,15 +1,16 @@ import React from "react"; import { isEmptyObject } from "./utils"; -export const DraftMoviePool = ({ draftDetails }) => { +export const DraftMoviePool = ({ isParticipant, draftDetails, draftState }) => { if(isEmptyObject(draftDetails)) {return} const {movies} = draftDetails + const {current_movie} = draftState return (
); }; \ No newline at end of file diff --git a/frontend/src/scss/styles.scss b/frontend/src/scss/styles.scss index 2eaab41..4c25abf 100644 --- a/frontend/src/scss/styles.scss +++ b/frontend/src/scss/styles.scss @@ -63,8 +63,6 @@ @extend .fs-3; } .change-phase { - - button { @extend .btn; @extend .btn-light; @@ -118,4 +116,10 @@ @extend .ps-1; } } + .current-user { + &::after { + content: " *"; + font-size: 1em; // adjust as needed + } + } }