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} ) }