Skip to content

Commit

Permalink
Merge pull request #208 from wmde/C23_WMDE_Desktop_DE_05
Browse files Browse the repository at this point in the history
C23_WMDE_Desktop_DE_05
  • Loading branch information
moiikana authored Sep 22, 2023
2 parents e0b50df + 51f4e43 commit 357009a
Show file tree
Hide file tree
Showing 20 changed files with 560 additions and 139 deletions.
65 changes: 65 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/banner_ctrl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { createVueApp } from '@src/createVueApp';

import './styles/styles.scss';

import BannerConductor from '@src/components/BannerConductor/BannerConductor.vue';
import Banner from './components/BannerCtrl.vue';
import getBannerDelay from '@src/utils/getBannerDelay';
import { WindowResizeHandler } from '@src/utils/ResizeHandler';
import PageWPORG from '@src/page/PageWPORG';
import { WindowMediaWiki } from '@src/page/MediaWiki/WindowMediaWiki';
import { SkinFactory } from '@src/page/skin/SkinFactory';
import { WindowSizeIssueChecker } from '@src/utils/SizeIssueChecker/WindowSizeIssueChecker';
import TranslationPlugin from '@src/TranslationPlugin';
import { Translator } from '@src/Translator';
import DynamicTextPlugin from '@src/DynamicTextPlugin';
import { LocalImpressionCount } from '@src/utils/LocalImpressionCount';
import { LegacyTrackerWPORG } from '@src/tracking/LegacyTrackerWPORG';
import eventMappings from './event_map';

// Locale-specific imports
import messages from './messages';
import { LocaleFactoryDe } from '@src/utils/LocaleFactory/LocaleFactoryDe';

// Channel specific form setup
import { createFormItems } from './form_items';
import { createFormActions } from '@src/createFormActions';

const localeFactory = new LocaleFactoryDe();
const translator = new Translator( messages );
const mediaWiki = new WindowMediaWiki();
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 800 ) );
const impressionCount = new LocalImpressionCount( page.getTracking().keyword );
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings );

const app = createVueApp( BannerConductor, {
page,
bannerConfig: {
delay: getBannerDelay( 7500 ),
transitionDuration: 1000
},
bannerProps: {
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent()
},
resizeHandler: new WindowResizeHandler(),
banner: Banner,
impressionCount
} );

app.use( TranslationPlugin, translator );
app.use( DynamicTextPlugin, {
campaignParameters: page.getCampaignParameters(),
date: new Date(),
formatters: localeFactory.getFormatters(),
impressionCount,
translator
} );

const currencyFormatter = localeFactory.getCurrencyFormatter();

app.provide( 'currencyFormatter', currencyFormatter );
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) );
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount, { ast: '0' } ) );
app.provide( 'tracker', tracker );

app.mount( page.getBannerContainer() );
65 changes: 65 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/banner_var.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { createVueApp } from '@src/createVueApp';

import './styles/styles.scss';

import BannerConductor from '@src/components/BannerConductor/BannerConductor.vue';
import Banner from './components/BannerVar.vue';
import getBannerDelay from '@src/utils/getBannerDelay';
import { WindowResizeHandler } from '@src/utils/ResizeHandler';
import PageWPORG from '@src/page/PageWPORG';
import { WindowMediaWiki } from '@src/page/MediaWiki/WindowMediaWiki';
import { SkinFactory } from '@src/page/skin/SkinFactory';
import { WindowSizeIssueChecker } from '@src/utils/SizeIssueChecker/WindowSizeIssueChecker';
import TranslationPlugin from '@src/TranslationPlugin';
import { Translator } from '@src/Translator';
import DynamicTextPlugin from '@src/DynamicTextPlugin';
import { LocalImpressionCount } from '@src/utils/LocalImpressionCount';
import { LegacyTrackerWPORG } from '@src/tracking/LegacyTrackerWPORG';
import eventMappings from './event_map';

