Compare commits

..

3 Commits

Author SHA1 Message Date
Nivedin
0c170214bf fix: shortcode screen stuck when invalid link 2023-06-19 14:03:54 +05:30
Andrew Bastin
ac42941ab4 chore(ci): add manual workflow dispatch for hoppscotch-ui deploy script 2023-06-19 14:03:54 +05:30
Andrew Bastin
e47b2d2026 chore(ci): re-introduce hoppscotch-ui deploy script 2023-06-19 14:03:54 +05:30
49 changed files with 169 additions and 588 deletions

View File

@@ -31,7 +31,6 @@ MICROSOFT_CLIENT_ID="************************************************"
MICROSOFT_CLIENT_SECRET="************************************************"
MICROSOFT_CALLBACK_URL="http://localhost:3170/v1/auth/microsoft/callback"
MICROSOFT_SCOPE="user.read"
MICROSOFT_TENANT="common"
# Mailer config
MAILER_SMTP_URL="smtps://user@domain.com:pass@smtp.domain.com"

View File

@@ -1,6 +1,6 @@
{
"name": "hoppscotch-backend",
"version": "2023.4.7",
"version": "2023.4.6",
"description": "",
"author": "",
"private": true,

View File

@@ -236,11 +236,11 @@ export class AdminService {
const user = await this.userService.findUserByEmail(userEmail);
if (O.isNone(user)) return E.left(USER_NOT_FOUND);
const teamMember = await this.teamService.getTeamMemberTE(
const isUserAlreadyMember = await this.teamService.getTeamMemberTE(
teamID,
user.value.uid,
)();
if (E.isLeft(teamMember)) {
if (E.left(isUserAlreadyMember)) {
const addedUser = await this.teamService.addMemberToTeamWithEmail(
teamID,
userEmail,
@@ -248,18 +248,6 @@ export class AdminService {
);
if (E.isLeft(addedUser)) return E.left(addedUser.left);
const userInvitation =
await this.teamInvitationService.getTeamInviteByEmailAndTeamID(
userEmail,
teamID,
);
if (E.isRight(userInvitation)) {
await this.teamInvitationService.revokeInvitation(
userInvitation.right.id,
)();
}
return E.right(addedUser.right);
}

View File

@@ -17,7 +17,7 @@ export class MicrosoftStrategy extends PassportStrategy(Strategy) {
clientSecret: process.env.MICROSOFT_CLIENT_SECRET,
callbackURL: process.env.MICROSOFT_CALLBACK_URL,
scope: [process.env.MICROSOFT_SCOPE],
tenant: process.env.MICROSOFT_TENANT,
passReqToCallback: true,
store: true,
});
}

View File

@@ -23,7 +23,7 @@ export const AUTH_FAIL = 'auth/fail';
export const JSON_INVALID = 'json_invalid';
/**
* Tried to delete a user data document from fb firestore but failed.
* Tried to delete an user data document from fb firestore but failed.
* (FirebaseService)
*/
export const USER_FB_DOCUMENT_DELETION_FAILED =
@@ -231,7 +231,7 @@ export const TEAM_COLL_INVALID_JSON = 'team_coll/invalid_json';
export const TEAM_NOT_OWNER = 'team_coll/team_not_owner' as const;
/**
* Tried to perform an action on a request that doesn't accept their member role level
* Tried to perform action on a request that doesn't accept their member role level
* (GqlRequestTeamMemberGuard)
*/
export const TEAM_REQ_NOT_REQUIRED_ROLE = 'team_req/not_required_role';
@@ -262,7 +262,7 @@ export const TEAM_REQ_REORDERING_FAILED = 'team_req/reordering_failed' as const;
export const SENDER_EMAIL_INVALID = 'mailer/sender_email_invalid' as const;
/**
* Tried to perform an action on a request when the user is not even a member of the team
* Tried to perform action on a request when the user is not even member of the team
* (GqlRequestTeamMemberGuard, GqlCollectionTeamMemberGuard)
*/
export const TEAM_REQ_NOT_MEMBER = 'team_req/not_member';
@@ -307,7 +307,7 @@ export const SHORTCODE_INVALID_JSON = 'shortcode/invalid_json' as const;
export const SHORTCODE_ALREADY_EXISTS = 'shortcode/already_exists' as const;
/**
* Invalid or non-existent TEAM ENVIRONMENT ID
* Invalid or non-existent TEAM ENVIRONMMENT ID
* (TeamEnvironmentsService)
*/
export const TEAM_ENVIRONMENT_NOT_FOUND = 'team_environment/not_found' as const;
@@ -340,7 +340,7 @@ export const USER_SETTINGS_NULL_SETTINGS =
'user_settings/null_settings' as const;
/*
* Global environment doesn't exist for the user
* Global environment doesnt exists for the user
* (UserEnvironmentsService)
*/
export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS =

View File

@@ -3,7 +3,6 @@ import * as T from 'fp-ts/Task';
import * as O from 'fp-ts/Option';
import * as TO from 'fp-ts/TaskOption';
import * as TE from 'fp-ts/TaskEither';
import * as E from 'fp-ts/Either';
import { pipe, flow, constVoid } from 'fp-ts/function';
import { PrismaService } from 'src/prisma/prisma.service';
import { Team, TeamMemberRole } from 'src/team/team.model';
@@ -11,7 +10,6 @@ import { Email } from 'src/types/Email';
import { User } from 'src/user/user.model';
import { TeamService } from 'src/team/team.service';
import {
INVALID_EMAIL,
TEAM_INVITE_ALREADY_MEMBER,
TEAM_INVITE_EMAIL_DO_NOT_MATCH,
TEAM_INVITE_MEMBER_HAS_INVITE,
@@ -21,7 +19,6 @@ import { TeamInvitation } from './team-invitation.model';
import { MailerService } from 'src/mailer/mailer.service';
import { UserService } from 'src/user/user.service';
import { PubSubService } from 'src/pubsub/pubsub.service';
import { validateEmail } from '../utils';
@Injectable()
export class TeamInvitationService {
@@ -66,32 +63,6 @@ export class TeamInvitationService {
);
}
/**
* Get the team invite for an invitee with email and teamID.
* @param inviteeEmail invitee email
* @param teamID team id
* @returns an Either of team invitation for the invitee or error
*/
async getTeamInviteByEmailAndTeamID(inviteeEmail: string, teamID: string) {
const isEmailValid = validateEmail(inviteeEmail);
if (!isEmailValid) return E.left(INVALID_EMAIL);
try {
const teamInvite = await this.prisma.teamInvitation.findUniqueOrThrow({
where: {
teamID_inviteeEmail: {
inviteeEmail: inviteeEmail,
teamID: teamID,
},
},
});
return E.right(teamInvite);
} catch (e) {
return E.left(TEAM_INVITE_NO_INVITE_FOUND);
}
}
createInvitation(
creator: User,
team: Team,

View File

@@ -2,7 +2,7 @@ import { HttpStatus } from '@nestjs/common';
/**
** Custom interface to handle errors specific to Auth module
** Since its REST we need to return the HTTP status code along with the error message
** Since its REST we need to return HTTP status code along with error message
*/
export type AuthError = {
message: string;

View File

@@ -5,29 +5,29 @@
"choose_file": "Válasszon egy fájlt",
"clear": "Törlés",
"clear_all": "Összes törlése",
"close": "Bezárás",
"close": "Close",
"connect": "Kapcsolódás",
"connecting": "Kapcsolódás",
"connecting": "Connecting",
"copy": "Másolás",
"delete": "Törlés",
"disconnect": "Leválasztás",
"dismiss": "Eltüntetés",
"dont_save": "Ne mentse",
"download_file": "Fájl letöltése",
"drag_to_reorder": "Húzza az átrendezéshez",
"drag_to_reorder": "Drag to reorder",
"duplicate": "Kettőzés",
"edit": "Szerkesztés",
"filter": "Szűrő",
"filter": "Filter",
"go_back": "Vissza",
"go_forward": "Előre",
"group_by": "Csoportosítás",
"go_forward": "Go forward",
"group_by": "Group by",
"label": "Címke",
"learn_more": "Tudjon meg többet",
"less": "Kevesebb",
"more": "Több",
"new": "Új",
"no": "Nem",
"open_workspace": "Munkaterület megnyitása",
"open_workspace": "Open workspace",
"paste": "Beillesztés",
"prettify": "Csinosítás",
"remove": "Eltávolítás",
@@ -38,7 +38,7 @@
"search": "Keresés",
"send": "Küldés",
"start": "Indítás",
"starting": "Indítás",
"starting": "Starting",
"stop": "Leállítás",
"to_close": "a bezáráshoz",
"to_navigate": "a navigáláshoz",
@@ -118,16 +118,16 @@
},
"collection": {
"created": "Gyűjtemény létrehozva",
"different_parent": "Nem lehet átrendezni a különböző szülővel rendelkező gyűjteményt",
"different_parent": "Cannot reorder collection with different parent",
"edit": "Gyűjtemény szerkesztése",
"invalid_name": "Adjon nevet a gyűjteménynek",
"invalid_root_move": "A gyűjtemény már a gyökérben van",
"moved": "Sikeresen áthelyezve",
"invalid_root_move": "Collection already in the root",
"moved": "Moved Successfully",
"my_collections": "Saját gyűjtemények",
"name": "Saját új gyűjtemény",
"name_length_insufficient": "A gyűjtemény nevének legalább 3 karakter hosszúságúnak kell lennie",
"new": "Új gyűjtemény",
"order_changed": "Gyűjtemény sorrendje frissítve",
"order_changed": "Collection Order Updated",
"renamed": "Gyűjtemény átnevezve",
"request_in_use": "A kérés használatban",
"save_as": "Mentés másként",
@@ -147,7 +147,7 @@
"remove_team": "Biztosan törölni szeretné ezt a csapatot?",
"remove_telemetry": "Biztosan ki szeretné kapcsolni a telemetriát?",
"request_change": "Biztosan el szeretné vetni a jelenlegi kérést? Minden mentetlen változtatás el fog veszni.",
"save_unsaved_tab": "Szeretné menteni az ezen a lapon elvégzett változtatásokat?",
"save_unsaved_tab": "Do you want to save changes made in this tab?",
"sync": "Szeretné visszaállítani a munkaterületét a felhőből? Ez el fogja vetni a helyi folyamatát."
},
"count": {
@@ -180,8 +180,8 @@
"profile": "Jelentkezzen be a profilja megtekintéséhez",
"protocols": "A protokollok üresek",
"schema": "Kapcsolódjon egy GraphQL-végponthoz a séma megtekintéséhez",
"shortcodes": "A rövid kódok üresek",
"subscription": "A feliratkozások üresek",
"shortcodes": "Shortcodes are empty",
"subscription": "Subscriptions are empty",
"team_name": "A csapat neve üres",
"teams": "Ön nem tartozik semmilyen csapathoz",
"tests": "Nincsenek tesztek ehhez a kéréshez"
@@ -194,13 +194,13 @@
"deleted": "Környezet törlése",
"edit": "Környezet szerkesztése",
"invalid_name": "Adjon nevet a környezetnek",
"my_environments": "Saját környezetek",
"my_environments": "My Environments",
"nested_overflow": "az egymásba ágyazott környezeti változók 10 szintre vannak korlátozva",
"new": "Új környezet",
"no_environment": "Nincs környezet",
"no_environment_description": "Nem lettek környezetek kiválasztva. Válassza ki, hogy mit kell tenni a következő változókkal.",
"select": "Környezet kiválasztása",
"team_environments": "Csapatkörnyezetek",
"team_environments": "Team Environments",
"title": "Környezetek",
"updated": "Környezet frissítve",
"variable_list": "Változólista"
@@ -209,9 +209,9 @@
"browser_support_sse": "Úgy tűnik, hogy ez a böngésző nem támogatja a kiszolgáló által küldött eseményeket.",
"check_console_details": "Nézze meg a konzolnaplót a részletekért.",
"curl_invalid_format": "A cURL nincs megfelelően formázva",
"danger_zone": "Veszélyes zóna",
"delete_account": "Az Ön fiókja jelenleg tulajdonos ezekben a csapatokban:",
"delete_account_description": "El kell távolítani magát, át kell adnia a tulajdonjogot vagy törölnie kell ezeket a csapatokat, mielőtt törölhetné a fiókját.",
"danger_zone": "Danger zone",
"delete_account": "Your account is currently an owner in these teams:",
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.",
"empty_req_name": "Üres kérésnév",
"f12_details": "(F12 a részletekért)",
"gql_prettify_invalid_query": "Nem sikerült csinosítani egy érvénytelen lekérdezést, oldja meg a lekérdezés szintaktikai hibáit, és próbálja újra",
@@ -219,13 +219,13 @@
"incorrect_email": "Hibás e-mail",
"invalid_link": "Érvénytelen hivatkozás",
"invalid_link_description": "A kattintott hivatkozás érvénytelen vagy lejárt.",
"json_parsing_failed": "Érvénytelen JSON",
"json_parsing_failed": "Invalid JSON",
"json_prettify_invalid_body": "Nem sikerült csinosítani egy érvénytelen törzset, oldja meg a JSON szintaktikai hibáit, és próbálja újra",
"network_error": "Úgy tűnik, hogy hálózati hiba van. Próbálja újra.",
"network_fail": "Nem sikerült elküldeni a kérést",
"no_duration": "Nincs időtartam",
"no_results_found": "Nincs találat",
"page_not_found": "Ez az oldal nem található",
"no_results_found": "No matches found",
"page_not_found": "This page could not be found",
"script_fail": "Nem sikerült végrehajtani a kérés előtti parancsfájlt",
"something_went_wrong": "Valami elromlott",
"test_script_fail": "Nem sikerült végrehajtani a kérés utáni parancsfájlt"
@@ -238,9 +238,9 @@
"title": "Exportálás"
},
"filter": {
"all": "Összes",
"none": "Nincs",
"starred": "Csillagozott"
"all": "All",
"none": "None",
"starred": "Starred"
},
"folder": {
"created": "Mappa létrehozva",
@@ -256,7 +256,7 @@
"subscriptions": "Feliratkozások"
},
"group": {
"time": "Idő",
"time": "Time",
"url": "URL"
},
"header": {
@@ -316,32 +316,32 @@
"zen_mode": "Zen mód"
},
"modal": {
"close_unsaved_tab": "Elmentetlen változtatásai vannak",
"close_unsaved_tab": "You have unsaved changes",
"collections": "Gyűjtemények",
"confirm": "Megerősítés",
"edit_request": "Kérés szerkesztése",
"import_export": "Importálás és exportálás"
},
"mqtt": {
"already_subscribed": "Ön már feliratkozott erre a témára.",
"clean_session": "Munkamenet törlése",
"clear_input": "Bevitel törlése",
"clear_input_on_send": "Bevitel törlése küldéskor",
"client_id": "Ügyfél-azonosító",
"color": "Válasszon színt",
"already_subscribed": "You are already subscribed to this topic.",
"clean_session": "Clean Session",
"clear_input": "Clear input",
"clear_input_on_send": "Clear input on send",
"client_id": "Client ID",
"color": "Pick a color",
"communication": "Kommunikáció",
"connection_config": "Kapcsolat beállításai",
"connection_not_authorized": "Ez az MQTT-kapcsolat nem használ semmilyen hitelesítést.",
"invalid_topic": "Adjon témát a feliratkozáshoz",
"keep_alive": "Életben tartás",
"connection_config": "Connection Config",
"connection_not_authorized": "This MQTT connection does not use any authentication.",
"invalid_topic": "Please provide a topic for the subscription",
"keep_alive": "Keep Alive",
"log": "Napló",
"lw_message": "Utolsó kívánság üzenet",
"lw_qos": "Utolsó kívánság QoS",
"lw_retain": "Utolsó kívánság megtartás",
"lw_topic": "Utolsó kívánság téma",
"lw_message": "Last-Will Message",
"lw_qos": "Last-Will QoS",
"lw_retain": "Last-Will Retain",
"lw_topic": "Last-Will Topic",
"message": "Üzenet",
"new": "Új feliratkozás",
"not_connected": "Először indítson egy MQTT-kapcsolatot.",
"new": "New Subscription",
"not_connected": "Please start a MQTT connection first.",
"publish": "Közzététel",
"qos": "QoS",
"ssl": "SSL",
@@ -368,7 +368,7 @@
},
"profile": {
"app_settings": "Alkalmazás beállításai",
"default_hopp_displayname": "Névtelen felhasználó",
"default_hopp_displayname": "Unnamed User",
"editor": "Szerkesztő",
"editor_description": "A szerkesztők hozzáadhatnak, szerkeszthetnek és törölhetnek kéréseket.",
"email_verification_mail": "Egy ellenőrző e-mail el lett küldve az e-mail-címére. Kattintson a hivatkozásra az e-mail-címe ellenőrzéséhez.",
@@ -391,26 +391,26 @@
"choose_language": "Nyelv kiválasztása",
"content_type": "Tartalom típusa",
"content_type_titles": {
"others": "Egyebek",
"structured": "Szerkesztett",
"text": "Szöveg"
"others": "Others",
"structured": "Structured",
"text": "Text"
},
"copy_link": "Hivatkozás másolása",
"different_collection": "Nem lehet átrendezni a különböző gyűjteményekből érkező kéréseket",
"duplicated": "Kérés megkettőzve",
"different_collection": "Cannot reorder requests from different collections",
"duplicated": "Request duplicated",
"duration": "Időtartam",
"enter_curl": "cURL-parancs megadása",
"enter_curl": "cURL megadása",
"generate_code": "Kód előállítása",
"generated_code": "Előállított kód",
"header_list": "Fejléclista",
"invalid_name": "Adjon nevet a kérésnek",
"method": "Módszer",
"moved": "Kérés áthelyezve",
"moved": "Request moved",
"name": "Kérés neve",
"new": "Új kérés",
"order_changed": "Kérés sorrendje frissítve",
"order_changed": "Request Order Updated",
"override": "Felülbírálás",
"override_help": "<kbd>Content-Type</kbd> beállítása a fejlécekben",
"override_help": "A <kbd>Content-Type</kbd> beállítása a fejlécekben",
"overriden": "Felülbírálva",
"parameter_list": "Lekérdezési paraméterek",
"parameters": "Paraméterek",
@@ -429,12 +429,12 @@
"type": "Kérés típusa",
"url": "URL",
"variables": "Változók",
"view_my_links": "Saját hivatkozások megtekintése"
"view_my_links": "View my links"
},
"response": {
"audio": "Hang",
"audio": "Audio",
"body": "Válasz törzse",
"filter_response_body": "JSON-válasz törzsének szűrése (JSONPath szintaxist használ)",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
"headers": "Fejlécek",
"html": "HTML",
"image": "Kép",
@@ -446,14 +446,14 @@
"status": "Állapot",
"time": "Idő",
"title": "Válasz",
"video": "Videó",
"video": "Video",
"waiting_for_connection": "várakozás kapcsolódásra",
"xml": "XML"
},
"settings": {
"accent_color": "Kiemelőszín",
"account": "Fiók",
"account_deleted": "A fiókja törölve lett",
"account_deleted": "Your account has been deleted",
"account_description": "A fiókbeállítások személyre szabása.",
"account_email_description": "Az Ön elsődleges e-mail-címe.",
"account_name_description": "Ez a megjelenített neve.",
@@ -462,8 +462,8 @@
"change_font_size": "Betűméret megváltoztatása",
"choose_language": "Nyelv kiválasztása",
"dark_mode": "Sötét",
"delete_account": "Fiók törlése",
"delete_account_description": "Ha törli a fiókját, akkor az összes adata véglegesen törlésre kerül. Ezt a műveletet nem lehet visszavonni.",
"delete_account": "Delete account",
"delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.",
"expand_navigation": "Navigáció kinyitása",
"experiments": "Kísérletek",
"experiments_notice": "Ez olyan kísérletek gyűjteménye, amelyeken dolgozunk, és amelyek hasznosak, szórakoztatóak lehetnek, mindkettő, vagy egyik sem. Ezek nem véglegesek és nem stabilak, ezért ha valami túl furcsa dolog történik, ne essen pánikba. Egyszerűen kapcsolja ki a hibás dolgot. Viccet félretéve, ",
@@ -490,8 +490,8 @@
"proxy_use_toggle": "A proxy középprogram használata a kérések küldéséhez",
"read_the": "Olvassa el:",
"reset_default": "Visszaállítás az alapértelmezettre",
"short_codes": "Rövid kódok",
"short_codes_description": "Az Ön által létrehozott rövid kódok.",
"short_codes": "Short codes",
"short_codes_description": "Short codes which were created by you.",
"sidebar_on_left": "Oldalsáv a bal oldalon",
"sync": "Szinkronizálás",
"sync_collections": "Gyűjtemények",
@@ -505,16 +505,16 @@
"theme_description": "Az alkalmazás témájának személyre szabása.",
"use_experimental_url_bar": "Kísérleti URL-sáv használata a környezet kiemelésével",
"user": "Felhasználó",
"verified_email": "Ellenőrzött e-mail-cím",
"verified_email": "Verified email",
"verify_email": "E-mail-cím ellenőrzése"
},
"shortcodes": {
"actions": "Műveletek",
"created_on": "Létrehozva",
"deleted": "Rövid kód törölve",
"method": "Módszer",
"not_found": "A rövid kód nem található",
"short_code": "Rövid kód",
"actions": "Actions",
"created_on": "Created on",
"deleted": "Shortcode deleted",
"method": "Method",
"not_found": "Shortcode not found",
"short_code": "Short code",
"url": "URL"
},
"shortcut": {
@@ -556,9 +556,9 @@
"title": "Kérés"
},
"response": {
"copy": "Válasz másolása a vágólapra",
"download": "Válasz letöltés fájlként",
"title": "Válasz"
"copy": "Copy response to clipboard",
"download": "Download response as file",
"title": "Response"
},
"theme": {
"black": "Téma átváltása fekete módra",
@@ -576,8 +576,8 @@
},
"socketio": {
"communication": "Kommunikáció",
"connection_not_authorized": "Ez a SocketIO-kapcsolat nem használ semmilyen hitelesítést.",
"event_name": "Esemény vagy téma neve",
"connection_not_authorized": "This SocketIO connection does not use any authentication.",
"event_name": "Esemény neve",
"events": "Események",
"log": "Napló",
"url": "URL"
@@ -594,9 +594,9 @@
"connected": "Kapcsolódva",
"connected_to": "Kapcsolódva ehhez: {name}",
"connecting_to": "Kapcsolódás ehhez: {name}…",
"connection_error": "Nem sikerült kapcsolódni",
"connection_failed": "A kapcsolódás sikertelen",
"connection_lost": "A kapcsolat elveszett",
"connection_error": "Failed to connect",
"connection_failed": "Connection failed",
"connection_lost": "Connection lost",
"copied_to_clipboard": "Vágólapra másolva",
"deleted": "Törölve",
"deprecated": "ELAVULT",
@@ -611,17 +611,17 @@
"history_deleted": "Előzmények törölve",
"linewrap": "Sorok tördelése",
"loading": "Betöltés…",
"message_received": "Üzenet: {message} érkezett ehhez a témához: {topic}",
"mqtt_subscription_failed": "Valami elromlott a következő témára való feliratkozás során: {topic}",
"message_received": "Message: {message} arrived on topic: {topic}",
"mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}",
"none": "Nincs",
"nothing_found": "Semmi sem található ehhez:",
"published_error": "Valami elromlott a következő üzenet közzététele során: {topic}, ehhez a témához: {message}",
"published_message": "Közzétett üzenet: {message}, ehhez a témához: {topic}",
"reconnection_error": "Nem sikerült újrakapcsolódni",
"subscribed_failed": "Nem sikerült feliratkozni erre a témára: {topic}",
"subscribed_success": "Sikeresen feliratkozott erre a témára: {topic}",
"unsubscribed_failed": "Nem sikerült leiratkozni erről a témáról: {topic}",
"unsubscribed_success": "Sikeresen leiratkozott erről a témáról: {topic}",
"published_error": "Something went wrong while publishing msg: {topic} to topic: {message}",
"published_message": "Published message: {message} to topic: {topic}",
"reconnection_error": "Failed to reconnect",
"subscribed_failed": "Failed to subscribe to topic: {topic}",
"subscribed_success": "Successfully subscribed to topic: {topic}",
"unsubscribed_failed": "Failed to unsubscribe from topic: {topic}",
"unsubscribed_success": "Successfully unsubscribed from topic: {topic}",
"waiting_send_request": "Várakozás a kérés elküldésére"
},
"support": {
@@ -641,7 +641,7 @@
"body": "Törzs",
"collections": "Gyűjtemények",
"documentation": "Dokumentáció",
"environments": "Környezetek",
"environments": "Environments",
"headers": "Fejlécek",
"history": "Előzmények",
"mqtt": "MQTT",
@@ -666,7 +666,7 @@
"email_do_not_match": "Az e-mail-cím nem egyezik a fiókja részleteivel. Vegye fel a kapcsolatot a csapat tulajdonosával.",
"exit": "Kilépés a csapatból",
"exit_disabled": "Csak a tulajdonos nem léphet ki a csapatból",
"invalid_coll_id": "Érvénytelen gyűjteményazonosító",
"invalid_coll_id": "Invalid collection ID",
"invalid_email_format": "Az e-mail formátuma érvénytelen",
"invalid_id": "Érvénytelen csapatazonosító. Vegye fel a kapcsolatot a csapat tulajdonosával.",
"invalid_invite_link": "Érvénytelen meghívási hivatkozás",
@@ -690,7 +690,7 @@
"member_removed": "Felhasználó eltávolítva",
"member_role_updated": "Felhasználói szerepek frissítve",
"members": "Tagok",
"more_members": "+{count} további",
"more_members": "+{count} more",
"name_length_insufficient": "A csapat nevének legalább 6 karakter hosszúságúnak kell lennie",
"name_updated": "Csapatnév frissítve",
"new": "Új csapat",
@@ -698,13 +698,13 @@
"new_name": "Saját új csapat",
"no_access": "Nincs szerkesztési jogosultsága ezekhez a gyűjteményekhez",
"no_invite_found": "A meghívás nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
"no_request_found": "A kérés nem található.",
"no_request_found": "Request not found.",
"not_found": "A csapat nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
"not_valid_viewer": "Ön nem érvényes megtekintő. Vegye fel a kapcsolatot a csapat tulajdonosával.",
"parent_coll_move": "Nem lehet áthelyezni a gyűjteményt egy gyermekgyűjteménybe",
"parent_coll_move": "Cannot move collection to a child collection",
"pending_invites": "Függőben lévő meghívások",
"permissions": "Jogosultságok",
"same_target_destination": "Ugyanaz a cél és célhely",
"same_target_destination": "Same target and destination",
"saved": "Csapat elmentve",
"select_a_team": "Csapat kiválasztása",
"title": "Csapatok",
@@ -712,9 +712,9 @@
"we_sent_invite_link_description": "Kérje meg az összes meghívottat, hogy nézzék meg a beérkező leveleiket. Kattintsanak a hivatkozásra a csapathoz való csatlakozáshoz."
},
"team_environment": {
"deleted": "Környezet törölve",
"duplicate": "Környezet megkettőzve",
"not_found": "A környezet nem található."
"deleted": "Environment Deleted",
"duplicate": "Environment Duplicated",
"not_found": "Environment not found."
},
"test": {
"failed": "teszt sikertelen",
@@ -734,9 +734,9 @@
"url": "URL"
},
"workspace": {
"change": "Munkaterület váltása",
"personal": "Saját munkaterület",
"team": "Csapat-munkaterület",
"title": "Munkaterületek"
"change": "Change workspace",
"personal": "My Workspace",
"team": "Team Workspace",
"title": "Workspaces"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@hoppscotch/common",
"private": true,
"version": "2023.4.7",
"version": "2023.4.6",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",
"dev:vite": "vite",

View File

@@ -86,7 +86,6 @@ declare module '@vue/runtime-core' {
HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink']
HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal']
HoppSmartPicture: typeof import('@hoppscotch/ui')['HoppSmartPicture']
HoppSmartPlaceholder: typeof import('@hoppscotch/ui')['HoppSmartPlaceholder']
HoppSmartProgressRing: typeof import('@hoppscotch/ui')['HoppSmartProgressRing']
HoppSmartRadioGroup: typeof import('@hoppscotch/ui')['HoppSmartRadioGroup']
HoppSmartSlideOver: typeof import('@hoppscotch/ui')['HoppSmartSlideOver']

View File

@@ -44,9 +44,8 @@
class="flex flex-col items-center justify-center p-4 text-secondaryLight"
>
<icon-lucide-search class="pb-2 opacity-75 svg-icons" />
<span class="my-2 text-center flex flex-col">
{{ t("state.nothing_found") }}
<span class="break-all">"{{ filterText }}"</span>
<span class="my-2 text-center">
{{ t("state.nothing_found") }} "{{ filterText }}"
</span>
</div>
</div>

View File

@@ -284,14 +284,6 @@ const importerAction = async (stepResults: StepReturnValue[]) => {
emit("import-to-teams", result)
} else {
appendRESTCollections(result)
platform.analytics?.logEvent({
type: "HOPP_IMPORT_COLLECTION",
importer: importerModule.value!.name,
platform: "rest",
workspaceType: "personal",
})
fileImported()
}
}

View File

@@ -1,5 +1,5 @@
<template>
<div class="flex flex-col flex-1">
<div class="flex flex-col flex-1 bg-primary">
<div
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
:style="

View File

@@ -89,7 +89,6 @@ import {
import { GQLError } from "~/helpers/backend/GQLClient"
import { computedWithControl } from "@vueuse/core"
import { currentActiveTab } from "~/helpers/rest/tab"
import { platform } from "~/platform"
const t = useI18n()
const toast = useToast()
@@ -224,13 +223,6 @@ const saveRequestAs = async () => {
},
}
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "rest",
workspaceType: "personal",
})
requestSaved()
} else if (picked.value.pickedType === "my-folder") {
if (!isHoppRESTRequest(requestUpdated))
@@ -251,13 +243,6 @@ const saveRequestAs = async () => {
},
}
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "rest",
workspaceType: "personal",
})
requestSaved()
} else if (picked.value.pickedType === "my-request") {
if (!isHoppRESTRequest(requestUpdated))
@@ -279,38 +264,17 @@ const saveRequestAs = async () => {
},
}
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: false,
platform: "rest",
workspaceType: "personal",
})
requestSaved()
} else if (picked.value.pickedType === "teams-collection") {
if (!isHoppRESTRequest(requestUpdated))
throw new Error("requestUpdated is not a REST Request")
updateTeamCollectionOrFolder(picked.value.collectionID, requestUpdated)
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "rest",
workspaceType: "team",
})
} else if (picked.value.pickedType === "teams-folder") {
if (!isHoppRESTRequest(requestUpdated))
throw new Error("requestUpdated is not a REST Request")
updateTeamCollectionOrFolder(picked.value.folderID, requestUpdated)
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "rest",
workspaceType: "team",
})
} else if (picked.value.pickedType === "teams-request") {
if (!isHoppRESTRequest(requestUpdated))
throw new Error("requestUpdated is not a REST Request")
@@ -328,13 +292,6 @@ const saveRequestAs = async () => {
title: requestUpdated.name,
}
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: false,
platform: "rest",
workspaceType: "team",
})
pipe(
updateTeamRequest(picked.value.requestID, data),
TE.match(
@@ -356,13 +313,6 @@ const saveRequestAs = async () => {
requestUpdated as HoppGQLRequest
)
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: false,
platform: "gql",
workspaceType: "team",
})
requestSaved()
} else if (picked.value.pickedType === "gql-my-folder") {
// TODO: Check for GQL request ?
@@ -371,13 +321,6 @@ const saveRequestAs = async () => {
requestUpdated as HoppGQLRequest
)
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "gql",
workspaceType: "team",
})
requestSaved()
} else if (picked.value.pickedType === "gql-my-collection") {
// TODO: Check for GQL request ?
@@ -386,13 +329,6 @@ const saveRequestAs = async () => {
requestUpdated as HoppGQLRequest
)
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
createdNow: true,
platform: "gql",
workspaceType: "team",
})
requestSaved()
}
}

