@memori.ai/memori-react 2.6.4 → 2.6.6

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.
@@ -146,6 +146,9 @@ let speechSynthesizer: SpeechSynthesizer | null;
146
146
  let audioDestination: SpeakerAudioDestination;
147
147
  let audioContext: IAudioContext;
148
148
 
149
+ let memoriPassword: string | undefined;
150
+ let speakerMuted: boolean = false;
151
+
149
152
  export interface LayoutProps {
150
153
  Header?: typeof Header;
151
154
  headerProps?: HeaderProps;
@@ -323,6 +326,7 @@ const MemoriWidget = ({
323
326
  }
324
327
 
325
328
  setMuteSpeaker(getLocalConfig('muteSpeaker', false));
329
+ speakerMuted = getLocalConfig('muteSpeaker', false);
326
330
  setContinuousSpeech(microphoneMode === 'CONTINUOUS');
327
331
  setContinuousSpeechTimeout(getLocalConfig('continuousSpeechTimeout', 2));
328
332
  setControlsPosition(
@@ -646,7 +650,6 @@ const MemoriWidget = ({
646
650
  setAuthModalState('password');
647
651
  return;
648
652
  }
649
-
650
653
  let storageBirthDate = getLocalConfig<string | undefined>(
651
654
  'birthDate',
652
655
  undefined
@@ -712,15 +715,31 @@ const MemoriWidget = ({
712
715
  ) => {
713
716
  setLoading(true);
714
717
  try {
718
+ if (
719
+ memori.privacyType !== 'PUBLIC' &&
720
+ !password &&
721
+ !memori.secretToken &&
722
+ !memoriPwd &&
723
+ !recoveryTokens &&
724
+ !memoriTokens
725
+ ) {
726
+ setAuthModalState('password');
727
+ return;
728
+ }
729
+
715
730
  let storageBirthDate = getLocalConfig<string | undefined>(
716
731
  'birthDate',
717
732
  undefined
718
733
  );
734
+ if (!(birthDate || storageBirthDate) && !!minAge) {
735
+ setShowAgeVerification(true);
736
+ return;
737
+ }
719
738
 
720
739
  const { sessionID, currentState, ...response } = await initSession({
721
740
  memoriID: memori.engineMemoriID ?? '',
722
- password,
723
- recoveryTokens,
741
+ password: password || memoriPwd || memori.secretToken,
742
+ recoveryTokens: recoveryTokens || memoriTokens,
724
743
  tag,
725
744
  pin,
726
745
  initialContextVars,
@@ -826,7 +845,7 @@ const MemoriWidget = ({
826
845
 
827
846
  fetchSession({
828
847
  memoriID: memori.engineMemoriID ?? '',
829
- password: secret || memori.secretToken,
848
+ password: secret || memoriPwd || memori.secretToken,
830
849
  tag: memori.giverTag,
831
850
  pin: memori.giverPIN,
832
851
  initialContextVars,
@@ -1221,7 +1240,8 @@ const MemoriWidget = ({
1221
1240
  // stopAudio();
1222
1241
 
1223
1242
  if (preview) return;
1224
- if (muteSpeaker) {
1243
+
1244
+ if (muteSpeaker || speakerMuted) {
1225
1245
  // trigger start continuous listening if set, see MemoriChat
1226
1246
  if (continuousSpeech) {
1227
1247
  setListeningTimeout();
@@ -1845,241 +1865,254 @@ const MemoriWidget = ({
1845
1865
  sendMessage(text, undefined, undefined, false, translatedText);
1846
1866
  };
1847
1867
 
1848
- const onClickStart = async (session?: {
1849
- dialogState: DialogState;
1850
- sessionID: string;
1851
- }) => {
1852
- const sessionID = session?.sessionID || sessionId;
1853
- const dialogState = session?.dialogState || currentDialogState;
1854
- setClickedStart(true);
1855
-
1856
- let memoriAudioElement = document.getElementById(
1857
- 'memori-audio'
1858
- ) as HTMLAudioElement;
1859
- let isSafari =
1860
- window.navigator.userAgent.includes('Safari') &&
1861
- !window.navigator.userAgent.includes('Chrome');
1862
- if (memoriAudioElement && isSafari) {
1863
- memoriAudioElement.muted = false;
1864
- memoriAudioElement.play().catch((e: any) => {
1865
- console.error('error playing intro audio', e);
1866
- });
1867
- }
1868
+ const onClickStart = useCallback(
1869
+ async (session?: { dialogState: DialogState; sessionID: string }) => {
1870
+ const sessionID = session?.sessionID || sessionId;
1871
+ const dialogState = session?.dialogState || currentDialogState;
1872
+ setClickedStart(true);
1873
+
1874
+ let memoriAudioElement = document.getElementById(
1875
+ 'memori-audio'
1876
+ ) as HTMLAudioElement;
1877
+ let isSafari =
1878
+ window.navigator.userAgent.includes('Safari') &&
1879
+ !window.navigator.userAgent.includes('Chrome');
1880
+ if (memoriAudioElement && isSafari) {
1881
+ memoriAudioElement.muted = false;
1882
+ memoriAudioElement.play().catch((e: any) => {
1883
+ console.error('error playing intro audio', e);
1884
+ });
1885
+ }
1868
1886
 
1869
- let storageBirthDate = getLocalConfig<string | undefined>(
1870
- 'birthDate',
1871
- undefined
1872
- );
1873
- let birth = birthDate || storageBirthDate || undefined;
1887
+ let storageBirthDate = getLocalConfig<string | undefined>(
1888
+ 'birthDate',
1889
+ undefined
1890
+ );
1891
+ let birth = birthDate || storageBirthDate || undefined;
1874
1892
 
1875
- if (
1876
- (!sessionID &&
1877
- memori.privacyType !== 'PUBLIC' &&
1878
- !memori.secretToken &&
1879
- !memoriPwd &&
1880
- !memoriTokens) ||
1881
- (!sessionID && gotErrorInOpening)
1882
- ) {
1883
- setAuthModalState('password');
1884
- setClickedStart(false);
1885
- return;
1886
- } else if (!sessionID && !!minAge && !birth) {
1887
- setShowAgeVerification(true);
1888
- setClickedStart(false);
1889
- } else if (!sessionID) {
1890
- setClickedStart(false);
1891
- setGotErrorInOpening(false);
1892
- const session = await fetchSession({
1893
- memoriID: memori.engineMemoriID!,
1894
- password: secret || memori.secretToken,
1895
- tag: personification?.tag,
1896
- pin: personification?.pin,
1897
- initialContextVars,
1898
- initialQuestion,
1899
- birthDate: birth,
1900
- });
1893
+ if (
1894
+ (!sessionID &&
1895
+ memori.privacyType !== 'PUBLIC' &&
1896
+ !memori.secretToken &&
1897
+ !memoriPwd &&
1898
+ !memoriTokens) ||
1899
+ (!sessionID && gotErrorInOpening)
1900
+ ) {
1901
+ setAuthModalState('password');
1902
+ setClickedStart(false);
1903
+ return;
1904
+ } else if (!sessionID && !!minAge && !birth) {
1905
+ setShowAgeVerification(true);
1906
+ setClickedStart(false);
1907
+ } else if (!sessionID) {
1908
+ setClickedStart(false);
1909
+ setGotErrorInOpening(false);
1910
+ const session = await fetchSession({
1911
+ memoriID: memori.engineMemoriID!,
1912
+ password: secret || memoriPwd || memori.secretToken,
1913
+ tag: personification?.tag,
1914
+ pin: personification?.pin,
1915
+ initialContextVars,
1916
+ initialQuestion,
1917
+ birthDate: birth,
1918
+ });
1901
1919
 
1902
- if (session?.dialogState) {
1903
- // reset history
1904
- setHistory([]);
1920
+ if (session?.dialogState) {
1921
+ // reset history
1922
+ setHistory([]);
1905
1923
 
1906
- translateDialogState(session.dialogState, userLang)
1907
- .then(ts => {
1908
- if (ts.emission) {
1909
- speak(ts.emission);
1910
- }
1911
- })
1912
- .finally(() => {
1913
- setHasUserActivatedSpeak(true);
1914
- });
1915
- } else {
1916
- await onClickStart(session || undefined);
1917
- }
1924
+ translateDialogState(session.dialogState, userLang)
1925
+ .then(ts => {
1926
+ if (ts.emission) {
1927
+ speak(ts.emission);
1928
+ }
1929
+ })
1930
+ .finally(() => {
1931
+ setHasUserActivatedSpeak(true);
1932
+ });
1933
+ } else {
1934
+ await onClickStart(session || undefined);
1935
+ }
1918
1936
 
1919
- return;
1920
- } else if (initialSessionID) {
1921
- // check if session is valid and not expired
1922
- const { currentState, ...response } = await getSession(sessionID);
1923
- if (response.resultCode !== 0 || !currentState) {
1924
- console.debug('session expired, opening new session');
1925
- setGotErrorInOpening(true);
1926
- setSessionId(undefined);
1927
- setClickedStart(false);
1928
- await onClickStart();
1929
1937
  return;
1930
- }
1938
+ } else if (initialSessionID) {
1939
+ // check if session is valid and not expired
1940
+ const { currentState, ...response } = await getSession(sessionID);
1941
+ if (response.resultCode !== 0 || !currentState) {
1942
+ console.debug('session expired, opening new session');
1943
+ setGotErrorInOpening(true);
1944
+ setSessionId(undefined);
1945
+ setClickedStart(false);
1946
+ await onClickStart();
1947
+ return;
1948
+ }
1931
1949
 
1932
- // reset history
1933
- setHistory([]);
1950
+ // reset history
1951
+ setHistory([]);
1934
1952
 
1935
- // checks engine state for current tag
1936
- // opening session would have already correct tag
1937
- // otherwise change tag to anonymous for test, giver for instruct, receiver if set
1953
+ // checks engine state for current tag
1954
+ // opening session would have already correct tag
1955
+ // otherwise change tag to anonymous for test, giver for instruct, receiver if set
1938
1956
 
1939
- // test if current tag is giver on instruct
1940
- if (
1941
- instruct &&
1942
- memori.giverTag &&
1943
- currentDialogState?.currentTag !== memori.giverTag
1944
- ) {
1945
- try {
1946
- console.debug('change tag #0');
1947
- // reset tag
1948
- await changeTag(memori.engineMemoriID!, sessionID, '-');
1949
- // change tag to giver
1950
- const session = await changeTag(
1951
- memori.engineMemoriID!,
1952
- sessionID,
1953
- memori.giverTag,
1954
- memori.giverPIN
1955
- );
1957
+ // test if current tag is giver on instruct
1958
+ if (
1959
+ instruct &&
1960
+ memori.giverTag &&
1961
+ currentDialogState?.currentTag !== memori.giverTag
1962
+ ) {
1963
+ try {
1964
+ console.debug('change tag #0');
1965
+ // reset tag
1966
+ await changeTag(memori.engineMemoriID!, sessionID, '-');
1967
+ // change tag to giver
1968
+ const session = await changeTag(
1969
+ memori.engineMemoriID!,
1970
+ sessionID,
1971
+ memori.giverTag,
1972
+ memori.giverPIN
1973
+ );
1956
1974
 
1957
- if (session && session.resultCode === 0) {
1958
- translateDialogState(session.currentState, userLang)
1959
- .then(ts => {
1960
- if (ts.emission) {
1961
- speak(ts.emission);
1962
- }
1963
- })
1964
- .finally(() => {
1965
- setHasUserActivatedSpeak(true);
1966
- });
1967
- } else {
1968
- console.error('session #1', session);
1969
- throw new Error('No session');
1975
+ if (session && session.resultCode === 0) {
1976
+ translateDialogState(session.currentState, userLang)
1977
+ .then(ts => {
1978
+ if (ts.emission) {
1979
+ speak(ts.emission);
1980
+ }
1981
+ })
1982
+ .finally(() => {
1983
+ setHasUserActivatedSpeak(true);
1984
+ });
1985
+ } else {
1986
+ console.error('session #1', session);
1987
+ throw new Error('No session');
1988
+ }
1989
+ } catch (e) {
1990
+ console.error('session #2', e);
1991
+ reopenSession(
1992
+ true,
1993
+ memori?.secretToken,
1994
+ undefined,
1995
+ memori?.giverTag,
1996
+ memori?.giverPIN,
1997
+ initialContextVars,
1998
+ initialQuestion,
1999
+ birth
2000
+ ).then(() => {
2001
+ setHasUserActivatedSpeak(true);
2002
+ });
1970
2003
  }
1971
- } catch (e) {
1972
- console.error('session #2', e);
1973
- reopenSession(
1974
- true,
1975
- memori?.secretToken,
1976
- undefined,
1977
- memori?.giverTag,
1978
- memori?.giverPIN,
1979
- initialContextVars,
1980
- initialQuestion,
1981
- birth
1982
- ).then(() => {
1983
- setHasUserActivatedSpeak(true);
1984
- });
1985
- }
1986
- } else if (
1987
- // test if current tag is receiver on test as it is requested
1988
- !instruct &&
1989
- personification &&
1990
- currentDialogState?.currentTag !== personification.tag
1991
- ) {
1992
- try {
1993
- console.debug('change tag #3');
1994
- // reset tag
1995
- await changeTag(memori.engineMemoriID!, sessionID, '-');
1996
- // change tag to receiver
1997
- const session = await changeTag(
1998
- memori.engineMemoriID!,
1999
- sessionID,
2000
- personification.tag,
2001
- personification.pin
2002
- );
2004
+ } else if (
2005
+ // test if current tag is receiver on test as it is requested
2006
+ !instruct &&
2007
+ personification &&
2008
+ currentDialogState?.currentTag !== personification.tag
2009
+ ) {
2010
+ try {
2011
+ console.debug('change tag #3');
2012
+ // reset tag
2013
+ await changeTag(memori.engineMemoriID!, sessionID, '-');
2014
+ // change tag to receiver
2015
+ const session = await changeTag(
2016
+ memori.engineMemoriID!,
2017
+ sessionID,
2018
+ personification.tag,
2019
+ personification.pin
2020
+ );
2003
2021
 
2004
- if (session && session.resultCode === 0) {
2005
- translateDialogState(session.currentState, userLang)
2006
- .then(ts => {
2007
- if (ts.emission) {
2008
- speak(ts.emission);
2009
- }
2010
- })
2011
- .finally(() => {
2012
- setHasUserActivatedSpeak(true);
2013
- });
2014
- } else {
2015
- console.error('session #4', session);
2016
- throw new Error('No session');
2022
+ if (session && session.resultCode === 0) {
2023
+ translateDialogState(session.currentState, userLang)
2024
+ .then(ts => {
2025
+ if (ts.emission) {
2026
+ speak(ts.emission);
2027
+ }
2028
+ })
2029
+ .finally(() => {
2030
+ setHasUserActivatedSpeak(true);
2031
+ });
2032
+ } else {
2033
+ console.error('session #4', session);
2034
+ throw new Error('No session');
2035
+ }
2036
+ } catch (e) {
2037
+ console.error('session #5', e);
2038
+ reopenSession(
2039
+ true,
2040
+ memori?.secretToken,
2041
+ undefined,
2042
+ personification.tag,
2043
+ personification.pin,
2044
+ initialContextVars,
2045
+ initialQuestion,
2046
+ birth
2047
+ ).then(() => {
2048
+ setHasUserActivatedSpeak(true);
2049
+ });
2017
2050
  }
2018
- } catch (e) {
2019
- console.error('session #5', e);
2020
- reopenSession(
2021
- true,
2022
- memori?.secretToken,
2023
- undefined,
2024
- personification.tag,
2025
- personification.pin,
2026
- initialContextVars,
2027
- initialQuestion,
2028
- birth
2029
- ).then(() => {
2030
- setHasUserActivatedSpeak(true);
2031
- });
2032
- }
2033
- } else if (
2034
- // test if current tag is anonymous on test without personification
2035
- // this is the default case with anonymous tag
2036
- !instruct &&
2037
- !personification &&
2038
- currentDialogState?.currentTag !== anonTag
2039
- ) {
2040
- try {
2041
- console.debug('change tag #6');
2042
- // reset tag
2043
- await changeTag(memori.engineMemoriID!, sessionID, '-');
2044
- // change tag to anonymous
2045
- const session = await changeTag(
2046
- memori.engineMemoriID!,
2047
- sessionID,
2048
- anonTag
2049
- );
2051
+ } else if (
2052
+ // test if current tag is anonymous on test without personification
2053
+ // this is the default case with anonymous tag
2054
+ !instruct &&
2055
+ !personification &&
2056
+ currentDialogState?.currentTag !== anonTag
2057
+ ) {
2058
+ try {
2059
+ console.debug('change tag #6');
2060
+ // reset tag
2061
+ await changeTag(memori.engineMemoriID!, sessionID, '-');
2062
+ // change tag to anonymous
2063
+ const session = await changeTag(
2064
+ memori.engineMemoriID!,
2065
+ sessionID,
2066
+ anonTag
2067
+ );
2050
2068
 
2051
- if (session && session.resultCode === 0) {
2052
- translateDialogState(session.currentState, userLang)
2053
- .then(ts => {
2054
- if (ts.emission) {
2055
- speak(ts.emission);
2056
- }
2057
- })
2058
- .finally(() => {
2059
- setHasUserActivatedSpeak(true);
2060
- });
2061
- } else {
2062
- console.error('session #7', session);
2063
- throw new Error('No session');
2069
+ if (session && session.resultCode === 0) {
2070
+ translateDialogState(session.currentState, userLang)
2071
+ .then(ts => {
2072
+ if (ts.emission) {
2073
+ speak(ts.emission);
2074
+ }
2075
+ })
2076
+ .finally(() => {
2077
+ setHasUserActivatedSpeak(true);
2078
+ });
2079
+ } else {
2080
+ console.error('session #7', session);
2081
+ throw new Error('No session');
2082
+ }
2083
+ } catch (e) {
2084
+ console.error('session #8', e);
2085
+ reopenSession(
2086
+ true,
2087
+ memori?.secretToken,
2088
+ undefined,
2089
+ undefined,
2090
+ undefined,
2091
+ initialContextVars,
2092
+ initialQuestion,
2093
+ birth
2094
+ ).then(() => {
2095
+ setHasUserActivatedSpeak(true);
2096
+ });
2064
2097
  }
2065
- } catch (e) {
2066
- console.error('session #8', e);
2067
- reopenSession(
2068
- true,
2069
- memori?.secretToken,
2070
- undefined,
2071
- undefined,
2072
- undefined,
2073
- initialContextVars,
2074
- initialQuestion,
2075
- birth
2076
- ).then(() => {
2077
- setHasUserActivatedSpeak(true);
2078
- });
2098
+ } else {
2099
+ // no need to change tag
2100
+ translateDialogState(currentState, userLang)
2101
+ .then(ts => {
2102
+ if (ts.emission) {
2103
+ speak(ts.emission);
2104
+ }
2105
+ })
2106
+ .finally(() => {
2107
+ setHasUserActivatedSpeak(true);
2108
+ });
2079
2109
  }
2080
2110
  } else {
2081
- // no need to change tag
2082
- translateDialogState(currentState, userLang)
2111
+ // reset history
2112
+ setHistory([]);
2113
+
2114
+ // everything is fine, just translate dialog state and activate chat
2115
+ translateDialogState(dialogState!, userLang)
2083
2116
  .then(ts => {
2084
2117
  if (ts.emission) {
2085
2118
  speak(ts.emission);
@@ -2089,22 +2122,9 @@ const MemoriWidget = ({
2089
2122
  setHasUserActivatedSpeak(true);
2090
2123
  });
2091
2124
  }
2092
- } else {
2093
- // reset history
2094
- setHistory([]);
2095
-
2096
- // everything is fine, just translate dialog state and activate chat
2097
- translateDialogState(dialogState!, userLang)
2098
- .then(ts => {
2099
- if (ts.emission) {
2100
- speak(ts.emission);
2101
- }
2102
- })
2103
- .finally(() => {
2104
- setHasUserActivatedSpeak(true);
2105
- });
2106
- }
2107
- };
2125
+ },
2126
+ [memoriPwd, memori, memoriTokens, birthDate, sessionId]
2127
+ );
2108
2128
 
2109
2129
  const [loginToken, setLoginToken] = useState<string | undefined>(authToken);
2110
2130
  useEffect(() => {
@@ -2154,8 +2174,9 @@ const MemoriWidget = ({
2154
2174
  setShowPositionDrawer,
2155
2175
  setShowSettingsDrawer,
2156
2176
  showSpeaker: !!AZURE_COGNITIVE_SERVICES_TTS_KEY,
2157
- speakerMuted: muteSpeaker,
2177
+ speakerMuted: muteSpeaker || speakerMuted,
2158
2178
  setSpeakerMuted: mute => {
2179
+ speakerMuted = !!mute;
2159
2180
  setMuteSpeaker(mute);
2160
2181
  setLocalConfig('muteSpeaker', !!mute);
2161
2182
  if (mute) {
@@ -2362,6 +2383,7 @@ const MemoriWidget = ({
2362
2383
  showTokens={memori.privacyType === 'SECRET'}
2363
2384
  onFinish={async (values: any) => {
2364
2385
  if (values['password']) setMemoriPwd(values['password']);
2386
+ if (values['password']) memoriPassword = values['password'];
2365
2387
  if (values['tokens']) setMemoriTokens(values['tokens']);
2366
2388
 
2367
2389
  reopenSession(
@@ -2401,8 +2423,8 @@ const MemoriWidget = ({
2401
2423
 
2402
2424
  reopenSession(
2403
2425
  !sessionId,
2404
- memori?.secretToken,
2405
- undefined,
2426
+ memoriPassword || memoriPwd || memori?.secretToken,
2427
+ memoriTokens,
2406
2428
  instruct ? memori.giverTag : undefined,
2407
2429
  instruct ? memori.giverPIN : undefined,
2408
2430
  initialContextVars,
@@ -2411,6 +2433,7 @@ const MemoriWidget = ({
2411
2433
  )
2412
2434
  .then(state => {
2413
2435
  setShowAgeVerification(false);
2436
+ setAuthModalState(null);
2414
2437
  onClickStart(state || undefined);
2415
2438
  })
2416
2439
  .catch(() => {