\r\n\r\n
e.stopPropagation()} to={`/app/squeak/${props.id}`} key={props.id} className={props.squeak ? \"Squeak-card-wrapper\" : \"Squeak-card-wrapper missing-squeak\"} >\r\n\r\n {props.squeak ?\r\n <>\r\n
\r\n
e.stopPropagation()} to={`/app/profile/${props.squeak.getAuthorPubkey()}`}>\r\n

\r\n \r\n {props.hasReply?
: null}\r\n
\r\n
\r\n
\r\n
\r\n \r\n e.stopPropagation()} to={`/app/profile/${props.squeak.getAuthorPubkey()}`}>{author ? author.getProfileName(): 'Unknown Author'}\r\n \r\n \r\n e.stopPropagation()} to={`/app/profile/${props.squeak.getAuthorPubkey()}`}>{'@'+ props.squeak.getAuthorPubkey()}\r\n \r\n ·\r\n \r\n {moment(props.squeak.getBlockTime() * 1000).fromNow(true)}\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n {props.squeak.getContentStr() ?\r\n
\r\n {props.squeak.getContentStr()}\r\n
:\r\n
\r\n
\r\n
\r\n Locked content\r\n
\r\n
\r\n }\r\n\r\n
\r\n
toggleModal(e)} className=\"card-button-wrap reply-wrap\">\r\n
\r\n \r\n
\r\n
\r\n 0\r\n
\r\n
\r\n
resqueak(e,props.id)} className=\"card-button-wrap resqueak-wrap\">\r\n
\r\n \r\n
\r\n
\r\n 0\r\n
\r\n
\r\n
{\r\n e.preventDefault();\r\n props.squeak.getLikedTimeMs() ?\r\n unlikeSqueak(e, props.squeak.getSqueakHash()) :\r\n likeSqueak(e, props.squeak.getSqueakHash())\r\n }} className=\"card-button-wrap heart-wrap\">\r\n
\r\n {props.squeak.getLikedTimeMs() ?\r\n :\r\n }\r\n
\r\n
\r\n
deleteSqueak(e,props.id)} className=\"card-button-wrap\">\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n > :\r\n <>\r\n
\r\n

