@@ -19,6 +19,7 @@ import {
1919 SelectValue ,
2020} from "@/components/ui/select" ;
2121import { useModal } from "@/hooks/use-modal" ;
22+ import { IconPlus } from "@/public/assets/svgs" ;
2223import { useUserStore } from "@/store/codev-store" ;
2324import { useKanbanStore } from "@/store/kanban-store" ;
2425import { SkillCategory , Task } from "@/types/home/codev" ;
@@ -36,9 +37,12 @@ import {
3637} from "@codevs/ui/dropdown-menu" ;
3738import { Input } from "@codevs/ui/input" ;
3839import { Label } from "@codevs/ui/label" ;
39- import { IconPlus } from "@/public/assets/svgs" ;
4040
41- import { completeTask , updateTaskPRLink , fetchAvailableMembers } from "../../actions" ;
41+ import {
42+ completeTask ,
43+ fetchAvailableMembers ,
44+ updateTaskPRLink ,
45+ } from "../../actions" ;
4246import DifficultyPointsTooltip , {
4347 DIFFICULTY_LEVELS ,
4448} from "../DifficultyPointsTooltip" ;
@@ -49,8 +53,10 @@ import DifficultyPointsTooltip, {
4953const PRIORITY_LEVELS = [ "critical" , "high" , "medium" , "low" ] ;
5054
5155const BUTTON_STYLES = {
52- primary : "text-md bg-customBlue-100 hover:bg-customBlue-200 focus-visible:ring-customBlue-100 flex h-10 w-full items-center justify-center gap-2 whitespace-nowrap rounded-md px-6 py-1 text-white ring-offset-background transition-colors duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 sm:w-auto lg:text-lg" ,
53- secondary : "text-grey-100 bg-light-900 dark:bg-black-200 mt-4 w-full border-2 border-gray-300 py-4 text-black hover:bg-green-700 sm:w-auto"
56+ primary :
57+ "text-md bg-customBlue-100 hover:bg-customBlue-200 focus-visible:ring-customBlue-100 flex h-10 w-full items-center justify-center gap-2 whitespace-nowrap rounded-md px-6 py-1 text-white ring-offset-background transition-colors duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 sm:w-auto lg:text-lg" ,
58+ secondary :
59+ "text-grey-100 bg-light-900 dark:bg-black-200 mt-4 w-full border-2 border-gray-300 py-4 text-black hover:bg-green-700 sm:w-auto" ,
5460} ;
5561
5662// ============================================================================
@@ -76,7 +82,7 @@ function AssigneeSelector({
7682 onAssigneeChange,
7783 boardId,
7884 user,
79- forceRefreshKey // Add this to force complete re-render when needed
85+ forceRefreshKey, // Add this to force complete re-render when needed
8086} : {
8187 primaryAssignee : CodevMember | null ;
8288 onAssigneeChange : ( memberIds : string [ ] ) => void ;
@@ -87,7 +93,9 @@ function AssigneeSelector({
8793 const [ availableMembers , setAvailableMembers ] = useState < CodevMember [ ] > ( [ ] ) ;
8894 const [ isLoading , setIsLoading ] = useState ( true ) ;
8995 const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
90- const [ localAssignee , setLocalAssignee ] = useState < CodevMember | null > ( primaryAssignee ) ;
96+ const [ localAssignee , setLocalAssignee ] = useState < CodevMember | null > (
97+ primaryAssignee ,
98+ ) ;
9199
92100 // Sync with prop changes but prioritize local state for immediate feedback
93101 useEffect ( ( ) => {
@@ -101,14 +109,14 @@ function AssigneeSelector({
101109 setIsLoading ( false ) ;
102110 return ;
103111 }
104-
112+
105113 const loadMembers = async ( ) => {
106114 setIsLoading ( true ) ;
107115 try {
108116 console . log ( "=== LOADING MEMBERS FOR BOARD:" , boardId , "===" ) ;
109117 const members = await fetchAvailableMembers ( boardId ) ;
110118 console . log ( "=== FETCHED MEMBERS:" , members , "===" ) ;
111-
119+
112120 if ( Array . isArray ( members ) && members . length > 0 ) {
113121 setAvailableMembers ( members ) ;
114122 console . log ( "=== SET AVAILABLE MEMBERS:" , members . length , "===" ) ;
@@ -142,9 +150,9 @@ function AssigneeSelector({
142150
143151 // IMMEDIATE SELECTION - Updates UI instantly
144152 const handleSelect = ( memberId : string ) => {
145- const selectedMember = availableMembers . find ( m => m . id === memberId ) ;
153+ const selectedMember = availableMembers . find ( ( m ) => m . id === memberId ) ;
146154 console . log ( "=== SELECTING MEMBER IMMEDIATELY:" , selectedMember , "===" ) ;
147-
155+
148156 if ( selectedMember ) {
149157 setLocalAssignee ( selectedMember ) ; // IMMEDIATE UI UPDATE
150158 onAssigneeChange ( [ memberId ] ) ; // Trigger parent update
@@ -157,7 +165,7 @@ function AssigneeSelector({
157165 id : user . id ,
158166 first_name : user . first_name || "You" ,
159167 last_name : user . last_name || "" ,
160- image_url : user . image_url
168+ image_url : user . image_url ,
161169 } ;
162170 console . log ( "=== SELF ASSIGNING IMMEDIATELY:" , userAsMember , "===" ) ;
163171 setLocalAssignee ( userAsMember ) ; // IMMEDIATE UI UPDATE
@@ -229,7 +237,9 @@ function AssigneeSelector({
229237 </ div >
230238 ) : filteredMembers . length === 0 ? (
231239 < div className = "py-4 text-center text-sm text-gray-500" >
232- { availableMembers . length === 0 ? "No members available" : "No members found" }
240+ { availableMembers . length === 0
241+ ? "No members available"
242+ : "No members found" }
233243 </ div >
234244 ) : (
235245 filteredMembers . map ( ( member ) => (
@@ -273,11 +283,6 @@ function AssigneeSelector({
273283 </ button >
274284 ) }
275285 </ div >
276-
277- { /* Debug info - remove in production */ }
278- < div className = "text-xs text-gray-400" >
279- Members loaded: { availableMembers . length } | Local assignee: { localAssignee ?. first_name || 'None' }
280- </ div >
281286 </ div >
282287 ) ;
283288}
@@ -296,35 +301,43 @@ const TaskViewModal = ({
296301 const { isOpen, onOpen, onClose, type, data } = useModal ( ) ;
297302 const user = useUserStore ( ( state ) => state . user ) ;
298303 const { fetchBoardData } = useKanbanStore ( ) ;
299-
304+
300305 // Loading states
301306 const [ isLoading , setIsLoading ] = useState ( false ) ;
302307 const [ updateLoading , setUpdateLoading ] = useState ( false ) ;
303-
308+
304309 // Component state
305310 const [ prLink , setPrLink ] = useState ( "" ) ;
306311 const [ supabase , setSupabase ] = useState < any > ( null ) ;
307312 const [ boardId , setBoardId ] = useState < string > ( "" ) ;
308-
313+
309314 // Data states
310- const [ skillCategory , setSkillCategory ] = useState < SkillCategory | null > ( null ) ;
315+ const [ skillCategory , setSkillCategory ] = useState < SkillCategory | null > (
316+ null ,
317+ ) ;
311318 const [ sidekickDetails , setSidekickDetails ] = useState < CodevMember [ ] > ( [ ] ) ;
312- const [ primaryAssignee , setPrimaryAssignee ] = useState < CodevMember | null > ( null ) ;
319+ const [ primaryAssignee , setPrimaryAssignee ] = useState < CodevMember | null > (
320+ null ,
321+ ) ;
313322 const [ createdBy , setCreatedBy ] = useState < CodevMember | null > ( null ) ;
314323 const [ forceRefreshKey , setForceRefreshKey ] = useState < string > ( "" ) ;
315-
324+
316325 // Derived state
317326 const isModalOpen = isOpen && type === "taskViewModal" ;
318327 const task = data as Task | null ;
319-
328+
320329 // Permission checks
321- const canModifyTask = user ?. role_id === 1 || user ?. role_id === 5 || user ?. role_id === 4 || user ?. role_id === 10 ;
330+ const canModifyTask =
331+ user ?. role_id === 1 ||
332+ user ?. role_id === 5 ||
333+ user ?. role_id === 4 ||
334+ user ?. role_id === 10 ;
322335 const canMarkAsDone = user ?. role_id === 1 || user ?. role_id === 5 ;
323336
324337 // ============================================================================
325338 // EFFECTS
326339 // ============================================================================
327-
340+
328341 // Initialize Supabase client
329342 useEffect ( ( ) => {
330343 const supabaseClient = createClientClientComponent ( ) ;
@@ -337,16 +350,20 @@ const TaskViewModal = ({
337350 setBoardId ( "" ) ;
338351 return ;
339352 }
340-
353+
341354 const fetchBoardId = async ( ) => {
342355 try {
343- console . log ( "=== FETCHING BOARD ID FOR COLUMN:" , task . kanban_column_id , "===" ) ;
356+ console . log (
357+ "=== FETCHING BOARD ID FOR COLUMN:" ,
358+ task . kanban_column_id ,
359+ "===" ,
360+ ) ;
344361 const { data, error } = await supabase
345362 . from ( "kanban_columns" )
346363 . select ( "board_id" )
347364 . eq ( "id" , task . kanban_column_id )
348365 . single ( ) ;
349-
366+
350367 if ( error ) {
351368 console . error ( "=== ERROR FETCHING BOARD ID:" , error , "===" ) ;
352369 setBoardId ( "" ) ;
@@ -359,7 +376,7 @@ const TaskViewModal = ({
359376 setBoardId ( "" ) ;
360377 }
361378 } ;
362-
379+
363380 fetchBoardId ( ) ;
364381 } , [ task ?. kanban_column_id , supabase ] ) ;
365382
@@ -412,9 +429,9 @@ const TaskViewModal = ({
412429
413430 const fetchPrimaryAssignee = async ( ) => {
414431 const assigneeId = task ?. codev_id || task ?. codev ?. id ;
415-
432+
416433 console . log ( "=== FETCHING PRIMARY ASSIGNEE, ID:" , assigneeId , "===" ) ;
417-
434+
418435 // Always reset first
419436 setPrimaryAssignee ( null ) ;
420437
@@ -468,7 +485,7 @@ const TaskViewModal = ({
468485 // ============================================================================
469486 // EVENT HANDLERS
470487 // ============================================================================
471-
488+
472489 const handleUpdate = async ( ) => {
473490 if ( ! task ) return ;
474491
@@ -544,15 +561,21 @@ const TaskViewModal = ({
544561 . select ( "id, first_name, last_name, image_url" )
545562 . eq ( "id" , newAssigneeId )
546563 . single ( ) ;
547-
564+
548565 if ( assigneeData ) {
549- console . log ( "=== UPDATING TASK OBJECT WITH NEW ASSIGNEE:" , assigneeData , "===" ) ;
566+ console . log (
567+ "=== UPDATING TASK OBJECT WITH NEW ASSIGNEE:" ,
568+ assigneeData ,
569+ "===" ,
570+ ) ;
550571 setPrimaryAssignee ( assigneeData ) ;
551572 if ( task ) {
552573 task . codev_id = newAssigneeId ;
553574 task . codev = assigneeData as any ;
554575 }
555- toast . success ( `Task assigned to ${ assigneeData . first_name } ${ assigneeData . last_name } ` ) ;
576+ toast . success (
577+ `Task assigned to ${ assigneeData . first_name } ${ assigneeData . last_name } ` ,
578+ ) ;
556579 }
557580 } else {
558581 console . log ( "=== REMOVING ASSIGNEE FROM TASK ===" ) ;
@@ -566,7 +589,7 @@ const TaskViewModal = ({
566589
567590 // Force refresh key to trigger component re-render
568591 setForceRefreshKey ( Date . now ( ) . toString ( ) ) ;
569-
592+
570593 // Refresh board data
571594 await fetchBoardData ( ) ;
572595 } else {
@@ -652,7 +675,11 @@ const TaskViewModal = ({
652675 </ SelectTrigger >
653676 < SelectContent >
654677 { PRIORITY_LEVELS . map ( ( level ) => (
655- < SelectItem key = { level } value = { level } className = "capitalize" >
678+ < SelectItem
679+ key = { level }
680+ value = { level }
681+ className = "capitalize"
682+ >
656683 { level }
657684 </ SelectItem >
658685 ) ) }
@@ -672,7 +699,11 @@ const TaskViewModal = ({
672699 </ SelectTrigger >
673700 < SelectContent >
674701 { DIFFICULTY_LEVELS . map ( ( level ) => (
675- < SelectItem key = { level } value = { level } className = "capitalize" >
702+ < SelectItem
703+ key = { level }
704+ value = { level }
705+ className = "capitalize"
706+ >
676707 { capitalize ( level ) }
677708 </ SelectItem >
678709 ) ) }
@@ -754,7 +785,9 @@ const TaskViewModal = ({
754785 forceRefreshKey = { forceRefreshKey }
755786 />
756787 ) : (
757- < div className = "text-sm text-gray-500" > Loading board...</ div >
788+ < div className = "text-sm text-gray-500" >
789+ Loading board...
790+ </ div >
758791 ) }
759792 </ div >
760793 ) : primaryAssignee ? (
@@ -882,4 +915,4 @@ const TaskViewModal = ({
882915 ) ;
883916} ;
884917
885- export default TaskViewModal ;
918+ export default TaskViewModal ;
0 commit comments