Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: implement Internet Identity example recommendations #1033

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,19 @@ img {
margin: auto;
}

form {
#buttons {
display: flex;
justify-content: center;
gap: 0.5em;
flex-flow: row wrap;
max-width: 40vw;
margin: auto;
gap: 1.5em;
flex-direction: column;
width: max-content;
margin: 1.5em auto;
align-items: baseline;
}

button[type="submit"] {
button {
padding: 5px 20px;
margin: 10px auto;
float: right;
width: 100%;
}

#greeting {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,10 @@
<body>
<main>
<img src="logo2.svg" alt="DFINITY logo" />
<br />
<br />
<form>
<button id="login">Login!</button>
</form>
<br />
<form>
<button id="greet">Click Me!</button>
</form>
<section id="buttons">
<button id="login" type="button" disabled>Login!</button>
<button id="greet" type="button" disabled>Click Me!</button>
</section>
<section id="greeting"></section>
</main>
</body>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,61 @@
import {createActor, greet_backend} from "../../declarations/greet_backend";
import {AuthClient} from "@dfinity/auth-client"
import {HttpAgent} from "@dfinity/agent";
import { createActor, greet_backend } from "../../declarations/greet_backend";
import { AuthClient } from "@dfinity/auth-client";
import { HttpAgent } from "@dfinity/agent";

let actor = greet_backend;
// Global variables that we will set up
window.greetActor;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Global variables that we will set up
// Global variables for convenience while you're becoming familiar with the interface. You should use local variables or closures in production

window.authClient;

const greetButton = document.getElementById("greet");
greetButton.onclick = async (e) => {
e.preventDefault();
const loginButton = document.getElementById("login");

greetButton.setAttribute("disabled", true);
AuthClient.create().then((client) => {
// Put this on the window so we can access it from the console. This is helpful for learning, but it's recommended to keep it in a closure in a real app.
window.authClient = client;
// We can use the authClient to check if the user is already authenticated
setActor(client);

// Now that the auth client is created, we can enable the login and greet buttons
loginButton.removeAttribute("disabled");
greetButton.removeAttribute("disabled");
});

loginButton.onclick = () => {
// start the login process and wait for it to finish
window.authClient.login({
identityProvider: process.env.II_URL,
onSuccess: () => {
setActor(window.authClient);
},

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you remove the login button onSuccess?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I didn't notice that logic in the original version

onError: (err) => {
console.error(err);
},
});
};

// Interact with backend actor, calling the greet method
const greeting = await actor.greet();
greetButton.onclick = async () => {
// Disable the button to prevent multiple clicks
greetButton.setAttribute("disabled", true);

greetButton.removeAttribute("disabled");
// Interact with backend actor, calling the greet method
const greeting = await window.greetActor.greet();

document.getElementById("greeting").innerText = greeting;
greetButton.removeAttribute("disabled");

return false;
document.getElementById("greeting").innerText = greeting;
};

const loginButton = document.getElementById("login");
loginButton.onclick = async (e) => {
e.preventDefault();

// create an auth client
let authClient = await AuthClient.create();

// start the login process and wait for it to finish
await new Promise((resolve) => {
authClient.login({
identityProvider: process.env.II_URL,
onSuccess: resolve,
});
});

// At this point we're authenticated, and we can get the identity from the auth client:
const identity = authClient.getIdentity();
// Using the identity obtained from the auth client, we can create an agent to interact with the IC.
const agent = new HttpAgent({identity});
// Using the interface description of our webapp, we create an actor that we use to call the service methods.
actor = createActor(process.env.GREET_BACKEND_CANISTER_ID, {
agent,
});

return false;
};
/**
* Sets the actor to be used by the greet button
* @param {AuthClient} an initialized AuthClient, which will have the identity of the user (logged in or not)
*/
function setActor(authClient) {
// At this point we're authenticated, and we can get the identity from the auth client:
const identity = authClient.getIdentity();
// Using the identity obtained from the auth client, we can create an agent to interact with the IC.
const agent = new HttpAgent({ identity });
// Using the interface description of our webapp, we create an actor that we use to call the service methods.
krpeacock marked this conversation as resolved.
Show resolved Hide resolved
window.greetActor = createActor(process.env.GREET_BACKEND_CANISTER_ID, {
agent,
});
}
Loading