// Locale-specific imports
import messages from './messages';
import { LocaleFactoryDe } from '@src/utils/LocaleFactory/LocaleFactoryDe';

// Channel specific form setup
import { createFormItems } from './form_items';
import { createFormActions } from '@src/createFormActions';

const localeFactory = new LocaleFactoryDe();
const translator = new Translator( messages );
const mediaWiki = new WindowMediaWiki();
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 800 ) );
const impressionCount = new LocalImpressionCount( page.getTracking().keyword );
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings );

const app = createVueApp( BannerConductor, {
page,
bannerConfig: {
delay: getBannerDelay( 7500 ),
transitionDuration: 1000
},
bannerProps: {
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent()
},
resizeHandler: new WindowResizeHandler(),
banner: Banner,
impressionCount
} );

app.use( TranslationPlugin, translator );
app.use( DynamicTextPlugin, {
campaignParameters: page.getCampaignParameters(),
date: new Date(),
formatters: localeFactory.getFormatters(),
impressionCount,
translator
} );

const currencyFormatter = localeFactory.getCurrencyFormatter();

app.provide( 'currencyFormatter', currencyFormatter );
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) );
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount, { ast: '0' } ) );
app.provide( 'tracker', tracker );

app.mount( page.getBannerContainer() );
119 changes: 119 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/components/BannerCtrl.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<template>
<div class="wmde-banner-wrapper" :class="contentState">
<MainBanner
@close="onCloseMain"
@form-interaction="$emit( 'bannerContentChanged' )"
v-if="contentState === ContentStates.Main"
:bannerState="bannerState"
>
<template #banner-text>
<BannerText/>
</template>

<template #banner-slides="{ play }: any">
<KeenSlider :with-navigation="true" :play="play" :interval="5000">

<template #slides="{ currentSlide }: any">
<BannerSlides :currentSlide="currentSlide"/>
</template>

</KeenSlider>
</template>

<template #donation-form="{ formInteraction }: any">
<MultiStepDonation :step-controllers="stepControllers" @form-interaction="formInteraction">

<template #[FormStepNames.MainDonationFormStep]="{ pageIndex, submit, isCurrent, previous }: any">
<MainDonationForm :page-index="pageIndex" @submit="submit" :is-current="isCurrent" @previous="previous"/>
</template>

<template #[FormStepNames.UpgradeToYearlyFormStep]="{ pageIndex, submit, isCurrent, previous }: any">
<UpgradeToYearlyForm :page-index="pageIndex" @submit="submit" :is-current="isCurrent" @previous="previous"/>
</template>
</MultiStepDonation>
</template>

<template #footer>
<BannerFooter @showFundsModal="isFundsModalVisible = true" />
</template>
</MainBanner>

<SoftClose
v-if="contentState === ContentStates.SoftClosing"
@close="() => onClose( 'SoftClose', CloseChoices.Close )"
@maybe-later="() => onClose( 'SoftClose', CloseChoices.MaybeLater )"
@time-out-close="() => onClose( 'SoftClose', CloseChoices.TimeOut )"
/>

<FundsModal
:content="useOfFundsContent"
:is-funds-modal-visible="isFundsModalVisible"
@hideFundsModal="isFundsModalVisible = false"
/>
</div>
</template>

