The button works, but internet identity login is not triggering properly on mobile. I saw some previous forum posts, but wasn’t able to resolve the issue with them… @kpeacock @icme @infu
Here is my init and login methods in my Svelte store. Thank you for any help in advance!
function createAuthStore() {
const { subscribe, set, update } = writable({
isReady: false,
isAuthenticated: false,
isApproved: false, //this is so that the minter backend can burn tokens on behalf of user
identity: null,
tokenActor: null,
minterActor: null,
authClient: null,
balance: 0,
info: [],
});
return {
subscribe,
init: async () => {
const authClient = await AuthClient.create(defaultOptions.createOptions);
const isAuthenticated = await authClient.isAuthenticated();
const identity = isAuthenticated ? authClient.getIdentity() : null;
const minterActor = minterActorFromIdentity(identity);
const tokenActor = tokenActorFromIdentity(identity);
let balance;
let isApproved;
let info;
try {
if (identity) {
const playerInfo = await minterActor.getPlayer();
// Fetch the balance
const fetchedBalance = await fetchTokenBalance(tokenActor, identity.getPrincipal());
balance = fetchedBalance; // Set the balance to the fetched value
// Check approval again if necessary
if(playerInfo.err) {
let result = await getApproval(tokenActor, minterBackendId);
isApproved = result ? result : false;
info = playerInfo.err;
}
if(playerInfo.ok) {
isApproved = true;
info = playerInfo.ok;
}
}
} catch (error) {
console.error("Error during init:", error);
// You can set some error state here if needed
}
set({
balance,
isAuthenticated,
isApproved,
identity,
minterActor,
tokenActor,
authClient,
isReady: true,
});
},
login: async () => {
const authClient = await AuthClient.create();
await new Promise((resolve) => {
authClient.login({
identityProvider: defaultOptions.loginOptions.identityProvider,
derivationOrigin:
process.env.DFX_NETWORK === "ic"
? `https://${frontendId}.icp0.io`
: null,
onSuccess: async () => {
const isAuthenticated = await authClient.isAuthenticated();
const identity = isAuthenticated ? authClient.getIdentity() : null;
const minterActor = minterActorFromIdentity(identity);
const tokenActor = tokenActorFromIdentity(identity);
let isApproved = false;
let balance = 0;
let info = []
if (identity) {
const playerInfo = await minterActor.getPlayer();
// Fetch the balance
const fetchedBalance = await fetchTokenBalance(tokenActor, identity.getPrincipal());
balance = fetchedBalance; // Set the balance to the fetched value
// Check approval again if necessary
if(playerInfo.err) {
let result = await getApproval(tokenActor, minterBackendId);
isApproved = result ? result : false;
info = playerInfo.err;
}
if(playerInfo.ok) {
isApproved = true;
info = playerInfo.ok;
}
}
// console.log(Principal.fromText(identity));
set({
balance,
isAuthenticated,
isApproved,
identity,
minterActor,
tokenActor,
authClient,
isReady: true,
info,
});
resolve();
},
});
});
},