-
-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(Meetings): add quick settings for midweek and weekend meetings #2403
Changes from all commits
cc643bd
a2d3309
d39071d
fc63871
9ef2845
ef850b0
b365351
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export type AboutProps = { | ||
updatePwa: VoidFunction; | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { useAppTranslation } from '@hooks/index'; | ||
import useCongregationPrivacy from './useOutgoingTalkAccess'; | ||
import SwitchWithLabel from '@components/switch_with_label'; | ||
|
||
const OutgoingTalkAccess = () => { | ||
const { t } = useAppTranslation(); | ||
|
||
const { outgoingTalksPublic, handleOutgoingTalksPublicToggle } = | ||
useCongregationPrivacy(); | ||
|
||
return ( | ||
<SwitchWithLabel | ||
label={t('tr_showOutgoingToAll')} | ||
helper={t('tr_showOutgoingToAllDesc')} | ||
checked={outgoingTalksPublic} | ||
onChange={handleOutgoingTalksPublicToggle} | ||
/> | ||
); | ||
}; | ||
|
||
export default OutgoingTalkAccess; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import { useEffect, useState } from 'react'; | ||
import { useRecoilValue } from 'recoil'; | ||
import { settingsState, userDataViewState } from '@states/settings'; | ||
import { dbAppSettingsUpdate } from '@services/dexie/settings'; | ||
|
||
const useOutgoingTalkAccess = () => { | ||
const settings = useRecoilValue(settingsState); | ||
const dataView = useRecoilValue(userDataViewState); | ||
|
||
const [outgoingTalksPublic, setOutgoingTalksPublic] = useState(false); | ||
|
||
const handleOutgoingTalksPublicToggle = async () => { | ||
const weekendSettings = structuredClone( | ||
settings.cong_settings.weekend_meeting | ||
); | ||
|
||
const current = weekendSettings.find((record) => record.type === dataView); | ||
|
||
current.outgoing_talks_schedule_public.value = !outgoingTalksPublic; | ||
current.outgoing_talks_schedule_public.updatedAt = new Date().toISOString(); | ||
|
||
await dbAppSettingsUpdate({ | ||
'cong_settings.weekend_meeting': weekendSettings, | ||
}); | ||
}; | ||
|
||
useEffect(() => { | ||
const weekendSettings = settings.cong_settings.weekend_meeting.find( | ||
(record) => record.type === dataView | ||
); | ||
|
||
setOutgoingTalksPublic( | ||
weekendSettings.outgoing_talks_schedule_public.value | ||
); | ||
}, [settings, dataView]); | ||
|
||
return { | ||
outgoingTalksPublic, | ||
handleOutgoingTalksPublicToggle, | ||
}; | ||
}; | ||
|
||
export default useOutgoingTalkAccess; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { useAppTranslation } from '@hooks/index'; | ||
import useDisplayName from './useDisplayName'; | ||
import SwitchWithLabel from '@components/switch_with_label'; | ||
|
||
const DisplayName = () => { | ||
const { t } = useAppTranslation(); | ||
|
||
const { displayNameMeeting, handleDisplayNameMeetingToggle } = | ||
useDisplayName(); | ||
|
||
return ( | ||
<SwitchWithLabel | ||
label={t('tr_useDisplayNameMeeting')} | ||
checked={displayNameMeeting} | ||
onChange={handleDisplayNameMeetingToggle} | ||
/> | ||
); | ||
}; | ||
|
||
export default DisplayName; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,37 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useEffect, useState } from 'react'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useRecoilValue } from 'recoil'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { settingsState, userDataViewState } from '@states/settings'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { dbAppSettingsUpdate } from '@services/dexie/settings'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const useMeetingForms = () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const settings = useRecoilValue(settingsState); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const dataView = useRecoilValue(userDataViewState); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [displayNameMeeting, setDisplayNameMeeting] = useState(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const handleDisplayNameMeetingToggle = async () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const displayNameEnabled = structuredClone( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
settings.cong_settings.display_name_enabled.meetings | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
displayNameEnabled.value = !displayNameMeeting; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
displayNameEnabled.updatedAt = new Date().toISOString(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await dbAppSettingsUpdate({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'cong_settings.display_name_enabled.meetings': displayNameEnabled, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling for the async function. The const handleDisplayNameMeetingToggle = async () => {
try {
const displayNameEnabled = structuredClone(
settings.cong_settings.display_name_enabled.meetings
);
displayNameEnabled.value = !displayNameMeeting;
displayNameEnabled.updatedAt = new Date().toISOString();
await dbAppSettingsUpdate({
'cong_settings.display_name_enabled.meetings': displayNameEnabled,
});
} catch (error) {
console.error('Failed to update display name setting:', error);
}
}; Committable suggestion
Suggested change
Consider adding a loading state. Consider adding a loading state to provide feedback to the user during the async operation. const useMeetingForms = () => {
const settings = useRecoilValue(settingsState);
const dataView = useRecoilValue(userDataViewState);
const [displayNameMeeting, setDisplayNameMeeting] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
const handleDisplayNameMeetingToggle = async () => {
+ setIsLoading(true);
try {
const displayNameEnabled = structuredClone(
settings.cong_settings.display_name_enabled.meetings
);
displayNameEnabled.value = !displayNameMeeting;
displayNameEnabled.updatedAt = new Date().toISOString();
await dbAppSettingsUpdate({
'cong_settings.display_name_enabled.meetings': displayNameEnabled,
});
} catch (error) {
console.error('Failed to update display name setting:', error);
} finally {
+ setIsLoading(false);
}
};
useEffect(() => {
setDisplayNameMeeting(
settings.cong_settings.display_name_enabled.meetings.value
);
}, [settings, dataView]);
return {
displayNameMeeting,
+ isLoading,
handleDisplayNameMeetingToggle,
};
}; Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setDisplayNameMeeting( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
settings.cong_settings.display_name_enabled.meetings.value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [settings, dataView]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
displayNameMeeting, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
handleDisplayNameMeetingToggle, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export default useMeetingForms; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for the async function.
The
handleOutgoingTalksPublicToggle
function should handle potential errors from the async operation to ensure robustness.Committable suggestion
Consider adding a loading state.
Consider adding a loading state to provide feedback to the user during the async operation.
Committable suggestion