Refresh the session cookie after a profile save
This commit is contained in:
@@ -5,12 +5,14 @@ import clientUploadMediaHandler from "@/src/functions/frontend/client-upload-med
|
|||||||
import type useFormInit from "@/src/hooks/use-form-init";
|
import type useFormInit from "@/src/hooks/use-form-init";
|
||||||
import type { UserFormObject } from "@/src/types";
|
import type { UserFormObject } from "@/src/types";
|
||||||
import { ProfileFields } from "../(data)/profile-fields";
|
import { ProfileFields } from "../(data)/profile-fields";
|
||||||
|
import fetchApi from "@moduletrace/twui/utils/fetch/fetchApi";
|
||||||
|
|
||||||
type Params = ReturnType<typeof useFormInit<UserFormObject>> & {
|
type Params = ReturnType<typeof useFormInit<UserFormObject>> & {
|
||||||
onSaved: (params: {
|
onSaved: (params: {
|
||||||
saved: UserFormObject;
|
saved: UserFormObject;
|
||||||
photo_src?: string;
|
photo_src?: string;
|
||||||
msg: string;
|
msg: string;
|
||||||
|
success?: boolean;
|
||||||
}) => void;
|
}) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,7 +89,14 @@ export default async function submitProfileForm({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onSaved({ saved, photo_src: image?.imageBase64Full, msg: "Saved." });
|
const reauth = await fetchApi(`/api/admin/reauth`);
|
||||||
|
|
||||||
|
onSaved({
|
||||||
|
saved,
|
||||||
|
photo_src: image?.imageBase64Full,
|
||||||
|
msg: "Saved.",
|
||||||
|
success: true,
|
||||||
|
});
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
setStatus({
|
setStatus({
|
||||||
error: true,
|
error: true,
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ export default function ProfileForm({ person }: Props) {
|
|||||||
);
|
);
|
||||||
const [saved_photo_src, setSavedPhotoSrc] = useState(() =>
|
const [saved_photo_src, setSavedPhotoSrc] = useState(() =>
|
||||||
person.profile_media_id
|
person.profile_media_id
|
||||||
? grabMediaURL({ media: { id: person.profile_media_id } })
|
? grabMediaURL({ media: { id: person.profile_media_id } }).media_url
|
||||||
.media_url
|
|
||||||
: undefined,
|
: undefined,
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
@@ -39,8 +38,7 @@ export default function ProfileForm({ person }: Props) {
|
|||||||
existing: saved,
|
existing: saved,
|
||||||
existing_full: { id: person.id },
|
existing_full: { id: person.id },
|
||||||
});
|
});
|
||||||
const { form, setForm, image, setImage, loading, status, setStatus } =
|
const { form, setForm, image, setImage, loading, status, setStatus } = init;
|
||||||
init;
|
|
||||||
|
|
||||||
const dirty = isProfileDirty({ form, existing: saved, image });
|
const dirty = isProfileDirty({ form, existing: saved, image });
|
||||||
const initials = [saved.first_name, saved.last_name]
|
const initials = [saved.first_name, saved.last_name]
|
||||||
@@ -70,6 +68,8 @@ export default function ProfileForm({ person }: Props) {
|
|||||||
setImage(undefined);
|
setImage(undefined);
|
||||||
if (photo_src) setSavedPhotoSrc(photo_src);
|
if (photo_src) setSavedPhotoSrc(photo_src);
|
||||||
setNotice(msg);
|
setNotice(msg);
|
||||||
|
|
||||||
|
window.location.reload();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@@ -87,7 +87,10 @@ export default function ProfileForm({ person }: Props) {
|
|||||||
/>
|
/>
|
||||||
</SettingsGroup>
|
</SettingsGroup>
|
||||||
|
|
||||||
<SettingsGroup title="Name" description="How you appear in the app.">
|
<SettingsGroup
|
||||||
|
title="Name"
|
||||||
|
description="How you appear in the app."
|
||||||
|
>
|
||||||
<Row className="w-full grid sm:grid-cols-2 gap-4!">
|
<Row className="w-full grid sm:grid-cols-2 gap-4!">
|
||||||
<ProfileTextField
|
<ProfileTextField
|
||||||
form={form}
|
form={form}
|
||||||
@@ -145,7 +148,10 @@ export default function ProfileForm({ person }: Props) {
|
|||||||
/>
|
/>
|
||||||
</SettingsGroup>
|
</SettingsGroup>
|
||||||
|
|
||||||
<SettingsGroup title="Role" description="Set when your account was made.">
|
<SettingsGroup
|
||||||
|
title="Role"
|
||||||
|
description="Set when your account was made."
|
||||||
|
>
|
||||||
<ProfileRoleRow user_types={person.user_types} />
|
<ProfileRoleRow user_types={person.user_types} />
|
||||||
</SettingsGroup>
|
</SettingsGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import findUserByIdentifier from "@/src/functions/backend/auth/find-user-by-identifier";
|
||||||
|
import verifyUserPassword from "@/src/functions/backend/auth/verify-user-password";
|
||||||
|
import loginUser from "@/src/functions/backend/auth/login-user";
|
||||||
|
import logEvent, { grabRequestIP } from "@/src/functions/backend/logger";
|
||||||
|
import { AppData } from "@/src/data/app-data";
|
||||||
|
import rateLimit from "@/src/utils/rate-limit";
|
||||||
|
import { PasswordLoginRequestSchema } from "@/src/schemas/auth-schema";
|
||||||
|
import parseWithSchema from "@/src/utils/parse-with-schema";
|
||||||
|
import safeErrorMessage from "@/src/utils/safe-error-message";
|
||||||
|
import AppError from "@/src/utils/app-error";
|
||||||
|
import type {
|
||||||
|
APIResponseObject,
|
||||||
|
BunextAPIRouteHandler,
|
||||||
|
} from "@moduletrace/bunext/types";
|
||||||
|
import userAuth from "@/src/functions/backend/auth/user-auth";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-authenticate a logged in user
|
||||||
|
*/
|
||||||
|
export const handler: BunextAPIRouteHandler<APIResponseObject> = async ({
|
||||||
|
req,
|
||||||
|
}) => {
|
||||||
|
try {
|
||||||
|
const { user } = await userAuth({ req });
|
||||||
|
|
||||||
|
if (!user?.logged_in_status) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
msg: `Unauthorized`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return await loginUser({
|
||||||
|
user_id: user.id,
|
||||||
|
req,
|
||||||
|
});
|
||||||
|
} catch (error: unknown) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
msg: safeErrorMessage({ error }),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user