Add a web extension and debian package compilation (#5)
All checks were successful
Check go code / build-and-release (push) Successful in 1m9s

Reviewed-on: #5
Co-authored-by: Julien Fastré <julien.fastre@champs-libres.coop>
Co-committed-by: Julien Fastré <julien.fastre@champs-libres.coop>
This commit was merged in pull request #5.
This commit is contained in:
2025-11-12 19:10:41 +00:00
committed by Julien Fastré
parent d830f33eec
commit 0a64db6925
31 changed files with 7005 additions and 346 deletions

View File

@@ -0,0 +1,68 @@
import {isOutputMessageError, isOutputMessageSuccess} from "./types.js";
const projects: { name: string, slug: string }[] = [
//{name: "test (dev only)", slug: "test"},
{name: "Adminsys", slug: "champs-libres-adminsys"},
{name: "Be-Arbres", slug: "be-arbres"},
{name: "Chill", slug: "chill"},
{name: "Chill > AMLI", slug: "amli"},
{name: "Chill > Haute-Vienne", slug: "haute-vienne"},
{name: "Chill > Petits Chills", slug: "petits-chill"},
{name: "Chill > Samu Social", slug: "samu-social"},
{name: "Chill > Vendée", slug: "vendee"},
{name: "Osiris", slug: "osiris"},
{name: "Raponmap", slug: "raponmap"}
]
for (const project of projects) {
browser.menus.create(
{
id: "cl-issue-2-wp-" + project.slug,
title: project.name,
contexts: ["link"],
type: "radio"
},
);
}
browser.menus.onClicked.addListener(async function(info, tab) {
console.log("info", info);
if (typeof info.menuItemId === "string") {
console.log("menuItemId", info.menuItemId);
if (info.menuItemId.startsWith("cl-issue-2-wp-")) {
console.log("start with cl-issue-2-wp-");
const slug = info.menuItemId.replace("cl-issue-2-wp-", "");
console.log("slug", slug);
if (typeof info.linkUrl === "string") {
await convertToWorkPackage(slug, info.linkUrl);
} else {
console.error("linkUrl is not a string");
}
}
}
});
async function convertToWorkPackage(slug: string, url: string): Promise<void> {
const message = {
type: "Issue2Work",
url: url,
project: slug,
};
try {
const sending: unknown = await browser.runtime.sendNativeMessage("cl_cli", message);
if (isOutputMessageError(sending)) {
console.error("error while handling message", sending.message);
} else if (isOutputMessageSuccess(sending)) {
try {
await browser.tabs.create({
url: sending.data.created,
});
} catch (error) {
console.error("error while creating new tab", error);
}
}
} catch (error) {
console.error("error while handling message", error);
}
}

View File

@@ -0,0 +1,44 @@
export type OutputMessageError = {
result: "Error",
message: string,
}
export type OutputIssue2Work = {
type: "Issue2Work";
created: string;
}
export type OutputMessageSuccess = {
result: 'Ok'
data: OutputIssue2Work;
}
export type OutputMessage = OutputMessageError | OutputMessageSuccess;
export function isOutputMessage(value: unknown): value is OutputMessage {
return isOutputMessageError(value) || isOutputMessageSuccess(value);
}
export function isOutputMessageError(value: unknown): value is OutputMessageError {
return (
typeof value === 'object' &&
value !== null &&
'result' in value &&
value.result === 'Error' &&
'message' in value &&
typeof value.message === 'string'
);
}
export function isOutputMessageSuccess(value: unknown): value is OutputMessageSuccess {
return (
typeof value === 'object' &&
value !== null &&
'result' in value &&
value.result === 'Ok' &&
'data' in value &&
typeof value.data === 'object' &&
value.data !== null
);
}