@serhii.olishevskyi/docs 1.2.16 → 1.2.17

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.d.mts CHANGED
@@ -171,6 +171,21 @@ interface CopyClipboardButtonComponentProps extends Omit<IconButtonProps, 'onCli
171
171
  onCopySuccess?: (text: string) => void;
172
172
  }
173
173
 
174
+ interface RefreshButtonComponentProps {
175
+ overrideNamespace?: string;
176
+ size?: 'small' | 'medium' | 'large';
177
+ color?: "success" | "error" | "info" | "warning";
178
+ onClick?: (event: React__default.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
179
+ disabled?: boolean;
180
+ fullWidth?: boolean;
181
+ loading?: boolean;
182
+ tooltip?: ReactNode;
183
+ mobileViewOnly?: boolean;
184
+ disableMobileView?: boolean;
185
+ hideTooltipOnMobile?: boolean;
186
+ hideTooltipOnDesktop?: boolean;
187
+ }
188
+
174
189
  interface TranslatableTooltipComponentProps extends Omit<TooltipProps, 'children'> {
175
190
  overrideNamespace?: string;
176
191
  disableSpan?: boolean;
@@ -397,6 +412,7 @@ declare const UI: {
397
412
  };
398
413
  Buttons: {
399
414
  CopyClipboardButton: React$1.FC<CopyClipboardButtonComponentProps>;
415
+ RefreshButton: React$1.FC<RefreshButtonComponentProps>;
400
416
  };
401
417
  DataDisplay: {
402
418
  TranslatableTooltip: React$1.FC<TranslatableTooltipComponentProps>;
@@ -763,6 +779,10 @@ declare const Hooks: {
763
779
 
764
780
  declare const Utils: {
765
781
  readonly getDeviceId: () => string;
782
+ readonly Sessions: {
783
+ readonly notifySessionChange: () => void;
784
+ readonly subscribeToSessionChanges: (callback: () => void) => () => void;
785
+ };
766
786
  };
767
787
 
768
- export { type AIConfig, type AIGenerateOptions, AIProvider, type AIProviderProps, type AIProviderType, AppSettingsProvider, AuthProvider, BreadcrumbProvider, type CheckboxComponentProps, type CollapsedWidgetContainerProps, type CompanyMember, type ConfirmOptions, type ConfirmResult, ConfirmationProvider, type ConfirmationProviderProps, type CopyClipboardButtonComponentProps, type DialogSeverity, type DisplayState, type EmailInputComponentProps, type ExpandableNoteComponentProps, type FullCompanyMemberItem, Hooks, type Language, LocalizationProvider, type Membership, type MembershipRole, type MyAvatarComponentProps, type NumberInputComponentProps, type PageLink, type PageLinkWidgetProps, Providers, type SaveCompanyUserPayload, type SearchComponentProps, type SelectComponentProps, type SelectOption, Services, type SupabaseConfig, SupabaseProvider, type SupabaseProviderProps, type SwitchComponentProps, type TextFieldComponentProps, type ThemeColors, type ThemeConfig, type ThemeMode, ThemeProvider, ToastProvider, type ToastType, type TranslatableTooltipComponentProps, TranslateProvider, TranslateText, TranslationEditProvider, type TypographyConfig, UI, type UrlComponentProps as UrlProps, type UserAvatarComponentProps, type UserGroupedSessions, type UserPopoverComponentProps, type UserProfile, type UserRoleChipComponentProps, type UserSessionItem, type UserSettings, UserSettingsProvider, type UserStatusChipComponentProps, type UserStatusType, Utils, defaultUserSettings, initI18n, useAI, useAppSettings, useAppTheme, useAuth, useBreadcrumb, useConfirmation, useLocalization, useSupabase, useToast, useTranslationEdit, useTranslationNamespace, useUserSettings };
788
+ export { type AIConfig, type AIGenerateOptions, AIProvider, type AIProviderProps, type AIProviderType, AppSettingsProvider, AuthProvider, BreadcrumbProvider, type CheckboxComponentProps, type CollapsedWidgetContainerProps, type CompanyMember, type ConfirmOptions, type ConfirmResult, ConfirmationProvider, type ConfirmationProviderProps, type CopyClipboardButtonComponentProps, type DialogSeverity, type DisplayState, type EmailInputComponentProps, type ExpandableNoteComponentProps, type FullCompanyMemberItem, Hooks, type Language, LocalizationProvider, type Membership, type MembershipRole, type MyAvatarComponentProps, type NumberInputComponentProps, type PageLink, type PageLinkWidgetProps, Providers, type RefreshButtonComponentProps, type SaveCompanyUserPayload, type SearchComponentProps, type SelectComponentProps, type SelectOption, Services, type SupabaseConfig, SupabaseProvider, type SupabaseProviderProps, type SwitchComponentProps, type TextFieldComponentProps, type ThemeColors, type ThemeConfig, type ThemeMode, ThemeProvider, ToastProvider, type ToastType, type TranslatableTooltipComponentProps, TranslateProvider, TranslateText, TranslationEditProvider, type TypographyConfig, UI, type UrlComponentProps as UrlProps, type UserAvatarComponentProps, type UserGroupedSessions, type UserPopoverComponentProps, type UserProfile, type UserRoleChipComponentProps, type UserSessionItem, type UserSettings, UserSettingsProvider, type UserStatusChipComponentProps, type UserStatusType, Utils, defaultUserSettings, initI18n, useAI, useAppSettings, useAppTheme, useAuth, useBreadcrumb, useConfirmation, useLocalization, useSupabase, useToast, useTranslationEdit, useTranslationNamespace, useUserSettings };
package/dist/index.d.ts CHANGED
@@ -171,6 +171,21 @@ interface CopyClipboardButtonComponentProps extends Omit<IconButtonProps, 'onCli
171
171
  onCopySuccess?: (text: string) => void;
172
172
  }
173
173
 
174
+ interface RefreshButtonComponentProps {
175
+ overrideNamespace?: string;
176
+ size?: 'small' | 'medium' | 'large';
177
+ color?: "success" | "error" | "info" | "warning";
178
+ onClick?: (event: React__default.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
179
+ disabled?: boolean;
180
+ fullWidth?: boolean;
181
+ loading?: boolean;
182
+ tooltip?: ReactNode;
183
+ mobileViewOnly?: boolean;
184
+ disableMobileView?: boolean;
185
+ hideTooltipOnMobile?: boolean;
186
+ hideTooltipOnDesktop?: boolean;
187
+ }
188
+
174
189
  interface TranslatableTooltipComponentProps extends Omit<TooltipProps, 'children'> {
175
190
  overrideNamespace?: string;
176
191
  disableSpan?: boolean;
@@ -397,6 +412,7 @@ declare const UI: {
397
412
  };
398
413
  Buttons: {
399
414
  CopyClipboardButton: React$1.FC<CopyClipboardButtonComponentProps>;
415
+ RefreshButton: React$1.FC<RefreshButtonComponentProps>;
400
416
  };
401
417
  DataDisplay: {
402
418
  TranslatableTooltip: React$1.FC<TranslatableTooltipComponentProps>;
@@ -763,6 +779,10 @@ declare const Hooks: {
763
779
 
764
780
  declare const Utils: {
765
781
  readonly getDeviceId: () => string;
782
+ readonly Sessions: {
783
+ readonly notifySessionChange: () => void;
784
+ readonly subscribeToSessionChanges: (callback: () => void) => () => void;
785
+ };
766
786
  };
767
787
 
768
- export { type AIConfig, type AIGenerateOptions, AIProvider, type AIProviderProps, type AIProviderType, AppSettingsProvider, AuthProvider, BreadcrumbProvider, type CheckboxComponentProps, type CollapsedWidgetContainerProps, type CompanyMember, type ConfirmOptions, type ConfirmResult, ConfirmationProvider, type ConfirmationProviderProps, type CopyClipboardButtonComponentProps, type DialogSeverity, type DisplayState, type EmailInputComponentProps, type ExpandableNoteComponentProps, type FullCompanyMemberItem, Hooks, type Language, LocalizationProvider, type Membership, type MembershipRole, type MyAvatarComponentProps, type NumberInputComponentProps, type PageLink, type PageLinkWidgetProps, Providers, type SaveCompanyUserPayload, type SearchComponentProps, type SelectComponentProps, type SelectOption, Services, type SupabaseConfig, SupabaseProvider, type SupabaseProviderProps, type SwitchComponentProps, type TextFieldComponentProps, type ThemeColors, type ThemeConfig, type ThemeMode, ThemeProvider, ToastProvider, type ToastType, type TranslatableTooltipComponentProps, TranslateProvider, TranslateText, TranslationEditProvider, type TypographyConfig, UI, type UrlComponentProps as UrlProps, type UserAvatarComponentProps, type UserGroupedSessions, type UserPopoverComponentProps, type UserProfile, type UserRoleChipComponentProps, type UserSessionItem, type UserSettings, UserSettingsProvider, type UserStatusChipComponentProps, type UserStatusType, Utils, defaultUserSettings, initI18n, useAI, useAppSettings, useAppTheme, useAuth, useBreadcrumb, useConfirmation, useLocalization, useSupabase, useToast, useTranslationEdit, useTranslationNamespace, useUserSettings };
788
+ export { type AIConfig, type AIGenerateOptions, AIProvider, type AIProviderProps, type AIProviderType, AppSettingsProvider, AuthProvider, BreadcrumbProvider, type CheckboxComponentProps, type CollapsedWidgetContainerProps, type CompanyMember, type ConfirmOptions, type ConfirmResult, ConfirmationProvider, type ConfirmationProviderProps, type CopyClipboardButtonComponentProps, type DialogSeverity, type DisplayState, type EmailInputComponentProps, type ExpandableNoteComponentProps, type FullCompanyMemberItem, Hooks, type Language, LocalizationProvider, type Membership, type MembershipRole, type MyAvatarComponentProps, type NumberInputComponentProps, type PageLink, type PageLinkWidgetProps, Providers, type RefreshButtonComponentProps, type SaveCompanyUserPayload, type SearchComponentProps, type SelectComponentProps, type SelectOption, Services, type SupabaseConfig, SupabaseProvider, type SupabaseProviderProps, type SwitchComponentProps, type TextFieldComponentProps, type ThemeColors, type ThemeConfig, type ThemeMode, ThemeProvider, ToastProvider, type ToastType, type TranslatableTooltipComponentProps, TranslateProvider, TranslateText, TranslationEditProvider, type TypographyConfig, UI, type UrlComponentProps as UrlProps, type UserAvatarComponentProps, type UserGroupedSessions, type UserPopoverComponentProps, type UserProfile, type UserRoleChipComponentProps, type UserSessionItem, type UserSettings, UserSettingsProvider, type UserStatusChipComponentProps, type UserStatusType, Utils, defaultUserSettings, initI18n, useAI, useAppSettings, useAppTheme, useAuth, useBreadcrumb, useConfirmation, useLocalization, useSupabase, useToast, useTranslationEdit, useTranslationNamespace, useUserSettings };
package/dist/index.js CHANGED
@@ -2619,7 +2619,7 @@ var init_UserPopoverComponent = __esm({
2619
2619
  }
2620
2620
  };
2621
2621
  loadStatus();
2622
- const channel = supabase.channel(`user_status_popover_${userId}`).on(
2622
+ const channel2 = supabase.channel(`user_status_popover_${userId}`).on(
2623
2623
  "postgres_changes",
2624
2624
  {
2625
2625
  event: "*",
@@ -2633,7 +2633,7 @@ var init_UserPopoverComponent = __esm({
2633
2633
  ).subscribe();
2634
2634
  return () => {
2635
2635
  isMounted = false;
2636
- supabase.removeChannel(channel);
2636
+ supabase.removeChannel(channel2);
2637
2637
  };
2638
2638
  }, [userId, open]);
2639
2639
  const isOnline = Boolean(
@@ -3096,7 +3096,7 @@ var TextFieldComponent = ({
3096
3096
  ...slotProps?.input || {},
3097
3097
  readOnly: isReadOnly,
3098
3098
  endAdornment: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_material4.InputAdornment, { position: "end", sx: { gap: 0.5 }, children: [
3099
- hasValue && !isLocked && !disableClearButton && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace, children: clearTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3099
+ hasValue && !isLocked && !disableClearButton && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: clearTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3100
3100
  import_material4.IconButton,
3101
3101
  {
3102
3102
  size: "small",
@@ -3106,7 +3106,7 @@ var TextFieldComponent = ({
3106
3106
  children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_Clear.default, { fontSize: "small" })
3107
3107
  }
3108
3108
  ) }),
3109
- hasValue && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace, children: copied ? copiedTooltip : copyTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3109
+ hasValue && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: copied ? copiedTooltip : copyTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3110
3110
  import_material4.IconButton,
3111
3111
  {
3112
3112
  size: "small",
@@ -3156,7 +3156,7 @@ var TextFieldComponent = ({
3156
3156
  )
3157
3157
  }
3158
3158
  ) }),
3159
- isLocked && showLock && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace, children: lockTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3159
+ isLocked && showLock && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: lockTooltip }), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3160
3160
  import_material4.IconButton,
3161
3161
  {
3162
3162
  size: "small",
@@ -4834,7 +4834,7 @@ var CollapsedWidgetContainer = (props) => {
4834
4834
  {
4835
4835
  sx: { flexGrow: 1 },
4836
4836
  avatar: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_material24.Avatar, { sx: { bgcolor: "primary.main" }, children: props.icon }),
4837
- label: typeof props.title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_material24.Typography, { variant: "subtitle1", sx: { fontWeight: "700" }, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) }) : props.title,
4837
+ label: typeof props.title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) : props.title,
4838
4838
  subheader: typeof props.subtitle === "string" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.subtitle }) : props.subtitle
4839
4839
  }
4840
4840
  ),
@@ -4856,6 +4856,80 @@ var CollapsedWidgetContainer = (props) => {
4856
4856
  ] });
4857
4857
  };
