Skip to content

Commit 303541e

Browse files
committed
chore: fix partner logo on login page
1 parent 450a03e commit 303541e

File tree

10 files changed

+60
-15
lines changed

10 files changed

+60
-15
lines changed

api/generated-schema.graphql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,11 @@ type PublicPartnerInfo {
952952
The path to the partner logo image on the flash drive, relative to the activation code file
953953
"""
954954
partnerLogoUrl: String
955+
956+
"""
957+
The plaintext version of the partner logo in base64 format - will render the default Unraid logo if not provided
958+
"""
959+
partnerLogoRaw: String
955960
}
956961

957962
type ActivationCode {

api/src/unraid-api/graph/resolvers/customization/activation-code.model.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,19 @@ export class PublicPartnerInfo {
5050
'The path to the partner logo image on the flash drive, relative to the activation code file',
5151
})
5252
@IsOptional()
53-
@IsString() // Assuming this is a file path/name
53+
@IsString()
5454
@Transform(({ value }) => sanitizeString(value))
5555
partnerLogoUrl?: string;
56+
57+
@Field(() => String, {
58+
nullable: true,
59+
description:
60+
'The plaintext version of the partner logo in base64 format - will render the default Unraid logo if not provided',
61+
})
62+
@IsOptional()
63+
@IsString()
64+
@Transform(({ value }) => sanitizeString(value))
65+
partnerLogoRaw?: string;
5666
}
5767

5868
@ObjectType()

api/src/unraid-api/graph/resolvers/customization/customization.resolver.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export class CustomizationResolver {
3131
partnerName: activationData?.partnerName,
3232
partnerUrl: activationData?.partnerUrl,
3333
partnerLogoUrl: (await this.customizationService.getPartnerLogoWebguiPath()) ?? undefined,
34+
partnerLogoRaw: await this.customizationService.getPartnerLogoRaw() ?? undefined,
3435
};
3536
}
3637

api/src/unraid-api/graph/resolvers/customization/customization.service.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,19 @@ export class CustomizationService implements OnModuleInit {
170170
return null;
171171
}
172172

173+
/**
174+
* Get the raw partner logo from the partner logo file.
175+
* @returns The raw partner logo in base64 format if the file exists, otherwise null.
176+
*/
177+
public async getPartnerLogoRaw(): Promise<string | null> {
178+
const path = getters.paths().partnerLogoTarget;
179+
if (await fileExists(path)) {
180+
const fileContent = await fs.readFile(path, 'base64');
181+
return fileContent;
182+
}
183+
return null;
184+
}
185+
173186
async applyActivationCustomizations() {
174187
this.logger.log('Applying activation customizations if data is available...');
175188

web/components/Activation/ActivationPartnerLogoImg.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ import { useThemeStore } from '~/store/theme';
1010
1111
const { partnerInfo } = storeToRefs(useActivationCodeDataStore());
1212
const { darkMode } = storeToRefs(useThemeStore());
13+
14+
const partnerLogoUrl = computed(() => {
15+
if (!partnerInfo.value?.partnerLogoRaw) return '';
16+
return `data:image/svg+xml;base64,${partnerInfo.value.partnerLogoRaw}`;
17+
});
18+
1319
</script>
1420

1521
<template>
1622
<img
17-
v-if="partnerInfo?.partnerLogoUrl"
18-
:src="partnerInfo?.partnerLogoUrl"
23+
v-if="partnerInfo?.partnerLogoRaw"
24+
:src="partnerLogoUrl"
1925
class="w-72"
2026
:class="{ invert: darkMode }"
2127
/>

web/components/Activation/WelcomeModal.ce.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ const { t } = useI18n();
1414
1515
const { partnerInfo, loading } = storeToRefs(useActivationCodeDataStore());
1616
17-
useThemeStore();
17+
const { setCssVars } = useThemeStore();
18+
19+
// Manually call setCssVars to ensure the theme is set (we're outside of the typical watcher context)
20+
setCssVars();
1821
1922
const title = computed<string>(() =>
2023
partnerInfo.value?.partnerName

web/components/Activation/graphql/activationCode.query.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const PARTNER_INFO_QUERY = graphql(/* GraphQL */ `
88
partnerName
99
partnerUrl
1010
partnerLogoUrl
11+
partnerLogoRaw
1112
}
1213
}
1314
`);
@@ -35,6 +36,7 @@ export const ACTIVATION_CODE_QUERY = graphql(/* GraphQL */ `
3536
partnerName
3637
partnerUrl
3738
partnerLogoUrl
39+
partnerLogoRaw
3840
}
3941
}
4042
}

web/composables/gql/gql.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
1414
* Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
1515
*/
1616
type Documents = {
17-
"\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n": typeof types.PartnerInfoDocument,
18-
"\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n }\n": typeof types.ActivationCodeDocument,
17+
"\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n": typeof types.PartnerInfoDocument,
18+
"\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n }\n": typeof types.ActivationCodeDocument,
1919
"\n query GetConnectSettingsForm {\n connect {\n id\n settings {\n id\n dataSchema\n uiSchema\n values {\n sandbox\n extraOrigins\n accessType\n forwardType\n port\n ssoUserIds\n }\n }\n }\n }\n": typeof types.GetConnectSettingsFormDocument,
2020
"\n mutation UpdateConnectSettings($input: ApiSettingsInput!) {\n updateApiSettings(input: $input) {\n sandbox\n extraOrigins\n accessType\n forwardType\n port\n ssoUserIds\n }\n }\n": typeof types.UpdateConnectSettingsDocument,
2121
"\n query LogFiles {\n logFiles {\n name\n path\n size\n modifiedAt\n }\n }\n": typeof types.LogFilesDocument,
@@ -42,8 +42,8 @@ type Documents = {
4242
"\n mutation setupRemoteAccess($input: SetupRemoteAccessInput!) {\n setupRemoteAccess(input: $input)\n }\n": typeof types.SetupRemoteAccessDocument,
4343
};
4444
const documents: Documents = {
45-
"\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n": types.PartnerInfoDocument,
46-
"\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n }\n": types.ActivationCodeDocument,
45+
"\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n": types.PartnerInfoDocument,
46+
"\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n }\n": types.ActivationCodeDocument,
4747
"\n query GetConnectSettingsForm {\n connect {\n id\n settings {\n id\n dataSchema\n uiSchema\n values {\n sandbox\n extraOrigins\n accessType\n forwardType\n port\n ssoUserIds\n }\n }\n }\n }\n": types.GetConnectSettingsFormDocument,
4848
"\n mutation UpdateConnectSettings($input: ApiSettingsInput!) {\n updateApiSettings(input: $input) {\n sandbox\n extraOrigins\n accessType\n forwardType\n port\n ssoUserIds\n }\n }\n": types.UpdateConnectSettingsDocument,
4949
"\n query LogFiles {\n logFiles {\n name\n path\n size\n modifiedAt\n }\n }\n": types.LogFilesDocument,
@@ -87,11 +87,11 @@ export function graphql(source: string): unknown;
8787
/**
8888
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
8989
*/
90-
export function graphql(source: "\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n"): (typeof documents)["\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n"];
90+
export function graphql(source: "\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n"): (typeof documents)["\n query PartnerInfo {\n publicPartnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n"];
9191
/**
9292
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
9393
*/
94-
export function graphql(source: "\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n }\n"): (typeof documents)["\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n }\n }\n }\n"];
94+
export function graphql(source: "\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n }\n"): (typeof documents)["\n query ActivationCode {\n vars {\n regState\n }\n customization {\n activationCode {\n code\n partnerName\n serverName\n sysModel\n comment\n header\n headermetacolor\n background\n showBannerGradient\n theme\n }\n partnerInfo {\n hasPartnerLogo\n partnerName\n partnerUrl\n partnerLogoUrl\n partnerLogoRaw\n }\n }\n }\n"];
9595
/**
9696
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
9797
*/

0 commit comments

Comments
 (0)