RateComment.svelte 2.79 KB
Newer Older
Timothy J. Baek's avatar
Timothy J. Baek committed
1
2
3
<script lang="ts">
	import { toast } from 'svelte-sonner';

4
	import { createEventDispatcher, onMount, getContext } from 'svelte';
Timothy J. Baek's avatar
Timothy J. Baek committed
5

6
	const i18n = getContext('i18n');
Timothy J. Baek's avatar
Timothy J. Baek committed
7
8
9
10
11
12

	const dispatch = createEventDispatcher();

	export let show = false;
	export let message;

13
14
15
16
17
	let LIKE_REASONS = [];
	let DISLIKE_REASONS = [];

	function loadReasons() {
		LIKE_REASONS = [
Timothy J. Baek's avatar
Timothy J. Baek committed
18
19
20
21
22
23
24
			$i18n.t('Accurate information'),
			$i18n.t('Followed instructions perfectly'),
			$i18n.t('Showcased creativity'),
			$i18n.t('Positive attitude'),
			$i18n.t('Attention to detail'),
			$i18n.t('Thorough explanation'),
			$i18n.t('Other')
25
26
27
28
		];

		DISLIKE_REASONS = [
			$i18n.t("Don't like the style"),
Timothy J. Baek's avatar
Timothy J. Baek committed
29
			$i18n.t('Not factually correct'),
30
31
			$i18n.t("Didn't fully follow instructions"),
			$i18n.t("Refused when it shouldn't have"),
Timothy J. Baek's avatar
Timothy J. Baek committed
32
33
			$i18n.t('Being lazy'),
			$i18n.t('Other')
34
35
		];
	}
Timothy J. Baek's avatar
Timothy J. Baek committed
36
37
38
39
40
41
42
43
44
45
46
47
48
49

	let reasons = [];
	let selectedReason = null;
	let comment = '';

	$: if (message.annotation.rating === 1) {
		reasons = LIKE_REASONS;
	} else if (message.annotation.rating === -1) {
		reasons = DISLIKE_REASONS;
	}

	onMount(() => {
		selectedReason = message.annotation.reason;
		comment = message.annotation.comment;
50
		loadReasons();
Timothy J. Baek's avatar
Timothy J. Baek committed
51
52
53
54
55
56
57
58
59
60
	});

	const submitHandler = () => {
		console.log('submitHandler');

		message.annotation.reason = selectedReason;
		message.annotation.comment = comment;

		dispatch('submit');

61
		toast.success($i18n.t('Thanks for your feedback!'));
Timothy J. Baek's avatar
Timothy J. Baek committed
62
63
64
65
		show = false;
	};
</script>

Timothy J. Baek's avatar
Timothy J. Baek committed
66
<div class=" my-2.5 rounded-xl px-4 py-3 border dark:border-gray-850">
Timothy J. Baek's avatar
Timothy J. Baek committed
67
	<div class="flex justify-between items-center">
68
		<div class=" text-sm">{$i18n.t('Tell us more:')}</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

		<button
			on:click={() => {
				show = false;
			}}
		>
			<svg
				xmlns="http://www.w3.org/2000/svg"
				fill="none"
				viewBox="0 0 24 24"
				stroke-width="1.5"
				stroke="currentColor"
				class="size-4"
			>
				<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
			</svg>
		</button>
	</div>

	{#if reasons.length > 0}
		<div class="flex flex-wrap gap-2 text-sm mt-2.5">
			{#each reasons as reason}
				<button
92
					class="px-3.5 py-1 border dark:border-gray-850 hover:bg-gray-100 dark:hover:bg-gray-850 {selectedReason ===
Timothy J. Baek's avatar
Timothy J. Baek committed
93
					reason
94
						? 'bg-gray-200 dark:bg-gray-800'
Timothy J. Baek's avatar
Timothy J. Baek committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
						: ''} transition rounded-lg"
					on:click={() => {
						selectedReason = reason;
					}}
				>
					{reason}
				</button>
			{/each}
		</div>
	{/if}

	<div class="mt-2">
		<textarea
			bind:value={comment}
			class="w-full text-sm px-1 py-2 bg-transparent outline-none resize-none rounded-xl"
Timothy J. Baek's avatar
Timothy J. Baek committed
110
			placeholder={$i18n.t('Feel free to add specific details')}
Timothy J. Baek's avatar
Timothy J. Baek committed
111
112
113
114
115
116
			rows="2"
		/>
	</div>

	<div class="mt-2 flex justify-end">
		<button
Timothy J. Baek's avatar
Timothy J. Baek committed
117
			class=" bg-emerald-700 text-white text-sm font-medium rounded-lg px-3.5 py-1.5"
Timothy J. Baek's avatar
Timothy J. Baek committed
118
119
120
121
122
123
124
125
			on:click={() => {
				submitHandler();
			}}
		>
			Submit
		</button>
	</div>
</div>