4858
4858
 
4859
+ // src/UI/components/buttons/RefreshButtonComponent.tsx
4860
+ var import_react30 = require("react");
4861
+ var import_material25 = require("@mui/material");
4862
+ var import_Refresh = __toESM(require("@mui/icons-material/Refresh"));
4863
+ init_context();
4864
+ init_TranslatableTooltipComponent();
4865
+ var import_jsx_runtime35 = require("react/jsx-runtime");
4866
+ var AnimatedRefreshIcon = (0, import_material25.styled)(import_Refresh.default, {
4867
+ shouldForwardProp: (prop) => prop !== "isSpinning"
4868
+ })(({ isSpinning }) => ({
4869
+ animation: isSpinning ? "spin 1s linear infinite" : "none",
4870
+ "@keyframes spin": {
4871
+ "0%": {
4872
+ transform: "rotate(0deg)"
4873
+ },
4874
+ "100%": {
4875
+ transform: "rotate(360deg)"
4876
+ }
4877
+ }
4878
+ }));
4879
+ var RefreshButtonComponent = ({
4880
+ overrideNamespace,
4881
+ size = "small",
4882
+ onClick,
4883
+ disabled = false,
4884
+ fullWidth = false,
4885
+ loading: externalLoading,
4886
+ tooltip,
4887
+ mobileViewOnly,
4888
+ disableMobileView,
4889
+ hideTooltipOnMobile,
4890
+ hideTooltipOnDesktop
4891
+ }) => {
4892
+ const { displayState } = useAppTheme();
4893
+ const [internalLoading, setInternalLoading] = (0, import_react30.useState)(false);
4894
+ const isLoading = externalLoading !== void 0 ? externalLoading : internalLoading;
4895
+ const handleClick = async (event) => {
4896
+ if (!onClick || isLoading || disabled) return;
4897
+ try {
4898
+ setInternalLoading(true);
4899
+ await onClick(event);
4900
+ } finally {
4901
+ setInternalLoading(false);
4902
+ }
4903
+ };
4904
+ const renderIcon = () => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(AnimatedRefreshIcon, { fontSize: size, isSpinning: isLoading });
4905
+ if (displayState.isMobile && !disableMobileView || mobileViewOnly) {
4906
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslatableTooltipComponent, { title: hideTooltipOnMobile ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_jsx_runtime35.Fragment, {}) : tooltip || /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4907
+ import_material25.Fab,
4908
+ {
4909
+ size,
4910
+ color: "inherit",
4911
+ onClick: handleClick,
4912
+ disabled: disabled || isLoading,
4913
+ "aria-label": "refresh",
4914
+ children: renderIcon()
4915
+ }
4916
+ ) }) });
4917
+ }
4918
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslatableTooltipComponent, { title: hideTooltipOnDesktop ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_jsx_runtime35.Fragment, {}) : tooltip || /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4919
+ import_material25.Button,
4920
+ {
4921
+ variant: "contained",
4922
+ color: "inherit",
4923
+ size,
4924
+ onClick: handleClick,
4925
+ disabled: disabled || isLoading,
4926
+ fullWidth,
4927
+ startIcon: renderIcon(),
4928
+ children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" })
4929
+ }
4930
+ ) });
4931
+ };
4932
+
4859
4933
  // src/UI/index.ts
