1+ import { save_settings } from "@/service/user_service" ;
2+ import { GeneralSettings as GeneralSettingsType } from "@/types/userSettings" ;
3+ import { useState } from "react" ;
4+
15const languages = [
26 { label : "English" , value : "en" } ,
37 { label : "Hindi" , value : "hi" } ,
@@ -16,21 +20,66 @@ const timezones = [
1620 { label : "JST (Japan Standard Time)" , value : "Asia/Tokyo" } ,
1721] ;
1822
19- const GeneralSettings = ( ) => {
23+ const GeneralSettings : React . FC < { generalSettings : GeneralSettingsType } > = ( {
24+ generalSettings,
25+ } ) => {
26+ const [ settings , setSettings ] =
27+ useState < GeneralSettingsType > ( generalSettings ) ;
28+ const [ changed , setChanged ] = useState < boolean > ( false ) ;
29+
30+ const handleLanguageChange = ( e : React . ChangeEvent < HTMLSelectElement > ) => {
31+ setChanged ( true ) ;
32+ setSettings ( { ...settings , language : e . target . value } ) ;
33+ } ;
34+
35+ const handleTimezoneChange = ( e : React . ChangeEvent < HTMLSelectElement > ) => {
36+ setChanged ( true ) ;
37+ setSettings ( { ...settings , timezone : e . target . value } ) ;
38+ } ;
39+
40+ const handleBackgroundSyncToggle = ( ) => {
41+ setChanged ( true ) ;
42+ setSettings ( { ...settings , background_sync : ! settings . background_sync } ) ;
43+ } ;
44+
45+ const handleAutoplayMediaToggle = ( ) => {
46+ setChanged ( true ) ;
47+ setSettings ( { ...settings , autoplay_media : ! settings . autoplay_media } ) ;
48+ } ;
49+
50+ const handleSave = async ( ) => {
51+ await save_settings ( "general" , settings ) ;
52+ setChanged ( false ) ;
53+ } ;
54+
2055 return (
2156 < div className = "px-4 py-0 dark:text-gray-200 text-black" >
22- < div className = "rounded-xl p-2 py-0 text-sm" >
23- < h1 className = "text-lg font-semibold mb-4" > General Settings</ h1 >
57+ { changed && (
58+ < div className = "absolute bottom-10 px-4 w-[calc(100%-2rem)] justify-between flex items-center bg-gray-800 rounded-lg py-3" >
59+ < span className = "text-sm text-nowrap" > You have unsaved changes!</ span >
60+ < button
61+ type = "button"
62+ className = "btn-primary btn btn-sm"
63+ onClick = { handleSave }
64+ >
65+ Save
66+ </ button >
67+ </ div >
68+ ) }
69+ < div className = "rounded-xl p-2 py-0 text-sm" >
70+ < h1 className = "text-lg font-semibold mb-4" > General Settings</ h1 >
2471
25- < div className = "space-y-4 text-black dark:text-gray-200 " >
72+ < div className = "space-y-4 text-black dark:text-gray-200" >
2673 { /* Language Selector */ }
27- < div className = "flex flex-col " >
74+ < div className = "flex flex-col" >
2875 < label htmlFor = "language" className = "mb-1 font-semibold" >
2976 Language
3077 </ label >
3178 < select
3279 id = "language"
3380 name = "language"
81+ value = { settings . language }
82+ onChange = { handleLanguageChange }
3483 className = "border-2 border-black font-semibold dark:text-gray-400 px-3 py-2 rounded focus:outline-none focus:ring focus:ring-indigo-500"
3584 >
3685 { languages . map ( ( lang ) => (
@@ -49,7 +98,9 @@ const GeneralSettings = () => {
4998 < select
5099 id = "timezone"
51100 name = "timezone"
52- className = "border-2 border-black dark:text-gray-400 font-semibold px-3 py-2 rounded focus:outline-none focus:ring focus:ring-indigo-500"
101+ value = { settings . timezone }
102+ onChange = { handleTimezoneChange }
103+ className = "border-2 border-black dark:text-gray-400 font-semibold px-3 py-2 rounded focus:outline-none focus:ring focus:ring-indigo-500"
53104 >
54105 { timezones . map ( ( zone ) => (
55106 < option key = { zone . value } value = { zone . value } >
@@ -58,6 +109,7 @@ const GeneralSettings = () => {
58109 ) ) }
59110 </ select >
60111 </ div >
112+
61113 { /* Background Sync */ }
62114 < div className = "flex items-center justify-between gap-6" >
63115 < div >
@@ -68,7 +120,30 @@ const GeneralSettings = () => {
68120 Get faster performance by syncing messages in the background
69121 </ p >
70122 </ div >
71- < input type = "checkbox" className = "toggle toggle-primary bg-black" />
123+ < input
124+ type = "checkbox"
125+ className = "toggle toggle-primary bg-black"
126+ checked = { settings . background_sync }
127+ onChange = { handleBackgroundSyncToggle }
128+ />
129+ </ div >
130+
131+ { /* AutoPlay Media */ }
132+ < div className = "flex items-center justify-between gap-6" >
133+ < div >
134+ < div className = "font-semibold text-black dark:text-gray-200" >
135+ AutoPlay Media
136+ </ div >
137+ < p className = "text-xs text-gray-500" >
138+ when checked media will play automatically
139+ </ p >
140+ </ div >
141+ < input
142+ type = "checkbox"
143+ className = "toggle toggle-primary bg-black"
144+ checked = { settings . autoplay_media }
145+ onChange = { handleAutoplayMediaToggle }
146+ />
72147 </ div >
73148 </ div >
74149 </ div >
0 commit comments