import clsx from 'clsx'
import {Row as rowFor, run} from 'common/supabase/utils'
import {User} from 'common/user'
import {useRouter} from 'next/router'
import {useEffect} from 'react'
import {Button} from 'web/components/buttons/button'
import {Col} from 'web/components/layout/col'
import {Row} from 'web/components/layout/row'
import {ExpandingInput} from 'web/components/widgets/expanding-input'
import {Input} from 'web/components/widgets/input'
import {RadioToggleGroup} from 'web/components/widgets/radio-toggle-group'
import {Title} from 'web/components/widgets/title'
import {usePersistentLocalState} from 'web/hooks/use-persistent-local-state'
import {useQuestions} from 'web/hooks/use-questions'
import {useUser} from 'web/hooks/use-user'
import {track} from 'web/lib/service/analytics'
import {db} from 'web/lib/supabase/db'
export type QuestionType = 'multiple_choice' | 'free_response'
export const QuestionsForm = (props: {questionType: QuestionType}) => {
const {questionType} = props
const questions = useQuestions()
const user = useUser()
const router = useRouter()
return (
Questions
{user &&
questions
.filter((q) =>
questionType !== 'multiple_choice'
? q.answer_type !== 'multiple_choice'
: q.answer_type === 'multiple_choice',
)
.map((row) => )}
)
}
type compatibilityAnswer = rowFor<'compatibility_answers_free'>
export type compatibilityAnswerState = Omit
const fetchPrevious = async (id: number, userId: string) => {
const res = await run(
db
.from('compatibility_answers_free')
.select('*')
.eq('question_id', id)
.eq('creator_id', userId),
)
if (res.data.length) {
return res.data[0]
}
return null
}
function getInitialForm(userId: string, id: number) {
return {
creator_id: userId,
free_response: null,
multiple_choice: null,
integer: null,
question_id: id,
}
}
export const filterKeys = (
obj: Record,
predicate: (key: string, value: any) => boolean,
): Record => {
const filteredEntries = Object.entries(obj).filter(([key, value]) => predicate(key, value))
return Object.fromEntries(filteredEntries)
}
const submitAnswer = async (newForm: compatibilityAnswerState) => {
if (!newForm) return
const input = {
...filterKeys(newForm, (key, _) => !['id', 'created_time'].includes(key)),
} as compatibilityAnswerState
await run(
db.from('compatibility_answers_free').upsert(input, {onConflict: 'question_id,creator_id'}),
)
}
const QuestionRow = (props: {row: rowFor<'compatibility_prompts'>; user: User}) => {
const {row, user} = props
const {question, id, answer_type, multiple_choice_options} = row
const options = multiple_choice_options as Record
const [form, setForm] = usePersistentLocalState(
getInitialForm(user.id, id),
`compatibility_answer_${id}_user_${user.id}`,
)
useEffect(() => {
fetchPrevious(id, user.id).then((res) => {
if (res) {
setForm(res)
}
})
}, [row.id])
return (
{question}
{answer_type === 'free_response' ? (
) =>
setForm({...form, free_response: e.target.value})
}
onBlur={() => submitAnswer(form)}
/>
) : answer_type === 'multiple_choice' && row.multiple_choice_options ? (
{
// console.debug(choice)
const updatedForm = {...form, multiple_choice: choice}
setForm(updatedForm)
submitAnswer(updatedForm)
}}
currentChoice={form.multiple_choice ?? -1}
/>
) : answer_type === 'integer' ? (
) =>
setForm({...form, integer: Number(e.target.value)})
}
value={form.integer ?? undefined}
onBlur={() => submitAnswer(form)}
/>
) : null}
)
}
export const IndividualQuestionRow = (props: {
row: rowFor<'compatibility_prompts'>
initialAnswer?: rowFor<'compatibility_answers_free'>
user: User
onCancel: () => void
onSubmit?: () => void
className?: string
}) => {
const {row, user, onCancel, onSubmit, initialAnswer, className} = props
const {id, answer_type, multiple_choice_options} = row
const options = multiple_choice_options as Record
const [form, setForm] = usePersistentLocalState(
initialAnswer ?? getInitialForm(user.id, id),
`compatibility_answer_${id}_user_${user.id}`,
)
useEffect(() => {
fetchPrevious(id, user.id).then((res) => {
if (res) {
setForm(res)
}
})
}, [row.id])
return (
{answer_type === 'free_response' ? (
) =>
setForm({...form, free_response: e.target.value})
}
/>
) : answer_type === 'multiple_choice' && row.multiple_choice_options ? (
{
setForm({...form, multiple_choice: choice})
}}
currentChoice={form.multiple_choice ?? -1}
/>
) : answer_type === 'integer' ? (
) =>
setForm({...form, integer: Number(e.target.value)})
}
value={form.integer ?? undefined}
/>
) : null}
)
}