dauth-context-react 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -24,7 +24,8 @@ var initialDauthState = {
24
24
  deleteAccount: () => Promise.resolve(false),
25
25
  getPasskeyCredentials: () => Promise.resolve([]),
26
26
  registerPasskey: () => Promise.resolve(null),
27
- deletePasskeyCredential: () => Promise.resolve(false)
27
+ deletePasskeyCredential: () => Promise.resolve(false),
28
+ uploadAvatar: () => Promise.resolve(false)
28
29
  };
29
30
  var initialDauthState_default = initialDauthState;
30
31
 
@@ -186,6 +187,18 @@ async function deletePasskeyCredentialAPI(basePath, credentialId) {
186
187
  const data = await response.json();
187
188
  return { response, data };
188
189
  }
190
+ async function uploadAvatarAPI(basePath, file) {
191
+ const formData = new FormData();
192
+ formData.append("avatar", file);
193
+ const response = await fetch(`${basePath}/avatar`, {
194
+ method: "POST",
195
+ headers: { "X-CSRF-Token": getCsrfToken() },
196
+ credentials: "include",
197
+ body: formData
198
+ });
199
+ const data = await response.json();
200
+ return { response, data };
201
+ }
189
202
 
190
203
  // src/webauthn.ts
191
204
  function base64urlToBuffer(base64url) {
@@ -441,6 +454,30 @@ async function deletePasskeyCredentialAction(ctx, credentialId) {
441
454
  return false;
442
455
  }
443
456
  }
457
+ async function uploadAvatarAction(ctx, file) {
458
+ const { dispatch, authProxyPath, onError } = ctx;
459
+ try {
460
+ const result = await uploadAvatarAPI(authProxyPath, file);
461
+ if (result.response.status === 200) {
462
+ dispatch({
463
+ type: UPDATE_USER,
464
+ payload: result.data.user
465
+ });
466
+ return true;
467
+ }
468
+ onError(
469
+ new Error(
470
+ "Avatar upload error: " + result.data.message
471
+ )
472
+ );
473
+ return false;
474
+ } catch (error) {
475
+ onError(
476
+ error instanceof Error ? error : new Error("Avatar upload error")
477
+ );
478
+ return false;
479
+ }
480
+ }
444
481
  var resetUser = (dispatch) => {
445
482
  return dispatch({
446
483
  type: LOGIN,
@@ -750,7 +787,8 @@ function DauthProfileModal({
750
787
  logout,
751
788
  getPasskeyCredentials,
752
789
  registerPasskey,
753
- deletePasskeyCredential
790
+ deletePasskeyCredential,
791
+ uploadAvatar
754
792
  } = useDauth();
755
793
  const isDesktop = useMediaQuery("(min-width: 641px)");
756
794
  const phase = useModalAnimation(open);
@@ -958,19 +996,21 @@ function DauthProfileModal({
958
996
  [deletePasskeyCredential]
959
997
  );
960
998
  const handleAvatarClick = useCallback(() => {
961
- if (onAvatarUpload) {
962
- avatarInputRef.current?.click();
963
- }
964
- }, [onAvatarUpload]);
999
+ avatarInputRef.current?.click();
1000
+ }, []);
965
1001
  const handleAvatarChange = useCallback(
966
1002
  async (e) => {
967
1003
  const file = e.target.files?.[0];
968
- if (!file || !onAvatarUpload) return;
1004
+ if (!file) return;
969
1005
  setUploadingAvatar(true);
970
1006
  try {
971
- const url = await onAvatarUpload(file);
972
- if (url) {
973
- await updateUser({ avatar: url });
1007
+ if (onAvatarUpload) {
1008
+ const url = await onAvatarUpload(file);
1009
+ if (url) {
1010
+ await updateUser({ avatar: url });
1011
+ }
1012
+ } else {
1013
+ await uploadAvatar(file);
974
1014
  }
975
1015
  } catch {
976
1016
  }
@@ -979,7 +1019,7 @@ function DauthProfileModal({
979
1019
  avatarInputRef.current.value = "";
980
1020
  }
981
1021
  },
982
- [onAvatarUpload, updateUser]
1022
+ [onAvatarUpload, updateUser, uploadAvatar]
983
1023
  );
984
1024
  const handleSignOut = useCallback(() => {
985
1025
  logout();
@@ -1121,7 +1161,7 @@ function DauthProfileModal({
1121
1161
  {
1122
1162
  style: {
1123
1163
  ...avatarCircle,
1124
- cursor: onAvatarUpload ? "pointer" : "default",
1164
+ cursor: "pointer",
1125
1165
  position: "relative"
1126
1166
  },
1127
1167
  onClick: handleAvatarClick,
@@ -1138,12 +1178,12 @@ function DauthProfileModal({
1138
1178
  }
1139
1179
  }
1140
1180
  ) : avatarInitial,
1141
- onAvatarUpload && !uploadingAvatar && /* @__PURE__ */ jsx("div", { style: avatarOverlay, children: /* @__PURE__ */ jsx(IconCamera, {}) })
1181
+ !uploadingAvatar && /* @__PURE__ */ jsx("div", { style: avatarOverlay, children: /* @__PURE__ */ jsx(IconCamera, {}) })
1142
1182
  ]
1143
1183
  }
1144
1184
  ),
1145
1185
  /* @__PURE__ */ jsx("div", { style: emailText, children: user.email }),
1146
- onAvatarUpload && /* @__PURE__ */ jsx(
1186
+ /* @__PURE__ */ jsx(
1147
1187
  "input",
1148
1188
  {
1149
1189
  ref: avatarInputRef,
@@ -2213,6 +2253,10 @@ var DauthProvider = (props) => {
2213
2253
  (credentialId) => deletePasskeyCredentialAction(ctx, credentialId),
2214
2254
  [ctx]
2215
2255
  );
2256
+ const uploadAvatar = useCallback2(
2257
+ (file) => uploadAvatarAction(ctx, file),
2258
+ [ctx]
2259
+ );
2216
2260
  const memoProvider = useMemo2(
2217
2261
  () => ({
2218
2262
  ...dauthState,
@@ -2222,7 +2266,8 @@ var DauthProvider = (props) => {
2222
2266
  deleteAccount,
2223
2267
  getPasskeyCredentials,
2224
2268
  registerPasskey,
2225
- deletePasskeyCredential
2269
+ deletePasskeyCredential,
2270
+ uploadAvatar
2226
2271
  }),
2227
2272
  [
2228
2273
  dauthState,
@@ -2232,7 +2277,8 @@ var DauthProvider = (props) => {
2232
2277
  deleteAccount,
2233
2278
  getPasskeyCredentials,
2234
2279
  registerPasskey,
2235
- deletePasskeyCredential
2280
+ deletePasskeyCredential,
2281
+ uploadAvatar
2236
2282
  ]
2237
2283
  );
2238
2284
  return /* @__PURE__ */ jsx2(DauthContext.Provider, { value: memoProvider, children });