diff --git a/go.sum b/go.sum index 0e439f01c3..9d2cc78c67 100644 --- a/go.sum +++ b/go.sum @@ -1985,6 +1985,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= diff --git a/package.json b/package.json index 55eb2c56f1..42fc15167f 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "dotenv-webpack": "^8.0.0", "draft-convert": "^2.1.13", "draft-js": "^0.11.7", + "electron-store": "^8.1.0", "eslint-config-universe": "^11.0.0", "ethers": "^5.7.2", "expo": "^47.0.0", @@ -81,6 +82,7 @@ "expo-updates": "~0.15.6", "grpc-web": "^1.4.2", "html-to-draftjs": "^1.5.0", + "is-electron": "^2.2.2", "lodash": "^4.17.21", "long": "^5.2.1", "lottie-ios": "3.4.0", @@ -126,6 +128,7 @@ "react-native-webview": "11.23.1", "react-redux": "^8.0.2", "redux-persist": "^6.0.0", + "redux-persist-electron-storage": "^2.1.0", "text-encoding-polyfill": "^0.6.7", "uuid": "^9.0.0", "victory-native": "^36.6.8", diff --git a/packages/components/requests/Request.tsx b/packages/components/requests/Request.tsx index ebde538e4a..4637de631b 100644 --- a/packages/components/requests/Request.tsx +++ b/packages/components/requests/Request.tsx @@ -26,6 +26,7 @@ import { weshClient } from "../../weshnet/client"; import { acceptFriendRequest, activateGroup, + sendMessage, } from "../../weshnet/client/services"; import { bytesFromString, @@ -60,7 +61,13 @@ const RequestList = ({ isOnline, data }: Props) => { try { const contactPk = bytesFromString(data?.contactId); await acceptFriendRequest(contactPk); - await activateGroup({ contactPk }); + const groupInfo = await activateGroup({ contactPk }); + await sendMessage({ + groupPk: groupInfo?.group?.publicKey, + message: { + type: "accept-contact", + }, + }); } catch (err) { console.log("add friend err", err); setToastError({ @@ -91,7 +98,7 @@ const RequestList = ({ isOnline, data }: Props) => { - + { - {metadata?.public_name || "Anon"} + {data?.name || "Anon"} diff --git a/packages/screens/Message/MessageScreen.tsx b/packages/screens/Message/MessageScreen.tsx index 922110a075..f33af93364 100644 --- a/packages/screens/Message/MessageScreen.tsx +++ b/packages/screens/Message/MessageScreen.tsx @@ -38,10 +38,6 @@ export const MessageScreen: ScreenFC<"Message"> = () => { weshServices.createConfig(); }, []); - useEffect(() => { - weshServices.createSharableLink(userInfo?.metadata?.tokenId); - }, [userInfo?.metadata?.tokenId]); - const HEADER_CONFIG = [ { id: 1, diff --git a/packages/screens/Message/components/ChatHeader.tsx b/packages/screens/Message/components/ChatHeader.tsx index b96b8f03a2..36491696d6 100644 --- a/packages/screens/Message/components/ChatHeader.tsx +++ b/packages/screens/Message/components/ChatHeader.tsx @@ -38,7 +38,12 @@ import { fontMedium10, fontMedium14, } from "../../../utils/style/fonts"; -export const ChatHeader = ({ searchInput, setSearchInput, name }: any) => { +export const ChatHeader = ({ + searchInput, + setSearchInput, + name, + conversation, +}: any) => { const [showTextInput, setShowTextInput] = useState(false); const [showCalendar, setShowCalendar] = useState(false); const [audioCall, setAudioCall] = useState(false); @@ -77,7 +82,7 @@ export const ChatHeader = ({ searchInput, setSearchInput, name }: any) => { - {name} + {conversation?.members?.[0]?.name || "Anon"} diff --git a/packages/screens/Message/components/ChatItem.tsx b/packages/screens/Message/components/ChatItem.tsx index 78c8f39388..a1efc9bf9e 100644 --- a/packages/screens/Message/components/ChatItem.tsx +++ b/packages/screens/Message/components/ChatItem.tsx @@ -32,12 +32,8 @@ interface ChatItemProps { export const ChatItem = ({ data, onPress, isActive }: ChatItemProps) => { const navigation = useAppNavigation(); - const lastMessage = useSelector(selectLastMessageByGroupPk(data.id)); - - const { metadata } = useNSUserInfo( - data.members?.[0]?.tokenId || "sakul.tori" - ); + const contactInfo = data.members?.[0]; return ( { - + - {data.name || metadata.public_name || "Anon"} + {contactInfo?.name || "Anon"} diff --git a/packages/screens/Message/components/ChatSection.tsx b/packages/screens/Message/components/ChatSection.tsx index 807760a6ad..d06c3b162f 100644 --- a/packages/screens/Message/components/ChatSection.tsx +++ b/packages/screens/Message/components/ChatSection.tsx @@ -178,7 +178,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { messages={messages} searchInput={searchInput} setSearchInput={setSearchInput} - name={conversation.name || "Anon"} + conversation={conversation} /> @@ -231,6 +231,20 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { )} + {!messages.length && ( + + + You created contact; Your contact request hasn't been accepted by{" "} + {conversation?.members?.[0]?.name || "Anon"}{" "} + + + )} + + + Contact accepted + + + ); + } + return ( - {message.payload.message} + {message?.payload?.message} - {!!message.payload.files.length && ( + {!!message.payload?.files?.length && ( diff --git a/packages/screens/Message/components/CreateConversation.tsx b/packages/screens/Message/components/CreateConversation.tsx index 53c0064253..887dd10443 100644 --- a/packages/screens/Message/components/CreateConversation.tsx +++ b/packages/screens/Message/components/CreateConversation.tsx @@ -1,31 +1,41 @@ import React, { useState } from "react"; +import { useForm, FormProvider } from "react-hook-form"; import { View } from "react-native"; import QRCode from "react-native-qrcode-svg"; +import { useDispatch, useSelector } from "react-redux"; import logoHexagonPNG from "../../../../assets/logos/logo-hexagon.png"; import { BrandText } from "../../../components/BrandText"; import { CopyToClipboard } from "../../../components/CopyToClipboard"; import { ErrorText } from "../../../components/ErrorText"; +import { Separator } from "../../../components/Separator"; import { PrimaryButton } from "../../../components/buttons/PrimaryButton"; import { TextInputCustom } from "../../../components/inputs/TextInputCustom"; import ModalBase from "../../../components/modals/ModalBase"; import { SpacerColumn, SpacerRow } from "../../../components/spacer"; import { useNSUserInfo } from "../../../hooks/useNSUserInfo"; import useSelectedWallet from "../../../hooks/useSelectedWallet"; +import { + MessageState, + selectContactInfo, + setContactInfo, +} from "../../../store/slices/message"; import { neutral00, secondaryColor } from "../../../utils/style/colors"; import { fontSemibold16 } from "../../../utils/style/fonts"; import { layout } from "../../../utils/style/layout"; import { weshClient, weshConfig, weshServices } from "../../../weshnet/client"; - +import { createSharableLink } from "../../../weshnet/client/services"; interface CreateConversationProps { onClose: () => void; } export const CreateConversation = ({ onClose }: CreateConversationProps) => { + const contactInfo = useSelector(selectContactInfo); const [contactLink, setContactLink] = useState(""); const [addContactLoading, setAddContactLoading] = useState(false); const [error, setError] = useState(""); + const dispatch = useDispatch(); const selectedWallet = useSelectedWallet(); const userInfo = useNSUserInfo(selectedWallet?.userId); @@ -34,7 +44,7 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { setError(""); try { - await weshServices.addContact(contactLink, userInfo?.metadata?.tokenId); + await weshServices.addContact(contactLink, contactInfo); onClose(); } catch (err) { setError(err?.message); @@ -43,6 +53,22 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { setAddContactLoading(false); }; + const handleContactInfoChange = ( + key: keyof MessageState["contactInfo"], + value: string + ) => { + const shareLink = createSharableLink({ + ...contactInfo, + [key]: value, + }); + dispatch( + setContactInfo({ + [key]: value, + shareLink, + }) + ); + }; + return ( { width={580} > + + + Name + + + handleContactInfoChange("name", text)} + value={contactInfo.name} + containerStyle={{ + flex: 1, + }} + placeholderTextColor={secondaryColor} + squaresBackgroundColor={neutral00} + /> + + + Avatar + + + handleContactInfoChange("avatar", text)} + value={contactInfo.avatar} + containerStyle={{ + flex: 1, + }} + placeholderTextColor={secondaryColor} + squaresBackgroundColor={neutral00} + /> + - {!!weshConfig.shareLink && ( + + {!!contactInfo.shareLink && ( @@ -77,10 +143,12 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { containerStyle={{ width: "100%", }} - text={weshConfig?.shareLink} + text={contactInfo.shareLink} /> - + + + + state.message.contactInfo; + export const selectMessageList = (groupPk: string) => (state: RootState) => state.message.messageList[groupPk] || []; @@ -126,6 +141,13 @@ const messageSlice = createSlice({ ) => { state.lastIds[action.payload.key] = action.payload.value; }, + + setContactInfo: ( + state, + action: PayloadAction> + ) => { + state.contactInfo = { ...state.contactInfo, ...action.payload }; + }, }, }); @@ -135,6 +157,7 @@ export const { setConversationList, updateMessageReaction, setLastId, + setContactInfo, } = messageSlice.actions; export const messageReducer = messageSlice.reducer; diff --git a/packages/store/store.ts b/packages/store/store.ts index c0f9a224f7..36eacddfdb 100644 --- a/packages/store/store.ts +++ b/packages/store/store.ts @@ -1,5 +1,6 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import { combineReducers, configureStore } from "@reduxjs/toolkit"; +import isElectron from "is-electron"; import { useDispatch } from "react-redux"; import { persistStore, persistReducer } from "redux-persist"; @@ -21,7 +22,9 @@ import { walletsReducer } from "./slices/wallets"; const persistConfig = { key: "root", - storage: AsyncStorage, + storage: isElectron() + ? require("redux-persist-electron-storage")() + : AsyncStorage, whitelist: [ "wallets", "settings", @@ -31,6 +34,7 @@ const persistConfig = { "marketplaceCartItemsUI", "marketplaceFilters", "marketplaceFilterUI", + "messages", ], blacklist: ["dAppsStore, marketplaceFilterUI"], }; diff --git a/packages/utils/types/message.ts b/packages/utils/types/message.ts index 039bfdf0bb..f8327d67b8 100644 --- a/packages/utils/types/message.ts +++ b/packages/utils/types/message.ts @@ -8,7 +8,8 @@ export type MessageType = | "group-join" | "group-leave" | "group-create" - | "reaction"; + | "reaction" + | "contact-request"; export type ConversationType = "contact" | "group"; interface MessageFile { @@ -34,14 +35,16 @@ export interface Message { senderId: string; groupId: string; type: MessageType; - payload: MessagePayload; + payload?: MessagePayload; timestamp: string; parentId?: string; } interface Contact { id: string; - tokenId: string; + tokenId?: string; + name: string; + avatar: string; rdvSeed: string; hasLeft?: boolean; } diff --git a/packages/weshnet/client/messageCreators.ts b/packages/weshnet/client/messageCreators.ts new file mode 100644 index 0000000000..afd7ae797f --- /dev/null +++ b/packages/weshnet/client/messageCreators.ts @@ -0,0 +1,48 @@ +import { Message } from "../../utils/types/message"; + +export const contactSent = (): Message => { + return {}; +}; + +export const contactAccepted = (): Message => { + return { + type: "accept-contact", + }; +}; + +export const contactRejected: Message = () => { + return {}; +}; + +export const groupCreated: Message = () => { + return {}; +}; + +export const groupJoinByMember: Message = () => { + return {}; +}; + +export const groupLeaveByMember: Message = () => { + return {}; +}; + +export const getLineTextByMessageType = ({ message }: { message: Message }) => { + switch (message.type) { + case "contact-request": + return `Anon has sent a contact`; + } +}; + +await sendMessage({ + groupPk: group.groupPk, + message: { + type: "group-create", + payload: { + message: "", + files: [], + metadata: { + groupName, + }, + }, + }, +}); diff --git a/packages/weshnet/client/processData.ts b/packages/weshnet/client/processData.ts index f871018052..2fde13c4d6 100644 --- a/packages/weshnet/client/processData.ts +++ b/packages/weshnet/client/processData.ts @@ -71,7 +71,8 @@ export const handleMetadata = async (data: GroupMetadataEvent) => { { id: parsedData.payload.contact.pk, rdvSeed: parsedData.payload.contact.publicRendezvousSeed, - tokenId: parsedData.payload.ownMetadata.contactTokenId, + name: parsedData.payload.ownMetadata.contact.name, + avatar: parsedData.payload.ownMetadata.contact.avatar, }, ], }) @@ -110,9 +111,11 @@ export const handleMetadata = async (data: GroupMetadataEvent) => { store.dispatch( setContactRequestList({ id: parsedData.eventContext.id, - tokenId: parsedData.payload.contactMetadata.tokenId, + // tokenId: parsedData.payload.contactMetadata.tokenId, contactId: stringFromBytes(parsedData.payload.contactPk), rdvSeed: stringFromBytes(parsedData.payload.contactRendezvousSeed), + name: parsedData.payload.contactMetadata.name, + avatar: parsedData.payload.contactMetadata.avatar, }) ); @@ -158,8 +161,9 @@ export const handleMetadata = async (data: GroupMetadataEvent) => { members: [ { id: contactRequest.contactId, - tokenId: contactRequest.tokenId, rdvSeed: contactRequest.rdvSeed, + name: contactRequest.name, + avatar: contactRequest.avatar, }, ], name: "", diff --git a/packages/weshnet/client/services.ts b/packages/weshnet/client/services.ts index 8794cc94d0..995798194a 100644 --- a/packages/weshnet/client/services.ts +++ b/packages/weshnet/client/services.ts @@ -2,6 +2,8 @@ import { weshClient } from "./client"; import { weshConfig } from "./config"; import { subscribeMetadata } from "./subscribers"; import { bytesFromString, encodeJSON, stringFromBytes } from "./utils"; +import { MessageState, setContactInfo } from "../../store/slices/message"; +import { store } from "../../store/store"; import { Message } from "../../utils/types/message"; import { GroupInfo_Request } from "../protocoltypes"; @@ -18,6 +20,18 @@ export const createConfig = async () => { weshConfig.config = config; await weshClient().ContactRequestEnable({}); + const contactRef = await weshClient().ContactRequestReference({}); + + if (contactRef.publicRendezvousSeed.length === 0) { + const resetRef = await weshClient().ContactRequestResetReference({}); + contactRef.publicRendezvousSeed = resetRef.publicRendezvousSeed; + } + + store.dispatch( + setContactInfo({ + publicRendezvousSeed: stringFromBytes(contactRef.publicRendezvousSeed), + }) + ); subscribeMetadata(weshConfig.config.accountGroupPk); } catch (err) { @@ -27,31 +41,25 @@ export const createConfig = async () => { isConfigLoading = false; }; -export const createSharableLink = async (tokenId: string = "Anon") => { - try { - const contactRef = await weshClient().ContactRequestReference({}); - await weshClient().ContactRequestEnable({}); - if (contactRef.publicRendezvousSeed.length === 0) { - const resetRef = await weshClient().ContactRequestResetReference({}); - contactRef.publicRendezvousSeed = resetRef.publicRendezvousSeed; - } - - weshConfig.metadata = { - rdvSeed: contactRef.publicRendezvousSeed, - tokenId, - }; - - weshConfig.shareLink = `https://app.teritori.com/contact?accountPk=${encodeURIComponent( - stringFromBytes(weshConfig.config.accountPk) - )}&rdvSeed=${encodeURIComponent( - stringFromBytes(contactRef.publicRendezvousSeed) - )}&tokenId=${encodeURIComponent(tokenId)}`; - } catch (err) { - console.log("create sharable link", err); +export const createSharableLink = ( + contactInfo: MessageState["contactInfo"] +) => { + if (!weshConfig?.config?.accountPk || !contactInfo.publicRendezvousSeed) { + return ""; } + return `https://app.teritori.com/contact?accountPk=${encodeURIComponent( + stringFromBytes(weshConfig.config.accountPk) + )}&rdvSeed=${encodeURIComponent( + contactInfo.publicRendezvousSeed + )}&name=${encodeURIComponent(contactInfo.name)}&avatar=${encodeURIComponent( + contactInfo.avatar + )}`; }; -export const addContact = async (shareLink: string, tokenId: string) => { +export const addContact = async ( + shareLink: string, + contactInfo: MessageState["contactInfo"] +) => { const url = new URL(shareLink); if (!url.searchParams.has("accountPk") || !url.searchParams.has("rdvSeed")) { @@ -71,9 +79,13 @@ export const addContact = async (shareLink: string, tokenId: string) => { ), }, ownMetadata: encodeJSON({ - tokenId: tokenId || "", - contactTokenId: url.searchParams.get("name") || "", + name: contactInfo.name, + avatar: contactInfo.avatar, timestamp: new Date().toISOString(), + contact: { + name: decodeURIComponent(url.searchParams.get("name") || ""), + avatar: decodeURIComponent(url.searchParams.get("avatar") || ""), + }, }), }); } catch (err) { diff --git a/yarn.lock b/yarn.lock index 1c37141a54..ab999168ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9853,7 +9853,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.1.0, ajv@npm:^8.9.0": +"ajv@npm:^8.0.0, ajv@npm:^8.1.0, ajv@npm:^8.6.3, ajv@npm:^8.9.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -10624,6 +10624,13 @@ __metadata: languageName: node linkType: hard +"atomically@npm:^1.7.0": + version: 1.7.0 + resolution: "atomically@npm:1.7.0" + checksum: 991153b17334597f93b58e831bea9851e57ed9cd41d8f33991be063f170b5cc8ec7ff8605f3eb95c1d389c2ad651039e9eb8f2b795e24833c2ceb944f347373a + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -12782,6 +12789,24 @@ __metadata: languageName: node linkType: hard +"conf@npm:^10.2.0": + version: 10.2.0 + resolution: "conf@npm:10.2.0" + dependencies: + ajv: ^8.6.3 + ajv-formats: ^2.1.1 + atomically: ^1.7.0 + debounce-fn: ^4.0.0 + dot-prop: ^6.0.1 + env-paths: ^2.2.1 + json-schema-typed: ^7.0.3 + onetime: ^5.1.2 + pkg-up: ^3.1.0 + semver: ^7.3.5 + checksum: 27066f38a25411c1e72e81a5219e2c7ed675cd39d8aa2a2f1797bb2c9255725e92e335d639334177a23d488b22b1290bbe0708e9a005574e5d83d5432df72bd3 + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -13785,6 +13810,15 @@ __metadata: languageName: node linkType: hard +"debounce-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "debounce-fn@npm:4.0.0" + dependencies: + mimic-fn: ^3.0.0 + checksum: 7bf8d142b46a88453bbd6eda083f303049b4c8554af5114bdadfc2da56031030664360e81211ae08b708775e6904db7e6d72a421c4ff473344f4521c2c5e4a22 + languageName: node + linkType: hard + "debug@npm:2, debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.0, debug@npm:^2.6.8, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -14478,6 +14512,15 @@ __metadata: languageName: node linkType: hard +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: ^2.0.0 + checksum: 0f47600a4b93e1dc37261da4e6909652c008832a5d3684b5bf9a9a0d3f4c67ea949a86dceed9b72f5733ed8e8e6383cc5958df3bbd0799ee317fd181f2ece700 + languageName: node + linkType: hard + "dotenv-defaults@npm:^2.0.2": version: 2.0.2 resolution: "dotenv-defaults@npm:2.0.2" @@ -14735,6 +14778,16 @@ __metadata: languageName: node linkType: hard +"electron-store@npm:^8.1.0": + version: 8.1.0 + resolution: "electron-store@npm:8.1.0" + dependencies: + conf: ^10.2.0 + type-fest: ^2.17.0 + checksum: 7036f6d91cdcf6e08b10e24df9b144b9a04fe6cb1d7a7cc009277c1f6ad206d96cfbc3ada8ead47206fc5dadec0d34ff1beb8345bb3696e200f071f66b0abd8e + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.3.564, electron-to-chromium@npm:^1.4.428": version: 1.4.430 resolution: "electron-to-chromium@npm:1.4.430" @@ -14926,7 +14979,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e @@ -19151,7 +19204,7 @@ __metadata: languageName: node linkType: hard -"is-electron@npm:^2.2.0": +"is-electron@npm:^2.2.0, is-electron@npm:^2.2.2": version: 2.2.2 resolution: "is-electron@npm:2.2.2" checksum: de5aa8bd8d72c96675b8d0f93fab4cc21f62be5440f65bc05c61338ca27bd851a64200f31f1bf9facbaa01b3dbfed7997b2186741d84b93b63e0aff1db6a9494 @@ -20211,6 +20264,13 @@ __metadata: languageName: node linkType: hard +"json-schema-typed@npm:^7.0.3": + version: 7.0.3 + resolution: "json-schema-typed@npm:7.0.3" + checksum: e861b19e97e3cc2b29a429147890157827eeda16ab639a0765b935cf3e22aeb6abbba108e23aef442da806bb1f402bdff21da9c5cb30015f8007594565e110b5 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -21739,6 +21799,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^3.0.0": + version: 3.1.0 + resolution: "mimic-fn@npm:3.1.0" + checksum: f7b167f9115b8bbdf2c3ee55dce9149d14be9e54b237259c4bc1d8d0512ea60f25a1b323f814eb1fe8f5a541662804bcfcfff3202ca58df143edb986849d58db + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -26204,6 +26271,15 @@ __metadata: languageName: node linkType: hard +"redux-persist-electron-storage@npm:^2.1.0": + version: 2.1.0 + resolution: "redux-persist-electron-storage@npm:2.1.0" + peerDependencies: + electron-store: "*" + checksum: 2bcb75d5a0fe80ec5437d2c0bae4804b56a32a90d44d402bf2bfa05cf385aee0586c9ff7001e5e25c1f7fdb8e1828ed4282c9f32561332b49572fa4e096ebc3b + languageName: node + linkType: hard + "redux-persist@npm:^6.0.0": version: 6.0.0 resolution: "redux-persist@npm:6.0.0" @@ -28759,6 +28835,7 @@ __metadata: electron-builder: ^23.1.0 electron-reload: ^2.0.0-alpha.1 electron-serve: ^1.1.0 + electron-store: ^8.1.0 eslint: ^8.19.0 eslint-config-universe: ^11.0.0 eslint-plugin-import: ^2.27.5 @@ -28780,6 +28857,7 @@ __metadata: grpc-web: ^1.4.2 html-to-draftjs: ^1.5.0 html-webpack-plugin: 4 + is-electron: ^2.2.2 lodash: ^4.17.21 long: ^5.2.1 lottie-ios: 3.4.0 @@ -28831,6 +28909,7 @@ __metadata: react-native-webview: 11.23.1 react-redux: ^8.0.2 redux-persist: ^6.0.0 + redux-persist-electron-storage: ^2.1.0 rimraf: ^4.4.0 text-encoding-polyfill: ^0.6.7 ts-node: ^10.9.1 @@ -29515,6 +29594,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^2.17.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + languageName: node + linkType: hard + "type-is@npm:~1.6.16, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18"