4860
4934
  var UI = {
4861
4935
  Inputs: {
@@ -4869,7 +4943,8 @@ var UI = {
4869
4943
  Url: UrlComponent
4870
4944
  },
4871
4945
  Buttons: {
4872
- CopyClipboardButton: CopyClipboardButtonComponent
4946
+ CopyClipboardButton: CopyClipboardButtonComponent,
4947
+ RefreshButton: RefreshButtonComponent
4873
4948
  },
4874
4949
  DataDisplay: {
4875
4950
  TranslatableTooltip: TranslatableTooltipComponent,
@@ -4918,16 +4993,16 @@ var Services = {
4918
4993
  };
4919
4994
 
4920
4995
  // src/hooks/useUserStatus.ts
4921
- var import_react30 = require("react");
4996
+ var import_react31 = require("react");
4922
4997
  init_deviceId();
4923
4998
  init_context();
4924
4999
  var ONLINE_THRESHOLD_MINUTES = 2;
4925
5000
  var AWAY_THRESHOLD_MINUTES = 15;
4926
5001
  var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
4927
5002
  const supabase = useSupabase();
4928
- const [status, setStatus] = (0, import_react30.useState)("offline");
4929
- const [lastSeen, setLastSeen] = (0, import_react30.useState)(initialLastSeenAt ?? null);
4930
- const lastSeenRef = (0, import_react30.useRef)(initialLastSeenAt ?? null);
5003
+ const [status, setStatus] = (0, import_react31.useState)("offline");
5004
+ const [lastSeen, setLastSeen] = (0, import_react31.useState)(initialLastSeenAt ?? null);
5005
+ const lastSeenRef = (0, import_react31.useRef)(initialLastSeenAt ?? null);
4931
5006
  lastSeenRef.current = lastSeen;
4932
5007
  const calculateStatus = (isOnline, lastSeenIso) => {
4933
5008
  if (isOnline) return "online";
@@ -4943,7 +5018,7 @@ var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
4943
5018
  }
4944
5019
  return "offline";
4945
5020
  };
4946
- (0, import_react30.useEffect)(() => {
5021
+ (0, import_react31.useEffect)(() => {
4947
5022
  if (!userId) return;
4948
5023
  let isMounted = true;
4949
5024
  const isSelf = currentAuthUserId && userId === currentAuthUserId;
@@ -4966,9 +5041,9 @@ var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
4966
5041
  }
4967
5042
  };
4968
5043
  fetchLastSeen();
4969
- const channel = supabase.channel(`presence_user_${userId}`);
4970
- channel.on("presence", { event: "sync" }, () => {
4971
- const state = channel.presenceState();
5044
+ const channel2 = supabase.channel(`presence_user_${userId}`);
5045
+ channel2.on("presence", { event: "sync" }, () => {
5046
+ const state = channel2.presenceState();
4972
5047
  const isOnline = Object.keys(state).length > 0;
4973
5048
  if (isMounted) {
4974
5049
  setStatus(isOnline ? "online" : calculateStatus(false, lastSeenRef.current));
@@ -4998,7 +5073,7 @@ var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
4998
5073
  ).subscribe();
4999
5074
  return () => {
5000
5075
  isMounted = false;
5001
- supabase.removeChannel(channel);
5076
+ supabase.removeChannel(channel2);
5002
5077
  };
5003
5078
  }, [userId, initialLastSeenAt, currentAuthUserId]);
5004
5079
  return {
@@ -5016,8 +5091,31 @@ var Hooks = {
5016
5091
 
5017
5092
  // src/utils/index.ts
5018
5093
  init_deviceId();
5094
+
5095
+ // src/utils/session.events.ts
5096
+ var channel = typeof window !== "undefined" ? new BroadcastChannel("session_activity") : null;
5097
+ var notifySessionChange = () => {
5098
+ channel?.postMessage("SESSION_UPDATED");
5099
+ };
5100
+ var subscribeToSessionChanges = (callback) => {
5101
+ if (!channel) return () => {
5102
+ };
5103
+ const handleMessage = (event) => {
5104
+ if (event.data === "SESSION_UPDATED") {
5105
+ callback();
5106
+ }
5107
+ };
5108
+ channel.addEventListener("message", handleMessage);
5109
+ return () => channel.removeEventListener("message", handleMessage);
5110
+ };
5111
+
5112
+ // src/utils/index.ts
5019
5113
  var Utils = {
5020
- getDeviceId
5114
+ getDeviceId,
5115
+ Sessions: {
5116
+ notifySessionChange,
5117
+ subscribeToSessionChanges
5118
+ }
5021
5119
  };
5022
5120
  // Annotate the CommonJS export names for ESM import in node:
5023
5121
  0 && (module.exports = {
package/dist/index.mjs CHANGED
@@ -156,7 +156,7 @@ var TextFieldComponent = ({
156
156
  ...slotProps?.input || {},
157
157
  readOnly: isReadOnly,
158
158
  endAdornment: /* @__PURE__ */ jsxs(InputAdornment, { position: "end", sx: { gap: 0.5 }, children: [
159
- hasValue && !isLocked && !disableClearButton && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace, children: clearTooltip }), children: /* @__PURE__ */ jsx(
159
+ hasValue && !isLocked && !disableClearButton && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: clearTooltip }), children: /* @__PURE__ */ jsx(
160
160
  IconButton,
161
161
  {
162
162
  size: "small",
@@ -166,7 +166,7 @@ var TextFieldComponent = ({
166
166
  children: /* @__PURE__ */ jsx(ClearIcon, { fontSize: "small" })
167
167
  }
168
168
  ) }),
169
- hasValue && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace, children: copied ? copiedTooltip : copyTooltip }), children: /* @__PURE__ */ jsx(
169
+ hasValue && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: copied ? copiedTooltip : copyTooltip }), children: /* @__PURE__ */ jsx(
170
170
  IconButton,
171
171
  {
172
172
  size: "small",
@@ -216,7 +216,7 @@ var TextFieldComponent = ({
216
216
  )
217
217
  }
218
218
  ) }),
219
- isLocked && showLock && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace, children: lockTooltip }), children: /* @__PURE__ */ jsx(
219
+ isLocked && showLock && /* @__PURE__ */ jsx(TranslatableTooltipComponent, { title: /* @__PURE__ */ jsx(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: lockTooltip }), children: /* @__PURE__ */ jsx(
220
220
  IconButton,
221
221
  {
222
222
  size: "small",
@@ -1875,7 +1875,7 @@ var CheckboxComponent = ({
1875
1875
 
1876
1876
  // src/UI/widgets/page/CollapsedWidgetContainer.tsx
1877
1877
  import { ExpandMore as ExpandMoreIcon } from "@mui/icons-material";
1878
- import { Avatar as Avatar3, Box as Box8, Card as Card2, CardContent as CardContent2, CardHeader as CardHeader2, Collapse, Divider as Divider2, IconButton as IconButton7, styled, Tooltip as Tooltip7, Typography as Typography7 } from "@mui/material";
1878
+ import { Avatar as Avatar3, Box as Box8, Card as Card2, CardContent as CardContent2, CardHeader as CardHeader2, Collapse, Divider as Divider2, IconButton as IconButton7, styled, Tooltip as Tooltip7 } from "@mui/material";
1879
1879
  import { useState as useState11 } from "react";
1880
1880
  import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
1881
1881
  var ExpandMore = styled((props) => {
@@ -1918,7 +1918,7 @@ var CollapsedWidgetContainer = (props) => {
1918
1918
  {
1919
1919
  sx: { flexGrow: 1 },
1920
1920
  avatar: /* @__PURE__ */ jsx14(Avatar3, { sx: { bgcolor: "primary.main" }, children: props.icon }),
1921
- label: typeof props.title === "string" ? /* @__PURE__ */ jsx14(Typography7, { variant: "subtitle1", sx: { fontWeight: "700" }, children: /* @__PURE__ */ jsx14(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) }) : props.title,
1921
+ label: typeof props.title === "string" ? /* @__PURE__ */ jsx14(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) : props.title,
1922
1922
  subheader: typeof props.subtitle === "string" ? /* @__PURE__ */ jsx14(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.subtitle }) : props.subtitle
1923
1923
  }
1924
1924
  ),
@@ -1940,6 +1940,82 @@ var CollapsedWidgetContainer = (props) => {
1940
1940
  ] });
1941
1941
  };
1942
1942
 
1943
+ // src/UI/components/buttons/RefreshButtonComponent.tsx
1944
+ import { useState as useState12 } from "react";
1945
+ import {
1946
+ Button as Button3,
1947
+ Fab,
1948
+ styled as styled2
1949
+ } from "@mui/material";
1950
+ import RefreshIconMui from "@mui/icons-material/Refresh";
1951
+ import { Fragment as Fragment9, jsx as jsx15 } from "react/jsx-runtime";
1952
+ var AnimatedRefreshIcon = styled2(RefreshIconMui, {
1953
+ shouldForwardProp: (prop) => prop !== "isSpinning"
1954
+ })(({ isSpinning }) => ({
1955
+ animation: isSpinning ? "spin 1s linear infinite" : "none",
1956
+ "@keyframes spin": {
1957
+ "0%": {
1958
+ transform: "rotate(0deg)"
1959
+ },
1960
+ "100%": {
1961
+ transform: "rotate(360deg)"
1962
+ }
1963
+ }
1964
+ }));
1965
+ var RefreshButtonComponent = ({
1966
+ overrideNamespace,
1967
+ size = "small",
1968
+ onClick,
1969
+ disabled = false,
1970
+ fullWidth = false,
1971
+ loading: externalLoading,
1972
+ tooltip,
1973
+ mobileViewOnly,
1974
+ disableMobileView,
1975
+ hideTooltipOnMobile,
1976
+ hideTooltipOnDesktop
1977
+ }) => {
1978
+ const { displayState } = useAppTheme();
1979
+ const [internalLoading, setInternalLoading] = useState12(false);
1980
+ const isLoading = externalLoading !== void 0 ? externalLoading : internalLoading;
1981
+ const handleClick = async (event) => {
1982
+ if (!onClick || isLoading || disabled) return;
1983
+ try {
1984
+ setInternalLoading(true);
1985
+ await onClick(event);
1986
+ } finally {
1987
+ setInternalLoading(false);
1988
+ }
1989
+ };
1990
+ const renderIcon = () => /* @__PURE__ */ jsx15(AnimatedRefreshIcon, { fontSize: size, isSpinning: isLoading });
1991
+ if (displayState.isMobile && !disableMobileView || mobileViewOnly) {
1992
+ return /* @__PURE__ */ jsx15(TranslatableTooltipComponent, { title: hideTooltipOnMobile ? /* @__PURE__ */ jsx15(Fragment9, {}) : tooltip || /* @__PURE__ */ jsx15(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ jsx15("span", { children: /* @__PURE__ */ jsx15(
1993
+ Fab,
1994
+ {
1995
+ size,
1996
+ color: "inherit",
1997
+ onClick: handleClick,
1998
+ disabled: disabled || isLoading,
1999
+ "aria-label": "refresh",
2000
+ children: renderIcon()
2001
+ }
2002
+ ) }) });
2003
+ }
2004
+ return /* @__PURE__ */ jsx15(TranslatableTooltipComponent, { title: hideTooltipOnDesktop ? /* @__PURE__ */ jsx15(Fragment9, {}) : tooltip || /* @__PURE__ */ jsx15(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ jsx15(
2005
+ Button3,
2006
+ {
2007
+ variant: "contained",
2008
+ color: "inherit",
2009
+ size,
2010
+ onClick: handleClick,
2011
+ disabled: disabled || isLoading,
2012
+ fullWidth,
2013
+ startIcon: renderIcon(),
2014
+ children: /* @__PURE__ */ jsx15(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" })
2015
+ }
2016
+ ) });
2017
+ };
2018
+
1943
2019
  // src/UI/index.ts
1944
2020
  var UI = {
1945
2021
  Inputs: {
@@ -1953,7 +2029,8 @@ var UI = {
1953
2029
  Url: UrlComponent
1954
2030
  },
1955
2031
  Buttons: {
1956
- CopyClipboardButton: CopyClipboardButtonComponent
2032
+ CopyClipboardButton: CopyClipboardButtonComponent,
2033
+ RefreshButton: RefreshButtonComponent
1957
2034
  },
1958
2035
  DataDisplay: {
1959
2036
  TranslatableTooltip: TranslatableTooltipComponent,
@@ -1994,13 +2071,13 @@ var Services = {
1994
2071
  };
1995
2072
 
1996
2073
  // src/hooks/useUserStatus.ts
1997
- import { useEffect as useEffect6, useRef, useState as useState12 } from "react";
2074
+ import { useEffect as useEffect6, useRef, useState as useState13 } from "react";
1998
2075
  var ONLINE_THRESHOLD_MINUTES = 2;
1999
2076
  var AWAY_THRESHOLD_MINUTES = 15;
2000
2077
  var useUserStatus = (userId, initialLastSeenAt, currentAuthUserId) => {
2001
2078
  const supabase = useSupabase();
2002
- const [status, setStatus] = useState12("offline");
2003
- const [lastSeen, setLastSeen] = useState12(initialLastSeenAt ?? null);
2079
+ const [status, setStatus] = useState13("offline");
2080
+ const [lastSeen, setLastSeen] = useState13(initialLastSeenAt ?? null);
2004
2081
  const lastSeenRef = useRef(initialLastSeenAt ?? null);
2005
2082
  lastSeenRef.current = lastSeen;
2006
2083
  const calculateStatus = (isOnline, lastSeenIso) => {
@@ -2040,9 +2117,9 @@ var useUserStatus = (userId, initialLastSeenAt, currentAuthUserId) => {
2040
2117
  }
2041
2118
  };
2042
2119
  fetchLastSeen();
2043
- const channel = supabase.channel(`presence_user_${userId}`);
2044
- channel.on("presence", { event: "sync" }, () => {
2045
- const state = channel.presenceState();
2120
+ const channel2 = supabase.channel(`presence_user_${userId}`);
2121
+ channel2.on("presence", { event: "sync" }, () => {
2122
+ const state = channel2.presenceState();
2046
2123
  const isOnline = Object.keys(state).length > 0;
2047
2124
  if (isMounted) {
2048
2125
  setStatus(isOnline ? "online" : calculateStatus(false, lastSeenRef.current));
@@ -2072,7 +2149,7 @@ var useUserStatus = (userId, initialLastSeenAt, currentAuthUserId) => {
2072
2149
  ).subscribe();
2073
2150
  return () => {
2074
2151
  isMounted = false;
2075
- supabase.removeChannel(channel);
2152
+ supabase.removeChannel(channel2);
2076
2153
  };
2077
2154
  }, [userId, initialLastSeenAt, currentAuthUserId]);
2078
2155
  return {
@@ -2088,9 +2165,30 @@ var Hooks = {
2088
2165
  useUserStatus
2089
2166
  };
2090
2167
 
2168
+ // src/utils/session.events.ts
2169
+ var channel = typeof window !== "undefined" ? new BroadcastChannel("session_activity") : null;
2170
+ var notifySessionChange = () => {
2171
+ channel?.postMessage("SESSION_UPDATED");
2172
+ };
2173
+ var subscribeToSessionChanges = (callback) => {
2174
+ if (!channel) return () => {
2175
+ };
2176
+ const handleMessage = (event) => {
2177
+ if (event.data === "SESSION_UPDATED") {
2178
+ callback();
2179
+ }
2180
+ };
2181
+ channel.addEventListener("message", handleMessage);
2182
+ return () => channel.removeEventListener("message", handleMessage);
2183
+ };
2184
+
2091
2185
  // src/utils/index.ts
2092
2186
  var Utils = {
2093
- getDeviceId
2187
+ getDeviceId,
2188
+ Sessions: {
2189
+ notifySessionChange,
2190
+ subscribeToSessionChanges
2191
+ }
2094
2192
  };
2095
2193
  export {
2096
2194
  AIProvider,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serhii.olishevskyi/docs",
3
- "version": "1.2.16",
3
+ "version": "1.2.17",
4
4
  "description": "DOCS.UA react packages",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",