saltfish 0.3.80 → 0.3.82

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.
@@ -1264,6 +1264,13 @@ const saltfishStore = createStore()(
1264
1264
  state.user = user;
1265
1265
  });
1266
1266
  },
1267
+ mergeUserFields: (fields) => {
1268
+ set2((state) => {
1269
+ if (state.user) {
1270
+ Object.assign(state.user, fields);
1271
+ }
1272
+ });
1273
+ },
1267
1274
  setUserData: (userData) => {
1268
1275
  set2((state) => {
1269
1276
  state.userData = userData;
@@ -1784,7 +1791,7 @@ __publicField(ErrorHandler, "DEFAULT_OPTIONS", {
1784
1791
  shouldTriggerEvent: false,
1785
1792
  shouldDestroy: false
1786
1793
  });
1787
- const VERSION = "0.2.73";
1794
+ const VERSION = "0.3.81";
1788
1795
  class ShareLinkService {
1789
1796
  /**
1790
1797
  * Detects if the current URL contains a saltfish-share-id parameter
@@ -2129,6 +2136,9 @@ class PlayerInitializationService {
2129
2136
  this.currentUserData = userData;
2130
2137
  this.isAnonymousUser = false;
2131
2138
  this.lastUserDataFetchTimestamp = Date.now();
2139
+ if (data.firstIdentifiedAt) {
2140
+ store.mergeUserFields({ firstIdentifiedAt: data.firstIdentifiedAt });
2141
+ }
2132
2142
  store.setUserData({
2133
2143
  watchedPlaylists: data.watchedPlaylists || {},
2134
2144
  language: data.language
@@ -2471,6 +2481,9 @@ class PlayerInitializationService {
2471
2481
  const data = await response.json();
2472
2482
  if (data.success) {
2473
2483
  this.lastUserDataFetchTimestamp = Date.now();
2484
+ if (data.firstIdentifiedAt) {
2485
+ store.mergeUserFields({ firstIdentifiedAt: data.firstIdentifiedAt });
2486
+ }
2474
2487
  store.setUserData({
2475
2488
  watchedPlaylists: data.watchedPlaylists || {},
2476
2489
  language: data.language
@@ -9663,6 +9676,9 @@ class TransitionManager {
9663
9676
  if (this.isStateMachineValidating) {
9664
9677
  return;
9665
9678
  }
9679
+ if (this.triggerManager) {
9680
+ this.triggerManager.clearTriggeredForNonMatchingUrls();
9681
+ }
9666
9682
  const urlPathTransitions = Array.from(this.activeTransitions.entries()).filter(([_, transition]) => {
9667
9683
  var _a;
9668
9684
  return ((_a = transition.data) == null ? void 0 : _a.type) === "url-path";
@@ -9679,6 +9695,9 @@ class TransitionManager {
9679
9695
  if (!hasValidTransition) {
9680
9696
  const isValidUrl = this.validateCurrentStepUrl();
9681
9697
  if (!isValidUrl) {
9698
+ if (this.triggerManager) {
9699
+ this.triggerManager.evaluateAllTriggers();
9700
+ }
9682
9701
  return;
9683
9702
  }
9684
9703
  }
@@ -9994,8 +10013,12 @@ class TransitionManager {
9994
10013
  log(`TransitionManager: Expected pattern: '${urlRequirement.pattern}' (matchType: ${urlRequirement.matchType})`);
9995
10014
  this.cleanupTransitions();
9996
10015
  const saltfishPlayer = window._saltfishPlayer;
9997
- if (saltfishPlayer && typeof saltfishPlayer.destroy === "function") {
9998
- saltfishPlayer.destroy();
10016
+ if (saltfishPlayer && typeof saltfishPlayer.closePlaylist === "function") {
10017
+ saltfishPlayer.closePlaylist();
10018
+ } else {
10019
+ if (saltfishPlayer && typeof saltfishPlayer.destroy === "function") {
10020
+ saltfishPlayer.destroy();
10021
+ }
9999
10022
  }
10000
10023
  }
10001
10024
  /**
@@ -10925,6 +10948,32 @@ class TriggerManager {
10925
10948
  this.triggeredPlaylistsSet.delete(playlistId);
10926
10949
  }
10927
10950
  }
10951
+ /**
10952
+ * Clears triggered state for playlists whose URL condition no longer matches the current URL.
10953
+ * This allows re-triggering when the user navigates back to a matching URL via SPA navigation.
10954
+ * Only clears playlists that have a URL trigger condition — non-URL triggers keep their state.
10955
+ */
10956
+ clearTriggeredForNonMatchingUrls() {
10957
+ var _a;
10958
+ if (this.triggeredPlaylistsSet.size === 0) {
10959
+ return;
10960
+ }
10961
+ const triggeredIds = Array.from(this.triggeredPlaylistsSet);
10962
+ log(`TriggerManager: clearTriggeredForNonMatchingUrls - checking ${triggeredIds.length} triggered playlists: [${triggeredIds.map((id) => id.substring(0, 8)).join(", ")}]`);
10963
+ for (const playlistId of triggeredIds) {
10964
+ const playlist = this.triggeredPlaylists.find((p) => p.id === playlistId);
10965
+ if (!((_a = playlist == null ? void 0 : playlist.triggers) == null ? void 0 : _a.url)) {
10966
+ log(`TriggerManager: Playlist ${playlistId.substring(0, 8)} has no URL trigger, keeping triggered state`);
10967
+ continue;
10968
+ }
10969
+ const urlStillMatches = this.evaluateURLCondition(playlist.triggers);
10970
+ if (!urlStillMatches) {
10971
+ this.triggeredPlaylistsSet.delete(playlistId);
10972
+ } else {
10973
+ log(`TriggerManager: Playlist ${playlistId.substring(0, 8)} URL still matches, keeping triggered state`);
10974
+ }
10975
+ }
10976
+ }
10928
10977
  /**
10929
10978
  * Resets the triggered playlists tracking
10930
10979
  * Useful for testing or when user context changes
@@ -12778,6 +12827,16 @@ const _SaltfishPlayer = class _SaltfishPlayer {
12778
12827
  resetPlaylist() {
12779
12828
  this.playlistOrchestrator.resetPlaylist();
12780
12829
  }
12830
+ /**
12831
+ * Close the current playlist while preserving the trigger system.
12832
+ * Used when a playlist needs to be stopped (e.g. URL validation failure)
12833
+ * but triggers should keep monitoring for future URL changes.
12834
+ */
12835
+ closePlaylist() {
12836
+ this.managerOrchestrator.cleanupPlaylist();
12837
+ const store = useSaltfishStore.getState();
12838
+ store.resetForNewPlaylist();
12839
+ }
12781
12840
  /**
12782
12841
  * Destroy the player and clean up all resources
12783
12842
  */
@@ -12844,7 +12903,7 @@ const SaltfishPlayer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.de
12844
12903
  __proto__: null,
12845
12904
  SaltfishPlayer
12846
12905
  }, Symbol.toStringTag, { value: "Module" }));
12847
- const version = "0.3.80";
12906
+ const version = "0.3.82";
12848
12907
  const packageJson = {
12849
12908
  version
12850
12909
  };