View File

@@ -1,5 +1,5 @@
<template>
<div class="flex flex-col flex-1">
<div class="flex flex-col flex-1 bg-primary">
<div
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
:style="

View File

@@ -46,7 +46,6 @@ import { useToast } from "@composables/toast"
import { useI18n } from "@composables/i18n"
import { HoppGQLRequest, makeCollection } from "@hoppscotch/data"
import { addGraphqlCollection } from "~/newstore/collections"
import { platform } from "~/platform"
export default defineComponent({
props: {
@@ -80,13 +79,6 @@ export default defineComponent({
)
this.hideModal()
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
isRootCollection: true,
platform: "gql",
workspaceType: "personal",
})
},
hideModal() {
this.name = null

View File

@@ -244,14 +244,6 @@ const importFromJSON = () => {
return
}
appendGraphqlCollections(collections)
platform.analytics?.logEvent({
type: "HOPP_IMPORT_COLLECTION",
importer: "json",
workspaceType: "personal",
platform: "gql",
})
fileImported()
}
reader.readAsText(inputChooseFileToImportFrom.value.files[0])
@@ -265,12 +257,6 @@ const exportJSON = () => {
const url = URL.createObjectURL(file)
a.href = url
platform?.analytics?.logEvent({
type: "HOPP_EXPORT_COLLECTION",
exporter: "json",
platform: "gql",
})
// TODO: get uri from meta
a.download = `${url.split("/").pop()!.split("#")[0].split("?")[0]}.json`
document.body.appendChild(a)

View File

@@ -153,7 +153,6 @@ import IconArchive from "~icons/lucide/archive"
import { useI18n } from "@composables/i18n"
import { useReadonlyStream } from "@composables/stream"
import { useColorMode } from "@composables/theming"
import { platform } from "~/platform"
export default defineComponent({
props: {
@@ -286,13 +285,6 @@ export default defineComponent({
response: "",
})
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
platform: "gql",
createdNow: true,
workspaceType: "personal",
})
this.displayModalAddRequest(false)
},
addRequest(payload) {
@@ -302,14 +294,6 @@ export default defineComponent({
},
onAddFolder({ name, path }) {
addGraphqlFolder(name, path)
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
isRootCollection: false,
platform: "gql",
workspaceType: "personal",
})
this.displayModalAddFolder(false)
},
addFolder(payload) {

View File

@@ -599,25 +599,11 @@ const addNewRootCollection = (name: string) => {
})
)
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
platform: "rest",
workspaceType: "personal",
isRootCollection: true,
})
displayModalAdd(false)
} else if (hasTeamWriteAccess.value) {
if (!collectionsType.value.selectedTeam) return
modalLoadingState.value = true
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
platform: "rest",
workspaceType: "team",
isRootCollection: true,
})
pipe(
createNewRootCollection(name, collectionsType.value.selectedTeam.id),
TE.match(
@@ -666,13 +652,6 @@ const onAddRequest = (requestName: string) => {
},
})
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
workspaceType: "personal",
createdNow: true,
platform: "rest",
})
displayModalAddRequest(false)
} else if (hasTeamWriteAccess.value) {
const folder = editingFolder.value
@@ -688,13 +667,6 @@ const onAddRequest = (requestName: string) => {
title: requestName,
}
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
workspaceType: "team",
platform: "rest",
createdNow: true,
})
pipe(
createRequestInCollection(folder.id, data),
TE.match(
@@ -740,14 +712,6 @@ const onAddFolder = (folderName: string) => {
if (collectionsType.value.type === "my-collections") {
if (!path) return
addRESTFolder(folderName, path)
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
workspaceType: "personal",
isRootCollection: false,
platform: "rest",
})
displayModalAddFolder(false)
} else if (hasTeamWriteAccess.value) {
const folder = editingFolder.value
@@ -755,13 +719,6 @@ const onAddFolder = (folderName: string) => {
modalLoadingState.value = true
platform.analytics?.logEvent({
type: "HOPP_CREATE_COLLECTION",
workspaceType: "personal",
isRootCollection: false,
platform: "rest",
})
pipe(
createChildCollection(folderName, folder.id),
TE.match(
@@ -1927,12 +1884,6 @@ const exportData = async (
}
const exportJSONCollection = async () => {
platform.analytics?.logEvent({
type: "HOPP_EXPORT_COLLECTION",
exporter: "json",
platform: "rest",
})
await getJSONCollection()
initializeDownloadCollection(collectionJSON.value, null)
@@ -1944,12 +1895,6 @@ const createCollectionGist = async () => {
return
}
platform.analytics?.logEvent({
type: "HOPP_EXPORT_COLLECTION",
exporter: "gist",
platform: "rest",
})
creatingGistCollection.value = true
await getJSONCollection()
@@ -1980,12 +1925,6 @@ const importToTeams = async (collection: HoppCollection<HoppRESTRequest>[]) => {
importingMyCollections.value = true
platform.analytics?.logEvent({
type: "HOPP_EXPORT_COLLECTION",
exporter: "import-to-teams",
platform: "rest",
})
pipe(
importJSONToTeam(
JSON.stringify(collection),

View File

@@ -190,12 +190,6 @@ const createEnvironmentGist = async () => {
)
toast.success(t("export.gist_created").toString())
platform.analytics?.logEvent({
type: "HOPP_EXPORT_ENVIRONMENT",
platform: "rest",
})
window.open(res.data.html_url)
} catch (e) {
toast.error(t("error.something_went_wrong").toString())
@@ -255,13 +249,6 @@ const openDialogChooseFileToImportFrom = () => {
const importToTeams = async (content: Environment[]) => {
loading.value = true
platform.analytics?.logEvent({
type: "HOPP_IMPORT_ENVIRONMENT",
platform: "rest",
workspaceType: "team",
})
for (const [i, env] of content.entries()) {
if (i === content.length - 1) {
await pipe(
@@ -314,12 +301,6 @@ const importFromJSON = () => {
return
}
platform.analytics?.logEvent({
type: "HOPP_IMPORT_ENVIRONMENT",
platform: "rest",
workspaceType: "personal",
})
const reader = new FileReader()
reader.onload = ({ target }) => {
@@ -371,7 +352,6 @@ const importFromPostman = ({
const environment: Environment = { name, variables: [] }
values.forEach(({ key, value }) => environment.variables.push({ key, value }))
const environments = [environment]
importFromHoppscotch(environments)
}

View File

@@ -148,7 +148,6 @@ import { useToast } from "@composables/toast"
import { useReadonlyStream } from "@composables/stream"
import { useColorMode } from "@composables/theming"
import { environmentsStore } from "~/newstore/environments"
import { platform } from "~/platform"
type EnvironmentVariable = {
id: number
@@ -312,11 +311,6 @@ const saveEnvironment = () => {
index: envList.value.length - 1,
})
toast.success(`${t("environment.created")}`)
platform.analytics?.logEvent({
type: "HOPP_CREATE_ENVIRONMENT",
workspaceType: "personal",
})
} else if (props.editingEnvironmentIndex === "Global") {
// Editing the Global environment
setGlobalEnvVariables(environmentUpdated.variables)

View File

@@ -156,7 +156,6 @@ import IconTrash from "~icons/lucide/trash"
import IconTrash2 from "~icons/lucide/trash-2"
import IconDone from "~icons/lucide/check"
import IconPlus from "~icons/lucide/plus"
import { platform } from "~/platform"
type EnvironmentVariable = {
id: number
@@ -295,11 +294,6 @@ const saveEnvironment = async () => {
)
if (props.action === "new") {
platform.analytics?.logEvent({
type: "HOPP_CREATE_ENVIRONMENT",
workspaceType: "team",
})
await pipe(
createTeamEnvironment(
JSON.stringify(filterdVariables),

View File

@@ -143,51 +143,33 @@
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="basicUsername"
:environment-highlights="false"
:placeholder="t('authorization.username')"
/>
</div>
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="basicPassword"
:environment-highlights="false"
:placeholder="t('authorization.password')"
/>
</div>
</div>
<div v-if="authType === 'bearer'">
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="bearerToken"
:environment-highlights="false"
placeholder="Token"
/>
<SmartEnvInput v-model="bearerToken" placeholder="Token" />
</div>
</div>
<div v-if="authType === 'oauth-2'">
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="oauth2Token"
:environment-highlights="false"
placeholder="Token"
/>
<SmartEnvInput v-model="oauth2Token" placeholder="Token" />
</div>
<HttpOAuth2Authorization />
</div>
<div v-if="authType === 'api-key'">
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="apiKey"
:environment-highlights="false"
placeholder="Key"
/>
<SmartEnvInput v-model="apiKey" placeholder="Key" />
</div>
<div class="flex flex-1 border-b border-dividerLight">
<SmartEnvInput
v-model="apiValue"
:environment-highlights="false"
placeholder="Value"
/>
<SmartEnvInput v-model="apiValue" placeholder="Value" />
</div>
<div class="flex items-center border-b border-dividerLight">
<span class="flex items-center">

View File

@@ -17,7 +17,6 @@
<HoppButtonPrimary
id="get"
name="get"
:loading="isLoading"
:label="!connected ? t('action.connect') : t('action.disconnect')"
class="w-32"
@click="onConnectClick"
@@ -32,12 +31,7 @@ import { GQLConnection } from "~/helpers/GQLConnection"
import { getCurrentStrategyID } from "~/helpers/network"
import { useReadonlyStream, useStream } from "@composables/stream"
import { useI18n } from "@composables/i18n"
import {
gqlAuth$,
gqlHeaders$,
gqlURL$,
setGQLURL,
} from "~/newstore/GQLSession"
import { gqlHeaders$, gqlURL$, setGQLURL } from "~/newstore/GQLSession"
const t = useI18n()
@@ -46,21 +40,15 @@ const props = defineProps<{
}>()
const connected = useReadonlyStream(props.conn.connected$, false)
const isLoading = useReadonlyStream(props.conn.isLoading$, false)
const headers = useReadonlyStream(gqlHeaders$, [])
const auth = useReadonlyStream(gqlAuth$, {
authType: "none",
authActive: true,
})
const url = useStream(gqlURL$, "", setGQLURL)
const onConnectClick = () => {
if (!connected.value) {
props.conn.connect(url.value, headers.value as any, auth.value)
props.conn.connect(url.value, headers.value as any)
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "graphql-schema",
strategy: getCurrentStrategyID(),
})

View File

@@ -748,8 +748,7 @@ const runQuery = async () => {
console.error(e)
}
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "graphql-query",
strategy: getCurrentStrategyID(),
})

View File

@@ -72,11 +72,9 @@
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
>
<span
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary truncate"
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary"
>
<icon-lucide-chevron-right
class="mr-2 indicator flex flex-shrink-0"
/>
<icon-lucide-chevron-right class="mr-2 indicator" />
<span
:class="[
{ 'capitalize-first': groupSelection === 'TIME' },

View File

@@ -165,7 +165,6 @@ import IconCheck from "~icons/lucide/check"
import IconWrapText from "~icons/lucide/wrap-text"
import { currentActiveTab } from "~/helpers/rest/tab"
import cloneDeep from "lodash-es/cloneDeep"
import { platform } from "~/platform"
const t = useI18n()
@@ -249,10 +248,6 @@ watch(
(goingToShow) => {
if (goingToShow) {
request.value = cloneDeep(currentActiveTab.value.document.request)
platform.analytics?.logEvent({
type: "HOPP_REST_CODEGEN_OPENED",
})
}
}
)

View File

@@ -338,7 +338,7 @@ watch(workingHeaders, (headersList) => {
// Sync logic between headers and working/bulk headers
watch(
() => request.value.headers,
request.value.headers,
(newHeadersList) => {
// Sync should overwrite working headers
const filteredWorkingHeaders = pipe(

View File

@@ -94,7 +94,6 @@ import IconClipboard from "~icons/lucide/clipboard"
import IconCheck from "~icons/lucide/check"
import IconTrash2 from "~icons/lucide/trash-2"
import { currentActiveTab } from "~/helpers/rest/tab"
import { platform } from "~/platform"
const t = useI18n()
@@ -145,10 +144,6 @@ const handleImport = () => {
try {
const req = parseCurlToHoppRESTReq(text)
platform.analytics?.logEvent({
type: "HOPP_REST_IMPORT_CURL",
})
currentActiveTab.value.document.request = req
} catch (e) {
console.error(e)

View File

@@ -324,8 +324,7 @@ const newSendRequest = async () => {
loading.value = true
// Log the request run into analytics
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "rest",
strategy: getCurrentStrategyID(),
})
@@ -447,11 +446,6 @@ const copyRequest = async () => {
shareLink.value = ""
fetchingShareLink.value = true
const shortcodeResult = await createShortcode(tab.value.document.request)()
platform.analytics?.logEvent({
type: "HOPP_SHORTCODE_CREATED",
})
if (E.isLeft(shortcodeResult)) {
toast.error(`${shortcodeResult.left.error}`)
shareLink.value = `${t("error.something_went_wrong")}`
@@ -522,14 +516,6 @@ const saveRequest = () => {
editRESTRequest(saveCtx.folderPath, saveCtx.requestIndex, req)
tab.value.document.isDirty = false
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
platform: "rest",
createdNow: false,
workspaceType: "personal",
})
toast.success(`${t("request.saved")}`)
} catch (e) {
tab.value.document.saveContext = undefined
@@ -540,13 +526,6 @@ const saveRequest = () => {
// TODO: handle error case (NOTE: overwriteRequestTeams is async)
try {
platform.analytics?.logEvent({
type: "HOPP_SAVE_REQUEST",
platform: "rest",
createdNow: false,
workspaceType: "team",
})
runMutation(UpdateRequestDocument, {
requestID: saveCtx.requestID,
data: {

View File

@@ -54,8 +54,7 @@
<script setup lang="ts">
import { useI18n } from "@composables/i18n"
import { HoppRESTRequest } from "@hoppscotch/data"
import { useVModel } from "@vueuse/core"
import { computed, ref } from "vue"
import { computed, ref, watch } from "vue"
export type RequestOptionTabs =
| "params"
@@ -71,7 +70,15 @@ const emit = defineEmits<{
(e: "update:modelValue", value: HoppRESTRequest): void
}>()
const request = useVModel(props, "modelValue", emit)
const request = ref(props.modelValue)
watch(
() => request.value,
(newVal) => {
emit("update:modelValue", newVal)
},
{ deep: true }
)
const selectedRealtimeTab = ref<RequestOptionTabs>("params")

View File

@@ -28,11 +28,9 @@
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
>
<span
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary truncate"
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary"
>
<icon-lucide-chevron-right
class="mr-2 indicator flex flex-shrink-0"
/>
<icon-lucide-chevron-right class="mr-2 indicator" />
<span class="truncate capitalize-first">
{{ t("environment.title") }}
</span>

View File

@@ -44,7 +44,6 @@ const props = withDefaults(
envs?: { key: string; value: string; source: string }[] | null
focus?: boolean
selectTextOnMount?: boolean
environmentHighlights?: boolean
readonly?: boolean
}>(),
{
@@ -54,7 +53,6 @@ const props = withDefaults(
envs: null,
focus: false,
readonly: false,
environmentHighlights: true,
}
)
@@ -144,7 +142,7 @@ const initView = (el: any) => {
tooltips({
position: "absolute",
}),
props.environmentHighlights ? envTooltipPlugin : [],
envTooltipPlugin,
placeholderExt(props.placeholder),
EditorView.domEventHandlers({
paste(ev) {

View File

@@ -44,7 +44,6 @@ import { createTeam } from "~/helpers/backend/mutations/Team"
import { TeamNameCodec } from "~/helpers/backend/types/TeamName"
import { useI18n } from "@composables/i18n"
import { useToast } from "@composables/toast"
import { platform } from "~/platform"
const t = useI18n()
@@ -69,12 +68,6 @@ const addNewTeam = async () => {
TE.fromEither,
TE.mapLeft(() => "invalid_name" as const),
TE.chainW(createTeam),
TE.chainFirstIOK(
() => () =>
platform.analytics?.logEvent({
type: "HOPP_CREATE_TEAM",
})
),
TE.match(
(err) => {
// err is of type "invalid_name" | GQLError<Err>

View File

@@ -99,7 +99,7 @@ export class GQLConnection {
private timeoutSubscription: any
public connect(url: string, headers: GQLHeader[], auth: HoppGQLAuth) {
public connect(url: string, headers: GQLHeader[]) {
if (this.connected$.value) {
throw new Error(
"A connection is already running. Close it before starting another."
@@ -110,7 +110,7 @@ export class GQLConnection {
this.connected$.next(true)
const poll = async () => {
await this.getSchema(url, headers, auth)
await this.getSchema(url, headers)
this.timeoutSubscription = setTimeout(() => {
poll()
}, GQL_SCHEMA_POLL_INTERVAL)
@@ -135,11 +135,7 @@ export class GQLConnection {
this.schema$.next(null)
}
private async getSchema(
url: string,
reqHeaders: GQLHeader[],
auth: HoppGQLAuth
) {
private async getSchema(url: string, headers: GQLHeader[]) {
try {
this.isLoading$.next(true)
@@ -147,38 +143,10 @@ export class GQLConnection {
query: getIntrospectionQuery(),
})
const headers = reqHeaders.filter((x) => x.active && x.key !== "")
// TODO: Support a better b64 implementation than btoa ?
if (auth.authType === "basic") {
const username = auth.username
const password = auth.password
headers.push({
active: true,
key: "Authorization",
value: `Basic ${btoa(`${username}:${password}`)}`,
})
} else if (auth.authType === "bearer" || auth.authType === "oauth-2") {
headers.push({
active: true,
key: "Authorization",
value: `Bearer ${auth.token}`,
})
} else if (auth.authType === "api-key") {
const { key, value, addTo } = auth
if (addTo === "Headers") {
headers.push({
active: true,
key,
value,
})
}
}
const finalHeaders: Record<string, string> = {}
headers.forEach((x) => (finalHeaders[x.key] = x.value))
headers
.filter((x) => x.active && x.key !== "")
.forEach((x) => (finalHeaders[x.key] = x.value))
const reqOptions = {
method: "POST",

View File

@@ -71,11 +71,9 @@ const parseURL = (urlText: string | number) =>
* @returns URL object
*/
export function getURLObject(parsedArguments: parser.Arguments) {
const location = parsedArguments.location ?? undefined
return pipe(
// contains raw url strings
[...parsedArguments._.slice(1), location],
parsedArguments._.slice(1),
A.findFirstMap(parseURL),
// no url found
O.getOrElse(() => new URL(defaultRESTReq.endpoint))

View File

@@ -105,8 +105,7 @@ export class MQTTConnection {
this.handleError(e)
}
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "mqtt",
})
}

View File

@@ -113,8 +113,7 @@ export class SIOConnection {
this.handleError(error, "CONNECTION")
}
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "socketio",
})
}

View File

@@ -63,8 +63,7 @@ export class SSEConnection {
})
}
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "sse",
})
}

View File

@@ -71,8 +71,7 @@ export class WSConnection {
this.handleError(error as SyntaxError)
}
platform.analytics?.logEvent({
type: "HOPP_REQUEST_RUN",
platform.analytics?.logHoppRequestRunToAnalytics({
platform: "wss",
})
}

View File

@@ -6,7 +6,6 @@ import { refWithControl } from "@vueuse/core"
import { HoppRESTResponse } from "../types/HoppRESTResponse"
import { getDefaultRESTRequest } from "./default"
import { HoppTestResult } from "../types/HoppTestResult"
import { platform } from "~/platform"
export type HoppRESTTab = {
id: string
@@ -148,10 +147,6 @@ export function createNewTab(document: HoppRESTDocument, switchToIt = true) {
currentTabID.value = id
}
platform.analytics?.logEvent({
type: "HOPP_REST_NEW_TAB_OPENED",
})
return tab
}

View File

@@ -275,4 +275,7 @@ export const gqlResponse$ = gqlSessionStore.subject$.pipe(
distinctUntilChanged()
)
export const gqlAuth$ = gqlSessionStore.subject$.pipe(pluck("request", "auth"))
export const gqlAuth$ = gqlSessionStore.subject$.pipe(
pluck("request", "auth"),
distinctUntilChanged()
)

View File

@@ -47,8 +47,6 @@ import {
loadTabsFromPersistedState,
persistableTabState,
} from "~/helpers/rest/tab"
import { debounceTime } from "rxjs"
import { gqlSessionStore, setGQLSession } from "./GQLSession"
function checkAndMigrateOldSettings() {
if (window.localStorage.getItem("selectedEnvIndex")) {
@@ -335,35 +333,12 @@ export function setupRESTTabsPersistence() {
)
}
// temporary persistence for GQL session
export function setupGQLPersistence() {
try {
const state = window.localStorage.getItem("gqlState")
if (state) {
const data = JSON.parse(state)
data["schema"] = ""
data["response"] = ""
setGQLSession(data)
}
} catch (e) {
console.error(
`Failed parsing persisted GraphQL state, state:`,
window.localStorage.getItem("gqlState")
)
}
gqlSessionStore.subject$.pipe(debounceTime(500)).subscribe((state) => {
window.localStorage.setItem("gqlState", JSON.stringify(state))
})
}
export function setupLocalPersistence() {
checkAndMigrateOldSettings()
setupLocalStatePersistence()
setupSettingsPersistence()
setupRESTTabsPersistence()
setupGQLPersistence()
setupHistoryPersistence()
setupCollectionsPersistence()
setupGlobalEnvsPersistence()

View File

@@ -14,10 +14,12 @@
</template>
<script setup lang="ts">
import { usePageHead } from "@composables/head"
import { computed, onBeforeUnmount, watch } from "vue"
import { useReadonlyStream } from "@composables/stream"
import { useI18n } from "@composables/i18n"
import { usePageHead } from "@composables/head"
import { startPageProgress, completePageProgress } from "@modules/loadingbar"
import { GQLConnection } from "@helpers/GQLConnection"
import { computed, onBeforeUnmount } from "vue"
const t = useI18n()
@@ -26,10 +28,16 @@ usePageHead({
})
const gqlConn = new GQLConnection()
const isLoading = useReadonlyStream(gqlConn.isLoading$, false)
onBeforeUnmount(() => {
if (gqlConn.connected$.value) {
gqlConn.disconnect()
}
})
watch(isLoading, () => {
if (isLoading.value) startPageProgress()
else completePageProgress()
})
</script>

View File

@@ -84,7 +84,6 @@ import IconHome from "~icons/lucide/home"
import IconRefreshCW from "~icons/lucide/refresh-cw"
import { createNewTab } from "~/helpers/rest/tab"
import { getDefaultRESTRequest } from "~/helpers/rest/default"
import { platform } from "~/platform"
const route = useRoute()
const router = useRouter()
@@ -121,10 +120,6 @@ const addRequestToTab = () => {
return
}
platform.analytics?.logEvent({
type: "HOPP_SHORTCODE_RESOLVED",
})
const request: unknown = JSON.parse(data.right.shortcode?.request as string)
createNewTab({

View File

@@ -5,50 +5,8 @@ export type HoppRequestEvent =
}
| { platform: "wss" | "sse" | "socketio" | "mqtt" }
export type AnalyticsEvent =
| ({ type: "HOPP_REQUEST_RUN" } & HoppRequestEvent)
| {
type: "HOPP_CREATE_ENVIRONMENT"
workspaceType: "personal" | "team"
}
| {
type: "HOPP_CREATE_COLLECTION"
platform: "rest" | "gql"
isRootCollection: boolean
workspaceType: "personal" | "team"
}
| { type: "HOPP_CREATE_TEAM" }
| {
type: "HOPP_SAVE_REQUEST"
createdNow: boolean
workspaceType: "personal" | "team"
platform: "rest" | "gql"
}
| { type: "HOPP_SHORTCODE_CREATED" }
| { type: "HOPP_SHORTCODE_RESOLVED" }
| { type: "HOPP_REST_NEW_TAB_OPENED" }
| {
type: "HOPP_IMPORT_COLLECTION"
importer: string
workspaceType: "personal" | "team"
platform: "rest" | "gql"
}
| {
type: "HOPP_IMPORT_ENVIRONMENT"
workspaceType: "personal" | "team"
platform: "rest" | "gql"
}
| {
type: "HOPP_EXPORT_COLLECTION"
exporter: string
platform: "rest" | "gql"
}
| { type: "HOPP_EXPORT_ENVIRONMENT"; platform: "rest" | "gql" }
| { type: "HOPP_REST_CODEGEN_OPENED" }
| { type: "HOPP_REST_IMPORT_CURL" }
export type AnalyticsPlatformDef = {
initAnalytics: () => void
logEvent: (ev: AnalyticsEvent) => void
logHoppRequestRunToAnalytics: (ev: HoppRequestEvent) => void
logPageView: (pagePath: string) => void
}

View File

@@ -1,7 +1,7 @@
{
"name": "@hoppscotch/selfhost-web",
"private": true,
"version": "2023.4.7",
"version": "2023.4.6",
"type": "module",
"scripts": {
"dev:vite": "vite",

View File

@@ -1,7 +1,7 @@
{
"name": "hoppscotch-sh-admin",
"private": true,
"version": "2023.4.7",
"version": "2023.4.6",
"type": "module",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",

View File

@@ -383,7 +383,7 @@ export const auth = {
await this.signInWithEmailLink(deviceIdentifier, window.location.href);
removeLocalConfig('deviceIdentifier');
window.location.href = import.meta.env.VITE_ADMIN_URL;
window.location.href = '/';
}
},
};