<script setup lang="ts">
import { BannerStates } from '@src/components/BannerConductor/StateMachine/BannerStates';
import { ref, watch } from 'vue';
import { UseOfFundsContent as useOfFundsContentInterface } from '@src/domain/UseOfFunds/UseOfFundsContent';
import SoftClose from '@src/components/SoftClose/SoftClose.vue';
import MainBanner from './MainBanner.vue';
import FundsModal from '@src/components/UseOfFunds/FundsModal.vue';
import BannerText from '../content/BannerText.vue';
import BannerSlides from '../content/BannerSlides.vue';
import MultiStepDonation from '@src/components/DonationForm/MultiStepDonation.vue';
import BannerFooter from '@src/components/Footer/BannerFooter.vue';
import MainDonationForm from '@src/components/DonationForm/Forms/MainDonationForm.vue';
import UpgradeToYearlyForm from '@src/components/DonationForm/Forms/UpgradeToYearlyForm.vue';
import KeenSlider from '@src/components/Slider/KeenSlider.vue';
import { useFormModel } from '@src/components/composables/useFormModel';
import {
createSubmittableMainDonationForm
} from '@src/components/DonationForm/StepControllers/SubmittableMainDonationForm';
import {
createSubmittableUpgradeToYearly
} from '@src/components/DonationForm/StepControllers/SubmittableUpgradeToYearly';
import { CloseChoices } from '@src/domain/CloseChoices';
import { CloseEvent } from '@src/tracking/events/CloseEvent';
import { TrackingFeatureName } from '@src/tracking/TrackingEvent';
enum ContentStates {
Main = 'wmde-banner-wrapper--main',
SoftClosing = 'wmde-banner-wrapper--soft-closing'
}
enum FormStepNames {
MainDonationFormStep = 'MainDonationForm',
UpgradeToYearlyFormStep = 'UpgradeToYearlyForm'
}
interface Props {
bannerState: BannerStates;
useOfFundsContent: useOfFundsContentInterface;
}
defineProps<Props>();
const emit = defineEmits( [ 'bannerClosed', 'bannerContentChanged' ] );
const isFundsModalVisible = ref<boolean>( false );
const contentState = ref<ContentStates>( ContentStates.Main );
const formModel = useFormModel();
const stepControllers = [
createSubmittableMainDonationForm( formModel, FormStepNames.UpgradeToYearlyFormStep ),
createSubmittableUpgradeToYearly( formModel, FormStepNames.MainDonationFormStep, FormStepNames.MainDonationFormStep )
];
watch( contentState, async () => {
emit( 'bannerContentChanged' );
} );
function onCloseMain(): void {
contentState.value = ContentStates.SoftClosing;
}
function onClose( feature: TrackingFeatureName, userChoice: CloseChoices ): void {
emit( 'bannerClosed', new CloseEvent( feature, userChoice ) );
}
</script>
File renamed without changes.
44 changes: 44 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/components/MainBanner.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<template>
<div class="wmde-banner-main">
<ButtonClose @close="$emit( 'close' )"/>
<div class="wmde-banner-content">
<div class="wmde-banner-column-left">
<slot name="banner-text" v-if="onLargeScreen"/>
<slot name="banner-slides" v-else :play="slideshowShouldPlay"/>
</div>
<div class="wmde-banner-column-right">
<slot name="donation-form" :form-interaction="onFormInteraction"/>
</div>
</div>
<slot name="footer"/>
</div>
</template>

