@@ -4,9 +4,11 @@ import toast from 'react-hot-toast';
44import useCopyToClipboard from 'shared/hooks/useCopyToClipboard' ;
55import useTranslation from 'next-translate/useTranslation' ;
66import { QuestionType } from '@prisma/client' ;
7- import { postFetch } from '../../../../lib/axiosConfig' ;
7+ import { postFetch , putFetch } from '../../../../lib/axiosConfig' ;
88import { defaultQuestions } from 'shared/constants/surveysConfig' ;
99import { DRAFT_SURVEY_SESSION_STORAGE } from 'shared/constants/app' ;
10+ import { SurveyWithQuestions } from 'types/SurveyWithQuestions' ;
11+ import { Question as QuestionDto } from '@prisma/client' ;
1012
1113export interface Question {
1214 id : string ;
@@ -22,19 +24,32 @@ export interface SurveyOptions {
2224 displayTitle : boolean ;
2325}
2426
25- export const useCreateSurveyManager = ( ) => {
26- const [ title , setTitle ] = useState ( '' ) ;
27- const [ questions , setQuestions ] = useState < Question [ ] > ( defaultQuestions ) ;
27+ export const useCreateSurveyManager = ( initialData ?: SurveyWithQuestions ) => {
28+ const [ isEditMode ] = useState ( ! ! initialData ) ;
29+
30+ const [ title , setTitle ] = useState ( initialData ?. title ?? '' ) ;
31+
32+ const mapQuestionsWithExpanded = ( questions ?: QuestionDto [ ] ) => {
33+ return questions ?. map ( ( question ) => ( {
34+ ...question ,
35+ expanded : false ,
36+ } ) ) ;
37+ } ;
38+
39+ const [ questions , setQuestions ] = useState < Question [ ] > (
40+ mapQuestionsWithExpanded ( initialData ?. questions ) ?? defaultQuestions
41+ ) ;
42+ const [ surveyOptions , setSurveyOptions ] = useState < SurveyOptions > ( {
43+ oneQuestionPerStep : initialData ?. oneQuestionPerStep ?? true ,
44+ displayTitle : initialData ?. displayTitle ?? true ,
45+ } ) ;
46+
2847 const [ error , setError ] = useState ( '' ) ;
2948 const [ isCreating , setIsCreating ] = useState ( false ) ;
3049 const [ isSubmitted , setIsSubmitted ] = useState ( false ) ;
3150 const router = useRouter ( ) ;
3251 const { copy } = useCopyToClipboard ( ) ;
3352 const { t } = useTranslation ( 'surveyCreate' ) ;
34- const [ surveyOptions , setSurveyOptions ] = useState < SurveyOptions > ( {
35- oneQuestionPerStep : true ,
36- displayTitle : true ,
37- } ) ;
3853
3954 const signInToCreateSurvey = ( ) => {
4055 router . push ( '/login' ) ;
@@ -249,6 +264,40 @@ export const useCreateSurveyManager = () => {
249264 setIsCreating ( false ) ;
250265 } ;
251266
267+ const confirmEditSurvey = async ( ) => {
268+ if ( ! isSurveyValid ( ) || ! initialData ) return ;
269+
270+ setIsCreating ( true ) ;
271+
272+ try {
273+ const newSurvey = await putFetch ( `/api/survey/${ initialData . id } ` , {
274+ title,
275+ oneQuestionPerStep : surveyOptions . oneQuestionPerStep ,
276+ displayTitle : surveyOptions . displayTitle ,
277+ questions : questions . map ( ( question ) => ( {
278+ id : question . id ,
279+ title : question . title ,
280+ options : question . options ,
281+ type : question . type ,
282+ isRequired : question . isRequired ,
283+ } ) ) ,
284+ } ) ;
285+
286+ await router . push ( `/survey/answer/${ newSurvey . id } ` , undefined , {
287+ scroll : false ,
288+ } ) ;
289+ } catch ( error ) {
290+ toast . error ( t ( 'surveyCreationFailed' ) ) ;
291+ }
292+ setIsCreating ( false ) ;
293+ } ;
294+
295+ const discardChanges = ( ) => {
296+ router . push ( `/survey/answer/${ initialData ?. id } ` , undefined , {
297+ scroll : false ,
298+ } ) ;
299+ } ;
300+
252301 const reorderQuestion = ( startIndex : number , endIndex : number ) => {
253302 const newOrderedQuestions = Array . from ( questions ) ;
254303
@@ -288,5 +337,8 @@ export const useCreateSurveyManager = () => {
288337 surveyOptions,
289338 updateSurveyOptions,
290339 signInToCreateSurvey,
340+ isEditMode,
341+ confirmEditSurvey,
342+ discardChanges,
291343 } ;
292344} ;
0 commit comments