fix: resolve member status check bugs

Fix '.eq('status', 'current')' in all actions and page-level files.

Co-authored-by: Moheeb Zara <[email protected]>
This commit is contained in:
v0
2026-03-11 07:49:53 +00:00
co-authored by Moheeb Zara
parent c33434e552
commit 8cdb9dbb87
14 changed files with 82 additions and 57 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function CommsPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('*, spaces(id, name, slug)').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('*, spaces(id, name, slug)').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const { data: channels } = await supabase
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function ContactsPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const { data: contacts } = await supabase
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function ImportPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
const isAdmin = member?.role === 'admin' || member?.role === 'board' || member?.role === 'treasurer'
+1 -1
View File
@@ -10,7 +10,7 @@ export default async function MembersPage() {
.from('space_members')
.select('space_id, role')
.eq('user_id', user.id)
.eq('status', 'current')
.in('status', ['current', 'unverified', 'late'])
.single()
if (!self) return null
+1 -1
View File
@@ -11,7 +11,7 @@ export default async function OpsEntryPage({ params }: { params: Promise<{ id: s
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role, display_name').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role, display_name').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const { data: entry } = await supabase
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function NewOpsEntryPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role, display_name').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role, display_name').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
return <KbEntryEditor member={member} />
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function OpsPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role, display_name, user_id').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role, display_name, user_id').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const canSeeSecrets = member.role === 'admin' || member.role === 'board'
+2 -2
View File
@@ -7,7 +7,7 @@ export default async function PaymentsPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const [{ data: payments }, { data: members }, { data: integrations }] = await Promise.all([
@@ -19,7 +19,7 @@ export default async function PaymentsPage() {
supabase.from('space_members')
.select('id, display_name, email')
.eq('space_id', member.space_id)
.eq('status', 'current'),
.in('status', ['current', 'late']),
supabase.from('integrations')
.select('platform, is_connected, config')
.eq('space_id', member.space_id),
+1 -1
View File
@@ -7,7 +7,7 @@ export default async function ProjectsPage() {
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) return null
const { data: projects } = await supabase
+1 -1
View File
@@ -8,7 +8,7 @@ export default async function SettingsPage() {
if (!user) redirect('/login')
const { data: member } = await supabase
.from('space_members').select('space_id, role').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member) redirect('/login')
+7 -4
View File
@@ -53,10 +53,13 @@ export function TasksClient({ tasks: initialTasks, members, currentUserId, space
const [formError, setFormError] = useState('')
const [formLoading, setFormLoading] = useState(false)
// Ongoing = tasks with a recurrence (not 'none')
// Ongoing = recurring tasks (recurrence != 'none')
// Chores = chore type OR regular tasks without recurrence (the general open pool)
// Mine = tasks claimed/assigned to me
// Done = completed
const isDone = (t: any) => t.status === 'done' || t.status === 'completed'
const isOpen = (t: any) => !isDone(t)
const chores = tasks.filter(t => (t.type === 'chore' || t.task_type === 'chore') && isOpen(t) && (!t.recurrence || t.recurrence === 'none'))
const chores = tasks.filter(t => isOpen(t) && (!t.recurrence || t.recurrence === 'none'))
const ongoing = tasks.filter(t => t.recurrence && t.recurrence !== 'none' && isOpen(t))
const mine = tasks.filter(t => (t.claimed_by === currentUserId || t.assigned_to === currentUserId) && isOpen(t))
const done = tasks.filter(isDone)
@@ -154,7 +157,7 @@ export function TasksClient({ tasks: initialTasks, members, currentUserId, space
activeTab === tab ? 'border-primary text-primary' : 'border-transparent text-muted-foreground hover:text-foreground'
}`}
>
{tab === 'mine' ? 'My Tasks' : tab.charAt(0).toUpperCase() + tab.slice(1)}{' '}
{tab === 'mine' ? 'My Tasks' : tab === 'chores' ? 'Open Tasks' : tab.charAt(0).toUpperCase() + tab.slice(1)}{' '}
{tabCounts[tab] > 0 && (
<span className={`ml-1 text-[10px] font-mono px-1.5 py-0.5 rounded ${
activeTab === tab ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground'
@@ -235,7 +238,7 @@ export function TasksClient({ tasks: initialTasks, members, currentUserId, space
</div>
)) : (
<div className="px-4 py-10 text-center">
<p className="font-sans text-sm text-muted-foreground">No {activeTab === 'done' ? 'completed' : 'open'} tasks in this view</p>
<p className="font-sans text-sm text-muted-foreground">No {activeTab === 'done' ? 'completed' : activeTab === 'chores' ? 'open' : activeTab} tasks in this view</p>
<button
onClick={() => setShowCreate(true)}
className="font-mono text-xs text-primary mt-2 hover:underline"
+1 -1
View File
@@ -55,7 +55,7 @@ export async function POST(req: NextRequest) {
if (!user) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
const { data: member } = await supabase
.from('space_members').select('space_id, role').eq('user_id', user.id).eq('status', 'current').single()
.from('space_members').select('space_id, role').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
if (!member || !['admin', 'board', 'treasurer'].includes(member.role)) {
return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 })
}