mirror of
https://github.com/urosran/cally.git
synced 2025-11-26 08:24:55 +00:00
settings for other users, fixed event time
This commit is contained in:
@ -447,6 +447,12 @@ export const ManuallyAddEventModal = () => {
|
|||||||
value={startDate}
|
value={startDate}
|
||||||
onChange={(date) => {
|
onChange={(date) => {
|
||||||
setStartDate(date);
|
setStartDate(date);
|
||||||
|
|
||||||
|
if (date > endDate) {
|
||||||
|
const newEndDate = new Date(date);
|
||||||
|
newEndDate.setDate(date.getDate() + 1);
|
||||||
|
setEndDate(newEndDate);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
//maximumDate={endDate}
|
//maximumDate={endDate}
|
||||||
style={{
|
style={{
|
||||||
@ -459,10 +465,15 @@ export const ManuallyAddEventModal = () => {
|
|||||||
<DateTimePicker
|
<DateTimePicker
|
||||||
value={startTime}
|
value={startTime}
|
||||||
onChange={(time) => {
|
onChange={(time) => {
|
||||||
if (time <= endTime) {
|
if (
|
||||||
|
endDate.getDate() === startDate.getDate() &&
|
||||||
|
time.getHours() < endTime.getHours()
|
||||||
|
){
|
||||||
setStartTime(time);
|
setStartTime(time);
|
||||||
|
console.log('should happen')
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
maximumDate={endTime}
|
||||||
minuteInterval={5}
|
minuteInterval={5}
|
||||||
dateTimeFormatter={(date, mode) =>
|
dateTimeFormatter={(date, mode) =>
|
||||||
date.toLocaleTimeString("en-us", {
|
date.toLocaleTimeString("en-us", {
|
||||||
@ -508,6 +519,8 @@ export const ManuallyAddEventModal = () => {
|
|||||||
const newEndDate = new Date(endDate);
|
const newEndDate = new Date(endDate);
|
||||||
newEndDate.setDate(newEndDate.getDate() + 1);
|
newEndDate.setDate(newEndDate.getDate() + 1);
|
||||||
setEndDate(newEndDate);
|
setEndDate(newEndDate);
|
||||||
|
|
||||||
|
console.log('new day');
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
minuteInterval={5}
|
minuteInterval={5}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ const SettingsPage = () => {
|
|||||||
{pageIndex == 0 && (
|
{pageIndex == 0 && (
|
||||||
<View flexG centerH marginH-30 marginT-30>
|
<View flexG centerH marginH-30 marginT-30>
|
||||||
<Button
|
<Button
|
||||||
disabled={isntParent}
|
disabled={false}
|
||||||
backgroundColor="white"
|
backgroundColor="white"
|
||||||
style={styles.mainBtn}
|
style={styles.mainBtn}
|
||||||
children={
|
children={
|
||||||
@ -63,7 +63,7 @@ const SettingsPage = () => {
|
|||||||
onPress={() => setPageIndex(1)}
|
onPress={() => setPageIndex(1)}
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
disabled={isntParent}
|
disabled={false}
|
||||||
backgroundColor="white"
|
backgroundColor="white"
|
||||||
style={styles.mainBtn}
|
style={styles.mainBtn}
|
||||||
children={
|
children={
|
||||||
|
|||||||
@ -177,12 +177,14 @@ const MyGroup: React.FC<MyGroupProps> = ({
|
|||||||
}) ||
|
}) ||
|
||||||
undefined,
|
undefined,
|
||||||
]}
|
]}
|
||||||
borderRadius={10.56}
|
|
||||||
source={{ uri: member.pfp || undefined }}
|
source={{ uri: member.pfp || undefined }}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<View
|
<View
|
||||||
style={[styles.pfp, { backgroundColor: member.eventColor || colorMap.pink }]}
|
style={[
|
||||||
|
styles.pfp,
|
||||||
|
{ backgroundColor: member.eventColor || colorMap.pink },
|
||||||
|
]}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<View row marginL-10 centerV>
|
<View row marginL-10 centerV>
|
||||||
@ -212,7 +214,7 @@ const MyGroup: React.FC<MyGroupProps> = ({
|
|||||||
|
|
||||||
{!!caregivers.length && (
|
{!!caregivers.length && (
|
||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
<Text style={styles.subTit} marginB-10 marginT-15>
|
<Text style={styles.subTit} marginB-10>
|
||||||
Caregivers
|
Caregivers
|
||||||
</Text>
|
</Text>
|
||||||
{caregivers?.map((member) => (
|
{caregivers?.map((member) => (
|
||||||
@ -223,71 +225,104 @@ const MyGroup: React.FC<MyGroupProps> = ({
|
|||||||
style={styles.familyCard}
|
style={styles.familyCard}
|
||||||
row
|
row
|
||||||
centerV
|
centerV
|
||||||
padding-10
|
paddingT-10
|
||||||
>
|
>
|
||||||
<Avatar
|
{member.pfp ? (
|
||||||
source={{ uri: member?.pfp ?? undefined }}
|
<ImageBackground
|
||||||
size={40}
|
style={[
|
||||||
backgroundColor={Colors.grey60}
|
styles.pfp,
|
||||||
|
(member.eventColor && {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: member.eventColor,
|
||||||
|
}) ||
|
||||||
|
undefined,
|
||||||
|
]}
|
||||||
|
source={{ uri: member.pfp || undefined }}
|
||||||
/>
|
/>
|
||||||
<View marginL-10>
|
) : (
|
||||||
<Text text70M>
|
<View
|
||||||
|
style={[
|
||||||
|
styles.pfp,
|
||||||
|
{ backgroundColor: member.eventColor || colorMap.pink },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<View row marginL-10 centerV>
|
||||||
|
<Text style={styles.name}>
|
||||||
{member.firstName} {member.lastName}
|
{member.firstName} {member.lastName}
|
||||||
</Text>
|
</Text>
|
||||||
<Text text90 grey40>
|
|
||||||
Caregiver
|
|
||||||
</Text>
|
|
||||||
</View>
|
</View>
|
||||||
|
<View flexG />
|
||||||
<View flex-1 />
|
<View row centerV gap-10>
|
||||||
|
<Text style={styles.userType}>Caregiver</Text>
|
||||||
<UserMenu
|
<UserMenu
|
||||||
setShowQRCodeDialog={(val) => setShowQRCodeDialog(val)}
|
setShowQRCodeDialog={(val) => setShowQRCodeDialog(val)}
|
||||||
showQRCodeDialog={showQRCodeDialog === member?.uid}
|
showQRCodeDialog={showQRCodeDialog === member?.uid}
|
||||||
user={member}
|
user={member}
|
||||||
/>
|
/>
|
||||||
|
{profileData?.userType === ProfileType.PARENT && (
|
||||||
|
<UserOptions user={member} />
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!!familyDevices.length && (
|
{!!familyDevices.length && (
|
||||||
<>
|
<View style={styles.card}>
|
||||||
<Text text70 marginB-10 marginT-15>
|
<Text style={styles.subTit} marginB-10>
|
||||||
Family Devices
|
Family Devices
|
||||||
</Text>
|
</Text>
|
||||||
{familyDevices?.map((member, index) => (
|
{familyDevices?.map((member, index) => (
|
||||||
<Card
|
<Card
|
||||||
enableShadow={false}
|
enableShadow={false}
|
||||||
elevation={0}
|
elevation={0}
|
||||||
key={`${member.firstName}_${member.lastName}_${index}`}
|
key={`${member.firstName}_${index}`}
|
||||||
style={styles.familyCard}
|
style={styles.familyCard}
|
||||||
row
|
row
|
||||||
centerV
|
centerV
|
||||||
padding-10
|
paddingT-10
|
||||||
>
|
>
|
||||||
<Avatar
|
{member.pfp ? (
|
||||||
source={{ uri: member?.pfp ?? undefined }}
|
<ImageBackground
|
||||||
size={40}
|
style={[
|
||||||
backgroundColor={Colors.grey60}
|
styles.pfp,
|
||||||
|
(member.eventColor && {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: member.eventColor,
|
||||||
|
}) ||
|
||||||
|
undefined,
|
||||||
|
]}
|
||||||
|
imageStyle={{ borderRadius: 10.56 }}
|
||||||
|
source={{ uri: member.pfp || undefined }}
|
||||||
/>
|
/>
|
||||||
<View marginL-10>
|
) : (
|
||||||
<Text text70M>{member.firstName}</Text>
|
<View
|
||||||
<Text text90 grey40>
|
style={[
|
||||||
Family Device
|
styles.pfp,
|
||||||
</Text>
|
{ backgroundColor: member.eventColor || colorMap.pink },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<View row marginL-10 centerV>
|
||||||
|
<Text style={styles.name}>{member.firstName}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
<View flexG />
|
||||||
<View flex-1 />
|
<View row centerV gap-10>
|
||||||
|
<Text style={styles.userType}>Family Device</Text>
|
||||||
<UserMenu
|
<UserMenu
|
||||||
setShowQRCodeDialog={(val) => setShowQRCodeDialog(val)}
|
setShowQRCodeDialog={(val) => setShowQRCodeDialog(val)}
|
||||||
showQRCodeDialog={showQRCodeDialog === member?.uid}
|
showQRCodeDialog={showQRCodeDialog === member?.uid}
|
||||||
user={member}
|
user={member}
|
||||||
/>
|
/>
|
||||||
|
{profileData?.userType === ProfileType.PARENT && (
|
||||||
|
<UserOptions user={member} />
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
</>
|
</View>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
@ -630,7 +665,12 @@ const styles = StyleSheet.create({
|
|||||||
fontFamily: "PlusJakartaSans_500Medium",
|
fontFamily: "PlusJakartaSans_500Medium",
|
||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
},
|
},
|
||||||
pfp: { aspectRatio: 1, width: 37.03, borderRadius: 10.56 },
|
pfp: {
|
||||||
|
aspectRatio: 1,
|
||||||
|
width: 37.03,
|
||||||
|
borderRadius: 10.56,
|
||||||
|
overflow: "hidden",
|
||||||
|
},
|
||||||
userType: {
|
userType: {
|
||||||
fontFamily: "Manrope_500Medium",
|
fontFamily: "Manrope_500Medium",
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import Ionicons from "@expo/vector-icons/Ionicons";
|
|||||||
import * as tz from "tzdata";
|
import * as tz from "tzdata";
|
||||||
import * as Localization from "expo-localization";
|
import * as Localization from "expo-localization";
|
||||||
import debounce from "debounce";
|
import debounce from "debounce";
|
||||||
import { useAuthContext } from "@/contexts/AuthContext";
|
import { ProfileType, useAuthContext } from "@/contexts/AuthContext";
|
||||||
import { useUpdateUserData } from "@/hooks/firebase/useUpdateUserData";
|
import { useUpdateUserData } from "@/hooks/firebase/useUpdateUserData";
|
||||||
import { useChangeProfilePicture } from "@/hooks/firebase/useChangeProfilePicture";
|
import { useChangeProfilePicture } from "@/hooks/firebase/useChangeProfilePicture";
|
||||||
import { colorMap } from "@/constants/colorMap";
|
import { colorMap } from "@/constants/colorMap";
|
||||||
@ -24,9 +24,13 @@ import { AntDesign } from "@expo/vector-icons";
|
|||||||
import { useDeleteUser } from "@/hooks/firebase/useDeleteUser";
|
import { useDeleteUser } from "@/hooks/firebase/useDeleteUser";
|
||||||
import { useUpdateHouseholdName } from "@/hooks/firebase/useUpdateHouseholdName";
|
import { useUpdateHouseholdName } from "@/hooks/firebase/useUpdateHouseholdName";
|
||||||
import { useGetHouseholdName } from "@/hooks/firebase/useGetHouseholdName";
|
import { useGetHouseholdName } from "@/hooks/firebase/useGetHouseholdName";
|
||||||
|
import { useGetFamilyMembers } from "@/hooks/firebase/useGetFamilyMembers";
|
||||||
|
|
||||||
const MyProfile = () => {
|
const MyProfile = () => {
|
||||||
const { user, profileData } = useAuthContext();
|
const { user, profileData } = useAuthContext();
|
||||||
|
const { data: familyMembers } = useGetFamilyMembers();
|
||||||
|
const [takenColors, setTakenColors] = useState<string[]>([]);
|
||||||
|
|
||||||
const { data: hhName, refetch: refetchHHName } = useGetHouseholdName(
|
const { data: hhName, refetch: refetchHHName } = useGetHouseholdName(
|
||||||
profileData.familyId
|
profileData.familyId
|
||||||
);
|
);
|
||||||
@ -91,6 +95,15 @@ const MyProfile = () => {
|
|||||||
handleUpdateHouseholdName();
|
handleUpdateHouseholdName();
|
||||||
}, [householdName]);
|
}, [householdName]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (familyMembers) {
|
||||||
|
const colors = familyMembers
|
||||||
|
.filter(member => member?.eventColor && member.uid !== user?.uid)
|
||||||
|
.map(member => member.eventColor!);
|
||||||
|
setTakenColors(colors);
|
||||||
|
}
|
||||||
|
}, [familyMembers]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (profileData) {
|
if (profileData) {
|
||||||
setFirstName(profileData.firstName || "");
|
setFirstName(profileData.firstName || "");
|
||||||
@ -214,6 +227,8 @@ const MyProfile = () => {
|
|||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
<View paddingH-15>
|
<View paddingH-15>
|
||||||
|
{profileData?.userType == ProfileType.PARENT && (
|
||||||
|
<>
|
||||||
<Text text80 marginT-10 marginB-7 style={styles.label}>
|
<Text text80 marginT-10 marginB-7 style={styles.label}>
|
||||||
Household
|
Household
|
||||||
</Text>
|
</Text>
|
||||||
@ -226,6 +241,8 @@ const MyProfile = () => {
|
|||||||
setHouseholdName(value);
|
setHouseholdName(value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<Text text80 marginT-10 marginB-7 style={styles.label}>
|
<Text text80 marginT-10 marginB-7 style={styles.label}>
|
||||||
First name
|
First name
|
||||||
</Text>
|
</Text>
|
||||||
@ -267,36 +284,36 @@ const MyProfile = () => {
|
|||||||
Color Preference
|
Color Preference
|
||||||
</Text>
|
</Text>
|
||||||
<View row spread>
|
<View row spread>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.pink)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.pink)} disabled={takenColors.includes(colorMap.pink)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.pink}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.pink) ? 0.1 : 1}]} backgroundColor={colorMap.pink}>
|
||||||
{selectedColor == colorMap.pink && (
|
{selectedColor == colorMap.pink && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.orange)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.orange)} disabled={takenColors.includes(colorMap.orange)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.orange}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.orange) ? 0.1 : 1}]} backgroundColor={colorMap.orange}>
|
||||||
{selectedColor == colorMap.orange && (
|
{selectedColor == colorMap.orange && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.green)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.green)} disabled={takenColors.includes(colorMap.green)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.green}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.green) ? 0.1 : 1}]} backgroundColor={colorMap.green}>
|
||||||
{selectedColor == colorMap.green && (
|
{selectedColor == colorMap.green && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.teal)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.teal)} disabled={takenColors.includes(colorMap.teal)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.teal}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.teal) ? 0.1 : 1}]} backgroundColor={colorMap.teal}>
|
||||||
{selectedColor == colorMap.teal && (
|
{selectedColor == colorMap.teal && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.purple)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.purple)}disabled={takenColors.includes(colorMap.purple)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.purple}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.purple) ? 0.1 : 1}]} backgroundColor={colorMap.purple}>
|
||||||
{selectedColor == colorMap.purple && (
|
{selectedColor == colorMap.purple && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
@ -304,36 +321,36 @@ const MyProfile = () => {
|
|||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
<View row spread marginT-10>
|
<View row spread marginT-10>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.navy)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.navy)} disabled={takenColors.includes(colorMap.navy)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.navy}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.navy) ? 0.1 : 1}]} backgroundColor={colorMap.navy}>
|
||||||
{selectedColor == colorMap.navy && (
|
{selectedColor == colorMap.navy && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.red)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.red)} disabled={takenColors.includes(colorMap.red)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.red}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.red) ? 0.1 : 1}]} backgroundColor={colorMap.red}>
|
||||||
{selectedColor == colorMap.red && (
|
{selectedColor == colorMap.red && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.indigo)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.indigo)} disabled={takenColors.includes(colorMap.indigo)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.indigo}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.indigo) ? 0.1 : 1}]} backgroundColor={colorMap.indigo}>
|
||||||
{selectedColor == colorMap.indigo && (
|
{selectedColor == colorMap.indigo && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.emerald)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.emerald)} disabled={takenColors.includes(colorMap.emerald)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.emerald}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.emerald) ? 0.1 : 1}]} backgroundColor={colorMap.emerald}>
|
||||||
{selectedColor == colorMap.emerald && (
|
{selectedColor == colorMap.emerald && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<TouchableOpacity onPress={() => handleChangeColor(colorMap.violet)}>
|
<TouchableOpacity onPress={() => handleChangeColor(colorMap.violet)} disabled={takenColors.includes(colorMap.violet)}>
|
||||||
<View style={styles.colorBox} backgroundColor={colorMap.violet}>
|
<View style={[styles.colorBox, {opacity: takenColors.includes(colorMap.violet) ? 0.1 : 1}]} backgroundColor={colorMap.violet}>
|
||||||
{selectedColor == colorMap.violet && (
|
{selectedColor == colorMap.violet && (
|
||||||
<AntDesign name="check" size={30} color="white" />
|
<AntDesign name="check" size={30} color="white" />
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user