<script setup lang="ts">
import ButtonClose from '@src/components/ButtonClose/ButtonClose.vue';
import { useDisplaySwitch } from '@src/components/composables/useDisplaySwitch';
import { computed, nextTick, ref } from 'vue';
import { BannerStates } from '@src/components/BannerConductor/StateMachine/BannerStates';
interface Props {
bannerState: BannerStates;
}
const props = defineProps<Props>();
const emit = defineEmits( [ 'close', 'formInteraction' ] );
const slideShowStopped = ref<boolean>( false );
const slideshowShouldPlay = computed( () => props.bannerState === BannerStates.Visible && !slideShowStopped.value );
const onLargeScreen = useDisplaySwitch( 1300 );
const onFormInteraction = (): void => {
slideShowStopped.value = true;
nextTick( () => {
emit( 'formInteraction' );
} );
};
</script>
52 changes: 52 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/content/BannerSlides.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<template>
<KeenSliderSlide :is-current="currentSlide === 0">
<p class="headline">
<InfoIcon fill="#990a00"/> <strong> An alle, die Wikipedia in Deutschland nutzen </strong>
</p>
<p>
Vielleicht kommen wir gerade ungelegen, aber dennoch: Klicken Sie jetzt bitte nicht weg!
Am heutigen {{ currentDayName }}, den {{ currentDate }}, bitten wir Sie bescheiden, die Unabhängigkeit von Wikipedia zu unterstützen.
</p>
</KeenSliderSlide>
<KeenSliderSlide :is-current="currentSlide === 1">
<p>
<span class="wmde-banner-text-animated-highlight">Millionen Menschen nutzen Wikipedia, aber 99&nbsp;% spenden
nicht – sie übergehen diesen Aufruf.</span>
Die meisten Menschen spenden, weil sie Wikipedia nützlich finden.
</p>
</KeenSliderSlide>
<KeenSliderSlide :is-current="currentSlide === 2">
<p>
Die durchschnittliche Spende beträgt 22,25&nbsp;€, doch bereits 5&nbsp;€ helfen uns weiter. Hat Wikipedia Ihnen in
diesem Jahr Wissen im Wert einer Tasse Kaffee geschenkt?
</p>
</KeenSliderSlide>
<KeenSliderSlide :is-current="currentSlide === 3">
<p>
Dann entscheiden Sie sich, eine der seltenen Ausnahmen zu sein, und geben Sie etwas zurück. Vielen Dank!
</p>
</KeenSliderSlide>
</template>

<script setup lang="ts">
import { DynamicContent } from '@src/utils/DynamicContent/DynamicContent';
import { computed, inject } from 'vue';
import InfoIcon from '@src/components/Icons/InfoIcon.vue';
import KeenSliderSlide from '@src/components/Slider/KeenSliderSlide.vue';
interface Props {
currentSlide: number
}
defineProps<Props>();
const { currentDayName }: DynamicContent = inject( 'dynamicCampaignText' );
const currentDate = computed( () => {
return new Intl.DateTimeFormat( 'de-DE', {
day: '2-digit',
month: 'long'
} ).format( new Date() );
} );
</script>
35 changes: 35 additions & 0 deletions archive/desktop/C23_WMDE_Desktop_DE_04/content/BannerText.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<template>
<div class="wmde-banner-message">
<div>
<p>
<InfoIcon fill="#990a00"/>
<strong> An alle, die Wikipedia in Deutschland nutzen </strong>
</p>
<p>
Vielleicht kommen wir gerade ungelegen, aber dennoch: Klicken Sie jetzt bitte nicht weg! Am
heutigen {{ currentDayName }}, den {{ currentDate }}, bitten wir Sie bescheiden, die Unabhängigkeit von Wikipedia zu
unterstützen. <span class="wmde-banner-text-animated-highlight">Millionen Menschen nutzen Wikipedia,
aber 99&nbsp;% spenden nicht – sie übergehen diesen Aufruf.</span> Die meisten Menschen spenden, weil sie
Wikipedia nützlich finden. Die durchschnittliche Spende beträgt 22,25&nbsp;€, doch bereits 5&nbsp;€ helfen uns
weiter. Hat Wikipedia Ihnen in diesem Jahr Wissen im Wert einer Tasse Kaffee geschenkt? Dann entscheiden
Sie sich, eine der seltenen Ausnahmen zu sein, und geben Sie etwas zurück. Vielen Dank!
</p>
</div>
</div>
</template>

<script setup lang="ts">
import { computed, inject } from 'vue';
import { DynamicContent } from '@src/utils/DynamicContent/DynamicContent';
import InfoIcon from '@src/components/Icons/InfoIcon.vue';
const { currentDayName }: DynamicContent = inject( 'dynamicCampaignText' );
const currentDate = computed( () => {
return new Intl.DateTimeFormat( 'de-DE', {
day: '2-digit',
month: 'long'
} ).format( new Date() );
} );
</script>
File renamed without changes.
Loading

0 comments on commit 357009a

Please sign in to comment.