@mundogamernetwork/shared-ui 1.16.22 → 1.16.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/indie-wall/MediaKitWallBlock.vue +1 -1
- package/components/playtest/build-access/BuildAccessPanel.vue +96 -0
- package/components/playtest/build-access/BuildDownload.vue +124 -0
- package/components/playtest/build-access/NdaSign.vue +221 -0
- package/components/playtest/concept-poll/FiveSecondTestVote.vue +1 -1
- package/components/playtest/lqa/FileIssueForm.vue +9 -1
- package/composables/usePlaytestBuildAccess.ts +219 -0
- package/locales/de.json +133 -0
- package/locales/en.json +133 -0
- package/locales/es.json +133 -0
- package/locales/pt-BR.json +133 -0
- package/locales/ro.json +133 -0
- package/package.json +1 -1
- package/pages/key-campaigns/redeem-key-approved.vue +51 -0
- package/pages/mural/[slug]/index.vue +148 -60
- package/services/esignatureService.ts +56 -0
- package/services/playtestTesterService.ts +53 -0
- package/pages/mural/[slug]/pixel/[pixelId].vue +0 -460
- package/pages/wall/[slug]/pixel/[pixelId].vue +0 -12
package/locales/pt-BR.json
CHANGED
|
@@ -1,4 +1,136 @@
|
|
|
1
1
|
{
|
|
2
|
+
"playtest": {
|
|
3
|
+
"access_grant": {
|
|
4
|
+
"copied": "Copiado",
|
|
5
|
+
"copy": "Copiar",
|
|
6
|
+
"enter_code": "Digite o código de 6 dígitos que enviamos por e-mail",
|
|
7
|
+
"open_link": "Abrir link",
|
|
8
|
+
"resend_code": "Reenviar código",
|
|
9
|
+
"reveal": "Revelar",
|
|
10
|
+
"send_code": "Enviar código de verificação",
|
|
11
|
+
"sending_code": "Enviando código…",
|
|
12
|
+
"verify": "Verificar",
|
|
13
|
+
"verifying": "Verificando…",
|
|
14
|
+
"waiver_title": "Assine o termo de responsabilidade para desbloquear o acesso ao jogo",
|
|
15
|
+
"your_key": "Sua chave do jogo",
|
|
16
|
+
"your_link": "Seu link de download"
|
|
17
|
+
},
|
|
18
|
+
"build_access": {
|
|
19
|
+
"accept_consent": "Aceitar e continuar",
|
|
20
|
+
"accepting": "Enviando…",
|
|
21
|
+
"builds_title": "Builds disponíveis",
|
|
22
|
+
"consent_checkbox": "Li e entendi o termo acima",
|
|
23
|
+
"download": "Baixar",
|
|
24
|
+
"enter_code": "Digite o código de 6 dígitos que enviamos por e-mail",
|
|
25
|
+
"nda_title": "Assine o NDA para desbloquear a build",
|
|
26
|
+
"no_builds": "Nenhuma build disponível ainda",
|
|
27
|
+
"resend_code": "Reenviar código",
|
|
28
|
+
"revoked": "Seu acesso à build foi revogado",
|
|
29
|
+
"send_code": "Enviar código de verificação",
|
|
30
|
+
"sending_code": "Enviando código…",
|
|
31
|
+
"sign": "Assinar",
|
|
32
|
+
"signing": "Assinando…",
|
|
33
|
+
"verify": "Verificar",
|
|
34
|
+
"verifying": "Verificando…",
|
|
35
|
+
"view_pdf": "Ver documento do NDA"
|
|
36
|
+
},
|
|
37
|
+
"accessibility": {
|
|
38
|
+
"notes_required": "Notas (obrigatórias quando reprovado)",
|
|
39
|
+
"uses_accommodation": "Eu pessoalmente dependo dessa adaptação"
|
|
40
|
+
},
|
|
41
|
+
"baseline": {
|
|
42
|
+
"feedback_optional": "Seu feedback (opcional)",
|
|
43
|
+
"feedback_required": "Seu feedback (obrigatório)"
|
|
44
|
+
},
|
|
45
|
+
"brief": {
|
|
46
|
+
"ineligible_generic": "No momento você não é elegível para este playtest.",
|
|
47
|
+
"not_found": "Não foi possível encontrar esta campanha de playtest.",
|
|
48
|
+
"paid_on_acceptance": "Pago quando o estúdio aceita sua resposta, não no envio.",
|
|
49
|
+
"reward": "Recompensa"
|
|
50
|
+
},
|
|
51
|
+
"compliance": {
|
|
52
|
+
"attach_evidence": "Anexar evidência (captura de tela/vídeo)",
|
|
53
|
+
"notes_required": "Notas (obrigatórias quando reprovado)",
|
|
54
|
+
"uploaded": "Anexado",
|
|
55
|
+
"uploading": "Enviando…"
|
|
56
|
+
},
|
|
57
|
+
"concept_poll": {
|
|
58
|
+
"emoji_label": "Escolha sua reação",
|
|
59
|
+
"five_second_intro": "Você vai ver a(s) imagem(ns) por {seconds} segundos e depois vai responder de memória.",
|
|
60
|
+
"five_second_start": "Começar",
|
|
61
|
+
"ranked_hint": "Ordene do que você mais prefere ao que menos prefere (use as setas).",
|
|
62
|
+
"reason_label": "Por que você escolheu isso? (obrigatório)",
|
|
63
|
+
"reason_min_length": "Escreva pelo menos 3 caracteres.",
|
|
64
|
+
"recall_label": "O que você lembra? (obrigatório)",
|
|
65
|
+
"stars_label": "Sua avaliação",
|
|
66
|
+
"submit_vote": "Enviar voto"
|
|
67
|
+
},
|
|
68
|
+
"flow": {
|
|
69
|
+
"criteria_completed": "critérios concluídos",
|
|
70
|
+
"submit_checklist": "Enviar checklist",
|
|
71
|
+
"submit_response": "Enviar resposta"
|
|
72
|
+
},
|
|
73
|
+
"lqa": {
|
|
74
|
+
"actual_text": "Texto atual",
|
|
75
|
+
"attach_screenshot": "Anexar captura de tela/vídeo (obrigatório)",
|
|
76
|
+
"description": "Descrição (obrigatória)",
|
|
77
|
+
"evidence_hint": "É necessário anexar uma captura de tela ou vídeo do build real para que o estúdio possa verificar o problema.",
|
|
78
|
+
"expected_text": "Texto esperado",
|
|
79
|
+
"file_issue": "Registrar problema",
|
|
80
|
+
"filed_issues": "Problemas registrados nesta sessão",
|
|
81
|
+
"issue_type": "Tipo de problema",
|
|
82
|
+
"location": "Local (tela/cena, opcional)",
|
|
83
|
+
"no_issues_yet": "Nenhum problema registrado ainda.",
|
|
84
|
+
"responses_progress": "Respostas até agora",
|
|
85
|
+
"select_locale": "Idioma / build em escopo",
|
|
86
|
+
"select_locale_placeholder": "Selecione um idioma…",
|
|
87
|
+
"select_severity_placeholder": "Selecione…",
|
|
88
|
+
"select_type_placeholder": "Selecione…",
|
|
89
|
+
"severity": "Severidade",
|
|
90
|
+
"uploaded": "Anexado",
|
|
91
|
+
"uploading": "Enviando…"
|
|
92
|
+
},
|
|
93
|
+
"moderated": {
|
|
94
|
+
"cancel_session": "Cancelar",
|
|
95
|
+
"claim_slot": "Reservar este horário",
|
|
96
|
+
"confirm_attendance": "Confirmar presença",
|
|
97
|
+
"confirmed": "confirmado",
|
|
98
|
+
"join_call": "Entrar na chamada",
|
|
99
|
+
"link_pending": "O link da chamada vai aparecer aqui perto da sessão.",
|
|
100
|
+
"no_session": "Nenhuma sessão selecionada.",
|
|
101
|
+
"session_title": "Sessão moderada",
|
|
102
|
+
"you_confirmed": "Você confirmou presença"
|
|
103
|
+
},
|
|
104
|
+
"pending": {
|
|
105
|
+
"browse_more": "Ver mais playtests",
|
|
106
|
+
"ineligible_message": "Algo mudou desde que você começou — os requisitos desta campanha não são mais atendidos.",
|
|
107
|
+
"ineligible_title": "Você não é mais elegível para este playtest",
|
|
108
|
+
"message": "Obrigado por testar! O estúdio vai revisar sua resposta — você será pago se ela for aceita.",
|
|
109
|
+
"title": "Resposta enviada"
|
|
110
|
+
},
|
|
111
|
+
"video_capture": {
|
|
112
|
+
"continue_anyway": "Continuar assim mesmo",
|
|
113
|
+
"hint": "Grave sua tela enquanto joga. Você pode adicionar notas com carimbo de tempo ao longo do caminho.",
|
|
114
|
+
"mark": "Marcar",
|
|
115
|
+
"marker_save_failed": "Resposta enviada, mas {v} nota(s) não foram salvas.",
|
|
116
|
+
"processing_hint": "Sua gravação foi enviada e está sendo processada. Envie quando estiver pronto — vamos terminar de confirmar que está pronta em segundo plano.",
|
|
117
|
+
"recording": "Gravando…",
|
|
118
|
+
"retry_markers": "Tentar salvar notas novamente",
|
|
119
|
+
"retrying": "Tentando novamente…",
|
|
120
|
+
"review_hint": "Gravação capturada ({v}). Envie para mandar sua resposta.",
|
|
121
|
+
"start": "Iniciar gravação",
|
|
122
|
+
"stop": "Parar gravação",
|
|
123
|
+
"submit": "Enviar resposta",
|
|
124
|
+
"submitting": "Enviando…",
|
|
125
|
+
"upload": "Enviar gravação",
|
|
126
|
+
"uploading": "Enviando… {v}%"
|
|
127
|
+
},
|
|
128
|
+
"video_player": {
|
|
129
|
+
"open_direct": "Abrir gravação",
|
|
130
|
+
"playback_error": "Este navegador não consegue reproduzir a gravação diretamente — tente o Safari ou abra o link do arquivo abaixo.",
|
|
131
|
+
"processing": "A gravação ainda está sendo processada — volte a checar em instantes."
|
|
132
|
+
}
|
|
133
|
+
},
|
|
2
134
|
"keys": {
|
|
3
135
|
"notif_prompt_title": "Quer receber alertas de novas campanhas de chaves?",
|
|
4
136
|
"notif_prompt_desc": "Te avisamos por email e push sempre que uma nova campanha de chaves abrir.",
|
|
@@ -210,6 +342,7 @@
|
|
|
210
342
|
"your_key": "Sua Chave",
|
|
211
343
|
"copy": "Copiar",
|
|
212
344
|
"copied": "Copiado!",
|
|
345
|
+
"extra_codes": "Esta solicitação foi aprovada para {count} chaves — aqui estão todas.",
|
|
213
346
|
"redeem_on_platform": "Resgate esta chave na plataforma correspondente.",
|
|
214
347
|
"revealing": "Revelando...",
|
|
215
348
|
"status": {
|
package/locales/ro.json
CHANGED
|
@@ -1,4 +1,136 @@
|
|
|
1
1
|
{
|
|
2
|
+
"playtest": {
|
|
3
|
+
"access_grant": {
|
|
4
|
+
"copied": "Copiat",
|
|
5
|
+
"copy": "Copiază",
|
|
6
|
+
"enter_code": "Introdu codul din 6 cifre pe care ți l-am trimis pe e-mail",
|
|
7
|
+
"open_link": "Deschide linkul",
|
|
8
|
+
"resend_code": "Retrimite codul",
|
|
9
|
+
"reveal": "Dezvăluie",
|
|
10
|
+
"send_code": "Trimite codul de verificare",
|
|
11
|
+
"sending_code": "Se trimite codul…",
|
|
12
|
+
"verify": "Verifică",
|
|
13
|
+
"verifying": "Se verifică…",
|
|
14
|
+
"waiver_title": "Semnează declarația de răspundere pentru a debloca accesul la joc",
|
|
15
|
+
"your_key": "Cheia ta de joc",
|
|
16
|
+
"your_link": "Linkul tău de descărcare"
|
|
17
|
+
},
|
|
18
|
+
"build_access": {
|
|
19
|
+
"accept_consent": "Acceptă și continuă",
|
|
20
|
+
"accepting": "Se trimite…",
|
|
21
|
+
"builds_title": "Build-uri disponibile",
|
|
22
|
+
"consent_checkbox": "Am citit și am înțeles acordul de mai sus",
|
|
23
|
+
"download": "Descarcă",
|
|
24
|
+
"enter_code": "Introdu codul din 6 cifre pe care ți l-am trimis pe e-mail",
|
|
25
|
+
"nda_title": "Semnează NDA-ul pentru a debloca build-ul",
|
|
26
|
+
"no_builds": "Niciun build disponibil momentan",
|
|
27
|
+
"resend_code": "Retrimite codul",
|
|
28
|
+
"revoked": "Accesul tău la build a fost revocat",
|
|
29
|
+
"send_code": "Trimite codul de verificare",
|
|
30
|
+
"sending_code": "Se trimite codul…",
|
|
31
|
+
"sign": "Semnează",
|
|
32
|
+
"signing": "Se semnează…",
|
|
33
|
+
"verify": "Verifică",
|
|
34
|
+
"verifying": "Se verifică…",
|
|
35
|
+
"view_pdf": "Vezi documentul NDA"
|
|
36
|
+
},
|
|
37
|
+
"accessibility": {
|
|
38
|
+
"notes_required": "Note (obligatorii dacă nu trece)",
|
|
39
|
+
"uses_accommodation": "Eu personal depind de această adaptare"
|
|
40
|
+
},
|
|
41
|
+
"baseline": {
|
|
42
|
+
"feedback_optional": "Feedbackul tău (opțional)",
|
|
43
|
+
"feedback_required": "Feedbackul tău (obligatoriu)"
|
|
44
|
+
},
|
|
45
|
+
"brief": {
|
|
46
|
+
"ineligible_generic": "Momentan nu ești eligibil pentru acest playtest.",
|
|
47
|
+
"not_found": "Această campanie de playtest nu a putut fi găsită.",
|
|
48
|
+
"paid_on_acceptance": "Se plătește când studioul acceptă răspunsul tău, nu la trimitere.",
|
|
49
|
+
"reward": "Recompensă"
|
|
50
|
+
},
|
|
51
|
+
"compliance": {
|
|
52
|
+
"attach_evidence": "Atașează dovadă (captură de ecran/video)",
|
|
53
|
+
"notes_required": "Note (obligatorii dacă nu trece)",
|
|
54
|
+
"uploaded": "Atașat",
|
|
55
|
+
"uploading": "Se încarcă…"
|
|
56
|
+
},
|
|
57
|
+
"concept_poll": {
|
|
58
|
+
"emoji_label": "Alege reacția ta",
|
|
59
|
+
"five_second_intro": "Vei vedea imaginea(ile) timp de {seconds} secunde, apoi vei răspunde din memorie.",
|
|
60
|
+
"five_second_start": "Începe",
|
|
61
|
+
"ranked_hint": "Ordonează-le de la cea mai preferată la cea mai puțin preferată (folosește săgețile).",
|
|
62
|
+
"reason_label": "De ce ai ales asta? (obligatoriu)",
|
|
63
|
+
"reason_min_length": "Te rugăm să scrii cel puțin 3 caractere.",
|
|
64
|
+
"recall_label": "Ce îți amintești? (obligatoriu)",
|
|
65
|
+
"stars_label": "Evaluarea ta",
|
|
66
|
+
"submit_vote": "Trimite votul"
|
|
67
|
+
},
|
|
68
|
+
"flow": {
|
|
69
|
+
"criteria_completed": "criterii finalizate",
|
|
70
|
+
"submit_checklist": "Trimite checklist-ul",
|
|
71
|
+
"submit_response": "Trimite răspunsul"
|
|
72
|
+
},
|
|
73
|
+
"lqa": {
|
|
74
|
+
"actual_text": "Text real",
|
|
75
|
+
"attach_screenshot": "Atașează captură de ecran/video (obligatoriu)",
|
|
76
|
+
"description": "Descriere (obligatorie)",
|
|
77
|
+
"evidence_hint": "Este necesară o captură de ecran sau un clip din build-ul real, pentru ca studioul să poată verifica problema.",
|
|
78
|
+
"expected_text": "Text așteptat",
|
|
79
|
+
"file_issue": "Raportează problema",
|
|
80
|
+
"filed_issues": "Probleme raportate în această sesiune",
|
|
81
|
+
"issue_type": "Tip de problemă",
|
|
82
|
+
"location": "Locație (ecran/scenă, opțional)",
|
|
83
|
+
"no_issues_yet": "Nicio problemă raportată încă.",
|
|
84
|
+
"responses_progress": "Răspunsuri până acum",
|
|
85
|
+
"select_locale": "Limbă / build în domeniu",
|
|
86
|
+
"select_locale_placeholder": "Selectează o limbă…",
|
|
87
|
+
"select_severity_placeholder": "Selectează…",
|
|
88
|
+
"select_type_placeholder": "Selectează…",
|
|
89
|
+
"severity": "Severitate",
|
|
90
|
+
"uploaded": "Atașat",
|
|
91
|
+
"uploading": "Se încarcă…"
|
|
92
|
+
},
|
|
93
|
+
"moderated": {
|
|
94
|
+
"cancel_session": "Anulează",
|
|
95
|
+
"claim_slot": "Rezervă acest interval",
|
|
96
|
+
"confirm_attendance": "Confirmă participarea",
|
|
97
|
+
"confirmed": "confirmat",
|
|
98
|
+
"join_call": "Alătură-te apelului",
|
|
99
|
+
"link_pending": "Linkul apelului va apărea aici mai aproape de sesiune.",
|
|
100
|
+
"no_session": "Nicio sesiune selectată.",
|
|
101
|
+
"session_title": "Sesiune moderată",
|
|
102
|
+
"you_confirmed": "Ai confirmat participarea"
|
|
103
|
+
},
|
|
104
|
+
"pending": {
|
|
105
|
+
"browse_more": "Vezi mai multe playtesturi",
|
|
106
|
+
"ineligible_message": "Ceva s-a schimbat de când ai început — cerințele acestei campanii nu mai sunt îndeplinite.",
|
|
107
|
+
"ineligible_title": "Nu mai ești eligibil pentru acest playtest",
|
|
108
|
+
"message": "Mulțumim pentru testare! Studioul îți va revizui răspunsul — vei fi plătit dacă este acceptat.",
|
|
109
|
+
"title": "Răspuns trimis"
|
|
110
|
+
},
|
|
111
|
+
"video_capture": {
|
|
112
|
+
"continue_anyway": "Continuă oricum",
|
|
113
|
+
"hint": "Înregistrează-ți ecranul în timp ce joci. Poți adăuga notițe cu marcaj de timp pe parcurs.",
|
|
114
|
+
"mark": "Marchează",
|
|
115
|
+
"marker_save_failed": "Răspuns trimis, dar {v} notiță(e) nu au putut fi salvate.",
|
|
116
|
+
"processing_hint": "Înregistrarea ta a fost încărcată și este procesată. Trimite când ești gata — vom termina de confirmat că e gata în fundal.",
|
|
117
|
+
"recording": "Se înregistrează…",
|
|
118
|
+
"retry_markers": "Reîncearcă salvarea notițelor",
|
|
119
|
+
"retrying": "Se reîncearcă…",
|
|
120
|
+
"review_hint": "Înregistrare capturată ({v}). Încarc-o pentru a trimite răspunsul.",
|
|
121
|
+
"start": "Începe înregistrarea",
|
|
122
|
+
"stop": "Oprește înregistrarea",
|
|
123
|
+
"submit": "Trimite răspunsul",
|
|
124
|
+
"submitting": "Se trimite…",
|
|
125
|
+
"upload": "Încarcă înregistrarea",
|
|
126
|
+
"uploading": "Se încarcă… {v}%"
|
|
127
|
+
},
|
|
128
|
+
"video_player": {
|
|
129
|
+
"open_direct": "Deschide înregistrarea",
|
|
130
|
+
"playback_error": "Acest browser nu poate reda înregistrarea direct — încearcă Safari sau deschide linkul fișierului de mai jos.",
|
|
131
|
+
"processing": "Înregistrarea este încă în curs de procesare — revino în scurt timp."
|
|
132
|
+
}
|
|
133
|
+
},
|
|
2
134
|
"keys": {
|
|
3
135
|
"notif_prompt_title": "Vrei alerte pentru campanii noi de chei?",
|
|
4
136
|
"notif_prompt_desc": "Te notificăm prin email și push când o nouă campanie de chei se deschide.",
|
|
@@ -210,6 +342,7 @@
|
|
|
210
342
|
"your_key": "Cheia Ta",
|
|
211
343
|
"copy": "Copiază",
|
|
212
344
|
"copied": "Copiat!",
|
|
345
|
+
"extra_codes": "Această solicitare a fost aprobată pentru {count} chei — iată-le pe toate.",
|
|
213
346
|
"redeem_on_platform": "Activează această cheie pe platforma corespunzătoare.",
|
|
214
347
|
"revealing": "Se dezvăluie...",
|
|
215
348
|
"status": {
|
package/package.json
CHANGED
|
@@ -28,12 +28,15 @@ const keyItemsParam = route.query.keyItems as string | undefined
|
|
|
28
28
|
const loading = ref(true)
|
|
29
29
|
const revealing = ref(false)
|
|
30
30
|
const keyCode = ref<string | null>(null)
|
|
31
|
+
/** Every other code this request was approved for, beyond the primary one. */
|
|
32
|
+
const extraCodes = ref<string[]>([])
|
|
31
33
|
const error = ref("")
|
|
32
34
|
// The session died while the page was open (persisted auth state kept the UI
|
|
33
35
|
// looking logged in) — show a re-login CTA instead of a raw API message.
|
|
34
36
|
const sessionExpired = ref(false)
|
|
35
37
|
const requestData = ref<any>(null)
|
|
36
38
|
const copied = ref(false)
|
|
39
|
+
const copiedExtra = ref<string | null>(null)
|
|
37
40
|
const platform = ref("")
|
|
38
41
|
|
|
39
42
|
// Embargo handling: the creator gets the code right away specifically to
|
|
@@ -106,6 +109,14 @@ async function reveal(acknowledgeEmbargo = false) {
|
|
|
106
109
|
const res = await revealKey(requestId, acknowledgeEmbargo)
|
|
107
110
|
const data = res?.data?.data || res?.data || null
|
|
108
111
|
keyCode.value = data?.code || (typeof data?.key === "string" ? data.key : null) || data?.value || null
|
|
112
|
+
// A request can be for several keys (quantity_keys, 1-10) and approval
|
|
113
|
+
// now hands over every one of them. `code` stays the primary so this
|
|
114
|
+
// page keeps working against an older API; `codes` is the full set.
|
|
115
|
+
extraCodes.value = Array.isArray(data?.codes)
|
|
116
|
+
? data.codes
|
|
117
|
+
.map((row: any) => (typeof row === "string" ? row : row?.code))
|
|
118
|
+
.filter((code: string | null): code is string => !!code && code !== keyCode.value)
|
|
119
|
+
: []
|
|
109
120
|
// Keep the pre-reveal platform (chosen at request time) as fallback if the
|
|
110
121
|
// revealed item has no platform of its own.
|
|
111
122
|
platform.value = data?.platform || data?.platforms?.[0]?.name || platform.value
|
|
@@ -154,6 +165,16 @@ async function copyCode() {
|
|
|
154
165
|
}
|
|
155
166
|
}
|
|
156
167
|
|
|
168
|
+
async function copyExtraCode(code: string) {
|
|
169
|
+
try {
|
|
170
|
+
await navigator.clipboard.writeText(code)
|
|
171
|
+
copiedExtra.value = code
|
|
172
|
+
setTimeout(() => { if (copiedExtra.value === code) copiedExtra.value = null }, 2000)
|
|
173
|
+
} catch {
|
|
174
|
+
// fallback: select text
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
157
178
|
/**
|
|
158
179
|
* Embargo shown with day AND time, on the clock the campaign creator set it in
|
|
159
180
|
* — a date alone is not something a creator can comply with.
|
|
@@ -297,6 +318,21 @@ function goBack() {
|
|
|
297
318
|
</button>
|
|
298
319
|
</div>
|
|
299
320
|
|
|
321
|
+
<!-- Requests for more than one key used to reveal a
|
|
322
|
+
single code with nothing saying the rest existed. -->
|
|
323
|
+
<div v-if="extraCodes.length" class="extra-codes">
|
|
324
|
+
<p class="extra-codes__label">
|
|
325
|
+
{{ $t("keys.campaigns.extra_codes", { count: extraCodes.length + 1 }) }}
|
|
326
|
+
</p>
|
|
327
|
+
<div v-for="code in extraCodes" :key="code" class="code-box">
|
|
328
|
+
<input type="text" :value="code" readonly class="code-value" />
|
|
329
|
+
<button class="btn" @click="copyExtraCode(code)">
|
|
330
|
+
<MGIcon :icon="copiedExtra === code ? 'check' : 'copy'" size="1x" />
|
|
331
|
+
{{ copiedExtra === code ? $t("keys.campaigns.copied") : $t("keys.campaigns.copy") }}
|
|
332
|
+
</button>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
|
|
300
336
|
<!-- Right where the code is copied: the one moment the
|
|
301
337
|
creator is guaranteed to be looking at this page. -->
|
|
302
338
|
<div v-if="keyCode && embargoIsActive" class="embargo-reminder">
|
|
@@ -496,6 +532,21 @@ function goBack() {
|
|
|
496
532
|
gap: 8px;
|
|
497
533
|
}
|
|
498
534
|
|
|
535
|
+
.extra-codes {
|
|
536
|
+
width: 100%;
|
|
537
|
+
display: flex;
|
|
538
|
+
flex-direction: column;
|
|
539
|
+
gap: 8px;
|
|
540
|
+
margin-top: 12px;
|
|
541
|
+
|
|
542
|
+
&__label {
|
|
543
|
+
margin: 0;
|
|
544
|
+
font-size: 13px;
|
|
545
|
+
color: var(--secondary-info-fg);
|
|
546
|
+
opacity: 0.8;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
499
550
|
.code-box {
|
|
500
551
|
display: flex;
|
|
501
552
|
align-items: center;
|