Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
45 changes: 45 additions & 0 deletions src/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ h6 {
a {
color: #444444;
}

a:hover {
color: #888888;
}
Expand Down Expand Up @@ -148,3 +149,47 @@ textarea {
.footer a:hover {
color: #333;
}

.bang-form {
margin-top: 32px;
text-align: left;
}

label {
width: 100%;
font-size: inherit;
color: inherit;
font-family: inherit;
}

.bang-container {
margin-top: 4px;
display: flex;
flex-direction: row;
gap: 8px;
}

.bang-input {
width: 100%;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
background: #f5f5f5;
}

input[type="submit"] {
font-family: inherit;
font-size: 0.8em;
aspect-ratio: 1;
border: none;
background: transparent;
}

.bang-error {
margin-top: 8px;
color: crimson;
}

.bang-error>a {
color: inherit;
}
59 changes: 56 additions & 3 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,22 @@ function noSearchDefaultPageRender() {
<img src="/clipboard.svg" alt="Copy" />
</button>
</div>
<form class="bang-form">
<label for="bang-input">Care to pick a default bang?</label>
<div class="bang-container">
<input
id="bang-input"
type="text"
class="bang-input"
value="g"
list="bang-list"
spellcheck="false"
/>
<input type="submit" value="Apply" class"bang-confirm"/>
Copy link

Choose a reason for hiding this comment

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

There's a syntax error in the class attribute - it's missing an equals sign. The correct syntax should be class="bang-confirm" rather than class"bang-confirm".

Suggested change
<input type="submit" value="Apply" class"bang-confirm"/>
<input type="submit" value="Apply" class="bang-confirm"/>

Spotted by Diamond

Is this helpful? React 👍 or 👎 to let us know.

</div>
<datalist id="bang-list"></datalist>
</form>
<p class="bang-error"></p>
</div>
<footer class="footer">
<a href="https://t3.chat" target="_blank">t3.chat</a>
Expand All @@ -33,6 +49,27 @@ function noSearchDefaultPageRender() {
const copyButton = app.querySelector<HTMLButtonElement>(".copy-button")!;
const copyIcon = copyButton.querySelector("img")!;
const urlInput = app.querySelector<HTMLInputElement>(".url-input")!;
const bangDatalist = app.querySelector<HTMLDataListElement>("#bang-list")!;
const bangForm = app.querySelector<HTMLFormElement>(".bang-form")!;
const bangInput = app.querySelector<HTMLInputElement>("#bang-input")!;
const bangErrorDiv = app.querySelector<HTMLParagraphElement>(".bang-error")!;

bangs.forEach((b) => {
const option = document.createElement("option");
option.value = b.t;
bangDatalist.appendChild(option);
})

bangForm.addEventListener("submit", (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
const bangName = bangInput.value.trim();
if (!bangs.find((b) => b.t === bangName)) {
bangErrorDiv.innerHTML = `This bang is not known. Check the <a href="https://duckduckgo.com/bang.html" target="_blank">list of available bangs.</a>`;
return;
}
bangErrorDiv.innerHTML = "";
urlInput.value = `https://unduck.link?q=%s&default_bang=${encodeURIComponent(bangName)}`;
})

copyButton.addEventListener("click", async () => {
await navigator.clipboard.writeText(urlInput.value);
Expand All @@ -44,8 +81,24 @@ function noSearchDefaultPageRender() {
});
}

const LS_DEFAULT_BANG = localStorage.getItem("default-bang") ?? "g";
const defaultBang = bangs.find((b) => b.t === LS_DEFAULT_BANG);
function findBang(url: URL) {
//Honoring legacy local-storage defined bangs
const LS_DEFAULT_BANG = localStorage.getItem("default-bang");
if (LS_DEFAULT_BANG) {
const defaultBang = bangs.find((b) => b.t === LS_DEFAULT_BANG);
if (defaultBang)
return defaultBang;
}

//Obtaining default bang from URL
const URL_DEFAULT_BANG = url.searchParams.get("default_bang")?.trim() ?? "g"; //can contain invalid bang
const defaultUrlBang = bangs.find((b) => b.t == URL_DEFAULT_BANG);
if (defaultUrlBang)
return defaultUrlBang;

//In case everything else is invalid
return bangs.find((b) => b.t == "g")!;
}

function getBangredirectUrl() {
const url = new URL(window.location.href);
Expand All @@ -58,7 +111,7 @@ function getBangredirectUrl() {
const match = query.match(/!(\S+)/i);

const bangCandidate = match?.[1]?.toLowerCase();
const selectedBang = bangs.find((b) => b.t === bangCandidate) ?? defaultBang;
const selectedBang = bangs.find((b) => b.t === bangCandidate) ?? findBang(url);

// Remove the first bang from the query
const cleanQuery = query.replace(/!\S+\s*/i, "").trim();
Expand Down