Skip to content

Commit 4d8661e

Browse files
committed
add cached login
1 parent 108e065 commit 4d8661e

File tree

3 files changed

+56
-43
lines changed

3 files changed

+56
-43
lines changed

packages/js-sdk/src/Dm3Sdk.ts

+31-3
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class Dm3Sdk {
6363
/**
6464
* DM3 STORAGE
6565
*/
66-
private storageApi?: StorageAPI;
66+
public storageApi?: StorageAPI;
6767

6868
/**
6969
* DM3 CONVERSATIONS
@@ -160,8 +160,36 @@ export class Dm3Sdk {
160160
return new Dm3(conversations, tld);
161161
}
162162

163-
//TODO use type of injected lukso provider
164-
public async universalProfileLogin(lukso: any) {
163+
/**
164+
* Convenience method to login with a cached provider.
165+
* DO NOT USE IN PRODUCTION since it stores the keys in the local storage!
166+
* @param lukso
167+
* @returns
168+
*/
169+
public async universalProfileLoginWithCache(requestProvider: () => Promise<ethers.providers.ExternalProvider>) {
170+
const cachedCredentials = localStorage.getItem('credentials');
171+
172+
if (cachedCredentials) {
173+
const credentials = JSON.parse(cachedCredentials);
174+
return this.login(credentials);
175+
}
176+
177+
const lukso = await requestProvider();
178+
if (!lukso) {
179+
throw new Error('Lukso provider not found');
180+
}
181+
const lc = await LuksoConnector._instance(
182+
lukso,
183+
this.nonce,
184+
this.defaultDeliveryService,
185+
);
186+
187+
const loginResult = await lc.login();
188+
localStorage.setItem('credentials', JSON.stringify(loginResult));
189+
return this.login(loginResult as Success);
190+
}
191+
192+
public async universalProfileLogin(lukso: ethers.providers.ExternalProvider) {
165193
if (!lukso) {
166194
throw new Error('Lukso provider not found');
167195
}

packages/messenger-vue-demo/src/composables/chat.ts

+23-39
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import { computed, ref, markRaw, type Ref } from 'vue';
2-
// import { sha256, stringify } from '@dm3-org/dm3-lib-shared';
32
import { Dm3, Dm3Sdk, type Dm3SdkConfig } from '@dm3-org/dm3-js-sdk';
4-
import { JsonRpcProvider } from '@ethersproject/providers';
53
import {ethers} from 'ethers';
6-
// import type { Dm3 } from '@dm3-org/dm3-js-sdk/lib/esm/Dm3';
7-
// import { DM3 } from '@dm3-org/dm3-messenger-widget';
84

95
const sepoliaProvider = new ethers.providers.JsonRpcProvider("https://eth-sepolia.g.alchemy.com/v2/cBTHRhVcZ3Vt4BOFpA_Hi5DcTB1KQQV1", {
106
name: 'sepolia',
@@ -20,23 +16,11 @@ const configLukso: Dm3SdkConfig = {
2016
userEnsSubdomain: ".testing-user.dm3.eth",
2117
resolverBackendUrl: "https://testing.dm3.network/resolver-handler",
2218
backendUrl: "https://testing.dm3.network/api",
23-
// storageApi: {
24-
// getConversations: () => Promise.resolve([]),
25-
// getMessages: () => Promise.resolve([]),
26-
// getHaltedMessages: () => Promise.resolve([]),
27-
// clearHaltedMessages: () => Promise.resolve(),
28-
// addMessageBatch: () => Promise.resolve(''),
29-
// addConversation: () => Promise.resolve(),
30-
// getNumberOfMessages: () => Promise.resolve(0),
31-
// getNumberOfConverations: () => Promise.resolve(0),
32-
// editMessageBatch: () => Promise.resolve(),
33-
// addMessage: () => Promise.resolve(''),
34-
// toggleHideConversation: () => Promise.resolve(),
35-
// },
3619
};
3720

3821
const sdk = new Dm3Sdk(configLukso);
3922

23+
// TODO: check for installed extension
4024
// https://docs.lukso.tech/install-up-browser-extension/
4125

4226
type UseDm3ChatReturnType = {
@@ -47,42 +31,42 @@ type UseDm3ChatReturnType = {
4731
isReady: Ref<boolean>;
4832
};
4933

34+
const requestProvider = (): Promise<ethers.providers.ExternalProvider> => {
35+
return new Promise((resolve) => {
36+
window.addEventListener("eip6963:announceProvider", (event) => {
37+
const provider = (event as any).detail.provider;
38+
console.log('Provider:', provider);
39+
resolve(provider);
40+
});
41+
42+
// Request installed providers
43+
window.dispatchEvent(new Event("eip6963:requestProvider"));
44+
});
45+
};
46+
5047
export function useDm3Chat(): UseDm3ChatReturnType {
5148
const dm3Instance = ref<Dm3 | null>(null);
5249
const isReady = ref(false);
5350
const init = async () => {
54-
console.log('dm3Instance', dm3Instance.value);
55-
56-
// Listen for provider announcements
57-
window.addEventListener("eip6963:announceProvider", async (event) => {
58-
const dm3 = await sdk.universalProfileLogin((event as any).detail.provider);
59-
// mark as raw to avoid reactivity issues with vue
60-
// see: https://github.com/vuejs/core/issues/3024
61-
dm3Instance.value = markRaw(dm3);
62-
console.log('dm3Instance', dm3Instance.value);
63-
isReady.value = true;
64-
});
65-
66-
// Request installed providers
67-
window.dispatchEvent(new Event("eip6963:requestProvider"));
51+
const dm3 = await sdk.universalProfileLoginWithCache(requestProvider);
52+
dm3Instance.value = markRaw(dm3);
53+
isReady.value = true;
6854
};
69-
// init();
7055

7156
const rooms = computed(() => {
7257
console.log('dm3Instance.value?.conversations list', dm3Instance.value?.conversations.list);
73-
return dm3Instance.value?.conversations?.list;
58+
return dm3Instance.value?.conversations?.list
7459
});
7560
const messages = computed(() => rooms.value?.at(0));
7661

7762
const startTestConversation = async () => {
78-
console.log('dm3Instance', dm3Instance.value);
79-
console.log('dm3Instance.value?.conversations', dm3Instance.value?.conversations);
63+
if (!dm3Instance) {
64+
console.error('dm3Instance is not initialized');
65+
return;
66+
}
67+
8068
const conv = await dm3Instance.value?.conversations?.addConversation('alice.eth');
81-
console.log('conv', conv);
82-
console.log('conv?.messages', conv?.messages.meta);
83-
console.log('conv?.contact', conv?.contact);
8469
await conv?.messages.sendMessage('Hello, world!');
85-
console.log('messages', messages.value);
8670
}
8771

8872
return { rooms, messages, isReady, init, startTestConversation };

packages/messenger-vue-demo/vite.config.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export default defineConfig({
3333
include: [/node_modules/,
3434
/@dm3-org\/dm3-js-sdk/,
3535
/@dm3-org\/dm3-lib-crypto/,
36-
/dm3-org\/dm3-lib-profile/
36+
/dm3-org\/dm3-lib-profile/,
37+
/@dm3-org\/dm3-lib-storage/,
3738
],
3839
},
3940
},

0 commit comments

Comments
 (0)