\r\n {props.hasReply?
: null}\r\n
\r\n
\r\n
\r\n Missing Squeak\r\n
\r\n
\r\n >\r\n }\r\n\r\n \r\n\r\n {/* squeak modal */}\r\n {props.squeak ?\r\n
toggleModal()} style={{display: modalOpen ? 'block' : 'none'}} className=\"modal-edit\">\r\n {modalOpen ?\r\n
handleModalClick(e)} className=\"modal-content\">\r\n
\r\n
\r\n
toggleModal()} className=\"modal-closeIcon-wrap\">\r\n \r\n
\r\n
\r\n
Reply
\r\n
\r\n
\r\n \r\n
\r\n
: null}\r\n
: null}\r\n\r\n\r\n
\r\n )\r\n});\r\n\r\nexport default withRouter(SqueakCard)\r\n","function getImageSrcString(imageBase64) {\n return `data:image/jpeg;base64,${imageBase64}`;\n}\n\nexport function getProfileImageSrcString(squeakProfile) {\n const profileImage = squeakProfile.getProfileImage();\n return getImageSrcString(profileImage);\n}\n","import {\n createSlice,\n createSelector,\n createAsyncThunk,\n createEntityAdapter,\n} from '@reduxjs/toolkit'\nimport {\n getTwitterAccounts,\n createTwitterAccount,\n deleteTwitterAccount,\n} from '../../api/client'\n\nconst initialState = {\n twitterAccountsStatus: 'idle',\n twitterAccounts: [],\n createTwitterAccountStatus: 'idle',\n}\n\n\nexport const setDeleteTwitterAccount = createAsyncThunk(\n 'twitterAccounts/setDeleteTwitterAccount',\n async (values) => {\n console.log('Deleting twitter account');\n let twitterAccountId = values.twitterAccountId;\n await deleteTwitterAccount(twitterAccountId);\n const response = await getTwitterAccounts();\n console.log(response);\n return response.getTwitterAccountsList();\n }\n)\n\nexport const fetchTwitterAccounts = createAsyncThunk(\n 'twitterAccounts/fetchTwitterAccounts',\n async () => {\n const response = await getTwitterAccounts();\n console.log(response);\n return response.getTwitterAccountsList();\n }\n)\n\nexport const setCreateTwitterAccount = createAsyncThunk(\n 'twitterAccounts/setCreateTwitterAccount',\n async (values) => {\n console.log('Creating twitter account');\n let twitterHandle = values.twitterHandle;\n let profileId = values.profileId;\n let bearerToken = values.bearerToken;\n const createResponse = await createTwitterAccount(\n twitterHandle,\n profileId,\n bearerToken,\n );\n console.log(createResponse);\n const response = await getTwitterAccounts();\n console.log(response);\n return response.getTwitterAccountsList();\n }\n)\n\n\n// const updatedProfileInArray = (profileArr, newProfile) => {\n// const currentIndex = profileArr.findIndex(profile => profile.getPubkey() === newProfile.getPubkey());\n// if (currentIndex != -1) {\n// profileArr[currentIndex] = newProfile;\n// }\n// }\n\n\nconst twitterAccountsSlice = createSlice({\n name: 'twitterAccounts',\n initialState,\n reducers: {\n clearTwitterAccounts(state, action) {\n state.createTwitterAccountStatus = 'idle'\n state.twitterAccounts = [];\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchTwitterAccounts.pending, (state, action) => {\n state.twitterAccountsStatus = 'loading'\n })\n .addCase(fetchTwitterAccounts.fulfilled, (state, action) => {\n const newTwitterAccounts = action.payload;\n state.twitterAccounts = newTwitterAccounts;\n state.twitterAccountsStatus = 'idle'\n })\n .addCase(setCreateTwitterAccount.pending, (state, action) => {\n console.log('setCreateTwitterAccount pending');\n state.createTwitterAccountStatus = 'loading'\n })\n .addCase(setCreateTwitterAccount.fulfilled, (state, action) => {\n console.log('setCreateTwitterAccount fulfilled');\n console.log(action);\n const newTwitterAccounts = action.payload;\n state.twitterAccounts = newTwitterAccounts;\n state.twitterAccountsStatus = 'idle'\n state.createTwitterAccountStatus = 'idle';\n })\n .addCase(setDeleteTwitterAccount.fulfilled, (state, action) => {\n console.log(action);\n const newTwitterAccounts = action.payload;\n state.twitterAccounts = newTwitterAccounts;\n state.twitterAccountsStatus = 'idle'\n\n })\n },\n})\n\nexport const {\n clearTwitterAccounts,\n} = twitterAccountsSlice.actions\n\nexport default twitterAccountsSlice.reducer\n\nexport const selectTwitterAccountsStatus = state => state.twitterAccounts.twitterAccountsStatus\n\nexport const selectTwitterAccounts = state => state.twitterAccounts.twitterAccounts\n\nexport const selectCreateTwitterAccountStatus = state => state.twitterAccounts.createTwitterAccountStatus\n","import {\n createSlice,\n createSelector,\n createAsyncThunk,\n createEntityAdapter,\n} from '@reduxjs/toolkit'\nimport {\n getPeer,\n getConnectedPeers,\n connectPeer,\n disconnectPeer,\n getSavedPeers,\n savePeer,\n deletePeer,\n enableAutoconnectPeer,\n disableAutoconnectPeer,\n} from '../../api/client'\n\nconst initialState = {\n currentPeerStatus: 'idle',\n currentPeer: null,\n connectedPeersStatus: 'idle',\n connectedPeers: [],\n savedPeersStatus: 'idle',\n savedPeers: [],\n connectPeerStatus: 'idle',\n disconnectPeerStatus: 'idle',\n savePeerStatus: 'idle',\n deletePeerStatus: 'idle',\n}\n\n// Thunk functions\nexport const fetchPeer = createAsyncThunk(\n 'peers/fetchPeer',\n async (values) => {\n console.log('Fetching peer');\n let network = values.network;\n let host = values.host;\n let port = values.port;\n const response = await getPeer(\n network,\n host,\n port,\n );\n console.log(response);\n return response.getSqueakPeer();\n }\n)\n\nexport const fetchConnectedPeers = createAsyncThunk(\n 'peers/fetchConnectedPeers',\n async () => {\n console.log('Fetching connected peers');\n const response = await getConnectedPeers();\n console.log(response);\n return response.getConnectedPeersList();\n }\n)\n\nexport const fetchSavedPeers = createAsyncThunk(\n 'peers/fetchSavedPeers',\n async () => {\n console.log('Fetching saved peers');\n const response = await getSavedPeers();\n console.log(response);\n return response.getSqueakPeersList();\n }\n)\n\nexport const setConnectPeer = createAsyncThunk(\n 'peers/setConnectPeer',\n async (values) => {\n console.log('Connecting peer');\n let network = values.network;\n let host = values.host;\n let port = values.port;\n await connectPeer(\n network,\n host,\n port,\n );\n const response = await getConnectedPeers();\n return response.getConnectedPeersList();\n }\n)\n\nexport const setDisconnectPeer = createAsyncThunk(\n 'peers/setDisconnectPeer',\n async (values) => {\n console.log('Disconnecting peer');\n let network = values.network;\n let host = values.host;\n let port = values.port;\n await disconnectPeer(\n network,\n host,\n port,\n );\n const response = await getConnectedPeers();\n return response.getConnectedPeersList();\n }\n)\n\nexport const setSavePeer = createAsyncThunk(\n 'peers/setSavePeer',\n async (values) => {\n console.log('Saving peer');\n let name = values.name;\n let network = values.network;\n let host = values.host;\n let port = values.port;\n await savePeer(\n name,\n network,\n host,\n port,\n );\n const response = await getSavedPeers();\n return response.getSqueakPeersList();\n }\n)\n\nexport const setDeletePeer = createAsyncThunk(\n 'peers/setDeletePeer',\n async (values) => {\n console.log('Deleting peer');\n let peerId = values.peerId;\n await deletePeer(peerId);\n const response = await getSavedPeers();\n return response.getSqueakPeersList();\n }\n)\n\nexport const setPeerAutoconnectEnabled = createAsyncThunk(\n 'peers/setPeerAutoconnectEnabled',\n async (values) => {\n console.log('Setting peer autoconnect enabled');\n let peerId = values.peerId;\n await enableAutoconnectPeer(peerId);\n const response = await getSavedPeers();\n return response.getSqueakPeersList();\n }\n)\n\nexport const setPeerAutoconnectDisabled = createAsyncThunk(\n 'peers/setPeerAutoconnectDisabled',\n async (values) => {\n console.log('Setting peer autoconnect disabled');\n let peerId = values.peerId;\n await disableAutoconnectPeer(peerId);\n const response = await getSavedPeers();\n return response.getSqueakPeersList();\n }\n)\n\n\nconst peersSlice = createSlice({\n name: 'peers',\n initialState,\n reducers: {\n clearAll(state, action) {\n console.log('Clear current peer and status.');\n state.currentPeerStatus = 'idle';\n state.currentPeer = null;\n },\n clearSavedPeers(state, action) {\n state.savedPeersStatus = 'idle'\n state.savedPeers = [];\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchPeer.pending, (state, action) => {\n state.currentPeerStatus = 'loading'\n })\n .addCase(fetchPeer.fulfilled, (state, action) => {\n const newPeer = action.payload;\n state.currentPeer = newPeer;\n state.currentPeerStatus = 'idle';\n })\n .addCase(fetchConnectedPeers.pending, (state, action) => {\n state.connectedPeersStatus = 'loading'\n })\n .addCase(fetchConnectedPeers.fulfilled, (state, action) => {\n const newConnectedPeers = action.payload;\n state.connectedPeers = newConnectedPeers;\n state.connectedPeersStatus = 'idle';\n })\n .addCase(fetchSavedPeers.pending, (state, action) => {\n state.savedPeersStatus = 'loading'\n })\n .addCase(fetchSavedPeers.fulfilled, (state, action) => {\n const newSavedPeers = action.payload;\n state.savedPeers = newSavedPeers;\n state.savedPeersStatus = 'idle';\n })\n .addCase(setConnectPeer.pending, (state, action) => {\n console.log(action);\n state.connectPeerStatus = 'loading'\n })\n .addCase(setConnectPeer.fulfilled, (state, action) => {\n console.log(action);\n const newConnectedPeers = action.payload;\n state.connectedPeers = newConnectedPeers;\n state.connectPeerStatus = 'idle';\n })\n .addCase(setDisconnectPeer.pending, (state, action) => {\n console.log(action);\n state.disconnectPeerStatus = 'loading'\n })\n .addCase(setDisconnectPeer.fulfilled, (state, action) => {\n console.log(action);\n const newConnectedPeers = action.payload;\n state.connectedPeers = newConnectedPeers;\n state.disconnectPeerStatus = 'idle';\n })\n .addCase(setSavePeer.pending, (state, action) => {\n console.log(action);\n state.savePeerStatus = 'loading'\n })\n .addCase(setSavePeer.fulfilled, (state, action) => {\n console.log(action);\n const newSavedPeers = action.payload;\n const savedAddress = action.meta.arg;\n const newSavedPeer = newSavedPeers.find(savedPeer => {\n return savedPeer.getPeerAddress().getNetwork() === savedAddress.network &&\n savedPeer.getPeerAddress().getHost() === savedAddress.host &&\n savedPeer.getPeerAddress().getPort() == savedAddress.port\n });\n state.currentPeer = newSavedPeer;\n state.savedPeers = newSavedPeers;\n state.savePeerStatus = 'idle';\n })\n .addCase(setDeletePeer.pending, (state, action) => {\n console.log(action);\n state.deletePeerStatus = 'loading'\n })\n .addCase(setDeletePeer.fulfilled, (state, action) => {\n console.log(action);\n const newSavedPeers = action.payload;\n state.currentPeer = null;\n state.savedPeers = newSavedPeers;\n state.deletePeerStatus = 'idle';\n })\n .addCase(setPeerAutoconnectEnabled.fulfilled, (state, action) => {\n console.log(action);\n const newSavedPeers = action.payload;\n const peerId = action.meta.arg.peerId;\n const newSavedPeer = newSavedPeers.find(savedPeer => {\n return savedPeer.getPeerId() === peerId\n });\n state.currentPeer = newSavedPeer;\n state.savedPeers = newSavedPeers;\n })\n .addCase(setPeerAutoconnectDisabled.fulfilled, (state, action) => {\n console.log(action);\n const newSavedPeers = action.payload;\n const peerId = action.meta.arg.peerId;\n const newSavedPeer = newSavedPeers.find(savedPeer => {\n return savedPeer.getPeerId() === peerId\n });\n state.currentPeer = newSavedPeer;\n state.savedPeers = newSavedPeers;\n })\n },\n})\n\nexport const {\n clearAll,\n clearSavedPeers,\n} = peersSlice.actions\n\nexport default peersSlice.reducer\n\nexport const selectCurrentPeer = state => state.peers.currentPeer\n\nexport const selectCurrentPeerStatus = state => state.peers.currentPeerStatus\n\nexport const selectSavedPeers = state => state.peers.savedPeers\n\nexport const selectSavedPeersStatus = state => state.peers.savedPeersStatus\n\nexport const selectConnectedPeers = state => state.peers.connectedPeers\n\nexport const selectConnectedPeersStatus = state => state.peers.connectedPeersStatus\n\nexport const selectPeerConnectionByAddress = createSelector(\n [\n selectConnectedPeers,\n (state, address) => address\n ],\n (connectedPeers, address) => {\n return connectedPeers.find(obj => {\n return obj.getPeerAddress().getNetwork() === address.network &&\n obj.getPeerAddress().getHost() === address.host &&\n obj.getPeerAddress().getPort() == address.port\n });\n }\n)\n","import {\n createSlice,\n createSelector,\n createAsyncThunk,\n createEntityAdapter,\n} from '@reduxjs/toolkit'\nimport {\n getSellPrice,\n updateSellPrice,\n clearSellPrice,\n} from '../../api/client'\n\nconst initialState = {\n sellPriceInfo: null,\n}\n\n// Thunk functions\nexport const fetchSellPrice = createAsyncThunk(\n 'sellPrice/fetchSellPrice',\n async () => {\n console.log('Fetching sellPrice');\n const response = await getSellPrice();\n console.log(response);\n return response;\n }\n)\n\nexport const setSellPrice = createAsyncThunk(\n 'sellPrice/setSellPrice',\n async (sellPriceMsat) => {\n console.log('Updating sellPrice');\n await updateSellPrice(sellPriceMsat);\n const response = await getSellPrice();\n console.log(response);\n return response;\n }\n)\n\nexport const setClearSellPrice = createAsyncThunk(\n 'sellPrice/setClearSellPrice',\n async (sellPriceMsat) => {\n console.log('Clearing sellPrice');\n await clearSellPrice();\n const response = await getSellPrice();\n console.log(response);\n return response;\n }\n)\n\nconst sellPriceSlice = createSlice({\n name: 'sellPrice',\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchSellPrice.fulfilled, (state, action) => {\n console.log(action);\n const sellPriceInfo = action.payload;\n state.sellPriceInfo = sellPriceInfo;\n })\n .addCase(setSellPrice.fulfilled, (state, action) => {\n console.log(action);\n const sellPriceInfo = action.payload;\n state.sellPriceInfo = sellPriceInfo;\n })\n .addCase(setClearSellPrice.fulfilled, (state, action) => {\n console.log(action);\n const sellPriceInfo = action.payload;\n state.sellPriceInfo = sellPriceInfo;\n })\n },\n})\n\nexport default sellPriceSlice.reducer\n\nexport const selectSellPriceInfo = state => state.sellPrice.sellPriceInfo\n\n// export const selectSellPriceUsingOverride = state => state.sellPrice.sellPriceInfo && state.sellPrice.sellPriceInfo.getPriceMsatIsSet()\n//\n// export const selectSellPriceOverride = state => state.sellPrice.sellPriceInfo && state.sellPrice.sellPriceInfo.getPriceMsat()\n//\n// export const selectSellPriceDefault = state => state.sellPrice.sellPriceInfo && state.sellPrice.sellPriceInfo.getDefaultPriceMsat()\n","import React, { useEffect, useState, useContext, useRef } from 'react'\nimport { withRouter } from 'react-router-dom'\nimport { unwrapResult } from '@reduxjs/toolkit'\n\nimport moment from 'moment'\nimport ContentEditable from 'react-contenteditable'\nimport { Link } from 'react-router-dom'\nimport { getProfileImageSrcString } from '../../squeakimages/images';\nimport Loader from '../../components/Loader'\n\nimport { Form, Input, Select, Checkbox, Relevant, Debug, TextArea, Option } from 'informed';\n\nimport { useSelector } from 'react-redux'\nimport { useDispatch } from 'react-redux'\n\n\nimport {\n setMakeSqueak,\n selectMakeSqueakStatus,\n} from '../squeaks/squeaksSlice'\nimport {\n selectSigningProfiles,\n fetchSigningProfiles,\n} from '../../features/profiles/profilesSlice'\n\nconst MakeSqueak = (props) => {\n const signingProfiles = useSelector(selectSigningProfiles);\n const makeSqueakStatus = useSelector(selectMakeSqueakStatus);\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(fetchSigningProfiles());\n }, [])\n\n\n const submitSqueak = ({ values }) => {\n // TODO: toggle modal off here.\n console.log(values);\n console.log(values.signingProfileId);\n console.log(values.content);\n\n if (!values.signingProfileId) {\n alert('Signing Profile must be selected.');\n return;\n }\n\n if (!values.content) {\n alert('Content cannot be empty.');\n return;\n }\n\n const makeValues = {\n signingProfile: values.signingProfileId,\n description: values.content,\n replyTo: props.replyToSqueak ? props.replyToSqueak.getSqueakHash() : null,\n hasRecipient: null,\n recipientProfileId: -1,\n }\n console.log('makeSqueak');\n dispatch(setMakeSqueak(makeValues))\n .then(unwrapResult)\n .then((squeakHash) => {\n props.history.push(`/app/squeak/${squeakHash}`);\n })\n .catch((err) => {\n alert(err.message);\n });\n if (props.submittedCallback) {\n props.submittedCallback();\n }\n }\n\n // TODO: Show profile image for selected signing profile.\n //